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

FREE EventsManager : 3.1.2 3.1.2

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using Facepunch;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using UnityEngine.UI;
#if CARBON
using Carbon.Base;
using Carbon.Modules;
#endif
namespace Oxide.Plugins {
    [Info("EventsManager", "Mevent & Qbis", "3.1.2")]
    internal class EventsManager : RustPlugin {
#region Fields
        [PluginReference]
        private Plugin ImageLibrary = null;
#if CARBON
        private ImageDatabaseModule imageDatabase;
#endif
        private const string PERM_USE = "EventsManager.use";
        private const string NewDot = ", ";
        private static EventsManager instance;
        private EventController controller;
        private HashSet<EventSchedule> disabledEvents = new();
        private const string imageDefault = "https://i.ibb.co/Df3JWnx4/default-icon.png", imageRandom = "https://i.ibb.co/r26hSsqL/random-icon.pngR";
#endregion
#region Classes
        private class Event {
            public string displayName = "Enter event name...";
            public string pluginName = "Enter event plugin name...";
            public string command = "Enter command...";
            public string creator = "Choose event creator...";
            public int eventId = UnityEngine.Random.Range(0, int.MaxValue);
            [JsonIgnore]
            public bool isLoaded;
        }
        private class EventTime : ICloneable {
            [JsonConverter(typeof(StringEnumConverter))]
            public EventType type = EventType.Static;
            [JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public HashSet<DayOfWeek> activeDays = new HashSet<DayOfWeek>();
            public int hour;
            public int minute;
            public int interval;
            public int offsetMin;
            public int offsetMax;
            public int minPlayers;
            [JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public List<int> eventsId = new List<int>();
            [JsonIgnore]
            public DateTime lastRun = DateTime.Now;
            [JsonIgnore]
            public int nextOffset = 0;
            [JsonIgnore]
            public string displayInfo;
            public void UpdateOffset() => nextOffset = offsetMin != 0 && offsetMax != 0 && offsetMax >= offsetMin ? UnityEngine.Random.Range(offsetMin, offsetMax + 1) : 0;
            public void UpdateInfo() {
                var sb = Pool.Get<StringBuilder>();
                switch (type) {
                    case EventType.Static : {
                        sb.AppendFormat("{0:00}:{1:00} - ", hour, minute);
                        GetDays(ref sb);
                        break;
                    }
                    case EventType.Every : {
                        sb.AppendFormat("Every {0} minutes", interval);
                        break;
                    }
                    case EventType.Random : {
                        sb.AppendFormat($"Every {offsetMin} - {offsetMax} minutes");
                        break;
                    }
                }
                displayInfo = sb.ToString();
                Pool.FreeUnmanaged(ref sb);
            }
            public void GetDays(ref StringBuilder sb) {
                switch (activeDays.Count) {
                    case 3 : case 4 : {
                        foreach (var d in activeDays) sb.Append(d.ToString().Substring(0, 3)).Append(NewDot);
                        sb.Length -= 2;
                        break;
                    }
                    case 5 : case 6 : {
                        foreach (var d in activeDays) sb.Append(d.ToString().Substring(0, 1)).Append(NewDot);
                        sb.Length -= 2;
                        break;
                    }
                    case 7 : case 0 : {
                        sb.Append("Everyday");
                        break;
                    }
                    default : {
                        foreach (var d in activeDays) sb.Append(d.ToString()).Append(NewDot);
                        sb.Length -= 2;
                        break;
                    }
                }
            }
            public object Clone() {
                return MemberwiseClone();
            }
        }
        private enum EventType {
            Static, Every, Random
        }
#endregion
#region Configuration
        private Configuration config;
        private class Configuration {
            [JsonProperty(PropertyName = "Disable vanilla auto events?")]
            public bool DisableVanillaAutoEvents = true;
            public VersionNumber Version;
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config == null) throw new JsonException();
                if (config.Version < Version) UpdateConfigValues();
                SaveConfig();
            }
            catch (Exception ex) {
                PrintError("Your configuration file contains an error!");
                Debug.LogException(ex);
            }
        }
        protected override void SaveConfig() {
            Config?.WriteObject(config, true);
        }
        protected override void LoadDefaultConfig() {
            config = new Configuration();
        }
        private void UpdateConfigValues() {
            PrintWarning("Config update detected! Updating config values...");
            if (config.Version < new VersionNumber(3, 0, 0)) {
            }
            config.Version = Version;
            PrintWarning("Config update completed!");
        }
#endregion
#region Hooks
        private void OnServerInitialized() {
            instance = this;
            permission.RegisterPermission(PERM_USE, this);
            LoadData();
            data?.CheckEmptyData();
            DisableVanillaEvents();
            CreateController();
            UpdateEventList();
            LoadImages();
            CheckIsEventsLoaded();
        }
        private void Unload() {
            DestroyController();
            EnableVanillaEvents();
            DestroyUI();
            instance = null;
        }
        private void OnPlayerDisconnected(BasePlayer player, string reason) {
            if (player == null) return;
            _interface.Remove(player.userID);
        }
#endregion
#region Utils
        private void LoadImages() {
#if CARBON
            imageDatabase = BaseModule.GetModule<ImageDatabaseModule>();
#endif
            var imagesList = new Dictionary<string, string>() {
                [imageDefault]
                = imageDefault, [imageRandom] = imageRandom
            }
            ;
#if CARBON
            imageDatabase.Queue(false, imagesList);
#else
            timer.In(1f, () => {
                if (ImageLibrary is not {
                    IsLoaded : true
                }
                ) {
                    PrintError("IMAGE LIBRARY IS NOT INSTALLED!");
                    return;
                }
                ImageLibrary?.Call("ImportImageList", Title, imagesList, 0UL, true);
            }
            );
#endif
        }
        private string GetImage(string name) {
#if CARBON
            return imageDatabase.GetImageString(name);
#else
            return Convert.ToString(ImageLibrary?.Call("GetImage", name));
#endif
        }
        private void DisableVanillaEvents() {
            if (!config.DisableVanillaAutoEvents) return;
            var eventSchedules = EventSchedule.allEvents.ToArray();
            for (var i = eventSchedules.Length - 1; i >= 0; i--) {
                var eventSchedule = eventSchedules[i];
                var evenName = eventSchedule.GetName();
                eventSchedule.enabled = false;
                disabledEvents.Add(eventSchedule);
            }
            Puts("Vanilla events are disabled");
        }
        private void EnableVanillaEvents() {
            if (config.DisableVanillaAutoEvents) foreach (var ev in disabledEvents) ev.enabled = true;
        }
        private void CreateController() {
            controller = ServerMgr.Instance.gameObject.AddComponent<EventController>();
        }
        private void DestroyController() {
            if (controller != null) UnityEngine.Object.Destroy(controller);
        }
        private void DestroyUI() {
            foreach (var userId in _interface.Keys) {
                var player = BasePlayer.FindByID(userId);
                if (player == null) continue;
                CuiHelper.DestroyUi(player, LayerBackground);
            }
        }
        private void CheckIsEventsLoaded() {
            foreach (var @event in data.events) {
                if (@event.creator == "Facepunch") {
                    @event.isLoaded = true;
                    continue;
                }
                @event.isLoaded = instance.plugins.Exists(@event.pluginName);
            }
        }
        private void CheckIsEventsLoaded(string eventName) {
            var @event = data.events.Find(e => e.displayName == eventName);
            if (@event == null) return;
            @event.isLoaded = instance.plugins.Exists(@event.pluginName);
        }
#endregion
#region Data
        private PluginData data;
        private void LoadData() => data = new PluginData();
        private class PluginData {
            public List<string> creators = new List<string>();
            public List<Event> events = new List<Event>();
            public List<EventTime> eventTimes = new List<EventTime>();
            public PluginData() {
                LoadData();
            }
            public void SaveData() {
                SaveCreators();
                SaveEvents();
                SaveTimes();
            }
            public void SaveCreators() => Interface.Oxide.DataFileSystem.WriteObject("EventManager" + Path.DirectorySeparatorChar + "CreatorsSettings", creators);
            public void SaveEvents() => Interface.Oxide.DataFileSystem.WriteObject("EventManager" + Path.DirectorySeparatorChar + "EventsSettings", events);
            public void SaveTimes() {
                Interface.Oxide.DataFileSystem.WriteObject("EventManager" + Path.DirectorySeparatorChar + "TimesSettings", eventTimes);
                instance.UpdateEventList();
            }
            public void LoadData() {
                try {
                    creators = Interface.Oxide.DataFileSystem.ReadObject<List<string>>("EventManager" + Path.DirectorySeparatorChar + "CreatorsSettings");
                    events = Interface.Oxide.DataFileSystem.ReadObject<List<Event>>("EventManager" + Path.DirectorySeparatorChar + "EventsSettings");
                    eventTimes = Interface.Oxide.DataFileSystem.ReadObject<List<EventTime>>("EventManager" + Path.DirectorySeparatorChar + "TimesSettings");
                }
                catch (Exception e) {
                    instance.PrintError(e.ToString());
                }
                eventTimes?.ForEach(e => {
                    e.UpdateInfo();
                    e.UpdateOffset();
                }
                );
            }
            public void CheckEmptyData() {
                if (creators.Count == 0 && events.Count == 0 && eventTimes.Count == 0) {
                    ResetToDefault();
                    instance.PrintWarning("Load default data for Event Manager");
                }
            }
            public void ResetToDefault() {
                LoadDefaultEvents();
                LoadDefaultCreators();
                eventTimes.Clear();
                SaveData();
                instance.UpdateEventList();
            }
            public void LoadDefaultCreators() {
                creators = new() {
                    "Facepunch", "KpucTaJl", "Adem", "Mercury", "Yac Vaguer", "DezLife", "Cashr", "Nikedemos", "Ridamees", "Fruster", "Bazz3l", "Nivex", "Dana", "Razor", "ThePitereq", "k1lly0u", "Wrecks"
                }
                ;
            }
            public void LoadDefaultEvents() {
                events = new() {
                    //Facepunch
                    new Event() {
                        displayName = "Helicopter", command = "em_spawn assets/prefabs/npc/patrol helicopter/patrolhelicopter.prefab", creator = "Facepunch"
                    }
                    , new Event() {
                        displayName = "Airdrop", command = "em_spawn assets/prefabs/misc/supply drop/supply_drop.prefab", creator = "Facepunch"
                    }
                    , new Event() {
                        displayName = "Chinook 47", command = "em_spawn assets/prefabs/npc/ch47/ch47scientists.entity.prefab", creator = "Facepunch"
                    }
                    , new Event() {
                        displayName = "Cargoship", command = "em_spawn assets/content/vehicles/boats/cargoship/cargoshiptest.prefab", creator = "Facepunch"
                    }
                    ,  //KpucTaJl
                    new Event() {
                        displayName = "Air Event", command = "airstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Water Event", command = "waterstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Arctic Base Event", command = "abstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Satellite Dish Event", command = "satdishstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Junkyard Event", command = "jstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Power Plant Event", command = "ppstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Harbor Event", command = "harborstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Squid Game", command = "rlglstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Triangulation", command = "tstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Supermarket Event", command = "supermarketstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Ferry Terminal Event", command = "ftstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "GasStation Event", command = "gsstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Defendable-Bases Start", command = "warstart", creator = "KpucTaJl"
                    }
                    , new Event() {
                        displayName = "Defendable-Bases Stop", command = "warstop", creator = "KpucTaJl"
                    }
                    ,  //Adem
                    new Event() {
                        displayName = "Sputnik", command = "sputnikstart", creator = "Adem"
                    }
                    , new Event() {
                        displayName = "Armored Train", command = "atrainstart", creator = "Adem"
                    }
                    , new Event() {
                        displayName = "Space", command = "spacestart", creator = "Adem"
                    }
                    , new Event() {
                        displayName = "Convoy", command = "convoystart", creator = "Adem"
                    }
                    , new Event() {
                        displayName = "Shipwreck", command = "shipwreckstart", creator = "Adem"
                    }
                    , new Event() {
                        displayName = "Caravan", command = "caravanstart", creator = "Adem"
                    }
                    ,  //Mercury
                    new Event() {
                        displayName = "IQSphereEvent", command = "iqsp start", creator = "Mercury"
                    }
                    ,  //Yac Vaguer
                    new Event() {
                        displayName = "Water-Treatment-Showdown", command = "wtestart", creator = "Yac Vaguer"
                    }
                    ,  //DezLife
                    new Event() {
                        displayName = "Cobalt Laboratory", command = "cl start", creator = "DezLife"
                    }
                    , new Event() {
                        displayName = "XDChinookEvent", command = "chinook call", creator = "DezLife"
                    }
                    ,  //Cashr
                    new Event() {
                        displayName = "Rocket Event", command = "rocket ||", creator = "Cashr"
                    }
                    ,  //Nikedemos
                    new Event() {
                        displayName = "CargoTrainEvent", command = "trainevent_now", creator = "Nikedemos"
                    }
                    ,  //Ridamees
                    new Event() {
                        displayName = "Stone Event", command = "StoneStart", creator = "Ridamees"
                    }
                    , new Event() {
                        displayName = "Metal Event", command = "MetalStart", creator = "Ridamees"
                    }
                    , new Event() {
                        displayName = "Sulfur Event", command = "SulfurStart", creator = "Ridamees"
                    }
                    , new Event() {
                        displayName = "RaidRush Event", command = "raidrush.start", creator = "Ridamees"
                    }
                    , new Event() {
                        displayName = "BarrelBash Event", command = "StartBarrelBash", creator = "Ridamees"
                    }
                    , new Event() {
                        displayName = "BoxBattle Event", command = "StartBoxBattle", creator = "Ridamees"
                    }
                    ,  //Fruster
                    new Event() {
                        displayName = "CargoPlaneEvent", command = "callcargoplane", creator = "Fruster"
                    }
                    , new Event() {
                        displayName = "AirfieldEvent", command = "afestart", creator = "Fruster"
                    }
                    , new Event() {
                        displayName = "HelipadEvent", command = "hpestart", creator = "Fruster"
                    }
                    ,  //Bazz3l
                    new Event() {
                        displayName = "GuardedCrate Easy", command = "gcrate start Easy", creator = "Bazz3l"
                    }
                    , new Event() {
                        displayName = "GuardedCrate Medium", command = "gcrate start Medium", creator = "Bazz3l"
                    }
                    , new Event() {
                        displayName = "GuardedCrate Hard", command = "gcrate start Hard", creator = "Bazz3l"
                    }
                    , new Event() {
                        displayName = "GuardedCrate Elite", command = "gcrate start Elite", creator = "Bazz3l"
                    }
                    ,  //Nivex
                    new Event() {
                        displayName = "Dangerous Treasures", command = "dtevent", creator = "Nivex"
                    }
                    , new Event() {
                        displayName = "RaidableBases Easy", command = "rbevent easy", creator = "Nivex"
                    }
                    , new Event() {
                        displayName = "RaidableBases Medium", command = "rbevent medium", creator = "Nivex"
                    }
                    , new Event() {
                        displayName = "RaidableBases Hard", command = "rbevent hard", creator = "Nivex"
                    }
                    , new Event() {
                        displayName = "RaidableBases Nightmare", command = "rbevent nightmare", creator = "Nivex"
                    }
                    ,  //Dana
                    new Event() {
                        displayName = "Heli Regular", command = "heli.call Regular", creator = "Dana"
                    }
                    , new Event() {
                        displayName = "Heli Millitary", command = "heli.call Millitary", creator = "Dana"
                    }
                    , new Event() {
                        displayName = "Heli Elite", command = "heli.call Elite", creator = "Dana"
                    }
                    ,  //Razor
                    new Event() {
                        displayName = "Jet Event", command = "jet event 2 2 10", creator = "Razor"
                    }
                    ,  //ThePitereq
                    new Event() {
                        displayName = "Meteor-Event-Kill", command = "ms kill", creator = "ThePitereq"
                    }
                    , new Event() {
                        displayName = "Meteor-Event-Start-Amount-10", command = "ms run 10", creator = "ThePitereq"
                    }
                    , new Event() {
                        displayName = "Meteor-Event-Start-Amount-20", command = "ms run 20", creator = "ThePitereq"
                    }
                    , new Event() {
                        displayName = "Meteor-Event-Start-Amount-30", command = "ms run 30", creator = "ThePitereq"
                    }
                    , new Event() {
                        displayName = "Meteor-Event-Start-Amount-40", command = "ms run 40", creator = "ThePitereq"
                    }
                    , new Event() {
                        displayName = "Meteor-Event-Start-Amount-50", command = "ms run 50", creator = "ThePitereq"
                    }
                    ,  //k1lly0u
                    new Event() {
                        displayName = "PilotEjec", command = "pe call", creator = "k1lly0u"
                    }
                    , new Event() {
                        displayName = "HeliRefuel", command = "hr call", creator = "k1lly0u"
                    }
                    ,  //Wrecks
                    new Event() {
                        displayName = "Eradication Event", command = "Erad", creator = "Wrecks"
                    }
                    , new Event() {
                        displayName = "Bot-Purge-Event", command = "Purge", creator = "Wrecks"
                    }
                }
                ;
                foreach (var @event in events) {
                    if (@event.creator == "Facepunch") continue;
                    if (@event.displayName.Contains("Defendable-Bases")) @event.pluginName = "DefendableBases";
                    else if (@event.displayName.Contains("GuardedCrate")) @event.pluginName = "GuardedCrate";
                    else if (@event.displayName.Contains("RaidableBases")) @event.pluginName = "RaidableBases";
                    else if (@event.displayName.Contains("Meteor-Event")) @event.pluginName = "MeteorEvent";
                    else {
                        var @string = Regex.Replace(@event.displayName, @"[^\w\^0-9a-zA-Z]", "");
                        @event.pluginName = @string;
                    }
                }
                instance.CheckIsEventsLoaded();
            }
        }
#endregion
#region Controller
        private class EventController : FacepunchBehaviour {
            private void Awake() {
                InvokeRepeating(EventTimer, 10, 10);
            }
            private void EventTimer() {
                var hour = DateTime.Now.Hour;
                var minute = DateTime.Now.Minute;
                var day = DateTime.Now.DayOfWeek;
                foreach (var @event in instance.data.eventTimes) {
                    if (@event.eventsId.IsEmpty() || @event.minPlayers > BasePlayer.activePlayerList.Count) continue;
                    switch (@event.type) {
                        case EventType.Static : {
                            if (!@event.activeDays.IsEmpty() && !@event.activeDays.Contains(DateTime.Now.DayOfWeek)) continue;
                            var startHour = @event.hour + (@event.nextOffset / 60);
                            var startMinute = @event.minute + (@event.nextOffset % 60);
                            if (startMinute >= 60) {
                                startHour++;
                                startMinute -= 60;
                            }
                            if (@event.lastRun.DayOfWeek == day && @event.lastRun.Hour == hour && @event.lastRun.Minute == minute) continue;
                            if (hour == startHour && minute == startMinute) {
                                var id = @event.eventsId[UnityEngine.Random.Range(0, @event.eventsId.Count)];
                                var startEvent = instance.data.events.Find(e => e.eventId == id);
                                if (startEvent == null) continue;
                                instance.Server.Command(startEvent.command);
                                @event.lastRun = DateTime.Now;
                                CallEventManagerStartedEvent(startEvent.displayName);
                            }
                            break;
                        }
                        case EventType.Every : case EventType.Random : {
                            var startHour = @event.lastRun.Hour + ((@event.interval + @event.nextOffset) / 60);
                            var startMinute = @event.lastRun.Minute + ((@event.interval + @event.nextOffset) % 60);
                            if (startMinute >= 60) {
                                startHour += startMinute / 60;
                                startMinute -= startMinute / 60 * 60;
                            }
                            if (startHour > 24) startHour = startHour % 24;
                            if (@event.lastRun.Hour == hour && @event.lastRun.Minute == minute) continue;
                            if (hour == startHour && minute == startMinute) {
                                var id = @event.eventsId[UnityEngine.Random.Range(0, @event.eventsId.Count)];
                                var startEvent = instance.data.events.Find(e => e.eventId == id);
                                if (startEvent == null) continue;
                                instance.Server.Command(startEvent.command);
                                @event.lastRun = DateTime.Now;
                                @event.UpdateOffset();
                                CallEventManagerStartedEvent(startEvent.displayName);
                            }
                            break;
                        }
                    }
                }
            }
            private void OnDestroy() {
                CancelInvoke(EventTimer);
            }
        }
#endregion
#region API
        private static void CallEventManagerStartedEvent(string eventName) {
            Interface.Oxide.CallHook("OnEventStarted", eventName);
        }
        private void API_AddEvent(string creatorName, string displayName, string command, string pluginName) {
            var @event = data.events.Find(e => e.displayName == displayName);
            if (@event != null) return;
            if (!data.creators.Contains(creatorName)) data.creators.Add(creatorName);
            data.events.Add(new Event() {
                creator = creatorName, displayName = displayName, command = command, pluginName = pluginName
            }
            );
            CheckIsEventsLoaded(displayName);
            PrintWarning($"Event '{displayName}' added successfully under creator '{creatorName}'.");
        }
        public void UpdateEventList() {
            var list = Pool.Get<List<Dictionary<string, object>>>();
            try {
                foreach (var ev in data.eventTimes) {
                    if (ev.type != EventType.Static) continue;
                    var events = data.events.FindAll(e => ev.eventsId.Contains(e.eventId));
                    if (events.IsNullOrEmpty()) continue;
                    var description = $"description.{string.Join(", ", events.Select(e => e.displayName))}";
                    list.Add(new Dictionary<string, object> {
                        ["Name"]
                        = description, ["Description"] = description, ["Hour"] = ev.hour, ["Minute"] = ev.minute, ["Weeks"] = DaysEnumToArray(ev.activeDays)
                    }
                    );
                }
                if (list.Count > 0) Interface.Oxide.CallHook("AddEventManagerSchedule", list);
            }
            finally {
                Pool.FreeUnmanaged(ref list);
            }
        }
        private bool[] DaysEnumToArray(HashSet<DayOfWeek> days) {
            bool[] array = new bool[7];
            if (days.Count == 0) for (int i = 0; i < array.Length; i++) array[i] = true;
            else foreach (var day in days) array[(int)day] = true;
            return array;
        }
#endregion
#region Commands
        [ConsoleCommand("em_spawn")]
        private void cmdSpawn(ConsoleSystem.Arg arg) {
            if (!arg.HasArgs()) return;
            var player = arg.Player();
            if (player != null && !permission.UserHasPermission(player.UserIDString, PERM_USE)) return;
            var prefabName = string.Join(" ", arg.Args);
            if (string.IsNullOrEmpty(prefabName)) return;
            var entity = GameManager.server.CreateEntity(prefabName);
            if (entity == null) return;
            if (entity.TryGetComponent<CH47HelicopterAIController>(out var ch47)) ch47.TriggeredEventSpawn();
            else if (entity.TryGetComponent<CargoShip>(out var cargo)) cargo.TriggeredEventSpawn();
            else if (entity.TryGetComponent<SupplyDrop>(out var supply)) {
                var size = TerrainMeta.Size / 3f;
                entity.transform.position = new Vector3(UnityEngine.Random.Range(-size.x, size.x), 400f, UnityEngine.Random.Range(-size.y, size.y));
            }
            entity.Spawn();
        }
        [ConsoleCommand("eventmanager.reset.default")]
        private void CmdConsoleResetToDefault(ConsoleSystem.Arg arg) {
            if (!arg.IsServerside) return;
            data.ResetToDefault();
            SendReply(arg, "Load default data for Event Manager");
        }
#endregion
#region Interface
        private const string Command = "UI_EventsManager", LayerBackground = "EventsManager.Background", Layer = "EventsManager.Main", LayerBackgroundModal = "EventsManager.Background.Modal", LayerModal = "EventsManager.Main.Modal";
        private Dictionary<ulong, InterfaceAdmin> _interface = new Dictionary<ulong, InterfaceAdmin>();
        private class InterfaceAdmin {
            public string inputCreator;
            public Event editEvent;
            public EventTime editTime;
            public int editTimeIndex = -1;
            public int editIndex = -1;
            public int page;
        }
#region Commands
        [ChatCommand("em")]
        private void CmdNewEventManager(BasePlayer player) {
            if (!permission.UserHasPermission(player.UserIDString, PERM_USE)) {
                PrintError($"Player {player.UserIDString} don't have permission {PERM_USE} to use /em.");
                return;
            }
            _interface[player.userID] = new InterfaceAdmin();
            DrawMainUI(player);
        }
        [ConsoleCommand(Command)]
        private void CmdNewConsoleEventManager(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null || !arg.HasArgs() || !permission.UserHasPermission(player.UserIDString, PERM_USE)) {
                return;
            }
            if (!_interface.TryGetValue(player.userID, out var @interface)) return;
            switch (arg.Args[0]) {
                case "close" : {
                    CuiHelper.DestroyUi(player, LayerBackground);
                    _interface.Remove(player.userID);
                    break;
                }
                case "page" : {
                    if (!bool.TryParse(arg.Args[1], out var @default)) return;
                    DrawMainUI(player, @default, false);
                    break;
                }
                case "next" : {
                    var pages = Mathf.CeilToInt(data.creators.Count / (float)6);
                    if ((@interface.page + 1) < pages) @interface.page++;
                    DrawMainUI(player, true, false);
                    break;
                }
                case "prev" : {
                    @interface.page = Mathf.Max(0, @interface.page - 1);
                    DrawMainUI(player, true, false);
                    break;
                }
                case "event" : {
                    switch (arg.Args[1]) {
                        case "edit" : {
                            if (!int.TryParse(arg.Args[2], out var eventId)) return;
                            var @event = data.events.Find(e => e.eventId == eventId);
                            if (@event == null) return;
                            @interface.editEvent = @event;
                            @interface.editTime = new();
                            @interface.editTimeIndex = -1;
                            @interface.editIndex = -1;
                            DrawModal(player, "edit");
                            break;
                        }
                        case "new" : {
                            @interface.editEvent = new();
                            DrawModal(player, "new_event");
                            break;
                        }
                        case "save" : {
                            data.events.Add(@interface.editEvent);
                            data.SaveEvents();
                            CheckIsEventsLoaded();
                            UpdateEventList();
                            @interface.editEvent = new();
                            DrawMainUI(player);
                            break;
                        }
                        case "remove" : {
                            if (!int.TryParse(arg.Args[2], out var eventId)) return;
                            var @event = data.events.Find(e => e.eventId == eventId);
                            if (@event == null) return;
                            for (int i = 0; i < data.eventTimes.Count; i++) {
                                var time = data.eventTimes.ElementAt(i);
                                if (time == null) continue;
                                if (time.eventsId.Contains(eventId)) {
                                    time.eventsId.Remove(eventId);
                                    if (time.eventsId.Count == 0) {
                                        data.eventTimes.Remove(time);
                                        i--;
                                    }
                                }
                            }
                            data.events.Remove(@event);
                            data.SaveEvents();
                            data.SaveTimes();
                            UpdateEventList();
                            DrawMainUI(player, true, false);
                            break;
                        }
                        case "add" : {
                            var input = String.Join(" ", arg.Args.Skip(3));
                            if (string.IsNullOrEmpty(input)) {
                                DrawModal(player, "new_event");
                                return;
                            }
                            switch (arg.Args[2]) {
                                case "name" : {
                                    @interface.editEvent.displayName = input;
                                    break;
                                }
                                case "command" : {
                                    @interface.editEvent.command = input;
                                    break;
                                }
                                case "plugin" : {
                                    @interface.editEvent.pluginName = input;
                                    break;
                                }
                                case "creator" : {
                                    @interface.editEvent.creator = input;
                                    DrawModal(player, "new_event");
                                    break;
                                }
                            }
                            break;
                        }
                        case "time" : {
                            switch (arg.Args[2]) {
                                case "edit" : {
                                    if (!int.TryParse(arg.Args[3], out var index) || !int.TryParse(arg.Args[4], out var index2)) return;
                                    @interface.editTime = (EventTime)data.eventTimes[index].Clone();
                                    @interface.editTimeIndex = index;
                                    if (@interface.editEvent != null) {
                                        @interface.editTime.eventsId = new List<int> {
                                            @interface.editEvent.eventId
                                        }
                                        ;
                                        @interface.editIndex = index2;
                                        CuiElementContainer container = new();
                                        DrawModalTimes(player, container);
                                        CuiHelper.AddUi(player, container);
                                    }
                                    DrawModalTime(player);
                                    break;
                                }
                                case "new" : {
                                    @interface.editTime = new();
                                    @interface.editTimeIndex = -1;
                                    @interface.editIndex = -1;
                                    if (@interface.editEvent != null) @interface.editTime.eventsId = new List<int> {
                                        @interface.editEvent.eventId
                                    }
                                    ;
                                    DrawModalTime(player);
                                    break;
                                }
                                case "prev" : {
                                    if ((int)@interface.editTime.type - 1 < 0) @interface.editTime.type = EventType.Random;
                                    else @interface.editTime.type = (EventType)((int)@interface.editTime.type - 1);
                                    DrawModalTime(player);
                                    break;
                                }
                                case "next" : {
                                    if ((int)@interface.editTime.type + 1 > 2) @interface.editTime.type = EventType.Static;
                                    else @interface.editTime.type = (EventType)((int)@interface.editTime.type + 1);
                                    DrawModalTime(player);
                                    break;
                                }
                                case "hour" : {
                                    if (!int.TryParse(arg.Args[3], out var num) || num < 0 || num > 24) {
                                        DrawModalTime(player);
                                        return;
                                    }
                                    @interface.editTime.hour = num;
                                    break;
                                }
                                case "minute" : {
                                    if (!int.TryParse(arg.Args[3], out var num) || num < 0 || num > 60) {
                                        DrawModalTime(player);
                                        return;
                                    }
                                    @interface.editTime.minute = num;
                                    break;
                                }
                                case "offsetmin" : {
                                    if (!int.TryParse(arg.Args[3], out var num) || num < 0) {
                                        DrawModalTime(player);
                                        return;
                                    }
                                    if (num > @interface.editTime.offsetMax) {
                                        @interface.editTime.offsetMin = @interface.editTime.offsetMax;
                                        DrawModalTime(player);
                                        return;
                                    }
                                    @interface.editTime.offsetMin = num;
                                    break;
                                }
                                case "offsetmax" : {
                                    if (!int.TryParse(arg.Args[3], out var num) || num < 0) {
                                        DrawModalTime(player);
                                        return;
                                    }
                                    @interface.editTime.offsetMax = num;
                                    break;
                                }
                                case "interval" : {
                                    if (!int.TryParse(arg.Args[3], out var num) || num < 0) {
                                        DrawModalTime(player);
                                        return;
                                    }
                                    @interface.editTime.interval = num;
                                    break;
                                }
                                case "minplayers" : {
                                    if (!int.TryParse(arg.Args[3], out var num) || num < 0) {
                                        DrawModalTime(player);
                                        return;
                                    }
                                    @interface.editTime.minPlayers = num;
                                    break;
                                }
                                case "day" : {
                                    if (!Enum.TryParse(arg.Args[3], out DayOfWeek day)) return;
                                    if (@interface.editTime.activeDays.Contains(day)) @interface.editTime.activeDays.Remove(day);
                                    else @interface.editTime.activeDays.Add(day);
                                    DrawModalTime(player);
                                    break;
                                }
                                case "save" : {
                                    if (@interface.editTime.type == EventType.Random) @interface.editTime.interval = 0;
                                    else if (@interface.editTime.type == EventType.Every) {
                                        @interface.editTime.offsetMin = 0;
                                        @interface.editTime.offsetMax = 0;
                                    }
                                    @interface.editTime.UpdateInfo();
                                    @interface.editTime.UpdateOffset();
                                    if (@interface.editTimeIndex == -1) data.eventTimes.Add((EventTime)@interface.editTime.Clone());
                                    else data.eventTimes[@interface.editTimeIndex] = (EventTime)@interface.editTime.Clone();
                                    data.SaveTimes();
                                    @interface.editTime = new();
                                    DrawModal(player, "edit", false);
                                    break;
                                }
                                case "delete" : {
                                    if (@interface.editTimeIndex != -1) data.eventTimes.RemoveAt(@interface.editTimeIndex);
                                    data.SaveTimes();
                                    @interface.editTime = new();
                                    DrawModal(player, "edit", false);
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    break;
                }
                case "creator" : {
                    switch (arg.Args[1]) {
                        case "add" : {
                            DrawModal(player, "new_creator");
                            break;
                        }
                        case "name" : {
                            var name = String.Join(" ", arg.Args.Skip(2));
                            CuiElementContainer container = new();
                            DrawModalCreator(player, container, name);
                            CuiHelper.AddUi(player, container);
                            break;
                        }
                        case "save" : {
                            var name = String.Join(" ", arg.Args.Skip(2));
                            data.creators.Add(name);
                            data.SaveCreators();
                            DrawMainUI(player);
                            break;
                        }
                    }
                    break;
                }
                case "random" : {
                    switch (arg.Args[1]) {
                        case "time" : {
                            switch (arg.Args[2]) {
                                case "new" : {
                                    @interface.editTime = new();
                                    @interface.editTimeIndex = -1;
                                    @interface.editIndex = -1;
                                    @interface.editTime.eventsId = new();
                                    CuiElementContainer container = new();
                                    DrawRandomTime(player, container);
                                    CuiHelper.AddUi(player, container);
                                    break;
                                }
                                case "edit" : {
                                    if (!int.TryParse(a
// ... [Code preview truncated due to length. Full source in attached file] ...

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