Иконка ресурса

FREE MonumentSpawnControl : 1.0.8 1.0.8

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using Oxide.Game.Rust.Cui;
namespace Oxide.Plugins {
    //  Changes in V1.0.7
    //  Null check fix.// To Do
    //  Give users the option to change prefab - UI list.//  Give users the option to add/remove spawn points.//  Have a 'set all' button for respawn time.[Info("MonumentSpawnControl", "Steenamaroo", "1.0.8", ResourceId = 0)]
    [Description("Control default Rust monument spawn rates and amounts.")]
    class MonumentSpawnControl : RustPlugin {
        public static MonumentSpawnControl ins;
        Dictionary<string, Dictionary<string, List<SpawnGroup>>> GotMonuments = new Dictionary<string, Dictionary<string, List<SpawnGroup>>>();
        const string Font = "robotocondensed-regular.ttf";
        const string permAllowed = "monumentspawncontrol.allowed";
        bool HasPermission(string id, string perm) => permission.UserHasPermission(id, perm);
        bool newsave = false;
        void OnNewSave(string filename) => newsave = true;
#region SetupTakedown
        void Loaded() => permission.RegisterPermission(permAllowed, this);
        void OnServerInitialized() {
            ins = this;
            foreach (BasePlayer player in BasePlayer.activePlayerList) DestroyMenu(player, true);
            LoadConfigVariables();
            GetMonuments();
            ApplySettings("", "");
        }
        void Unload() {
            ins = null;
            foreach (BasePlayer player in BasePlayer.activePlayerList) DestroyMenu(player, true);
            ApplySettings("", "");
        }
        void OnPlayerDisconnected(BasePlayer player) => DestroyMenu(player, true);
        void OnPlayerDeath(BasePlayer player, HitInfo info) => DestroyMenu(player, true);
        void DestroyMenu(BasePlayer player, bool all) {
            if (all) CuiHelper.DestroyUi(player, "MSCBgUI");
            CuiHelper.DestroyUi(player, "MSCMainUI");
        }
#endregion
        [ChatCommand("MSC")]
        void MSCptions(BasePlayer player, string command, string[] args) {
            if (!HasPermission(player.UserIDString, permAllowed) && !player.IsAdmin) return;
            DestroyMenu(player, true);
            MSCBgUI(player);
            MSCMainUI(player, "");
        }
#region UI
        void MSCBgUI(BasePlayer player) {
            string guiString = string.Format("0.1 0.1 0.1 0.9");
            var elements = new CuiElementContainer();
            var mainName = elements.Add(new CuiPanel {
                Image = {
                    Color = guiString
                }
                , RectTransform = {
                    AnchorMin = "0.2 0.05", AnchorMax = "0.8 0.95"
                }
                , CursorEnabled = true, FadeOut = 0.1f
            }
            , "Overlay", "MSCBgUI");
            elements.Add(new CuiPanel {
                Image = {
                    Color = $"0 0 0 1"
                }
                , RectTransform = {
                    AnchorMin = $"0 0.95", AnchorMax = $"0.999 1"
                }
                , CursorEnabled = true
            }
            , mainName);
            elements.Add(new CuiPanel {
                Image = {
                    Color = $"0 0 0 1"
                }
                , RectTransform = {
                    AnchorMin = $"0 0", AnchorMax = $"0.999 0.05"
                }
                , CursorEnabled = true
            }
            , mainName);
            elements.Add(new CuiButton {
                Button = {
                    Command = "CloseMSC", Color = configData.ButtonColour
                }
                , RectTransform = {
                    AnchorMin = "0.955 0.96", AnchorMax = "0.99 0.99"
                }
                , Text = {
                    Text = "X", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                }
            }
            , mainName);
            elements.Add(new CuiLabel {
                Text = {
                    Text = "Spawn Options", FontSize = 20, Font = Font, Align = TextAnchor.MiddleCenter
                }
                , RectTransform = {
                    AnchorMin = "0.2 0.95", AnchorMax = "0.8 1"
                }
            }
            , mainName);
            CuiHelper.AddUi(player, elements);
        }
        void MSCMainUI(BasePlayer player, string monument) {
            var elements = new CuiElementContainer();
            var mainName = elements.Add(new CuiPanel {
                Image = {
                    Color = "0 0 0 0"
                }
                , RectTransform = {
                    AnchorMin = "0.2 0", AnchorMax = "0.8 0.9"
                }
                , CursorEnabled = true
            }
            , "Overlay", "MSCMainUI");
            elements.Add(new CuiElement {
                Parent = "MSCMainUI", Components = {
                    new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1"
                    }
                }
            }
            );
            float top = 0.86f;
            float bottom = 0.88f;
            int counter = 0;
            int groupCounter = 0;
            foreach (var entry in GotMonuments) groupCounter += entry.Value.Count;
            if (groupCounter == 0) elements.Add(new CuiLabel {
                Text = {
                    Text = "No monuments were found.", FontSize = 16, Font = Font, Align = TextAnchor.MiddleCenter
                }
                , RectTransform = {
                    AnchorMin = "0 0.7", AnchorMax = "1 0.75"
                }
            }
            , mainName);
            else if (monument != string.Empty) {
                elements.Add(new CuiLabel {
                    Text = {
                        Text = $"{monument}", FontSize = 20, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                    , RectTransform = {
                        AnchorMin = "0.2 0.95", AnchorMax = "0.8 1"
                    }
                }
                , mainName);
                top -= 0.06f;
                bottom -= 0.06f;
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCFill {d(monument)}", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.22 {top}", AnchorMax = $"0.28 {bottom}"
                    }
                    , Text = {
                        Text = "All", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCEmpty {d(monument)}", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.29 {top}", AnchorMax = $"0.35 {bottom}"
                    }
                    , Text = {
                        Text = "All", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCDisable {d(monument)}", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.36 {top}", AnchorMax = $"0.42 {bottom}"
                    }
                    , Text = {
                        Text = "All", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCReset {d(monument)}", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.43 {top}", AnchorMax = $"0.49 {bottom}"
                    }
                    , Text = {
                        Text = "All", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCSetRespawn {d(monument)}", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.525 {top}", AnchorMax = $"0.625 {bottom}"
                    }
                    , Text = {
                        Text = "Respawn Time", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCSetAmount {d(monument)}", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.655 {top}", AnchorMax = $"0.755 {bottom}"
                    }
                    , Text = {
                        Text = "Respawn Amount", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCSetMax {d(monument)}", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.785 {top}", AnchorMax = $"0.885 {bottom}"
                    }
                    , Text = {
                        Text = "Max Population", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                top -= 0.03f;
                bottom -= 0.03f;
                foreach (var entry in GotMonuments[monument]) {
                    top -= 0.03f;
                    bottom -= 0.03f;
                    var record = configData.GotMonuments[monument][entry.Key].CurrentSettings;
                    string color = record.enabled ? configData.ButtonColour : configData.ButtonColour2;
                    string text = record.enabled ? "Disable" : "Enable";
                    elements.Add(new CuiButton {
                        Button = {
                            Command = "", Color = configData.ButtonColour2
                        }
                        , RectTransform = {
                            AnchorMin = $"0.02 {top}", AnchorMax = $"0.2 {bottom}"
                        }
                        , Text = {
                            Text = entry.Key, FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCFill {d(monument)} {d(entry.Key)}", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.22 {top}", AnchorMax = $"0.28 {bottom}"
                        }
                        , Text = {
                            Text = "Fill", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCEmpty {d(monument)} {d(entry.Key)}", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.29 {top}", AnchorMax = $"0.35 {bottom}"
                        }
                        , Text = {
                            Text = "Empty", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCDisable {d(monument)} {d(entry.Key)}", Color = color
                        }
                        , RectTransform = {
                            AnchorMin = $"0.36 {top}", AnchorMax = $"0.42 {bottom}"
                        }
                        , Text = {
                            Text = text, FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCReset {d(monument)} {d(entry.Key)}", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.43 {top}", AnchorMax = $"0.49 {bottom}"
                        }
                        , Text = {
                            Text = "Reset", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    var respawntime = record.Population_Check_Interval;
                    if (respawntime >= Int16.MaxValue || respawntime < 0) respawntime = record.Population_Check_Interval = 30;
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCIncreaseDuration {d(monument)} {d(entry.Key)} true", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.525 {top}", AnchorMax = $"0.55 {bottom}"
                        }
                        , Text = {
                            Text = "<", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiLabel {
                        Text = {
                            Text = $"{respawntime}", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                        , RectTransform = {
                            AnchorMin = $"0.55 {top}", AnchorMax = $"0.6 {bottom}"
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCIncreaseDuration {d(monument)} {d(entry.Key)}", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.6 {top}", AnchorMax = $"0.625 {bottom}"
                        }
                        , Text = {
                            Text = ">", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCIncreaseAmount {d(monument)} {d(entry.Key)} true", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.655 {top}", AnchorMax = $"0.68 {bottom}"
                        }
                        , Text = {
                            Text = "<", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiLabel {
                        Text = {
                            Text = $"{record.Max_Number_To_Spawn_Per_Check}", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                        , RectTransform = {
                            AnchorMin = $"0.68 {top}", AnchorMax = $"0.73 {bottom}"
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCIncreaseAmount {d(monument)} {d(entry.Key)}", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.73 {top}", AnchorMax = $"0.755 {bottom}"
                        }
                        , Text = {
                            Text = ">", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCIncreaseMaxPop {d(monument)} {d(entry.Key)} true", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.785 {top}", AnchorMax = $"0.81 {bottom}"
                        }
                        , Text = {
                            Text = "<", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    elements.Add(new CuiLabel {
                        Text = {
                            Text = $"{record.Max_Population}", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                        , RectTransform = {
                            AnchorMin = $"0.81 {top}", AnchorMax = $"0.86 {bottom}"
                        }
                    }
                    , mainName);
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCIncreaseMaxPop {d(monument)} {d(entry.Key)}", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"0.86 {top}", AnchorMax = $"0.885 {bottom}"
                        }
                        , Text = {
                            Text = ">", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    counter++;
                }
                elements.Add(new CuiButton {
                    Button = {
                        Command = $"MSCBack {d(monument)}", Color = configData.ButtonColour
                    }
                    , RectTransform = {
                        AnchorMin = $"0.4 0.065", AnchorMax = $"0.6 0.095"
                    }
                    , Text = {
                        Text = "Back", FontSize = 11, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
            }
            else {
                elements.Add(new CuiButton {
                    Button = {
                        Command = "MSCFillAll", Color = configData.ButtonColour2
                    }
                    , RectTransform = {
                        AnchorMin = $"0.4 0.86", AnchorMax = $"0.6 0.89"
                    }
                    , Text = {
                        Text = "Fill All Active Spawngroups", FontSize = 14, Font = Font, Align = TextAnchor.MiddleCenter
                    }
                }
                , mainName);
                top -= 0.06f;
                bottom -= 0.06f;
                float left = 0.07f, right = 0.18f;
                foreach (var entry in GotMonuments) {
                    if (counter % 4 != 0) {
                        left += 0.2f;
                        right += 0.2f;
                    }
                    if (counter % 4 == 0) {
                        left = 0.1f;
                        right = 0.29f;
                        top -= 0.03f;
                        bottom -= 0.03f;
                    }
                    elements.Add(new CuiButton {
                        Button = {
                            Command = $"MSCOpenMonument {d(entry.Key)}", Color = configData.ButtonColour
                        }
                        , RectTransform = {
                            AnchorMin = $"{left} {top}", AnchorMax = $"{right} {bottom}"
                        }
                        , Text = {
                            Text = entry.Key, FontSize = 11, Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainName);
                    counter++;
                }
            }
            CuiHelper.AddUi(player, elements);
        }
#endregion
#region UICommands
        [ConsoleCommand("CloseMSC")]
        private void CloseMSC(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            DestroyMenu(player, true);
            ApplySettings("", "");
        }
        [ConsoleCommand("MSCOpenMonument")]
        private void MSCOpenMonument(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCOpenHandler")]
        private void MSCOpenHandler(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCBack")]
        private void MSCBack(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            DestroyMenu(player, false);
            if (arg.Args.Length == 1) MSCMainUI(player, "");
            else MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCDisable")]
        private void MSCDisable(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            if (arg.Args.Length == 1) {
                string flag = null;
                foreach (var entry in configData.GotMonuments[u(arg.Args[0])]) {
                    if (flag == null) flag = (!entry.Value.CurrentSettings.enabled).ToString();
                    entry.Value.CurrentSettings.enabled = Convert.ToBoolean(flag);
                    if (!entry.Value.CurrentSettings.enabled) ClearSpawnGroup(u(arg.Args[0]), "");
                    else FillSpawnGroup(u(arg.Args[0]), "");
                }
                ApplySettings("", "");
            }
            else {
                bool value = configData.GotMonuments[u(arg.Args[0])][u(arg.Args[1])].CurrentSettings.enabled;
                configData.GotMonuments[u(arg.Args[0])][u(arg.Args[1])].CurrentSettings.enabled = !value;
                if (!value == false) ClearSpawnGroup(u(arg.Args[0]), u(arg.Args[1]));
                else FillSpawnGroup(u(arg.Args[0]), u(arg.Args[1]));
                ApplySettings(u(arg.Args[0]), u(arg.Args[1]));
            }
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCIncreaseAmount")]
        private void MSCIncreaseAmount(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            var record = configData.GotMonuments[u(arg.Args[0])][u(arg.Args[1])].CurrentSettings;
            if (arg.Args.Length == 3) record.Max_Number_To_Spawn_Per_Check = Mathf.Max(record.Max_Number_To_Spawn_Per_Check - 1, 1);
            else record.Max_Number_To_Spawn_Per_Check++;
            record.Max_Number_To_Spawn_Per_Check = Mathf.Min(record.Max_Population, record.Max_Number_To_Spawn_Per_Check);
            ApplySettings(u(arg.Args[0]), u(arg.Args[1]));
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCIncreaseMaxPop")]
        private void MSCIncreaseMaxPop(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            var record = configData.GotMonuments[u(arg.Args[0])][u(arg.Args[1])].CurrentSettings;
            if (arg.Args.Length == 3) record.Max_Population = Mathf.Max(record.Max_Population - 1, 1);
            else record.Max_Population++;
            record.Max_Population = Mathf.Min(record.SpawnPoints, record.Max_Population);
            record.Max_Number_To_Spawn_Per_Check = Mathf.Min(record.Max_Population, record.Max_Number_To_Spawn_Per_Check);
            ApplySettings(u(arg.Args[0]), u(arg.Args[1]));
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCIncreaseDuration")]
        private void MSCIncreaseDuration(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            var record = configData.GotMonuments[u(arg.Args[0])][u(arg.Args[1])].CurrentSettings;
            if (arg.Args.Length == 3) record.Population_Check_Interval = Mathf.Max(record.Population_Check_Interval - 1, 1);
            else record.Population_Check_Interval++;
            if (record.Population_Check_Interval > Int16.MaxValue || record.Population_Check_Interval < 0) record.Population_Check_Interval = 30;
            ApplySettings(u(arg.Args[0]), u(arg.Args[1]));
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCReset")]
        private void MSCReset(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            if (arg.Args.Length == 1) {
                foreach (var entry in configData.GotMonuments[u(arg.Args[0])]) {
                    entry.Value.CurrentSettings = entry.Value.DefaultSettings.Clone();
                    ClearSpawnGroup(u(arg.Args[0]), "");
                    FillSpawnGroup(u(arg.Args[0]), "");
                }
                ApplySettings("", "");
            }
            else {
                configData.GotMonuments[u(arg.Args[0])][u(arg.Args[1])].CurrentSettings = configData.GotMonuments[u(arg.Args[0])][u(arg.Args[1])].DefaultSettings.Clone();
                ClearSpawnGroup(u(arg.Args[0]), u(arg.Args[1]));
                FillSpawnGroup(u(arg.Args[0]), u(arg.Args[1]));
                ApplySettings(u(arg.Args[0]), u(arg.Args[1]));
            }
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCEmpty")]
        private void MSCEmpty(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            if (arg.Args.Length == 1) ClearSpawnGroup(u(arg.Args[0]), "");
            else ClearSpawnGroup(u(arg.Args[0]), u(arg.Args[1]));
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCFill")]
        private void MSCFill(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            if (arg.Args.Length == 1) FillSpawnGroup(u(arg.Args[0]), "");
            else FillSpawnGroup(u(arg.Args[0]), u(arg.Args[1]));
            DestroyMenu(player, false);
            MSCMainUI(player, u(arg.Args[0]));
        }
        [ConsoleCommand("MSCFillAll")]
        private void MSCFillAll(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            foreach (var monument in GotMonuments) foreach (var set in monument.Value) foreach (var group in set.Value.Where(x => x.enabled == true)) FillSpawnGroup(monument.Key, set.Key);
        }
#endregion
#region methods
        string d(string i) => i.Replace(" ", "-");
        string u(string i) => i.Replace("-", " ");
        void ClearSpawnGroup(string monument, string group) {
            if (GotMonuments.ContainsKey(monument)) foreach (var entry in GotMonuments[monument].Where(x => group == string.Empty || x.Key == group)) foreach (var sg in entry.Value) sg.Clear();
        }
        void FillSpawnGroup(string monument, string group) {
            if (GotMonuments.ContainsKey(monument)) foreach (var entry in GotMonuments[monument].Where(x => group == string.Empty || x.Key == group)) foreach (var sg in entry.Value) sg.Fill();
        }
        void GetMonuments() {
            var Resets = UnityEngine.Object.FindObjectsOfType<PuzzleReset>();
            foreach (var monumentInfo in TerrainMeta.Path.Monuments.OrderBy(x => x.displayPhrase.english)) {
                var displayPhrase = monumentInfo.displayPhrase.english.Replace("\n", string.Empty);
                GameObject gobject = monumentInfo.gameObject;
                var pos = monumentInfo.gameObject.transform.position;
                var sgs = new List<SpawnGroup>();
                if (displayPhrase != string.Empty) {
                    if (displayPhrase.Contains("Rig") || displayPhrase.Contains("Lab")) Vis.Components<SpawnGroup>(gobject.transform.position, 50, sgs);
                    else sgs = monumentInfo.GetComponentsInChildren<SpawnGroup>().ToList();
                    foreach (var obje in sgs) {
                        if (obje?.spawnPoints == null || obje.spawnPoints.Count() == 0) continue;
                        string name = obje.name.ToLower();
                        if (Match(name)) {
                            if (obje.respawnDelayMax == Single.PositiveInfinity) continue;
                            foreach (var reset in Resets) if (obje != null && reset?.respawnGroups != null && reset.respawnGroups.ToList().Contains(obje)) continue;
                            if (!GotMonuments.ContainsKey(displayPhrase)) {
                                GotMonuments.Add(displayPhrase, new Dictionary<string, List<SpawnGroup>>());
                                if (!configData.GotMonuments.ContainsKey(displayPhrase)) configData.GotMonuments.Add(displayPhrase, new Dictionary<string, MonumentSettings>());
                            }
                            var settings = new Settings();
                            if (!GotMonuments[displayPhrase].ContainsKey(obje.name)) {
                                GotMonuments[displayPhrase].Add(obje.name, new List<SpawnGroup>());
                                settings = new Settings() {
                                    enabled = obje.enabled, SpawnPoints = obje.spawnPoints.Count(), Max_Population = obje.maxPopulation, Max_Number_To_Spawn_Per_Check = obje.maxPopulation, Population_Check_Interval = Mathf.Max(Mathf.Floor(obje.respawnDelayMax / 60), 1)
                                }
                                ;
                                if (!configData.GotMonuments[displayPhrase].ContainsKey(obje.name)) {
                                    configData.GotMonuments[displayPhrase].Add(obje.name, new MonumentSettings() {
                                        CurrentSettings = settings, DefaultSettings = settings
                                    }
                                    );
                                }
                                if (newsave) configData.GotMonuments[displayPhrase][obje.name].DefaultSettings = settings;
                            }
                            configData.GotMonuments[displayPhrase][obje.name].CurrentSettings.SpawnPoints = obje.spawnPoints.Count();
                            GotMonuments[displayPhrase][obje.name].Add(obje);
                        }
                    }
                }
            }
        }
        List<string> names = new List<string>() {
            "red", "blue", "green", "crate", "barrel", "food", "card", "ore", "elite", "diesel"
        }
        ;
        bool Match(string name) {
            foreach (var entry in names) if (name.Contains(entry)) return true;
            return false;
        }
        void ApplySettings(string m, string g, bool fix = false) {
            if (configData == null) return;
            if (m != "") {
                var record = configData.GotMonuments[m][g];
                var s = GotMonuments[m][g];
                SetValues(record.CurrentSettings, s);
            }
            else {
                foreach (var mon in configData.GotMonuments.ToDictionary(pair => pair.Key, pair => pair.Value)) {
                    if (!GotMonuments.ContainsKey(mon.Key)) continue;
                    foreach (var handler in mon.Value) if (GotMonuments[mon.Key].ContainsKey(handler.Key)) SetValues(configData.GotMonuments[mon.Key][handler.Key].CurrentSettings, GotMonuments[mon.Key][handler.Key], fix);
                }
                SaveConfig(configData);
            }
        }
        void SetValues(Settings s, List<SpawnGroup> gs, bool fix = false) {
            foreach (var sg in gs) {
                if (sg == null) continue;
                sg.enabled = s.enabled;
                sg.maxPopulation = s.Max_Population;
                sg.numToSpawnPerTickMin = sg.numToSpawnPerTickMax = s.Max_Number_To_Spawn_Per_Check;
                if (!fix) sg.respawnDelayMin = sg.respawnDelayMax = s.Population_Check_Interval * 60;
                else {
                    sg.respawnDelayMin = sg.respawnDelayMax = 1800;
                    s.Population_Check_Interval = 30;
                }
                sg?.spawnClock?.events?.Clear();
                //sg?.spawnClock?.Add(sg.GetSpawnDelta(), sg.GetSpawnVariance(), new Action(sg.Spawn));
                sg?.spawnClock?.Add(sg.GetSpawnDelta(), sg.GetSpawnVariance(), new Action(() => Spawn(sg)));
            }
        }
        void Spawn(SpawnGroup sg) {
            Vector3 vector3;
            Quaternion quaternion;
            var numToSpawn = Mathf.Min(sg.numToSpawnPerTickMax, sg.maxPopulation - sg.currentPopulation);
            for (int i = 0; i < numToSpawn; i++) {
                GameObjectRef prefab = GetPrefab(sg);
                if (prefab != null && !string.IsNullOrEmpty(prefab.guid)) {
                    BaseSpawnPoint spawnPoint = GetSpawnPoint(sg, prefab, out vector3, out quaternion);
                    if (spawnPoint) {
                        BaseEntity baseEntity = GameManager.server.CreateEntity(prefab.resourcePath, vector3, quaternion, false);
                        if (baseEntity) {
                            if (baseEntity.enableSaving && !(spawnPoint is SpaceCheckingSpawnPoint)) {
                                baseEntity.enableSaving = false;
                            }
                            baseEntity.gameObject.AwakeFromInstantiate();
                            baseEntity.Spawn();
                            //sg.PostSpawnProcess(baseEntity, spawnPoint);
                            SpawnPointInstance spawnPointInstance = baseEntity.gameObject.AddComponent<SpawnPointInstance>();
                            spawnPointInstance.parentSpawnPointUser = sg;
                            spawnPointInstance.parentSpawnPoint = spawnPoint;
                            spawnPointInstance.Notify();
                        }
                    }
                }
            }
        }
        protected GameObjectRef GetPrefab(SpawnGroup sg) {
            GameObjectRef gameObjectRef;
            float single = (float)sg.prefabs.Sum<SpawnGroup.SpawnEntry>((SpawnGroup.SpawnEntry x) => {
                if (sg.preventDuplicates && sg.HasSpawned(x.prefab.resourceID)) {
                    return 0;
                }
                return x.weight;
            }
            );
            if (single == 0f) {
                return null;
            }
            float single1 = UnityEngine.Random.Range(0f, single);
            List<SpawnGroup.SpawnEntry>.Enumerator enumerator = sg.prefabs.GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    SpawnGroup.SpawnEntry current = enumerator.Current;
                    float single2 = single1 - (float)((!sg.preventDuplicates || !sg.HasSpawned(current.prefab.resourceID) ? current.weight : 0));
                    single1 = single2;
                    if (single2 > 0f) {
                        continue;
                    }
                    gameObjectRef = current.prefab;
                    return gameObjectRef;
                }
                return sg.prefabs[sg.prefabs.Count - 1].prefab;
            }
            finally {
                ((IDisposable)enumerator).Dispose();
            }
            return gameObjectRef;
        }
        protected virtual BaseSpawnPoint GetSpawnPoint(SpawnGroup sg, GameObjectRef prefabRef, out Vector3 pos, out Quaternion rot) {
            BaseSpawnPoint baseSpawnPoint = null;
            pos = Vector3.zero;
            rot = Quaternion.identity;
            int num = UnityEngine.Random.Range(0, (int)sg.spawnPoints.Length);
            int num1 = 0;
            while (num1 < (int)sg.spawnPoints.Length) {
                BaseSpawnPoint baseSpawnPoint1 = sg.spawnPoints[(num + num1) % (int)sg.spawnPoints.Length];
                if (baseSpawnPoint1 == null || !baseSpawnPoint1.IsAvailableTo(prefabRef.Get()) || BaseNetworkable.HasCloseConnections(baseSpawnPoint1.transform.position, 30))  // replace with a height agnostic check.{
                num1++;
            }
            else {
                baseSpawnPoint = baseSpawnPoint1;
                break;
            }
        }
        if (baseSpawnPoint) {
            baseSpawnPoint.GetLocation(out pos, out rot);
        }
        return baseSpawnPoint;
    }
#endregion
#region config
    private ConfigData configData;
    class ConfigData {
        public string ButtonColour = "0.7 0.32 0.17 1";
        public string ButtonColour2 = "0.4 0.1 0.1 1";
        public Dictionary<string, Dictionary<string, MonumentSettings>> GotMonuments = new Dictionary<string, Dictionary<string, MonumentSettings>>();
    }
    public class MonumentSettings {
        public Settings CurrentSettings = new Settings();
        public Settings DefaultSettings = new Settings();
    }
    public class Settings {
        public Settings Clone() {
            return MemberwiseClone() as Settings;
        }
        public bool enabled = true;
        public int SpawnPoints = 0;
        public int Max_Population = 10;
        public int Max_Number_To_Spawn_Per_Check = 10;
        public float Population_Check_Interval = 30;
    }
    private void LoadConfigVariables() {
        configData = Config.ReadObject<ConfigData>();
        SaveConfig(configData);
    }
    protected override void LoadDefaultConfig() {
        LoadConfigVariables();
        Puts("Creating new config file.");
    }
    void SaveConfig(ConfigData config) => Config.WriteObject(config, true);
#endregion
}
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху