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

FREE LandLord : 1.0.17 1.0.17

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Plugins;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("LandLord", "bravoavo", "1.0.17")]
    [Description("Take control of the map")]
    class LandLord : RustPlugin {
        [PluginReference]
        Plugin ZoneManager, Clans;
        ConfigData configData;
        private DynamicConfigFile data;
        //Constant initialization
        readonly uint bannerprefabid = 3188315846;
        readonly float size = 146.33f;
        readonly bool debug = true;
        int notrespassgather = 1;
        int onlyconnected = 1;
        int gatherratio = 3;
        int graycircles = 1;
        readonly string zonenameprefix = "LandlordZone";
        readonly string datafile_name = "Landlord.data";
        private const string permUse = "landlord.admin";
        readonly Color[] colorArray = new Color[] {
            Color.black, Color.white, Color.red, Color.blue, Color.green, Color.yellow, Color.cyan, Color.gray, new Color32(255, 157, 0, 1)
        }
        ;
        private Color colors;
        public Dictionary<string, int> currentsettings = new Dictionary<string, int>();
        public Dictionary<ulong, HashSet<int[]>> flagi = new Dictionary<ulong, HashSet<int[]>>();
        public Dictionary<ulong, List<string>> quadrants = new Dictionary<ulong, List<string>>();
        public Dictionary<string, Vector3> poles = new Dictionary<string, Vector3>();
        public Dictionary<ulong, int> gatherMultiplier = new Dictionary<ulong, int>();
        public Dictionary<string, ulong> teamList = new Dictionary<string, ulong>();
        public Dictionary<string, MapMarkerGenericRadius> allmarkers = new Dictionary<string, MapMarkerGenericRadius>();
        public Dictionary<string, List<MapMarkerGenericRadius>> flagmarkers = new Dictionary<string, List<MapMarkerGenericRadius>>();
        public List<string> blockedItemsList {
            get;
            set;
        }
        = new List<string>();
#region Localization
        private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);
        protected override void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                ["LordStatus"]
                = "<color=orange>LANDLORD:</color> Grounds seized: {0} TeamID is: {1}", ["UsageAdmin"] = "<color=orange>LANDLORD:</color> Usage:\n /lordadmin notrespass enable|disable \n " + "/lordadmin onlyconnected enable|disable " + "\n /lordadmin graycircles enable|disable " + "\n /lordadmin gatherratio [from 1 to 1000] " + "\n /lordadmin settings " + "\n /lordadmin blockitem [item] \n /lordadmin unblockitem [item] \n /lordadmin blockitemlist \n /lordadmin blockitemclear", ["NoPermission"] = "<color=orange>LANDLORD:</color> You do not have the permissions to use this command.", ["LordStatusZero"] = "<color=orange>LANDLORD:</color> Grounds seized: 0 TeamID is: {0}", ["TeamClearSuccess"] = "<color=orange>LANDLORD:</color> Team clear: Success!", ["BlockedItemsEditSuccess"] = "<color=orange>LANDLORD:</color> Blocked items list edit: Success!", ["BlockedItemsClearSuccess"] = "<color=orange>LANDLORD:</color> Blocked items clear: Success!", ["BlockedItems"] = "<color=orange>LANDLORD:</color> Blocked Items: {0}", ["HaveNoTeam"] = "<color=orange>LANDLORD:</color> You are have no team!", ["CellHasPole"] = "<color=orange>LANDLORD:</color> This map cell already has a pole! Destroy it before build a new one", ["SettingsChanged"] = "<color=orange>LANDLORD:</color> Settings changed!", ["CurrentSettings"] = "<color=orange>LANDLORD:</color> notrespass {0} \n onlyconnected {1} \n graycircles {2} \n gatherratio {3}", ["NotrespassStatus"] = "<color=orange>LANDLORD:</color> notrespass mode is {0} to switch use /lordadmin notrespass enable|disable ", ["OnlyconnectedStatus"] = "<color=orange>LANDLORD:</color> onlyconected mode is {0}", ["GatherratioStatus"] = "<color=orange>LANDLORD:</color> Gatherratio set to {0}", ["GraycirclesStatus"] = "<color=orange>LANDLORD:</color> graycircles is {0}", ["CellNotConnected"] = "<color=orange>LANDLORD:</color> The cell you try to capture not connected to another yours", ["CellCaptured"] = "<color=orange>LANDLORD:</color> You deploy pole! Your gather rate increased!", ["CellCapturedGlobal"] = "<color=orange>LANDLORD:</color> Player {0} has captured the cell {1}", ["CellFreedGlobal"] = "<color=orange>LANDLORD:</color> The cell {0} has freed up"
            }
            , this);
        }
