Exemplo n.º 1
0
        private static void SyncExtendedPawnData(SyncWorker sync, ref object data)
        {
            if (sync.isWriting)
            {
                var id = int.MaxValue;

                foreach (DictionaryEntry dictionaryEntry in pawnStorageDictionary(extendedDataStorageInstance))
                {
                    if (dictionaryEntry.Value == data)
                    {
                        id = (int)dictionaryEntry.Key;
                        break;
                    }
                }

                sync.Write(id);
            }
            else
            {
                var id = sync.Read <int>();

                if (id != int.MaxValue && thingsById.TryGetValue(id, out var thing) && thing is Pawn)
                {
                    data = getExtendedDataForPawnMethod.Invoke(extendedDataStorageInstance, new object[] { thing });
                }
            }
        }
        private static void SyncFacepaintCombination(SyncWorker sync, ref object obj)
        {
            var defs = (IList)orderedFacepaintDefsField.GetValue(null);

            if (sync.isWriting)
            {
                sync.Write((Color)facepaintColourOneField.GetValue(obj));
                sync.Write((Color)facepaintColourTwoField.GetValue(obj));
                sync.Write(defs.IndexOf(facepaintDefOneField.GetValue(obj)));
                sync.Write(defs.IndexOf(facepaintDefTwoField.GetValue(obj)));
            }
            else
            {
                facepaintColourOneField.SetValue(obj, sync.Read <Color>());
                facepaintColourTwoField.SetValue(obj, sync.Read <Color>());
                int index = sync.Read <int>();
                if (index >= 0)
                {
                    facepaintDefOneField.SetValue(obj, defs[index]);
                }
                index = sync.Read <int>();
                if (index >= 0)
                {
                    facepaintDefTwoField.SetValue(obj, defs[index]);
                }
            }
        }
Exemplo n.º 3
0
 // Token: 0x0600008A RID: 138 RVA: 0x00007634 File Offset: 0x00005834
 private static void SyncWriterForDRSettings(SyncWorker sync, ref DRSettings dRSettings)
 {
     if (!sync.isWriting)
     {
         dRSettings = Find.World.GetComponent <DRSettings>();
     }
 }
Exemplo n.º 4
0
 static void ProxySyncer(SyncWorker sync, ref ExtendedOutfitProxy proxy)
 {
     if (!sync.isWriting)
     {
         proxy = Instance;
     }
 }
        private static void SyncSurrogateToHackDesignator(SyncWorker sync, ref Designator designator)
        {
            if (sync.isWriting)
            {
                sync.Write((byte)surrogateToHackHackTypeField(designator));
                sync.Write(surrogateToHackTargetField(designator));
                var map = surrogateToHackMapField(designator);

                // Looks like the map and cell are set in only one method, which is never called
                // so we'll most likely end up never syncing them. I'm leaving it for safety, though.
                if (map == null)
                {
                    sync.Write(IntVec3.Invalid);
                }
                else
                {
                    sync.Write(surrogateToHackPosField(designator));
                    sync.Write(map);
                }
            }
            else
            {
                designator = (Designator)surrogateToHackConstructor.Invoke(new object[] { (int)sync.Read <byte>() });
                surrogateToHackTargetField(designator) = sync.Read <Pawn>();
                var pos = sync.Read <IntVec3>();

                if (pos.IsValid)
                {
                    surrogateToHackPosField(designator) = pos;
                    surrogateToHackMapField(designator) = sync.Read <Map>();
                }
            }
        }
 private static void SyncColor(SyncWorker sync, ref Color color)
 {
     sync.Bind(ref color.r);
     sync.Bind(ref color.g);
     sync.Bind(ref color.b);
     sync.Bind(ref color.a);
 }
