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;
///Скачано с дискорд сервера Rust Edit [PRO+]
///discord.gg/9vyTXsJyKR
namespace Oxide.Plugins {
[Info("EasyGather", "discord.gg/9vyTXsJyKR", "1.0.4")]
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 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(0u);
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) {
if (plugin.config.main.penaltyType == 1) {
player.metabolism.radiation_poison.value += 5;
player.health -= 5;
}
else if(plugin.config.main.penaltyType == 2) {
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);
}
}
foreach(var spawn in spawns.Where(t => t.Value.spawnTime != -1)) {
if(spawn.Value.spawnTime == 0) {
var ent = GameManage
// ... [Code preview truncated due to length. Full source in attached file] ...