#endregion Localization
#region ZoneInitialization
        private void MyZonesInit() {
            float mapsize = TerrainMeta.Size.x;
            int counter = 0;
            int j = 100;
            var celltogenerate = Math.Pow(Math.Round(mapsize / size), 2);
            Puts("Generating the cell map.Nubmer to generate is " + celltogenerate);
            for (var x = -mapsize / 2 + size / 2; x <= mapsize / 2; x = x + size) {
                int i = 100;
                for (var z = -mapsize / 2 + size / 2; z <= mapsize / 2; z = z + size) {
                    string[] array = new string[] {
                        "name", zonenameprefix + j + i, "size", "146.3 500 146.3", "location", x + " 0 " + z
                    }
                    ;
                    ZoneManager.Call("EraseZone", j + i.ToString().PadLeft(3, '0'));
                    ZoneManager.Call("CreateOrUpdateZone", j + i.ToString().PadLeft(3, '0'), array);
                    i++;
                    counter++;
                }
                j++;
                Puts("Generating...> " + counter + " of " + celltogenerate);
            }
            Puts("Generating is done!");
            var InitFile = Interface.Oxide.DataFileSystem.GetFile(datafile_name);
            InitFile.Save();
        }
#endregion
#region InitPlugin
        private void OnServerInitialized() {
            permission.RegisterPermission(permUse, this);
            if (Clans == null || !Clans.IsLoaded) {
                PrintError("Missing plugin dependency Clans: https://umod.org/plugins/clans");
                return;
            }
            if (ZoneManager != null && ZoneManager.IsLoaded) {
                if (!Interface.Oxide.DataFileSystem.ExistsDatafile(datafile_name)) {
                    MyZonesInit();
                }
            }
            else {
                PrintError("Missing plugin dependency Zone Manager: https://umod.org/plugins/zone-manager");
                return;
            }
            if (Interface.Oxide.DataFileSystem.ExistsDatafile(datafile_name)) {
                data = Interface.Oxide.DataFileSystem.GetDatafile(datafile_name);
            }
            LoadData();
        }
#endregion
#region PlayerInit
        void OnPlayerSleepEnded(BasePlayer player) {
            foreach (var quadrat in quadrants) {
                foreach (var zone in quadrat.Value) {
                    if (currentsettings["graycircles"] == 1) allmarkers[zone].SendUpdate();
                    flagmarkers[zone][0].SendUpdate();
                    flagmarkers[zone][1].SendUpdate();
                    flagmarkers[zone][2].SendUpdate();
                }
            }
            if (!flagi.ContainsKey(player.userID)) GenarateFlag(player.userID);
        }
        private void GenarateFlag(ulong playerId) {
            if (flagi.Count < 900) {
                System.Random rnd = new System.Random();
                int[] colorsArrayTmp;
                flagi.Add(playerId, new HashSet<int[]>());
                do {
                    int color1 = rnd.Next(0, 8);
                    int color2 = rnd.Next(0, 8);
                    int color3 = rnd.Next(0, 8);
                    colorsArrayTmp = new int[] {
                        color1, color2, color3
                    }
                    ;
                }
                while (!flagi[playerId].Add(colorsArrayTmp));
            }
        }
