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

FREE EasyGather : 1.0.5 1.0.5

Нет прав для скачивания
C#:
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Rust;
using System.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using Oxide.Core;
using Rust.Ai;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins {
    [Info("EasyGather", "Qbis", "1.0.5")]
    public class EasyGather : RustPlugin {
#region [Vars]
        [PluginReference]
        private Plugin ZoneManager, CopyPaste, ImageLibrary;
        private static EasyGather plugin;
        private PlaceManager placeManager = null;
        private GatherManager gatherManager = null;
        private GameObject gatherGameObject = null;
        private Dictionary<string, List<SpawnData>> spawnData = new Dictionary<string, List<SpawnData>>();
        private Dictionary<ulong, PlayerData> playerData = new Dictionary<ulong, PlayerData>();
        private List<TextData> textData = new List<TextData>();
        private Vector3 BuildingSpawnPoint = new Vector3(1562f, 500f, 2161f);
        private string zoneID = "994422";
        private DefaultSpawns Spawns;
        private AddText addText = new AddText();
#region [Classes]
        public class PlayerData {
            public int gatherTime;
            public int lastTeleport;
            public Vector3 lastPosition;
            public int topPoints;
            public Dictionary<string, int> topAmount = new Dictionary<string, int>();
        }
        public class DefaultSpawns {
            public Vector3 TimerTextPosition;
            public Vector3 PlayerSpawnPosition;
        }
        public class SpawnData {
            public int spawnID;
            public Vector3 position;
            public Vector3 rotation;
        }
        public class TextData {
            public Vector3 position;
            public float dist;
            public string text;
        }
        public class AddText {
            public string text;
            public string dist;
            public string size;
        }
        public class SpawnSettings {
            public string langName;
            public string category;
        }
#endregion
        private Dictionary<string, SpawnSettings> spawnSettings = new Dictionary<string, SpawnSettings>() {
            ["assets/bundled/prefabs/autospawn/resource/ores/stone-ore.prefab"]
            = new SpawnSettings() {
                category = "Ore", langName = "Stone_Ore"
            }
            , ["assets/bundled/prefabs/autospawn/resource/ores/metal-ore.prefab"] = new SpawnSettings() {
                category = "Ore", langName = "Metal_Ore"
            }
            , ["assets/bundled/prefabs/autospawn/resource/ores/sulfur-ore.prefab"] = new SpawnSettings() {
                category = "Ore", langName = "Sulfur_Ore"
            }
            , ["assets/rust.ai/agents/stag/stag.prefab"] = new SpawnSettings() {
                category = "Animal", langName = "Stag"
            }
            , ["assets/rust.ai/agents/bear/bear.prefab"] = new SpawnSettings() {
                category = "Animal", langName = "Bear"
            }
            , ["assets/rust.ai/agents/boar/boar.prefab"] = new SpawnSettings() {
                category = "Animal", langName = "Boar"
            }
            , ["assets/rust.ai/agents/wolf/wolf.prefab"] = new SpawnSettings() {
                category = "Animal", langName = "Wolf"
            }
            , ["assets/rust.ai/agents/chicken/chicken.prefab"] = new SpawnSettings() {
                category = "Animal", langName = "Chicken"
            }
            , ["assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-1.prefab"] = new SpawnSettings() {
                category = "Barrel", langName = "Barrel_1"
            }
            , ["assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-2.prefab"] = new SpawnSettings() {
                category = "Barrel", langName = "Barrel_2"
            }
            , ["assets/bundled/prefabs/radtown/loot_barrel_1.prefab"] = new SpawnSettings() {
                category = "Barrel", langName = "Barrel_3"
            }
            , ["assets/bundled/prefabs/radtown/loot_barrel_2.prefab"] = new SpawnSettings() {
                category = "Barrel", langName = "Barrel_4"
            }
            , ["assets/bundled/prefabs/radtown/oil_barrel.prefab"] = new SpawnSettings() {
                category = "Barrel", langName = "Barrel_Oil"
            }
            , ["assets/bundled/prefabs/radtown/crate_elite.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Elite"
            }
            , ["assets/bundled/prefabs/radtown/crate_normal.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Normal"
            }
            , ["assets/bundled/prefabs/radtown/crate_normal_2.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Normal_2"
            }
            , ["assets/bundled/prefabs/radtown/crate_tools.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Tools"
            }
            , ["assets/bundled/prefabs/radtown/underwater_labs/crate_ammunition.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Ammun_u"
            }
            , ["assets/bundled/prefabs/radtown/underwater_labs/crate_tools.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Tools_u"
            }
            , ["assets/bundled/prefabs/radtown/underwater_labs/crate_elite.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Elite_u"
            }
            , ["assets/bundled/prefabs/radtown/underwater_labs/crate_normal.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Normal_u"
            }
            , ["assets/bundled/prefabs/radtown/underwater_labs/crate_normal_2.prefab"] = new SpawnSettings() {
                category = "Crate", langName = "Crate_Noram_2_u"
            }
        }
        ;
#endregion
#region [Config]
        private PluginConfig config;
        protected override void LoadDefaultConfig() {
            config = PluginConfig.DefaultConfig();
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            config = Config.ReadObject<PluginConfig>();
            if (config.PluginVersion < Version) UpdateConfigValues();
            Config.WriteObject(config, true);
        }
        private void UpdateConfigValues() {
            PluginConfig baseConfig = PluginConfig.DefaultConfig();
            if (config.PluginVersion < Version) {
                PrintWarning("Plugin update detected! Checking config values...");
                if (Version == new VersionNumber(1, 0, 3)) {
                    config.commands = new List<string>() {
                        "kit"
                    }
                    ;
                    config.main.removeDroppedItems = 10;
                }
                if(Version == new VersionNumber(1, 0, 4)) {
                    config.main.penaltyType = 1;
                }
                config.PluginVersion = Version;
                PrintWarning("Config checked completed!");
            }
            config.PluginVersion = Version;
        }
        protected override void SaveConfig() {
            Config.WriteObject(config);
        }
        private class PluginConfig {
            [JsonProperty("Общие настройки")]
            public MainSettings main;
            [JsonProperty("Настройки тикетов")]
            public List<TicketSettings> tickets;
            [JsonProperty("Настройки респавна объектов (в секундах)")]
            public Dictionary<string, int> spawn;
            [JsonProperty("Настройка очков для топа")]
            public Dictionary<string, int> top;
            [JsonProperty("Запрещеные предметы (shortName)")]
            public List<string> blockedItems;
            [JsonProperty("Запрещенные комманды")]
            public List<string> commands;
            [JsonProperty("Config version")]
            public VersionNumber PluginVersion = new VersionNumber();
            public static PluginConfig DefaultConfig() {
                return new PluginConfig() {
                    main = new MainSettings() {
                        fileName = "eg_room_v1", imgUrl = "https://i.imgur.com/k9HzQLM.jpg", zoneSize = new Vector3(150f, 150f, 150f), maxPlayers = 10, removeCrateAfterLooting = 4, teleportCoolDown = 600, isTopActive = true, autoWipe = true, shortName = "glue", OnlyOne = true, removeDroppedItems = 10, penaltyType = 1
                    }
                    , tickets = new List<TicketSettings> {
                        new TicketSettings() {
                            skinID = 2852472024, customName = "Ticket 60", imageUrl = "https://i.imgur.com/BHUj7e3.png", time = 60, dropCrates = new Dictionary<string, int>() {
                                ["crate_elite"]
                                = 30, ["crate_normal"] = 10,
                            }
                        }
                        , new TicketSettings() {
                            skinID = 2852471535, customName = "Ticket 30", imageUrl = "https://i.imgur.com/VusjY8D.png", time = 30, dropCrates = new Dictionary<string, int>() {
                                ["crate_normal"]
                                = 40
                            }
                        }
                        , new TicketSettings() {
                            skinID = 2852471429, customName = "Ticket 10", imageUrl = "https://i.imgur.com/A1dN4N0.png", time = 10, dropCrates = new Dictionary<string, int>() {
                                ["crate_normal_2"]
                                = 20, ["crate_tools"] = 20
                            }
                        }
                        ,
                    }
                    , spawn = new Dictionary<string, int>() {
                        ["assets/bundled/prefabs/autospawn/resource/ores/stone-ore.prefab"]
                        = 120, ["assets/bundled/prefabs/autospawn/resource/ores/metal-ore.prefab"] = 240, ["assets/bundled/prefabs/autospawn/resource/ores/sulfur-ore.prefab"] = 360, ["assets/rust.ai/agents/stag/stag.prefab"] = 120, ["assets/rust.ai/agents/bear/bear.prefab"] = 360, ["assets/rust.ai/agents/boar/boar.prefab"] = 360, ["assets/rust.ai/agents/wolf/wolf.prefab"] = 240, ["assets/rust.ai/agents/chicken/chicken.prefab"] = 60, ["assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-1.prefab"] = 120, ["assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-2.prefab"] = 160, ["assets/bundled/prefabs/radtown/loot_barrel_1.prefab"] = 120, ["assets/bundled/prefabs/radtown/loot_barrel_2.prefab"] = 160, ["assets/bundled/prefabs/radtown/oil_barrel.prefab"] = 140, ["assets/bundled/prefabs/radtown/crate_elite.prefab"] = 480, ["assets/bundled/prefabs/radtown/crate_normal.prefab"] = 360, ["assets/bundled/prefabs/radtown/crate_normal_2.prefab"] = 360, ["assets/bundled/prefabs/radtown/crate_tools.prefab"] = 240, ["assets/bundled/prefabs/radtown/underwater_labs/crate_ammunition.prefab"] = 240, ["assets/bundled/prefabs/radtown/underwater_labs/crate_tools.prefab"] = 240, ["assets/bundled/prefabs/radtown/underwater_labs/crate_elite.prefab"] = 480, ["assets/bundled/prefabs/radtown/underwater_labs/crate_normal.prefab"] = 360, ["assets/bundled/prefabs/radtown/underwater_labs/crate_normal_2.prefab"] = 240
                    }
                    , top = new Dictionary<string, int>() {
                        ["assets/bundled/prefabs/autospawn/resource/ores/stone-ore.prefab"]
                        = 1, ["assets/bundled/prefabs/autospawn/resource/ores/metal-ore.prefab"] = 1, ["assets/bundled/prefabs/autospawn/resource/ores/sulfur-ore.prefab"] = 1, ["assets/rust.ai/agents/stag/stag.prefab"] = 1, ["assets/rust.ai/agents/bear/bear.prefab"] = 1, ["assets/rust.ai/agents/boar/boar.prefab"] = 1, ["assets/rust.ai/agents/wolf/wolf.prefab"] = 1, ["assets/rust.ai/agents/chicken/chicken.prefab"] = 1, ["assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-1.prefab"] = 1, ["assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-2.prefab"] = 1, ["assets/bundled/prefabs/radtown/loot_barrel_1.prefab"] = 1, ["assets/bundled/prefabs/radtown/loot_barrel_2.prefab"] = 1, ["assets/bundled/prefabs/radtown/oil_barrel.prefab"] = 1, ["assets/bundled/prefabs/radtown/crate_elite.prefab"] = 4, ["assets/bundled/prefabs/radtown/crate_normal.prefab"] = 3, ["assets/bundled/prefabs/radtown/crate_normal_2.prefab"] = 2, ["assets/bundled/prefabs/radtown/crate_tools.prefab"] = 2, ["assets/bundled/prefabs/radtown/underwater_labs/crate_ammunition.prefab"] = 2, ["assets/bundled/prefabs/radtown/underwater_labs/crate_tools.prefab"] = 2, ["assets/bundled/prefabs/radtown/underwater_labs/crate_elite.prefab"] = 4, ["assets/bundled/prefabs/radtown/underwater_labs/crate_normal.prefab"] = 3, ["assets/bundled/prefabs/radtown/underwater_labs/crate_normal_2.prefab"] = 2
                    }
                    , blockedItems = new List<string>() {
                        "syringe.medical", "antiradpills"
                    }
                    , commands = new List<string>() {
                        "kit"
                    }
                    , PluginVersion = new VersionNumber()
                }
                ;
            }
        }
        public class MainSettings {
            [JsonProperty("Через сколько секунд удалять залутаный ящик")]
            public int removeCrateAfterLooting;
            [JsonProperty("Откат на телепорт")]
            public int teleportCoolDown;
            [JsonProperty("Максимальное количество добывающих")]
            public int maxPlayers;
            [JsonProperty("Включить топ?")]
            public bool isTopActive;
            [JsonProperty("Авто очистка данных игроков вайпе (Время игроков и Топ)")]
            public bool autoWipe;
            [JsonProperty("Название файла (copypaste)")]
            public string fileName;
            [JsonProperty("Фото для пользовательского интерфейса")]
            public string imgUrl;
            [JsonProperty("Размер зоны")]
            public Vector3 zoneSize;
            [JsonProperty("Shortname для тикетов")]
            public string shortName;
            [JsonProperty("Только 1 тикет в ящике")]
            public bool OnlyOne;
            [JsonProperty("Через сколько секунд удалять выброщенные предметы")]
            public int removeDroppedItems;
            [JsonProperty("Наказание за нахождение в зоне после окончания времени фарма (1 - радиация + урон, 2 - мгновенная смерть)")]
            public int penaltyType;
        }
        public class TicketSettings {
            [JsonProperty("Скин айди тикета")]
            public ulong skinID;
            [JsonProperty("Имя тикета")]
            public string customName;
            [JsonProperty("Ссылка на картинку")]
            public string imageUrl;
            [JsonProperty("Сколько тикет дает времени на фарм (в секундах)")]
            public int time;
            [JsonProperty("Ящики из которых может выпасть тикет с шансом")]
            public Dictionary<string, int> dropCrates;
        }
#endregion
#region [Localization⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠]
        protected override void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                ["Text_Succes"]
                = "Text added successfully", ["Stone_Ore"] = "Stone Ore", ["Metal_Ore"] = "Metal Ore", ["Sulfur_Ore"] = "Sulfur Ore", ["Stag"] = "Stag", ["Bear"] = "Bear", ["Boar"] = "Boar", ["Wolf"] = "Wolf", ["Chicken"] = "Chicken", ["Barrel_1"] = "Barrel 1 (Road)", ["Barrel_2"] = "Barrel 2 (Road)", ["Barrel_3"] = "Barrel 1 (RT)", ["Barrel_4"] = "Barrel 2 (RT)", ["Barrel_Oil"] = "Oil Barrel", ["Crate_Elite"] = "Crate Elite", ["Crate_Normal"] = "Crate Millitary", ["Crate_Normal_2"] = "Crate Basic", ["Crate_Tools"] = "Crate Tools", ["Crate_Ammun_u"] = "Crate Ammunition (Labs)", ["Crate_Tools_u"] = "Crate Tools (Labs)", ["Crate_Elite_u"] = "Crate Elite (Labs)", ["Crate_Normal_u"] = "Crate Millitary (Labs)", ["Crate_Noram_2_u"] = "Crate Basic (Labs)", ["TimerText1"] = "Time for gathering\n{0}h.{1}m.{2}s.", ["TimerText2"] = "<color=red>You don't have gather time\nLeave this location, otherwise you will die!</color>", ["UI_Admin_Header"] = "EG Admin Panel | Building {0} | {1}", ["UI_Admin_Main"] = "Main", ["UI_Admin_Spawns"] = "Loot Spawns", ["UI_Admin_AddSpawn"] = "Add Spawns", ["UI_Admin_EditSpawn"] = "Edit Spawns", ["UI_Admin_RefreshSpawn"] = "Refresh Spawns", ["UI_Admin_RemoveSpawn"] = "Remove All Spawns", ["UI_Admin_Texts"] = "3D Texts", ["UI_Admin_AddText"] = "Add Text", ["UI_Admin_EditText"] = "All Texts", ["UI_Admin_SetTimerText"] = "Set Timer Text (Your position)", ["UI_Admin_RemoveText"] = "Remove All Texts", ["UI_Admin_Settings"] = "Settings", ["UI_Admin_Name"] = "Name", ["UI_Admin_RespawnTime"] = "Respawn Time (seconds)", ["UI_Admin_RemoveSpawnID"] = "Remove Spawn (ID)", ["UI_Admin_ShowSpawn"] = "Show spawns", ["UI_Admin_WriteText"] = "Write the text", ["UI_Admin_Size"] = "Size", ["UI_Admin_Radius"] = "Show Radius", ["UI_Admin_SettingsChangeName"] = "Change building name..", ["UI_Admin_SettingsSetSpawn"] = "Player Spawn (Your position)", ["UI_Admin_SettingsFullUpdate"] = "Full Building Update", ["UI_Admin_Ores"] = "Ores", ["UI_Admin_Animals"] = "Animals", ["UI_Admin_Crates"] = "Crates", ["UI_Admin_Barrels"] = "Barrels", ["UI_Admin_Teleport"] = "Teleport", ["UI_Admin_FreeTime"] = "Free Time", ["UI_Admin_Notice_RemoveSpawn"] = "Removed all spawns successfully", ["UI_Admin_Notice_RemoveSpawn_2"] = "Removed spawns successfully", ["UI_Admin_Notice_RefreshSpawn"] = "Refreshed all spawns successfully", ["UI_Admin_Notice_SetTimerText"] = "Set timer position successfully", ["UI_Admin_Notice_RemoveText"] = "Removed all texts successfully", ["UI_Admin_Notice_SettingsSetSpawn"] = "Set players spawn position successfully ", ["UI_Admin_Notice_SettingsFullUpdate"] = "Update Building successfully", ["UI_Admin_Notice_AlreadyUse"] = "Someone alreday use it", ["UI_Admin_Incorrect_ID"] = "Incorrect ID", ["UI_Admin_Notice_OnlyChar"] = "ID can be only numbers", ["UI_Admin_Notice_Remove_NotFound"] = "ID not found", ["UI_Admin_Notice_Remove_Suc"] = "Spawn removed successfully", ["UI_Admin_Notice_FreeTime"] = "You got free 1 hour", ["UI_Player_Time"] = "{0}h {1}m {2}s", ["UI_Player_Have"] = "You have : {0}", ["UI_Player_Change"] = "Change", ["UI_Player_Leave"] = "Leave", ["UI_Player_Teleport"] = "Teleport", ["UI_Player_Players"] = "Players {0} | {1}", ["UI_Player_FarmTime"] = "You have : {0}h {1}m {2}s", ["UI_Player_TopNotActive"] = "Top is off", ["UI_Player_Notice_Already"] = "You are already teleported", ["UI_Player_Notice_NoTime"] = "You haven't time", ["UI_Player_Notice_BlockedItem"] = "You have blocked item to teleport\n<color=red>{0}</color>", ["UI_Player_Notice_CoolDown"] = "You can teleport again after\n{0}h {1}m {2}s", ["UI_Player_Notice_NotChanged"] = "<color=red>You haven't this ticket</color>", ["UI_Player_Notice_NoGather"] = "You are not in gather room!", ["UI_Player_Notice_NoReturnPos"] = "You haven't return position :("
            }
            , this);
            lang.RegisterMessages(new Dictionary<string, string> {
                ["Text_Succes"]
                = "Текст добавлен успешно", ["Stone_Ore"] = "Каменная руда", ["Metal_Ore"] = "Металлическая руда", ["Sulfur_Ore"] = "Серная руда", ["Stag"] = "Олень", ["Bear"] = "Медведь", ["Boar"] = "Кабан", ["Wolf"] = "Волк", ["Chicken"] = "Курица", ["Barrel_1"] = "Бочка 1 (Дорога)", ["Barrel_2"] = "Бочка 2 (Дорога)", ["Barrel_3"] = "Бочка 1 (РТ)", ["Barrel_4"] = "Бочка 2 (РТ)", ["Barrel_Oil"] = "Бочка с топливом", ["Crate_Elite"] = "Элитный ящик", ["Crate_Normal"] = "Военный яшик", ["Crate_Normal_2"] = "Обычный ящик", ["Crate_Tools"] = "Ящик с инструментами", ["Crate_Ammun_u"] = "Ящик с амуницией (Лаба)", ["Crate_Tools_u"] = "Ящик с инструментами (Лаба)", ["Crate_Elite_u"] = "Элитный ящик (Лаба)", ["Crate_Normal_u"] = "Военный ящик (Лаба)", ["Crate_Noram_2_u"] = "Обычный ящик (Лаба)", ["TimerText1"] = "У вас осталось\n{0}ч.{1}м.{2}с.", ["TimerText2"] = "<color=red>У вас нет времени на добычу!\nПокиньте ее или вы умрете!</color>", ["UI_Admin_Header"] = "EG Админ панель | Строение {0} | {1}", ["UI_Admin_Main"] = "Главная", ["UI_Admin_Spawns"] = "Спавны лута", ["UI_Admin_AddSpawn"] = "Добавить спавны", ["UI_Admin_EditSpawn"] = "Редактировать спавны", ["UI_Admin_RefreshSpawn"] = "Обновить спавны", ["UI_Admin_RemoveSpawn"] = "Удалить все спавны", ["UI_Admin_Texts"] = "3D Тексты", ["UI_Admin_AddText"] = "Добавить текст", ["UI_Admin_EditText"] = "Все тексты", ["UI_Admin_SetTimerText"] = "Уст.таймер (Ваша позиция)", ["UI_Admin_RemoveText"] = "Удалить все тексты", ["UI_Admin_Settings"] = "Настройки", ["UI_Admin_Name"] = "Имя", ["UI_Admin_WriteText"] = "Напишите текст", ["UI_Admin_Size"] = "Размер", ["UI_Admin_Radius"] = "Радиус показа", ["UI_Admin_RespawnTime"] = "Время спавна (в секундах)", ["UI_Admin_RemoveSpawnID"] = "Удалить спавн (ID)", ["UI_Admin_ShowSpawn"] = "Показать спавны", ["UI_Admin_SettingsChangeName"] = "Сменить имя постройки...", ["UI_Admin_SettingsSetSpawn"] = "Спавн (Ваша позиция)", ["UI_Admin_SettingsFullUpdate"] = "Полное обновление постр.", ["UI_Admin_Ores"] = "Руды", ["UI_Admin_Animals"] = "Животные", ["UI_Admin_Crates"] = "Ящики", ["UI_Admin_Barrels"] = "Бочки", ["UI_Admin_Teleport"] = "Телепорт", ["UI_Admin_FreeTime"] = "Взять время", ["UI_Admin_Notice_RemoveSpawn"] = "Все спавны лута удалены", ["UI_Admin_Notice_RemoveSpawn_2"] = "Все спавны удалены", ["UI_Admin_Notice_RefreshSpawn"] = "Все спавны лута обновлены", ["UI_Admin_Notice_SetTimerText"] = "Новая точка для таймера установлена", ["UI_Admin_Notice_RemoveText"] = "Все тексты удалены", ["UI_Admin_Notice_SettingsSetSpawn"] = "Новая точка спавна игроков установлена", ["UI_Admin_Notice_SettingsFullUpdate"] = "Вы полностью обновили постройку", ["UI_Admin_Notice_AlreadyUse"] = "Кто-то уже раставляет спавны!", ["UI_Admin_Incorrect_ID"] = "Неверный ID", ["UI_Admin_Notice_OnlyChar"] = "В ID могут быть только цифры", ["UI_Admin_Notice_Remove_NotFound"] = "ID не найден", ["UI_Admin_Notice_Remove_Suc"] = "Спавн успешно удален", ["UI_Admin_Notice_FreeTime"] = "Вы получили 1 бесплатный час", ["UI_Player_Time"] = "{0}ч {1}м {2}с", ["UI_Player_Have"] = "У тебя есть : {0}", ["UI_Player_Change"] = "Поменять", ["UI_Player_Leave"] = "Покинуть", ["UI_Player_Teleport"] = "Войти", ["UI_Player_Players"] = "Игроков {0} | {1}", ["UI_Player_FarmTime"] = "Фарм время : {0}ч {1}м {2}с", ["UI_Player_TopNotActive"] = "Топ выключен", ["UI_Player_Notice_Already"] = "Вы уже телепортированы", ["UI_Player_Notice_NoTime"] = "У Вас нет фарм времени", ["UI_Player_Notice_BlockedItem"] = "Нельзя телепортироваться с \n<color=red>{0}</color>", ["UI_Player_Notice_CoolDown"] = "Телепорт будет доступен через\n{0}ч {1}м {2}с", ["UI_Player_Notice_NotChanged"] = "<color=red>У вас нет этого тикета</color>", ["UI_Player_Notice_NoGather"] = "Вы не в комнате добычи", ["UI_Player_Notice_NoReturnPos"] = "К сожалению у Вас нет точки возвращения :("
            }
            , this, "ru");
        }
        string GetMsg(string key, BasePlayer player = null) => lang.GetMessage(key, this, player?.UserIDString);
        string GetMsg(string key) => lang.GetMessage(key, this);
