public override void Handle(ByteReader data) { object target = null; if (targetType != null) { target = SyncSerialization.ReadSyncObject(data, targetType); if (target == null) { return; } } object value = SyncSerialization.ReadSyncObject(data, fieldType); if (cancelIfValueNull && value == null) { return; } object index = null; if (indexType != null) { index = SyncSerialization.ReadSyncObject(data, indexType); } preApply?.Invoke(target, value); MpLog.Debug($"Set {memberPath} in {target} to {value}, map {data.MpContext().map}, index {index}"); MpReflection.SetValue(target, memberPath, value, index); postApply?.Invoke(target, value); }
public static void SupplyCrossRefs() { if (sharedCrossRefs == null) { return; } if (!loading) { Log.Warning("Tried to supply cross refs without calling ScribeUtil.StartLoading()"); return; } defaultCrossRefs ??= Scribe.loader.crossRefs.loadedObjectDirectory; Scribe.loader.crossRefs.loadedObjectDirectory = sharedCrossRefs; MpLog.Debug($"Cross ref supply: {sharedCrossRefs.allObjectsByLoadID.Count} {sharedCrossRefs.allObjectsByLoadID.LastOrDefault()} {Faction.OfPlayer}"); }
public override void Handle(ByteReader data) { object target; if (targetTransformer != null) { target = targetTransformer.Reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, targetTransformer.NetworkType)); } else { target = ReadTarget(data); } if (targetType != null && target == null) { MpLog.Debug($"SyncMethod {this} read target null"); return; } if (!instancePath.NullOrEmpty()) { target = target.GetPropertyOrField(instancePath); } var args = new object[argTypes.Length]; for (int i = 0; i < argTypes.Length; i++) { if (argTransformers[i] == null) { args[i] = SyncSerialization.ReadSyncObject(data, argTypes[i]); } } for (int i = 0; i < argTypes.Length; i++) { if (argTransformers[i] is { } trans) { args[i] = trans.Reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, trans.NetworkType)); } } if (cancelIfAnyArgNull && args.Any(a => a == null)) { return; } if (context.HasFlag(SyncContext.MapSelected) && cancelIfNoSelectedMapObjects && Find.Selector.selected.Count == 0) { return; } if (context.HasFlag(SyncContext.WorldSelected) && cancelIfNoSelectedWorldObjects && Find.WorldSelector.selected.Count == 0) { return; } beforeCall?.Invoke(target, args); MpLog.Debug($"Invoked {method} on {target} with {args.Length} params {args.ToStringSafeEnumerable()}"); method.Invoke(target, args); afterCall?.Invoke(target, args); }