From 7afd1545a0ebd8d19d74b038cb020d6f895882e6 Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 13:07:27 -0700 Subject: [PATCH 1/8] bump multiplayer API version --- Source/MultiplayerCompat/MultiplayerCompat.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/MultiplayerCompat/MultiplayerCompat.csproj b/Source/MultiplayerCompat/MultiplayerCompat.csproj index 463575b7af..30617b2d77 100644 --- a/Source/MultiplayerCompat/MultiplayerCompat.csproj +++ b/Source/MultiplayerCompat/MultiplayerCompat.csproj @@ -42,6 +42,6 @@ - + From cbaa90ccce3a8d32269db405d116ff0a775a380d Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 13:07:58 -0700 Subject: [PATCH 2/8] Use explicit templated RegisterSyncWorker --- .../MultiplayerCompat/MultiplayerCompat.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs index 0b9ec8794e..aff4ec452b 100755 --- a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs +++ b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs @@ -62,8 +62,11 @@ public void SlowInit(ModContentPack content) } } - MP.RegisterAll(); - + MP.RegisterSyncWorker(SyncCompAmmoUser); + MP.RegisterSyncWorker(SyncCompFireMode); + MP.RegisterSyncWorker(SyncLoadout); + MP.RegisterSyncWorker(SyncLoadoutSlot); + MP.RegisterSyncWorker(SyncITab_Inventory, shouldConstruct: true); global::CombatExtended.Compatibility.Multiplayer.registerCallbacks((() => MP.IsInMultiplayer), (() => MP.IsExecutingSyncCommand), (() => MP.IsExecutingSyncCommandIssuedBySelf)); } From 1dda58ab48a0db71290c48512a397c16e376a368 Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 13:08:25 -0700 Subject: [PATCH 3/8] Cleanup imports --- Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs index aff4ec452b..83dd2b8313 100755 --- a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs +++ b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using System.Linq; using System.Reflection; using Multiplayer.API; From b755345e6b6b31fbe6fea8c6c800c77d62c40918 Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 13:09:07 -0700 Subject: [PATCH 4/8] enable nullable --- .../MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs index 83dd2b8313..e796e7cd17 100755 --- a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs +++ b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs @@ -68,6 +68,7 @@ public void SlowInit(ModContentPack content) MP.RegisterSyncWorker(SyncITab_Inventory, shouldConstruct: true); global::CombatExtended.Compatibility.Multiplayer.registerCallbacks((() => MP.IsInMultiplayer), (() => MP.IsExecutingSyncCommand), (() => MP.IsExecutingSyncCommandIssuedBySelf)); } +#nullable enable @@ -204,3 +205,5 @@ private static void SyncLoadoutSlot(SyncWorker sync, ref LoadoutSlot loadoutSlot private static void SyncITab_Inventory(SyncWorker sync, ref ITab_Inventory inventory) { } } + +#nullable restore From 0e7eaad555bbe43f118f49689248bdea2eb8824c Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 13:10:24 -0700 Subject: [PATCH 5/8] Remove SyncWorker annotations --- .../MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs index e796e7cd17..c656dee3fe 100755 --- a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs +++ b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs @@ -72,7 +72,6 @@ public void SlowInit(ModContentPack content) - [SyncWorker] private static void SyncCompAmmoUser(SyncWorker sync, ref CompAmmoUser comp) { if (sync.isWriting) @@ -108,7 +107,6 @@ private static void SyncCompAmmoUser(SyncWorker sync, ref CompAmmoUser comp) } } - [SyncWorker] private static void SyncCompFireMode(SyncWorker sync, ref CompFireModes comp) { if (sync.isWriting) @@ -144,7 +142,6 @@ private static void SyncCompFireMode(SyncWorker sync, ref CompFireModes comp) } } - [SyncWorker] private static void SyncLoadout(SyncWorker sync, ref Loadout loadout) { if (sync.isWriting) @@ -158,7 +155,6 @@ private static void SyncLoadout(SyncWorker sync, ref Loadout loadout) } } - [SyncWorker] private static void SyncLoadoutSlot(SyncWorker sync, ref LoadoutSlot loadoutSlot) { if (sync.isWriting) @@ -201,7 +197,6 @@ private static void SyncLoadoutSlot(SyncWorker sync, ref LoadoutSlot loadoutSlot // Don't sync anything, we just want a blank instance for method calling purposes // We only care about shouldConstruct being true - [SyncWorker(shouldConstruct = true)] private static void SyncITab_Inventory(SyncWorker sync, ref ITab_Inventory inventory) { } } From be6f858aaf51ff5ccde75484ab5a88cfdf0ff794 Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 13:12:48 -0700 Subject: [PATCH 6/8] Use nullable parameters to match MP's internel signatures --- .../MultiplayerCompat/MultiplayerCompat.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs index c656dee3fe..5d2af510e4 100755 --- a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs +++ b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs @@ -70,9 +70,7 @@ public void SlowInit(ModContentPack content) } #nullable enable - - - private static void SyncCompAmmoUser(SyncWorker sync, ref CompAmmoUser comp) + private static void SyncCompAmmoUser(SyncWorker sync, ref CompAmmoUser? comp) { if (sync.isWriting) { @@ -107,7 +105,7 @@ private static void SyncCompAmmoUser(SyncWorker sync, ref CompAmmoUser comp) } } - private static void SyncCompFireMode(SyncWorker sync, ref CompFireModes comp) + private static void SyncCompFireMode(SyncWorker sync, ref CompFireModes? comp) { if (sync.isWriting) { From ddde190254edd1d7f1e27b6349ef016aab306fc7 Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 13:15:34 -0700 Subject: [PATCH 7/8] Fix warnings around nullability --- .../MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs index 5d2af510e4..96023c6862 100755 --- a/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs +++ b/Source/MultiplayerCompat/MultiplayerCompat/MultiplayerCompat.cs @@ -74,7 +74,7 @@ private static void SyncCompAmmoUser(SyncWorker sync, ref CompAmmoUser? comp) { if (sync.isWriting) { - var caster = comp.parent.GetComp().PrimaryVerb.Caster; + var caster = comp?.parent.GetComp().PrimaryVerb.Caster; // Sync the turret because in that case syncing fails, due to comp.parent.Map being null, // which causes it to be inaccessible in MP for general syncing @@ -109,7 +109,7 @@ private static void SyncCompFireMode(SyncWorker sync, ref CompFireModes? comp) { if (sync.isWriting) { - var caster = comp.Caster; + var caster = comp?.Caster; // Sync the turret because in that case syncing fails, due to comp.parent.Map being null, // which causes it to be inaccessible in MP for general syncing From 56b528e9508600d9f1c687b67c73c78cad231d5d Mon Sep 17 00:00:00 2001 From: perkinslr Date: Wed, 18 Mar 2026 19:26:28 -0700 Subject: [PATCH 8/8] Check for other names for multiplayer when enabling integration --- Source/CombatExtended/Compatibility/Multiplayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/CombatExtended/Compatibility/Multiplayer.cs b/Source/CombatExtended/Compatibility/Multiplayer.cs index edb2d4df02..b093c521ae 100755 --- a/Source/CombatExtended/Compatibility/Multiplayer.cs +++ b/Source/CombatExtended/Compatibility/Multiplayer.cs @@ -13,7 +13,7 @@ public class Multiplayer : IPatch public bool CanInstall() { Log.Message("Combat Extended :: Checking Multiplayer Compat"); - return ModLister.HasActiveModWithName("Multiplayer"); + return ModLister.HasActiveModWithName("Multiplayer") || ModLister.GetActiveModWithIdentifier("rwmt.Multiplayer") != null || ModLister.HasActiveModWithName("Multiplayer [Continuous]"); } public void Install()