C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using System;
using System.Linq;
using UnityEngine;
using Oxide.Core.Plugins;
using Oxide.Core.Configuration;
using Oxide.Game.Rust.Cui;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Reflection;
using System.Globalization;
namespace Oxide.Plugins {
[Info("FactionsCore", "Absolut & misticos", "1.0.5")]
[Description("A revamped faction/team system")]
class FactionsCore : RustPlugin {
#region Fields
[PluginReference]
Plugin EventManager, ZoneManager, LustyMap, ZoneDomes, Kits, ImageLibrary, Professions, CustomSets, LastFactionStanding, FactionsTax, Conquest;
static FieldInfo buildingPrivlidges = typeof(BasePlayer).GetField("buildingPrivilege", BindingFlags.Instance | BindingFlags.NonPublic);
FactionsData fdata;
private DynamicConfigFile FDATA;
string TitleColor = "<color=orange>";
string MsgColor = "<color=#A9A9A9>";
bool initialized;
public HashSet<FactionPlayer> FactionPlayers = new HashSet<FactionPlayer>();
private List<ulong> InFactionChat = new List<ulong>();
private List<ulong> MakingFactionAnnouncement = new List<ulong>();
private List<ulong> AdminView = new List<ulong>();
private List<ulong> JoinCooldown = new List<ulong>();
private List<ulong> Passthrough = new List<ulong>();
private Dictionary<string, List<ulong>> ActiveUniforms = new Dictionary<string, List<ulong>>();
private Dictionary<ulong, ulong> AssignFaction = new Dictionary<ulong, ulong>();
private Dictionary<ulong, Dictionary<Item, Slot>> LockedUniform = new Dictionary<ulong, Dictionary<Item, Slot>>();
private List<Monuments> MonumentLocations = new List<Monuments>();
class Monuments {
public Vector3 position;
public float radius;
}
private Dictionary<string, Timer> timers = new Dictionary<string, Timer>();
private Dictionary<ulong, FactionDesigner> FactionDetails = new Dictionary<ulong, FactionDesigner>();
private Dictionary<ulong, FactionDesigner> FactionEditor = new Dictionary<ulong, FactionDesigner>();
#endregion
#region Hooks
void Loaded() {
FDATA = Interface.Oxide.DataFileSystem.GetFile("FactionsCore_Data");
lang.RegisterMessages(messages, this);
}
void Unload() {
foreach (var p in FactionPlayers) DestroyFactionPlayer(p, true);
foreach (var entry in timers) entry.Value.Destroy();
timers.Clear();
DestroyAll<FactionPlayer>();
FactionPlayers.Clear();
SaveData();
}
private void DestroyAll<T>() {
var objects = UnityEngine.Object.FindObjectsOfType(typeof(T));
if (objects == null) return;
foreach (var gameObj in objects) UnityEngine.Object.Destroy(gameObj);
}
void OnServerInitialized() {
initialized = false;
try {
ImageLibrary.Call("isLoaded", null);
}
catch (Exception) {
PrintWarning("No Image Library..load ImageLibrary to use this Plugin", Name);
Interface.Oxide.UnloadPlugin(Name);
return;
}
LoadVariables();
LoadData();
permission.RegisterPermission(this.Title + ".admin", this);
permission.RegisterPermission(this.Title + ".allow", this);
foreach (BasePlayer p in BasePlayer.activePlayerList) OnPlayerConnected(p);
InitializeStuff();
CheckFactionStale();
}
[ChatCommand("testplayers")]
void chatTP(BasePlayer player) {
var i = 0;
while (i < 100) {
ulong FakeID = (ulong)GetRandomNumber();
if (fdata.Players.ContainsKey(FakeID)) continue;
fdata.Players.Add(FakeID, new PlayerData {
}
);
i++;
}
SendReply(player, "Fake Players Created!");
SaveData();
}
private void InitializeStuff() {
if (timers.ContainsKey("imageloading")) {
timers["imageloading"].Destroy();
timers.Remove("imageloading");
}
if (!isReady()) {
Puts(GetMSG("WaitingImageLibrary"));
timers.Add("imageloading", timer.Once(60, () => InitializeStuff()));
return;
}
;
CreateLoadOrder();
foreach (var entry in configData.FactionEmblems_URLS) AddImage(entry.Value, "Embleem" + entry.Key, (ulong)ResourceId);
if (CustomSets) foreach (var entry in fdata.Factions) if (!string.IsNullOrEmpty(entry.Value.KitorSet)) SaveSetContents(entry.Value.KitorSet);
FindMonuments();
initialized = true;
SaveData();
timers.Add("info", timer.Once(900, () => InfoLoop()));
timers.Add("save", timer.Once(600, () => SaveLoop()));
timers.Add("ui", timer.Once(60, () => ReloadPlayerPanel()));
}
public void SaveSetContents(string set) {
var contents = CustomSets?.Call("GetSetInfo", set);
if (contents is bool || contents == null) {
Puts($"Set: {set} is not valid!");
return;
}
JObject kitContents = contents as JObject;
JArray items = kitContents["belt"] as JArray;
foreach (var itemEntry in items) {
JObject item = itemEntry as JObject;
if (!ActiveUniforms.ContainsKey((string)item["shortname"])) ActiveUniforms.Add((string)item["shortname"], new List<ulong>());
if (!ActiveUniforms[(string)item["shortname"]].Contains((ulong)item["skin"])) ActiveUniforms[(string)item["shortname"]].Add((ulong)item["skin"]);
}
items = kitContents["wear"] as JArray;
foreach (var itemEntry in items) {
JObject item = itemEntry as JObject;
if (!ActiveUniforms.ContainsKey((string)item["shortname"])) ActiveUniforms.Add((string)item["shortname"], new List<ulong>());
if (!ActiveUniforms[(string)item["shortname"]].Contains((ulong)item["skin"])) ActiveUniforms[(string)item["shortname"]].Add((ulong)item["skin"]);
}
items = kitContents["main"] as JArray;
foreach (var itemEntry in items) {
JObject item = itemEntry as JObject;
if (!ActiveUniforms.ContainsKey((string)item["shortname"])) ActiveUniforms.Add((string)item["shortname"], new List<ulong>());
if (!ActiveUniforms[(string)item["shortname"]].Contains((ulong)item["skin"])) ActiveUniforms[(string)item["shortname"]].Add((ulong)item["skin"]);
}
}
private void CreateLoadOrder() {
Dictionary<string, string> newLoadOrder = new Dictionary<string, string> {
{
"announcementoff", "http://i.imgur.com/JcyGEid.png"
}
, {
"announcementon", "http://i.imgur.com/JuHJViL.png"
}
, {
"chatoff", "http://i.imgur.com/ZnXH99w.png"
}
, {
"chaton", "http://i.imgur.com/x80bOhZ.png"
}
, {
"mainmenu", "http://i.imgur.com/6lNt3SU.png"
}
, {
"lightbutton", "http://i.imgur.com/rUhwglx.jpg"
}
, {
"darkbutton", "http://i.imgur.com/91KexGA.jpg"
}
, {
"hourglass", "http://i.imgur.com/4ItihIf.png"
}
, {
"self", "http://i.imgur.com/w3iZpsl.png"
}
, {
"box", "http://i.imgur.com/KWN4edk.png"
}
, {
"battle", "http://i.imgur.com/EdiuVTZ.png"
}
, {
"safezone", "http://i.imgur.com/v5TPxyv.png"
}
, {
"friend", "http://i.imgur.com/FE4fV9O.png"
}
, {
"greylongbutton", "http://www.pd4pic.com/images/glass-glossy-gui-shape-element-rectangle-shapes.png"
}
, {
"first", "http://cdn.mysitemyway.com/etc-mysitemyway/icons/legacy-previews/icons/simple-black-square-icons-arrows/126517-simple-black-square-icon-arrows-double-arrowhead-left.png"
}
, {
"back", "http://i.imgur.com/3iCM9zg.png"
}
, {
"next", "http://i.imgur.com/Dt0XmUP.png"
}
, {
"last", "http://cdn.mysitemyway.com/etc-mysitemyway/icons/legacy-previews/icons/matte-white-square-icons-arrows/124577-matte-white-square-icon-arrows-double-arrowhead-right.png"
}
, {
"neverdelete", "http://www.intrawallpaper.com/static/images/r4RtXBr.png"
}
, {
"bluelongbutton", "https://pixabay.com/static/uploads/photo/2016/01/23/11/41/button-1157299_960_720.png"
}
, {
"redlongbutton", "https://pixabay.com/static/uploads/photo/2016/01/23/11/42/button-1157301_960_720.png"
}
, {
"blacklongbutton", "https://pixabay.com/static/uploads/photo/2016/01/23/11/26/button-1157269_960_720.png"
}
, {
"greenlongbutton", "https://pixabay.com/static/uploads/photo/2015/07/25/08/03/the-button-859349_960_720.png"
}
, {
"purplelongbutton", "https://pixabay.com/static/uploads/photo/2015/07/25/07/55/the-button-859343_960_720.png"
}
, {
"greensquarebutton", "http://www.pd4pic.com/images/libya-flag-country-nationality-square-button.png"
}
, {
"redsquarebutton", "https://openclipart.org/image/2400px/svg_to_png/78601/Red-button.png"
}
, {
"circleselection", "http://i.imgur.com/mkjxZiu.png"
}
}
;
ImageLibrary.Call("ImportImageList", Title, newLoadOrder, (ulong)ResourceId, true);
}
void CheckFactionStale() {
if (configData.FactionStaleTime == 0) return;
List<ushort> StaleFactions = new List<ushort>();
foreach (var entry in fdata.Factions) if (entry.Value.LastMemberLoggedIn != 0) if ((entry.Value.LastMemberLoggedIn + (configData.FactionStaleTime * 86400)) < GrabCurrentTime()) StaleFactions.Add(entry.Key);
foreach (var entry in StaleFactions) fdata.Factions.Remove(entry);
}
private void OnPlayerConnected(BasePlayer player) {
if (player != null) {
if (player.HasPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot) || !initialized) {
timer.Once(5, () => OnPlayerConnected(player));
return;
}
if (player.IsSleeping()) player.EndSleeping();
InitializeFactionPlayer(player);
}
}
private void OnPlayerRespawned(BasePlayer player) {
DestroyUI(player);
GiveFactionGear(player);
PlayerPanel(player);
}
private void OnPlayerDisconnected(BasePlayer player) {
if (GetFactionPlayer(player) != null) {
if (timers.ContainsKey(player.userID.ToString())) timers.Remove(player.userID.ToString());
DestroyFactionPlayer(GetFactionPlayer(player));
}
}
private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo) {
if (hitInfo == null || entity == null) return;
try {
if (configData.Allow_FriendlyFire) return;
if (entity is BasePlayer && hitInfo.Initiator is BaseTrap) if (fdata.Players[entity.ToPlayer().userID].faction == fdata.Players[hitInfo.Initiator.OwnerID].faction) hitInfo.damageTypes.ScaleAll(configData.FriendlyFire_DamageScale);
var attacker = hitInfo.Initiator.ToPlayer();
if (attacker == null || GetFactionPlayer(attacker) == null) return;
if (entity is BasePlayer) {
var victim = entity.ToPlayer();
if (victim == null) return;
if (fdata.Players.ContainsKey(victim.userID)) if (fdata.Players[victim.userID].faction == 0) return;
if (EventManager) {
object isPlaying = EventManager?.Call("isPlaying", new object[] {
attacker
}
);
if (isPlaying is bool) if ((bool)isPlaying) return;
}
if (victim != attacker) {
if (GetFactionPlayer(attacker).Faction != fdata.Players[victim.userID].faction) return;
{
hitInfo.damageTypes.ScaleAll(configData.FriendlyFire_DamageScale);
if (timers.ContainsKey(attacker.UserIDString + "FF")) return;
GetSendMSG(attacker, "FFs", victim.displayName);
timers.Add(attacker.UserIDString, timer.Once(60, () => timers.Remove(attacker.UserIDString + "FF")));
}
}
}
else if (entity is BaseEntity) {
var OwnerID = entity.OwnerID;
if (attacker.userID == OwnerID) return;
if (GetFactionPlayer(attacker).Faction != fdata.Players[OwnerID].faction) return;
if (OwnerID != 0) {
if (EventManager) {
object isPlaying = EventManager?.Call("isPlaying", new object[] {
attacker
}
);
if (isPlaying is bool) if ((bool)isPlaying) return;
}
if (!AllowedToBuild(attacker)) {
hitInfo.damageTypes.ScaleAll(0);
if (timers.ContainsKey(attacker.UserIDString + "FFB")) return;
GetSendMSG(attacker, "FFBuildings", GetDisplayName(OwnerID));
timers.Add(attacker.UserIDString, timer.Once(60, () => timers.Remove(attacker.UserIDString + "FFB")));
}
}
}
}
catch (Exception) {
}
}
[ConsoleCommand("UI_DestroyUI")]
private void cmdUI_DestroyUI(ConsoleSystem.Arg arg) {
var player = arg.Connection.player as BasePlayer;
if (player == null) return;
DestroyUI(player);
}
void DestroyFactionPlayer(FactionPlayer player, bool unloading = false) {
if (player.player == null) return;
if (!string.IsNullOrEmpty(configData.MenuKeyBinding)) player.player.Command($"bind {configData.MenuKeyBinding} \"\"");
DestroyUI(player.player, true);
SaveFactionPlayer(player);
if(IsFaction(player.Faction)) fdata.Factions[player.Faction].LastMemberLoggedIn = GrabCurrentTime();
if (!unloading) {
if (FactionPlayers.Contains(player)) FactionPlayers.Remove(player);
UnityEngine.Object.Destroy(player);
}
}
static double GrabCurrentTime() => DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
object OnServerCommand(ConsoleSystem.Arg arg) {
if (!initialized) return null;
var player = arg.Connection?.player as BasePlayer;
if (player == null || arg.Args == null || arg.Args[0].StartsWith("/") || arg.cmd?.FullName != "chat.say") return null;
if (FactionDetails.ContainsKey(player.userID)) {
FactionCreationChat(player, arg.Args);
return false;
}
if (!configData.Use_FactionAnnouncements && !configData.Use_PrivateFactionChat && !configData.Use_FactionChatControl) return null;
string message = string.Join(" ", arg.Args);
if (message.Length == 0) return null;
string color = "";
if (GetFactionPlayer(player) != null && GetFactionPlayer(player).Faction != 0 && fdata.Factions.ContainsKey(GetFactionPlayer(player).Faction)) {
var faction = GetFactionPlayer(player).Faction;
if (configData.Use_FactionAnnouncements && MakingFactionAnnouncement.Contains(player.userID)) {
fdata.Factions[faction].FactionAnnouncements.Add(fdata.Factions[faction].FactionAnnouncements.Keys.Max() + 1, message);
foreach (var fp in FactionPlayers.Where(k => k.Faction == faction && k.open)) FactionAnnouncementPanel(fp.player);
return false;
}
color = "<color=" + fdata.Factions[faction].ChatColor + ">";
if (configData.Use_FactionTags) {
color += "[" + fdata.Factions[faction].tag + "] ";
}
string formatMsg = "";
if (configData.Use_PrivateFactionChat && InFactionChat.Contains(player.userID)) {
formatMsg = color + player.displayName + "</color>: " + $"<color={configData.InFactionChat_ChatColor}>" + message + "</color>";
BroadcastFaction(player, formatMsg);
}
else if (configData.Use_FactionChatControl) {
formatMsg = color + player.displayName + "</color>: " + message;
Broadcast(formatMsg, player.userID.ToString());
}
return false;
}
return null;
}
private void FactionCreationChat(BasePlayer player, string[] Args) {
FactionDesigner Creation = FactionDetails[player.userID];
if (Args.Contains("quit")) {
QuitFactionCreation(player);
return;
}
if (Args.Contains("save")) {
SaveFaction(player);
return;
}
var args = string.Join(" ", Args);
if (args.Length == 0) return;
switch (Creation.stepNum) {
case 1 : if (fdata.Factions.Count() > 0) {
foreach (var faction in fdata.Factions) if (faction.Value.Name == args) {
GetSendMSG(player, "FactionNameExists", args);
break;
}
else {
Creation.faction.Name = args;
Creation.stepNum = 2;
if (Creation.editing) FactionCreation(player, 20);
else FactionCreation(player, 2);
}
}
else {
Creation.faction.Name = args;
Creation.stepNum = 2;
if (Creation.editing) FactionCreation(player, 20);
else FactionCreation(player, 2);
}
return;
case 2 : if (fdata.Factions.Count() > 0) {
if (Args[0].Length > 5) {
GetSendMSG(player, "FactionTagToLong", Args[0]);
return;
}
foreach (var faction in fdata.Factions) if (faction.Value.tag == Args[0]) {
GetSendMSG(player, "FactionTagExists", Args[0]);
}
else {
Creation.faction.tag = $"{Args[0]}";
Creation.stepNum = 3;
if (Creation.editing) FactionCreation(player, 20);
else FactionCreation(player, 3);
}
}
else {
Creation.faction.tag = $"[{Args[0]}]";
Creation.stepNum = 3;
if (Creation.editing) FactionCreation(player, 20);
else FactionCreation(player, 3);
}
return;
case 3 : if (Creation.faction.description == "") Creation.faction.description = args;
else Creation.faction.description = Creation.faction.description + " " + args;
FactionCreation(player, 6);
return;
}
}
#endregion
#region Functions
bool isAuth(BasePlayer player) {
if (player.net.connection != null) if (player.net.connection.authLevel < 2 && !permission.UserHasPermission(player.UserIDString, "FactionsCore.admin")) return false;
return true;
}
private string TryForImage(string shortname, ulong skin = 99) {
if (shortname.Contains("http")) return shortname;
if (skin == 99) skin = (ulong)ResourceId;
return GetImage(shortname, skin, true);
}
public string GetImage(string shortname, ulong skin = 0, bool returnUrl = false) => (string)ImageLibrary.Call("GetImage", shortname.ToLower(), skin, returnUrl);
public bool HasImage(string shortname, ulong skin = 0) => (bool)ImageLibrary.Call("HasImage", shortname.ToLower(), skin);
public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname.ToLower(), skin);
public List<ulong> GetImageList(string shortname) => (List<ulong>)ImageLibrary.Call("GetImageList", shortname.ToLower());
public bool isReady() => (bool)ImageLibrary?.Call("IsReady");
public object LFSLocation(ushort ID) => LastFactionStanding?.Call("LFSLocation", ID);
public object TaxboxLocation(ushort ID) => FactionsTax?.Call("TaxboxLocation", ID);
public List<string> GetSetContents(string set) {
if (CustomSets?.Call("GetSetContents", set) is bool) return null;
return (List<string>)CustomSets?.Call("GetSetContents", set);
}
private void InitializeFactionPlayer(BasePlayer player) {
if (GetFactionPlayer(player) == null) FactionPlayers.Add(player.gameObject.AddComponent<FactionPlayer>());
FactionPlayer fp = player.GetComponent<FactionPlayer>();
if (!fdata.Players.ContainsKey(player.userID)) fdata.Players.Add(player.userID, new PlayerData());
var data = fdata.Players[player.userID];
if (fdata.Factions.ContainsKey(data.faction)) {
if (fdata.Factions[data.faction].factionPlayers.Contains(player.userID)) {
fp.Faction = data.faction;
if (fdata.Factions[data.faction].factionPlayers.Count == 1) fdata.Factions[data.faction].Leader = player.userID;
ZoneManager?.Call("AddPlayerToZoneWhitelist", data.faction.ToString(), player);
AuthorizePlayerOnTurrets(player);
}
else {
ZoneManager?.Call("RemovePlayerFromZoneWhitelist", data.faction.ToString(), player);
UNAuthorizePlayerOnTurrets(player, data.faction);
fp.Faction = 0;
}
}
else fp.Faction = 0;
if (fp.Faction != 0) AddFactionListLM(player.userID, fdata.Factions[fp.Faction].Name, fdata.Factions[fp.Faction].factionPlayers);
string key = String.Empty;
if (!string.IsNullOrEmpty(configData.MenuKeyBinding)) {
player.Command($"bind {configData.MenuKeyBinding} \"UI_FC_ToggleMenu\"");
key = GetMSG("FCAltInfo", player, configData.MenuKeyBinding.ToUpper());
}
if (configData.InfoInterval != 0) GetSendMSG(player, "FCInfo", key);
GiveFactionGear(player);
PlayerPanel(player);
PrivateCheck(player.userID);
SaveData();
}
private void GiveFactionGear(BasePlayer player) {
if (LockedUniform.ContainsKey(player.userID)) {
foreach (var entry in LockedUniform[player.userID]) {
if (!Passthrough.Contains(player.userID)) Passthrough.Add(player.userID);
entry.Key.RemoveFromContainer();
entry.Key.Remove(0f);
}
LockedUniform.Remove(player.userID);
}
if (GetFactionPlayer(player) == null || GetFactionPlayer(player).Faction == 0 || string.IsNullOrEmpty(fdata.Factions[GetFactionPlayer(player).Faction].KitorSet)) return;
if (Kits) {
object isKit = Kits?.Call("isKit", new object[] {
fdata.Factions[GetFactionPlayer(player).Faction].KitorSet
}
);
if (isKit is bool) if ((bool)isKit) {
List<Item> current = new List<global : : Item>();
current = player.inventory.containerWear.itemList.Where(k => k.IsLocked()).Select(k => k).ToList();
if (current != null) foreach (var entry in current) {
entry.RemoveFromContainer();
}
if (!Passthrough.Contains(player.userID)) Passthrough.Add(player.userID);
Kits?.Call("GiveKit", player, fdata.Factions[GetFactionPlayer(player).Faction].KitorSet);
if (Passthrough.Contains(player.userID)) Passthrough.Remove(player.userID);
LockedUniform.Add(player.userID, new Dictionary<global : : Item, Slot>());
foreach (var entry in player.inventory.containerWear.itemList) {
if (!ActiveUniforms.ContainsKey(entry.info.shortname)) ActiveUniforms.Add(entry.info.shortname, new List<ulong>());
if (!ActiveUniforms[entry.info.shortname].Contains(entry.skin)) ActiveUniforms[entry.info.shortname].Add(entry.skin);
Slot slot;
if (ItemSlots.TryGetValue(entry.info.shortname, out slot)) LockedUniform[player.userID].Add(entry, slot);
}
foreach (var entry in current) entry.MoveToContainer(player.inventory.containerWear);
return;
}
}
else if (CustomSets) {
if ((bool)CustomSets?.Call("isSet", fdata.Factions[GetFactionPlayer(player).Faction].KitorSet)) {
List<Item> current = new List<global : : Item>();
current = player.inventory.containerWear.itemList.Select(k => k).ToList();
if (current != null) foreach (var entry in current) {
entry.RemoveFromContainer();
}
if (!Passthrough.Contains(player.userID)) Passthrough.Add(player.userID);
CustomSets?.Call("GiveSet", player, fdata.Factions[GetFactionPlayer(player).Faction].KitorSet);
if (Passthrough.Contains(player.userID)) Passthrough.Remove(player.userID);
LockedUniform.Add(player.userID, new Dictionary<global : : Item, Slot>());
foreach (var entry in player.inventory.containerWear.itemList) {
if (!ActiveUniforms.ContainsKey(entry.info.shortname)) ActiveUniforms.Add(entry.info.shortname, new List<ulong>());
if (!ActiveUniforms[entry.info.shortname].Contains(entry.skin)) ActiveUniforms[entry.info.shortname].Add(entry.skin);
Slot slot;
if (ItemSlots.TryGetValue(entry.info.shortname, out slot)) LockedUniform[player.userID].Add(entry, slot);
}
foreach (var entry in current) {
if (LockedUniform[player.userID].Select(k => k.Key).Where(k => k.info.shortname == entry.info.shortname && k.skin == entry.skin) != null) {
entry.Remove(0f);
}
else entry.MoveToContainer(player.inventory.containerWear);
}
//player.inventory.containerWear.MarkDirty();
return;
}
}
}
object CanWearItem(PlayerInventory inventory, Item item) {
if (!initialized) return null;
//Puts($"ITEM: {item.info.displayName.translated}");
if (!configData.LockFactionKits_and_CustomSets) return null;
if (inventory.containerWear.playerOwner == null) return null;
BasePlayer player = inventory.containerBelt.playerOwner;
if (player == null) return null;
if (Passthrough.Contains(player.userID)) return null;
var fp = GetFactionPlayer(player);
if (!LockedUniform.ContainsKey(player.userID)) if (!ActiveUniforms.ContainsKey(item.info.shortname) || !ActiveUniforms[item.info.shortname].Contains(item.skin)) {
//Puts("Not restricted item and player doesnt have locked item");
return null;
}
if (fp == null || fp.Faction == 0 || !LockedUniform.ContainsKey(player.userID)) {
//Puts("Restricted item and player is not in faction or have locked items");
return false;
}
//Puts("Locked Uniform Contains Player - Not passthrough");
if (LockedUniform[player.userID].ContainsKey(item)) {
//Puts("Item is approved for Wear List...allowed through");
return null;
}
//Puts("Locked doesnt contain the item...");
Slot slot;
if (ItemSlots.TryGetValue(item.info.shortname, out slot)) {
//Puts("ItemSlots has item...");
if (LockedUniform[player.userID].ContainsValue(slot) || slot == Slot.any) {
//Puts("Slot is any or the same as a locked item...");
return false;
}
}
//Puts("ALLOWED");
return null;
}
object OnItemAction(Item item, string cmd) {
if (!initialized) return null;
if (item == null || item.parent == null || item.parent.playerOwner == null) return null;
BasePlayer player = item.parent.playerOwner.GetComponent<PlayerInventory>().containerWear.GetOwnerPlayer();
if (player == null) return null;
if (item.parent.playerOwner.inventory.containerWear.itemList.Contains(item) && LockedUniform[player.userID].ContainsKey(item) && cmd == "drop") return false;
return null;
}
object CanAcceptItem(ItemContainer container, Item item) {
if (!initialized) return null;
if (!configData.LockFactionKits_and_CustomSets) return null;
if (container == null || item == null || item.parent == null || item.parent.playerOwner == null) return null;
//container.playerOwner == null || container.playerOwner.GetComponent<PlayerInventory>() == null ||
BasePlayer player = item.parent.playerOwner.GetComponent<PlayerInventory>().containerBelt.GetOwnerPlayer();
if (Passthrough.Contains(player.userID) || !LockedUniform.ContainsKey(player.userID)) return null;
//Puts("Locked Uniform Contains Player");
//if (LockedUniform[player.userID].ContainsKey(item) && container == player.inventory.containerWear)
//{
// Puts("Item is approved for Wear List...allowed through");
// return null;
//}
if (item.parent.playerOwner.inventory.containerWear.itemList.Contains(item) && LockedUniform[player.userID].ContainsKey(item)) {
//Puts("Item is in Wear List and Locked contains the item...");
return ItemContainer.CanAcceptResult.CannotAccept;
}
//Puts("Item is not in Wear List or Locked doesnt contain the item...");
//Slot slot;
//if (ItemSlots.TryGetValue(item.info.shortname, out slot))
//{
// Puts("ItemSlots has item...");
// if (LockedUniform[player.userID].ContainsValue(slot) || slot == Slot.any)
// {
// Puts("Slot is any or the same or locked uniforms contains it...");
// return ItemContainer.CanAcceptResult.CannotAccept;
// }
//}
return null;
}
private void FindMonuments() {
var allobjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
foreach (var gobject in allobjects) if (gobject.name.Contains("autospawn/monument")) MonumentLocations.Add(new Monuments {
position = gobject.transform.position, radius = gobject.transform.GetBounds().max.z
}
);
}
//AutoTurrets
void OnEntitySpawned(BaseNetworkable entity) {
if (!initialized) return;
if (entity == null) return;
if (entity as AutoTurret != null && configData.AutoAuthorization) {
var userid = entity.GetComponent<AutoTurret>().OwnerID;
BasePlayer owner = BasePlayer.FindByID(userid);
if (owner == null || GetFactionPlayer(owner) == null || GetFactionPlayer(owner).Faction == 0) return;
AssignTurretAuth(fdata.Factions[GetFactionPlayer(owner).Faction], entity.GetComponent<AutoTurret>());
}
}
object CanUseLockedEntity(BasePlayer player, BaseLock door) {
if (!initialized) return null;
if (GetFactionPlayer(player) == null || GetFactionPlayer(player).Faction == 0) return null;
var parent = door.parentEntity.Get(true);
var prefab = parent.LookupPrefab();
if (parent.IsOpen()) return true;
if (configData.AutoAuthorization) {
if (configData.AuthorizeLeadersOnly && fdata.Factions[GetFactionPlayer(player).Faction].Leader != player.userID) return null;
if (fdata.Factions[GetFactionPlayer(player).Faction].factionPlayers.Contains(parent.OwnerID) && AllowedToBuild(player)) return true;
}
return null;
}
void AssignTurretAuth(Faction faction, AutoTurret turret) {
if (!configData.AutoAuthorization) return;
if (configData.AuthorizeLeadersOnly) {
var owner = faction.Leader;
if (!turret.authorizedPlayers.Contains(new ProtoBuf.PlayerNameID() {
userid = owner, username = GetDisplayName(owner)
}
)) turret.authorizedPlayers.Add(new ProtoBuf.PlayerNameID() {
userid = owner, username = GetDisplayName(owner)
}
);
return;
}
foreach (var p in faction.factionPlayers) {
if (!fdata.Players.ContainsKey(p)) continue;
if (!turret.authorizedPlayers.Contains(new ProtoBuf.PlayerNameID() {
userid = p, username = GetDisplayName(p)
}
)) turret.authorizedPlayers.Add(new ProtoBuf.PlayerNameID() {
userid = p, username = GetDisplayName(p)
}
);
}
}
void AuthorizePlayerOnTurrets(BasePlayer player) {
var faction = fdata.Factions[GetFactionPlayer(player).Faction];
if (configData.AuthorizeLeadersOnly && faction.Leader != player.userID) return;
if (configData.AutoAuthorization) {
List<AutoTurret> turrets = new List<AutoTurret>();
turrets = BaseNetworkable.serverEntities.Where(k => (k as AutoTurret) != null && faction.factionPlayers.Contains((k as AutoTurret).OwnerID)).Select(k => k as AutoTurret).ToList();
foreach (var entry in turrets) {
var turret = entry as AutoTurret;
if (!turret.authorizedPlayers.Contains(new ProtoBuf.PlayerNameID() {
userid = player.userID, username = player.displayName
}
)) turret.authorizedPlayers.Add(new ProtoBuf.PlayerNameID() {
userid = player.userID, username = player.displayName
}
);
}
}
}
void UNAuthorizePlayerOnTurrets(BasePlayer player, ushort oldFaction) {
var faction = fdata.Factions[oldFaction];
if (configData.AutoAuthorization) {
List<BaseNetworkable> turrets = BaseNetworkable.serverEntities.Where(k => (k as AutoTurret) != null && faction.factionPlayers.Contains((k as AutoTurret).OwnerID)).Select(k => k).ToList();
{
if (turrets != null) foreach (var entry in turrets) {
var turret = entry as AutoTurret;
if (turret.authorizedPlayers.Contains(new ProtoBuf.PlayerNameID() {
userid = player.userID, username = player.displayName
}
)) turret.authorizedPlayers.Remove(new ProtoBuf.PlayerNameID() {
userid = player.userID, username = player.displayName
}
);
}
}
}
}
void SaveFactionPlayer(FactionPlayer player) {
if (fdata.Factions.ContainsKey(player.Faction)) if (!fdata.Factions[player.Faction].factionPlayers.Contains(player.player.userID)) fdata.Factions[player.Faction].factionPlayers.Add(player.player.userID);
if (!fdata.Players.ContainsKey(player.player.userID)) fdata.Players.Add(player.player.userID, new PlayerData());
var fp = fdata.Players[player.player.userID];
fp.faction = player.Faction;
}
public FactionPlayer GetFactionPlayer(BasePlayer player) {
if (!player.GetComponent<FactionPlayer>()) return null;
else return player.GetComponent<FactionPlayer>();
}
bool isOwner(BasePlayer player, ushort faction) {
if (fdata.Factions[faction].Leader == player.userID) return true;
return false;
}
bool isModerator(BasePlayer player, ushort faction) {
if (fdata.Factions[faction].Moderators.Contains(player.userID)) return true;
return false;
}
public void Broadcast(string message, string userid = "0") => PrintToChat(message);
public void BroadcastFaction(BasePlayer source, string message, ushort faction = 0) {
if (faction == 0) faction = GetFactionPlayer(source).Faction;
if (!fdata.Factions.ContainsKey(faction)) return;
string color = fdata.Factions[faction].ChatColor;
foreach (var entry in fdata.Factions[faction].factionPlayers) try {
BasePlayer player = BasePlayer.FindByID(entry);
GetSendMSG(player, message);
}
catch {
}
}
private void BroadcastOnScreenFaction(string message, ushort faction = 0, ushort faction2 = 0) {
if (faction == 0) {
if (fdata.Factions.ContainsKey(faction2)) foreach (var player in BasePlayer.activePlayerList.Where(k => GetFactionPlayer(k) != null && GetFactionPlayer(k).Faction != faction2)) OnScreen(player, message, fdata.Factions[faction].UIColor);
else foreach (var player in BasePlayer.activePlayerList.Where(k => GetFactionPlayer(k) != null)) OnScreen(player, message);
}
else if (fdata.Factions.ContainsKey(faction)) foreach (var entry in fdata.Factions[faction].factionPlayers) {
try {
BasePlayer player = BasePlayer.FindByID(entry);
OnScreen(player, message, fdata.Factions[faction].UIColor);
}
catch {
}
}
}
private void GetSendMSG(BasePlayer player, string message, string arg1 = "", string arg2 = "", string arg3 = "") {
string msg = string.Format(lang.GetMessage(message, this, player.UserIDString), arg1, arg2, arg3);
SendReply(player, TitleColor + lang.GetMessage("title", this, player.UserIDString) + "</color>" + MsgColor + msg + "</color>");
}
private string GetMSG(string message, BasePlayer player = null, string arg1 = "", string arg2 = "", string arg3 = "") {
string p = null;
if (player != null) p = player.UserIDString;
if (messages.ContainsKey(message)) return string.Format(lang.GetMessage(message, this, p), arg1, arg2, arg3);
else return message;
}
private void QuitFactionCreation(BasePlayer player) {
if (FactionDetails[player.userID].creating) {
FactionDetails.Remove(player.userID);
GetSendMSG(player, "QuitFactionCreation");
}
else if (FactionEditor[player.userID].editing) {
FactionEditor.Remove(player.userID);
GetSendMSG(player, "QuitFactionEditing");
}
DestroyUI(player);
}
private void RemoveFaction(BasePlayer player, ushort ID, bool admin = false) {
var factionname = fdata.Factions[ID].Name;
fdata.Factions.Remove(ID);
if (player != null) {
DestroyUI(player);
Broadcast($"{factionname} {GetMSG("FactionDeleted")}");
}
if (admin) ReassignPlayers(ID);
SaveData();
}
private void ReassignPlayers(ushort ID) {
foreach (var entry in fdata.Factions[ID].factionPlayers) {
fdata.Players[entry].faction = default(ushort);
try {
BasePlayer player = BasePlayer.FindByID(entry);
GetSendMSG(player, "FactionDeleted");
GetFactionPlayer(player).Panel = "Selection";
FactionPanel(player);
}
catch {
}
}
}
static bool AllowedToBuild(BasePlayer player) {
if (player == null) return false;
List<BuildingPrivlidge> playerpriv = buildingPrivlidges.GetValue(player) as List<BuildingPrivlidge>;
if (playerpriv == null || playerpriv.Count == 0) {
return false;
}
foreach (BuildingPrivlidge priv in playerpriv.ToArray()) {
List<ProtoBuf.PlayerNameID> authorized = priv.authorizedPlayers;
bool foundplayer = false;
foreach (ProtoBuf.PlayerNameID pni in authorized.ToArray()) if (pni.userid == player.userID) foundplayer = true;
if (!foundplayer) return false;
}
return true;
}
private void DestroyUI(BasePlayer player, bool all = false) {
FactionPlayer fp = GetFactionPlayer(player);
if (fp != null) {
fp.open = false;
fp.SelectedFaction = new ushort();
fp.TargetPlayer = new ulong();
fp.Panel = "HOME";
}
if (all) CuiHelper.DestroyUi(player, PanelPlayer);
CuiHelper.DestroyUi(player, PanelFAnnouncements);
CuiHelper.DestroyUi(player, PanelStatic);
CuiHelper.DestroyUi(player, PanelProfile);
CuiHelper.DestroyUi(player, PanelFactions);
CuiHelper.DestroyUi(player, PanelOnScreen);
if (Professions) player.SendConsoleCommand("UI_ToggleProfessionsMenu close");
if (CustomSets) player.SendConsoleCommand("ToggleCSUI close");
}
#endregion
#region UI Creation
private string PanelOnScreen = "OnScreen";
private string PanelFactions = "FactionsPanel";
private string PanelPlayer = "PlayerPanel";
private string PanelStatic = "PanelStatic";
private string PanelFAnnouncements = "PanelFAnnouncements";
private string PanelProfile = "PanelProfile";
public class UI {
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, panelName
}
}
;
return NewElement;
}
static public CuiElementContainer CreateOverlayContainer(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 = "Overlay", 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);
}
// ... [Code preview truncated due to length. Full source in attached file] ...