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

FREE Teleportation : 1.2.2 1.2.2

Нет прав для скачивания
C#:
using Oxide.Core;
using System.Collections.Generic;
using System.Linq;
using System;
using System.Reflection;
using Facepunch;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core.Configuration;
using Oxide.Core.Plugins;
using UnityEngine;
using Oxide.Core.Libraries;
using System.IO;
namespace Oxide.Plugins
{
    [Info("Teleportation", "OxideBro/Ryamkk", "1.2.2")]

    class Teleportation : RustPlugin
    {
        [PluginReference]
        Plugin Clans;
        [PluginReference]
        Plugin Friends;
        readonly MethodInfo entitySnapshot = typeof(BasePlayer).GetMethod("SendEntitySnapshot", BindingFlags.Instance | BindingFlags.NonPublic);
        Dictionary<ulong, Vector3> lastPositions = new Dictionary<ulong, Vector3>();
        Dictionary<BasePlayer, int> spectatingPlayers = new Dictionary<BasePlayer, int>();
        bool IsClanMember(ulong playerID, ulong targetID)
        {
            return (bool)(Clans?.Call("HasFriend", playerID, targetID) ?? false);
        }

        bool IsFriends(ulong playerID, ulong friendId)
        {
            return (bool)(Friends?.Call("AreFriends", playerID, friendId) ?? false);
        }

        #region CLASSES

        class TP
        {
            public BasePlayer Player;
            public BasePlayer Player2;
            public Vector3 pos;
            public int seconds;

            public TP(BasePlayer player, Vector3 pos, int seconds, BasePlayer player2 = null)
            {
                this.Player = player;
                this.pos = pos;
                this.seconds = seconds;
                this.Player2 = player2;
            }
        }

        #endregion
			
        #region CONFIGURATION
        const string TPADMIN = "teleportation.admin";
        Dictionary<string, int> homelimitPerms;
		Dictionary<string, int> teleportSecsPerms;
        Dictionary<string, int> tpkdPerms;
        Dictionary<string, int> tpkdhomePerms;
		int RadiationBlockTP;
	    int ColdBlockTP;
		int BleedingBlockTP;
		int CraftBlockTP;
		int homelimitDefault;
		int tpkdDefault;
		int tpkdhomeDefault;
        int teleportSecsDefault;
        int resetPendingTime;
		int CraftBlockHome;
		int RadiationBlockHome;
		int BleedingBlockHome;
		int ColdBlockHome;
		//int SleepingBagSkin;
	    bool CanSwimmingTP;
		bool CanCraftTP;
		bool CanAliveTP;
		bool CanRadiationTP;
		bool CanBleedingTP;
		bool CanWoundedTP;
		bool CanColdTP;
        bool restrictCupboard;
		bool enabledTP;
		bool enabledHome;
        bool homecupboard;
        bool adminsLogs;
        bool foundationOwner;
        bool foundationOwnerFC;
        bool restrictTPRCupboard;
        bool foundationEx;
        bool wipedData;
        bool createSleepingBug;
	    bool CanWoundedHome;
		bool CanColdHome;
	    bool CanSwimmingHome;
		bool CanCraftHome;
	    bool CanAliveHome;
		bool CanRadiationHome;
		bool CanBleedingHome;
        string EffectPrefab1;
        string EffectPrefab;
		string SleepingBagName;
        static DynamicConfigFile config;

        void WipeData()
        {
            Interface.Oxide.DataFileSystem.WriteObject("Teleportation/Homes", new Dictionary<string, FileInfo>());
            Interface.Oxide.DataFileSystem.WriteObject("Teleportation/AdminTpSave", new Dictionary<string, FileInfo>());
            SaveData();
            Interface.Oxide.ReloadPlugin(Title);
        }

