C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
//using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Rust;
using System; //DateTime
using System.Collections.Generic; //Required for Whilelist
//using System.Data;
//using System.Globalization;
using System.Linq;
//using System.Reflection;
using UnityEngine;
//using System.Collections;
//using ConVar;
//using Facepunch;
//using Network;
//using ProtoBuf;
//using System.Runtime.CompilerServices;
//using Oxide.Core.Libraries.Covalence;
//using System.Text.RegularExpressions;
//using Oxide.Plugins;
using Oxide.Core.Configuration;
namespace Oxide.Plugins
{
[Info("PvXSelector", "Alphawar", "0.9.5", ResourceId = 1817)]
[Description("Player vs X Selector: Beta version 14")]
class PvXselector : RustPlugin
{
#region Data/PlayerJoin/ServerInit
//Loaded goes first
PlayerDataStorage playerData;
private DynamicConfigFile PlayerData;
TicketDataStorage ticketData;
private DynamicConfigFile TicketData;
TicketLogStorage ticketLog;
private DynamicConfigFile TicketLog;
private List<ulong> selectGuiOpen = new List<ulong>();
private Hash<ulong, PlayerInfo> InfoCache = new Hash<ulong, PlayerInfo>();
private List<ulong> SleeperCache = new List<ulong>();
private List<ulong> UnknownUserCache = new List<ulong>();
private List<BasePlayer> AdminPlayerMode = new List<BasePlayer>();
private List<BasePlayer> activeAdmins = new List<BasePlayer>();
private List<ulong> antiChatSpam = new List<ulong>();
private Dictionary<ulong, List<string>> OpenUI = new Dictionary<ulong, List<string>>();
class PlayerDataStorage
{
public Hash<ulong, PlayerInfo> Info = new Hash<ulong, PlayerInfo>();
public List<ulong> sleepers = new List<ulong>();
public List<ulong> UnknownUser = new List<ulong>();
}
class TicketDataStorage
{
public Dictionary<int, ulong> Link = new Dictionary<int, ulong>();
public Dictionary<ulong, Ticket> Info = new Dictionary<ulong, Ticket>();
public Dictionary<ulong, string> Notification = new Dictionary<ulong, string>();
}
class TicketLogStorage
{
public Dictionary<int, LogData> Log = new Dictionary<int, LogData>();
}
class PlayerInfo
{
public string username;
public string FirstConnection;
public string LatestConnection;
public string mode;
public bool ticket;
}
class Ticket
{
public int TicketNumber;
public string Username;
public string UserId;
public string requested;
public string reason;
public string CreatedTimeStamp;
}
class LogData
{
public string UserId;
public string AdminId;
public string Username;
public string AdminName;
public string requested;
public string reason;
public bool Accepted;
public string CreatedTimeStamp;
public string ClosedTimeStamp;
}
void OnServerInitialized()
{
LoadData();
InfoCache = playerData.Info;
checkPlayersRegistered();
RegisterGroups();
foreach (BasePlayer _player in BasePlayer.activePlayerList)
{
if (!isNPC(_player))
{
createPvXIndicator(_player);
if (isplayerNA(_player))createPvXSelector(_player);
if (hasPerm(_player, "admin"))
{
activeAdmins.Add(_player);
createAdminIndicator(_player);
}
updatePlayerChatTag(_player);
}
}
foreach (ulong _key in playerData.Info.Keys)
{
if (playerData.Info[_key].FirstConnection == null) playerData.Info[_key].FirstConnection = DateTimeStamp();
if (playerData.Info[_key].LatestConnection == null) playerData.Info[_key].LatestConnection = DateTimeStamp();
if (playerData.Info[_key].FirstConnection == "null") playerData.Info[_key].FirstConnection = DateTimeStamp();
if (playerData.Info[_key].LatestConnection == "null") playerData.Info[_key].LatestConnection = DateTimeStamp();
}
}
void Loaded()
{
PlayerData = Interface.Oxide.DataFileSystem.GetFile("PvX/PlayerData");
TicketData = Interface.Oxide.DataFileSystem.GetFile("PvX/TicketData");
TicketLog = Interface.Oxide.DataFileSystem.GetFile("PvX/TicketLog");
lang.RegisterMessages(messages, this);
permissionHandle();
LoadVariables();
}
void Unloaded()
{
foreach (var _player in BasePlayer.activePlayerList)
{
DestroyAllPvXUI(_player);
}
SaveAll();
}
void saveCacheData()
{
playerData.Info = InfoCache;
playerData.sleepers = SleeperCache;
playerData.UnknownUser = UnknownUserCache;
PlayerData.WriteObject(playerData);
}
void saveTicketData()
{
TicketData.WriteObject(ticketData);
}
void saveTicketLog()
{
TicketLog.WriteObject(TicketLog);
}
void SaveAll()
{
playerData.Info = InfoCache;
playerData.sleepers = SleeperCache;
playerData.UnknownUser = UnknownUserCache;
PlayerData.WriteObject(playerData);
TicketData.WriteObject(ticketData);
TicketLog.WriteObject(ticketLog);
}
void LoadData()
{
try
{
playerData = PlayerData.ReadObject<PlayerDataStorage>();
}
catch
{
Puts("Couldn't load player data, creating new datafile");
playerData = new PlayerDataStorage();
InfoCache = playerData.Info;
}
try
{
ticketData = TicketData.ReadObject<TicketDataStorage>();
}
catch
{
Puts("Couldn't load Ticket data, creating new datafile");
ticketData = new TicketDataStorage();
}
try
{
ticketLog = TicketLog.ReadObject<TicketLogStorage>();
}
catch
{
Puts("Couldn't load Ticket Log, creating new datafile");
ticketLog = new TicketLogStorage();
}
}
void OnPlayerInit(BasePlayer _player)
{
if (_player == null) return;
if (_player.HasPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot))
{
timer.Once(3, () => OnPlayerInit(_player));
return;
}
else PlayerLoaded(_player);
}
void PlayerLoaded(BasePlayer _player)
{
if (hasPerm(_player, "admin"))
{
activeAdmins.Add(_player);
createAdminIndicator(_player);
}
if (playerData.UnknownUser.Contains(_player.userID))
{
updatePvXPlayerData(_player);
playerData.UnknownUser.Remove(_player.userID);
}
if (isplayerNA(_player))
{
updatePlayerChatTag(_player);
saveCacheData();
createPvXIndicator(_player);
createPvXSelector(_player);
return;
}
InfoCache[_player.userID].LatestConnection = DateTimeStamp();
updatePlayerChatTag(_player);
if (SleeperCache.Contains(_player.userID))
{
updatePvXPlayerData(_player);
SleeperCache.Remove(_player.userID);
saveCacheData();
}
if (UnknownUserCache.Contains(_player.userID))
{
updatePvXPlayerData(_player);
saveCacheData();
}
SaveAll();
createPvXIndicator(_player);
if (InfoCache[_player.userID].mode != "NA") return;
else if (ticketData.Notification.ContainsKey(_player.userID)) LangMSG(_player, "TickClosLogin", ticketData.Notification[_player.userID]);
else createPvXSelector(_player);
}
void OnPlayerDisconnected(BasePlayer _player)
{
selectGuiOpen.Remove(_player.userID);
if (hasPerm(_player, "admin"))
{
activeAdmins.Remove(_player);
}
}
void OnPlayerRespawned(BasePlayer _player)
{
}
void addTicketLog(BasePlayer _admin, int _ticketID, bool _)
{
ulong _UserID = ticketData.Link[_ticketID];
int _logID = NewLogID();
ticketLog.Log.Add(_logID, new LogData
{
Accepted = true,
ClosedTimeStamp = DateTimeStamp(),
AdminId = _admin.UserIDString,
CreatedTimeStamp = ticketData.Info[_UserID].CreatedTimeStamp,
reason = ticketData.Info[_UserID].reason,
requested = ticketData.Info[_UserID].requested,
UserId = ticketData.Info[_UserID].UserId,
AdminName = _admin.displayName,
Username = ticketData.Info[_UserID].Username,
});
}
void checkPlayersRegistered()
{
foreach (BasePlayer _player in BasePlayer.activePlayerList)
if (!(InfoCache.ContainsKey(_player.userID)))
addPlayer(_player);
foreach (BasePlayer _player in BasePlayer.sleepingPlayerList)
if (!(InfoCache.ContainsKey(_player.userID)))
addSleeper(_player);
}
void addPlayer(BasePlayer _player)
{
if (isNPC(_player.userID)) return;
InfoCache.Add(_player.userID, new PlayerInfo
{
username = _player.displayName,
mode = "NA",
ticket = false,
FirstConnection = DateTimeStamp(),
LatestConnection = DateTimeStamp(),
});
createPvXSelector(_player);
saveCacheData();
}
void addSleeper(BasePlayer _player)
{
if (isNPC(_player.userID)) return;
InfoCache.Add(_player.userID, new PlayerInfo
{
username = _player.displayName,
mode = "NA",
ticket = false,
FirstConnection = DateTimeStamp(),
LatestConnection = "Sleeper",
});
SleeperCache.Add(_player.userID);
saveCacheData();
}
void addOffline(ulong _userID)
{
if (isNPC(_userID)) return;
InfoCache.Add(_userID, new PlayerInfo
{
username = "UNKNOWN",
mode = "NA",
ticket = false,
FirstConnection = DateTimeStamp(),
LatestConnection = "UNKNOWN",
});
UnknownUserCache.Add(_userID);
saveCacheData();
}
static string pvxPlayerSelectorUI = "createPvXModeSelector";
static string pvxPlayerUI = "pvxPlayerModeUI";
static string pvxAdminUI = "pvxAdminTicketCountUI";
string[] GuiList = new string[] { pvxPlayerSelectorUI, pvxPlayerUI, pvxAdminUI};
#endregion
#region Config/Permision/Plugin Ref
//Players
private bool PvEAttackPvE;
private bool PvEAttackPvP;
private bool PvPAttackPvE;
private bool PvPAttackPvP;
private bool PvELootPvE;
private bool PvELootPvP;
private bool PvPLootPvE;
private bool PvPLootPvP;
private bool PvEUsePvPDoor;
private bool PvPUsePvEDoor;
private float PvEDamagePvE;
private float PvEDamagePvP;
private float PvPDamagePvE;
private float PvPDamagePvP;
private float PvEDamagePvEStruct;
private float PvEDamagePvPStruct;
private float PvPDamagePvEStruct;
private float PvPDamagePvPStruct;
//Metabolism
private float PvEFoodLossRate;
private float PvEWaterLossRate;
private float PvEHealthGainRate;
private float PvEFoodSpawn;
private float PvEWaterSpawn;
private float PvEHealthSpawn;
private float PvPFoodLossRate;
private float PvPWaterLossRate;
private float PvPHealthGainRate;
private float PvPFoodSpawn;
private float PvPWaterSpawn;
private float PvPHealthSpawn;
//NPC
private bool NPCAttackPvE;
private bool NPCAttackPvP;
private bool PvEAttackNPC;
private bool PvPAttackNPC;
private float NPCDamagePvE;
private float NPCDamagePvP;
private float PvEDamageNPC;
private float PvPDamageNPC;
private bool PvELootNPC;
private bool PvPLootNPC;
//Animal
private float PvEDamageAnimals;
private float PvPDamageAnimals;
private float NPCDamageAnimals;
private float AnimalsDamagePvE;
private float AnimalsDamagePvP;
private float AnimalsDamageNPC;
//Turret
private bool TurretPvETargetPvE;
private bool TurretPvETargetPvP;
private bool TurretPvPTargetPvE;
private bool TurretPvPTargetPvP;
private bool TurretPvETargetNPC;
private bool TurretPvPTargetNPC;
private bool TurretPvETargetAnimal;
private bool TurretPvPTargetAnimal;
private float TurretPvEDamagePvEAmnt;
private float TurretPvEDamagePvPAmnt;
private float TurretPvPDamagePvEAmnt;
private float TurretPvPDamagePvPAmnt;
private float TurretPvEDamageNPCAmnt;
private float TurretPvPDamageNPCAmnt;
private float TurretPvEDamageAnimalAmnt;
private float TurretPvPDamageAnimalAmnt;
//Helicopter
private bool HeliTargetPvE;
private bool HeliTargetPvP;
private bool HeliTargetNPC;
private float HeliDamagePvE;
private float HeliDamagePvP;
private float HeliDamageNPC;
private float HeliDamagePvEStruct;
private float HeliDamagePvPStruct;
private float HeliDamageAnimal;
private float HeliDamageByPvE;
private float HeliDamageByPvP;
//Fire
private float FireDamagePvE;
private float FireDamagePvP;
private float FireDamageNPC;
private float FireDamagePvEStruc;
private float FireDamagePvPStruc;
//Others
public static bool DisableUI_FadeIn;
private bool DebugMode;
private bool NamesIncludeSleepers;
private string ChatPrefixColor;
private string ChatPrefix;
private string ChatMessageColor;
protected override void LoadDefaultConfig()
{
Puts("Creating a new configuration file!");
Config.Clear();
LoadVariables();
}
void LoadVariables() //Stores Default Values, calling GetConfig passing: menu, dataValue, defaultValue
{
//Players
PvEAttackPvE = Convert.ToBoolean(GetConfig("2: Player", "01: PvE v PvE", false));
PvEAttackPvP = Convert.ToBoolean(GetConfig("2: Player", "02:PvE v PvP", false));
PvPAttackPvE = Convert.ToBoolean(GetConfig("2: Player", "03:PvP v PvE", false));
PvPAttackPvP = Convert.ToBoolean(GetConfig("2: Player", "04:PvP v PvP", true));
PvELootPvE = Convert.ToBoolean(GetConfig("2: Player", "05:PvE Loot PvE", true));
PvELootPvP = Convert.ToBoolean(GetConfig("2: Player", "06:PvE Loot PvP", false));
PvPLootPvE = Convert.ToBoolean(GetConfig("2: Player", "07:PvP Loot PvE", false));
PvPLootPvP = Convert.ToBoolean(GetConfig("2: Player", "08:PvP Loot PvP", true));
PvEUsePvPDoor = Convert.ToBoolean(GetConfig("2: Player", "09:PvE Use PvPDoor", false));
PvPUsePvEDoor = Convert.ToBoolean(GetConfig("2: Player", "10:PvP Use PvEDoor", false));
PvEDamagePvE = Convert.ToSingle(GetConfig("2: Player", "11:PvE Damage PvE", 0.0));
PvEDamagePvP = Convert.ToSingle(GetConfig("2: Player", "12:PvE Damage PvP", 0.0));
PvPDamagePvE = Convert.ToSingle(GetConfig("2: Player", "13:PvP Damage PvE", 0.0));
PvPDamagePvP = Convert.ToSingle(GetConfig("2: Player", "14:PvP Damage PvP", 1.0));
PvEDamagePvEStruct = Convert.ToSingle(GetConfig("2: Player", "15: PvEDamagePvEStruct", 0.0));
PvEDamagePvPStruct = Convert.ToSingle(GetConfig("2: Player", "16: PvEDamagePvPStruct", 0.0));
PvPDamagePvEStruct = Convert.ToSingle(GetConfig("2: Player", "17: PvPDamagePvEStruct", 0.0));
PvPDamagePvPStruct = Convert.ToSingle(GetConfig("2: Player", "18: PvPDamagePvPStruct", 1.0));
//Metabolism
PvEFoodLossRate = Convert.ToSingle(GetConfig("3: Metabolism", "01: PvEFoodLossRate", 0.03));
PvEWaterLossRate = Convert.ToSingle(GetConfig("3: Metabolism", "02: PvEWaterLossRate", 0.03));
PvEHealthGainRate = Convert.ToSingle(GetConfig("3: Metabolism", "03: PvEHealthGainRate", 0.03));
PvEFoodSpawn = Convert.ToSingle(GetConfig("3: Metabolism", "04: PvEFoodSpawn", 100.0));
PvEWaterSpawn = Convert.ToSingle(GetConfig("3: Metabolism", "05: PvEWaterSpawn", 250.00));
PvEHealthSpawn = Convert.ToSingle(GetConfig("3: Metabolism", "06: PvEHealthSpawn", 500.00));
PvPFoodLossRate = Convert.ToSingle(GetConfig("3: Metabolism", "07: PvPFoodLossRate", 0.03));
PvPWaterLossRate = Convert.ToSingle(GetConfig("3: Metabolism", "08: PvPWaterLossRate", 0.03));
PvPHealthGainRate = Convert.ToSingle(GetConfig("3: Metabolism", "09: PvPHealthGainRate", 0.03));
PvPFoodSpawn = Convert.ToSingle(GetConfig("3: Metabolism", "10: PvPFoodSpawn", 100.0));
PvPWaterSpawn = Convert.ToSingle(GetConfig("3: Metabolism", "11: PvPWaterSpawn", 250.0));
PvPHealthSpawn = Convert.ToSingle(GetConfig("3: Metabolism", "12: PvPHealthSpawn", 500.0));
//NPC
NPCAttackPvE = Convert.ToBoolean(GetConfig("4: NPC", "01: NPC Attack PvE", true));
NPCAttackPvP = Convert.ToBoolean(GetConfig("4: NPC", "02: NPC Attack PvP", true));
PvEAttackNPC = Convert.ToBoolean(GetConfig("4: NPC", "03: PvE Attack NPC", true));
PvPAttackNPC = Convert.ToBoolean(GetConfig("4: NPC", "04: PvP Attack NPC", true));
NPCDamagePvE = Convert.ToSingle(GetConfig("4: NPC", "05: NPC Damage PvE", 1.0));
NPCDamagePvP = Convert.ToSingle(GetConfig("4: NPC", "06: NPC Damage PvP", 1.0));
PvEDamageNPC = Convert.ToSingle(GetConfig("4: NPC", "07: PvE Damage NPC", 1.0));
PvPDamageNPC = Convert.ToSingle(GetConfig("4: NPC", "08: PvP Damage NPC", 1.0));
PvELootNPC = Convert.ToBoolean(GetConfig("4: NPC", "09: PvE Loot NPC", true));
PvPLootNPC = Convert.ToBoolean(GetConfig("4: NPC", "10: PvP Loot NPC", true));
//Animal
PvEDamageAnimals = Convert.ToSingle(GetConfig("5: Animals", "1: PvE Damage Animals", 1.0f));
PvPDamageAnimals = Convert.ToSingle(GetConfig("5: Animals", "2: PvP Damage Animals", 1.0f));
NPCDamageAnimals = Convert.ToSingle(GetConfig("5: Animals", "3: NPC Damage Animals", 1.0f));
AnimalsDamagePvE = Convert.ToSingle(GetConfig("5: Animals", "4: Animals Damage PvE", 1.0f));
AnimalsDamagePvP = Convert.ToSingle(GetConfig("5: Animals", "5: Animals Damage PvP", 1.0f));
AnimalsDamageNPC = Convert.ToSingle(GetConfig("5: Animals", "6: Animals Damage NPC", 1.0f));
//Turret
TurretPvETargetPvE = Convert.ToBoolean(GetConfig("6: Turret", "01: TurretPvETargetPvE", true));
TurretPvETargetPvP = Convert.ToBoolean(GetConfig("6: Turret", "02: TurretPvETargetPvP", false));
TurretPvPTargetPvE = Convert.ToBoolean(GetConfig("6: Turret", "03: TurretPvPTargetPvE", false));
TurretPvPTargetPvP = Convert.ToBoolean(GetConfig("6: Turret", "04: TurretPvPTargetPvP", true));
TurretPvETargetNPC = Convert.ToBoolean(GetConfig("6: Turret", "05: TurretPvETargetNPC", true));
TurretPvPTargetNPC = Convert.ToBoolean(GetConfig("6: Turret", "06: TurretPvPTargetNPC", true));
TurretPvETargetAnimal = Convert.ToBoolean(GetConfig("6: Turret", "07: TurretPvETargetAnimal", true));
TurretPvPTargetAnimal = Convert.ToBoolean(GetConfig("6: Turret", "08: TurretPvPTargetAnimal", true));
TurretPvEDamagePvEAmnt = Convert.ToSingle(GetConfig("6: Turret", "09: TurretPvEDamagePvEAmnt", 1.0f));
TurretPvEDamagePvPAmnt = Convert.ToSingle(GetConfig("6: Turret", "10: TurretPvEDamagePvPAmnt", 0.0f));
TurretPvPDamagePvEAmnt = Convert.ToSingle(GetConfig("6: Turret", "11: TurretPvPDamagePvEAmnt", 0.0f));
TurretPvPDamagePvPAmnt = Convert.ToSingle(GetConfig("6: Turret", "12: TurretPvPDamagePvPAmnt", 1.0f));
TurretPvEDamageNPCAmnt = Convert.ToSingle(GetConfig("6: Turret", "13: TurretPvEDamageNPCAmnt", 1.0f));
TurretPvPDamageNPCAmnt = Convert.ToSingle(GetConfig("6: Turret", "14: TurretPvPDamageNPCAmnt", 1.0f));
TurretPvEDamageAnimalAmnt = Convert.ToSingle(GetConfig("6: Turret", "15: TurretPvEDamageAnimal", 1.0f));
TurretPvPDamageAnimalAmnt = Convert.ToSingle(GetConfig("6: Turret", "16: TurretPvPDamageAnimal", 1.0f));
//Helicopter
HeliTargetPvE = Convert.ToBoolean(GetConfig("7: Heli", "01: HeliTargetPvE", false));
HeliTargetPvP = Convert.ToBoolean(GetConfig("7: Heli", "02: HeliTargetPvP", true));
HeliTargetNPC = Convert.ToBoolean(GetConfig("7: Heli", "03: HeliTargetNPC", false));
HeliDamagePvE = Convert.ToSingle(GetConfig("7: Heli", "04: HeliDamagePvE", 0.0));
HeliDamagePvP = Convert.ToSingle(GetConfig("7: Heli", "05: HeliDamagePvP", 1.0));
HeliDamageNPC = Convert.ToSingle(GetConfig("7: Heli", "06: HeliDamageNPC", 0.0));
HeliDamagePvEStruct = Convert.ToSingle(GetConfig("7: Heli", "07: HeliDamagePvEStruct", 0.0));
HeliDamagePvPStruct = Convert.ToSingle(GetConfig("7: Heli", "08: HeliDamagePvPStruct", 1.0));
HeliDamageAnimal = Convert.ToSingle(GetConfig("7: Heli", "09: HeliDamageAnimal", 1.0));
HeliDamageByPvE = Convert.ToSingle(GetConfig("7: Heli", "10: HeliDamageByPvE", 0.0));
HeliDamageByPvP = Convert.ToSingle(GetConfig("7: Heli", "11: HeliDamageByPvp", 1.0));
//fire
FireDamagePvE = Convert.ToSingle(GetConfig("8: Fire", "1: FireDamagePvE", 0.1));
FireDamagePvP = Convert.ToSingle(GetConfig("8: Fire", "2: FireDamagePvP", 1.0));
FireDamageNPC = Convert.ToSingle(GetConfig("8: Fire", "3: FireDamageNPC", 1.0));
FireDamagePvEStruc = Convert.ToSingle(GetConfig("8: Fire", "4: FireDamagePvEStruc", 0.0));
FireDamagePvPStruc = Convert.ToSingle(GetConfig("8: Fire", "5: FireDamagePvPStruc", 1.0));
//others
DisableUI_FadeIn = Convert.ToBoolean(GetConfig("9-1:Settings", "DisableUI Fadein", false));
DebugMode = Convert.ToBoolean(GetConfig("9-1:Settings", "DebugMode", false));
ChatPrefix = Convert.ToString(GetConfig("9-1:Settings", "ChatPrefix", "PvX"));
ChatPrefixColor = Convert.ToString(GetConfig("9-1:Settings", "ChatPrefixColor", "008800"));
ChatMessageColor = Convert.ToString(GetConfig("9-1:Settings", "ChatMessageColor", "yellow"));
}
object GetConfig(string menu, string dataValue, object defaultValue)
{
var data = Config[menu] as Dictionary<string, object>;
if (data == null)
{
data = new Dictionary<string, object>();
Config[menu] = data;
}
object value;
if (!data.TryGetValue(dataValue, out value))
{
value = defaultValue;
data[dataValue] = value;
}
return value;
}
T GetConfig<T>(params object[] args)
{
List<string> stringArgs = (from arg in args select arg.ToString()).ToList();
stringArgs.RemoveAt(args.Length - 1);
if (Config.Get(stringArgs.ToArray()) == null)
{
Config.Set(args);
}
return (T)Convert.ChangeType(Config.Get(stringArgs.ToArray()), typeof(T));
}
bool hasPerm(BasePlayer _player, string perm, string reason = null)
{
string regPerm = Title.ToLower() + "." + perm; //pvxselector.admin
if (permission.UserHasPermission(_player.UserIDString, regPerm)) return true;
if (reason != "null")
SendReply(_player, reason);
return false;
}
void permissionHandle()
{
string[] Permissionarray = { "admin", "wipe" };
foreach (string i in Permissionarray)
{
string regPerm = Title.ToLower() + "." + i;
Puts("Checking if " + regPerm + " is registered.");
if (!permission.PermissionExists(regPerm))
{
permission.RegisterPermission(regPerm, this);
Puts(regPerm + " is registered.");
}
else
{
Puts(regPerm + " is already registered.");
}
}
}
#endregion
#region UI Creation
class QUI
{
static public CuiElementContainer CreateElementContainer(string panelName, string color, string aMin, string aMax, bool cursor = false)
{
var NewElement = new CuiElementContainer()
{
{
new CuiPanel
{
Image = {Color = color},
RectTransform = {AnchorMin = aMin, AnchorMax = aMax},
CursorEnabled = cursor
},
new CuiElement().Parent = "Hud",
panelName
}
};
return NewElement;
}
static public void CreatePanel(ref CuiElementContainer container, string panel, string color, string aMin, string aMax, bool cursor = false)
{
container.Add(new CuiPanel
{
Image = { Color = color },
RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
CursorEnabled = cursor
},
panel);
}
static public void CreateLabel(ref CuiElementContainer container, string panel, string color, string text, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter, float fadein = 1.0f)
{
if (DisableUI_FadeIn)
fadein = 0;
container.Add(new CuiLabel
{
Text = { Color = color, FontSize = size, Align = align, FadeIn = fadein, Text = text },
RectTransform = { AnchorMin = aMin, AnchorMax = aMax }
},
panel);
}
static public void CreateButton(ref CuiElementContainer container, string panel, string color, string text, int size, string aMin, string aMax, string command, TextAnchor align = TextAnchor.MiddleCenter, float fadein = 1.0f)
{
if (DisableUI_FadeIn)
fadein = 0;
container.Add(new CuiButton
{
Button = { Color = color, Command = command, FadeIn = fadein },
RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
Text = { Text = text, FontSize = size, Align = align }
},
panel);
}
static public void LoadImage(ref CuiElementContainer container, string panel, string png, string aMin, string aMax)
{
container.Add(new CuiElement
{
Parent = panel,
Components =
{
new CuiRawImageComponent {Png = png },
new CuiRectTransformComponent {AnchorMin = aMin, AnchorMax = aMax }
}
});
}
static public void CreateTextOverlay(ref CuiElementContainer container, string panel, string text, string color, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter, float fadein = 1.0f)
{
if (DisableUI_FadeIn)
fadein = 0;
container.Add(new CuiLabel
{
Text = { Color = color, FontSize = size, Align = align, FadeIn = fadein, Text = text },
RectTransform = { AnchorMin = aMin, AnchorMax = aMax }
},
panel);
}
}
private void DestroyAllPvXUI(BasePlayer player)
{
foreach(string _v in GuiList)
{
CuiHelper.DestroyUi(player, _v);
}
//DestroyEntries(player);
}
private void DestroyPvXUI(BasePlayer player, string _ui)
{
CuiHelper.DestroyUi(player, _ui);
}
//private void DestroyEntries(BasePlayer player)
//{
// CuiHelper.DestroyUi(player, UIPanel);
// if (OpenUI.ContainsKey(player.userID))
// {
// foreach (var entry in OpenUI[player.userID])
// CuiHelper.DestroyUi(player, entry);
// OpenUI.Remove(player.userID);
// }
//}
private void AddUIString(BasePlayer player, string name)
{
if (!OpenUI.ContainsKey(player.userID))
OpenUI.Add(player.userID, new List<string>());
OpenUI[player.userID].Add(name);
}
private Dictionary<string, string> UIColors = new Dictionary<string, string>
{
{"Black-100", "0.0 0.0 0.0 1.0" }, //Black
{"Black-50", "0.0 0.0 0.0 0.50" },
{"Black-15", "0.0 0.0 0.0 0.15" },
{"Grey2-100", "0.2 0.2 0.2 1.0" }, //Grey 2
{"Grey2-50", "0.2 0.2 0.2 0.50" },
{"Grey2-15", "0.2 0.2 0.2 0.15" },
{"Grey5-100", "0.5 0.5 0.5 1.0" }, //Grey 5
{"Grey5-50", "0.5 0.5 0.5 0.50" },
{"Grey5-15", "0.5 0.5 0.5 0.15" },
{"Grey8-100", "0.8 0.8 0.8 1.0" }, //Grey 8
{"Grey8-50", "0.8 0.8 0.8 0.50" },
{"Grey8-15", "0.8 0.8 0.8 0.15" },
{"White-100", "1.0 1.0 1.0 1.0" }, //White
{"White-50", "1.0 1.0 1.0 0.50" },
{"White-15", "1.0 1.0 1.0 0.15" },
{"Red-100", "0.7 0.2 0.2 1.0" }, //Red
{"Red-50", "0.7 0.2 0.2 0.50" },
{"Red-15", "0.7 0.2 0.2 0.15" },
{"Green-100", "0.2 0.7 0.2 1.0" }, //Green
{"Green-50", "0.2 0.7 0.2 0.50" },
{"Green-15", "0.2 0.7 0.2 0.15" },
{"Blue-100", "0.2 0.2 0.7 1.0" }, //Blue
{"Blue-50", "0.2 0.2 0.7 0.50" },
{"Blue-15", "0.2 0.2 0.7 0.15" },
{"Yellow-100", "0.9 0.9 0.2 1.0" }, //Yellow
{"Yellow-50", "0.9 0.9 0.2 0.50" },
{"Yellow-15", "0.9 0.9 0.2 0.15" },
{"buttonbg", "0.2 0.2 0.2 0.7" },
{"buttonopen", "0.2 0.8 0.2 0.9" },
{"buttoncompleted", "0 0.5 0.1 0.9" },
{"buttonred", "0.85 0 0.35 0.9" },
{"buttongrey", "0.8 0.8 0.8 0.9" },
};
#endregion
#region GUIs
private void createPvXSelector(BasePlayer _player)
{
selectGuiOpen.Add(_player.userID);
timer.Once(5, () => updatePvXSelector(_player));
var PvXselectorContainer = QUI.CreateElementContainer(
pvxPlayerSelectorUI,
UIColors["Black-50"],
"0.17 0.15",
"0.33 0.25",
true
);
QUI.CreateButton(
ref PvXselectorContainer,
pvxPlayerSelectorUI,
UIColors["Red-100"],
"PvP",
22,
"0.1 0.2",
"0.45 0.8",
"PvXGuiCMD pvp"
);
QUI.CreateButton(
ref PvXselectorContainer,
pvxPlayerSelectorUI,
UIColors["Green-100"],
"PvE",
22,
"0.55 0.2",
"0.9 0.8",
"PvXGuiCMD pve"
);
CuiHelper.AddUi(_player, PvXselectorContainer);
}
private void updatePvXSelector(BasePlayer _player)
{
CuiHelper.DestroyUi(_player, pvxPlayerSelectorUI);
if (isplayerNA(_player))createPvXSelector(_player);
}
private void createPvXIndicator(BasePlayer _player)
{
var indicatorContainer = QUI.CreateElementContainer(
pvxPlayerUI,
UIColors["Black-15"],
"0.48 0.11",
"0.52 0.14");
if (InfoCache[_player.userID].mode == "NA")
indicatorContainer = QUI.CreateElementContainer(
pvxPlayerUI,
UIColors["Red-100"],
"0.48 0.11",
"0.52 0.14");
else if (ticketData.Info.ContainsKey(_player.userID))
indicatorContainer = QUI.CreateElementContainer(
pvxPlayerUI,
UIColors["Yellow-15"],
"0.48 0.11",
"0.52 0.14");
if (AdminPlayerMode.Contains(_player))
{
QUI.CreateLabel(
ref indicatorContainer,
pvxPlayerUI,
UIColors["Green-100"],
InfoCache[_player.userID].mode,
15,
"0.1 0.1",
"0.90 0.99");
}
else
{
QUI.CreateLabel(ref indicatorContainer,
pvxPlayerUI,
UIColors["White-100"],
InfoCache[_player.userID].mode,
15,
"0.1 0.1",
"0.90 0.99");
}
CuiHelper.AddUi(_player, indicatorContainer);
}
private void updatePvXIndicator(BasePlayer _player)
{
CuiHelper.DestroyUi(_player, pvxPlayerUI);
createPvXIndicator(_player);
}
private void createAdminIndicator(BasePlayer _player)
{
if (!hasPerm(_player, "admin")) return;
var adminCountContainer = QUI.CreateElementContainer(
pvxAdminUI,
UIColors["Black-100"],
"0.166 0.055",
"0.34 0.0955");
QUI.CreateLabel(ref adminCountContainer,
pvxAdminUI,
UIColors["White-100"],
"PvX Tickets",
10,
"0.0 0.1",
"0.3 0.90");
QUI.CreateLabel(ref adminCountContainer,
pvxAdminUI,
UIColors["White-100"],
string.Format("Open: {0}", ticketData.Info.Count.ToString()),
10,
"0.301 0.1",
"0.65 0.90");
QUI.CreateLabel(ref adminCountContainer,
pvxAdminUI,
UIColors["White-100"],
string.Format("Closed: {0}", ticketLog.Log.Count.ToString()),
10,
"0.651 0.1",
"1 0.90");
CuiHelper.AddUi(_player, adminCountContainer);
}
private void UpdateAdminIndicator()
{
if (activeAdmins == null) return;
else if (activeAdmins.Count < 1) return;
foreach (BasePlayer _player in activeAdmins)
{
CuiHelper.DestroyUi(_player, pvxAdminUI);
createAdminIndicator(_player);
}
}
private void createButton(BasePlayer _player)
{ }
#endregion
#region Lang/Chat
void LangMSG(BasePlayer _player, string langMsg, params object[] args)
{
string message = lang.GetMessage(langMsg, this, _player.UserIDString);
PrintToChat(_player, $"<color={ChatPrefixColor}>{ChatPrefix}</color>: <color={ChatMessageColor}>{message}</color>", args);
}
void LangMSGBroadcast(string langMsg, params object[] args)
{
string message = lang.GetMessage(langMsg, this);
PrintToChat($"<color={ChatPrefixColor}>{ChatPrefix}</color>: <color={ChatMessageColor}>{message}</color>", args);
}
void BroadcastMessageHandle(string message, params object[] args)
{
PrintToChat($"<color={ChatPrefixColor}>{ChatPrefix}</color>: <color={ChatMessageColor}>{message}</color>", args);
}
void ChatMessageHandle(BasePlayer _player, string message, params object[] args)
{
PrintToChat(_player, $"<color={ChatPrefixColor}>{ChatPrefix}</color>: <color={ChatMessageColor}>{message}</color>", args);
}
void PutsLang(string langMsg, params object[] args)
{
string message = lang.GetMessage(langMsg, this);
Puts(string.Format(message, args));
}
void PutsPlayerHandle(BasePlayer _player, string msg, params object[] args)
{
Puts(msg, args);
PrintToChat(_player, $"<color={ChatPrefixColor}>{ChatPrefix}</color>: <color={ChatMessageColor}>{msg}</color>", args);
}
void PutsPlayerHandleLang(BasePlayer _player, string langMsg, params object[] args)
{
string msg = lang.GetMessage(langMsg, this, _player.UserIDString);
Puts(msg, args);
SendReply(_player, msg, args);
}
Dictionary<string, string> messages = new Dictionary<string, string>()
{
{"xx", "xxx" },
{"notAllwPickup", "You can't pick this item as owner is: {0}" },
{"AdmModeRem", "You have deactivated Admin Mode" },
{"AdmModeAdd", "You are now in Admin mode" },
{"lvlRedxpSav", "Your Level was reduced, Lost xp has been saved." },
{"lvlIncrxpRes", "Your Level has been increased, Lost xp Restored." },
{"numbonly", "Incorrect format: Included letter in ticketID" },
{"TickCrea", "You have created a ticket" },
{"TickCanc", "You have Canceled your ticket" },
{"TickAcep", "Your Ticket has been accepted" },
{"TickDecl", "Your Ticket has been declined" },
{"TickAcepAdm", "Your Ticket accepted the ticket" },
{"TickDeclAdm", "Your Ticket decline the ticket" },
{"TickClosLogin", "Welcome back, Your ticket was {0}" },
{"TickList", "Ticket#: {0}, User: {1}" },
{"TickDet", "Ticket Details:" },
{"TickID", "Ticket ID: {0}" },
{"TickName", "Username: {0}" },
{"TickStmID", "SteamID: {0}" },
{"TickSelc", "Selected: {0}" },
{"TickRsn", "Reason: {0}" },
{"TickDate", "Ticket Created: {0}" },
{"TickCnt", "Open Tickets: {0}" },
{"TickNotAvail", "Ticket#:{0} Does not exist" },
{"ComndList", "PvX Command List:" },
{"CompTickCnt", "Closed Tickets: {0}" },
{"IncoForm", "Incorrect format" },
{"IncoFormPleaUse", "Incorrect format Please Use:" },
{"TicketDefaultReason", "Change Requested Via Chat" },
{"NoTicket", "There are no tickets to display" },
{"AlreadySubmitted", "You have already requested to change, Please conctact your admin" },
{"PvETarget", "You are attacking a PvE player" },
{"NoActTick", "You do not have an active ticket" },
{"RSNChan", "You have changed your tickets reason." },
{"PvEStructure", "That structure belongs to a PvE player" },
{"NoXPModeNA", "You will not earn XP until you have selected PvE/PvP" },
{"NoSaveLvLNA", "Your levl is not saved unless you select PvE or PvP" },
{"TargisGod", "You are attacking a god" },
{"YouisGod", "You are attacking a god" },
{"MissPerm", "You do not have the required permision" }
};
#endregion
#region Ticket Functions
void createTicket(BasePlayer _player, string selection)
{
int _TicketNumber = GetNewID();
string _username = _player.displayName;
string _requested = selection;
string _reason = lang.GetMessage("TicketDefaultReason", this, _player.UserIDString);
ticketData.Link.Add(_TicketNumber, _player.userID);
ticketData.Info.Add(_player.userID, new Ticket
{
CreatedTimeStamp = DateTimeStamp(),
reason = lang.GetMessage("TicketDefaultReason", this, _player.UserIDString),
requested = selection,
TicketNumber = _TicketNumber,
UserId = _player.UserIDString,
Username = _player.displayName
});
LangMSG(_player, "TickCrea");
InfoCache[_player.userID].ticket = true;
SaveAll();
UpdateAdminIndicator();
updatePvXIndicator(_player);
}
void cancelTicket(BasePlayer _player)
{
if (playerData.Info[_player.userID].ticket == false) return;
int _ticketNumber = ticketData.Info[_player.userID].TicketNumber;
ticketData.Link.Remove(_ticketNumber);
ticketData.Info.Remove(_player.userID);
InfoCache[_player.userID].ticket = false;
SaveAll();
LangMSG(_player, "TickCanc");
updatePvXIndicator(_player);
UpdateAdminIndicator();
return;
}
void ticketAccept(BasePlayer _admin, int _ticketID)//Update required to fix Baseplayer NRE
{
ulong _UserID = ticketData.Link[_ticketID];
addTicketLog(_admin, _ticketID, true);
LangMSG(_admin, "TickAcepAdm");
playerData.Info[_UserID].ticket = false;
InfoCache[_UserID].mode = ticketData.Info[_UserID].requested;
SaveAll();
BasePlayer _player = basePlayerByID(_UserID);
if (_player != null && _player.isConnected)
{
LangMSG(_player, "TickAcep");
updatePvXIndicator(_player);
updatePlayerChatTag(_player);
}
else if (_player != null && !_player.isConnected)
{
ticketData.Notification.Add(_player.userID, "Accepted");
}
else
{
ticketData.Notification.Add(_player.userID, "Accepted");
}
ticketData.Info.Remove(_UserID);
ticketData.Link.Remove(_ticketID);
SaveAll();
UpdateAdminIndicator();
if (_player != null && _player.isConnected) updatePvXIndicator(_player);
}
void ticketDecline(BasePlayer _admin, int _ticketID)//updated: Fixed Baseplayer NRE
{
ulong _UserID = ticketData.Link[_ticketID];
addTicketLog(_admin, _ticketID, false);
LangMSG(_admin, "TickAcepAdm");
playerData.Info[_UserID].ticket = false;
ticketData.Info.Remove(_UserID);
ticketData.Link.Remove(_ticketID);
SaveAll();
UpdateAdminIndicator();
BasePlayer _player = basePlayerByID(_UserID);
if (_player != null && _player.isConnected)
{
LangMSG(_player, "TickDecl");
updatePvXIndicator(_player);
}
else ticketData.Notification.Add(_player.userID, "Declined");
}
void ticketCount(BasePlayer _player)
{
LangMSG(_player, "TickCnt", ticketData.Link.Count);
LangMSG(_player, "CompTickCnt", ticketLog.Log.Count);
}
void listTickets(BasePlayer _player)
{
if (ticketData.Link.Count > 0)
{
foreach (var ticket in ticketData.Info)
{
ulong _key = ticket.Key;
PutsPlayerHandleLang(_player, "TickList", ticketData.Info[_key].TicketNumber, ticketData.Info[_key].Username);
}
}
}
void displayTicket(BasePlayer _player, int _ticketID)
{
if (ticketData.Link.ContainsKey(_ticketID))
{
ulong _key = ticketData.Link[_ticketID];
//DateTime _date = DateTime.FromOADate(ticketData.Info[_key].timeStamp);
LangMSG(_player, "TickDet");
LangMSG(_player, "TickID", _ticketID);
LangMSG(_player, "TickName", ticketData.Info[_key].Username);
LangMSG(_player, "TickStmID", _key);
LangMSG(_player, "TickSelc", ticketData.Info[_key].requested);
LangMSG(_player, "TickRsn", ticketData.Info[_key].reason);
LangMSG(_player, "TickDate", ticketData.Info[_key].CreatedTimeStamp);
}
else LangMSG(_player, "TickNotAvail", _ticketID);
}
bool playerHasTicket(BasePlayer _player)
{
if (InfoCache[_player.userID].ticket == true) return true;
else return false;
}
bool playerHasTicket(ulong _userID)
{
if (InfoCache[_userID].ticket == true) return true;
else return false;
}
int GetNewID()
{
for (int _i = 1; _i <= 500; _i++)
{
if (ticketData.Link.ContainsKey(_i)) { }//Place Debug code in future
else
{
//Puts("Key {0} doesnt exist, Returning ticket number", _i); //debug
return _i;
}
}
return 0;
}
int NewLogID()
{
for (int _i = 1; _i <= 500; _i++)
{
if (ticketLog.Log.ContainsKey(_i)) { }
else
{
//Puts("Key {0} doesnt exist, Returning ticket number", _i); //debug
return _i;
}
}
return 0;
}
void consolListTickets()
{
foreach (ulong _ticket in ticketData.Info.Keys)
{
Puts(" ");
Puts(" ");
PutsLang("TickD
// ... [Code preview truncated due to length. Full source in attached file] ...