Exemple #1
0
 internal static void Push(ModdedSaveData data)
 {
     foreach (var actorData in GetAllData(SceneContext.Instance.GameModel))
     {
         foreach (CompoundDataPiece modPiece in actorData.Value.DataList)
         {
             var mod         = SRModLoader.GetMod(modPiece.key);
             var seg         = data.GetSegmentForMod(mod);
             var newCompound = new CompoundDataPiece("root");
             foreach (var dat in modPiece.DataList)
             {
                 newCompound.DataList.Add(dat);
             }
             seg.extendedData.Add(new ExtendedDataTree()
             {
                 dataPiece        = newCompound,
                 longIdentifier   = actorData.Key.longID,
                 stringIdentifier = actorData.Key.stringID ?? "",
                 idType           = ExtendedDataTree.IdentifierType.ACTOR
             });
         }
     }
     foreach (var pair in worldSaveData)
     {
         SaveRegistry.GetSaveInfo(pair.Key).WorldDataSave(pair.Value);
         if (pair.Value.DataList.Count > 0)
         {
             data.GetSegmentForMod(pair.Key).extendedWorldData = pair.Value;
         }
     }
 }
Exemple #2
0
 private static void PullAmmoData(ModdedSaveData data, Game game)
 {
     foreach (var ammo in AmmoDataUtils.GetAllAmmoData(game))
     {
         var modsInThis   = new HashSet <SRMod>(ammo.Select((x) => ModdedIDRegistry.IsModdedID(x.id) ? ModdedIDRegistry.ModForID(x.id) : null));
         var belongingMod = AmmoIdentifier.TryGetIdentifier(ammo, game, out var id) ? AmmoIdentifier.GetModForIdentifier(id) : null;
         modsInThis.Add(belongingMod);
         modsInThis.Remove(null);
         foreach (var mod in modsInThis)
         {
             if (mod == null)
             {
                 continue;
             }
             if (AmmoIdentifier.TryGetIdentifier(ammo, game, out var identifier))
             {
                 var segment = data.GetSegmentForMod(mod);
                 segment.customAmmo[identifier] =
                     AmmoDataUtils.RipOutWhere(ammo, (x) => mod == belongingMod?ModdedIDRegistry.ModForID(x.id) == null:ModdedIDRegistry.ModForID(x.id) == mod, false);
             }
             else
             {
                 Debug.LogError("Unknown ammo identifier, skipping...");
             }
         }
     }
 }
Exemple #3
0
        public static void PushAllModdedData(ModdedSaveData data, Game game)
        {
            ExtendedData.Pull(data);
            PushAllSegmentData(data, game);


            PersistentAmmoManager.Pull(data);
            PushAllPartialData(data, game);
        }
 internal static void Push(ModdedSaveData data)
 {
     foreach (var v in PersistentAmmoData.Where((x) => !x.Value.DataModel.HasNoData()))
     {
         data.ammoDataEntries.Add(new IdentifiableAmmoData()
         {
             identifier = v.Key, model = v.Value.DataModel
         });
     }
 }
Exemple #5
0
        public static void PushAllPartialData(ModdedSaveData data, Game game)
        {
            foreach (var partial in data.partialData)
            {
                switch (partial.Key.Type)
                {
                case IdentifierType.ACTOR:
                    if (game.actors.FirstOrDefault((x) => x.actorId == partial.Key.longID) is VanillaActorData dat)
                    {
                        partial.Value.Push(dat);
                    }
                    break;

                case IdentifierType.GADGET:
                    if (game.world.placedGadgets.ContainsKey(partial.Key.stringID))
                    {
                        partial.Value.Push(game.world.placedGadgets[partial.Key.stringID]);
                    }
                    break;

                case IdentifierType.LANDPLOT:
                    if (game.ranch.plots.FirstOrDefault((x) => x.id == partial.Key.stringID) is VanillaPlotData plot)
                    {
                        partial.Value.Push(plot);
                    }
                    break;

                case IdentifierType.GORDO:
                    if (game.world.gordos.TryGetValue(partial.Key.stringID, out var gordo))
                    {
                        partial.Value.Push(gordo);
                    }
                    break;

                case IdentifierType.TREASUREPOD:
                    if (game.world.treasurePods.TryGetValue(partial.Key.stringID, out var treasurepod))
                    {
                        partial.Value.Push(treasurepod);
                    }
                    break;

                case IdentifierType.EXCHANGEOFFER:
                    if (game.world.offers.TryGetValue((ExchangeDirector.OfferType)partial.Key.longID, out var offer))
                    {
                        partial.Value.Push(offer);
                    }
                    break;

                default:
                    throw new NotImplementedException();
                }
            }
            data.appearancesData.Push(game.appearances);
        }
Exemple #6
0
        private static void PushAllSegmentData(ModdedSaveData data, Game game)
        {
            foreach (var mod in data.segments)
            {
                PushSegmentFullData(game, mod);

                PushSegmentTertiaryData(game, mod);

                PushSegmentAmmoData(game, mod);
            }
        }
