From caf690b2f06a046958fa786d2b364ecde755768f Mon Sep 17 00:00:00 2001 From: mibac138 <5672750+mibac138@users.noreply.github.com> Date: Sat, 25 Oct 2025 21:21:57 +0200 Subject: [PATCH 1/2] Fix -printsync command line option Previously it failed because SyncTransformer serialized it's fields as k__BackingField --- Source/Client/Syncing/Handler/SyncDelegate.cs | 16 ++++++------ Source/Client/Syncing/Handler/SyncMethod.cs | 26 ++++++++++++------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Source/Client/Syncing/Handler/SyncDelegate.cs b/Source/Client/Syncing/Handler/SyncDelegate.cs index 44364e8a..3ef5993b 100644 --- a/Source/Client/Syncing/Handler/SyncDelegate.cs +++ b/Source/Client/Syncing/Handler/SyncDelegate.cs @@ -1,12 +1,12 @@ -using HarmonyLib; -using Multiplayer.API; -using Multiplayer.Common; -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; +using HarmonyLib; +using Multiplayer.API; using Multiplayer.Client.Util; +using Multiplayer.Common; using Verse; namespace Multiplayer.Client @@ -68,7 +68,7 @@ protected override void WriteTarget(object target, object[] args, SyncMethodWrit var path = fieldPaths[i]; if (fieldTransformers[i] is SyncTransformer tr) - writer(tr.Writer.DynamicInvoke(val, target, args), tr.NetworkType, path); + writer(tr.writer.DynamicInvoke(val, target, args), tr.networkType, path); else if (!fieldTypes[i].IsCompilerGenerated()) { var type = (SyncType)fieldTypes[i]; @@ -92,7 +92,7 @@ protected override object ReadTarget(ByteReader data) object value; if (fieldTransformers[i] is SyncTransformer tr) - value = tr.Reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, tr.NetworkType)); + value = tr.reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, tr.networkType)); else if (fieldType.IsCompilerGenerated()) value = Activator.CreateInstance(fieldType); else @@ -188,12 +188,12 @@ public override void Validate() { for (int i = 0; i < fieldTypes.Length; i++) if (fieldTransformers[i] is SyncTransformer tr) - ValidateType($"Field {fieldPaths[i]} type", tr.NetworkType); + ValidateType($"Field {fieldPaths[i]} type", tr.networkType); else if (!fieldTypes[i].IsCompilerGenerated()) ValidateType($"Field {fieldPaths[i]} type", fieldTypes[i]); for (int i = 0; i < argTypes.Length; i++) - ValidateType($"Arg {i} type", argTransformers[i]?.NetworkType ?? argTypes[i]); + ValidateType($"Arg {i} type", argTransformers[i]?.networkType ?? argTypes[i]); } public override string ToString() diff --git a/Source/Client/Syncing/Handler/SyncMethod.cs b/Source/Client/Syncing/Handler/SyncMethod.cs index c10dc7ba..0abe4ca2 100644 --- a/Source/Client/Syncing/Handler/SyncMethod.cs +++ b/Source/Client/Syncing/Handler/SyncMethod.cs @@ -1,16 +1,22 @@ -using HarmonyLib; -using Multiplayer.API; -using Multiplayer.Common; using System; using System.Linq; using System.Reflection; +using HarmonyLib; +using Multiplayer.API; using Multiplayer.Client.Util; +using Multiplayer.Common; using MultiplayerLoader; using Verse; namespace Multiplayer.Client { - public record SyncTransformer(Type LiveType, Type NetworkType, Delegate Writer, Delegate Reader); + public class SyncTransformer(Type liveType, Type networkType, Delegate writer, Delegate reader) + { + public Type liveType = liveType; + public Type networkType = networkType; + public Delegate writer = writer; + public Delegate reader = reader; + } public delegate void SyncMethodWriter(object obj, SyncType type, string debugInfo); @@ -108,7 +114,7 @@ void SyncObj(object obj, SyncType type, string debugInfo) } if (targetTransformer != null) - SyncObj(targetTransformer.Writer.DynamicInvoke(target, target, args), targetTransformer.NetworkType, "Target (transformed)"); + SyncObj(targetTransformer.writer.DynamicInvoke(target, target, args), targetTransformer.networkType, "Target (transformed)"); else WriteTarget(target, args, SyncObj); @@ -118,7 +124,7 @@ void SyncObj(object obj, SyncType type, string debugInfo) for (int i = 0; i < argTypes.Length; i++) if (argTransformers[i] is { } trans) - SyncObj(trans.Writer.DynamicInvoke(args[i], target, args), trans.NetworkType, $"Arg {i} {argNames[i]} (transformed)"); + SyncObj(trans.writer.DynamicInvoke(args[i], target, args), trans.networkType, $"Arg {i} {argNames[i]} (transformed)"); int mapId = map?.uniqueID ?? ScheduledCommand.Global; writer.Log.Node("Map id: " + mapId); @@ -142,7 +148,7 @@ public override void Handle(ByteReader data) object target; if (targetTransformer != null) - target = targetTransformer.Reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, targetTransformer.NetworkType)); + target = targetTransformer.reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, targetTransformer.networkType)); else target = ReadTarget(data); @@ -163,7 +169,7 @@ public override void Handle(ByteReader data) for (int i = 0; i < argTypes.Length; i++) if (argTransformers[i] is { } trans) - args[i] = trans.Reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, trans.NetworkType)); + args[i] = trans.reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, trans.networkType)); if (cancelIfAnyArgNull && args.Any(a => a == null)) return; @@ -305,10 +311,10 @@ public static SyncMethod LocalFunc(Type parentType, string parentMethod, string public override void Validate() { - ValidateType("Target type", targetTransformer?.NetworkType ?? targetType); + ValidateType("Target type", targetTransformer?.networkType ?? targetType); for (int i = 0; i < argTypes.Length; i++) - ValidateType($"Arg {i} type", argTransformers[i]?.NetworkType ?? argTypes[i]); + ValidateType($"Arg {i} type", argTransformers[i]?.networkType ?? argTypes[i]); } public override string ToString() From f6eef976c6616c43a4cf62fcea5a46d6a3808eb7 Mon Sep 17 00:00:00 2001 From: mibac138 <5672750+mibac138@users.noreply.github.com> Date: Sat, 25 Oct 2025 21:26:32 +0200 Subject: [PATCH 2/2] Remove unused SyncTransformer.liveType It's an internal API, so we can freely change it --- Source/Client/Syncing/Handler/SyncDelegate.cs | 2 +- Source/Client/Syncing/Handler/SyncMethod.cs | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Source/Client/Syncing/Handler/SyncDelegate.cs b/Source/Client/Syncing/Handler/SyncDelegate.cs index 3ef5993b..991993fe 100644 --- a/Source/Client/Syncing/Handler/SyncDelegate.cs +++ b/Source/Client/Syncing/Handler/SyncDelegate.cs @@ -149,7 +149,7 @@ public ISyncDelegate TransformField(string field, Serializer
  • (int index, Serializer(Serializer if (!skipTypeCheck && targetType != typeof(Live)) throw new Exception($"Target transformer type mismatch for {this}: {targetType} != {typeof(Live)}"); - targetTransformer = new(typeof(Live), typeof(Networked), serializer.Writer, serializer.Reader); + targetTransformer = new(typeof(Networked), serializer.Writer, serializer.Reader); return this; }