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

FREE Teleportation : 1.5.2 1.5.2

Нет прав для скачивания
C#:
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using UnityEngine;
using Oxide.Core.Libraries.Covalence;
using Oxide.Game.Rust.Cui;
////Todo
//Я планирую переписать конфиг, вывести на новый формат, и облегчить привилегии.//Переписать таймер телепортации.//Добавить минимальное UI
namespace Oxide.Plugins {
    [Info("Teleportation", "OxideBro", "1.5.2")]
    class Teleportation : RustPlugin {
        [PluginReference]
        Plugin Clans;
        [PluginReference]
        Plugin Friends;
        Dictionary<ulong, Vector3> lastPositions = new Dictionary<ulong, Vector3>();
        Dictionary<BasePlayer, int> spectatingPlayers = new Dictionary<BasePlayer, int>();
        private const string Layer = "TeleportMenu";
        private class ButtonEntry {
            public string Name;
            public string Sprite;
            public string Command;
            public string Color;
            public bool Close;
        }
        bool IsClanMember(ulong playerid = 1, ulong targetID = 0) => (bool)(Clans?.Call("HasFriend", playerid, targetID) ?? false);
        bool IsFriends(ulong playerID = 0, ulong friendId = 0) {
            return (bool)(Friends?.Call("AreFriends", playerID, friendId) ?? false);
        }
        bool IsTeamate(BasePlayer player, ulong targetID) {
            if (player.currentTeam == 0) return false;
            //player.currentTeam
            var team = RelationshipManager.Instance.FindTeam(player.currentTeam);
            if (team == null) return false;
            var list = RelationshipManager.Instance.FindTeam(player.currentTeam).members.Where(p => p == targetID).ToList();
            return list.Count > 0;
        }
        class TP {
            public BasePlayer Player;
            public BasePlayer Player2;
            public Vector3 pos;
            public bool EnabledShip;
            public int seconds;
            public bool TPL;
            public TP(BasePlayer player, Vector3 Pos, int Seconds, bool EnabledShip1, bool tpl, BasePlayer player2 = null) {
                Player = player;
                pos = Pos;
                seconds = Seconds;
                EnabledShip = EnabledShip1;
                Player2 = player2;
                TPL = tpl;
            }
        }
        const string TPADMIN = "teleportation.admin";
        int homelimitDefault;
        Dictionary<string, int> homelimitPerms;
        int tpkdDefault;
        Dictionary<string, int> tpkdPerms;
        int tpkdhomeDefault;
        Dictionary<string, int> tpkdhomePerms;
        int teleportSecsDefault;
        bool restrictCupboard;
        bool enabledTPR;
        bool homecupboard;
        bool homecupboardblock;
        bool adminsLogs;
        bool foundationOwner;
        bool foundationOwnerFC;
        bool restrictTPRCupboard;
        bool foundationEx;
        bool wipedData;
        bool createSleepingBug;
        string EffectPrefab1;
        string EffectPrefab;
        bool EnabledShipTP;
        bool EnabledBallonTP;
        bool CancelTPMetabolism;
        bool CancelTPCold;
        bool CancelTPRadiation;
        bool FriendsEnabled;
        bool CancelTPWounded;
        bool EnabledTPLForPlayers;
        int TPLCooldown;
        int TplPedingTime;
        bool TPLAdmin;
        string AutoTPAPermission;
        Dictionary<string, int> teleportSecsPerms;
        void OnNewSave() {
            if (wipedData) {
                PrintWarning("Обнаружен вайп.Очищаем данные с data/Teleportation");
                WipeData();
            }
        }
        void WipeData() {
            LoadData();
            tpsave = new List<TPList>();
            homes = new Dictionary<ulong, Dictionary<string, Vector3>>();
            SaveData();
        }
        protected override void LoadDefaultConfig() {
            GetVariable(Config, "Запрещать отправлять запрос на телепортацию в зоне действия чужого шкафа", out homecupboard, true);
            GetVariable(Config, "Удалять точку телепрта если она в билде в какой не авторизован игрок", out homecupboardblock, true);
            GetVariable(Config, "Звук уведомления при получение запроса на телепорт (пустое поле = звук отключен)", out EffectPrefab1, "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab");
            GetVariable(Config, "Звук предупреждения (пустое поле = звук отключен)", out EffectPrefab, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
            GetVariable(Config, "Разрешать сохранять местоположение только на фундаменте", out foundationEx, true);
            GetVariable(Config, "Создавать объект при сохранении местоположения в виде Sleeping Bag", out createSleepingBug, true);
            GetVariable(Config, "Автоматический вайп данных при генерации новой карты", out wipedData, true);
            GetVariable(Config, "Запрещать принимать запрос на телепортацию в зоне действия чужого шкафа", out restrictCupboard, true);
            GetVariable(Config, "Запрещать сохранять местоположение если игрок не является владельцем фундамента", out foundationOwner, true);
            GetVariable(Config, "Привилегия на использование автоматического приёма телепорта", out AutoTPAPermission, "teleportation.autotpa");
            GetVariable(Config, "Разрешать сохранять местоположение если игрок является другом или соклановцем или тимейтом владельца фундамента ", out foundationOwnerFC, true);
            GetVariable(Config, "Логировать использование команд для администраторов", out adminsLogs, true);
            GetVariable(Config, "Включить телепортацию (TPR/TPA) только к друзьям, соклановкам или тимейту", out FriendsEnabled, true);
            GetVariable(Config, "Разрешить команду TPR игрокам (false = /tpr не будет работать)", out enabledTPR, true);
            GetVariable(Config, "Разрешить отправку и приём телепорта и телепорт домой на корабле", out EnabledShipTP, true);
            GetVariable(Config, "Разрешить отправку и приём телепорта на воздушном шаре", out EnabledBallonTP, true);
            GetVariable(Config, "Запрещать отправлять запрос на телепортацию в зоне действия чужого шкафа", out restrictTPRCupboard, true);
            GetVariable(Config, "Отмета телепорта игрока (Home/TP) если у него кровотечение", out CancelTPMetabolism, true);
            GetVariable(Config, "Отмета телепорта игрока (Home/TP) если игрок ранен", out CancelTPWounded, true);
            GetVariable(Config, "Отмета телепорта игрока (Home/TP) если ему холодно", out CancelTPCold, true);
            GetVariable(Config, "Отмета телепорта игрока (Home/TP) если он облучен радиацией", out CancelTPRadiation, true);
            GetVariable(Config, "Ограничение на количество сохранённых местоположений", out homelimitDefault, 3);
            GetVariable(Config, "[TPL] Разрешить игрокам использовать TPL", out EnabledTPLForPlayers, false);
            GetVariable(Config, "[TPL] Задержка телепортации игрока на TPL", out TplPedingTime, 15);
            GetVariable(Config, "[TPL] Cooldown телепортации игрока на TPL", out TPLCooldown, 15);
            GetVariable(Config, "[TPL] Телепортировать админа без задержки и кулдауна?", out TPLAdmin, true);
            GetVariable(Config, "Длительность перезарядки телепорта (в секундах)", out tpkdDefault, 300);
            GetVariable(Config, "Длительность перезарядки телепорта домой (в секундах)", out tpkdhomeDefault, 300);
            GetVariable(Config, "Длительность задержки перед телепортацией (в секундах)", out teleportSecsDefault, 15);
            Config["Ограничение на количество сохранённых местоположений с привилегией"] = homelimitPerms = GetConfig("Ограничение на количество сохранённых местоположений с привилегией", new Dictionary<string, object>() {
                {
                    "teleportation.vip", 5
                }
            }
            ).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
            PermissionService.RegisterPermissions(this, homelimitPerms.Keys.ToList());
            Config["Длительность задержки перед телепортацией с привилегией (в секундах)"] = teleportSecsPerms = GetConfig("Длительность задержки перед телепортацией с привилегией (в секундах)", new Dictionary<string, object>() {
                {
                    "teleportation.vip", 10
                }
            }
            ).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
            PermissionService.RegisterPermissions(this, teleportSecsPerms.Keys.ToList());
            Config["Длительность перезарядки телепорта с привилегией (в секундах)"] = tpkdPerms = GetConfig("Длительность перезарядки телепорта с привилегией (в секундах)", new Dictionary<string, object>() {
                {
                    "teleportation.vip", 150
                }
            }
            ).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
            PermissionService.RegisterPermissions(this, tpkdPerms.Keys.ToList());
            Config["Длительность перезарядки телепорта домой с привилегией (в секундах)"] = tpkdhomePerms = GetConfig("Длительность перезарядки телепорта домой с привилегией (в секундах)", new Dictionary<string, object>() {
                {
                    "teleportation.vip", 150
                }
            }
            ).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
            PermissionService.RegisterPermissions(this, tpkdhomePerms.Keys.ToList());
            SaveConfig();
        }
        T GetConfig<T>(string name, T defaultValue) => Config[name] == null ? defaultValue : (T)Convert.ChangeType(Config[name], typeof(T));
        public static void GetVariable<T>(DynamicConfigFile config, string name, out T value, T defaultValue) {
            config[name] = value = config[name] == null ? defaultValue : (T)Convert.ChangeType(config[name], typeof(T));
        }
        public static class PermissionService {
            public static Permission permission = Interface.GetMod().GetLibrary<Permission>();
            public static bool HasPermission(ulong uid, string permissionName) {
                return !string.IsNullOrEmpty(permissionName) && permission.UserHasPermission(uid.ToString(), permissionName);
            }
            public static void RegisterPermissions(Plugin owner, List<string> permissions) {
                if (owner == null) throw new ArgumentNullException("owner");
                if (permissions == null) throw new ArgumentNullException("commands");
                foreach (var permissionName in permissions.Where(permissionName => !permission.PermissionExists(permissionName))) {
                    permission.RegisterPermission(permissionName, owner);
                }
            }
        }
        public BasePlayer FindBasePlayer(string nameOrUserId) {
            nameOrUserId = nameOrUserId.ToLower();
            foreach (var player in BasePlayer.activePlayerList) {
                if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
            }
            foreach (var player in BasePlayer.sleepingPlayerList) {
                if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
            }
            return default(BasePlayer);
        }
        Dictionary<ulong, Dictionary<string, Vector3>> homes = new Dictionary<ulong, Dictionary<string, Vector3>>();
        List<TPList> tpsave;
        class TPList {
            public string Name;
            public Vector3 pos;
        }
        Dictionary<ulong, int> cooldownsTP = new Dictionary<ulong, int>();
        Dictionary<ulong, int> cooldownsHOME = new Dictionary<ulong, int>();
        List<TP> tpQueue = new List<TP>();
        List<TP> pendings = new List<TP>();
        List<ulong> sethomeBlock = new List<ulong>();
        public List<BasePlayer> OpenTeleportMenu = new List<BasePlayer>();
        [ChatCommand("tpmenu")]
        private void cmdChatS(BasePlayer player) {
            CuiHelper.DestroyUi(player, Layer);
            OpenTeleportMenu.Add(player);
            timer.Once(0.01f, () => {
                DDrawMenu(player);
            }
            );
        }
        private void DDrawMenu(BasePlayer player) {
            CuiElementContainer container = new CuiElementContainer();
            List<ButtonEntry> buttons = new List<ButtonEntry>();
            var Panel = container.Add(new CuiPanel {
                Image = {
                    Color = "0 0 0 0.1", Material = "assets/content/ui/uibackgroundblur.mat"
                }
                , RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1"
                }
                , CursorEnabled = true,
            }
            , "Overlay", Layer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "-100 -100", AnchorMax = "100 100", OffsetMax = "0 0"
                }
                , Button = {
                    Color = "0 0 0 0", Close = Layer
                }
                , Text = {
                    Text = ""
                }
            }
            , Layer);
            container.Add(new CuiElement {
                Name = "TPMENULAYER", Parent = Layer, Components = {
                    new CuiImageComponent {
                        Color = "0.38 0.36 0.31 0.65", Material = "assets/icons/greyout.mat"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.23 0.2625", AnchorMax = "0.77 0.745"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYER1", Parent = Layer, Components = {
                    new CuiImageComponent {
                        Color = "0.2901961 0.2862745 0.2352941 0.6509804"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.2375 0.2775", AnchorMax = "0.763 0.38"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYER2", Parent = Layer, Components = {
                    new CuiImageComponent {
                        Color = "0.2901961 0.2862745 0.2352941 0.6509804"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.2375 0.4235", AnchorMax = "0.763 0.4925"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                Parent = "TPMENULAYER", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0.85", Text = "МЕНЮ ТЕЛЕПОРТАЦИИ", FontSize = 28, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.3 0.6525", AnchorMax = "0.7 1.5"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Parent = "TPMENULAYER", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0.85", Text = "ТЕЛЕПОРТАЦИЯ К ДРУГУ", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.3 0.085", AnchorMax = "0.7 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Parent = "TPMENULAYER", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0.85", Text = "ТЕЛЕПОРТАЦИЯ ДОМОЙ", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.3 0.075", AnchorMax = "0.7 0.5"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.195 0.85", AnchorMax = "0.49 0.97"
                }
                , Button = {
                    Close = Layer, Command = $"chat.say /outpost", Color = "0 0 0 0.75"
                }
                , Text = {
                    Text = $"ГОРОД NPC", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.5", Font = "robotocondensed-bold.ttf"
                }
            }
            , "TPMENULAYER");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.51 0.85", AnchorMax = "0.8 0.97"
                }
                , Button = {
                    Close = Layer, Command = $"chat.say /outpost", Color = "0 0 0 0.75"
                }
                , Text = {
                    Text = $"ГОРОД БАНДИТОВ", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.5", Font = "robotocondensed-bold.ttf"
                }
            }
            , "TPMENULAYER");
            if (CheckGetHomes(player).Count < GetHomeLimit(player.userID)) {
                var pos = GetGrid(player.transform.position, false);
                {
                    container.Add(new CuiButton {
                        RectTransform = {
                            AnchorMin = "0.195 0.56", AnchorMax = "0.49 0.68"
                        }
                        , Button = {
                            Close = Layer, Command = $"tp.cmd sethome {pos}", Color = "0.81 0.51 0.18 0.98"
                        }
                        , Text = {
                            Text = $"Сохранить Дом", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.5", Font = "robotocondensed-bold.ttf"
                        }
                    }
                    , "TPMENULAYER");
                }
            }
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.51 0.705", AnchorMax = "0.8 0.825"
                }
                , Button = {
                    Close = Layer, Command = $"chat.say /tpa", Color = "0.44 0.50 0.29 0.98"
                }
                , Text = {
                    Text = $"Принять ТП", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.5", Font = "robotocondensed-bold.ttf"
                }
            }
            , "TPMENULAYER");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.195 0.705", AnchorMax = "0.49 0.825"
                }
                , Button = {
                    Close = Layer, Command = $"chat.say /tpc", Color = "0.54 0.22 0.18 0.98"
                }
                , Text = {
                    Text = $"Отклонить ТП", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.5", Font = "robotocondensed-bold.ttf"
                }
            }
            , "TPMENULAYER");
            container.Add(new CuiElement {
                Name = "TPMENULAYER_0", Parent = "TPMENULAYER1", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.03 0.025", AnchorMax = "0.17 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYER_1", Parent = "TPMENULAYER1", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.18 0.025", AnchorMax = "0.33 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYER_2", Parent = "TPMENULAYER1", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.34 0.025", AnchorMax = "0.49 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYER_3", Parent = "TPMENULAYER1", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.5 0.025", AnchorMax = "0.65 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYER_4", Parent = "TPMENULAYER1", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.66 0.025", AnchorMax = "0.81 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYER_5", Parent = "TPMENULAYER1", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.82 0.025", AnchorMax = "0.97 0.95"
                    }
                    ,
                }
            }
            );
            if (CheckGetHomes(player).Count >= 1) {
                int b = 0;
                foreach (var check in CheckGetHomes(player)) {
                    container.Add(new CuiButton {
                        RectTransform = {
                            AnchorMin = "0 0", AnchorMax = "1 1"
                        }
                        , Button = {
                            Close = Layer, Command = $"tp.cmd home {check.Key}", Color = "0.31 0.30 0.25 0.8"
                        }
                        , Text = {
                            Text = check.Key, FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.7", Font = "robotocondensed-bold.ttf"
                        }
                    }
                    , "TPMENULAYER_" + b);
                    b++;
                }
            }
            container.Add(new CuiElement {
                Name = "TPMENULAYERR0", Parent = "TPMENULAYER2", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.01 0.025", AnchorMax = "0.15 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYERR1", Parent = "TPMENULAYER2", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.16 0.025", AnchorMax = "0.31 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYERR2", Parent = "TPMENULAYER2", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.32 0.025", AnchorMax = "0.47 0.95"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiElement {
                Name = "TPMENULAYERR3", Parent = "TPMENULAYER2", Components = {
                    new CuiTextComponent() {
                        Color = "1 1 1 0", FadeIn = 0.25f, Text = "", FontSize = 20, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.48 0.025", AnchorMax = "0.63 0.95"
                    }
                    ,
                }
            }
            );
            var clanmates = Clans.Call("GetClanMembers", player.userID) as List<string>;
            int i = 0;
            foreach (var friend in clanmates) {
                var covFriend = covalence.Players.FindPlayerById(friend.ToString());
                if (friend.ToString() == player.UserIDString) {
                    continue;
                }
                if (covFriend == null) continue;
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = "0 0", AnchorMax = "1 1"
                    }
                    , Button = {
                        Close = Layer, Command = $"tp.cmd tpr {friend}", Color = "0.31 0.30 0.25 0.8", FadeIn = 0.1f
                    }
                    , Text = {
                        Text = $"{covFriend.Name}", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.7", Font = "robotocondensed-bold.ttf"
                    }
                }
                , "TPMENULAYERR" + i);
                i++;
            }
            CuiHelper.DestroyUi(player, Layer);
            CuiHelper.AddUi(player, container);
        }
        [ConsoleCommand("tp.cmd")]
        void PlayerCMD(ConsoleSystem.Arg args) {
            var player = args.Player();
            switch (args.Args[0].ToLower()) {
                case "tpr" : player.Command($"chat.say \"/tpr {args.Args[1]}\"");
                OpenTeleportMenu.Remove(player);
                break;
                case "tpc" : player.Command($"chat.say \"/tpc\"");
                OpenTeleportMenu.Remove(player);
                break;
                case "tpa" : player.Command($"chat.say \"/tpa\"");
                OpenTeleportMenu.Remove(player);
                break;
                case "home" : player.Command($"chat.say \"/home {args.Args[1]}\"");
                OpenTeleportMenu.Remove(player);
                break;
                case "sethome" : player.Command($"chat.say \"/sethome {args.Args[1]}\"");
                OpenTeleportMenu.Remove(player);
                break;
                case "removehome" : player.Command($"chat.say \"/removehome {args.Args[1]}\"");
                OpenTeleportMenu.Remove(player);
                break;
                case "atp" : player.Command("chat.say /atp");
                DDrawMenu(player);
                break;
            }
        }
        Dictionary<string, Vector3> CheckGetHomes(BasePlayer player) {
            var homelist = GetHomes(player.userID) ?? new Dictionary<string, Vector3>();
            return homelist.GroupBy(p => p.Key).ToDictionary(p => p.Key, p => p.First().Value);
        }
        public List<ulong> GetFriends(ulong playerid = 2952192) {
            if (Friends) {
                var friends = Friends?.Call("GetFriends", playerid) as ulong[];
                return friends.ToList();
            }
            return new List<ulong>();
        }
        private string GetGrid(Vector3 position, bool addVector) {
            var roundedPos = new Vector2(World.Size / 2 + position.x, World.Size / 2 - position.z);
            var grid = $"{NumberToLetter((int)(roundedPos.x / 150))}{(int)(roundedPos.y / 150)}";
            if (addVector) grid += $" {position.ToString().Replace(", ", "")}";
            return grid;
        }
        private string NumberToLetter(int num) {
            var num2 = Mathf.FloorToInt((float)(num / 26));
            var num3 = num % 26;
            var text = string.Empty;
            if (num2 > 0) for (var i = 0; i < num2; i++) text += Convert.ToChar(65 + i);
            return text + Convert.ToChar(65 + num3);
        }
        private static string HexToCuiColor(string hex) {
            if (string.IsNullOrEmpty(hex)) {
                hex = "#FFFFFFFF";
            }
            var str = hex.Trim('#');
            if (str.Length == 6) str += "FF";
            if (str.Length != 8) {
                throw new Exception(hex);
                throw new InvalidOperationException("Cannot convert a wrong format.");
            }
            var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
            var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
            var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
            var a = byte.Parse(str.Substring(6, 2), NumberStyles.HexNumber);
            Color color = new Color32(r, g, b, a);
            return $"{color.r:F2} {color.g:F2} {color.b:F2} {color.a:F2}";
        }
        void AddPlayerAutoTP(BasePlayer player) {
            if (!AutoTPA.ContainsKey(player.userID)) AutoTPA.Add(player.userID, new AutoTPASettings());
            if (GetFriends(player.userID).Count >= 0) {
                foreach (var friend in GetFriends(player.userID)) {
                    var covFriend = covalence.Players.FindPlayerById(friend.ToString());
                    if (covFriend == null) continue;
                    if (AutoTPA[player.userID].PlayersList.ContainsKey(covFriend.Name)) return;
                    AutoTPA[player.userID].PlayersList.Add(covFriend.Name, ulong.Parse(covFriend.Id));
                }
            }
        }
        [ChatCommand("atp")]
        void cmdAutoTPA(BasePlayer player, string com, string[] args) {
            if (!PermissionService.HasPermission(player.userID, AutoTPAPermission)) {
                SendReply(player, Messages["TPAPerm"]);
                return;
            }
            if (!AutoTPA.ContainsKey(player.userID)) AutoTPA.Add(player.userID, new AutoTPASettings());
            var data = AutoTPA[player.userID];
            if (args == null || args.Length <= 0) {
                if (data.Enabled) {
                    data.Enabled = false;
                    SendReply(player, Messages["TPADisable"]);
                }
                else {
                    data.Enabled = true;
                    SendReply(player, string.Format(Messages["TPAEnabled"], Messages["TPAEnabledInfo"]));
                }
                return;
            }
            switch (args[0]) {
                case "add" : if (args.Length < 2) {
                    SendReply(player, Messages["TPAEAddError"]);
                    return;
                }
                var target = covalence.Players.FindPlayers(args[1]).ToList();
                if (target == null || target.Count <= 0) {
                    SendReply(player, string.Format(Messages["TPAEAddPlayerNotFound"], "‌‍‌‌‌‌"));
                    return;
                }
                if (target.Count > 1) {
                    SendReply(player, string.Format(Messages["TPAEAddPlayers"], string.Join(", ", target.Select(p => p.Name).Take(5))));
                    return;
                }
                if (data.PlayersList.ContainsKey(target[0].Name)) {
                    SendReply(player, string.Format(Messages["TPAEAddContains"], target[0].Name));
                    return;
                }
                data.PlayersList.Add(target[0].Name, ulong.Parse(target[0].Id));
                SendReply(player, string.Format(Messages["TPAEAddSuccess"], target[0].Name));
                break;
                case "remove" : if (args.Length < 2) {
                    SendReply(player, Messages["TPARemoveError"]);
                    return;
                }
                var key = data.PlayersList.FirstOrDefault(p => p.Key.ToLower().Contains(args[1].ToLower())).Key;
                if (string.IsNullOrEmpty(key)) {
                    SendReply(player, string.Format(Messages["TPAEAddPlayerNotFound"], string.Format(Messages["TPAEnabledList"], string.Join(", ", data.PlayersList.Select(p => p.Key)))));
                    return;
                }
                data.PlayersList.Remove(key);
                SendReply(player, string.Format(Messages["TPAERemoveSuccess"], key));
                break;
                case "list" : if (data.PlayersList.Count <= 0) SendReply(player, Messages["TPAEListNotFound"]);
                else SendReply(player, string.Format(Messages["TPAEnabledList"], string.Join(", ", data.PlayersList.Select(p => p.Key))));
                break;
            }
        }
        [ChatCommand("sethome")]
        void cmdChatSetHome(BasePlayer player, string command, string[] args) {
            if (args.Length != 1) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["sethomeArgsError"]);
                return;
            }
            if (CancelTPMetabolism && player.metabolism.bleeding.value > 0) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["woundedAction"]);
                return;
            }
            if (CancelTPRadiation && player.metabolism.radiation_poison.value > 10) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["Radiation"]);
                return;
            }
            if (player.IsWounded() && CancelTPWounded) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["woundedAction"]);
                return;
            }
            if (sethomeBlock.Contains(player.userID)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["sethomeBlock"]);
                return;
            }
            var name = args[0];
            SetHome(player, name, player.transform.position);
        }
        [ChatCommand("removehome")]
        void cmdChatRemoveHome(BasePlayer player, string command, string[] args) {
            if (args.Length != 1) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["removehomeArgsError"]);
                return;
            }
            if (!homes.ContainsKey(player.userID)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["homesmissing"]);
                return;
            }
            var name = args[0];
            var playerHomes = homes[player.userID];
            if (!playerHomes.ContainsKey(name)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["homenotexist"]);
                return;
            }
            foreach (var sleepingBag in SleepingBag.FindForPlayer(player.userID, true)) {
                if (Vector3.Distance(sleepingBag.transform.position, playerHomes[name]) < 1) {
                    sleepingBag.Kill();
                    break;
                }
            }
            Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
            playerHomes.Remove(name);
            SendReply(player, Messages["removehomesuccess"], name);
        }
        [ConsoleCommand("home")]
        void cmdHome(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            if (arg.Args == null || arg.Args.Length < 1) return;
            cmdChatHome(player, "‌‍‌‌‌‌", new[] {
                arg.Args[0]
            }
            );
        }
        [ChatCommand("homelist")]
        private void cmdHomeList(BasePlayer player, string command, string[] args) {
            if (!homes.ContainsKey(player.userID) || homes[player.userID].Count == 0) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["homesmissing"]);
                return;
            }
            var playerHomes = homes[player.userID];
            var time = (GetHomeLimit(player.userID) - playerHomes.Count);
            var homelist = playerHomes.Select(x => GetSleepingBag(x.Key, x.Value) != null ? $"{x.Key} {x.Value}" : $"Дом: {x.Key} {x.Value}");
            foreach (var home in playerHomes.ToList()) {
                if (createSleepingBug) if (!GetSleepingBag(home.Key, home.Value)) playerHomes.Remove(home.Key);
            }
            SendReply(player, Messages["homeslist"], time, string.Join("\n", homelist.ToArray()));
        }
        [ChatCommand("home")]
        void cmdChatHome(BasePlayer player, string command, string[] args) {
            if (args.Length != 1) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["homeArgsError"]);
                return;
            }
            var ret = Interface.Call("CanTeleport", player) as string;
            if (ret != null) {
                SendReply(player, ret);
                return;
            }
            if (!EnabledShipTP && player.GetParentEntity() is CargoShip) {
                SendReply(player, Messages["PlayerIsOnCargoShip"]);
                return;
            }
            if (!EnabledBallonTP && player.GetParentEntity() is HotAirBalloon) {
                SendReply(player, Messages["PlayerIsOnHotAirBalloon"]);
                return;
            }
            if (player.IsWounded() && CancelTPWounded) {
                SendReply(player, Messages["woundedAction"]);
                return;
            }
            if (player.metabolism.bleeding.value > 0 && CancelTPMetabolism) {
                SendReply(player, Messages["woundedAction"]);
                return;
            }
            if (CancelTPRadiation && player.metabolism.radiation_poison.value > 10) {
                SendReply(player, Messages["Radiation"]);
                return;
            }
            int seconds;
            if (cooldownsHOME.TryGetValue(player.userID, out seconds) && seconds > 0) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, string.Format(Messages["tpkd"], TimeToString(seconds)));
                return;
            }
            if (homecupboard && player.GetBuildingPrivilege() != null && !player.IsBuildingAuthed()) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["tphomecupboard"]);
                return;
            }
            if (!homes.ContainsKey(player.userID)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["homesmissing"]);
                return;
            }
            var name = args[0];
            var playerHomes = homes[player.userID];
            if (!playerHomes.ContainsKey(name)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["homenotexist"]);
                return;
            }
            var time = GetTeleportTime(player.userID);
            var pos = playerHomes[name];
            if (CancelTPCold && player.metabolism.temperature.value < 0) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["coldplayer"]);
                return;
            }
            if (tpQueue.Any(p => p.Player == player) || pendings.Any(p => p.Player2 == player)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["tpError"]);
                return;
            }
            if (createSleepingBug) {
                SleepingBag bag = GetSleepingBag(name, pos);
                if (bag == null) {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["sleepingbagmissing"]);
                    playerHomes.Remove(name);
                    return;
                }
                if (homecupboardblock && bag.GetBuildingPrivilege() != null && !bag.GetBuildingPrivilege().IsAuthed(player)) {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["sleepingbugbuildblock"]);
                    playerHomes.Remove(name);
                    bag.Kill();
                    return;
                }
            }
            else {
                var builds = GetBuildings(pos);
                if (builds == null) {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["buildingBrockmissingR"]);
                    playerHomes.Remove(name);
                    return;
                }
                builds.RemoveAll(x => x == null || !x.IsValid() || x.IsDestroyed);
                if (builds.Count <= 0) {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["buildingBrockmissingR"]);
                    playerHomes.Remove(name);
                    return;
                }
                var bulds = builds[0];
                if (homecupboardblock && bulds.GetBuildingPrivilege() != null && !bulds.GetBuildingPrivilege().IsAuthed(player)) {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["sleepingbugbuildblock"]);
                    playerHomes.Remove(name);
                    return;
                }
            }
            var lastTp = tpQueue.Find(p => p.Player == player);
            if (lastTp != null) {
                tpQueue.Remove(lastTp);
            }
            tpQueue.Add(new TP(player, pos, time, false, false));
            Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
            SendReply(player, String.Format(Messages["homequeue"], name, TimeToString(time)));
        }
        [ChatCommand("tpr")]
        void cmdChatTpr(BasePlayer player, string command, string[] args) {
            if (!enabledTPR) return;
            if (args.Length != 1) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["tprArgsError"]);
                return;
            }
            var ret = Interface.Call("CanTeleport", player) as string;
            if (ret != null) {
                SendReply(player, ret);
                return;
            }
            if (!EnabledShipTP && player.GetParentEntity() is CargoShip) {
                SendReply(player, Messages["PlayerIsOnCargoShip"]);
                return;
            }
            if (!EnabledBallonTP && player.GetParentEntity() is HotAirBalloon) {
                SendReply(player, Messages["PlayerIsOnHotAirBalloon"]);
                return;
            }
            if (player.IsWounded() && CancelTPWounded) {
                SendReply(player, Messages["woundedAction"]);
                return;
            }
            if (player.metabolism.bleeding.value > 0 && CancelTPMetabolism) {
                SendReply(player, Messages["woundedAction"]);
                return;
            }
            if (CancelTPRadiation && player.metabolism.radiation_poison.value > 10) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["Radiation"]);
                return;
            }
            if (restrictTPRCupboard) {
                var privilege = player.GetBuildingPrivilege(player.WorldSpaceBounds());
                if (privilege != null && !player.IsBuildingAuthed()) {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["tpcupboard"]);
                    return;
                }
            }
            var name = args[0];
            var target = FindBasePlayer(name);
            if (target == null || !target.IsConnected) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["playermissing"]);
                return;
            }
            if (target == player) {
                SendReply(player, Messages["playerisyou"]);
                return;
            }
            if (FriendsEnabled) if (!IsFriends(target.userID, player.userID) && !IsTeamate(player, target.userID) && !IsClanMember(player.userID, target.userID)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["PlayerNotFriend"]);
                return;
            }
            int seconds = 0;
            if (restrictCupboard && player.GetBuildingPrivilege(player.WorldSpaceBounds()) != null && !player.GetBuildingPrivilege(player.WorldSpaceBounds()).authorizedPlayers.Select(p => p.userid).Contains(player.userID)) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["tpcupboard"]);
                return;
            }
            if (cooldownsTP.TryGetValue(player.userID, out seconds) && seconds > 0) {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.ze
// ... [Code preview truncated due to length. Full source in attached file] ...

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