fsploit debug - deeeep.io

best deeeep.io cheat ever

目前为 2025-03-23 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name fsploit debug - deeeep.io
  3. // @namespace http://tampermonkey.net/
  4. // @version 5.1.0-debug
  5. // @description best deeeep.io cheat ever
  6. // @run-at document-start
  7. // @author mahdi1337, noam01, .pi3141
  8. // @match https://*.deeeep.io/*
  9. // @icon https://beta.deeeep.io/favicon-32x32.png
  10. // @grant GM_setValue
  11. // @grant GM_getValue
  12. // ==/UserScript==
  13.  
  14. // Search for "TODO:" to see what needs to be done
  15. // Check those first in the case that the script breaks
  16.  
  17. "use strict";
  18.  
  19. const fsploitVersion = "5.1.3";
  20. const knownClientVersion = "9fcb82c9,e40a671d";
  21.  
  22. const currentScript = GM_getValue("mainModule");
  23.  
  24. if (!GM_getValue("logo")) {
  25. fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/logo-base64")
  26. .then((response) => response.text())
  27. .then((data) => {
  28. const loadingCover = document.createElement("div");
  29. loadingCover.id = "loadingCover";
  30. loadingCover.style.cssText =
  31. "position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgb(30, 30, 30); z-index: 9999; opacity: 1; transition: opacity 0.5s ease-out; display: flex; justify-content: center; align-items: center;";
  32. const logoImage = document.createElement("img");
  33. logoImage.style.cssText = "max-width: 80%; max-height: 80%;";
  34. logoImage.src = `data:image/png;base64,${data}`;
  35. loadingCover.appendChild(logoImage);
  36. document.documentElement.appendChild(loadingCover);
  37. setTimeout(() => {
  38. loadingCover.style.opacity = "0";
  39. }, 1000);
  40. setTimeout(() => {
  41. loadingCover.remove();
  42. }, 1550);
  43. GM_setValue("logo", data.trim());
  44. });
  45. } else {
  46. const logoData = GM_getValue("logo");
  47. const loadingCover = document.createElement("div");
  48. loadingCover.id = "loadingCover";
  49. loadingCover.style.cssText =
  50. "position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgb(30, 30, 30); z-index: 9999; opacity: 1; transition: opacity 0.5s ease-out; display: flex; justify-content: center; align-items: center;";
  51. const logoImage = document.createElement("img");
  52. logoImage.style.cssText = "max-width: 80%; max-height: 80%;";
  53. logoImage.src = `data:image/png;base64,${logoData}`;
  54. loadingCover.appendChild(logoImage);
  55. document.documentElement.appendChild(loadingCover);
  56. setTimeout(() => {
  57. loadingCover.style.opacity = "0";
  58. }, 1000);
  59. setTimeout(() => {
  60. loadingCover.remove();
  61. }, 1550);
  62. }
  63.  
  64. // FSPLOIT
  65.  
  66. let game;
  67. let gameState;
  68. let currentScene;
  69.  
  70. let betterVisionx = false;
  71. let quickDisconnectx = false;
  72. let aimLinex = false;
  73. let clearChatx = false;
  74. let boostHacksx = false;
  75. let humpbackAutosongsx = false;
  76.  
  77. // GAME UTILS
  78. const encodeBytePacket = (t, e, n = "") => {
  79. const silly = ["ode", "eat", "fr", "bite", "eng", "enc", "the", "code", "rep", "L", "en", "setter"];if (!t) return null;const a = ((A, B) => {const enc = new TextEncoder();const a = enc[silly[5] + silly[0]](A);const i = enc[silly[10] + silly[7]](B);const r = new Uint8Array(a[`l${silly[4]}${silly[6].slice(0, 2)}`]);for (let o = 0; o < a.length; o++) r[o] = a[o] ^ i[o % i[`${silly[9].toLowerCase()}${silly[10]}g${silly[6].slice(0, 2)}`]];return btoa(String.fromCharCode(...r));})(String.fromCharCode(e)[silly[8] + silly[1]](3) + n, t);const i = new TextEncoder()[silly[5] + silly[0]](a);const r = 1 + i.byteLength + 1;const o = new ArrayBuffer(r);const l = new DataView(o);l.setUint8(0, 25);new Uint8Array(o)[silly[11].slice(0, (0o11 / 0x1b) * 0b1001)](i, 1);l.setUint8(r - 1, e);return o;};
  80.  
  81. const boostData = {
  82. 10: {
  83. hasSec: true,
  84. },
  85. 11: {
  86. hasSec: true,
  87. secLoadTime: 350,
  88. },
  89. 21: {
  90. hasSec: true,
  91. secLoadTime: 1000,
  92. },
  93. 22: {
  94. hasSec: true,
  95. secLoadTime: 600,
  96. },
  97. 25: {
  98. hasSec: true,
  99. secLoadTime: 350,
  100. },
  101. 27: {
  102. hasSec: true,
  103. secLoadTime: 350,
  104. },
  105. 34: {
  106. hasSec: true,
  107. secLoadTime: 350,
  108. },
  109. 38: {
  110. hasSec: true,
  111. secLoadTime: 750,
  112. },
  113. 40: {
  114. hasSec: true,
  115. secLoadTime: 1000,
  116. },
  117. 41: {
  118. hasSec: true,
  119. },
  120. 42: {
  121. hasSec: true,
  122. secLoadTime: 300,
  123. },
  124. 43: {
  125. hasSec: true,
  126. secLoadTime: 350,
  127. },
  128. 49: {
  129. hasSec: true,
  130. secLoadTime: 350,
  131. },
  132. 56: {
  133. hasSec: true,
  134. },
  135. 61: {
  136. hasSec: true,
  137. secLoadTime: 400,
  138. },
  139. 62: {
  140. hasSec: true,
  141. secLoadTime: 2000,
  142. },
  143. 68: {
  144. hasSec: true,
  145. },
  146. 70: {
  147. hasSec: true,
  148. secLoadTime: 250,
  149. },
  150. 71: {
  151. hasSec: true,
  152. secLoadTime: 350,
  153. },
  154. 73: {
  155. hasSec: true,
  156. secLoadTime: 1000,
  157. },
  158. 74: {
  159. hasSec: true,
  160. },
  161. 76: {
  162. hasSec: true,
  163. secLoadTime: 200,
  164. },
  165. 80: {
  166. hasSec: true,
  167. secLoadTime: 350,
  168. },
  169. 82: {
  170. hasSec: true,
  171. secLoadTime: 1500,
  172. hasScaling: true,
  173. },
  174. 83: {
  175. hasSec: true,
  176. },
  177. 86: {
  178. hasSec: true,
  179. secLoadTime: 1000,
  180. },
  181. 87: {
  182. hasSec: true,
  183. secLoadTime: 150,
  184. },
  185. 90: {
  186. hasSec: true,
  187. },
  188. 91: {
  189. hasSec: true,
  190. secLoadTime: 800,
  191. },
  192. 92: {
  193. hasSec: true,
  194. secLoadTime: 300,
  195. },
  196. 93: {
  197. hasSec: true,
  198. secLoadTime: 750,
  199. },
  200. 94: {
  201. hasSec: true,
  202. },
  203. 95: {
  204. hasSec: true,
  205. },
  206. 96: {
  207. hasSec: true,
  208. secLoadTime: 750,
  209. },
  210. 97: {
  211. hasSec: true,
  212. hasWalking: true,
  213. },
  214. 98: {
  215. hasSec: true,
  216. },
  217. 99: {
  218. hasSec: true,
  219. secLoadTime: 400,
  220. },
  221. 100: {
  222. hasSec: true,
  223. secLoadTime: 750,
  224. },
  225. 101: {
  226. hasSec: true,
  227. secLoadTime: 750,
  228. },
  229. 102: {
  230. hasSec: true,
  231. secLoadTime: 1000,
  232. hasScaling: true,
  233. },
  234. 103: {
  235. hasSec: true,
  236. hasWalking: true,
  237. },
  238. 105: {
  239. hasSec: true,
  240. hasScaling: true,
  241. hasWalking: true,
  242. },
  243. 106: {
  244. hasSec: true,
  245. },
  246. 107: {
  247. hasSec: true,
  248. secLoadTime: 750,
  249. hasScaling: true,
  250. },
  251. 108: {
  252. hasSec: true,
  253. },
  254. 109: {
  255. hasSec: true,
  256. secLoadTime: 600,
  257. },
  258. 110: {
  259. hasSec: true,
  260. },
  261. 111: {
  262. hasSec: true,
  263. secLoadTime: 600,
  264. },
  265. 112: {
  266. hasSec: true,
  267. },
  268. 113: {
  269. hasSec: true,
  270. hasWalking: true,
  271. },
  272. 114: {
  273. hasSec: true,
  274. secLoadTime: 300,
  275. },
  276. 115: {
  277. hasSec: true,
  278. },
  279. 116: {
  280. hasSec: true,
  281. },
  282. 117: {
  283. hasSec: true,
  284. secLoadTime: 600,
  285. },
  286. 119: {
  287. hasSec: true,
  288. secLoadTime: 250,
  289. },
  290. 120: {
  291. hasSec: true,
  292. },
  293. 121: {
  294. hasWalking: true,
  295. },
  296. 123: {
  297. hasSec: true,
  298. secLoadTime: 750,
  299. hasWalking: true,
  300. },
  301. 124: {
  302. hasSec: true,
  303. },
  304. 126: {
  305. hasSec: true,
  306. },
  307. 127: {
  308. hasSec: true,
  309. },
  310. default: {
  311. hasSec: false,
  312. secLoadTime: 500,
  313. hasWalking: false,
  314. walkingLoadTime: 250,
  315. hasScaling: false,
  316. },
  317. };
  318. const sendBoost = (type, time = "") => {
  319. game[obfuscatedNameTranslator.socketManager].sendBytePacket(encodeBytePacket(gameState.token, type, time));
  320. };
  321. const handleLongPress = (t) => {
  322. const Boost = 1;
  323. const SecondaryAbility = 4;
  324. const ScalingBoost = 5;
  325. try {
  326. const data = {
  327. ...boostData.default,
  328. ...(boostData[currentScene?.myAnimals?.[0]?.visibleFishLevel] || {}),
  329. };
  330. if (t < (currentScene?.myAnimals?.[0]?._standing ? 40 : 100)) {
  331. return sendBoost(Boost);
  332. }
  333. if (currentScene?.myAnimals?.[0]?._standing) {
  334. return sendBoost(ScalingBoost, t);
  335. }
  336. if (data.hasScaling) {
  337. return sendBoost(ScalingBoost, t);
  338. }
  339. if (data.hasSec) {
  340. return sendBoost(SecondaryAbility, t);
  341. }
  342. return sendBoost(Boost);
  343. } catch {}
  344. };
  345.  
  346. // MISC UTILS
  347. const randInt = (min, max) => Math.floor(min + Math.random() * (max - min));
  348.  
  349. // UI
  350.  
  351. const ui = {
  352. message: {
  353. info: (message, options) => {
  354. return document.getElementById("app").__vue_app__._context.config.globalProperties.$message({
  355. message: message,
  356. ...options,
  357. });
  358. },
  359. success: (message, options) => {
  360. return document.getElementById("app").__vue_app__._context.config.globalProperties.$message.success({
  361. message: message,
  362. ...options,
  363. });
  364. },
  365. warning: (message, options) => {
  366. return document.getElementById("app").__vue_app__._context.config.globalProperties.$message.warning({
  367. message: message,
  368. ...options,
  369. });
  370. },
  371. error: (message, options) => {
  372. return document.getElementById("app").__vue_app__._context.config.globalProperties.$message.error({
  373. message: message,
  374. ...options,
  375. });
  376. },
  377. },
  378. confirm: ({ title, message, type, dangerouslyUseHTMLString, confirmButtonText, cancelButtonText, onConfirm, onCancel }) => {
  379. return document
  380. .getElementById("app")
  381. .__vue_app__._context.config.globalProperties.$msgbox({
  382. title: title || "fsploit",
  383. message: message || "",
  384. type: type || "",
  385. dangerouslyUseHTMLString: dangerouslyUseHTMLString || false,
  386. confirmButtonText: confirmButtonText || "OK",
  387. cancelButtonText: cancelButtonText || "Cancel",
  388. showCancelButton: true,
  389. showClose: false,
  390. })
  391. .then(onConfirm)
  392. .catch(onCancel);
  393. },
  394. alert: ({ title, message, type, dangerouslyUseHTMLString, dismissButtonText, onDismiss }) => {
  395. return document
  396. .getElementById("app")
  397. .__vue_app__._context.config.globalProperties.$msgbox({
  398. title: title || "FSploit",
  399. message: message || "",
  400. type: type || "",
  401. dangerouslyUseHTMLString: dangerouslyUseHTMLString || false,
  402. confirmButtonText: dismissButtonText || "OK",
  403. showCancelButton: false,
  404. showClose: false,
  405. })
  406. .then(onDismiss);
  407. },
  408.  
  409. registerGameUiButton: ({ id, svgIcon, onClick }) => {
  410. gameUiButtons.push({ id, svgIcon, onClick });
  411. console.log(gameUiButtons);
  412. },
  413.  
  414. nukeDOM: () => {
  415. const domObserver = new MutationObserver(() => {
  416. for (const child of document.querySelectorAll("#app > *")) {
  417. child.remove();
  418. }
  419. });
  420. domObserver.observe(document.querySelector("html"), { childList: true, subtree: true });
  421. },
  422. };
  423.  
  424. // CUSTOM STYLES
  425.  
  426. const applyStyles = () => {
  427. document.title = `fsploit ${fsploitVersion}`;
  428. for (const favicon of document.querySelectorAll("link[rel*='icon']")) {
  429. favicon.remove();
  430. }
  431. document.getElementsByTagName("head")[0].appendChild(
  432. Object.assign(document.createElement("link"), {
  433. href: "https://raw.githubusercontent.com/mahdi13377/deeeepio_api_wrapper/main/favicon.ico",
  434. rel: "shortcut icon",
  435. type: "image/x-icon",
  436. })
  437. );
  438. document.getElementsByTagName("head")[0].appendChild(
  439. Object.assign(document.createElement("link"), {
  440. href: "https://raw.githubusercontent.com/mahdi13377/deeeepio_api_wrapper/main/favicon.ico",
  441. rel: "icon",
  442. type: "image/x-icon",
  443. })
  444. );
  445. const customTheme = `
  446. img[src*="img/badges/"] {
  447. display: none;
  448. }
  449.  
  450. .el-input__wrapper {
  451. background-color: rgba(17, 24, 39, 0) !important;
  452. }
  453.  
  454. .el-input__inner {
  455. color: rgba(255, 255, 255, 1) !important;
  456. }
  457.  
  458. * {
  459. text-decoration: none !important;
  460. }
  461.  
  462. .dark .modal-content {
  463. background-color: #202020 !important;
  464. border-color: #3c3c3c !important;
  465. }
  466.  
  467. .dark .forum-post-page .inner,
  468. .dark .profile .content {
  469. background-color: #2b2b2b !important;
  470. }
  471.  
  472. .dark body .el-input__wrapper,
  473. .dark body .el-textarea__wrapper {
  474. background-color: rgba(17, 24, 39, 0) !important;
  475. border-color: rgba(55, 65, 81, 1) !important;
  476. color: rgba(255, 255, 255, 1) !important;
  477. }
  478.  
  479. .dark .forum-page,
  480. .dark .social-modal .main .content,
  481. .dark .social-modal .main .sidebar--left {
  482. background-color: #2b2c2f !important;
  483. }
  484.  
  485. .forum-page .inner .forum-posts .forum-post-summary {
  486. border-color: rgba(209, 213, 219, 1) !important;
  487. border-bottom-width: 1px !important;
  488. cursor: pointer !important;
  489. padding-top: 0.5rem !important;
  490. padding-left: 0.75rem !important;
  491. padding-right: 0.75rem !important;
  492. }
  493.  
  494. .dark .forum-page .inner .forum-posts .forum-post-summary:hover {
  495. background-color: rgba(77, 77, 77, 0.1) !important;
  496. }
  497.  
  498. .dark .forum-page .inner .forum-posts .forum-post-summary {
  499. border-color: rgb(64 68 72) !important;
  500. }
  501.  
  502. .dark .social-modal .main .sidebar--left .tabs .tab.active {
  503. background-color: rgba(65, 65, 65, 0) !important;
  504. color: rgba(255, 255, 255, 1) !important;
  505. }
  506.  
  507. .dark .friends-view .nav .button-container .nice-button.active {
  508. background-color: rgb(62 66 70) !important;
  509. color: rgba(255, 255, 255, 1) !important;
  510. }
  511.  
  512. .all-friends .friends .friend:hover,
  513. .friend-requests .requests .request.is-new,
  514. .friend-requests .requests .request:hover {
  515. background-color: rgb(62 66 70) !important;
  516. border-radius: 10px !important;
  517. }
  518.  
  519. .btn.square.el-button--mini {
  520. border-radius: 0.9rem !important;
  521. width: 2rem !important;
  522. height: 2rem !important;
  523. }
  524.  
  525. .dark .animals-container .animals .animal {
  526. background-color: rgba(17, 24, 39, 0) !important;
  527. }
  528.  
  529. .dark .skins-container .skins .skin {
  530. --tw-bg-opacity: 0!important;
  531. }
  532. .dark .emotes .emote {
  533. --tw-bg-opacity: 0!important;
  534. }
  535. .dark .pets .pet {
  536. --tw-bg-opacity: 0!important;
  537. }
  538.  
  539. body .el-popover.el-popper.popover--dark {
  540. border-color: #3c3c3c!important;
  541. }
  542. .dark .leaderboard-popover-details .right .header {
  543. --tw-bg-opacity: 1!important;
  544. background-color: #2b2b2b!important
  545. }
  546.  
  547. body .el-popover.el-popper.popover--dark {
  548. background-color: #2b2b2b!important
  549. }
  550.  
  551. .el-col-xs-12 {
  552. display: block;
  553. max-width: 49%;
  554. flex: 0 0 50%
  555. }
  556.  
  557. html.dark .el-select__popper .el-select-dropdown {
  558. --tw-bg-opacity: 1;
  559. background-color: #2b2b2b
  560. }
  561.  
  562. html.dark .el-select__popper .el-select-dropdown {
  563. --tw-bg-opacity: 1;
  564. background-color: #2b2b2b
  565. }
  566.  
  567. html.dark .el-select__popper .el-select-dropdown__item:focus,html.dark .el-select__popper .el-select-dropdown__item:not(.is-disabled):hover {
  568. --tw-bg-opacity: 1;
  569. background-color: #1f1f1f
  570. }
  571.  
  572. html.dark .el-dropdown-menu__item:focus,html.dark .el-dropdown-menu__item:not(.is-disabled):hover {
  573. --tw-bg-opacity: 1;
  574. background-color: #1f1f1f
  575. }
  576.  
  577. html.dark .el-popper__arrow::before {
  578. --tw-bg-opacity: 1;
  579. background-color: rgba(55,65,81,var(--tw-bg-opacity));
  580. background: #ffffff!important;
  581. border-color: #565656!important
  582. }
  583.  
  584. html.dark .el-popper {
  585. --tw-bg-opacity: 1;
  586. background-color: #1f1f1f
  587. --tw-border-opacity: 1;
  588. border-color: #1f1f1f
  589. border-radius: .375rem;
  590. --tw-text-opacity: 1;
  591. }
  592.  
  593. .dark .create-comment .nav-bar {
  594. --tw-bg-opacity: 1;
  595. background-color: #202121;
  596. }
  597.  
  598. .el-textarea__inner {
  599. box-shadow: none!important;
  600. }
  601.  
  602. .el-col.el-col-24.el-col-xs-12.is-guttered:nth-of-type(2) {
  603. background-color: rgba(32, 32, 33, 0.1);
  604. padding-right: 15px;
  605. padding-left: 5px;
  606. border-width: 1px;
  607. border-radius: 0.5rem;
  608. border-color: rgba(255, 255, 255, 0.1);
  609. }
  610.  
  611. .dark body .el-textarea__inner {
  612. background-color: #1c1c1c!important;
  613.  
  614. }
  615.  
  616. .dark .leaderboard-popover-details .left {
  617. --tw-bg-opacity: 0!important;
  618. background-color: rgba(31,41,55,var(--tw-bg-opacity))!important;
  619. }
  620. .user-widget {
  621. border-bottom-right-radius: 1rem !important;
  622. display: -webkit-box !important;
  623. display: -ms-flexbox !important;
  624. display: -webkit-flex !important;
  625. display: flex !important;
  626. -webkit-box-orient: horizontal !important;
  627. -webkit-box-direction: normal !important;
  628. -ms-flex-direction: row !important;
  629. -webkit-flex-direction: row !important;
  630. flex-direction: row !important;
  631. -webkit-box-align: stretch !important;
  632. -ms-flex-align: stretch !important;
  633. -webkit-align-items: stretch !important;
  634. align-items: stretch !important;
  635. padding: 1rem !important;
  636. }
  637.  
  638. /* Common styles for all buttons */
  639. .btn:not(.el-button--text) {
  640. border-bottom-width: 4px!important;
  641. background-color: rgba(27, 59, 67, 1) !important;
  642. border-color: rgba(1, 35, 46, 1) !important;
  643. color: rgba(255, 255, 255, 1) !important;
  644. }
  645.  
  646. .btn:not(.el-button--text):hover {
  647. background-color: rgba(31, 41, 55, 1) !important;
  648. border-color: rgba(17, 24, 39, 1) !important;
  649. }
  650.  
  651. .coins.pb-2 {
  652. background-color: rgba(0, 0, 0, 0) !important;
  653. border-color: rgba(0, 0, 0, 0) !important;
  654. }
  655.  
  656. html.dark .el-dropdown-menu {
  657. background-color: #2b2b2b !important;
  658. }
  659.  
  660. .el-popper.is-light .el-popper__arrow::before {
  661. opacity: 0 !important;
  662. }
  663.  
  664. .el-dropdown-menu__item:not(.is-disabled):focus {
  665.  
  666. color: rgba(255, 255, 255, 1) !important;
  667. }
  668.  
  669. .el-dropdown-menu__item i {
  670. margin-right: 5px !important;
  671. }
  672.  
  673. .user-widget .user__data .username {
  674. cursor: pointer !important;
  675. margin-right: 0.25rem !important;
  676. overflow: hidden !important;
  677. -o-text-overflow: ellipsis !important;
  678. text-overflow: ellipsis !important;
  679. max-width: 16rem !important;
  680. font-size: 1.1em !important;
  681. line-height: 1.2em !important;
  682. margin-left: 1.5rem !important;
  683. }
  684.  
  685. .el-button.el-button--small.el-tooltip__trigger.btn.nice-button.yellow.has-icon.square.only-icon.el-tooltip__trigger {
  686. display: none !important;
  687. }
  688.  
  689. .el-image:nth-of-type(2).el-image__inner {
  690. content: url("https://i.ibb.co/84gjfCt/image-4.png") !important;
  691. }
  692.  
  693. .divider {
  694. display: none !important;
  695. }
  696.  
  697. .btn {
  698. outline: 2px solid transparent !important;
  699. }
  700.  
  701. .home-page .header .left {
  702. background-color: rgba(17,24,39, 0.4)!important;
  703. }
  704.  
  705. .top-right-nav {
  706. background-color: rgba(17,24,39, 0.4)!important;
  707. }
  708.  
  709. div.sidebar.left > div.ad-block {
  710. opacity: 0 !important;
  711. pointer-events: none !important;
  712. display: none !important;
  713. }
  714. div.sidebar.left > a {
  715. display: none !important;
  716. }
  717. div.sidebar.left {
  718. max-width: 30vw;
  719. width: 21rem;
  720. bottom: 0 !important;
  721. }
  722. .dark .profile .content[data-v-60d99b2d] {
  723. --tw-bg-opacity: 0.5!important;
  724. background-color: #242424!important;
  725. backdrop-filter: blur(10px)!important;
  726. border-radius: 8px!important;
  727. border: 1px solid rgba(255, 255, 255, 0.1)!important;
  728. }
  729.  
  730. .el-button {
  731. transition: .3s!important;
  732. }
  733. `;
  734. document.body.appendChild(Object.assign(document.createElement("style"), { innerHTML: customTheme }));
  735.  
  736. const versionText = document.querySelector(".client-version");
  737. versionText.innerHTML = `<p>fsploit v${fsploitVersion}</p><p>Vast Softworks LLC.</p>`;
  738. versionText.style.display = "flex";
  739. versionText.style.justifyContent = "space-between";
  740. versionText.style.left = ".25rem";
  741.  
  742. if (!GM_getValue("background")) {
  743. fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/background-base64")
  744. .then((response) => response.text())
  745. .then((data) => {
  746. document.body.appendChild(
  747. Object.assign(document.createElement("style"), {
  748. innerHTML: `.home-bg {background-image: url('data:image/png;base64,${data.trim()}') !important;}`,
  749. })
  750. );
  751. GM_setValue("background", data.trim());
  752. });
  753. } else {
  754. const backgroundData = GM_getValue("background");
  755. document.body.appendChild(
  756. Object.assign(document.createElement("style"), {
  757. innerHTML: `.home-bg {background-image: url('data:image/png;base64,${backgroundData}') !important;}`,
  758. })
  759. );
  760. }
  761.  
  762. if (!GM_getValue("banner")) {
  763. fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/banner-base64")
  764. .then((response) => response.text())
  765. .then((data) => {
  766. document.body.appendChild(
  767. Object.assign(document.createElement("style"), {
  768. innerHTML: `.play-game img {opacity: 0 !important;} .play-game > div:first-of-type {background-image: url('data:image/png;base64,${data.trim()}') !important; background-size: contain !important; background-repeat: no-repeat !important; background-position: center !important;}`,
  769. })
  770. );
  771. GM_setValue("banner", data.trim());
  772. });
  773. } else {
  774. const bannerData = GM_getValue("banner");
  775. document.body.appendChild(
  776. Object.assign(document.createElement("style"), {
  777. innerHTML: `.play-game img {opacity: 0 !important;} .play-game > div:first-of-type {background-image: url('data:image/png;base64,${bannerData}') !important; background-size: contain !important; background-repeat: no-repeat !important; background-position: center !important;}`,
  778. })
  779. );
  780. }
  781. document.querySelector(".play-game img").setAttribute("draggable", "false");
  782.  
  783. const left_widget_container = document.querySelector("div.sidebar.left");
  784.  
  785. const tutorial_box = document.querySelector("div.sidebar.right > div:nth-child(3)").cloneNode(true);
  786. tutorial_box.setAttribute("id", "tutorial-box");
  787. left_widget_container.appendChild(tutorial_box);
  788.  
  789. document.querySelector("#tutorial-box > div.title").innerText = "How to play";
  790. document.querySelector("#tutorial-box > div:nth-child(2)").outerHTML = '<div id="tutorial"></div>';
  791.  
  792. const tutorial = document.getElementById("tutorial");
  793. tutorial.style.maxHeight = "30vh";
  794. tutorial.style.overflow = "scroll";
  795. tutorial.style.overflowX = "hidden";
  796. tutorial.style.padding = "10px";
  797. tutorial.style.fontSize = "small";
  798.  
  799. const tut = `<b>Welcome to fsploit!</b>
  800. <p>Scroll down for instructions on hacks</p>
  801. <br />
  802. <b>Controls</b>
  803. <p><b>ESC</b> to hide/show menu</p>
  804. <p><b>Hold CTRL</b> to see an aim line (only on certain animals)</p>
  805. <p><b>Scroll</b> with your mouse to zoom in and out of the map. This client allows you to do so without limit.</p>
  806. <p><b>M</b> to hide/show chat messages</p>
  807. <p><b>B</b> to clear chat messages</p>
  808. <p><b>N</b> to hide/show large map</p>
  809. <p><b>Y</b> to view the evolution tree</p>
  810. <p><b>S</b> to open settings</p>
  811.  
  812. <br />
  813. <hr />
  814. <br />
  815.  
  816. <b>Boost hacks</b>
  817. <p>Hold <b>CTRL</b> and <b>CLICK</b> to use a long charged boost</p>
  818. <p>Hold <b>ALT</b> and <b>CLICK</b> to use a short charged boost</p>
  819. <p>Hold <b>CTRL</b>, <b>SHIFT</b>, and <b>CLICK</b> to use a special charged boost:</p>
  820. <ul>
  821. <li>Walking animals: jump higher than normal</li>
  822. <li>Beluga and beaked whale: shoot super speed projectile (uses 2 boosts)</li>
  823. <li>Thresher: go nyoom (uses 2 boosts)</li>
  824. </ul>
  825.  
  826. <b>Goblin shark 210 dmg</b>
  827. <p>It is possible to glitch goblin shark's charged shot mechanism and fire bullets that deal 210 damage without having to charge for 2 seconds.</p>
  828. <p>Steps:</p>
  829. <ol>
  830. <li>Charge boost to max. Make sure you reach the -50% speed.</li>
  831. <li>Cancel the charge boost by right clicking.</li>
  832. <li>Hold the control key and click once to fire a shot.</li>
  833. </ol>
  834. <p>Note that if you long press to manually do a charged boost, it will cancel the glitch and you will have to do the steps above again.</p>`;
  835. tutorial.innerHTML = tut;
  836. };
  837.  
  838. // CHEATS
  839.  
  840. const evoTree = () => {
  841. const overlay = document.createElement("div");
  842. overlay.style.cssText =
  843. "position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: rgba(0, 0, 0, 0); z-index: 1000; display: none;";
  844. const img = document.createElement("img");
  845. function isInputActive() {
  846. const e = document.activeElement;
  847. return e.matches("input") || e.matches("textarea");
  848. }
  849. img.src = "https://i.ibb.co/djBZ520/image.png";
  850. img.style.cssText = "display: block; max-width: 100%; height: auto; ";
  851. overlay.appendChild(img);
  852. document.body.appendChild(overlay);
  853. window.addEventListener("keydown", (e) => {
  854. if (!isInputActive() && e.code === "KeyY") {
  855. overlay.style.display = "block";
  856. }
  857. });
  858. window.addEventListener("keyup", (e) => {
  859. if (!isInputActive() && e.code === "KeyY") {
  860. overlay.style.display = "none";
  861. }
  862. });
  863. };
  864.  
  865. const quickDisconnect = () => {
  866. if (!quickDisconnectx) {
  867. document.body.addEventListener("keydown", (e) => {
  868. if (e.ctrlKey && e.shiftKey && e.code === "KeyQ" && document.activeElement !== document.querySelector("div.chat-input input")) {
  869. try {
  870. game[obfuscatedNameTranslator.socketManager].disconnect();
  871. } catch {}
  872. }
  873. });
  874. quickDisconnectx = true;
  875. }
  876. };
  877.  
  878. const betterVision = () => {
  879. try {
  880. currentScene[obfuscatedNameTranslator.setFlash] = () => true;
  881. } catch {}
  882. try {
  883. currentScene[obfuscatedNameTranslator.terrainManager].shadow.setShadowSize(1000000);
  884. currentScene[obfuscatedNameTranslator.terrainManager].shadow.setShadowSize = () => true;
  885. } catch {}
  886. if (!betterVisionx) {
  887. setInterval(() => {
  888. try {
  889. currentScene[obfuscatedNameTranslator.foodGlowContainer].zOrder = 996;
  890. currentScene[obfuscatedNameTranslator.foodContainer].zOrder = 997;
  891. currentScene[obfuscatedNameTranslator.namesLayer].zOrder = 998;
  892. currentScene[obfuscatedNameTranslator.animalsContainer].zOrder = 999;
  893. currentScene[obfuscatedNameTranslator.barsLayer].zOrder = 1000;
  894. currentScene[obfuscatedNameTranslator.chatContainer].zOrder = 1001;
  895. } catch {}
  896. try {
  897. game.viewport.clampZoom({
  898. minWidth: 0,
  899. maxWidth: 1e7,
  900. });
  901. game.viewport.plugins.plugins.clamp = null;
  902. game.viewport.plugins.plugins["clamp-zoom"] = null;
  903. } catch {}
  904. try {
  905. currentScene[obfuscatedNameTranslator.viewingGhosts] = true;
  906. currentScene[obfuscatedNameTranslator.ceilingsContainer].alpha = 0.3;
  907. } catch {}
  908. }, 300);
  909. // cache property names to speed up code
  910. let p = [];
  911. setInterval(() => {
  912. for (
  913. let i = 0;
  914. i < currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList]?.length || 0;
  915. i++
  916. ) {
  917. try {
  918. if (currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].alpha < 0.5) {
  919. currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].alpha = 0.5;
  920. }
  921. if (currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].inner.alpha < 0.5) {
  922. currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i].inner.alpha = 0.5;
  923. }
  924.  
  925. // make nameObject and relatedObjects visible
  926. // cache stuff
  927. if (p.length === 0) {
  928. const temp = getAllProperties(
  929. currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i]
  930. );
  931. p = temp.filter(
  932. (e) =>
  933. e.startsWith("_0x") &&
  934. typeof currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i][e] ===
  935. "object"
  936. );
  937. }
  938. for (const e of p) {
  939. if (currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i][e].visible != null)
  940. currentScene[obfuscatedNameTranslator.entityManager][obfuscatedNameTranslator.entityManagerProps.animalsList][i][e].visible = true;
  941. }
  942. } catch {}
  943. }
  944. }, 50);
  945. betterVisionx = true;
  946. }
  947. };
  948.  
  949. const aimLine = () => {
  950. const overlayAnimals = [13, 61, 93, 94, 113];
  951.  
  952. function createAimOverlay() {
  953. try {
  954. document.getElementById("aim-overlay").remove();
  955. } catch {}
  956. const aim_overlay = document.createElement("hr");
  957. document.querySelector("div.game").insertBefore(aim_overlay, document.querySelector("div.game").children[0]);
  958. aim_overlay.outerHTML =
  959. '<hr id="aim-overlay" style="border: 1px #f55d dotted;border-image: linear-gradient(to right, #f55d, #f550) 1;transform-origin: left;position: absolute;top: 50%;left: 50%;width: 40vw;display:none;pointer-events:none;">';
  960. }
  961. createAimOverlay();
  962. if (!aimLinex) {
  963. document.addEventListener("mousemove", () => {
  964. try {
  965. if (currentScene != null) {
  966. if (currentScene?.myAnimals?.[0] != null) {
  967. document.getElementById("aim-overlay").style.transform = `rotate(${
  968. (currentScene?.myAnimals?.[0]?.inner?.rotation * 180) / Math.PI +
  969. (currentScene?.myAnimals?.[0]?.visibleFishLevel === 101 ? 90 : -90)
  970. }deg)`;
  971. }
  972. }
  973. } catch {}
  974. });
  975. window.addEventListener(
  976. "keydown",
  977. (e) => {
  978. try {
  979. if (e.ctrlKey && overlayAnimals.includes(currentScene.myAnimals[0].visibleFishLevel)) {
  980. document.getElementById("aim-overlay").style.display = "block";
  981. }
  982. } catch {}
  983. },
  984. false
  985. );
  986. window.addEventListener(
  987. "keyup",
  988. (e) => {
  989. try {
  990. if (!e.ctrlKey) {
  991. document.getElementById("aim-overlay").style.display = "none";
  992. }
  993. } catch {}
  994. },
  995. false
  996. );
  997. window.addEventListener("focus", () => {
  998. try {
  999. document.getElementById("aim-overlay").style.display = "none";
  1000. } catch {}
  1001. });
  1002. aimLinex = true;
  1003. }
  1004. };
  1005.  
  1006. const clearChat = () => {
  1007. if (!clearChatx) {
  1008. document.addEventListener("keydown", (event) => {
  1009. if (event.code === "KeyB" && document.activeElement !== document.querySelector("div.chat-input input")) {
  1010. for (const b of currentScene[obfuscatedNameTranslator.chatMessages]) {
  1011. b.renderable = false;
  1012. b.render = () => undefined;
  1013. }
  1014. }
  1015. });
  1016. clearChatx = true;
  1017. }
  1018. };
  1019.  
  1020. const boostHacks = () => {
  1021. function showCtrlOverlay(e) {
  1022. if (!document.getElementById("ctrl-overlay")) {
  1023. createCtrlOverlay();
  1024. }
  1025. if (e.ctrlKey || e.altKey) {
  1026. try {
  1027. if (currentScene != null) {
  1028. if (currentScene?.myAnimals?.[0] != null) {
  1029. if (currentScene?.myAnimals?.[0]?.visibleFishLevel !== 101) {
  1030. document.getElementById("ctrl-overlay").style.pointerEvents = "all";
  1031. } else if (!e.shiftKey) {
  1032. if (currentScene?.myAnimals?.[0]?.visibleFishLevel === 101) document.getElementById("ctrl-overlay").style.pointerEvents = "all";
  1033. } else {
  1034. document.getElementById("ctrl-overlay").style.pointerEvents = "none";
  1035. }
  1036. }
  1037. }
  1038. } catch {}
  1039. }
  1040. }
  1041.  
  1042. function superShot() {
  1043. try {
  1044. handleLongPress(1);
  1045. setTimeout(() => {
  1046. handleLongPress(5000);
  1047. }, 50);
  1048. setTimeout(() => {
  1049. handleLongPress(5000);
  1050. }, 100);
  1051. setTimeout(() => {
  1052. handleLongPress(5000);
  1053. }, 150);
  1054. } catch {}
  1055. }
  1056.  
  1057. function createCtrlOverlay() {
  1058. try {
  1059. document.getElementById("ctrl-overlay").remove();
  1060. } catch {}
  1061. const ctrl_overlay = document.createElement("div");
  1062. document.querySelector("div.game").insertBefore(ctrl_overlay, document.querySelector("div.game").children[0]);
  1063. ctrl_overlay.outerHTML =
  1064. '<div id="ctrl-overlay" style="width: 100%;height: 100%;position: absolute;display: block;z-index:10000;pointer-events:none;"></div>';
  1065. document.getElementById("ctrl-overlay").addEventListener("contextmenu", (e) => e.preventDefault());
  1066. }
  1067. createCtrlOverlay();
  1068. if (!boostHacksx) {
  1069. window.addEventListener(
  1070. "keydown",
  1071. (e) => {
  1072. try {
  1073. showCtrlOverlay(e);
  1074. } catch {}
  1075. },
  1076. false
  1077. );
  1078. window.addEventListener(
  1079. "click",
  1080. (e) => {
  1081. try {
  1082. const b = {
  1083. ...boostData.default,
  1084. ...boostData[currentScene?.myAnimals?.[0]?.visibleFishLevel],
  1085. };
  1086. if (e.ctrlKey) {
  1087. if (e.shiftKey && currentScene?.myAnimals?.[0]?.visibleFishLevel === 107) {
  1088. superShot();
  1089. } else if (e.shiftKey && currentScene?.myAnimals?.[0]?.visibleFishLevel !== 101 && currentScene?.myAnimals?.[0]?._standing) {
  1090. handleLongPress(randInt(5e8, 2 ** 31 - 1));
  1091. } else {
  1092. let inputManager = Object.getOwnPropertyNames(game)
  1093. .map((v) => game[v])
  1094. .find((v) => v.keys instanceof Array);
  1095. inputManager.pointerDown = true;
  1096. inputManager.pressElapsed = Infinity;
  1097. inputManager.setPointerDown(false);
  1098. }
  1099. } else if (e.altKey) {
  1100. handleLongPress(currentScene?.myAnimals?.[0]?._standing ? 41 : Math.floor(b.secLoadTime / 2));
  1101. }
  1102. } catch {}
  1103. },
  1104. false
  1105. );
  1106. window.addEventListener(
  1107. "keyup",
  1108. (e) => {
  1109. try {
  1110. if (!e.ctrlKey && !e.altKey) {
  1111. document.getElementById("ctrl-overlay").style.pointerEvents = "none";
  1112. }
  1113. } catch {}
  1114. },
  1115. false
  1116. );
  1117. window.addEventListener("focus", () => {
  1118. try {
  1119. document.getElementById("ctrl-overlay").style.pointerEvents = "none";
  1120. } catch {}
  1121. });
  1122. boostHacksx = true;
  1123. }
  1124. };
  1125.  
  1126. const humpbackAutosongs = () => {
  1127. if (!humpbackAutosongsx) {
  1128. const songs = [
  1129. [5, 5, 5],
  1130. [5, 5000, 5],
  1131. [5000, 5000, 5000],
  1132. [5000, 5000, 5],
  1133. ];
  1134. const humpbackUiStyle = document.createElement("style");
  1135. humpbackUiStyle.innerHTML = `
  1136. #humpback-ui * {
  1137. font-family:Quicksand;
  1138. color:#fff;
  1139. }
  1140. #humpback-ui .hb-button p {
  1141. margin:5px 0 0 0;
  1142. font-size:12px;
  1143. }
  1144. #humpback-ui {
  1145. display:flex;
  1146. gap:8px;
  1147. width:100%;
  1148. justify-content:center;
  1149. pointer-events:none;
  1150. user-select:none;
  1151. }
  1152. #humpback-ui .hb-button {
  1153. background:#0004;
  1154. padding:10px 0;
  1155. border-radius:15px;
  1156. display:flex;
  1157. flex-direction:column;
  1158. align-items:center;
  1159. justify-content:center;
  1160. }
  1161. #humpback-ui .hb-song {
  1162. display:flex;
  1163. flex-direction:row;
  1164. gap:2px;
  1165. width:81px;
  1166. justify-content:center;
  1167. }
  1168. #humpback-ui .war {
  1169. background:#ae3e41;
  1170. }
  1171. #humpback-ui .heal {
  1172. background:#1aff00;
  1173. }
  1174. #humpback-ui .blast {
  1175. background:#f6ff00;
  1176. }
  1177. #humpback-ui .ruin {
  1178. background:#db7c00;
  1179. }
  1180. #humpback-ui .small {
  1181. width:10px;
  1182. height:10px;
  1183. margin:2.5px 0;
  1184. border-radius:999px;
  1185. }
  1186. #humpback-ui .large {
  1187. width:15px;
  1188. height:15px;
  1189. border-radius:999px;
  1190. }
  1191.  
  1192. `;
  1193. document.head.appendChild(humpbackUiStyle);
  1194. setInterval(() => {
  1195. try {
  1196. if (currentScene?.myAnimals?.[0]?.visibleFishLevel != 87) {
  1197. if (document.querySelector("#humpback-ui")) {
  1198. document.querySelector("#humpback-ui").remove();
  1199. }
  1200. return;
  1201. } else if (document.querySelector("#humpback-ui")) {
  1202. return;
  1203. }
  1204. const humpbackUI = document.createElement("div");
  1205. const parent = document.querySelector(".stats .middle");
  1206.  
  1207. humpbackUI.innerHTML = `
  1208. <div id="humpback-ui">
  1209. <div class="hb-button">
  1210. <div class="hb-song">
  1211. <div class="war small"></div>
  1212. <div class="war small"></div>
  1213. <div class="war small"></div>
  1214. </div>
  1215. <p>War | 1</p>
  1216. </div>
  1217.  
  1218. <div class="hb-button">
  1219. <div class="hb-song">
  1220. <div class="heal small"></div>
  1221. <div class="heal large"></div>
  1222. <div class="heal small"></div>
  1223. </div>
  1224. <p>Heal | 2</p>
  1225. </div>
  1226.  
  1227. <div class="hb-button">
  1228. <div class="hb-song">
  1229. <div class="blast large"></div>
  1230. <div class="blast large"></div>
  1231. <div class="blast large"></div>
  1232. </div>
  1233. <p>Blast | 3</p>
  1234. </div>
  1235.  
  1236. <div class="hb-button">
  1237. <div class="hb-song">
  1238. <div class="ruin large"></div>
  1239. <div class="ruin large"></div>
  1240. <div class="ruin small"></div>
  1241. </div>
  1242. <p>Ruin | 4</p>
  1243. </div>
  1244. </div>
  1245. `;
  1246. parent.prepend(humpbackUI);
  1247. } catch {}
  1248. }, 100);
  1249. document.addEventListener("keydown", (e) => {
  1250. try {
  1251. if (!["1", "2", "3", "4"].includes(e.key)) return;
  1252. if (currentScene?.myAnimals?.[0]?.visibleFishLevel !== 87) return;
  1253. for (const i in [0, 1, 2]) {
  1254. setTimeout(() => {
  1255. handleLongPress(songs[parseInt(e.key) - 1][i]);
  1256. }, Math.max(document.querySelector("div.top-right div.latency > span.value")?.innerText * 3 || 100, 100) * i);
  1257. }
  1258. } catch {}
  1259. });
  1260. humpbackAutosongsx = true;
  1261. }
  1262. };
  1263.  
  1264. const obfuscatedNameTranslator = {};
  1265. const getAllProperties = (obj) => {
  1266. return [...Object.getOwnPropertyNames(Object.getPrototypeOf(obj)), ...Object.getOwnPropertyNames(obj)];
  1267. };
  1268. const throttle = (func, delay) => {
  1269. let prev = 0;
  1270. return (...args) => {
  1271. const now = Date.now();
  1272. if (now - prev > delay) {
  1273. prev = now;
  1274. return func(...args);
  1275. }
  1276. };
  1277. };
  1278. const injector = () => {
  1279. const reflect = {};
  1280. for (const v of Object.getOwnPropertyNames(Reflect)) {
  1281. reflect[v] = Reflect[v];
  1282. }
  1283.  
  1284. const proxy = Proxy;
  1285.  
  1286. const spoof = new WeakMap();
  1287. spoof.set = spoof.set;
  1288. spoof.get = spoof.get;
  1289. spoof.has = spoof.has;
  1290.  
  1291. const proxies = new WeakSet();
  1292. proxies.add = proxies.add;
  1293. proxies.has = proxies.has;
  1294. proxies.delete = proxies.delete;
  1295.  
  1296. const lookupGetter = Object.prototype.__lookupGetter__;
  1297.  
  1298. const hook = (obj, name, handler) => {
  1299. const hooked = new proxy(obj[name], handler);
  1300. spoof.set(hooked, obj[name]);
  1301. obj[name] = hooked;
  1302. };
  1303.  
  1304. hook(Function.prototype, "toString", {
  1305. apply(f, th, args) {
  1306. return reflect.apply(f, spoof.get(th) || th, args);
  1307. },
  1308. });
  1309.  
  1310. hook(window, "Proxy", {
  1311. construct(f, args) {
  1312. const result = reflect.construct(f, args);
  1313. proxies.add(result);
  1314. return result;
  1315. },
  1316. });
  1317.  
  1318. hook(proxy, "revocable", {
  1319. apply(f, th, args) {
  1320. const result = reflect.apply(f, th, args);
  1321. proxies.add(result.proxy);
  1322. return result;
  1323. },
  1324. });
  1325.  
  1326. let lastInjectionSuccessTime = 0;
  1327. hook(Function.prototype, "bind", {
  1328. apply(f, th, args) {
  1329. if (proxies.has(args[0])) return reflect.apply(f, th, args);
  1330. try {
  1331. try {
  1332. if (lookupGetter.call(args[0], "aboveBgPlatformsContainer") != null) return reflect.apply(f, th, args);
  1333. } catch {}
  1334. if (args[0] && args[0].aboveBgPlatformsContainer != null) {
  1335. currentScene = args[0];
  1336. game = args[0].game;
  1337.  
  1338. const currentSceneKeys = getAllProperties(currentScene);
  1339. const obCurrentSceneKeys = currentSceneKeys.filter((e) => e.startsWith("_0x"));
  1340. obfuscatedNameTranslator.setFlash =
  1341. Object.getOwnPropertyNames(currentScene.__proto__.__proto__)
  1342. .filter((v) => v.startsWith("_0x"))
  1343. .find((v) => currentScene[v] instanceof Function) || obfuscatedNameTranslator.setFlash;
  1344. obfuscatedNameTranslator.terrainManager =
  1345. obCurrentSceneKeys.find((e) => typeof currentScene[e]?.shadow !== "undefined") || obfuscatedNameTranslator.terrainManager;
  1346.  
  1347. const foodContainerInter = setInterval(() => {
  1348. obfuscatedNameTranslator.foodGlowContainer =
  1349. obCurrentSceneKeys.find(
  1350. (e) =>
  1351. typeof currentScene[e]?.children?.[0]?.texture?.textureCacheIds?.[0] !== "undefined" &&
  1352. currentScene[e].children?.[0].texture.textureCacheIds[0] === "food_glow.png"
  1353. ) || obfuscatedNameTranslator.foodGlowContainer;
  1354. obfuscatedNameTranslator.foodContainer =
  1355. obCurrentSceneKeys.find(
  1356. (e) =>
  1357. typeof currentScene[e]?.children?.[0]?.texture?.textureCacheIds?.[0] !== "undefined" &&
  1358. [
  1359. "food.png",
  1360. "flappy.png",
  1361. "meat.png",
  1362. "man.png",
  1363. "algae.png",
  1364. "apple.png",
  1365. "fruit.png",
  1366. "volcanofood.png",
  1367. "bubble.png",
  1368. "coconut.png",
  1369. "coldfood.png",
  1370. "coldalgae.png",
  1371. "reeffood.png",
  1372. "reefalgae.png",
  1373. ].includes(currentScene[e].children?.[0].texture.textureCacheIds?.[0])
  1374. ) || obfuscatedNameTranslator.foodContainer;
  1375.  
  1376. if (typeof obfuscatedNameTranslator.foodGlowContainer !== "undefined" && typeof obfuscatedNameTranslator.foodContainer !== "undefined")
  1377. clearInterval(foodContainerInter);
  1378. }, 1000);
  1379.  
  1380. obfuscatedNameTranslator.ceilingsContainer =
  1381. obCurrentSceneKeys.find(
  1382. (e) =>
  1383. typeof currentScene[e]?.children?.[0]?.settings?.layerId !== "undefined" &&
  1384. currentScene[e].children?.[0].settings.layerId === "ceilings"
  1385. ) || obfuscatedNameTranslator.ceilingsContainer;
  1386.  
  1387. obfuscatedNameTranslator.viewingGhosts =
  1388. obCurrentSceneKeys.find((e) => typeof currentScene[e] === "boolean") || obfuscatedNameTranslator.viewingGhosts;
  1389.  
  1390. obfuscatedNameTranslator.entityManager =
  1391. obCurrentSceneKeys.find((e) => typeof currentScene[e]?.entitiesList !== "undefined") || obfuscatedNameTranslator.entityManager;
  1392. obfuscatedNameTranslator.entityManagerProps = {};
  1393. const entityManagerKeys = getAllProperties(currentScene[obfuscatedNameTranslator.entityManager]);
  1394.  
  1395. const animalListInter = setInterval(() => {
  1396. obfuscatedNameTranslator.animalsContainer =
  1397. obCurrentSceneKeys.find((e) => typeof currentScene[e]?.children?.[0]?.isHiding !== "undefined") ||
  1398. obfuscatedNameTranslator.animalsContainer;
  1399.  
  1400. obfuscatedNameTranslator.entityManagerProps.animalsList =
  1401. entityManagerKeys
  1402. .filter((e) => e.startsWith("_0x"))
  1403. .find((e) => typeof currentScene?.[obfuscatedNameTranslator.entityManager]?.[e]?.[0] !== "undefined") ||
  1404. obfuscatedNameTranslator.entityManagerProps.animalsList;
  1405. if (
  1406. typeof obfuscatedNameTranslator.animalsContainer !== "undefined" &&
  1407. typeof obfuscatedNameTranslator.entityManagerProps.animalsList !== "undefined"
  1408. )
  1409. clearInterval(animalListInter);
  1410. }, 1000);
  1411.  
  1412. obfuscatedNameTranslator.chatMessages =
  1413. obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && typeof currentScene[e]?.length === "number") ||
  1414. obfuscatedNameTranslator.chatMessages;
  1415.  
  1416. // TODO: fix this in the future since numbers could change
  1417. // need to get ALL layers and order them from lowest zIndex to highest zIndex
  1418. // then get layers by their index
  1419.  
  1420. // namesLayer zIndex = 18
  1421. // barsLayer zIndex = 15
  1422. // chatContainer zIndex = 50
  1423. obfuscatedNameTranslator.barsLayer =
  1424. obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && currentScene[e]?.zIndex === 15) ||
  1425. obfuscatedNameTranslator.barsLayer;
  1426. obfuscatedNameTranslator.namesLayer =
  1427. obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && currentScene[e]?.zIndex === 18) ||
  1428. obfuscatedNameTranslator.namesLayer;
  1429. obfuscatedNameTranslator.chatContainer =
  1430. obCurrentSceneKeys.find((e) => typeof currentScene[e] === "object" && currentScene[e]?.zIndex === 50) ||
  1431. obfuscatedNameTranslator.chatContainer;
  1432.  
  1433. const gameKeys = getAllProperties(game);
  1434. obfuscatedNameTranslator.socketManager =
  1435. gameKeys.find((e) => typeof game[e]?.sendBytePacket !== "undefined") || obfuscatedNameTranslator.socketManager;
  1436.  
  1437. quickDisconnect();
  1438. betterVision();
  1439. aimLine();
  1440. clearChat();
  1441. boostHacks();
  1442. humpbackAutosongs();
  1443. try {
  1444. gameState = document
  1445. .getElementById("app")
  1446. ._vnode.appContext.config.globalProperties.$simpleState.states.find((v) => v._storeMeta.id === "game");
  1447. } catch {}
  1448. // throttle
  1449. if (lastInjectionSuccessTime < Date.now() - 3000) {
  1450. ui.message.success("fsploit - Loaded client modifications");
  1451. lastInjectionSuccessTime = Date.now();
  1452. }
  1453. }
  1454. } catch {}
  1455. return reflect.apply(f, th, args);
  1456. },
  1457. });
  1458. };
  1459.  
  1460. // MAIN
  1461.  
  1462. window.addEventListener("load", () => {
  1463. setTimeout(() => {
  1464. fetch("https://raw.githubusercontent.com/mahdi13377/fsploit-public/main/mainMod.js", { cache: "no-cache" })
  1465. .then((response) => {
  1466. return response.text();
  1467. })
  1468. .then((data) => {
  1469. if (currentScript !== data) {
  1470. ui.nukeDOM();
  1471. ui.alert({
  1472. title: "fsploit",
  1473. message: "fsploit has been updated. Please reload the page.",
  1474. type: "info",
  1475. dismissButtonText: "Reload",
  1476. onDismiss: () => location.reload(),
  1477. });
  1478. }
  1479. GM_setValue("mainModule", data);
  1480. })
  1481. .catch(() => {
  1482. location.reload();
  1483. });
  1484. }, 1000);
  1485.  
  1486. const main = () => {
  1487. injector();
  1488. applyStyles();
  1489. evoTree();
  1490. const { close } = ui.message.success(`fsploit v${fsploitVersion} - Initialized`);
  1491. setTimeout(() => {
  1492. close();
  1493. ui.message.info("Brought to you by Vast Softworks LLC.");
  1494. }, 3000);
  1495. };
  1496.  
  1497. let sourceVersion = "unknown,unknown";
  1498. try {
  1499. sourceVersion = [
  1500. document.querySelector("head script[type='module'][src*='index']").src.match(/index\.(?<name>[0-9a-z]*)\.js/i).groups.name,
  1501. document.querySelector("head link[rel='modulepreload'][href*='vendor']").href.match(/vendor\.(?<name>[0-9a-z]*)\.js/i).groups.name,
  1502. ].join(",");
  1503. } catch {}
  1504. if (sourceVersion === knownClientVersion) {
  1505. main();
  1506. } else {
  1507. ui.confirm({
  1508. title: "Untested Deeeep.io version",
  1509. message: `Anti-cheat bypass features may not work as expected and get your account banned.
  1510. <br>
  1511. Do you want to proceed anyway?
  1512. <br>
  1513. <p style="font-size:smaller;margin-top: 12px;">
  1514. Debug info:
  1515. <span style="background: #0004;border: 1px solid #fff3;padding: 1px 3px;border-radius: 4px;user-select: auto;">
  1516. index: ${sourceVersion.split(",")[0]}, vendor: ${sourceVersion.split(",")[1]}
  1517. </span>
  1518. </p>`,
  1519. dangerouslyUseHTMLString: true,
  1520. type: "warning",
  1521. confirmButtonText: "Yes",
  1522. cancelButtonText: "No",
  1523. onConfirm: main,
  1524. onCancel: () => {},
  1525. });
  1526. }
  1527. });