#endregion
#region [Oxide Hooks]
        void OnEntityEnterZone(string ZoneID, BaseEntity entity) {
            if (ZoneID != zoneID) return;
            if (!(entity is ItemPickup) && entity is DroppedItem) {
                DroppedItem item = entity as DroppedItem;
                if (item != null && !item.IsDestroyed) {
                    item.CancelInvoke(item.IdleDestroy);
                    item.Invoke(item.IdleDestroy, config.main.removeDroppedItems);
                }
            }
        }
        private object OnPlayerCommand(BasePlayer player, string command, string[] args) {
            if (player == null || string.IsNullOrEmpty(command)) return null;
            if (!config.commands.Contains(command)) return null;
            if (gatherManager.players.Contains(player)) return false;
            return null;
        }
        private object OnServerCommand(ConsoleSystem.Arg arg) {
            if (arg == null) return null;
            var connection = arg.Connection;
            if (connection == null || string.IsNullOrEmpty(arg.cmd.Name)) return null;
            var player = arg.Player();
            if (player == null) return null;
            if (!config.commands.Contains(arg.cmd.Name.ToLower())) return null;
            if(gatherManager.players.Contains(player)) return false;
            return null;
        }
        private void Init() {
            plugin = this;
            AddCovalenceCommand("gtic", "GiveTicket", "easygather.give");
        }
        private void Unload() {
            config = null;
            SavePlayerData();
            UnityEngine.Object.Destroy(placeManager);
            UnityEngine.Object.Destroy(gatherManager);
            UnityEngine.Object.Destroy(gatherGameObject);
        }
        private void OnServerInitialized() {
            LoadSpawnData();
            LoadTextData();
            LoadPlayerData();
            UpdateOrSpawnRoom();
            Unsubscribe(nameof(CanLootEntity));
            ImageLibrary?.Call("AddImage", config.main.imgUrl, "mainImage");
            foreach (var ticket in config.tickets) {
                ImageLibrary?.Call("AddImage", ticket.imageUrl, ticket.skinID.ToString());
            }
        }
        private void OnNewSave() {
            if (config.main.autoWipe) {
                playerData.Clear();
                SavePlayerData();
            }
        }
        private void OnServerSave() {
            SavePlayerData();
        }
        private object CanLootEntity(BasePlayer player, LootContainer container) {
            if (placeManager != null && placeManager.Player == player) return false;
            return null;
        }
        private void OnEntityDeath(BaseEntity ent, HitInfo info) {
            if (ent == null) return;
            if (gatherManager == null) return;
            if (!gatherManager.loot.ContainsKey(ent)) return;
            gatherManager.UpdateSpawn(ent);
            if (info == null || info.Initiator.ToPlayer() == null) return;
            var player = info.Initiator.ToPlayer();
            if (playerData.ContainsKey(player.userID)) {
                if (playerData[player.userID].gatherTime >= 0) {
                    if (!config.main.isTopActive) return;
                    if (!config.top.ContainsKey(ent.PrefabName)) return;
                    if (!playerData[player.userID].topAmount.ContainsKey(ent.PrefabName)) playerData[player.userID].topAmount.Add(ent.PrefabName, 1);
                    else playerData[player.userID].topAmount[ent.PrefabName]++;
                    playerData[player.userID].topPoints += config.top[ent.PrefabName];
                    return;
                }
                else {
                    player.metabolism.radiation_poison.value += 100;
                    player.health -= 50;
                }
            }
            else {
                player.metabolism.radiation_poison.value += 100;
                player.health -= 50;
            }
        }
        private void OnEntityTakeDamage(BasePlayer entity, HitInfo info) {
            if (entity == null || info.damageTypes == null || info.InitiatorPlayer == null) return;
            if (entity.ToPlayer() == null) {
                if (entity.PrefabName.Contains("barrel")) return;
            }
            BasePlayer player = info.InitiatorPlayer;
            if (playerData.ContainsKey(player.userID)) {
                if (Vector3.Distance(player.transform.position, BuildingSpawnPoint) < 100) info.damageTypes.ScaleAll(0f);
            }
        }
        private void OnLootEntityEnd(BasePlayer player, LootContainer ent) {
            if (ent == null) return;
            if (gatherManager == null) return;
            if (!gatherManager.loot.ContainsKey(ent)) return;
            gatherManager.UpdateSpawn(ent);
            timer.Once(config.main.removeCrateAfterLooting, () => {
                if (ent != null) ent.Kill();
            }
            );
            if (playerData.ContainsKey(player.userID)) {
                if (playerData[player.userID].gatherTime >= 0) return;
                if (playerData[player.userID].gatherTime >= 0) {
                    if (!config.main.isTopActive) return;
                    if (!config.top.ContainsKey(ent.PrefabName)) return;
                    if (!playerData[player.userID].topAmount.ContainsKey(ent.PrefabName)) playerData[player.userID].topAmount.Add(ent.PrefabName, 1);
                    else playerData[player.userID].topAmount[ent.PrefabName]++;
                    playerData[player.userID].topPoints += config.top[ent.PrefabName];
                    return;
                }
                else {
                    player.metabolism.radiation_poison.value += 100;
                    player.health -= 50;
                }
            }
            else {
                player.metabolism.radiation_poison.value += 100;
                player.health -= 50;
            }
        }
        private object OnLootSpawn(LootContainer container) {
            if (container == null || container.inventory == null) return null;
            if (gatherManager == null) return null;
            if (gatherManager.loot.ContainsKey(container)) return null;
            NextTick(() => {
                if (container == null) return;
                var tickets = config.tickets.Where(b => b.dropCrates.ContainsKey(container.ShortPrefabName)).ToList();
                foreach (var ticket in tickets) {
                    var rnd = UnityEngine.Random.Range(1, 101);
                    if (!ticket.dropCrates.ContainsKey(container.ShortPrefabName)) continue;
                    if (rnd > ticket.dropCrates[container.ShortPrefabName]) continue;
                    container.inventory.capacity++;
                    var item = ItemManager.CreateByName(config.main.shortName, 1, ticket.skinID);
                    item.name = ticket.customName;
                    item.MoveToContainer(container.inventory);
                    if (config.main.OnlyOne) return;
                }
            }
            );
            return null;
        }
