Example #1
0
        public static void save()
        {
            River river = LevelSavedata.openRiver("/Animals.dat", false);

            river.writeByte(AnimalsDataManager.SAVEDATA_VERSION);

            List <PackInfo> packsToSave = AnimalManager.packs.Where(pack => pack.animals.Any(a => a != null && !a.isDead)).ToList();

            river.writeUInt16((ushort)packsToSave.Count);

            foreach (PackInfo pack in packsToSave)
            {
                List <Animal> aliveAnimals = pack.animals.Where((a) => a != null && !a.isDead).ToList();
                if (aliveAnimals.Count == 0)
                {
                    continue;
                }
                if (pack.animals.Any(a => a == null))
                {
                    aliveAnimals.Insert(0, null);
                }

                river.writeUInt16((ushort)aliveAnimals.Count);
                foreach (Animal animal in aliveAnimals)
                {
                    if (animal == null)
                    {
                        river.writeUInt16((ushort)0);
                    }
                    else
                    {
                        river.writeUInt16(animal.id);
                        river.writeSingleVector3(animal.transform.position);
                        river.writeSingle(animal.transform.rotation.eulerAngles.y);
                    }
                }
            }
            river.closeRiver();
            Logger.Log(string.Format("Saved {0} packs with {1} animals in total", packsToSave.Count, AnimalManager.animals.Count));
        }
        internal void GenerateAndLoadAllClusters(bool loadSaveFile = true)
        {
            var stopwatch = Stopwatch.StartNew();

            var allBuildables = BuildableDirectory.GetBuildables(includePlants: true).ToList();

            Logging.Write(m_Plugin,
                          $"Loaded {allBuildables.Count} buildables from the map. Took {stopwatch.ElapsedMilliseconds}ms",
                          ConsoleColor.Cyan);

            foreach (var c in m_Clusters)
            {
                Return(c);
            }

            var successfulLoad = false;

            if (loadSaveFile && LevelSavedata.fileExists("/Bases.dat"))
            {
                successfulLoad = LoadClusters(allBuildables);
            }

            if (!successfulLoad)
            {
                Logging.Write(m_Plugin,
                              "Generating new clusters. This can take a LONG time. How long will depend on the following factors (but not limited to): CPU usage, CPU cores/threads, Buildables in the map. This generation only needs to be ran once from raw.");
                m_Clusters.AddRange(ClusterElements(allBuildables, true));
            }

            stopwatch.Stop();
            Logging.Write(m_Plugin,
                          $"Clusters Loaded: {Clusters.Count}. Took {stopwatch.ElapsedMilliseconds}ms.",
                          ConsoleColor.Cyan);

            OnClustersGenerated?.Invoke();
        }
Example #3
0
        public static bool load()
        {
            if (LevelSavedata.fileExists("/Animals.dat"))
            {
                River river = LevelSavedata.openRiver("/Animals.dat", true);
                byte  ver   = river.readByte();

                ushort packsCount         = river.readUInt16();
                int    animalManagerPacks = AnimalManager.packs.Count;
                int    packIndex          = 0;

                int loadedAnimals = 0;

                for (int i = 0; i < packsCount; i++)
                {
                    PackInfo selectedPack;

                    bool createdNewPack = i >= animalManagerPacks;
                    if (createdNewPack)
                    {
                        selectedPack = addNewPack();
                    }
                    else
                    {
                        selectedPack = AnimalManager.packs[packIndex];
                    }

                    ushort animalsCount = river.readUInt16();
                    for (int j = 0; j < animalsCount; j++)
                    {
                        ushort id = river.readUInt16();
                        if (id == 0)
                        {
                            //null animal detects custom animal pack without auto respawning
                            if (j == 0 && !createdNewPack)
                            {
                                selectedPack = addNewPack();
                            }
                            selectedPack.animals.Add(null);
                            continue;
                        }

                        UnityEngine.Vector3 position = river.readSingleVector3();
                        float angle = river.readSingle();

                        if (animalsCount > selectedPack.animals.Count)
                        {
                            try
                            {
                                AnimalManager aManager = ((AnimalManager)(typeof(AnimalManager)).GetField("manager", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(null));
                                Animal        animal   = (Animal)typeof(AnimalManager).GetMethod("addAnimal", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(aManager, new object[] { id, position, angle, false });
                                animal.pack = selectedPack;
                                selectedPack.animals.Add(animal);
                            }
                            catch (Exception ex)
                            {
                                Logger.LogError(string.Format("Plugin {0} has to be updated... ", SaveAnimals.instance.Name));
                                Logger.Log(ex);
                                return(false);
                            }
                        }
                        else
                        {
                            Animal animal = selectedPack.animals[j];
                            animal.id = id;
                            animal.transform.position = position;
                            animal.transform.rotation = UnityEngine.Quaternion.Euler(0.0f, angle, 0.0f);
                        }
                    }

                    if (!createdNewPack)
                    {
                        packIndex++;
                    }

                    loadedAnimals += animalsCount;
                }
                river.closeRiver();
                Logger.Log(string.Format("Loaded {0} packs with {1} animals in total", packsCount, loadedAnimals));
            }

            return(true);
        }