C#:
using System.Collections.Generic;
using Oxide.Core;
using Newtonsoft.Json;
using UnityEngine;
using System.Linq;
using System;
///Скачано с дискорд сервера Rust Edit [PRO+]
///discord.gg/9vyTXsJyKR
namespace Oxide.Plugins
{
/*ПЛАГИН БЫЛ ПОФИКШЕН С ПОМОЩЬЮ ПРОГРАММЫ СКАЧАНОЙ С https://discord.gg/dNGbxafuJn */ [Info("aQuarry", "https://discord.gg/dNGbxafuJn", "1.0.1")]
class aQuarry : RustPlugin
{
#region [Initialization]
private const bool Rus = true;
private const string giveperm = "aquarry.give";
private void OnServerInitialized()
{
if (!permission.PermissionExists(giveperm))
permission.RegisterPermission(giveperm, this);
NextTick(() =>
{
foreach (MiningQuarry entity in BaseNetworkable.serverEntities.OfType<MiningQuarry>())
UpdateQuarry(entity);
});
}
#endregion
#region [Data]
private Dictionary<ulong, CashData> data = new Dictionary<ulong, CashData>();
private class CashData
{
internal int quarries = 0;
internal int jacks = 0;
}
#endregion
#region [Configuration]
private static Configuration cfg;
private static Configuration DefaultConfig()
{
return new Configuration
{
Quarries = new Dictionary<ulong, QuarrySetting>
{
[2896961730] = new QuarrySetting
{
name = "Personal Quarry Lvl 1",
resources = new List<ResourceSettings>
{
new ResourceSettings
{
shortname = "stones",
workNeeded = 0.3f
},
new ResourceSettings
{
shortname = "metal.ore",
workNeeded = 5f
}
}
},
[2896961934] = new QuarrySetting
{
name = "Personal Quarry Lvl 2",
resources = new List<ResourceSettings>
{
new ResourceSettings
{
shortname = "stones",
workNeeded = 0.3f
},
new ResourceSettings
{
shortname = "metal.ore",
workNeeded = 5f
},
new ResourceSettings
{
shortname = "sulfur.ore",
workNeeded = 7.5f
}
}
},
[2896962234] = new QuarrySetting
{
name = "Personal Quarry Lvl 3",
resources = new List<ResourceSettings>
{
new ResourceSettings
{
shortname = "stones",
workNeeded = 0.3f
},
new ResourceSettings
{
shortname = "metal.ore",
workNeeded = 5f
},
new ResourceSettings
{
shortname = "sulfur.ore",
workNeeded = 7.5f
},
new ResourceSettings
{
shortname = "hq.metal.ore",
workNeeded = 75f
}
}
},
[2896959659] = new QuarrySetting
{
name = "Personal PumpJack",
quarry = false,
resources = new List<ResourceSettings>
{
new ResourceSettings
{
shortname = "crude.oil",
workNeeded = 16.6f
},
new ResourceSettings
{
shortname = "lowgradefuel",
workNeeded = 5.8f
}
}
}
}
};
}
protected override void LoadDefaultConfig()
{
PrintWarning(Rus ? "Создание базовой конфигурации..." : "Creating a default config...");
cfg = DefaultConfig();
cfg.PluginVersion = Version;
SaveConfig();
PrintWarning(Rus ? "Создание базовой конфигурации завершено!" : "Default config has been created!");
}
protected override void LoadConfig()
{
base.LoadConfig();
cfg = Config.ReadObject<Configuration>();
if (cfg.PluginVersion < Version) UpdateConfigValues();
SaveConfig();
}
private void UpdateConfigValues()
{
PrintWarning(Rus ? "Обнаружено обновление плагина! Автоматическое обновление конфигурации..." : "Config update detected! Updating config values...");
if (cfg.PluginVersion < new VersionNumber(1, 0, 1))
{
}
cfg.PluginVersion = Version;
PrintWarning(Rus ? "Обновление конфигурации успешно!" : "Config update completed!");
}
protected override void SaveConfig() => Config.WriteObject(cfg);
private class Configuration
{
[JsonProperty(Rus ? "SteamID аватарки для чата" : "Avatar SteamID for chat")] internal ulong chatid = 0;
[JsonProperty(Rus ? "Логировать полученные игроками карьеры?" : "Log the quarries received by players?")] internal bool log = false;
[JsonProperty(Rus ? "Максимальное количество карьеров на одного игрока" : "Maximum amount of quarries per player")] internal int quarries = 3;
[JsonProperty(Rus ? "Максимальное количество нефтекачек на одного игрока" : "Maximum amount of pumpjacks per player")] internal int jacks = 1;
[JsonProperty(Rus ? "Список кастомных карьеров (SkinID карьера : настройка)" : "List of custom quarries (skinid : settings)")] internal Dictionary<ulong, QuarrySetting> Quarries = new Dictionary<ulong, QuarrySetting>();
[JsonProperty(Rus ? "Версия плагина" : "Plugin Version")] internal VersionNumber PluginVersion = new VersionNumber();
}
private class QuarrySetting
{
[JsonProperty(Rus ? "Только владелец карьера может его включать/выключать?" : "Only owner can toggle this quarry?")] internal bool OwnerToggle = false;
[JsonProperty(Rus ? "Включая команду владельца?" : "Include his team?")] internal bool TeamToggle = false;
[JsonProperty(Rus ? "Название карьера" : "Quarry custom name")] internal string name = "Custom Name";
[JsonProperty(Rus ? "Это карьер (true) или нефтекачка (false) ?" : "This is a quarry (true) or pumpjack (false) ?")] internal bool quarry = true;
[JsonProperty(Rus ? "Использовать подмену префаба?" : "Use prefab substitution?")] internal bool ChangePrefab = true;
[JsonProperty(Rus ? "ShortName предмета из которого создаем карьер" : "ShortName of the item from which we create a quarry")] internal string prefab = "furnace.large";
[JsonProperty(Rus ? "Минимальное расстояние от игрока до карьера (при установке)" : "Minimum distance from the player to the quarry (when installed)")] internal float distance = 3f;
[JsonProperty(Rus ? "Заменить предмет (топливо) на котором работает карьер?" : "Change the item (fuel) on which the quarry is working?")] internal bool changeFuel = false;
[JsonProperty(Rus ? "Новый предмет используемый в качестве топлива (шортнейм)" : "A new item used as fuel (shortname)")] internal string fuelShortname = "lowgradefuel";
[JsonProperty(Rus ? "Потребление топлива" : "Amount of fuel to consume")] internal int fuel = 1;
[JsonProperty(Rus ? "Заменять стандартное производство ресурсов?" : "Replace standard resource production?")] internal bool changeResourse = false;
[JsonProperty(Rus ? "Интервал производства ресурсов (секунды)" : "Production interval (seconds)")] internal float processRate = 5;
[JsonProperty(Rus ? "Добавляемый запас единиц прогресса карьера при поглощении топлива" : "Add progress points to reserve when consume fuel")] internal float workPerFuel = 1000;
[JsonProperty(Rus ? "Выполняемый прогресс при производстве" : "Progress points per production tick")] internal float workToAdd = 40;
[JsonProperty(Rus ? "Настройка добываемых ресурсов" : "Resource extraction settings")] internal List<ResourceSettings> resources = new List<ResourceSettings>();
}
private class ResourceSettings
{
[JsonProperty("ShortName")] internal string shortname = "stones";
[JsonProperty(Rus ? "Требуемый прогресс для добычи 1 единицы ресурса" : "Required progress for extraction 1 amount of resource")] internal float workNeeded = 0.3f;
}
#endregion
#region [Oxide]
private void OnQuarryToggled(MiningQuarry quarry, BasePlayer player)
{
if (quarry.skinID == 0 || quarry.OwnerID == 0 || !cfg.Quarries.ContainsKey(quarry.skinID)) return;
QuarrySetting set = cfg.Quarries[quarry.skinID];
if (!set.OwnerToggle) return;
if (quarry.OwnerID != player.userID)
{
bool toggle = true;
if (set.TeamToggle)
{
RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.FindPlayersTeam(quarry.OwnerID);
if (team != null && team.members.Contains(player.userID))
toggle = false;
}
if (toggle)
{
if (!quarry.HasFlag(BaseEntity.Flags.On))
quarry.EngineSwitch(true);
else quarry.EngineSwitch(false);
}
}
}
private object CanBuild(Planner plan, Construction entity, Construction.Target target)
{
if (!cfg.Quarries.ContainsKey(plan.skinID)) return null;
BasePlayer player = plan.GetOwnerPlayer();
if (!data.ContainsKey(player.userID)) return null;
if (cfg.Quarries[plan.skinID].quarry && data[player.userID].quarries >= cfg.quarries)
{
player.SendConsoleCommand("chat.add", 2, cfg.chatid, string.Format(GetLang("Chat.QLimit", player.UserIDString), cfg.quarries));
return false;
}
if (!cfg.Quarries[plan.skinID].quarry && data[player.userID].jacks >= cfg.jacks)
{
player.SendConsoleCommand("chat.add", 2, cfg.chatid, string.Format(GetLang("Chat.JLimit", player.UserIDString), cfg.jacks));
return false;
}
return null;
}
private void OnEntityBuilt(Planner plan, GameObject obj)
{
if (plan == null || obj == null) return;
if (!cfg.Quarries.ContainsKey(plan.skinID)) return;
MiningQuarry quarry;
BasePlayer player = plan.GetOwnerPlayer();
if (cfg.Quarries[plan.skinID].ChangePrefab)
{
BaseEntity ent = obj.ToBaseEntity();
NextTick(() => { ent.Kill(); });
if (Vector3.Distance(player.ServerPosition, ent.transform.position) < cfg.Quarries[plan.skinID].distance)
{
player.SendConsoleCommand("chat.add", 2, cfg.chatid, GetLang("Chat.TooClose", player.UserIDString));
GiveQuarryToPlayer(player, plan.skinID);
return;
}
Vector3 transform = ent.transform.position + new Vector3(0f, -2f, 0f) + (ent.transform.position - player.transform.position).normalized * 2;
string prefab = cfg.Quarries[plan.skinID].quarry ? "assets/prefabs/deployable/quarry/mining_quarry.prefab" : "assets/prefabs/deployable/oil jack/mining.pumpjack.prefab";
BaseEntity entity = GameManager.server.CreateEntity(prefab, transform, ent.transform.rotation);
if (entity == null) return;
entity.skinID = plan.skinID;
entity.OwnerID = player.userID;
entity.Spawn();
quarry = entity.GetComponent<MiningQuarry>();
}
else quarry = obj.ToBaseEntity().GetComponent<MiningQuarry>();
if (quarry == null) return;
UpdateQuarry(quarry, player);
}
private object OnQuarryConsumeFuel(MiningQuarry quarry, Item item)
{
if (quarry == null || quarry.OwnerID == 0 || quarry.skinID == 0 || !cfg.Quarries.ContainsKey(quarry.skinID)) return null;
QuarrySetting set = cfg.Quarries[quarry.skinID];
if (set.changeFuel)
item = quarry.fuelStoragePrefab.instance.GetComponent<StorageContainer>().inventory.FindItemByItemName(set.fuelShortname);
if (item != null && item.amount >= set.fuel)
{
item.amount -= set.fuel - 1;
return item;
}
else
{
quarry.EngineSwitch(false);
return false;
}
} private void OnEntityDeath(MiningQuarry quarry, HitInfo info) => OnEntityKill(quarry);
private void OnEntityKill(MiningQuarry quarry)
{
if (quarry == null || quarry.OwnerID == 0 || quarry.skinID == 0 || !cfg.Quarries.ContainsKey(quarry.skinID)) return;
if (!data.ContainsKey(quarry.OwnerID)) return;
BasePlayer player = BasePlayer.FindByID(quarry.OwnerID);
if (cfg.Quarries[quarry.skinID].quarry)
{
data[quarry.OwnerID].quarries--;
if (player != null)
player.SendConsoleCommand("chat.add", 2, cfg.chatid, string.Format(GetLang("Chat.QDestroyed", player.UserIDString), cfg.quarries - data[quarry.OwnerID].quarries));
}
else
{
data[quarry.OwnerID].jacks--;
if (player != null)
player.SendConsoleCommand("chat.add", 2, cfg.chatid, string.Format(GetLang("Chat.JDestroyed", player.UserIDString), cfg.jacks - data[quarry.OwnerID].jacks));
}
}
private void OnNormalRemovedEntity(BasePlayer player, MiningQuarry quarry)
{
if (quarry == null || quarry.OwnerID == 0 || quarry.skinID == 0) return;
if (!cfg.Quarries.ContainsKey(quarry.skinID)) return;
if (cfg.Quarries[quarry.skinID].ChangePrefab)
GiveQuarryToPlayer(player, quarry.skinID, true);
}
#endregion
#region [Functions]
private string GetLang(string key, string id) => lang.GetMessage(key, this, id);
private void UpdateQuarry(MiningQuarry quarry, BasePlayer player = null)
{
if (!cfg.Quarries.ContainsKey(quarry.skinID)) return;
QuarrySetting set = cfg.Quarries[quarry.skinID];
if (set.changeFuel)
quarry.fuelStoragePrefab.instance.GetComponent<StorageContainer>().inventory.onlyAllowedItems = new ItemDefinition[1] { ItemManager.FindItemDefinition(set.fuelShortname) };
if (set.changeResourse)
{
quarry.processRate = set.processRate;
quarry.workToAdd = set.workToAdd;
quarry.workPerFuel = set.workPerFuel;
if (set.resources.Count > 0)
{
quarry.canExtractLiquid = true;
quarry.canExtractSolid = true;
quarry._linkedDeposit = new ResourceDepositManager.ResourceDeposit();
foreach (ResourceSettings x in set.resources)
quarry._linkedDeposit.Add(ItemManager.FindItemDefinition(x.shortname), 1f, 1000, x.workNeeded, ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM);
}
}
quarry.SendNetworkUpdate();
if (!data.ContainsKey(quarry.OwnerID))
data.Add(quarry.OwnerID, new CashData());
if (set.quarry)
{
data[quarry.OwnerID].quarries++;
if (player != null)
player.SendConsoleCommand("chat.add", 2, cfg.chatid, string.Format(GetLang("Chat.QPlaced", player.UserIDString), data[quarry.OwnerID].quarries, cfg.quarries));
}
else
{
data[quarry.OwnerID].jacks++;
if (player != null)
player.SendConsoleCommand("chat.add", 2, cfg.chatid, string.Format(GetLang("Chat.JPlaced", player.UserIDString), data[quarry.OwnerID].jacks, cfg.jacks));
}
}
private void GiveQuarryToPlayer(BasePlayer player, ulong skin, bool remove = false, Item item = null)
{
if (item == null)
{
string shortname = cfg.Quarries[skin].ChangePrefab ? cfg.Quarries[skin].prefab : "mining.quarry";
item = ItemManager.CreateByName(shortname, 1, skin);
item.name = cfg.Quarries[skin].name;
}
if (player.inventory.containerMain.itemList.Count >= 24 && player.inventory.containerBelt.itemList.Count >= 6)
{
player.SendConsoleCommand("chat.add", 2, cfg.chatid, GetLang("Chat.NotRecieved", player.UserIDString));
timer.In(30f, () => { GiveQuarryToPlayer(player, skin, false, item); });
return;
}
player.GiveItem(item);
Planner entity = item.GetHeldEntity() as Planner;
if (entity != null)
{
entity.skinID = skin;
entity.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
}
if (remove) return;
string mes = Rus ? $"Игрок {player.displayName}({player.userID}) успешно получил «{cfg.Quarries[skin].name}»" : $"Player {player.displayName}({player.userID}) successfully recieved «{cfg.Quarries[skin].name}»";
PrintWarning(mes);
if (cfg.log)
LogToFile("Log", $"[{DateTime.Now:dd-MM-yyyy HH:mm:ss}] " + mes, this, false);
}
#endregion
#region [Lang]
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["Chat.NotRecieved"] = "Your inventory is full. Anouther attempt to recieve the item will occur in 30 seconds.",
["Chat.TooClose"] = "You are too close to the placement position.",
["Chat.QLimit"] = "You are already placed maximum amount ({0}) of quarries.",
["Chat.JLimit"] = "You are already placed maximum amount ({0}) of pumpjacks.",
["Chat.QPlaced"] = "You are placed {0} from {1} quarries.",
["Chat.JPlaced"] = "You are placed {0} from {1} pumpjacks.",
["Chat.QDestroyed"] = "Your quarry has been destroyed. You can place {0} more.",
["Chat.JDestroyed"] = "Your pumpjack has been destroyed. You can place {0} more."
}, this);
lang.RegisterMessages(new Dictionary<string, string>
{
["Chat.NotRecieved"] = "Ваш инвентарь переполнен. Повторная попытка выдачи предмета произойдет через 30 секунд.",
["Chat.TooClose"] = "Вы слишком близко к месту установки.",
["Chat.QLimit"] = "У вас уже установлено максимальное количество ({0}) карьеров.",
["Chat.JLimit"] = "У вас уже установлено максимальное количество ({0}) нефтекачек.",
["Chat.QPlaced"] = "Вы установили {0} из {1} карьеров.",
["Chat.JPlaced"] = "Вы установили {0} из {1} нефтекачек.",
["Chat.QDestroyed"] = "Ваш карьер был уничтожен. Можете установить еще {0}",
["Chat.JDestroyed"] = "Ваша нефтекачка была уничтожена. Можете установить еще {0}"
}, this, "ru");
}
#endregion
#region [Commands]
[ConsoleCommand("quarry.give")]
private void CMD_GiveCustomQuarry(ConsoleSystem.Arg arg)
{
if (arg.Player() != null && !permission.UserHasPermission(arg.Player().UserIDString, giveperm)) return;
ulong userid;
ulong skin;
if (arg.Args == null || arg.Args.Length < 2 || !ulong.TryParse(arg.Args[0], out userid) || !ulong.TryParse(arg.Args[1], out skin))
{
PrintError(Rus ? "Неверный формат. Формат:\nquarry.give «SteamID» «SkinID»" : "Invalid format. Format:\nquarry.give «SteamID» «SkinID»");
return;
}
if (!cfg.Quarries.ContainsKey(skin))
{
PrintError(Rus ? "Конфигурация не содержит карьера с указанным «SkinID»" : "The configuration does not contain a quarry with this «SkinID»");
return;
}
BasePlayer player = BasePlayer.FindByID(userid);
if (player == null)
{
PrintError(Rus ? "Игрок с указанным «SteamID» не найден" : "Player with intered «SteamID» not found");
return;
}
GiveQuarryToPlayer(player, skin);
}
[ConsoleCommand("quarry.giveall")]
private void CMD_GiveAllCustomQuarries(ConsoleSystem.Arg arg)
{
if (arg.Player() != null && !permission.UserHasPermission(arg.Player().UserIDString, giveperm)) return;
ulong userid;
if (arg.Args == null || arg.Args.Length < 1 || !ulong.TryParse(arg.Args[0], out userid))
{
PrintError(Rus ? "Неверный формат. Формат:\nquarry.giveall «SteamID»" : "Invalid format. Format:\nquarry.giveall «SteamID»");
return;
}
BasePlayer player = BasePlayer.FindByID(userid);
if (player == null)
{
PrintError(Rus ? "Игрок с указанным «SteamID» не найден" : "Player with intered «SteamID» not found");
return;
}
foreach (ulong x in cfg.Quarries.Keys)
GiveQuarryToPlayer(player, x);
}
[ConsoleCommand("quarry.giveme")]
private void CMD_GiveCustomQuarrySelf(ConsoleSystem.Arg arg)
{
if (arg.Player() == null || !permission.UserHasPermission(arg.Player().UserIDString, giveperm)) return;
foreach (ulong x in cfg.Quarries.Keys)
GiveQuarryToPlayer(arg.Player(), x);
}
#endregion
}
}