#endregion
#region OxideHooks
        void OnEntityKill(BaseEntity entity) {
            if (entity.prefabID == bannerprefabid) {
                if (debug) Puts("Entity 'Banner on Pole' killed - Prefab ID is " + entity.prefabID.ToString() + " Location " + entity.ServerPosition);
                var zoneid = poles.FirstOrDefault(x => x.Value == entity.ServerPosition).Key;
                if (zoneid != null) {
                    if (debug) Puts("ZoneID id " + zoneid);
                    if (currentsettings["graycircles"] == 1) {
                        DeleteMarkerFromMap(allmarkers[zoneid]);
                        allmarkers.Remove(zoneid);
                    }
                    DeleteMarkerFromMap(flagmarkers[zoneid][0]);
                    DeleteMarkerFromMap(flagmarkers[zoneid][1]);
                    DeleteMarkerFromMap(flagmarkers[zoneid][2]);
                    flagmarkers.Remove(zoneid);
                    ulong teampid = 0;
                    foreach (KeyValuePair<ulong, List<string>> playerid in quadrants) {
                        var match = playerid.Value.FirstOrDefault(stringToCheck => stringToCheck.Contains(zoneid));
                        if (match != null) {
                            teampid = playerid.Key;
                            break;
                        }
                    }
                    if (teampid == 0) {
                        if (debug) Puts("Can't found cell owner");
                        return;
                    }
                    quadrants[teampid].Remove(zoneid);
                    if (quadrants[teampid].Count == 0) quadrants.Remove(teampid);
                    poles.Remove(zoneid);
                    if (gatherMultiplier.ContainsKey(teampid)) {
                        if (gatherMultiplier[teampid] > 0) gatherMultiplier[teampid]--;
                    }
                    PrintToChat(Lang("CellFreedGlobal", "1", GetGrid(entity.ServerPosition)));
                    SaveData();
                }
                else if (debug) Puts("Zone id not found");
            }
        }
        void OnEntityBuilt(Planner plan, GameObject go) {
            BasePlayer player = plan.GetOwnerPlayer();
            ulong teampid;
            string playerClan = Clans.Call<string>("GetClanOf", player);
            if (playerClan != null && teamList.ContainsKey(playerClan)) teampid = teamList[playerClan];
            else teampid = player.userID;
            string[] zids = (string[])ZoneManager.Call("GetPlayerZoneIDs", player);
            var entity = go.ToBaseEntity();
            if (entity.prefabID == bannerprefabid && zids.Length > 0) {
                string curentZoneId = GetLordZoneId(zids);
                if (debug) Puts("Banner entity was built.Prefab ID is " + entity.prefabID + " zone ID is " + curentZoneId);
                if (!quadrants.ContainsKey(teampid)) {
                    quadrants.Add(teampid, new List<string>());
                    quadrants[teampid].Add(curentZoneId);
                }
                else {
                    var match = quadrants[teampid].FirstOrDefault(stringToCheck => stringToCheck.Contains(curentZoneId));
                    if (match != null) return;
                    else {
                        quadrants[teampid].Add(curentZoneId);
                    }
                }
                if (!gatherMultiplier.ContainsKey(teampid)) {
                    gatherMultiplier.Add(teampid, 1);
                }
                else {
                    gatherMultiplier[teampid]++;
                }
                poles.Add(curentZoneId, entity.ServerPosition);
                if (debug) Puts("Server position " + entity.ServerPosition.ToString());
                var zonelocation = (Vector3)ZoneManager.Call("GetZoneLocation", curentZoneId);
                if (currentsettings["graycircles"] == 1) SpawnMarkerOnMap(zonelocation, curentZoneId);
                SpawnFlag(zonelocation, curentZoneId, teampid);
                player.ChatMessage(Lang("CellCaptured", player.UserIDString));
                PrintToChat(Lang("CellCapturedGlobal", player.UserIDString, player.displayName, GetGrid(entity.ServerPosition)));
                SaveData();
            }
            else if (debug) Puts("After build - Not found zone ID or prefab!");
        }
        void OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player) {
            ulong teampid;
            string playerClan = Clans.Call<string>("GetClanOf", player);
            if (playerClan != null && teamList.ContainsKey(playerClan)) teampid = teamList[playerClan];
            else teampid = player.userID;
            // Check if the player has at least a captured cell and if not skip further processing
            if (!quadrants.ContainsKey(teampid)) return;
            string[] zids = (string[])ZoneManager.Call("GetPlayerZoneIDs", player);
            string match = null;
            foreach (ItemAmount item in collectible.itemList) {
                if (blockedItemsList.Contains(item.itemDef.shortname)) return;
                if (currentsettings["notrespassgather"] == 1) {
                    if (zids.Length > 0) {
                        if (debug) Puts("Looking for exact landlord zone");
                        string curentZoneId = GetLordZoneId(zids);
                        if (curentZoneId == "None") {
                            if (debug) Puts("Landlord zone not found!");
                            return;
                        }
                        match = quadrants[teampid].FirstOrDefault(stringToCheck => stringToCheck.Contains(curentZoneId));
                        if (!poles.ContainsKey(curentZoneId) || (poles.ContainsKey(curentZoneId) && match != null)) {
                            if (gatherMultiplier.ContainsKey(teampid)) {
                                if (gatherMultiplier[teampid] > 0) {
                                    float multiplier = (float)gatherMultiplier[teampid] * currentsettings["gatherratio"] / 100;
                                    item.amount = (int)(item.amount + 1 + item.amount * multiplier);
                                }
                            }
                        }
                    }
                }
                else {
                    if (gatherMultiplier.ContainsKey(teampid)) {
                        if (gatherMultiplier[teampid] > 0) {
                            float multiplier = (float)gatherMultiplier[teampid] * currentsettings["gatherratio"] / 100;
                            item.amount = (int)(item.amount + 1 + item.amount * multiplier);
                        }
                    }
                }
            }
        }
        object OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item) {
            ulong teampid;
            if (blockedItemsList.Contains(item.info.shortname)) return null;
            string[] zids = (string[])ZoneManager.Call("GetPlayerZoneIDs", player);
            string match = null;
            string playerClan = Clans.Call<string>("GetClanOf", player);
            if (playerClan != null && teamList.ContainsKey(playerClan)) teampid = teamList[playerClan];
            else teampid = player.userID;
            // Check if the player has at least a captured cell and if not skip further processing
            if (!quadrants.ContainsKey(teampid)) return null;
            if (debug) Puts("Dispenser.Start amount is " + item.amount);
            if (currentsettings["notrespassgather"] == 1) {
                if (zids.Length > 0) {
                    if (debug) Puts("Looking for exact landlord zone");
                    string curentZoneId = GetLordZoneId(zids);
                    if (curentZoneId == "None") {
                        if (debug) Puts("Landlord zone not found!");
                        return null;
                    }
                    match = quadrants[teampid].FirstOrDefault(stringToCheck => stringToCheck.Contains(curentZoneId));
                    if (!poles.ContainsKey(curentZoneId) || (poles.ContainsKey(curentZoneId) && match != null)) {
                        if (gatherMultiplier.ContainsKey(teampid)) {
                            if (gatherMultiplier[teampid] > 0) {
                                float multiplier = (float)gatherMultiplier[teampid] * currentsettings["gatherratio"] / 100;
                                if (debug) Puts("Multiplier is " + multiplier);
                                item.amount = (int)(item.amount + 5 + item.amount * multiplier);
                            }
                        }
                    }
                }
            }
            else {
                if (gatherMultiplier.ContainsKey(teampid)) {
                    if (gatherMultiplier[teampid] > 0) {
                        float multiplier = (float)gatherMultiplier[teampid] * currentsettings["gatherratio"] / 100;
                        if (debug) Puts("Multiplier is " + multiplier);
                        item.amount = (int)(item.amount + 5 + item.amount * multiplier);
                    }
                }
            }
            return null;
        }
        object CanBuild(Planner planner, Construction prefab, Construction.Target target) {
            BasePlayer player = planner.GetOwnerPlayer();
            ulong teampid;
            string playerClan = Clans.Call<string>("GetClanOf", player);
            if (playerClan != null && teamList.ContainsKey(playerClan)) teampid = teamList[playerClan];
            else teampid = player.userID;
            string[] zids = (string[])ZoneManager.Call("GetPlayerZoneIDs", player);
            if (prefab.prefabID == bannerprefabid && zids.Length > 0) {
                if (debug) Puts("Looking for exact landlord zone");
                string curentZoneId = GetLordZoneId(zids);
                if (curentZoneId == "None") {
                    if (debug) Puts("Error! Landlord zone not found!");
                    return false;
                }
                if (currentsettings["onlyconnected"] == 1 && quadrants.ContainsKey(teampid)) {
                    if (!CheckConnected(curentZoneId, teampid)) {
                        player.ChatMessage(Lang("CellNotConnected", player.UserIDString));
                        if (debug) Puts("Zone not connected to another!");
                        return false;
                    }
                }
                if (poles.ContainsKey(curentZoneId)) {
                    player.ChatMessage(Lang("CellHasPole", player.UserIDString));
                    if (debug) Puts("Zone has a pole already!");
                    return false;
                }
                if (debug) Puts("Banner building allowed.Prefab ID is " + prefab.prefabID + " zone ID is " + curentZoneId);
                return null;
            }
            else if (debug) Puts("Before build - Not found zone ID or banner prefab.");
            return null;
        }
        private void OnClanCreate(string tag) {
            timer.Once(1f, () => {
                JObject clan = GetClan(tag);
                if (debug) Puts("Clan owner " + clan["owner"]);
                teamList.Add(tag, (ulong)clan["owner"]);
                SaveData();
            }
            );
        }
        private void OnClanDestroy(string tag) {
            if (debug) Puts("Existing clan destroyed");
            teamList.Remove(tag);
            SaveData();
        }
