Ev.IO Aimbot & ESP

Shows players behind walls and aims at the nearest player in Ev.IO

  1. // ==UserScript==
  2. // @name Ev.IO Aimbot & ESP
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.8
  5. // @description Shows players behind walls and aims at the nearest player in Ev.IO
  6. // @author Zertalious (Zert)
  7. // @match *://ev.io/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=ev.io
  9. // @grant none
  10. // @run-at document-end
  11. // @antifeature ads
  12. // ==/UserScript==
  13.  
  14. let espEnabled = true;
  15. let aimbotEnabled = true;
  16. let espSize = 1;
  17.  
  18. const geometry = new THREE.EdgesGeometry( new THREE.BoxGeometry( 1, 2, 1 ).translate( 0, 1, 0 ) );
  19.  
  20. const material = new THREE.RawShaderMaterial( {
  21. vertexShader: `
  22.  
  23. attribute vec3 position;
  24.  
  25. uniform mat4 projectionMatrix;
  26. uniform mat4 modelViewMatrix;
  27.  
  28. void main() {
  29.  
  30. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  31. gl_Position.z = 1.0;
  32.  
  33. }
  34.  
  35. `,
  36. fragmentShader: `
  37.  
  38. void main() {
  39.  
  40. gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
  41.  
  42. }
  43.  
  44. `
  45. } );
  46.  
  47. let worldScene;
  48.  
  49. WeakMap.prototype.set = new Proxy( WeakMap.prototype.set, {
  50. apply( target, thisArgs, [ object ] ) {
  51.  
  52. if ( object.type === 'Scene' ) {
  53.  
  54. if ( object.children.length > 4 ) {
  55.  
  56. worldScene = object;
  57.  
  58. console.log( 'SCENE FOUND!', worldScene );
  59.  
  60. }
  61.  
  62. }
  63.  
  64. return Reflect.apply( ...arguments );
  65.  
  66. }
  67. } );
  68.  
  69. const precision = Math.pow( 10, 4 );
  70.  
  71. function createKey( object ) {
  72.  
  73. return Math.round( precision * object.position.x ) + ',' + Math.round( precision * object.position.z );
  74.  
  75. }
  76.  
  77. function findHeadBone( player ) {
  78. for ( let j = 0; j < player.children.length; j ++ ) {
  79.  
  80. const child = player.children[ j ].children[ 0 ];
  81.  
  82. if ( child && child.isSkinnedMesh ) {
  83.  
  84. const bones = child.skeleton.bones;
  85.  
  86. for ( let k = 0; k < bones.length; k ++ ) {
  87.  
  88. const bone = bones[ k ];
  89.  
  90. if ( bone.name.indexOf( 'Head' ) > - 1 ) {
  91.  
  92. return bone;
  93.  
  94. }
  95.  
  96. }
  97.  
  98. }
  99.  
  100. }
  101.  
  102. return null;
  103.  
  104. }
  105.  
  106. const canvas = document.getElementById( 'canvas' );
  107.  
  108. const p = new THREE.Vector3();
  109.  
  110. function animate() {
  111.  
  112. if ( worldScene ) {
  113.  
  114. let myCamera;
  115.  
  116. const spriteMap = {};
  117.  
  118. const players = [];
  119.  
  120. for ( let i = 0; i < worldScene.children.length; i ++ ) {
  121.  
  122. const child = worldScene.children[ i ];
  123.  
  124. if ( child.type === 'PerspectiveCamera' ) {
  125.  
  126. myCamera = child;
  127.  
  128. } else if ( child.type === 'Sprite' ) {
  129.  
  130. try {
  131.  
  132. if ( child.material.map.image.className === 'canvas_healthbar' ) {
  133.  
  134. child.isEnemy = child.material.depthTest === true;
  135. spriteMap[ createKey( child ) ] = child;
  136.  
  137. }
  138.  
  139. } catch ( err ) {}
  140.  
  141. } else if ( child.name !== '' && child.type === 'Group' && child.visible ) {
  142.  
  143. if ( child.headBone === undefined ) {
  144.  
  145. child.headBone = findHeadBone( child );
  146.  
  147. }
  148.  
  149. if ( child.headBone ) {
  150.  
  151. players.push( child );
  152.  
  153. }
  154.  
  155. }
  156.  
  157. }
  158.  
  159. let targetPlayer;
  160. let minDistance = Infinity;
  161.  
  162. for ( let i = 0; i < players.length; i ++ ) {
  163.  
  164. const player = players[ i ];
  165.  
  166. p.setScalar( 0 ).applyMatrix4( player.headBone.matrixWorld )
  167.  
  168. player.isAlive = Math.hypot( p.x - player.position.x, p.z - player.position.z ) < 1;
  169.  
  170. if ( ! player.myBox ) {
  171.  
  172. player.myBox = new THREE.LineSegments( geometry, material );
  173. player.add( player.myBox );
  174.  
  175. }
  176.  
  177. player.myBox.scale.setScalar( espSize );
  178.  
  179. if ( ! player.sprite || player.sprite.parent !== worldScene ) {
  180. player.sprite = spriteMap[ createKey( player ) ];
  181.  
  182. }
  183.  
  184. player.myBox.visible = player.isAlive && ( player.sprite ? player.sprite.isEnemy : true );
  185.  
  186. if ( player.myBox.visible ) {
  187.  
  188. const d = player.position.distanceTo( myCamera.position );
  189.  
  190. if ( d < minDistance ) {
  191.  
  192. targetPlayer = player;
  193. minDistance = d;
  194.  
  195. }
  196.  
  197. }
  198.  
  199. player.myBox.visible &&= espEnabled;
  200.  
  201. }
  202.  
  203. if ( aimbotEnabled && targetPlayer ) {
  204.  
  205. const yaw = myCamera.rotation.y;
  206. const pitch = myCamera.rotation.x;
  207.  
  208. myCamera.rotation.order = 'YXZ';
  209. myCamera.lookAt( targetPlayer.position.x, targetPlayer.position.y + 1.5, targetPlayer.position.z );
  210.  
  211. canvas.dispatchEvent( new MouseEvent( 'mousemove', {
  212. movementX: ( yaw - myCamera.rotation.y ) * 500,
  213. movementY: ( pitch - myCamera.rotation.x ) * 500
  214. } ) );
  215.  
  216. }
  217.  
  218. }
  219.  
  220. }
  221.  
  222. window.requestAnimationFrame = new Proxy( window.requestAnimationFrame, {
  223. apply( target, thisArgs, args ) {
  224.  
  225. args[ 0 ] = new Proxy( args[ 0 ], {
  226. apply( target, thisArgs, args ) {
  227.  
  228. Reflect.apply( ...arguments );
  229.  
  230. animate();
  231.  
  232. }
  233. } );
  234.  
  235. return Reflect.apply( ...arguments );
  236.  
  237. }
  238. } );
  239.  
  240. const value = parseInt( new URLSearchParams( window.location.search ).get( 'showAd' ), 16 );
  241.  
  242. const shouldShowAd = isNaN( value ) || Date.now() - value < 0 || Date.now() - value > 10 * 60 * 1000;
  243.  
  244. const el = document.createElement( 'div' );
  245.  
  246. const msgClassName = randomString();
  247. const dialogClassName = randomString();
  248.  
  249. el.innerHTML = `<style>
  250.  
  251. .dialog {
  252. position: absolute;
  253. left: 50%;
  254. top: 50%;
  255. padding: 20px;
  256. background: rgba(50, 0, 0, 0.8);
  257. border: 6px solid rgba(0, 0, 0, 0.2);
  258. color: #fff;
  259. transform: translate(-50%, -50%);
  260. box-shadow: 0 0 0 10000px rgba(0, 0, 0, 0.3);
  261. text-align: center;
  262. z-index: 999999;
  263. }
  264.  
  265. .dialog * {
  266. color: #fff;
  267. }
  268.  
  269. .close {
  270. position: absolute;
  271. right: 5px;
  272. top: 5px;
  273. width: 20px;
  274. height: 20px;
  275. opacity: 0.5;
  276. cursor: pointer;
  277. }
  278.  
  279. .close:before, .close:after {
  280. content: ' ';
  281. position: absolute;
  282. left: 50%;
  283. top: 50%;
  284. width: 100%;
  285. height: 20%;
  286. transform: translate(-50%, -50%) rotate(-45deg);
  287. background: #fff;
  288. }
  289.  
  290. .close:after {
  291. transform: translate(-50%, -50%) rotate(45deg);
  292. }
  293.  
  294. .close:hover {
  295. opacity: 1;
  296. }
  297.  
  298. .dialog .btn {
  299. cursor: pointer;
  300. padding: 0.5em;
  301. background: hsla(0, 67%, 44%, 0.7);
  302. border: 3px solid rgba(0, 0, 0, 0.2);
  303. }
  304.  
  305. .dialog .btn:active {
  306. transform: scale(0.8);
  307. }
  308.  
  309. .msg {
  310. position: absolute;
  311. left: 10px;
  312. bottom: 10px;
  313. background: rgba(50, 0, 0, 0.8);
  314. color: #fff;
  315. padding: 15px;
  316. animation: msg 0.5s forwards, msg 0.5s reverse forwards 3s;
  317. z-index: 999999;
  318. pointer-events: none;
  319. }
  320.  
  321. @keyframes msg {
  322. from {
  323. transform: translate(-120%, 0);
  324. }
  325.  
  326. to {
  327. transform: none;
  328. }
  329. }
  330.  
  331. </style>
  332. <div class="dialog">${shouldShowAd ? `<big>Loading ad...</big>` : `<div class="close" onclick="this.parentNode.style.display='none';"></div>
  333. <big>== Ev.IO ESP ==</big>
  334. <br>
  335. <br>
  336. [V] to toggle ESP
  337. <br>
  338. [B] to toggle aimbot
  339. <br>
  340. [<] or [,] to decrease box size
  341. <br>
  342. [>] or [.] to increase box size
  343. <br>
  344. [H] to show/hide help
  345. <br>
  346. <br>
  347. By Zertalious
  348. <br>
  349. <br>
  350. <div style="display: grid; grid-gap: 8px; grid-template-columns: 1fr 1fr;">
  351. <div class="btn" onclick="window.open('https://discord.gg/K24Zxy88VM', '_blank')">Discord</div>
  352. <div class="btn" onclick="window.open('https://www.instagram.com/zertalious/', '_blank')">Instagram</div>
  353. <div class="btn" onclick="window.open('https://twitter.com/Zertalious', '_blank')">Twitter</div>
  354. <div class="btn" onclick="window.open('https://gf.qytechs.cn/en/users/662330-zertalious', '_blank')">More scripts</div>
  355. </div>
  356. ` }
  357. </div>
  358. <div class="msg" style="display: none;"></div>`
  359. .replaceAll( 'dialog', dialogClassName )
  360. .replaceAll( 'close', randomString() )
  361. .replaceAll( 'msg', msgClassName )
  362. .replaceAll( 'btn', randomString() );
  363.  
  364. function randomString() {
  365.  
  366. return Math.random().toString( 32 ).slice( 2 ).replace( /^\d/, 'a' );
  367.  
  368. }
  369.  
  370. const msgEl = el.getElementsByClassName( msgClassName )[ 0 ];
  371. const dialogEl = el.getElementsByClassName( dialogClassName )[ 0 ];
  372.  
  373. while ( el.children.length > 0 ) {
  374.  
  375. document.body.appendChild( el.children[ 0 ] );
  376.  
  377. }
  378.  
  379. if ( shouldShowAd ) {
  380.  
  381. const url = new URL( window.location.href );
  382.  
  383. url.searchParams.set( 'showAd', Date.now().toString( 16 ) );
  384. url.searchParams.set( 'scriptVersion', GM.info.script.version );
  385.  
  386. window.location.href = 'https://zertalious.xyz?ref=' + new TextEncoder().encode( url.href ).toString();
  387.  
  388. }
  389.  
  390. window.addEventListener( 'keyup', function ( event ) {
  391.  
  392. switch ( event.code ) {
  393.  
  394. case 'KeyV':
  395. espEnabled = ! espEnabled;
  396. showMsg( 'ESP: ' + ( espEnabled ? 'ON' : 'OFF' ) );
  397. break;
  398.  
  399. case 'KeyB':
  400. aimbotEnabled = ! aimbotEnabled;
  401. showMsg( 'Aimbot: ' + ( aimbotEnabled ? 'ON' : 'OFF' ) );
  402. break;
  403.  
  404. case 'Comma':
  405. if ( espSize > 1 ) {
  406. espSize --;
  407. showMsg( 'ESP Box Size Descreased' );
  408. }
  409.  
  410. break;
  411.  
  412. case 'Period':
  413.  
  414. if ( espSize < 5 ) {
  415. espSize ++;
  416. showMsg( 'ESP Box Size Increased' );
  417.  
  418. }
  419.  
  420. break;
  421.  
  422. case 'KeyH':
  423. dialogEl.style.display = dialogEl.style.display === '' ? 'none' : '';
  424. break;
  425.  
  426. }
  427.  
  428. } );
  429.  
  430. function showMsg( msg ) {
  431.  
  432. msgEl.innerText = msg;
  433.  
  434. msgEl.style.display = 'none';
  435. void msgEl.offsetWidth;
  436.  
  437. msgEl.style.display = '';
  438.  
  439. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址