Repository navigation
Releases: Dudiebug/halfsword-multiplayer-mod
Release list
v0.4.0-pre5: fixes from the fourth two-player test, level props synced
Pre-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.
v0.4.0-pre4: fixes from the third two-player test
Pre-release: fixes from the third two-player test. Not yet re-tested on two machines. Every offline check passes: build with -Werror, 38 unit test programs under ASan/UBSan, a 300k-input protocol fuzz, 560/560 mutants killed, and the DLL export check. Protocol revision 11, the same as pre3: a pre3 player can still join, but both players need this version, because each machine fixes the copies of the other players it shows.
Fixed
- Forged weapons, shields, punches and kicks did nothing on the other screen. The mod only counted procedural weapons as weapons. Blows from the forged sword or the shield were blocked instead of sent, never clashed, and their drops were lost. All of them count now. Punches and kicks are weapon blows too, with friendly fire and kill credit like any weapon.
- Floating shield, and "he lost his weapon but could still hit me". The other player's copy on your screen let go of its weapon by itself. The weapon then floated, or vanished from that copy's hand, while the real player still held it and still landed blows. The copy can no longer let go by itself. If a weapon still slips out, it is put back in the hand, or falls to the floor normally.
- Weapon changes did not show. Picking a weapon up, switching weapons or putting one away should now show on the other screen within about half a second, 2 s at worst.
- The game got slower round after round. Every respawn left the old body's feet, cut-off fists and sheathed weapons in the level as loose physics objects. They are removed now. Whether this was the whole cause of the slowdown is not known yet.
New in the log
Every 5 s, HSMMod.log now also shows the cost of the mod's game-event hooks, how many weapons and objects are in the level, and counters for weapon pickups and drops on the other players' copies. Please send both logs 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.
Known limits
- Level props (barrels, debris) are not synced; each machine simulates its own.
- 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.
- The grab pull is a soft handle, not the game's own grab constraint.
Please report bugs with the HSMMod.log from both machines.
dwmapi.dll SHA-256: fef5d04f539dc422db02939911d6c1b658ca03f97b13772379263099ac9f5e35
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.
v0.4.0-pre3: fixes from the second two-player test
Pre-release: fixes from the second two-player test. Not yet re-tested on two machines. Every offline check passes: build with -Werror, 37 unit test programs under ASan/UBSan, a 300k-input protocol fuzz, 516/516 mutants killed, and the DLL export check. Protocol revision 11: everyone must update. v0.4.0-pre2 cannot join this version.
Fixed
- Extra NPCs on the client, and no match HUD. The client ignored the match info of Duel and Zombies matches, so it never knew a match was running. It now takes them, removes the level's own foes and its old bodies, and shows the round status, scoreboard, respawn countdown and spectating.
- Hits with no bone. The game sometimes reports a hit without a bone. The other machine used to refuse these hits; it now applies them.
- Dead bodies. The host no longer tries to remove already-destroyed bodies every second.
- Multiplayer button. It no longer disappears after opening and closing Settings.
- Multiplayer page. It is now a full-screen page with Lobby, Match settings and Map columns. You choose the map from a list of the maps the mode allows.
New in the log
Every 5 s, HSMMod.log now also shows how much of each frame the mod itself takes, a count of the fighters in the level (dead, fallen, knocked out, bleeding), and how hard the first hits landed on each side. This is to find out why the client slowed down in the last test. Please send both logs 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.
Known limits
- The client's frame rate dropped during fights in the last test; the cause is not found yet.
- A weapon picked up from the floor stays a loose prop on other screens and can trail the hand a little.
- A weapon moved to the other side's sheath (right-hand weapon into a left slot) is not mirrored.
- The grab pull is a soft handle, not the game's own grab constraint.
- Level props are not synced.
Please report bugs with the HSMMod.log from both machines.
dwmapi.dll SHA-256: 08275ba6c858c46164f0d6257cda6431ba91c7eadfd26f28a7adedfe34ee1d4e
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.
v0.4.0-pre2: first spawn, blood, gore, weapons, delay (fixes from the first two-player test)
Pre-release: fixes from the first two-player test. Not yet re-tested on two machines. Every offline check passes: build with -Werror, 35 unit test programs under ASan/UBSan, a 300k-input protocol fuzz, 501/501 mutants killed, and the DLL export check. Protocol revision 10: everyone must update. v0.4.0-pre1 cannot join this version.
Fixed
- First spawn. The client used to spawn with only their weapon and could not see the host. It now waits until the level has finished its own start-up cleanup, then spawns dressed. A stand-in the game destroys is re-created.
- Severed limbs now show on both screens. The severed-parts map is now read with the correct UE 5.4 layout.
- Blood and wounds now show on both screens. The owner of the hit fighter sends what it painted, and every other machine replays it on its stand-in.
- Weapons disappearing. Drawing and sheathing are mirrored, so a drawn weapon shows in the stand-in's hand and goes back to its slot.
- Tavern screen. The game's single-player win, lose and next-fight screens, and the pause they cause, are blocked in session matches.
- Delay. The game now uses the time Steam received a pose, not the time it was read, so slow frames no longer inflate the buffer. Every 5 s,
HSMMod.logshows frame time (avg/p99) and the ping to each player.
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.
Known limits
- A weapon picked up from the floor stays a loose prop on other screens and can trail the hand a little.
- A weapon moved to the other side's sheath (right-hand weapon into a left slot) is not mirrored.
- The grab pull is a soft handle, not the game's own grab constraint.
- Level props are not synced.
Please report bugs with the HSMMod.log from both machines.
dwmapi.dll SHA-256: f4154f04727b58df3e3f823d8ecfa147b94674d7709dae31a6cad85d257312b5
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.
v0.4.0-pre1: owner sync, native hits, gore, grabs (untested in two-player)
Pre-release — not yet tested in a two-player match. Every offline check passes (build with -Werror, 31 unit test programs under ASan/UBSan, 300k-input protocol fuzz, DLL export check), but owner sync, hit replay, gore, grabs and dropped weapons have not been played on two machines yet. Expect bugs; please report them with the HSMMod.log from both machines.
What's in this build
- Owner sync (default): each player's own machine simulates their own fighter, so your body has no added latency. Other players are physics stand-ins driven by a 60 Hz pose stream with a jitter buffer.
- Hits through the game's own damage code: the attacker claims a hit on the stand-in; the victim's machine replays it on its own fighter through the game's damage function (armour, wounds, bleeding, knockouts, deaths as in solo).
- Gore: severed limbs, stuck blades and dislocations mirrored on stand-ins.
- Grabs: the held player's machine pulls the grabbed bone toward the grabber's hand; pulling 130 uu away for 0.4 s breaks free.
- Dropped weapons: leased (free / touch / hold) and streamed so everyone sees the same loose weapon.
- Steam lobbies, up to 6 fighters with their own loadouts, match modes, chat and spectating.
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.
Known limits
The grab pull is a soft handle, not the game's grab constraint; level props are not synced; a weapon picked back up stays a loose prop on other screens; a late joiner doesn't see weapons that were already lying free.
dwmapi.dll SHA-256: 498ababdb33bd56133bf88f57e085ec26c44908939d50d23150e798edde35b0c
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.