#endregion
#region MarkersAndMap
        private void DeleteMarkerFromMap(MapMarkerGenericRadius marker) {
            marker.Kill();
            marker.SendUpdate();
        }
        private void SpawnMarkerOnMap(Vector3 position, string curentZoneId) {
            int mapsize = (int)TerrainMeta.Size.x;
            colors = Color.black;
            float zoneradius = (100000f / mapsize) * 0.02f;
            float markeralpha = 0.5f;
            var mapMarker = GameManager.server.CreateEntity("assets/prefabs/tools/map/genericradiusmarker.prefab", position) as MapMarkerGenericRadius;
            mapMarker.alpha = markeralpha;
            mapMarker.color1 = colors;
            mapMarker.color2 = colors;
            mapMarker.radius = (float)Math.Round(zoneradius, 2);
            mapMarker.Spawn();
            mapMarker.SendUpdate();
            if (!allmarkers.ContainsKey(curentZoneId)) {
                allmarkers.Add(curentZoneId, mapMarker);
            }
            else {
                if (debug) Puts("Marker already in dictionary");
            }
        }
        private void SpawnFlag(Vector3 position, string curentZoneId, ulong playerId) {
            if (!flagi.ContainsKey(playerId)) GenarateFlag(playerId);
            HashSet<int[]> array = flagi[playerId];
            List<int> listik = new List<int>();
            foreach (var ids in array) {
                listik.Add(ids[0]);
                listik.Add(ids[1]);
                listik.Add(ids[2]);
            }
            float mapsize = TerrainMeta.Size.x;
            Color color1 = colorArray[listik[0]];
            Color color2 = colorArray[listik[1]];
            Color color3 = colorArray[listik[2]];
            Vector3 position1;
            Vector3 position2;
            Vector3 position3;
            float zoneradius = (100000f / mapsize) * 0.002f;
            float markeralpha = 0.7f;
            position1.x = position.x - 63;
            position1.y = position.y;
            position1.z = position.z - 63;
            position2.x = position.x - 48;
            position2.y = position.y;
            position2.z = position.z - 63;
            position3.x = position.x - 33;
            position3.y = position.y;
            position3.z = position.z - 63;
            var mapMarker1 = GameManager.server.CreateEntity("assets/prefabs/tools/map/genericradiusmarker.prefab", position1) as MapMarkerGenericRadius;
            mapMarker1.alpha = markeralpha;
            mapMarker1.color1 = color1;
            mapMarker1.color2 = color1;
            mapMarker1.radius = (float)Math.Round(zoneradius, 2);
            var mapMarker2 = GameManager.server.CreateEntity("assets/prefabs/tools/map/genericradiusmarker.prefab", position2) as MapMarkerGenericRadius;
            mapMarker2.alpha = markeralpha;
            mapMarker2.color1 = color2;
            mapMarker2.color2 = color2;
            mapMarker2.radius = (float)Math.Round(zoneradius, 2);
            var mapMarker3 = GameManager.server.CreateEntity("assets/prefabs/tools/map/genericradiusmarker.prefab", position3) as MapMarkerGenericRadius;
            mapMarker3.alpha = markeralpha;
            mapMarker3.color1 = color3;
            mapMarker3.color2 = color3;
            mapMarker3.radius = (float)Math.Round(zoneradius, 2);
            mapMarker1.Spawn();
            mapMarker1.SendUpdate();
            mapMarker2.Spawn();
            mapMarker2.SendUpdate();
            mapMarker3.Spawn();
            mapMarker3.SendUpdate();
            if (!flagmarkers.ContainsKey(curentZoneId)) {
                flagmarkers.Add(curentZoneId, new List<MapMarkerGenericRadius>());
                flagmarkers[curentZoneId].Add(mapMarker1);
                flagmarkers[curentZoneId].Add(mapMarker2);
                flagmarkers[curentZoneId].Add(mapMarker3);
            }
            else {
                if (debug) Puts("Flag marker already in dictionary");
            }
        }
