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

FREE AdminRadar : 2.0.1 2.0.1

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using Oxide.Core.Configuration;
using System.Linq;
using System.Text;
using UnityEngine;
using Oxide.Core;
namespace Oxide.Plugins {
    [Info("Player Radar", "-", "2.0.1", ResourceId = 978)]
    [Description("Allows admins to have a Radar to help detect cheaters")]
    class AdminRadar : RustPlugin {
#region Libraries
        Dictionary<string, PlSettings> LoadedData = new Dictionary<string, PlSettings>();
        Dictionary<string, string> NameList = new Dictionary<string, string>();
        List<string> FilterList = new List<string>();
        Dictionary<BasePlayer, string> Radars = new Dictionary<BasePlayer, string>();
#endregion
#region Radar Class
        class Radar : MonoBehaviour {
            // Static Variables
            BasePlayer player;
            Vector3 bodyheight = new Vector3(0f, 0.9f, 0f);
            int arrowheight = 15;
            int arrowsize = 1;
            Vector3 textheight = new Vector3(0f, 0.0f, 0f);
            Dictionary<string, string> ExtMessages = new Dictionary<string, string>() {
                ["player"]
                = "{0} - |HP: {1}|CW: {2}|D: {3}m", ["sleeper"] = "{0}(<color=red>Спит</color>) - |HP: {1}|D: {2}m", ["thing"] = "{0}{1} - |D: {2}m", ["npc"] = "{0} - |HP: {1}|D: {2}m"
            }
            ;
            Dictionary<string, string> Messages = new Dictionary<string, string>() {
                ["player"]
                = "{0} - |D: {4}m", ["sleeper"] = "{0}(<color=red>Спит</color>) - |D: {2}m", ["thing"] = "{0}{1} - |D: {2}m", ["npc"] = "{0} - |D: {2}m"
            }
            ;
            // Changable Variables
            public string filter;
            public float RefreshTime;
            public bool ExtDetails;
            public float setdistance;
            public Dictionary<string, string> PlayerNameList;
            public bool players;
            public bool sleepers;
            public bool npcs;
            public bool storages;
            public bool toolcupboards;
            void Awake() {
                player = GetComponent<BasePlayer>();
            }
            void radar() {
                if (players && filter == "player" || filter == "all") {
                    string message = (ExtDetails) ? ExtMessages["player"] : Messages["player"];
                    foreach (var target in BasePlayer.activePlayerList) {
                        if (target.transform.position == new Vector3(0, 0, 0) && !SpectateCheck(player, target)) return;
                        var distance = Vector3.Distance(target.transform.position, player.transform.position);
                        if (distance < setdistance && target != player) {
                            var health = Math.Round(target.Health(), 0).ToString();
                            var cw = target?.GetActiveItem()?.info?.displayName?.english ?? "None";
                            //var xp = target?.xp?.CurrentLevel.ToString() ?? "0";
                            //var msg = message.Replace("{0}", target.displayName).Replace("{1}", health).Replace("{2}", cw).Replace("{3}", xp).Replace("{4}", distance.ToString());
                            var msg = message.Replace("{0}", target.displayName).Replace("{1}", health).Replace("{2}", cw).Replace("{3}", distance.ToString());
                            player.SendConsoleCommand("ddraw.box", RefreshTime, Color.green, target.transform.position + bodyheight, target.GetHeight());
                            player.SendConsoleCommand("ddraw.text", RefreshTime, Color.yellow, target.transform.position + textheight, msg);
                        }
                    }
                }
                if (sleepers && filter == "sleeper" || filter == "all") {
                    string message = (ExtDetails) ? ExtMessages["sleeper"] : Messages["sleeper"];
                    foreach (var sleeper in BasePlayer.sleepingPlayerList) {
                        if (sleeper.transform.position == new Vector3(0, 0, 0)) return;
                        var distance = Vector3.Distance(sleeper.transform.position, player.transform.position);
                        var msg = message.Replace("{0}", sleeper.displayName).Replace("{1}", Math.Round(sleeper.Health(), 0).ToString()).Replace("{2}", distance.ToString());
                        if (distance < setdistance) {
                            player.SendConsoleCommand("ddraw.text", RefreshTime, UnityEngine.Color.grey, sleeper.transform.position + textheight, msg);
                        }
                    }
                }
                if (toolcupboards && filter == "toolcupboard" || filter == "all") {
                    string message = (ExtDetails) ? ExtMessages["thing"] : Messages["thing"];
                    foreach (var Cupboard in Resources.FindObjectsOfTypeAll<BuildingPrivlidge>()) {
                        if (Cupboard.transform.position == new Vector3(0, 0, 0)) return;
                        var distance = Vector3.Distance(Cupboard.transform.position, player.transform.position);
                        if (distance < setdistance) {
                            var arrowSky = Cupboard.transform.position;
                            var arrowGround = arrowSky + new Vector3(0, 0.9f, 0);
                            arrowGround.y = arrowGround.y + arrowheight;
                            var owner = FindOwner(Cupboard.OwnerID);
                            var msg = message.Replace("{0}", replacement(Cupboard.ShortPrefabName)).Replace("{1}", $"[{owner}]").Replace("{2}", distance.ToString());
                            player.SendConsoleCommand("ddraw.arrow", RefreshTime, Color.yellow, arrowGround, arrowSky, arrowsize);
                            player.SendConsoleCommand("ddraw.text", RefreshTime, UnityEngine.Color.magenta, Cupboard.transform.position + new Vector3(0f, 0.05f, 0f), msg);
                        }
                    }
                }
                if (storages && filter == "storage" || filter == "all") {
                    string message = (ExtDetails) ? ExtMessages["thing"] : Messages["thing"];
                    foreach (var storage in Resources.FindObjectsOfTypeAll<StorageContainer>().Where(storage => storage.name.Contains("box.wooden.large.prefab") || storage.name.Contains("woodbox_deployed.prefab") || storage.name.Contains("heli_crate.prefab") || storage.name.Contains("small_stash_deployed.prefab"))) {
                        if (storage.transform.position == new Vector3(0, 0, 0)) return;
                        var distance = Vector3.Distance(storage.transform.position, player.transform.position);
                        if (distance < setdistance) {
                            var owner = FindOwner(storage.OwnerID);
                            var arrowSky = storage.transform.position;
                            var arrowGround = arrowSky;
                            var msg = message.Replace("{0}", replacement(storage.ShortPrefabName)).Replace("{1}", $"[{owner}]").Replace("{2}", distance.ToString());
                            arrowGround.y = arrowGround.y + arrowheight;
                            player.SendConsoleCommand("ddraw.arrow", RefreshTime, Color.blue, arrowGround, arrowSky, arrowsize);
                            player.SendConsoleCommand("ddraw.text", RefreshTime, Color.green, storage.transform.position + new Vector3(0f, 0.05f, 0f), msg);
                        }
                    }
                }
                if (npcs && filter == "npc" || filter == "all") {
                    string message = (ExtDetails) ? ExtMessages["npc"] : Messages["npc"];
                    foreach (var npc in Resources.FindObjectsOfTypeAll<BaseNPC>()) {
                        if (npc.transform.position == new Vector3(0, 0, 0)) return;
                        var distance = Vector3.Distance(npc.transform.position, player.transform.position);
                        if (distance < setdistance) {
                            var health = Math.Round(npc.Health(), 0).ToString();
                            var msg = message.Replace("{0}", npc.ShortPrefabName.Replace(".prefab", string.Empty)).Replace("{1}", health).Replace("{3}", distance.ToString());
                            player.SendConsoleCommand("ddraw.text", RefreshTime, Color.yellow, npc.transform.position + textheight, msg);
                        }
                    }
                }
            }
            string FindOwner(ulong id) {
                string ID = id.ToString();
                return (PlayerNameList.ContainsKey(ID)) ? PlayerNameList[ID] : "MAP";
            }
            bool SpectateCheck(BasePlayer player, BasePlayer target) => player.IsSpectating() && target.HasChild(player);
            string replacement(string name) {
                return name.Replace(".prefab", string.Empty).Replace(".wooden.", string.Empty).Replace("_deployed", string.Empty).Replace("small_", string.Empty).Replace("_deployed", string.Empty).Replace(".tool.deployed", string.Empty).Replace("_", " ").ToUpper();
            }
        }
#endregion
#region Oxide
        void Init() {
            LoadDefaultConfig();
            LoadFilterList();
            LoadMessages();
            LoadSavedData();
            permission.RegisterPermission("adminradar." + permAllowed, this);
        }
        void Unload() {
            SaveLoadedData();
            foreach (var pl in BasePlayer.activePlayerList) {
                if (pl.GetComponent<Radar>()) GameObject.Destroy(pl.GetComponent<Radar>());
                if (Radars.ContainsKey(pl)) Radars.Remove(pl);
            }
        }
        void OnServerSave() {
            SaveLoadedData();
        }
        void OnPlayerDisconnected(BasePlayer player) {
            if (player.GetComponent<Radar>()) {
                GameObject.Destroy(player.GetComponent<Radar>());
                if (Radars.ContainsKey(player)) Radars.Remove(player);
            }
        }
#endregion
#region Configuration
        // General Settings
        string permAllowed;
        bool playerRadar;
        bool ShowExtData;
        string ChatIcon;
        string ChatPrefix;
        string ConfigVersion;
        // Filters
        bool Tplayer;
        bool Tstorage;
        bool Tsleeper;
        bool Ttoolcupboard;
        bool Tnpc;
        bool Tall;
        // Default Values
        string defaultFilter;
        float defaultAllInvoke;
        float defaultAllDistance;
        float defaultPlayerInvoke;
        float defaultPlayerMaxDistance;
        float defaultSleeperInvoke;
        float defaultSleeperMaxDistance;
        float defaultstorageInvoke;
        float defaultStorageMaxDistance;
        float defaultToolCupboardInvoke;
        float defaultToolCupboardMaxDistance;
        float defaultNPCInvoke;
        float defaultNPCMaxDistance;
        // Invoke Limiting
        float limitAllInvokeHigh;
        float limitAllInvokeLow;
        float limitPlayerInvokeHigh;
        float limitPlayerInvokeLow;
        float limitSleeperInvokeHigh;
        float limitSleeperInvokeLow;
        float limitstorageInvokeHigh;
        float limitstorageInvokeLow;
        float limitToolCupboardInvokeHigh;
        float limitToolCupboardInvokeLow;
        float limitNPCInvokeHigh;
        float limitNPCInvokeLow;
        // Distance Limiting
        float limitAllDistanceHigh;
        float limitAllDistanceLow;
        float limitPlayerDistanceHigh;
        float limitPlayerDistanceLow;
        float limitSleeperDistanceHigh;
        float limitSleeperDistanceLow;
        float limitstorageDistanceHigh;
        float limitstorageDistanceLow;
        float limitToolCupboardDistanceHigh;
        float limitToolCupboardDistanceLow;
        float limitNPCDistanceHigh;
        float limitNPCDistanceLow;
        protected override void LoadDefaultConfig() {
            // General Settings
            SetConfig("General", "Permission (adminradar.?)", "allowed");
            SetConfig("General", "Radar", "ShowExtendedDetails", true);
            SetConfig("General", "Chat", "IconProfile", string.Empty);
            SetConfig("General", "Chat", "ChatPrefix", "AdminRadar");
            SetConfig("General", "Commands", "GiveRadar", false);
            // Enabled Filters
            SetConfig("Settings", "Filters", "DefaultFilter | player | storage | sleeper | toolcupboard | npc", "player");
            SetConfig("Settings", "Filters", "Players", "Enabled", true);
            SetConfig("Settings", "Filters", "Storage", "Enabled", true);
            SetConfig("Settings", "Filters", "SleepingPlayers", "Enabled", true);
            SetConfig("Settings", "Filters", "ToolCupboards", "Enabled", true);
            SetConfig("Settings", "Filters", "NPCS", "Enabled", true);
            SetConfig("Settings", "Filters", "All", "Enabled (Can Cause Server Lag)", true);
            // Default Values
            /* All Settings */
            SetConfig("Settings", "Filters", "All", "DefaultInvoke", 1.5f);
            SetConfig("Settings", "Filters", "All", "MaxDistance", 300f);
            SetConfig("Settings", "Filters", "All", "Distance-Lowest", 30f);
            SetConfig("Settings", "Filters", "All", "Distance-Highest", 400f);
            SetConfig("Settings", "Filters", "All", "Invoke-Lowest", 1f);
            SetConfig("Settings", "Filters", "All", "Invoke-Highest", 3f);
            /* Player Settings */
            SetConfig("Settings", "Filters", "Players", "DefaultInvoke", 0.30f);
            SetConfig("Settings", "Filters", "Players", "MaxDistance", 2000f);
            SetConfig("Settings", "Filters", "Players", "Distance-Lowest", 100f);
            SetConfig("Settings", "Filters", "Players", "Distance-Highest", 1000f);
            SetConfig("Settings", "Filters", "Players", "Invoke-Lowest", 0.10f);
            SetConfig("Settings", "Filters", "Players", "Invoke-Highest", 1.00f);
            /* Storage Settings */
            SetConfig("Settings", "Filters", "Storage", "DefaultInvoke", 5.00f);
            SetConfig("Settings", "Filters", "Storage", "MaxDistance", 300f);
            SetConfig("Settings", "Filters", "Storage", "Distance-Lowest", 50f);
            SetConfig("Settings", "Filters", "Storage", "Distance-Highest", 300f);
            SetConfig("Settings", "Filters", "Storage", "Invoke-Lowest", 1.00f);
            SetConfig("Settings", "Filters", "Storage", "Invoke-Highest", 10.00f);
            /* Sleepers Settings */
            SetConfig("Settings", "Filters", "SleepingPlayers", "DefaultInvoke", 5.00f);
            SetConfig("Settings", "Filters", "SleepingPlayers", "MaxDistance", 300f);
            SetConfig("Settings", "Filters", "SleepingPlayers", "Distance-Lowest", 50f);
            SetConfig("Settings", "Filters", "SleepingPlayers", "Distance-Highest", 300f);
            SetConfig("Settings", "Filters", "SleepingPlayers", "Invoke-Lowest", 1.00f);
            SetConfig("Settings", "Filters", "SleepingPlayers", "Invoke-Highest", 10.00f);
            /* ToolCupboard Settings */
            SetConfig("Settings", "Filters", "ToolCupboards", "DefaultInvoke", 5.00f);
            SetConfig("Settings", "Filters", "ToolCupboards", "MaxDistance", 300f);
            SetConfig("Settings", "Filters", "ToolCupboards", "Distance-Lowest", 50f);
            SetConfig("Settings", "Filters", "ToolCupboards", "Distance-Highest", 300f);
            SetConfig("Settings", "Filters", "ToolCupboards", "Invoke-Lowest", 1.00f);
            SetConfig("Settings", "Filters", "ToolCupboards", "Invoke-Highest", 10.00f);
            /* NPC Settings */
            SetConfig("Settings", "Filters", "NPCS", "DefaultInvoke", 0.30f);
            SetConfig("Settings", "Filters", "NPCS", "MaxDistance", 300f);
            SetConfig("Settings", "Filters", "NPCS", "Distance-Lowest", 50f);
            SetConfig("Settings", "Filters", "NPCS", "Distance-Highest", 300f);
            SetConfig("Settings", "Filters", "NPCS", "Invoke-Lowest", 0.10f);
            SetConfig("Settings", "Filters", "NPCS", "Invoke-Highest", 1.00f);
            SetConfig("DoNotTouch", "ConfigVersion", "2.0.0");
            SaveConfig();
            ////////////////////////////////////////////////////////////////////
            ////                    Setting the Values                      ////
            ////////////////////////////////////////////////////////////////////
            // General Settings
            permAllowed = GetConfig("allowed", "General", "Permission (adminradar.?)");
            ShowExtData = GetConfig(true, "General", "Radar", "ShowExtendedDetails");
            ChatIcon = GetConfig(string.Empty, "General", "Chat", "IconProfile");
            ChatPrefix = GetConfig("AdminRadar", "General", "Chat", "ChatPrefix");
            playerRadar = GetConfig(false, "General", "Commands", "GiveRadar");
            // Enabled Filters
            defaultFilter = GetConfig("player", "Settings", "Filters", "DefaultFilter | player | storage | sleeper | toolcupboard | npc");
            Tplayer = GetConfig(true, "Settings", "Filters", "Players", "Enabled");
            Tstorage = GetConfig(true, "Settings", "Filters", "Storage", "Enabled");
            Tsleeper = GetConfig(true, "Settings", "Filters", "SleepingPlayers", "Enabled");
            Ttoolcupboard = GetConfig(true, "Settings", "Filters", "ToolCupboards", "Enabled");
            Tnpc = GetConfig(true, "Settings", "Filters", "NPCS", "Enabled");
            Tall = GetConfig(true, "Settings", "Filters", "All", "Enabled (Can Cause Server Lag)");
            // Default Values
            defaultPlayerInvoke = GetConfig(0.30f, "Settings", "Filters", "Players", "DefaultInvoke");
            defaultPlayerMaxDistance = GetConfig(2000f, "Settings", "Filters", "Players", "MaxDistance");
            limitPlayerDistanceHigh = GetConfig(1000f, "Settings", "Filters", "Players", "Distance-Highest");
            limitPlayerDistanceLow = GetConfig(100f, "Settings", "Filters", "Players", "Distance-Lowest");
            limitPlayerInvokeHigh = GetConfig(1.00f, "Settings", "Filters", "Players", "Invoke-Highest");
            limitPlayerInvokeLow = GetConfig(0.10f, "Settings", "Filters", "Players", "Invoke-Lowest");
            defaultSleeperInvoke = GetConfig(5.00f, "Settings", "Filters", "SleepingPlayers", "DefaultInvoke");
            defaultSleeperMaxDistance = GetConfig(300f, "Settings", "Filters", "SleepingPlayers", "MaxDistance");
            limitSleeperDistanceHigh = GetConfig(300f, "Settings", "Filters", "SleepingPlayers", "Distance-Highest");
            limitSleeperDistanceLow = GetConfig(50f, "Settings", "Filters", "SleepingPlayers", "Distance-Lowest");
            limitSleeperInvokeHigh = GetConfig(10.00f, "Settings", "Filters", "SleepingPlayers", "Invoke-Highest");
            limitSleeperInvokeLow = GetConfig(1.00f, "Settings", "Filters", "SleepingPlayers", "Invoke-Lowest");
            defaultstorageInvoke = GetConfig(5.00f, "Settings", "Filters", "Storage", "DefaultInvoke");
            defaultStorageMaxDistance = GetConfig(300f, "Settings", "Filters", "Storage", "MaxDistance");
            limitstorageDistanceHigh = GetConfig(300f, "Settings", "Filters", "Storage", "Distance-Highest");
            limitstorageDistanceLow = GetConfig(50f, "Settings", "Filters", "Storage", "Distance-Lowest");
            limitstorageInvokeHigh = GetConfig(10.00f, "Settings", "Filters", "Storage", "Invoke-Highest");
            limitstorageInvokeLow = GetConfig(1.00f, "Settings", "Filters", "Storage", "Invoke-Lowest");
            defaultToolCupboardInvoke = GetConfig(5.00f, "Settings", "Filters", "ToolCupboards", "DefaultInvoke");
            defaultToolCupboardMaxDistance = GetConfig(300f, "Settings", "Filters", "ToolCupboards", "MaxDistance");
            limitToolCupboardDistanceHigh = GetConfig(300f, "Settings", "Filters", "ToolCupboards", "Distance-Highest");
            limitToolCupboardDistanceLow = GetConfig(50f, "Settings", "Filters", "ToolCupboards", "Distance-Lowest");
            limitToolCupboardInvokeHigh = GetConfig(10.00f, "Settings", "Filters", "ToolCupboards", "Invoke-Highest");
            limitToolCupboardInvokeLow = GetConfig(1.00f, "Settings", "Filters", "ToolCupboards", "Invoke-Lowest");
            defaultNPCInvoke = GetConfig(0.30f, "Settings", "Filters", "NPCS", "DefaultInvoke");
            defaultNPCMaxDistance = GetConfig(300f, "Settings", "Filters", "NPCS", "MaxDistance");
            limitNPCDistanceHigh = GetConfig(300f, "Settings", "Filters", "NPCS", "Distance-Highest");
            limitNPCDistanceLow = GetConfig(50f, "Settings", "Filters", "NPCS", "Distance-Lowest");
            limitNPCInvokeHigh = GetConfig(1.00f, "Settings", "Filters", "NPCS", "Invoke-Highest");
            limitNPCInvokeLow = GetConfig(0.10f, "Settings", "Filters", "NPCS", "Invoke-Lowest");
            defaultAllInvoke = GetConfig(1.5f, "Settings", "Filters", "All", "DefaultInvoke");
            defaultAllDistance = GetConfig(300f, "Settings", "Filters", "All", "MaxDistance");
            limitAllDistanceHigh = GetConfig(400f, "Settings", "Filters", "All", "Distance-Highest");
            limitAllDistanceLow = GetConfig(30f, "Settings", "Filters", "All", "Distance-Lowest");
            limitAllInvokeHigh = GetConfig(3f, "Settings", "Filters", "All", "Invoke-Highest");
            limitAllInvokeLow = GetConfig(1f, "Settings", "Filters", "All", "Invoke-Lowest");
            ConfigVersion = GetConfig("2.0.0", "DoNotTouch", "ConfigVersion");
            if (ConfigVersion != "2.0.0") Puts("Config File is Outdated - Please delete current config and reload the plugin");
        }
#endregion
#region Localization
        void LoadMessages() {
            lang.RegisterMessages(new Dictionary<string, string>() {
                ["RadarOff"]
                = "Radar has been <color=red>DEACTIVATED</color>", ["NoAccess"] = "Unknown command: {0}", ["RadarOn"] = "Radar has been <color=green>ACTIVATED</color> | <color=aqua>Filter <color=green>{0}</color>, RefreshTime <color=yellow>{1}</color>, Distance <color=purple>{2}</color></color>", ["InvalidSyntax"] = "Invalid command syntax: /{0} help", ["CommandDisabled"] = "The Command /{0} {1} has been disabled by the server administrator", ["RadarGive"] = "Radar has been {0} for {1}", ["Enabled"] = "<color=green>Enabled</color>", ["Disabled"] = "<color=red>Disabled</color>", ["SettingUpdate"] = "Setting {0} {1} has been changed from {2} to {3}", ["RadarList"] = "------[ ActiveRadars ]------\n{0}", ["NoRadars"] = "No players are currently using radar"
            }
            , this, "en");
        }
#endregion
#region Commands
        [ChatCommand("radar")]
        void ccmdRadar(BasePlayer player, string command, string[] args) {
            if (!Allowed(player)) {
                player.ChatMessage(Lang("NoAccess", player.UserIDString, command));
                return;
            }
            if (args.Length == 0) {
                ToggleRadar(player);
                return;
            }
            if (args.Length == 1 && FilterList.Contains(filterValidation(args[0]))) {
                Puts(args[0] + filterValidation(args[0]));
                ToggleRadar(player, filterValidation(args[0]));
                return;
            }
            switch (args[0].ToLower()) {
                case "give" : if (!playerRadar) {
                    SendMessage(player, Lang("CommandDisabled", player.UserIDString, command, args[0]));
                    return;
                }
                if (args.Length < 2 || args.Length > 3) {
                    SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                    return;
                }
                var target = player;
                string enabled = string.Empty;
                if (args.Length == 2) {
                    target = rust.FindPlayer(args[1]);
                    if (target.GetComponent<Radar>()) {
                        enabled = Lang("Disabled", player.UserIDString);
                    }
                    else {
                        enabled = Lang("Enabled", player.UserIDString);
                    }
                    ToggleRadar(target);
                }
                if (args.Length == 3) {
                    target = rust.FindPlayer(args[1]);
                    if (target.GetComponent<Radar>()) {
                        enabled = Lang("Disabled", player.UserIDString);
                    }
                    else {
                        enabled = Lang("Enabled", player.UserIDString);
                    }
                    ToggleRadar(target, args[2]);
                }
                SendMessage(player, Lang("RadarGive", player.UserIDString, enabled, target.displayName));
                break;
                case "list" : if (args.Length > 1) {
                    SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                    return;
                }
                string activeplayers = string.Empty;
                if (RadarList(out activeplayers)) {
                    player.ChatMessage(Lang("RadarList", player.UserIDString, activeplayers));
                    return;
                }
                SendMessage(player, Lang("NoRadars", player.UserIDString));
                break;
                case "help" : SendHelpText(player);
                break;
                case "filterlist" : if (args.Length > 1) {
                    SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                    return;
                }
                string msg = "<color=red>Filter List</color>\n";
                foreach (var filter in FilterList) {
                    msg += $"<color=green>{filter}</color>\n";
                }
                SendMessage(player, msg);
                break;
                case "setting" : switch(args[1].ToLower()) {
                    case "player" : if (!HasPlayerData(player.UserIDString)) CreatePlayerData(player.UserIDString);
                    if (args.Length > 4 || args.Length <= 3) {
                        SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                        return;
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "invoke") {
                        var oldsetting = LoadedData[player.UserIDString].playerinvoke;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = invokeClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].playerinvoke = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "distance") {
                        var oldsetting = LoadedData[player.UserIDString].playerdistance;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = distanceClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].playerdistance = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    break;
                    case "sleeper" : if (!HasPlayerData(player.UserIDString)) CreatePlayerData(player.UserIDString);
                    if (args.Length > 4 || args.Length <= 3) {
                        SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                        return;
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "invoke") {
                        var oldsetting = LoadedData[player.UserIDString].sleeperinvoke;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = invokeClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].sleeperinvoke = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "distance") {
                        var oldsetting = LoadedData[player.UserIDString].sleeperdistance;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = distanceClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].sleeperdistance = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    break;
                    case "npc" : if (!HasPlayerData(player.UserIDString)) CreatePlayerData(player.UserIDString);
                    if (args.Length > 4 || args.Length <= 3) {
                        SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                        return;
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "invoke") {
                        var oldsetting = LoadedData[player.UserIDString].npcinvoke;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = invokeClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].npcinvoke = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "distance") {
                        var oldsetting = LoadedData[player.UserIDString].npcdistance;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = distanceClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].npcdistance = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    break;
                    case "storage" : if (!HasPlayerData(player.UserIDString)) CreatePlayerData(player.UserIDString);
                    if (args.Length > 4 || args.Length <= 3) {
                        SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                        return;
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "invoke") {
                        var oldsetting = LoadedData[player.UserIDString].storageinvoke;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = invokeClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].storageinvoke = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "distance") {
                        var oldsetting = LoadedData[player.UserIDString].storagedistance;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = distanceClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].storagedistance = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    break;
                    case "toolcupboard" : if (!HasPlayerData(player.UserIDString)) CreatePlayerData(player.UserIDString);
                    if (args.Length > 4 || args.Length <= 3) {
                        SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                        return;
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "invoke") {
                        var oldsetting = LoadedData[player.UserIDString].toolcupboardinvoke;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = invokeClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].toolcupboardinvoke = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "distance") {
                        var oldsetting = LoadedData[player.UserIDString].toolcupboarddistance;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = distanceClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].toolcupboarddistance = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    break;
                    case "all" : if (!HasPlayerData(player.UserIDString)) CreatePlayerData(player.UserIDString);
                    if (args.Length > 4 || args.Length <= 3) {
                        SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                        return;
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "invoke") {
                        var oldsetting = LoadedData[player.UserIDString].allinvoke;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = invokeClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].allinvoke = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    if (args.Length == 4 && settingValidation(args[2]) == "distance") {
                        var oldsetting = LoadedData[player.UserIDString].alldistance;
                        float updatevalue;
                        float.TryParse(args[3], out updatevalue);
                        var newsetting = distanceClamp(args[1], updatevalue);
                        LoadedData[player.UserIDString].alldistance = newsetting;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, args[1], settingValidation(args[2]), oldsetting.ToString(), newsetting.ToString()));
                    }
                    break;
                    case "filter" : if (!HasPlayerData(player.UserIDString)) CreatePlayerData(player.UserIDString);
                    if (args.Length > 3 || args.Length <= 2) {
                        SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                        return;
                    }
                    if (args.Length == 3) {
                        var oldvalue = LoadedData[player.UserIDString].filter;
                        var newvalue = filterValidation(args[2]);
                        LoadedData[player.UserIDString].filter = newvalue;
                        SendMessage(player, Lang("SettingUpdate", player.UserIDString, "Default" , args[1], oldvalue, newvalue));
                    }
                    break;
                    default : SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                    break;
                }
                break;
                default : SendMessage(player, Lang("InvalidSyntax", player.UserIDString, command));
                break;
            }
        }
#endregion
#region Plugin Methods
        void ToggleRadar(BasePlayer player, string filter = "") {
            if (IsRadar(player.UserIDString)) {
                if (Radars.ContainsKey(player)) Radars.Remove(player);
                GameObject.Destroy(player.GetComponent<Radar>());
                SendMessage(player, Lang("RadarOff", player.UserIDString));
                return;
            }
            if (filter == "") {
                filter = (LoadedData.ContainsKey(player.UserIDString)) ? LoadedData[player.UserIDString].filter : defaultFilter;
            }
            var repeat = SelectPlayerInvoke(player.UserIDString, filter);
            LoadNameList();
            //Puts(filter);
            if (!Radars.ContainsKey(player)) Radars.Add(player, filter);
            Radar whrd = player.gameObject.AddComponent<Radar>();
            whrd.CancelInvoke();
            whrd.InvokeRepeating("radar", 1f, repeat);
            whrd.RefreshTime = repeat;
            whrd.filter = filter;
            whrd.setdistance = SelectPlayerDistance(player.UserIDString, filter);
            whrd.PlayerNameList = NameList;
            whrd.ExtDetails = ShowExtData;
            whrd.players = Tplayer;
            whrd.sleepers = Tsleeper;
            whrd.storages = Tstorage;
            whrd.npcs = Tnpc;
            whrd.toolcupboards = Ttoolcupboard;
            SendMessage(player, Lang("RadarOn", player.UserIDString, filter.ToUpper(), repeat.ToString(), whrd.setdistance.ToString()));
        }
#endregion
#region Data Storage
        // DataSystem
        class PlSettings {
            public string filter;
            public float playerinvoke;
            public float sleeperinvoke;
            public float storageinvoke;
            public float toolcupboardinvoke;
            public float npcinvoke;
            public float allinvoke;
            public float playerdistance;
            public float sleeperdistance;
            public float storagedistance;
            public float toolcupboarddistance;
            public float npcdistance;
            public float alldistance;
        }
        StoredData storedData;
        class StoredData {
            public Dictionary<string, PlSettings> SavedData = new Dictionary<string, PlSettings>();
        }
        void LoadSavedData() {
            try {
                storedData = Interface.Oxide.DataFileSystem.ReadObject<StoredData>(Name);
                LoadedData = storedData.SavedData;
            }
            catch {
                Puts("Failed to load data, creating new file");
                storedData = new StoredData();
            }
        }
        void SaveLoadedData() {
            storedData.SavedData = LoadedData;
            Interface.Oxide.DataFileSystem.WriteObject(Name, storedData);
        }
        void CreatePlayerData(string id) {
            if (!LoadedData.ContainsKey(id)) {
                LoadedData.Add(id, new PlSettings {
                    filter = defaultFilter, alldistance = defaultAllDistance, allinvoke = defaultAllInvoke, npcdistance = defaultNPCMaxDistance, npcinvoke = defaultPlayerInvoke, playerdistance = defaultPlayerMaxDistance, playerinvoke = defaultPlayerInvoke, sleeperdistance = defaultSleeperMaxDistance, sleeperinvoke = defaultSleeperInvoke, storagedistance = defaultStorageMaxDistance, storageinvoke = defaultstorageInvoke, toolcupboarddistance = defaultToolCupboardMaxDistance, toolcupboardinvoke = defaultToolCupboardInvoke
                }
                );
                SendMessage(rust.FindPlayer(id), "PlayerData Creates");
            }
        }
#endregion
#region Clamping & Value Validation
        float distanceClamp(string filter, float distance) {
            if (filter == "player") return (distance <= limitPlayerDistanceLow) ? limitPlayerDistanceLow : (distance >= limitPlayerDistanceHigh) ? limitPlayerDistanceHigh : distance;
            if (filter == "sleeper") return (distance <= limitSleeperDistanceLow) ? limitSleeperDistanceLow : (distance >= limitSleeperDistanceHigh) ? limitSleeperDistanceHigh : distance;
            if (filter == "storage") return (distance <= limitstorageDistanceLow) ? limitstorageDistanceLow : (distance >= limitstorageDistanceHigh) ? limitstorageDistanceHigh : distance;
            if (filter == "toolcupboard") return (distance <= limitToolCupboardDistanceLow) ? limitToolCupboardDistanceLow : (distance >= limitToolCupboardDistanceHigh) ? limitToolCupboardDistanceHigh : distance;
            if (filter == "npc") return (distance <= limitNPCDistanceLow) ? limitNPCDistanceLow : (distance >= limitNPCDistanceHigh) ? limitNPCDistanceHigh : distance;
            if (filter == "all") return (distance <= limitAllDistanceLow) ? limitAllDistanceLow : (distance >= limitAllDistanceHigh) ? limitAllDistanceHigh : distance;
            return defaultAllDistance;
        }
        float invokeClamp(string filter, float invokes) {
            if (filter == "player") return (invokes < limitPlayerInvokeLow) ? limitPlayerInvokeLow : (invokes > limitPlayerInvokeHigh) ? limitPlayerInvokeHigh : invokes;
            if (filter == "sleeper") return (invokes < limitSleeperInvokeLow) ? limitSleeperInvokeLow : (invokes > limitSleeperInvokeHigh) ? limitSleeperInvokeHigh : invokes;
            if (filter == "storage") return (invokes < limitstorageInvokeLow) ? limitstorageInvokeLow : (invokes > limitstorageInvokeHigh) ? limitstorageInvokeHigh : invokes;
            if (filter == "toolcupboard") return (invokes < limitToolCupboardInvokeLow) ? limitToolCupboardInvokeLow : (invokes > limitToolCupboardInvokeHigh) ? limitToolCupboardInvokeHigh : invokes;
            if (filter == "npc") return (invokes < limitNPCInvokeLow) ? limitNPCInvokeLow : (invokes > limitNPCInvokeHigh) ? limitNPCInvokeHigh : invokes;
            if (filter == "all") return (invokes < limitAllInvokeLow) ? limitAllInvokeLow : (invokes > limitAllInvokeHigh) ? limitAllInvokeHigh : invokes;
            return defaultAllInvoke;
        }
        string filterValidation(string filter) {
            if (Tplayer && filter.Contains("pla")) return "player";
            else if (Tsleeper && filter.Contains("sle")) return "sleeper";
            else if (Tstorage && filter.Contains("sto") || filter.Contains("bo") || filter.Contains("con")) return "storage";
            else if (Ttoolcupboard && filter.Contains("tool") || filter.Contains("cup") || filter.Contains("cab") || filter == "tc" || filter == "auth") return "toolcupboard";
            else if (Tnpc && filter == "npc" || filter.Contains("ani")) return "npc";
            else if (Tall && filter.Contains("al")) return "all";
            else return string.Empty;
        }
        string settingValidation(string arg) {
            return (arg.Contains("dis")) ? "distance" : (arg.Contains("inv")) ? "invoke" : arg;
        }
        float SelectPlayerInvoke(string id, string filter) {
            if (filter == "player") return (HasPlayerData(id)) ? invokeClamp(filter, LoadedData[id].playerinvoke) : invokeClamp(filter, defaultPlayerInvoke);
            if (filter == "sleeper") return (HasPlayerData(id)) ? invokeClamp(filter, LoadedData[id].sleeperinvoke) : invokeClamp(filter, defaultSleeperInvoke);
            if (filter == "storage") return (HasPlayerData(id)) ? invokeClamp(filter, LoadedData[id].storageinvoke) : invokeClamp(filter, defaultstorageInvoke);
            if (filter == "toolcupboard") return (HasPlayerData(id)) ? invokeClamp(filter, LoadedData[id].toolcupboardinvoke) : invokeClamp(filter, defaultToolCupboardInvoke);
            if (filter == "npc") return (HasPlayerData(id)) ? invokeClamp(filter, LoadedData[id].npcinvoke) : invokeClamp(filter, defaultNPCInvoke);
            if (filter == "all") return (HasPlayerData(id)) ? invokeClamp(filter, LoadedData[id].allinvoke) : invokeClamp(filter, defaultAllInvoke);
            return defaultAllInvoke;
        }
        float SelectPlayerDistance(string id, string filter) {
            if (filter == "player") return (HasPlayerData(id)) ? distanceClamp(filter, LoadedData[id].playerdistance) : distanceClamp(filter, defaultPlayerMaxDistance);
            if (filter == "sleeper") return (HasPlayerData(id)) ? distanceClamp(filter, LoadedData[id].sleeperdistance) : distanceClamp(filter, defaultSleeperMaxDistance);
            if (filter == "storage") return (HasPlayerData(id)) ? distanceClamp(filter, LoadedData[id].storagedistance) : distanceClamp(filter, defaultStorageMaxDistance);
            if (filter == "toolcupboard") return (HasPlayerData(id)) ? distanceClamp(filter, LoadedData[id].toolcupboarddistance) : distanceClamp(filter, defaultToolCupboardMaxDistance);
            if (filter == "npc") return (HasPlayerData(id)) ? distanceClamp(filter, LoadedData[id].npcdistance) : distanceClamp(filter, defaultNPCMaxDistance);
            if (filter == "all") return (HasPlayerData(id)) ? distanceClamp(filter, LoadedData[id].alldistance) : distanceClamp(filter, defaultAllDistance);
            return defaultAllDistance;
        }
        void LoadNameList() {
            foreach (var pl in covalence.Players.All) {
                if (!NameList.ContainsKey(pl.Id)) NameList.Add(pl.Id, pl.Name);
            }
        }
        void LoadFilterList() {
            FilterList.Clear();
            if (Tplayer) FilterList.Add("player");
            if (Tsleeper) FilterList.Add("sleeper");
            if (Tstorage) FilterList.Add("storage");
            if (Ttoolcupboard) FilterList.Add("toolcupboard");
            if (Tnpc) FilterList.Add("npc");
            if (Tall) FilterList.Add("all");
        }
#endregion
#region Helper
        void SendMessage(BasePlayer player, string message) => rust.SendChatMessage(player, $"<color=grey>[<color=teal>{ChatPrefix}</color>]</color>", "<color=grey>" + message + "</color>", ChatIcon);
        string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);
        bool IsRadar(string id) => rust.FindPlayer(id).GetComponent<Radar>();
        bool Allowed(BasePlayer player) => permission.UserHasGroup(player.UserIDString, "admin") || permission.UserHasPermission(player.UserIDString, permAllowed);
        private bool HasPlayerData(string id) => LoadedData.ContainsKey(id);
        string ListToString<T>(List<T> list, int first = 0, string seperator = ", ") => string.Join(seperator, (from val in list select val.ToString()).Skip(first).To
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху