Address the only added clippy warning in fork Actions run 36914579707; preserve name matching before the read and fallback after its error.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The runner's default --bin is target/play/iw4l, and its pre-flight check
calls is_file() on that path. On Windows the build writes iw4l.exe, so
`make approved` stopped with "target/play/iw4l is not built" right after
building it. stage_binary already falls back to .exe, but the check runs
first. Append EXE_SUFFIX to the default; it is empty on unix.
The pre-flight now names target/play/iw4l.exe. A full run with
`ARGS='--bin target/play/iw4l.exe'`, the path the default now gives,
passed 47/47 assertions on Windows.
Since 38aa9cf (match flow run from the game scripts) the common walk
captures every common_mp XModel as a scene model, because the scripts
spawn models by name: 736 of them on mp_rust. FxModelCatalog::capture
then decoded the same XModels a second time for the FX catalog, from the
same stream, script strings and materials. Both catalogs are pruned only
after the map walk, so two copies of every skeleton were live through
the load.
The common walk now decodes each XModel once and gives the scene
catalog's Arc<ModelSkel> to the FX catalog through
FxModelCatalog::capture_shared. The load result does not change: the
world report lines and the GSC fingerprint of mp_rust are the same as
before the patch.
mp_rust on Windows, IW4L_COUNTING_ALLOC=1, live heap in MiB, warm
artifact cache (baseline -> patched):
common set, after common_assets/common_mp 3,605 -> 2,612
highest value in the asset stages, before install 4,454 -> 3,460
heap_mib on the "load complete" line 7,388 -> 6,395
The first baseline run, with a cold cache, read 3,609 / 4,605 / 7,469.
The match bootstrap set allow_debug_actions to true for every match.
The host therefore accepted the debug actions from any peer.
Add the --cheats launch switch for map, serve and menu.
The switch sets the HostCheats resource. The match install reads it.
Cheats are off when the switch is absent.
Pass --cheats in make map, the live recipes and the scripted harnesses.
macOS ships bash 3.2, which has no mapfile, and expanding an empty
array under `set -u` fails before bash 4.4. With rustfmt on PATH the
hook therefore aborted every commit there once `cargo xtask mr
new|fmt|ship` had installed it.
Read `git diff --name-only` with a while-read loop, the way the
context/ check above it already reads its list. Behaviour is unchanged.
tool_on_path only looked for a file named exactly like the tool. On
Windows rustup installs rustfmt.exe, so `cargo xtask mr fmt` stopped at
"rustfmt not on PATH" even with rustfmt installed, and require_tools
and the other PATH checks had the same blind spot.
Also try name + EXE_SUFFIX, which is empty on unix, so nothing changes
there.
Scoped weapons hold breath with recovery feedback and sound. Riot shields
block and deflect bullets in hand and on the back; explosive crossbow bolts,
destructible map cars with round resets, and T5 map model collision work.
Remote players show last stand, weapon change, jump, mantle, landing,
ladder and stun animations, and server hitboxes follow the shared torso tree.
GSC gains spectator follow cameras, chat, kick, vehicle paths and flight
controls, physics spheres, slow motion, slide and mantle movers, damage
triggers, music, ambience, rumble and live audio fades over a shared mixer.
IW5 and T5 maps get sun shadows with per-stage sun selection; post-fx
pipelines compile before a vision blend needs them. The lobby browser keeps
focus and selection, and rooms can be password protected. Console supply
and give commands search every item category. Frames and replays decode
only the current wire protocol.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restore the akimbo sprint/reload and rapid weapon-cycle behavior needed for
wrist twist and righty tighty. Independent sprint checks previously replaced
one hand's reload animation while processing the other hand.
Prepare both hands and decay their timers before making one shared sprint
transition decision. Follow the original MW2 state checks: firing,
rechambering or melee in either hand can block the transition, while the
primary hand determines whether both hands enter or leave sprint. This
preserves the left reload pose through a rapid weapon-cycle cancellation
without a dedicated wrist-twist animation exception.
Allow combined use/reload to coexist with akimbo sprint while the primary
hand is not reloading. Account for the RELOAD bit added by the current
client when no interaction is targeted. Once the primary hand reloads,
restore normal sprint interruption so reloading both weapons cannot trigger
the left-only wrist twist. Keep ordinary reload-button sprint interruption.
Validation: play build, targeted formatting and diff checks passed. A
temporary probe matched 1,922 state/flag combinations against the original
MW2 sprint-decision instruction block. Lifecycle probes covered left-only,
right-only and both-hand reloads with tapped and held input, including ammo
completion and non-restarting reload timers. Rapid weapon cycling and the
previous held-fire/reload regression probes passed. The user confirmed the
resulting behavior in game. No temporary probes are included.
Reload requests were only accepted on a new button press, so holding reload
could not restart it after firing or canceling a weapon switch. Semi-auto
fire also required a new press even when a reload had rearmed the weapon.
Evaluate the held reload request through the existing reload eligibility
checks. Use the semi-auto shot count to gate firing, resetting it on trigger
release and reusing the existing resets during reloads and weapon changes.
Holding fire alone still produces one semi-auto shot, while holding fire
and reload repeats the shot/reload cycle. Holding reload through a double
weapon switch restarts the reload when the weapon becomes eligible again.
The shared simulation change applies to keyboard and controller input.
Validation: play build, targeted rustfmt and diff checks passed. Temporary
probes reproduced both failures before the change and passed afterward,
including normal and fast reloads, canceled and completed weapon switches,
semi-auto release/repress, reload eligibility, bolt actions and both akimbo
hands. The user confirmed the resulting behavior matches MW2 in game.
Temporary probes are excluded from the commit.
Holding aim originally allowed zooming throughout a reload. The blanket
reload-state restriction added in a2093b9 overcorrected this by blocking
ADS until the entire reload finished, delaying the return to aim compared
to MW2.
Replace that restriction with the original engine's ADS fraction logic.
Decode WeaponDef::iPositionReloadTransTime from IW4 assets and carry it
through the weapon catalog, combat facts and shared movement context.
Include the field in the simulation content fingerprint.
Magazine reloads suppress ADS while remaining weapon time exceeds the
weapon's authored transition window. Segmented reloads suppress ADS during
the start and insertion states, then use that window during reload end.
Keep ADS intent available so holding aim resumes the blend at the original
boundary. The comparison uses weapon-timer milliseconds, preserving the
existing Sleight of Hand timer scaling without an extra fixed delay.
Validation: play build, targeted formatting and diff checks passed. A
temporary reference probe compared 4,704 cases against the original
MW2/IW4x instruction block at 0x4a84ab..0x4a8513, including transition
boundaries and segmented reloads. Runtime traces verified authored windows
and early ADS recovery on M9, USP, Intervention and Barrett with Sleight
of Hand. The user confirmed the resulting behavior in game.
Temporary diagnostics and probes are excluded. The runtime test encountered
the previously observed shutdown SIGSEGV after process_exit code=0; this
change does not address that shutdown issue.
The shared ADS permission check excluded weapon switches, melee and offhand
states but omitted the reload family. Holding or requesting ADS during a
reload could therefore keep raising the weapon and zooming the view.
Reject ADS throughout Reloading, ReloadingInterrupt, ReloadStart,
ReloadStartInterrupt and ReloadEnd using the existing weapon-state helper.
The normal ADS intent/fraction update then lowers the weapon at its ADS-out
rate and prevents re-entry until the reload ends. The same permission check
runs in authoritative simulation and client prediction, covering keyboard
reload and controller use/reload without changing their bindings.
Validation: play build, targeted rustfmt and diff checks passed. A temporary
probe reproduced the permissive behavior with the previous implementation,
then verified ADS exit and blocked entry for all five reload states with
RELOAD and USE_RELOAD inputs. It also checked ADS recovery when ready and
preserved firing/rechamber permissions. No in-game visual retest was run.
The weapon simulation fires the right akimbo hand with THROW and the left
with ATTACK. Default controller bindings therefore fired the opposite hand:
RT used ATTACK while LT used speed_throw.
Port the hand-mapping behavior from the local Xbox branch to the unified
binding system. Resolve akimbo state from the predicted local player, with
a presented-snapshot fallback, and swap controller attack/speed_throw actions
when installing gameplay bindings. Preserve saved bindings, keyboard/mouse
controls and unrelated controller actions. Lefty and custom layouts follow
their assigned fire/aim actions rather than hard-coded physical triggers.
Use the existing binding-change path to release the old action and block a
held button until release when switching between single and dual weapons.
Validation: play build and diff checks passed. A temporary probe covered
right/left/both triggers, releases, normal fire/ADS bindings, Lefty and custom
assignments, mouse preservation, and release-before-remap weapon transitions.
No physical-controller gameplay retest was performed.
The turn-speed limit scaled with sensitivity while acceleration scaled
with FOV. Increasing sensitivity therefore lengthened the ramp, unlike
the local IW4x controller implementation.
Scale acceleration by the base controller sensitivity multiplier instead
of FOV, matching IW4x's default 1200 degrees/s squared times sensitivity.
Keep ADS and FOV scaling on the requested turn speed. Ramp the absolute
speed before applying the requested direction, matching IW4x's integrator
when the stick reverses direction during a ramp. Deceleration and disabled
acceleration remain immediate.
Validation: the play build, targeted rustfmt and diff checks passed.
A temporary reference probe passed 216 combinations of sensitivity, FOV,
ADS blend, frame rate and acceleration mode, including direction reversals,
release and disabling acceleration. No game relaunch or physical-controller
feel test was performed.