#endregion
#region DataManagement
        class ConfigData {
            public Dictionary<ulong, HashSet<int[]>> FlagiData = new Dictionary<ulong, HashSet<int[]>>();
            public Dictionary<ulong, List<string>> QuadrantsData = new Dictionary<ulong, List<string>>();
            public Dictionary<string, Vector3> PolesLocationData = new Dictionary<string, Vector3>();
            public Dictionary<ulong, int> GatherRateData = new Dictionary<ulong, int>();
            public Dictionary<string, ulong> TeamListData = new Dictionary<string, ulong>();
            public Dictionary<string, int> LandlordSettings = new Dictionary<string, int>();
            public List<string> BlockedItems = new List<string>();
        }
        private void LoadData() {
            quadrants.Clear();
            flagi.Clear();
            gatherMultiplier.Clear();
            teamList.Clear();
            poles.Clear();
            currentsettings.Clear();
            blockedItemsList.Clear();
            try {
                if (debug) Puts("A try to use existing configuration");
                configData = data.ReadObject<ConfigData>();
                quadrants = configData.QuadrantsData;
                blockedItemsList = configData.BlockedItems;
                flagi = configData.FlagiData;
                gatherMultiplier = configData.GatherRateData;
                teamList = configData.TeamListData;
                poles = configData.PolesLocationData;
                currentsettings = configData.LandlordSettings;
                if (quadrants.Count > 0) {
                    foreach (var marker in UnityEngine.Object.FindObjectsOfType<MapMarkerGenericRadius>()) {
                        DeleteMarkerFromMap(marker);
                    }
                    foreach (var quadrat in quadrants) {
                        foreach (var zone in quadrat.Value) {
                            var zonelocation = (Vector3)ZoneManager.Call("GetZoneLocation", zone);
                            if (currentsettings["graycircles"] == 1) SpawnMarkerOnMap(zonelocation, zone);
                            SpawnFlag(zonelocation, zone, quadrat.Key);
                        }
                    }
                }
                if (!currentsettings.ContainsKey("notrespassgather")) {
                    currentsettings["notrespassgather"] = notrespassgather;
                }
                if (!currentsettings.ContainsKey("onlyconnected")) {
                    currentsettings["onlyconnected"] = onlyconnected;
                }
                if (!currentsettings.ContainsKey("graycircles")) {
                    currentsettings["graycircles"] = graycircles;
                }
                if (!currentsettings.ContainsKey("gatherratio")) {
                    currentsettings["gatherratio"] = gatherratio;
                }
                if (debug) Puts("Existing configuration found and loaded");
            }
            catch {
                if (debug) Puts("Existing configuration not found.A new configuration creating.");
                configData = new ConfigData();
                quadrants = configData.QuadrantsData;
                flagi = configData.FlagiData;
                gatherMultiplier = configData.GatherRateData;
                teamList = configData.TeamListData;
                poles = configData.PolesLocationData;
                currentsettings = configData.LandlordSettings;
                currentsettings["notrespassgather"] = notrespassgather;
                currentsettings["onlyconnected"] = onlyconnected;
                currentsettings["graycircles"] = graycircles;
                currentsettings["gatherratio"] = gatherratio;
            }
            SaveData();
        }
        private void SaveData() {
            data = Interface.Oxide.DataFileSystem.GetDatafile(datafile_name);
            data.WriteObject(configData);
        }
        private JObject GetClan(string tag) {
            JObject clan = (JObject)Clans.Call("GetClan", tag);
            if (clan == null) {
                if (debug) Puts("Clan " + tag + " not found");
                return null;
            }
            return clan;
        }
