public override void Handle(ByteReader data) { A target = SyncSerialization.ReadSync <A>(data); B arg0 = SyncSerialization.ReadSync <B>(data); C arg1 = SyncSerialization.ReadSync <C>(data); int descHash = data.ReadInt32(); var action = func(target, arg0, arg1).Select(t => actionGetter(t)).FirstOrDefault(a => GenText.StableStringHash(a.Method.MethodDesc()) == descHash); action?.Invoke(); }
public static SyncHandler HandleCmd(ByteReader data) { int syncId = data.ReadInt32(); SyncHandler handler; try { handler = Sync.handlers[syncId]; } catch (ArgumentOutOfRangeException) { Log.Error($"Error: invalid syncId {syncId}/{Sync.handlers.Count}, this implies mismatched mods, ensure your versions match! Stacktrace follows."); throw; } List <object> prevSelected = Find.Selector.selected; List <WorldObject> prevWorldSelected = Find.WorldSelector.selected; bool shouldQueue = false; if (handler.context != SyncContext.None) { if (handler.context.HasFlag(SyncContext.MapMouseCell)) { IntVec3 mouseCell = SyncSerialization.ReadSync <IntVec3>(data); MouseCellPatch.result = mouseCell; } if (handler.context.HasFlag(SyncContext.MapSelected)) { List <ISelectable> selected = SyncSerialization.ReadSync <List <ISelectable> >(data); Find.Selector.selected = selected.Cast <object>().AllNotNull().ToList(); } if (handler.context.HasFlag(SyncContext.WorldSelected)) { List <ISelectable> selected = SyncSerialization.ReadSync <List <ISelectable> >(data); Find.WorldSelector.selected = selected.Cast <WorldObject>().AllNotNull().ToList(); } if (handler.context.HasFlag(SyncContext.QueueOrder_Down)) { shouldQueue = data.ReadBool(); } } KeyIsDownPatch.shouldQueue = shouldQueue; try { handler.Handle(data); } finally { MouseCellPatch.result = null; KeyIsDownPatch.shouldQueue = null; Find.Selector.selected = prevSelected; Find.WorldSelector.selected = prevWorldSelected; } return(handler); }