Exemplo n.º 7
0
 private static void SyncDialogChoosePower(SyncWorker sync, ref Window window)
 {
     if (!sync.isWriting)
     {
         window = currentDialog ?? Find.WindowStack.windows.FirstOrDefault(x => x.GetType() == choosePowerDialogType);
     }
 }
        // Used for syncing inner, compiler-generated class inside of TempleCardUtility
        private static void SyncTemplaCardUtilityInnerClass(SyncWorker sync, object obj)
        {
            if (sync.isWriting)
            {
                var altar  = templeCardUtilityInnerAltarField(obj) as Building;
                var sermon = templeCardUtilityInnerSermonField(obj);

                if (TryGetDataForSermon(sermon, altar, out var index))
                {
                    sync.Write(index);
                    sync.Write(altar);
                }
                else
                {
                    sync.Write(-1);
                }
            }
            else
            {
                var index = sync.Read <int>();

                if (index >= 0)
                {
                    var altar = sync.Read <Building>();
                    templeCardUtilityInnerAltarField(obj)  = altar;
                    templeCardUtilityInnerSermonField(obj) = GetSermon(altar, index);
                }
            }
        }
 // Sync the religious riot dialog
 // It should open up for all players, so we just get it from the WindowStack
 private static void SyncReligiousRiotDialog(SyncWorker sync, ref Window obj)
 {
     if (!sync.isWriting)
     {
         obj = Find.WindowStack.Windows.First(x => x.GetType() == religiousRiotType);
     }
 }
        // Sync worker for the Dialog_AssignPreacher (and Dialog_AssignAssistant, as it's implicit worker)
        private static void SyncDialogAssignPreacher(SyncWorker sync, ref Window obj)
        {
            if (sync.isWriting)
            {
                var sermon = assignPreacherSermonField(obj);
                var altar  = assignPreacherAltarField(obj) as Building;

                if (TryGetDataForSermon(sermon, altar, out var index))
                {
                    sync.Write(index);
                    sync.Write(altar);
                    sync.Write(obj.GetType() == assignPreacherType);
                }
                else
                {
                    sync.Write(-1);
                }
            }
            else
            {
                var index = sync.Read <int>();

                if (index >= 0)
                {
                    var altar  = sync.Read <Building>();
                    var sermon = GetSermon(altar, index);
                    var type   = sync.Read <bool>() ? assignPreacherType : assignAssistantType;

                    obj = Activator.CreateInstance(type, altar, sermon) as Window;
                }
            }
        }
        private static void SyncManagedVerb(SyncWorker sync, ref object obj)
        {
            if (sync.isWriting)
            {
                // Get the VerbManager from inside of the ManagedVerb itself
                var verbManager = mvcfManagerVerbManagerField.GetValue(obj);
                // Find the ManagedVerb inside of list of all verbs
                var managedVerbsList = mvcfVerbsField.GetValue(verbManager) as IList;
                var index            = managedVerbsList.IndexOf(obj);

                // Sync the index of the verb as well as the manager (if it's valid)
                sync.Write(index);
                if (index >= 0)
                {
                    SyncVerbManager(sync, ref verbManager);
                }
            }
            else
            {
                // Read and check if the index is valid
                var index = sync.Read <int>();

                if (index >= 0)
                {
                    // Read the verb manager
                    object verbManager = null;
                    SyncVerbManager(sync, ref verbManager);

                    // Find the ManagedVerb with specific index inside of list of all verbs
                    var managedVerbsList = mvcfVerbsField.GetValue(verbManager) as IList;
                    obj = managedVerbsList[index];
                }
            }
        }
        private static void SyncVerbManager(SyncWorker sync, ref object obj)
        {
            if (sync.isWriting)
            {
                // Sync the pawn that has the VerbManager
                sync.Write((Pawn)mvcfPawnGetter.Invoke(obj, Array.Empty <object>()));
            }
            else
            {
                var pawn = sync.Read <Pawn>();

                var comp      = mvcfGetWorldCompMethod.Invoke(null, Array.Empty <object>());
                var weakTable = mvcfManagersTableField.GetValue(comp);

                var outParam = new object[] { pawn, null };

                // Either try getting the VerbManager from the comp, or create it if it's missing
                if ((bool)conditionalWeakTableTryGetValueMethod.Invoke(weakTable, outParam))
                {
                    obj = outParam[1];
                }
                else
                {
                    obj = InitVerbManager(pawn, (WorldComponent)comp, table: weakTable);
                }
            }
        }
Exemplo n.º 13
0
        private static void SyncInnerClassWithPawn(SyncWorker sync, ref object inner)
        {
            var traverse = Traverse.Create(inner);

            if (sync.isWriting)
            {
                var comp = (ThingComp)traverse.Field("<>4__this").GetValue();
                var pawn = (Pawn)traverse.Field("p").GetValue();

                sync.Write(comp);
                sync.Write(pawn.thingIDNumber);
            }
            else
            {
                var comp = sync.Read <ThingComp>();
                var id   = sync.Read <int>();
                var pawn = GetPawnFromComp(comp, id);

                traverse.Field("<>4__this").SetValue(comp);
                if (pawn != null)
                {
                    traverse.Field("p").SetValue(pawn);
                }
            }
        }