#endregion
#region ChatCommands
        [ChatCommand("lord")]
        private void CmdChatLordStats(BasePlayer player, string command, string[] args) {
            ulong teampid;
            string playerClan = Clans.Call<string>("GetClanOf", player);
            if (playerClan != null && teamList.ContainsKey(playerClan)) teampid = teamList[playerClan];
            else teampid = player.userID;
            if (gatherMultiplier.ContainsKey(teampid) && gatherMultiplier[teampid] > 0) {
                player.ChatMessage(Lang("LordStatus", player.UserIDString, gatherMultiplier[teampid].ToString(), teampid.ToString()));
            }
            else player.ChatMessage(Lang("LordStatusZero", player.UserIDString, teampid.ToString()));
        }
        [ChatCommand("lordadmin")]
        void LordAdminCommand(BasePlayer player, string command, string[] args) {
            if (!permission.UserHasPermission(player.UserIDString, permUse)) {
                player.ChatMessage(Lang("NoPermission", player.UserIDString));
                return;
            }
            if (debug) Puts("Args lenght " + args.Length);
            string cstatus, tstatus, gcstatus;
            if (args.Length > 0) {
                switch (args[0]) {
                    default : player.ChatMessage(Lang("UsageAdmin", player.UserIDString));
                    break;
                    case "nt" : case "notrespass" : if (args.Length == 2) {
                        if (args[1] == "enable") currentsettings["notrespassgather"] = 1;
                        if (args[1] == "disable") currentsettings["notrespassgather"] = 0;
                    }
                    tstatus = (currentsettings["notrespassgather"] == 1) ? "Enabled" : "Disabled";
                    player.ChatMessage(Lang("NotrespassStatus", player.UserIDString, tstatus));
                    SaveData();
                    break;
                    case "oc" : case "onlyconnected" : if (args.Length == 2) {
                        if (args[1] == "enable") currentsettings["onlyconnected"] = 1;
                        if (args[1] == "disable") currentsettings["onlyconnected"] = 0;
                    }
                    cstatus = (currentsettings["onlyconnected"] == 1) ? "Enabled" : "Disabled";
                    player.ChatMessage(Lang("OnlyconnectedStatus", player.UserIDString, cstatus));
                    SaveData();
                    break;
                    case "gc" : case "graycircles" : if (args.Length == 2) {
                        if (args[1] == "enable" && currentsettings["graycircles"] == 0) {
                            foreach (var quadrat in quadrants) {
                                foreach (var zoneid in quadrat.Value) {
                                    var zonelocation = (Vector3)ZoneManager.Call("GetZoneLocation", zoneid);
                                    if (debug) Puts("Spawn marker" + zoneid);
                                    SpawnMarkerOnMap(zonelocation, zoneid);
                                }
                            }
                            currentsettings["graycircles"] = 1;
                        }
                        if (args[1] == "disable" && currentsettings["graycircles"] == 1) {
                            foreach (var quadrat in quadrants) {
                                foreach (var zoneid in quadrat.Value) {
                                    if (debug) Puts("Delete marker" + zoneid);
                                    DeleteMarkerFromMap(allmarkers[zoneid]);
                                    allmarkers.Remove(zoneid);
                                }
                            }
                            currentsettings["graycircles"] = 0;
                        }
                    }
                    gcstatus = (currentsettings["graycircles"] == 1) ? "Enabled" : "Disabled";
                    player.ChatMessage(Lang("GraycirclesStatus", player.UserIDString, gcstatus));
                    SaveData();
                    break;
                    case "gr" : case "gatherratio" : if (args.Length == 2) {
                        int grtmp = Convert.ToInt32(args[1]);
                        if (grtmp > 0 && grtmp < 1001) {
                            currentsettings["gatherratio"] = grtmp;
                        }
                        else {
                            player.ChatMessage(Lang("UsageAdmin", player.UserIDString));
                        }
                    }
                    player.ChatMessage(Lang("GatherratioStatus", player.UserIDString, args[1]));
                    SaveData();
                    break;
                    case "st" : case "settings" : player.ChatMessage(Lang("CurrentSettings", player.UserIDString, tstatus = (currentsettings["notrespassgather"] == 1) ? "Enabled" : "Disabled", cstatus = (currentsettings["onlyconnected"] == 1) ? "Enabled" : "Disabled", gcstatus = (currentsettings["graycircles"] == 1) ? "Enabled" : "Disabled", currentsettings["gatherratio"]));
                    SaveData();
                    break;
                    case "blk" : case "blockitem" : if (args.Length == 2) {
                        string item = Convert.ToString(args[1]);
                        blockedItemsList.Add(item);
                    }
                    SaveData();
                    player.ChatMessage(Lang("BlockedItemsEditSuccess", player.UserIDString));
                    break;
                    case "unblk" : case "unblockitem" : if (args.Length == 2) {
                        string item = Convert.ToString(args[1]);
                        blockedItemsList.Remove(item);
                    }
                    SaveData();
                    player.ChatMessage(Lang("BlockedItemsEditSuccess", player.UserIDString));
                    break;
                    case "blklist" : case "blockitemlist" : string itemlist = string.Join(", ", blockedItemsList);
                    if (debug) Puts("Items: " + itemlist);
                    player.ChatMessage(Lang("BlockedItems", player.UserIDString, itemlist));
                    break;
                    case "blkclr" : case "blockitemclear" : blockedItemsList.Clear();
                    SaveData();
                    player.ChatMessage(Lang("BlockedItemsClearSuccess", player.UserIDString));
                    break;
                }
                return;
            }
            else {
                player.ChatMessage(Lang("UsageAdmin", player.UserIDString));
                return;
            }
        }