Exemple #7
0
 internal static void Pull(ModdedSaveData data)
 {
     PersistentAmmoData.Clear();
     AmmoIdentifier.ClearCache();
     foreach (var v in data.ammoDataEntries)
     {
         if (v.model.HasNoData())
         {
             continue;
         }
         PersistentAmmoData[v.identifier] = new PersistentAmmo(v.identifier, v.model);
     }
 }
Exemple #8
0
        public static void PullModdedData(ModdedSaveData data, Game game)
        {
            data.Clear();


            PullFullData(data, game);
            PullTertiaryData(data, game);
            PullAmmoData(data, game);
            PullPartialData(data, game);

            ExtendedData.Push(data);
            PersistentAmmoManager.SyncAll();
            PersistentAmmoManager.Push(data);
        }
Exemple #9
0
        internal static void Pull(ModdedSaveData data)
        {
            Clear();
            foreach (var mod in data.segments)
            {
                Debug.Log($"mod {mod.modid} has {mod.extendedData.Count} extended actor datas");
                foreach (var extendedDataTree in mod.extendedData)
                {
                    switch (extendedDataTree.idType)
                    {
                    case ExtendedDataTree.IdentifierType.ACTOR:
                        var          identifier = DataIdentifier.GetActorIdentifier(extendedDataTree.longIdentifier);
                        PreparedData pdata;
                        if (!preparedData.TryGetValue(identifier, out pdata))
                        {
                            pdata = new PreparedData()
                            {
                                Data = new CompoundDataPiece("root"), SourceType = PreparedData.PreparationSource.SPAWN
                            };
                            preparedData[identifier] = pdata;
                        }
                        extendedDataTree.dataPiece.DataList.Do((x) => pdata.Data.GetCompoundPiece(mod.modid).DataList.Add(x));
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }
                var actualMod = SRModLoader.GetMod(mod.modid);
                if (actualMod == null)
                {
                    continue;
                }
                worldSaveData.Add(actualMod, mod.extendedWorldData);
                SaveRegistry.GetSaveInfo(actualMod).WorldDataPreLoad(mod.extendedWorldData);
            }
            foreach (var v in SRModLoader.GetMods())
            {
                if (!worldSaveData.ContainsKey(v))
                {
                    var newData = new CompoundDataPiece("root");
                    worldSaveData.Add(v, newData);
                    SaveRegistry.GetSaveInfo(v).WorldDataPreLoad(newData);
                }
            }
        }
Exemple #10
0
 internal static void Push(ModdedSaveData data)
 {
     foreach (var actorData in extendedActorData)
     {
         foreach (CompoundDataPiece modPiece in actorData.Value.DataList)
         {
             var mod         = SRModLoader.GetMod(modPiece.key);
             var seg         = data.GetSegmentForMod(mod);
             var newCompound = new CompoundDataPiece("root");
             foreach (var dat in modPiece.DataList)
             {
                 newCompound.DataList.Add(dat);
             }
             seg.extendedData.Add(new ExtendedDataTree()
             {
                 dataPiece  = newCompound,
                 identifier = actorData.Key,
                 idType     = ExtendedDataTree.IdentifierType.ACTOR
             });
         }
     }
 }
Exemple #11
0
        private static void PullTertiaryData(ModdedSaveData data, Game game)
        {
            foreach (var mod in ModPlayerData.FindAllModsWithData(game.player))
            {
                var segment = data.GetSegmentForMod(mod);

                segment.playerData.Pull(game.player, mod);
            }

            PediaDataBuffer buf = new PediaDataBuffer(game.pedia);

            foreach (var mod in ModPediaData.FindAllModsWithData(buf))
            {
                var segment = data.GetSegmentForMod(mod);
                segment.pediaData.Pull(buf, mod);
            }

            foreach (var mod in ModWorldData.FindAllModsWithData(game.world))
            {
                var segment = data.GetSegmentForMod(mod);
                segment.worldData.Pull(game.world, mod);
            }
        }
Exemple #12
0
        internal static void Pull(ModdedSaveData data)
        {
            extendedActorData.Clear();
            foreach (var mod in data.segments)
            {
                Debug.Log($"mod {mod.modid} has {mod.extendedData.Count} extended actor datas");
                foreach (var extendedDataTree in mod.extendedData)
                {
                    switch (extendedDataTree.idType)
                    {
                    case ExtendedDataTree.IdentifierType.ACTOR:
                        var list = ExtendedDataUtils.GetPieceForMod(mod.modid, GetDataForActor(extendedDataTree.identifier)).DataList;
                        foreach (var h in extendedDataTree.dataPiece.DataList)
                        {
                            list.Add(h);
                        }
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                }
            }
        }
Exemple #13
0
        private static void PullPartialData(ModdedSaveData data, Game game)
        {
            void Check <T>(T v, Action
                           <T, PartialData> onSuccess)
            {
                var level = CustomChecker.GetCustomLevel(v);

                if (level == CustomChecker.CustomLevel.PARTIAL)
                {
                    var partialdata = PartialData.GetPartialData(v.GetType(), true);
                    partialdata.Pull(v);

                    onSuccess(v, partialdata);
                }
            }

            foreach (var g in game.actors)
            {
                Check(g, (v, partialdata) =>
                      data.partialData.Add(new DataIdentifier()
                {
                    longID = v.actorId, Type = IdentifierType.ACTOR
                }, partialdata));
            }

            foreach (var g in game.world.placedGadgets)
            {
                var currentString = g.Key;
                Check(g.Value, (v, partialdata) =>
                {
                    data.partialData.Add(new DataIdentifier()
                    {
                        stringID = currentString, Type = IdentifierType.GADGET
                    },
                                         partialdata);
                });
            }

            foreach (var g in game.ranch.plots)
            {
                var currentString = g.id;
                Check(g, (v, partialdata) =>
                      data.partialData.Add(new DataIdentifier()
                {
                    stringID = currentString, Type = IdentifierType.LANDPLOT
                }, partialdata));
            }

            foreach (var g in game.world.gordos)
            {
                Check(g.Value, (v, partialData) => data.partialData.Add(new DataIdentifier()
                {
                    Type = IdentifierType.GORDO, stringID = g.Key
                }, partialData));
            }

            foreach (var t in game.world.treasurePods)
            {
                Check(t.Value, (v, partialData) => data.partialData.Add(new DataIdentifier()
                {
                    Type = IdentifierType.TREASUREPOD, stringID = t.Key
                }, partialData));
            }

            foreach (var t in game.world.offers)
            {
                var cur = t.Key;
                Check(t.Value, (v, partialData) => data.partialData.Add(new DataIdentifier()
                {
                    Type = IdentifierType.EXCHANGEOFFER, longID = (int)cur
                }, partialData));
            }

            data.appearancesData.Pull(game.appearances);
        }
Exemple #14
0
        private static void PullFullData(ModdedSaveData data, Game game)
        {
            foreach (var actor in game.actors.Where((x) => SaveRegistry.IsCustom(x)))
            {
                var segment = data.GetSegmentForMod(SaveRegistry.ModForData(actor));
                segment.identifiableData.Add(new IdentifiedData()
                {
                    data   = actor,
                    dataID = new DataIdentifier()
                    {
                        longID = actor.actorId, stringID = "", Type = IdentifierType.ACTOR
                    }
                });
            }


            foreach (var plot in game.ranch.plots.Where(x => ModdedStringRegistry.IsValidString(x.id) && (SaveRegistry.IsCustom(x) || ModdedStringRegistry.IsModdedString(x.id))))
            {
                var segment = data.GetSegmentForMod(SaveRegistry.ModForData(plot) is SRMod mod ? mod : ModdedStringRegistry.GetModForModdedString(plot.id));
                segment.identifiableData.Add(new IdentifiedData()
                {
                    data   = plot,
                    dataID = new DataIdentifier()
                    {
                        longID = 0, stringID = plot.id, Type = IdentifierType.LANDPLOT
                    }
                });
            }

            void GetStringIndexedModdedData <T>(Dictionary <string, T> source, Func <KeyValuePair <string, T>, DataIdentifier> dataIdentifier) where T : PersistedDataSet
            {
                foreach (var pair in source.Where(x => ModdedStringRegistry.IsValidString(x.Key) && (SaveRegistry.IsCustom(x.Value) || ModdedStringRegistry.IsModdedString(x.Key))))
                {
                    var segment = data.GetSegmentForMod(SaveRegistry.ModForData(pair.Value) ?? ModdedStringRegistry.GetModForModdedString(pair.Key));
                    segment.identifiableData.Add(new IdentifiedData()
                    {
                        data   = pair.Value,
                        dataID = dataIdentifier(pair)
                    });
                }
            }

            GetStringIndexedModdedData(game.world.placedGadgets, (gadget) => new DataIdentifier()
            {
                longID = 0, stringID = gadget.Key, Type = IdentifierType.GADGET
            });
            GetStringIndexedModdedData(game.world.gordos, (gordo) => new DataIdentifier()
            {
                longID = 0, stringID = gordo.Key, Type = IdentifierType.GORDO
            });
            GetStringIndexedModdedData(game.world.treasurePods, (pod) => new DataIdentifier()
            {
                longID = 0, stringID = pod.Key, Type = IdentifierType.TREASUREPOD
            });

            foreach (var v in game.world.offers.Where(x => ModdedIDRegistry.IsModdedID(x.Key) || ExchangeOfferRegistry.IsCustom(x.Value)))
            {
                var segment = data.GetSegmentForMod(SaveRegistry.ModForData(v.Value) ?? ExchangeOfferRegistry.GetModForData(v.Value));
                segment.identifiableData.Add(new IdentifiedData()
                {
                    data   = v.Value,
                    dataID = new DataIdentifier()
                    {
                        Type = IdentifierType.EXCHANGEOFFER, longID = (int)v.Key
                    }
                });
            }
        }