Exemplo n.º 14
0
        private static void SyncFormTrackerInnerClass(SyncWorker sync, ref object inner)
        {
            if (sync.isWriting)
            {
                var tracker = innerClassParentField(inner);
                var comp    = formTrackerCompField(tracker);
                sync.Write(comp);

                var formList = propsFormsListField(comp.props);
                var index    = formList.IndexOf(innerClassFormField(inner));
                sync.Write(index);
            }
            else
            {
                var comp    = sync.Read <ThingComp>();
                var tracker = pokemonFormTrackerField(comp);
                innerClassParentField(inner) = tracker;

                var index = sync.Read <int>();
                if (index >= 0)
                {
                    var formList = propsFormsListField(comp.props);
                    innerClassFormField(inner) = formList[index];
                }
            }
        }
 private static void ManagerSyncer(SyncWorker sync, ref DefensivePositionsManager inst)
 {
     if (!sync.isWriting)
     {
         inst = DefensivePositionsManager.Instance;
     }
 }
 private static void SquadHandlerSyncer(SyncWorker sync, ref PawnSquadHandler inst)
 {
     if (!sync.isWriting)
     {
         inst = DefensivePositionsManager.Instance.squadHandler;
     }
 }
Exemplo n.º 17
0
        public bool Invoke(SyncWorker worker, ref object obj)
        {
            if (parent != null)
            {
                parent.Invoke(worker, ref obj);
            }

            for (int i = 0; i < syncWorkers.Count; i++)
            {
                if (syncWorkers[i](worker, ref obj))
                {
                    return(true);
                }

                if (worker is ReadingSyncWorker reader)
                {
                    reader.Reset();
                }
                else if (worker is WritingSyncWorker writer)
                {
                    writer.Reset();
                }
            }

            return(false);
        }
        private static void SyncSetIngredientCommand(SyncWorker sync, ref Command command)
        {
            var traverse       = Traverse.Create(command);
            var building       = traverse.Field("building");
            var ingredientList = traverse.Field("things");

            if (sync.isWriting)
            {
                sync.Write(building.GetValue() as Thing);
                var list = ingredientList.GetValue() as List <Thing>;
                sync.Write(list.Count);
                foreach (var item in list)
                {
                    sync.Write(item as Thing);
                }
            }
            else
            {
                building.SetValue(sync.Read <Thing>());
                int count = sync.Read <int>();
                var list  = new List <Thing>(count);
                for (int i = 0; i < count; i++)
                {
                    list.Add(sync.Read <Thing>());
                }
                ingredientList.SetValue(list);
            }
        }
Exemplo n.º 19
0
        // All the following is for the tiny lock of doom

        static void SyncWorkerForSwapControlsHandler(SyncWorker sync, ref object obj)
        {
            Pawn pawn = null;

            if (sync.isWriting)
            {
                pawn = (Pawn)SwapControlsHandler_PawnProperty.GetValue(obj, new object[] { });

                // If Pawn is null, it was saved and got deleted.
                if (pawn == null)
                {
                    sync.Write(false);

                    // Must use more reflection to traverse SimpleSidearms.saveData.handlers
                    // This will desync if unhandled :(

                    throw new ArgumentException("About to desync, tiny lock of doom triggered. Refusing to comply");
                }
                else
                {
                    sync.Write(true);
                    sync.Write(pawn);
                }
            }
            else
            {
                bool exists = sync.Read <bool>();
                if (exists)
                {
                    pawn = sync.Read <Pawn>();
                    obj  = SwapControlsHandler_GetHandlerForPawnMethod.Invoke(null, new object[] { pawn });
                }
            }
        }
Exemplo n.º 20
0
 private static void SyncWarcasketCustomizationDialog(SyncWorker sync, ref Window dialog)
 {
     if (!sync.isWriting)
     {
         dialog = Find.WindowStack.Windows.FirstOrDefault(w => w.GetType() == warcasketDialogType);
     }
 }
 private static void SyncHediffDialog(SyncWorker sync, ref Window window)
 {
     if (!sync.isWriting)
     {
         window = Find.WindowStack.Windows.FirstOrDefault(x => x.GetType() == hediffSelectionDialogType);
     }
 }
        private static void SyncPsykerDisciplineWindowAny(SyncWorker sync, ref object obj, Type windowType)
        {
            if (sync.isWriting)
            {
                sync.Write((ThingComp)psykerDisciplineWindowCompField.GetValue(obj));
                sync.Write(((Def)psykerDisciplineWindowSelectedDefField.GetValue(obj)).shortHash);
            }
            else
            {
                var comp = sync.Read <ThingComp>();
                var hash = sync.Read <ushort>();
                var def  = getDefByShortHash.Invoke(null, new object[] { hash });

                // If the window exists, we try to find a window for the discipline field for that pawn
                obj = Find.WindowStack.Windows.FirstOrDefault(x => x.GetType() == windowType && (ThingComp)psykerDisciplineWindowCompField.GetValue(x) == comp);

                // If a specific player doesn't have the psyker menu open we'll have null here, we need to create it for our synced method
                if (obj == null)
                {
                    // The Window_Psyker is needed for constructor and the synced method
                    // It won't really do anything useful, but is needed
                    var psykerWindow = Activator.CreateInstance(psykerWindowType, comp);
                    obj = Activator.CreateInstance(windowType, comp, psykerWindow);
                }

                // Set the def to the correct one (someone might have another one selected, so make sure the same one is picked for everyone)
                psykerDisciplineWindowSelectedDefField.SetValue(obj, def);
            }
        }
