VOXploit

Aimbot, triggerbot, chams, no-recoil for voxiom.io

  1. // ==UserScript==
  2. // @name VOXploit
  3. // @namespace http://tampermonkey.net/
  4. // @match https://voxiom.io/*
  5. // @run-at document-start
  6. // @grant none
  7. // @version 1.0.1
  8. // @author Cloud1
  9. // @description Aimbot, triggerbot, chams, no-recoil for voxiom.io
  10. // @license GPL
  11. // @require https://cdn.jsdelivr.net/npm/lil-gui@0.19.2/dist/lil-gui.umd.min.js
  12. // @require https://unpkg.com/three@0.150.0/build/three.min.js
  13. // @icon https://www.google.com/s2/favicons?sz=64&domain=voxiom.io
  14. // ==/UserScript==
  15.  
  16. const THREE = window.THREE;
  17. delete window.THREE;
  18.  
  19. // avoid detection
  20. const matchDetection = /^function\(\){\w+\['\w+'\]\(\);}$/;
  21. const setIntervalHandler = {
  22. apply: function(target, thisArg, argumentsList) {
  23. const callback = argumentsList[0];
  24. const delay = argumentsList[1];
  25. if (delay === 1000 && callback && callback.toString().match(matchDetection)) {
  26. console.log('Blocked detection');
  27. return null;
  28. }
  29. return Reflect.apply(...arguments);
  30. }
  31. };
  32. window.setInterval = new Proxy(window.setInterval, setIntervalHandler);
  33.  
  34. // add #lil-gui container
  35. const lilGuiContainer = document.createElement('div');
  36. lilGuiContainer.id = 'lil-gui';
  37. document.body.appendChild(lilGuiContainer);
  38. const style = document.createElement('style');
  39. const guiStyle = document.createElement('style');
  40. const GUI = lil.GUI;
  41. const gui = new GUI({ container: lilGuiContainer, title: 'Controls' });
  42. let espConfig = {
  43. heightLine: 1.16,
  44. sneakHeight: 0.4,
  45. ennemyDistance: 50,
  46. maxAngleInRadians: 0.1,
  47. noRecoil: true,
  48. showBox: 0,
  49. showOutline: 0,
  50. showPlayer: 2,
  51. showLine: 1,
  52. wireframe: false,
  53. allEnnemies: false,
  54. isSniper: false,
  55. aimbot: 2,
  56. triggerBot: 2,
  57. aimbotIgnoreWall: false,
  58. mapZoom: 30,
  59. mapOffsetZ: 0,
  60. autoClaimAds: false,
  61. antiAFK: false,
  62. rainbow: false,
  63. showAimRadius: false,
  64. lockAimbotTriggerBot: false,
  65. aimbotKey: 'b',
  66. triggerBotKey: 't',
  67. toggleUIKey: '.',
  68. };
  69.  
  70. const aimbotFolder = gui.addFolder('Aimbot');
  71. aimbotFolder.add(espConfig, 'aimbot').name(`aimbot (${espConfig.aimbotKey})`).options({Off: 0, LeftClick: 1, RightClick: 2, Always: 3}).listen();
  72. aimbotFolder.add(espConfig, 'triggerBot').name(`triggerBot (${espConfig.triggerBotKey})`).options({Off: 0, LeftClick: 1, RightClick: 2, Always: 3}).listen();
  73. aimbotFolder.add(espConfig, 'noRecoil');
  74. aimbotFolder.add(espConfig, 'allEnnemies');
  75. aimbotFolder.add(espConfig, 'isSniper');
  76. const advancedAimbotFolder = aimbotFolder.addFolder('Advanced');
  77. advancedAimbotFolder.close();
  78. advancedAimbotFolder.add(espConfig, 'aimbotIgnoreWall');
  79. advancedAimbotFolder.add(espConfig, 'showAimRadius');
  80. advancedAimbotFolder.add(espConfig, 'maxAngleInRadians', 0.01, 0.5, 0.01);
  81. advancedAimbotFolder.add(espConfig, 'heightLine', .5, 1.25, 0.01);
  82. advancedAimbotFolder.add(espConfig, 'sneakHeight', 0, 1, 0.01);
  83. const chamsFolder = gui.addFolder('Chams');
  84. chamsFolder.close();
  85. chamsFolder.add(espConfig, 'showPlayer').options({Off: 0, Ennemies: 1, All: 2});
  86. chamsFolder.add(espConfig, 'showLine').options({Off: 0, Ennemies: 1, All: 2});
  87. chamsFolder.add(espConfig, 'showOutline').options({Off: 0, Ennemies: 1, All: 2});
  88. chamsFolder.add(espConfig, 'showBox').options({Off: 0, Ennemies: 1, All: 2});
  89. chamsFolder.add(espConfig, 'ennemyDistance', 10, 100, 1);
  90. chamsFolder.add(espConfig, 'wireframe');
  91. chamsFolder.add(espConfig, 'rainbow');
  92. chamsFolder.add(espConfig, 'mapZoom', 20, 100, 1);
  93. chamsFolder.add(espConfig, 'mapOffsetZ', -50, 50, 1);
  94. const toolsFolder = gui.addFolder('Tools');
  95. toolsFolder.close();
  96. toolsFolder.add(espConfig, 'autoClaimAds');
  97. toolsFolder.add(espConfig, 'antiAFK');
  98. toolsFolder.add(espConfig, 'lockAimbotTriggerBot');
  99. // load/save config
  100. const configFolder = gui.addFolder('Config');
  101. configFolder.add(espConfig, 'toggleUIKey').name('Toggle UI key');
  102. configFolder.add(espConfig, 'aimbotKey').name('Aimbot key');
  103. configFolder.add(espConfig, 'triggerBotKey').name('Triggerbot key');
  104. configFolder.close();
  105. const defaultConfig = gui.save();
  106. let config = { configName: 'espConfig' };
  107. configFolder.add(config, 'configName').name('Config name');
  108. configFolder.add({ export: () => {
  109. const currentConfig = JSON.stringify(gui.save(), null, 2);
  110. const element = document.createElement('a');
  111. element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(currentConfig));
  112. element.setAttribute('download', config.configName + '.json');
  113. element.style.display = 'none';
  114. document.body.appendChild(element);
  115. element.click();
  116. document.body.removeChild(element);
  117. }}, 'export').name('Export config');
  118. configFolder.add({ import: () => {
  119. const input = document.createElement('input');
  120. input.type = 'file';
  121. input.accept = '.json';
  122. input.onchange = (e) => {
  123. const file = e.target.files[0];
  124. const reader = new FileReader();
  125. reader.onload = (e) => {
  126. gui.load(JSON.parse(e.target.result));
  127. };
  128. reader.readAsText(file);
  129. };
  130. input.click();
  131. }}, 'import').name('Import config');
  132. configFolder.add({ reset: () => {
  133. gui.load(defaultConfig);
  134. localStorage.removeItem('espConfig');
  135. }}, 'reset').name('Reset config');
  136. // auto load/save config
  137. const savedConfig = localStorage.getItem('espConfig');
  138. if (savedConfig) {
  139. console.log('Loaded config', savedConfig);
  140. gui.load(JSON.parse(savedConfig));
  141. }
  142. gui.onChange(() => {
  143. localStorage.setItem('espConfig', JSON.stringify(gui.save()));
  144. });
  145. // listen for key press
  146. document.addEventListener('keydown', (e) => {
  147. if (!espConfig.lockAimbotTriggerBot && e.key === espConfig.aimbotKey) {
  148. espConfig.aimbot = (espConfig.aimbot + 1) % 4;
  149. }
  150. if (!espConfig.lockAimbotTriggerBot && e.key === espConfig.triggerBotKey) {
  151. espConfig.triggerBot = (espConfig.triggerBot + 1) % 4;
  152. }
  153. if (e.key === espConfig.toggleUIKey) {
  154. lilGuiContainer.style.display = lilGuiContainer.style.display === 'none' ? 'block' : 'none';
  155. }
  156. if (e.key === 'e') {
  157. if (espConfig.autoClaimAds) {
  158. setTimeout(() => {
  159. claimAds();
  160. }, 100);
  161. }
  162. }
  163. });
  164. // no-recoil
  165. let foundRecoil = false;
  166. const arrayPushHandler = {
  167. apply: function(target, thisArg, argumentsList) {
  168. if (!foundRecoil && argumentsList.length === 1) {
  169. const item = argumentsList[0];
  170. if (item && typeof item === 'object') {
  171. const keys = Object.keys(item);
  172. if (keys.length === 44) {
  173. for (const key in item) {
  174. if (item[key] === 0.3) {
  175. console.log('Recoil key found', key);
  176. foundRecoil = true;
  177. Object.defineProperty(Object.prototype, key, {
  178. get: () => {
  179. return espConfig.noRecoil ? 0 : item[key];
  180. },
  181. set: (baseRecoil) => {
  182. _baseRecoil = baseRecoil;
  183. }
  184. });
  185. break;
  186. }
  187. }
  188. }
  189. }
  190. }
  191. return Reflect.apply(...arguments);
  192. }
  193. };
  194. Array.prototype.push = new Proxy(Array.prototype.push, arrayPushHandler);
  195. // listen for mouse click
  196. let isLeftClick = false;
  197. let isRightClick = false;
  198. document.addEventListener('mousedown', (e) => {
  199. if (e.button === 0) {
  200. isLeftClick = true;
  201. }
  202. if (e.button === 2) {
  203. if (espConfig.isSniper) {
  204. setTimeout(() => {
  205. isRightClick = true;
  206. }, 400);
  207. } else {
  208. isRightClick = true;
  209. }
  210. }
  211. });
  212. document.addEventListener('mouseup', (e) => {
  213. if (e.button === 0) {
  214. isLeftClick = false;
  215. }
  216. if (e.button === 2) {
  217. isRightClick = false;
  218. }
  219. });
  220. // obfuscaed keys
  221. let worldScene = null;
  222. let childrenKey = null;
  223. let worldCamera = null;
  224. let projectionMatrixKey = null;
  225. let matrixWorldKey = null;
  226. let matrixElKey = null;
  227. // three.js setup
  228. const scene = new THREE.Scene();
  229. const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);
  230. camera.rotation.order = 'YXZ';
  231. let saveViewport = new THREE.Vector4();
  232. let saveScissor = new THREE.Vector4();
  233. let minimapViewport = new THREE.Vector4(20, window.innerHeight - 250 - 20, 250, 250);
  234. const minimapCamera = new THREE.OrthographicCamera(-espConfig.mapZoom, espConfig.mapZoom, espConfig.mapZoom, -espConfig.mapZoom, 0.1, 1000);
  235. minimapCamera.rotation.order = 'YXZ';
  236. minimapCamera.position.set(0, 50, 0);
  237. minimapCamera.lookAt(0, 0, 0);
  238. const renderer = new THREE.WebGLRenderer( {
  239. alpha: true,
  240. antialias: true
  241. });
  242. renderer.setSize(window.innerWidth, window.innerHeight);
  243. renderer.setPixelRatio(window.devicePixelRatio);
  244. renderer.domElement.id = 'overlayCanvas';
  245. document.body.appendChild(renderer.domElement);
  246. function setTransform(target, transform, isMatrix = true) {
  247. const matrix = new THREE.Matrix4().fromArray(isMatrix ? transform : transform[matrixWorldKey][matrixElKey]);
  248. matrix.decompose(target.position, target.quaternion, target.scale);
  249. }
  250. doOnce = (fn) => {
  251. let done = false;
  252. return (...args) => {
  253. if (!done) {
  254. done = true;
  255. return fn(...args);
  256. }
  257. };
  258. };
  259. function checkWorldCamera(object) {
  260. if (worldCamera && object.uuid === worldCamera.uuid) return;
  261. let hasProjectionMatrix = false;
  262. for (const key in object) {
  263. const element = object[key];
  264. if (!element) continue;
  265. if (typeof element == 'object') {
  266. if (hasProjectionMatrix) continue;
  267. const valueKey = Object.keys(element)[0];
  268. const value = element[valueKey];
  269. if (Array.isArray(value) && value[11] === -1) {
  270. hasProjectionMatrix = true;
  271. matrixElKey = valueKey;
  272. projectionMatrixKey = key;
  273. }
  274. } else if (typeof element === 'function') {
  275. const code = element.toString();
  276. const match = /verse'\]\(this\['([^']+)'\]\);/.exec(code);
  277. if (match) {
  278. matrixWorldKey = match[1];
  279. }
  280. }
  281. if (hasProjectionMatrix && matrixWorldKey) {
  282. console.log('Found camera', {object}, object);
  283. worldCamera = object;
  284. object[projectionMatrixKey] = new Proxy(object[projectionMatrixKey], {
  285. get: function(target, prop, receiver) {
  286. setTransform(camera, object, false);
  287. camera.near = worldCamera.near;
  288. camera.far = worldCamera.far;
  289. camera.aspect = worldCamera.aspect;
  290. camera.fov = worldCamera.fov;
  291. camera.updateProjectionMatrix();
  292. worldCamera = object;
  293. window.worldCamera = object;
  294. return Reflect.get(...arguments);
  295. }
  296. });
  297. break;
  298. }
  299. }
  300. }
  301. function checkWorldScene(object) {
  302. if (worldScene || object instanceof THREE.Scene) return;
  303. for (const key in object) {
  304. const element = object[key];
  305. if (!element) continue;
  306. if (Array.isArray(element) && element.length === 9) {
  307. const value = element[0];
  308. if (value && typeof value === 'object' && value.hasOwnProperty('uuid')) {
  309. childrenKey = key;
  310. }
  311. }
  312. if (childrenKey) {
  313. console.log('Found scene', {childrenKey}, object);
  314. worldScene = object;
  315. window.worldScene = object;
  316. renderer.setAnimationLoop(animate);
  317. break;
  318. }
  319. }
  320. }
  321. Object.defineProperty( Object.prototype, 'overrideMaterial', {
  322. get: function() {
  323. checkWorldScene(this);
  324. return this._overrideMaterial;
  325. },
  326. set: function(value) {
  327. this._overrideMaterial = value;
  328. }
  329. });
  330. Object.defineProperty( Object.prototype, 'far', {
  331. get: function() {
  332. checkWorldCamera(this);
  333. return this._far;
  334. },
  335. set: function(value) {
  336. this._far = value;
  337. }
  338. });
  339. function isPlayer(entity) {
  340. try {
  341. return entity[childrenKey].length > 2 || !entity[childrenKey][1].geometry;
  342. } catch {
  343. return false;
  344. }
  345. }
  346. // claim ads
  347. function claimAds() {
  348. document.querySelectorAll('svg').forEach(svg => {
  349. if (svg.getAttribute('data-icon') === 'play-circle') {
  350. svg.closest('div').click();
  351. console.log('Claimed ads');
  352. }
  353. });
  354. }
  355. const context2DFillTextHandler = {
  356. apply: function(target, thisArg, argumentsList) {
  357. thisArg.canvas.lastText = argumentsList[0];
  358. return Reflect.apply(...arguments);
  359. }
  360. };
  361. CanvasRenderingContext2D.prototype.fillText = new Proxy(CanvasRenderingContext2D.prototype.fillText, context2DFillTextHandler);
  362. function isEnnemy(entity) {
  363. for (const child of entity[childrenKey]) {
  364. try {
  365. const matImage = child.material.map.image;
  366. if (matImage instanceof HTMLCanvasElement && matImage.hasOwnProperty('lastText')) {
  367. entity.playerName = matImage.lastText;
  368. return false;
  369. }
  370. } catch {}
  371. }
  372. return true;
  373. }
  374. function setFiring(shouldFire) {
  375. if (setFiring.firing === shouldFire) return;
  376. setFiring.firing = shouldFire;
  377. if (shouldFire) {
  378. if (espConfig.isSniper) { // need improvement
  379. setTimeout(() => {
  380. document.dispatchEvent(new MouseEvent('mousedown', { buttons: 3 }));
  381. setTimeout(() => {
  382. document.dispatchEvent(new MouseEvent('mouseup', { buttons: 0 }));
  383. }, 200);
  384. // setFiring.firing = false;
  385. }, 300);
  386. } else {
  387. document.dispatchEvent(new MouseEvent('mousedown', { buttons: 3 }));
  388. }
  389. } else {
  390. document.dispatchEvent(new MouseEvent('mouseup', { buttons: 0 }));
  391. }
  392. }
  393. const colors = {
  394. ennemy: new THREE.Color(0xff0000),
  395. player: new THREE.Color(0x00ff00),
  396. blue: new THREE.Color(0x0000ff)
  397. };
  398. const outlineMats = {
  399. ennemy: new THREE.LineBasicMaterial({ color: colors.ennemy }),
  400. player: new THREE.LineBasicMaterial({ color: colors.player })
  401. };
  402. const meshMats = {
  403. ennemy: new THREE.MeshBasicMaterial({ color: colors.ennemy, transparent: true, opacity: 0.5 }),
  404. player: new THREE.MeshBasicMaterial({ color: colors.player, transparent: true, opacity: 0.5 })
  405. };
  406. const raycaster = new THREE.Raycaster();
  407. const edgesGeometry = new THREE.EdgesGeometry(new THREE.BoxGeometry(1, 1, 1).translate(0, 0.5, 0));
  408. const lineGeometry = new THREE.BufferGeometry();
  409. const lineMaterial = new THREE.LineBasicMaterial({ vertexColors: true, transparent: true });
  410. const line = new THREE.LineSegments(lineGeometry, lineMaterial);
  411. line.frustumCulled = false;
  412. scene.add(line);
  413. const dummyLookAt = new THREE.PerspectiveCamera();
  414. const color = new THREE.Color();
  415. const chunkMaterial = new THREE.MeshNormalMaterial();
  416. const boxPlayerGeometry = new THREE.BoxGeometry(.25, 1.25, 0.25);
  417. // crosshair circle
  418. const crosshairGeometry = new THREE.CircleGeometry(.5, 32);
  419. const crosshairMaterial = new THREE.LineBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.2 });
  420. const crosshair = new THREE.LineLoop(crosshairGeometry, crosshairMaterial);
  421. camera.add(crosshair);
  422. scene.add(camera);
  423. function calculateValue(maxAngleInRadians) {
  424. const a = -79.83;
  425. const b = -30.06;
  426. const c = -0.90;
  427. return a * Math.exp(b * maxAngleInRadians) + c;
  428. }
  429. function animate(time) {
  430. const now = Date.now();
  431. const entities = childrenKey ? worldScene[childrenKey][5][childrenKey] : [];
  432. const lineOrigin = camera.localToWorld(new THREE.Vector3(0, 0, -10));
  433. const linePositions = [];
  434. crosshair.position.z = calculateValue(espConfig.maxAngleInRadians);
  435. crosshair.visible = espConfig.showAimRadius;
  436. const colorArray = [];
  437. const aimbotTarget = { angleDifference: Infinity};
  438. const chunks = [];
  439. const gameChunks = childrenKey ? worldScene[childrenKey][4][childrenKey] : [];
  440. for (const chunk of gameChunks) {
  441. if (!chunk || !chunk.geometry) continue;
  442. const chunkPositions = chunk.geometry.attributes.position.array;
  443. if (!chunkPositions || !chunkPositions.length) continue;
  444. if (!chunk.myChunk) {
  445. const geometry = new THREE.BufferGeometry();
  446. geometry.setAttribute(
  447. 'position',
  448. new THREE.Float32BufferAttribute(chunkPositions, 3)
  449. );
  450. geometry.setIndex(
  451. new THREE.BufferAttribute(chunk.geometry.index.array, 1)
  452. );
  453. geometry.computeVertexNormals();
  454. geometry.computeBoundingBox();
  455. chunk.myChunk = new THREE.Mesh(geometry, chunkMaterial);
  456. chunk.myChunk.box = new THREE.Box3();
  457. }
  458. const myChunk = chunk.myChunk;
  459. if (chunk.material) chunk.material.wireframe = espConfig.wireframe;
  460. setTransform(myChunk, chunk, false);
  461. myChunk.updateMatrixWorld();
  462. myChunk.box.copy(myChunk.geometry.boundingBox).applyMatrix4(myChunk.matrixWorld);
  463. chunks.push(myChunk);
  464. }
  465. chunks.sort((a, b) => {
  466. const distanceA = a.position.distanceTo(camera.position);
  467. const distanceB = b.position.distanceTo(camera.position);
  468. return distanceB - distanceA;
  469. });
  470. const shouldAimbot = espConfig.aimbot === 3 || (espConfig.aimbot === 1 && isLeftClick) || (espConfig.aimbot === 2 && isRightClick);
  471. entities.forEach(entity => {
  472. if (!entity || !entity.parent) return;
  473. if (!entity.myObject3D) {
  474. entity.myObject3D = new THREE.Object3D();
  475. entity.myObject3D.frustumCulled = false;
  476. entity.discovered = now;
  477. entity.loaded = false;
  478. entity.logged = false;
  479. entity.ennemy = null;
  480. return;
  481. }
  482. if (typeof entity.visible === 'boolean' && !entity.visible) {
  483. entity.myObject3D.visible = false;
  484. return;
  485. }
  486. if (!entity.loaded && now - entity.discovered < 500) return;
  487. entity.loaded = true;
  488. if (!entity.logged && isPlayer(entity)) {
  489. const skinnedMesh = entity[childrenKey][1][childrenKey][3];
  490. entity.isPlayer = true;
  491. entity.logged = true;
  492. entity.ennemy = isEnnemy(entity);
  493. const playerMesh = new THREE.Mesh(skinnedMesh.geometry, entity.ennemy ? meshMats.ennemy : meshMats.player);
  494. entity.myObject3D.add(playerMesh);
  495. entity.myObject3D.playerMesh = playerMesh;
  496. const playerMiniMap = new THREE.Mesh(skinnedMesh.geometry, entity.ennemy ? meshMats.ennemy : meshMats.player);
  497. playerMiniMap.visible = false;
  498. entity.myObject3D.add(playerMiniMap);
  499. entity.myObject3D.playerMiniMap = playerMiniMap;
  500. const outline = new THREE.LineSegments(edgesGeometry, entity.ennemy ? outlineMats.ennemy : outlineMats.player);
  501. outline.scale.set(0.5, 1.25, 0.5);
  502. outline.frustumCulled = false;
  503. entity.myObject3D.add(outline);
  504. entity.myObject3D.outline = outline;
  505. const boxMesh = new THREE.Mesh(boxPlayerGeometry, entity.ennemy ? meshMats.ennemy : meshMats.player);
  506. boxMesh.position.y = 0.625;
  507. entity.myObject3D.add(boxMesh);
  508. entity.myObject3D.boxMesh = boxMesh;
  509. const dir = new THREE.Vector3(0, 0, -1);
  510. const origin = new THREE.Vector3(0, 1, 0);
  511. const arrowLookingAt = new THREE.ArrowHelper(dir, origin, 1, entity.ennemy ? colors.ennemy : colors.player, 0.5, .4);
  512. playerMiniMap.add(arrowLookingAt);
  513. setTransform(entity.myObject3D, entity, false);
  514. scene.add(entity.myObject3D);
  515. }
  516. if (entity.isPlayer) {
  517. entity.myObject3D.playerMesh.rotation.y = -entity[childrenKey][1].rotation._y;
  518. entity.myObject3D.playerMiniMap.rotation.y = -entity[childrenKey][1].rotation._y;
  519. const skinnedMesh = entity[childrenKey][1][childrenKey][3];
  520. const isSneak = skinnedMesh.skeleton.bones[4].rotation._x > 0.1;
  521. entity.myObject3D.boxMesh.scale.set(1, isSneak ? .4 : 1, 1);
  522. entity.myObject3D.outline.scale.set(0.5, isSneak ? .9 : 1.25, 0.5);
  523. entity.myObject3D.playerMesh.scale.set(1, isSneak ? .7 : 1, 1);
  524. entity.myObject3D.visible = true;
  525. entity.myObject3D.playerMesh.visible = espConfig.showPlayer === 2 || (espConfig.showPlayer === 1 && !entity.ennemy);
  526. entity.myObject3D.boxMesh.visible = espConfig.showBox === 2 || (espConfig.showBox === 1 && entity.ennemy);
  527. entity.myObject3D.outline.visible = espConfig.showOutline === 2 || (espConfig.showOutline === 1 && entity.ennemy);
  528. setTransform(entity.myObject3D, entity, false);
  529. // aimbot and line
  530. const pos = entity.myObject3D.position.clone();
  531. pos.y -= isSneak ? espConfig.sneakHeight : 0;
  532. // line
  533. if (espConfig.showLine === 2 || (espConfig.showLine === 1 && entity.ennemy)) {
  534. if (espConfig.rainbow) {
  535. color.setHSL(time % 2000 / 2000, 1, 0.5);
  536. } else if (entity.ennemy) {
  537. color.lerpColors(colors.ennemy, colors.player, pos.distanceTo(camera.position) / espConfig.ennemyDistance);
  538. color.a = .8;
  539. } else {
  540. color.set(colors.blue);
  541. color.a = .3;
  542. }
  543. linePositions.push(lineOrigin.x, lineOrigin.y, lineOrigin.z);
  544. pos.y += 1.25;
  545. linePositions.push(pos.x, pos.y, pos.z);
  546. pos.y -= 1.25;
  547. colorArray.push(color.r, color.g, color.b, color.a);
  548. colorArray.push(color.r, color.g, color.b, color.a);
  549. }
  550. pos.y += espConfig.heightLine;
  551. // aimbot
  552. if (shouldAimbot && (entity.ennemy || espConfig.allEnnemies)) {
  553. const distance = pos.distanceTo(camera.position);
  554. const target = pos.clone();
  555. const dummy = new THREE.PerspectiveCamera();
  556. setTransform(dummy, worldCamera, false);
  557. dummy.lookAt(target);
  558. const cameraVector = new THREE.Vector3(0, 0, -1).applyQuaternion(camera.quaternion);
  559. const targetVector = new THREE.Vector3(0, 0, -1).applyQuaternion(dummy.quaternion);
  560. const angleDifference = cameraVector.angleTo(targetVector);
  561. if (angleDifference < espConfig.maxAngleInRadians && angleDifference < aimbotTarget.angleDifference) {
  562. const directionV3 = new THREE.Vector3();
  563. directionV3.subVectors(target, camera.position).normalize();
  564. raycaster.set(camera.position, directionV3);
  565. let behindBlock = false;
  566. if (espConfig.aimbotIgnoreWall) {
  567. aimbotTarget.angleDifference = angleDifference;
  568. aimbotTarget.target = target;
  569. } else {
  570. for (const chunk of chunks) {
  571. if (raycaster.ray.intersectsBox(chunk.box)) {
  572. const hit = raycaster.intersectObject(chunk)[0];
  573. if (hit && hit.distance < distance) {
  574. behindBlock = true;
  575. break;
  576. }
  577. }
  578. }
  579. if (!behindBlock) {
  580. aimbotTarget.angleDifference = angleDifference;
  581. aimbotTarget.target = target;
  582. color.setHSL(time % 2000 / 2000, 1, 0.5);
  583. }
  584. }
  585. }
  586. }
  587. }
  588. });
  589. // aim at target
  590. if (espConfig.aimbot && shouldAimbot && aimbotTarget.target) {
  591. setTransform(dummyLookAt, worldCamera, false);
  592. dummyLookAt.lookAt(aimbotTarget.target);
  593. worldCamera.rotation.set(
  594. dummyLookAt.rotation.x,
  595. dummyLookAt.rotation.y,
  596. dummyLookAt.rotation.z
  597. );
  598. }
  599. // triggerbot
  600. const shouldTrigger = espConfig.triggerBot === 3 || (espConfig.triggerBot === 1 && isLeftClick) || (espConfig.triggerBot === 2 && isRightClick);
  601. if (shouldTrigger) {
  602. raycaster.set(camera.position, camera.getWorldDirection(new THREE.Vector3()));
  603. let hasHit = false;
  604. for (const entity of entities) {
  605. if (!entity.myObject3D.visible) continue;
  606. if (entity.isPlayer && (entity.ennemy || espConfig.allEnnemies)) {
  607. const hit = raycaster.intersectObject(entity.myObject3D.playerMesh);
  608. if (hit.length) {
  609. hasHit = true;
  610. const distance = hit[0].distance;
  611. for (const chunk of chunks) {
  612. if (raycaster.ray.intersectsBox(chunk.box)) {
  613. const hitBlock = raycaster.intersectObject(chunk)[0];
  614. if (hitBlock && hitBlock.distance < distance) {
  615. hasHit = false;
  616. break;
  617. }
  618. }
  619. }
  620. if (hasHit) {
  621. break;
  622. }
  623. }
  624. }
  625. }
  626. setFiring(hasHit);
  627. } else {
  628. setFiring(false);
  629. }
  630. line.geometry.setAttribute('color', new THREE.Float32BufferAttribute(colorArray, 4));
  631. line.geometry.setAttribute('position', new THREE.Float32BufferAttribute(linePositions, 3));
  632. line.visible = espConfig.showLine;
  633. renderer.render(scene, camera);
  634. // minimap
  635. // make entities larger for minimap
  636. const scale = espConfig.mapZoom / 3;
  637. entities.forEach(entity => {
  638. if (entity.isPlayer) {
  639. entity.myObject3D.playerMesh.visible = false;
  640. entity.myObject3D.boxMesh.visible = false;
  641. entity.myObject3D.outline.visible = false;
  642. entity.myObject3D.playerMiniMap.visible = true;
  643. entity.myObject3D.playerMiniMap.scale.set(scale, 1, scale);
  644. }
  645. });
  646. if (worldCamera) {
  647. line.visible = false;
  648. crosshair.visible = false;
  649. // update orthographic camera based on espConfig.mapZoom
  650. minimapCamera.left = -espConfig.mapZoom;
  651. minimapCamera.right = espConfig.mapZoom;
  652. minimapCamera.top = espConfig.mapZoom;
  653. minimapCamera.bottom = -espConfig.mapZoom;
  654. // update position with camera position
  655. minimapCamera.position.copy(camera.position);
  656. minimapCamera.position.y += 50;
  657. minimapCamera.position.z += espConfig.mapOffsetZ;
  658. minimapCamera.rotation.y = camera.rotation.y;
  659. minimapCamera.updateProjectionMatrix();
  660. renderer.getViewport(saveViewport);
  661. renderer.getScissor(saveScissor);
  662. let saveScissorTest = renderer.getScissorTest();
  663. renderer.setViewport(minimapViewport);
  664. renderer.setScissor(minimapViewport);
  665. renderer.setScissorTest(true);
  666. renderer.render(scene, minimapCamera);
  667. renderer.setViewport(saveViewport);
  668. renderer.setScissor(saveScissor);
  669. renderer.setScissorTest(saveScissorTest);
  670. }
  671. entities.forEach(entity => {
  672. if (entity.isPlayer) {
  673. entity.myObject3D.playerMiniMap.visible = false;
  674. }
  675. });
  676. scene.children.forEach(child => {
  677. if (child.type === 'Object3D') {
  678. child.visible = false;
  679. }
  680. });
  681. }
  682. window.addEventListener('resize', () => {
  683. renderer.setSize( window.innerWidth, window.innerHeight );
  684. });
  685. // add style to header
  686. style.innerHTML = `
  687. #overlayCanvas {
  688. position: absolute;
  689. top: 0;
  690. left: 0;
  691. width: 100%;
  692. height: 100%;
  693. pointer-events: none;
  694. z-index: 1000;
  695. }
  696. #lil-gui {
  697. position: absolute;
  698. top: 50%;
  699. right: 0;
  700. z-index: 1001;
  701. transform: translateY(-50%);
  702. }
  703. .lil-gui {
  704. --background-color: rgba(0, 0, 0, 0.5);
  705. }
  706. `;
  707. guiStyle.innerHTML = `
  708. .lil-gui {
  709. --title-background-color: #ff0019;
  710. --number-color: #00ff33;
  711. }
  712. `;
  713. document.head.appendChild(style);
  714. document.head.appendChild(guiStyle);
  715. // anti-afk
  716. setInterval(() => {
  717. if (espConfig.antiAFK) {
  718. // move left for .5s then right for .5s
  719. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 87}));
  720. setTimeout(() => {
  721. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 87}));
  722. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 83}));
  723. setTimeout(() => {
  724. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 83}));
  725. }, 500);
  726. }, 500);
  727. }
  728. }, 5000);
  729. // wait for load
  730. window.addEventListener('load', () => {
  731. console.log('Loaded');
  732. if (espConfig.autoClaimAds) {
  733. setTimeout(() => {
  734. claimAds();
  735. }, 500);
  736. }
  737. });