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