shellshock.io aithxmbot. Hold RMB to snap to nearest enemy (with optional lead/prediction). Press V to toggle red wireframe ESP boxes + tracers (see through walls). Press ` (backtick) to show/hide the settings menu.
// ==UserScript== // @name Shell Shockers Aimbot + ESP // @namespace https://greatest.deepsurf.us/users/1603179-caringjellyemu // @version 2.1 // @author caringjellyemu // @license GPL-3.0-only // @match *://*.shellshock.io/* // @match *://*.algebra.best/* // @match *://*.algebra.monster/* // @match *://*.algebra.vip/* // @match *://*.biologyclass.club/* // @match *://*.combateggs.com/* // @match *://*.deadlyegg.com/* // @match *://*.deathegg.life/* // @match *://*.deathegg.world/* // @match *://*.eggbattle.com/* // @match *://*.eggboy.club/* // @match *://*.eggboy.me/* // @match *://*.eggboy.xyz/* // @match *://*.eggcombat.com/* // @match *://*.egg.dance/* // @match *://*.eggfacts.fun/* // @match *://*.egggames.best/* // @match *://*.egghead.institute/* // @match *://*.eggisthenewblack.com/* // @match *://*.eggsarecool.com/* // @match *://*.eggshock.com/* // @match *://*.eggshock.me/* // @match *://*.eggshock.net/* // @match *://*.eggshooter.best/* // @match *://*.eggshooter.com/* // @match *://*.eggwarfare.com/* // @match *://*.eggwars.io/* // @match *://*.geometry.best/* // @match *://*.geometry.monster/* // @match *://*.geometry.pw/* // @match *://*.geometry.report/* // @match *://*.hardboiled.life/* // @match *://*.hardshell.life/* // @match *://*.humanorganising.org/* // @match *://*.mathactivity.club/* // @match *://*.mathactivity.xyz/* // @match *://*.mathdrills.info/* // @match *://*.mathdrills.life/* // @match *://*.mathfun.rocks/* // @match *://*.mathgames.world/* // @match *://*.math.international/* // @match *://*.mathlete.fun/* // @match *://*.mathlete.pro/* // @match *://*.overeasy.club/* // @match *://*.risenegg.com/* // @match *://*.scrambled.tech/* // @match *://*.scrambled.today/* // @match *://*.scrambled.us/* // @match *://*.scrambled.world/* // @match *://*.shellgame.me/* // @match *://*.shellplay.live/* // @match *://*.shellshockers.best/* // @match *://*.shellshockers.ca/* // @match *://*.shellshockers.club/* // @match *://*.shellshockers.life/* // @match *://*.shellshockers.site/* // @match *://*.shellshockers.today/* // @match *://*.shellshockers.us/* // @match *://*.shellshockers.website/* // @match *://*.shellshockers.wiki/* // @match *://*.shellshockers.world/* // @match *://*.shellshockers.xyz/* // @match *://*.shellshock.guru/* // @match *://*.shellsocks.com/* // @match *://*.softboiled.club/* // @match *://*.urbanegger.com/* // @match *://*.violentegg.club/* // @match *://*.violentegg.fun/* // @match *://*.yolk.best/* // @match *://*.yolk.life/* // @match *://*.yolk.monster/* // @match *://*.yolk.rocks/* // @match *://*.yolk.tech/* // @match *://*.yolk.quest/* // @match *://*.yolk.today/* // @match *://*.zygote.cafe/* // @grant unsafeWindow // @run-at document-start // @require https://cdn.jsdelivr.net/npm/[email protected]/babylon.min.js // @description shellshock.io aithxmbot. Hold RMB to snap to nearest enemy (with optional lead/prediction). Press V to toggle red wireframe ESP boxes + tracers (see through walls). Press ` (backtick) to show/hide the settings menu. // @supportURL https://greatest.deepsurf.us/users/1603179-caringjellyemu // ==/UserScript== /* * Shell Shockers Aimbot + ESP * Copyright (c) 2026 caringjellyemu. All rights reserved where applicable. * * Licensed under the GNU General Public License v3.0 only (GPL-3.0-only). * You are free to use, study, modify, and redistribute this software under * the terms of that license, PROVIDED THAT: * 1. This copyright notice and the attribution below are preserved intact * in all copies and derivative works. * 2. Any redistribution or derivative work remains licensed under * GPL-3.0-only and discloses its complete corresponding source. * 3. The original author(s) are credited and not misrepresented as the * author of an unmodified or trivially-modified copy. * * Removing or altering these notices, or republishing this work (in whole or * in part) under different authorship, violates the GPL-3.0 license and is * grounds for a takedown / attribution complaint. * * ── Attribution / lineage ────────────────────────────────────────────────── * This script is a derivative work. Portions originate from: * • onlypuppy7 — "LibertyMutualV1" (GPL-3.0) * https://github.com/onlypuppy7/LibertyMutualShellShockers/ * • StateFarm client — `predictPosition` lead/gravity algorithm (ported) * Original authorship of the modifications and additions herein: * • caringjellyemu — 2026 * ──────────────────────────────────────────────────────────────────────────── */ (function () { 'use strict'; // ──────────────────────────────────────────────────────────────────────── // STATE + SETTINGS // ──────────────────────────────────────────────────────────────────────── let RMB = false; let H = {}; const ss = {}; // Per-frame snapshot. `hasLock` is true only on frames where RMB is held // and a valid enemy was picked — it drives the overlay's // "locked, idle / lead / waiting" state line. `me` is a cached reference // to the local player (used by the Nyx banner). const _aim = { hasLock: false, me: null, }; const _pred = { enabled: false, active: false, airborne: false, speed: 0, t: 0, leadDist: 0, projSpeed: 0, }; let nyxBannerEl = null; // Auto-chat state (see the per-frame sender further down). let _autoChatLast = 0; // Date.now() of the last message we sent let _autoChatIdx = 0; // rotates through the pipe-separated message list let _autoChatPrev = ''; // last text sent, to dodge the dup-message filter let _chatPending = ''; // a reply/spam line waiting for the send cooldown let _lastChatSeen = ''; // signature of the newest chat row we've handled // Tuning constants — picked, not exposed in the menu. const SENSITIVITY = 0.0025; // mouse-pixels → yaw radians const PROJECTILE_SPEED = 80; // fallback bullet speed when weapon lookup fails // Prediction now runs in the game's native PER-TICK units inside // predictPositionSF (gravity -0.012/tick², terminal 0.29/tick, +1-tick lead // bias), reading the game's own velocity vector — no per-second conversion // or mesh-derived velocity tracking is needed anymore. const SETTINGS_KEY = 'ssh_settings_v1'; const DEFAULT_SETTINGS = { aimEnabled: true, autoAim: false, // ON = aim continuously without holding RMB (holds it for you) crosshairTarget: false, // ON = target the enemy nearest your crosshair; OFF = nearest by distance onlyVisible: false, // ON = never target enemies behind walls; OFF = prioritise visible, fall back to nearest espEnabled: false, predEnabled: true, antiBloom: false, // ON = offset aim by the predicted bloom so the bloomed shot lands on target unlockSkins: true, itemEsp: true, menuVisible: true, // ── Auto chat (spammer) ── // Ported idea from the StateFarm client: rotate through a list of // messages and send them into game chat on an interval. autoChat: false, autoChatText: 'gg | nice shot | shellhax on top', autoChatDelay: 4000, // ms between messages (game flood-protects fast chat) // Trigger-word auto-reply: when someone's chat line contains a keyword, // fire back the matching canned response (ported from StateFarm's mock). chatResponder: false, // ── ESP visuals ── espColor: '#ff3333', // enemy box / tracer color nyxColor: '#b34dff', // color for players whose name starts with "Nyx" espBoxStyle: 'full', // 'full' | 'corners' nameTags: false, // enlarge the game's native name + see through walls // ── Menu theme ── themeAccent: '#ff3b3b', // title + accents themeCorners: 'round', // 'round' | 'sharp' themeOpacity: 82, // panel background opacity, percent (0..100) }; const settings = Object.assign({}, DEFAULT_SETTINGS); try { const saved = JSON.parse(localStorage.getItem(SETTINGS_KEY) || '{}'); Object.assign(settings, saved); delete settings.noSpread; // removed: old spread-zero flag delete settings.antiBloomManual; // removed: anti-bloom manual mode if (typeof settings.antiBloom !== 'boolean') settings.antiBloom = false; } catch (e) {} function saveSettings() { try { localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings)); } catch (e) {} // Mirror to the page's global so bundle-side patches can read these // flags without crossing the userscript sandbox. try { unsafeWindow.ssh_skinUnlock = settings.unlockSkins; } catch (e) {} } try { unsafeWindow.ssh_skinUnlock = settings.unlockSkins; } catch (e) {} let refreshMenu = () => {}; // replaced by buildMenu() once DOM exists const log = (...a) => console.log('%cShellhax', 'color:#000;background:#ff0;padding:2px 6px;border-radius:4px;font-weight:bold', ...a); log('started'); // Robbie the rooster (the mascot). Photos embedded as downscaled data // URIs so the puzzle lock-screen works in a standalone userscript. const ROBBIE_PHOTOS = [ "data:image/jpeg;base64,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", "data:image/jpeg;base64,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", "data:image/jpeg;base64,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", "data:image/jpeg;base64,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", "data:image/jpeg;base64,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", "data:image/jpeg;base64,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", ]; // Scan an object's own properties for one whose value has `propName` set. // Used to discover the obfuscated `actor` key dynamically — much more // robust than relying on a regex that may not match every build. // // `skip` excludes known false-positive keys. `weapon` carries its own // `.mesh` (the gun model), and was previously matching first — making // the prediction read gun-tip position instead of the body actor, so // velocity tracked gun rotation rather than player movement. function findKeyWithProperty(obj, propName, skip) { for (const k in obj) { if (!obj.hasOwnProperty(k)) continue; if (skip && skip.indexOf(k) !== -1) continue; const v = obj[k]; if (v && typeof v === 'object' && v.hasOwnProperty(propName)) return k; } return null; } // ──────────────────────────────────────────────────────────────────────── // INPUT — RMB for aim, V for ESP, ` to toggle menu // ──────────────────────────────────────────────────────────────────────── document.addEventListener('mousedown', e => { if (e.button === 2) RMB = true; }, true); document.addEventListener('mouseup', e => { if (e.button === 2) RMB = false; }, true); document.addEventListener('keydown', e => { const t = document.activeElement; if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA')) return; if (e.repeat) return; if (e.code === 'KeyV') { settings.espEnabled = !settings.espEnabled; saveSettings(); refreshMenu(); log('ESP', settings.espEnabled ? 'ON' : 'OFF'); } else if (e.code === 'Backquote') { settings.menuVisible = !settings.menuVisible; saveSettings(); refreshMenu(); } }, true); // ──────────────────────────────────────────────────────────────────────── // MENU — tiny on-screen panel, persists to localStorage. // ──────────────────────────────────────────────────────────────────────── // One-line description per feature, shown as a hover tooltip in the menu // (keyed by the control's data-k). Keep these short — they render in a small // floating box beside the panel. const FEATURE_DESC = { aimEnabled: 'Hold right mouse button to snap your aim onto the best enemy.', autoAim: 'Aim at enemies continuously without holding RMB — it holds it for you.', crosshairTarget: 'Target the enemy nearest your crosshair instead of the closest by distance.', onlyVisible: 'Never aim at enemies behind walls. Off: prefer visible, fall back to nearest.', predEnabled: 'Lead moving targets — aim where they’ll be, accounting for bullet travel + gravity.', antiBloom: 'Offset aim by the predicted bullet spread so the scattered shot still lands on target.', espEnabled: 'Draw wireframe boxes + tracers on enemies, visible through walls (toggle: V).', itemEsp: 'Mark ammo and grenade pickups on the map.', nameTags: 'Enlarge enemy name tags and show them through walls.', espBoxStyle: 'Box look: Full draws all edges; Corners draws just the corner brackets.', espColor: 'Color of enemy boxes and tracers.', nyxColor: 'Box / tracer color for players whose name starts with “Nyx”.', autoChat: 'Automatically send your messages into chat on a timer (spammer).', chatResponder: 'Auto-reply with a canned comeback when someone’s message hits a trigger word.', autoChatText: 'Messages to rotate through, separated by | (pipe).', autoChatDelay: 'Milliseconds to wait between auto-chat messages.', themeAccent: 'Accent color for the menu title and highlights.', themeCorners: 'Menu corner style: rounded or sharp.', themeOpacity: 'How opaque the menu background is.', unlockSkins: 'Make every skin appear owned in the shop / inventory UI.', }; // Emit a HTML-attribute-safe ` data-desc="…"` for a key (empty if none). const _descAttr = (k) => { const d = FEATURE_DESC[k]; if (!d) return ''; const esc = d.replace(/&/g, '&').replace(/"/g, '"') .replace(/</g, '<').replace(/>/g, '>'); return ` data-desc="${esc}"`; }; // Reusable row builders so the menu markup stays terse. Each returns an // HTML string; controls carry data-k so one generic handler reads/writes // settings regardless of control type (checkbox / color / range / select). // The outer .ssh-row carries data-desc → hover tooltip (see buildMenu). const _rowCheck = (k, label, hint) => `<label class="ssh-row"${_descAttr(k)}><span>${label}${hint ? ` <span class="ssh-hint">${hint}</span>` : ''}</span><input type="checkbox" data-k="${k}"></label>`; const _rowColor = (k, label) => `<div class="ssh-row"${_descAttr(k)}><span>${label}</span><input type="color" data-k="${k}"></div>`; const _rowRange = (k, label, min, max, step) => `<div class="ssh-row"${_descAttr(k)}><span>${label}</span><span class="ssh-rangewrap"><input type="range" data-k="${k}" min="${min}" max="${max}" step="${step}"><b class="ssh-val" data-for="${k}"></b></span></div>`; const _rowSelect = (k, label, opts) => `<div class="ssh-row"${_descAttr(k)}><span>${label}</span><select data-k="${k}">${opts.map(o => `<option value="${o[0]}">${o[1]}</option>`).join('')}</select></div>`; const _rowText = (k, label, ph) => `<div class="ssh-row"${_descAttr(k)}><span>${label}</span><input type="text" data-k="${k}" placeholder="${ph || ''}" class="ssh-text"></div>`; // Apply the user's theme (accent color, corner radius, background opacity) // to the menu via CSS custom properties + a couple of direct styles. function applyTheme(wrap) { const accent = settings.themeAccent || '#ff3b3b'; const radius = settings.themeCorners === 'sharp' ? '0px' : '6px'; const op = Math.max(0, Math.min(1, (Number(settings.themeOpacity) || 0) / 100)); wrap.style.setProperty('--accent', accent); wrap.style.setProperty('--radius', radius); wrap.style.background = `rgba(0,0,0,${op})`; wrap.style.borderRadius = radius; const title = wrap.querySelector('.ssh-title'); if (title) title.style.color = accent; } function buildMenu() { if (document.getElementById('ssh-menu')) return; if (!document.body) { setTimeout(buildMenu, 50); return; } const css = document.createElement('style'); css.textContent = ` #ssh-menu{--accent:#ff3b3b;--radius:6px} #ssh-menu .ssh-cat-hdr{cursor:pointer;padding:4px 0;font-weight:bold; border-top:1px solid #333;display:flex;justify-content:space-between;align-items:center} #ssh-menu .ssh-cat-body{display:none;padding-left:6px} #ssh-menu .ssh-cat.open .ssh-cat-body{display:block} #ssh-menu .ssh-arr{transition:transform .2s;font-size:9px;color:var(--accent)} #ssh-menu .ssh-cat.open .ssh-arr{transform:rotate(90deg)} #ssh-menu .ssh-row{display:flex;justify-content:space-between;align-items:center;gap:8px;margin:3px 0} #ssh-menu .ssh-hint{opacity:0.55} #ssh-menu input{accent-color:var(--accent)} #ssh-menu input[type=color]{width:26px;height:16px;padding:0;border:1px solid #555;background:none;cursor:pointer} #ssh-menu input[type=range]{width:84px;vertical-align:middle} #ssh-menu .ssh-rangewrap{display:flex;align-items:center;gap:6px} #ssh-menu .ssh-val{min-width:22px;text-align:right;opacity:0.7;font-weight:normal} #ssh-menu select{background:#2a2a2a;color:#fff;border:1px solid #555;font:inherit;border-radius:3px;padding:1px 3px;cursor:pointer} #ssh-menu input[type=text].ssh-text{width:120px;background:#2a2a2a;color:#fff;border:1px solid #555;border-radius:3px;padding:1px 4px;font:inherit} #ssh-menu .ssh-presets{display:flex;gap:5px;margin:4px 0} #ssh-menu .ssh-preset{width:18px;height:18px;border-radius:50%;border:1px solid #0006;cursor:pointer} #ssh-menu .ssh-row[data-desc]{cursor:help} #ssh-tip{position:fixed;z-index:2147483647;max-width:210px; background:#0d0d0d;color:#eee;border:1px solid var(--accent,#ff3b3b); border-radius:var(--radius,6px);padding:5px 8px;font:11px/1.4 -apple-system,system-ui,sans-serif; pointer-events:none;opacity:0;transition:opacity .12s; box-shadow:0 2px 12px rgba(0,0,0,0.55)} `; document.head.appendChild(css); const wrap = document.createElement('div'); wrap.id = 'ssh-menu'; wrap.style.cssText = [ 'position:fixed', 'top:12px', 'left:12px', 'z-index:2147483647', 'background:rgba(0,0,0,0.82)', 'color:#fff', 'font:12px/1.4 -apple-system,system-ui,sans-serif', 'padding:10px 12px', 'border-radius:6px', 'min-width:230px', 'border:1px solid #000000', 'user-select:none', 'box-shadow:0 2px 10px rgba(0,0,0,0.4)', ].join(';'); wrap.innerHTML = ` <div style="font-weight:bold;margin-bottom:2px;display:flex;justify-content:space-between;align-items:center;"> <span class="ssh-title" style="color:#ff3b3b;">Shellhax</span> <span style="opacity:0.55;font-weight:normal;font-size:11px;">\` to hide</span> </div> <div style="opacity:0.6;font-weight:normal;font-size:10px;margin-bottom:6px;">Robbie approved 🐔</div> <div class="ssh-cat open"> <div class="ssh-cat-hdr">Combat <span class="ssh-arr">▶</span></div> <div class="ssh-cat-body"> ${_rowCheck('aimEnabled', 'Aimbot', '(hold RMB)')} ${_rowCheck('autoAim', 'Auto Aim', '(no RMB)')} ${_rowCheck('crosshairTarget', 'Target Crosshair', '(else closest)')} ${_rowCheck('onlyVisible', 'Only Visible', '(else prioritise)')} ${_rowCheck('predEnabled', 'Prediction')} ${_rowCheck('antiBloom', 'Anti-Bloom')} </div> </div> <div class="ssh-cat open"> <div class="ssh-cat-hdr">ESP <span class="ssh-arr">▶</span></div> <div class="ssh-cat-body"> ${_rowCheck('espEnabled', 'ESP', '(V)')} ${_rowCheck('itemEsp', 'Item ESP', '(ammo · grenades)')} ${_rowCheck('nameTags', 'Name Tags')} ${_rowSelect('espBoxStyle', 'Box Style', [['full','Full'],['corners','Corners']])} ${_rowColor('espColor', 'Enemy Color')} ${_rowColor('nyxColor', 'Nyx Color')} </div> </div> <div class="ssh-cat"> <div class="ssh-cat-hdr">Chat <span class="ssh-arr">▶</span></div> <div class="ssh-cat-body"> ${_rowCheck('autoChat', 'Auto Chat', '(spammer)')} ${_rowCheck('chatResponder', 'Auto Reply', '(trigger words)')} ${_rowText('autoChatText', 'Messages', 'a | b | c')} ${_rowRange('autoChatDelay', 'Delay (ms)', 1000, 30000, 250)} <div class="ssh-row"><span class="ssh-hint" style="font-size:10px;">Spammer: <b>|</b>-separated, rotates in order. Auto Reply talks back to trigger words.</span></div> </div> </div> <div class="ssh-cat"> <div class="ssh-cat-hdr">Theme <span class="ssh-arr">▶</span></div> <div class="ssh-cat-body"> <div class="ssh-presets"> <div class="ssh-preset" data-accent="#ff3b3b" style="background:#ff3b3b" title="Red"></div> <div class="ssh-preset" data-accent="#3b82f6" style="background:#3b82f6" title="Blue"></div> <div class="ssh-preset" data-accent="#22c55e" style="background:#22c55e" title="Green"></div> <div class="ssh-preset" data-accent="#b34dff" style="background:#b34dff" title="Purple"></div> <div class="ssh-preset" data-accent="#c25a28" style="background:linear-gradient(135deg,#7d8a99 0%,#7d8a99 45%,#c25a28 55%,#c25a28 100%)" title="Robbie 🐔"></div> </div> ${_rowColor('themeAccent', 'Accent')} ${_rowSelect('themeCorners', 'Corners', [['round','Round'],['sharp','Sharp']])} ${_rowRange('themeOpacity', 'Opacity', 20, 100, 1)} </div> </div> <div class="ssh-cat"> <div class="ssh-cat-hdr">Skins <span class="ssh-arr">▶</span></div> <div class="ssh-cat-body"> ${_rowCheck('unlockSkins', 'Unlock Skins')} </div> </div> <div id="ssh-nyx" style="margin-top:6px;padding:6px 8px;border-radius:4px;background:rgba(180,80,255,0.18);border:1px solid rgba(180,80,255,0.55);color:#e9d5ff;font-size:11px;line-height:1.35;"> Join the <b>Nyx</b> wave — start your name with <b>Nyx</b> so we can spot each other. </div> `; document.body.appendChild(wrap); nyxBannerEl = wrap.querySelector('#ssh-nyx'); const inputs = wrap.querySelectorAll('[data-k]'); // Collapsible categories: clicking a header toggles its body open/closed. wrap.querySelectorAll('.ssh-cat-hdr').forEach(hdr => { hdr.addEventListener('click', () => hdr.parentElement.classList.toggle('open')); }); refreshMenu = () => { inputs.forEach(el => { const k = el.dataset.k; if (el.type === 'checkbox') el.checked = !!settings[k]; else el.value = settings[k]; }); wrap.querySelectorAll('.ssh-val').forEach(s => { s.textContent = settings[s.dataset.for]; }); applyTheme(wrap); wrap.style.display = settings.menuVisible ? '' : 'none'; }; inputs.forEach(el => { el.addEventListener('input', () => { const k = el.dataset.k; if (el.type === 'checkbox') settings[k] = el.checked; else if (el.type === 'range') { const n = parseFloat(el.value); settings[k] = Number.isFinite(n) ? n : DEFAULT_SETTINGS[k]; } else settings[k] = el.value; // color / select saveSettings(); refreshMenu(); }); }); // Theme preset swatches set the accent color in one click. wrap.querySelectorAll('.ssh-preset').forEach(sw => { sw.addEventListener('click', () => { settings.themeAccent = sw.dataset.accent; saveSettings(); refreshMenu(); }); }); // Hover tooltips: each feature row with a data-desc shows a small // floating description beside the panel while the cursor is over it. const tip = document.createElement('div'); tip.id = 'ssh-tip'; wrap.appendChild(tip); // inside #ssh-menu so it inherits --accent/--radius wrap.querySelectorAll('.ssh-row[data-desc]').forEach(row => { row.addEventListener('mouseenter', () => { tip.textContent = row.dataset.desc; tip.style.opacity = '1'; const r = row.getBoundingClientRect(); const wr = wrap.getBoundingClientRect(); // Default: to the right of the panel; flip left if it'd overflow. let left = wr.right + 8; if (left + tip.offsetWidth > window.innerWidth - 4) { left = Math.max(4, wr.left - tip.offsetWidth - 8); } tip.style.left = left + 'px'; tip.style.top = Math.max(4, Math.min(r.top, window.innerHeight - tip.offsetHeight - 4)) + 'px'; }); row.addEventListener('mouseleave', () => { tip.style.opacity = '0'; }); }); refreshMenu(); // Stop menu interactions from bleeding into the game. ['keydown','keyup','mousedown','mouseup','wheel','contextmenu'].forEach(ev => wrap.addEventListener(ev, e => e.stopPropagation(), true)); log('menu built'); } if (document.body) { buildMenu(); } else document.addEventListener('DOMContentLoaded', () => { buildMenu(); }); // ──────────────────────────────────────────────────────────────────────── // ROBBIE PUZZLE 🐓 — every few minutes, a full-screen lock asks you to // prove your devotion to Robbie before you can keep playing. Pure bit. // ──────────────────────────────────────────────────────────────────────── let _robbiePuzzleOpen = false; let _robbieTimer = null; // The full puzzle bank. Each entry is a question + answer checker; the // photo is chosen per-question at render time. function robbieAllPuzzles() { const norm = (s) => String(s).trim().toLowerCase(); return [ { question: "What is the rooster's name?", hint: 'type his name', check: (a) => norm(a) === 'robbie' }, { question: 'Unscramble: I B B E O R', hint: '6 letters', check: (a) => norm(a) === 'robbie' }, { question: 'What animal is Robbie?', hint: 'rooster / chicken', check: (a) => ['rooster', 'chicken'].includes(norm(a)) }, { question: 'How many legs does Robbie have?', hint: 'a number', check: (a) => norm(a) === '2' || norm(a) === 'two' }, { question: 'Robbie pecked 4 times, then 3 more. How many pecks?', hint: 'a number', check: (a) => norm(a) === '7' || norm(a) === 'seven' }, { question: 'Finish it: cock-a-doodle-___', hint: 'one word', check: (a) => norm(a).replace(/[^a-z]/g, '') === 'doo' }, { question: 'Best bird alive? (type his name)', hint: '🐓', check: (a) => norm(a) === 'robbie' }, ]; } // persist = the real one-time puzzle (marks "done" + clears deadline on // solve, so it never returns). // all = ask every question in sequence (used by the Test button). function showRobbiePuzzle(persist, all) { if (_robbiePuzzleOpen || !document.body) return; _robbiePuzzleOpen = true; try { document.exitPointerLock && document.exitPointerLock(); } catch (e) {} const bank = robbieAllPuzzles(); const queue = all ? bank.slice() : [ bank[Math.floor(Math.random() * bank.length)] ]; let qi = 0, tries = 0, locked = false; const ov = document.createElement('div'); ov.id = 'ssh-robbie-puzzle'; ov.style.cssText = [ 'position:fixed', 'inset:0', 'z-index:2147483647', 'background:rgba(0,0,0,0.92)', 'color:#fff', 'display:flex', 'flex-direction:column', 'align-items:center', 'justify-content:center', 'gap:14px', 'font:16px/1.4 -apple-system,system-ui,sans-serif', 'text-align:center', ].join(';'); ov.innerHTML = ` <div style="font-size:22px;font-weight:bold;color:#c25a28;">🐓 Robbie Check 🐓</div> <div id="ssh-robbie-progress" style="opacity:0.6;font-size:12px;"></div> <img id="ssh-robbie-img" alt="Robbie" style="max-width:240px;max-height:240px;border-radius:10px;border:3px solid #c25a28;box-shadow:0 4px 20px rgba(0,0,0,0.6);"> <div id="ssh-robbie-q" style="font-size:18px;max-width:420px;"></div> <input id="ssh-robbie-answer" type="text" autocomplete="off" placeholder="your answer" style="font:inherit;padding:6px 10px;border-radius:6px;border:2px solid #c25a28;background:#1a1a1a;color:#fff;text-align:center;width:220px;"> <div id="ssh-robbie-hint" style="opacity:0.5;font-size:12px;"></div> <button id="ssh-robbie-submit" style="background:#c25a28;color:#fff;border:none;border-radius:6px;padding:7px 16px;font:inherit;cursor:pointer;">Continue</button> <div id="ssh-robbie-feedback" style="min-height:18px;font-size:13px;color:#ff6b6b;"></div> `; document.body.appendChild(ov); // Eat clicks/keys so the game can't be played behind the lock. ['mousedown', 'mouseup', 'click', 'wheel', 'contextmenu', 'keydown', 'keyup'] .forEach(ev => ov.addEventListener(ev, e => e.stopPropagation(), false)); const img = ov.querySelector('#ssh-robbie-img'); const progress = ov.querySelector('#ssh-robbie-progress'); const qEl = ov.querySelector('#ssh-robbie-q'); const hintEl = ov.querySelector('#ssh-robbie-hint'); const input = ov.querySelector('#ssh-robbie-answer'); const feedback = ov.querySelector('#ssh-robbie-feedback'); const submit = ov.querySelector('#ssh-robbie-submit'); const FAILS = ['Robbie is disappointed. Try again. 🐓', 'wrong. Robbie clucks in dismay.', 'nope. Robbie expected better.']; const close = () => { try { ov.remove(); } catch (e) {} _robbiePuzzleOpen = false; if (persist) { robbieLSset(ROBBIE_DONE_KEY, '1'); robbieLSdel(ROBBIE_DEADLINE_KEY); } }; const render = () => { locked = false; tries = 0; const p = queue[qi]; img.src = ROBBIE_PHOTOS[Math.floor(Math.random() * ROBBIE_PHOTOS.length)]; progress.textContent = queue.length > 1 ? `Question ${qi + 1} / ${queue.length}` : ''; qEl.textContent = p.question; hintEl.textContent = p.hint; feedback.textContent = ''; input.value = ''; submit.disabled = false; setTimeout(() => input.focus(), 30); }; const attempt = () => { if (locked) return; if (queue[qi].check(input.value)) { qi++; locked = true; submit.disabled = true; feedback.style.color = '#4ade80'; if (qi >= queue.length) { feedback.textContent = queue.length > 1 ? 'All correct! Robbie is proud. 🐓' : 'Robbie approves. 🐓'; setTimeout(close, 700); } else { feedback.textContent = 'Correct! 🐓'; setTimeout(render, 450); } } else { tries++; feedback.style.color = '#ff6b6b'; feedback.textContent = FAILS[Math.min(tries - 1, FAILS.length - 1)]; input.value = ''; input.focus(); } }; submit.addEventListener('click', attempt); input.addEventListener('keydown', e => { if (e.key === 'Enter') { e.preventDefault(); attempt(); } }); render(); } // One-time, but escape-proof: the deadline lives in localStorage, so // refreshing or opening a new tab can't reset the countdown or dodge the // puzzle. Once the deadline passes it shows immediately on every load and // stays until solved; solving sets a "done" flag so it never returns. const ROBBIE_DEADLINE_KEY = 'ssh_robbie_deadline'; const ROBBIE_DONE_KEY = 'ssh_robbie_done'; function robbieLS(k) { try { return localStorage.getItem(k); } catch (e) { return null; } } function robbieLSset(k, v) { try { localStorage.setItem(k, v); } catch (e) {} } function robbieLSdel(k) { try { localStorage.removeItem(k); } catch (e) {} } let _robbieArmed = false; function armRobbiePuzzle() { if (_robbieArmed) return; _robbieArmed = true; if (robbieLS(ROBBIE_DONE_KEY)) return; // already solved — never again // Persistent deadline: set once (5 minutes from first load), survives // refreshes / new tabs. Hardcoded and inescapable — there is no toggle // and no way to change when it fires. Once the deadline passes the // puzzle shows on every load and stays until solved. const ROBBIE_DELAY_MS = 5 * 60000; // 5 minutes, fixed let deadline = parseInt(robbieLS(ROBBIE_DEADLINE_KEY), 10); if (!Number.isFinite(deadline)) { deadline = Date.now() + ROBBIE_DELAY_MS; robbieLSset(ROBBIE_DEADLINE_KEY, String(deadline)); } const fire = () => showRobbiePuzzle(true); // unconditional once armed const wait = deadline - Date.now(); if (wait <= 0) fire(); // already due → show now else _robbieTimer = setTimeout(fire, wait); // otherwise wait it out } armRobbiePuzzle(); // ──────────────────────────────────────────────────────────────────────── // YAW/PITCH MECHANISM (trimmed port of babylon.js's `yawpitch` helper) // // shellshock.io's camera state lives in WASM. You cannot move the camera // by mutating player.yaw / player.pitch directly — the WASM module is the // source of truth. The only thing that DOES affect the camera is the // game's `pointermove` listener (named "real" in the bundle), which // converts movementX/Y into WASM look deltas. // // Steps: // 1. Hook addEventListener early to capture that listener. // 2. To turn the camera N radians, synthesize a fake pointermove event // with movementX = N/sensitivity and call the listener directly. // 3. After moving, read back the resulting yaw/pitch from the bundle's // `unsafeWindow.get_yaw_pitch()` helper. // ──────────────────────────────────────────────────────────────────────── let realPointerListener = null; const _origAEL = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function (type, listener, options) { try { if (type === 'pointermove' && listener && listener.name === 'real') { realPointerListener = listener; log('captured real pointermove listener'); } } catch (e) { /* never break the page's own event hooks */ } return _origAEL.call(this, type, listener, options); }; function getCurrentYawPitch() { try { return unsafeWindow.get_yaw_pitch(); } catch (e) { return null; } } // Local player's uniqueId, cached each frame from the per-frame callback. // set_mouse_params needs it to know whose look sensitivity to configure. let _mouseParamsId = null; // THE FIX (ported from StateFarm): before sending a synthetic mouse move, // pin the WASM mouse sensitivity to a KNOWN value (mouseSpeed 50, no invert, // no scope). The WASM module converts movementX → yaw by its own internal // sensitivity; if that's left at the user's in-game setting it almost never // equals our SENSITIVITY (0.0025), so each synthetic move under/overshoots // and the camera only creeps toward the target over several frames — the // "lag". Forcing mouseSpeed 50 here makes movementX*0.0025 == yaw exactly, // so a SINGLE setToYawPitch snaps onto target. StateFarm calls this before // every movePointer (state farm client: yawpitch.movePointer). function normalizeMouseSensitivity() { try { unsafeWindow.set_mouse_params(50, 0, 0.9, false, _mouseParamsId); } catch (e) { /* WASM helper absent on this build — fall back to creep */ } } function movePointer(mx, my) { mx = Math.round(mx); my = Math.round(my); if (mx === 0 && my === 0) return; if (!realPointerListener) return; normalizeMouseSensitivity(); realPointerListener({ movementX: mx, movementY: my, x: 1, isTrusted: true }); } // Signed shortest-arc difference between two angles, in (-π, π]. function radianDiff(a, b) { const TAU = 2 * Math.PI; a = ((a % TAU) + TAU) % TAU; b = ((b % TAU) + TAU) % TAU; let d = Math.abs(a - b); d = Math.min(d, TAU - d); return (((a - b + TAU) % TAU) > Math.PI) ? -d : d; } // Aim camera at the given yaw/pitch (in radians, get_yaw_pitch convention). function setToYawPitch(targetYaw, targetPitch) { const cur = getCurrentYawPitch(); if (!cur) return; const dy = radianDiff(cur.yaw, targetYaw); const dp = radianDiff(cur.pitch, targetPitch); movePointer(dy / SENSITIVITY, dp / SENSITIVITY); } // ──────────────────────────────────────────────────────────────────────── // SHARED AIM MATH — yaw/pitch of a direction vector, in the game's // RotationYawPitchRoll basis (matches StateFarm's calculateYaw/calculatePitch). // Used by the aimbot to convert a (me → target) vector into the yaw/pitch the // camera should hold. // ──────────────────────────────────────────────────────────────────────── const _mod = (a, n) => ((a % n) + n) % n; const _setPrecision = (v) => Math.round(v * 8192) / 8192; // game's shot precision const _calcYaw = (pos) => _setPrecision(_mod(Math.atan2(pos.x, pos.z), 2 * Math.PI)); const _calcPitch = (pos) => _setPrecision(-Math.atan2(pos.y, Math.hypot(pos.x, pos.z)) % 1.5); // Resolve the weapon's static config (bullet velocity, range, mesh name). // babylon2 reads it off `weapon.subClass`; older/other builds expose the // same data on `weapon.constructor` (where StateFarm reads it). function _weaponConfig(w) { return (w && w.subClass) || (w && w.constructor) || {}; } // ── ANTI-BLOOM (StateFarm predictBloom port) ──────────────────────────── // Predicts the yaw/pitch deflection the gun's bloom WILL apply to the next // shot and adds it to the aim target, so the scattered bullet lands on the // real target. Replays the weapon RNG: seed advances seed=(seed*9301+49297) // %233280, 3 draws/shot scaled by weapon.accuracy, projected through // RotationYawPitchRoll back to a yaw/pitch diff. Shotguns average 20 pellets. // // HISTORY: this has been ported and removed TWICE before because it never // improved hits in practice (see memory project_no_spread_mechanism). The // suspected failure is that the seed read at aim-time != the seed the next // shot consumes, or the matrix sign/basis doesn't match our aim convention. // So this version is INSTRUMENTED: set `window.SSH_BLOOM_DEBUG = true` in the // console to log the predicted offset AND verify the RNG model against the // game by watching how far the real seed advances on each shot. const _LCG = (s) => (s * 9301 + 49297) % 233280; // The obfuscated key on the player object holding the weapon RNG // ({ seed: <number> }). Discovered once by scanning for a child object with // a numeric `.seed` (StateFarm hardcodes H.randomGen; we rediscover it). let _randomGenKey = null; function resolveRandomGenKey(me) { if (_randomGenKey && me[_randomGenKey] && typeof me[_randomGenKey].seed === 'number') { return _randomGenKey; } _randomGenKey = null; for (const k in me) { try { const v = me[k]; if (v && typeof v === 'object' && typeof v.seed === 'number') { _randomGenKey = k; log('randomGen key resolved:', k); return k; } } catch (e) { /* getters that throw — skip */ } } return null; } // Logs a bail-out reason ONCE per distinct reason (debug only) — so a single // console paste names exactly which guard is making anti-bloom a no-op. const _bloomBailSeen = new Set(); function _bloomBail(reason) { if (unsafeWindow.SSH_BLOOM_DEBUG && !_bloomBailSeen.has(reason)) { _bloomBailSeen.add(reason); log('[bloom] NO-OP — bailed at:', reason); } return [0, 0]; } // Read a weapon field from wherever this bundle keeps it: the instance, its // `subClass` (where babylon2 finds velocity), or its `constructor` (where // StateFarm reads range / standardMeshName). Returns undefined if absent. function _wfield(w, name) { if (!w) return undefined; if (typeof w[name] !== 'undefined') return w[name]; if (w.subClass && typeof w.subClass[name] !== 'undefined') return w.subClass[name]; if (w.constructor && typeof w.constructor[name] !== 'undefined') return w.constructor[name]; return undefined; } // Resolve the local player's current weapon. Prefer me[H.weapon]; if that // key is wrong on this bundle, scan the player for an object that looks like // a weapon (has a numeric `accuracy`, anywhere, or an ammo + subClass). let _weaponKey = null; function resolveWeapon(me) { const hw = me[H.weapon]; if (hw && typeof _wfield(hw, 'accuracy') === 'number') return hw; if (_weaponKey && me[_weaponKey] && typeof _wfield(me[_weaponKey], 'accuracy') === 'number') return me[_weaponKey]; _weaponKey = null; for (const k in me) { try { const v = me[k]; if (v && typeof v === 'object' && typeof _wfield(v, 'accuracy') === 'number' && (v.ammo || v.subClass || (v.constructor && typeof v.constructor.range === 'number'))) { _weaponKey = k; log('weapon key resolved:', k, '(H.weapon=' + H.weapon + ' was wrong)'); return v; } } catch (e) { /* throwing getter — skip */ } } return hw || null; } // Returns [dYaw, dPitch] (radians) to ADD to the aim target. [0,0] when it // can't resolve the RNG/weapon (then aim is unchanged — safe no-op). function predictBloom(me, yaw, pitch) { try { if (typeof BABYLON === 'undefined') return _bloomBail('BABYLON undefined'); const rgKey = resolveRandomGenKey(me); if (!rgKey) return _bloomBail('randomGen key not found on player'); const weapon = resolveWeapon(me); if (!weapon) return _bloomBail('weapon not found (H.weapon=' + H.weapon + ')'); const accuracy = _wfield(weapon, 'accuracy'); const range = _wfield(weapon, 'range'); if (typeof accuracy !== 'number') return _bloomBail('accuracy not found on instance/subClass/constructor'); if (typeof range !== 'number') return _bloomBail('range not found on instance/subClass/constructor'); const pellets = (_wfield(weapon, 'standardMeshName') === 'dozenGauge') ? 20 : 1; if (unsafeWindow.SSH_BLOOM_DEBUG && !_bloomBailSeen.has('OK')) { _bloomBailSeen.add('OK'); log('[bloom] inputs OK — rgKey=', rgKey, 'seed=', me[rgKey].seed, 'accuracy=', accuracy, 'range=', range, 'pellets=', pellets); } let seed = me[rgKey].seed; // copy — we replay, never mutate the game's let sumYaw = 0, sumPitch = 0; for (let p = 0; p < pellets; p++) { const n = []; for (let i = 0; i < 3; i++) { seed = _LCG(seed); n.push(((seed / 233280) - 0.5) * accuracy); } const rot = BABYLON.Matrix.RotationYawPitchRoll(yaw, pitch, 0); const trans = BABYLON.Matrix.Translation(0, 0, range); const playerAndRange = trans.multiply(rot); const bloom = BABYLON.Matrix.RotationYawPitchRoll(n[0], n[1], n[2]); const t = playerAndRange.multiply(bloom).getTranslation(); sumYaw += radianDiff(yaw, _calcYaw(t)); sumPitch += radianDiff(pitch, _calcPitch(t)); } return [sumYaw / pellets, sumPitch / pellets]; } catch (e) { return [0, 0]; } } // ── Anti-bloom instrumentation (window.SSH_BLOOM_DEBUG === true) ───────── // Watches the real RNG seed every frame. When it changes (a shot fired), it // counts how many LCG steps separate the old and new seed — i.e. how many // scatter draws the game actually consumed per shot. If our model is right // this should be 3 (1 shot) or a multiple of 3. A mismatch means our seed // replay is wrong, which is the most likely reason anti-bloom misses. let _bloomDbgSeed = null; const _RAD2DEG = 180 / Math.PI; function _seedStepsBetween(prev, next, max) { let s = prev; for (let i = 1; i <= max; i++) { s = _LCG(s); if (s === next) return i; } return -1; // not reachable within `max` steps } // One-time dump of the weapon object so we can locate `accuracy`, `range` // and `standardMeshName` on THIS bundle (they came back undefined). let _weaponDumped = false; function _dumpWeapon(me) { if (_weaponDumped) return; const w = me[H.weapon]; if (!w) { log('[bloom] me[H.weapon] is', w, '(H.weapon=' + H.weapon + ')'); return; } _weaponDumped = true; const safe = (o) => { try { return o ? Object.keys(o) : o; } catch (e) { return '<err>'; } }; const ctor = w.constructor; log('[bloom] WEAPON DUMP — instance keys:', safe(w)); log('[bloom] w.accuracy=', w.accuracy, ' w.range=', w.range, ' w.standardMeshName=', w.standardMeshName); log('[bloom] w.subClass keys:', safe(w.subClass), '| subClass.accuracy=', w.subClass && w.subClass.accuracy, 'range=', w.subClass && w.subClass.range, 'mesh=', w.subClass && w.subClass.standardMeshName); log('[bloom] w.constructor.name=', ctor && ctor.name, '| ctor.accuracy=', ctor && ctor.accuracy, 'range=', ctor && ctor.range, 'mesh=', ctor && ctor.standardMeshName); } function bloomDebugTick(me) { if (!unsafeWindow.SSH_BLOOM_DEBUG) { _bloomDbgSeed = null; return; } _dumpWeapon(me); const rgKey = resolveRandomGenKey(me); if (!rgKey) return; const seed = me[rgKey].seed; if (_bloomDbgSeed != null && seed !== _bloomDbgSeed) { const steps = _seedStepsBetween(_bloomDbgSeed, seed, 600); const w = resolveWeapon(me); log('[bloom] seed advanced', steps, 'LCG steps this shot', '(expect 3/shot, ×20 for shotgun) — accuracy=', _wfield(w, 'accuracy'), 'range=', _wfield(w, 'range'), 'mesh=', _wfield(w, 'standardMeshName')); } _bloomDbgSeed = seed; } // ──────────────────────────────────────────────────────────────────────── // BUNDLE INTERCEPTION — same pattern as babylon.js (which works). // ──────────────────────────────────────────────────────────────────────── const _origReplace = String.prototype.replace; String.prototype.sshReplace = function () { return _origReplace.apply(this, arguments); }; const CB_NAME = 'ssh_' + Math.random().toString(36).slice(2, 10); const DEFAULTS = { x: 'Fh', y: 'Qh', z: 'Th', dz: 'dz', // per-tick velocity z (dx/dy are usually plain props; dz can be minified) yaw: 'Eh', pitch: '$h', coords: 'aa', uniqueId: 'IZ', // local player's network id — needed by set_mouse_params playing: 'Gh', actor: 'eh', mesh: 'mesh', weapon: 'Ah', renderingGroupId: 'renderingGroupId', SCENE: 'eI', PLAYERS: 'rI', CULL: 'Xw', items: 'kr', }; function extractKeys(js) { const out = Object.assign({}, DEFAULTS); try { let m; // WASM mouse-look bridge: `(zO.Kw=e.yaw,zO.Ew=e.pitch,zO.Qz=e.coords)` m = /\(([a-zA-Z_$0-9]+)\.([a-zA-Z_$0-9]+)=e\.yaw,\1\.([a-zA-Z_$0-9]+)=e\.pitch,\1\.([a-zA-Z_$0-9]+)=e\.coords\)/.exec(js); if (m) { out.yaw = m[2]; out.pitch = m[3]; out.coords = m[4]; } // Players-array iteration m = /for\s*\(\s*(?:var|let)\s+\w+=0;\w+<([a-zA-Z_$0-9]+);\w+\+\+\)\s*\{\s*(?:var|let)\s+\w+=([a-zA-Z_$0-9]+)\[\w+\];\s*\w+&&\w+\.([a-zA-Z_$0-9]+)&&/.exec(js); if (m) { out.PLAYERS = m[2]; out.playing = m[3]; } // Spectator-info builder pos fields m = /posX:[a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+),posY:[a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+),posZ:[a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+)/.exec(js); if (m) { out.x = m[1]; out.y = m[2]; out.z = m[3]; } // Actor + mesh m = /actorX:[a-zA-Z_$0-9]+\.([a-zA-Z_$0-9]+)\.([a-zA-Z_$0-9]+)\.position\.x/.exec(js); if (m) { out.actor = m[1]; out.mesh = m[2]; } // SCENE: first render() in the two-render() pattern m = /([a-zA-Z_$0-9]+)\.render\(\),[a-zA-Z_$0-9]+\.render\(\)\}\)\)/.exec(js); if (m) out.SCENE = m[1]; // Items manager: the network-protocol handler calls // `<X>.spawnItem(s,p,m,v,y);break;` with exactly those 5 args. // Capture <X> as the items-manager instance. m = /([a-zA-Z_$0-9]+)\.spawnItem\([a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+,[a-zA-Z_$0-9]+\);break;/.exec(js); if (m) out.items = m[1]; // Native map collider (StateFarm's ss.RAYS). Anchor on the STABLE // literal `projectileCollidesWithCell` — the game calls // <RAYS>.<rayCollidesWithMap>(pos, dir, <RAYS>.projectileCollidesWithCell) // group1 = the RAYS object var, group2 = the obfuscated method name. m = /([a-zA-Z_$0-9]+)\.([a-zA-Z_$0-9]+)\([^;]{0,120}?\.projectileCollidesWithCell\)/.exec(js); if (m) { out.RAYS = m[1]; out.rayCollidesWithMap = m[2]; log('native collider keys:', m[1], '/', m[2]); } else log('WARNING: native map collider not found — line-of-sight will use the scene-pick fallback'); } catch (e) { log('key extraction error:', e); } return out; } function patchBundle(js) { H = extractKeys(js); log('H map:', H); const argFields = Object.keys(H) .map(k => `${k}:(()=>{try{return ${H[k]}}catch(_){return null}})()`) .join(','); const find = H.SCENE + '.render'; const replace = `window["${CB_NAME}"]({${argFields}},true)||${H.SCENE}.render`; const before = js; js = js.sshReplace(find, replace); if (before === js) log('WARNING: SCENE.render patch did not match'); else log('SCENE.render hook installed'); // Cull inhibition: the bundle hides off-screen / occluded players via // `{if(<CULL>)`. Patch to `{if(true)` so all players keep rendering // even when behind walls — otherwise our ESP boxes (parented to the // player mesh) disappear with them. const cullBefore = js; js = js.sshReplace('{if(' + H.CULL + ')', '{if(true)'); if (cullBefore === js) log('WARNING: cull-inhibition patch did not match (H.CULL=' + H.CULL + ')'); else log('cull inhibition installed'); // ── Item ESP hooks (ammo + grenade drops) ── // Anchor on the items-manager prototype methods. Both spawnItem // and collectItem have a stable shape: // spawnItem(e,t,i,r,n){var a=this.pools[t].retrieve(e); ...} // collectItem(e,t){var i=this.pools[e]; i.recycle(...); ...} // Param names are captured generically so renaming between builds // doesn't break the patch. // Anchor on the function body (`var a=this.pools[t].retrieve(e);`) // and accept both `<Cls>.prototype.spawnItem=function(...)` (old // bundle style) and `spawnItem(...){` (ES6 class syntax). The body // pattern is what disambiguates from call sites like // `kr.spawnItem(s,p,m,v,y);`. const spawnItemBefore = js; js = js.sshReplace( /((?:\.prototype\.spawnItem=function|\bspawnItem)\(([a-zA-Z_$0-9]+),([a-zA-Z_$0-9]+),([a-zA-Z_$0-9]+),([a-zA-Z_$0-9]+),([a-zA-Z_$0-9]+)\)\{var ([a-zA-Z_$0-9]+)=this\.pools\[\3\]\.retrieve\(\2\);)/, '$1window.ssh_onItemSpawn&&window.ssh_onItemSpawn($7,$3,$4,$5,$6);' ); if (spawnItemBefore === js) log('WARNING: spawnItem pattern not found — item ESP disabled'); else log('spawnItem hook installed'); const collectItemBefore = js; js = js.sshReplace( /((?:\.prototype\.collectItem=function|\bcollectItem)\(([a-zA-Z_$0-9]+),([a-zA-Z_$0-9]+)\)\{var ([a-zA-Z_$0-9]+)=this\.pools\[\2\];)/, '$1window.ssh_onItemCollect&&window.ssh_onItemCollect($2,$4.objects[$3]);' ); if (collectItemBefore === js) log('WARNING: collectItem pattern not found'); else log('collectItem hook installed'); // ── Skin unlock ── // The bundle's "do I own this skin?" check is: // `inventory[X].id===Y.id) return true; return false` // Patch the trailing comparison so it ALSO passes when our flag // `window.ssh_skinUnlock` is set — every skin then appears owned. // Gated client-side; the server may still validate at use, but the // shop/inventory UI will let you try them on. const skinBefore = js; js = js.sshReplace( /inventory\[[a-zA-Z$_]+\]\.id===[a-zA-Z$_]+\.id\)return!0;return!1/, (m) => m + '||window.ssh_skinUnlock' ); if (skinBefore === js) log('WARNING: skin-unlock pattern not found in this bundle'); else log('skin-unlock hook installed'); return js; } const _origAppendChild = HTMLElement.prototype.appendChild; HTMLElement.prototype.appendChild = function (node) { if (node && node.tagName === 'SCRIPT' && node.innerHTML && node.innerHTML.startsWith('(()=>{')) { log('intercepting bundle, ' + node.innerHTML.length + ' chars'); node.innerHTML = patchBundle(node.innerHTML); } return _origAppendChild.call(this, node); }; // ──────────────────────────────────────────────────────────────────────── // ESP — wireframe box per enemy, parented to their mesh so it follows // smoothly. Created on first sight; visibility toggled per frame. // ──────────────────────────────────────────────────────────────────────── let _espWarned = false; // Tracks every player we've created an ESP box for. Used by the sweep // in the per-frame callback to dispose orphan boxes when a player leaves // the match (no longer in ss.PLAYERS) or switches to our team. const _espPlayers = new Set(); function disposeEspFor(P) { if (P._ssh_box) { try { P._ssh_box.dispose(); } catch (e) {} P._ssh_box = null; } if (P._ssh_tracer) { try { P._ssh_tracer.dispose(); } catch (e) {} P._ssh_tracer = null; } restoreNameSprite(P); // hand the native nameSprite back to the game _espPlayers.delete(P); } // Enemy box/tracer/nametag colors are user-configurable (settings.espColor / // nyxColor) and resolved per-frame via hexToColor3. ESP_COLOR_RED stays as a // hard fallback for the rare frame BABYLON loaded but a color parse failed. // Item markers keep fixed colors (ammo = yellow, grenade = orange). const ESP_COLOR_RED = (typeof BABYLON !== 'undefined') ? new BABYLON.Color3(1.0, 0.2, 0.2) : null; const ESP_COLOR_AMMO = (typeof BABYLON !== 'undefined') ? new BABYLON.Color3(1.0, 0.95, 0.2) : null; const ESP_COLOR_GRENADE = (typeof BABYLON !== 'undefined') ? new BABYLON.Color3(1.0, 0.5, 0.0) : null; const _isNyxName = (n) => typeof n === 'string' && n.toLowerCase().startsWith('nyx'); // Parse "#rrggbb" → cached BABYLON.Color3. Cached so the per-frame ESP loop // can ask for the user's chosen color every frame without re-allocating. const _color3Cache = new Map(); function hexToColor3(hex) { if (typeof BABYLON === 'undefined') return null; let c = _color3Cache.get(hex); if (c) return c; const m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex || ''); c = m ? new BABYLON.Color3(parseInt(m[1],16)/255, parseInt(m[2],16)/255, parseInt(m[3],16)/255) : new BABYLON.Color3(1, 0.2, 0.2); _color3Cache.set(hex, c); return c; } // The hex string an enemy's box/tracer should currently use. const espHexFor = (P) => _isNyxName(P && P.name) ? settings.nyxColor : settings.espColor; // Item ESP — markers for ammo/grenade pickups. The bundle's items // manager pools meshes (Qo.constructors = [Yo, Ko] → type 0 = ammo, // type 1 = grenade), so we keep our marker keyed by the pooled mesh // and dispose it on collect. // Map (not WeakMap) so we can iterate it each frame to dispose markers // whose item went inactive without us seeing the collect event. const itemMarkers = new Map(); function makeItemMarker(x, y, z, color) { if (typeof BABYLON === 'undefined' || !ss.SCENE) return null; const s = 0.35; const V = BABYLON.Vector3; const m = BABYLON.MeshBuilder.CreateLineSystem( 'sshitem_' + Math.random().toString(36).slice(2, 8), { lines: [ [new V(-s, 0, 0), new V(s, 0, 0)], [new V(0, -s, 0), new V(0, s, 0)], [new V(0, 0, -s), new V(0, 0, s)], ]}, ss.SCENE ); m.color = color; m.position.x = x; m.position.y = y; m.position.z = z; m[H.renderingGroupId] = 1; m.alwaysSelectAsActiveMesh = true; m.isPickable = false; pierceWalls(m); return m; } unsafeWindow.ssh_onItemSpawn = function (item, type, x, y, z) { try { if (!settings.itemEsp) return; if (!item || !item.mesh) return; // Clean up any leftover marker for this pooled mesh. const old = itemMarkers.get(item.mesh); if (old) { try { old.dispose(); } catch (e) {} itemMarkers.delete(item.mesh); } const color = (type === 0 ? ESP_COLOR_AMMO : ESP_COLOR_GRENADE) || new BABYLON.Color3(1, 1, 1); const marker = makeItemMarker(x, y, z, color); if (marker) itemMarkers.set(item.mesh, marker); } catch (e) {} }; unsafeWindow.ssh_onItemCollect = function (_type, item) { try { if (!item || !item.mesh) return; const marker = itemMarkers.get(item.mesh); if (marker) { try { marker.dispose(); } catch (e) {} itemMarkers.delete(item.mesh); } } catch (e) {} }; // Force a mesh to ignore the depth buffer entirely while rendering. This // is what actually makes the box/tracer punch through walls — neither // renderingGroupId nor setRenderingAutoClearDepthStencil is reliable on // its own in this Babylon version. function pierceWalls(mesh) { if (!mesh || mesh._ssh_pierced) return; mesh._ssh_pierced = true; let saved = null; mesh.onBeforeRenderObservable.add(() => { try { const eng = ss.SCENE && ss.SCENE.getEngine && ss.SCENE.getEngine(); if (!eng) return; saved = eng.getDepthFunction(); eng.setDepthFunction(BABYLON.Engine.ALWAYS); } catch (e) {} }); mesh.onAfterRenderObservable.add(() => { try { const eng = ss.SCENE && ss.SCENE.getEngine && ss.SCENE.getEngine(); if (!eng || saved === null) return; eng.setDepthFunction(saved); saved = null; } catch (e) {} }); } // Build the wireframe line segments for a box of the given style. 'full' // draws all 12 edges; 'corners' draws only short L-brackets at each of the // 8 corners (cleaner, less cluttered look). Local space, centered on x/z, // resting on y=0 up to y=h. function buildBoxLines(style) { const w = 0.4, h = 0.65, d = 0.4; const V = BABYLON.Vector3; const v = [ new V(-w/2, 0, -d/2), new V(w/2, 0, -d/2), new V( w/2, h, -d/2), new V(-w/2, h, -d/2), new V(-w/2, 0, d/2), new V(w/2, 0, d/2), new V( w/2, h, d/2), new V(-w/2, h, d/2), ]; const lines = []; if (style === 'corners') { // For each corner, draw a short stub toward each of its 3 neighbours. const edges = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]]; const f = 0.28; // fraction of each edge drawn from the corner for (const [a, b] of edges) { const A = v[a], B = v[b]; const ab = new V(B.x - A.x, B.y - A.y, B.z - A.z); const ba = new V(A.x - B.x, A.y - B.y, A.z - B.z); lines.push([A, new V(A.x + ab.x*f, A.y + ab.y*f, A.z + ab.z*f)]); lines.push([B, new V(B.x + ba.x*f, B.y + ba.y*f, B.z + ba.z*f)]); } } else { for (let i = 0; i < 4; i++) { lines.push([v[i], v[(i+1)%4]]); lines.push([v[i+4], v[(i+1)%4+4]]); lines.push([v[i], v[i+4]]); } } return lines; } function ensureEspBox(P) { if (P._ssh_box) return P._ssh_box; if (typeof BABYLON === 'undefined') { if (!_espWarned) { _espWarned = true; log('ESP: BABYLON not loaded'); } return null; } if (!ss.SCENE) { if (!_espWarned) { _espWarned = true; log('ESP: no SCENE'); } return null; } // Build geometry in local space (centered around 0, 0, 0). Position is // set per-frame from network coords below — no parenting, so we don't // inherit the game's interpolation freeze when it thinks the enemy // is occluded. const style = settings.espBoxStyle === 'corners' ? 'corners' : 'full'; const box = BABYLON.MeshBuilder.CreateLineSystem( 'sshesp_' + Math.random().toString(36).slice(2, 8), { lines: buildBoxLines(style) }, ss.SCENE ); box.color = hexToColor3(settings.espColor) || new BABYLON.Color3(1.0, 0.2, 0.2); box[H.renderingGroupId] = 1; box.alwaysSelectAsActiveMesh = true; box.isPickable = false; pierceWalls(box); P._ssh_box = box; P._ssh_boxStyle = style; P._ssh_colorHex = null; // force a color apply on the next frame _espPlayers.add(P); log('ESP: built box for', P.name || P.nickname || '?'); return box; } // Floating nametag — StateFarm's approach (ported from "state farm client", // the `nametags` block). Instead of building our own billboard plane + // DynamicTexture (and redrawing its canvas every frame), we reuse the // GAME's own native nameSprite that already floats above every player. We // only (a) promote it to renderingGroupId 1 so the depth-clear renders it // through walls, and (b) scale it up with distance so far enemies stay // readable. No per-frame canvas redraw → far cheaper, and the text/colour // stay exactly as the game draws them. function applyNameSprite(P, me) { const actor = P[H.actor]; const sprite = actor && actor.nameSprite; if (!sprite) return; // Remember the game's defaults once so we can restore them on toggle-off. if (!P._ssh_nsOrig) { P._ssh_nsOrig = { w: sprite.width, h: sprite.height, rg: sprite[H.renderingGroupId], mgr: sprite._manager ? sprite._manager[H.renderingGroupId] : undefined, }; } // See through walls: sprite + its shared SpriteManager into group 1. if (sprite._manager) sprite._manager[H.renderingGroupId] = 1; sprite[H.renderingGroupId] = 1; // Distance scale (StateFarm: d = dist^1.25 * 2; w = d/10+.6, h = d/20+.3). const dx = P[H.x] - me[H.x], dy = P[H.y] - me[H.y], dz = P[H.z] - me[H.z]; const d = Math.pow(Math.hypot(dx, dy, dz), 1.25) * 2; sprite.width = d / 10 + 0.6; sprite.height = d / 20 + 0.3; } // Put the native nameSprite back to the game's defaults (nametags off, // player left the match, or no longer a valid enemy). function restoreNameSprite(P) { const o = P._ssh_nsOrig; if (!o) return; const actor = P[H.actor]; const sprite = actor && actor.nameSprite; if (sprite) { try { sprite.width = o.w; sprite.height = o.h; sprite[H.renderingGroupId] = o.rg != null ? o.rg : 0; if (sprite._manager && o.mgr != null) sprite._manager[H.renderingGroupId] = o.mgr; } catch (e) {} } P._ssh_nsOrig = null; } // Tracer line from each enemy to a point 5 units BEHIND the camera (so it // appears to converge at your eye and project outward to the enemy). function ensureEspTracer(P) { if (P._ssh_tracer) return P._ssh_tracer; if (typeof BABYLON === 'undefined' || !ss.SCENE) return null; const placeholder = [new BABYLON.Vector3(0,0,0), new BABYLON.Vector3(0,0,0)]; const tr = BABYLON.MeshBuilder.CreateLines( 'sshtracer_' + Math.random().toString(36).slice(2, 8), { points: placeholder, updatable: true }, ss.SCENE ); tr.color = ESP_COLOR_RED || new BABYLON.Color3(1.0, 0.2, 0.2); tr.isPickable = false; tr.alwaysSelectAsActiveMesh = true; tr.doNotSyncBoundingInfo = true; tr[H.renderingGroupId] = 1; pierceWalls(tr); P._ssh_tracer = tr; return tr; } function updateEspTracer(P, crosshairs) { const tr = ensureEspTracer(P); if (!tr) return null; // Use network coords (always live) rather than mesh.position (freezes // when the game thinks the enemy is occluded). const from = new BABYLON.Vector3(P[H.x], P[H.y] + 0.4, P[H.z]); BABYLON.MeshBuilder.CreateLines(undefined, { points: [from, crosshairs.clone()], instance: tr, updatable: true, }); return tr; } // Per-weapon bullet speed (Crackshot ≈150, EggK-47 ≈80…). Big difference // in long-range lead — fixed-time lead under/overshoots across weapons. function getProjectileSpeed(me) { try { const w = me && me[H.weapon]; if (w && w.subClass && typeof w.subClass.velocity === 'number' && w.subClass.velocity > 0) { return w.subClass.velocity; } } catch (e) {} return PROJECTILE_SPEED; } // Best-effort floor height under (x, z): cast a ray straight down from just // above the target and return the first solid hit's y. "other script" uses // the game's map-only collider (Collider.grenadeCollidesWithCell) for this; // that filtered collider isn't exposed to us, so we pick the nearest solid // below via the scene — excluding our own ESP geometry. Returns null when // the scene/ray isn't available (then the caller skips the clamp). // Reused across frames so the per-frame ground pick allocates nothing // (StateFarm's "assuming that reusing doesnt leak memory" pattern). let _groundRay = null; const _groundPredicate = (mesh) => { if (!mesh || mesh.isPickable === false) return false; if (mesh._ssh_box || mesh._ssh_tracer || mesh._ssh_pierced) return false; return true; }; // ── NATIVE MAP COLLIDER (StateFarm's ss.RAYS) ─────────────────────────── // The game exposes a grid/cell raycaster that hits ONLY map geometry — no // scene-graph traversal — which is why StateFarm has zero aim-lag. When the // bundle-discovery resolved it (H.RAYS + H.rayCollidesWithMap), we use it // for line-of-sight and the prediction ground clamp instead of // scene.pickWithRay. Returns null/undefined to signal "unavailable" so the // callers fall back to the (throttled) scene pick — no regression if the // obfuscated names didn't resolve on this bundle. function _nativeCollider() { // OPT-IN. The native LOS port has a confirmed sign/basis bug — it // reported visible enemies as blocked, so the aimbot locked onto a // farther target. Until that's debugged against the live game, default // to the proven (throttled) scene-pick path. Set // `window.SSH_USE_NATIVE = true` to re-enable the native path for // testing (pair with SSH_LOS_DEBUG to compare native vs scene). if (!unsafeWindow.SSH_USE_NATIVE) return null; const R = ss.RAYS; if (R && H.rayCollidesWithMap && typeof R[H.rayCollidesWithMap] === 'function' && R.projectileCollidesWithCell && R.grenadeCollidesWithCell) return R; return null; } // Faithful port of StateFarm getLineOfSight. true/false, or null when the // native collider isn't available. function getLineOfSightNative(me, myPos, targetPos) { const R = _nativeCollider(); if (!R) return null; try { const range = _weaponConfig(me[H.weapon]).range; if (typeof range !== 'number') return null; // me→target direction (StateFarm negates getDirectionVectorFacingTarget). const dir = { x: targetPos.x - myPos.x, y: targetPos.y - myPos.y, z: targetPos.z - myPos.z }; const rot = BABYLON.Matrix.RotationYawPitchRoll(_calcYaw(dir), _calcPitch(dir), 0); const directionVector = BABYLON.Matrix.Translation(0, 0, range).multiply(rot).getTranslation(); const position = BABYLON.Matrix.Translation(0, 0.1, 0).multiply(rot) .add(BABYLON.Matrix.Translation(myPos.x, myPos.y + 0.3, myPos.z)).getTranslation(); const hit = R[H.rayCollidesWithMap](position, directionVector, R.projectileCollidesWithCell); const distToMap = hit ? BABYLON.Vector3.DistanceSquared(position, hit.pick.pickedPoint) : Infinity; const tp = new BABYLON.Vector3(targetPos.x, targetPos.y, targetPos.z); return BABYLON.Vector3.DistanceSquared(position, tp) < distToMap; } catch (e) { return null; } } // Native floor height under (x,z): cast straight down with the map collider. // Returns a number, null (no hit), or undefined (native unavailable). let _natGroundOrigin = null, _natGroundDir = null; function getGroundYNative(x, z, fromY) { const R = _nativeCollider(); if (!R) return undefined; try { if (!_natGroundOrigin) { _natGroundOrigin = new BABYLON.Vector3(); _natGroundDir = new BABYLON.Vector3(0, -60, 0); } _natGroundOrigin.copyFromFloats(x, fromY + 0.5, z); const hit = R[H.rayCollidesWithMap](_natGroundOrigin, _natGroundDir, R.grenadeCollidesWithCell); return (hit && hit.pick && hit.pick.pickedPoint) ? hit.pick.pickedPoint.y : null; } catch (e) { return undefined; } } function getGroundY(x, z, fromY) { const ny = getGroundYNative(x, z, fromY); if (ny !== undefined) return ny; // native resolved (number, or null = no hit) if (!ss.SCENE || typeof BABYLON === 'undefined') return null; try { if (!_groundRay) { _groundRay = new BABYLON.Ray( new BABYLON.Vector3(x, fromY + 0.5, z), new BABYLON.Vector3(0, -1, 0), 60); } else { _groundRay.origin.copyFromFloats(x, fromY + 0.5, z); } const pick = ss.SCENE.pickWithRay(_groundRay, _groundPredicate); return (pick && pick.hit && pick.pickedPoint) ? pick.pickedPoint.y : null; } catch (e) { return null; } } // Lead prediction — faithful port of StateFarm's `predictPosition`. // // Works in the game's PER-TICK units (gravity -0.012/tick², terminal fall // 0.29/tick, +1-tick lead bias). Reads the game's native velocity vector // (player.dx/.dy/.dz) and the network position (H.x/y/z) rather than // deriving velocity from mesh deltas — this is what StateFarm does and is // what the user asked to replicate. Returns the predicted WORLD position to // aim at; the y is gravity-integrated and clamped to the floor when the // target is airborne, left at the network y when grounded. function predictPositionSF(player, me) { const base = { x: player[H.x], y: player[H.y], z: player[H.z] }; try { const meMesh = me[H.actor] && me[H.actor][H.mesh]; const pMesh = player[H.actor] && player[H.actor][H.mesh]; if (!meMesh || !pMesh) return base; const mp = meMesh.position, tp = pMesh.position; // Native per-tick velocity. dx/dy are usually plain props; dz can be // minified, so fall back to the discovered H.dz key, then 0. const vx = (typeof player.dx === 'number') ? player.dx : 0; const vy = (typeof player.dy === 'number') ? player.dy : 0; const vz = (typeof player.dz === 'number') ? player.dz : (typeof player[H.dz] === 'number') ? player[H.dz] : 0; const cfg = _weaponConfig(me[H.weapon]); const bulletSpeed = (cfg && typeof cfg.velocity === 'number' && cfg.velocity > 0) ? cfg.velocity : PROJECTILE_SPEED; // Mesh-based 3D distance (StateFarm distancePlayers, yMultiplier 1). const dist = Math.hypot(tp.x - mp.x, tp.y - mp.y, tp.z - mp.z); const timeDiff = dist / bulletSpeed + 1; // ticks (+1-tick lead bias) const nx = base.x + vx * timeDiff; const nz = base.z + vz * timeDiff; let ny = base.y; // Terminal-velocity model: StateFarm caps (vx, 0.29, vz) to the // terminal speed (0.29/tick) and takes -y as the terminal fall — so // the faster you move horizontally, the slower you fall. Replicated // here since the game's Math.capVector3 isn't exposed to us. const TERMINAL = 0.29; const cmag = Math.hypot(vx, TERMINAL, vz); const cappedY = (cmag > TERMINAL) ? TERMINAL * (TERMINAL / cmag) : TERMINAL; const terminalVelocity = -cappedY; // Only predict vertical motion when airborne (onGround === 0). When // grounded, y stays at the network y (it won't change). if (player.onGround == 0) { const g = -0.012; // per-tick² const timeAccel = Math.min(timeDiff, (terminalVelocity - vy) / g); const predictedY = vy * timeAccel + timeAccel * timeAccel * g / 2 + ny + terminalVelocity * Math.max(timeDiff - timeAccel, 0); // Throttle the ground pick like LOS — floor height under a target // barely moves across 3 frames, so reuse it instead of re-picking. let groundY; const gc = player._ssh_gy; if (gc && (_frame - gc.f) < PICK_THROTTLE) { groundY = gc.y; } else { groundY = getGroundY(nx, nz, Math.max(ny, predictedY)); player._ssh_gy = { f: _frame, y: groundY }; } ny = Math.max(groundY != null ? groundY : 0, predictedY) - 0.072; _pred.airborne = true; } else { _pred.airborne = false; } _pred.active = true; _pred.speed = Math.hypot(vx, vy, vz); _pred.t = timeDiff; _pred.leadDist = Math.hypot(nx - base.x, nz - base.z); return { x: nx, y: ny, z: nz }; } catch (e) { return base; } } // Line-of-sight test — faithful in spirit to StateFarm's getLineOfSight: // cast a ray from our eye toward the target and report whether the MAP // blocks it. StateFarm uses the game's map-only collider; that filtered // collider isn't exposed to us, so we pick against the scene and skip // (a) our own ESP/marker geometry and (b) skinned character meshes — walls // and floors aren't skinned, so excluding skinned meshes leaves map // geometry as the only occluder. Returns true when nothing solid is closer // than the target (or when the scene/ray isn't available to test). // Reused across the (now lazy, rank-ordered) LOS checks so each pick // allocates nothing — same reuse pattern as getGroundY. let _losRay = null; const _losPredicate = (mesh) => { if (!mesh || mesh.isPickable === false) return false; if (mesh._ssh_box || mesh._ssh_tracer || mesh._ssh_pierced) return false; if (mesh.skeleton) return false; // character model, not the map return true; }; // Per-frame callback counter — drives raycast throttling below. let _frame = 0; // Frames a scene-pick result is reused before recomputing. The LOS / ground // raycasts are the ONLY heavy work in the aim path and they run every frame // RMB is held — but neither state changes meaningfully frame-to-frame, so // recomputing at ~20 Hz (every 3rd frame at 60 fps) instead of 60 Hz cuts // the aim-lag ~3× while being visually imperceptible. (StateFarm avoids the // pick entirely via the game's native map collider; this is the cheap fix.) const PICK_THROTTLE = 3; // Throttled + cached wrapper around the real (expensive) scene pick. function hasLineOfSight(me, player) { const c = player._ssh_los; if (c && (_frame - c.f) < PICK_THROTTLE) return c.v; const v = _rawLineOfSight(me, player); player._ssh_los = { f: _frame, v }; return v; } function _rawLineOfSight(me, player) { if (typeof BABYLON === 'undefined') return true; try { const meMesh = me[H.actor] && me[H.actor][H.mesh]; const pMesh = player[H.actor] && player[H.actor][H.mesh]; if (!meMesh || !pMesh) return false; // Prefer the game's native map collider (StateFarm) — a cheap grid // lookup, no scene-graph traversal. null → not available, fall back. const nv = getLineOfSightNative(me, meMesh.position, pMesh.position); if (nv !== null) return nv; if (!ss.SCENE) return true; const ex = meMesh.position.x, ey = meMesh.position.y + 0.3, ez = meMesh.position.z; const to = pMesh.position; const dx = to.x - ex, dy = to.y - ey, dz = to.z - ez; const dist = Math.hypot(dx, dy, dz); if (dist <= 0.001) return true; const ux = dx / dist, uy = dy / dist, uz = dz / dist; // Skip the first ~1.2 units so our own (rigid, non-skinned) gun // viewmodel / body right at the origin can't register as a wall. const skip = Math.min(1.2, dist * 0.5); const len = dist - skip; if (!_losRay) { _losRay = new BABYLON.Ray(new BABYLON.Vector3(), new BABYLON.Vector3(), len); } _losRay.origin.copyFromFloats(ex + ux * skip, ey + uy * skip, ez + uz * skip); _losRay.direction.copyFromFloats(ux, uy, uz); _losRay.length = len; const pick = ss.SCENE.pickWithRay(_losRay, _losPredicate); if (!pick || !pick.hit) return true; // Visible if the first solid hit is essentially at/past the target. return pick.distance >= len - 1.0; } catch (e) { return true; } } // Nyx-tag banner: visible until the local player's in-game name starts // with "Nyx" (case-insensitive). The banner lives inside the menu and is // hidden once the player adopts the tag — no menu spam after they // comply. Hidden also when the menu itself is hidden via backtick. function updateNyxBanner() { if (!nyxBannerEl) return; const name = _aim.me && typeof _aim.me.name === 'string' ? _aim.me.name : ''; const hasTag = name.toLowerCase().startsWith('nyx'); nyxBannerEl.style.display = hasTag ? 'none' : ''; } // ──────────────────────────────────────────────────────────────────────── // AUTO REPLY — trigger-word → canned response map. If an incoming message // contains one of these substrings, we fire back the matching line. First // match wins, so order matters slightly. // ──────────────────────────────────────────────────────────────────────── const CHAT_RESPONSES = { "aimbot": "if i had aimbot id at least let u live longer for fun", "cheater": "the only thing rigged here is how bad u are", "cheat": "the only thing rigged here is how bad u are", "hacker": "no hacks, just a skill gap u could fall into", "hack": "no hacks, just a skill gap u could fall into", "hax": "no hacks, just a skill gap u could fall into", "report": "report me, then report urself for that aim", "bot": "im the bot? u died to the same corner 4 times", "esp": "walls are more of a suggestion to me", "script": "the only script here is the one where u lose", "noob": "u play like the tutorial gave up on u", "1v1": "1v1? id feel bad charging u for the lesson", "ez": "ez? u missed three shots typing that", "gg": "gg for u means 'got grilled'", "nice": "i know, i clip everything i do", "trash": "ur the reason the respawn button has wear marks", "lag": "blaming lag is just slow-motion coping", "mad": "i live rent free in ur killcam", "angry": "ur anger is delicious, keep going", "lol": "laugh louder, it wont raise ur k/d", "weird": "your weird", "lmao": "glad my aim is funny to u", "spam": "this isnt spam, its a newsletter", "mute": "mute me, the scoreboard still talks", "ban": "ban me and ill haunt the lobby", "skill": "u have a skill: dying on schedule", "camp": "ud lose to a wall that shoots back", "why": "why? because the eggs demanded it", "hello": "oh look, the practice target can type", "hey": "hey yourself, now hold still", "u r": "ok, then prove it", "you r": "ok, then prove it", "you are": "ok, then prove it", "you're": "ok, then prove it", "bye": "leaving? tell the respawn screen i said hi", "rip": "press F, then press respawn, then press F again", "good": "good? im offensively good", "bad": "calling me bad while feeding me ur whole team, bold", "stop": "stop? i havent even started", "im": "yeah, u are", "i am": "yeah, u are", "i'm": "yeah, u are", "team": "i am the whole team, u are decoration", "carry": "ur team carries u like a body bag", "clutch": "i dont clutch, i schedule wins", "miss": "u miss so much the eggs feel safe near u", "shoot": "i shoot first and apologize never", "egg": "scrambled, just like ur aim", "gun": "my gun has a phd, urs has a participation trophy", "sus": "the only sus thing here is ur accuracy", "fake": "im 100% real and 200% better than u", "slow": "im not slow, im savoring the win", "fast": "too fast for u, too smart for the lobby", "win": "winning is just my default setting", "lose": "losing is a u problem, not a me problem", "quit": "quit now, save the killcam some embarrassment", "afk": "im not afk, im letting u catch up (u wont)", "ping": "my ping is fine, ur reflexes arent", "smurf": "im not smurfing, im just built like this", "owned": "owned, operated, and franchised", "boom": "boom indeed, write that down", "moron": "big talk from someone i one-tapped twice", "admin": "admins cant ban skill, ive checked", "mod": "calling a mod wont fix that aim buddy", "loser": "i collect Ws, u collect death recaps", "toxic": "im not toxic, im just correct loudly", "rank": "ur rank is 'practice dummy', congrats", "smart": "smart enough to be in ur walls right now", "clever": "clever girl, now back to the killcam", "thank": "ur welcome for the free lesson", "please": "begging doesnt lower my accuracy", "sorry": "sorry doesnt respawn ur dignity", "help": "no amount of help saves that aim", "kill": "i collect kills like theyre on sale", "dumb": "u bring a knife to a gunfight and forget the knife", "npc": "u path around the map like the AI gave up", "troll": "im not trolling, im performing", "proof": "the proof is ur death counter", "wtf": "wtf is right, that was pure art", "yap": "keep yapping, i keep fragging", "wierd": "u spelt it wrong", "server": "the server runs on my W's", "perfect": "perfect? finally u understand me", "love": "love the support, hate the aim", "hate": "hate me harder, it boosts my fps", "dude": "dude im already behind u", "bro": "bro fell off before he respawned", "huh": "huh is what ur killcam said too", "omg": "omg right? i amaze myself daily", "damn": "damn right, screenshot it for later", "care": "i care deeply about my k/d, not u", "leave": "leaving wont delete the killcam", "cope": "keep coping, the scoreboard doesnt care", "git gud": "id say git gud but thats clearly impossible for u", "try": "u tried, the eggs noticed, nobody clapped", "clown": "the circus called, u start the next match", "your mom":"leave ur mom out of this, shes the only one who watches u play", "who": "im the last name on ur killfeed, repeatedly", "name": "ull know my name from the scoreboard u keep checking", "mess": "u dont want to mess with someone already in ur walls", "chill": "ill chill when ur scoreboard does", "look": "look behind u, oh too late", "watch": "watch the killcam, its educational for u", "real": "im real, ur skill isnt", "true": "true, u are bad, glad we finally agree", "false": "false hope is all u brought today", "level": "u couldnt level the playing field with a bulldozer", "better": "better? thats literally my whole personality", "happy": "stay happy, the respawn screen adores u", "sad": "sad part is u thought u had a shot", "flame": "i flame, u just get cooked", "girl": "cool story, now hold still", "boy": "boy fell off faster than his k/d", "test": "u failed the test, see the killfeed", "literally":"i literally dodged everything u did", "shut up": "make me, the scoreboard talks for me", "shut": "u first, ur typing is louder than ur gun", "wow": "wow is right, i impress everyone but u", "bruh": "bruh moment, go check ur deaths", "dead": "dead again? thats ur cardio for today", "die": "u die so much the respawn screen knows ur name", "ugly": "the ugliest thing here is ur aim", "clip": "i clipped u twice, want the link", "washed": "u look washed, go hit the showers", "ratio": "ratio? check the scoreboard, i already won", "mald": "keep malding, it heats my gpu", "rekt": "rekt, rinsed, and refunded", "free": "free kills, courtesy of u, thanks", "easy": "easy, like reading ur panic", "baby": "baby steps wont save that aim", "kid": "go to bed kid, the eggs are past ur curfew", "diff": "the diff between us is the whole scoreboard", "cry": "cry me a respawn timer", "salt": "pass the salt, ur basically a shaker now", "cap": "no cap, ur the worst on this server", "choke": "u choke harder than dial up internet", "throw": "nice throw, the enemy team says thanks", "feed": "keep feeding, im basically full now", "ego": "my ego is earned, urs is rented", "brain": "ur brain buffers like ur aim", "iq": "ur iq and ur k/d are tied, both low", "lucky": "luck? i make mine, u borrow urs", "nerf": "they cant nerf raw talent sorry", "broken": "im not broken, ur just fragile", "unfair": "unfair is just how good i am, yeah", "sweat": "i sweat trophies, u sweat excuses", "tryhard": "tryhard? i try once, u hard-lose", "main": "i main winning, whats urs, dying?", "potato": "nice potato aim, fries incoming", "wallhack":"no wallhack, ur just predictable", "snipe": "snipe? i blink and ur gone", "scrub": "scrub a dub, back to the lobby with u", "headshot":"headshot? thats just my default setting", "frag": "another frag for the highlight reel", "wiped": "wiped like a dirty whiteboard", "glhf": "glhf, the hf part is just for u", "rematch": "rematch? i never finished the first humbling", "revenge": "revenge arc cancelled, u lose again", "default": "default skin, default skill, makes sense", "based": "based? im the entire foundation", "cringe": "the cringe is u typing instead of dodging", "facts": "facts: ur glued to the bottom of the board", "bozo": "bozo behavior, never change", "goofy": "goofy aim AND goofy attitude, impressive", "touch grass":"touch grass right after u touch a single shot", "skill issue":"skill issue, certified and notarized by me", "yapping": "yap less, aim more, maybe", "snitch": "snitches get clutched on", "rage": "i can smell the rage quit from here", "alt": "an alt account still cant buy u aim", "garbage": "garbage? recycling pickup is thursday", "dogwater":"dogwater aim, certified soggy", "clap": "clapped, cheeks included", "human": "im more human than u, and im not sure ur one", "robot": "beep boop, still outclassing u", "boosted": "boosted? only thing boosted is my fps", "seethe": "seethe harder, it heats my room", "delulu": "delulu is the only solulu for u", "yikes": "yikes, even the eggs winced", "oof": "oof, say hi to the respawn screen again", "mid": "mid? nah ur sub-mid, im elite", "cooked": "u got cooked, well done even", "fraud": "fraud? the scoreboard is notarized", "clueless":"clueless and aimless, rough combo", "what": "what? exactly, ur lost", "sup": "sup, came to lose again?", "yo": "yo, came to feed me?", "hi": "hi, welcome to ur own killcam", "wyd": "wyd? carrying this lobby, u?", "hbu": "hbu? still losing i see", "brb": "brb? take ur time, ill keep winning", "wb": "wb, the killcam missed u", "gn": "gn, dream about my aim", "gm": "gm, ready to lose all day?", "ty": "ty for the free kills", "np": "np, carrying is my cardio", "yw": "yw for the lesson", "idk": "idk how ur this bad either", "idc": "idc, the scoreboard does though", "ikr": "ikr, im built different", "nvm": "nvm, u wouldnt get it", "omw": "omw to ur spawn, hold still", "tbh": "tbh ur kinda bad, offense intended", "ngl": "ngl watching u play is comedy", "btw": "btw ur still losing", "smh": "smh, shaking my head at ur aim", "lmk": "lmk when u land a shot, ill wait", "wait": "wait? i dont do patience", "really": "really. painfully really", "bet": "bet, watch this killcam", "nah": "nah, ur staying bad", "yeah": "yeah, i carry, glad u noticed", "okay": "okay? cool, now hold still", "cool": "cool? im ice cold, watch", "where": "where? right behind u", "when": "when? right after i respawn u", "maybe": "maybe try aiming next time", "sure": "sure, keep dreaming champ", "exactly": "exactly, finally u get it", "fine": "fine? ur barely functional", "haha": "haha glad ur deaths amuse u too", "agree": "agree, im cracked, glad we settled it", "yes": "yes, i am that good, glad we agree", "no": "no? the scoreboard says otherwise", "?": "great question, the leaderboard has ur answer", }; // Read the newest line in the game's chat log (#chatOut). StateFarm parses // children[0] = "name: " and children[1] = message text; we mirror that but // fall back to splitting the row text on the first colon if the structure // differs across builds. function sshReadLastChat() { const out = document.getElementById('chatOut'); if (!out || !out.children.length) return null; const row = out.children[out.children.length - 1]; if (!row) return null; let name = '', text = ''; if (row.children && row.children.length >= 2) { name = (row.children[0].textContent || '').replace(/:\s*$/, '').trim(); text = (row.children[1].textContent || '').trim(); } else { const raw = (row.textContent || '').trim(); const i = raw.indexOf(':'); if (i > -1) { name = raw.slice(0, i).trim(); text = raw.slice(i + 1).trim(); } else { text = raw; } } return { name, text }; } // Triggers tried longest-first, so the most specific match wins (e.g. // "shut up" beats "shut", "cheater" beats "cheat"). Computed once. const CHAT_KEYWORDS = Object.keys(CHAT_RESPONSES).sort((a, b) => b.length - a.length); // Smarter than a naive substring scan: short triggers (<=3 chars like // "no", "ban", "egg") must match a WHOLE word — plus a trailing "s" for // plurals — so they stop firing inside "now", "banana", "egghead". Longer // triggers still substring-match, so stems like "cheating" -> "cheat" and // "reporting" -> "report" keep working. Returns the response or null. function sshHandleChat(text) { const low = text.toLowerCase(); const words = new Set(low.split(/[^a-z0-9]+/).filter(Boolean)); const phrase = ' ' + [...words].join(' ') + ' '; // for multi-word triggers for (const kw of CHAT_KEYWORDS) { if (kw === '?') { if (text.includes('?')) return CHAT_RESPONSES[kw]; continue; } if (kw.indexOf(' ') !== -1) { // multi-word phrase ("shut up") if (phrase.includes(' ' + kw + ' ')) return CHAT_RESPONSES[kw]; } else if (kw.length <= 3) { // short → whole word (+ plural) if (words.has(kw) || words.has(kw + 's')) return CHAT_RESPONSES[kw]; } else { // long → substring (catches stems) if (low.includes(kw)) return CHAT_RESPONSES[kw]; } } return null; } // ──────────────────────────────────────────────────────────────────────── // AUTO CHAT — send a message into game chat the way a player would. // ──────────────────────────────────────────────────────────────────────── // Ported from the StateFarm client's sendChatMessage: open the native chat // box via extern.startChat(), drop the text into the #chatIn field, then // fire an Enter keydown to submit. Using the game's own input + submit path // (rather than crafting a packet) keeps it indistinguishable from typing. function sshSendChat(text) { const chatIn = document.getElementById('chatIn'); if (!chatIn) return false; try { const extern = unsafeWindow.extern; if (!extern || typeof extern.startChat !== 'function') return false; extern.startChat(); chatIn.value = text; chatIn.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true, cancelable: true, })); return true; } catch (e) { return false; } } // ──────────────────────────────────────────────────────────────────────── // PER-FRAME CALLBACK — ESP refresh + aim // ──────────────────────────────────────────────────────────────────────── unsafeWindow[CB_NAME] = function (vars) { try { _frame++; // drives raycast throttling (see PICK_THROTTLE) Object.assign(ss, vars); if (!ss.PLAYERS) return false; // Find local player (the one with the .ws WebSocket attached). let me = null; for (const P of ss.PLAYERS) { if (P && P.hasOwnProperty('ws')) { me = P; break; } } if (!me) return false; // Cache the local player's uniqueId for set_mouse_params (see // normalizeMouseSensitivity). It's a stable string id on MYPLAYER. if (me[H.uniqueId] != null) _mouseParamsId = me[H.uniqueId]; // Discover the obfuscated `actor` key dynamically — it's whichever // key on the player object has a `.mesh` child, excluding the // weapon key (whose `.mesh` is the gun model, NOT the body — // picking it up made our velocity tracker derive from gun-tip // motion and sent the lead in the gun's facing direction). // Always run the scan — if H.actor was previously set to the // weapon key, the guard `me[H.actor].mesh` would otherwise pass // and the bad key would stick. const actorKey = findKeyWithProperty(me, H.mesh, [H.weapon]); if (actorKey && actorKey !== H.actor) { log('actor key resolved:', H.actor, '→', actorKey); H.actor = actorKey; } // One-time scene tweak: clear the depth buffer between rendering // group 0 (world) and group 1 (our boxes/tracers). if (ss.SCENE && !ss.SCENE._ssh_depthCleared && typeof BABYLON !== 'undefined') { try { ss.SCENE.setRenderingAutoClearDepthStencil(1, true, true, true); ss.SCENE._ssh_depthCleared = true; log('depth-clear enabled for renderingGroupId=1 (see through walls)'); } catch (e) { log('depth-clear setup failed:', e && e.message); } } // Crosshair convergence point: 5 units in front of the camera, so // tracer lines from each enemy visually fan out from the center of // your view. let crosshairs = null; const cur = getCurrentYawPitch(); if (cur && typeof BABYLON !== 'undefined' && me[H.actor] && me[H.actor][H.mesh]) { crosshairs = new BABYLON.Vector3(); crosshairs.copyFrom(me[H.actor][H.mesh].position); crosshairs.y += 0.4; const yaw = cur.yaw; const pitch = -cur.pitch; const off = -5; crosshairs.x += Math.sin(yaw) * Math.cos(pitch) * off; crosshairs.y += Math.sin(pitch) * off; crosshairs.z += Math.cos(yaw) * Math.cos(pitch) * off; } // ── ESP cleanup sweep ── // The main loop below only visits players who are STILL valid // enemies. Anyone who left the match (gone from ss.PLAYERS) or // switched onto our team would otherwise keep an orphan box at // their last position forever. Build the set of who should // currently have ESP, then dispose everything else we're tracking. const _shouldHaveEsp = new Set(); for (const P of ss.PLAYERS) { if (!P || P === me) continue; if (me.team !== 0 && P.team === me.team) continue; _shouldHaveEsp.add(P); } for (const P of _espPlayers) { if (!_shouldHaveEsp.has(P)) disposeEspFor(P); } // ── ESP boxes + tracers + nametags ── const wantStyle = settings.espBoxStyle === 'corners' ? 'corners' : 'full'; for (const P of ss.PLAYERS) { if (!P || P === me) continue; if (me.team !== 0 && P.team === me.team) continue; if (!P[H.playing]) { if (P._ssh_box) P._ssh_box.visibility = 0; if (P._ssh_tracer) P._ssh_tracer.visibility = 0; restoreNameSprite(P); continue; } // The hex this enemy should use right now (Nyx → nyxColor, else // espColor). Cache the last-applied hex so we only touch mesh // colors when the user changes a picker or a Nyx joins. const hex = espHexFor(P); const col = hexToColor3(hex); // Rebuild the box if the user switched box style. if (P._ssh_box && P._ssh_boxStyle !== wantStyle) { try { P._ssh_box.dispose(); } catch (e) {} P._ssh_box = null; } const box = ensureEspBox(P); if (box) { box.position.x = P[H.x]; box.position.y = P[H.y]; box.position.z = P[H.z]; box.visibility = settings.espEnabled ? 1 : 0; } // Apply color once per change to box + tracer. if (P._ssh_colorHex !== hex) { if (P._ssh_box) P._ssh_box.color = col; if (P._ssh_tracer) P._ssh_tracer.color = col; P._ssh_colorHex = hex; } if (crosshairs) { const tr = updateEspTracer(P, crosshairs); if (tr) { tr.visibility = settings.espEnabled ? 1 : 0; tr.color = col; } } // Name tags — enlarge + see-through-walls on the game's native // sprite (StateFarm style); restore it when the toggle is off. if (settings.nameTags) applyNameSprite(P, me); else restoreNameSprite(P); } // Anti-bloom RNG verifier (no-op unless window.SSH_BLOOM_DEBUG). // Runs every frame so it can see the seed advance on each shot. bloomDebugTick(me); // Reset per-frame state read by the overlay. _aim.hasLock = false; _aim.me = me; // Clear aim-smoothing memory when we're not aiming so the next // engage snaps onto target instantly instead of easing in from a // stale cached point. (Auto Aim counts as always-aiming.) const _aiming = (RMB || settings.autoAim) && settings.aimEnabled; if (!_aiming) _aim.smoothTarget = null; _pred.enabled = !!settings.predEnabled; _pred.active = false; _pred.airborne = false; _pred.speed = 0; _pred.t = 0; _pred.leadDist = 0; _pred.projSpeed = getProjectileSpeed(me); // ── Aim: RMB held (or Auto Aim on) + aimbot enabled → snap to the // best enemy ── // Target mode: "Target Crosshair" ON picks the enemy nearest your // crosshair (smallest angle); OFF picks the nearest by (y-weighted) // 3D distance. Either way the visibility filter applies: prefer // enemies with line-of-sight, and with "Only Visible" ON never // target one behind a wall (otherwise fall back to the best overall). if (_aiming) { const meMesh = me[H.actor] && me[H.actor][H.mesh]; if (meMesh && meMesh.position) { const meP = meMesh.position; // Camera-forward unit vector — only needed for crosshair mode. let fwdX = 0, fwdY = 0, fwdZ = 0, haveFwd = false; if (settings.crosshairTarget) { const cur = getCurrentYawPitch(); if (cur) { const cp = Math.cos(cur.pitch); fwdX = -Math.sin(cur.yaw) * cp; fwdY = Math.sin(cur.pitch); fwdZ = -Math.cos(cur.yaw) * cp; haveFwd = true; } } let bestVis = null, bestVisMesh = null; let bestAny = null, bestAnyRank = Infinity, bestAnyMesh = null; // First pass: rank every enemy with cheap math only — NO // line-of-sight raycasts here. Collect candidates so we can // resolve visibility lazily, in rank order, afterward. const _cands = []; for (const P of ss.PLAYERS) { if (!P || P === me) continue; if (!P[H.playing]) continue; if (me.team !== 0 && P.team === me.team) continue; const pMesh = P[H.actor] && P[H.actor][H.mesh]; if (!pMesh || !pMesh.position) continue; const pp = pMesh.position; const ex = pp.x - meP.x, ey = pp.y - meP.y, ez = pp.z - meP.z; // Rank, lower = better. Crosshair mode → angular distance // from the crosshair (1 - dot, 0 = dead-on). Else the // (y-weighted ×2) 3D distance, which prefers an enemy on // your level over one above/below at the same range. let rank; if (haveFwd) { const elen = Math.hypot(ex, ey, ez) || 1; rank = 1 - (fwdX * ex + fwdY * ey + fwdZ * ez) / elen; } else { rank = Math.hypot(ex, ey * 2, ez); if (rank <= 0) continue; // self / exact overlap } if (rank < bestAnyRank) { bestAnyRank = rank; bestAny = P; bestAnyMesh = pp; } _cands.push({ P, pp, rank }); } // Second pass: only NOW spend raycasts, and only when "Only // Visible" is on — otherwise visibility never affects the pick, // so there's no reason to cast. Walk candidates from best rank // down and stop at the first with line of sight — typically 1 // pickWithRay per frame instead of one per enemy. if (settings.onlyVisible) { _cands.sort((a, b) => a.rank - b.rank); for (let i = 0; i < _cands.length; i++) { if (hasLineOfSight(me, _cands[i].P)) { bestVis = _cands[i].P; bestVisMesh = _cands[i].pp; break; } } } // Always lock the CLOSEST enemy (best rank), so we never skip a // near target to chase a visible one across the map. "Only // Visible" narrows that to the nearest enemy with line of sight; // off, it's the nearest enemy outright (walls ignored). let best, bestMeshPos; if (settings.onlyVisible) { best = bestVis; bestMeshPos = bestVisMesh; } else { best = bestAny; bestMeshPos = bestAnyMesh; } if (best && bestMeshPos) { // Aim point: prediction ON → StateFarm's network-velocity // lead solve; OFF → the target's current mesh position. let aimX, aimY, aimZ; if (settings.predEnabled) { const pred = predictPositionSF(best, me); aimX = pred.x; aimY = pred.y; aimZ = pred.z; } else { aimX = bestMeshPos.x; aimY = bestMeshPos.y; aimZ = bestMeshPos.z; _pred.active = false; } // Aim-point smoothing — absorbs the ~20 Hz network-coord // stepping so the predicted point (and the camera) don't // jitter. Reset on target switch so the first snap is // instant. This filters the target/prediction only, never // the aim motion itself (see memory). const AIM_SMOOTH = 0.35; if (_aim.smoothTarget !== best) { _aim.smoothTarget = best; _aim.smoothX = aimX; _aim.smoothY = aimY; _aim.smoothZ = aimZ; } else { _aim.smoothX += (aimX - _aim.smoothX) * AIM_SMOOTH; _aim.smoothY += (aimY - _aim.smoothY) * AIM_SMOOTH; _aim.smoothZ += (aimZ - _aim.smoothZ) * AIM_SMOOTH; aimX = _aim.smoothX; aimY = _aim.smoothY; aimZ = _aim.smoothZ; } // Direction to target — StateFarm's getDirectionVectorFacingTarget // with offsetY -0.05; yaw/pitch via the shared calc helpers // (atan2(x,z) basis, pitch clamped %1.5). const dirV = { x: -(aimX - meP.x), y: -(aimY - meP.y - 0.05), z: -(aimZ - meP.z), }; let targetYaw = _calcYaw(dirV); let targetPitch = _calcPitch(dirV); // Anti-bloom: shift the aim by the predicted bloom // deflection (StateFarm applyBloom, multiplier +1) so the // gun's scatter throws the bullet onto the real target. if (settings.antiBloom) { const b = predictBloom(me, targetYaw, targetPitch); targetYaw += b[0]; targetPitch += b[1]; if (unsafeWindow.SSH_BLOOM_DEBUG) { log('[bloom] predicted offset deg: yaw', (b[0] * _RAD2DEG).toFixed(3), 'pitch', (b[1] * _RAD2DEG).toFixed(3)); } } _aim.hasLock = true; // With mouseSpeed pinned to 50 (normalizeMouseSensitivity, // "THE FIX"), movementX*SENSITIVITY == yaw exactly, so ONE // synthetic move snaps onto target. The old 5× loop did 5× // the WASM round-trips (get_yaw_pitch + set_mouse_params + // synthetic pointer event) every frame — the main lag source. setToYawPitch(targetYaw, targetPitch); } } } // Item ESP sweep — runs every frame so markers track items that // existed before our spawnItem hook installed (pre-join state), // and cleans up markers whose item became inactive via any // code path the collectItem hook didn't catch. if (settings.itemEsp && ss.items && ss.items.pools && typeof BABYLON !== 'undefined') { const seen = new Set(); for (let t = 0; t < ss.items.pools.length; t++) { const pool = ss.items.pools[t]; if (!pool || typeof pool.forEachActive !== 'function') continue; const poolColor = (t === 0 ? ESP_COLOR_AMMO : ESP_COLOR_GRENADE); pool.forEachActive((it) => { if (!it || !it.mesh) return; seen.add(it.mesh); if (!itemMarkers.has(it.mesh)) { const pos = it.mesh.position; const m = makeItemMarker(pos.x, pos.y, pos.z, poolColor); if (m) itemMarkers.set(it.mesh, m); } }); } for (const [meshKey, marker] of itemMarkers) { if (!seen.has(meshKey)) { try { marker.dispose(); } catch (e) {} itemMarkers.delete(meshKey); } } } else if (!settings.itemEsp && itemMarkers.size > 0) { for (const marker of itemMarkers.values()) { try { marker.dispose(); } catch (e) {} } itemMarkers.clear(); } // ── Auto chat: trigger-word replies + spammer ── // Both modes funnel a single line into `_chatPending`, which a shared // send gate flushes — so they respect one flood cooldown and never // talk over each other. Skipped while the player is typing in chat // (don't clobber a real message) and while the game's flood limit is // active (chatLines climbs past ~2 when you've sent too fast). if (settings.autoChat || settings.chatResponder) { const chatIn = document.getElementById('chatIn'); const typing = chatIn && document.activeElement === chatIn && chatIn.style.visibility === 'visible'; const flooded = me.chatLines > 2; // game-side rate limit const now = Date.now(); const delay = Math.max(1000, Number(settings.autoChatDelay) || 4000); // (1) Responder: react to the newest incoming chat line, once. if (settings.chatResponder) { const last = sshReadLastChat(); if (last && last.text) { const sig = last.name + '