FotHoU PreReading
FotHoU PreReading
let n = document.createElement('iframe');
document.body.append(n);
window.alert = n.contentWindow.alert.bind(window);
window.prompt = n.contentWindow.prompt.bind(window);
window.confirm = n.contentWindow.confirm.bind(window);
n.remove();
})();
(() => {
let style = document.createElement('style');
style.innerHTML = (`details > summary {
cursor: pointer;
transition: 0.15s;
list-style: none;
}
details > summary:hover {
color: hsl(0, 0%, 50%)
}
details > summary::-webkit-details-marker {
display: none;
}
details summary ~ * {
animation: sweep .5s ease-in-out;
}
@keyframes sweep {
0% {opacity: 0; transform: translateY(-10px)}
100% {opacity: 1; transform: translateY(0)}
}
.cheat {
border: none;
background: hsl(0, 0%, 20%);
padding: 5px;
margin: 3px;
width: 60%;
color: hsl(0, 0%, 100%);
transition: 0.2s;
border-radius: 5px;
cursor: pointer;
}
.cheat:hover {
background: hsl(0, 0%, 30%);
}`);
let loop;
document.body.append(GUI);
function reactHandler() {
return Object.values(document.querySelector('#app > div > div'))[1].children[1]._owner;
}
let cheats = {
global: {
'Get Daily Rewards': () => {
fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
getValues().then(async e => {
fetch("https://api.blooket.com/api/users/add-rewards", {
method: "put",
credentials: "include",
headers: {
"content-type": "application/json",
"X-Blooket-Build": e.blooketBuild
},
body: await encodeValues({
name: x.name,
addedTokens: 250,
addedXp: 300
}, e.secret)
});
fetch("https://api.blooket.com/api/users/add-rewards", {
method: "put",
credentials: "include",
headers: {
"content-type": "application/json",
"X-Blooket-Build": e.blooketBuild
},
body: await encodeValues({
name: x.name,
addedTokens: 250,
addedXp: 300
}, e.secret)
}).then(() => alert('Added daily rewawrds!')).catch(() => alert('There was an error when adding
rewards!'));;
}).catch(() => alert('There was an error encoding requests!'));
}).catch(() => alert('There was an error getting username!'));
},
'Spoof Blooks': () => {
if (!window.location.pathname.split('/').includes('lobby')) return alert('You must be in a game lobby!
(e.g. https://www.blooket.com/play/lobby)');
reactHandler().stateNode.setState({ lockedBlooks: [], takenBlooks: [] });
},
'Toggle Auto Answer': () => { autoAnswer = !autoAnswer },
'Toggle Highlight Answers': () => { highlightAnswers = !highlightAnswers },
'Spam Open Boxes': () => {
let box = prompt(`Which box do you want to open? (e.g. Space)`);
let boxes = {
safari: 25,
aquatic: 20,
bot: 20,
space: 20,
breakfast: 15,
medieval: 15,
wonderland: 15
}
if (!Object.keys(boxes).includes(box.toLowerCase())) return alert('I could not find that box!');
let amount = prompt('How many boxes do you want to open?');
fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
if (x.tokens < boxes[box.toLowerCase()] * amount) amount = Math.floor(x.tokens /
boxes[box.toLowerCase()]);
if (!amount) return alert('You do not have enough tokens!');
let wait = ms => new Promise(r => setTimeout(r, ms));
getValues().then(async e => {
let error = false,
blooks = [];
for (let i = 0; i < amount; i++) {
fetch("https://api.blooket.com/api/users/unlockblook", {
method: "put",
credentials: "include",
headers: {
"content-type": "application/json",
"X-Blooket-Build": e.blooketBuild
},
body: await encodeValues({
name: x.name,
box: box.charAt(0).toUpperCase() + box.slice(1).toLowerCase()
}, e.secret)
}).then(async x => {
let blook = await x.json();
blooks.push(blook.unlockedBlook);
alert(`${blook.unlockedBlook} (${i + 1}/${amount})`);
}).catch(() => { error = true });
await wait(750);
if (error) break;
}
let count = {};
blooks.forEach(blook => { count[blook] = (count[blook] || 0) + 1 });
alert(`Results:\n` + Object.entries(count).map((x) => ` ${x[1]} ${x[0]}`).join(`\n`));
}).catch(() => alert('There was an error encoding requests!'));
}).catch(() => alert('There was an error getting username!'));
},
'Auto Sell Dupes': () => {
fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
let blooks = Object.entries(x.unlocks).map(x => [x[0], x[1] - 1]).filter(x => x[1] > 0);
let wait = ms => new Promise(r => setTimeout(r, ms));
getValues().then(async e => {
let error = false;
alert('Selling duplicate blooks, please wait');
for (let [blook, numSold] of blooks) {
fetch("https://api.blooket.com/api/users/sellblook", {
method: "put",
credentials: "include",
headers: {
"content-type": "application/json",
"X-Blooket-Build": e.blooketBuild
},
body: await encodeValues({
name: x.name,
blook,
numSold
}, e.secret)
}).catch(() => { error = true });
await wait(750);
if (error) break;
}
alert(`Results:\n` + blooks.map((x) => ` ${x[1]} ${x[0]}`).join(`\n`));
}).catch(() => alert('There was an error encoding requests!'));
}).catch(() => alert('There was an error getting user data!'));
}
},
cafe: {
'Infinite Food': () => {
if (document.location.pathname != "/cafe") return alert("This cheat doesn't work in the shop!");
reactHandler().stateNode.state.foods.forEach(e => e.stock = 99999);
reactHandler().stateNode.forceUpdate();
},
'Max Levels': () => {
if (document.location.pathname != "/cafe/shop") return alert("This cheat only works in the shop!");
Object.keys(reactHandler().stateNode.state.items).forEach(x =>
reactHandler().stateNode.state.items[x] = 5);
reactHandler().stateNode.forceUpdate();
},
'Set Cash': () => {
reactHandler().stateNode.setState({ cafeCash: Number(parseFloat(prompt('How much cash would
you like?'))) });
},
'Reset Abilities': () => {
Object.keys(reactHandler().stateNode.state.abilities).forEach(x =>
reactHandler().stateNode.state.abilities[x] = 5);
reactHandler().stateNode.forceUpdate();
}
},
kingdom: {
'Choice ESP': () => { choiceESP = !choiceESP },
'Max Stats': () => {
reactHandler().stateNode.setState({ materials: 100, people: 100, happiness: 100, gold: 100 });
},
'Disable Toucan': () => {
reactHandler().stateNode.taxCounter = Number.MAX_VALUE;
},
'Set Guests': () => {
let guestScore = Number(parseFloat(prompt('How many guests do you want?')));
reactHandler().stateNode.setState({ guestScore });
},
'Skip Guest': () => {
reactHandler().stateNode.nextGuest();
}
},
crypto: {
'Auto Hack': () => { autoPassword = !autoPassword },
'Set Crypto': () => {
let amount = Number(parseFloat(prompt('How much crypto do you want?')));
reactHandler().stateNode.setState({ crypto2: amount, crypto: amount });
},
'Custom Password': () => {
let password = Number(parseFloat(prompt('What do you want to set your password to?')));
reactHandler().stateNode.setState({ password });
},
'Remove Hack': () => {
reactHandler().stateNode.setState({ hack: '' })
},
'Reset Player\'s Crypto': () => {
let target = prompt("Name of player");
let e = reactHandler();
!target || e.memoizedProps.firebase.getDatabaseVal(e.memoizedProps.client.hostId, "c", (...o) => {
let data = Object.keys(o[0]);
if (data.some(e => e == target)) data.forEach(player => {
if (player == target) {
e.memoizedProps.firebase.setVal({
id: e.memoizedProps.client.hostId,
path: "c/" + e.memoizedProps.client.name,
val: {
p: e.stateNode.state.password,
b: e.memoizedProps.client.blook,
cr: e.stateNode.state.crypto,
tat: player + ":" + (o[0][player].cr || 0)
}
}); alert('Reset player\'s crypto')
};
});
else alert("Player does not exist");
})
}
},
factory: {
'All Mega Bot': () => {
let blooks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].fill({ name: "Mega Bot", color: "#d71f27", class: "🤖", rarity:
"Legendary", cash: [80000, 430000, 4200000, 62000000, 1000000000], time: [5, 5, 3, 3, 3], price: [7000000,
120000000, 1900000000, 35000000000], active: false, level: 4, bonus: 5.5 })
reactHandler().stateNode.setState({ blooks });
},
'Remove Glitches': () => {
reactHandler().stateNode.setState({
glitch: "",
bites: 0,
ads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
hazards: ["", "", "", "", ""],
lol: false,
joke: false,
slow: false,
dance: false,
popUpAmount: 0,
});
},
'Max Blooks': () => {
reactHandler().stateNode.state.blooks.forEach(blook => { blook.level = 4 });
},
'Set Cash': () => {
let cash = Number(parseFloat(prompt('How much cash do you want?')));
reactHandler().stateNode.setState({ cash });
},
},
fishing: {
'Set Weight': () => {
let weight = Number(parseFloat(prompt('How much weight do you want?')));
reactHandler().stateNode.setState({ weight2: weight, weight });
},
'Set Lure': () => {
let lure = Number(parseFloat(prompt('What do you want to set your lure to? (1 - 5)'))) - 1;
reactHandler().stateNode.setState({ lure: lure < 0 ? 0 : lure > 4 ? 4 : lure });
}
},
gold: {
'Set Gold': () => {
let gold = Number(parseFloat(prompt('How much gold do you want?')));
reactHandler().stateNode.setState({ gold2: gold, gold });
},
'Chest ESP': () => { chestESP = !chestESP },
"Set Player's Gold": () => {
let e = reactHandler(),
player = prompt("Player to set gold"),
amount = Number(parseFloat(prompt("Amount to set gold to")));
e.memoizedProps.firebase.setVal({
id: e.memoizedProps.client.hostId,
path: "c/" + e.memoizedProps.client.name,
val: {
b: e.memoizedProps.client.blook,
g: e.stateNode.state.gold,
tat: player + ":swap:" + amount
}
})
}
},
racing: {
'Instant Win': () => {
reactHandler().stateNode.setState({ progress: reactHandler().stateNode.state.goalAmount });
setTimeout(() => {
try {
Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t =>
t.firstChild.innerHTML == reactHandler().memoizedState.question.correctAnswers[0])[0].click();
} catch {
try {
Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t =>
t.firstChild.innerHTML == reactHandler().memoizedProps.client.question.correctAnswers[0])[0].click();
} catch { };
};
}, 100);
}
},
defense: {
'Clear Enemies': () => {
reactHandler().stateNode.enemies = [];
},
'Max Towers': () => {
reactHandler().stateNode.towers.forEach(tower => {
tower.damage = 99999999;
tower.range = 99999999;
tower.fullCd = 0;
});
},
'Remove Ducks': () => {
data = reactHandler().stateNode;
data.ducks.forEach(x => { data.tiles[x.y][x.x] = 0; });
data.ducks.length = 0;
},
'Place Towers Anywhere': () => {
reactHandler().stateNode.tiles = reactHandler().stateNode.tiles.map(x => x.map(e => e == 2 ? 0 : e));
},
'Set Damage': () => {
let dmg = Number(parseFloat(prompt('How much damage do you want?')));
reactHandler().stateNode.dmg = dmg;
},
'Set Round': () => {
let round = Number(parseFloat(prompt('What round do you want to set it to?')));
reactHandler().stateNode.setState({ round });
},
'Set Tokens': () => {
let tokens = Number(parseFloat(prompt('How many tokens do you want?')));
reactHandler().stateNode.setState({ tokens });
}
},
doom: {
'Set Coins': () => {
try {
reactHandler().stateNode.props.setTowerCoins(Number(parseFloat(prompt('How many coins do
you want?'))));
} catch { }
},
'Lower Enemy Stats': () => {
let data = reactHandler().stateNode.state;
if (data.phase != 'select') return alert('You must be on the attribute selection page!');
reactHandler().stateNode.setState({ enemyCard: { ...data.enemyCard, strength: 0, charisma: 0,
wisdom: 0 } })
},
'Max Player Stats': () => {
let data = reactHandler().stateNode.state;
if (data.phase != 'select') return alert('You must be on the attribute selection page!');
reactHandler().stateNode.setState({ myCard: { ...data.myCard, strength: 20, charisma: 20, wisdom: 20
} })
},
'Heal Player': () => {
reactHandler().stateNode.setState({ myLife: 100 });
}
},
rush: {
'Set Defense': () => {
let e = reactHandler();
e.stateNode.props.firebase.setVal({
id: e.stateNode.props.client.hostId,
path: 'c/' + e.stateNode.props.client.name + '/d',
val: Number(parseFloat(prompt('How much defense do you want?')))
});
},
'Set Blooks': () => {
let e = reactHandler();
e.stateNode.props.firebase.setVal({
id: e.stateNode.props.client.hostId,
path: 'c/' + e.stateNode.props.client.name + '/bs',
val: Number(parseFloat(prompt('How many blooks do you want?')))
});
}
}
};
function createButton(cheat) {
let button = document.createElement('button');
button.classList.add('cheat');
button.innerText = cheat;
return button
}
function getSite(capitalize) {
switch (window.location.pathname.split('/')[2]) {
case 'rush': return capitalize ? 'Blook Rush' : 'rush';
case 'gold': return capitalize ? 'Gold Quest' : 'gold';
case 'fishing': return capitalize ? 'Fishing Frenzy' : 'fishing';
case 'hack': return capitalize ? 'Crypto Hack' : 'crypto';
case 'battle-royale': return capitalize ? 'Battle Royale' : 'royale';
case 'factory': return capitalize ? 'Factory' : 'factory';
case 'racing': return capitalize ? 'Racing' : 'racing';
case 'classic': return capitalize ? 'Classic' : 'classic';
default: switch (window.location.pathname.split('/')[1]) {
case 'defense': return capitalize ? 'Tower Defense' : 'defense';
case 'cafe': return capitalize ? 'Café' : 'cafe';
case 'tower': return capitalize ? 'Tower of Doom' : 'doom';
case 'kingdom': return capitalize ? 'Crazy Kingdom' : 'kingdom';
default: return false;
}
};
};
function toggleHidden(e) {
e.code == 'KeyE' && (GUI.hidden = !GUI.hidden)
};
addEventListener('keypress', toggleHidden);
})()