Exemplo n.º 23
0
        private static void SyncZoneData(SyncWorker sync, ref object zoneData)
        {
            if (sync.isWriting)
            {
                int?id           = null;
                var comp         = compCache[Find.CurrentMap];
                var zoneRegistry = growZoneRegistryField(comp);

                foreach (DictionaryEntry entry in zoneRegistry)
                {
                    if (entry.Value == zoneData)
                    {
                        id = (int)entry.Key;
                        break;
                    }
                }

                sync.Write(id);
                if (id != null)
                {
                    sync.Write(Find.CurrentMap);
                }
            }
            else
            {
                var id = sync.Read <int?>();
                if (id != null)
                {
                    var comp         = compCache[sync.Read <Map>()];
                    var zoneRegistry = growZoneRegistryField(comp);
                    zoneData = zoneRegistry[id.Value];
                }
            }
        }
Exemplo n.º 24
0
        private static void SyncSetIngredientCommand(SyncWorker sync, ref Command command)
        {
            var traverse       = Traverse.Create(command);
            var building       = traverse.Field("building");
            var ingredientList = traverse.Field("things");

            if (sync.isWriting)
            {
                sync.Write(building.GetValue() as Thing);
                var ingredientListValue = ingredientList.GetValue();
                if (ingredientListValue == null)
                {
                    sync.Write(false);
                }
                else
                {
                    sync.Write(true);
                    sync.Write(ingredientList.GetValue() as List <Thing>);
                }
            }
            else
            {
                building.SetValue(sync.Read <Thing>());
                if (sync.Read <bool>())
                {
                    ingredientList.SetValue(sync.Read <List <Thing> >());
                }
            }
        }
Exemplo n.º 25
0
 static void SyncLearnPsycasts(SyncWorker sync, ref Command_Action command)
 {
     if (sync.isWriting) {
         sync.Write(levelField(command));
         sync.Write(parentField(command));
     } else {
         command = (Command_Action) Activator.CreateInstance(learnPsycastsType, sync.Read<int>(), sync.Read<Pawn>());
     }
 }
Exemplo n.º 26
0
 //[SyncWorker(shouldConstruct = false)]
 public static void SyncKanbanSettings(SyncWorker sync, ref KanbanSettings ks)
 {
     sync.Bind(ref ks.srt);
     sync.Bind(ref ks.ssl);
     //if (sync.isWriting) {
     //    sync.Write(ks);
     //} else {
     //    ks = sync.Read<KanbanSettings>();
     //}
 }
        private static void PawnHandlerSyncer(SyncWorker sync, ref PawnSavedPositionHandler inst)
        {
            var ownerPawn = inst?.Owner;

            sync.Bind(ref ownerPawn);
            if (!sync.isWriting && ownerPawn != null)
            {
                inst = DefensivePositionsManager.Instance.GetHandlerForPawn(ownerPawn);
            }
        }
 private static void SyncDialog(SyncWorker sync, ref Window dialog)
 {
     if (!sync.isWriting)
     {
         if (Find.WindowStack.IsOpen(changeFacepaintDialogType))
         {
             dialog = Find.WindowStack.Windows.First(x => x.GetType() == changeFacepaintDialogType);
         }
     }
 }
Exemplo n.º 29
0
 private static void SyncToggleCommand(SyncWorker sync, ref Command_Toggle command)
 {
     if (sync.isWriting)
     {
         sync.Write(parentCompGetter.Invoke(command, Array.Empty <object>()) as ThingComp);
     }
     else
     {
         command = Activator.CreateInstance(commandType, sync.Read <ThingComp>()) as Command_Toggle;
     }
 }
 private static void SyncComp(SyncWorker sync, ref ThingComp thing)
 {
     if (sync.isWriting)
     {
         sync.Write <Thing>(thing.parent);
     }
     else
     {
         thing = (ThingComp)getCompUnlockerCheckerMethod.Invoke(null, new object[] { sync.Read <Thing>(), false, false });
     }
 }