RijiN GMod — Development Update
Early August 2026
Loader builds v669 → v715 · Actively maintained P2C
Early August 2026
Loader builds v669 → v715 · Actively maintained P2C
Where this picks up
The last update covered v482 → v668. This one covers everything since: v669 → v715.
Headline items this window: a new Multipoint aimbot mode, NPC aiming rebuilt for servers that hide their NPCs behind bonemerged models, a 300–400 FPS anti-screengrab fix, and a Lua-layer bug that had quietly disabled several player filters for a long time.
Current shipping target: loader v715. Pull a fresh loader.exe from Download; do not redistribute builds.
Note: settings version moved 36 → 38 during this window, so saved configs reset to defaults once. Re-select your options and save. The rule for when a bump is actually required is now documented in-tree so it stops happening for no reason.
1. Multipoint (new)
Aimbot → Targets → Multipoint: Off / Low / Medium / High / Extreme.
Instead of only testing the centre of a hitbox, the aimbot samples an
n³ grid inside the resolved studio box and takes the best visible point — so a head behind a railing, a crate edge or a corner is still reachable through whatever sliver is exposed.- Ordering is the selection logic — samples are sorted by distance from the box centre, so the deepest-inside point is tried first and a point near a face is only reached when everything safer is occluded.
- Samples stay off the faces (0.80 → 0.94 of the half-extents). Our bones and the server's rebuilt bones never agree to the unit, so a sample sitting exactly on the surface is a coin flip.
- Anchored on the frame the aim landed in — DrawModelExecute cache, rebased backtrack history and NPC velocity lead all carry over to every sample. If the anchor is more than 64u off the resolved box, multipoint declines to run rather than inventing points in empty space.
- Per-CreateMove trace budget — backtrack multiplies records × hitboxes × samples, so the cap is global per tick rather than per call.
- High and Extreme are accuracy-first and will cost FPS. Said plainly in the menu. They also drop the early-out that rejects a target when the direct ray hits a wall — that early-out is wrong around a corner, and removing it is what finds those shots.
Multipoint visualizer (Visuals → Other → Multipoint points): draws every sample the aimbot scanned — green taken, red traced and blocked, grey never reached. A green marker far from the box centre means everything nearer was occluded; a field of grey means the trace budget is your limit, not visibility.
2. NPCs — aiming at things the server hides
Reported as "the aimbot always shoots Ghouls and Nightmares in the stomach". The cause turned out to be structural, and it took reading the server's Lua dump to find.
Death Legends does not reskin an NPC — it hides it and draws a second entity on top:
Code:
self:AddEffects(bit.bor(EF_BONEMERGE, EF_BONEMERGE_FASTCULL, EF_PARENT_ANIMATES))
pPlayer:SetRenderMode(RENDERMODE_NONE) -- the real NPC
self:DrawModel() -- the override, bonemerged to it
The real NPC is
RENDERMODE_NONE, so DrawModelExecute never fires for it and our bone cache stayed empty. Every posed hitbox lookup failed and the aim fell through to the collision hull centre — which is chest height. It was never picking the stomach hitbox; it had no hitboxes at all.- Read the bones the engine still builds — the bonemerge has to be driven by something, so the NPC's skeleton is live in
CBoneAccessoreven when nothing draws. Read-only. - Aim at the real NPC, not the override — the server hitregs the NPC's own studio boxes; the override is client visuals.
- Hitboxes now ranked by world Z — the old height-band proxy compared each box's centre in its own bone's space, which sits near zero for every box on a rig. That comparison was noise, and it is why "head" landed on a torso box for any model without HL2 hitgroups.
- NPC names — Fast Zombie, Poison Zombie, Antlion Guard and friends instead of
CAI_BaseNPCfor everything. - NPC aim uses real studio hitboxes from the render bone matrices, not hull-height guesses, and no longer walks the whole entity list every frame.
NPC classification is now structural, not name matching. ZS ships both
zombiegasses and npcgases — chasing spellings was never going to converge. A target now has to look like a living creature: health, plus a real rig with multiple bones and hitboxes. Gas volumes, markers and props carry a placeholder model and fail that regardless of what they are called.The one case structure cannot decide is a helper that clones the creature's model, like
status_npc_overridemodel. Those are rejected by EF_BONEMERGE — a bonemerged entity's skeleton is driven by a parent, so it is a decoration by definition.3. Performance
- Anti-screengrab: 300–400 FPS back (v699) — the grabber-texture check ran on every render-target bind, and Source rebinds RTs hundreds of times a frame (water, refraction, RT cameras, glow). Each call cost two
VirtualQuerykernel transitions plus ten bounded string walks. An ITexture's name never changes, so the verdict is now resolved once per texture and the steady state is a pointer compare. Detection behaviour is unchanged. - Aimbot hitbox resolve memoized — resolving a hitgroup costs several virtual calls and up to four full hitbox loops when a custom model omits HL2 groups, and the aimbot asks for the same box dozens of times per tick across hitbox scan, backtrack records and multipoint. Now answered once per model.
- Occlusion probes reused within a frame — the FOV pre-pass and the deep scan probe the same shortlist inside one CreateMove; the second pass was re-tracing for an answer it already had, 1–3 rays per candidate every tick.
- FOV pass rebuilt — the view forward vector was being recomputed 13 times per entity from identical input. Hoisted out, ranking moved to cosine space (no
acosexcept on survivors), plus a bounding-sphere bound that skips 12 of the 13 samples for anyone far off the crosshair. - FOV worker thread removed — after the above, the whole pass is a few microseconds even for a full lobby, while a wake/join round trip costs more than that in latency. CreateMove cares about latency, not throughput. Also removes an
INFINITEwait on the game thread. - NPC ESP idle cost — no more scanning 256 entities per frame with nothing on the map.
4. Context silent aim
Context is meant to be its own method: aim travels in the networked world-click fields and your view angles stay real. Several things were quietly undermining that.
- Context now owns
worldclicking/worldclickdirectionand nothing else. It also no longer chokes packets — that is Serverside's mechanism and it was leaking across. - The aimbot no longer writes view angles for Context. The nospread inverse still has to be solved about the fire direction, so there is now exactly one paired scope that stages it and restores your look for the same command, instead of the write and the undo living two hooks apart.
- Autostrafe fix — Context restored "look" from the wrong command. Autostrafe encodes its wish direction by overwriting that yaw, so while strafing Context was putting the strafe wish yaw on the wire, skipping movement rebase, and making the mouse-delta rebuild fire for an angle change that never happened.
- Five copies of the "is Context owning the wire" test unified into one. None of the copies in the anti-cheat compatibility layer checked whether the aimbot was even enabled, so a stale Context selection switched hard-aim and aim-reversal protection off with no visible control.
- New CONTEXT AIM status line — WORLD-CLICK ACTIVE, FALLBACK · ZS EYEANGLES, or FALLBACK · WORLDCLICK OFF. Whether Context was carrying the aim or had silently fallen back used to be invisible in game.
Worth knowing: Context is narrower than the menu suggests. It needs a server that leaves world clicking enabled and a weapon that aims through
GetAimVector. Zombie Survival is structurally excluded — ShootBullets aims from EyeAngles, so the world-click direction is ignored for bullets no matter what. Plenty of sandbox servers also call Player:DisableWorldClicking(true) through prop protection. In all of those the fallback to fire-gated viewangle silent is the only thing that can land a shot, and the panel now tells you which one you are in.5. Lua layer — a long-standing dead path
This started as "the build mode ignore flag does not work" and turned out to be much bigger.
is_lua_entity()returns false for every remote player on current GMod. It gated the entire player Lua fetch, so user group, staff detection, LuaTeam(), DarkRP gang/party and build mode were all dead. Nothing looked broken because every one of those fails open — names fall back to engine player info, user group resolves to "not staff", gang and party come back false. Build mode was simply the first consumer that needed a positive answer.- A Lua stack over-pop on the method-resolution failure path produced Engine Error
Lua stack over/popped!— clean exit, no crash dump. Latent for a long time behind the gate above. - Refresh race — Lua data was cleared on a timer while the fetch itself is budgeted to three players per call, so on a populated server everyone waiting their turn sat with all Lua flags cleared. For build mode that reads as "not building".
Build mode detection now covers two addons: CFC PvP (
Player:IsInBuild) and ULX Buildmode, which exposes no method at all and only sets a networked bool. Builders are skipped by the aimbot, and a new Build mode ESP flag shows BUILD / PVP per player.6. Chams, visuals and config safety
- History chams honour the chams team filter — allies' backtrack ghosts were still drawing with "ignore teammates" on.
- studiorender crash after history chams — restoring the old bone counter after a ghost pose had already been drawn left the next live draw on a stale cache. The restore now invalidates instead.
- Torn
ITexture::GetNamepointers during chams/glow RT rebinds could return a pointer whose bits are ASCII path fragments; treating that as a C string was an access violation. Never walked during our own binds now. - Config loader fix — local presets were read straight into the live config and only then version-checked, so a stale preset was already committed, reinterpreted under the new layout, by the time the load reported failure.
- Custom model hitboxes — DrawModelExecute box centres are now preferred for models with bone manipulators, where raw studio boxes pick a different local box than the renderer and the server see.
7. Reverse engineering (verified against current binaries)
Both re-confirmed against the 27 July 2026
client.dll / server.dll and written into the in-tree docs so they stop being re-litigated:m_bDisableWorldClicking= 0x34FD — read straight out of the client RECVINFO registration, with its neighbours cross-checked. So a "world clicking off" reading is truthful, not a stale offset.- Client and server
CUserCmddiffer by 4 bytes — the server insertsserver_random_seed, so every field frommouse_xonward shifts. World clicking is at0x3Eclient-side and0x42server-side. Using the server offsets on the client is a real historical bug that killed tracers, decals and gunshot sounds, so this one is now documented in both directions.
8. Commit trail
Code:
v709-v715 Dead Lua player fetch (is_lua_entity), Lua stack over-pop,
ULX build mode, build-mode ESP flag
v700-v708 Context world-click isolation, psilent gate unification,
autostrafe/Context yaw fix, netvar + CUserCmd RE verification
v692-v699 Hidden bonemerged NPC bones, world-Z hitbox ranking,
structural NPC classifier, anti-screengrab 300-400 FPS
v674-v691 Multipoint, aimbot perf (bbox memo, occlusion memo, cosine FOV),
NPC names + NPC aim, custom NPC support, nospread dialects
v670-v673 Aimbot FOV pre-pass, peek amortize, crowd targeting
v669 Second-connect Lua GetTable reference crash
9. What we want from you
- Pull a fresh loader — this write-up ships as v715.
- Re-save your config once; the settings version moved during this window.
- Report crashes with the RijiN fault dialog / dump path (
%USERPROFILE%\Documents\rijinX64\crash_dumps\). - Report detection privately via Support — include AC, server, time and build number.
- Do not redistribute
loader.exe, private DLLs or configs. Redistribution is a ban.
Still WIP, said plainly
Context remains situational by design — it only works where the server actually consumes world-click aim. Multipoint High and Extreme trade frames for accuracy on purpose. Menu polish and some rage tooling are still in progress. Priority order stays: stability → correct bullets → FPS → undetection → UI chrome.
— RijiN GMod · We ship fixes, not excuses.