C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Reflection;
using System;
using System.Data;
using System.Collections.Generic;
using UnityEngine;
using Oxide.Core;
using Oxide.Core.Plugins;
using Rust;
namespace Oxide.Plugins {
[Info("Event Manager", "Reneb", "1.2.12", ResourceId = 740)]
class EventManager : RustPlugin {
////////////////////////////////////////////////////////////
// Setting all fields //////////////////////////////////////
////////////////////////////////////////////////////////////
[PluginReference]
Plugin Spawns;
[PluginReference]
Plugin Kits;
[PluginReference]
Plugin ZoneManager;
[PluginReference]
Plugin DeadPlayersList;
[PluginReference]
Plugin FriendlyFire;
private string EventSpawnFile;
private string EventGameName;
private string itemname;
private bool EventOpen;
private bool EventStarted;
private bool EventEnded;
private bool EventPending;
private int EventMaxPlayers = 0;
private int EventMinPlayers = 0;
private int EventAutoNum = -1;
private bool isBP;
private bool Changed;
private List<string> EventGames;
private List<EventPlayer> EventPlayers;
private ItemDefinition itemdefinition;
private int stackable;
private int giveamount;
public List<Oxide.Plugins.Timer> AutoArenaTimers = new List<Oxide.Plugins.Timer>();
public float LastAnnounce;
public bool AutoEventLaunched = false;
public static FieldInfo lastPositionValue;
////////////////////////////////////////////////////////////
// EventPlayer class to store informations /////////////////
////////////////////////////////////////////////////////////
class EventInvItem {
public string itemid;
public string bp;
public string skinid;
public string container;
public string amount;
public EventInvItem() {
}
public EventInvItem(int itemid, bool bp, string container, int amount, int skinid = 0) {
this.itemid = itemid.ToString();
this.bp = bp.ToString();
this.skinid = skinid.ToString();
this.amount = amount.ToString();
this.container = container;
}
}
class EventPlayer : MonoBehaviour {
public BasePlayer player;
public bool inEvent;
public bool savedInventory;
public bool savedHome;
public string zone;
public List<EventInvItem> InvItems = new List<EventInvItem>();
public Vector3 Home;
void Awake() {
inEvent = true;
savedInventory = false;
savedHome = false;
player = GetComponent<BasePlayer>();
}
public void SaveHome() {
if (!savedHome) Home = player.transform.position;
savedHome = true;
}
public void TeleportHome() {
if (!savedHome) return;
ForcePlayerPosition(player, Home);
savedHome = false;
}
public void SaveInventory() {
if (savedInventory) return;
InvItems.Clear();
foreach (Item item in player.inventory.containerWear.itemList) {
InvItems.Add(new EventInvItem(item.info.itemid, item.IsBlueprint(), "wear", item.amount, item.skin));
}
foreach (Item item in player.inventory.containerMain.itemList) {
InvItems.Add(new EventInvItem(item.info.itemid, item.IsBlueprint(), "main", item.amount, item.skin));
}
foreach (Item item in player.inventory.containerBelt.itemList) {
InvItems.Add(new EventInvItem(item.info.itemid, item.IsBlueprint(), "belt", item.amount, item.skin));
}
savedInventory = true;
}
public void RestoreInventory() {
foreach (EventInvItem kitem in InvItems) {
Item item = ItemManager.CreateByItemID(int.Parse(kitem.itemid), int.Parse(kitem.amount), Convert.ToBoolean(kitem.bp));
item.skin = int.Parse(kitem.skinid);
player.inventory.GiveItem(item, kitem.container == "belt" ? player.inventory.containerBelt : kitem.container == "wear" ? player.inventory.containerWear : player.inventory.containerMain);
}
savedInventory = false;
}
}
//////////////////////////////////////////////////////////////////////////////////////
// Some Static methods that can be called from the EventPlayer Class /////////////////
//////////////////////////////////////////////////////////////////////////////////////
static void PutToSleep(BasePlayer player) {
if (!player.IsSleeping()) {
player.SetPlayerFlag(BasePlayer.PlayerFlags.Sleeping, true);
if (!BasePlayer.sleepingPlayerList.Contains(player)) {
BasePlayer.sleepingPlayerList.Add(player);
}
player.CancelInvoke("InventoryUpdate");
player.inventory.crafting.CancelAll(true);
}
}
static void ForcePlayerPosition(BasePlayer player, Vector3 destination) {
PutToSleep(player);
player.transform.position = destination;
lastPositionValue.SetValue(player, player.transform.position);
player.ClientRPCPlayer(null, player, "ForcePositionTo", new object[] {
destination
}
);
player.TransformChanged();
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
player.UpdateNetworkGroup();
player.SendNetworkUpdateImmediate(false);
player.ClientRPCPlayer(null, player, "StartLoading");
player.SendFullSnapshot();
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, false);
player.ClientRPCPlayer(null, player, "FinishLoading");
}
//////////////////////////////////////////////////////////////////////////////////////
// Oxide Hooks ///////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void Loaded() {
Changed = false;
EventGames = new List<string>();
EventPlayers = new List<EventPlayer>();
lastPositionValue = typeof(BasePlayer).GetField("lastPositionValue", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
LoadData();
}
void OnServerInitialized() {
EventOpen = false;
EventStarted = false;
EventEnded = true;
EventPending = false;
EventGameName = defaultGame;
InitializeTable();
timer.Once(0.1f, () => InitializeZones());
timer.Once(0.2f, () => InitializeGames());
}
void InitializeGames() {
Interface.CallHook("RegisterGame");
SelectSpawnfile(defaultSpawnfile);
}
void Unload() {
EndEvent();
var objects = GameObject.FindObjectsOfType(typeof(EventPlayer));
if (objects != null) foreach (var gameObj in objects) GameObject.Destroy(gameObj);
}
void OnPlayerRespawned(BasePlayer player) {
if (!(player.GetComponent<EventPlayer>())) return;
if (player.GetComponent<EventPlayer>().inEvent) {
if (!EventStarted) return;
Interface.CallHook("OnEventPlayerSpawn", new object[] {
player
}
);
}
else {
RedeemInventory(player);
TeleportPlayerHome(player);
TryErasePlayer(player);
}
}
void OnPlayerAttack(BasePlayer player, HitInfo hitinfo) {
if (!EventStarted) return;
if (player.GetComponent<EventPlayer>() == null || !(player.GetComponent<EventPlayer>().inEvent)) {
return;
}
else if (hitinfo.HitEntity != null) {
Interface.CallHook("OnEventPlayerAttack", new object[] {
player, hitinfo
}
);
}
return;
}
void OnEntityDeath(BaseEntity entity, HitInfo hitinfo) {
if (!EventStarted) return;
if (!(entity is BasePlayer)) return;
if ((entity as BasePlayer).GetComponent<EventPlayer>() == null) return;
Interface.CallHook("OnEventPlayerDeath", new object[] {
(entity as BasePlayer), hitinfo
}
);
return;
}
void OnPlayerDisconnected(BasePlayer player) {
if (player.GetComponent<EventPlayer>() != null) {
LeaveEvent(player);
}
}
////////////////////////////////////////////////////////////
// Zone Management
////////////////////////////////////////////////////////////
void InitializeZones() {
foreach (KeyValuePair<string, EventZone> pair in zonelogs) {
InitializeZone(pair.Key);
}
}
void InitializeZone(string name) {
if (zonelogs[name] == null) return;
ZoneManager?.Call("CreateOrUpdateZone", name, new string[] {
"radius", zonelogs[name].radius
}
, zonelogs[name].GetPosition());
if (EventGames.Contains(name)) Interface.CallHook("OnPostZoneCreate", name);
}
void UpdateZone(string name, string[] args) {
ZoneManager?.Call("CreateOrUpdateZone", name, args);
}
public class EventZone {
public string name;
public string x;
public string y;
public string z;
public string radius;
Vector3 position;
public EventZone(string name, Vector3 position, float radius) {
this.name = name;
this.x = position.x.ToString();
this.y = position.y.ToString();
this.z = position.z.ToString();
this.radius = radius.ToString();
}
public Vector3 GetPosition() {
if (position == default(Vector3)) position = new Vector3(float.Parse(this.x), float.Parse(this.y), float.Parse(this.z));
return position;
}
}
static StoredData storedData;
static Hash<string, EventZone> zonelogs = new Hash<string, EventZone>();
static Hash<string, Reward> rewards = new Hash<string, Reward>();
class StoredData {
public HashSet<EventZone> ZoneLogs = new HashSet<EventZone>();
public Hash<string, string> Tokens = new Hash<string, string>();
public HashSet<Reward> Rewards = new HashSet<Reward>();
public StoredData() {
}
}
void OnServerSave() {
SaveData();
}
void SaveData() {
Interface.GetMod().DataFileSystem.WriteObject("EventManager", storedData);
}
void LoadData() {
zonelogs.Clear();
try {
storedData = Interface.GetMod().DataFileSystem.ReadObject<StoredData>("EventManager");
}
catch {
storedData = new StoredData();
}
foreach (var thelog in storedData.ZoneLogs) {
zonelogs[thelog.name] = thelog;
}
foreach (var thelog in storedData.Rewards) {
rewards[thelog.name] = thelog;
}
}
//////////////////////////////////////////////////////////////////////////////////////
// Tokens Manager
//////////////////////////////////////////////////////////////////////////////////////
Dictionary<string, string> displaynameToShortname = new Dictionary<string, string>();
private void InitializeTable() {
displaynameToShortname.Clear();
List<ItemDefinition> ItemsDefinition = ItemManager.GetItemDefinitions() as List<ItemDefinition>;
foreach (ItemDefinition itemdef in ItemsDefinition) {
displaynameToShortname.Add(itemdef.displayName.english.ToString().ToLower(), itemdef.shortname.ToString());
}
}
object GiveReward(BasePlayer player, string rewardname, int amount) {
if (rewards[rewardname] == null) return "This reward doesn't exist";
amount = amount * (rewards[rewardname]).GetAmount();
if (rewards[rewardname].IsKit()) {
if (Kits == null) return "Kits plugin couldn't be found";
if (!(bool)Kits.Call("isKit", rewards[rewardname].item)) return "The kit doesn't exist anymore";
for (int i = 1; i < amount; i++) {
Kits.Call("GiveKit", player, rewards[rewardname].item);
}
return (bool)Kits.Call("GiveKit", player, rewards[rewardname].item);
}
var definition = ItemManager.FindItemDefinition(rewards[rewardname].item);
if (definition == null) return string.Format("Item not found {0}", rewards[rewardname].item);
if (definition.stackable > 1) player.inventory.GiveItem(ItemManager.CreateByItemID((int)definition.itemid, amount, false), player.inventory.containerMain);
else {
for (int i = 0; i < amount; i++) {
player.inventory.GiveItem(ItemManager.CreateByItemID((int)definition.itemid, 1, false), player.inventory.containerMain);
}
}
return true;
}
public class Reward {
public string name;
public string cost;
public string kit;
public string item;
public string amount;
public Reward() {
}
public Reward(string name, int cost, bool kit, string item, int amount) {
this.name = name;
this.cost = cost.ToString();
this.kit = kit.ToString();
this.item = item;
this.amount = amount.ToString();
}
public int GetCost() {
return int.Parse(cost);
}
public int GetAmount() {
return int.Parse(amount);
}
public bool IsKit() {
return Convert.ToBoolean(kit);
}
}
void AddTokens(string userid, int amount) {
storedData.Tokens[userid] = (GetTokens(userid) + amount).ToString();
}
int GetTokens(string userid) {
if (storedData.Tokens[userid] == null) return 0;
return int.Parse(storedData.Tokens[userid]);
}
void RemoveTokens(string userid, int amount) {
storedData.Tokens[userid] = (GetTokens(userid) - amount).ToString();
}
void SetTokens(string userid, int amount) {
storedData.Tokens[userid] = amount.ToString();
}
public string tokenoverlay = @"[
{
""name"": ""EventManagerOverlay"",
""parent"": ""Overlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Image"",
""color"":""0.1 0.1 0.1 1"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0 0"",
""anchormax"": ""1 1""
},
{
""type"":""NeedsCursor"",
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""Event Manager"",
""fontSize"":30,
""align"": ""MiddleCenter"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.3 0.80"",
""anchormax"": ""0.7 0.90""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""{msg}"",
""fontSize"":15,
""align"": ""MiddleCenter"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.3 0.70"",
""anchormax"": ""0.7 0.79""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""Reward"",
""fontSize"":20,
""align"": ""MiddleLeft"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.2 0.60"",
""anchormax"": ""0.4 0.65""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""Amount"",
""fontSize"":20,
""align"": ""MiddleLeft"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.49 0.60"",
""anchormax"": ""0.54 0.65""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""Cost"",
""fontSize"":20,
""align"": ""MiddleLeft"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.55 0.60"",
""anchormax"": ""0.6 0.65""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""Claim"",
""fontSize"":20,
""align"": ""MiddleLeft"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.65 0.60"",
""anchormax"": ""0.75 0.65""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""Close"",
""fontSize"":20,
""align"": ""MiddleCenter"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.5 0.20"",
""anchormax"": ""0.7 0.25""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Button"",
""close"":""EventManagerOverlay"",
""color"": ""0.5 0.5 0.5 0.2"",
""imagetype"": ""Tiled""
},
{
""type"":""RectTransform"",
""anchormin"": ""0.5 0.20"",
""anchormax"": ""0.7 0.25""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""<<"",
""fontSize"":20,
""align"": ""MiddleCenter"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.2 0.20"",
""anchormax"": ""0.3 0.25""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Button"",
""color"": ""0.5 0.5 0.5 0.2"",
""command"":""reward.show {rewardpageminus}"",
""imagetype"": ""Tiled""
},
{
""type"":""RectTransform"",
""anchormin"": ""0.2 0.20"",
""anchormax"": ""0.3 0.25""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":"">>"",
""fontSize"":20,
""align"": ""MiddleCenter"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.35 0.20"",
""anchormax"": ""0.45 0.25""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Button"",
""color"": ""0.5 0.5 0.5 0.2"",
""command"":""reward.show {rewardpageplus}"",
""imagetype"": ""Tiled""
},
{
""type"":""RectTransform"",
""anchormin"": ""0.35 0.20"",
""anchormax"": ""0.45 0.25""
}
]
},
]
";
string tokenjson = @"[
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""{rewardname}"",
""fontSize"":15,
""align"": ""MiddleLeft"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.2 {ymin}"",
""anchormax"": ""0.4 {ymax}""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""{rewardamount}"",
""fontSize"":15,
""align"": ""MiddleLeft"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.49 {ymin}"",
""anchormax"": ""0.54 {ymax}""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Text"",
""text"":""{rewardcost}"",
""fontSize"":15,
""align"": ""MiddleLeft"",
},
{
""type"":""RectTransform"",
""anchormin"": ""0.55 {ymin}"",
""anchormax"": ""0.6 {ymax}""
}
]
},
{
""parent"": ""EventManagerOverlay"",
""components"":
[
{
""type"":""UnityEngine.UI.Button"",
""close"":""EventManagerOverlay"",
""command"":""reward.claim {rewardcmd}"",
""color"": ""{color}"",
""imagetype"": ""Tiled""
},
{
""type"":""RectTransform"",
""anchormin"": ""0.65 {ymin}"",
""anchormax"": ""0.69 {ymax}""
}
]
}
]
";
void ShowRewards(BasePlayer player, double from) {
if (from < 0) return;
if (from >= rewards.Count) return;
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() {
connection = player.net.connection
}
, null, "DestroyUI", "EventManagerOverlay");
int currenttokens = GetTokens(player.userID.ToString());
var ctoverlay = tokenoverlay.Replace("{msg}", string.Format(OverlayGUIMsg, currenttokens.ToString())).Replace("{rewardpageplus}", (from + 6).ToString()).Replace("{rewardpageminus}", (from - 6).ToString());
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() {
connection = player.net.connection
}
, null, "AddUI", ctoverlay);
double current = 0;
foreach (KeyValuePair<string, Reward> pair in rewards) {
if (current >= from && current < from + 6) {
string color = (pair.Value.GetCost() <= currenttokens) ? "0 0.6 0 0.2" : "1 0 0 0.2";
double pos = 0.55 - 0.05 * (current - from);
var tokenline = tokenjson.Replace("{ymin}", pos.ToString()).Replace("{ymax}", (pos + 0.05).ToString()).Replace("{color}", color).Replace("{rewardname}", pair.Key).Replace("{rewardcmd}", string.Format("'{0}' {1}", pair.Key, from.ToString())).Replace("{rewardcost}", pair.Value.cost).Replace("{rewardamount}", pair.Value.amount);
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() {
connection = player.net.connection
}
, null, "AddUI", tokenline);
//SendReply(player, string.Format(MessageRewardItem, pair.Value.name, pair.Value.cost, (Convert.ToBoolean(pair.Value.kit) ? "Kit : " : "Item : ") + pair.Value.item, pair.Value.amount, color.ToString()));
}
current++;
}
}
[ConsoleCommand("reward.show")]
void ccmdRewardShow(ConsoleSystem.Arg arg) {
if (arg.Args == null || arg.Args.Length == 0) return;
if (arg.connection == null) return;
BasePlayer player = arg.connection.player as BasePlayer;
if (player == null) return;
string rewardpage = arg.Args[0].Replace("'", "");
double rewardp = Convert.ToDouble(rewardpage);
ShowRewards(player, rewardp);
}
[ConsoleCommand("reward.claim")]
void ccmdRewardClaim(ConsoleSystem.Arg arg) {
if (arg.Args == null || arg.Args.Length < 2) return;
if (arg.connection == null) return;
BasePlayer player = arg.connection.player as BasePlayer;
if (player == null) return;
string rewardname = arg.Args[0].Replace("'", "");
if (rewards[rewardname] == null) {
SendReply(player, MessageRewardWrong);
return;
}
int currenttokens = GetTokens(player.userID.ToString());
int amount = 1;
if (rewards[rewardname].GetCost() * amount > currenttokens) {
SendReply(player, string.Format(MessageRewardNotEnoughTokens, rewardname, amount.ToString()));
return;
}
var success = GiveReward(player, rewardname, amount);
if (success is string) {
SendReply(player, success.ToString());
return;
}
if (success is bool && (bool)success) RemoveTokens(player.userID.ToString(), rewards[rewardname].GetCost() * amount);
ShowRewards(player, Convert.ToDouble(arg.Args[1]));
}
[ChatCommand("reward")]
void cmdEventReward(BasePlayer player, string command, string[] args) {
ShowRewards(player, 0.0);
}
//////////////////////////////////////////////////////////////////////////////////////
// Configs Manager ///////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void LoadDefaultConfig() {
}
private void CheckCfg<T>(string Key, ref T var) {
if (Config[Key] is T) var = (T)Config[Key];
else Config[Key] = var;
}
private static string MessagesPermissionsNotAllowed = "You are not allowed to use this command";
private static string MessagesEventNotSet = "An Event game must first be chosen.";
private static string MessagesErrorSpawnfileIsNull = "The spawnfile can't be set to null";
private static string MessagesEventNoSpawnFile = "A spawn file must first be loaded.";
private static string MessagesEventAlreadyOpened = "The Event is already open.";
private static string MessagesEventAlreadyClosed = "The Event is already closed.";
private static string MessagesEventAlreadyStarted = "An Event game has already started.";
private static string MessagesEventOpen = "The Event is now open for : {0} ! Type /event_join to join!";
private static string MessagesEventClose = "The Event entrance is now closed!";
private static string MessagesEventCancel = "The Event was cancelled!";
private static string MessagesEventNoGamePlaying = "An Event game is not underway.";
private static string MessagesEventEnd = "Event: {0} is now over!";
private static string MessagesEventAlreadyJoined = "You are already in the Event.";
private static string MessagesEventJoined = "{0} has joined the Event! (Total Players: {1})";
private static string MessagesEventLeft = "{0} has left the Event! (Total Players: {1})";
private static string MessagesEventBegin = "Event: {0} is about to begin!";
private static string MessagesEventNotInEvent = "You are not currently in the Event.";
private static string MessagesEventNotAnEvent = "This Game {0} isn't registered, did you reload the game after loading Event - Core?";
private static string MessagesEventCloseAndEnd = "The Event needs to be closed and ended before using this command.";
private static string MessagesEventStatusOpen = "The Event {0} is currently opened for registration: /event_join";
private static string MessagesEventStatusOpenStarted = "The Event {0} has started, but is still opened: /event_join";
private static string MessagesEventStatusClosedEnd = "There is currently no event";
private static string MessagesEventStatusClosedStarted = "The Event {0} has already started, it's too late to join.";
private static string MessagesEventMaxPlayers = "The Event {0} has reached max players.You may not join for the moment";
private static string MessagesEventMinPlayers = "The Event {0} has reached min players and will start in {1} seconds";
private static bool EventAutoEvents = false;
private static int EventAutoInterval = 600;
private static int EventAutoAnnounceInterval = 30;
private static Dictionary<string, object> EventAutoConfig = CreateDefaultAutoConfig();
private static string MessageRewardCurrentReward = "You currently have {0} for the /reward shop";
private static string MessageRewardCurrent = "You have {0} tokens";
private static string MessageRewardHelp = "/reward \"RewardName\" Amount";
private static string MessageRewardItem = "Reward Name: {0} - Cost: <color={4}>{1}</color> - {2} - Amount: {3}";
private static string MessageRewardWrong = "This reward doesn't exist";
private static string MessageRewardNegative = "The amount to buy can't be 0 or negative.";
private static string MessageRewardNotEnoughTokens = "You don't have enough tokens to buy {1} of {0}.";
private static string noPlayerFound = "No players found";
private static string multipleNames = "Multiple players found";
private static string defaultGame = "Deathmatch";
private static string defaultSpawnfile = "deathmatchspawns";
private static int eventAuth = 1;
public string OverlayGUIMsg = "You currently have <color=green>{0}</color> tokens.";
void Init() {
CheckCfg<int>("Settings - authLevel", ref eventAuth);
CheckCfg<string>("Default - Game", ref defaultGame);
CheckCfg<string>("Default - Spawnfile", ref defaultSpawnfile);
CheckCfg<bool>("AutoEvents - Activate", ref EventAutoEvents);
CheckCfg<int>("AutoEvents - Interval between 2 events", ref EventAutoInterval);
CheckCfg<int>("AutoEvents - Announce Open Interval", ref EventAutoAnnounceInterval);
CheckCfg<Dictionary<string, object>>("AutoEvents - Config", ref EventAutoConfig);
CheckCfg<string>("Messages - Permissions - Not Allowed", ref MessagesPermissionsNotAllowed);
CheckCfg<string>("Messages - Event Error - Not Set", ref MessagesEventNotSet);
CheckCfg<string>("Messages - Event Error - No SpawnFile", ref MessagesEventNoSpawnFile);
CheckCfg<string>("Messages - Event Error - SpawnFile Is Null", ref MessagesErrorSpawnfileIsNull);
CheckCfg<string>("Messages - Event Error - Already Opened", ref MessagesEventAlreadyOpened);
CheckCfg<string>("Messages - Event Error - Already Closed", ref MessagesEventAlreadyClosed);
CheckCfg<string>("Messages - Event Error - No Games Undergoing", ref MessagesEventNoGamePlaying);
CheckCfg<string>("Messages - Event Error - Already Joined", ref MessagesEventAlreadyJoined);
CheckCfg<string>("Messages - Event Error - Already Started", ref MessagesEventAlreadyStarted);
CheckCfg<string>("Messages - Event Error - Not In Event", ref MessagesEventNotInEvent);
CheckCfg<string>("Messages - Event Error - Not Registered Event", ref MessagesEventNotAnEvent);
CheckCfg<string>("Messages - Event Error - Close&End", ref MessagesEventCloseAndEnd);
CheckCfg<string>("Messages - Error - No players found", ref noPlayerFound);
CheckCfg<string>("Messages - Error - Multiple players found", ref multipleNames);
CheckCfg<string>("Messages - Status - Closed & End", ref MessagesEventStatusClosedEnd);
CheckCfg<string>("Messages - Status - Closed & Started", ref MessagesEventStatusClosedStarted);
CheckCfg<string>("Messages - Status - Open", ref MessagesEventStatusOpen);
CheckCfg<string>("Messages - Status - Open & Started", ref MessagesEventStatusOpenStarted);
CheckCfg<string>("Messages - Event - Opened", ref MessagesEventOpen);
CheckCfg<string>("Messages - Event - Closed", ref MessagesEventClose);
CheckCfg<string>("Messages - Event - Cancelled", ref MessagesEventCancel);
CheckCfg<string>("Messages - Event - End", ref MessagesEventEnd);
CheckCfg<string>("Messages - Event - Join", ref MessagesEventJoined);
CheckCfg<string>("Messages - Event - Begin", ref MessagesEventBegin);
CheckCfg<string>("Messages - Event - Left", ref MessagesEventLeft);
CheckCfg<string>("Messages - Event - MaxPlayersReached", ref MessagesEventMaxPlayers);
CheckCfg<string>("Messages - Event - MinPlayersReached", ref MessagesEventMinPlayers);
CheckCfg<string>("Messages - Reward - Message", ref MessageRewardCurrentReward);
CheckCfg<string>("Messages - Reward - GUI Message", ref OverlayGUIMsg);
CheckCfg<string>("Messages - Reward - Current", ref MessageRewardCurrent);
CheckCfg<string>("Messages - Reward - Help", ref MessageRewardHelp);
CheckCfg<string>("Messages - Reward - Reward Description", ref MessageRewardItem);
CheckCfg<string>("Messages - Reward - Doesnt Exist", ref MessageRewardWrong);
CheckCfg<string>("Messages - Reward - Negative Amount", ref MessageRewardNegative);
CheckCfg<string>("Messages - Reward - Not Enough Tokens", ref MessageRewardNotEnoughTokens);
SaveConfig();
}
static Dictionary<string, object> CreateDefaultAutoConfig() {
var newautoconfiglist = new Dictionary<string, object>();
var AutoDM = new Dictionary<string, object>();
AutoDM.Add("gametype", "Deathmatch");
AutoDM.Add("spawnfile", "deathmatchspawnfile");
AutoDM.Add("closeonstart", "false");
AutoDM.Add("timetojoin", "30");
AutoDM.Add("minplayers", "1");
AutoDM.Add("maxplayers", "10");
AutoDM.Add("timelimit", "1800");
var AutoBF = new Dictionary<string, object>();
AutoBF.Add("gametype", "Battlefield");
AutoBF.Add("spawnfile", "battlefieldspawnfile");
AutoBF.Add("closeonstart", "false");
AutoBF.Add("timetojoin", "0");
AutoBF.Add("timelimit", null);
AutoBF.Add("minplayers", "0");
AutoBF.Add("maxplayers", "30");
newautoconfiglist.Add("0", AutoDM);
newautoconfiglist.Add("1", AutoBF);
return newautoconfiglist;
}
//////////////////////////////////////////////////////////////////////////////////////
// Some global methods ///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// hasAccess /////////////////////////////////////////////////////////////////////////
bool hasAccess(ConsoleSystem.Arg arg) {
if (arg.connection != null) {
if (arg.connection.authLevel < 1) {
SendReply(arg, MessagesPermissionsNotAllowed);
return false;
}
}
return true;
}
// Broadcast To The General Chat /////////////////////////////////////////////////////
void BroadcastToChat(string msg) {
Debug.Log(msg);
ConsoleSystem.Broadcast("chat.add", new object[] {
0, "<color=orange>Event:</color> " + msg
}
);
}
// Broadcast To Players in Event /////////////////////////////////////////////////////
void BroadcastEvent(string msg) {
foreach (EventPlayer eventplayer in EventPlayers) {
SendReply(eventplayer.player, msg.QuoteSafe());
}
}
void TeleportAllPlayersToEvent() {
foreach (EventPlayer eventplayer in EventPlayers) {
Interface.CallHook("OnEventPlayerSpawn", new object[] {
eventplayer.player
}
);
}
}
void OnEventPlayerSpawn(BasePlayer player) {
TeleportPlayerToEvent(player);
}
void TeleportPlayerToEvent(BasePlayer player) {
if (!(player.GetComponent<EventPlayer>())) return;
var targetpos = Spawns.Call("GetRandomSpawn", new object[] {
EventSpawnFile
}
);
if (targetpos is string) return;
var newpos = Interface.Call("EventChooseSpawn", new object[] {
player, targetpos
}
);
if (newpos is Vector3) targetpos = newpos;
var zonen = Interface.Call("OnRequestZoneName");
string zonename = zonen is string ? (string)zonen : EventGameName;
ZoneManager?.Call("AddPlayerToZoneKeepinlist", zonename, player);
player.GetComponent<EventPlayer>().zone = zonename;
ForcePlayerPosition(player, (Vector3)targetpos);
}
void SaveAllInventories() {
foreach (EventPlayer player in EventPlayers) {
player.SaveInventory();
}
}
void SaveAllHomeLocations() {
foreach (EventPlayer player in EventPlayers) {
player.SaveHome();
}
}
void SaveInventory(BasePlayer player) {
var eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
eventplayer.SaveInventory();
}
void SaveHomeLocation(BasePlayer player) {
EventPlayer eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
eventplayer.SaveHome();
}
void RedeemInventory(BasePlayer player) {
EventPlayer eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
if (player.IsDead() || player.health < 1) return;
if (eventplayer.savedInventory) {
eventplayer.player.inventory.Strip();
eventplayer.RestoreInventory();
}
}
void TeleportPlayerHome(BasePlayer player) {
EventPlayer eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
if (player.IsDead() || player.health < 1) return;
if (eventplayer.savedHome) {
eventplayer.TeleportHome();
}
}
void TryErasePlayer(BasePlayer player) {
var eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
if (!(eventplayer.inEvent) && !(eventplayer.savedHome) && !(eventplayer.savedInventory)) GameObject.Destroy(eventplayer);
}
void GivePlayerKit(BasePlayer player, string GiveK
// ... [Code preview truncated due to length. Full source in attached file] ...