#endregion
#region [Function]
        private void UpdateOrSpawnRoom(bool foolUpdate = false) {
            Vector3 zoneLoc = (Vector3)ZoneManager?.Call("GetZoneLocation", zoneID);
            if (zoneLoc != BuildingSpawnPoint) {
                string[] zoneOptions = new string[] {
                    "size", $"{config.main.zoneSize.x} {config.main.zoneSize.y} {config.main.zoneSize.z}", "nobuild", "true", "nodecay", "true", "noentitypickup", "true", "undestr", "true", "nosignupdates", "true", "notp", "true", "pvpgod", "true"
                }
                ;
                ZoneManager?.Call("CreateOrUpdateZone", zoneID, zoneOptions, BuildingSpawnPoint);
            }
            List<BaseEntity> ents = new List<BaseEntity>();
            Vis.Entities(BuildingSpawnPoint, 150f, ents);
            bool needRemove = false;
            string[] pasteOptions = new string[] {
                "autoheight", "false", "stability", "false", "auth", "false", "entityowner", "false"
            }
            ;
            if (ents.Count > 0 && foolUpdate) {
                foreach (var ent in ents) if (ent != null && !(ent is BasePlayer)) ent.Kill();
                LoadSpawnData();
                LoadTextData();
                timer.Once(5f, () => {
                    CopyPaste?.Call("TryPasteFromVector3", BuildingSpawnPoint, 0f, config.main.fileName, pasteOptions);
                }
                );
            }
            else if (ents.Count <= 0) {
                CopyPaste?.Call("TryPasteFromVector3", BuildingSpawnPoint, 0f, config.main.fileName, pasteOptions);
                needRemove = true;
            }
            else {
                needRemove = true;
            }
            if(gatherManager != null || gatherGameObject != null) {
                UnityEngine.Object.Destroy(gatherManager);
                UnityEngine.Object.Destroy(gatherGameObject);
            }
            GameObject obj = new GameObject();
            gatherManager = obj.AddComponent<GatherManager>();
            UpdateAllSpawns(needRemove);
        }
        private void UpdateAllSpawns(bool needRemoveEnts = true) {
            if (needRemoveEnts) {
                List<BaseEntity> ents = new List<BaseEntity>();
                Vis.Entities(BuildingSpawnPoint, 150f, ents);
                foreach (var ent in ents) {
                    if (ent != null) if (spawnSettings.ContainsKey(ent.PrefabName)) ent.Kill();
                }
            }
            gatherManager.spawns.Clear();
            gatherManager.loot.Clear();
            foreach (var spawn in spawnData) {
                if (!config.spawn.ContainsKey(spawn.Key)) continue;
                if (!spawnSettings.ContainsKey(spawn.Key)) continue;
                foreach (var data in spawn.Value) {
                    if (gatherManager.spawns.ContainsKey(data.spawnID)) continue;
                    var loot = GameManager.server.CreateEntity(spawn.Key, BuildingSpawnPoint + data.position);
                    loot.transform.eulerAngles = data.rotation;
                    loot.enableSaving = false;
                    loot.Spawn();
                    if (loot as BaseNpc) plugin.RemoveAi(loot as BaseNpc);
                    gatherManager.spawns.Add(data.spawnID, new GatherManager.spawn() {
                        prefab = spawn.Key, position = data.position, rotation = data.rotation, spawnTime = -1
                    }
                    );
                    gatherManager.loot.Add(loot, data.spawnID);
                }
            }
        }
        private void RemoveAllSpawns() {
            spawnData.Clear();
            foreach (var ent in gatherManager.loot) if (ent.Key != null) ent.Key.Kill();
            gatherManager.loot.Clear();
            gatherManager.spawns.Clear();
            SaveSpawnData();
        }
        private void RemoveAllTexts() {
            textData.Clear();
            SaveTextData();
        }
        private void AddNewText() {
            if (placeManager == null) {
                PrintError("PlaceManager null");
                return;
            }
            textData.Add(new TextData() {
                dist = placeManager.Dist, position = placeManager.direct - BuildingSpawnPoint, text = placeManager.Text
            }
            );
            DrawText(placeManager.Player, 2f, Color.white, placeManager.direct, GetMsg("Text_Succes", placeManager.Player));
            SaveTextData();
            placeManager.DestroyComp();
        }
        private void AddNewSpawn() {
            if (placeManager == null) {
                PrintError("PlaceManager null");
                return;
            }
            if (!spawnSettings.ContainsKey(placeManager.ent.PrefabName)) {
                PrintError($"This prefab {placeManager.ent.prefabID} not in data!");
                return;
            }
            var ent = placeManager.ent;
            if (!spawnData.ContainsKey(ent.PrefabName)) spawnData.Add(ent.PrefabName, new List<SpawnData>());
            SpawnData data = new SpawnData();
            data.position = ent.transform.position - BuildingSpawnPoint;
            data.rotation = ent.transform.eulerAngles;
            data.spawnID = UnityEngine.Random.Range(1000, 9999);
            spawnData[ent.PrefabName].Add(data);
            DrawBox(placeManager.Player, 10f, Color.green, ent.transform.position);
            DrawText(placeManager.Player, 10f, Color.white, ent.transform.position, $"{GetMsg(spawnSettings[ent.PrefabName].langName, placeManager.Player)} : #{data.spawnID}");
            SaveSpawnData();
        }
        private void CreatePlaceManager(BasePlayer player, string prefab) {
            if(placeManager != null) {
                Notice(player, "UI_Admin_Notice_AlreadyUse");
                return;
            }
            CuiHelper.DestroyUi(player, "EasyGatherAdmin");
            placeManager = player.gameObject.AddComponent<PlaceManager>();
            placeManager.Init(player, prefab, Convert.ToInt32(addText.dist), Convert.ToInt32(addText.size), addText.text);
        }
        private void RemoveAi(BaseNpc npc) {
            if (npc == null) {
                return;
            }
            npc.CancelInvoke(npc.TickAi);
            var script1 = npc.GetComponent<AiManagedAgent>();
            UnityEngine.Object.Destroy(script1);
            var script2 = npc.GetComponent<AnimalBrain>();
            UnityEngine.Object.Destroy(script2);
            var script3 = npc.GetComponent<NPCNavigator>();
            UnityEngine.Object.Destroy(script3);
            var obj = npc as BaseAnimalNPC;
            if (obj != null) {
                AIThinkManager.RemoveAnimal(obj);
            }
        }
        private void ShowSpawns(BasePlayer player, string prefab) {
            foreach(var spawn in spawnData[prefab]) {
                DrawBox(player, 15f, Color.green, BuildingSpawnPoint + spawn.position);
                DrawText(player, 15f, Color.white, BuildingSpawnPoint + spawn.position, $"{GetMsg(spawnSettings[prefab].langName, player)} : #{spawn.spawnID}");
            }
        }
        private void RemoveSpawns(BasePlayer player, string prefab) {
            spawnData[prefab].Clear();
            SaveSpawnData();
        }
        private string RemoveSpawnID(BasePlayer player, string prefab, string id) {
            if (string.IsNullOrEmpty(id)) return "UI_Admin_Notice_Incorrect_ID";
            foreach (var c in id) if (!char.IsNumber(c)) return "UI_Admin_Notice_OnlyChar";
            var spawn = spawnData[prefab].Where(s => s.spawnID == Convert.ToInt32(id)).FirstOrDefault();
            if (spawn == null) return "UI_Admin_Notice_Remove_NotFound";
            spawnData[prefab].Remove(spawn);
            SaveSpawnData();
            return "UI_Admin_Notice_Remove_Suc";
        }
        private int HaveTickets(BasePlayer player, ulong SkinID) {
            int amount = 0;
            foreach (var item in player.inventory.containerMain.itemList) {
                if (item.skin == SkinID) amount += item.amount;
            }
            foreach (var item in player.inventory.containerBelt.itemList) {
                if (item.skin == SkinID) amount += item.amount;
            }
            return amount;
        }
        private bool removeTicket(BasePlayer player, ulong SkinID) {
            for (int i = 0; i < 24; i++) {
                var item = player.inventory.containerMain.GetSlot(i);
                if (item == null) continue;
                if (item.skin == SkinID) {
                    item.UseItem(1);
                    return true;
                }
            }
            for (int i = 0; i < 6; i++) {
                var item = player.inventory.containerBelt.GetSlot(i);
                if (item == null) continue;
                if (item.skin == SkinID) {
                    item.UseItem(1);
                    return true;
                }
            }
            return false;
        }
        private void DrawText(BasePlayer player, float time, Color color, Vector3 pos, string text) {
            player.SendConsoleCommand("ddraw.text", time, color, pos, text);
        }
        private void DrawBox(BasePlayer player, float time, Color color, Vector3 pos, float size = 1f) {
            player.SendConsoleCommand("ddraw.box", time, color, pos, size);
        }
        private void DrawSphere(BasePlayer player, float time, Color color, Vector3 pos, float size = 1f) {
            player.SendConsoleCommand("ddraw.sphere", time, Color.blue, pos, size);
        }
        void TeleportPlayerToPos(BasePlayer player, Vector3 xyz) {
            player.UpdateActiveItem(default(ItemId));
            player.EnsureDismounted();
            player.Server_CancelGesture();
            if (player.HasParent()) {
                player.SetParent(null, true, true);
            }
            player.RemoveFromTriggers();
            if (player.IsConnected) {
                player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
                player.ClientRPCPlayer(null, player, "StartLoading");
                player.SendEntityUpdate();
                player.EndLooting();
                if (!player.IsSleeping()) {
                    Interface.CallHook("OnPlayerSleep", player);
                    player.SetPlayerFlag(BasePlayer.PlayerFlags.Sleeping, true);
                    player.sleepStartTime = Time.time;
                    BasePlayer.sleepingPlayerList.Add(player);
                    player.CancelInvoke("InventoryUpdate");
                    player.CancelInvoke("TeamUpdate");
                }
                player.Teleport(xyz);
                player.SendFullSnapshot();
                player.UpdateNetworkGroup();
                player.SendNetworkUpdateImmediate(false);
            }
        }
        private void GivePlayerTicket(IPlayer sender, BasePlayer player, ulong skinID) {
            var ticket = config.tickets.Where(t => t.skinID == skinID).FirstOrDefault();
            if (ticket == null) {
                sender.Message($"Ticket with skin {skinID} not found");
                return;
            }
            var newitem = ItemManager.CreateByName(config.main.shortName, 1, skinID);
            newitem.name = ticket.customName;
            player.GiveItem(newitem);
            player.ChatMessage($"You have been given a ticket for : {ticket.time} seconds");
        }
        private Dictionary<ulong, string> GetPlayers(string nameOrId) {
            var pl = covalence.Players.FindPlayers(nameOrId).ToList();
            return pl.Select(p => new KeyValuePair<ulong, string>(ulong.Parse(p.Id), p.Name)).ToDictionary(x => x.Key, x => x.Value);
        }
        private BasePlayer FindBasePlayer(ulong userId) {
            BasePlayer player = BasePlayer.activePlayerList.FirstOrDefault(p => p.userID == userId);
            player = player ?? BasePlayer.sleepingPlayerList.FirstOrDefault(p => p.userID == userId);
            return player;
        }
