<feed xmlns='http://www.w3.org/2005/Atom'>
<title>hl2h/src/cinput.cpp, branch master</title>
<subtitle>Simple internal C++ cheat for HL2 for GNU/Linux.
</subtitle>
<id>https://git.2137697.xyz/hl2h/atom?h=master</id>
<link rel='self' href='https://git.2137697.xyz/hl2h/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/'/>
<updated>2026-11-06T15:19:25Z</updated>
<entry>
<title>Hooks: central vtable install with restore support</title>
<updated>2026-11-06T15:19:25Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-11-06T15:19:25Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=9f0724dcd25a06c5674d30d045dc485a341253b1'/>
<id>urn:sha1:9f0724dcd25a06c5674d30d045dc485a341253b1</id>
<content type='text'>
Move vtable patching into hooks.cpp: one call clones the table, validates every
slot, records the originals and installs the clone. Installs happen from the
setup, game and paint threads, so the bookkeeping is mutex-protected.

Client, CInput, IVModelRender, IStudioRender and ISurface all use it, and
hooks_restore_all() can now put every interface back (previously impossible).
</content>
</entry>
<entry>
<title>Fix audit findings: crash safety, correctness, rendering, performance</title>
<updated>2026-11-06T15:09:55Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-11-06T15:09:55Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=33f5ed9ef58f26c6b3b52cf605dd4311d658a60d'/>
<id>urn:sha1:33f5ed9ef58f26c6b3b52cf605dd4311d658a60d</id>
<content type='text'>
Crash/UB:
- gate every hook behind an init-stage flag until config/surface/input are ready
- publish module maps as immutable atomic snapshots instead of reallocating
  shared vectors under unlocked readers
- validate the %ebp walk in the RandomSeed/RandomFloat hooks against the stack
- bounds-check every RecvTable/RecvProp/string dereference with module_range()
- preserve the Itanium vtable header when cloning (client, CInput, model render,
  studio render)
- reject negative usercmd sequence numbers; guard config_load against a null
  section target; cap the bone parent walk; check mprotect; drop PROT_EXEC on
  the GOT patch; absorb server.so .bss tail

Correctness:
- filter dormant entities across ESP, aimbot, triggerbot, melee, items and
  projectiles (slot self-tested against the local player)
- reset the server-health latch per map and only latch on valid model indices
- bone cache sized for the 128-target scan; set valid=false on every failure;
  head_position keeps searching past an invalid bone
- vischeck steps past glass by probing until clear, and ignores entities owned
  by the target (held weapons, bone followers)
- aimbot: maxs no longer disables it, AABB-aware FOV prefilter, lock hysteresis,
  lead point re-checked for FOV and visibility
- spread: seed hook arms on the no-spread toggle alone; engine toggle only
  controls the RandomFloat zeroing
- resolve m_hOwnerEntity/m_hOwner; NPC lead velocity from the server entity
- vector_angles pitch range, point_ground normal test, underwater jump+duck no
  longer skips combat, semi-auto press/release edge for synthetic fire
- item/projectile markers and blast rings refresh origin per frame while
  discovery stays at 10 Hz; trajectory uses the real m_DmgRadius and honours
  the blast-radius toggle

Rendering/GUI:
- one overlay draw per engine frame (FRAME_RENDER_START boundary), fixing
  alpha stacking and the speed-graph flicker
- clipped lines/outlines and ellipsised text instead of drawing past the
  content pane or shifting over neighbours
- dropdown dismissal consumes the click; hover ignores hidden controls
- chams: reset AlphaModulate, reference shared materials once, restore prop
  tint colour; fonts created once per handle
- projection uses Source's 4:3 aspect scaling and roll; screen size refreshed
  each frame; FOV circle gated on the aim toggles, not the bind

Performance:
- TTL caches for NPC relation, friendly/neutral and damage class
- model names memoised per model index
- entity pointer -&gt; index cache for the triggerbot (was a 4096-slot walk/tick)

Build:
- real Makefile with -MMD dependency tracking, debug/release objects and an
  always-relink rule; build.sh kept as a thin wrapper
</content>
</entry>
<entry>
<title>Logging: per-session file and debug-gated verbose logs</title>
<updated>2026-10-28T11:24:10Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-10-28T11:24:10Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=16546e5818408f35adc60c2d937cf4541ff7840a'/>
<id>urn:sha1:16546e5818408f35adc60c2d937cf4541ff7840a</id>
<content type='text'>
- Open /tmp/hl2hake.log once in the library constructor with "w" so each
  session starts clean, use line buffering, flush each line, and close it via
  atexit. No more fopen/fclose per message.
- Add logd() for verbose diagnostics, enabled only with HL2H_DEBUG=1.
- Move ESP/NPC scans, item-prop/item-classification logs, aimbot/silent-aim/
  melee/triggerbot/spread details, jumpbug tracking, bone dumps, netvar dumps,
  cmd-modified and ground-trace noise to logd().