        protected override void LoadDefaultConfig()
        {
			GetVariable(Config, "Общие настройки", "A.Логировать использование команд для администраторов", out adminsLogs, true);
			GetVariable(Config, "Общие настройки", "B.Звук предупреждения (пустое поле = звук отключен)", out EffectPrefab, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
            GetVariable(Config, "Общие настройки", "C.Звук уведомления при получение запроса на телепорт (пустое поле = звук отключен)", out EffectPrefab1, "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab");
			GetVariable(Config, "Общие настройки", "D.Автоматический вайп данных при генерации новой карты", out wipedData, true);
			
			GetVariable(Config, "Телепортация домой", "A.Разрешить телепортацию", out enabledHome, true);
			GetVariable(Config, "Телепортация домой", "B.Запрещать отправлять запрос на телепортацию в воде", out CanSwimmingHome, true);
			GetVariable(Config, "Телепортация домой", "C.Запрещать отправлять запрос на телепортацию во время крафта", out CanCraftHome, true);
			GetVariable(Config, "Телепортация домой", "D.Разрешённое количество предметов на крафте", out CraftBlockHome, 0);
			GetVariable(Config, "Телепортация домой", "E.Отменять телепортацию при смерте", out CanAliveHome, true);
			GetVariable(Config, "Телепортация домой", "F.Запрещать отправлять запрос на телепортацию во время облечения радиацией", out CanRadiationHome, true);
			GetVariable(Config, "Телепортация домой", "G.Разрешённое радиационное облучения для телепортации", out RadiationBlockHome, 5);
			GetVariable(Config, "Телепортация домой", "H.Запрещать отправлять запрос на телепортацию во время кровотечения", out CanBleedingHome, true);
			GetVariable(Config, "Телепортация домой", "I.Разрешённый процент кровотечения для телепортации", out BleedingBlockHome, 0);
			GetVariable(Config, "Телепортация домой", "J.Отменять телепортацияю если игрок получил ранения", out CanWoundedHome, true);
			GetVariable(Config, "Телепортация домой", "K.Запрещать отправлять запрос на телепортацию если игроку холодно", out CanColdHome, true);
			GetVariable(Config, "Телепортация домой", "L.Разрешённый проект замерзания для телепортации", out ColdBlockHome, 3);
			GetVariable(Config, "Телепортация домой", "M.Запрещать отправлять запрос на телепортацию в зоне действия чужого шкафа", out homecupboard, true);
            GetVariable(Config, "Телепортация домой", "N.Разрешать сохранять местоположение только на фундаменте", out foundationEx, true);
            GetVariable(Config, "Телепортация домой", "O.Создавать объект при сохранении местоположения", out createSleepingBug, true);
			GetVariable(Config, "Телепортация домой", "P.Название создаваемого объекта", out SleepingBagName, "Sleeping Bag");
			//GetVariable(Config, "Телепортация домой", "Q.Скин создаваемого объекта", out SleepingBagName, 1174407153);
            GetVariable(Config, "Телепортация домой", "R.Запрещать сохранять местоположение если игрок не является владельцем фундамента", out foundationOwner, true);
            GetVariable(Config, "Телепортация домой", "S.Разрешать сохранять местоположение если игрок является другом или соклановцем владельца фундамента ", out foundationOwnerFC, true);
			GetVariable(Config, "Телепортация домой", "T.Ограничение на количество сохранённых местоположений", out homelimitDefault, 3);
			GetVariable(Config, "Телепортация домой", "U.Длительность перезарядки телепорта домой (в секундах)", out tpkdhomeDefault, 300);

            GetVariable(Config, "Телепортация к игроку", "A.Разрешить телепортацию", out enabledTP, true);
			GetVariable(Config, "Телепортация к игроку", "B.Время ответа на запрос телепортации (в секундах)", out resetPendingTime, 15);
			GetVariable(Config, "Телепортация к игроку", "C.Запрещать отправлять запрос на телепортацию в воде", out CanSwimmingTP, true);
			GetVariable(Config, "Телепортация к игроку", "D.Запрещать отправлять запрос на телепортацию во время крафта", out CanCraftTP, true);
			GetVariable(Config, "Телепортация к игроку", "E.Разрешённое количество предметов на крафте", out CraftBlockTP, 0);
			GetVariable(Config, "Телепортация к игроку", "F.Отменять телепортацию при смерте", out CanAliveTP, true);
			GetVariable(Config, "Телепортация к игроку", "G.Запрещать отправлять запрос на телепортацию во время облечения радиацией", out CanRadiationTP, true);
			GetVariable(Config, "Телепортация к игроку", "H.Разрешённое радиационное облучения для телепортации", out RadiationBlockTP, 5);
			GetVariable(Config, "Телепортация к игроку", "I.Запрещать отправлять запрос на телепортацию во время кровотечения", out CanBleedingTP, true);
			GetVariable(Config, "Телепортация к игроку", "J.Разрешённый процент кровотечения для телепортации", out BleedingBlockTP, 0);
			GetVariable(Config, "Телепортация к игроку", "K.Отменять телепортацияю если игрок получил ранения", out CanWoundedTP, true);
			GetVariable(Config, "Телепортация к игроку", "L.Запрещать отправлять запрос на телепортацию если игроку холодно", out CanColdTP, true);
			GetVariable(Config, "Телепортация к игроку", "M.Разрешённый проект замерзания для телепортации", out ColdBlockTP, 3);
			GetVariable(Config, "Телепортация к игроку", "N.Запрещать отправлять запрос на телепортацию в зоне действия чужого шкафа", out restrictTPRCupboard, true);
            GetVariable(Config, "Телепортация к игроку", "O.Запрещать принимать запрос на телепортацию в зоне действия чужого шкафа", out restrictCupboard, true);
			GetVariable(Config, "Телепортация к игроку", "P.Длительность задержки перед телепортацией (в секундах)", out teleportSecsDefault, 15);
			GetVariable(Config, "Телепортация к игроку", "Q.Длительность перезарядки телепорта (в секундах)", out tpkdDefault, 300);
			
            Config["Телепортация домой", "V.Ограничение на количество сохранённых местоположений с привилегией"] =
                homelimitPerms =
                    GetConfig("Ограничение на количество сохранённых местоположений с привилегией",
                            new Dictionary<string, object>()
							{
								{ "teleportation.vip", 4 },
								{ "teleportation.god", 5 },
								{ "teleportation.prem", 6 },
								{ "teleportation.elite", 7 },
								{ "teleportation.king", 5 },
								{ "teleportation.none", 999 }
							}).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
            PermissionService.RegisterPermissions(this, homelimitPerms.Keys.ToList());
			
            Config["Телепортация к игроку", "R.Длительность задержки перед телепортацией с привилегией (в секундах)"] =
                teleportSecsPerms =
                    GetConfig("Длительность задержки перед телепортацией с привилегией (в секундах)",
                            new Dictionary<string, object>()
							{
								{ "teleportation.vip", 10 },
								{ "teleportation.god", 9 },
								{ "teleportation.prem", 8 },
								{ "teleportation.elite", 7 },
								{ "teleportation.king", 6 },
								{ "teleportation.none", 1 }
							}).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
            PermissionService.RegisterPermissions(this, teleportSecsPerms.Keys.ToList());

            Config["Телепортация к игроку", "U.Длительность перезарядки телепорта с привилегией (в секундах)"] =
                tpkdPerms =
                    GetConfig("Длительность перезарядки телепорта с привилегией (в секундах)",
                            new Dictionary<string, object>()
							{
								{ "teleportation.vip", 250 },
								{ "teleportation.god", 200 },
								{ "teleportation.prem", 150 },
								{ "teleportation.elite", 100 },
								{ "teleportation.king", 50 },
								{ "teleportation.none", 1 }
							}).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
            PermissionService.RegisterPermissions(this, tpkdPerms.Keys.ToList());
			
            Config["Телепортация домой", "W.Длительность перезарядки телепорта домой с привилегией (в секундах)"] =
                tpkdhomePerms =
                    GetConfig("Длительность перезарядки телепорта домой с привилегией (в секундах)",
                            new Dictionary<string, object>()
							{
								{ "teleportation.vip", 250 },
								{ "teleportation.god", 200 },
								{ "teleportation.prem", 150 },
								{ "teleportation.elite", 100 },
								{ "teleportation.king", 50 },
								{ "teleportation.none", 1 }
							}).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, string Key, out T value, T defaultValue)
        {
            config[name, Key] = value = config[name, Key] == null ? defaultValue : (T)Convert.ChangeType(config[name, Key], typeof(T));
        }
        #endregion

        #region Permissions
        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);
                }
            }
        }
        #endregion

        #region FIELDS

        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);
        }

        private FieldInfo SleepingBagUnlockTimeField = typeof(SleepingBag).GetField("unlockTime",
            BindingFlags.Instance | BindingFlags.NonPublic);

        private readonly int groundLayer = LayerMask.GetMask("Terrain", "World");
        private readonly int buildingMask = Rust.Layers.Server.Buildings;
        
        Dictionary<ulong, Dictionary<string, Vector3>> homes;
        Dictionary<ulong, Dictionary<string, Vector3>> tpsave;
        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>();

        #endregion

        #region COMMANDS

        [ChatCommand("sethome")]
        void cmdChatSetHome(BasePlayer player, string command, string[] args)
        {
			if (!enabledHome) return;
            var uid = player.userID;
            var pos = player.GetNetworkPosition();
            var foundation = GetFoundation(pos);
            var bulds = GetBuldings(pos);
            if (foundationEx)
            {
                if (foundation == null)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["foundationmissing"]);
                    return;
                }
            }
            if (!foundationEx)
            {
                if (bulds == null)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["foundationmissing"]);
                    return;
                }
            }
            if (args.Length != 1)
            {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["sethomeArgsError"]);
                return;
            }
			if(CanSwimmingHome)
			{
				if (player.IsSwimming())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Swimming"]);
                    return;
                }
			}
			if(CanCraftHome)
			{
				if (player.inventory.crafting.queue.Count > CraftBlockHome)
				{
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Craft"]);
                    return;
                }
			}
			if(CanAliveHome)
			{
				if (!player.IsAlive())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Alive"]);
                    return;
                }
			}
			if(CanRadiationHome)
			{
				if (player.metabolism.radiation_poison.value > RadiationBlockHome)
                {
				    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Radiation"]);
                    return;
                }
			}
			if(CanBleedingHome)
			{
                if (player.metabolism.bleeding.value > BleedingBlockHome)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Bleeding"]);
                    return;
                }
			}
			if(CanWoundedHome)
			{
                if (player.IsWounded())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Wounded"]);
                    return;
                }
			}
			if(CanColdHome)
			{
			    if (player.metabolism.temperature.value < ColdBlockHome)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Cold"]);
                    return;
                }
			}
            if (sethomeBlock.Contains(player.userID))
            {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["sethomeBlock"]);
                return;
            }
            if (foundationOwnerFC && foundationOwner)
            {
                if (!foundationEx && bulds.OwnerID != uid)
                {
                    if (!IsFriends(bulds.OwnerID, player.userID) && !IsClanMember(bulds.OwnerID, player.userID))
                    {
                        Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                        SendReply(player, Messages["foundationownerFC"]);
                        return;
                    }
                }
                if (foundationEx && foundation.OwnerID != uid)
                {
                    if (!IsFriends(foundation.OwnerID, player.userID) && !IsClanMember(foundation.OwnerID, player.userID))
                    {
                        Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                        SendReply(player, Messages["foundationownerFC"]);
                        return;
                    }
                }

            }
            if (foundationOwner)
            {
                if (foundationEx && foundation.OwnerID != uid && foundationOwnerFC == (!IsFriends(foundation.OwnerID, player.userID) && !IsClanMember(foundation.OwnerID, player.userID)))
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["foundationowner"]);
                    return;
                }
                if (!foundationEx && bulds.OwnerID != uid && foundationOwnerFC == (!IsFriends(bulds.OwnerID, player.userID) && !IsClanMember(bulds.OwnerID, player.userID)))
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["foundationowner"]);
                    return;
                }
            }
            var name = args[0];

            SetHome(player, name);
        }

        [ChatCommand("removehome")]
        void cmdChatRemoveHome(BasePlayer player, string command, string[] args)
        {
			if (!enabledHome) return;
            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 (!enabledHome) return;
            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 (!enabledHome) return;
            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(CanSwimmingHome)
			{
				if (player.IsSwimming())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Swimming"]);
                    return;
                }
			}
			if(CanCraftHome)
			{
				if (player.inventory.crafting.queue.Count > CraftBlockHome)
				{
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Craft"]);
                    return;
                }
			}
			if(CanAliveHome)
			{
				if (!player.IsAlive())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Alive"]);
                    return;
                }
			}
			if(CanRadiationHome)
			{
				if (player.metabolism.radiation_poison.value > RadiationBlockHome)
                {
				    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Radiation"]);
                    return;
                }
			}
			if(CanBleedingHome)
			{
                if (player.metabolism.bleeding.value > BleedingBlockHome)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Bleeding"]);
                    return;
                }
			}
			if(CanWoundedHome)
			{
                if (player.IsWounded())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Wounded"]);
                    return;
                }
			}
			if(CanColdHome)
			{
			    if (player.metabolism.temperature.value < ColdBlockHome)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Cold"]);
                    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)
            {
                var privilege = player.GetBuildingPrivilege(player.WorldSpaceBounds());
                if (privilege != 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];

            SleepingBag bag = GetSleepingBag(name, pos);
            if (createSleepingBug)
            {
                if (bag == null)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["sleepingbagmissing"]);
                    playerHomes.Remove(name);
                    return;
                }
            }
            if (!createSleepingBug)
            {
                var bulds = GetBuldings(pos);
                if (bulds == null)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["foundationmissingR"]);
                    playerHomes.Remove(name);
                    return;
                }
            }
            if (player.metabolism.temperature.value < ColdBlockHome)
            {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["Cold"]);
                return;
            }


            var lastTp = tpQueue.Find(p => p.Player == player);
            if (lastTp != null)
            {
                tpQueue.Remove(lastTp);
            }
            tpQueue.Add(new TP(player, pos, time));
            Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
            SendReply(player, String.Format(Messages["homequeue"], name, TimeToString(time)));
            SaveData();
        }

        [ChatCommand("tpr")]
        void cmdChatTpr(BasePlayer player, string command, string[] args)
        {
            if (!enabledTP) 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(CanSwimmingTP)
			{
				if (player.IsSwimming())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Swimming"]);
                    return;
                }
			}
			if(CanCraftTP)
			{
				if (player.inventory.crafting.queue.Count > CraftBlockTP)
				{
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Craft"]);
                    return;
                }
			}
			if(CanAliveTP)
			{
				if (!player.IsAlive())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Alive"]);
                    return;
                }
			}
			if(CanRadiationTP)
			{
				if (player.metabolism.radiation_poison.value > RadiationBlockTP)
                {
				    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Radiation"]);
                    return;
                }
			}
			if(CanBleedingTP)
			{
                if (player.metabolism.bleeding.value > BleedingBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Bleeding"]);
                    return;
                }
			}
			if(CanWoundedTP)
			{
                if (player.IsWounded())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Wounded"]);
                    return;
                }
			}
			if(CanColdTP)
			{
			    if (player.metabolism.temperature.value < ColdBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Cold"]);
                    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)
            {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["playermissing"]);
                return;
            }
            if (target == player)
            {
                SendReply(player, Messages["playerisyou"]);
                return;
            }
            int seconds = 0;
            if (restrictCupboard && tpQueue.Any(p => p.Player == player && p.Player2 != null) &&
                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.zero, Vector3.forward);
                SendReply(player, string.Format(Messages["tpkd"], TimeToString(seconds)));
                return;
            }

			if(CanSwimmingTP)
			{
				if (player.IsSwimming())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Swimming"]);
                    return;
                }
			}
			if(CanCraftTP)
			{
				if (player.inventory.crafting.queue.Count > CraftBlockTP)
				{
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Craft"]);
                    return;
                }
			}
			if(CanAliveTP)
			{
				if (!player.IsAlive())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Alive"]);
                    return;
                }
			}
			if(CanRadiationTP)
			{
				if (player.metabolism.radiation_poison.value > RadiationBlockTP)
                {
				    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Radiation"]);
                    return;
                }
			}
			if(CanBleedingTP)
			{
                if (player.metabolism.bleeding.value > BleedingBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Bleeding"]);
                    return;
                }
			}
			if(CanWoundedTP)
			{
                if (player.IsWounded())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Wounded"]);
                    return;
                }
			}
			if(CanColdTP)
			{
			    if (player.metabolism.temperature.value < ColdBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Cold"]);
                    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;
            }


            SendReply(player, string.Format(Messages["tprrequestsuccess"], target.displayName));
            SendReply(target, string.Format(Messages["tprpending"], player.displayName));
            Effect.server.Run(EffectPrefab1, target, 0, Vector3.zero, Vector3.forward);
            pendings.Add(new TP(target, Vector3.zero, 15, player));
        }

        [ChatCommand("tpa")]
        void cmdChatTpa(BasePlayer player, string command, string[] args)
        {
            if (!enabledTP) return;
            var tp = pendings.Find(p => p.Player == player);
            BasePlayer pendingPlayer = tp?.Player2;
            if (pendingPlayer == null)
            {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["tpanotexist"]);
                return;
            }

			if(CanSwimmingTP)
			{
				if (player.IsSwimming())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Swimming"]);
                    return;
                }
			}
			if(CanCraftTP)
			{
				if (player.inventory.crafting.queue.Count > CraftBlockTP)
				{
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Craft"]);
                    return;
                }
			}
			if(CanAliveTP)
			{
				if (!player.IsAlive())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Alive"]);
                    return;
                }
			}
			if(CanRadiationTP)
			{
				if (player.metabolism.radiation_poison.value > RadiationBlockTP)
                {
				    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Radiation"]);
                    return;
                }
			}
			if(CanBleedingTP)
			{
                if (player.metabolism.bleeding.value > BleedingBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Bleeding"]);
                    return;
                }
			}
			if(CanWoundedTP)
			{
                if (player.IsWounded())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Wounded"]);
                    return;
                }
			}
			if(CanColdTP)
			{
			    if (player.metabolism.temperature.value < ColdBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Cold"]);
                    return;
                }
			}
			
            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["tpacupboard"]); return;
            }


            var ret = Interface.Call("CanTeleport", player) as string;
            if (ret != null)
            {
                SendReply(player, ret);
                return;
            }

            var time = GetTeleportTime(pendingPlayer.userID);
            pendings.Remove(tp);

            var lastTp = tpQueue.Find(p => p.Player == pendingPlayer);
            if (lastTp != null)
            {
                tpQueue.Remove(lastTp);
            }

            tpQueue.Add(new TP(pendingPlayer, player.GetNetworkPosition(), time, player));
            Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
            SendReply(pendingPlayer, string.Format(Messages["tpqueue"], player.displayName, TimeToString(time)));
            SendReply(player, String.Format(Messages["tpasuccess"], pendingPlayer.displayName, TimeToString(time)));
        }


        [ChatCommand("tpc")]
        void cmdChatTpc(BasePlayer player, string command, string[] args)
        {
            var tp = pendings.Find(p => p.Player == player);
            BasePlayer target = tp?.Player2;
            if (target != null)
            {
                pendings.Remove(tp);
                SendReply(player, Messages["tpc"]);
                SendReply(target, string.Format(Messages["tpctarget"], player.displayName));
                return;
            }
			
			if(CanSwimmingTP)
			{
				if (player.IsSwimming())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Swimming"]);
                    return;
                }
			}
			if(CanCraftTP)
			{
				if (player.inventory.crafting.queue.Count > CraftBlockTP)
				{
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Craft"]);
                    return;
                }
			}
			if(CanAliveTP)
			{
				if (!player.IsAlive())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Alive"]);
                    return;
                }
			}
			if(CanRadiationTP)
			{
				if (player.metabolism.radiation_poison.value > RadiationBlockTP)
                {
				    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Radiation"]);
                    return;
                }
			}
			if(CanBleedingTP)
			{
                if (player.metabolism.bleeding.value > BleedingBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Bleeding"]);
                    return;
                }
			}
			if(CanWoundedTP)
			{
                if (player.IsWounded())
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Wounded"]);
                    return;
                }
			}
			if(CanColdTP)
			{
			    if (player.metabolism.temperature.value < ColdBlockTP)
                {
                    Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                    SendReply(player, Messages["Cold"]);
                    return;
                }
			}
			
            foreach (var pend in pendings)
            {
                if (pend.Player2 == player)
                {
                    SendReply(player, Messages["tpc"]);
                    SendReply(pend.Player, string.Format(Messages["tpctarget"], player.displayName));
                    pendings.Remove(pend);
                    return;
                }
            }
            foreach (var tpQ in tpQueue)
            {
                if (tpQ.Player2 != null && tpQ.Player2 == player)
                {
                    SendReply(player, Messages["tpc"]);
                    SendReply(tpQ.Player, string.Format(Messages["tpctarget"], player.displayName));
                    tpQueue.Remove(tpQ);
                    return;
                }
                if (tpQ.Player == player)
                {
                    SendReply(player, Messages["tpc"]);
                    if (tpQ.Player2 != null)
                        SendReply(tpQ.Player2, string.Format(Messages["tpctarget"], player.displayName));
                    tpQueue.Remove(tpQ);
                    return;
                }
            }
        }

        #region ADMIN COMMANDS
        void SpectateFinish(BasePlayer player)
        {
            player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, false);
            player.SetPlayerFlag(BasePlayer.PlayerFlags.ThirdPersonViewmode, false);
            player.Command("camoffset", "0,1,0");
            player.SetParent(null);
            player.gameObject.SetLayerRecursive(17);
            player.metabolism.Reset();
            player.InvokeRepeating("InventoryUpdate", 1f, 0.1f * UnityEngine.Random.Range(0.99f, 1.01f));
            var heldEntity = player.GetActiveItem()?.GetHeldEntity() as HeldEntity;
            heldEntity?.SetHeld(true);

            // Teleport to original location after spectating
            if (lastPositions.ContainsKey(player.userID))
            {
                var lastPosition = lastPositions[player.userID];
                Teleport(player, new Vector3(lastPosition.x, lastPosition.y, lastPosition.z));
                lastPositions.Remove(player.userID);
            }

            player.StopSpectating();
            SendReply(player, "Слежка закончена!");
        }

        [ChatCommand("tpl")]
        void cmdChattpGo(BasePlayer player, string command, string[] args)
        {
            if (!player.IsAdmin && !PermissionService.HasPermission(player.userID, "teleportation.admin")) return;
            if (args == null || args.Length == 0)
            {
                Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                SendReply(player, Messages["tpArgsError"]);
                return;
            }
            switch (args[0])
            {
                default:
                    if (!tpsave.ContainsKey(player.userID))
                    {
                        Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                        SendReply(player, Messages["homesmissing"]);
                        return;
                    }
                    var nametp = args[0];
                    var playerTP = tpsave[player.userID];
                    if (!playerTP.ContainsKey(nametp))
                    {
                        Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
                        SendReply(player, Messages["homenotexist"]);
                        return;
                    }
                    var position = playerTP[nametp];
                    var ret = Interface.Call("CanTeleport", player) as string;
                    if (ret != null)
                    {
                        SendReply(player, ret);
                        return;
                    }
                    var lastTp = tpQueue.Find(p => p.Player == player);
                    if (lastTp != null)
                    {
                        tpQueue.Remove(lastTp);
                    }
                    tpQueue.Add(new TP(player, position, 0));
                    Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
                    SaveData();
                    return;
        
// ... [Code preview truncated due to length. Full source in attached file] ...

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