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

FREE ExtraEvents : 1.8.0 1.8.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
/*
*  < ----- End-User License Agreement ----->
*
*  You may not copy, modify, merge, publish, distribute, sublicense, or sell copies of This Software without the Developer’s consent
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
*  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
*  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
*  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
*  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*
*  Developer: Rainey (rightasrainey@gmail.com)
*
*  Copyright © 2023 Rainey
*/
// V1.8.0
// - Added TunnelTussle Event - Kill tunnel dwellers to win!
// - Added RoadsignRun Event - Destroy roadsigns to win!
// - Added UnderwaterWar Event - Kill underwater lab scientists to win!
// - Added PlayerBattle Event - Kill players to win!
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Libraries.Covalence;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Random=UnityEngine.Random;
using ProtoBuf;
namespace Oxide.Plugins {
    [Info("ExtraEvents", "Rainey", "1.8.0")]
    [Description("Run mulitple competitive events for players to win awards.")]
    public class ExtraEvents : RustPlugin {
        [PluginReference]
        private Plugin ImageLibrary, Kits;
        private static ExtraEvents _instance;
        private ConfigData _configData;
        private PluginData _pluginData;
        private string adminPermission = "extraevents.admin";
        private string allEventsPermission = "extraevents.all";
        private const string OreWar = "orewar";
        private const string TreeTrimmers = "treetrimmers";
        private const string BarrelBreakers = "barrelbreakers";
        private const string FishingFrenzy = "fishingfrenzy";
        private const string BotBash = "botbash";
        private const string CrateClash = "crateclash";
        private const string AnimalAnnihilation = "animalannihilation";
        private const string ResourceRumble = "resourcerumble";
        private const string ResourceRun = "resourcerun";
        private const string TunnelTussle = "tunneltussle";
        private const string RoadsignRun = "roadsignrun";
        private const string UnderwaterWar = "underwaterwar";
        private const string PlayerBattle = "playerbattle";
        private const string UI_MAIN = "UI_MAIN";
        private const string UI_IMAGE = "UI_IMAGE";
        private Timer UIUpdateTimer, autoEventTimer, gameTipTimer, eventTimer;
        private string[] barrelShortPrefabNames = {
            "loot-barrel-1", "loot-barrel-2", "loot_barrel_1", "loot_barrel_2", "oil_barrel"
        }
        ;
        private string[] roadsignShortPrefabNames = {
            "roadsign1", "roadsign2", "roadsign3", "roadsign4", "roadsign5", "roadsign6", "roadsign7", "roadsign8", "roadsign9"
        }
        ;
        private string[] animalPrefabShortnames = {
            "chicken", "wolf", "bear", "boar", "polarbear", "stag"
        }
        ;
        private string[] containerPrefabShortNames = {
            "trash-pile-1", "crate_basic", "crate_elite", "crate_mine", "crate_normal", "crate_normal_2", "crate_normal_2_food", "crate_normal_2_medical", "crate_tools", "crate_underwater_advanced", "crate_underwater_basic", "dm ammo", "dm c4", "dm construction resources", "dm construction tools", "dm food", "dm medical", "dm res", "dm tier1 lootbox", "dm tier2 lootbox", "dm tier3 lootbox", "foodbox", "loot_barrel_1", "loot_barrel_2", "loot_component_test", "loot_trash", "minecart", "oil_barrel", "vehicle_parts", "codelockedhackablecrate", "codelockedhackablecrate_oilrig", "supply_drop", "giftbox_loot", "presentdrop", "bradley_crate", "heli_crate", "diesel_barrel_world", "visualshelvestest", "crate_ammunition", "crate_food_1", "crate_food_2", "crate_fuel", "crate_medical", "tech_parts_1", "tech_parts_2", "hiddenhackablecrate", "wagon_crate_normal", "wagon_crate_normal_2", "wagon_crate_normal_2_food", "wagon_crate_normal_2_medical", "xmastunnellootbox"
        }
        ;
        private Dictionary<ulong, int> playerList = new Dictionary<ulong, int>();
        private Dictionary<ulong, int> finalPlayerList = new Dictionary<ulong, int>();
        private List<string> rewardsList = new List<string>();
        private float eventStartTime, eventImageTransparency, eventGameTipDuration, eventMultipleWinnersDelay, eventMultiplier;
        private string message, debugMessage, currentEvent, eventName, eventDesc, eventChatPrefix, eventPermission, eventImage, eventImageMinAnchors, eventImageMaxAnchors, eventUIBackgroundColor, eventUIMinAnchors, eventUIMaxAnchors, eventUITextColor, eventUITextOutlineColor, eventUITextAlignment, eventUIPlayerListTextAlignment, eventPendingParticipationString, eventUpcomingString, eventStartingString, eventEndingString, eventNoParticipantsString, eventWinnerAnnouncementsString, eventGameTipStyle;
        private bool activeEvent, eventEnablePermission, eventShowUIAndNotificationsWithoutPermission, eventEnableImage, eventEnableUI, eventEnableChatNotifications, eventEnableGameTipNotifications, eventEnableUpcomingNotification, isAdditionalEvent;
        private ulong eventChatIconID = 0;
        private int eventLength = 600;
        private int eventUpcomingDelay = 0;
        private string withAdminPermissionConsoleCommandUsageReply;
        private void Init() {
            _instance = this;
            Unsubscribe(nameof(OnDispenserBonus));
            Unsubscribe(nameof(OnDispenserGather));
            Unsubscribe(nameof(OnCollectiblePickup));
            Unsubscribe(nameof(OnEntityDeath));
            Unsubscribe(nameof(OnLootEntityEnd));
            Subscribe(nameof(OnPlayerConnected));
            Subscribe(nameof(OnPlayerDisconnected));
            RegisterPermissions();
        }
        private void Unload() {
            if (activeEvent) EndEvent();
            SaveProtoData();
            Unsubscribe(nameof(OnDispenserBonus));
            Unsubscribe(nameof(OnDispenserGather));
            Unsubscribe(nameof(OnCollectiblePickup));
            Unsubscribe(nameof(OnEntityDeath));
            Unsubscribe(nameof(OnLootEntityEnd));
            Unsubscribe(nameof(OnPlayerConnected));
            Unsubscribe(nameof(OnPlayerDisconnected));
            if (BasePlayer.activePlayerList.Count > 0) {
                foreach (var player in BasePlayer.activePlayerList) {
                    DestroyUI(player);
                    DestroyEventImages(player);
                    HideGameTip(player);
                }
            }
            eventTimer?.Destroy();
            autoEventTimer?.Destroy();
            UIUpdateTimer?.Destroy();
            gameTipTimer?.Destroy();
            _instance = null;
        }
        private void OnServerInitialized() {
            RegisterChatCommands();
            LoadProtoData();
            CacheImages();
            StartAutoEventTimer();
        }
        private void RegisterChatCommands() {
            string command = "extraevents";
            if (_configData.GeneralOptions.chatCommand != "") command = _configData.GeneralOptions.chatCommand;
            cmd.AddChatCommand(command, this, "ExtraEventsChatCommand");
            cmd.AddConsoleCommand(command, this, "ExtraEventsConsoleCommand");
            withAdminPermissionConsoleCommandUsageReply = $"Command Usage:\n/{command} start - Start random event\n/{command} start EventName - Start specific event (case sensitive) (default EventName)\n/{command} end - End current event";
        }
        private void RegisterPermissions() {
            if (_configData.GeneralOptions.adminPermission != "") adminPermission = _configData.GeneralOptions.adminPermission;
            permission.RegisterPermission(adminPermission, this);
            debugMessage = $"{adminPermission} permission registered";
            PrintDebug(debugMessage);
            if (_configData.GeneralOptions.allEventsPermission != "") allEventsPermission = _configData.GeneralOptions.allEventsPermission;
            permission.RegisterPermission(allEventsPermission, this);
            debugMessage = $"(optional) {allEventsPermission} permission registered (overrides individual event permissions if enabled)";
            PrintDebug(debugMessage);
            if (_configData.EventTypes.Count > 0) {
                foreach (KeyValuePair<string, ConfigData.EventType> listItem in _configData.EventTypes) {
                    if (listItem.Value.eventTypeEnabled && listItem.Value.eventTypePermissionEnabled && listItem.Value.eventTypePermission != "") {
                        permission.RegisterPermission(listItem.Value.eventTypePermission, this);
                        debugMessage = $"{listItem.Value.eventTypePermission} permission registered";
                        PrintDebug(debugMessage);
                    }
                }
            }
            if (_configData.AdditionalEventTypes.Count > 0) {
                foreach (KeyValuePair<string, ConfigData.AdditionalEventType> listItem in _configData.AdditionalEventTypes) {
                    if (listItem.Value.additionalEventTypeEnabled && listItem.Value.additionalEventTypePermissionEnabled && listItem.Value.additionalEventTypePermission != "") {
                        permission.RegisterPermission(listItem.Value.additionalEventTypePermission, this);
                        debugMessage = $"{listItem.Value.additionalEventTypePermission} permission registered";
                        PrintDebug(debugMessage);
                    }
                }
            }
        }
        private bool CheckPlayerEventPermission(BasePlayer player, string eventPermission) {
            if (eventPermission == "" || player == null) return false;
            else if (permission.UserHasPermission(player.UserIDString, eventPermission) || permission.UserHasPermission(player.UserIDString, allEventsPermission)) return true;
            else return false;
        }
        void OnUserPermissionGranted(string id, string permName) {
            BasePlayer player = BasePlayer.FindByID(Convert.ToUInt64(id));
            if (activeEvent) {
                if (eventEnablePermission) {
                    if (eventShowUIAndNotificationsWithoutPermission || CheckPlayerEventPermission(player, eventPermission)) {
                        if (!_pluginData.PlayerDisabledExtraEventsUI.Contains(player.userID)) {
                            CreateUI(player);
                            if (!_pluginData.PlayerDisabledExtraEventsImages.Contains(player.userID)) CreateImages(player, currentEvent);
                        }
                    }
                }
                else {
                    if (!_pluginData.PlayerDisabledExtraEventsUI.Contains(player.userID)) {
                        CreateUI(player);
                        if (!_pluginData.PlayerDisabledExtraEventsImages.Contains(player.userID)) CreateImages(player, currentEvent);
                    }
                }
            }
        }
        void OnUserPermissionRevoked(string id, string permName) {
            BasePlayer player = BasePlayer.FindByID(Convert.ToUInt64(id));
            if (activeEvent) {
                if (playerList.ContainsKey(Convert.ToUInt64(id))) playerList.Remove(Convert.ToUInt64(id));
                DestroyUI(player);
                DestroyEventImages(player);
            }
        }
        private void OnPlayerConnected(BasePlayer player) {
            if (activeEvent) {
                if (eventEnablePermission) {
                    if (eventShowUIAndNotificationsWithoutPermission || CheckPlayerEventPermission(player, eventPermission)) {
                        if (!_pluginData.PlayerDisabledExtraEventsUI.Contains(player.userID)) {
                            CreateUI(player);
                            if (!_pluginData.PlayerDisabledExtraEventsImages.Contains(player.userID)) CreateImages(player, currentEvent);
                        }
                    }
                }
                else {
                    if (!_pluginData.PlayerDisabledExtraEventsUI.Contains(player.userID)) {
                        CreateUI(player);
                        if (!_pluginData.PlayerDisabledExtraEventsImages.Contains(player.userID)) CreateImages(player, currentEvent);
                    }
                }
            }
        }
        private void OnPlayerDisconnected(BasePlayer player, string reason) {
            if (activeEvent) {
                DestroyUI(player);
                DestroyEventImages(player);
            }
        }
        private void StartAutoEventTimer() {
            autoEventTimer?.Destroy();
            var randomTime = UnityEngine.Random.Range(_configData.GeneralOptions.minInitiateTime, _configData.GeneralOptions.maxInitiateTime);
            TimeSpan initiateTime = TimeSpan.FromSeconds(randomTime);
            var englishTime = $"{initiateTime.Hours}h {initiateTime.Minutes}m {initiateTime.Seconds}s ";
            debugMessage = $"Auto Event: Random event attempt in {englishTime} seconds.";
            PrintDebug(debugMessage);
            autoEventTimer = timer.In(randomTime, () => {
                if (activeEvent) {
                    debugMessage = "Auto Event: Attempted while active event running";
                    PrintDebug(debugMessage);
                    StartAutoEventTimer();
                    return;
                }
                if (!CheckPlayerCount()) {
                    debugMessage = "Auto Event: Not enough players to initiate Auto Event";
                    PrintDebug(debugMessage);
                    StartAutoEventTimer();
                    return;
                }
                debugMessage = "Auto Event: Initiated";
                PrintDebug(debugMessage);
                StartEvent();
            }
            );
        }
        private bool CheckPlayerCount() {
            var playerCount = BasePlayer.activePlayerList.Count;
            if (playerCount >= _configData.GeneralOptions.minPlayers) return true;
            else return false;
        }
        private void ExtraEventsChatCommand(BasePlayer player, string command, string[] args) {
            if (player == null ) return;
            if (args.Length == 0 || args[0] == null || args[0] == "") {
                if (!permission.UserHasPermission(player.UserIDString, adminPermission)) {
                    message = lang.GetMessage("Chat Command Reply No Admin Permission", this, player.UserIDString).Replace("{ChatCommand}", _configData.GeneralOptions.chatCommand);
                    if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                    return;
                }
                else {
                    message = lang.GetMessage("Chat Command Reply With Admin Permission", this, player.UserIDString).Replace("{ChatCommand}", _configData.GeneralOptions.chatCommand);
                    if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                    return;
                }
            }
            else {
                string requestedAction = args[0].ToString();
                switch (requestedAction) {
                    case "start" : if (!permission.UserHasPermission(player.UserIDString, adminPermission)) {
                        message = lang.GetMessage("Chat Command Reply No Admin Permission", this, player.UserIDString).Replace("{ChatCommand}", _configData.GeneralOptions.chatCommand);
                        if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                        return;
                    }
                    debugMessage = "Event Start Request: Chat Command";
                    PrintDebug(debugMessage);
                    if (args.Length == 1 || args[1] == null || args[1] == "") {
                        if (activeEvent) {
                            message = lang.GetMessage("Active Event", this, player.UserIDString);
                            if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                            return;
                        }
                        StartEvent();
                    }
                    else {
                        string requestedEvent = args[1].ToString();
                        if (activeEvent) {
                            message = lang.GetMessage("Active Event", this, player.UserIDString);
                            if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                            return;
                        }
                        if (!FindEvent(requestedEvent)) {
                            debugMessage = $"Cannot find the requested event: {requestedEvent}";
                            PrintDebug(debugMessage);
                            if (player != null) Player.Message(player, debugMessage, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                            return;
                        }
                        else StartEvent(requestedEvent);
                    }
                    break;
                    case "end" : if (!permission.UserHasPermission(player.UserIDString, adminPermission)) {
                        message = lang.GetMessage("Chat Command Reply No Admin Permission", this, player.UserIDString).Replace("{ChatCommand}", _configData.GeneralOptions.chatCommand);
                        if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                        return;
                    }
                    debugMessage = "Event End Request: Chat Command";
                    PrintDebug(debugMessage);
                    if (!activeEvent) {
                        message = lang.GetMessage("No Active Event", this, player.UserIDString);
                        if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                        return;
                    }
                    EndEvent();
                    break;
                    case "ui" : ToggleExtraEventsUI(player);
                    break;
                    case "image" : ToggleExtraEventsImage(player);
                    break;
                    default : if (!permission.UserHasPermission(player.UserIDString, adminPermission)) {
                        message = lang.GetMessage("Chat Command Reply No Admin Permission", this, player.UserIDString).Replace("{ChatCommand}", _configData.GeneralOptions.chatCommand);
                        if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                        return;
                    }
                    else {
                        message = lang.GetMessage("Chat Command Reply With Admin Permission", this, player.UserIDString).Replace("{ChatCommand}", _configData.GeneralOptions.chatCommand);
                        if (player != null) Player.Message(player, message, _configData.GeneralOptions.chatPrefix, _configData.GeneralOptions.chatIconID);
                        return;
                    }
                    break;
                }
            }
        }
        private void ExtraEventsConsoleCommand(ConsoleSystem.Arg args) {
            var player = args.Player();
            if (player != null && !permission.UserHasPermission(player.UserIDString, adminPermission)) {
                message = lang.GetMessage("No Permission", this, player.UserIDString);
                SendReply(args, message);
                return;
            }
            if (args.Args == null || args.Args.Length == 0) {
                message = withAdminPermissionConsoleCommandUsageReply;
                if (player != null) SendReply(args, message);
                else PrintDebug(message);
                return;
            }
            else {
                string requestedAction = args.Args[0].ToString();
                switch (requestedAction) {
                    case "start" : debugMessage = "Event Start Request: Console Command";
                    PrintDebug(debugMessage);
                    if (args.Args.Length == 1 || args.Args[1] == null || args.Args[1] == "") {
                        if (activeEvent) {
                            message = "An event is already running.";
                            if (player != null) SendReply(args, message);
                            else PrintDebug(message);
                            return;
                        }
                        StartEvent();
                    }
                    else {
                        string requestedEvent = args.Args[1].ToString();
                        if (activeEvent) {
                            message = "An event is already running.";
                            if (player != null) SendReply(args, message);
                            else PrintDebug(message);
                            return;
                        }
                        if (!FindEvent(requestedEvent)) {
                            message = $"Cannot find the requested event: {requestedEvent}";
                            if (player != null) SendReply(args, message);
                            else PrintDebug(message);
                            return;
                        }
                        else StartEvent(requestedEvent);
                    }
                    break;
                    case "end" : debugMessage = "Event End Request: Console Command";
                    PrintDebug(debugMessage);
                    if (!activeEvent) {
                        message = "There is no event currently running.";
                        if (player != null) SendReply(args, message);
                        PrintDebug(message);
                        return;
                    }
                    EndEvent();
                    break;
                    default : message = withAdminPermissionConsoleCommandUsageReply;
                    if (player != null) SendReply(args, message);
                    else PrintDebug(message);
                    break;
                }
            }
        }
        private string GetRandomEvent() {
            debugMessage = "Finding Random Event...";
            PrintDebug(debugMessage);
            var listWithKeys = Facepunch.Pool.GetList<string>();
            if (_configData.EventTypes.Count > 0) {
                foreach (KeyValuePair<string, ConfigData.EventType> listItem in _configData.EventTypes) {
                    if (listItem.Value.eventTypeEnabled) listWithKeys.Add(listItem.Key);
                }
            }
            if (_configData.AdditionalEventTypes.Count > 0) {
                foreach (KeyValuePair<string, ConfigData.AdditionalEventType> listItem in _configData.AdditionalEventTypes) {
                    if (listItem.Value.additionalEventTypeEnabled) listWithKeys.Add(listItem.Key);
                }
            }
            try {
                var value = listWithKeys[Random.Range(0, listWithKeys.Count)];
                Facepunch.Pool.FreeList(ref listWithKeys);
                return value;
            }
            catch {
                debugMessage = "No events enabled in ExtraEvents.json config file.";
                PrintDebug(debugMessage);
                Facepunch.Pool.FreeList(ref listWithKeys);
                return "";
            }
        }
        private bool FindEvent(string eventName) {
            if (_configData.EventTypes.ContainsKey(eventName)) return true;
            else {
                if (_configData.AdditionalEventTypes.ContainsKey(eventName)) return true;
                else return false;
            }
        }
        private void StartEvent(string selectedEvent) {
            if (activeEvent) {
                debugMessage = "CRITICAL WARNING: An event is already running.Aborting StartEvent()";
                PrintDebug(debugMessage);
                return;
            }
            else {
                Unsubscribe(nameof(OnDispenserBonus));
                Unsubscribe(nameof(OnDispenserGather));
                Unsubscribe(nameof(OnCollectiblePickup));
                Unsubscribe(nameof(OnEntityDeath));
                Unsubscribe(nameof(OnLootEntityEnd));
            }
            if (selectedEvent == "random") currentEvent = GetRandomEvent();
            else currentEvent = selectedEvent;
            if (!GetEventInfo(currentEvent)) {
                debugMessage = "CRITICAL WARNING: Cannot get the event info.Aborting StartEvent()";
                PrintDebug(debugMessage);
                return;
            }
            if (eventEnableUpcomingNotification) {
                var delay = eventUpcomingDelay.ToString();
                string eventUpcomingAnnouncement = eventUpcomingString.Replace("{event_name}", eventName).Replace("{upcoming_announcement_delay}", delay).Replace("{event_desc}", eventDesc).Replace("{event_description}", eventDesc);
                NotifyPlayers(eventUpcomingAnnouncement, eventChatPrefix, eventChatIconID);
                PrintDebug(eventUpcomingAnnouncement);
                timer.Once(eventUpcomingDelay, () => {
                    CreateEvent(currentEvent);
                }
                );
            }
            else {
                CreateEvent(currentEvent);
            }
        }
        private void CreateEvent(string currentEvent) {
            if (currentEvent.ToLower() == OreWar) {
                Subscribe(nameof(OnDispenserBonus));
            }
            else if (currentEvent.ToLower() == TreeTrimmers) {
                Subscribe(nameof(OnDispenserBonus));
            }
            else if (currentEvent.ToLower() == BarrelBreakers) {
                Subscribe(nameof(OnEntityDeath));
            }
            else if (currentEvent.ToLower() == FishingFrenzy) {
                Subscribe(nameof(OnFishCaught));
                Subscribe(nameof(OnEntityDeath));
            }
            else if (currentEvent.ToLower() == BotBash) {
                Subscribe(nameof(OnEntityDeath));
            }
            else if (currentEvent.ToLower() == CrateClash) {
                Subscribe(nameof(OnLootEntityEnd));
            }
            else if (currentEvent.ToLower() == AnimalAnnihilation) {
                Subscribe(nameof(OnEntityDeath));
            }
            else if (currentEvent.ToLower() == ResourceRumble) {
                Subscribe(nameof(OnDispenserGather));
                Subscribe(nameof(OnDispenserBonus));
                Subscribe(nameof(OnCollectiblePickup));
            }
            else if (currentEvent.ToLower() == ResourceRun) {
                Subscribe(nameof(OnDispenserGather));
                Subscribe(nameof(OnDispenserBonus));
                Subscribe(nameof(OnCollectiblePickup));
            }
            else if (currentEvent.ToLower() == TunnelTussle) {
                Subscribe(nameof(OnEntityDeath));
            }
            else if (currentEvent.ToLower() == RoadsignRun) {
                Subscribe(nameof(OnEntityDeath));
            }
            else if (currentEvent.ToLower() == UnderwaterWar) {
                Subscribe(nameof(OnEntityDeath));
            }
            else if (currentEvent.ToLower() == PlayerBattle) {
                Subscribe(nameof(OnEntityDeath));
            }
            else {
                debugMessage = $"CRITICAL WARNING: Cannot find and subscribe to the requested event hooks.({currentEvent}) - Aborting StartEvent()";
                PrintDebug(debugMessage);
                return;
            }
            playerList.Clear();
            rewardsList.Clear();
            eventTimer?.Destroy();
            autoEventTimer?.Destroy();
            eventStartTime = Time.realtimeSinceStartup;
            CreateEventUIs();
            CreateEventImages();
            UIUpdateTimer = timer.Every(1f, () => CreateEventUIs());
            eventTimer = timer.Once(eventLength, () => EndEvent());
            activeEvent = true;
            string eventStartingAnnouncement = eventStartingString.Replace("{event_name}", eventName).Replace("{event_desc}", eventDesc).Replace("{event_description}", eventDesc);
            NotifyPlayers(eventStartingAnnouncement, eventChatPrefix, eventChatIconID);
            PrintDebug(eventStartingAnnouncement);
        }
        private void StartEvent() {
            StartEvent("random");
        }
        private bool GetEventInfo(string requestedEvent) {
            if (!FindEvent(requestedEvent)) {
                debugMessage = $"CRITICAL WARNING: Cannot find the requested event: {requestedEvent} - Aborting GetEventInfo()";
                PrintDebug(debugMessage);
                return false;
            }
            eventName = eventDesc = eventPermission = eventUIBackgroundColor = eventUIMinAnchors = eventUIMaxAnchors = eventUITextColor = eventUITextOutlineColor = eventUpcomingString = eventStartingString = eventEndingString = eventNoParticipantsString = eventWinnerAnnouncementsString = eventPendingParticipationString = eventGameTipStyle = "";
            isAdditionalEvent = false;
            if (requestedEvent != "") {
                ConfigData.EventType eventType;
                if (_configData.EventTypes.TryGetValue(requestedEvent, out eventType)) {
                    if (eventType.eventTypeEnabled) {
                        eventName = eventType.eventTypeName;
                        eventDesc = eventType.eventTypeDesc;
                        eventLength = eventType.eventTypeLength;
                        eventEnablePermission = eventType.eventTypePermissionEnabled;
                        eventPermission = eventType.eventTypePermission;
                        eventShowUIAndNotificationsWithoutPermission = eventType.eventTypeShowUIAndNotificationsWithoutPermission;
                        eventEnableUI = eventType.EventTypeLeaderboards.eventTypeEnableLeaderboardUI;
                        eventUIBackgroundColor = eventType.EventTypeLeaderboards.eventTypeLeaderboardUIBackgroundColor;
                        eventUIMinAnchors = eventType.EventTypeLeaderboards.eventTypeLeaderboardUIMinAnchors;
                        eventUIMaxAnchors = eventType.EventTypeLeaderboards.eventTypeLeaderboardUIMaxAnchors;
                        eventUITextColor = eventType.EventTypeLeaderboards.eventTypeLeaderboardUITextColor;
                        eventUITextOutlineColor = eventType.EventTypeLeaderboards.eventTypeUITextOutlineColor;
                        eventUITextAlignment = eventType.EventTypeLeaderboards.eventTypeUITextAlignment;
                        eventUIPlayerListTextAlignment = eventType.EventTypeLeaderboards.eventTypeUIPlayerListTextAlignment;
                        eventPendingParticipationString = eventType.EventTypeLeaderboards.eventTypePendingParticipationString;
                        eventEnableChatNotifications = eventType.EventTypeNotifications.eventTypeEnableChatNotifications;
                        if (eventType.EventTypeNotifications.eventTypeChatPrefix != "") eventChatPrefix = eventType.EventTypeNotifications.eventTypeChatPrefix;
                        else eventChatPrefix = _configData.GeneralOptions.chatPrefix;
                        if (eventType.EventTypeNotifications.eventTypeChatIconID != 0) eventChatIconID = eventType.EventTypeNotifications.eventTypeChatIconID;
                        else eventChatIconID = _configData.GeneralOptions.chatIconID;
                        eventEnableGameTipNotifications = eventType.EventTypeNotifications.eventTypeEnableGameTipNotifications;
                        eventGameTipStyle = eventType.EventTypeNotifications.eventTypeGameTipStyle;
                        eventGameTipDuration = eventType.EventTypeNotifications.eventTypeGameTipDuration;
                        eventEnableUpcomingNotification = eventType.EventTypeNotifications.eventTypeEnableUpcomingNotification;
                        eventUpcomingDelay = eventType.EventTypeNotifications.eventTypeUpcomingDelay;
                        eventUpcomingString = eventType.EventTypeNotifications.eventTypeUpcomingString;
                        eventStartingString = eventType.EventTypeNotifications.eventTypeStartingString;
                        eventEndingString = eventType.EventTypeNotifications.eventTypeEndingString;
                        eventNoParticipantsString = eventType.EventTypeNotifications.eventTypeNoParticipantsString;
                        eventMultipleWinnersDelay = eventType.EventTypeNotifications.eventTypeMultipleWinnersDelay;
                        return true;
                    }
                    else {
                        debugMessage = $"WARNING: {requestedEvent} is not enabled, please enable the event in your config file to start it.";
                        PrintDebug(debugMessage);
                        return false;
                    }
                }
                else {
                    ConfigData.AdditionalEventType additionalEventType;
                    if (_configData.AdditionalEventTypes.TryGetValue(requestedEvent, out additionalEventType)) {
                        if (additionalEventType.additionalEventTypeEnabled) {
                            isAdditionalEvent = true;
                            eventName = additionalEventType.additionalEventTypeName;
                            eventDesc = additionalEventType.additionalEventTypeDesc;
                            eventLength = additionalEventType.additionalEventTypeLength;
                            eventMultiplier = additionalEventType.additionalEventTypeMultiplier;
                            eventEnablePermission = additionalEventType.additionalEventTypePermissionEnabled;
                            eventPermission = additionalEventType.additionalEventTypePermission;
                            eventShowUIAndNotificationsWithoutPermission = additionalEventType.additionalEventTypeShowUIAndNotificationsWithoutPermission;
                            eventEnableUI = additionalEventType.AdditionalEventTypeUIs.additionalEventTypeEnableUI;
                            eventUIBackgroundColor = additionalEventType.AdditionalEventTypeUIs.additionalEventTypeUIBackgroundColor;
                            eventUIMinAnchors = additionalEventType.AdditionalEventTypeUIs.additionalEventTypeUIMinAnchors;
                            eventUIMaxAnchors = additionalEventType.AdditionalEventTypeUIs.additionalEventTypeUIMaxAnchors;
                            eventUITextColor = additionalEventType.AdditionalEventTypeUIs.additionalEventTypeUITextColor;
                            eventUITextOutlineColor = additionalEventType.AdditionalEventTypeUIs.additionalEventTypeUITextOutlineColor;
                            eventUITextAlignment = additionalEventType.AdditionalEventTypeUIs.additionalEventTypeUITextAlignment;
                            eventEnableChatNotifications = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeEnableChatNotifications;
                            if (additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeChatPrefix != "") eventChatPrefix = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeChatPrefix;
                            else eventChatPrefix = _configData.GeneralOptions.chatPrefix;
                            if (additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeChatIconID != 0) eventChatIconID = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeChatIconID;
                            else eventChatIconID = _configData.GeneralOptions.chatIconID;
                            eventEnableGameTipNotifications = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeEnableGameTipNotifications;
                            eventGameTipStyle = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeGameTipStyle;
                            eventGameTipDuration = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeGameTipDuration;
                            eventEnableUpcomingNotification = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeEnableUpcomingNotification;
                            eventUpcomingDelay = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeUpcomingDelay;
                            eventUpcomingString = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeUpcomingString;
                            eventStartingString = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeStartingString;
                            eventEndingString = additionalEventType.AdditionalEventTypeNotifications.additionalEventTypeEndingString;
                            return true;
                        }
                        else {
                            debugMessage = $"WARNING: {requestedEvent} is not enabled, please enable the event in your config file to start it.";
                            PrintDebug(debugMessage);
                            return false;
                        }
                    }
                    else {
                        debugMessage = $"CRITICAL WARNING: Cannot find the requested event information: {requestedEvent} - Aborting GetEventInfo()";
                        PrintDebug(debugMessage);
                        return false;
                    }
                }
            }
            else {
                debugMessage = $"CRITICAL WARNING: NULL GetEventInfo() request - Aborting GetEventInfo()";
                PrintDebug(debugMessage);
                return false;
            }
        }
        private void CreateEventUIs() {
            if (BasePlayer.activePlayerList.Count > 0) {
                foreach (var player in BasePlayer.activePlayerList) {
                    if (eventEnablePermission) {
                        if (eventShowUIAndNotificationsWithoutPermission || CheckPlayerEventPermission(player, eventPermission)) {
                            if (!_pluginData.PlayerDisabledExtraEventsUI.Contains(player.userID)) CreateUI(player);
                        }
                    }
                    else {
                        if (!_pluginData.PlayerDisabledExtraEventsUI.Contains(player.userID)) CreateUI(player);
                    }
                }
            }
        }
        private void CreateUI(BasePlayer player) {
            DestroyUI(player);
            var leaderboardEntries = playerList.OrderByDescending(x => x.Value).Take(6);
            int position = 1;
            string LeaderboardList = "";
            string eventDescText = "";
            if (isAdditionalEvent) {
                eventPendingParticipationString = eventDesc;
                eventDescText = "";
            }
            else {
                eventDescText = eventDesc;
                if (leaderboardEntries.Count() > 0) {
                    foreach (var entry in leaderboardEntries.Take(5)) {
                        BasePlayer entryPlayer = BasePlayer.FindByID(entry.Key);
                        string playerName = entryPlayer != null ? entryPlayer.displayName : "Unknown";
                        if (playerName != "Unknown") {
                            if (playerName.Length > 20) {
                                playerName = playerName.Substring(0, 20);
                            }
                            LeaderboardList += $"{position}.{playerName}: {entry.Value}\n";
                            position++;
                        }
                    }
                }
            }
            string backgroundColor, textColor, outlineColor, anchorMin, anchorMax;
            TextAnchor textAlignment, playerListTextAlignment;
            anchorMin = "0.695 0.025";
            anchorMax = "0.83 0.1975";
            anchorMin = eventUIMinAnchors;
            anchorMax = eventUIMaxAnchors;
            backgroundColor = "255 255 255 0.2";
            backgroundColor = eventUIBackgroundColor;
            textColor = "255 255 255 1.0";
            textColor = eventUITextColor;
            outlineColor = "0 0 0 0.25";
            outlineColor = eventUITextOutlineColor;
            if (eventUITextAlignment == "center") {
                textAlignment = TextAnchor.MiddleCenter;
            }
            else if (eventUITextAlignment == "left") {
                textAlignment = TextAnchor.MiddleLeft;
            }
            else if (eventUITextAlignment == "right") {
                textAlignment = TextAnchor.MiddleRight;
            }
            else {
                textAlignment = TextAnchor.MiddleCenter;
            }
            if (eventUIPlayerListTextAlignment == "center") {
                playerListTextAlignment = TextAnchor.MiddleCenter;
            }
            else if (eventUIPlayerListTextAlignment == "left") {
                playerListTextAlignment = TextAnchor.MiddleLeft;
            }
            else if (eventUIPlayerListTextAlignment == "right") {
                playerListTextAlignment = TextAnchor.MiddleRight;
            }
            else {
                playerListTextAlignment = TextAnchor.MiddleCenter;
            }
            var container = new CuiElementContainer();
            var panel = container.Add(new CuiPanel {
                Image = {
                    Color = backgroundColor
                }
                , RectTransform = {
                    AnchorMin = anchorMin, AnchorMax = anchorMax
                }
                , CursorEnabled = false,
            }
            , "Under", UI_MAIN);
            if (eventName != "") {
                var titleElement = new CuiElement {
                    Parent = panel, Components = {
                        new CuiTextComponent {
                            Text = eventName, Color = textColor, FontSize = 16, Align = textAlignment
                        }
                        , new CuiOutlineComponent {
                            Distance = "1 1", Color = outlineColor
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.05 0.75", AnchorMax = "0.95 0.99"
                        }
                    }
                }
                ;
                container.Add(titleElement);
            }
            if (eventDescText != "") {
                var descElement = new CuiElement {
                    Parent = panel, Components = {
                        new CuiTextComponent {
                            Text = eventDescText, Color = textColor, FontSize = 11, Align = textAlignment
                        }
                        , new CuiOutlineComponent {
                            Distance = "1 1", Color = outlineColor
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.05 0.72", AnchorMax = "0.95 0.815"
                        }
                    }
                }
                ;
                container.Add(descElement);
            }
            if (LeaderboardList != "") {
                var leaderboardElement = new CuiElement {
                    Parent = panel, Components = {
                        new CuiTextComponent {
                            Text = LeaderboardList, Color = textColor, FontSize = 12, Align = playerListTextAlignment
                        }
                        , new CuiOutlineComponent {
                            Distance = "1 1", Color = outlineColor
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.05 0.14", AnchorMax = "0.95 0.7"
                        }
                    }
                }
                ;
                container.Add(leaderboardElement);
            }
            else {
                if (eventPendingParticipationString != "") {
                    var leaderboardElement = new CuiElement {
                        Parent = panel, Components = {
                            new CuiTextComponent {
                                Text = eventPendingParticipationString, Color = textColor, FontSize = 12, Align = textAlignment
                            }
                            , new CuiOutlineComponent {
                                Distance = "1 1", Color = outlineColor
                            }
                            , new CuiRectTransformComponent {
                                AnchorMin = "0.05 0.14", AnchorMax = "0.95 0.7"
                            }
                        }
                    }
                    ;
                    container.Add(leaderboardElement);
                }
            }
            float timeRemaining = eventLength - (Time.realtimeSinceStartup - eventStartTime);
            TimeSpan timeLeft = TimeSpan.FromSeconds(timeRemaining);
            string timerText = $"{timeLeft.Minutes}m {timeLeft.Seconds}s ";
            var timerElement = new CuiElement {
                Parent = panel, Components = {
                    new CuiTextComponent {
                        Text = timerText, Color = textColor, FontSize = 11, Align = textAlignment
                    }
                    , new CuiOutlineComponent {
                        Distance = "1 1", Color = outlineColor
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.05 0.01", AnchorMax = "0.95 0.17"
                    }
                }
            }
            ;
            container.Add(timerElement);
            CuiHelper.AddUi(player, container);
        }
        private void DestroyUI(BasePlayer player) {
            if (player == null) return;
            CuiHelper.DestroyUi(player, UI_MAIN);
        }
        private void CreateEventImages() {
            if (BasePlayer.activePlayerList.Count > 0) {
                foreach (var player in BasePlayer.activePlayerList) {
                    if (eventEnablePermission) {
             
// ... [Code preview truncated due to length. Full source in attached file] ...

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