CryHard Client

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

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

Yazar
Napholeon Ryel Alvarez
Günlük kurulumlar
27
Toplam kurulumlar
51
Değerlendirmeler
1 0 0
Versiyon
v2
Oluşturulma
13.03.2026
Güncellenme
13.03.2026
Boyut
25,7 KB
Lisans
MIT
Geçerli

// ==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);
}
})();