C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System; //DateTime
using System.Linq;
//using System.Data;
//using Oxide.Plugins;
//using Oxide.Core.CSharp;
//using System.Reflection;
//using System.Collections;
//using System.Globalization;
using System.Collections.Generic; //Required for Whilelist
//using System.Text.RegularExpressions;
//using System.Runtime.CompilerServices;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
//using Oxide.Core.Database;
//using Oxide.Core.Libraries;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries.Covalence; //Requrired for IPlayer stuff
using Rust;
//using Rust.Ai;
//using Rust.AI;
//using RustNative;
//using Rust.Registry;
using UnityEngine;
//using UnityEngine.AI;
//using ConVar;
//using Facepunch;
//using Network;
//using ProtoBuf;
namespace Oxide.Plugins
{
[Info("PvX Selector", "Alphawar", "0.1.0")]
[Description("Allow players to play both PvP and PvE on the same server.")]
class PvXSelector : RustPlugin
{
private readonly string PluginName = "pvxselector";
//temp variables
private HashSet<BaseHelicopter> BaseHelicopters = new HashSet<BaseHelicopter>();
private HashSet<CH47HelicopterAIController> ChinooksHelicopters = new HashSet<CH47HelicopterAIController>();
private HashSet<BradleyAPC> BradleyAPCs = new HashSet<BradleyAPC>();
private HashSet<FireBall> HeliFireBalls = new HashSet<FireBall>();
private HashSet<FireBall> HeliRocket = new HashSet<FireBall>();
private readonly string heliPrefab = "assets/prefabs/npc/patrol helicopter/patrolhelicopter.prefab";
private readonly string chinookPrefab = "assets/prefabs/npc/ch47/ch47scientists.entity.prefab";
private readonly int groundLayer = LayerMask.GetMask("Terrain", "World", "Default");
//Dictionary
// Enums
private enum PvXState { NA, PvP, PvE, AI, Unknown, Sleeper };
private enum PvXNotification { NA, Accepted, Delcined, Timed, NoMode }
// Variables.#region Variables
bool initialized = false;
static readonly string PvxIndicatorUI = "PvXPlayerStateIndicator"; // used to show player their mode
static readonly string PvxAdminUI = "pvxAdminTicketCountUI"; //admin gui to indicate tickets.static readonly string[] GuiList = new string[] {
PvxIndicatorUI,
PvxAdminUI
};
#endregion
#region Config
private ConfigData configData;
class ConfigData
{
public Options Options { get; set; }
public Gui Gui { get; set; }
}
private void LoadVariables()
{
LoadConfigVariables();
SaveConfig();
}
private void LoadConfigVariables() => configData = Config.ReadObject<ConfigData>();
void SaveConfig(ConfigData config) => Config.WriteObject(config, true);
class Options
{
public bool AllowTickets { get; set; }
public bool AllowCooldowns { get; set; }
public float ModeSwitchCooldown { get; set; }
}
class Gui
{
public bool DisableUI_FadeIn;
public float playerIndicatorMinWid;
public float playerIndicatorMinHei;
public float adminIndicatorMinWid;
public float adminIndicatorMinHei;
}
protected override void LoadDefaultConfig()
{
var config = new ConfigData
{
Options = new Options
{
AllowTickets = true,
AllowCooldowns = true,
ModeSwitchCooldown = 2f,
},
Gui = new Gui
{
DisableUI_FadeIn = false,
playerIndicatorMinWid = 0.484f,
playerIndicatorMinHei = 0.111f,
adminIndicatorMinWid = 0.16f,
adminIndicatorMinHei = 0.06f,
}
};
SaveConfig(config);
}
#endregion
#region Data
private static PvXSelector PvX;
private static Dictionary<ulong, PvXPlayer> PvXPlayers = new Dictionary<ulong, PvXPlayer>();
private static Dictionary<ulong, double> PvXCooldowns = new Dictionary<ulong, double>();
private static Dictionary<int, PvXTicket> PvXTickets = new Dictionary<int, PvXTicket>();
private static Dictionary<int, PvXLog> PvXLogs = new Dictionary<int, PvXLog>();
private static readonly List<object> BuildEntityList = new List<object>() {
typeof(AutoTurret),typeof(Barricade),typeof(BaseCombatEntity),
typeof(BaseOven),typeof(BearTrap),typeof(BuildingBlock),
typeof(BuildingPrivlidge),typeof(CeilingLight),typeof(Door),
typeof(Landmine),typeof(LiquidContainer),typeof(ReactiveTarget),
typeof(RepairBench),typeof(ResearchTable),typeof(Signage),
typeof(SimpleBuildingBlock),typeof(SleepingBag),typeof(StabilityEntity),
typeof(StorageContainer),typeof(SurvivalFishTrap),typeof(WaterCatcher),
typeof(WaterPurifier)};
private static readonly List<object> BasePartEntityList = new List<object>() {
typeof(BaseOven),typeof(BuildingBlock),typeof(BuildingPrivlidge),
typeof(CeilingLight),typeof(Door),typeof(LiquidContainer),
typeof(RepairBench),typeof(ResearchTable),typeof(Signage),
typeof(SimpleBuildingBlock),typeof(SleepingBag),typeof(StabilityEntity),
typeof(StorageContainer),typeof(SurvivalFishTrap),typeof(WaterCatcher),
typeof(WaterPurifier)};
private static readonly List<object> CombatPartEntityList = new List<object>() {
typeof(AutoTurret),typeof(Barricade),typeof(BearTrap),typeof(Landmine),
typeof(ReactiveTarget),typeof(BaseCombatEntity)};
private static readonly List<object> AnimalList = new List<object>() {
typeof(Bear),
typeof(Boar),
typeof(Chicken),
typeof(Horse),
typeof(Stag),
typeof(Wolf)
};
private static List<ulong> AdminsActive = new List<ulong>();
private static List<ulong> AdminsOnline = new List<ulong>();
private static Dictionary<ulong,PvXTicket> AdminViewedTicket = new Dictionary<ulong, PvXTicket>();
TicketDataManager ticketManager;
PlayerDataManager playerManager;
LogDataManager logManager;
#endregion
#region Classes
private class PvXPlayer
{
public string Username { get; set; }
public string ConnectionFirst { get; set; }
public string ConnectionLast { get; set; }
public PvXState State { get; set; }
public PvXNotification Notification { get; set; }
public int TicketID { get; set; }
public bool Ticket { get; set; }
public double LastRequestStamp { get; set; }
}
private class PvXTicket
{
public ulong ID { get; set; }
public string Name { get; set; }
public string Reason { get; set; }
public string TimeStampString { get; set; }
public double TimeStamp { get; set; }
public int TicketID { get; set; }
}
private class PvXLog
{
public ulong PlayerID { get; set; }
public string PlayerName { get; set; }
public ulong AdminID { get; set; }
public string AdminName { get; set; }
public string Reason { get; set; }
public string CreatedTimeStamp { get; set; }
public string ReviewedTimeStamp { get; set; }
public string Outcome { get; set; }
}
class PlayerDataManager
{
//Variables
private PlayerData playerData;
private DynamicConfigFile PlayerDataFile;
//Classes
class PlayerData
{
public Dictionary<ulong, PvXPlayer> StoredPlayers = new Dictionary<ulong, PvXPlayer>();
public Dictionary<ulong, double> StoredCooldowns = new Dictionary<ulong, double>();
}
//Functions
internal PlayerDataManager()
{
//Load Mod, Start any timers
PvX.Puts("Creating TicketManager Class");
Initiate();
Load();
}
private void Initiate()
{
PlayerDataFile = Interface.Oxide.DataFileSystem.GetFile("PvX/PlayerData");
}
private void Load()
{
try
{
PvX.Puts("Loading Player Data");
playerData = PlayerDataFile.ReadObject<PlayerData>();
PvXPlayers = playerData.StoredPlayers;
PvXCooldowns = playerData.StoredCooldowns;
}
catch
{
PvX.Puts("Couldn't load Player Data, Creating New file");
playerData = new PlayerData();
PvXPlayers = playerData.StoredPlayers;
PvXCooldowns = playerData.StoredCooldowns;
}
}
public void Save()
{
playerData.StoredPlayers = PvXPlayers;
playerData.StoredCooldowns = PvXCooldowns;
PlayerDataFile.WriteObject(playerData);
}
}
class TicketDataManager
{
//Variables
private TicketData ticketData;
private DynamicConfigFile TicketDataFile;
//Classes
class TicketData
{
public Dictionary<int, PvXTicket> StoredTickets = new Dictionary<int, PvXTicket>();
}
//Functions
public TicketDataManager()
{
//Load Mod, Start any timers
PvX.Puts("Creating TicketManager Class");
Initiate();
Load();
}
private void Initiate()
{
TicketDataFile = Interface.Oxide.DataFileSystem.GetFile("PvX/TicketData");
}
private void Load()
{
try
{
PvX.Puts("Loading Ticket Data");
ticketData = TicketDataFile.ReadObject<TicketData>();
PvXTickets = ticketData.StoredTickets;
}
catch
{
PvX.Puts("Couldn't load Ticket Data, Creating New file");
ticketData = new TicketData();
PvXTickets = ticketData.StoredTickets;
}
}
public void Save()
{
ticketData.StoredTickets = PvXTickets;
TicketDataFile.WriteObject(ticketData);
}
}
class LogDataManager
{
//Variables
private LogData logData;
private DynamicConfigFile LogDataFile;
//Classes
class LogData
{
public Dictionary<int, PvXLog> StoredLogs = new Dictionary<int, PvXLog>();
}
//Functions
internal LogDataManager()
{
//Load Mod, Start any timers
PvX.Puts("Creating LogManager Class");
Initiate();
Load();
}
private void Initiate()
{
LogDataFile = Interface.Oxide.DataFileSystem.GetFile("PvX/LogData");
}
private void Load()
{
try
{
PvX.Puts("Loading Log Data");
logData = LogDataFile.ReadObject<LogData>();
PvXLogs = logData.StoredLogs;
}
catch
{
PvX.Puts("Couldn't load Log Data, Creating New file");
logData = new LogData();
PvXLogs = logData.StoredLogs;
}
}
public void Save()
{
logData.StoredLogs = PvXLogs;
LogDataFile.WriteObject(logData);
}
}
#endregion
#region Functions
void Init()
{
PvX = this;
LoadDefaultMessages();
RegisterPermissions();
//AddCovalenceCommand();
ticketManager = new TicketDataManager();
playerManager = new PlayerDataManager();
logManager = new LogDataManager();
lang.RegisterMessages(Messages, this);
}
void OnServerInitialized()
{
LoadVariables();
timer.Every(20f, () => CheckHelicopter());
BaseHelicopters = new HashSet<BaseHelicopter>(GameObject.FindObjectsOfType<BaseHelicopter>());
ChinooksHelicopters = new HashSet<CH47HelicopterAIController>(GameObject.FindObjectsOfType<CH47HelicopterAIController>());
BradleyAPCs = new HashSet<BradleyAPC>(GameObject.FindObjectsOfType<BradleyAPC>());
HeliFireBalls = new HashSet<FireBall>(BaseNetworkable.serverEntities?.Where(p => p != null && p is FireBall && (p.PrefabName.Contains("napalm") || p.PrefabName.Contains("oil")))?.Select(p => p as FireBall) ?? null);
initialized = true;
foreach (BasePlayer Player in BasePlayer.activePlayerList)
{
OnPlayerInit(Player);
}
}
// Need to save data when mod is unloaded
void Unload()
{
SaveAll();
foreach (BasePlayer player in BasePlayer.activePlayerList)
{
DestroyAllPvXUI(player);
}
}
void OnPlayerInit(BasePlayer player)
{
Puts("OnPlayerInit being called");
IPlayer iplayer = FindIPlayer(player.UserIDString);
if (IsNPC(player.userID)) return; // Then check if NPC
else if (!player.IsConnected)
{
timer.Once(3f, () =>
{
OnPlayerInit(player);
});
return;
}//Since player make sure they have "Joined" the game"
else PlayerLoaded(iplayer); // Now run PvX PlayerLoaded function
}
void PlayerLoaded(IPlayer iplayer)
{
BasePlayer player = FindBasePlayer(iplayer.Id);
//Functions to check if new player, old player, unknown/sleeper player.if (PvXPlayers.ContainsKey(player.userID))
{
Puts("PvXPlayers Contains player");
if (PvXPlayers[player.userID].State == PvXState.Unknown || PvXPlayers[player.userID].State == PvXState.Sleeper)
{
// Remove player to read clean version, keepingh specific date info.PvXPlayers.Remove(player.userID);
PvXPlayers.Add(player.userID, CreatePlayerData(player));
}
}
else
{
PvXPlayers.Add(player.userID, CreatePlayerData(player));
iplayer.Reply(GetMSG("WelcomeMessage", iplayer.Id));
}
if (HasPerm(player, "admin"))
{
AdminsOnline.Add(player.userID);
AdminIndicatorGui(player);
}
// Update players last connection time to today
PvXPlayers[player.userID].ConnectionLast = GetDateStamp();
if (PvXPlayers[player.userID].State == PvXState.NA)
{
PlayerNotification(iplayer);
}
else if (PvXPlayers[player.userID].Notification != PvXNotification.NA)
{
PlayerNotification(iplayer);
}
PlayerIndicatorGui(player);
}
void RegisterPermissions()
{
string[] Permissionarray = { "admin", "moderator", "wipe" }; //DO NOT EVER TOUCH THIS EVER!!!!!!
foreach (string i in Permissionarray)
{
string regPerm = PluginName.ToLower() + "." + i;
if (!permission.PermissionExists(regPerm))
{
permission.RegisterPermission(regPerm, this);
}
}
}
private PvXPlayer CreatePlayerData(BasePlayer player)
{
PvXPlayer Player = new PvXPlayer
{
ConnectionFirst = GetDateStamp(),
ConnectionLast = GetDateStamp(),
LastRequestStamp = 0,
Notification = PvXNotification.NoMode,
State = PvXState.NA,
Username = player.displayName,
Ticket = false,
TicketID = 0
};
return Player;
}
private PvXTicket CreateTicketData(BasePlayer player, int ticketnumber)
{
PvXTicket ticket = new PvXTicket
{
ID = player.userID,
Name = player.displayName,
Reason = "Null",
TimeStamp = GetTimeStamp(),
TimeStampString = GetDateStamp(),
TicketID = ticketnumber
};
return ticket;
}
private int GetNewLogID()
{
if (PvXLogs.Count > 1000)
{
return 0;
}
for (int _i = 1; _i <= 1000; _i++)
{
if (PvXLogs.ContainsKey(_i))
{
}
else
{
//Puts("Key {0} doesnt exist, Returning ticket number", _i); //debug
return _i;
}
}
return 0;
}
private int GetNewTicketID()
{
if (PvXTickets.Count > 1000)
{
return 0;
}
for (int _i = 1; _i <= 1000; _i++)
{
if (PvXTickets.ContainsKey(_i))
{
}
else
{
return _i;
}
}
return 0;
}
private string GetDateStamp()
{
return DateTime.Now.ToString("HH:mm dd-MM-yyyy");
}
private double GetTimeStamp()
{
return (DateTime.Now.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
}
private 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;
}
public static BasePlayer FindBasePlayer(string StringID)
{
ulong ID = Convert.ToUInt64(StringID);
BasePlayer BasePlayer = BasePlayer.FindByID(ID);
if (BasePlayer == null) BasePlayer = BasePlayer.FindSleeping(ID);
return BasePlayer;
}
public static IPlayer FindIPlayer(string StringID)
{
return PvX.covalence.Players.FindPlayerById(StringID);
}
private PvXState GetObjectPvXState(BaseEntity baseEntity)
{
if (baseEntity is BasePlayer)
{
BasePlayer player = (BasePlayer)baseEntity;
if (player == null) return PvXState.Unknown;
else if (PvXPlayers.ContainsKey(player.userID))
{
return PvXPlayers[player.userID].State;
}
else return PvXState.Unknown;
}
else return PvXState.NA;
}
private string GetPvXStateString (PvXState state)
{
string value;
switch (state)
{
case PvXState.AI:
value = "AI";
break;
case PvXState.NA:
value = "NA";
break;
case PvXState.PvE:
value = "PvE";
break;
case PvXState.PvP:
value = "PvP";
break;
case PvXState.Sleeper:
value = "Sleeper";
break;
case PvXState.Unknown:
value = "Unknown";
break;
default:
value = "Error";
break;
}
return value;
}
private void SaveAll()
{
playerManager.Save();
ticketManager.Save();
logManager.Save();
}
private void SavePlayerTicket()
{
playerManager.Save();
ticketManager.Save();
}
private void CheckHelicopter()
{
BaseHelicopters.RemoveWhere(p => (p?.IsDestroyed ?? true));
ChinooksHelicopters.RemoveWhere(p => (p?.IsDestroyed ?? true));
HeliFireBalls.RemoveWhere(p => (p?.IsDestroyed ?? true));
BradleyAPCs.RemoveWhere(p => (p?.IsDestroyed ?? true));
}
private int BaseHeliCount { get { return BaseHelicopters.Count; } }
private int CH47Count { get { return ChinooksHelicopters.Count; } }
private int BradleyCount { get { return BradleyAPCs.Count; } }
private int HeliCounts ()
{
return (BaseHeliCount + CH47Count);
}
#endregion
#region Chat Commands
[ChatCommand("pvx")]
void PvXChatCmd(BasePlayer player, string cmd, string[] args)
{
SaveAll();
IPlayer iplayer = FindIPlayer(player.UserIDString);
if (args.Count() == 0)
{
iplayer.Reply(GetMSG("PvX Chat Instructions 1", player.UserIDString));
iplayer.Reply(GetMSG("PvX Chat Instructions 2", player.UserIDString));
iplayer.Reply(GetMSG("PvX Chat Instructions 3", player.UserIDString));
}
else if (args.Count() > 0)
{
double CalculatedCooldown = (PvXPlayers[player.userID].LastRequestStamp + (configData.Options.ModeSwitchCooldown * 60f));
switch (args[0].ToLower())
{
case "pve":
if (PvXPlayers[player.userID].State == PvXState.NA)
{
PvXPlayers[player.userID].State = PvXState.PvE;
PvXPlayers[player.userID].Notification = PvXNotification.NA;
PvXPlayers[player.userID].LastRequestStamp = GetTimeStamp();
playerManager.Save();
iplayer.Reply(GetMSG("PlayerModeChange", iplayer.Id, "PvE"));
UpdatePlayersGui(player);
}
else
{
iplayer.Reply(GetMSG("ChatInstructionChange",iplayer.Id));
}
break;
case "pvp":
if (PvXPlayers[player.userID].State == PvXState.NA)
{
PvXPlayers[player.userID].State = PvXState.PvP;
PvXPlayers[player.userID].Notification = PvXNotification.NA;
PvXPlayers[player.userID].LastRequestStamp = GetTimeStamp();
playerManager.Save();
iplayer.Reply(GetMSG("PlayerModeChange", iplayer.Id, "PvP"));
UpdatePlayersGui(player);
}
else
{
iplayer.Reply(GetMSG("ChatInstructionChange", iplayer.Id));
}
break;
case "change":
if (!PvXPlayers.ContainsKey(player.userID))
{
iplayer.Reply(GetMSG("ChatInstructionPvX", iplayer.Id));
return;
}
if (configData.Options.AllowCooldowns)
{
if (CalculatedCooldown <= GetTimeStamp())
{
if (PvXPlayers[player.userID].State == PvXState.PvP)
{
PvXPlayers[player.userID].State = PvXState.PvE;
PvXPlayers[player.userID].LastRequestStamp = GetTimeStamp();
iplayer.Reply(GetMSG("PlayerModeChange", iplayer.Id, "PvE"));
playerManager.Save();
UpdatePlayersGui(player);
}
else if (PvXPlayers[player.userID].State == PvXState.PvE)
{
PvXPlayers[player.userID].State = PvXState.PvP;
PvXPlayers[player.userID].LastRequestStamp = GetTimeStamp();
iplayer.Reply(GetMSG("PlayerModeChange", iplayer.Id, "PvP"));
playerManager.Save();
UpdatePlayersGui(player);
}
else
{
iplayer.Reply(GetMSG("ChatInstructionPvX", iplayer.Id));
}
}
else if (configData.Options.AllowTickets)
{
int TicketNumber = GetNewTicketID();
PvXTickets.Add(TicketNumber, CreateTicketData(player, TicketNumber));
iplayer.Reply(GetMSG("PlayerTicketCreated",iplayer.Id));
PvXPlayers[player.userID].Ticket = true;
PvXPlayers[player.userID].TicketID = TicketNumber;
SavePlayerTicket();
UpdateAdminsGui();
UpdatePlayersGui(player);
}
else
{
double TimeRemaining = (CalculatedCooldown-GetTimeStamp())/60f;
// Notify player of remaining time before they can
iplayer.Reply(GetMSG("PlayerTimeRemainingVar",iplayer.Id, TimeRemaining.ToString("n2")));
}
}
else if (configData.Options.AllowTickets)
{
int TicketNumber = GetNewTicketID();
PvXTickets.Add(TicketNumber, CreateTicketData(player, TicketNumber));
iplayer.Reply(GetMSG("PlayerTicketCreated", iplayer.Id));
PvXPlayers[player.userID].Ticket = true;
PvXPlayers[player.userID].TicketID = TicketNumber;
UpdateAdminsGui();
}
else
{
Puts("you fked up, no ticket or cooldown option set for PvX");
}
break;
case "ticket":
if (PvXPlayers[player.userID].Ticket)
{
iplayer.Reply(GetMSG("PlayerHasTicketVar", iplayer.Id, PvXPlayers[player.userID].TicketID));
}
else
{
iplayer.Reply(GetMSG("PlayerNoTicket", iplayer.Id));
}
break;
case "tickets":
if (HasPerm(player, "admin", GetMSG("MissingPermisionVar", iplayer.Id, "admin")))
{
if (args.Count() > 1)
{
switch (args[1].ToLower())
{
case "list":
if (PvXTickets.Count() == 0)
{
iplayer.Reply(GetMSG("AdminNoTickets",iplayer.Id));
}
foreach (int TicketNumber in PvXTickets.Keys)
{
iplayer.Reply(GetMSG("TicketList1", iplayer.Id, TicketNumber));
iplayer.Reply(GetMSG("TicketList2", iplayer.Id, PvXTickets[TicketNumber].Name, GetPvXStateString(PvXPlayers[PvXTickets[TicketNumber].ID].State)));
}
break;
case "view":
if (args.Count() > 2)
{
int TicketNumber = 0;
if (Int32.TryParse(args[2], out TicketNumber))
{
if (PvXTickets.ContainsKey(TicketNumber))
{
//Add or Update Ticket View to adminviewlist.if (AdminViewedTicket.ContainsKey(player.userID))
{
AdminViewedTicket[player.userID] = PvXTickets[TicketNumber];
}
else
{
AdminViewedTicket.Add(player.userID, PvXTickets[TicketNumber]);
}
iplayer.Reply(GetMSG("AdminViewTicket1Var", iplayer.Id, TicketNumber));
iplayer.Reply(GetMSG("AdminViewTicket2Var", iplayer.Id, PvXTickets[TicketNumber].Name));
iplayer.Reply(GetMSG("AdminViewTicket3Var", iplayer.Id, PvXTickets[TicketNumber].TimeStampString));
iplayer.Reply(GetMSG("AdminViewTicket4Var", iplayer.Id, PvXTickets[TicketNumber].Reason));
iplayer.Reply(GetMSG("AdminViewTicket5", iplayer.Id));
}
}
}
break;
default:
break;
}
}
}
break;
case "accept":
if (HasPerm(player, "admin", GetMSG("MissingPermisionVar", iplayer.Id, "admin")))
{
if (AdminViewedTicket.ContainsKey(player.userID))
{
PvXTicket ViewedTicket = AdminViewedTicket[player.userID];
if (PvXTickets[ViewedTicket.TicketID] == ViewedTicket)
{
int TicketNumber = ViewedTicket.TicketID;
ulong TicketPlayerID = PvXTickets[TicketNumber].ID;
IPlayer TicketIplayer = FindIPlayer(TicketPlayerID.ToString());
BasePlayer TicketPlayer = FindBasePlayer(TicketPlayerID.ToString());
iplayer.Reply(GetMSG("AdminTicketAcceptedVar", iplayer.Id, ViewedTicket.Name));
PvXLog log = new PvXLog
{
AdminID = player.userID,
AdminName = player.displayName,
CreatedTimeStamp = PvXTickets[TicketNumber].TimeStampString,
PlayerID = PvXTickets[TicketNumber].ID,
PlayerName = PvXTickets[TicketNumber].Name,
Reason = PvXTickets[TicketNumber].Reason,
ReviewedTimeStamp = GetDateStamp(),
Outcome = "Accepted"
};
PvXLogs.Add(GetNewLogID(), log);
PvXTickets.Remove(TicketNumber);
if (PvXPlayers[TicketPlayerID].State == PvXState.PvP)
{
PvXPlayers[TicketPlayerID].State = PvXState.PvE;
PvXPlayers[TicketPlayerID].LastRequestStamp = GetTimeStamp();
}
else
{
PvXPlayers[TicketPlayerID].State = PvXState.PvP;
PvXPlayers[TicketPlayerID].LastRequestStamp = GetTimeStamp();
}
PvXPlayers[TicketPlayerID].Ticket = false;
PvXPlayers[TicketPlayerID].TicketID = 0;
if (TicketPlayer.IsConnected)
{
UpdatePlayersGui(player);
TicketIplayer.Reply(GetMSG("PlayerTicketAcceptedVar", TicketIplayer.Id, GetPvXStateString(PvXPlayers[TicketPlayerID].State)));
}
else
{
PvXPlayers[TicketPlayerID].Notification = PvXNotification.Accepted;
}
SaveAll();
}
else
{
iplayer.Reply(GetMSG("AdminTicketsDontMatch", iplayer.Id));
AdminViewedTicket.Remove(player.userID);
}
AdminViewedTicket.Remove(player.userID);
}
else
{
iplayer.Reply(GetMSG("AdminNoViewTicket", iplayer.Id));
}
}
break;
case "decline":
if (HasPerm(player, "admin", GetMSG("MissingPermisionVar", iplayer.Id, "admin")))
{
if (AdminViewedTicket.ContainsKey(player.userID))
{
PvXTicket ViewedTicket = AdminViewedTicket[player.userID];
if (PvXTickets[ViewedTicket.TicketID] == ViewedTicket)
{
iplayer.Reply(GetMSG("AdminTicketDeclinedVar", iplayer.Id, ViewedTicket.Name));
int TicketNumber = ViewedTicket.TicketID;
ulong TicketPlayerID = PvXTickets[TicketNumber].ID;
IPlayer TicketIplayer = FindIPlayer(TicketPlayerID.ToString());
BasePlayer TicketPlayer = FindBasePlayer(TicketPlayerID.ToString());
PvXLog log = new PvXLog
{
AdminID = player.userID,
AdminName = player.displayName,
CreatedTimeStamp = PvXTickets[TicketNumber].TimeStampString,
PlayerID = PvXTickets[TicketNumber].ID,
PlayerName = PvXTickets[TicketNumber].Name,
Reason = PvXTickets[TicketNumber].Reason,
ReviewedTimeStamp = GetDateStamp(),
Outcome = "Declined"
};
PvXLogs.Add(GetNewLogID(), log);
PvXTickets.Remove(TicketNumber);
PvXPlayers[TicketPlayerID].Ticket = false;
PvXPlayers[TicketPlayerID].TicketID = 0;
if (TicketPlayer.IsConnected)
{
UpdatePlayersGui(player);
TicketIplayer.Reply(GetMSG("PlayerTicketDeclined", TicketIplayer.Id, GetPvXStateString(PvXPlayers[TicketPlayerID].State)));
}
else
{
PvXPlayers[TicketPlayerID].Notification = PvXNotification.Delcined;
}
SaveAll();
}
else
{
iplayer.Reply(GetMSG("AdminTicketsDontMatch", iplayer.Id));
}
AdminViewedTicket.Remove(player.userID);
}
else
{
iplayer.Reply(GetMSG("AdminNoViewTicket", iplayer.Id));
}
}
break;
case "reason":
if (args.Count() == 2)
{
if (PvXPlayers[player.userID].Ticket)
{
int TicketNumber = PvXPlayers[player.userID].TicketID;
PvXTickets[TicketNumber].Reason = args[1];
ticketManager.Save();
}
}
else
{
iplayer.Reply(GetMSG("PlayerReasonIncorrect", iplayer.Id));
}
break;
default:
break;
}
}
}
#endregion
#region Combat Handle
void OnEntitySpawned(BaseNetworkable entity)
{
if (entity == null || !initialized) return;
var prefabname = entity?.ShortPrefabName ?? string.Empty;
var longprefabname = entity?.PrefabName ?? string.Empty;
if (string.IsNullOrEmpty(prefabname) || string.IsNullOrEmpty(longprefabname)) return;
if (entity is CH47HelicopterAIController)
{
ChinooksHelicopters.Add((entity as CH47HelicopterAIController));
return;
}
if (entity is BradleyAPC)
{
BradleyAPCs.Add((entity as BradleyAPC));
}
if (prefabname.Contains("patrolhelicopter") && !prefabname.Contains("gibs"))
{
var AIHeli = entity?.GetComponent<PatrolHelicopterAI>() ?? null;
var BaseHeli = entity?.GetComponent<BaseHelicopter>() ?? null;
if (AIHeli == null || BaseHeli == null) return;
BaseHelicopters.Add(BaseHeli);
return;
}
var ownerID = (entity as BaseEntity)?.OwnerID ?? 0;
if ((prefabname.Contains("napalm") || prefabname.Contains("oilfireball")) && !prefabname.Contains("rocket"))
{
var fireball = entity?.GetComponent<FireBall>() ?? null;
if (fireball == null) return;
Puts("Entity is Fireball from helicopter");
return;
}
if (prefabname.Contains("rocket_heli"))
{
//Puts(prefabname.ToString());
//entity.Kill();
}
if (prefabname.Contains("maincannonshell")){
if (entity is TimedExplosive)
{
if (BradleyAPCs.Count > 0)
{
// maybe do something here
}
else
{
// Delete the item
}
}
}
//else
//{
// Puts("Entity Name: " + entity.name);
// Puts("Entity Prefab Name: " + entity.PrefabName);
// Puts("Entity Short Prefab Name: " + entity.ShortPrefabName);
// Puts("Entity GameObject: " + entity.gameObject);
//}
//if (entity is BaseEntity)
//{
// BaseEntity thing = (BaseEntity)entity;
// if (thing is BaseCombatEntity)
// {
// BaseCombatEntity baseCombatEntity;
// }
// Puts("OwnerID");
// Puts(thing.OwnerID.ToString());
// Puts("Creator entity");
//}
}
//void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
//{
// Puts("OnEntityDeath works!");
//}
//void OnEntityEnter(TriggerBase trigger, BaseEntity entity)
//{
// Puts("OnEntityEnter works!");
//}
void OnEntityKill(BaseNetworkable entity)
{
if (entity == null) return;
var name = entity?.ShortPrefabName ?? string.Empty;
if (name.Contains("patrolhelicopter") && !name.Contains("gib"))
{
var baseHeli = entity?.GetComponent<BaseHelicopter>() ?? null;
if (baseHeli == null) return;
if (BaseHelicopters.Contains(baseHeli)) BaseHelicopters.Remove(baseHeli);
}
if (entity is CH47HelicopterAIController)
{
var CH47 = entity?.GetComponent<CH47HelicopterAIController>() ?? null;
if (CH47 == null) return;
if (ChinooksHelicopters.Contains(CH47)) ChinooksHelicopters.Remove(CH47);
}
if (entity is BradleyAPC)
{
var bradley = entity?.GetComponent<BradleyAPC>() ?? null;
if (bradley == null) return;
if (BradleyAPCs.Contains(bradley)) BradleyAPCs.Remove(bradley);
}
if (entity is FireBall || name.Contains("fireball") || name.Contains("napalm"))
{
var fireball = entity?.GetComponent<FireBall>() ?? null;
if (fireball != null && HeliFireBalls.Contains(fireball)) HeliFireBalls.Remove(fireball);
}
//if (entity.ToString().Contains("maincannonshell"))
//{
//}
}
//private void FireRocket(PatrolHelicopterAI heliAI)
//{
// Puts("Heli Fire rocket being called");
//}
void OnEntityTakeDamage(BaseCombatEntity Target, HitInfo HitInfo)
{
if (HitInfo.damageTypes.Has(Rust.DamageType.Decay)) return;
if (initialized == false)
{
ModifyDamage(HitInfo, 0f);
return;
}
if (Target == null || HitInfo == null || Target.GetComponent<ResourceDispenser>() != null) return;
BaseEntity Attacker = HitInfo?.Initiator;
Type attackerType = Attacker?.GetType();
Type targetType = Target?.GetType();
String Weapon = HitInfo?.WeaponPrefab?.ShortPrefabName;
// Handle Attacks with Null damage
if ((Attacker == null || attackerType == null || targetType == null) && Weapon == null)
{
Puts("return");
return;
}
else if ((Attacker == null || attackerType == null || targetType == null) && Weapon == "maincannonshell") BradleyAPCAttacker(Target, HitInfo);
else if ((Attacker == null || attackerType == null || targetType == null) && Weapon == "rocket_heli_napalm") HelicopterAttacker(Target, HitInfo);
else if (Attacker == null || attackerType == null || targetType == null)
{
if (Weapon != null)
{
Puts("Weapon: " + Weapon);
}
if (Attacker == null)
{
HitInfo hitinfocopy = HitInfo;
ModifyDamage(HitInfo, 0f);
DamageDebuger(hitinfocopy);
return;
}
if (attackerType == null)
{
HitInfo hitinfocopy = HitInfo;
ModifyDamage(HitInfo, 0f);
DamageDebuger(hitinfocopy);
return;
}
if (targetType == null)
{
ModifyDamage(HitInfo, 0f);
return;
}
return;
}
if (targetType == typeof(HelicopterDebris) || targetType == typeof(DroppedItemContainer)) return;
else if (Attacker is BasePlayer) PlayerAttacker(Target, (BasePlayer)Attacker, HitInfo);
else if (Attacker is FireBall) FireBallAttacker(Target, HitInfo);
else if (Attacker is BaseHelicopter) HelicopterAttacker(Target, HitInfo);
else if (Attacker is BradleyAPC) BradleyAPCAttacker(Target, HitInfo);
else if (AnimalList.Contains(attackerType)) AnimalAttacker(Target, HitInfo);
else if (Attacker is MotorRowboat) return; //removes debugging spam
}
void PlayerAttacker(BaseEntity Target, BasePlayer Attacker, HitInfo HitInfo)
{
if (Target is Scientist)
{
if (Attacker is Scientist) return;
return;
//BasePlayer BaseTarget = (BasePlayer)Target;
//BasePlayer BaseAttacker = (BasePlayer)Attacker;
//if (BaseTarget.userID == BaseAttack
// ... [Code preview truncated due to length. Full source in attached file] ...