!Krunker.EXE (Aimbot, ESP, Etc)

Completely Free

  1. // ==UserScript==
  2. // @name !Krunker.EXE (Aimbot, ESP, Etc)
  3. // @name:en !Krunker.EXE (Aimbot, ESP, Etc)
  4. // @name:ar !Krunker.exe (Aimbot ، ESP ، إلخ)
  5. // @name:zh !krunker.exe(AIMBOT,ESP等
  6. // @name:nl !Krunker.exe (AIMBOT, ESP, enz.)
  7. // @name:fr !Krunker.exe (AIBBOT, ESP, etc.)
  8. // @name:de !krunker.exe (Aimbot, Esp usw.)
  9. // @name:it !krunker.exe (Aimbot, ESP, ecc.
  10. // @name:ja !krunker.exe(aimbot、espなど)
  11. // @name:ru !krunker.exe (aimbot, esp и т. Д.)
  12. // @name:es !Krunker.exe (Aimbot, ESP, etc.)
  13. // @description Completely Free
  14. // @description:en Completely Free
  15. // @description:ar مجاني تماما
  16. // @description:zh Completamente gratis
  17. // @description:nl Volledig vrij
  18. // @description:fr Complètement libre
  19. // @description:de Völlig frei
  20. // @description:it Completamente gratuito
  21. // @description:ja 完全に無料
  22. // @description:ru Полностью бесплатно
  23. // @description:es Completamente gratis
  24. // @namespace http://tampermonkey.net/
  25. // @version 1.3
  26. // @author L-1000
  27. // @match *://krunker.io/*
  28. // @match *://browserfps.com/*
  29. // @exclude *://krunker.io/social*
  30. // @exclude *://krunker.io/editor*
  31. // @icon https://media.tenor.com/qDMan7R2yIoAAAAi/blue-emoji.gif
  32. // @run-at document-start
  33. // @require https://unpkg.com/three@0.150.0/build/three.min.js
  34. // @grant unsafeWindow
  35. // @grant GM_info
  36. // @antifeature ads
  37. // ==/UserScript==
  38.  
  39. /*
  40. .
  41. .
  42. BBBBBBBBBBBBBBBBB LLLLLLLLLLL 1111111 000000000 000000000 000000000 .
  43. B::::::::::::::::B L:::::::::L 1::::::1 00:::::::::00 00:::::::::00 00:::::::::00 .
  44. B::::::BBBBBB:::::B L:::::::::L 1:::::::1 00:::::::::::::00 00:::::::::::::00 00:::::::::::::00 .
  45. BB:::::B B:::::B LL:::::::LL 111:::::1 0:::::::000:::::::00:::::::000:::::::00:::::::000:::::::0
  46. B::::B B:::::Byyyyyyy yyyyyyy L:::::L 1::::1 0::::::0 0::::::00::::::0 0::::::00::::::0 0::::::0
  47. B::::B B:::::B y:::::y y:::::y L:::::L 1::::1 0:::::0 0:::::00:::::0 0:::::00:::::0 0:::::0
  48. B::::BBBBBB:::::B y:::::y y:::::y L:::::L 1::::1 0:::::0 0:::::00:::::0 0:::::00:::::0 0:::::0
  49. B:::::::::::::BB y:::::y y:::::y L:::::L --------------- 1::::l 0:::::0 000 0:::::00:::::0 000 0:::::00:::::0 000 0:::::0
  50. B::::BBBBBB:::::B y:::::y y:::::y L:::::L -:::::::::::::- 1::::l 0:::::0 000 0:::::00:::::0 000 0:::::00:::::0 000 0:::::0
  51. B::::B B:::::B y:::::y y:::::y L:::::L --------------- 1::::l 0:::::0 0:::::00:::::0 0:::::00:::::0 0:::::0
  52. B::::B B:::::B y:::::y:::::y L:::::L 1::::l 0:::::0 0:::::00:::::0 0:::::00:::::0 0:::::0
  53. B::::B B:::::B y:::::::::y L:::::L LLLLLL 1::::l 0::::::0 0::::::00::::::0 0::::::00::::::0 0::::::0
  54. BB:::::BBBBBB::::::B y:::::::y LL:::::::LLLLLLLLL:::::L 111::::::1110:::::::000:::::::00:::::::000:::::::00:::::::000:::::::0
  55. B:::::::::::::::::B y:::::y L::::::::::::::::::::::L 1::::::::::1 00:::::::::::::00 00:::::::::::::00 00:::::::::::::00 .
  56. B::::::::::::::::B y:::::y L::::::::::::::::::::::L 1::::::::::1 00:::::::::00 00:::::::::00 00:::::::::00 .
  57. BBBBBBBBBBBBBBBBB y:::::y LLLLLLLLLLLLLLLLLLLLLLLL 111111111111 000000000 000000000 000000000 .
  58. y:::::y .
  59. y:::::y .
  60. y:::::y .
  61. y:::::y .
  62. yyyyyyy .
  63. .
  64. .
  65.  
  66.  
  67.  
  68.  
  69.  
  70. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  71. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  72. ____ ____ _ _____ _____ ____ ____ ____ _ _____
  73. / _ \/ _ \/ \ /|/ __// __// __\ /_ \/ _ \/ \ /|/ __/
  74. | | \|| / \|| |\ ||| | _| \ | \/| / /| / \|| |\ ||| \ <-- (Danger Zone for those who are slow)
  75. | |_/|| |-||| | \||| |_//| /_ | / / /_| \_/|| | \||| /_
  76. \____/\_/ \|\_/ \|\____\\____\\_/\_\ \____/\____/\_/ \|\____\
  77. ////////////////////////////////////////////////////////////////
  78. ////////////////////////////////////////////////////////////////
  79.  
  80.  
  81. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⣤⣤⣤⣤⣶⣦⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀ .
  82. ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⡿⠛⠉⠙⠛⠛⠛⠛⠻⢿⣿⣷⣤⡀⠀⠀⠀⠀⠀ .
  83. ⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠋⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠈⢻⣿⣿⡄⠀⠀⠀⠀ .
  84. ⠀⠀⠀⠀⠀⠀⠀⣸⣿⡏⠀⠀⠀⣠⣶⣾⣿⣿⣿⠿⠿⠿⢿⣿⣿⣿⣄⠀⠀⠀ .
  85. ⠀⠀⠀⠀⠀⠀⠀⣿⣿⠁⠀⠀⢰⣿⣿⣯⠁⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣷⡄⠀ .
  86. ⠀⠀⣀⣤⣴⣶⣶⣿⡟⠀⠀⠀⢸⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⠀ .
  87. ⠀⢰⣿⡟⠋⠉⣹⣿⡇⠀⠀⠀⠘⣿⣿⣿⣿⣷⣦⣤⣤⣤⣶⣶⣶⣶⣿⣿⣿⠀ .
  88. ⠀⢸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠀ .
  89. ⠀⣸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠉⠻⠿⣿⣿⣿⣿⡿⠿⠿⠛⢻⣿⡇⠀⠀ .
  90. ⠀⣿⣿⠁⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣧⠀⠀ .
  91. ⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠀ .
  92. ⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠀ .
  93. ⠀⢿⣿⡆⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡇⠀⠀ .
  94. ⠀⠸⣿⣧⡀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠃⠀⠀ .
  95. ⠀⠀⠛⢿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⣰⣿⣿⣷⣶⣶⣶⣶⠶⠀⢠⣿⣿⠀⠀⠀ .
  96. ⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⣽⣿⡏⠁⠀⠀⢸⣿⡇⠀⠀⠀ .
  97. ⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⢹⣿⡆⠀⠀⠀⣸⣿⠇⠀⠀⠀ .
  98. ⠀⠀⠀⠀⠀⠀⠀⢿⣿⣦⣄⣀⣠⣴⣿⣿⠁⠀⠈⠻⣿⣿⣿⣿⡿⠏⠀⠀⠀⠀ .
  99. ⠀⠀⠀⠀⠀⠀⠀⠈⠛⠻⠿⠿⠿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  100.  
  101.  
  102.  
  103.  
  104.  
  105. UPDATES LOGS 1.3
  106.  
  107. Updated URL
  108.  
  109. */
  110.  
  111.  
  112.  
  113.  
  114. const latestVersion = '1.3';
  115. if (typeof GM_info !== 'undefined' && GM_info.script && GM_info.script.version !== latestVersion) {
  116. alert('⚠️ Your script is outdated!\n\nPlease update to the latest version from https://greatest.deepsurf.us/en/scripts/533315-krunker-exe-aimbot-esp-etc');
  117. }
  118.  
  119.  
  120.  
  121. const THREE = window.THREE;
  122. delete window.THREE;
  123.  
  124. const CheatSettings = {
  125. aimbotEnabled: false,
  126. aimbotOnRightMouse: false,
  127. espEnabled: false,
  128. espLines: false,
  129. wireframe: false
  130. };
  131.  
  132. const keyToSetting = {
  133. KeyV: 'aimbotEnabled',
  134. KeyB: 'aimbotOnRightMouse',
  135. KeyN: 'espEnabled',
  136. KeyM: 'espLines',
  137. KeyL: 'wireframe'
  138. };
  139.  
  140. let scene;
  141.  
  142. const x = {
  143. window: window,
  144. document: document,
  145. querySelector: document.querySelector,
  146. consoleLog: console.log,
  147. ReflectApply: Reflect.apply,
  148. ArrayPrototype: Array.prototype,
  149. ArrayPush: Array.prototype.push,
  150. ObjectPrototype: Object.prototype,
  151. clearInterval: window.clearInterval,
  152. setTimeout: window.setTimeout,
  153. reToString: RegExp.prototype.toString,
  154. indexOf: String.prototype.indexOf,
  155. requestAnimationFrame: window.requestAnimationFrame
  156. };
  157.  
  158. x.consoleLog( 'Waiting for access...' );
  159.  
  160. const proxied = function ( object ) {
  161.  
  162. try {
  163.  
  164. if ( typeof object === 'object' &&
  165. typeof object.parent === 'object' &&
  166. object.parent.type === 'Scene' &&
  167. object.parent.name === 'Main' ) {
  168.  
  169. x.consoleLog( 'Found Scene!' )
  170. scene = object.parent;
  171. x.ArrayPrototype.push = x.ArrayPush;
  172.  
  173. }
  174.  
  175. } catch ( error ) {}
  176.  
  177. return x.ArrayPush.apply( this, arguments );
  178.  
  179. }
  180.  
  181. const gui = createGUI();
  182.  
  183. const tempVector = new THREE.Vector3();
  184.  
  185. const tempObject = new THREE.Object3D();
  186. tempObject.rotation.order = 'YXZ';
  187.  
  188. const geometry = new THREE.EdgesGeometry( new THREE.BoxGeometry( 5, 15, 5 ).translate( 0, 7.5, 0 ) );
  189.  
  190. const material = new THREE.RawShaderMaterial( {
  191. vertexShader: `
  192.  
  193. attribute vec3 position;
  194.  
  195. uniform mat4 projectionMatrix;
  196. uniform mat4 modelViewMatrix;
  197.  
  198. void main() {
  199.  
  200. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  201. gl_Position.z = 1.0;
  202.  
  203. }
  204.  
  205. `,
  206. fragmentShader: `
  207.  
  208. void main() {
  209.  
  210. gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
  211.  
  212. }
  213.  
  214. `
  215. } );
  216.  
  217. const line = new THREE.LineSegments( new THREE.BufferGeometry(), material );
  218.  
  219. line.frustumCulled = false;
  220.  
  221. const linePositions = new THREE.BufferAttribute( new Float32Array( 100 * 2 * 3 ), 3 );
  222. line.geometry.setAttribute( 'position', linePositions );
  223.  
  224. let injectTimer = null;
  225.  
  226. function animate() {
  227.  
  228. x.requestAnimationFrame.call( x.window, animate );
  229.  
  230. if ( ! scene && ! injectTimer ) {
  231.  
  232. const el = x.querySelector.call( x.document, '#loadingBg' );
  233.  
  234. if ( el && el.style.display === 'none' ) {
  235.  
  236. x.consoleLog( 'Inject timer started!' );
  237.  
  238. injectTimer = x.setTimeout.call( x.window, () => {
  239.  
  240. x.consoleLog( 'Injected!' );
  241. x.ArrayPrototype.push = proxied;
  242.  
  243. }, 2e3 );
  244.  
  245. }
  246.  
  247. }
  248.  
  249.  
  250. const players = [];
  251.  
  252. let myPlayer;
  253.  
  254. if (!scene) return;
  255.  
  256. for ( let i = 0; i < scene.children.length; i ++ ) {
  257.  
  258. const child = scene.children[ i ];
  259.  
  260. if ( child.type === 'Object3D' ) {
  261.  
  262. try {
  263.  
  264. if ( child.children[ 0 ].children[ 0 ].type === 'PerspectiveCamera' ) {
  265.  
  266. myPlayer = child;
  267.  
  268. } else {
  269.  
  270. players.push( child );
  271.  
  272. }
  273.  
  274. } catch ( err ) {}
  275.  
  276. } else if ( child.material ) {
  277.  
  278. child.material.wireframe = CheatSettings.wireframe;
  279.  
  280. }
  281.  
  282. }
  283.  
  284. if ( ! myPlayer ) {
  285.  
  286. x.consoleLog( 'Player not found, finding new scene.' );
  287. x.ArrayPrototype.push = proxied;
  288. return;
  289.  
  290. }
  291.  
  292. let counter = 0;
  293.  
  294. let targetPlayer;
  295. let minDistance = Infinity;
  296.  
  297. tempObject.matrix.copy( myPlayer.matrix ).invert();
  298.  
  299. for ( let i = 0; i < players.length; i ++ ) {
  300.  
  301. const player = players[ i ];
  302.  
  303. if ( ! player.box ) {
  304.  
  305. const box = new THREE.LineSegments( geometry, material );
  306. box.frustumCulled = false;
  307.  
  308. player.add( box );
  309.  
  310. player.box = box;
  311.  
  312. }
  313.  
  314. if ( player.position.x === myPlayer.position.x && player.position.z === myPlayer.position.z ) {
  315.  
  316. player.box.visible = false;
  317.  
  318. if ( line.parent !== player ) {
  319.  
  320. player.add( line );
  321.  
  322. }
  323.  
  324. continue;
  325.  
  326. }
  327.  
  328. linePositions.setXYZ( counter ++, 0, 10, - 5 );
  329.  
  330. tempVector.copy( player.position );
  331. tempVector.y += 9;
  332. tempVector.applyMatrix4( tempObject.matrix );
  333.  
  334. linePositions.setXYZ(
  335. counter ++,
  336. tempVector.x,
  337. tempVector.y,
  338. tempVector.z
  339. );
  340.  
  341. player.visible = CheatSettings.espEnabled || player.visible;
  342. player.box.visible = CheatSettings.espEnabled;
  343.  
  344. const distance = player.position.distanceTo( myPlayer.position );
  345.  
  346. if ( distance < minDistance ) {
  347.  
  348. targetPlayer = player;
  349. minDistance = distance;
  350.  
  351. }
  352.  
  353. }
  354.  
  355. linePositions.needsUpdate = true;
  356. line.geometry.setDrawRange( 0, counter );
  357.  
  358. line.visible = CheatSettings.espLines;
  359.  
  360. if ( CheatSettings.aimbotEnabled === false || ( CheatSettings.aimbotOnRightMouse && ! rightMouseDown ) || targetPlayer === undefined ) {
  361.  
  362. return;
  363.  
  364.  
  365. }
  366.  
  367. tempVector.setScalar( 0 );
  368.  
  369. if (targetPlayer?.children?.[0]?.children?.[0]) {
  370. targetPlayer.children[0].children[0].localToWorld(tempVector);
  371. } else {
  372. return;
  373. }
  374.  
  375.  
  376. if (!myPlayer || !myPlayer.position) return;
  377. tempObject.position.copy(myPlayer.position);
  378.  
  379. tempObject.lookAt( tempVector );
  380.  
  381. if (myPlayer.children?.[0]?.rotation) {
  382. myPlayer.children[0].rotation.x = -tempObject.rotation.x;
  383. myPlayer.rotation.y = tempObject.rotation.y + Math.PI;
  384. }
  385.  
  386. }
  387.  
  388. /*
  389. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⠤⠀⠒⠀⠈⠉⠉⢉⠉⡙⠛⠒⠒⠦⢄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  390. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠖⠋⢁⣠⠤⠀⠀⠀⠂⠁⡈⢀⠐⠠⠐⢈⠐⡀⠂⠄⡉⠑⠶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  391. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠔⠉⠀⢀⡤⠚⠉⠀⠀⠀⠀⠁⠀⠂⠀⠄⠂⢁⠈⠄⠂⠄⡁⠂⠄⡁⠆⡠⢙⠳⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  392. ⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠀⠀⠀⠰⠃⠀⠀⠀⠀⢲⠀⠀⠀⠂⠀⢁⠠⠈⢀⠂⠌⠐⠠⢀⠁⡂⠐⡄⠱⢌⠲⣡⢛⡶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  393. ⠀⠀⠀⠀⠀⠀⠀⡴⢫⠇⠀⠀⠀⠀⠀⠀⠀⢀⣠⡇⠀⠃⣄⠀⠀⠈⠀⡀⠐⠠⠀⠌⠠⢁⠂⡐⠠⠁⠄⡃⢎⡱⣌⠳⡼⣹⢷⡀⠀⠀⠀⠀⠀⠀⠀⠀
  394. ⠀⠀⠀⠀⠀⢠⠎⡰⠃⠀⠀⠀⠀⣀⣠⣴⣾⡿⠟⠁⠀⠀⠻⣿⣷⣶⣥⣤⣐⣤⣁⣂⣡⣀⡂⠄⠡⢈⠐⢌⠂⡵⢌⡳⣍⡳⣏⢿⣆⠀⠀⠀⠀⠀⠀⠀
  395. ⠀⠀⠀⠀⡰⢃⡜⠁⠠⠒⠚⠛⠛⠉⠉⠁⠀⠀⢰⠖⠀⠀⠀⠀⠈⠉⠉⠉⠉⢉⠉⡉⠁⠄⡈⠄⡁⠂⠌⣀⠳⡄⢇⡳⡜⡵⣫⠾⡽⣷⡀⠀⠀⠀⠀⠀
  396. ⠀⠀⠀⣰⠇⢸⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡞⠀⠀⠀⠀⠀⢀⠀⠄⠂⠐⠈⠠⠁⠂⠄⠡⢀⠁⠂⠄⡉⠄⢳⡈⢧⢳⡱⢏⡶⣳⢻⣧⠀⠀⠀⠀⠀
  397. ⠀⠀⢠⠇⢀⠇⡀⠀⠀⠀⠀⠀⣀⣤⣴⣶⣿⣿⡇⠀⠀⠀⠀⠀⢺⡟⠛⡛⠛⠛⠟⠻⠿⣷⣶⣦⣬⣁⣂⠘⣌⠶⣍⡒⢧⣙⢮⢳⣭⣛⢾⣧⠀⠀⠀⠀
  398. ⠀⠀⡎⠀⢸⠀⢃⣀⣤⠴⠚⠉⣉⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠐⢀⣇⠀⣷⠀⠀⠀⣦⣼⣿⣿⣿⣿⠙⢿⣻⣼⣽⣽⢈⠷⣘⢎⡗⣲⡹⢮⡽⡆⠀⠀⠀
  399. ⠀⢸⠁⢀⠘⣴⣿⠉⣛⣀⣀⣀⣹⣿⣿⣿⣹⣿⠀⠀⢀⠀⠁⡀⠂⣿⡀⠘⢆⣀⣀⣈⣻⣿⣿⣿⣃⠀⠠⠈⣹⣿⣿⠌⣎⠵⣪⠼⣡⢛⠦⡝⣿⡀⠀⠀
  400. ⠀⡏⠀⠄⡀⠋⠉⠉⠁⠀⠀⠀⠀⠀⠀⠈⠛⠛⠀⠀⡀⠀⠂⠀⠴⠿⠉⠍⠩⠉⠍⡉⢉⠉⡉⢉⠉⡉⢉⠛⠛⠻⢿⡜⢤⠛⣔⢫⠖⡭⢚⡱⣽⡇⠀⠀
  401. ⠀⡇⡈⠄⠐⠈⡀⠂⠐⠀⠂⠐⠀⠂⠈⠀⠄⠀⡐⠀⡀⠂⢁⠈⠠⠀⠌⠠⢁⠈⠄⡀⢂⠐⡀⢂⠐⡀⠂⠌⠌⡅⢊⠝⡢⠝⣬⠓⢮⡑⢣⠕⡮⡇⠀⠀
  402. ⢀⡇⠐⡈⠠⢁⠠⢈⠀⠡⠈⡀⠌⠀⡁⠐⡀⠁⡀⠐⢀⠐⡀⠌⢀⠡⠈⡐⠠⢈⠐⡀⢂⠐⡈⠄⡉⠄⠡⡈⠰⢈⢆⢩⠒⡍⠶⡙⢦⠙⡢⠝⣜⣷⠀⠀
  403. ⢰⡇⠡⢀⠡⢀⠂⠄⡈⠐⠠⠀⠄⡁⢀⠂⠄⠂⠠⣁⠂⠠⢀⠂⠄⠂⡁⠐⡀⢂⠐⡀⢂⠐⡀⢂⠐⡈⠡⢀⠣⠌⡌⢢⠝⣌⠳⣉⠦⣙⠰⣩⢲⡇⠀⠀
  404. ⠀⣇⠂⠄⠂⠄⡈⠐⠠⢁⠂⢁⣂⣤⣤⣤⣀⡤⠦⢤⣝⢣⡀⠂⠌⡐⠠⢁⠐⡀⢂⠐⡀⢂⠐⠠⠂⡄⢃⠂⣅⡚⣌⢣⠞⣔⣋⠖⡑⢆⡃⢆⣳⡇⠀⠀
  405. ⠀⢸⡎⠠⡁⠂⠄⡁⠂⠄⣼⣋⣤⡀⡀⠀⣀⣀⣠⣀⠈⠳⣷⡈⠐⠠⢁⠂⡐⢀⠂⡐⢀⠂⣌⡰⣡⠜⣌⠳⣄⠳⣌⠖⣍⢲⡘⢬⡑⢢⠘⡬⣾⠁⠀⠀
  406. ⠀⠈⣷⡐⠤⡉⢂⠤⢁⠌⢿⡘⠛⠛⠛⢉⠛⠹⠛⠋⠷⢦⠹⢷⠈⡐⢀⠂⡐⢀⢂⡴⣊⠞⡴⣓⠴⣩⠒⡵⣈⠗⡬⡚⣌⠲⣉⢆⡘⠄⣃⢶⠇⠀⠀⠀
  407. ⠀⠀⠘⣗⡢⠍⡜⠤⣉⠦⡜⢿⣶⣶⣶⣦⣶⣶⣾⡴⢢⠍⣧⠀⠡⠐⡀⢂⡴⣋⠾⣔⡫⣝⠲⣍⢞⡡⢫⠴⣉⠞⡰⢩⠆⡓⢄⠢⠐⠌⠤⡟⠀⠀⡄⢀
  408. ⠀⠀⠀⠹⣧⡙⣌⠳⡌⢎⡙⠦⣉⠏⠻⡙⢏⠛⠥⢋⠇⠚⡘⠠⢁⠂⡐⣧⠞⣭⡓⢮⡱⢎⠳⡜⡌⢖⡱⢊⣴⠛⢻⡇⠘⡐⢀⠂⠡⢈⡾⠀⠀⢠⠃⢸
  409. ⠀⠀⠀⠀⠘⣷⡌⢳⡸⣌⢱⢣⡐⢌⠱⠈⡄⠨⠐⠠⠈⠥⢀⢁⠢⢐⡹⣜⡻⢦⡙⢧⠱⡍⢣⠱⢜⠢⡱⢹⣿⠀⢠⣇⠡⠐⠠⠈⢄⡟⠁⠀⢀⠎⢠⠇
  410. ⠀⠀⠀⠀⠀⠈⢻⣥⠲⡜⣊⢦⠱⡈⢆⡱⢀⢃⠩⡐⢡⠂⡅⢂⠆⡡⣟⡼⣓⢧⡹⣌⡓⣌⢣⡙⠢⢃⠔⡩⣿⠀⠀⢿⠀⡁⢂⣡⠋⠀⢀⡴⠃⣠⠏⠀
  411. ⠀⠀⠀⠀⠀⠀⠀⠙⢷⡘⢤⠋⢖⠡⢂⠔⣈⢂⠑⡈⢆⠒⡘⡄⢚⠰⣹⡚⡵⣊⡕⢢⡑⢂⠆⡌⠡⢂⠐⠠⢹⠀⠀⠘⣆⣰⠞⠁⠠⠔⠉⣠⠖⠁⠀⠀
  412. ⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣌⠒⠌⠂⠌⠠⠉⠌⡐⠡⠌⡰⠡⠑⡌⠢⢍⡳⢥⢋⠕⡊⠱⠈⠄⡁⠂⠌⡐⠠⠘⡆⠀⠀⣿⠋⠀⠀⢀⡠⠔⠋⠀⠀⠀⠀
  413. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠑⢮⣄⠡⠁⠌⡐⠠⢁⠂⠄⠡⢁⠰⢁⠊⠌⡑⠊⢄⠁⡂⢱⡏⠙⢳⣤⠴⠒⠋⠉⠉⠑⠚⠦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  414. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠑⠣⢆⡄⡁⠂⠌⠠⢁⠂⡐⠠⢈⠐⠠⢁⠂⡐⠠⠉⠳⣄⣺⡀⠀⢀⣀⡤⠤⠤⣀⣀⠈⢣⡀⠀⠀⠀⠀⠀⠀⠀
  415. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⣶⣬⣐⣀⠂⠀⠁⠂⠈⠀⠀⣀⣀⣀⣤⣴⣿⣿⣿⣿⠟⡇⠀⠀⠀⠀⠀⠀⠀⣳⡀⠀⠀⠀⠀⠀⠀
  416. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠛⠛⠛⠛⠛⠛⠉⠋⠉⠁⠀⠀⠙⢻⡏⢈⢙⡶⠖⠒⠋⠉⠉⠉⠹⣷⠀⠀⠀⠀⠀⠀
  417. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣇⣼⡞⠠⣀⡀⠀⠀⠀⠀⣰⣿⠀⠀⠀⠀⠀⠀
  418. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣇⠦⣠⣿⣶⢦⠤⢀⣿⠏⠀⠀⠀⠀⠀⠀
  419. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⣿⣿⣇⣤⡶⠟⠉⠀⠀⠀⠀⠀⠀⠀
  420. */
  421.  
  422. // |
  423. // Most of the HTML |
  424. // \ /
  425.  
  426. const el = document.createElement( 'div' );
  427.  
  428. el.innerHTML = `<style>
  429.  
  430. @keyframes krkUIGlow {
  431. 0%, 100% {
  432. box-shadow: 0 0 10px #8f00ff, 0 0 20px #4b0082, 0 0 30px #8f00ff;
  433. }
  434. 50% {
  435. box-shadow: 0 0 20px #8f00ff, 0 0 30px #4b0082, 0 0 40px #8f00ff;
  436. }
  437. }
  438.  
  439. .dialog {
  440. position: absolute;
  441. left: 50%;
  442. top: 50%;
  443. padding: 20px;
  444. background: rgba(0, 0, 0, 0.8);
  445. border: 6px solid rgba(0, 0, 0, 0.2);
  446. color: #fff;
  447. transform: translate(-50%, -50%);
  448. text-align: center;
  449. z-index: 999999;
  450. }
  451.  
  452. .dialog * {
  453. color: #fff;
  454. }
  455.  
  456. .close {
  457. position: absolute;
  458. right: 5px;
  459. top: 5px;
  460. width: 20px;
  461. height: 20px;
  462. opacity: 0.5;
  463. cursor: pointer;
  464. }
  465.  
  466. .close:before, .close:after {
  467. content: ' ';
  468. position: absolute;
  469. left: 50%;
  470. top: 50%;
  471. width: 100%;
  472. height: 20%;
  473. transform: translate(-50%, -50%) rotate(-45deg);
  474. background: #fff;
  475. }
  476.  
  477. .close:after {
  478. transform: translate(-50%, -50%) rotate(45deg);
  479. }
  480.  
  481. .close:hover {
  482. opacity: 1;
  483. }
  484.  
  485. .button {
  486. cursor: pointer;
  487. padding: 0.5em;
  488. background: red;
  489. border: 3px solid rgba(0, 0, 0, 0.2);
  490. }
  491.  
  492. .button:active {
  493. transform: scale(0.8);
  494. }
  495.  
  496. .msg {
  497. position: absolute;
  498. left: 10px;
  499. bottom: 10px;
  500. color: #fff;
  501. background: rgba(0, 0, 0, 0.6);
  502. font-weight: bolder;
  503. padding: 15px;
  504. animation: msg 0.5s forwards, msg 0.5s reverse forwards 3s;
  505. z-index: 999999;
  506. pointer-events: none;
  507. }
  508.  
  509. @keyframes msg {
  510. from {
  511. transform: translate(-120%, 0);
  512. }
  513. to {
  514. transform: none;
  515. }
  516. }
  517.  
  518. .krkUI {
  519. position: fixed;
  520. right: 10px;
  521. top: 0;
  522. z-index: 999;
  523. display: flex;
  524. flex-direction: column;
  525. font-family: monospace;
  526. font-size: 12px;
  527. color: #fff;
  528. width: 250px;
  529. user-select: none;
  530. border: 2px solid #000;
  531. background: radial-gradient(circle at top left, #1a0033, #000000);
  532. animation: krkUIGlow 2s infinite ease-in-out;
  533. border-radius: 8px;
  534. overflow: hidden;
  535. }
  536.  
  537. .krkUI-item {
  538. padding: 4px 8px;
  539. display: flex;
  540. justify-content: space-between;
  541. align-items: center;
  542. background: rgba(0, 0, 0, 0.4);
  543. cursor: pointer;
  544. border-bottom: 1px solid rgba(255, 255, 255, 0.05);
  545. }
  546.  
  547. .krkUI-item.text {
  548. justify-content: center;
  549. cursor: unset;
  550. text-align: center;
  551. background: #333;
  552. }
  553.  
  554. .krkUI-item:hover {
  555. background: rgba(255, 255, 255, 0.05);
  556. }
  557.  
  558. .krkUI-item span {
  559. color: #fff;
  560. font-family: monospace;
  561. font-size: 12px;
  562. }
  563.  
  564. .krkUI-header {
  565. background: linear-gradient(to right, #8f00ff, #4b0082);
  566. }
  567.  
  568. .krkUI-header span {
  569. font-size: 14px;
  570. }
  571.  
  572. .krkUI-header:hover {
  573. background: linear-gradient(to right, #8f00ff, #4b0082);
  574. }
  575.  
  576. .krkUI-on {
  577. color: #0f0;
  578. }
  579.  
  580. .krkUI-item-value {
  581. font-size: 0.8em;
  582. font-weight: bold;
  583. }
  584.  
  585. </style>
  586. `
  587.  
  588.  
  589. /*
  590. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  591. ░░░░░░░░░░░░░▄▄▄▄▄▄▄░░░░░░░░░
  592. ░░░░░░░░░▄▀▀▀░░░░░░░▀▄░░░░░░░
  593. ░░░░░░░▄▀░░░░░░░░░░░░▀▄░░░░░░
  594. ░░░░░░▄▀░░░░░░░░░░▄▀▀▄▀▄░░░░░
  595. ░░░░▄▀░░░░░░░░░░▄▀░░██▄▀▄░░░░
  596. ░░░▄▀░░▄▀▀▀▄░░░░█░░░▀▀░█▀▄░░░
  597. ░░░█░░█▄▄░░░█░░░▀▄░░░░░▐░█░░░
  598. ░░▐▌░░█▀▀░░▄▀░░░░░▀▄▄▄▄▀░░█░░
  599. ░░▐▌░░█░░░▄▀░░░░░░░░░░░░░░█░░
  600. ░░▐▌░░░▀▀▀░░░░░░░░░░░░░░░░▐▌░
  601. ░░▐▌░░░░░░░░░░░░░░░▄░░░░░░▐▌░
  602. ░░▐▌░░░░░░░░░▄░░░░░█░░░░░░▐▌░
  603. ░░░█░░░░░░░░░▀█▄░░▄█░░░░░░▐▌░
  604. ░░░▐▌░░░░░░░░░░▀▀▀▀░░░░░░░▐▌░
  605. ░░░░█░░░░░░░░░░░░░░░░░░░░░█░░
  606. ░░░░▐▌▀▄░░░░░░░░░░░░░░░░░▐▌░░
  607. ░░░░░█░░▀░░░░░░░░░░░░░░░░▀░░░
  608. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  609. */
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617. const msgEl = el.querySelector( '.msg' );
  618. const dialogEl = el.querySelector( '.dialog' );
  619.  
  620. window.addEventListener( 'DOMContentLoaded', function () {
  621.  
  622. while ( el.children.length > 0 ) {
  623.  
  624. document.body.appendChild( el.children[ 0 ] );
  625.  
  626. }
  627.  
  628. document.body.appendChild( gui );
  629.  
  630. } );
  631.  
  632.  
  633. let rightMouseDown = false;
  634.  
  635. function handleMouse( event ) {
  636.  
  637. if ( event.button === 2 ) {
  638.  
  639. rightMouseDown = event.type === 'pointerdown' ? true : false;
  640.  
  641. }
  642.  
  643. }
  644.  
  645. window.addEventListener( 'pointerdown', handleMouse );
  646. window.addEventListener( 'pointerup', handleMouse );
  647.  
  648. window.addEventListener( 'keyup', function ( event ) {
  649.  
  650. if ( x.document.activeElement && x.document.activeElement.value !== undefined ) return;
  651.  
  652. if ( keyToSetting[ event.code ] ) {
  653.  
  654. toggleSetting( keyToSetting[ event.code ] );
  655.  
  656. }
  657.  
  658. switch ( event.code ) {
  659.  
  660. case 'Slash' :
  661. toggleElementVisibility( gui );
  662. break;
  663.  
  664. case 'KeyH' :
  665. toggleElementVisibility( dialogEl );
  666. break;
  667.  
  668. }
  669.  
  670. } );
  671.  
  672. function toggleElementVisibility( el ) {
  673.  
  674. el.style.display = el.style.display === '' ? 'none' : '';
  675.  
  676. }
  677.  
  678. function showMsg( name, bool ) {
  679.  
  680. msgEl.innerText = name + ': ' + ( bool ? 'ON' : 'OFF' );
  681.  
  682. msgEl.style.display = 'none';
  683. void msgEl.offsetWidth;
  684. msgEl.style.display = '';
  685.  
  686. }
  687.  
  688. animate();
  689.  
  690. function createGUI() {
  691.  
  692. const guiEl = fromHtml( `<div class="krkUI">
  693. <div class="krkUI-item krkUI-header">
  694. <span>[/] Menu</span>
  695. <span class="krkUI-item-value">[close]</span>
  696. </div>
  697. <div class="krkUI-content"></div>
  698. </div>` );
  699.  
  700. const headerEl = guiEl.querySelector( '.krkUI-header' );
  701. const contentEl = guiEl.querySelector( '.krkUI-content' );
  702. const headerStatusEl = guiEl.querySelector( '.krkUI-item-value' );
  703.  
  704. headerEl.onclick = function () {
  705.  
  706. const isHidden = contentEl.style.display === 'none';
  707.  
  708. contentEl.style.display = isHidden ? '' : 'none';
  709. headerStatusEl.innerText = isHidden ? '[close]' : '[open]';
  710.  
  711. }
  712.  
  713. const settingToKey = {};
  714. for ( const key in keyToSetting ) {
  715.  
  716. settingToKey[ keyToSetting[ key ] ] = key;
  717.  
  718. }
  719.  
  720. for ( const prop in CheatSettings ) {
  721.  
  722. let name = fromCamel( prop );
  723. let shortKey = settingToKey[ prop ];
  724.  
  725. if ( shortKey ) {
  726.  
  727. if ( shortKey.startsWith( 'Key' ) ) shortKey = shortKey.slice( 3 );
  728. name = `[${shortKey}] ${name}`;
  729.  
  730. }
  731.  
  732. const itemEl = fromHtml( `<div class="krkUI-item">
  733. <span>${name}</span>
  734. <span class="krkUI-item-value"></span>
  735. </div>` );
  736. const valueEl = itemEl.querySelector( '.krkUI-item-value' );
  737.  
  738. function updateValueEl() {
  739.  
  740. const value = CheatSettings[ prop ];
  741. valueEl.innerText = value ? 'ON' : 'OFF';
  742. valueEl.style.color = value ? 'green' : 'red';
  743.  
  744. }
  745. itemEl.onclick = function() {
  746.  
  747. CheatSettings[ prop ] = ! CheatSettings[ prop ];
  748.  
  749. }
  750. updateValueEl();
  751.  
  752. contentEl.appendChild( itemEl );
  753.  
  754. const p = `__${prop}`;
  755. CheatSettings[ p ] = CheatSettings[ prop ];
  756. Object.defineProperty( CheatSettings, prop, {
  757. get() {
  758.  
  759. return this[ p ];
  760.  
  761. },
  762. set( value ) {
  763.  
  764. this[ p ] = value;
  765. updateValueEl();
  766.  
  767. }
  768. } );
  769.  
  770. }
  771.  
  772. contentEl.appendChild( fromHtml( `<div class="krkUI-item text">
  773. <span>Created by L-1000</span>
  774. </div>` ) );
  775.  
  776. return guiEl;
  777.  
  778. }
  779.  
  780. function fromCamel( text ) {
  781.  
  782. const result = text.replace( /([A-Z])/g, ' $1' );
  783. return result.charAt( 0 ).toUpperCase() + result.slice( 1 );
  784.  
  785. }
  786.  
  787. function fromHtml( html ) {
  788.  
  789. const div = document.createElement( 'div' );
  790. div.innerHTML = html;
  791. return div.children[ 0 ];
  792.  
  793. }
  794.  
  795. function toggleSetting( key ) {
  796.  
  797. CheatSettings[ key ] = ! CheatSettings[ key ];
  798. showMsg( fromCamel( key ), CheatSettings[ key ] );
  799.  
  800. }
  801.  
  802.  
  803. /*
  804. ⠀⠀⠀⠠⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⠤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  805. ⠀⠀⠀⠀⢈⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  806. ⠀⠀⢠⣴⣿⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  807. ⢀⣴⣿⡷⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  808. ⣾⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  809. ⣿⣿⣿⣧⠀⠀⠀⠘⣦⡀⠀⠀⠀⠀⠀⠀⠀⢀⣴⡇⠀⠀⠀⢀⣼⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  810. ⠹⣿⣿⣿⣷⣦⣄⡀⣿⣱⡀⠀⠀⠀⠀⠀⠀⢸⢿⣧⣠⣴⣾⣿⣿⣿⣿⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  811. ⠀⠈⠛⢷⣿⣟⡿⠿⠿⡟⣓⣒⣛⡛⡛⢟⣛⡛⠟⠿⣻⢿⣿⣻⡿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  812. ⠀⠀⢠⣴⢻⡭⠖⡉⠥⣈⠀⣐⠂⡄⠔⢂⢦⡹⢬⡕⠊⠳⠈⢿⣳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  813. ⠀⢀⣼⣷⣋⠲⢮⣁⠀⣐⠆⡤⢊⣜⡀⡾⣀⠀⢠⢻⣌⣤⣥⣓⣌⢻⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  814. ⢰⣟⣽⢳⣯⣝⣦⡀⠓⡤⢆⠇⠂⠄⠤⡝⣂⠋⠖⢋⠀⣡⣶⣾⡿⡷⣽⡿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  815. ⢸⣿⡜⢯⣿⣿⣿⣷⣿⣤⣧⣶⣬⣝⣃⣓⣈⣥⣶⣿⣾⣿⣿⢣⠇⢻⡞⣯⣹⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  816. ⠀⢻⣼⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⡔⡯⢧⢟⣟⣱⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  817. ⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⡼⡼⢁⡌⢼⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  818. ⠀⠀⣿⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⢇⡼⢃⡿⣼⣛⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  819. ⠀⠀⣧⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⠟⣡⣫⣢⢏⣼⡵⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  820. ⠀⢸⣿⣏⢿⣿⣿⣿⣿⣿⣿⣿⡿⢿⣿⡾⢕⣻⣽⣵⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  821. ⠀⠘⢷⣮⣿⡼⢭⡟⠳⠞⡖⢛⣶⣷⣯⡶⠟⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  822. ⠀⠀⠀⠉⠛⠛⠛⠿⠟⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  823. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  824. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀
  825. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  826. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  827. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀
  828. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  829. ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
  830. */
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883. const adKey = 'krunkerAdActive';
  884.  
  885. if (!sessionStorage.getItem(adKey)) {
  886. sessionStorage.setItem(adKey, 'true');
  887.  
  888. const returnUrl = encodeURIComponent(window.location.href);
  889. window.location.href = `https://l1000-dev.github.io/Krunker.EXE/?return=${returnUrl}`;
  890. }
  891.  
  892. function removeQueries() {
  893. const url = new URL(window.location.href);
  894. url.searchParams.delete('showAd');
  895. url.searchParams.delete('scriptVersion');
  896. window.history.replaceState(null, '', url.href);
  897. }
  898.  
  899. removeQueries();