#endregion
#region [Data]
        private void LoadSpawnData() => spawnData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, List<SpawnData>>>($"EasyGather/SpawnData/{config.main.fileName}");
        private void SaveSpawnData() => Interface.Oxide.DataFileSystem.WriteObject($"EasyGather/SpawnData/{config.main.fileName}", spawnData);
        private void LoadTextData() {
            textData = Interface.Oxide.DataFileSystem.ReadObject<List<TextData>>($"EasyGather/TextData/{config.main.fileName}");
            Spawns = Interface.Oxide.DataFileSystem.ReadObject<DefaultSpawns>($"EasyGather/TextData/Spawns/{config.main.fileName}");
        }
        private void SaveTextData() {
            Interface.Oxide.DataFileSystem.WriteObject($"EasyGather/TextData/{config.main.fileName}", textData);
            Interface.Oxide.DataFileSystem.WriteObject($"EasyGather/TextData/Spawns/{config.main.fileName}", Spawns);
        }
        private void SavePlayerData() {
            Interface.Oxide.DataFileSystem.WriteObject("EasyGather/PlayerData/data", playerData);
        }
        private void LoadPlayerData() {
            playerData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, PlayerData>>("EasyGather/PlayerData/data");
        }
#endregion
#region [GatherManager]
        private class GatherManager : MonoBehaviour {
            public Dictionary<BaseEntity, int> loot = new Dictionary<BaseEntity, int>();
            public Dictionary<int, spawn> spawns = new Dictionary<int, spawn>();
            public List<BasePlayer> players;
            public Vector3 spawnPlayer;
            public Vector3 textWithMain;
            private TimeSpan time;
            public class spawn {
                public int spawnTime;
                public string prefab;
                public Vector3 position;
                public Vector3 rotation;
            }
            public void Awake() {
                InvokeRepeating("Timer", 1f, 1);
            }
            private void Timer() {
                players = (List<BasePlayer>)plugin.ZoneManager?.Call("GetPlayersInZone", plugin.zoneID);
                foreach (var player in players) {
                    if(!plugin.playerData.ContainsKey(player.userID)) {
                        player.metabolism.radiation_poison.value += 5;
                        player.health -= 5;
                        SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, true);
                        plugin.DrawText(player, 1f, Color.white, plugin.BuildingSpawnPoint + plugin.Spawns.TimerTextPosition, plugin.GetMsg("TimerText2", player));
                        SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, false);
                        continue;
                    }
                    if(plugin.playerData[player.userID].gatherTime <= 0) {
                        player.Die();
                        SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, true);
                        plugin.DrawText(player, 1f, Color.white, plugin.BuildingSpawnPoint + plugin.Spawns.TimerTextPosition, plugin.GetMsg("TimerText2", player));
                        SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, false);
                        continue;
                    }
                    plugin.playerData[player.userID].gatherTime--;
                    time = TimeSpan.FromSeconds(plugin.playerData[player.userID].gatherTime);
                    SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, true);
                    plugin.DrawText(player, 1f, Color.white, plugin.BuildingSpawnPoint + plugin.Spawns.TimerTextPosition, String.Format(plugin.GetMsg("TimerText1", player), time.Hours, time.Minutes, time.Seconds));
                    SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, false);
                    foreach (var tData in plugin.textData) {
                        if (String.IsNullOrEmpty(tData.text)) continue;
                        if (Vector3.Distance(player.transform.position, plugin.BuildingSpawnPoint + tData.position) > tData.dist) continue;
                        SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, true);
                        plugin.DrawText(player, 1f, Color.white, plugin.BuildingSpawnPoint + tData.position, tData.text);
                        SetPlayerFlag(player, BasePlayer.PlayerFlags.IsAdmin, false);
                    }
                }
               
// ... [Code preview truncated due to length. Full source in attached file] ...

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