- Keep logf() for lifecycle, config, warnings/errors, GUI open/close, item
  category/tagging summaries and item-crate detections so crate debugging
  works without the ESP stream.
- Supply crates now respect the max-distance slider (user change), with the
  stale comment and CONTEXT updated.
- Document HL2H_DEBUG=1 in play.sh and CONTEXT.
</content>
</entry>
<entry>
<title>GUI: add on-screen toasts and atomic config writes</title>
<updated>2026-10-27T17:53:32Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-10-27T17:53:32Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=6b5425ebd35c28e20680f5f28c887b705827ba1c'/>
<id>urn:sha1:6b5425ebd35c28e20680f5f28c887b705827ba1c</id>
<content type='text'>
- Toast queue drawn in the top-right by the overlay, independent of the GUI
  being open. Info/warn/error colors and 6/9/12 s lifetimes; timers start on
  the first painted frame so startup messages are not missed.
- Queue a load toast after install_menu, plus warnings/errors for missing
  modules/interfaces/netvars, input hooks, fonts, ISurface, server datamap,
  and spread seed support.
- Toast on config reload, reset, bind/unbind and config save failure.
- Config saves now write `config.tmp`, flush, then rename it over the real
  file; failures leave the previous config intact.
- config_load reports whether a file was found so Reload can distinguish a
  successful reload from a missing file.
- Update CONTEXT and ISURFACE_STATUS for the single GUI, toasts and atomic
  config writes.
</content>
</entry>
<entry>
<title>GUI: Insert-only close, freeze mouse look at the source</title>
<updated>2026-10-27T17:21:13Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-10-27T17:21:13Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=304441c71997ee61e618146f4d4302c6d2b952ad'/>
<id>urn:sha1:304441c71997ee61e618146f4d4302c6d2b952ad</id>
<content type='text'>
Feedback pass:

- Insert now toggles the GUI; the old text tree moved to F1.
- Remove the title-bar X. Insert is the only close path; Esc only cancels
  bind capture.
- Discard accumulated mouse deltas in CInput::CreateMove before the game can
  apply them (CInput::ClearStates), so the camera no longer moves for a frame
  and snaps back. Also skip ExtraMouseSample and zero relative mouse state
  while the GUI is open.
- Strip attack/use/impulse/weapon selection from the command while open;
  keep jump, duck and walk. Skip combat command edits (spread seed) too.
- Widen System page buttons so "Reload config" and "Reset defaults" fit.
- Update CONTEXT/ADR for the Insert-only close behavior.
</content>
</entry>
<entry>
<title>Spread control: set random_seed after CInput::CreateMove</title>
<updated>2026-10-27T14:32:26Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-10-27T14:32:26Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=902507c1173a03a04fc49cfe421bc3c3fb49d8fb'/>
<id>urn:sha1:902507c1173a03a04fc49cfe421bc3c3fb49d8fb</id>
<content type='text'>
CInput::CreateMove overwrites cmd-&gt;random_seed with MD5_PseudoRandom after
CHLClient::CreateMove returns, so the seed set from the client-mode hook was
being discarded. Hook the IInput vtable slot 3 (CInput::CreateMove), call the
original, then apply the spread seed and update the verified command copy and
CRC. This also keeps all aim/movement edits since the original copies the
command into the verified table.
</content>
</entry>
<entry>
<title>ESP working: NPC detection + authoritative server-side health</title>
<updated>2026-10-26T14:33:02Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-10-26T14:33:02Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=d7edcc9d9e3d90e1c53885870461e046389dee96'/>
<id>urn:sha1:d7edcc9d9e3d90e1c53885870461e046389dee96</id>
<content type='text'>
- entitylist slot 6 (GetHighestEntityIndex); class name via
  GetClientNetworkable -&gt; GetClientClass (replaces the unsafe slot-2 call)
- HL2 SP NPCs: class CAI_BaseNPC + m_lifeState, since NPC m_iHealth is not
  networked; model names from VModelInfoClient006 for labels/friend-foe
- real HP/HP-max from the listen-server entity (IVEngineServer021 -&gt;
  PEntityOfEntIndex -&gt; edict-&gt;m_pUnk -&gt; GetBaseEntity) using offsets scanned
  from server.so's datamap; validated against the client model index
- world_to_screen via IVDebugOverlay003::ScreenPosition (fixes box drift)
- maxs sanity clamp, NPC-only debug logging, neutral colour for wildlife
- build.sh: restore -o libhl2hake.so and add server.cpp
</content>
</entry>
<entry>
<title>init</title>
<updated>2026-08-30T01:32:59Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-08-30T01:32:59Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/hl2h/commit/?id=aa096fe6886681d3338573cd3af779b57a5b56ab'/>
<id>urn:sha1:aa096fe6886681d3338573cd3af779b57a5b56ab</id>
<content type='text'>
</content>
</entry>
</feed>
