Repository navigation
v0.4.0-pre5: fixes from the fourth two-player test, level props synced
Pre-releasePre-release: fixes from the fourth two-player test, and level props synced. Not yet tested on two machines. Every offline check passes: build with -Werror, 40 unit test programs under ASan/UBSan, a 300k-input protocol fuzz, 653/653 mutants killed, and the DLL export check. Protocol revision 12: everyone needs pre5. A pre4 player cannot join a pre5 game, and a pre5 player cannot join a pre4 game.
Fixed
- No wounds or blood on the other player. The mod could not find the game's
Boneparameter (the log saidparam Bone: missing), so every wound and blood mark was dropped before it was sent. The likely cause is case: the game's names ignore case, and the mod compared them exactly. Names are now compared ignoring case, as the game does. - One blow became a storm of hits ("one-shots"). A weapon resting on or sliding along a body sent a hit for every contact, dozens a second. Now one blow is one hit. Further contacts on the same body part within a quarter second are merged, and only one clearly stronger contact still goes. A contact with no force counts once. At most 12 hits a second go from one player to another, and the receiving machine applies at most 8 per fighter per frame.
- The client got two fighters after a level load. Two spawn paths both fired after a 15 s wait. Now only the end of the level's start-up spawns the client's fighter. Why the level did not spawn the client's player in that test is not known yet. If the start-up times out, the log now says which check never passed.
- Some cuts did not show on the other screen. A cut that the game made on the machine that owns the fighter was never sent, for example the host cutting one of its own bots. Those cuts are now sent to the others and shown with the game's own cut.
- A dropped weapon could stay stuck in the hand of the other player's copy, floating and never a pickup. After 1.5 s it is now let go in any case and falls.
- A clash parried every blow for 150 ms. When two blades met, every blow from that player within 150 ms was cancelled, including kicks and the other hand's weapon. Now only the weapon that clashed is parried.
New
- Level props are synced: barrels, stools, buckets and the other loose physics props of a level. The host lists them for everyone, and each machine finds its own copy of each one. The player who touched a prop last sends where it goes, and the other machines follow. The level's random removal of some props is turned off on the client, and a prop the host's level removed is removed on the client too.
New in the log
- On the host, every 5 s, the frame line shows how many ms per frame each part of the mod costs (
pump ms/frame). This is to find what slows the host down while a fighter is down. - The level prop lists (
props: level census ...) on both machines, and level prop counters in theprops:line. - The parameter names the game uses for each hooked function (
vm: params of ...), and which level start-up check timed out.
Please send both HSMMod.log files after playing.
Install
Copy dwmapi.dll into <Half Sword>/HalfswordUE5/Binaries/Win64/, replacing any older copy. HSMMod.ini is created on first run. Everyone needs this same version and Steam game build 24185754.
Linux / Steam Deck (Proton): Proton loads its own built-in dwmapi.dll unless told otherwise. In Steam, right-click Half Sword → Properties → General → Launch Options and set:
WINEDLLOVERRIDES="dwmapi=n,b" %command%
Windows players need no launch option.
To use the older host-simulates-everyone sync, the host sets sync_mode=host under [net] in HSMMod.ini. Level props are not synced in that mode.
Known limits
- The client matches a level prop to the host's only if the prop is within about 1 m of where the host first saw it, 3 s after the level starts. A prop that has already moved further on the client stays local on that machine.
- The client turns off the level's random prop removal, but that can come too late, because the level removes props 0.1 s after it starts. Then a prop the host kept may be missing on the client. The log says which happened.
- A level prop follows the player who touched it only if the game reports the touch as a hit. Otherwise the host keeps sending where it goes.
- Grabbing another player does not move them yet.
- Armour taken off is not mirrored on the other screen.
- A pickup is shown only if this machine has its own copy of that weapon lying within about 1.5 m of where it was picked up.
- With two loose weapons of the same kind in reach, the other screen takes the nearer one, which may not be the one picked up.
- A weapon moved to the other side's sheath (right-hand weapon into a left slot) is not mirrored.
Please report bugs with the HSMMod.log from both machines.
dwmapi.dll SHA-256: c9787d453b8cc9f9c176c964e214d6de7f3e61ef38a894cb9868fa4a6ddd6d66
Contains code ported from Cyrex0/HalfSword-MP, Copyright (c) 2026 Cyrex0 and the HalfSword-MP contributors, MIT (see THIRD_PARTY_NOTICES.md, attached). Unofficial fan mod, not affiliated with Half Sword Games.