Exemple #1
0
        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();
        }
Exemple #2
0
        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);
        }