Skip to content

v1.37.3

Latest

Choose a tag to compare

@LCrew LCrew released this 07 Sep 17:06

Wallhack fix.

FEAT

  • Wallhack works. Glow outlines render through walls for the holder alone, mimicking the real player via the bone-merged relay chain, alongside radar spotting. Configurable under a new Xray config section: RadarSpotting, GlowProps, GlowRealPawn, ClearIdentityFlagBit2.
  • New admin command !rolltestall [seconds]. Walks every registered modifier, applying each to the calling admin alone for a moment and announcing both the on and the off to console and chat, so a misbehaving modifier is named by the last "turning ON" line. Run again to stop.
  • !rolldebug's roll listing is broadcast to every player rather than routed through PrintToAdminsOnly, which filtered on Permission.PlayerHasPermission and so reached nobody on a server with no registered admins — exactly where it is needed.
  • Every roll is written to the console as a ROLLED line regardless of !rolldebug, and every activation, slot change and deactivation is bracketed with ACTIVATING/ACTIVATED, ADDING SLOTS/ADDED SLOTS and DEACTIVATING/DEACTIVATED breadcrumbs. A console ending in an unmatched ACTIVATING names the modifier the server was inside when it died.

BUGFIXES

  • Wallhack hard-crashed the server on activation, nine times over, always with no managed exception and no stack. Root cause: the parent GlowUpdated() notifier. CCSPlayerPawn does not replicate m_Glow as a unit — CGlowProperty carries a notifier per member — so that call marked a field path the encoder had no entry for, corrupted the entity's dirty-field bookkeeping, and returned cleanly. The fault then surfaced in whatever engine call next walked that state, which is why it appeared to move between Teleport and AcceptInput as the surrounding code was reordered while the real culprit never moved. Replaced with per-field notifiers, including GlowTypeUpdated, which had never once been called.
  • Glow props were spawned with an empty CEntityKeyValues, and the engine said so on every spawn (prop_dynamic at (0.000, 0.000, 0.000) has no model name!). Model and origin now go through the spawn keyvalues.
  • The glow prop rendered as a solid opaque model. Its render colour was new(1, 255, 255, 255), which against Color(r, g, b, a) is opaque cyan, where the intent was alpha 1 so only the outline draws. Alpha is also ignored outside a translucent mode, so the prop is now kRenderTransAlpha.
  • RemoveXrayFromSlot despawned whatever entity occupied a remembered index with no identity check. CS2 recycles entity indices, so a stale one meant despawning a live pawn, weapon or the bomb. Despawns verify the designer name first, and transmit blocks are lifted before the entity goes.
  • Deferred prop construction could outlive a deactivation, building props nothing owned or tracked. Construction is driven from the tick loop now, with no long-lived entity references held across frames.
  • !rolltoggle Wallhack produced nothing while !memodifier Wallhack worked: a global toggle leaves AssignedSlots empty, IsAssignedTo reads that as "everyone", and skipping holders at build time therefore skipped every target. Props are built for every target; who receives one is decided per viewer and per target.
  • A second player rolling Wallhack got nothing at all. SetupXray runs from OnEnabled, which by design does not re-run when a slot joins an already-active modifier. OnSlotsAdded/OnSlotsRemoved are implemented, which also covers Mimic and ButterflyEffect handing it out or taking it away mid-round.
  • Swept .IsValid across every native handle in the plugin, then hardened it further. IsValid alone only reports that a wrapper has an address, and an unresolved schema field still has one — all ones — so it returns true and the next read faults at 0xFFFFFFFFFFFFFFFF. CSRollUtils.IsUsableHandle checks IsValid and rejects 0 and -1. 69 pattern sites across 28 files, plus the unconditional dereferences the sweep could not reach: TeleportPlayer and GameModifierRecall wrote pawn.Collision with no check, GameModifierMasterZeus indexed ServerControlPoints at hardcoded 0–3 with neither validity nor bounds checking, and TryGetItemDefinitionIndex read AttributeManager.Item behind a try/catch that could only ever have caught a managed exception.
  • Removed the spin-tick sound logging and the debugMode parameter carrying it. That sound fires once per spin frame, so it buried the console whenever !rolldebug was on.