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] ...