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 override void Handle(ByteReader data) { object target = Activator.CreateInstance(delegateType); for (int i = 0; i < fieldPaths.Length; i++) { string path = fieldPaths[i]; string noTypePath = MpReflection.RemoveType(path); Type fieldType = fieldTypes[i]; object value; if (fieldType.IsCompilerGenerated()) { value = Activator.CreateInstance(fieldType); } else { value = Sync.ReadSyncObject(data, fieldType); } if (value == null) { if (cancelIfAnyNullBlacklist != null && !cancelIfAnyNullBlacklist.Contains(noTypePath)) { return; } if (path.EndsWith("$this")) { return; } if (cancelIfNull != null && cancelIfNull.Contains(noTypePath)) { return; } } if (removeNullsFromLists != null && removeNullsFromLists.Contains(noTypePath) && value is IList list) { list.RemoveNulls(); } MpReflection.SetValue(target, path, value); } if (context.HasFlag(SyncContext.MapSelected) && cancelIfNoSelectedObjects && Find.Selector.selected.Count == 0) { return; } object[] parameters = Sync.ReadSyncObjects(data, argTypes); MpLog.Log("Invoked delegate method " + method + " " + delegateType); method.Invoke(target, parameters); }
public override void Bind(object obj, string name) { object value = MpReflection.GetValue(obj, name); Type type = value.GetType(); var res = SyncSerialization.ReadSyncObject(reader, type); MpReflection.SetValue(obj, name, res); }
// todo what happens on exceptions? public static void FieldWatchPostfix() { if (Multiplayer.Client == null) { return; } while (watchedStack.Count > 0) { FieldData data = watchedStack.Pop(); if (data == null) { break; // The marker } SyncField handler = data.handler; object newValue = MpReflection.GetValue(data.target, handler.memberPath, data.index); bool changed = !Equals(newValue, data.oldValue); var cache = (handler.bufferChanges && !Multiplayer.IsReplay) ? bufferedChanges.GetValueSafe(handler) : null; if (cache != null && cache.TryGetValue(new Pair <object, object>(data.target, data.index), out BufferData cached)) { if (changed && cached.sent) { cached.sent = false; } cached.toSend = newValue; MpReflection.SetValue(data.target, handler.memberPath, cached.actualValue, data.index); continue; } if (!changed) { continue; } if (cache != null) { BufferData bufferData = new BufferData(data.oldValue, newValue); cache[new Pair <object, object>(data.target, data.index)] = bufferData; } else { handler.DoSync(data.target, newValue, data.index); } MpReflection.SetValue(data.target, handler.memberPath, data.oldValue, data.index); } }
protected override object ReadTarget(ByteReader data) { object target = Activator.CreateInstance(targetType); for (int i = 0; i < fieldPaths.Length; i++) { string path = fieldPaths[i]; string noTypePath = fieldPathsNoTypes[i]; Type fieldType = fieldTypes[i]; object value; if (fieldTransformers[i] is SyncTransformer tr) { value = tr.Reader.DynamicInvoke(SyncSerialization.ReadSyncObject(data, tr.NetworkType)); } else if (fieldType.IsCompilerGenerated()) { value = Activator.CreateInstance(fieldType); } else { value = SyncSerialization.ReadSyncObject(data, fieldType); } if (value == null) { if (allowedNull != null && !allowedNull.Contains(noTypePath)) { return(null); } if (noTypePath.EndsWith(DELEGATE_THIS)) { return(null); } if (cancelIfNull != null && cancelIfNull.Contains(noTypePath)) { return(null); } } if (removeNullsFromLists != null && removeNullsFromLists.Contains(noTypePath) && value is IList list) { list.RemoveNulls(); } MpReflection.SetValue(target, path, value); } return(target); }
public static void SetPropertyOrField(this object obj, string memberPath, object value, object index = null) { MpReflection.SetValue(obj, memberPath, value, index); }