#endregion
#region Helpers
        private string GetLordZoneId(string[] zids) {
            string czd = "None";
            for (int i = 0; i < zids.Length; i++) {
                string zonename = (string)ZoneManager.Call("GetZoneName", zids[i]);
                if (debug) Puts("Found zone " + zonename);
                if (zonename.StartsWith(zonenameprefix)) {
                    if (debug) Puts("Landlord zone found");
                    czd = zids[i];
                }
            }
            return czd;
        }
        private static string GetGrid(Vector3 position) {
            var chars = new string[] {
                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ"
            }
            ;
            const float block = 146;
            float size = ConVar.Server.worldsize;
            float offset = size / 2;
            float xpos = position.x + offset;
            float zpos = position.z + offset;
            int maxgrid = (int)(size / block);
            float xcoord = Mathf.Clamp(xpos / block, 0, maxgrid - 1);
            float zcoord = Mathf.Clamp(maxgrid - (zpos / block), 0, maxgrid - 1);
            string pos = string.Concat(chars[(int)xcoord], (int)zcoord);
            return pos;
        }
        private bool CheckConnected(string zid, ulong teampid) {
            ulong uzid = Convert.ToUInt64(zid);
            ulong[] uzids = new ulong[] {
                uzid + 1, uzid - 1, uzid + 1000, uzid - 1000
            }
            ;
            for (int i = 0; i < uzids.Length; i++) {
                var match = quadrants[teampid].FirstOrDefault(stringToCheck => stringToCheck.Contains(Convert.ToString(uzids[i])));
                if (match != null) return true;
            }
            return false;
        }
#endregion
    }
}

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