// ==UserScript== // @name BETTER BLOOKET HACKS // @namespace http://tampermonkey.net/ // @version 2025-03-05 // @description BEST GUI 2025 // @author poopersch4rtz // @match *://*.blooket.com/* // @match *://blooket.com/* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // @downloadURL https://update.greasyfork.icu/scripts/528823/BETTER%20BLOOKET%20HACKS.user.js // @updateURL https://update.greasyfork.icu/scripts/528823/BETTER%20BLOOKET%20HACKS.meta.js // ==/UserScript== /** * @license AGPL-3.0 * Blooket Cheats * Made this to give to friends at School /* THE UPDATE CHECKER IS ADDED DURING COMMIT PREP, THERE MAY BE REDUNDANT CODE, DO NOT TOUCH */ (() => { let iframe = document.querySelector("iframe"); if (!iframe) { iframe = document.createElement("iframe"); iframe.style.display = "none"; document.body.append(iframe); } /* By pooperschw4rtz - TikTok */ if (window.fetch.call.toString() == 'function call() { [native code] }') { const call = window.fetch.call; window.fetch.call = function () { if (!arguments[1].includes("s.blooket.com/rc")) return call.apply(this, arguments); } } const timeProcessed = 1732772258234; let latestProcess = -1; const cheat = (async () => { const versionName = "v1"; const gui = document.createElement("div"); Object.assign(gui.style, { top: window.innerHeight / 2 - 250 + "px", left: innerWidth / 2 - 400 + "px", }); const variables = { "--highlight": "#f90000", "--highlight2": "#4F4789", "--background": "#000000", "--background2": "#202020", "--textColor": "#f90000", "--textColor2": "#f90000", "--toggleOff": "#E32424", "--toggleOn": "#24E324", }; let settings, settingsKey = "KGUI.BenIsASillyGoose"; const Settings = { data: null, setItem(k, v) { k.split(".").reduce((obj, k, i, a) => (++i == a.length && (obj[k] = v), k in obj ? obj[k] : (obj[k] = {})), this.data); localStorage.setItem(settingsKey, JSON.stringify(this.data)); return v; }, deleteItem(k) { k.split(".").reduce((obj, k, i, a) => (++i == a.length && delete obj[k], obj[k]), this.data); localStorage.setItem(settingsKey, JSON.stringify(this.data)); return this.data; }, setData(v) { this.data = v; localStorage.setItem(settingsKey, JSON.stringify(this.data)); }, }; const defaultHideKey = { ctrl: true, shift: false, alt: false, key: "e" }; const defaultCloseKey = { ctrl: true, shift: false, alt: false, key: "x" }; for (const variable in variables) gui.style.setProperty(variable, variables[variable]); try { Settings.data = JSON.parse(localStorage.getItem(settingsKey) || "{}"); } catch { localStorage.setItem(settingsKey, "{}"); Settings.data = {}; } finally { for (const variable in Settings.data.theme || {}) gui.style.setProperty("--" + variable, Settings.data.theme[variable]); Settings.data.hideKey ??= defaultHideKey; Settings.data.closeKey ??= defaultCloseKey; } const styles = document.createElement("style"); const classes = {}, datasets = {}; styles.innerHTML = "@import url('https://fonts.googleapis.com/css?family=Titan+One');\n@import url('https://fonts.googleapis.com/css?family=Nunito');" + `.bigTextContainer,.version{align-items:center;user-select:none}.cheatsList>div,.settingsPage>div{padding:5px 10px}.gamemode,.gui,.leaderboardList,.sidebar{box-sizing:border-box}.controls>div,.credit,.pathText,.runCheat,.sidebarPath,.version{user-select:none}.noScroll::-webkit-scrollbar{display:none}.noScroll{-ms-overflow-style:none;scrollbar-width:none}.gui{position:fixed;z-index:100;background:var(--background);height:500px;width:800px;color:#fff;box-shadow:2px 2px 2px #000a;padding-left:50px;font-size:16px}.controls,.credit,.gamemodesList,.guiContent,.guiTopBar,.sidebar,.sidebarShadow,.version{position:absolute}.sidebarShadow{inset:0;background:#000;opacity:0%;pointer-events:none;transition:.2s;z-index:9}.controls>div,.guiContent,.sidebar,select[data-type] option{background:var(--background2)}.sidebarShadow:has(~ .sidebar:hover){opacity:40%}.credit{bottom:0;left:0;right:0;height:0;transition:.1s;overflow:hidden;text-align:center}.sidebar{top:0;left:0;height:100%;width:50px;transition:.2s 0.1s;z-index:10;overflow-x:hidden;padding-bottom:30px}.sidebar:hover{width:200px;transition-delay:0s}.sidebar:hover>.credit{height:25px;transition:.4s 0.2s}.guiContent{inset:20px;left:70px;top:40px;z-index:1;padding-top:32px}.guiTopBar{z-index:1;top:0;left:50px;right:0;height:25px}.version{top:0;left:0;margin-inline:10px;color:#888;font-size:.9em;letter-spacing:.5px;height:100%;display:flex}.controls{top:0;right:0;display:grid;grid-template-columns:1fr 1fr 1fr;height:25px;width:122px;gap:1px;border:1px solid var(--background);z-index:2}.controls>div{display:grid;place-items:center;font-weight:100}.closeControl{transition:.1s}.closeControl:hover{background:red}.creditsPage,.gamemodesPage,.searchPage{position:absolute;inset:0;top:32px}.gamemodesList{display:grid;gap:0 30px;padding-inline:30px;margin-top:0;padding-top:15px;margin-bottom:0;grid-template-columns:1fr 1fr;overflow-y:scroll;inset:0}.leaderboardPage,.logsPage{inset:10px;position:absolute}.pathText{position:absolute;top:40px;left:70px;right:20px;z-index:3;padding:7px 10px;height:22px}.clearLogsButton,.refreshControl{z-index:5;place-items:center;cursor:pointer}.leaderboardPage{top:42px}.leaderboardList{list-style:none;margin:0;padding:20px 40px 10px;height:100%;overflow:scroll;font-size:1.5em}.logsPage{top:37px;background:#000d;border-radius:2.5px}.logMessages{list-style:none;margin:10px;padding:0;display:flex;flex-direction:column-reverse;overflow-y:scroll;word-wrap:break-word;position:absolute;inset:0}.clearLogsButton{position:absolute;top:5px;right:5px;width:25px;height:25px;display:grid;scale:-1 1 1;transition:.2s}.searchbarHolder{display:flex;outline:2px solid var(--highlight);margin:10px 20px;height:30px;font-size:2em}.searchbarInput{outline:0;border:none;background:0 0;color:#fff;flex:1;font-size:.5em;font-family:Nunito;padding-inline:5px}.gamemode,.settingsPage>div{border-radius:2.5px;background:var(--background)}.searchbarButton{color:#fff;font-size:.6em;aspect-ratio:1/1;height:30px;display:grid;place-items:center;cursor:pointer}.bigText,.bigTextContainer{height:50px;width:200px;font-family:Titan One}.searchResults{position:absolute;inset:0;top:45px;padding-inline:20px;overflow-y:scroll}.favoritesPage,.settingsPage{inset:0;top:32px;overflow-y:scroll;position:absolute}.noResult{margin:20px 10px;font-size:.85em}.clearLogsButton:hover,.licenseMessage{font-size:1.25em}.favoritesPage{padding-block:10px;padding-inline:20px}.licenseMessage{font-weight:900;padding-inline:20px;margin-top:10px}.copyrightTag{font-size:.7em;font-weight:200;position:absolute;bottom:0;left:0;padding:5px 8px}.codingCredits,.creditLinks,.uploadDates{list-style:none;padding-inline:20px;margin-block:16px}.settingsPage{padding:10px;display:flex;flex-direction:column;gap:10px}.sidebarPaths{display:flex;flex-direction:column;width:200px}.bigTextContainer{display:flex;font-size:2em;margin-block:10px;transition:font-size .2s .1s,margin-block .2s .1s}.bigText{display:flex;align-items:center;justify-content:center}.refreshControl{position:absolute;top:45px;right:25px;width:25px;height:25px;display:grid}.gamemode{width:100%;height:200px;margin-bottom:30px;cursor:pointer;display:flex;justify-content:center;align-items:center;padding-top:10px;position:relative;overflow:hidden;padding-bottom:35px;transition:.4s}.contentPage,.gamemode>div{position:absolute;bottom:0}.gamemode:hover{box-shadow:0 0 10px var(--highlight);transition:.2s}.gamemode>img{width:85%;max-width:100%;max-height:100%}.gamemode>div{left:0;right:0;height:25px;background:var(--highlight);display:flex;justify-content:center;align-items:center;box-shadow:0 -5px 5px #0004;font-weight:800;font-size:1.1em;transition:.25s}.contentPage{inset-inline:0;top:35px}.cheatsList{display:flex;flex-direction:column;height:100%;overflow-y:scroll;padding-inline:10px}.cheatToggle,.cheatToggle>.toggleTrigger,.runCheat{height:35px;border-radius:2.5px}.cheatsList>div{display:grid;margin-bottom:10px;position:relative;background:var(--background);border-radius:2.5px}.cheatInfo,.cheatInputs,.cheatName,.cheatTop,.logMessage>span,.runCheat,.sidebarPath,.sidebarPath>i{display:flex}.cheatInfo{flex-direction:column;flex:1}.cheatName{font-size:1.5em;font-weight:700}.cheatDescription{font-size:.8em;margin-right:25px}.runCheat{--buttonColor:var(--highlight);width:20%;background:var(--buttonColor);margin-block:auto;cursor:pointer;align-items:center;justify-content:center;font-weight:800;transition:.5s;color:#fff!important}.runCheat:hover{box-shadow:0 0 10px 0 var(--buttonColor);transition:.3s}.runCheat:active{box-shadow:0 0 0 0 var(--buttonColor);transition:50ms}.cheatInputs{margin:5px 0 5px 5px;flex-direction:column;gap:5px}.searchResult,.standing{margin-bottom:10px;transition:.2s}.creditsPage>ul>li>strong,.logMessage img,.standingBlook{margin-right:5px}.cheatInputs>div{display:flex;flex-direction:row;font-size:.8rem;color:var(--highlight);font-weight:700;align-items:center}.cheatInputs>div>span{flex:1}.cheatToggle{width:20%;background:var(--highlight2);margin-block:auto;cursor:pointer;position:relative}.cheatToggle>.toggleTrigger{width:45px;position:absolute;top:0;left:0;background:var(--highlight);pointer-events:none;transition:left .2s,box-shadow .5s;z-index:1}.cheatToggle:hover>.toggleTrigger{box-shadow:0 0 10px 0 var(--highlight);transition:left .2s,box-shadow .2s}.toggleTrigger.active{left:calc(100% - 45px)}.toggleColor{position:absolute;inset:10px 20px;background:rgb(from var(--toggleOff) r g b / 25%);border-radius:2.5px;transition:.2s}.toggleTrigger.active+.toggleColor{background:rgb(from var(--toggleOn) r g b / 25%)}input[data-type],select[data-type]{width:20%;height:25px;outline:0;border:2px solid var(--highlight);box-sizing:border-box;background:0 0;color:#fff;font-size:.9em;padding-left:5px;font-family:Nunito;border-radius:2px;font-weight:800}.logo,.sidebarPath>i{width:50px;height:50px}select[data-type]{-webkit-appearance:none;-moz-appearance:none;text-indent:1px;text-overflow:''}input::placeholder{color:rgb(from var(--textColor) r g b / 50%)}input[data-type]::-webkit-inner-spin-button,input[data-type]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[data-type][type=number]{-moz-appearance:textfield}select[data-type] option{border-radius:0}select[data-type]::-ms-expand{display:none}.sidebarPath{align-items:center;cursor:pointer;transition:.2s 0.1s}.searchResult:hover,.sidebarPath:hover{color:var(--highlight);text-shadow:0 0 5px var(--highlight)}.sidebarPath>i{justify-content:center;align-items:center;font-size:1.5em}.sidebarPath>span{padding-left:5px}.sidebar:hover .sidebarPath{padding-left:20px;transition-delay:0s}.logo{left:0;transition:left .2s .1s;display:grid;place-items:center;min-width:50px;position:absolute}.sidebar:hover .logo{left:28px;transition:left .2s}.bigText{margin-top:-150px;transition:margin-top .1s}.sidebar:hover .bigText{margin-top:0;transition:margin-top .4s 0.1s}.sidebar:hover .bigTextContainer{font-size:2.5em;margin-block:20px;transition:font-size .2s,margin-block .2s}.creditsPage>ul>li>span{color:var(--textColor2);font-weight:800}.creditsPage>ul>li i{margin-inline:2px;line-height:1}.creditsPage a{color:var(--highlight);text-decoration:none}.creditsPage a:hover,.pathPage:hover{text-decoration:underline}.warning{color:var(--highlight2);font-size:.85em}.searchResult{cursor:pointer}.searchResultName{font-weight:800}.searchResultDescription{font-size:.8em}.searchResultSeparator{font-size:1.5em;font-weight:800;margin-block:10px;cursor:pointer;transition:.2s;border-bottom:2px solid #fff;padding-inline:5px;filter:drop-shadow(0px 0px 0px var(--highlight))}.searchResultSeparator:hover{color:var(--highlight);border-bottom:2px solid var(--highlight);filter:drop-shadow(0px 0px 2.5px var(--highlight))}.toggleCheat{--buttonColor:var(--toggleOff)}.toggleCheat.active{--buttonColor:var(--toggleOn)}.logMessage img{height:1em;align-self:center}.standing{display:flex;font-weight:800;align-items:center;position:relative;padding:5px 10px 5px 50px;border-radius:2.5px;background:var(--highlight2)}.standing:before{content:attr(data-place) ".";margin-right:10px}.standing::after{content:attr(data-value);flex:1;text-align:right;font-weight:100}.standing:hover{background:var(--standingColor);box-shadow:0 0 7.5px var(--standingColor)}.standingBlook{height:1.25em;align-self:center;position:absolute;left:10px}.favoriteButton,.favoriteButton>i{transition:.2s;display:grid;place-items:center;width:32px;height:32px}.favoriteButton{font-size:.8em;padding-left:5px;cursor:pointer}.favoriteButton:hover{color:#ff0}.favoriteButton>i{position:absolute;scale:0;transform-origin:50% 55%}.favoriteButton>i.filled{scale:1}.pathPage{cursor:pointer;color:var(--highlight)}[data-favorited=false],[data-favorites="0"]{display:none} [data-mode][data-name][data-description] {}` .replace(/\.([^0-9][\w-]+)/gm, (x, y) => "." + (classes[y] ??= randString(10))) .replace(/data-(\w+)/gm, (x, y) => "data-" + (datasets[y] ??= randString(10))); gui.className = classes.gui; gui.append(styles); const sidebarShadow = document.createElement("div"); sidebarShadow.className = classes.sidebarShadow; gui.appendChild(sidebarShadow); const credit = document.createElement("div"); credit.className = classes.credit; credit.innerText = "Created by Pooper"; const sidebar = document.createElement("div"); sidebar.className = classes.sidebar; sidebar.append(credit); const guiContent = document.createElement("div"); guiContent.className = classes.guiContent; const guiTopBar = document.createElement("div"); guiTopBar.className = classes.guiTopBar; const version = document.createElement("span"); version.className = classes.version; version.innerText = "Pooperschw4rtz Hubv1 - Follow me on TikTok " + versionName; guiTopBar.append(version); const controls = document.createElement("div"); controls.className = classes.controls; const moveControl = document.createElement("div"); moveControl.style.cursor = "grab"; moveControl.innerHTML = ''; const minimizeControl = document.createElement("div"); minimizeControl.innerHTML = ''; let hideAnimation = false; minimizeControl.onclick = () => { if (hideAnimation == (hideAnimation = true)) return; const hidden = minimizeControl.minimized; if (hidden) { minimizeControl.innerHTML = ''; gui.animate( [ { width: "122px", height: "27px", left: gui.style.left, }, { width: "800px", height: "500px", left: `${parseInt(gui.style.left) + (hidden ? -678 : 678)}px`, }, ], { duration: 200, easing: "ease" } ); gui.style.width = "800px"; gui.style.height = "500px"; } else { minimizeControl.innerHTML = ''; gui.animate( [ { width: "800px", height: "500px", left: gui.style.left, }, { width: "122px", height: "27px", left: `${parseInt(gui.style.left) + (hidden ? -678 : 678)}px`, }, ], { duration: 200, easing: "ease" } ); gui.style.width = "122px"; gui.style.height = "27px"; } setTimeout( () => { for (let child of [...gui.children]) { if (child == controls) continue; if (hidden) child.style.display = child.style._display; else { child.style._display = child.style.display; child.style.display = "none"; } } hideAnimation = false; }, hidden ? 200 : 0 ); gui.style.left = `${parseInt(gui.style.left) + (hidden ? -678 : 678)}px`; minimizeControl.minimized = !hidden; }; const closeControl = document.createElement("div"); closeControl.className = classes.closeControl; closeControl.innerHTML = ''; closeControl.onclick = () => gui.remove(); controls.append(moveControl, minimizeControl, closeControl); dragElement(moveControl, gui); const gamemodesPage = document.createElement("div"); gamemodesPage.className = classes.gamemodesPage; const gamemodesList = document.createElement("div"); gamemodesList.className = classes.noScroll + " " + classes.gamemodesList; const path = [["Gamemodes", gamemodesPage]]; const pathText = document.createElement("div"); pathText.className = classes.pathText; path.createPage = function (name, index, current) { const page = document.createElement("span"); page.innerText = name; if (!current) page.className = classes.pathPage; page.onclick = () => this.goto(index); return page; }; path.updatePath = function () { pathText.innerHTML = ""; pathText.append(this.createPage(this[0][0], 0, this.length == 1)); for (let i = 1; i < this.length; i++) { pathText.append(" > "); pathText.append(this.createPage(this[i][0], i, this.length - 1 == i)); } guiContent.innerHTML = ""; guiContent.append(this[this.length - 1][1]); this[this.length - 1][1]?.onPath?.(); }; path.push = function (key, page) { Array.prototype.push.call(this, [key, page]); this.updatePath(); return this.length; }; path.goto = function (index) { while (this.length - 1 > index) this.pop(); this.updatePath(); }; path.sidebar = function (key, page) { while (this.length > 0) this.pop(); return this.push(key, page); }; const leaderboardPage = document.createElement("div"); leaderboardPage.className = classes.leaderboardPage; const leaderboardList = document.createElement("ul"); leaderboardList.className = classes.noScroll + " " + classes.leaderboardList; leaderboardPage.append(leaderboardList); const logsPage = document.createElement("div"); logsPage.className = classes.logsPage; const logMessages = document.createElement("ul"); logMessages.className = classes.noScroll + " " + classes.logMessages; const clearLogsButton = document.createElement("div"); clearLogsButton.className = classes.clearLogsButton; clearLogsButton.innerHTML = ``; logsPage.append(logMessages, clearLogsButton); let leaderboardPath; const Logs = { connection: null, standings: [], data: {}, gamemodeData: { gold: { sort: "g", }, hack: { sort: "cr", }, fish: { sort: "w", }, pirate: { sort: "d", }, defense2: { sort: "d", }, brawl: { sort: "xp", upgrades: { egg: "Rapid Eggs", nut: "Crazy Acorns", slime: "Bouncing Slime", jesterBall: "Juggling Spheres", horseshoe: "Revolving Horseshoes", shell: "Rebounding Shell", pizza: "Boomerang Pizza", banana: "Curving Banana", arrow: "Speeding Arrows", peacock: "Peacock Feathers", bone: "Whirling Bones", bee: "Buzzing Bees", bubble: "Booming Bubbles", card: "Slicing Cards", laser: "Rapid-fire Lasers", darkEnergy: "Dark Energy", syrup: "Sticky Syrup", birdFeather: "Flying Feathers", }, }, dino: { sort: "f", }, royale: { sort: "e", }, defense: { sort: "d", }, cafe: { sort: "ca", }, factory: { sort: "ca", glitches: { 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" }, }, racing: { sort: "pr", }, rush: { sort: "bs", }, classic: { sort: "p", }, tower: {}, kingdom: {}, toy: { sort: "t", sabotages: { 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" }, }, }, exponents: ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"], formatNumber(input) { const [number, exponent] = (input = parseFloat(input)).toLocaleString(undefined, { notation: "engineering" }).toLowerCase().split("e"); if (exponent < 15) return number + ["", "k", "M", "B", "T"][exponent / 3]; const [num, exp] = input.toLocaleString(undefined, { notation: "scientific" }).toLowerCase().split("e"); return num + " \xd7 10" + exp.split("").reduce((a, b) => a + Logs.exponents[b], ""); }, leaderboardCache: {}, createStandingElement(name) { const element = document.createElement("li"); element.className = classes.standing; element.innerText = name; const blook = document.createElement("img"); blook.className = classes.standingBlook; element.prepend(blook); return (Logs.leaderboardCache[name] = element); }, setLeaderboard(standings) { if (standings.length > 0) leaderboardPath.style.display = "flex"; leaderboardList.innerHTML = ""; let place = 1; let blookInfo; for (let i = 0; i < standings.length; i++) { const standing = standings[i]; const standingEl = Logs.leaderboardCache[standing.name] || Logs.createStandingElement(standing.name); standingEl.firstChild.src = (blookInfo = Logs.blookData[Logs.data[standing.name]?.b || "Black"]).url; standingEl.style.setProperty("--standingColor", blookInfo.color); standingEl.dataset[datasets.value] = Logs.formatNumber(standing.value); if (standings[i - 1]?.value != standings[i].value) place = i + 1; standingEl.dataset[datasets.place] = place; leaderboardList.append(standingEl); } }, blookData: null, fetchBlooks() { return ( Logs.blookData ?? new Promise((r) => { var i = document.createElement("iframe"); i.style.display = "none"; var s = document.createElement("script"); s.type = "module"; s.src = document.querySelector("script[src*='ac.blooket.com']").src + "?" + Date.now(); const a = document.createElement("div"); a.id = "app"; let blooks = {}; document.body.appendChild(i); let finish; i.contentWindow.Object.prototype.hasOwnProperty.call = function (a, b) { if (a[b]?.rarity && a in blooks == false) Object.assign(blooks, a); finish ??= setTimeout(() => { document.body.removeChild(i); r((Logs.blookData = blooks)); }); return Object.prototype.hasOwnProperty.call(a, b); }; i.contentDocument.body.appendChild(a); i.contentDocument.body.appendChild(s); }) ); }, async connect() { try { const stateNode = getStateNode(); if (!stateNode?.props?.liveGameController?._liveGameCode) return false; Logs.connection = await stateNode.props.liveGameController.getDatabaseRef("c"); if (!Logs.connection) return false; await Logs.fetchBlooks(); const gamemode = Logs.getGamemode(); Logs.connection.on("value", (snapshot) => { const players = snapshot.val() || {}; let added; if (!players || !(added = Logs.diffObjects(Logs.data, players))) return; Logs.data = players; if (Logs.gamemodeData[gamemode].sort) { Logs.standings = Object.entries(players) .map(([name, data]) => ({ name, blook: data.b, value: data[Logs.gamemodeData[gamemode].sort] || 0 })) .sort((a, b) => b.value - a.value); Logs.setLeaderboard(Logs.standings); } try { let addedPlayer; switch (gamemode) { case "brawl": for (const player in added) { if (!(addedPlayer = added[player]).up) continue; const upgrade = addedPlayer.up.split(":"); if (upgrade.length == 2 && upgrade[0] in Logs.gamemodeData.brawl.upgrades) Logs.addAlert(player, `upgraded ${Logs.gamemodeData.brawl.upgrades[upgrade[0]]} to level ${upgrade[1]}`); } break; case "gold": for (const player in added) { if (!(addedPlayer = added[player]).tat) continue; const [tat, amount] = addedPlayer.tat.split(":"); if (amount == "swap") Logs.addAlert(player, `just swapped ${document.querySelector("[src*='assets/candy']") ? "candy" : "gold"} with ${tat}`); else Logs.addAlert(player, `just took ${Logs.formatNumber(parseInt(amount))} ${document.querySelector("[src*='assets/candy']") ? "candy" : "gold"} from ${tat}`); } break; case "toy": for (const player in added) { if ((addedPlayer = added[player]).s) Logs.addAlert(player, `sabotaged with "${Logs.gamemodeData.toy.sabotages[addedPlayer.s]}"`); else if (addedPlayer.tat) { const [tat, amount] = addedPlayer.tat.split(":"); if (amount == "swap") Logs.addAlert(player, `just swapped toys with ${tat}`); else Logs.addAlert(player, `just took ${Logs.formatNumber(parseInt(amount))} toy${amount == 1 ? "" : "s"} from ${tat}`); } } break; case "hack": for (const player in added) { if (!(addedPlayer = added[player]).tat) continue; const [tat, amount] = addedPlayer.tat.split(":"); Logs.addAlert(player, `just took ${Logs.formatNumber(parseInt(amount))} crypto from ${tat}`); } break; case "pirate": for (const player in added) { if (!(addedPlayer = added[player]).tat) continue; const [tat, amount] = addedPlayer.tat.split(":"); Logs.addAlert(player, `just took ${Logs.formatNumber(parseInt(amount))} doubloons from ${tat}`); } break; case "defense2": for (const player in added) { if (!(addedPlayer = added[player]).r) continue; Logs.addAlert(player, `just completed Round ${addedPlayer.r}!`); } break; case "fishing": for (const player in added) { if ((addedPlayer = added[player]).f == "Frenzy") Logs.addAlert(player, `just started a frenzy`); else if (addedPlayer.s) Logs.addAlert(player, `just sent a ${addedPlayer.f} distraction`); } break; case "dino": for (const player in added) { if (!(addedPlayer = added[player]).tat) continue; const [tat, caught] = addedPlayer.tat.split(":"); if (caught == "true") Logs.addAlert(player, `just caught ${tat} CHEATING!`); else Logs.addAlert(player, `investigated ${tat}`); } break; case "cafe": for (const player in added) { if (!(addedPlayer = added[player]).up) continue; const [upgrade, level] = addedPlayer.up.split(":"); if (level) Logs.addAlert(player, `upgraded ${upgrade} to level ${level}`); } break; case "factory": for (const player in added) { if ((addedPlayer = added[player]).g) Logs.addAlert(player, `activated the ${Logs.gamemodeData.factory.glitches[addedPlayer.g]} glitch!`); else if (addedPlayer.s) { const [amount, synergy] = addedPlayer.s.split("-"); Logs.addAlert(player, `has a ${amount} ${synergy} synergy!`); } else if (addedPlayer.t) Logs.addAlert(player, `now has 10 Blooks!`); } break; } } catch (e) { console.error(e); Logs.addLog("Error adding an alert", "red"); } }); return true; } catch (e) { console.warn(e); return false; } }, diffObjects(obj1, obj2) { const changed = {}; for (const key in obj1) { if (!(key in obj2)) continue; if (typeof obj1[key] === "object" && typeof obj2[key] === "object") { const recChanged = Logs.diffObjects(obj1[key], obj2[key]); if (recChanged && Object.keys(recChanged).length !== 0) changed[key] = recChanged; } else if (JSON.stringify(obj1[key]) !== JSON.stringify(obj2[key])) changed[key] = obj2[key]; } for (const key in obj2) if (!(key in obj1)) changed[key] = obj2[key]; if (Object.keys(changed).length == 0) return null; return changed; }, getGamemode() { const gamemode = getStateNode().props?.client?.type; if (typeof gamemode == "string") return gamemode.toLowerCase(); switch (window.location.pathname) { case "/play/gold": case "/play/gold/final": case "/gold/play/landing": return "gold"; case "/play/hack": case "/play/hack/final": case "/hack/play/landing": return "hack"; case "/play/fishing": case "/play/fishing/final": case "/fish/play/landing": return "fish"; case "/play/pirate": case "/play/pirate/final": case "/pirate/play/landing": return "pirate"; case "/play/defense2/load": case "/play/defense2": case "/play/defense2/final": case "/defense2/play/landing": return "defense2"; case "/play/brawl/start": case "/play/brawl/settings": case "/play/brawl": case "/play/brawl/final": case "/brawl/play/landing": return "brawl"; case "/play/dino": case "/play/dino/final": case "/dino/play/landing": return "dino"; case "/play/battle-royale/match/preview": case "/play/battle-royale/question": case "/play/battle-royale/answer/sent": case "/play/battle-royale/answer/result": case "/play/battle-royale/match/result": case "/play/battle-royale/final": case "/royale/play/landing": return "royale"; case "/defense/load": case "/defense": case "/defense/final": case "/defense/play/landing": return "defense"; case "/cafe/load": case "/cafe": case "/cafe/shop": case "/cafe/final": case "/cafe/play/landing": return "cafe"; case "/play/factory": case "/play/factory/settings": case "/play/factory/start": case "/play/factory/final": case "/factory/play/landing": return "factory"; case "/play/racing": case "/play/racing/final": case "/racing/play/landing": return "racing"; case "/play/rush": case "/play/rush/final": case "/rush/play/landing": return "rush"; case "/play/classic/get-ready": case "/play/classic/question": case "/play/classic/answer/sent": case "/play/classic/answer/result": case "/play/classic/standings": case "/play/classic/final": case "/classic/play/landing": return "classic"; case "/tower/load": case "/tower/start": case "/tower/map": case "/tower/battle": case "/tower/rest": case "/tower/risk": case "/tower/shop": case "/tower/victory": case "/tower/final": case "/tower/play/landing": return "tower"; case "/kingdom/start": case "/kingdom": case "/kingdom/final": case "/kingdom/play/landing": return "kingdom"; case "/play/toy": case "/play/toy/final": case "/toy/play/landing": return "toy"; } return ""; }, sanitizer: document.createElement("div"), sanitizeText(text) { Logs.sanitizer.textContent = text; return Logs.sanitizer.innerHTML; }, addAlert(name, message) { const element = document.createElement("li"); element.className = classes.logMessage; const span = document.createElement("span"); Logs.lastLog.setTime(Date.now()); span.innerHTML = `${Logs.sanitizeText(name)} ${Logs.sanitizeText(message)}${parseTime(Logs.lastLog)}`; let blook; if ((blook = Logs.blookData?.[Logs.data[name].b])) { const img = document.createElement("img"); img.src = blook.url; span.prepend(img); } element.append(span); logMessages.prepend(element); }, lastLog: new Date(), addLog(message, color) { const element = document.createElement("li"); element.className = classes.logMessage; const span = document.createElement("span"); if (color) span.style.color = color; span.style.display = "flex"; Logs.lastLog.setTime(Date.now()); span.innerHTML = "[LOG] " + Logs.sanitizeText(message) + `${parseTime(Logs.lastLog)}`; element.append(span); logMessages.prepend(element); }, interval: null, }; if (window.location.host != "dashboard.blooket.com" && window.location.host != "blooket.com") Logs.interval = setInterval(() => Logs.connect().then((connected) => connected && clearInterval(Logs.interval)), 5000); clearLogsButton.onclick = () => { clearLogsButton.animate([{ rotate: "0deg" }, { rotate: "360deg" }], { duration: 750, easing: "ease" }); logMessages.innerHTML = ""; Logs.addLog("Cleared Logs"); }; const cheats = { global: { img: "https://ac.blooket.com/dashclassic/assets/Blooket-M6jYh_hk.png", name: "Global", cheats: [ { name: "Auto Answer", description: "Toggles auto answer on", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { const stateNode = getStateNode(); const Question = stateNode.state.question || stateNode.props.client.question; if (stateNode.state.question.qType != "typing") { if (stateNode.state.stage != "feedback" && !stateNode.state.feedback) { let ind; for (ind = 0; ind < Question.answers.length; ind++) { let found = false; for (let j = 0; j < Question.correctAnswers.length; j++) if (Question.answers[ind] == Question.correctAnswers[j]) { found = true; break; } if (found) break; } document.querySelectorAll("[class*='answerContainer']")[ind].click(); } else document.querySelector("[class*='feedback'], [id*='feedback']").firstChild.click(); } else Object.values(document.querySelector("[class*='typingAnswerWrapper']"))[1].children._owner.stateNode.sendAnswer(Question.answers[0]); }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Highlight Answers", description: "Toggles highlight answers on", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { const stateNode = getStateNode(); const Question = stateNode.state.question || stateNode.props.client.question; let ind = 0; while (ind < Question.answers.length) { let found = false; for (let j = 0; j < Question.correctAnswers.length; j++) if (Question.answers[ind] == Question.correctAnswers[j]) { found = true; break; } ind++; document.querySelector("[class*='answersHolder'] :nth-child(" + ind + ") > div").style.backgroundColor = found ? "rgb(0, 207, 119)" : "rgb(189, 15, 38)"; } }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Subtle Highlight Answers", description: "Toggles subtle highlight answers on", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { const stateNode = getStateNode(); const Question = stateNode.state.question || stateNode.props.client.question; let ind = 0; while (ind < Question.answers.length) { let j = 0; let found = false; while (j < Question.correctAnswers.length) { if (Question.answers[ind] == Question.correctAnswers[j]) { found = true; break; } j++; } ind++; if (found) document.querySelector("[class*='answersHolder'] :nth-child(" + ind + ") > div").style.boxShadow = "unset"; } }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Percent Auto Answer", description: "Answers questions correctly or incorrectly depending on the goal grade given (Disable and re-enable to update goal)", inputs: [ { name: "Target Grade", type: "number", }, ], type: "toggle", enabled: false, data: null, run: function (target) { if (!this.enabled) { this.enabled = true; const stateNode = getStateNode(); this.data = setInterval( (TARGET) => { try { const question = stateNode.state.question || stateNode.props.client.question; if (stateNode.state.stage == "feedback" || stateNode.state.feedback) return document.querySelector('[class*="feedback"], [id*="feedback"]')?.firstChild?.click?.(); else if (document.querySelector("[class*='answerContainer']") || document.querySelector("[class*='typingAnswerWrapper']")) { let correct = 0, total = 0; for (let corrects in stateNode.corrects) correct += stateNode.corrects[corrects]; for (let incorrect in stateNode.incorrects) total += stateNode.incorrects[incorrect]; total += correct; const yes = total == 0 || Math.abs(correct / (total + 1) - TARGET) >= Math.abs((correct + 1) / (total + 1) - TARGET); if (stateNode.state.question.qType != "typing") { const answerContainers = document.querySelectorAll("[class*='answerContainer']"); for (let i = 0; i < answerContainers.length; i++) { const contains = question.correctAnswers.includes(question.answers[i]); if (yes == contains) return answerContainers[i]?.click?.(); } answerContainers[0].click(); } else Object.values(document.querySelector("[class*='typingAnswerWrapper']"))[1].children._owner.stateNode.sendAnswer(yes ? question.answers[0] : Math.random().toString(36).substring(2)); } } catch {} }, 100, (target ?? 100) / 100 ); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Auto Answer", description: "Click the correct answer for you", run: function () { const stateNode = getStateNode(); const Question = stateNode.state.question || stateNode.props.client.question; if (stateNode.state.question.qType != "typing") { if (stateNode.state.stage != "feedback" && !stateNode.state.feedback) { let ind; for (ind = 0; ind < Question.answers.length; ind++) { let found = false; for (let j = 0; j < Question.correctAnswers.length; j++) if (Question.answers[ind] == Question.correctAnswers[j]) { found = true; break; } if (found) break; } document.querySelectorAll("[class*='answerContainer']")[ind].click(); } else document.querySelector("[class*='feedback'], [id*='feedback']").firstChild.click(); } else Object.values(document.querySelector("[class*='typingAnswerWrapper']"))[1].children._owner.stateNode.sendAnswer(Question.answers[0]); }, }, { name: "Highlight Answers", description: "Colors answers to be red or green highlighting the correct ones", run: function () { const stateNode = getStateNode(); const Question = stateNode.state.question || stateNode.props.client.question; let ind = 0; while (ind < Question.answers.length) { let found = false; for (let j = 0; j < Question.correctAnswers.length; j++) if (Question.answers[ind] == Question.correctAnswers[j]) { found = true; break; } ind++; document.querySelector("[class*='answersHolder'] :nth-child(" + ind + ") > div").style.backgroundColor = found ? "rgb(0, 207, 119)" : "rgb(189, 15, 38)"; } }, }, { name: "Spam Buy Blooks", description: "Opens a box an amount of times", inputs: [ { name: "Box", type: "options", options: () => Array.from(document.querySelectorAll("[class*='packsWrapper'] > div")).reduce((a, b) => { b.querySelector("[class*='blookContainer'] > img") || a.push(b.querySelector("[class*='packImgContainer'] > img").alt); return a; }, []), }, { name: "Amount", type: "number", }, { name: "Show Unlocks", type: "options", options: [ { name: "Show Unlocks", value: true, }, { name: "Don't Show Unlocks", value: false, }, ], }, ], run: async function (box, amountToOpen, alertBlooks) { if (window.location.pathname.startsWith("/market")) { const stateNode = getStateNode(); const prices = Array.prototype.reduce.call( document.querySelectorAll("[class*='packsWrapper'] > div"), (a, b) => { b.querySelector("[class*='blookContainer'] > img") || (a[b.querySelector("[class*='packImgContainer'] > img").alt] = parseInt(b.querySelector("[class*='packBottom']").textContent)); return a; }, {} ); box = box .split(" ") .map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()) .join(" "); const cost = prices[box]; if (!cost) return alert("I couldn't find that box!"); const canOpen = Math.floor(stateNode.state.tokens / cost); if (canOpen <= 0) return alert("You do not have enough tokens!"); const amount = Math.min(canOpen, amountToOpen || 0); const blooks = {}, now = Date.now(); for (let i = 0; i < amount; i++) { await stateNode.buyPack(true, box); blooks[stateNode.state.unlockedBlook] ||= 0; blooks[stateNode.state.unlockedBlook]++; stateNode.startOpening(); clearTimeout(stateNode.openTimeout); const rarity = stateNode.state.purchasedBlookRarity; stateNode.setState({ canOpen: true, currentPack: "", opening: alertBlooks, doneOpening: alertBlooks, openPack: alertBlooks }); clearTimeout(stateNode.canOpenTimeout); if (rarity == "Chroma") break; } await new Promise((r) => setTimeout(r)); alert( `(${Date.now() - now}ms) Results:\n${Object.entries(blooks) .map(([blook, amount]) => ` ${blook} ${amount}`) .join(`\n`)}` ); } else alert("This can only be ran in the Market page."); }, }, { name: "Host Any Gamemode", description: "Change the selected gamemode on the host settings page", inputs: [ { name: "Gamemode", type: "options", options: ["Racing", "Classic", "Factory", "Cafe", "Defense2", "Defense", "Royale", "Gold", "Candy", "Brawl", "Hack", "Pirate", "Fish", "Dino", "Toy", "Rush"], }, ], run: function (type) { if (location.pathname != "/host/settings") return alert("Run this script on the host settings page"); getStateNode().setState({ settings: { type } }); }, }, { name: "Change Blook Ingame", description: "Changes your blook", inputs: [ { name: "Blook (case sensitive)", type: "string", }, ], run: function (blook) { let { props } = getStateNode(); props.liveGameController.setVal({ path: `c/${props.client.name}/b`, val: (props.client.blook = blook) }); }, }, { name: "Get Daily Rewards", description: "Gets max daily tokens and xp", run: async function () { if (!window.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/"); else { const gameId = [ "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)]; const rand = (l, h) => Math.floor(Math.random() * (h - l + 1)) + l; const { t } = await fetch("https://play.blooket.com/api/playersessions/solo", { body: JSON.stringify({ gameMode: "Factory", questionSetId: gameId }), method: "POST", credentials: "include", }) .then((x) => x.json()) .catch(() => alert("There was an error creating a solo game.")); await fetch("https://play.blooket.com/api/playersessions/landings", { body: JSON.stringify({ t }), method: "POST", credentials: "include", }).catch(() => alert("There was an error when landing.")); await fetch("https://play.blooket.com/api/playersessions/questions?t=" + t, { credentials: "include" }); await fetch("https://play.blooket.com/api/gamequestionsets?gameId=" + gameId, { credentials: "include" }); await fetch("https://play.blooket.com/api/users/factorystats", { body: JSON.stringify({ t, place: 1, cash: rand(10000000, 100000000), playersDefeated: 0, correctAnswers: rand(500, 2000), upgrades: rand(250, 750), blookUsed: "Chick", nameUsed: "You", mode: "Time-Solo" }), method: "PUT", credentials: "include", }).catch(() => alert("There was an error when spoofing stats.")); await fetch("https://play.blooket.com/api/users/add-rewards", { body: JSON.stringify({ t, addedTokens: 500, addedXp: 300 }), method: "PUT", credentials: "include", }) .then((x) => x.json()) .then(({ dailyReward }) => alert(`Added max tokens and xp, and got ${dailyReward} daily wheel tokens!`)) .catch(() => alert("There was an error when adding rewards.")); } }, }, { name: "Use Any Blook", description: "Allows you to play as any blook", data: null, getBlooks(isLobby, stateNode) { if (this.data?.Black) return; isLobby = isLobby ? "keys" : "entries"; const old = Object[isLobby]; const scope = this; Object[isLobby] = function (obj) { if (!obj.Chick) return old.call(this, obj); scope.data = obj; return (Object[isLobby] = old).call(this, obj); }; stateNode.render(); }, run: function () { const stateNode = getStateNode(); const lobby = window.location.pathname.startsWith("/play/lobby"), blooks = !lobby && window.location.pathname.startsWith("/blooks"); if (!blooks && !lobby) return alert("This only works in lobbies or the dashboard blooks page."); this.getBlooks(lobby, stateNode); if (lobby) return stateNode.setState({ unlocks: Object.keys(this.data) }); stateNode.setState({ blookData: Object.keys(this.data).reduce((a, b) => ((a[b] = stateNode.state.blookData[b] || 1), a), {}), allSets: Object.values(this.data).reduce((a, b) => (b.set && a.includes(b.set) ? a : a.concat(b.set)), []), }); }, }, { name: "Every Answer Correct", description: "Sets every answer to be correct", run: function () { const stateNode = getStateNode(); for (let i = 0; i < stateNode.freeQuestions.length; i++) { stateNode.freeQuestions[i].correctAnswers = stateNode.freeQuestions[i].answers; stateNode.questions[i].correctAnswers = stateNode.questions[i].answers; stateNode.props.client.questions[i].correctAnswers = stateNode.questions[i].answers; } try { stateNode.forceUpdate(); } catch {} }, }, { name: "Subtle Highlight Answers", description: "Removes the shadow from correct answers", run: function () { const stateNode = getStateNode(); const Question = stateNode.state.question || stateNode.props.client.question; let ind = 0; while (ind < Question.answers.length) { let j = 0; let found = false; while (j < Question.correctAnswers.length) { if (Question.answers[ind] == Question.correctAnswers[j]) { found = true; break; } j++; } ind++; if (found) document.querySelector("[class*='answersHolder'] :nth-child(" + ind + ") > div").style.boxShadow = "unset"; } }, }, { name: "Remove Random Name", description: "Allows you to put a custom name", run: function () { getStateNode().setState({ isRandom: false, client: { name: "" } }); document.querySelector('[class*="nameInput"]')?.focus?.(); }, }, { name: "Sell Duplicate Blooks", description: "Sell all duplicate blooks leaving you with 1 each", run: async function () { if (window.location.pathname.startsWith("/blooks")) { if (confirm(`Are you sure you want to sell your dupes? (Legendaries and rarer will not be sold)`)) { let stateNode = getStateNode(); let now = Date.now(), results = ""; for (const blook in stateNode.state.blookData) if (stateNode.state.blookData[blook] > 1) { stateNode.setState({ blook, numToSell: stateNode.state.blookData[blook] - 1 }); if (!["Uncommon", "Rare", "Epic"].includes(document.querySelector("[class*='highlightedRarity']").innerText.trim())) continue; results += ` ${blook} ${stateNode.state.blookData[blook] - 1}\n`; await stateNode.sellBlook({ preventDefault: () => {} }, true); } alert(`(${Date.now() - now}ms) Results:\n${results.trim()}`); } } else alert("This can only be ran in the Blooks page."); }, }, ], }, gold: { img: new Date().getMonth() == 9 ? "https://media.blooket.com/image/upload/v1663212881/Media/logos/Candy_Quest_Logo.png" : "https://media.blooket.com/image/upload/v1663212881/Media/logos/Gold_Quest_Logo_Resized.png", name: "Gold Quest", cheats: [ { name: "Always Triple", description: "Always get triple gold", type: "toggle", enabled: false, data: { type: "multiply", val: 3, text: "Triple Gold!", blook: "Unicorn" }, run: function () { let stateNode = getStateNode(); stateNode._choosePrize ||= stateNode.choosePrize; if (!this.enabled) { this.enabled = true; stateNode.choosePrize = (i) => { stateNode.state.choices[i] = this.data; stateNode._choosePrize(i); }; } else { this.enabled = false; if (stateNode._choosePrize) stateNode.choosePrize = stateNode._choosePrize; } }, }, { name: "Auto Choose", description: "Automatically picks the option that would give you the most gold", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(async () => { let stateNode = getStateNode(); if (stateNode.state.stage == "prize") { stateNode.props.liveGameController.getDatabaseVal("c", (players) => { try { if (players == null) return; players = Object.entries(players); let most = 0, max = 0, index = -1; for (let i = 0; i < players.length; i++) if (players[i][0] != stateNode.props.client.name && players[i][1] > most) most = players[i][1]; for (let i = 0; i < stateNode.state.choices.length; i++) { const choice = stateNode.state.choices[i]; let value = stateNode.state.gold; if (choice.type == "gold") value = stateNode.state.gold + choice.val || stateNode.state.gold; else if (choice.type == "multiply" || choice.type == "divide") value = Math.round(stateNode.state.gold * choice.val) || stateNode.state.gold; else if (choice.type == "swap") value = most || stateNode.state.gold; else if (choice.type == "take") value = stateNode.state.gold + most * choice.val || stateNode.state.gold; if ((value || 0) <= max) continue; max = value; index = i + 1; } document.querySelector("div[class*='choice" + index + "']")?.click(); } catch {} }); } }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Chest ESP", description: "Shows what each chest will give you", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { getStateNode().state.choices.forEach(({ text }, index) => { let chest = document.querySelector(`div[class*='choice${index + 1}']`); if (!chest || chest.querySelector("div")) return; let choice = document.createElement("div"); choice.style.color = "white"; choice.style.fontFamily = "Eczar"; choice.style.fontSize = "2em"; choice.style.display = "flex"; choice.style.justifyContent = "center"; choice.style.transform = "translateY(200px)"; choice.innerText = text; chest.append(choice); }); }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Remove Bad Choices", description: "Removes the chance of getting Lose 25%, Lose 50%, and Nothing", run: function () { let iterator = Array.prototype[Symbol.iterator]; Array.prototype[Symbol.iterator] = function* values() { if (this[0]?.type == "gold") { Array.prototype[Symbol.iterator] = iterator; console.log(this); for (let i = 0; i < this.length; i++) if (this[i].type == "divide" || this[i].type == "nothing") this.splice(i--, 1); } yield* iterator.apply(this); }; getStateNode().constructor.prototype.answerNext.call({ nextReady: true, here: true, state: { correct: true }, setState() {} }); }, }, { name: "Reset Players Gold", description: "Sets a player's gold to 0", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, ], run: function (target) { let stateNode = getStateNode(); stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name + "/tat", val: target + ":swap:0", }); }, }, { name: "Set Gold", description: "Sets amount of gold", inputs: [ { name: "Gold", type: "number", }, ], run: function (gold) { let stateNode = getStateNode(); stateNode.setState({ gold, gold2: gold }); stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name + "/g", val: gold, }); }, }, { name: "Set Player's Gold", description: "Sets another player's gold", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, { name: "Gold", type: "number", }, ], run: function (player, gold) { let stateNode = getStateNode(); stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name + "/tat", val: player + ":swap:" + gold }); } }, { name: "Swap Gold", description: "Swaps gold with someone", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, ], run: function (player) { let stateNode = getStateNode(); stateNode.props.liveGameController.getDatabaseVal("c", (players) => { if (!players || players[player] == null) return; const gold = players[player].g || 0; stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name, val: { b: stateNode.props.client.blook, tat: player + ":swap:" + (stateNode.state.gold || 0), g: gold, }, }); stateNode.setState({ gold, gold2: gold }); }); }, }, ], }, hack: { img: "https://media.blooket.com/image/upload/v1663212882/Media/logos/Crypto_Hack_Logo_Resized.png", name: "Crypto Hack", cheats: [ { name: "Choice ESP", description: "Shows what each choice will give you", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { let chest = document.querySelector("[class*=feedbackContainer]"); if (chest.children.length <= 4) { let choice = document.createElement("div"); choice.style.color = "white"; choice.style.fontFamily = "Inconsolata,Helvetica,monospace,sans-serif"; choice.style.fontSize = "2em"; choice.style.display = "flex"; choice.style.justifyContent = "center"; choice.style.marginTop = "675px"; choice.innerText = getStateNode().state.choices[0].text; chest.append(choice); } }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Password ESP", description: "Highlights the correct password", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { let { state } = getStateNode(); if (state.stage == "hack") for (const button of document.querySelector("div[class*=buttonContainer]").children) { if (button.innerText == state.correctPassword) continue; button.style.outlineColor = "rgba(255, 64, 64, 0.8)"; button.style.backgroundColor = "rgba(255, 64, 64, 0.8)"; button.style.textShadow = "0 0 1px #f33"; } }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Always Triple", description: "Always get triple crypto", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval((state) => getStateNode().setState(state), 25, { choices: [{ type: "mult", val: 3, rate: 0.075, blook: "Brainy Bot", text: "Triple Crypto" }] }); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Auto Guess", description: "Automatically guess the correct password", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { let { state } = getStateNode(); if (state.stage == "hack") for (const button of document.querySelector("div[class*=buttonContainer]").children) button.innerText == state.correctPassword && button.click(); }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Remove Hack", description: "Removes an attacking hack", run: function () { getStateNode().setState({ hack: "" }); }, }, { name: "Set Crypto", description: "Sets crypto", inputs: [ { name: "Amount", type: "number", }, ], run: function (amount) { let stateNode = getStateNode(); stateNode.setState({ crypto: amount, crypto2: amount }); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/cr`, val: amount, }); }, }, { name: "Set Password", description: "Sets hacking password", inputs: [ { name: "Custom Password", type: "string", }, ], run: function (password) { let stateNode = getStateNode(); stateNode.setState({ password }); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/p`, val: password, }); }, }, { name: "Steal Player's Crypto", description: "Steals all of someone's crypto", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, ], run: function (target) { let stateNode = getStateNode(); stateNode.props.liveGameController.getDatabaseVal("c", (players) => { let player; if (players && (player = Object.entries(players).find((x) => x[0].toLowerCase() == target.toLowerCase()))) { const cr = player[1].cr; stateNode.setState({ crypto: stateNode.state.crypto + cr, crypto2: stateNode.state.crypto + cr, }); stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name, val: { b: stateNode.props.client.blook, p: stateNode.state.password, cr: stateNode.state.crypto + cr, tat: player[0] + ":" + cr, }, }); } }); }, }, ], }, fish: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Fishing_Frenzy_Logo_Resized.png", name: "Fishing Frenzy", cheats: [ { name: "Remove Distractions", description: "Removes distractions", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { getStateNode().setState({ party: "" }); }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Frenzy", description: "Sets everyone to frenzy mode", run: function () { let stateNode = getStateNode(); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}`, val: { b: stateNode.props.client.blook, w: stateNode.state.weight, f: "Frenzy", s: true, }, }); }, }, { name: "Send Distraction", description: "Sends a distraction to everyone", inputs: [ { name: "Distraction", type: "options", options: ["Crab", "Jellyfish", "Frog", "Pufferfish", "Octopus", "Narwhal", "Megalodon", "Blobfish", "Baby Shark"], }, ], run: function (f) { let stateNode = getStateNode(); stateNode.safe = true; stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}`, val: { b: stateNode.props.client.blook, w: stateNode.state.weight, f, s: true, }, }); }, }, { name: "Set Lure", description: "Sets fishing lure (range 1 - 5)", inputs: [ { name: "Lure (1 - 5)", type: "number", min: 1, max: 5, }, ], run: function (lure) { getStateNode().setState({ lure: Math.max(Math.min(lure - 1, 4), 0) }); }, }, { name: "Set Weight", description: "Sets weight", inputs: [ { name: "Weight", type: "number", }, ], run: function (weight) { let stateNode = getStateNode(); stateNode.setState({ weight, weight2: weight }); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}`, val: { b: stateNode.props.client.blook, w: weight, f: ["Crab", "Jellyfish", "Frog", "Pufferfish", "Octopus", "Narwhal", "Megalodon", "Blobfish", "Baby Shark"][Math.floor(Math.random() * 9)], }, }); }, }, ], }, pirate: { img: "https://media.blooket.com/image/upload/v1695317816/Media/logos/PiratesVoyageLogoSmall.png", name: "Pirate's Voyage", cheats: [ { name: "Heist ESP", description: "Shows you what's under each chest during a heist", type: "toggle", enabled: false, data: null, imgs: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { const stateNode = getStateNode(); if (stateNode.state.stage != "heist") return; if (this.imgs == null) this.imgs = Array.prototype.map.call(Array.prototype.slice.call(document.querySelector("[class*=prizesList]").children, 1, 4), (x) => x.querySelector("img").src); const esp = Object.values(document.querySelector("[class*=modal]"))[0].return.memoizedState.memoizedState; for (const e of document.querySelectorAll("[class*=boxContent] > div")) e.remove(); const open = Object.values(document.querySelector("[class*=modal]"))[0].return.memoizedState.next.next.memoizedState; Array.prototype.forEach.call(document.querySelector("[class*=chestsWrapper]").children, (container, i) => { const box = container.firstChild.firstChild; if (open.includes(i)) return (box.style.opacity = ""); box.style.opacity = "0.5"; let d = document.createElement("div"); d.innerHTML = ""; d.className = "chestESP"; d.style.position = "absolute"; d.style.inset = "0"; d.style.display = "grid"; d.style.placeItems = "center"; d.style.pointerEvents = "none"; container.onclick = () => { d.remove(); box.style.opacity = ""; }; container.firstChild.prepend(d); }); }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Max Levels", description: "Maxes out all islands and your boat", run: function () { let stateNode = getStateNode(); stateNode.setState({ islandLevels: new Array(stateNode.state.islandLevels.length).fill(5) }, stateNode.updateBoatLevel); }, }, { name: "Set Doubloons", description: "Sets Doubloons", inputs: [ { name: "Amount", type: "number", }, ], run: function (doubloons) { let stateNode = getStateNode(); stateNode.setState({ doubloons }); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/d`, val: doubloons, }); }, }, { name: "Start Heist", description: "Starts a heist on someone", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, ], run: function (target) { let stateNode = getStateNode(); stateNode.props.liveGameController.getDatabaseVal("c", function (val) { if (val?.[target]) stateNode.setState({ stage: "heist", heistInfo: { name: target, blook: val[target].b }, prizeAmount: Math.max(1000, val[target].d || 0), }); }); }, }, { name: "Swap Doubloons", description: "Swaps Doubloons with someone", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, ], run: async function (target) { let stateNode = getStateNode(); stateNode.props.liveGameController.getDatabaseVal("c", function (val) { if (!val?.[target]) return; stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}`, val: { b: stateNode.props.client.blook, d: val[target].d, tat: `${target}:${val[target].d - stateNode.state.doubloons}`, }, }); stateNode.setState({ doubloons: val[target].d }); }); }, }, { name: "Take Doubloons", description: "Takes Doubloons from someone", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, ], run: async function (target) { let stateNode = getStateNode(); stateNode.props.liveGameController.getDatabaseVal("c", function (val) { if (!val?.[target]) return; stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}`, val: { b: stateNode.props.client.blook, d: stateNode.state.doubloons + val[target].d, tat: `${target}:${val[target].d}`, }, }); stateNode.setState({ doubloons: stateNode.state.doubloons + val[target].d }); }); }, }, ], }, defense2: { img: "https://media.blooket.com/image/upload/v1676079918/Media/logos/Tower_Defense_2_Logo_Resize.png", name: "Tower Defense 2", cheats: [ { name: "Max Tower Stats", description: "Makes all placed towers overpowered", run: function () { getStateNode().state.towers.forEach((tower) => { tower.stats.dmg = 1e6; tower.stats.fireRate = 50; tower.stats.ghostDetect = true; tower.stats.maxTargets = 1e6; tower.stats.numProjectiles &&= 100; tower.stats.range = 100; if (tower.stats.auraBuffs) for (const buff in tower.stats.auraBuffs) tower.stats.auraBuffs[buff] *= 100; }); }, }, { name: "Kill Enemies", description: "Kills all the enemies", run: function () { let stateNode = getStateNode(); stateNode.game.current.config.sceneConfig.enemyQueue.length = 0; stateNode.game.current.config.sceneConfig.physics.world.bodies.entries.forEach((x) => x?.gameObject?.receiveDamage?.(x.gameObject.hp, 1)); }, }, { name: "Set Coins", description: "Sets coins", inputs: [ { name: "Coins", type: "number", }, ], run: function (coins) { getStateNode().setState({ coins }); }, }, { name: "Set Health", description: "Sets the amount of health you have", inputs: [ { name: "Health", type: "number", }, ], run: function (health) { getStateNode().setState({ health }); }, }, { name: "Set Round", description: "Sets the current round", inputs: [ { name: "Round", type: "number", }, ], run: function (round) { getStateNode().setState({ round }); }, }, ], }, brawl: { img: "https://media.blooket.com/image/upload/v1663366470/Media/logos/Monster_Brawl_270x156_1.png", name: "Monster Brawl", cheats: [ { name: "Double Enemy XP", description: "Doubles enemy XP drop value", run: function () { const colliders = getStateNode().game.current.config.sceneConfig.physics.world.colliders._active.filter((x) => x.callbackContext?.toString?.()?.includes?.("dmgCd")); for (let i = 0; i < colliders.length; i++) { const enemies = colliders[i].object2; let _start = enemies.classType.prototype.start; enemies.classType.prototype.start = function () { _start.apply(this, arguments); this.val *= 2; }; enemies.children.entries.forEach((e) => (e.val *= 2)); } }, }, { name: "Half Enemy Speed", description: "Makes enemies move 2x slower", run: function () { const colliders = getStateNode().game.current.config.sceneConfig.physics.world.colliders._active.filter((x) => x.callbackContext?.toString?.()?.includes?.("dmgCd")); for (let i = 0; i < colliders.length; i++) { const enemies = colliders[i].object2; let _start = enemies.classType.prototype.start; enemies.classType.prototype.start = function () { _start.apply(this, arguments); this.speed *= 0.5; }; enemies.children.entries.forEach((e) => (e.speed *= 0.5)); } }, }, { name: "Instant Kill", description: "Sets all enemies health to 1", run: function () { const colliders = getStateNode().game.current.config.sceneConfig.physics.world.colliders._active.filter((x) => x.callbackContext?.toString?.()?.includes?.("dmgCd")); for (let i = 0; i < colliders.length; i++) { const enemies = colliders[i].object2; let _start = enemies.classType.prototype.start; enemies.classType.prototype.start = function () { _start.apply(this, arguments); this.hp = 1; }; enemies.children.entries.forEach((e) => (e.hp = 1)); } }, }, { name: "Invincibility", description: "Makes you invincible", run: function () { for (const collider of getStateNode().game.current.config.sceneConfig.physics.world.colliders._active.filter( (x) => x.callbackContext?.toString().includes("invulnerableTime") || x.callbackContext?.toString().includes("dmgCd") )) collider.collideCallback = () => {}; }, }, { name: "Kill Enemies", description: "Kills all current enemies", run: function () { getStateNode().game.current.config.sceneConfig.physics.world.bodies.entries.forEach((x) => x?.gameObject?.receiveDamage?.(x.gameObject.hp, 1)); }, }, { name: "Magnet", description: "Pulls all xp towards you", run: function () { getStateNode() .game.current.config.sceneConfig.physics.world.colliders._active.find((x) => x.collideCallback?.toString().includes("magnetTime")) .collideCallback({ active: true }, { active: true, setActive() {}, setVisible() {} }); }, }, { name: "Max Current Abilities", description: "Maxes out all your current abilities", run: function () { const stateNode = getStateNode(); for (const [ability, level] of Object.entries(stateNode.state.abilities)) for (let i = 0; i < 10 - level; i++) stateNode.game.current.config.sceneConfig.game.events.emit("level up", ability, stateNode.state.abilities[ability]++); stateNode.setState({ level: (stateNode.game.current.config.sceneConfig.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), }); }, }, { name: "Next Level", description: "Skips to the next level", run: function () { let stateNode = getStateNode(); let { object1: player, object2: xp } = stateNode.game.current.config.sceneConfig.physics.world.colliders._active.find((x) => x.collideCallback?.toString().includes('emit("xp')); 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); }, }, { name: "Remove Obstacles", description: "Removes all rocks and obstacles", run: function () { getStateNode().game.current.config.sceneConfig.physics.world.bodies.entries.forEach((body) => { try { if (body.gameObject.frame.texture.key.includes("obstacle")) body.gameObject.destroy(); } catch {} }); }, }, { name: "Reset Health", description: "Resets health and gives invincibility for 3 seconds", run: function () { getStateNode().game.current.events._events.respawn.fn(); }, }, ], }, dino: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Deceptive_Dinos_Logo_Resized.png", name: "Deceptive Dinos", cheats: [ { name: "Auto Choose", description: "Automatically choose the best fossil when excavating", type: "toggle", enabled: false, data: null, rand(e, t) { const s = []; while (s.length < t) { const i = Math.random(); let r = 0, g = null; for (let o = 0; o < e.length; o++) { r += e[o].rate; if (r >= i) { g = e[o]; break; } } g && !s.includes(g) && s.push(g); } return s; }, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { try { let stateNode = getStateNode(); if (stateNode.state.stage === "excavate") { stateNode.state.choices.length || (stateNode.state.choices = this.rand( [ { type: "fossil", val: 10, rate: 0.1, blook: "Amber" }, { type: "fossil", val: 25, rate: 0.1, blook: "Dino Egg" }, { type: "fossil", val: 50, rate: 0.175, blook: "Dino Fossil" }, { type: "fossil", val: 75, rate: 0.175, blook: "Stegosaurus" }, { type: "fossil", val: 100, rate: 0.15, blook: "Velociraptor" }, { type: "fossil", val: 125, rate: 0.125, blook: "Brontosaurus" }, { type: "fossil", val: 250, rate: 0.075, blook: "Triceratops" }, { type: "fossil", val: 500, rate: 0.025, blook: "Tyrannosaurus Rex" }, { type: "mult", val: 1.5, rate: 0.05 }, { type: "mult", val: 2, rate: 0.025 }, ], 3 )); let max = 0, index = -1; for (let i = 0; i < stateNode.state.choices.length; i++) { const { type, val } = stateNode.state.choices[i]; const value = (type == "fossil" ? stateNode.state.fossils + val * stateNode.state.fossilMult : stateNode.state.fossils * val) || 0; if (value <= max && type != "mult") continue; (max = value), (index = i + 1); } document.querySelector('div[class*=rockRow] > div[role="button"]:nth-child(' + index + ")").click(); } } catch {} }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Rock ESP", description: "Shows what is under the rocks", type: "toggle", enabled: false, data: null, run: (() => { function rand(e, t) { const s = []; while (s.length < t) { const i = Math.random(); let r = 0; let g; for (let o = 0; o < e.length; o++) { r += e[o].rate; if (r >= i) { g = e[o]; break; } } if (g && !s.includes(g)) s.push(g); } return s; } const exps = ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"]; const getExpAscii = (num) => { let res = ""; while (num > 0) { res = exps[num % 10] + res; num = ~~(num / 10); } return res; }; function shortNum(value) { let newValue = value.toString(); if (value >= 1000) { const suffixes = ["", "K", "M", "B", "T"]; const suffixNum = Math.floor(Math.floor((Math.log(value) / Math.log(10)).toPrecision(14)) / 3); if (suffixNum < suffixes.length) { let shortValue = ""; for (let precision = 3; precision >= 1; precision--) { shortValue = parseFloat((suffixNum != 0 ? value / Math.pow(1000, suffixNum) : value).toPrecision(precision)).toString(); const dotLessShortValue = shortValue.replace(/[^a-zA-Z 0-9]+/g, ""); if (dotLessShortValue.length <= 3) break; } if (Number(shortValue) % 1 != 0) shortValue = Number(shortValue).toFixed(1); newValue = shortValue + suffixes[suffixNum]; } else { let num = value; let exp = 0; while (num >= 100) { num = Math.floor(num / 10); exp += 1; } newValue = num / 10 + " × 10" + getExpAscii(exp + 1); } } return newValue; } return function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { let stateNode = getStateNode(); const rocks = document.querySelector('[class*="rockButton"]').parentElement.children; if (!Array.prototype.every.call(rocks, (element) => element.querySelector("div"))) stateNode.setState( { choices: rand( [ { type: "fossil", val: 10, rate: 0.1, blook: "Amber" }, { type: "fossil", val: 25, rate: 0.1, blook: "Dino Egg" }, { type: "fossil", val: 50, rate: 0.175, blook: "Dino Fossil" }, { type: "fossil", val: 75, rate: 0.175, blook: "Stegosaurus" }, { type: "fossil", val: 100, rate: 0.15, blook: "Velociraptor" }, { type: "fossil", val: 125, rate: 0.125, blook: "Brontosaurus" }, { type: "fossil", val: 250, rate: 0.075, blook: "Triceratops" }, { type: "fossil", val: 500, rate: 0.025, blook: "Tyrannosaurus Rex" }, { type: "mult", val: 1.5, rate: 0.05 }, { type: "mult", val: 2, rate: 0.025 }, ], 3 ), }, () => { Array.prototype.forEach.call(rocks, (element, index) => { const rock = stateNode.state.choices[index]; if (element.querySelector("div")) element.querySelector("div").remove(); const choice = document.createElement("div"); choice.style.color = "white"; choice.style.fontFamily = "Macondo"; choice.style.fontSize = "1em"; choice.style.display = "flex"; choice.style.justifyContent = "center"; choice.style.transform = "translateY(25px)"; 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`; element.append(choice); }); } ); }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }; })(), }, { name: "Set Fossils", description: "Sets the amount of fossils you have", inputs: [ { name: "Fossils", type: "number", }, ], run: function (fossils) { let stateNode = getStateNode(); stateNode.setState({ fossils }); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/f`, val: fossils, }); }, }, { name: "Set Multiplier", description: "Sets fossil multiplier", inputs: [ { name: "Multiplier", type: "number", }, ], run: function (fossilMult) { let stateNode = getStateNode(); stateNode.setState({ fossilMult }); }, }, { name: "Stop Cheating", description: "Undoes cheating so that you can't be caught", run: function () { let stateNode = getStateNode(); stateNode.setState({ isCheating: false }); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/ic`, val: false, }); }, }, ], }, royale: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Battle_Royale_Logo_Resized.png", name: "Battle Royale", cheats: [ { name: "Auto Answer (Toggle)", description: "Toggles auto answer on", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval(() => { let stateNode = getStateNode(); stateNode?.onAnswer?.(true, stateNode.props.client.question.correctAnswers[0]); }, 50); } else { this.enabled = false; clearInterval(this.data); this.data = null; } }, }, { name: "Auto Answer", description: "Chooses the correct answer for you", run: function () { let stateNode = getStateNode(); stateNode?.onAnswer?.(true, stateNode.props.client.question.correctAnswers[0]); }, }, ], }, defense: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Tower_Defense_Logo_Resized.png", name: "Tower Defense", cheats: [ { name: "Earthquake", description: "Shuffles around towers", run: function () { let stateNode = getStateNode(); stateNode.setState( { eventName: "Earthquake", event: { short: "e", color: "#805500", icon: "fas fa-mountain", desc: "All of your towers get mixed up", rate: 0.02, }, buyTowerName: "", buyTower: {}, }, () => (stateNode.eventTimeout = setTimeout(() => stateNode.setState({ event: {}, eventName: "" }), 6e3)) ); stateNode.tiles.forEach((row) => row.forEach((col, i) => col == 3 && (row[i] = 0))); let tiles = []; for (let y = 0; y < stateNode.tiles.length; y++) for (let x = 0; x < stateNode.tiles[y].length; x++) if (stateNode.tiles[y][x] == 0) tiles.push({ x, y }); tiles.sort(() => Math.random() - Math.random()); stateNode.towers.forEach((tower) => { let { x, y } = tiles.pop(); tower.move(x, y, stateNode.tileSize); stateNode.tiles[y][x] = 3; }); }, }, { name: "Max Tower Stats", description: "Makes all placed towers overpowered", run: function () { getStateNode().towers.forEach((tower) => { tower.range = 100; tower.fullCd = tower.cd = 0; tower.damage = 1e6; }); }, }, { name: "Remove Ducks", description: "Removes ducks", run: function () { let { ducks, tiles } = getStateNode(); ducks.forEach((x) => (tiles[x.y][x.x] = 0)); ducks.length = 0; }, }, { name: "Remove Enemies", description: "Removes all the enemies", run: function () { let stateNode = getStateNode(); stateNode.enemies = stateNode.futureEnemies = []; }, }, { name: "Remove Obstacles", description: "Lets you place towers anywhere", run: function () { let stateNode = getStateNode(); stateNode.tiles = stateNode.tiles.map((row) => row.fill(0)); }, }, { name: "Set Damage", description: "Sets damage", inputs: [ { name: "Damage", type: "number", }, ], run: function (dmg) { getStateNode().dmg = dmg; }, }, { name: "Set Round", description: "Sets the current round", inputs: [ { name: "Round", type: "number", }, ], run: function (round) { getStateNode().setState({ round }); }, }, { name: "Set Tokens", description: "Sets the amount of tokens you have", inputs: [ { name: "Tokens", type: "number", }, ], run: function (tokens) { getStateNode().setState({ tokens }); }, }, ], }, cafe: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Cafe_Logo_Resized.png", name: "Café", cheats: [ { name: "Max Items", description: "Maxes out items in the shop (Only usable in the shop)", run: function () { if (window.location.pathname !== "/cafe/shop") alert("This can only be run in the shop"); else { const stateNode = getStateNode(); stateNode.setState({ items: Object.keys(stateNode.state.items).reduce((obj, item) => ((obj[item] = 5), obj), {}) }); } }, }, { name: "Remove Customers", description: "Skips the current customers (Not usable in the shop)", run: function () { const stateNode = getStateNode(); stateNode.state.customers.forEach((customer, i) => window.setTimeout(() => customer.blook && stateNode.removeCustomer(i, true), i * 250)); }, }, { name: "Reset Abilities", description: "Resets used abilities in shop (Only usable in the shop)", run: function () { if (window.location.pathname !== "/cafe/shop") alert("This can only be run in the shop"); else { const stateNode = getStateNode(); stateNode.setState({ abilities: Object.keys(stateNode.state.abilities).reduce((obj, item) => ((obj[item] = 5), obj), {}) }); } }, }, { name: "Set Cash", description: "Sets cafe cash", inputs: [ { name: "Amount", type: "number", }, ], run: function (cafeCash) { let stateNode = getStateNode(); stateNode.setState({ cafeCash }); stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/ca`, val: cafeCash, }); }, }, { name: "Stock Food", description: "Stocks all food to 99 (Not usable in the shop)", run: function () { if (window.location.pathname !== "/cafe") alert("This can't be run in the shop"); else { const stateNode = getStateNode(); stateNode.setState({ foods: stateNode.state.foods.map((e) => ({ ...e, stock: 99, level: 5 })) }); } }, }, ], }, factory: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Factory_Logo_Resized.png", name: "Factory", cheats: [ { name: "Choose Blook", description: "Gives you a blook", inputs: [ { name: "Blook", type: "options", 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) })), }, ], run: function (blook) { const stateNode = getStateNode(); if (stateNode.state.blooks.length >= 10) alert("Choose a blook to replace"); stateNode.waiting = false; stateNode.chooseBlook(JSON.parse(blook)); }, }, { name: "Free Upgrades", description: "Sets upgrade prices to 0 for all current blooks", run: function () { const prices = [0, 0, 0, 0]; let stateNode = getStateNode(); stateNode.setState({ blooks: stateNode.state.blooks.map((blook) => ((blook.price = prices), blook)) }); }, }, { name: "Max Blooks", description: "Maxes out all your blooks' levels", run: function () { getStateNode().state.blooks.forEach((blook) => (blook.level = 4)); }, }, { name: "Remove Glitches", description: "Removes all enemy glitches", run: function () { let stateNode = getStateNode(); stateNode.setState({ bits: 0, ads: [], hazards: [], color: "", lol: false, joke: false, slow: false, dance: false, glitch: "", glitcherName: "", glitcherBlook: "", }); clearTimeout(stateNode.adTimeout); clearInterval(stateNode.hazardInterval); clearTimeout(stateNode.nightTimeout); clearTimeout(stateNode.glitchTimeout); clearTimeout(stateNode.lolTimeout); clearTimeout(stateNode.jokeTimeout); clearTimeout(stateNode.slowTimeout); clearTimeout(stateNode.danceTimeout); clearTimeout(stateNode.nameTimeout); }, }, { name: "Send Glitch", description: "Sends a glitch to everyone else playing", inputs: [ { name: "Glitch", type: "options", 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 }) ), }, ], run: function (val) { let stateNode = getStateNode(); stateNode.safe = true; stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/tat`, val }); }, }, { name: "Set All MegaBot", description: "Sets all your blooks to maxed out Mega Bots", run: function () { getStateNode().setState({ blooks: Array.from({ length: 10 }, () => ({ name: "Mega Bot", color: "#d71f27", class: "🤖", rarity: "Legendary", cash: [8e4, 43e4, 42e5, 62e6, 1e9], time: [5, 5, 3, 3, 3], price: [7e6, 12e7, 19e8, 35e9], active: false, level: 4, bonus: 5.5, })), }); }, }, { name: "Set Cash", description: "Sets amount of cash you have", inputs: [ { name: "Cash", type: "number", }, ], run: function (cash) { getStateNode().setState({ cash }); }, }, ], }, racing: { img: "https://media.blooket.com/image/upload/v1663212882/Media/logos/Racing_Logo_Resized.png", name: "Racing", cheats: [ { name: "Instant Win", description: "Instantly Wins the race", run: function () { const stateNode = getStateNode(); stateNode.setState({ progress: stateNode.state.goalAmount }); stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name + "/pr", val: stateNode.state.goalAmount, }); }, }, { name: "Set Questions", description: "Sets the number of questions left", inputs: [ { name: "Questions", type: "number", }, ], run: function (progress) { let stateNode = getStateNode(); progress = stateNode.props.client.amount - progress; stateNode.setState({ progress }); stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name + "/pr", val: progress, }); }, }, ], }, rush: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Blook_Rush_Logo_Resized.png", name: "Blook Rush", cheats: [ { name: "Set Blooks", description: "Sets amount of blooks you or your team has", inputs: [ { name: "Blooks", type: "number", }, ], run: function (numBlooks) { let stateNode = getStateNode(); stateNode.setState({ numBlooks }); stateNode.props.liveGameController.setVal({ path: (stateNode.isTeam ? "a/" : "c/") + stateNode.props.client.name + "/bs", val: numBlooks, }); }, }, { name: "Set Defense", description: "Sets amount of defense you or your team has (Max 4)", inputs: [ { name: "Defense (max 4)", type: "number", max: 4, }, ], run: function (defense) { let numDefense = Math.min(defense, 4); let stateNode = getStateNode(); stateNode.setState({ numDefense }); stateNode.props.liveGameController.setVal({ path: (stateNode.isTeam ? "a/" : "c/") + stateNode.props.client.name + "/d", val: numDefense, }); }, }, ], }, tower: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Tower_Of_Doom_Logo_Resized.png", name: "Tower of Doom", cheats: [ { name: "Fill Deck", description: "Fills your deck with every maxed out card and artifact (Only works on towers page)", run: function () { if (window.location.pathname == "/tower/map") { const stateNode = getStateNode(); 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( "|" ); 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) => { const [blook, c] = x.split(","); return { strength: 20, charisma: 20, wisdom: 20, class: c, blook }; }); try { stateNode.props.addTowerNode(); } catch {} stateNode.setState({ showDeck: false }); } else alert("You need to be on the map to run this cheat!"); }, }, { name: "Max Cards", description: "Maxes out all the cards in your deck", run: function () { if (window.location.pathname == "/tower/map") { const stateNode = getStateNode(); stateNode.props.tower.cards.forEach((card) => { card.strength = 20; card.charisma = 20; card.wisdom = 20; }); try { stateNode.forceUpdate(); } catch {} } else alert("You need to be on the map to run this cheat!"); }, }, { name: "Max Health", description: "Fills the player's health", run: function () { if (window.location.pathname == "/tower/battle") getStateNode().setState({ myHealth: 100, myLife: 100 }); else alert("You need to be in battle to run this cheat!"); }, }, { name: "Max Card Stats", description: "Maxes out player's current card (Only works on attribute select page)", run: function () { const stateNode = getStateNode(); if (stateNode.state.phase !== "select") alert("You must be on the attribute selection page!"); else stateNode.setState({ myCard: { ...stateNode.state.myCard, strength: 20, charisma: 20, wisdom: 20 } }); }, }, { name: "Min Enemy Stats", description: "Makes the enemy card stats all 0 (Only works on attribute select page)", run: function () { const stateNode = getStateNode(); if (stateNode.state.phase !== "select") alert("You must be on the attribute selection page!"); else stateNode.setState({ enemyCard: { ...stateNode.state.enemyCard, strength: 0, charisma: 0, wisdom: 0 } }); }, }, { name: "Set Coins", description: "Try's to set amount of tower coins you have", inputs: [ { name: "Coins", type: "number", }, ], run: function (coins) { if (window.location.pathname == "/tower/battle") try { getStateNode().props.setTowerCoins(coins); } catch {} else alert("You need to be in battle to run this cheat!"); }, }, ], }, kingdom: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Crazy_Kingdom_Logo_Resized.png", name: "Crazy Kingdom", cheats: [ { name: "Choice ESP", description: "Shows you what will happen if you say Yes or No", type: "toggle", enabled: false, data: null, run: function () { if (!this.enabled) { this.enabled = true; this.data = setInterval( (stats) => { let stateNode = getStateNode(); let elements = Array.prototype.reduce.call(document.querySelectorAll("[class*=statContainer]"), (obj, container, i) => ((obj[stats[i]] = container), obj), {}); if (stateNode.state.phase == "choice") { Array.prototype.forEach.call(document.querySelectorAll(".choiceESP"), (x) => x.remove()); Object.keys(stateNode.state.guest.yes || {}).forEach((x) => { if (elements[x] == null) return; let element = document.createElement("div"); element.className = "choiceESP"; element.style = "font-size: 24px; color: rgb(75, 194, 46); font-weight: bolder;"; element.innerText = String(stateNode.state.guest.yes[x]); elements[x].appendChild(element); }); Object.keys(stateNode.state.guest.no || {}).forEach((x) => { if (elements[x] == null) return; let element = document.createElement("div"); element.className = "choiceESP"; element.style = "font-size: 24px; color: darkred; font-weight: bolder;"; element.innerText = String(stateNode.state.guest.no[x]); elements[x].appendChild(element); }); Array.prototype.forEach.call( document.querySelectorAll("[class*=guestButton][role=button]"), (x) => (x.onclick = () => Array.prototype.forEach.call(document.querySelectorAll(".choiceESP"), (x) => x.remove())) ); } }, 50, ["materials", "people", "happiness", "gold"] ); } else { this.enabled = false; clearInterval(this.data); Array.prototype.forEach.call(document.querySelectorAll(".choiceESP"), (x) => x.remove()); this.data = null; } }, }, { name: "Disable Tax Toucan", description: "Tax evasion", run: function () { getStateNode().taxCounter = Number.MAX_VALUE; }, }, { name: "Max Stats", description: "Sets all resources to the max", run: function () { getStateNode().setState({ materials: 100, people: 100, happiness: 100, gold: 100 }); }, }, { name: "Set Guests", description: "Sets the amount of guests you've seen", inputs: [ { name: "Guests", type: "number", }, ], run: function (guestScore) { getStateNode().setState({ guestScore }); }, }, { name: "Skip Guest", description: "Skips the current guest", run: function () { getStateNode().nextGuest(); }, }, ], }, toy: { img: "https://media.blooket.com/image/upload/v1663212881/Media/logos/Santas_Workshop_Logo_Resized.png", name: "Santa's Workshop", cheats: [ { name: "Remove Distractions", description: "Removes all enemy distractions", run: function () { getStateNode().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] }); }, }, { name: "Send Distraction", description: "Sends a distraction to everyone else playing", inputs: [ { name: "Distraction", type: "options", 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, })), }, ], run: function (val) { let stateNode = getStateNode(); stateNode.safe = true; stateNode.props.liveGameController.setVal({ path: `c/${stateNode.props.client.name}/tat`, val }); }, }, { name: "Set Toys", description: "Sets amount of toys", inputs: [ { name: "Toys", type: "number", }, ], run: function (toys) { let stateNode = getStateNode(); stateNode.setState({ toys }); stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name + "/t", val: toys, }); }, }, { name: "Set Toys Per Question", description: "Sets amount of toys per question", inputs: [ { name: "Toys Per Question", type: "number", }, ], run: function (toysPerQ) { getStateNode().setState({ toysPerQ }); }, }, { name: "Swap Toys", description: "Swaps toys with someone", inputs: [ { name: "Player", type: "options", options: () => { let stateNode = getStateNode(); return stateNode.props.liveGameController._liveApp ? new Promise((res) => stateNode.props.liveGameController.getDatabaseVal("c", (players) => players && res(Object.keys(players)))) : []; }, }, ], run: function (target) { let stateNode = getStateNode(); stateNode.props.liveGameController.getDatabaseVal("c", (players) => { if (!players || players[target] == null) return; stateNode.props.liveGameController.setVal({ path: "c/" + stateNode.props.client.name + "/tat", val: `${target}:swap:${stateNode.state.toys}`, }); stateNode.setState({ toys: players[target].t }); }); }, }, ], }, flappy: { img: "https://ac.blooket.com/marketassets/blooks/chick.svg", name: "Flappy Blook", cheats: [ { name: "Toggle Ghost", description: "Lets you go through the pipes", type: "toggle", enabled: false, run: function () { this.enabled = !this.enabled; for (const body of Object.values(document.querySelector("#phaser-bouncy"))[0].return.updateQueue.lastEffect.deps[0].current.config.sceneConfig.physics.world.bodies.entries) { if (!body.gameObject.frame.texture.key.startsWith("blook")) continue; body.checkCollision.none = this.enabled; body.gameObject.setAlpha(this.enabled ? 0.5 : 1); break; } }, }, { name: "Set Score", description: "Sets flappy blook score", inputs: [ { name: "Score", type: "number", }, ], run: function (score) { Object.values(document.querySelector("#phaser-bouncy"))[0].return.updateQueue.lastEffect.deps[1](score || 0); }, }, ], }, }; const searchPage = document.createElement("div"); searchPage.className = classes.searchPage; const searchbarHolder = document.createElement("form"); searchbarHolder.className = classes.searchbarHolder; const searchbarInput = document.createElement("input"); searchbarInput.placeholder = "Search Cheats"; searchbarInput.className = classes.searchbarInput; const searchbarButton = document.createElement("div"); searchbarButton.onclick = () => (searchbarInput.value = ""); searchbarButton.innerHTML = ''; searchbarButton.className = classes.searchbarButton; searchbarHolder.append(searchbarInput, searchbarButton); const searchResults = document.createElement("div"); searchResults.className = classes.noScroll + " " + classes.searchResults; const noResult = document.createElement("div"); noResult.className = classes.noResult; searchPage.append(searchbarHolder, searchResults); let searchThrottle, gamemodeResults = {}; searchPage.onPath = searchbarHolder.onsubmit = (e) => { clearTimeout(searchThrottle); e?.preventDefault?.(); const query = searchbarInput.value.toLowerCase(); let hasResults = false; for (const child of searchResults.children) { if (child != noResult) { if (child.dataset[datasets.mode]?.includes?.(query) || child.dataset[datasets.name].includes(query) || child.dataset[datasets.description]?.includes?.(query)) { hasResults = true; child.style.display = "block"; if (child.dataset[datasets.mode]) gamemodeResults[child.dataset[datasets.mode]].style.display = "block"; } else child.style.display = "none"; } } if (!hasResults) { noResult.innerText = `No results found for "${query}"`; noResult.style.display = "block"; } else noResult.style.display = "none"; }; searchbarInput.oninput = (e) => { clearTimeout(searchThrottle); searchThrottle = setTimeout(searchbarHolder.onsubmit, 1000); }; const favoritesPage = document.createElement("div"); favoritesPage.className = classes.noScroll + " " + classes.favoritesPage; const noFavorites = document.createElement("span"); noFavorites.innerText = "You have no favorites."; favoritesPage.append(noFavorites); favoritesPage.onPath = () => { noFavorites.style.display = favoritesPage.querySelector("[data-" + datasets.favorited + "='true']") == null ? "block" : "none"; }; gamemodesList.innerHTML = ""; searchResults.innerHTML = ""; searchResults.append(noResult); for (const mode in cheats) { const gamemode = document.createElement("div"); gamemode.className = classes.gamemode; const image = document.createElement("img"); image.src = cheats[mode].img; const name = document.createElement("div"); image.alt = name.innerText = cheats[mode].name; gamemode.append(image, name); const cheatsPage = document.createElement("div"); cheatsPage.className = classes.contentPage; const cheatsList = document.createElement("div"); cheatsList.className = classes.cheatsList + " " + classes.noScroll; const inputElements = []; cheatsPage.onPath = () => inputElements.forEach((x) => x()); const searchResultSeparator = document.createElement("div"); searchResultSeparator.onclick = () => path.push(cheats[mode].name, cheatsPage); searchResultSeparator.className = classes.searchResultSeparator; searchResultSeparator.dataset[datasets.name] = (searchResultSeparator.innerText = cheats[mode].name).toLowerCase(); gamemodeResults[cheats[mode].name.toLowerCase()] = searchResultSeparator; searchResults.append(searchResultSeparator); const favoritesSeparator = searchResultSeparator.cloneNode(true); favoritesSeparator.dataset[datasets.favorites] = 0; favoritesSeparator.onclick = searchResultSeparator.onclick; favoritesPage.append(favoritesSeparator); for (const cheat of cheats[mode].cheats) { const cheatId = `${mode}.${cheat.name.toLowerCase()}.${cheat.type == "toggle" ? "toggle" : "execute"}`; const cheatElement = document.createElement("div"); const searchResult = document.createElement("div"); searchResult.className = classes.searchResult; const searchResultInfo = document.createElement("div"); searchResultInfo.className = classes.searchResultInfo; const searchResultName = document.createElement("div"); searchResultName.className = classes.searchResultName; searchResult.dataset[datasets.name] = (searchResultName.innerText = cheat.name + (cheat.type == "toggle" && !cheat.name.includes("toggle") ? " (Toggle)" : "")).toLowerCase(); searchResult.dataset[datasets.mode] = cheats[mode].name.toLowerCase(); const searchResultDescription = document.createElement("div"); searchResultDescription.className = classes.searchResultDescription; searchResult.dataset[datasets.description] = (searchResultDescription.innerText = cheat.description).toLowerCase(); searchResultInfo.append(searchResultName, searchResultDescription); searchResult.onclick = () => { path.push(searchResultName.innerText, cheatsPage); cheatElement.scrollIntoView(); cheatElement.animate( [ { color: "var(--textColor)", textShadow: "0 0 0px var(--highlight)", }, { color: "var(--highlight)", textShadow: "0 0 5px var(--highlight)", offset: 0.25, }, { color: "var(--textColor)", textShadow: "0 0 0px var(--highlight)", }, ], 1500 ); }; searchResult.append(searchResultInfo); searchResults.append(searchResult); const cheatTop = document.createElement("div"); cheatTop.className = classes.cheatTop; const cheatInfo = document.createElement("div"); cheatInfo.className = classes.cheatInfo; const cheatName = document.createElement("span"); cheatName.innerText = cheat.name; cheatName.className = classes.cheatName; const favoriteButton = document.createElement("i"); favoriteButton.className = "far fa-star " + classes.favoriteButton; const favoriteInner = document.createElement("i"); favoriteInner.className = "fas fa-star"; favoriteButton.append(favoriteInner); let favoritesPageCopy = searchResult.cloneNode(true); favoritesPageCopy.dataset[datasets.favorited] = false; favoritesPageCopy.onclick = searchResult.onclick; favoritesPage.append(favoritesPageCopy); favoriteButton.onclick = () => { const favorited = cheatId in Settings.data.favorites; favoriteInner.classList.toggle(classes.filled, !favorited); if (favorited) { delete Settings.data.favorites[cheatId]; favoritesPageCopy.dataset[datasets.favorited] = false; favoritesSeparator.dataset[datasets.favorites]--; } else { Settings.data.favorites[cheatId] = 1; favoritesPageCopy.dataset[datasets.favorited] = true; favoritesSeparator.dataset[datasets.favorites]++; } favoritesPage.onPath(); Settings.setData(Settings.data); }; if (cheatId in (Settings.data.favorites ??= {})) { favoriteInner.classList.toggle(classes.filled, true); favoritesPageCopy.dataset[datasets.favorited] = true; favoritesSeparator.dataset[datasets.favorites]++; } cheatName.append(favoriteButton); const cheatDescription = document.createElement("span"); cheatDescription.innerText = cheat.description; cheatDescription.className = classes.cheatDescription; cheatInfo.append(cheatName, cheatDescription); cheatElement.append(cheatTop); const inputs = []; if (Array.isArray(cheat.inputs)) { const cheatInputs = document.createElement("div"); cheatInputs.className = classes.cheatInputs; for (const input of cheat.inputs) { const inputElement = document.createElement("div"); const inputName = document.createElement("span"); inputName.innerText = input.name; inputElement.append(inputName); cheatInputs.append(inputElement); if (input.type == "options") { const inputField = document.createElement("select"); inputField.dataset[datasets.type] = "options"; inputElement.append(inputField); inputs.push(inputField); let curField = inputField; const updateOptions = () => { let choose = input.options; const newInputField = document.createElement("select"); newInputField.dataset[datasets.type] = "options"; inputs[inputs.indexOf(curField)] = newInputField; curField.replaceWith(newInputField); curField = newInputField; if (typeof choose == "function") try { choose = choose(); } catch { choose = []; } if (choose instanceof Promise) { const waiting = document.createElement("option"); waiting.value = '""'; waiting.innerHTML = "Loading Options..."; curField.append(waiting); choose.then((choices) => { if (choices?.length > 0) { curField.innerHTML = ""; for (const choice of choices) { const option = document.createElement("option"); option.value = JSON.stringify(choice?.value ?? choice); option.innerHTML = choice?.name || choice; curField.append(option); } } else { const newInputField = document.createElement("input"); inputs[inputs.indexOf(curField)] = newInputField; curField.replaceWith(newInputField); newInputField.dataset[datasets.type] = "string"; newInputField.placeholder = input.name; curField = newInputField; } }); } else { if (choose?.length > 0) { for (const choice of choose) { const option = document.createElement("option"); option.value = JSON.stringify(choice?.value ?? choice); option.innerHTML = choice?.name || choice; curField.append(option); } } else { const newInputField = document.createElement("input"); inputs[inputs.indexOf(curField)] = newInputField; curField.replaceWith(newInputField); newInputField.dataset[datasets.type] = "string"; newInputField.placeholder = input.name; curField = newInputField; } } }; updateOptions(); inputElements.push(updateOptions); } else { const inputField = document.createElement("input"); inputField.dataset[datasets.type] = input.type; if (input.type == "number") { inputField.type = "number"; inputField.min = input.min; inputField.max = input.max; inputField.value = input.value || (input.min ?? 0); } inputField.placeholder = input.name; inputElement.append(inputField); inputs.push(inputField); } } cheatElement.append(cheatInputs); } cheatTop.append(cheatInfo); const runButton = document.createElement("div"); runButton.className = classes.runCheat; if (cheat.type == "toggle") { runButton.innerText = "Toggle On"; runButton.classList.add(classes.toggleCheat); } else runButton.innerText = "Execute"; runButton.onclick = () => { cheat.run.apply( cheat, inputs.map((x) => (x.dataset[datasets.type] == "number" ? parseFloat("0" + x.value) : x.dataset[datasets.type] == "options" ? JSON.parse(x.value) : x.value)) ); if (cheat.type == "toggle") { runButton.innerText = "Toggle " + (cheat.enabled ? "Off" : "On"); runButton.classList.toggle(classes.active, cheat.enabled); Logs.addLog(`Toggled "${cheat.name}" ${cheat.enabled ? "on" : "off"}`, cheat.enabled ? "var(--toggleOn)" : "var(--toggleOff)"); } Logs.addLog(`Ran "${cheat.name}"`, "var(--highlight)"); }; cheatTop.append(runButton); cheatsList.append(cheatElement); } cheatsPage.append(cheatsList); gamemode.onclick = () => path.push(cheats[mode].name, cheatsPage); gamemodesList.append(gamemode); } gamemodesPage.append(gamemodesList); const creditsPage = document.createElement("div"); creditsPage.className = classes.creditsPage; const licenseMessage = document.createElement("div"); licenseMessage.className = classes.licenseMessage; licenseMessage.innerHTML = `
`; const copyrightTag = document.createElement("span"); copyrightTag.className = classes.copyrightTag; copyrightTag.innerText = `Copyright © ${new Date().getFullYear()} pooperschw4rtz`; const codingCredits = document.createElement("ul"); codingCredits.className = classes.codingCredits; codingCredits.append(createCredit("GUI Design + Creation", "pooperschw4rtz")); codingCredits.append(createCredit("", "")); codingCredits.append(createCredit("", ' ')); const creditLinks = document.createElement("ul"); creditLinks.className = classes.creditLinks; creditLinks.append(createCredit("", '')); creditLinks.append(createCredit("", '')); creditLinks.append(createCredit("ADD ME ON DISCORD IF YOU NEED SOMETHING!!!", 'CLICK HERE!!!!')); function parseTime(d) { const hour = d.getHours() % 12 == 0 ? 12 : d.getHours() % 12; const minutes = d.getMinutes().toString().padStart(2, "0"); return `${hour}:${minutes} ${d.getHours() >= 12 ? "PM" : "AM"}`; } function parseDate(d) { const month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][d.getMonth()]; return `${month} ${d.getDate()}${getOrdinal(d.getDate())}, ${d.getFullYear()} - ${parseTime(d)}`; } const uploadDates = document.createElement("ul"); uploadDates.className = classes.uploadDates; try { let currentDate = new Date(timeProcessed), latestDate = new Date(latestProcess); uploadDates.append(createCredit("Current GUI Upload Date", parseDate())); if (latestProcess != -1) uploadDates.append(createCredit("Latest GUI Upload Date", parseDate(latestDate))); if (currentDate < latestDate) { const warning = document.createElement("span"); warning.className = classes.warning; warning.innerText = "You are using an outdated version of GUI."; uploadDates.append(warning); } } catch { const warning = document.createElement("span"); warning.className = classes.warning; warning.innerText = "Made this script for the mfs that want ts at my school."; uploadDates.append(warning); } creditsPage.append(licenseMessage, codingCredits, creditLinks, uploadDates, copyrightTag); function getOrdinal(n) { if (n % 10 == 1 && n % 100 != 11) return "st"; if (n % 10 == 2 && n % 100 != 12) return "nd"; if (n % 10 == 3 && n % 100 != 13) return "rd"; return "th"; } function createCredit(contribution, html) { const listItem = document.createElement("li"); const contributionText = document.createElement("strong"); contributionText.innerText = contribution + ":"; const right = document.createElement("span"); right.innerHTML = html; listItem.append(contributionText, right); return listItem; } const settingsPage = document.createElement("div"); settingsPage.className = classes.noScroll + " " + classes.settingsPage; const searchResultSeparator = document.createElement("div"); searchResultSeparator.onclick = () => path.push("Settings", settingsPage); searchResultSeparator.className = classes.searchResultSeparator; searchResultSeparator.innerText = "Settings"; searchResultSeparator.dataset[datasets.name] = "settings"; gamemodeResults.settings = searchResultSeparator; searchResults.append(searchResultSeparator); const settingRefresh = []; function addSetting(name, description, input, onUpdate) { const settingElement = document.createElement("div"); const searchResult = document.createElement("div"); searchResult.className = classes.searchResult; const searchResultInfo = document.createElement("div"); searchResultInfo.className = classes.searchResultInfo; const searchResultName = document.createElement("div"); searchResultName.className = classes.searchResultName; searchResult.dataset[datasets.name] = (searchResultName.innerText = name).toLowerCase(); searchResult.dataset[datasets.mode] = "settings"; const searchResultDescription = document.createElement("div"); searchResultDescription.className = classes.searchResultDescription; searchResult.dataset[datasets.description] = (searchResultDescription.innerText = description).toLowerCase(); searchResultInfo.append(searchResultName, searchResultDescription); searchResult.onclick = () => { path.push(name, settingsPage); settingElement.scrollIntoView(); settingElement.animate( [ { color: "var(--textColor)", textShadow: "0 0 0px var(--highlight)", }, { color: "var(--highlight)", textShadow: "0 0 5px var(--highlight)", offset: 0.25, }, { color: "var(--textColor)", textShadow: "0 0 0px var(--highlight)", }, ], 1500 ); }; searchResult.append(searchResultInfo); searchResults.append(searchResult); const settingTop = document.createElement("div"); settingTop.className = classes.cheatTop; const settingInfo = document.createElement("div"); settingInfo.className = classes.cheatInfo; const settingName = document.createElement("span"); settingName.innerText = name; settingName.className = classes.cheatName; const settingDescription = document.createElement("span"); settingDescription.innerText = description; settingDescription.className = classes.cheatDescription; settingInfo.append(settingName, settingDescription); settingElement.append(settingTop); const settingInputs = document.createElement("div"); settingInputs.className = classes.cheatInputs; const inputElement = document.createElement("div"); const inputName = document.createElement("span"); inputName.innerText = input.name; inputElement.append(inputName); settingInputs.append(inputElement); let inputField = document.createElement("input"); inputField.dataset[datasets.type] = input.type; if (input.type == "keybind") { inputField.readOnly = true; let locked = false; inputField.data = input.data; inputField.onclick = async () => { if (locked) return; inputField.value = "Waiting for input..."; locked = true; inputField.data = await input.listen((e) => (inputField.value = e + "...")); locked = false; inputField.value = inputField.value.slice(0, -3); }; (settingRefresh[settingRefresh.length] = () => (inputField.value = input.value()))(); } else if (input.type == "options") { inputField = document.createElement("select"); inputField.dataset[datasets.type] = "options"; const defaultOption = document.createElement("option"); defaultOption.value = "{}"; defaultOption.innerHTML = "Select a Theme"; (settingRefresh[settingRefresh.length] = () => (defaultOption.selected = true))(); inputField.append(defaultOption); for (const choice of input.options) { const option = document.createElement("option"); option.value = JSON.stringify(choice?.value ?? choice); option.innerHTML = choice?.name || choice; inputField.append(option); } } else { if (input.type == "number") { inputField.type = "number"; inputField.min = input.min; inputField.max = input.max; } (settingRefresh[settingRefresh.length] = () => (inputField.value = input.value()))(); inputField.placeholder = input.name; } inputElement.append(inputField); settingElement.append(settingInputs); settingTop.append(settingInfo); const runButton = document.createElement("div"); runButton.className = classes.runCheat; runButton.innerText = "Update"; runButton.onclick = () => onUpdate(inputField.dataset[datasets.type] == "number" ? parseFloat("0" + inputField.value) : inputField.dataset[datasets.type] == "options" ? JSON.parse(inputField.value) : inputField.data ?? inputField.value); settingTop.append(runButton); settingsPage.append(settingElement); } settingsPage.onPath = () => settingRefresh.forEach((x) => x()); addSetting( "Hide Keybind", "Shortcut to hide to GUI", { type: "keybind", name: "Shortcut", data: defaultHideKey, value: () => parseKeybind(Settings.data.hideKey), listen: (change) => createKeybindListener((keys) => change(parseKeybind(keys))), }, (x) => { Settings.setItem("hideKey", x); } ); addSetting( "Close Keybind", "Shortcut to disable all toggles and close GUI", { type: "keybind", name: "Shortcut", data: defaultCloseKey, value: () => parseKeybind(Settings.data.closeKey), listen: (change) => createKeybindListener((keys) => change(parseKeybind(keys))), }, (x) => { Settings.setItem("closeKey", x); } ); addSetting( "Theme", "A preset look for the GUI", { type: "options", name: "Preset", options: [ { name: "Default", value: { highlight: variables["--highlight"], highlight2: variables["--highlight2"], background: variables["--background"], background2: variables["--background2"], textColor: variables["--textColor"], textColor2: variables["--textColor2"], toggleOff: variables["--toggleOff"], toggleOn: variables["--toggleOn"], }, }, { name: "Crypto Hack", value: { highlight: "rgb(88 175 88)", toggleOn: "#0b601b", background: "radial-gradient(#11581e,#041607)", background2: "f90000", toggleOff: "#A02626", highlight2: "#49d149", textColor2: "f90000", }, }, { name: "Deceptive Dinos", value: { highlight: "#af8942", toggleOn: "#2fb62f", background: "radial-gradient(rgba(220, 184, 86, 0), rgba(220, 184, 86, 0.4)), url(https://ac.blooket.com/play/111cb7e0ee6607ac3d1a13d534c0e0f1.png), #ead49a", background2: "radial-gradient(rgba(1,104,162,.6),rgba(24,55,110,.5)),radial-gradient(#2783b4 1.5px,#18376e 0) center / 24px 24px", toggleOff: "#A02626", highlight2: "rgb(0 0 0 / 25%)", textColor2: "f90000", }, }, { name: "Blook Rush", value: { highlight: "#888", toggleOn: "#47A547", background: "repeating-linear-gradient(45deg,white,white 8%,#e6e6e6 0,#e6e6e6 16%)", background2: "#36c", toggleOff: "#A02626", highlight2: "rgb(0 0 0 / 25%)", textColor2: "f90000", }, }, { name: "Factory", value: { highlight: "#1563bf", toggleOn: "rgb(75, 194, 46)", background: "#3a3a3a", background2: "#2d313d", toggleOff: "#9a49aa", highlight2: "rgb(0 0 0 / 25%)", textColor2: "f90000", }, }, { name: "Cafe", value: { highlight: "#0bc2cf", toggleOn: "#47A547", background: "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", background2: "rgb(64, 64, 64)", toggleOff: "#A02626", highlight2: "rgb(0 0 0 / 25%)", textColor2: "f90000", textColor: "f90000", }, }, { name: "Tower of Doom", value: { highlight: "#9a49aa", toggleOn: "#4bc22e", background: "rgb(41 41 41)", background2: "#404040", toggleOff: "rgb(151, 15, 5)", highlight2: "rgb(0 0 0 / 25%)", textColor2: "f90000", textColor: "f90000", }, }, { name: "Monster Brawl", value: { highlight: "#2966a6", toggleOn: "#47A547", background: "rgb(45, 51, 67)", background2: "#374154", toggleOff: "#A02626", highlight2: "#264d99", textColor2: "f90000", textColor: "f90000", }, }, { name: "Tower Defense 2", value: { highlight: "#40b1d8", toggleOn: "#47A547", background: "url(https://media.blooket.com/image/upload/v1676164454/Media/defense/backgroundTd1-02.svg) center / cover", background2: "#293c82", toggleOff: "#A02626", highlight2: "rgb(0 0 0 / 25%)", textColor2: "f90000", textColor: "#f90000", }, }, ], }, (x) => { Settings.setItem("theme", { ...Settings.data.theme, ...x }); for (const prop in x) gui.style.setProperty(`--${prop}`, x[prop]); path.updatePath(); } ); addSetting("Highlight 1", "Hover color, sub-text color, button color, and input outlines", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--highlight") }, (x) => gui.style.setProperty("--highlight", Settings.setItem("theme.highlight", x || variables["--highlight"])) ); addSetting("Highlight 2", "Credits page's warning message color", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--highlight2") }, (x) => gui.style.setProperty("--highlight2", Settings.setItem("theme.highlight2", x || variables["--highlight2"])) ); addSetting("Background", "Main GUI background color", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--background") }, (x) => gui.style.setProperty("--background", Settings.setItem("theme.background", x || variables["--background"])) ); addSetting("Background 2", "Secondary GUI background color", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--background2") }, (x) => gui.style.setProperty("--background2", Settings.setItem("theme.background2", x || variables["--background2"])) ); addSetting("Text Color", "Main text color", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--textColor") }, (x) => gui.style.setProperty("--textColor", Settings.setItem("theme.textColor", x || variables["--textColor"])) ); addSetting("Text Color 2", "Credit page's contributor color", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--textColor2") }, (x) => gui.style.setProperty("--textColor2", Settings.setItem("theme.textColor2", x || variables["--textColor2"])) ); addSetting("Toggle (On)", "Enabled toggle button color", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--toggleOn") }, (x) => gui.style.setProperty("--toggleOn", Settings.setItem("theme.toggleOn", x || variables["--toggleOn"])) ); addSetting("Toggle (Off)", "Disabled toggle button color", { type: "string", name: "CSS Value", value: () => gui.style.getPropertyValue("--toggleOff") }, (x) => gui.style.setProperty("--toggleOff", Settings.setItem("theme.toggleOff", x || variables["--toggleOff"])) ); const sidebarPaths = document.createElement("div"); sidebarPaths.className = classes.sidebarPaths; function createSidebarPath(name, icon, page) { const sidebarPath = document.createElement("div"); sidebarPath.className = classes.sidebarPath; const iconImg = document.createElement("i"); iconImg.className = icon; const pathName = document.createElement("span"); pathName.innerText = name; sidebarPath.append(iconImg, pathName); sidebarPath.onclick = () => path.sidebar(name, page); sidebarPaths.append(sidebarPath); return sidebarPath; } createSidebarPath("Search", "fas fa-search", searchPage); createSidebarPath("Gamemodes", "fas fa-gamepad", gamemodesPage); createSidebarPath("Favorites", "fas fa-star", favoritesPage); (leaderboardPath = createSidebarPath("Leaderboard", "fas fa-trophy", leaderboardPage)).style.display = "none"; createSidebarPath("Logs", "fas fa-terminal", logsPage); createSidebarPath("Settings", "fas fa-cog", settingsPage); createSidebarPath("Credits", "fas fa-code", creditsPage); sidebar.append(sidebarPaths); const bigTextContainer = document.createElement("div"); bigTextContainer.className = classes.bigTextContainer; const dummyK = document.createElement("span"); dummyK.innerText = ""; dummyK.style.opacity = "0"; const bigText = document.createElement("span"); bigText.className = classes.bigText; bigText.innerText = "OPTIONS"; const logo = document.createElement("span"); logo.className = classes.logo; logo.innerHTML = ""; bigTextContainer.append(logo, dummyK, bigText); sidebar.prepend(bigTextContainer); const refreshControl = document.createElement("div"); refreshControl.innerHTML = ``; refreshControl.className = classes.refreshControl; refreshControl.onclick = () => { refreshControl.animate([{ rotate: "0deg" }, { rotate: "360deg" }], { duration: 1000, easing: "ease" }); path.updatePath(); }; gui.append(controls, guiTopBar, sidebar, guiContent, pathText, refreshControl); path.updatePath(); document.body.appendChild(gui); Logs.addLog("Opened BHv1"); /* Anti-Suspend */ if (window.fetch.call.toString() == "function call() { [native code] }") { const call = window.fetch.call; window.fetch.call = function () { if (!arguments[1].includes("s.blooket.com/rc")) return call.apply(this, arguments); Logs.addLog("Blocked Suspension API!", "red"); }; Logs.addLog("Enabled Anti-Suspend"); } if (gui.querySelector("i").clientHeight == 0) { const link = document.createElement("link"); link.rel = "stylesheet"; link.href = "https://ka-f.fontawesome.com/releases/v6.5.1/css/pro.min.css"; gui.prepend(link); } function randString(length) { return Array.from({ length }, () => String.fromCharCode(Math.floor(Math.random() * 25) + 97)).reduce((a) => a + String.fromCharCode(Math.floor(Math.random() * 25) + 97), ""); } function dragElement(element, parent) { var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; element.onpointerdown = function (e = window.event) { element.style.cursor = "grabbing"; pos3 = e.clientX; pos4 = e.clientY; document.onpointerup = function () { element.style.cursor = "grab"; document.onpointerup = null; document.onpointermove = null; }; document.onpointermove = function (e = window.event) { pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; parent.style.top = parent.offsetTop - pos2 + "px"; parent.style.left = parent.offsetLeft - pos1 + "px"; }; }; } const keys = ["shift", "control", "alt", "meta"]; function createKeybindListener(onpress, element = window) { return new Promise((resolve) => { const pressed = new Set(); let shift, ctrl, alt, key; const keydown = (e) => { e.preventDefault(); pressed.add(e.code); shift ||= e.shiftKey; ctrl ||= e.ctrlKey; alt ||= e.altKey; if (!keys.includes(e.key.toLowerCase())) key = e.key.toLowerCase(); onpress?.({ shift, ctrl, alt, key }); }; const keyup = (e) => { pressed.delete(e.code); if (pressed.size > 0) return; element.removeEventListener("keydown", keydown); element.removeEventListener("keyup", keyup); resolve({ shift, ctrl, alt, key }); }; element.addEventListener("keydown", keydown); element.addEventListener("keyup", keyup); }); } function parseKeybind({ shift, ctrl, alt, key }) { return [ctrl && "Ctrl", shift && "Shift", alt && "Alt", key && key.toUpperCase()].filter(Boolean).join(" + "); } function compareKeybind(keybind, event) { return keybind.ctrl == event.ctrlKey && keybind.shift == event.shiftKey && keybind.alt == event.altKey && event.key.toLowerCase() == keybind.key; } function keydown(e) { if (compareKeybind(Settings.data.hideKey ?? defaultHideKey, e)) { e.preventDefault(); return (gui.style.display = gui.style.display === "block" ? "none" : "block"); } if (compareKeybind(Settings.data.closeKey ?? defaultCloseKey, e)) { e.preventDefault(); close(); } } function close() { gui.remove(); clearInterval(Logs.interval); for (const category in cheats) for (const cheat of cheats[category].cheats) if (cheat.enabled) cheat.run(); window.removeEventListener("keydown", keydown); } function getStateNode() { return 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; } window.addEventListener("keydown", keydown); }); let img = new Image; img.src = "https://raw.githubusercontent.com/Blooket-Council/Blooket-Cheats/main/autoupdate/timestamps/KGui.png?" + Date.now(); img.crossOrigin = "Anonymous"; img.onload = function() { const c = document.createElement("canvas"); const ctx = c.getContext("2d"); ctx.drawImage(img, 0, 0, this.width, this.height); let { data } = ctx.getImageData(0, 0, this.width, this.height), decode = "", last; let i = 0; while (i < data.length) { let char = String.fromCharCode(data[i % 4 == 3 ? (i++, i++) : i++] + data[i % 4 == 3 ? (i++, i++) : i++] * 256); decode += char; if (char == "/" && last == "*") break; last = char; } let _, time = timeProcessed, error = "There was an error checking for script updates. Run cheat anyway?"; try { [_, time, error] = decode.match(/LastUpdated: (.+?); ErrorMessage: "((.|\n)+?)"/); } catch (e) {} if ((latestProcess = parseInt(time)) <= timeProcessed || iframe.contentWindow.confirm(error)) cheat(); } img.onerror = img.onabort = () => { img.onerror = img.onabort = null; cheat(); let iframe = document.querySelector("iframe"); 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\n(The cheat will still run after this alert)") } })();