CryHard Client

Bloxd.io AI Slop Client - Standalone game utility with Killaura, Bhop, Aimbot, and ESP modules

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

نووسەر
Napholeon Ryel Alvarez
Daily installs
27
Total installs
37
Ratings
1 0 0
وەشان
v2
Created
2026-03-13
Updated
2026-03-13
Size
25.7 KB
مۆڵەت
MIT
Applies to

// ==UserScript==
// @name CryHard Client
// @namespace https://greasyfork.org/en/users/1299968-grad
// @version v2
// @description Bloxd.io AI Slop Client - Standalone game utility with Killaura, Bhop, Aimbot, and ESP modules
// @author Grad
// @license MIT
// @match https://bloxd.io/*
// @match http://bloxd.io/*
// @match https://*.bloxd.io/*
// @match http://*.bloxd.io/*
// @match https://bloxd.io/*
// @match http://bloxd.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=bloxd.io
// @grant none
// @run-at document-end
// @downloadURL https://update.greasyfork.org/scripts/565655/CryHard%20Client.user.js
// @updateURL https://update.greasyfork.org/scripts/565655/CryHard%20Client.meta.js
// ==/UserScript==

(function() {
'use strict';

// Show alert when script executes
alert("Client injected, you must join game for client to load");

// Check if running as userscript or standalone
const isUserscript = typeof GM_info !== 'undefined' || window.location.protocol === 'file:';

const C = { killaura: { on: 0, d: 15, r: 6.5, j: 0.02, k: null }, bhop: { on: 0, k: null }, aimbot: { on: 0, i: 20, s: 0.15, m: 10, k: null }, esp: { on: 0, k: null }, autoclicker: { on: 0, cps: 10, random: 0, k: null } };
const S = "slop_cfg", M = "slop_menu_pos";
let cfg = JSON.parse(JSON.stringify(C)), menu = null, pos = { x: null, y: null }, lobby = null, btn = null, inLobby = 0, rshift = 0;

const v = (o) => Object.values(o || {});
const a = (f, d = null) => { try { return f(); } catch { return d; } };
const n = (v) => { const s = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; return s ? [v[0] / Math.sqrt(s), v[1] / Math.sqrt(s), v[2] / Math.sqrt(s)] : v; };
const d2 = (a, b) => { const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2]; return dx * dx + dy * dy + dz * dz; };

const G = {
wp: null, _n: null, bp: null,
get n() { if (!this._n && this.bp) this._n = v(this.bp).find(p => p?.entities); return this._n; },
init() {
if (this.wp) return;
const d = Object.getOwnPropertyDescriptors(window);
let k = Object.keys(d).find(k => d[k]?.set?.toString().includes("++"));
if (!k) k = Object.keys(window).find(k => Array.isArray(window[k]) && typeof window[k].push === "function");
if (!k) return;
const c = window[k];
c.push([[Math.floor(Math.random() * 9999999) + 1], {}, (r) => (this.wp = r)]);
this.bp = v(this.fm("nonBlocksClient:")).find(o => typeof o === "object");
this._n = null;
},
fm(s) { if (!this.wp) return null; for (const id in this.wp.m) if (this.wp.m[id]?.toString().includes(s)) return this.wp(id); }
};

const ik = () => a(() => { const e = G.n.entities, t = v(e)[2]; return Object.entries(e).find(([, val]) => val === t)?.[0]; });
const g = {
p: (id) => a(() => G.n.entities.getState(id, "position").position),
pl: () => a(() => { const ids = G.n?.bloxd?.getPlayerIds?.(); return ids ? Object.values(ids).map(Number).filter(id => id !== 1) : []; }, []),
hg: () => a(() => v(G.n.entities).find(f => typeof f === "function" && f.length === 1 && f.toString().length < 80 && f.toString().includes(").") && !f.toString().includes("opWrapper")), null),
sh: (id) => {
const getter = g.hg();
return getter ? a(() => getter(id), null) : null;
},
at: () => {
const held = g.sh(1);
if (!held) return () => {};
const attack = held.doAttack || held.breakingItem?.doAttack;
return attack ? attack.bind(held) : () => {};
},
c: () => a(() => G.n.camera, null),
sw: () => {
try {
const ikey = ik();
if (!ikey) return;
const ms = G.n.entities?.[ikey]?.moveState?.list?.[0];
if (ms && typeof ms.setArmsAreSwinging === "function") ms.setArmsAreSwinging();
if (ms && "armsAreSwinging" in ms) ms.armsAreSwinging = true;
const h = g.sh(1);
if (h) {
if (h.trySwingBlock) h.trySwingBlock();
if (h.trySwingItem) h.trySwingItem();
if (h.swing) h.swing();
}
if (G.n?.inputs?.down?.emit) G.n.inputs.down.emit("primary-fire", true);
} catch {}
}
};

class Mdl {
constructor(n, k) { this.n = n; this.k = k; this.on = 0; }
en() { if (!this.on) { this.on = 1; this.e(); } }
dis() { if (this.on) { this.on = 0; this.d(); } }
t() { this.on ? this.dis() : this.en(); }
e() {}
d() {}
u() {}
}

class KA extends Mdl {
constructor() { super("Killaura", "killaura"); this.l = 0; }
e() { this.l = 0; }
u() {
if (!this.on) return;
const now = Date.now();
const bd = cfg.killaura.d;
const j = bd * (cfg.killaura.j || 0.02) * (Math.random() - 0.5);
const ed = Math.max(25, bd + j);
if (now - this.l < ed) return;
this.l = now;
const pp = g.p(1);
if (!pp) return;
const kr = cfg.killaura.r;
const krs = kr * kr;
g.pl().forEach((id, idx) => {
const ep = g.p(id);
if (!ep || d2(pp, ep) > krs) return;
const vec = n([ep[0] - pp[0], ep[1] - pp[1], ep[2] - pp[2]]);
try {
const at = g.at();
if (at && typeof at === "function") {
at(vec, id.toString(), "BodyMesh");
const sh = g.sh(1);
if (sh && sh.trySwingBlock) sh.trySwingBlock();
const ikey = ik();
if (ikey) {
const ms = G.n.entities?.[ikey]?.moveState?.list?.[0];
if (ms && ms.setArmsAreSwinging) ms.setArmsAreSwinging();
}
}
} catch (e) {
console.debug("[KILLAURA] Killaura attack failed:", e);
console.error("[KILLAURA] Error details:", e.message, e.stack);
}
});
}
}

class BH extends Mdl {
constructor() { super("Bhop", "bhop"); this.i = null; this.lj = 0; this.lg = 0; }
e() {
if (this.i) return;
this.i = setInterval(() => {
if (!this.on) return;
try {
const ikey = ik();
if (!ikey) return;
const ms = G.n.entities?.[ikey]?.moveState?.list?.[0];
const mv = G.n.entities?.[ikey]?.movement?.list?.[0];
if (!ms || !mv) return;
const vals = v(G.n);
if (vals[30]?.[1]?.[1]?._isAlive === 0) return;
if (ms.crouching || (ms.speed && ms.speed < 0.05) || mv._flying) {
if (G.n?.inputs?.state) G.n.inputs.state.jump = 0;
return;
}
const og = mv.isOnGround?.() ?? 0;
const n = Date.now();
if (og && n - this.lg >= 50 + Math.random() * 30) {
if (G.n?.inputs?.state) G.n.inputs.state.jump = 1;
this.lj = n;
this.lg = n;
} else if (!og && G.n?.inputs?.state) {
G.n.inputs.state.jump = 0;
}
} catch {}
}, 5);
}
d() {
if (this.i) { clearInterval(this.i); this.i = null; }
if (G.n?.inputs?.state) G.n.inputs.state.jump = 0;
}
}

class AB extends Mdl {
constructor() { super("Aimbot", "aimbot"); this.i = null; this.l = 0; }
e() {
if (this.i) return;
this.i = setInterval(() => {
if (!this.on) return;
const n = Date.now();
if (n - this.l < cfg.aimbot.i) return;
this.l = n;
try {
const p = g.p(1), c = g.c();
if (!p || !c) return;
let b = { id: null, d: Infinity, h: 0, p: 0 };
g.pl().forEach(id => {
const ep = g.p(id);
if (!ep) return;
const l = a(() => G.n.entities.getState(id, "genericLifeformState"), null);
if (l && l.isAlive === 0) return;
const dx = ep[0] - p[0], dy = ep[1] - p[1], dz = ep[2] - p[2];
const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
if (!isFinite(dist) || dist < 0.1 || dist > cfg.aimbot.m) return;
if (dist < b.d) b = { id, d: dist, h: Math.atan2(dx, dz), p: -Math.asin(dy / dist) };
});
if (!b.id) return;
const sm = cfg.aimbot.s || 0.15;
let dh = b.h - c.heading;
while (dh > Math.PI) dh -= 2 * Math.PI;
while (dh < -Math.PI) dh += 2 * Math.PI;
c.heading += dh * sm;
c.pitch += (b.p - c.pitch) * sm;
} catch {}
}, Math.max(5, cfg.aimbot.i));
}
d() { if (this.i) { clearInterval(this.i); this.i = null; } }
}

class ESP extends Mdl {
constructor() { super("ESP", "esp"); this.i = null; }
e() {
this.up(1);
if (this.i) return;
this.i = setInterval(() => { if (this.on) this.up(1); }, 500);
}
d() { if (this.i) { clearInterval(this.i); this.i = null; } this.up(0); }
up(s) {
if (!G.n) return;
const r = v(G.n)[12];
if (!r) return;
const tm = v(r).find(v => v?.thinMeshes)?.thinMeshes;
if (Array.isArray(tm)) tm.forEach(i => { const m = i?.meshVariations?.__DEFAULT__?.mesh; if (m && typeof m.renderingGroupId === "number") m.renderingGroupId = s ? 2 : 0; });
}
}

class AC extends Mdl {
constructor() { super("Autoclicker", "autoclicker"); this.i = null; this.h = 0; this.mdh = null; this.muh = null; }
pc() {
if (!this.on || !this.h) return;
try {
if (G.n?.inputs?.down?.emit) {
G.n.inputs.down.emit("primary-fire", true);
setTimeout(() => {
if (G.n?.inputs?.up?.emit) G.n.inputs.up.emit("primary-fire", true);
}, 10);
}
g.sw();
} catch {}
}
tick() {
if (!this.on || !this.h) {
if (this.i) { clearInterval(this.i); this.i = null; }
return;
}
this.pc();
if (cfg.autoclicker.random === 1) {
const cps = cfg.autoclicker.cps || 10;
const varp = 0.4;
const min = cps * (1 - varp);
const max = cps * (1 + varp);
const rcps = min + Math.random() * (max - min);
const iv = Math.max(1, Math.floor(1000 / rcps));
if (this.i) {
clearInterval(this.i);
this.i = null;
}
this.i = setTimeout(() => this.tick(), iv);
}
}
e() {
if (this.mdh || this.muh) return;
this.mdh = (e) => {
if (!this.on || e.button !== 0 || this.h || e.target.closest("#slop-menu") || e.target.closest("#slop-btn")) return;
this.h = 1;
this.pc();
const cps = cfg.autoclicker.cps || 10;
const rnd = cfg.autoclicker.random === 1;
let iv = 1000 / cps;
if (rnd) {
const varp = 0.4;
const min = cps * (1 - varp);
const max = cps * (1 + varp);
const rcps = min + Math.random() * (max - min);
iv = 1000 / rcps;
}
iv = Math.max(1, Math.floor(iv));
if (rnd) {
this.i = setTimeout(() => this.tick(), iv);
} else {
this.i = setInterval(() => this.pc(), iv);
}
};
this.muh = (e) => {
if (!this.on || e.button !== 0 || !this.h) return;
this.h = 0;
if (this.i) { clearInterval(this.i); clearTimeout(this.i); this.i = null; }
if (G.n?.inputs?.up?.emit) G.n.inputs.up.emit("primary-fire", true);
};
document.addEventListener("mousedown", this.mdh);
document.addEventListener("mouseup", this.muh);
window.addEventListener("mouseup", this.muh);
}
d() {
this.h = 0;
if (this.i) { clearInterval(this.i); clearTimeout(this.i); this.i = null; }
if (this.mdh) { document.removeEventListener("mousedown", this.mdh); this.mdh = null; }
if (this.muh) { document.removeEventListener("mouseup", this.muh); window.removeEventListener("mouseup", this.muh); this.muh = null; }
if (G.n?.inputs?.up?.emit) G.n.inputs.up.emit("primary-fire", true);
}
}

const mods = [new KA(), new BH(), new AB(), new ESP(), new AC()];
let loop = null;

const sl = () => { try { localStorage.setItem(S, JSON.stringify(cfg)); } catch {} };
const ll = () => { try { const s = localStorage.getItem(S); if (s) Object.assign(cfg, JSON.parse(s)); const p = localStorage.getItem(M); if (p) { const pp = JSON.parse(p); if (pp.x !== null) pos.x = pp.x; if (pp.y !== null) pos.y = pp.y; } } catch {} };
const sp = () => { try { localStorage.setItem(M, JSON.stringify(pos)); } catch {} };

const mk = () => {
if (!document.body) { setTimeout(mk, 100); return null; }
const ex = document.getElementById("slop-menu");
if (ex) ex.remove();
const m = document.createElement("div");
m.id = "slop-menu";
const ix = pos.x !== null ? pos.x : (window.innerWidth / 2 - 275);
const iy = pos.y !== null ? pos.y : (window.innerHeight / 2 - 250);
m.style.cssText = `position:fixed;top:${iy}px;left:${ix}px;width:550px;background:rgba(20,20,30,0.98);border:2px solid #4ade80;border-radius:8px;padding:0;z-index:9999999;font-family:'Segoe UI',sans-serif;color:#fff;display:block;box-shadow:0 0 30px rgba(74,222,128,0.5);backdrop-filter:blur(10px);user-select:none;`;
const h = document.createElement("div");
h.style.cssText = `padding:15px 20px;cursor:move;border-bottom:1px solid rgba(74,222,128,0.3);background:rgba(74,222,128,0.1);display:flex;align-items:center;justify-content:space-between;`;
const t = document.createElement("div");
t.textContent = "AI Slop";
t.style.cssText = `font-size:24px;font-weight:bold;color:#4ade80;flex:1;text-align:center;pointer-events:none;`;
h.appendChild(t);
m.appendChild(h);
const c = document.createElement("div");
c.style.cssText = `padding:20px;max-height:70vh;overflow-y:auto;`;
mods.forEach(md => {
const r = document.createElement("div");
r.style.cssText = `display:flex;align-items:center;justify-content:space-between;padding:10px;margin:5px 0;background:rgba(255,255,255,0.05);border-radius:4px;`;
const ls = document.createElement("div");
ls.style.cssText = `display:flex;align-items:center;gap:10px;flex:1;`;
const lb = document.createElement("span");
lb.textContent = md.n;
lb.style.cursor = "context-menu";
lb.oncontextmenu = (e) => { e.preventDefault(); const sm = r.querySelector(".submenu"); if (sm) sm.style.display = sm.style.display === "none" ? "block" : "none"; };
const tg = document.createElement("button");
tg.textContent = md.on ? "ON" : "OFF";
tg.style.cssText = `padding:5px 15px;border:none;border-radius:4px;background:${md.on ? "#4ade80" : "#ef4444"};color:white;cursor:pointer;font-weight:bold;`;
tg.onclick = () => { md.t(); cfg[md.k].on = md.on ? 1 : 0; tg.textContent = md.on ? "ON" : "OFF"; tg.style.background = md.on ? "#4ade80" : "#ef4444"; sl(); };
// Store reference to button for updates
md._btn = tg;
const kb = document.createElement("input");
kb.type = "text";
kb.value = cfg[md.k]?.k || "None";
kb.style.cssText = `width:80px;padding:3px;background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);border-radius:3px;color:white;text-align:center;`;
kb.onclick = () => { kb.value = "Press key..."; const h = (e) => { cfg[md.k].k = e.code; kb.value = e.code; sl(); document.removeEventListener("keydown", h); }; document.addEventListener("keydown", h, { once: 1 }); };
ls.appendChild(lb);
ls.appendChild(tg);
ls.appendChild(kb);
r.appendChild(ls);
const sm = document.createElement("div");
sm.className = "submenu";
sm.style.cssText = `display:none;width:100%;margin-top:10px;padding:10px;background:rgba(0,0,0,0.3);border-radius:4px;border:1px solid rgba(74,222,128,0.3);`;
if (md.k === "killaura") {
const dr = document.createElement("div");
dr.style.cssText = "display:flex;justify-content:space-between;margin:5px 0;";
dr.innerHTML = `Delay:`;
dr.querySelector("input").onchange = (e) => { cfg.killaura.d = parseInt(e.target.value) || 15; sl(); };
sm.appendChild(dr);
const rr = document.createElement("div");
rr.style.cssText = "display:flex;justify-content:space-between;margin:5px 0;";
rr.innerHTML = `Range:`;
rr.querySelector("input").onchange = (e) => { cfg.killaura.r = parseFloat(e.target.value) || 6.5; sl(); };
sm.appendChild(rr);
const jr = document.createElement("div");
jr.style.cssText = "display:flex;justify-content:space-between;margin:5px 0;";
jr.innerHTML = `Jitter:`;
jr.querySelector("input").onchange = (e) => { cfg.killaura.j = parseFloat(e.target.value) || 0.02; sl(); };
sm.appendChild(jr);
} else if (md.k === "aimbot") {
const sr = document.createElement("div");
sr.style.cssText = "display:flex;justify-content:space-between;margin:5px 0;";
sr.innerHTML = `Smoothing:`;
sr.querySelector("input").onchange = (e) => { cfg.aimbot.s = parseFloat(e.target.value) || 0.15; sl(); };
sm.appendChild(sr);
const mr = document.createElement("div");
mr.style.cssText = "display:flex;justify-content:space-between;margin:5px 0;";
mr.innerHTML = `Max Distance:`;
mr.querySelector("input").onchange = (e) => { cfg.aimbot.m = parseInt(e.target.value) || 10; sl(); };
sm.appendChild(mr);
} else if (md.k === "autoclicker") {
const cr = document.createElement("div");
cr.style.cssText = "display:flex;justify-content:space-between;margin:5px 0;";
cr.innerHTML = `CPS:`;
cr.querySelector("input").onchange = (e) => { cfg.autoclicker.cps = parseInt(e.target.value) || 10; sl(); };
sm.appendChild(cr);
const rr = document.createElement("div");
rr.style.cssText = "display:flex;justify-content:space-between;margin:5px 0;align-items:center;";
const rl = document.createElement("span");
rl.textContent = "Randomized CPS:";
const rc = document.createElement("input");
rc.type = "checkbox";
rc.checked = cfg.autoclicker.random === 1;
rc.style.cssText = "width:20px;height:20px;cursor:pointer;";
rc.onchange = (e) => { cfg.autoclicker.random = e.target.checked ? 1 : 0; sl(); };
rr.appendChild(rl);
rr.appendChild(rc);
sm.appendChild(rr);
}
r.appendChild(sm);
c.appendChild(r);
});
const cb = document.createElement("button");
cb.textContent = "Close (Insert / Right Shift)";
cb.style.cssText = `width:100%;padding:10px;margin-top:15px;background:#ef4444;border:none;border-radius:4px;color:white;cursor:pointer;font-weight:bold;`;
cb.onclick = () => tm();
c.appendChild(cb);
m.appendChild(c);
document.body.appendChild(m);
let dg = 0, ox = 0, oy = 0;
const sd = (e) => { if (["INPUT", "BUTTON"].includes(e.target.tagName)) return; dg = 1; const r = m.getBoundingClientRect(); ox = (e.touches?.[0]?.clientX ?? e.clientX) - r.left; oy = (e.touches?.[0]?.clientY ?? e.clientY) - r.top; document.addEventListener("mousemove", md); document.addEventListener("mouseup", ed); e.preventDefault(); };
const md = (e) => { if (!dg) return; const x = Math.max(0, Math.min((e.touches?.[0]?.clientX ?? e.clientX) - ox, window.innerWidth - m.offsetWidth)); const y = Math.max(0, Math.min((e.touches?.[0]?.clientY ?? e.clientY) - oy, window.innerHeight - m.offsetHeight)); m.style.left = `${x}px`; m.style.top = `${y}px`; m.style.transform = "none"; pos.x = x; pos.y = y; sp(); };
const ed = () => { dg = 0; document.removeEventListener("mousemove", md); document.removeEventListener("mouseup", ed); };
h.addEventListener("mousedown", sd);
h.addEventListener("touchstart", sd, { passive: 0 });
return m;
};

const ub = () => {
if (!menu) return;
mods.forEach(md => {
if (md._btn) {
md._btn.textContent = md.on ? "ON" : "OFF";
md._btn.style.background = md.on ? "#4ade80" : "#ef4444";
}
});
};

const tm = () => {
if (!menu) menu = mk();
if (!menu) return;
const vis = menu.style.display !== "none";
menu.style.display = vis ? "none" : "block";
if (!vis) {
ub();
}
};

const sm = () => { if (!menu) menu = mk(); if (menu) { menu.style.display = "block"; ub(); } };

const hk = (e) => {
if (e.target.tagName === "INPUT" || e.target.tagName === "TEXTAREA") { if (e.code === "Insert") { e.preventDefault(); tm(); } return; }
if (e.code === "Insert") { e.preventDefault(); tm(); return; }
mods.forEach(md => { if (cfg[md.k]?.k === e.code) { md.t(); cfg[md.k].on = md.on ? 1 : 0; sl(); ub(); } });
};

const hrs = (e) => {
if (e.code === "ShiftRight" || (e.key === "Shift" && e.location === 2)) {
if (e.type === "keydown" && !rshift) { rshift = 1; e.preventDefault(); tm(); } else if (e.type === "keyup") rshift = 0;
}
};

const stb = () => {
if (btn) return;
if (!document.body) { setTimeout(stb, 100); return; }
btn = document.createElement("button");
btn.textContent = "☰";
btn.id = "slop-btn";
btn.style.cssText = `position:fixed;top:10px;right:10px;width:40px;height:40px;border:2px solid #4ade80;border-radius:6px;background:rgba(20,20,30,0.95);color:#4ade80;cursor:pointer;font-size:20px;font-weight:bold;z-index:9999999;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,0.3);transition:all 0.2s ease;`;
btn.onmouseenter = () => { btn.style.background = "rgba(74,222,128,0.2)"; btn.style.transform = "scale(1.1)"; };
btn.onmouseleave = () => { btn.style.background = "rgba(20,20,30,0.95)"; btn.style.transform = "scale(1)"; };
btn.onclick = () => tm();
document.body.appendChild(btn);
};

const cli = () => {
if (lobby) return;
if (!document.body) { setTimeout(cli, 100); return; }
lobby = document.createElement("div");
lobby.id = "slop-lobby";
lobby.textContent = "Waiting to join lobby";
lobby.style.cssText = `position:fixed;top:0;left:0;padding:8px 14px;background:rgba(20,20,30,0.95);border:2px solid #4ade80;border-top:none;border-left:none;border-radius:0 0 8px 0;color:#4ade80;font-size:12px;font-family:'Segoe UI',sans-serif;font-weight:500;z-index:9999999;display:block;box-shadow:0 2px 8px rgba(0,0,0,0.4);pointer-events:none;`;
document.body.appendChild(lobby);
};

const ul = () => {
if (!lobby) return;
try {
let il = 0;
if (G.n) {
try {
const p = g.p(1);
il = p && Array.isArray(p) && p.length === 3 && isFinite(p[0]) && isFinite(p[1]) && isFinite(p[2]);
} catch {}
}
if (il) {
if (!inLobby) inLobby = 1;
lobby.style.display = "none";
} else {
if (inLobby) inLobby = 0;
lobby.style.display = "block";
lobby.style.visibility = "visible";
lobby.style.opacity = "1";
}
} catch {
inLobby = 0;
if (lobby) { lobby.style.display = "block"; lobby.style.visibility = "visible"; lobby.style.opacity = "1"; }
}
};

const init = () => {
try {
G.init();
if (!G.n) { setTimeout(init, 500); return; }
ll();
// Sync module states with config after loading
mods.forEach(md => {
if (cfg[md.k]?.on === 1 && !md.on) {
md.en();
} else if (cfg[md.k]?.on === 0 && md.on) {
md.dis();
}
});
if (!loop) loop = setInterval(() => { mods.forEach(m => { if (m.on && m.u) m.u(); }); }, 16);
if (!window._slop) {
document.addEventListener("keydown", hk);
document.addEventListener("keydown", hrs);
document.addEventListener("keyup", hrs);
window._slop = 1;
}
stb();
cli();
setInterval(() => ul(), 500);
console.log("%c[AI Slop] Ready!", "color:#4ade80;font-weight:bold");
setTimeout(() => { if (!menu || menu.style.display === "none") sm(); }, 1500);
} catch (e) {
console.error("[AI Slop] Error:", e);
setTimeout(init, 1000);
}
};

window.Slop = { cfg, mods, tm, sm, init };

// Wait for DOM to be ready (works for both userscript and F12 console)
const startInit = () => {
// Wait for body to exist
if (document.body) {
init();
} else {
// Retry if body doesn't exist yet
const checkBody = setInterval(() => {
if (document.body) {
clearInterval(checkBody);
init();
}
}, 100);
// Stop checking after 10 seconds
setTimeout(() => clearInterval(checkBody), 10000);
}
};

// Start initialization - works for both userscript and console
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', startInit);
} else if (document.readyState === 'complete' || document.readyState === 'interactive') {
startInit();
} else {
window.addEventListener('load', startInit);
// Fallback if load event already fired
setTimeout(startInit, 100);
}
})();