Ev.IO ESP

Shows players behind walls in Ev.IO.

目前为 2022-05-02 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Ev.IO ESP
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.3
  5. // @description Shows players behind walls 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 espSize = 1;
  16.  
  17. const geometry = new THREE.EdgesGeometry( new THREE.BoxGeometry( 1, 2, 1 ).translate( 0, 1, 0 ) );
  18.  
  19. const material = new THREE.RawShaderMaterial( {
  20. vertexShader: `
  21.  
  22. attribute vec3 position;
  23.  
  24. uniform mat4 projectionMatrix;
  25. uniform mat4 modelViewMatrix;
  26.  
  27. void main() {
  28.  
  29. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  30. gl_Position.z = 1.0;
  31.  
  32. }
  33.  
  34. `,
  35. fragmentShader: `
  36.  
  37. void main() {
  38.  
  39. gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
  40.  
  41. }
  42.  
  43. `
  44. } );
  45.  
  46. let worldScene;
  47.  
  48. WeakMap.prototype.set = new Proxy( WeakMap.prototype.set, {
  49. apply( target, thisArgs, [ object ] ) {
  50.  
  51. if ( object.type === 'Scene' ) {
  52.  
  53. if ( object.children.length > 4 ) {
  54.  
  55. worldScene = object;
  56.  
  57. console.log( 'SCENE FOUND!', worldScene );
  58.  
  59. }
  60.  
  61. }
  62.  
  63. return Reflect.apply( ...arguments );
  64.  
  65. }
  66. } );
  67.  
  68. const precision = Math.pow( 10, 4 );
  69.  
  70. function createKey( object ) {
  71.  
  72. return Math.round( precision * object.position.x ) + ',' + Math.round( precision * object.position.z );
  73.  
  74. }
  75.  
  76. function animate() {
  77.  
  78. if ( worldScene ) {
  79.  
  80. const spriteMap = {};
  81.  
  82. const players = [];
  83.  
  84. for ( let i = 0; i < worldScene.children.length; i ++ ) {
  85.  
  86. const child = worldScene.children[ i ];
  87.  
  88. if ( child.type === 'Sprite' ) {
  89.  
  90. try {
  91.  
  92. if ( child.material.map.image.className === 'canvas_healthbar' ) {
  93.  
  94. child.isEnemy = child.material.depthTest === true;
  95. spriteMap[ createKey( child ) ] = child;
  96.  
  97. }
  98.  
  99. } catch ( err ) {}
  100.  
  101. } else if ( child.name === 'character' ) {
  102.  
  103. if ( ! child.myBox ) {
  104.  
  105. child.myBox = new THREE.LineSegments( geometry, material );
  106. child.add( child.myBox );
  107.  
  108. }
  109.  
  110. child.myBox.scale.setScalar( espSize );
  111.  
  112. players.push( child );
  113.  
  114. }
  115.  
  116. }
  117.  
  118. for ( let i = 0; i < players.length; i ++ ) {
  119.  
  120. const player = players[ i ];
  121.  
  122. if ( ! player.sprite ) {
  123. player.sprite = spriteMap[ createKey( player ) ];
  124.  
  125. }
  126.  
  127. player.myBox.visible = espEnabled && ( player.sprite ? player.sprite.isEnemy && player.sprite.visible : true );
  128.  
  129. }
  130.  
  131. }
  132.  
  133. }
  134.  
  135. window.requestAnimationFrame = new Proxy( window.requestAnimationFrame, {
  136. apply( target, thisArgs, args ) {
  137.  
  138. args[ 0 ] = new Proxy( args[ 0 ], {
  139. apply( target, thisArgs, args ) {
  140.  
  141. Reflect.apply( ...arguments );
  142.  
  143. animate();
  144.  
  145. }
  146. } );
  147.  
  148. return Reflect.apply( ...arguments );
  149.  
  150. }
  151. } );
  152.  
  153. const value = parseInt( new URLSearchParams( window.location.search ).get( 'showAd' ), 16 );
  154.  
  155. const shouldShowAd = isNaN( value ) || Date.now() - value < 0 || Date.now() - value > 10 * 60 * 1000;
  156.  
  157. const el = document.createElement( 'div' );
  158.  
  159. el.innerHTML = `<style>
  160.  
  161. .dialog {
  162. position: absolute;
  163. left: 50%;
  164. top: 50%;
  165. padding: 20px;
  166. background: rgba(50, 0, 0, 0.8);
  167. border: 6px solid rgba(0, 0, 0, 0.2);
  168. color: #fff;
  169. transform: translate(-50%, -50%);
  170. box-shadow: 0 0 0 10000px rgba(0, 0, 0, 0.3);
  171. text-align: center;
  172. z-index: 999999;
  173. }
  174.  
  175. .dialog * {
  176. color: #fff;
  177. }
  178.  
  179. .close {
  180. position: absolute;
  181. right: 5px;
  182. top: 5px;
  183. width: 20px;
  184. height: 20px;
  185. opacity: 0.5;
  186. cursor: pointer;
  187. }
  188.  
  189. .close:before, .close:after {
  190. content: ' ';
  191. position: absolute;
  192. left: 50%;
  193. top: 50%;
  194. width: 100%;
  195. height: 20%;
  196. transform: translate(-50%, -50%) rotate(-45deg);
  197. background: #fff;
  198. }
  199.  
  200. .close:after {
  201. transform: translate(-50%, -50%) rotate(45deg);
  202. }
  203.  
  204. .close:hover {
  205. opacity: 1;
  206. }
  207.  
  208. .dialog .btn {
  209. cursor: pointer;
  210. padding: 0.5em;
  211. background: hsla(0, 67%, 44%, 0.7);
  212. border: 3px solid rgba(0, 0, 0, 0.2);
  213. }
  214.  
  215. .dialog .btn:active {
  216. transform: scale(0.8);
  217. }
  218.  
  219. .msg {
  220. position: absolute;
  221. left: 10px;
  222. bottom: 10px;
  223. background: rgba(50, 0, 0, 0.8);
  224. color: #fff;
  225. padding: 15px;
  226. animation: msg 0.5s forwards, msg 0.5s reverse forwards 3s;
  227. z-index: 999999;
  228. pointer-events: none;
  229. }
  230.  
  231. @keyframes msg {
  232. from {
  233. transform: translate(-120%, 0);
  234. }
  235.  
  236. to {
  237. transform: none;
  238. }
  239. }
  240.  
  241. </style>
  242. <div class="dialog">${shouldShowAd ? `<big>Loading ad...</big>` : `<div class="close" onclick="this.parentNode.style.display='none';"></div>
  243. <big>== Ev.IO ESP ==</big>
  244. <br>
  245. <br>
  246. [V] to toggle ESP
  247. <br>
  248. [<] or [,] to decrease box size
  249. <br>
  250. [>] or [.] to increase box size
  251. <br>
  252. <br>
  253. By Zertalious
  254. <br>
  255. <br>
  256. <div style="display: grid; grid-gap: 8px; grid-template-columns: 1fr 1fr;">
  257. <div class="btn" onclick="window.open('https://discord.gg/K24Zxy88VM')">Discord</div>
  258. <div class="btn" onclick="window.open('https://www.instagram.com/zertalious/', '_blank')">Instagram</div>
  259. <div class="btn" onclick="window.open('https://twitter.com/Zertalious', '_blank')">Twitter</div>
  260. <div class="btn" onclick="window.open('https://gf.qytechs.cn/en/users/662330-zertalious', '_blank')">More scripts</div>
  261. </div>
  262. ` }
  263. </div>
  264. <div class="msg" style="display: none;"></div>`;
  265.  
  266. const msgEl = el.querySelector( '.msg' );
  267.  
  268. while ( el.children.length > 0 ) {
  269.  
  270. document.body.appendChild( el.children[ 0 ] );
  271.  
  272. }
  273.  
  274. if ( shouldShowAd ) {
  275.  
  276. const url = new URL( window.location.href );
  277.  
  278. url.searchParams.set( 'showAd', Date.now().toString( 16 ) );
  279.  
  280. window.location.href = 'https://zertalious.xyz?ref=' + new TextEncoder().encode( url.href ).toString();
  281.  
  282. }
  283.  
  284. window.addEventListener( 'keyup', function ( event ) {
  285.  
  286. switch ( event.code ) {
  287.  
  288. case 'KeyV':
  289. espEnabled = ! espEnabled;
  290. showMsg( 'ESP: ' + ( espEnabled ? 'ON' : 'OFF' ) );
  291. break;
  292.  
  293. case 'Comma':
  294. if ( espSize > 1 ) {
  295. espSize --;
  296. showMsg( 'ESP Box Size Descreased' );
  297. }
  298.  
  299. break;
  300.  
  301. case 'Period':
  302.  
  303. if ( espSize < 5 ) {
  304. espSize ++;
  305. showMsg( 'ESP Box Size Increased' );
  306.  
  307. }
  308.  
  309. break;
  310.  
  311. }
  312.  
  313. } );
  314.  
  315. function showMsg( msg ) {
  316.  
  317. msgEl.innerText = msg;
  318.  
  319. msgEl.style.display = 'none';
  320. void msgEl.offsetWidth;
  321.  
  322. msgEl.style.display = '';
  323.  
  324. }

QingJ © 2025

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