Иконка ресурса

FREE FactionsCore : 1.0.5 1.0.5

Нет прав для скачивания
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] ...

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху