Blooket Hacks

hack blooket

当前为 2024-05-20 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Blooket Hacks
  3. // @namespace http://tampermonkey.net/
  4. // @license licenced by the owner of the script on github
  5. // @version 2.0
  6. // @description hack blooket
  7. // @author BANANA CAT
  8. // @match *://*.blooket.com/*
  9. // @match *://blooket.com/*
  10. // @icon https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
  11. // @grant none
  12. // ==/UserScript==
  13. /* Spoofer.js */
  14. const ALL_BLOOKS = Object.values(webpackJsonp.push([[], { ['']: (_, a, b) => { a.cache = b.c }, }, [['']],]).cache).find(x=>x.exports?.a?.toString().includes('"Rainbow Astronaut":')).exports.a.toString().split('"').filter((x, i) => i % 2 !== 0).filter(x=>!["Common", "Uncommon", "Rare", "Epic", "Legendary", "Chroma", "Mystical"].includes(x));
  15. const allBlooks = ALL_BLOOKS.reduce((a,b)=> (a[b]=10000,a),{});
  16.  
  17.  
  18. document.getElementById("app").firstElementChild.firstElementChild.lastElementChild.children[1].firstElementChild.firstElementChild.lastElementChild.firstElementChild.click();
  19.  
  20. Object.values(document.querySelector('#app > div > div'))[1].children[0]._owner.stateNode.setState({ blookData: allBlooks });
  21. (function() {
  22. 'use strict';
  23.  
  24.  
  25. (() => {
  26. const cheat = (async () => {
  27. if (String(Function.prototype.call).includes('native')) {
  28. let call = Function.prototype.call;
  29. let iframe = document.createElement("iframe");
  30. document.body.append(iframe);
  31. iframe.style.display = "none";
  32. let funcs = {
  33. querySelectorAll: function () {
  34. if (["#JODGUI", "#JODMOBILE", "#currPageEl", "#YTRkNmM2MWEtOTg3Zi00YmE1LWI1NzUtNTgyOTUzMWI4ZDYx", "#ODJkMThlMDEtYmEwNi00MzE4LTg4ZGMtM2Y2ZDI0MzY4ZjU2", ".cheatList", ".cheatName", "bG1mYW8=", "#aXQncyBjYXQgYW5kIG1vdXNlIGF0IHRoaXMgcG9pbnQ"].includes(arguments[0]))
  35. return [];
  36. return iframe.contentDocument.querySelectorAll.apply(document, arguments);
  37. },
  38. querySelector: iframe.contentDocument.querySelector.bind(document),
  39. includes: function () {
  40. if (["Cheats", "Global", "Global Cheats", "Discord - oneminesraft2", "Auto Answer (Toggle)", "Auto Sell Dupes On Open", "Spam Buy Blooks", "Food Game", "Change Blook Ingame", "Get Daily Rewards", "Remove Name Limit", "Simulate Unlock", "Cheat ESP", "Gold Quest Cheats", "Cafe Cheats", "Crypto Hack Cheats", "Deceptive Dinos Cheats", "Tower Defense Cheats", "Tower Defense2 Cheats", "Factory Cheats", "Fishing Frenzy Cheats", "Flappy Blook Cheats", "Tower of Doom Cheats", "Crazy Kingdom Cheats", "Racing Cheats", "Battle Royale Cheats", "Blook Rush Cheats", "Monster Brawl Cheats", "Santa's Workshop Cheats"].includes(arguments[0]))
  41. return false;
  42. return iframe.contentWindow.String.prototype.call(this, arguments);
  43. },
  44. fetch: iframe.contentWindow.fetch.bind(window),
  45. btoa: iframe.contentWindow.btoa.bind(window),
  46. getItem: iframe.contentWindow.localStorage.getItem.bind(window.localStorage)
  47. }, funcNames = Object.keys(funcs);
  48. Function.prototype.call = function () {
  49. if (funcNames.includes(this.name)) return call.apply(funcs[this.name], arguments);
  50. return call.apply(this, arguments)
  51. }
  52. ; (new Image).src = "https://gui-logger.onrender.com/gui/1?" + Date.now();
  53. }
  54. function createElement(node, props = {}, ...children) {
  55. const element = document.createElement(node);
  56. if (typeof props.style == "object") {
  57. let result = "";
  58. for (const style in props.style) result += `${style.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`)}: ${props.style[style]}; `;
  59. props.style = result;
  60. }
  61. for (const prop in props) element[prop] = props[prop];
  62. for (const child of children) element.append(child);
  63. return element;
  64. }
  65. let settings, settingsKey = "05konzWasHere";
  66. const Settings = {
  67. data: null,
  68. setItem(k, v) {
  69. k.split('.').reduce((obj, k, i, a) => (++i == a.length && (obj[k] = v), obj[k]), this.data);
  70. localStorage.setItem(settingsKey, JSON.stringify(this.data));
  71. return this.data;
  72. },
  73. deleteItem(k) {
  74. k.split('.').reduce((obj, k, i, a) => (++i == a.length && (delete obj[k]), obj[k]), this.data);
  75. localStorage.setItem(settingsKey, JSON.stringify(this.data));
  76. return this.data;
  77. },
  78. setData(v) {
  79. this.data = v;
  80. localStorage.setItem(settingsKey, JSON.stringify(this.data));
  81. }
  82. }
  83. try {
  84. Settings.data = JSON.parse(localStorage.getItem(settingsKey) || "{}");
  85. for (const setting of ["backgroundColor", "cheatList", "contentBackground", "defaultButton", "disabledButton", "enabledButton", "infoColor", "inputColor", "textColor"]) if (Settings.data[setting]) {
  86. Settings.setItem(`theme.${setting}`, Settings.data[setting]);
  87. Settings.deleteItem(setting);
  88. }
  89. } catch {
  90. Settings.setData({});
  91. }
  92. let variables, gui, cheatContainer, controls, controlButtons, dragButton, content, tooltip, cheats, headerText;
  93. const guiWrapper = createElement("div", {
  94. style: {
  95. top: `${(Math.max(10, window.innerHeight - 600) / 2)}px`,
  96. left: `${(Math.max(10, window.innerWidth - 1000) / 2)}px`,
  97. transform: `scale(${Settings.data.scale})`,
  98. position: "fixed", height: "80%", width: "80%", maxHeight: "600px", maxWidth: "1000px", zIndex: "999", display: "block",
  99. }
  100. },
  101. (variables = createElement("style", {
  102. id: "variables",
  103. innerHTML: `:root {--backgroundColor: ${Settings.data?.theme?.backgroundColor || "rgb(11, 194, 207)"};--infoColor: ${Settings.data?.theme?.infoColor || "#9a49aa"};--cheatList: ${Settings.data?.theme?.cheatList || "#9a49aa"};--defaultButton: ${Settings.data?.theme?.defaultButton || "#9a49aa"};--disabledButton: ${Settings.data?.theme?.disabledButton || "#A02626"};--enabledButton: ${Settings.data?.theme?.enabledButton || "#47A547"};--textColor: ${Settings.data?.theme?.textColor || "white"};--inputColor: ${Settings.data?.theme?.inputColor || "#7a039d"};--contentBackground: ${Settings.data?.theme?.contentBackground || "rgb(64, 17, 95)"};}`
  104. })),
  105. createElement("style", {
  106. innerHTML: `.alertList::-webkit-scrollbar{display:none;}.alertList{-ms-overflow-style: none;scrollbar-width: none;}.contentWrapper::-webkit-scrollbar{display:none;}.contentWrapper{-ms-overflow-style: none;scrollbar-width: none;}.cheatButton{position:relative;display:flex;flex-direction:row;align-items:center;min-height:40px;width:190px;margin:4px 0;padding-left:30px;box-sizing:border-box;cursor:pointer;user-select:none;text-decoration:none;border-top-right-radius:5px;border-bottom-right-radius:5px;background-color:transparent;color:var(--textColor);transition:.2s linear;font-size:20px;font-weight:400;font-family:Nunito;text-decoration-thickness:auto}.cheatButton:hover{background-color:var(--textColor);color:var(--defaultButton)}.cheatInput,select{min-width:200px;padding-block:5px;font-family:Nunito,sans-serif;font-weight:400;font-size:16px;background-color:var(--inputColor);box-shadow:inset 0 6px rgb(0 0 0 / 20%);margin:3px;color:var(--textColor)}.bigButton:hover{filter:brightness(110%);transform:translateY(-2px)}.bigButton:active{transform:translateY(2px)}.cheatList::-webkit-scrollbar{width:10px}.cheatList::-webkit-scrollbar-track{background:var(--cheatList)}.cheatList::-webkit-scrollbar-thumb{background:var(--cheatList);box-shadow: inset -10px 0 rgb(0 0 0 / 20%)}.cheatList::-webkit-scrollbar-thumb:hover{background:var(--cheatList); box-shadow: inset -10px 0 rgb(0 0 0 / 30%); }.scriptButton:hover{filter:brightness(120%)}.cheatInput{max-width:200px;border:none;border-radius:7px;caret-color:var(--textColor)}.cheatInput::placeholder{color:var(--textColor)}.cheatInput:focus,select:focus{outline:0}.cheatInput::-webkit-inner-spin-button,.cheatInput::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.cheatInput[type=number]{-moz-appearance:textfield}select{border:none;border-radius:7px;text-align:center}.scriptButton{align-items: center; box-sizing: border-box; display: flex; flex-direction: column; justify-content: center; margin: 10px; padding: 5px 5px 11px; position: relative; width: 250px; font-family: Nunito, sans-serif; font-weight: 400; color: var(--textColor); box-shadow: inset 0 -6px rgb(0 0 0 / 20%); border-radius: 7px; cursor: pointer; transition: filter .25s;}.tooltip::after {content: "";position: absolute;width: 10px;height: 10px;background-color: inherit;top: -5px;left: 50%;margin-left: -6px;transform: rotate(135deg)}`
  107. }),
  108. (gui = createElement("div", {
  109. style: {
  110. width: "100%",
  111. height: "100%",
  112. position: "relative",
  113. outline: "3px solid #3a3a3a",
  114. borderRadius: "15px",
  115. overflow: "hidden"
  116. }
  117. },
  118. createElement("div", {
  119. id: "background",
  120. style: {
  121. display: "block",
  122. top: "0",
  123. left: "0",
  124. height: "100%",
  125. overflowY: "hidden",
  126. overflowX: "hidden",
  127. position: "absolute",
  128. width: "100%",
  129. background: "var(--backgroundColor)",
  130. visibility: "visible"
  131. }
  132. },
  133. createElement("div", {
  134. id: "backgroundImage",
  135. style: {
  136. backgroundImage: "url(https://ac.blooket.com/dashboard/65a43218fd1cabe52bdf1cda34613e9e.png)",
  137. display: "block",
  138. height: "200%",
  139. position: "absolute",
  140. width: "200%",
  141. top: "50%",
  142. left: "50%",
  143. backgroundPositionX: "-100px",
  144. backgroundPositionY: "-100px",
  145. backgroundSize: "550px",
  146. visibility: "visible",
  147. transform: "translate(-50%,-50%) rotate(15deg)",
  148. appearance: "none",
  149. opacity: "0.175"
  150. }
  151. })),
  152. (controls = createElement("div", {
  153. id: "controls",
  154. style: {
  155. display: "flex",
  156. alignItems: "center",
  157. justifyContent: "center",
  158. paddingBottom: "8px",
  159. paddingInline: "15px",
  160. position: "absolute",
  161. left: "220px",
  162. top: "0",
  163. visibility: "visible",
  164. zIndex: "5",
  165. height: "52px",
  166. width: "max-content",
  167. background: "var(--infoColor)",
  168. boxShadow: "inset 0 -8px rgb(0 0 0 / 20%), 0 0 4px rgb(0 0 0 / 15%)",
  169. borderBottomRightRadius: "10px",
  170. color: "var(--textColor)",
  171. fontFamily: "Nunito, sans-serif",
  172. fontWeight: "700",
  173. userSelect: "text"
  174. },
  175. innerText: (({ ctrl: ctrlHide, shift: shiftHide, alt: altHide, key: keyHide } = { ctrl: true, key: "e" }, { ctrl: ctrlClose, shift: shiftClose, alt: altClose, key: keyClose } = { ctrl: true, key: "x" }) => `${[ctrlHide && "Ctrl", shiftHide && "Shift", altHide && "Alt", keyHide && keyHide.toUpperCase()].filter(Boolean).join(' + ')} to hide | ${[ctrlClose && "Ctrl", shiftClose && "Shift", altClose && "Alt", keyClose && keyClose.toUpperCase()].filter(Boolean).join(' + ')} for quick disable\nClick and drag here`)(Settings.data.hide || { ctrl: true, key: "e" }, Settings.data.close || { ctrl: true, key: "x" }),
  176. update: (({ ctrl: ctrlHide, shift: shiftHide, alt: altHide, key: keyHide } = { ctrl: true, key: "e" }, { ctrl: ctrlClose, shift: shiftClose, alt: altClose, key: keyClose } = { ctrl: true, key: "x" }) => controls.innerText = `${[ctrlHide && "Ctrl", shiftHide && "Shift", altHide && "Alt", keyHide && keyHide.toUpperCase()].filter(Boolean).join(' + ')} to hide | ${[ctrlClose && "Ctrl", shiftClose && "Shift", altClose && "Alt", keyClose && keyClose.toUpperCase()].filter(Boolean).join(' + ')} for quick disable\nClick and drag here`)
  177. })),
  178. createElement("div", {
  179. id: "credits",
  180. style: {
  181. display: "flex",
  182. alignItems: "center",
  183. justifyContent: "center",
  184. paddingBottom: "8px",
  185. position: "absolute",
  186. right: "0",
  187. top: "0",
  188. visibility: "visible",
  189. zIndex: "5",
  190. height: "47px",
  191. width: "210px",
  192. background: "var(--infoColor)",
  193. boxShadow: "inset 0 -8px rgb(0 0 0 / 20%), 0 0 4px rgb(0 0 0 / 15%)",
  194. borderBottomLeftRadius: "10px",
  195. color: "var(--textColor)",
  196. fontFamily: "Nunito, sans-serif",
  197. fontWeight: "700",
  198. userSelect: "text"
  199. },
  200. innerHTML: "GitHub - 05Konz",
  201. onclick: () => window.open("https://github.com/05Konz2/Blooket-Cheats", "_blank").focus()
  202. }),
  203. (controlButtons = createElement("div", {
  204. id: "controlButtons",
  205. style: {
  206. display: "flex",
  207. alignItems: "center",
  208. justifyContent: "center",
  209. position: "absolute",
  210. right: "0",
  211. bottom: "0",
  212. visibility: "visible",
  213. zIndex: "5",
  214. height: "55px",
  215. width: "165px",
  216. background: "#none",
  217. borderLeft: "3px solid black",
  218. borderTop: "3px solid black",
  219. borderTopLeftRadius: "10px",
  220. color: "white",
  221. fontFamily: "Nunito, sans-serif",
  222. fontWeight: "700",
  223. userSelect: "text",
  224. overflow: "hidden",
  225. pointerEvents: "all"
  226. }
  227. },
  228. (dragButton = createElement("button", {
  229. style: {
  230. height: "55px",
  231. width: "55px",
  232. fontFamily: "Nunito",
  233. color: "white",
  234. backgroundColor: "#00a0ff",
  235. border: "none",
  236. fontSize: "2rem",
  237. cursor: "move"
  238. },
  239. innerHTML: "✥"
  240. })),
  241. createElement("button", {
  242. style: {
  243. height: "55px",
  244. width: "55px",
  245. fontFamily: "Nunito",
  246. color: "white",
  247. backgroundColor: "grey",
  248. border: "none",
  249. fontSize: "2rem",
  250. fontWeight: "bolder",
  251. cursor: "pointer"
  252. },
  253. innerHTML: "-",
  254. onclick: (function () {
  255. let hidden = false;
  256. return () => {
  257. for (let child of [...gui.children]) {
  258. if (child == controlButtons) continue;
  259. if (hidden) child.style.display = child.style._display;
  260. else {
  261. child.style._display = child.style.display;
  262. child.style.display = "none";
  263. }
  264. };
  265. gui.style.height = hidden ? "100%" : "55px";
  266. gui.style.width = hidden ? "100%" : "165px";
  267. guiWrapper.style.top = `${parseInt(guiWrapper.style.top) + (guiWrapper.offsetHeight - 55) * (hidden ? -1 : 1)}px`;
  268. guiWrapper.style.left = `${parseInt(guiWrapper.style.left) + (guiWrapper.offsetWidth - 165) * (hidden ? -1 : 1)}px`;
  269. guiWrapper.style.pointerEvents = hidden ? "unset" : "none";
  270. hidden = !hidden;
  271. };
  272. })()
  273. }),
  274. createElement("button", {
  275. style: {
  276. height: "55px",
  277. width: "55px",
  278. fontFamily: "Nunito",
  279. color: "white",
  280. backgroundColor: "red",
  281. border: "none",
  282. fontSize: "2rem",
  283. fontWeight: "bolder",
  284. cursor: "pointer"
  285. },
  286. innerHTML: "X",
  287. onclick: close
  288. }))),
  289. (cheatContainer = createElement("div", {
  290. className: "cheatList",
  291. style: {
  292. overflowY: "scroll",
  293. background: "var(--cheatList)",
  294. boxShadow: "inset -10px 0 rgb(0 0 0 / 20%)",
  295. zIndex: "5",
  296. width: "220px",
  297. position: "absolute",
  298. top: "0",
  299. left: "0",
  300. height: "100%",
  301. fontFamily: "Titan One",
  302. color: "var(--textColor)",
  303. fontSize: "40px",
  304. textAlign: "center",
  305. paddingTop: "20px",
  306. userSelect: "none",
  307. padding: "20px 10px 20px 0",
  308. boxSizing: "border-box",
  309. display: "flex",
  310. flexDirection: "column"
  311. },
  312. innerHTML: "<span style=\"text-shadow: 1px 1px rgb(0 0 0 / 40%)\">Cheats</span>"
  313. },
  314. createElement("a", {
  315. className: "bigButton",
  316. style: {
  317. cursor: "pointer",
  318. display: "block",
  319. fontFamily: "Titan One",
  320. margin: "20px auto 10px",
  321. position: "relative",
  322. transition: ".25s",
  323. textDecoration: "none",
  324. userSelect: "none",
  325. visibility: "visible"
  326. },
  327. target: "_blank",
  328. href: "https://discord.gg/jHjGrrdXP6",
  329. innerHTML: `<div style="background: rgba(0,0,0,.25); border-radius: 5px; display: block; width: 100%; height: 100%; left: 0; top: 0; position: absolute; transform: translateY(2px); width: 100%; transition: transform .6s cubic-bezier(.3,.7,.4,1)"></div>
  330. <div style="background-color: rgb(11, 194, 207); filter: brightness(.7); position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 5px;"></div>
  331. <div style="font-weight: 400; background-color: rgb(11, 194, 207); color: white; display: flex; flex-direction: row; align-items: center; justify-content: center; text-align: center; padding: 5px; border-radius: 5px; transform: translateY(-4px); transition: transform .6s cubic-bezier(.3,.7,.4,1)">
  332. <div style="font-family: Titan One, sans-serif; color: white; font-size: 26px; text-shadow: 2px 2px rgb(0 0 0 / 20%); height: 40px; padding: 0 15px; display: flex; flex-direction: row; align-items: center; justify-content: center">
  333. <svg style="filter: drop-shadow(2px 2px 0 rgb(0 0 0 / 20%))" xmlns="http://www.w3.org/2000/svg" width="35" height="35" fill="currentColor" viewBox="0 -1 21 16">
  334. <path d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z"/>
  335. </svg>
  336. Discord
  337. </div>
  338. </div>`
  339. }))), createElement("div", {
  340. className: "contentWrapper",
  341. style: {
  342. position: "absolute",
  343. left: "220px",
  344. top: "70px",
  345. overflowY: "scroll",
  346. width: "calc(100% - 220px)",
  347. height: "calc(100% - 70px)",
  348. borderRadius: "7px"
  349. }
  350. },
  351. (content = createElement("div", {
  352. id: "content",
  353. style: {
  354. position: "absolute",
  355. inset: "27px 50px 50px 50px"
  356. }
  357. },
  358. (tooltip = createElement("div", {
  359. className: "tooltip",
  360. style: {
  361. position: "absolute",
  362. top: "0",
  363. left: "0",
  364. backgroundColor: "black",
  365. height: "fit-content",
  366. maxWidth: "300px",
  367. zIndex: "5",
  368. borderRadius: "7.5px",
  369. color: "white",
  370. display: "flex",
  371. justifyContent: "center",
  372. alignItems: "center",
  373. padding: "5px",
  374. paddingInline: "15px",
  375. pointerEvents: "none",
  376. opacity: "0",
  377. textAlign: "center"
  378. },
  379. innerText: "description"
  380. })),
  381. (cheats = createElement("div", {
  382. style: {
  383. alignItems: "center",
  384. boxSizing: "border-box",
  385. display: "flex",
  386. flexDirection: "row",
  387. flexWrap: "wrap",
  388. justifyContent: "space-evenly",
  389. padding: "20px 5px 20px",
  390. position: "relative",
  391. width: "100%",
  392. fontFamily: "Nunito, sans-serif",
  393. fontWeight: "400",
  394. color: "var(--textColor)",
  395. background: "var(--contentBackground)",
  396. boxShadow: "inset 0 -6px rgb(0 0 0 / 20%)",
  397. borderRadius: "7px"
  398. }
  399. },
  400. (headerText = createElement("div", {
  401. className: "headerText",
  402. style: {
  403. boxSizing: "border-box",
  404. display: "block",
  405. height: "45px",
  406. left: "-10px",
  407. padding: "4px 4px 8px",
  408. position: "absolute",
  409. top: "-28px",
  410. backgroundColor: "#ef7426",
  411. boxShadow: "0 4px rgb(0 0 0 / 20%), inset 0 -4px rgb(0 0 0 / 20%)",
  412. borderRadius: "7px"
  413. }
  414. },
  415. createElement("div", {
  416. style: {
  417. alignItems: "center",
  418. boxSizing: "border-box",
  419. display: "flex",
  420. height: "100%",
  421. justifyContent: "center",
  422. padding: "0 15px",
  423. width: "100%",
  424. fontFamily: "Titan One, sans-serif",
  425. fontSize: "26px",
  426. fontWeight: "400",
  427. textShadow: "-1px -1px 0 #646464, 1px -1px 0 #646464, -1px 1px 0 #646464, 2px 2px 0 #646464",
  428. color: "white",
  429. background: "linear-gradient(#fcd843,#fcd843 50%,#feb31a 50.01%,#feb31a)",
  430. borderRadius: "5px"
  431. }
  432. })
  433. ))
  434. ))
  435. ))
  436. )
  437. ))
  438. );
  439.  
  440. document.body.appendChild(guiWrapper);
  441.  
  442.  
  443. function addMode(mode, img, cheats, nameOnly) {
  444. const button = createElement("div", {
  445. className: "cheatButton",
  446. innerHTML: (typeof img == "string" ? `<img style="height: 30px; margin-right: 5px" src="${img}">` : img ? img : "") + mode,
  447. onclick: () => setCheats(button.innerText, cheats, nameOnly)
  448. });
  449. cheatContainer.appendChild(button);
  450. return button.onclick;
  451. }
  452. async function setCheats(mode, scripts, nameOnly) {
  453. cheats.innerHTML = "";
  454. headerText.firstChild.innerText = `${mode}${nameOnly ? "" : " Cheats"}`;
  455. cheats.append(headerText);
  456.  
  457. for (let i = 0; i < scripts.length; i++) {
  458. let { name, description, type, inputs, enabled, run, element } = scripts[i];
  459. let toggle = type == "toggle";
  460. if (!element) {
  461. const button = createElement("div", {
  462. className: "scriptButton",
  463. style: { background: toggle ? enabled ? "var(--enabledButton)" : "var(--disabledButton)" : "var(--defaultButton)" }
  464. }, createElement("div", {
  465. className: "cheatName",
  466. innerHTML: name
  467. }));
  468. button.dataset.description = description;
  469. button.onclick = (function ({ target, key }) {
  470. if (target != button && !target.classList.contains("cheatName") && !(key == "Enter" && target.classList.contains("cheatInput"))) return;
  471. let args = [...button.children].slice(1);
  472. run.apply(this, args.map(c => c.type == "number" ? parseInt("0" + c.value) : c.nodeName == "SELECT" ? JSON.parse(c.value) : (c.data || c.value)));
  473. if (toggle) button.style.background = this.enabled ? "var(--enabledButton)" : "var(--disabledButton)";
  474. }).bind(scripts[i]);
  475. if (inputs?.length) for (let i = 0; i < inputs.length; i++) {
  476. const { name, type, options: opts, min, max, value } = inputs[i];
  477. let options;
  478. try { options = await (typeof opts == "function" ? opts?.() : opts) } catch { options = [] };
  479. if (type == "options" && options?.length) {
  480. const select = document.createElement("select");
  481. options.forEach(opt => {
  482. const option = document.createElement("option");
  483. option.value = JSON.stringify(opt?.value != null ? opt.value : opt);
  484. option.innerHTML = opt?.name || opt;
  485. select.appendChild(option);
  486. });
  487. button.appendChild(select);
  488. } else if (type == "function") {
  489. const input = document.createElement("input");
  490. input.classList.add("cheatInput");
  491. input.placeholder = name;
  492. input.style.textAlign = "center";
  493. input.readOnly = true;
  494. let locked = false;
  495. input.onclick = async () => {
  496. if (locked) return;
  497. input.value = "Waiting for input...";
  498. locked = true;
  499. input.data = await inputs[i].function((e) => input.value = e + "...");
  500. locked = false;
  501. input.value = input.value.slice(0, -3);
  502. }
  503. button.appendChild(input);
  504. } else {
  505. const input = document.createElement("input");
  506. input.classList.add("cheatInput");
  507. if (type == "number") {
  508. input.type = "number";
  509. input.min = min;
  510. input.max = max;
  511. input.value = value || (min != null ? min : 0);
  512. };
  513. input.placeholder = name;
  514. input.style.textAlign = "center";
  515. if (toggle) input.style.backgroundColor = "#0003";
  516. input.onkeyup = button.onclick;
  517. button.appendChild(input);
  518. }
  519. };
  520. scripts[i].element = button;
  521. }
  522. cheats.appendChild(scripts[i].element);
  523. };
  524. /* scripts
  525. {
  526. name: "",
  527. description: "",
  528. type: (null | "toggle"),
  529. inputs: type == null && [{
  530. name: "",
  531. type: ("number" | "string" | "options"),
  532. options: type == "options" && [
  533. {
  534. name: "",
  535. value: undefined
  536. };
  537. ]
  538. }],
  539. enabled: type == "toggle" && Boolean,
  540. run: function () {};
  541. };
  542. */
  543. }
  544. const Cheats = {
  545. global: [
  546. {
  547. name: "Auto Answer",
  548. description: "Toggles auto answer on",
  549. type: "toggle",
  550. enabled: false,
  551. data: null,
  552. run: function () {
  553. if (!this.enabled) {
  554. this.enabled = true;
  555. this.data = setInterval(() => {
  556. const { stateNode: { state: { question, stage, feedback }, props: { client: { question: pquestion } } } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  557. const q = (question || pquestion);
  558. try {
  559. if (q.qType != "typing") if (stage !== "feedback" && !feedback) [...document.querySelectorAll(`[class*="answerContainer"]`)][q.answers.map((x, i) => q.correctAnswers.includes(x) ? i : null).filter(x => x != null)[0]]?.click?.();
  560. else document.querySelector('[class*="feedback"]')?.firstChild?.click?.();
  561. else Object.values(document.querySelector("[class*='typingAnswerWrapper']"))[1].children._owner.stateNode.sendAnswer(q.answers[0])
  562. } catch { }
  563. }, 50);
  564. } else {
  565. this.enabled = false;
  566. clearInterval(this.data);
  567. this.data = null;
  568. }
  569. }
  570. },
  571. {
  572. name: "Highlight Answers",
  573. description: "Toggles highlight answers on",
  574. type: "toggle",
  575. enabled: false,
  576. data: null,
  577. run: function () {
  578. if (!this.enabled) {
  579. this.enabled = true;
  580. this.data = setInterval(() => {
  581. const { stateNode: { state, props } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  582. [...document.querySelectorAll(`[class*="answerContainer"]`)].forEach((answer, i) => {
  583. if ((state.question || props.client.question).correctAnswers.includes((state.question || props.client.question).answers[i])) answer.style.backgroundColor = "rgb(0, 207, 119)";
  584. else answer.style.backgroundColor = "rgb(189, 15, 38)";
  585. });
  586. }, 50);
  587. } else {
  588. this.enabled = false;
  589. clearInterval(this.data);
  590. this.data = null;
  591. }
  592. }
  593. },
  594. {
  595. name: "Subtle Highlight Answers",
  596. description: "Toggles subtle highlight answers on",
  597. type: "toggle",
  598. enabled: false,
  599. data: null,
  600. run: function () {
  601. if (!this.enabled) {
  602. this.enabled = true;
  603. this.data = setInterval(() => {
  604. const { stateNode: { state, props } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  605. [...document.querySelectorAll(`[class*="answerContainer"]`)].forEach((answer, i) => {
  606. if ((state.question || props.client.question).correctAnswers.includes((state.question || props.client.question).answers[i]))
  607. answer.style.boxShadow = "unset";
  608. });
  609. }, 50);
  610. } else {
  611. this.enabled = false;
  612. clearInterval(this.data);
  613. this.data = null;
  614. }
  615. }
  616. },
  617. {
  618. name: "Percent Auto Answer",
  619. description: "Answers questions correctly or incorrectly depending on the goal grade given (Disable and re-enable to update goal)",
  620. inputs: [
  621. {
  622. name: "Target Grade",
  623. type: "number"
  624. }
  625. ],
  626. type: "toggle",
  627. enabled: false,
  628. data: null,
  629. run: function (target) {
  630. if (!this.enabled) {
  631. this.enabled = true;
  632. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  633. this.data = setInterval(TARGET => {
  634. try {
  635. const question = stateNode.state.question || stateNode.props.client.question;
  636. if (stateNode.state.stage == "feedback" || stateNode.state.feedback) return document.querySelector('[class*="feedback"], [id*="feedback"]')?.firstChild?.click?.();
  637. else if (document.querySelector("[class*='answerContainer']") || document.querySelector("[class*='typingAnswerWrapper']")) {
  638. let correct = 0, total = 0;
  639. for (let corrects in stateNode.corrects) correct += stateNode.corrects[corrects];
  640. for (let incorrect in stateNode.incorrects) total += stateNode.incorrects[incorrect];
  641. total += correct;
  642. const yes = total == 0 || Math.abs(correct / (total + 1) - TARGET) >= Math.abs((correct + 1) / (total + 1) - TARGET);
  643. if (stateNode.state.question.qType != "typing") {
  644. const answerContainers = document.querySelectorAll("[class*='answerContainer']");
  645. for (let i = 0; i < answerContainers.length; i++) {
  646. const contains = question.correctAnswers.includes(question.answers[i]);
  647. if (yes && contains || !yes && !contains) return answerContainers[i]?.click?.();
  648. }
  649. answerContainers[0].click();
  650. } else Object.values(document.querySelector("[class*='typingAnswerWrapper']"))[1].children._owner.stateNode.sendAnswer(yes ? question.answers[0] : Math.random().toString(36).substring(2));
  651. }
  652. } catch { }
  653. }, 100, (target ?? 100) / 100);
  654. } else {
  655. this.enabled = false;
  656. clearInterval(this.data);
  657. this.data = null;
  658. }
  659. },
  660. },
  661. {
  662. name: "Auto Answer",
  663. description: "Click the correct answer for you",
  664. run: function () {
  665. const { stateNode: { state: { question, stage, feedback }, props: { client: { question: pquestion } } } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  666. try {
  667. if (question.qType != "typing") if (stage !== "feedback" && !feedback) [...document.querySelectorAll(`[class*="answerContainer"]`)][(question || pquestion).answers.map((x, i) => (question || pquestion).correctAnswers.includes(x) ? i : null).filter(x => x != null)[0]]?.click?.();
  668. else document.querySelector('[class*="feedback"]')?.firstChild?.click?.();
  669. else Object.values(document.querySelector("[class*='typingAnswerWrapper']"))[1].children._owner.stateNode.sendAnswer(question.answers[0])
  670. } catch { }
  671. }
  672. },
  673. {
  674. name: "Highlight Answers",
  675. description: "Colors answers to be red or green highlighting the correct ones",
  676. run: function () {
  677. const { stateNode: { state, props } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  678. [...document.querySelectorAll(`[class*="answerContainer"]`)].forEach((answer, i) => {
  679. if ((state.question || props.client.question).correctAnswers.includes((state.question || props.client.question).answers[i])) answer.style.backgroundColor = "rgb(0, 207, 119)";
  680. else answer.style.backgroundColor = "rgb(189, 15, 38)";
  681. });
  682. }
  683. },
  684. {
  685. name: "Spam Buy Blooks",
  686. description: "Opens a box an amount of times",
  687. inputs: [
  688. {
  689. name: "Box",
  690. type: "options",
  691. options: () => Array.from(document.querySelectorAll("[class*='packsWrapper'] > div")).reduce((a, b) => {
  692. b.querySelector("[class*='blookContainer'] > img") || a.push(b.querySelector("[class*='packImgContainer'] > img").alt);
  693. return a;
  694. }, [])
  695. },
  696. {
  697. name: "Amount",
  698. type: "number"
  699. },
  700. {
  701. name: "Show Unlocks",
  702. type: "options",
  703. options: [
  704. {
  705. name: "Show Unlocks",
  706. value: true
  707. },
  708. {
  709. name: "Don't Show Unlocks",
  710. value: false
  711. }
  712. ]
  713. }
  714. ],
  715. run: async function (_box, amountToOpen, alertBlooks) {
  716. let i = document.createElement('iframe');
  717. document.body.append(i);
  718. window.alert = i.contentWindow.alert.bind(window);
  719. window.prompt = i.contentWindow.prompt.bind(window);
  720. window.confirm = i.contentWindow.confirm.bind(window);
  721. i.remove();
  722. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  723. let prices = Array.from(document.querySelectorAll("[class*='packsWrapper'] > div")).reduce((a, b) => {
  724. b.querySelector("[class*='blookContainer'] > img") || (a[b.querySelector("[class*='packImgContainer'] > img").alt] = parseInt(b.querySelector("[class*='packBottom']").textContent));
  725. return a;
  726. }, {});
  727. let box = _box.split(' ').map(str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()).join(' ');
  728. const cost = prices[box];
  729. if (!cost) return alert("I couldn't find that box!");
  730.  
  731. let amount = Math.min(Math.floor(stateNode.state.tokens / cost), amountToOpen);
  732. if (amount == 0) return alert("You do not have enough tokens!");
  733.  
  734. let blooks = {};
  735. let now = Date.now();
  736.  
  737. for (let i = 0; i < amount; i++) {
  738. await stateNode.buyPack(true, box);
  739.  
  740. blooks[stateNode.state.unlockedBlook] ||= 0;
  741. blooks[stateNode.state.unlockedBlook]++;
  742.  
  743. let before = Date.now();
  744.  
  745. now += Date.now() - before;
  746.  
  747. stateNode.setState({ canOpen: true, currentPack: "", opening: alertBlooks, doneOpening: alertBlooks, openPack: alertBlooks });
  748. clearTimeout(stateNode.canOpenTimeout);
  749. }
  750. await new Promise(r => setTimeout(r));
  751. alert(`(${Date.now() - now}ms) Results:\n${Object.entries(blooks).map(([blook, amount]) => ` ${blook} ${amount}`).join(`\n`)}`);
  752. }
  753. },
  754.  
  755. {
  756. name: "Host Any Gamemode",
  757. description: "Change the selected gamemode on the host settings page",
  758. inputs: [
  759. {
  760. name: "Gamemode",
  761. type: "options",
  762. options: ["Racing", "Classic", "Factory", "Cafe", "Defense2", "Defense", "Royale", "Gold", "Candy", "Brawl", "Hack", "Pirate", "Fish", "Dino", "Toy", "Rush"]
  763. }
  764. ],
  765. run: function (type) {
  766. let i = document.createElement('iframe');
  767. document.body.append(i);
  768. window.alert = i.contentWindow.alert.bind(window);
  769. window.prompt = i.contentWindow.prompt.bind(window);
  770. i.remove();
  771. if (location.pathname != "/host/settings") return alert("Run this script on the host settings page");
  772. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  773. stateNode.setState({ settings: { type } });
  774. }
  775. },
  776. {
  777. name: "Change Blook Ingame",
  778. description: "Changes your blook",
  779. inputs: [
  780. {
  781. name: "Blook (case sensitive)",
  782. type: "string",
  783. }
  784. ],
  785. run: function (blook) {
  786. let { props } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode;
  787. props.client.blook = blook;
  788. props.liveGameController.setVal({ path: `c/${props.client.name}/b`, val: blook });
  789. }
  790. },
  791. {
  792. name: "Get Daily Rewards",
  793. description: "Gets max daily tokens and xp",
  794. run: async function () {
  795. let i = document.createElement('iframe');
  796. document.body.append(i);
  797. window.alert = i.contentWindow.alert.bind(window);
  798. i.remove();
  799. if (!location.href.includes("play.blooket.com")) (alert("This cheat only works on play.blooket.com, opening a new tab."), window.open("https://play.blooket.com/"));
  800. else {
  801. const { t } = await fetch("https://play.blooket.com/api/playersessions/solo", {
  802. body: JSON.stringify({
  803. gameMode: "Factory",
  804. questionSetId: ["60101da869e8c70013913b59", "625db660c6842334835cb4c6", "60268f8861bd520016eae038", "611e6c804abdf900668699e3", "60ba5ff6077eb600221b7145", "642467af9b704783215c1f1b", "605bd360e35779001bf57c5e", "6234cc7add097ff1c9cff3bd", "600b1491d42a140004d5215a", "5db75fa3f1fa190017b61c0c", "5fac96fe2ca0da00042b018f", "600b14d8d42a140004d52165", "5f88953cdb209e00046522c7", "600b153ad42a140004d52172", "5fe260e72a505b00040e2a11", "5fe3d085a529560004cd3076", "5f5fc017aee59500041a1456", "608b0a5863c4f2001eed43f4", "5fad491512c8620004918ace", "5fc91a9b4ea2e200046bd49a", "5c5d06a7deebc70017245da7", "5ff767051b68750004a6fd21", "5fdcacc85d465a0004b021b9", "5fb7eea20bd44300045ba495"][Math.floor(Math.random() * 24)]
  805. }),
  806. credentials: "include",
  807. method: "POST"
  808. }).then(x => x.json());
  809. await fetch("https://play.blooket.com/api/playersessions/landings", {
  810. body: JSON.stringify({ t }),
  811. credentials: "include",
  812. method: "POST"
  813. });
  814. await fetch("https://play.blooket.com/api/playersessions/questions?t=" + t, { credentials: "include" });
  815. const { name, blook: { name: blookUsed } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.props.user.data;
  816. await fetch("https://play.blooket.com/api/users/factorystats", {
  817. body: JSON.stringify({
  818. blookUsed, t, name,
  819. cash: Math.floor(Math.random() * 90000000) + 10000000,
  820. correctAnswers: Math.floor(Math.random() * 500) + 500,
  821. upgrades: Math.floor(Math.random() * 300) + 300,
  822. mode: "Time-Solo",
  823. nameUsed: "You",
  824. place: 1,
  825. playersDefeated: 0,
  826. }),
  827. credentials: "include",
  828. method: "PUT"
  829. });
  830. fetch("https://play.blooket.com/api/users/add-rewards", {
  831. body: JSON.stringify({ t, name, addedTokens: 500, addedXp: 300 }),
  832. credentials: "include",
  833. method: "PUT"
  834. }).then(x => x.json())
  835. .then(({ dailyReward }) => alert(`Added max tokens and xp, and got ${dailyReward} daily wheel tokens!`))
  836. .catch(() => alert('There was an error when adding rewards.'));
  837. }
  838. }
  839. },
  840. {
  841. name: "Every Answer Correct",
  842. description: "Sets every answer to be correct",
  843. run: function () {
  844. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  845. stateNode.freeQuestions = stateNode.freeQuestions?.map?.(q => ({ ...q, correctAnswers: q.answers }));
  846. stateNode.questions = stateNode.questions?.map?.(q => ({ ...q, correctAnswers: q.answers }));
  847. stateNode.props.client.questions = stateNode.props.client.questions.map(q => ({ ...q, correctAnswers: q.answers }));
  848. }
  849. },
  850. {
  851. name: "Subtle Highlight Answers",
  852. description: "Removes the shadow from correct answers",
  853. run: function () {
  854. const { stateNode: { state, props } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  855. [...document.querySelectorAll(`[class*="answerContainer"]`)].forEach((answer, i) => {
  856. if ((state.question || props.client.question).correctAnswers.includes((state.question || props.client.question).answers[i]))
  857. answer.style.boxShadow = "unset";
  858. });
  859. }
  860. },
  861. {
  862. name: "Remove Name Limit",
  863. description: "Sets the name limit to 120, which is the actual max name length limit",
  864. run: function () {
  865. let i = document.createElement('iframe');
  866. document.body.append(i);
  867. window.alert = i.contentWindow.alert.bind(window);
  868. i.remove();
  869. document.querySelector('input[class*="nameInput"]').maxLength = 120; /* 120 is the actual limit */
  870. alert("Removed name length limit");
  871. }
  872. },
  873. {
  874. name: "Remove Random Name",
  875. description: "Allows you to put a custom name",
  876. run: function () {
  877. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ isRandom: false, client: { name: "" } });
  878. document.querySelector('[class*="nameInput"]')?.focus?.();
  879. }
  880. },
  881. {
  882. name: "Sell Duplicate Blooks",
  883. description: "Sell all duplicate blooks leaving you with 1 each",
  884. run: async function () {
  885. let i = document.createElement('iframe');
  886. document.body.append(i);
  887. window.alert = i.contentWindow.alert.bind(window);
  888. window.confirm = i.contentWindow.confirm.bind(window);
  889. i.remove();
  890. if (/dashboard.*\/blooks/.test(window.location.href)) {
  891. if (confirm(`Are you sure you want to sell your dupes? (Legendaries and rarer will not be sold)`)) {
  892. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  893. let now = Date.now(), results = "";
  894. for (const blook in stateNode.state.blookData) if (stateNode.state.blookData[blook] > 1) {
  895. stateNode.setState({ blook, numToSell: stateNode.state.blookData[blook] - 1 });
  896. if (["Legendary", "Chroma", "Mystical"].includes(document.querySelector("[class*='highlightedRarity']").innerText.trim())) continue;
  897. results += ` ${blook} ${stateNode.state.blookData[blook] - 1}\n`;
  898. await stateNode.sellBlook({ preventDefault: () => { } }, true);
  899. }
  900. alert(`(${Date.now() - now}ms) Results:\n${results.trim()}`);
  901. }
  902. } else alert("This can only be ran in the Blooks page.");
  903. }
  904. },
  905. ],
  906. voyage: [
  907. {
  908. name: "Max Levels",
  909. description: "Maxes out all islands and your boat",
  910. run: function () {
  911. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  912. stateNode.setState({ islandLevels: new Array(stateNode.state.islandLevels.length).fill(5) }, stateNode.updateBoatLevel);
  913. }
  914. },
  915. {
  916. name: "Set Doubloons",
  917. description: "Sets Doubloons",
  918. inputs: [{
  919. name: "Amount",
  920. type: "number"
  921. }],
  922. run: function (doubloons) {
  923. let i = document.createElement('iframe');
  924. document.body.append(i);
  925. window.prompt = i.contentWindow.prompt.bind(window);
  926. i.remove();
  927. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  928. stateNode.setState({ doubloons });
  929. stateNode.props.liveGameController.setVal({
  930. path: `c/${stateNode.props.client.name}/d`,
  931. val: doubloons
  932. });
  933. }
  934. },
  935. {
  936. name: "Start Heist",
  937. description: "Starts a heist on someone",
  938. inputs: [{
  939. name: "Player",
  940. type: "options",
  941. options: () => {
  942. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  943. return new Promise(res => stateNode.props.liveGameController._liveApp ? stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players))) : res([]));
  944. }
  945. }],
  946. run: function (target) {
  947. let i = document.createElement('iframe');
  948. document.body.append(i);
  949. window.prompt = i.contentWindow.prompt.bind(window);
  950. i.remove();
  951. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  952.  
  953. stateNode.props.liveGameController.getDatabaseVal("c", function (val) {
  954. const players = Object.entries(val || {}).reduce((a, [name, c]) => (name != stateNode.props.client.name && a.push({ name, blook: c.b, doubloons: c.d || 0 }), a), []);
  955. if (players.length === 0) {
  956. stateNode.questionsToAnswer = 1;
  957. return void stateNode.randomQ();
  958. }
  959. const { name, blook, doubloons } = players.find(x => x.name == target) || players.sort((a, b) => b.doubloons - a.doubloons)[0];
  960. stateNode.setState({
  961. stage: "heist",
  962. heistInfo: { name, blook },
  963. prizeAmount: Math.max(1000, doubloons)
  964. });
  965. });
  966. }
  967. },
  968. {
  969. name: "Swap Doubloons",
  970. description: "Swaps Doubloons with someone",
  971. inputs: [{
  972. name: "Player",
  973. type: "options",
  974. options: () => {
  975. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  976. return new Promise(res => stateNode.props.liveGameController._liveApp ? stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players))) : res([]));
  977. }
  978. }],
  979. run: async function (player) {
  980. let i = document.createElement('iframe');
  981. document.body.append(i);
  982. window.prompt = i.contentWindow.prompt.bind(window);
  983. i.remove();
  984. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  985. let players = Object.entries(await new Promise(r => stateNode.props.liveGameController.getDatabaseVal("c", r))).sort((a, b) => b[1].d - a[1].d).filter(x => x[0] != stateNode.props.client.name),
  986. target = players.find(x => x[0] == player) || players[0];
  987. stateNode.props.liveGameController.setVal({
  988. path: `c/${stateNode.props.client.name}`,
  989. val: {
  990. b: stateNode.props.client.blook,
  991. d: target[1].d,
  992. tat: `${target[0]}:${target[1].d - stateNode.state.doubloons}`
  993. }
  994. });
  995. stateNode.setState({ doubloons: target[1].d });
  996. }
  997. },
  998. {
  999. name: "Take Doubloons",
  1000. description: "Takes Doubloons from someone",
  1001. inputs: [{
  1002. name: "Player",
  1003. type: "options",
  1004. options: () => {
  1005. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1006. return new Promise(res => stateNode.props.liveGameController._liveApp ? stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players))) : res([]));
  1007. }
  1008. }],
  1009. run: async function (player) {
  1010. let i = document.createElement('iframe');
  1011. document.body.append(i);
  1012. window.prompt = i.contentWindow.prompt.bind(window);
  1013. i.remove();
  1014. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1015. let players = Object.entries(await new Promise(r => stateNode.props.liveGameController.getDatabaseVal("c", r))).sort((a, b) => b[1].d - a[1].d).filter(x => x[0] != stateNode.props.client.name),
  1016. target = players.find(x => x[0] == player) || players[0];
  1017. stateNode.setState({ doubloons: stateNode.state.doubloons + target[1].d });
  1018. stateNode.props.liveGameController.setVal({
  1019. path: `c/${stateNode.props.client.name}`,
  1020. val: {
  1021. b: stateNode.props.client.blook,
  1022. d: target[1].d,
  1023. tat: `${target[0]}:${target[1].d}`
  1024. }
  1025. });
  1026. }
  1027. }
  1028. ],
  1029. brawl: [
  1030. {
  1031. name: "Double Enemy XP",
  1032. description: "Doubles enemy XP drop value",
  1033. run: function () {
  1034. for (const collider of Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.physics.world.colliders._active.filter(x => x.callbackContext?.toString().includes('dmgCd'))) {
  1035. const enemies = collider.object2;
  1036. let _start = enemies.classType.prototype.start;
  1037. enemies.classType.prototype.start = function () { _start.apply(this, arguments), this.val *= 2 }
  1038. enemies.children.entries.forEach(e => e.val *= 2);
  1039. }
  1040. }
  1041. },
  1042. {
  1043. name: "Half Enemy Speed",
  1044. description: "Makes enemies move 2x slower",
  1045. run: function () {
  1046. for (const collider of Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.physics.world.colliders._active.filter(x => x.callbackContext?.toString().includes('dmgCd'))) {
  1047. const enemies = collider.object2;
  1048. let _start = enemies.classType.prototype.start;
  1049. enemies.classType.prototype.start = function () { _start.apply(this, arguments), this.speed *= .5 }
  1050. enemies.children.entries.forEach(e => e.speed *= .5);
  1051. }
  1052. }
  1053. },
  1054. {
  1055. name: "Instant Kill",
  1056. description: "Sets all enemies health to 1",
  1057. run: function () {
  1058. for (const collider of Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.physics.world.colliders._active.filter(x => x.callbackContext?.toString().includes('dmgCd'))) {
  1059. const enemies = collider.object2;
  1060. let _start = enemies.classType.prototype.start;
  1061. enemies.classType.prototype.start = function () { _start.apply(this, arguments), this.hp = 1 }
  1062. enemies.children.entries.forEach(e => e.hp = 1);
  1063. }
  1064. }
  1065. },
  1066. {
  1067. name: "Invincibility",
  1068. description: "Makes you invincible",
  1069. run: function () {
  1070. for (const collider of Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.physics.world.colliders._active.filter(x => x.callbackContext?.toString().includes('invulnerableTime') || x.callbackContext?.toString().includes('dmgCd'))) collider.collideCallback = () => { };
  1071. }
  1072. },
  1073. {
  1074. name: "Magnet",
  1075. description: "Pulls all xp towards you",
  1076. run: function () {
  1077. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.physics.world.colliders._active.find(x => x.collideCallback?.toString().includes('0x5dc)')).collideCallback({ active: true }, { active: true, setActive() { }, setVisible() { } });
  1078. }
  1079. },
  1080. {
  1081. name: "Max Current Abilities",
  1082. description: "Maxes out all your current abilities",
  1083. run: function () {
  1084. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1085. for (const [ability, level] of Object.entries(stateNode.state.abilities)) for (let i = 0; i < (10 - level); i++) stateNode.state.game.scene.game.events.emit("level up", ability, stateNode.state.abilities[ability]++);
  1086. stateNode.setState({
  1087. level: stateNode.state.game.scene.level = [1, 3, 5, 10, 15, 25, 35].sort((a, b) => Math.abs(a - stateNode.state.level) - Math.abs(b - stateNode.state.level))[0] - 1
  1088. });
  1089. }
  1090. },
  1091. {
  1092. name: "Next Level",
  1093. description: "Skips to the next level",
  1094. run: function () {
  1095. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1096. let { object1: player, object2: xp } = stateNode.state.game.scene.physics.world.colliders._active.find(x => x.collideCallback?.toString().includes("emit']('xp"));
  1097. xp.get().spawn(player.x, player.y, ((e) => 1 === e ? 1 : e < 5 ? 5 : e < 10 ? 10 : e < 20 ? 20 : e < 30 ? 30 : e < 40 ? 40 : e < 50 ? 50 : 100)(stateNode.state.level) - stateNode.xp);
  1098. }
  1099. },
  1100. {
  1101. name: "Remove Obstacles",
  1102. description: "Removes all rocks and obstacles",
  1103. run: function () {
  1104. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.physics.world.bodies.entries.forEach(body => {
  1105. try {
  1106. if (body.gameObject.frame.texture.key.includes("obstacle")) body.gameObject.destroy();
  1107. } catch { }
  1108. });
  1109. }
  1110. },
  1111. {
  1112. name: "Kill Enemies",
  1113. description: "Kills all current enemies",
  1114. run: function () {
  1115. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.physics.world.bodies.entries.forEach(x => x?.gameObject?.receiveDamage?.(x.gameObject.hp, 1));
  1116. }
  1117. },
  1118. {
  1119. name: "Reset Health",
  1120. description: "Resets health and gives invincibility for 3 seconds",
  1121. run: function () {
  1122. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.game.scene.game.events._events.respawn.fn();
  1123. }
  1124. }
  1125. ],
  1126. cafe: [
  1127. {
  1128. name: "Max Items",
  1129. description: "Maxes out items in the shop (Only usable in the shop)",
  1130. run: function () {
  1131. let i = document.createElement('iframe');
  1132. document.body.append(i);
  1133. window.alert = i.contentWindow.alert.bind(window);
  1134. i.remove();
  1135. if (window.location.pathname !== "/cafe/shop") alert("This can only be run in the shop");
  1136. else {
  1137. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1138. stateNode.setState({ items: Object.fromEntries(Object.entries(stateNode.state.items).map(x => [x[0], 5])) });
  1139. }
  1140. }
  1141. },
  1142. {
  1143. name: "Remove Customers",
  1144. description: "Skips the current customers (Not usable in the shop)",
  1145. run: function () {
  1146. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1147. stateNode.state.customers.forEach((customer, i) => Object.keys(customer).length && stateNode.removeCustomer(i, true));
  1148. }
  1149. },
  1150. {
  1151. name: "Reset Abilities",
  1152. description: "Resets used abilities in shop (Only usable in the shop)",
  1153. run: function () {
  1154. let i = document.createElement('iframe');
  1155. document.body.append(i);
  1156. window.alert = i.contentWindow.alert.bind(window);
  1157. i.remove();
  1158. if (window.location.pathname !== "/cafe/shop") alert("This can only be run in the shop");
  1159. else {
  1160. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1161. stateNode.setState({ abilities: Object.fromEntries(Object.entries(stateNode.state.abilities).map(x => [x[0], 5])) });
  1162. }
  1163. }
  1164. },
  1165. {
  1166. name: "Set Cash",
  1167. description: "Sets cafe cash",
  1168. inputs: [{
  1169. name: "Amount",
  1170. type: "number"
  1171. }],
  1172. run: function (cafeCash) {
  1173. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1174. stateNode.setState({ cafeCash });
  1175. stateNode.props.liveGameController.setVal({
  1176. path: `c/${stateNode.props.client.name}`,
  1177. val: {
  1178. b: stateNode.props.client.blook,
  1179. ca: cafeCash
  1180. }
  1181. });
  1182. }
  1183. },
  1184. {
  1185. name: "Stock Food",
  1186. description: "Stocks all food to 99 (Not usable in the shop)",
  1187. run: function () {
  1188. let i = document.createElement('iframe');
  1189. document.body.append(i);
  1190. window.alert = i.contentWindow.alert.bind(window);
  1191. i.remove();
  1192. if (window.location.pathname !== "/cafe") alert("This can't be run in the shop");
  1193. else {
  1194. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1195. stateNode.setState({ foods: stateNode.state.foods.map(e => ({ ...e, stock: 99, level: 5 })) });
  1196. }
  1197. }
  1198. }
  1199. ],
  1200. crypto: [
  1201. {
  1202. name: "Choice ESP",
  1203. description: "Shows what each choice will give you",
  1204. type: "toggle",
  1205. enabled: false,
  1206. data: null,
  1207. run: function () {
  1208. if (!this.enabled) {
  1209. this.enabled = true;
  1210. this.data = setInterval(() => {
  1211. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1212. let { text } = stateNode.state.choices[0];
  1213. let chest = document.querySelector('[class^=styles__feedbackContainer___]');
  1214. if (chest.children.length <= 4) {
  1215. let choice = document.createElement('div');
  1216. choice.style.color = "white";
  1217. choice.style.fontFamily = "Inconsolata,Helvetica,monospace,sans-serif";
  1218. choice.style.fontSize = "2em";
  1219. choice.style.display = "flex";
  1220. choice.style.justifyContent = "center";
  1221. choice.style.marginTop = "675px";
  1222. choice.innerText = text;
  1223. chest.append(choice);
  1224. }
  1225. }, 50);
  1226. } else {
  1227. this.enabled = false;
  1228. clearInterval(this.data);
  1229. this.data = null;
  1230. }
  1231. }
  1232. },
  1233. {
  1234. name: "Password ESP",
  1235. description: "Highlights the correct password",
  1236. type: "toggle",
  1237. enabled: false,
  1238. data: null,
  1239. run: function () {
  1240. if (!this.enabled) {
  1241. this.enabled = true;
  1242. this.data = setInterval(() => {
  1243. let { state } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode;
  1244. if (state.stage == "hack") [...document.querySelector('div[class^=styles__buttonContainer]').children].forEach(button => {
  1245. if (button.innerText == state.correctPassword) return;
  1246. button.style.outlineColor = "rgba(255, 64, 64, 0.8)";
  1247. button.style.backgroundColor = "rgba(255, 64, 64, 0.8)";
  1248. button.style.textShadow = "0 0 1px #f33";
  1249. });
  1250. }, 50);
  1251. } else {
  1252. this.enabled = false;
  1253. clearInterval(this.data);
  1254. this.data = null;
  1255. }
  1256. }
  1257. },
  1258. {
  1259. name: "Always Triple",
  1260. description: "Always get triple crypto",
  1261. type: "toggle",
  1262. enabled: false,
  1263. data: null,
  1264. run: function () {
  1265. if (!this.enabled) {
  1266. this.enabled = true;
  1267. this.data = setInterval(() => Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ choices: [{ type: "mult", val: 3, rate: .075, blook: "Brainy Bot", text: "Triple Crypto" }] }), 50);
  1268. } else {
  1269. this.enabled = false;
  1270. clearInterval(this.data);
  1271. this.data = null;
  1272. }
  1273. }
  1274. },
  1275. {
  1276. name: "Auto Guess",
  1277. description: "Automatically guess the correct password",
  1278. type: "toggle",
  1279. enabled: false,
  1280. data: null,
  1281. run: function () {
  1282. if (!this.enabled) {
  1283. this.enabled = true;
  1284. this.data = setInterval(() => {
  1285. let { state } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode;
  1286. if (state.stage == "hack") for (const button of document.querySelector('div[class^=styles__buttonContainer]').children) button.innerText == state.correctPassword && button.click();
  1287. }, 50);
  1288. } else {
  1289. this.enabled = false;
  1290. clearInterval(this.data);
  1291. this.data = null;
  1292. }
  1293. }
  1294. },
  1295. {
  1296. name: "Remove Hack",
  1297. description: "Removes an attacking hack",
  1298. run: function () {
  1299. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ hack: "" });
  1300. }
  1301. },
  1302. {
  1303. name: "Set Crypto",
  1304. description: "Sets crypto",
  1305. inputs: [{
  1306. name: "Amount",
  1307. type: "number"
  1308. }],
  1309. run: function (amount) {
  1310. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1311. stateNode.setState({ crypto: amount, crypto2: amount });
  1312. stateNode.props.liveGameController.setVal({
  1313. path: "c/".concat(stateNode.props.client.name),
  1314. val: {
  1315. b: stateNode.props.client.blook,
  1316. p: stateNode.state.password,
  1317. cr: amount
  1318. }
  1319. });
  1320. }
  1321. },
  1322. {
  1323. name: "Set Password",
  1324. description: "Sets hacking password",
  1325. inputs: [{
  1326. name: "Custom Password",
  1327. type: "string"
  1328. }],
  1329. run: function (password) {
  1330. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1331. stateNode.setState({ password });
  1332. stateNode.props.liveGameController.setVal({
  1333. path: "c/".concat(stateNode.props.client.name),
  1334. val: {
  1335. b: stateNode.props.client.blook,
  1336. p: password,
  1337. cr: stateNode.state.crypto
  1338. }
  1339. });
  1340. }
  1341. },
  1342. {
  1343. name: "Steal Player's Crypto",
  1344. description: "Steals all of someone's crypto",
  1345. inputs: [{
  1346. name: "Player",
  1347. type: "options",
  1348. options: () => {
  1349. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1350. return new Promise(res => stateNode.props.liveGameController._liveApp ? stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players))) : res([]));
  1351. }
  1352. }],
  1353. run: function (target) {
  1354. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1355. stateNode.props.liveGameController.getDatabaseVal("c", (players) => {
  1356. if (players && Object.keys(players).map(x => x.toLowerCase()).includes(target.toLowerCase())) {
  1357. let [player, { cr }] = Object.entries(players).find(([name]) => name.toLowerCase() == target.toLowerCase());
  1358. stateNode.setState({ crypto: stateNode.state.crypto + cr, crypto2: stateNode.state.crypto + cr });
  1359. stateNode.props.liveGameController.setVal({
  1360. path: "c/".concat(stateNode.props.client.name),
  1361. val: {
  1362. b: stateNode.props.client.blook,
  1363. p: stateNode.state.password,
  1364. cr: stateNode.state.crypto + cr,
  1365. tat: `${player}:${cr}`
  1366. }
  1367. });
  1368. }
  1369. });
  1370. }
  1371. }
  1372. ],
  1373. defense: [
  1374. {
  1375. name: "Earthquake",
  1376. description: "Shuffles around towers",
  1377. run: function () {
  1378. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1379. stateNode.setState({
  1380. eventName: "Earthquake",
  1381. event: {
  1382. short: "e",
  1383. color: "#805500",
  1384. icon: "fas fa-mountain",
  1385. desc: "All of your towers get mixed up",
  1386. rate: .02
  1387. },
  1388. buyTowerName: "",
  1389. buyTower: {}
  1390. }, () => stateNode.eventTimeout = setTimeout(() => stateNode.setState({ event: {}, eventName: "" }), 6e3));
  1391. stateNode.tiles.forEach(row => row.forEach((col, i) => col === 3 && (row[i] = 0)));
  1392. let tiles = stateNode.tiles.flatMap((_, y) => _.map((__, x) => __ === 0 && ({ x, y }))).filter(Boolean).sort(() => .5 - Math.random());
  1393. stateNode.towers.forEach(tower => {
  1394. let { x, y } = tiles.shift();
  1395. tower.move(x, y, stateNode.tileSize);
  1396. stateNode.tiles[y][x] = 3;
  1397. });
  1398. }
  1399. },
  1400. {
  1401. name: "Max Tower Stats",
  1402. description: "Makes all placed towers overpowered",
  1403. run: function () {
  1404. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1405. stateNode.towers.forEach(tower => {
  1406. tower.range = 100;
  1407. tower.fullCd = tower.cd = 0;
  1408. tower.damage = 1e6;
  1409. });
  1410. }
  1411. },
  1412. {
  1413. name: "Remove Ducks",
  1414. description: "Removes ducks",
  1415. run: function () {
  1416. let { stateNode: { ducks, tiles } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1417. ducks.forEach(x => { tiles[x.y][x.x] = 0; });
  1418. ducks.length = 0;
  1419. }
  1420. },
  1421. {
  1422. name: "Remove Enemies",
  1423. description: "Removes all the enemies",
  1424. run: function () {
  1425. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1426. stateNode.enemies = stateNode.futureEnemies = [];
  1427. }
  1428. },
  1429. {
  1430. name: "Remove Obstacles",
  1431. description: "Lets you place towers anywhere",
  1432. run: function () {
  1433. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1434. stateNode.tiles = stateNode.tiles.map(row => row.fill(0));
  1435. }
  1436. },
  1437. {
  1438. name: "Set Damage",
  1439. description: "Sets damage",
  1440. inputs: [{
  1441. name: "Damage",
  1442. type: "number"
  1443. }],
  1444. run: function (dmg) {
  1445. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.dmg = dmg;
  1446. }
  1447. },
  1448. {
  1449. name: "Set Round",
  1450. description: "Sets the current round",
  1451. inputs: [{
  1452. name: "Round",
  1453. type: "number"
  1454. }],
  1455. run: function (round) {
  1456. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ round });
  1457. }
  1458. },
  1459. {
  1460. name: "Set Tokens",
  1461. description: "Sets the amount of tokens you have",
  1462. inputs: [{
  1463. name: "Tokens",
  1464. type: "number"
  1465. }],
  1466. run: function (tokens) {
  1467. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ tokens });
  1468. }
  1469. }
  1470. ],
  1471. defense2: [
  1472. {
  1473. name: "Max Tower Stats",
  1474. description: "Makes all placed towers overpowered",
  1475. run: function () {
  1476. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.towers.forEach(tower => {
  1477. tower.stats.dmg = 1e6;
  1478. tower.stats.fireRate = 50;
  1479. tower.stats.ghostDetect = true;
  1480. tower.stats.maxTargets = 1e6;
  1481. tower.stats.numProjectiles &&= 100;
  1482. tower.stats.range = 100;
  1483. if (tower.stats.auraBuffs) for (const buff in tower.stats.auraBuffs) tower.stats.auraBuffs[buff] *= 100;
  1484. });
  1485. }
  1486. },
  1487. {
  1488. name: "Kill Enemies",
  1489. description: "Kills all the enemies",
  1490. run: function () {
  1491. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1492. stateNode.state.game.scene.enemyQueue.length = 0;
  1493. stateNode.state.game.scene.physics.world.bodies.entries.forEach(x => x?.gameObject?.receiveDamage?.(x.gameObject.hp, 1));
  1494. }
  1495. },
  1496. {
  1497. name: "Set Coins",
  1498. description: "Sets coins",
  1499. inputs: [{
  1500. name: "Coins",
  1501. type: "number"
  1502. }],
  1503. run: function (coins) {
  1504. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ coins });
  1505. }
  1506. },
  1507. {
  1508. name: "Set Health",
  1509. description: "Sets the amount of health you have",
  1510. inputs: [{
  1511. name: "Health",
  1512. type: "number"
  1513. }],
  1514. run: function (health) {
  1515. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ health });
  1516. }
  1517. },
  1518. {
  1519. name: "Set Round",
  1520. description: "Sets the current round",
  1521. inputs: [{
  1522. name: "Round",
  1523. type: "number"
  1524. }],
  1525. run: function (round) {
  1526. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ round });
  1527. }
  1528. },
  1529. ],
  1530. dinos: [
  1531. {
  1532. name: "Auto Choose",
  1533. description: "Automatically choose the best fossil when excavating",
  1534. type: "toggle",
  1535. enabled: false,
  1536. data: null,
  1537. rand(e, t) {
  1538. const s = [];
  1539. while (s.length < t) {
  1540. const i = Math.random();
  1541. let r = 0, g = null;
  1542. for (let o = 0; o < e.length; o++) {
  1543. r += e[o].rate;
  1544. if (r >= i) {
  1545. g = e[o];
  1546. break;
  1547. }
  1548. }
  1549. g && !s.includes(g) && s.push(g)
  1550. }
  1551. return s;
  1552. },
  1553. run: function () {
  1554. if (!this.enabled) {
  1555. this.enabled = true;
  1556. const getFossils = () => this.rand([{ type: "fossil", val: 10, rate: .1, blook: "Amber" }, { type: "fossil", val: 25, rate: .1, blook: "Dino Egg" }, { type: "fossil", val: 50, rate: .175, blook: "Dino Fossil" }, { type: "fossil", val: 75, rate: .175, blook: "Stegosaurus" }, { type: "fossil", val: 100, rate: .15, blook: "Velociraptor" }, { type: "fossil", val: 125, rate: .125, blook: "Brontosaurus" }, { type: "fossil", val: 250, rate: .075, blook: "Triceratops" }, { type: "fossil", val: 500, rate: .025, blook: "Tyrannosaurus Rex" }, { type: "mult", val: 1.5, rate: .05 }, { type: "mult", val: 2, rate: .025 }], 3);
  1557. this.data = setInterval(() => {
  1558. try {
  1559. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1560. if (stateNode.state.stage === "excavate") {
  1561. stateNode.state.choices.length || (stateNode.state.choices = getFossils());
  1562. let max = 0, index = -1;
  1563. for (let i = 0; i < stateNode.state.choices.length; i++) {
  1564. const { type, val } = stateNode.state.choices[i];
  1565. const value = (type == "fossil" ? stateNode.state.fossils + val * stateNode.state.fossilMult : stateNode.state.fossils * val) || 0;
  1566. if (value <= max && type != "mult") continue;
  1567. max = value, index = i + 1;
  1568. }
  1569. document.querySelector('div[class^="styles__rockRow"] > div[role="button"]:nth-child(' + index + ')').click();
  1570. }
  1571. } catch { }
  1572. }, 50);
  1573. } else {
  1574. this.enabled = false;
  1575. clearInterval(this.data);
  1576. this.data = null;
  1577. }
  1578. }
  1579. },
  1580. {
  1581. name: "Rock ESP",
  1582. description: "Shows what is under the rocks",
  1583. type: "toggle",
  1584. enabled: false,
  1585. data: null,
  1586. run: function () {
  1587. const exps = ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"];
  1588. const getExpAscii = (num) => {
  1589. let res = "";
  1590. while (num > 0) {
  1591. res = exps[num % 10] + res;;
  1592. num = ~~(num / 10);
  1593. }
  1594. return res;
  1595. };
  1596.  
  1597. const shortNum = (value) => {
  1598. let newValue = value.toString();
  1599. if (value >= 1000) {
  1600. const suffixes = ["", "K", "M", "B", "T"];
  1601. const suffixNum = ~~((digits(value) - 1) / 3);
  1602. if (suffixNum < suffixes.length) {
  1603. let shortValue = "";
  1604. for (let precision = 3; precision >= 1; precision--) {
  1605. shortValue = parseFloat((suffixNum !== 0 ? value / 1000 ** suffixNum : value).toPrecision(precision)).toString();
  1606. const dotLessShortValue = shortValue.replace(/[^a-zA-Z 0-9]+/g, "");
  1607. if (dotLessShortValue.length <= 3) break;
  1608. }
  1609. if (Number(shortValue) % 1 !== 0) shortValue = Number(shortValue).toFixed(1);
  1610. newValue = shortValue + suffixes[suffixNum];
  1611. } else {
  1612. let num = value;
  1613. let exp = 0;
  1614. while (num >= 100) {
  1615. num = Math.floor(num / 10);
  1616. exp += 1;
  1617. }
  1618. newValue = `${num / 10} × 10${getExpAscii(exp + 1)}`;
  1619. }
  1620. }
  1621. return newValue;
  1622. };
  1623. if (!this.enabled) {
  1624. this.enabled = true;
  1625. this.data = setInterval(() => {
  1626. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1627. const rocks = [...document.querySelector('[class*="rockButton"]').parentElement.children];
  1628. if (!rocks.every(element => element.querySelector('div'))) stateNode.setState({
  1629. choices: [{ type: "fossil", val: 10, rate: .1, blook: "Amber" }, { type: "fossil", val: 25, rate: .1, blook: "Dino Egg" }, { type: "fossil", val: 50, rate: .175, blook: "Dino Fossil" }, { type: "fossil", val: 75, rate: .175, blook: "Stegosaurus" }, { type: "fossil", val: 100, rate: .15, blook: "Velociraptor" }, { type: "fossil", val: 125, rate: .125, blook: "Brontosaurus" }, { type: "fossil", val: 250, rate: .075, blook: "Triceratops" }, { type: "fossil", val: 500, rate: .025, blook: "Tyrannosaurus Rex" }, { type: "mult", val: 1.5, rate: .05 }, { type: "mult", val: 2, rate: .025 }].sort(() => 0.5 - Math.random()).slice(0, 3)
  1630. }, () => {
  1631. rocks.forEach((element, index) => {
  1632. const rock = stateNode.state.choices[index];
  1633. if (element.querySelector('div')) element.querySelector('div').remove();
  1634. const choice = document.createElement("div");
  1635. choice.style.color = "white";
  1636. choice.style.fontFamily = "Macondo";
  1637. choice.style.fontSize = "1em";
  1638. choice.style.display = "flex";
  1639. choice.style.justifyContent = "center";
  1640. choice.style.transform = "translateY(25px)";
  1641. choice.innerText = rock.type === "fossil" ? `+${Math.round(rock.val * stateNode.state.fossilMult) > 99999999 ? shortNum(Math.round(rock.val * stateNode.state.fossilMult)) : Math.round(rock.val * stateNode.state.fossilMult)} Fossils` : `x${rock.val} Fossils Per Excavation`;;
  1642. element.append(choice);
  1643. });
  1644. });
  1645. }, 50);
  1646. } else {
  1647. this.enabled = false;
  1648. clearInterval(this.data);
  1649. this.data = null;
  1650. }
  1651. }
  1652. },
  1653. {
  1654. name: "Set Fossils",
  1655. description: "Sets the amount of fossils you have",
  1656. inputs: [{
  1657. name: "Fossils",
  1658. type: "number"
  1659. }],
  1660. run: function (fossils) {
  1661. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1662. stateNode.setState({ fossils });
  1663. stateNode.props.liveGameController.setVal({
  1664. path: `c/${stateNode.props.client.name}`,
  1665. val: {
  1666. b: stateNode.props.client.blook,
  1667. f: fossils,
  1668. ic: stateNode.state.isCheating
  1669. }
  1670. });
  1671. }
  1672. },
  1673. {
  1674. name: "Set Multiplier",
  1675. description: "Sets fossil multiplier",
  1676. inputs: [{
  1677. name: "Multiplier",
  1678. type: "number"
  1679. }],
  1680. run: function (fossilMult) {
  1681. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1682. stateNode.setState({ fossilMult });
  1683. }
  1684. },
  1685. {
  1686. name: "Stop Cheating",
  1687. description: "Undoes cheating so that you can't be caught",
  1688. run: function () {
  1689. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1690. stateNode.setState({ isCheating: false });
  1691. stateNode.props.liveGameController.setVal({
  1692. path: `c/${stateNode.props.client.name}/ic`,
  1693. val: false
  1694. });
  1695. }
  1696. }
  1697. ],
  1698. doom: [
  1699. {
  1700. name: "Fill Deck",
  1701. description: "Fills your deck with every maxed out card and artifact (Only works on towers page)",
  1702. run: function () {
  1703. let i = document.createElement('iframe');
  1704. document.body.append(i);
  1705. window.alert = i.contentWindow.alert.bind(window);
  1706. i.remove();
  1707. if (window.location.pathname == "/tower/map") {
  1708. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1709. stateNode.props.tower.artifacts = "Medical Kit|Fury Relic|Survival Guide|Steel Socks|Piggy Bank|Lucky Feather|Coupon|Cheese|Tasty Egg|Training Weights|Mighty Shield|Toxic Waste|Lifeline Totem|Cursed Hourglass|Band-Aid|Elder Coins|Captain's Anchor|Chess Pieces|Pink Hippo|Anorak's Wizard Cap|Dave's Doggo|Anubis' Obelisk|Farm Tractor|Magic Seedling|Just A Bone|Cozy Igloo|King's Crown|Sacred Scroll".split("|");
  1710. stateNode.props.tower.cards = 'Chick,🌽|Chicken,🌽|Cow,🌽|Goat,🌽|Horse,🌽|Pig,🌽|Sheep,🌽|Duck,🌽|Dog,🌽|Cat,🐾|Rabbit,🐾|Goldfish,🐾|Hamster,🐾|Turtle,🐾|Kitten,🐾|Puppy,🐾|Bear,🌲|Moose,🌲|Fox,🌲|Raccoon,🌲|Squirrel,🌲|Owl,🌲|Hedgehog,🌲|Baby Penguin,❄️|Penguin,❄️|Arctic Fox,❄️|Snowy Owl,❄️|Polar Bear,❄️|Arctic Hare,❄️|Seal,❄️|Walrus,❄️|Tiger,🌴|Panther,🌴|Cockatoo,🌴|Orangutan,🌴|Anaconda,🌴|Macaw,🌴|Jaguar,🌴|Capuchin,🌴|Toucan,🌴|Parrot,🌴|Elf,⚔️|Witch,⚔️|Wizard,⚔️|Fairy,⚔️|Slime Monster,⚔️|Jester,⚔️|Dragon,⚔️|Unicorn,⚔️|Queen,⚔️|King,⚔️|Snow Globe,☃️|Holiday Gift,☃️|Hot Chocolate,☃️|Gingerbread Man,☃️|Gingerbread House,☃️|Holiday Wreath,☃️|Snowman,☃️|Santa Claus,☃️|Two of Spades,🏰|Eat Me,🏰|Drink Me,🏰|Alice,🏰|Queen of Hearts,🏰|Dormouse,🏰|White Rabbit,🏰|Cheshire Cat,🏰|Caterpillar,🏰|Mad Hatter,🏰|King of Hearts,🏰'.split("|").map(x => {
  1711. const [blook, c] = x.split(",");
  1712. return { strength: 20, charisma: 20, wisdom: 20, class: c, blook };
  1713. });
  1714. try { stateNode.props.addTowerNode(); } catch { }
  1715. stateNode.setState({ showDeck: false });
  1716. } else alert("You need to be on the map to run this cheat!");
  1717. }
  1718. },
  1719. {
  1720. name: "Max Cards",
  1721. description: "Maxes out all the cards in your deck",
  1722. run: function () {
  1723. let i = document.createElement('iframe');
  1724. document.body.append(i);
  1725. window.alert = i.contentWindow.alert.bind(window);
  1726. i.remove();
  1727. if (window.location.pathname == "/tower/map") {
  1728. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1729. stateNode.props.tower.cards.forEach(card => {
  1730. card.strength = 20;
  1731. card.charisma = 20;
  1732. card.wisdom = 20;
  1733. });
  1734. } else alert("You need to be on the map to run this cheat!");
  1735. }
  1736. },
  1737. {
  1738. name: "Max Health",
  1739. description: "Fills the player's health",
  1740. run: function () {
  1741. let i = document.createElement('iframe');
  1742. document.body.append(i);
  1743. window.alert = i.contentWindow.alert.bind(window);
  1744. i.remove();
  1745. if (window.location.pathname == "/tower/battle") Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ myHealth: 100 });
  1746. else alert("You need to be in battle to run this cheat!");
  1747. }
  1748. },
  1749. {
  1750. name: "Max Card Stats",
  1751. description: "Maxes out player's current card (Only works on attribute select page)",
  1752. run: function () {
  1753. let i = document.createElement('iframe');
  1754. document.body.append(i);
  1755. window.alert = i.contentWindow.alert.bind(window);
  1756. i.remove();
  1757. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1758. if (stateNode.state.phase !== 'select') alert('You must be on the attribute selection page!');
  1759. else stateNode.setState({ myCard: { ...stateNode.state.myCard, strength: 20, charisma: 20, wisdom: 20 } });
  1760. }
  1761. },
  1762. {
  1763. name: "Min Enemy Stats",
  1764. description: "Makes the enemy card stats all 0 (Only works on attribute select page)",
  1765. run: function () {
  1766. let i = document.createElement('iframe');
  1767. document.body.append(i);
  1768. window.alert = i.contentWindow.alert.bind(window);
  1769. i.remove();
  1770. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1771. if (stateNode.state.phase !== 'select') alert('You must be on the attribute selection page!');
  1772. else stateNode.setState({ enemyCard: { ...stateNode.state.enemyCard, strength: 0, charisma: 0, wisdom: 0 } });
  1773. }
  1774. },
  1775. {
  1776. name: "Set Coins",
  1777. description: "Try's to set amount of tower coins you have",
  1778. inputs: [{
  1779. name: "Coins",
  1780. type: "number"
  1781. }],
  1782. run: function (coins) {
  1783. let i = document.createElement('iframe');
  1784. document.body.append(i);
  1785. window.alert = i.contentWindow.prompt.bind(window);
  1786. i.remove();
  1787. if (window.location.pathname == "/tower/battle") {
  1788. let coins = parseInt("0" + alert("How many coins would you like?"));
  1789. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1790. try { stateNode.props.setTowerCoins(coins); } catch { };
  1791. } else alert("You need to be in battle to run this cheat!");
  1792. }
  1793. }
  1794. ],
  1795. factory: [
  1796. {
  1797. name: "Choose Blook",
  1798. description: "Gives you a blook",
  1799. inputs: [{
  1800. name: "Blook",
  1801. type: "options",
  1802. options: [{name:"Chick",color:"#ffcd05",class:"\uD83C\uDF3D",rarity:"Common",cash:[3,7,65,400,2500],time:[1,1,1,1,1],price:[300,3e3,3e4,2e5]},{name:"Chicken",color:"#ed1c24",class:"\uD83C\uDF3D",rarity:"Common",cash:[10,40,200,1400,1e4],time:[5,4,3,2,1],price:[570,4e3,5e4,8e5]},{name:"Cow",color:"#58595b",class:"\uD83C\uDF3D",rarity:"Common",cash:[25,75,1500,25e3,25e4],time:[15,10,10,10,5],price:[500,9500,16e4,4e6]},{name:"Duck",color:"#4ab96d",class:"\uD83C\uDF3D",rarity:"Common",cash:[4,24,200,3e3,4e4],time:[3,3,3,3,3],price:[450,4200,7e4,11e5]},{name:"Goat",color:"#c59a74",class:"\uD83C\uDF3D",rarity:"Common",cash:[5,28,200,1300,12e3],time:[3,3,2,2,2],price:[500,6400,45e3,5e5]},{name:"Horse",color:"#995b3c",class:"\uD83C\uDF3D",rarity:"Common",cash:[5,20,270,1800,15e3],time:[2,2,2,2,2],price:[550,8200,65e3,6e5]},{name:"Pig",color:"#f6a9cb",class:"\uD83C\uDF3D",rarity:"Common",cash:[20,50,1300,8e3,8e4],time:[7,7,7,7,5],price:[400,11e3,8e4,13e5]},{name:"Sheep",color:"#414042",class:"\uD83C\uDF3D",rarity:"Common",cash:[6,25,250,1500,11e3],time:[3,3,3,2,2],price:[500,5e3,5e4,43e4]},{name:"Cat",color:"#f49849",class:"\uD83D\uDC3E",rarity:"Common",cash:[5,18,170,1700,13e3],time:[2,2,2,2,2],price:[480,5500,6e4,5e5]},{name:"Dog",color:"#995b3c",class:"\uD83D\uDC3E",rarity:"Common",cash:[7,25,220,1900,9e3],time:[3,3,2,2,1],price:[460,6600,7e4,73e4]},{name:"Goldfish",color:"#f18221",class:"\uD83D\uDC3E",rarity:"Common",cash:[5,40,350,3500,35e3],time:[3,3,3,3,3],price:[750,7200,84e3,95e4]},{name:"Rabbit",color:"#e7bf9a",class:"\uD83D\uDC3E",rarity:"Common",cash:[3,18,185,800,7e3],time:[2,2,2,1,1],price:[500,5800,56e3,55e4]},{name:"Hamster",color:"#ce9176",class:"\uD83D\uDC3E",rarity:"Common",cash:[10,45,450,4500,45e3],time:[4,4,4,4,4],price:[650,6500,8e4,93e4]},{name:"Turtle",color:"#619a3c",class:"\uD83D\uDC3E",rarity:"Common",cash:[23,120,1400,15e3,17e4],time:[10,10,10,10,10],price:[700,8500,11e4,13e5]},{name:"Puppy",color:"#414042",class:"\uD83D\uDC3E",rarity:"Common",cash:[4,10,75,500,3e3],time:[1,1,1,1,1],price:[450,4e3,35e3,25e4]},{name:"Kitten",color:"#58595b",class:"\uD83D\uDC3E",rarity:"Common",cash:[4,8,60,400,2e3],time:[1,1,1,1,1],price:[350,3500,26e3,17e4]},{name:"Bear",color:"#995b3c",class:"\uD83C\uDF32",rarity:"Common",cash:[12,70,550,4500,1e5],time:[7,7,6,5,5],price:[550,5500,63e3,16e5]},{name:"Moose",color:"#995b3c",class:"\uD83C\uDF32",rarity:"Common",cash:[8,45,400,3500,26e3],time:[5,5,4,4,3],price:[520,6500,58e3,7e5]},{name:"Fox",color:"#f49849",class:"\uD83C\uDF32",rarity:"Common",cash:[7,15,80,550,3e3],time:[2,2,1,1,1],price:[400,4e3,36e3,24e4]},{name:"Raccoon",color:"#6d6e71",class:"\uD83C\uDF32",rarity:"Common",cash:[5,14,185,1900,19e3],time:[2,2,2,2,2],price:[400,5e3,71e3,8e5]},{name:"Squirrel",color:"#d25927",class:"\uD83C\uDF32",rarity:"Common",cash:[3,10,65,470,2600],time:[1,1,1,1,1],price:[420,3600,32e3,21e4]},{name:"Owl",color:"#594a42",class:"\uD83C\uDF32",rarity:"Common",cash:[4,17,155,1500,15e3],time:[2,2,2,2,2],price:[500,4800,55e3,58e4]},{name:"Hedgehog",color:"#3f312b",class:"\uD83C\uDF32",rarity:"Common",cash:[11,37,340,2200,3e4],time:[5,4,3,2,2],price:[540,7e3,77e3,12e5]},{name:"Seal",color:"#7ca1d5",class:"❄️",rarity:"Common",cash:[6,17,150,1200,13e3],time:[2,2,2,2,2],price:[480,4500,43e3,52e4]},{name:"Arctic Fox",color:"#7ca1d5",class:"❄️",rarity:"Common",cash:[5,18,180,850,8500],time:[2,2,2,1,1],price:[520,550,61e3,68e4]},{name:"Snowy Owl",color:"#feda3f",class:"❄️",rarity:"Common",cash:[5,20,190,1900,16e3],time:[3,3,2,2,2],price:[370,5300,76e3,62e4]},{name:"Arctic Hare",color:"#7ca1d5",class:"❄️",rarity:"Common",cash:[6,19,85,900,7e3],time:[2,2,1,1,1],price:[540,5200,66e3,55e4]},{name:"Penguin",color:"#fb8640",class:"❄️",rarity:"Common",cash:[4,21,310,3200,33e3],time:[3,3,3,3,3],price:[400,6500,76e3,87e4]},{name:"Baby Penguin",color:"#414042",class:"❄️",rarity:"Common",cash:[3,8,70,450,2700],time:[1,1,1,1,1],price:[420,3300,33e3,23e4]},{name:"Polar Bear",color:"#7ca1d5",class:"❄️",rarity:"Common",cash:[12,75,700,6500,85e3],time:[8,7,6,5,5],price:[630,7e3,91e3,14e5]},{name:"Walrus",color:"#7d4f33",class:"❄️",rarity:"Common",cash:[11,46,420,3700,51e3],time:[5,5,4,4,4],price:[550,6200,68e3,1e6]},{name:"Tiger",color:"#f18221",class:"\uD83C\uDF34",rarity:"Common",cash:[6,20,100,975,7500],time:[3,3,1,1,1],price:[390,6e3,7e4,61e4]},{name:"Jaguar",color:"#fbb040",class:"\uD83C\uDF34",rarity:"Common",cash:[8,28,230,1600,17e3],time:[3,3,2,2,2],price:[390,6e3,7e4,61e4]},{name:"Toucan",color:"#ffca34",class:"\uD83C\uDF34",rarity:"Common",cash:[9,20,175,625,3800],time:[2,2,2,1,1],price:[520,4800,42e3,3e5]},{name:"Cockatoo",color:"#7ca1d5",class:"\uD83C\uDF34",rarity:"Common",cash:[6,35,160,1700,18e3],time:[4,4,2,2,2],price:[500,5e3,63e3,7e5]},{name:"Macaw",color:"#00aeef",class:"\uD83C\uDF34",rarity:"Common",cash:[3,8,85,850,8500],time:[1,1,1,1,1],price:[480,5400,62e3,63e4]},{name:"Parrot",color:"#ed1c24",class:"\uD83C\uDF34",rarity:"Common",cash:[3,9,90,900,9e3],time:[1,1,1,1,1],price:[540,5700,65e3,69e4]},{name:"Panther",color:"#2f2c38",class:"\uD83C\uDF34",rarity:"Common",cash:[12,28,215,2100,21e3],time:[5,3,2,2,2],price:[530,6500,76e3,87e4]},{name:"Anaconda",color:"#8a9143",class:"\uD83C\uDF34",rarity:"Common",cash:[3,15,85,1500,7600],time:[1,2,1,2,1],price:[410,5100,58e3,59e4]},{name:"Orangutan",color:"#bc6234",class:"\uD83C\uDF34",rarity:"Common",cash:[13,52,570,4300,7e4],time:[5,5,5,4,4],price:[600,7e3,8e4,14e5]},{name:"Capuchin",color:"#e0b0a6",class:"\uD83C\uDF34",rarity:"Common",cash:[4,14,160,780,8200],time:[2,2,2,1,1],price:[390,4700,57e3,68e4]},{name:"Elf",color:"#a7d054",class:"⚔️",rarity:"Uncommon",cash:[5e3,15e3,15e4,15e5,1e7],time:[1,1,1,1,1],price:[8e5,9e6,11e7,8e8]},{name:"Witch",color:"#4ab96d",class:"⚔️",rarity:"Uncommon",cash:[18e3,6e4,4e4,4e6,35e6],time:[3,3,2,2,2],price:[11e5,12e6,15e7,14e8]},{name:"Wizard",color:"#5a459c",class:"⚔️",rarity:"Uncommon",cash:[19500,65e3,44e4,46e5,4e6],time:[3,3,2,2,2],price:[13e5,135e5,16e7,16e8]},{name:"Fairy",color:"#df6d9c",class:"⚔️",rarity:"Uncommon",cash:[18500,6e4,62e4,44e5,38e6],time:[3,3,3,2,2],price:[12e5,125e5,15e6,15e8]},{name:"Slime Monster",color:"#2fa04a",class:"⚔️",rarity:"Uncommon",cash:[35e3,14e4,1e6,11e6,11e7],time:[5,5,4,4,4],price:[16e5,15e6,2e8,23e8]},{name:"Jester",color:"#be1e2d",class:"⚔️",rarity:"Rare",cash:[25e3,1e5,68e4,65e5,32e6],time:[3,3,2,2,1],price:[2e6,21e6,23e7,26e8]},{name:"Dragon",color:"#2fa04a",class:"⚔️",rarity:"Rare",cash:[36e3,15e4,15e5,15e6,15e7],time:[4,4,4,4,4],price:[23e5,24e6,27e7,3e9]},{name:"Unicorn",color:"#f6afce",class:"⚔️",rarity:"Epic",cash:[24e3,15e4,14e5,7e6,75e6],time:[2,2,2,1,1],price:[45e5,45e6,55e7,65e8]},{name:"Queen",color:"#9e1f63",class:"⚔️",rarity:"Rare",cash:[24e3,95e3,95e4,97e5,95e6],time:[3,3,3,3,3],price:[19e5,2e7,23e7,25e8]},{name:"King",color:"#ee2640",class:"⚔️",rarity:"Legendary",cash:[75e3,4e5,6e6,9e7,125e7],time:[5,5,5,5,5],price:[6e6,95e6,16e8,25e9]},{name:"Two of Spades",color:"#414042",class:"\uD83C\uDFF0",rarity:"Uncommon",cash:[4500,14e3,14e4,14e5,9e6],time:[1,1,1,1,1],price:[77e4,83e5,98e6,71e7]},{name:"Eat Me",color:"#d58c55",class:"\uD83C\uDFF0",rarity:"Uncommon",cash:[13e3,45e3,45e4,45e5,5e7],time:[2,2,2,2,2],price:[13e5,14e6,16e7,2e9]},{name:"Drink Me",color:"#dd7399",class:"\uD83C\uDFF0",rarity:"Uncommon",cash:[12e3,4e4,4e5,4e6,45e6],time:[2,2,2,2,2],price:[12e5,12e6,14e7,18e8]},{name:"Alice",color:"#4cc9f5",class:"\uD83C\uDFF0",rarity:"Uncommon",cash:[13e3,42e3,21e4,21e5,23e6],time:[2,2,1,1,1],price:[12e5,13e6,15e7,19e8]},{name:"Queen of Hearts",color:"#d62027",class:"\uD83C\uDFF0",rarity:"Uncommon",cash:[23e3,87e3,62e4,75e5,9e7],time:[4,4,3,3,3],price:[13e5,13e6,18e7,24e8]},{name:"Dormouse",color:"#89d6f8",class:"\uD83C\uDFF0",rarity:"Rare",cash:[17e3,68e3,7e5,35e5,35e6],time:[2,2,1,1,1],price:[2e6,22e6,25e7,28e8]},{name:"White Rabbit",color:"#ffcd05",class:"\uD83C\uDFF0",rarity:"Rare",cash:[26e3,105e3,11e6,77e5,72e6],time:[3,3,3,2,2],price:[2e6,23e6,28e7,29e8]},{name:"Cheshire Cat",color:"#dd7399",class:"\uD83C\uDFF0",rarity:"Rare",cash:[32e3,1e5,9e5,9e6,6e7],time:[4,3,3,3,2],price:[18e5,19e6,22e7,24e8]},{name:"Caterpillar",color:"#00c0f3",class:"\uD83C\uDFF0",rarity:"Epic",cash:[1e4,7e4,65e4,75e5,85e6],time:[1,1,1,1,1],price:[42e5,42e6,54e7,69e8]},{name:"Mad Hatter",color:"#914f93",class:"\uD83C\uDFF0",rarity:"Epic",cash:[38e3,25e4,15e5,14e6,8e7],time:[3,3,2,2,1],price:[48e5,48e6,52e7,66e8]},{name:"King of Hearts",color:"#c62127",class:"\uD83C\uDFF0",rarity:"Legendary",cash:[8e4,42e4,68e5,1e8,15e8],time:[5,5,5,5,5],price:[7e6,11e7,18e8,3e10]},{name:"Earth",color:"#416eb5",class:"\uD83D\uDE80",rarity:"Uncommon",cash:[15e3,45e3,6e5,65e5,65e6],time:[3,3,3,3,3],price:[1e6,11e6,15e7,17e8]},{name:"Meteor",color:"#c68c3c",class:"\uD83D\uDE80",rarity:"Uncommon",cash:[23e3,65e3,7e5,45e5,2e7],time:[5,4,3,2,1],price:[95e4,13e6,16e7,16e8]},{name:"Stars",color:"#19184d",class:"\uD83D\uDE80",rarity:"Uncommon",cash:[1e4,4e4,2e5,2e6,18e6],time:[2,2,1,1,1],price:[14e5,14e6,15e7,15e8]},{name:"Alien",color:"#8dc63f",class:"\uD83D\uDE80",rarity:"Uncommon",cash:[3e4,1e5,1e6,11e6,85e6],time:[4,4,4,4,4],price:[15e5,17e6,19e7,17e8]},{name:"Planet",color:"#9dc6ea",class:"\uD83D\uDE80",rarity:"Rare",cash:[25e3,1e5,9e5,9e6,9e7],time:[3,3,3,3,3],price:[2e6,21e6,21e7,24e8]},{name:"UFO",color:"#a15095",class:"\uD83D\uDE80",rarity:"Rare",cash:[17e3,7e4,7e5,7e6,7e7],time:[2,2,2,2,2],price:[21e5,23e6,25e7,28e8]},{name:"Spaceship",color:"#ffcb29",class:"\uD83D\uDE80",rarity:"Epic",cash:[6e4,32e4,21e5,15e6,85e6],time:[5,4,3,2,1],price:[48e5,46e6,54e7,68e8]},{name:"Astronaut",color:"#9bd4ee",class:"\uD83D\uDE80",rarity:"Legendary",cash:[45e3,26e4,25e5,38e6,55e7],time:[3,3,2,2,2],price:[65e5,1e8,17e8,27e9]},{name:"Lil Bot",color:"#3e564a",class:"\uD83E\uDD16",rarity:"Uncommon",cash:[4e3,12e3,18e4,19e5,25e6],time:[1,1,1,1,1],price:[73e4,12e6,13e7,19e8]},{name:"Lovely Bot",color:"#f179af",class:"\uD83E\uDD16",rarity:"Uncommon",cash:[16e3,65e3,65e4,48e5,42e6],time:[3,3,3,2,2],price:[13e5,14e6,17e7,16e8]},{name:"Angry Bot",color:"#f1613a",class:"\uD83E\uDD16",rarity:"Uncommon",cash:[22e3,85e3,8e5,62e5,65e6],time:[4,4,4,3,3],price:[12e5,13e6,15e7,17e8]},{name:"Happy Bot",color:"#51ba6b",class:"\uD83E\uDD16",rarity:"Uncommon",cash:[11e3,45e3,5e5,25e5,3e7],time:[2,2,2,1,1],price:[14e5,15e6,18e7,24e8]},{name:"Watson",color:"#d69b5a",class:"\uD83E\uDD16",rarity:"Rare",cash:[24e3,1e5,1e6,1e7,1e8],time:[3,3,3,3,3],price:[2e6,22e6,24e7,26e8]},{name:"Buddy Bot",color:"#9dc6ea",class:"\uD83E\uDD16",rarity:"Rare",cash:[22e3,95e3,65e4,65e5,65e6],time:[3,3,2,2,2],price:[19e5,21e6,23e7,25e8]},{name:"Brainy Bot",color:"#9ecf7a",class:"\uD83E\uDD16",rarity:"Epic",cash:[5e4,25e4,21e5,21e6,17e7],time:[4,3,3,3,2],price:[5e6,46e6,5e8,67e8]},{name:"Mega Bot",color:"#d71f27",class:"\uD83E\uDD16",rarity:"Legendary",cash:[8e4,43e4,42e5,62e6,1e9],time:[5,5,3,3,3],price:[7e6,12e7,19e8,35e9]}].map(x => ({ name: x.name, value: JSON.stringify(x) }))
  1803. }],
  1804. run: function (blook) {
  1805. let i = document.createElement('iframe');
  1806. document.body.append(i);
  1807. window.alert = i.contentWindow.alert.bind(window);
  1808. i.remove();
  1809. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1810. if (stateNode.state.blooks.length >= 10) alert("Choose a blook to replace");
  1811. stateNode.chooseBlook(JSON.parse(blook));
  1812. }
  1813. },
  1814. {
  1815. name: "Free Upgrades",
  1816. description: "Sets upgrade prices to 0 for all current blooks",
  1817. run: function () {
  1818. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1819. stateNode.setState(state => ({ ...state, blooks: state.blooks.map(blook => ({ ...blook, price: [0, 0, 0, 0] })) }));
  1820. }
  1821. },
  1822. {
  1823. name: "Max Blooks",
  1824. description: "Maxes out all your blooks' levels",
  1825. run: function () {
  1826. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.blooks.forEach(blook => blook.level = 4);
  1827. }
  1828. },
  1829. {
  1830. name: "Remove Glitches",
  1831. description: "Removes all enemy glitches",
  1832. run: function () {
  1833. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1834. stateNode.setState({
  1835. bits: 0,
  1836. ads: [],
  1837. hazards: [],
  1838. color: "",
  1839. lol: false,
  1840. joke: false,
  1841. slow: false,
  1842. dance: false,
  1843. glitch: "",
  1844. glitcherName: "",
  1845. glitcherBlook: ""
  1846. });
  1847. clearTimeout(stateNode.adTimeout);
  1848. clearInterval(stateNode.hazardInterval);
  1849. clearTimeout(stateNode.nightTimeout);
  1850. clearTimeout(stateNode.glitchTimeout);
  1851. clearTimeout(stateNode.lolTimeout);
  1852. clearTimeout(stateNode.jokeTimeout);
  1853. clearTimeout(stateNode.slowTimeout);
  1854. clearTimeout(stateNode.danceTimeout);
  1855. clearTimeout(stateNode.nameTimeout);
  1856. }
  1857. },
  1858. {
  1859. name: "Send Glitch",
  1860. description: "Sends a glitch to everyone else playing",
  1861. inputs: [{
  1862. name: "Glitch",
  1863. type: "options",
  1864. options: Object.entries({ lb: "Lunch Break", as: "Ad Spam", e37: "Error 37", nt: "Night Time", lo: "#LOL", j: "Jokester", sm: "Slow Mo", dp: "Dance Party", v: "Vortex", r: "Reverse", f: "Flip", m: "Micro" }).map(([value, name]) => ({ name, value }))
  1865. }],
  1866. run: function (val) {
  1867. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1868. stateNode.safe = true;
  1869. stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/tat`, val });
  1870. }
  1871. },
  1872. {
  1873. name: "Set All MegaBot",
  1874. description: "Sets all your blooks to maxed out Mega Bots",
  1875. run: function () {
  1876. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({
  1877. blooks: new Array(10).fill({
  1878. name: "Mega Bot",
  1879. color: "#d71f27",
  1880. class: "🤖",
  1881. rarity: "Legendary",
  1882. cash: [8e4, 43e4, 42e5, 62e6, 1e9],
  1883. time: [5, 5, 3, 3, 3],
  1884. price: [7e6, 12e7, 19e8, 35e9],
  1885. active: false,
  1886. level: 4,
  1887. bonus: 5.5
  1888. })
  1889. });
  1890. }
  1891. },
  1892. {
  1893. name: "Set Cash",
  1894. description: "Sets amount of cash you have",
  1895. inputs: [{
  1896. name: "Cash",
  1897. type: "number"
  1898. }],
  1899. run: function (cash) {
  1900. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ cash });
  1901. }
  1902. }
  1903. ],
  1904. fishing: [
  1905. {
  1906. name: "Frenzy",
  1907. description: "Sets everyone to frenzy mode",
  1908. run: function () {
  1909. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1910. stateNode.props.liveGameController.setVal({
  1911. path: `c/${stateNode.props.client.name}`,
  1912. val: {
  1913. b: stateNode.props.client.blook,
  1914. w: stateNode.state.weight,
  1915. f: "Frenzy",
  1916. s: true
  1917. }
  1918. });
  1919. }
  1920. },
  1921. {
  1922. name: "Remove Distractions",
  1923. description: "Removes distractions",
  1924. type: "toggle",
  1925. enabled: false,
  1926. data: null,
  1927. run: function () {
  1928. if (!this.enabled) {
  1929. this.enabled = true;
  1930. this.data = setInterval(() => {
  1931. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ party: "" });
  1932. }, 50);
  1933. } else {
  1934. this.enabled = false;
  1935. clearInterval(this.data);
  1936. this.data = null;
  1937. }
  1938. }
  1939. },
  1940. {
  1941. name: "Send Distraction",
  1942. description: "Sends a distraction to everyone",
  1943. inputs: [{
  1944. name: "Distraction",
  1945. type: "options",
  1946. options: ["Crab", "Jellyfish", "Frog", "Pufferfish", "Octopus", "Narwhal", "Megalodon", "Blobfish", "Baby Shark"]
  1947. }],
  1948. run: function (f) {
  1949. let i = document.createElement('iframe');
  1950. document.body.append(i);
  1951. window.alert = i.contentWindow.alert.bind(window);
  1952. i.remove();
  1953. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1954. stateNode.safe = true;
  1955. stateNode.props.liveGameController.setVal({
  1956. path: `c/${stateNode.props.client.name}`,
  1957. val: {
  1958. b: stateNode.props.client.blook,
  1959. w: stateNode.state.weight, f, s: true
  1960. }
  1961. });
  1962. }
  1963. },
  1964. {
  1965. name: "Set Lure",
  1966. description: "Sets fishing lure (range 1 - 5)",
  1967. inputs: [{
  1968. name: "Lure (1 - 5)",
  1969. type: "number",
  1970. min: 1,
  1971. max: 5
  1972. }],
  1973. run: function (lure) {
  1974. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ lure: Math.max(Math.min(lure - 1, 4), 0) });
  1975. }
  1976. },
  1977. {
  1978. name: "Set Weight",
  1979. description: "Sets weight",
  1980. inputs: [{
  1981. name: "Weight",
  1982. type: "number"
  1983. }],
  1984. run: function (weight) {
  1985. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  1986. stateNode.setState({ weight, weight2: weight });
  1987. stateNode.props.liveGameController.setVal({
  1988. path: `c/${stateNode.props.client.name}`,
  1989. val: {
  1990. b: stateNode.props.client.blook,
  1991. w: weight,
  1992. f: ["Crab", "Jellyfish", "Frog", "Pufferfish", "Octopus", "Narwhal", "Megalodon", "Blobfish", "Baby Shark"][Math.floor(Math.random() * 9)]
  1993. }
  1994. });
  1995. }
  1996. }
  1997. ],
  1998. flappy: [
  1999. {
  2000. name: "Toggle Ghost",
  2001. description: "Lets you go through the pipes",
  2002. type: "toggle",
  2003. enabled: false,
  2004. run: function () {
  2005. this.enabled = !this.enabled;
  2006. Object.values(document.querySelector("#phaser-bouncy"))[1].children[0]._owner.stateNode.state.game.scene.physics.world.bodies.entries.forEach(x => x.gameObject.frame.texture.key.startsWith("blook") && (x.checkCollision.none = this.enabled, x.gameObject.setAlpha(this.enabled ? 0.5 : 1)));
  2007. }
  2008. },
  2009. {
  2010. name: "Set Score",
  2011. description: "Sets flappy blook score",
  2012. inputs: [{
  2013. name: "Score",
  2014. type: "number"
  2015. }],
  2016. run: function (score) {
  2017. Object.values(document.querySelector("#phaser-bouncy"))[1].children[0]._owner.stateNode.setState({ score });
  2018. }
  2019. }
  2020. ],
  2021. gold: [
  2022. {
  2023. name: "Always Triple",
  2024. description: "Always get triple gold",
  2025. type: "toggle",
  2026. enabled: false,
  2027. data: null,
  2028. run: function () {
  2029. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2030. stateNode._choosePrize ||= stateNode.choosePrize;
  2031. if (!this.enabled) {
  2032. this.enabled = true;
  2033. this.data = setInterval(() => {
  2034. stateNode.choosePrize = function (i) {
  2035. stateNode.state.choices[i] = { type: "multiply", val: 3, text: "Triple Gold!", blook: "Unicorn" };
  2036. stateNode._choosePrize(i);
  2037. }
  2038. }, 50);
  2039. } else {
  2040. this.enabled = false;
  2041. clearInterval(this.data);
  2042. this.data = null;
  2043. stateNode.choosePrize = stateNode._choosePrize || stateNode.choosePrize;
  2044. }
  2045. }
  2046. },
  2047. {
  2048. name: "Auto Choose",
  2049. description: "Automatically picks the option that would give you the most gold",
  2050. type: "toggle",
  2051. enabled: false,
  2052. data: null,
  2053. run: function () {
  2054. if (!this.enabled) {
  2055. this.enabled = true;
  2056. this.data = setInterval(async () => {
  2057. try {
  2058. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2059. if (stateNode.state.stage === "prize") {
  2060. const players = Object.entries(await new Promise(r => stateNode.props.liveGameController.getDatabaseVal("c", c => c && r(c))) || []).filter(x => x[0] != stateNode.props.client.name).sort((a, b) => b[1].g - a[1].g)[0]?.[1]?.g || 0;
  2061. let max = 0; index = -1;
  2062. for (let i = 0; i < stateNode.state.choices.length; i++) {
  2063. const { type, val } = stateNode.state.choices[i];
  2064. let value = stateNode.state.gold;
  2065. switch (type) {
  2066. case "gold": value = stateNode.state.gold + val || stateNode.state.gold; break;
  2067. case "multiply":
  2068. case "divide": value = Math.round(stateNode.state.gold * val) || stateNode.state.gold; break;
  2069. case "swap": value = players || stateNode.state.gold;
  2070. case "take": value = stateNode.state.gold + players * val || stateNode.state.gold;
  2071. }
  2072. if ((value || 0) <= max) continue;
  2073. max = value, index = i + 1;
  2074. }
  2075. document.querySelector(`div[class^='styles__choice${index}']`).click();
  2076. }
  2077. } catch { }
  2078. }, 50);
  2079. } else {
  2080. this.enabled = false;
  2081. clearInterval(this.data);
  2082. this.data = null;
  2083. }
  2084. }
  2085. },
  2086. {
  2087. name: "Chest ESP",
  2088. description: "Shows what each chest will give you",
  2089. type: "toggle",
  2090. enabled: false,
  2091. data: null,
  2092. run: function () {
  2093. if (!this.enabled) {
  2094. this.enabled = true;
  2095. this.data = setInterval(() => {
  2096. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state.choices.forEach(({ text }, index) => {
  2097. let chest = document.querySelector(`div[class^='styles__choice${index + 1}']`);
  2098. if (!chest || chest.querySelector('div')) return;
  2099. let choice = document.createElement('div');
  2100. choice.style.color = "white";
  2101. choice.style.fontFamily = "Eczar";
  2102. choice.style.fontSize = "2em";
  2103. choice.style.display = "flex";
  2104. choice.style.justifyContent = "center";
  2105. choice.style.transform = "translateY(200px)";
  2106. choice.innerText = text;
  2107. chest.append(choice);
  2108. });
  2109. }, 50);
  2110. } else {
  2111. this.enabled = false;
  2112. clearInterval(this.data);
  2113. this.data = null;
  2114. }
  2115. }
  2116. },
  2117. {
  2118. name: "Reset Players Gold",
  2119. description: "Sets a player's gold to 0",
  2120. inputs: [{
  2121. name: "Player",
  2122. type: "options",
  2123. options: () => {
  2124. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2125. return new Promise(res => stateNode.props.liveGameController._liveApp ? stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players))) : res([]));
  2126. }
  2127. }],
  2128. run: function (target) {
  2129. let { stateNode: { props, state } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2130. props.liveGameController.setVal({
  2131. path: "c/".concat(props.client.name),
  2132. val: {
  2133. b: props.client.blook,
  2134. g: state.gold,
  2135. tat: `${target}:swap:0`
  2136. }
  2137. });
  2138. }
  2139. },
  2140. {
  2141. name: "Set Gold",
  2142. description: "Sets amount of gold",
  2143. inputs: [{
  2144. name: "Gold",
  2145. type: "number"
  2146. }],
  2147. run: function (gold) {
  2148. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2149. stateNode.setState({ gold, gold2: gold });
  2150. stateNode.props.liveGameController.setVal({
  2151. path: "c/".concat(stateNode.props.client.name),
  2152. val: {
  2153. b: stateNode.props.client.blook,
  2154. g: gold
  2155. }
  2156. });
  2157. }
  2158. },
  2159. {
  2160. name: "Swap Gold",
  2161. description: "Swaps gold with someone",
  2162. inputs: [{
  2163. name: "Player",
  2164. type: "options",
  2165. options: () => {
  2166. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2167. return new Promise(res => stateNode.props.liveGameController._liveApp ? stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players))) : res([]));
  2168. }
  2169. }],
  2170. run: function (target) {
  2171. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2172. stateNode.props.liveGameController.getDatabaseVal("c", (players) => {
  2173. if (!players?.[target]) return;
  2174. let { g } = players[target];
  2175. stateNode.props.liveGameController.setVal({
  2176. path: "c/".concat(stateNode.props.client.name),
  2177. val: {
  2178. b: stateNode.props.client.blook,
  2179. g,
  2180. tat: `${target}:swap:${stateNode.state.gold}`
  2181. }
  2182. });
  2183. stateNode.setState({ gold: g, gold2: g });
  2184. });
  2185. }
  2186. },
  2187. {
  2188. name: "Reset All Players' Gold",
  2189. description: "Set's everyone else's gold to 0",
  2190. run: function () {
  2191. let i = document.createElement('iframe');
  2192. document.body.append(i);
  2193. window.alert = i.contentWindow.alert.bind(window);
  2194. i.remove();
  2195. let { stateNode: { props, state } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2196. let count = 0;
  2197. props.liveGameController.getDatabaseVal("c", async (players) => {
  2198. if (players) for (const player of Object.keys(players)) {
  2199. props.liveGameController.setVal({
  2200. path: "c/".concat(props.client.name),
  2201. val: {
  2202. b: props.client.blook,
  2203. g: state.gold,
  2204. tat: `${player}:swap:0`
  2205. }
  2206. });
  2207. count++;
  2208. await new Promise(r => setTimeout(r, 4000));
  2209. };
  2210. alert(`Reset ${count} players' gold!`);
  2211. });
  2212. }
  2213. }
  2214. ],
  2215. kingdom: [
  2216. {
  2217. name: "Choice ESP",
  2218. description: "Shows you what will happen if you say Yes or No",
  2219. type: "toggle",
  2220. enabled: false,
  2221. data: null,
  2222. run: function () {
  2223. if (!this.enabled) {
  2224. this.enabled = true;
  2225. let stats = ['materials', 'people', 'happiness', 'gold'];
  2226. let elements = Object.fromEntries([...document.querySelectorAll('[class^=styles__statContainer]')].map((container, i) => [stats[i], container]));
  2227. this.data = setInterval(() => {
  2228. let { guest: data, phase } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.state;
  2229. if (phase == "choice") {
  2230. Array.from(document.getElementsByClassName('choiceESP')).forEach(x => x.remove());
  2231. Object.entries(data.yes || {}).forEach(x => {
  2232. if (x[0] == 'msg' || !stats.includes(x[0])) return;
  2233. let element = document.createElement('div');
  2234. element.className = 'choiceESP';
  2235. element.style = 'font-size: 24px; color: rgb(75, 194, 46); font-weight: bolder;';
  2236. element.innerText = String(x[1]);
  2237. elements[x[0]].appendChild(element);
  2238. });
  2239. Object.entries(data.no || {}).forEach(x => {
  2240. if (x[0] == 'msg' || !stats.includes(x[0])) return;
  2241. let element = document.createElement('div');
  2242. element.className = 'choiceESP';
  2243. element.style = 'font-size: 24px; color: darkred; font-weight: bolder;';
  2244. element.innerText = String(x[1]);
  2245. elements[x[0]].appendChild(element);
  2246. });
  2247. }
  2248. }, 50);
  2249. } else {
  2250. this.enabled = false;
  2251. clearInterval(this.data);
  2252. Array.from(document.getElementsByClassName('choiceESP')).forEach(x => x.remove());
  2253. this.data = null;
  2254. }
  2255. }
  2256. },
  2257. {
  2258. name: "Disable Tax Toucan",
  2259. description: "Tax evasion",
  2260. run: function () {
  2261. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.taxCounter = Number.MAX_VALUE;
  2262. }
  2263. },
  2264. {
  2265. name: "Max Stats",
  2266. description: "Sets all resources to the max",
  2267. run: function () {
  2268. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ materials: 100, people: 100, happiness: 100, gold: 100 });
  2269. }
  2270. },
  2271. {
  2272. name: "Set Guests",
  2273. description: "Sets the amount of guests you've seen",
  2274. inputs: [{
  2275. name: "Guests",
  2276. type: "number"
  2277. }],
  2278. run: function (guestScore) {
  2279. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ guestScore });
  2280. }
  2281. },
  2282. {
  2283. name: "Skip Guest",
  2284. description: "Skips the current guest",
  2285. run: function () {
  2286. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.nextGuest();
  2287. }
  2288. }
  2289. ],
  2290. racing: [
  2291. {
  2292. name: "Instant Win",
  2293. description: "Instantly Wins the race",
  2294. run: function () {
  2295. const { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2296. stateNode.setState({ progress: stateNode.state.goalAmount }, () => {
  2297. const { state: { question } } = stateNode;
  2298. try {
  2299. [...document.querySelectorAll(`[class*="answerContainer"]`)][question.answers.map((x, i) => question.correctAnswers.includes(x) ? i : null).filter(x => x != null)[0]]?.click?.();
  2300. } catch { }
  2301. });
  2302. }
  2303. },
  2304. {
  2305. name: "Set Questions",
  2306. description: "Sets the number of questions left",
  2307. inputs: [{
  2308. name: "Questions",
  2309. type: "number"
  2310. }],
  2311. run: function (progress) {
  2312. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2313. progress = stateNode.props.client.amount - progress;
  2314. stateNode.setState({ progress });
  2315. stateNode.props.liveGameController.setVal({
  2316. path: "c/".concat(stateNode.props.client.name),
  2317. val: {
  2318. b: stateNode.props.client.blook,
  2319. pr: progress
  2320. }
  2321. });
  2322. }
  2323. }
  2324. ],
  2325. royale: [
  2326. {
  2327. name: "Auto Answer (Toggle)",
  2328. description: "Toggles auto answer on",
  2329. type: "toggle",
  2330. enabled: false,
  2331. data: null,
  2332. run: function () {
  2333. if (!this.enabled) {
  2334. this.enabled = true;
  2335. this.data = setInterval(() => {
  2336. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2337. stateNode?.onAnswer?.(true, stateNode.props.client.question.correctAnswers[0]);
  2338. }, 50);
  2339. } else {
  2340. this.enabled = false;
  2341. clearInterval(this.data);
  2342. this.data = null;
  2343. }
  2344. }
  2345. },
  2346. {
  2347. name: "Auto Answer",
  2348. description: "Chooses the correct answer for you",
  2349. run: function () {
  2350. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2351. stateNode?.onAnswer?.(true, stateNode.props.client.question.correctAnswers[0]);
  2352. }
  2353. },
  2354. ],
  2355. rush: [
  2356. {
  2357. name: "Set Blooks",
  2358. description: "Sets amount of blooks you or your team has",
  2359. inputs: [{
  2360. name: "Blooks",
  2361. type: "number"
  2362. }],
  2363. run: function (numBlooks) {
  2364. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2365. stateNode.setState({ numBlooks });
  2366. stateNode.isTeam ? stateNode.props.liveGameController.setVal({
  2367. path: `a/${stateNode.props.client.name}/bs`,
  2368. val: numBlooks
  2369. }) : stateNode.props.liveGameController.setVal({
  2370. path: `c/${stateNode.props.client.name}/bs`,
  2371. val: numDefense
  2372. });
  2373. }
  2374. },
  2375. {
  2376. name: "Set Defense",
  2377. description: "Sets amount of defense you or your team has (Max 4)",
  2378. inputs: [{
  2379. name: "Defense (max 4)",
  2380. type: "number",
  2381. max: 4
  2382. }],
  2383. run: function (defense) {
  2384. let numDefense = Math.min(defense, 4);
  2385. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2386. stateNode.setState({ numDefense });
  2387. stateNode.isTeam ? stateNode.props.liveGameController.setVal({
  2388. path: `a/${stateNode.props.client.name}/d`,
  2389. val: numDefense
  2390. }) : stateNode.props.liveGameController.setVal({
  2391. path: `c/${stateNode.props.client.name}/d`,
  2392. val: numDefense
  2393. });
  2394. }
  2395. }
  2396. ],
  2397. workshop: [
  2398. {
  2399. name: "Remove Distractions",
  2400. description: "Removes all enemy distractions",
  2401. run: function () {
  2402. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ fog: !1, dusk: !1, wind: !1, plow: !1, blizzard: !1, force: !1, canada: !1, trees: [!1, !1, !1, !1, !1, !1, !1, !1, !1, !1] });
  2403. }
  2404. },
  2405. {
  2406. name: "Send Distraction",
  2407. description: "Sends a distraction to everyone else playing",
  2408. inputs: [{
  2409. name: "Distraction",
  2410. type: "options",
  2411. options: Object.entries({ c: "Oh Canada", b: "Blizzard", f: "Fog Spell", d: "Dark & Dusk", w: "Howling Wind", g: "Gift Time!", t: "TREES", s: "Snow Plow", fr: "Use The Force" }).map(([value, name]) => ({ name, value }))
  2412. }],
  2413. run: function (val) {
  2414. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2415. stateNode.safe = true;
  2416. stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/tat`, val });
  2417. }
  2418. },
  2419. {
  2420. name: "Set Toys",
  2421. description: "Sets amount of toys",
  2422. inputs: [{
  2423. name: "Toys",
  2424. type: "number"
  2425. }],
  2426. run: function (toys) {
  2427. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2428. stateNode.setState({ toys });
  2429. stateNode.props.liveGameController.setVal({
  2430. path: "c/".concat(stateNode.props.client.name),
  2431. val: {
  2432. b: stateNode.props.client.blook,
  2433. t: toys
  2434. }
  2435. });
  2436. }
  2437. },
  2438. {
  2439. name: "Set Toys Per Question",
  2440. description: "Sets amount of toys per question",
  2441. inputs: [{
  2442. name: "Toys Per Question",
  2443. type: "number"
  2444. }],
  2445. run: function (toysPerQ) {
  2446. Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner.stateNode.setState({ toysPerQ });
  2447. }
  2448. },
  2449. {
  2450. name: "Swap Toys",
  2451. description: "Swaps toys with someone",
  2452. inputs: [{
  2453. name: "Player",
  2454. type: "options",
  2455. options: () => {
  2456. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2457. return new Promise(res => stateNode.props.liveGameController._liveApp ? stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players))) : res([]));
  2458. }
  2459. }],
  2460. run: function (target) {
  2461. let { stateNode } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
  2462. stateNode.props.liveGameController.getDatabaseVal("c", (players) => {
  2463. if (players && Object.keys(players).map(x => x.toLowerCase()).includes(target.toLowerCase())) {
  2464. let [player, { t: toys }] = Object.entries(players).find(([name]) => name.toLowerCase() == target.toLowerCase());
  2465. stateNode.props.liveGameController.setVal({
  2466. path: "c/".concat(stateNode.props.client.name),
  2467. val: {
  2468. b: stateNode.props.client.blook,
  2469. t: toys,
  2470. tat: `${player}:swap:${stateNode.state.toys}`
  2471. }
  2472. });
  2473. stateNode.setState({ toys });
  2474. }
  2475. });
  2476. }
  2477. }
  2478. ],
  2479. settings: [
  2480. {
  2481. name: "Import Settings",
  2482. description: "Import a custom theme",
  2483. inputs: [
  2484. {
  2485. name: "JSON Data",
  2486. type: "string"
  2487. }
  2488. ],
  2489. run: function (theme) {
  2490. try {
  2491. JSON.parse(theme);
  2492. } catch (e) {
  2493. return alert("Invalid JSON provided");
  2494. }
  2495. theme = { backgroundColor: "rgb(11, 194, 207)", infoColor: "#9a49aa", cheatList: "#9a49aa", defaultButton: "#9a49aa", disabledButton: "#A02626", enabledButton: "#47A547", textColor: "white", inputColor: "#7a039d", contentBackground: "rgb(64, 17, 95)", ...JSON.parse(theme) }
  2496. Settings.setItem("theme", theme);
  2497. for (const prop in theme) variables.sheet.cssRules[0].style.setProperty(`--${prop}`, theme[prop]);
  2498. }
  2499. },
  2500. {
  2501. name: "Export Settings",
  2502. description: "Export the current theme to JSON",
  2503. run: async function () {
  2504. await navigator.clipboard.writeText(JSON.stringify(Settings.data.theme, null, 4));
  2505. prompt("Text copied to clipboard. (Paste below to test)");
  2506. }
  2507. },
  2508. {
  2509. name: "Defaults",
  2510. description: "Changes all the settings to a preset",
  2511. inputs: [
  2512. {
  2513. name: "Theme",
  2514. type: "options",
  2515. options: [
  2516. {
  2517. name: "Default",
  2518. value: {
  2519. backgroundColor: "rgb(11, 194, 207)",
  2520. infoColor: "#9a49aa",
  2521. cheatList: "#9a49aa",
  2522. defaultButton: "#9a49aa",
  2523. disabledButton: "#A02626",
  2524. enabledButton: "#47A547",
  2525. textColor: "white",
  2526. inputColor: "#7a039d",
  2527. contentBackground: "rgb(64, 17, 95)"
  2528. }
  2529. },
  2530. {
  2531. name: "Blacket",
  2532. value: {
  2533. backgroundColor: "#4f4f4f",
  2534. infoColor: "#2f2f2f",
  2535. cheatList: "#2f2f2f",
  2536. defaultButton: "#4f4f4f",
  2537. disabledButton: "#eb6234",
  2538. enabledButton: "#00c20c",
  2539. textColor: "white",
  2540. inputColor: "#3f3f3f",
  2541. contentBackground: "#2f2f2f"
  2542. }
  2543. },
  2544. {
  2545. name: "Skool.lol",
  2546. value: {
  2547. backgroundColor: "linear-gradient(90deg, rgba(104,45,140,1) 220px, rgba(237,30,121,1) 100%)",
  2548. cheatList: "#1e2124",
  2549. infoColor: "#1e2124",
  2550. defaultButton: "#36393e",
  2551. inputColor: "#1e2124",
  2552. enabledButton: "#9c9a9a",
  2553. textColor: "white",
  2554. disabledButton: "#171717",
  2555. contentBackground: "#292929"
  2556. }
  2557. },
  2558. {
  2559. name: "Blue - Purple Background",
  2560. value: {
  2561. backgroundColor: "linear-gradient(162.5deg, rgba(0,183,255,1) 220px, rgba(128,0,255,1) 100%)"
  2562. }
  2563. },
  2564. {
  2565. name: "Saint Patricks Background",
  2566. value: {
  2567. backgroundColor: "rgb(9, 148, 65)"
  2568. }
  2569. },
  2570. {
  2571. name: "Halloween Background",
  2572. value: {
  2573. backgroundColor: "rgb(41, 41, 41)"
  2574. }
  2575. },
  2576. {
  2577. name: "Fall Background",
  2578. value: {
  2579. backgroundColor: "rgb(224, 159, 62)"
  2580. }
  2581. },
  2582. {
  2583. name: "Winter Background",
  2584. value: {
  2585. backgroundColor: "linear-gradient(rgb(49, 170, 224), rgb(187, 221, 255))"
  2586. }
  2587. },
  2588. {
  2589. name: "Crypto Hack",
  2590. value: {
  2591. backgroundColor: "radial-gradient(#11581e,#041607)",
  2592. infoColor: "#1a1a1a",
  2593. cheatList: "#1a1a1a",
  2594. defaultButton: "rgb(88 175 88)",
  2595. disabledButton: "#A02626",
  2596. enabledButton: "#0b601b",
  2597. textColor: "white",
  2598. inputColor: "rgb(0 0 0 / 25%)",
  2599. contentBackground: "#11581e"
  2600. }
  2601. },
  2602. {
  2603. name: "Fishing Frenzy",
  2604. value: {
  2605. backgroundColor: "linear-gradient(180deg,#9be2fe 0,#67d1fb)",
  2606. infoColor: "#c8591e",
  2607. cheatList: "#c8591e",
  2608. defaultButton: "#ff751a",
  2609. disabledButton: "#bf0e0e",
  2610. enabledButton: "#2fb62f",
  2611. textColor: "white",
  2612. inputColor: "rgb(0 0 0 / 25%)",
  2613. contentBackground: "radial-gradient(#02b0ea 40%, #1d86ea)"
  2614. }
  2615. },
  2616. {
  2617. name: "Deceptive Dinos",
  2618. value: {
  2619. backgroundColor: "radial-gradient(rgba(220, 184, 86, 0), rgba(220, 184, 86, 0.4)), url(\"https://ac.blooket.com/play/111cb7e0ee6607ac3d1a13d534c0e0f1.png\"), #ead49a",
  2620. infoColor: "#af8942",
  2621. cheatList: "#af8942",
  2622. defaultButton: "#af8942",
  2623. disabledButton: "#A02626",
  2624. enabledButton: "#47A547",
  2625. textColor: "white",
  2626. inputColor: "rgb(0 0 0 / 10%)",
  2627. contentBackground: "radial-gradient(rgba(1,104,162,.6),rgba(24,55,110,.5)),radial-gradient(#2783b4 1.5px,#18376e 0) center / 24px 24px"
  2628. }
  2629. },
  2630. {
  2631. name: "Blook Rush",
  2632. value: {
  2633. backgroundColor: "repeating-linear-gradient(45deg,white,white 8%,#e6e6e6 0,#e6e6e6 16%)",
  2634. defaultButton: "#36c",
  2635. inputColor: "rgb(0 0 0 / 25%)",
  2636. infoColor: "#36c",
  2637. cheatList: "#36c",
  2638. contentBackground: "#888",
  2639. textColor: "white",
  2640. disabledButton: "#A02626",
  2641. enabledButton: "#47A547"
  2642. }
  2643. },
  2644. {
  2645. name: "Factory",
  2646. value: {
  2647. defaultButton: "#1563bf",
  2648. infoColor: "#a5aabe",
  2649. cheatList: "#a5aabe",
  2650. contentBackground: "#2d313d",
  2651. backgroundColor: "#3a3a3a",
  2652. enabledButton: "rgb(75, 194, 46)",
  2653. disabledButton: "#9a49aa",
  2654. inputColor: "rgb(0 0 0 / 25%)",
  2655. textColor: "white"
  2656. }
  2657. },
  2658. {
  2659. name: "Cafe",
  2660. value: {
  2661. backgroundColor: "linear-gradient(90deg,rgba(200,0,0,.5) 50%,transparent 0) center / 50px 50px,linear-gradient(rgba(200,0,0,0.5) 50%,transparent 0) white center / 50px 50px",
  2662. defaultButton: "#0bc2cf",
  2663. inputColor: "rgb(0 0 0 / 25%)",
  2664. infoColor: "#ac7339",
  2665. cheatList: "#ac7339",
  2666. contentBackground: "rgb(64, 64, 64)",
  2667. textColor: "white",
  2668. disabledButton: "#A02626",
  2669. enabledButton: "#47A547"
  2670. }
  2671. },
  2672. {
  2673. name: "Tower of Doom",
  2674. value: {
  2675. backgroundColor: "rgb(41 41 41)",
  2676. disabledButton: "rgb(151, 15, 5)",
  2677. defaultButton: "#333",
  2678. inputColor: "rgb(0 0 0 / 25%)",
  2679. contentBackground: "#404040",
  2680. enabledButton: "#4bc22e",
  2681. textColor: "white",
  2682. infoColor: "#9a49aa",
  2683. cheatList: "#9a49aa"
  2684. }
  2685. },
  2686. {
  2687. name: "Monster Brawl",
  2688. value: {
  2689. defaultButton: "rgb(45, 51, 67)",
  2690. backgroundColor: "rgb(78, 95, 124)",
  2691. inputColor: "rgb(0 0 0 / 25%)",
  2692. contentBackground: "linear-gradient(0deg,#374154,#4f5b74)",
  2693. infoColor: "#374154",
  2694. cheatList: "#374154",
  2695. textColor: "white",
  2696. enabledButton: "#47A547",
  2697. disabledButton: "#A02626"
  2698. }
  2699. },
  2700. {
  2701. name: "Tower Defense 2",
  2702. value: {
  2703. backgroundColor: "url(https://media.blooket.com/image/upload/v1676164454/Media/defense/backgroundTd1-02.svg) center / cover",
  2704. cheatList: "#a33c22",
  2705. infoColor: "#a33c22",
  2706. defaultButton: "#40b1d8",
  2707. inputColor: "#3e8cbe",
  2708. contentBackground: "#293c82",
  2709. enabledButton: "#47A547",
  2710. disabledButton: "#A02626",
  2711. textColor: "white"
  2712. }
  2713. },
  2714. ]
  2715. }
  2716. ],
  2717. run: function (theme) {
  2718. Settings.setItem("theme", { ...Settings.data.theme, ...theme });
  2719. for (const prop in theme) variables.sheet.cssRules[0].style.setProperty(`--${prop}`, theme[prop]);
  2720. }
  2721. },
  2722. {
  2723. name: "Scale",
  2724. description: "Forces the GUI to scale from 25%-100%",
  2725. inputs: [
  2726. {
  2727. type: "number",
  2728. name: "Percent scale",
  2729. min: 25,
  2730. max: 100,
  2731. value: (Settings.data.scale || 1) * 100
  2732. }
  2733. ],
  2734. run: function (scale) {
  2735. scale = Math.min(Math.max(scale, 25), 100);
  2736. Settings.setItem("scale", scale / 100);
  2737. guiWrapper.style.transform = `scale(${(scale / 100)})`;
  2738. }
  2739. },
  2740. {
  2741. name: "Hide Keybind",
  2742. description: "Change the hide keybind (Click button after input to change)",
  2743. inputs: [
  2744. {
  2745. type: "function",
  2746. name: "Input",
  2747. function: onchange => createKeybindListener(({ shift, ctrl, alt, key }) => onchange(`${[ctrl && "Ctrl", shift && "Shift", alt && "Alt", key && key.toUpperCase()].filter(Boolean).join(' + ')}`))
  2748. }
  2749. ],
  2750. run: function (hide) {
  2751. Settings.setItem("hide", hide);
  2752. controls.update(Settings.data.hide || { ctrl: true, key: "e" }, Settings.data.close || { ctrl: true, key: "x" });
  2753. }
  2754. },
  2755. {
  2756. name: "Close Keybind",
  2757. description: "Change the quick close keybind (Click button after input to change)",
  2758. inputs: [
  2759. {
  2760. type: "function",
  2761. name: "Input",
  2762. function: onchange => createKeybindListener(({ shift, ctrl, alt, key }) => onchange(`${[ctrl && "Ctrl", shift && "Shift", alt && "Alt", key && key.toUpperCase()].filter(Boolean).join(' + ')}`))
  2763. }
  2764. ],
  2765. run: function (close) {
  2766. Settings.setItem("close", close);
  2767. controls.update(Settings.data.hide || { ctrl: true, key: "e" }, Settings.data.close || { ctrl: true, key: "x" });
  2768. }
  2769. },
  2770. {
  2771. name: "Background Color",
  2772. description: "Changes the background color of the GUI",
  2773. inputs: [{
  2774. type: "string",
  2775. name: "Color"
  2776. }],
  2777. run: function (color) {
  2778. variables.sheet.cssRules[0].style.setProperty("--backgroundColor", color);
  2779. Settings.setItem("theme.backgroundColor", color);
  2780. }
  2781. },
  2782. {
  2783. name: "Category List Color",
  2784. description: "Changes the categories list background color",
  2785. inputs: [{
  2786. type: "string",
  2787. name: "Color"
  2788. }],
  2789. run: function (color) {
  2790. variables.sheet.cssRules[0].style.setProperty("--cheatList", color);
  2791. Settings.setItem("theme.cheatList", color);
  2792. }
  2793. },
  2794. {
  2795. name: "Info Color",
  2796. description: "Changes the color of the information at the top of the GUI",
  2797. inputs: [{
  2798. type: "string",
  2799. name: "Color"
  2800. }],
  2801. run: function (color) {
  2802. variables.sheet.cssRules[0].style.setProperty("--infoColor", color);
  2803. Settings.setItem("theme.infoColor", color);
  2804. }
  2805. },
  2806. {
  2807. name: "Button Color",
  2808. description: "Changes the color of the cheats",
  2809. inputs: [{
  2810. type: "string",
  2811. name: "Color"
  2812. }],
  2813. run: function (color) {
  2814. variables.sheet.cssRules[0].style.setProperty("--defaultButton", color);
  2815. Settings.setItem("theme.defaultButton", color);
  2816. }
  2817. },
  2818. {
  2819. name: "Enabled Toggle Color",
  2820. description: "Changes the color of enabled toggle cheats",
  2821. inputs: [{
  2822. type: "string",
  2823. name: "Color"
  2824. }],
  2825. run: function (color) {
  2826. Settings.setItem("theme.enabledButton", color);
  2827. }
  2828. },
  2829. {
  2830. name: "Disabled Toggle Color",
  2831. description: "Changes the color of disabled toggle cheats",
  2832. inputs: [{
  2833. type: "string",
  2834. name: "Color"
  2835. }],
  2836. run: function (color) {
  2837. variables.sheet.cssRules[0].style.setProperty("--disabledButton", color);
  2838. Settings.setItem("theme.disabledButton", color);
  2839. }
  2840. },
  2841. {
  2842. name: "Text Color",
  2843. description: "Changes the text color",
  2844. inputs: [{
  2845. type: "string",
  2846. name: "Color"
  2847. }],
  2848. run: function (color) {
  2849. variables.sheet.cssRules[0].style.setProperty("--textColor", color);
  2850. Settings.setItem("theme.textColor", color);
  2851. }
  2852. },
  2853. {
  2854. name: "Input Color",
  2855. description: "Changes the color of inputs, like the set gold number input",
  2856. inputs: [{
  2857. type: "string",
  2858. name: "Color"
  2859. }],
  2860. run: function (color) {
  2861. variables.sheet.cssRules[0].style.setProperty("--inputColor", color);
  2862. Settings.setItem("theme.inputColor", color);
  2863. }
  2864. },
  2865. {
  2866. name: "Content Color",
  2867. description: "Changes the background color of the cheats",
  2868. inputs: [{
  2869. type: "string",
  2870. name: "Color"
  2871. }],
  2872. run: function (color) {
  2873. variables.sheet.cssRules[0].style.setProperty("--contentBackground", color);
  2874. Settings.setItem("theme.contentBackground", color);
  2875. }
  2876. }
  2877. ]
  2878. };
  2879.  
  2880. addMode("Global", "https://media.blooket.com/image/upload/v1661496291/Media/uiTest/Games_Played_2.svg", Cheats.global)();
  2881. addMode("<span style=\"font-size: 18px\">Pirate's Voyage</span>", "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zOnNlcmlmPSJodHRwOi8vd3d3LnNlcmlmLmNvbS8iIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MjsiPjxnIGlkPSJCb2F0Ij48cGF0aCBkPSJNMTcwLjQsNTYuMDU0Yy02OC43ODgsMTAuMTc0IC0xMTUuOTcxLDU2LjkzOCAtMTQ1LjQxMSwxMzMuNzVsMTUuNDY5LDcuNzM0YzMwLjk2MiwtMjguMTc1IDc0LjcwNSwtMzcuNzg3IDEzMi4zMjIsLTI3LjI1bDAsLTE3LjYxMWMtMjUuNjI5LC0yNy45NTIgLTI2Ljk2NiwtNTYuNzcyIDAuNzE0LC04Ni42MjhsLTMuMDk0LC05Ljk5NVoiIHN0eWxlPSJmaWxsOiNmNmUwYmQ7Ii8+PHBhdGggZD0iTTE5OS42NzMsNjAuODEzYzMyLjc4NCw0Mi45ODIgNjUuODIyLDkwLjg4NyA5Ny4zMzcsMTM5LjU4MWwtNi42NjMsMGMtMTIuMDg1LC0zMS4xMTEgLTU3Ljg4MiwtMzkuNjk0IC05MS42MjYsLTI3LjI1YzIyLjUxNCwtMzQuNTc5IDE3Ljc5NiwtNzIuNjczIDAuOTUyLC0xMTIuMzMxWiIgc3R5bGU9ImZpbGw6I2Y2ZTBiZDsiLz48cGF0aCBkPSJNNjkuNDQ4LDE5Ny41MzhjMCwwIC01OS43MDcsLTE1LjI0MyAtNjguMzk4LC0xNy40NjJjLTAuMDc2LC0wLjAxOSAtMC4xNTQsMC4wMiAtMC4xODQsMC4wOTJjLTAuMDMsMC4wNzIgLTAuMDAyLDAuMTU1IDAuMDY1LDAuMTk1YzkuNjgyLDUuNzc1IDkxLjY0Nyw1NC42NTggOTEuNjQ3LDU0LjY1OGwtMjMuMTMsLTM3LjQ4M1oiIHN0eWxlPSJmaWxsOiM4ZDZlNDE7Ii8+PHBhdGggZD0iTTE2NC40NSw0Ny45MDNjMCwtNS4zNTMgNC4zNDYsLTkuNjk4IDkuNjk4LC05LjY5OGwxOS4zOTcsLTBjNS4zNTIsLTAgOS42OTgsNC4zNDUgOS42OTgsOS42OThsLTAsMTU2Ljk1M2MtMCw1LjM1MyAtNC4zNDYsOS42OTggLTkuNjk4LDkuNjk4bC0xOS4zOTcsMGMtNS4zNTIsMCAtOS42OTgsLTQuMzQ1IC05LjY5OCwtOS42OThsMCwtMTU2Ljk1M1oiIHN0eWxlPSJmaWxsOiM3ZjY4NDU7Ii8+PHBhdGggZD0iTTI2My45OTMsMjU2LjEwM2MyMi4xNzEsLTE0LjcxIDM2LjAwNywtMzUuNTE1IDM2LjAwNywtNTguNTY1bC0yMzAuNTUyLDBjMCwyMy43MTMgMTQuNjQzLDQ1LjA1IDM3Ljk0LDU5LjgxOWM5Ljg3NSwtMy43MjkgMjAuMDQxLC0xMS4zMzQgMzAuNDYzLC0yMi4zMzZjMzIuODExLDM1LjQ1NSA2NC4wNjksMzUuOTQzIDkzLjcwOCwwYzYuODM4LDkuNjc3IDE3LjczNiwxNi42NDYgMzIuNDM0LDIxLjA4MloiIHN0eWxlPSJmaWxsOiNiNjkyNWY7Ii8+PC9nPjwvc3ZnPg==", Cheats.voyage);
  2882. addMode("Gold Quest", "https://media.blooket.com/image/upload/v1661496292/Media/uiTest/Gold.svg", Cheats.gold);
  2883. addMode("Cafe", "https://media.blooket.com/image/upload/v1655161189/Media/survivor/Pizza_lvl1.svg", Cheats.cafe);
  2884. addMode("Crypto Hack", "https://media.blooket.com/image/upload/v1661496293/Media/uiTest/CryptoIcon.svg", Cheats.crypto);
  2885. addMode("<span style=\"font-size: 17px\">Deceptive Dinos</span>", [`<img style="height: 30px; margin-left: 8px; margin-right: 12px" src="https://media.blooket.com/image/upload/v1655161325/Media/survivor/Dog.svg">`], Cheats.dinos);
  2886. addMode("<span style=\"font-size: 18px\">Tower Defense</span>", [`<img style="width: 30px; margin-right: 5px" src="https://media.blooket.com/image/upload/v1657235025/Media/survivor/Laser_Lvl1.svg">`], Cheats.defense);
  2887. addMode("<span style=\"font-size: 16px\">Tower Defense 2</span>", [`<img style="width: 30px; margin-right: 5px; rotate: 45deg" src="https://media.blooket.com/image/upload/v1593095354/Media/defense/missile.svg">`], Cheats.defense2);
  2888. addMode("Factory", "https://media.blooket.com/image/upload/v1661496293/Media/uiTest/Factory_Upgrades.svg", Cheats.factory);
  2889. addMode("<span style=\"font-size: 19px\">Fishing Frenzy</span>", "https://media.blooket.com/image/upload/v1661496295/Media/uiTest/Fish_Weight.svg", Cheats.fishing);
  2890. addMode("Flappy Blook", "https://media.blooket.com/image/upload/v1645222006/Blooks/yellowBird.svg", Cheats.flappy);
  2891. addMode("<span style=\"font-size: 17px\">Tower of Doom</span>", [`<img style="height: 30px; margin-left: 5px; margin-right: 10px" src="https://media.blooket.com/image/upload/v1657235023/Media/survivor/cards-05.svg">`], Cheats.doom);
  2892. addMode("<span style=\"font-size: 18px\">Crazy Kingdom</span>", "https://media.blooket.com/image/upload/v1655161323/Media/survivor/Jester_lvl1.svg", Cheats.kingdom);
  2893. addMode("Racing", "https://media.blooket.com/image/upload/v1661496295/Media/uiTest/Racing_Progress.svg", Cheats.racing);
  2894. addMode("Battle Royale", "https://media.blooket.com/image/upload/v1655936179/Media/br/VS_Lightning_Bolt_Bottom.svg", Cheats.royale);
  2895. addMode("Blook Rush", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAA7YSURBVHic7Z17tFxVfcc/e59zZib3kcfN456YQObOTB43PBIKoeIqSlwIBXwiCCytXe2qxabSWrAqLKmwXKthVRe2BFxitYpasSIPV0sI8mhV5GHVdpWaoCRIvAnZSW/uzeuG3Nec/jFzk8mYOXNm73PmeT7/zt6/s+/d399vv/cWnufRSSilZgEXAZcBl42MHF5m23KrlPJBKcU9mUx6pLElrC+iEwSglFpOscIpVH5q5rfh4YPH0wkBlmUNW5b8oZTyi9ls+ol6l7XetKUAyrz8ciBbKW2pAMqRUk62e3RoGwH4ebkffgIopV2jQ8sKoOjl6zlR6RW93I+gAiinGB22SSkfklJsatXo0FICUEqt4ESFv4WAXu6HrgBKKYkOPypGh+8bG60TTS0ApVQXJ3t5JuxvhCGAcorR4aVidLg7k0kPh/6RkGg6AUTh5X5EIYBSmj06NFwA9fByP6IWQDnNFh0aIgCl1EpO9vJk3QtRpN4CKKUYHfYXo8O92Wx6S93LUA8BFL38rZyo9IHIPxqQRgqgHCnlVEl02FSP6BCZAIpefjmFCn8zDfRyP5pJAKWURIdnin2HSKJDaAJQSnVzclveNF7uR7MKoJyy6HBPJpPeF4ZdIwEopVZxosKb1sv9aBUBlFIWHb6UzaY3a9uqRQBFLy9ty9O6H24WWlEA5RSjwy+llA8X+w6Bo0NVASilBjlR4RfSgl5+KiY9eP6g4IWhad7Xf4Qu2VzzIboUo8NISXR41De9nwCUUpcAj4ddyEaxaxyeHhU8PQLPHBSMTQP7FoHwWDBrnPPnjXFd/yHW9kw0uqihkUolbsnlBjZW+t2ukl+GXJ66MunBcwcFT48WKv7loxUSeoLhoyk2H02xefd8HHuK5b2v8/sLj3DNosOtHh0svx+rCaDlKPXyHx0UHJ2u3cbklM3W0V62jvZy58tu20YHaAMBTOTh+UMBvFwXn+hw9cLD9FgtHR1aUwBDx4pePlpoy3W8XJfy6DD/eHQ4zDk94/UrSEi0hAAm8vDcjJePCLa/3ugSFfEE+4+meOxoisd2z8dxCtHhkvmFvkMrRIemFcBvSrz8x3X2cl0mJ222jvSydaSXv9/uMr9rnHVzxri2/zDn9jZndGgaATStl+viCfaPpdgylmLLa80bHRoqgFIvf+aA4PV8I0sTLc0aHeoqgBkvf2qkUPE7Wt3LdSmPDvYUudmF6HBtnaND5ALYWdqWt7mX6zI5ZbNtpJdtI738w3aXvlnjrJtXiA7nRTyyiEwAvxiDP31J8kqnerkunmDkaIrHj6Z4vDjvsHHVHi7tC3uCo0BkU737JkRc+SEwOWXz6rgTmf2WnuuPMScWQIcTC6DDiQXQ4cQC6HBiAXQ4sQA6nFgAHU4sgA4nFkCHEwugw4kF0OHEAuhwYgF0OLEAOpxqAtDei2sL3Zwx5SQx2kY16fdjNQFob+mYazfHrtd2YFFCf0+8EOKw3+/VBKC9D2lu02w4b30WJ40ORRzw+zG6CBDdLqaO4w3JKZPsvjdgRBYBeq24HxAKAvodowhgJACjbZ1z4mbAGCHM9tELge8l1pEKIO4HmGNL44MUo34/VhPAEUD7RoR5sQCMSVjGAtjr96OvAFzX9YBdul+e68RDQVOSBgKQUk5mMmlfA0FmAod0CxA3AeZ02SYCEGNV0wSwoy2ABfFQ0Jg5tv4QUAjh2/5DxAI4o1s3Z8wMqw0OhwohVLU0kQpgTU/cBzDlonn6AzEhxM5qaYIIoKqRSmS7oMf3lroYP4TweNNsEwHwUrU0QQTwM90CSOCsHt3cMT3JSaPZVCnFg1XTVEvguu5e4BXdQsTNgD6ndx3TzlscAv5v1XQB7T2rW5A1cQTQZk2vvgAsSwaav4leAL1xBNBl/Tz9W0GklC8EShfQ3nO6BUmnYHY8IVQzQnqcP1t/CCileCRQuoD2XqSwLlAzgrgfoENvckJ7w6YQwhOCh4OkDfQN13WngUAh5VSc26ubs3PJdRu1/6OZTDrQIl4tItPuB7xzQRwBauUPFus/ZWNZ8hdB09ZFAIPdsKpLN3fnkXCmuNhsBjDw87S1COB5QNuVr1wUR4GgrOvT6m4dR0rxjcBpgyZ0XfcAsE2rRMB7FnrEWwSD8eElVRfxKmJZcjyTSQeevq+1o6ndDCxNwrrZurk7h57khNGzNJYlX60lfa0C+GGN6U/iyoVxM1CNCxf4nuOoipTyP2pKX6P9h4Gqu0wq8Y4FXrxV3A8BG5b6nuPwzy4EUopP15KnJgG4rnsEeKCmUpXQ58BF8+IoUIm+WcdIGxwCsW1reyaT9t0EWo7OZNNXNfIc5z0LTXK3N5cuNAv/ti3vqjWP1uPRSqmXgVzNGSk8GvHGn0n2NMsTOvsWNboEAFjWNM+8cYf2YxFSysnVq5cnas6n9TX4mmY+EhI+elrcDJRzqXvA6KUQx7F+oJNPVwD3gf6h9ev6PZa2xRPU4WBZ09w+sN/IhpTyFq18Oplc190FPKGTF8ARcRQo5YrFB0gZvE9s29ZwNpv+T528JlfE/JNBXq7p91iWMrHQHtjWNJ9Om3m/bVvf1M1rIoDvgf/JUz9sATeeHkeBdy0ZIWHg/UIIr9axfynaAnBddxz4lm5+gPcu9MjMMrHQ2jj2FJ9Ka/tQwYZjvZjJpA/p5je9JcyoGbAE3NTBUeDKJaPGz7ZZlnWHSX6teYBSlFI/B87RzZ8H1v9c8qtoXkWrToPmARL2FC9csMNoatyy5OuDg8uNdlqEcU/graYF+Gwu33EXFv51bq/xuojj2H9nWg7j/7vruo8CT5rYOH82/NnSzmkKzpp/iGsXmW36sG1rJJcbuM20LGE53k0YTAwBfGKZx+oOOE2cdCb58mDVQ7tVcRz7+hCKE44AXNf9Hww7hI6ATSvyOG29XOyxcdUeugyGfQCJhP3LbDb93TBKFGbT+ynAaDlrdTd8fFn7NgW/13+Atxls9oTCuN+2ratCKlJ4AigeIjUakgBsWOq15dax7tQEm1bsM7aTSNhPBjn0GZSwO993Ar8xMSApNAXd7XSvgPC4e/Vrxr1+KeWUZcn3hVOoos0wjbmuewz4pKmdZSm4baB9moK3LxnhPIOrXmZIJOwvZjJp/T1jpyCK4fe3MThGNsMHXI9r+ltfBKfPHmNjZtjYjm1bR6QUfxlCkU4idAEU7xa8MQxbn8t5XNzXuiLo6zrGw2fvDsWW49gfq3bnnw6RTMC5rvss8B1TO7aAL63yOK8FD5d2Jyf43toho5W+GRzHHspm0/eGUKzfIsoZ2I9S5ZrSIMyS8I0z8qxoobOFCXuKB9YOMdfgkscZpBR527beGUKxTm0/KsOu6+4BrsPg2ZkZ5trw7TPyvKEFtpFZ1jT3rRniNLM7/o+TTDofy2bT/x2KsVMQ6RqM67r/juFi0QyLkwURNPP1s0LkuevM3ZzZrX+0q5Rk0vl+Njvw+VCMVaAei3B3AP8WhqHlXYXmYFYzLh0Kj79ZtYc3zzGb6ZvBcay9liUvC8WYD5H/K4ujgg8Cr4Zh77xe+PKgR6qZRCA8PpLby1ULzVb4ZpBSTjmOfUEUvf7f+lbUHwBwXXcUuBoI5TjIW+d5PHJ2nv6aj0GEj5R5/nb1Lq43uNGjFCEgmXT+OJNJ/zoUg1Womx+5rvtTCiODUFjTA4+tyTf0QupUYpJ/Pmcn75gf3namRCJxfzabDnzBgynGW8JqRSn1TeD9Ydk7Og1//ivBlv2aE+2aW8IWdB/jwbN30Wf2oNNJOI796sqV2YHQDAagES3p9UDgS4yq0WXBVwY9NtRxR9FZ8w/xxO/sDLXyLUuOO471u6EZDEjdBeC67hhwFZr3Dp4KCdya9rhzuRf5hpJ3nzbMt87YE+o9B0IIL5Fwrsxk0ubrxTXSkL6067ovAR+gyru2tXJdv8e/nJmP5LEqIfN8cuVrfMbwDN+pSCadO7LZ9ObQDQeg7n2AUpRS76KwZhBqf373OHxiu+Cp0QBuGqAP0Nd1jLsG97AmpAmeUlKpxMZcbkDrYGcYNFQAAEqpy4GHgNAneh/5P8GtrwiG/eKMjwCkzHPtacPcvEz/1q5KFIZ7idtyuYHbQzdeSzkaLQAApdQlwCNA6AfFDk7B7b8W3L+3QjSoIIBls8e4d1CxJKQ5/VKEECSTzi253MDG0I3XWpZmEACAUmo98K9AJCP7Hx8UfHy74JXymdoyAdj2NH+V3csH+82ua6mEEIJUyrkx6jn+oDSNAACUUhcCm4FInpkYz8PnhwRf2CWYnPmzSwSwdsEhvrByL73mr3WeEiGEl0o5N2SzA/dE8gENmkoAAEqpC4AtQGR7g7eNwc07JC8cAvYtoic5wWdWKKP7eatRqPzE9dls+h8j+4gGTScAAKXUOuBxYF6U33lyRPDskMeGJeHM41eiWPl/lM2m74v0Qxo0pQAAlFLnULiGZn6U3xkerkvlvz+bTd8f6Yc0aaZF1ZNwXfe/gPVAXVbFokBKOZVKJa5q1sqHJhYAgOu6LwJrgab9B1bCceydqZSTzmbTDzW6LH40bRNQjlLqD4G7CXmEEHYTIITwkknnK7ncwIdCNRwRTR0BSnFd9z4KN5H8tNFlqYRlWWOpVOJtrVL50EICAHBddzvwJuCzGLxeEgWJhPOTZNJelM2mn2p0WWqhZZqAcpRSFwNfBxab2DFtAqQU+UTCuTmXGzC+rqURtKwAAJRSCyncXn6Frg0TATiOtc9x7LdkMumqr3Q3Ky0tgBmUUjdQaBZqXlHUEYAQkEg4312+PHN1zZmbjJbqA1TCdd1NwLkY3F8cFNu29qdSyXe3Q+VDm0SAUpRSVwCfA1YFSR80AliWnHAce2MYN3M1E20RAUopXlt3FnADYLx/qziufyCZdOa0W+VDG0aAUpRSc4GbgQ1UmECqFAGEEJ7j2D+xbXlNLe/wtRptLYAZlFJ9FCLCXwB9pb+VC6CwQ9f+gWXJP8lk0jvqV8rG0BECmEEp1UPhXMJNFOcPZgQgpcg7jv2oZckP1fryVivTUQKYQSmVpHBg9cOjo4dXOY79oJTiIybXrrcq/w99zo6mO4xCQAAAAABJRU5ErkJggg==", Cheats.rush);
  2896. addMode("<span style=\"font-size: 18px\">Monster Brawl</span>", [`<img style="height: 28px; margin-left: 5px; margin-right: 8px" src="https://media.blooket.com/image/upload/v1655233787/Media/survivor/xp/Blue_xp_2.svg">`], Cheats.brawl);
  2897. addMode("<span style=\"font-size: 15px\">Santa's Workshop</span>", ['<img style="height: 28px; margin-left: 3px; margin-right: 6px" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8cGF0aCBzdHlsZT0iZmlsbDojRkZERTc2OyIgZD0iTTQzMy42NjEsMjM3LjgzN2MtNC40OTctNi4yMTQtNC44OC0xNC40NC0xLjIyNS0yMS4xODRjMTEuMzY1LTIwLjk2NywxNy43NzMtNDUuMDE0LDE3LjY1MS03MC41NjYKCUM0NDkuNzAxLDY0Ljg2OSwzODIuNTY0LTEuMDM3LDMwMS4zNTIsMC4wMTJjLTgwLjE4MywxLjAzNi0xNDQuODY0LDY2LjM1OS0xNDQuODY0LDE0Ni43ODhjMCwzMi41NTMsMTAuNTk1LDYyLjYzLDI4LjUyNiw4Ni45NzIKCWM3Ljc1MywxMC41MjYsNy4yMTMsMjUuMS0xLjU0MywzNC44MDhjLTEzLjI5NywxNC43NDEtNDEuOTM1LDI0LjMwNi0xMDIuNTk1LTE2LjI3N2MtNi42NTItNC40NS0xNC40NjItNi44NjQtMjIuNDY1LTYuODY0bDAsMAoJYy0xOS45NDcsMC0zNi44MzMsMTQuNjI4LTM5Ljc3NiwzNC4zNTdDNy44ODksMzUxLjgxNiw2LjUyLDUxMiwyMDYuOTY2LDUxMmg3MS4wODNDNDY2LjA1LDUxMiw1MTYuMTI3LDM1MS44MDEsNDMzLjY2MSwyMzcuODM3eiIvPgo8Zz4KCTxwYXRoIHN0eWxlPSJmaWxsOiNGRkI2NDE7IiBkPSJNMTgzLjQ3LDI2OC41ODJjLTMuOTMsNC4zNTctOS4yMDIsOC4yNjEtMTYuMjQ0LDEwLjU1MmMyNC40NjksNS44ODIsMzguODItMS4zMTksNDcuMTQ5LTEwLjU1MgoJCWM4Ljc1Ny05LjcwOCw5LjI5Ni0yNC4yODEsMS41NDMtMzQuODA4Yy0xNy45My0yNC4zNDItMjguNTI2LTU0LjQyLTI4LjUyNi04Ni45NzNjMC03NS44MzMsNTcuNTAzLTEzOC4yMjYsMTMxLjI4MS0xNDUuOTgKCQljLTUuNjg5LTAuNjAxLTExLjQ2Ny0wLjg4NC0xNy4zMjMtMC44MDljLTgwLjE4MywxLjAzNi0xNDQuODY0LDY2LjM1OS0xNDQuODY0LDE0Ni43ODhjMCwzMi41NTMsMTAuNTk1LDYyLjYzLDI4LjUyNiw4Ni45NzMKCQlDMTkyLjc2NiwyNDQuMywxOTIuMjI2LDI1OC44NzMsMTgzLjQ3LDI2OC41ODJ6Ii8+Cgk8cGF0aCBzdHlsZT0iZmlsbDojRkZCNjQxOyIgZD0iTTQ5LjUzOSwyNzkuNzk2YzIuMTM3LTE0LjMxNywxMS42MTgtMjUuOTQyLDI0LjI4Mi0zMS4yNDVjLTQuODY2LTIuMDIyLTEwLjA5MS0zLjExLTE1LjQxMi0zLjExCgkJbDAsMGMtMTkuOTQ3LDAtMzYuODMzLDE0LjYyOC0zOS43NzYsMzQuMzU3QzcuODg5LDM1MS44MTYsNi41Miw1MTIsMjA2Ljk2Niw1MTJoMzAuOTA1QzM3LjQyNSw1MTIsMzguNzk0LDM1MS44MTYsNDkuNTM5LDI3OS43OTZ6CgkJIi8+Cgk8cGF0aCBzdHlsZT0iZmlsbDojRkZCNjQxOyIgZD0iTTgwLjUxOCwzNDQuMzM2Yy04Ljc2Niw4LjY1Ni0xMC4yNzcsMjIuMjY4LTMuNTk4LDMyLjYxOQoJCWMxOS41MDQsMzAuMjI3LDY4LjM1MSw4Ni4yODMsMTYyLjM3Miw4Ni4yODNjNTcuMjU2LDAsMTE3Ljc5MS0zNS44MDksMTI5LjA2NC05NS4wOTdjOS4zMS00OC45NjYtMTkuMjQ2LTEwOC44MjEtNzUuMzMtMTA2LjI0NwoJCWMtNDEuMDk3LDEuODg3LTY1LjEzNSwzNy40MTUtOTkuODY1LDUzLjg0MWMtMjQuMzk4LDExLjU0LTUwLjg0NCwxOC42NTEtNzcuNjg3LDIxLjMwNwoJCUMxMDIuNjk4LDMzOC4zMDYsOTAuODA1LDMzNC4xNzgsODAuNTE4LDM0NC4zMzZ6Ii8+CjwvZz4KPHBhdGggc3R5bGU9ImZpbGw6IzM4NDg0QTsiIGQ9Ik0zODguMzk0LDExMC44MzNjLTMuNTAyLDAtNi42NzQtMi4zOTYtNy41MTMtNS45NTFsLTMuNzE1LTE1LjczCgljLTAuOTgxLTQuMTUzLDEuNTkxLTguMzE1LDUuNzQzLTkuMjk1YzQuMTUyLTAuOTc5LDguMzE1LDEuNTkxLDkuMjk1LDUuNzQzbDMuNzE1LDE1LjczYzAuOTgxLDQuMTUzLTEuNTkxLDguMzE1LTUuNzQzLDkuMjk1CglDMzg5LjU4LDExMC43NjUsMzg4Ljk4MiwxMTAuODMzLDM4OC4zOTQsMTEwLjgzM3oiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0ZGQjY0MTsiIGQ9Ik00MjcuNjE4LDY4Ljk5NGMwLDAsMy4xOTgsNDUuODMyLTE4LjAzMyw2Ni41OTFjLTIxLjIzMSwyMC43NTksMTQuMTU0LDUzLjMxNCw1Ni4xNDUsMjIuNjQ2CgljNi4wMzItNC40MDUsMTIuMTQzLTcuMjA0LDE4LjE4NC04Ljc2OGM3Ljc3Ny0yLjAxMiwxMy4yNDMtOC45NjcsMTMuMjQzLTE2Ljk5OWwwLDBjMC03LjcyNC01LjAzMS0xNC41OTctMTIuNDM4LTE2Ljc4NgoJYy00LjkyNS0xLjQ1Ni0xMS4xOC0yLjMyNS0xOC41MTYtMS4zMjVjMCwwLDI1LjM5My0yMi4xMzgsMTkuMTE5LTQ3Ljc1M2MtMi4wMjctOC4yOC0xMS44NTYtMTEuNzI2LTE4LjgzNi02LjgzMgoJQzQ1Ny40NjEsNjYuMDk0LDQ0My40NTQsNzIuNzY0LDQyNy42MTgsNjguOTk0eiIvPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K">'], Cheats.workshop);
  2898. addMode("Settings", null, Cheats.settings, true);
  2899.  
  2900. dragElement(controls, guiWrapper);
  2901. dragElement(dragButton, guiWrapper);
  2902.  
  2903. function dragElement(element, parent) {
  2904. var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  2905. element.onpointerdown = function (e = window.event) {
  2906. pos3 = e.clientX;
  2907. pos4 = e.clientY;
  2908. document.onpointerup = function () {
  2909. document.onpointerup = null;
  2910. document.onpointermove = null;
  2911. };
  2912. document.onpointermove = function (e = window.event) {
  2913. pos1 = pos3 - e.clientX;
  2914. pos2 = pos4 - e.clientY;
  2915. pos3 = e.clientX;
  2916. pos4 = e.clientY;
  2917. var ratio = 1 || parseFloat((0.75 / window.devicePixelRatio).toFixed(2));
  2918. parent.style.top = (parent.offsetTop - pos2 / ratio) + "px";
  2919. parent.style.left = (parent.offsetLeft - pos1 / ratio) + "px";
  2920. }
  2921. }
  2922. }
  2923. window.addEventListener("keydown", keydown);
  2924. function close() {
  2925. guiWrapper.remove();
  2926. for (const category in Cheats) for (const cheat of Cheats[category]) if (cheat.enabled) cheat.run()
  2927. Object.keys(Cheats).forEach(mode => Cheats[mode].forEach(cheat => cheat.enabled && (cheat.run(), setCheats(...currentMode))));
  2928. window.removeEventListener("keydown", keydown);
  2929. };
  2930. let last;
  2931. guiWrapper.addEventListener("mousemove", e => {
  2932. if (e.target.className != "cheatName" && e.target.className != "scriptButton") {
  2933. if (tooltip.style.opacity != "0") {
  2934. tooltip.animate([{ opacity: 0.9 }, { opacity: 0 }], { duration: 200 });
  2935. tooltip.style.opacity = "0";
  2936. }
  2937. return;
  2938. }
  2939. const target = e.target.className == "scriptButton" ? e.target : e.target.parentElement;
  2940. if (tooltip.innerText == target.dataset.description && tooltip.style.opacity == "0.9") return;
  2941. const button = target.getBoundingClientRect();
  2942. const parent = target.offsetParent.getBoundingClientRect();
  2943. tooltip.innerText = target.dataset.description;
  2944. if (tooltip.style.opacity == "0") {
  2945. tooltip.animate([{ opacity: 0 }, { opacity: 0.9 }], { duration: 200 });
  2946. tooltip.style.opacity = "0.9";
  2947. }
  2948. tooltip.style.left = (button.x - parent.x) + (button.width - tooltip.clientWidth) / 2 + "px";
  2949. tooltip.style.top = (button.y - parent.y) + (button.height) + "px";
  2950. });
  2951. function keydown(e) {
  2952. let hideKey = Settings.data.hide || { ctrl: true, key: "e" };
  2953. let closeKey = Settings.data.close || { ctrl: true, key: "x" };
  2954. if (((hideKey.ctrl && e.ctrlKey) || (!hideKey.ctrl && !e.ctrlKey)) && ((hideKey.shift && e.shiftKey) || (!hideKey.shift && !e.shiftKey)) && ((hideKey.alt && e.altKey) || (!hideKey.alt && !e.altKey)) && e.key.toLowerCase() == hideKey.key) {
  2955. e.preventDefault();
  2956. guiWrapper.style.display = guiWrapper.style.display === "block" ? "none" : "block";
  2957. } else if (((closeKey.ctrl && e.ctrlKey) || (!closeKey.ctrl && !e.ctrlKey)) && ((closeKey.shift && e.shiftKey) || (!closeKey.shift && !e.shiftKey)) && ((closeKey.alt && e.altKey) || (!closeKey.alt && !e.altKey)) && e.key.toLowerCase() == closeKey.key) {
  2958. e.preventDefault();
  2959. close();
  2960. }
  2961. }
  2962. function createKeybindListener(onpress, element = window) {
  2963. return new Promise(resolve => {
  2964. const pressed = {};
  2965. let shift, ctrl, alt, key;
  2966. const keydown = e => {
  2967. e.preventDefault();
  2968. pressed[e.code] = true;
  2969. shift ||= e.shiftKey;
  2970. ctrl ||= e.ctrlKey;
  2971. alt ||= e.altKey;
  2972. if (!["shift", "control", "alt", "meta"].includes(e.key.toLowerCase())) key = e.key.toLowerCase();
  2973. onpress?.({ shift, ctrl, alt, key });
  2974. };
  2975. const keyup = e => {
  2976. delete pressed[e.code];
  2977. if (Object.keys(pressed).length > 0) return;
  2978. element.removeEventListener("keydown", keydown);
  2979. element.removeEventListener("keyup", keyup);
  2980. resolve({ shift, ctrl, alt, key });
  2981. };
  2982. element.addEventListener("keydown", keydown);
  2983. element.addEventListener("keyup", keyup);
  2984. });
  2985. }
  2986. });
  2987. let img = new Image;
  2988. img.src = "https://raw.githubusercontent.com/05Konz/Blooket-Cheats/main/autoupdate/timestamps/gui.png?" + Date.now();
  2989. img.crossOrigin = "Anonymous";
  2990. img.onload = function() {
  2991. const c = document.createElement("canvas");
  2992. const ctx = c.getContext("2d");
  2993. ctx.drawImage(img, 0, 0, this.width, this.height);
  2994. let { data } = ctx.getImageData(0, 0, this.width, this.height), decode = "", last;
  2995. for (let i = 0; i < data.length; i += 4) {
  2996. let char = String.fromCharCode(data[i + 1] * 256 + data[i + 2]);
  2997. decode += char;
  2998. if (char == "/" && last == "*") break;
  2999. last = char;
  3000. }
  3001. let iframe = document.querySelector("iframe");
  3002. let _, time = 1710881112502, error = "There was an error checking for script updates. Run cheat anyway?";
  3003. try {
  3004. [_, time, error] = decode.match(/LastUpdated: (.+?); ErrorMessage: "((.|\n)+?)"/);
  3005. } catch (e) {}
  3006. if (parseInt(time) <= 1710881112502 || iframe.contentWindow.confirm(error)) cheat();
  3007. }
  3008. img.onerror = img.onabort = () => {
  3009. img.onerror = img.onabort = null;
  3010. cheat();
  3011. let iframe = document.querySelector("iframe");
  3012. iframe.contentWindow.alert("It seems the GitHub is either blocked or down.\n\nIf it's NOT blocked, join the Discord server for updates\nhttps://discord.gg/jHjGrrdXP6")
  3013. }
  3014. })();
  3015. })();