C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using UnityEngine;
using Facepunch;
using System;
using System.Reflection;
using System.Collections.Generic;
using Random = UnityEngine.Random;
namespace Oxide.Plugins
{
[Info("OilCrate", "Server-Rust", "0.6.5", ResourceId = 2339)]
// Слив плагинов server-rust by Apolo YouGame
class OilCrate : RustPlugin
{
private const string oilCrateAllow = "oilcrate.allow";
private readonly List<Timer> timers = new List<Timer>();
private readonly List<string> duplicate = new List<string>();
private bool quarryLiquid;
private bool pumpjackSolid;
private bool effectStaticPumpjacks;
private bool missingPermission;
private float oilCrateChance;
private float oilCrateDespawn;
private bool dryOnly;
private float oilGatherWorkNeededMin;
private float oilGatherWorkNeededMax;
private bool dropFreePumpjack;
private bool craftViaPicaxe;
private Dictionary<string, object> pumpJackResources = new Dictionary<string, object>();
Dictionary<string, object> pumpJackResourcesDefault()
{
return new Dictionary<string, object>()
{
{"Шестерни", 15},
{"Метал.фрагмент", 1750},
{"Дерево", 10000},
};
}
private void LoadVariables()
{
quarryLiquid = GetConfig("1.Анализ", "1.Разрешить карьеру собирать нефть?", false);
pumpjackSolid = GetConfig("1.Анализ", "2.Разрешить нефтекачке собирать руду?", false);
effectStaticPumpjacks = GetConfig("1.Анализ", "3.Изменение скорости сбора статических насосных гнезд (у памятников)", true);
missingPermission = GetConfig("1.Анализ", "4.Показать сообщение (отсутствует разрешение)", true);
oilCrateChance = GetConfig("2.Настройки нефтекачки", "1.Шанс в % (0.0 - 100.0)", 50f);
oilCrateDespawn = GetConfig("2.Настройки нефтекачки", "2.Таймер удаления в секундах", 300f);
dryOnly = GetConfig("2.Настройки нефтекачки", "3.Только на сухом биоме", false);
oilGatherWorkNeededMin = 10 / GetConfig("3.Скорость сбора сырой нефти", "1.Минимальное время сбора сырой нефти ", 0.525f);
oilGatherWorkNeededMax = 10 / GetConfig("3.Скорость сбора сырой нефти", "2.Максимальное время сбора сырой нефти", 0.725f);
dropFreePumpjack = GetConfig("4.Получить гнездо насоса", "1.Получить нефтекачку с гнезда", false);
craftViaPicaxe = GetConfig("4.Получить гнездо насоса", "2.Ремесло через хит с киркой", true);
pumpJackResources = GetConfig("4.Получить гнездо насоса", "3.Ресурсы для создания гнезда насоса", pumpJackResourcesDefault());
SaveConfig();
}
protected override void LoadDefaultConfig()
{
Puts("Creating a new config file");
Config.Clear();
LoadVariables();
}
private void Loaded()
{
permission.RegisterPermission(oilCrateAllow, this);
LoadVariables();
if (oilCrateChance < 0) oilCrateChance = 0;
if (oilCrateChance > 100) oilCrateChance = 100;
}
private void Unload()
{
foreach (var time in timers)
time.Destroy();
}
private void OnResourceDepositCreated(ResourceDepositManager.ResourceDeposit resourceDeposit)
{
if (Random.Range(0f, 100f) >= oilCrateChance) return;
if (!pumpjackSolid) resourceDeposit._resources.Clear();
resourceDeposit.Add(ItemManager.FindItemDefinition("crude.oil"), 1f, 50000, Random.Range(oilGatherWorkNeededMin, oilGatherWorkNeededMax), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM, false);
}
private void OnSurveyGather(SurveyCharge survey, Item item)
{
if (item.info.name != "crude_oil.item") return;
var pos = survey.transform.position;
var posID = $"{pos.x}{pos.y}{pos.z}";
if (duplicate.Contains(posID))
{
timer.In(1f, () =>
{
duplicate.Remove(posID);
});
return;
}
if (!IsAllowed((BasePlayer)survey.creatorEntity, true))
{
item.Remove();
DeSpawn("survey_crater", pos, 0f);
if (missingPermission) SendReply((BasePlayer)survey.creatorEntity, "У вас нет привилегий для выполнения нефтяного бурения");
return;
}
if (dryOnly && TerrainMeta.BiomeMap.GetBiome(pos, TerrainBiome.ARID) < 0.5f)
{
item.Remove();
DeSpawn("survey_crater", pos, 0f);
if (missingPermission) SendReply((BasePlayer)survey.creatorEntity, "Вы можете найти масло только в южной пустыне");
return;
}
if (!quarryLiquid) DeSpawn("survey_crater.prefab", pos, 0f);
Spawn("assets/prefabs/tools/surveycharge/survey_crater_oil.prefab", pos);
DeSpawn("survey_crater", pos, oilCrateDespawn);
duplicate.Add(posID);
if (!dropFreePumpjack) return;
var pumpJack = ItemManager.CreateByName("mining.pumpjack", 1);
pumpJack.Drop(pos + new Vector3(.5f,.5f), Vector3.zero, Quaternion.AngleAxis(0, Vector3.left));
}
private void OnEntitySpawned(BaseNetworkable entity)
{
var quarry = entity as MiningQuarry;
if (quarry == null) return;
if (!quarry.ShortPrefabName.Contains("pumpjack-static"))
quarry.canExtractSolid = true;
if (entity.ShortPrefabName.Contains("mining_quarry"))
quarry.canExtractLiquid = quarryLiquid;
if (quarry.ShortPrefabName.Contains("pumpjack-static") && effectStaticPumpjacks)
{
var quarries = UnityEngine.Object.FindObjectsOfType<MiningQuarry>();
var linkedDeposit = typeof(MiningQuarry).GetField("_linkedDeposit", (BindingFlags.Instance | BindingFlags.NonPublic));
var depo = linkedDeposit?.GetValue(quarry) as ResourceDepositManager.ResourceDeposit;
depo._resources.Clear();
depo.Add(ItemManager.FindItemDefinition("crude.oil"), 1f, 50000, Random.Range(oilGatherWorkNeededMin, oilGatherWorkNeededMax), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM, true);
quarry.SendNetworkUpdateImmediate();
}
}
private void OnPlayerAttack(BasePlayer attacker, HitInfo info)
// Слив плагинов server-rust by Apolo YouGame
{
if (!craftViaPicaxe) return;
var oilCrate = info?.HitEntity as SurveyCrater;
if (oilCrate == null || oilCrate.ShortPrefabName != "survey_crater_oil") return;
var item = info.Weapon?.GetItem();
if (item == null || !item.info.name.Contains("pickaxe")) return;
var toTake = new Dictionary<int, int>();
foreach (var resourcePair in pumpJackResources)
{
var resource = ItemManager.FindItemDefinition(resourcePair.Key);
var existingAmount = attacker.inventory.GetAmount(resource.itemid);
if (existingAmount < (int)resourcePair.Value)
{
SendReply(attacker, "Вы не можете собрать гнездо насоса.Вам не хватает {0}.", resource.displayName.english.ToLower());
return;
}
toTake.Add(resource.itemid, (int)resourcePair.Value);
}
foreach (var take in toTake)
attacker.inventory.Take(null, take.Key, take.Value);
var pumpJack = ItemManager.CreateByName("mining.pumpjack", 1);
pumpJack.Drop(oilCrate.transform.position + new Vector3(.5f,.5f), Vector3.zero, Quaternion.AngleAxis(0, Vector3.left));
}
[ConsoleCommand("oilcrate")]
void ccmdOilCrate(ConsoleSystem.Arg arg)
{
if (arg.Connection != null && arg.Player() == null) return;
cmdOilCrate(arg.Player(), string.Empty, arg.Args);
}
[ChatCommand("oilcrate")]
void cmdOilCrate(BasePlayer player, string command, string[] args)
{
if (player != null && !IsAllowed(player))
{
SendReply(player, "You're not allowed to use this command.");
return;
}
if (args == null || args.Length <= 0 || args.Length > 2)
{
SendReply(player, "Вы можете использовать следующие команды:"
+ "\n\t- regenerate\t|- <color=yellow>Генерировать каждый источник сырой нефти</color>"
+ "\n\t- clear\t\t\t\t|- <color=red>Удалять сырую нефть из каждого источника</color>"
+ "\n\t\t\t\t\t\t\t| (не может быть отменено)"
+ "\n\t- destroy\t\t\t|- <color=red>Разрушает пустые домкраты и карьеры</color>");
return;
}
switch (args[0].ToLower())
{
case "regenerate":
RefreshQuarries("regenerate");
if (player == null)
{
if (quarryLiquid)
Puts("Добыча сырой нефти в каждом насосном гнезде и карьере была успешно обновлена.");
else
Puts("Нефть сырой нефти в каждом насосном гнезде была успешно обновлена.");
}
if (quarryLiquid)
SendReply(player, "Добыча сырой нефти в каждом насосном гнезде и карьере была успешно обновлена.");
else
SendReply(player, "Сырая нефть в каждом насосном гнезде была успешно обновлена.");
break;
case "clear":
RefreshQuarries("clear");
if (player == null)
{
if (quarryLiquid)
Puts("Сырая нефть каждого гнезда и карьера насоса была успешно удалена.");
else
Puts("Сырая нефть каждого гнезда насоса была успешно удалена.");
}
if (quarryLiquid)
SendReply(player, "Сырая нефть каждого гнезда и карьера насоса было успешно удалено.");
else
SendReply(player, "Сырая нефть каждого гнезда насоса было успешно удалено.");
break;
case "destroy":
RefreshQuarries("destroy");
if (player == null)
{
if (quarryLiquid)
Puts("Сырая нефть каждого гнезда насоса и карьера было успешно удалено.И гнёзда были уничтожены.");
else
Puts("Сырая нефть каждого гнезда насоса было успешно удалено.И гнёзда были уничтожены.");
}
if (quarryLiquid)
SendReply(player, "Сырая нефть каждого гнезда насоса и карьера была успешно удалена.И гнёзда были уничтожены.");
else
SendReply(player, "Сырая нефть каждого гнезда насоса было успешно удалено.И гнёзда были уничтожены.");
break;
default:
SendReply(player, "Введи: /oilcrate {0}", args[0]);
break;
}
}
private void RefreshQuarries(string todo)
{
var quarries = UnityEngine.Object.FindObjectsOfType<MiningQuarry>();
var linkedDeposit = typeof(MiningQuarry).GetField("_linkedDeposit", (BindingFlags.Instance | BindingFlags.NonPublic));
foreach (var quarry in quarries)
{
var depo = linkedDeposit?.GetValue(quarry) as ResourceDepositManager.ResourceDeposit;
switch (todo)
{
case "regenerate":
if (quarry.ShortPrefabName == "pumpjack-static")
{
depo._resources.Clear();
depo.Add(ItemManager.FindItemDefinition("crude.oil"), 1f, 50000, Random.Range(oilGatherWorkNeededMin, oilGatherWorkNeededMax), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM, true);
quarry.SendNetworkUpdateImmediate();
continue;
}
if (quarry.ShortPrefabName == "mining_quarry")
quarry.canExtractLiquid = quarryLiquid;
if (quarry.ShortPrefabName.Contains("mining_quarry") && !quarryLiquid) continue;
foreach (var resource in depo._resources)
{
if (resource.type.transform.name != "crude_oil.item") continue;
depo._resources.Remove(resource);
depo.Add(ItemManager.FindItemDefinition("crude.oil"), 1f, 50000, Random.Range(oilGatherWorkNeededMin, oilGatherWorkNeededMax), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM, true);
quarry.SendNetworkUpdateImmediate();
break;
}
continue;
case "clear":
if (quarry.ShortPrefabName == "mining_quarry")
quarry.canExtractLiquid = false;
foreach (var resource in depo._resources)
{
if (resource.type.transform.name != "crude_oil.item") continue;
depo._resources.Remove(resource);
quarry.SendNetworkUpdateImmediate();
break;
}
continue;
case "destroy":
if (quarry.ShortPrefabName == "mining_quarry")
quarry.canExtractLiquid = false;
foreach (var resource in depo._resources)
{
if (resource.type.transform.name != "crude_oil.item") continue;
depo._resources.Remove(resource);
quarry.SendNetworkUpdateImmediate();
}
if (depo._resources.Count <= 0)
quarry.KillMessage();
continue;
}
}
}
private void Spawn(string prefab, Vector3 position)
{
Quaternion rot;
Vector3 pos;
GetLocation(position, out pos, out rot);
var createdPrefab = GameManager.server.CreatePrefab(prefab, pos, rot);
if (createdPrefab == null) return;
var entity = createdPrefab.GetComponent<BaseEntity>();
entity.Spawn();
}
private void DeSpawn(string prefab, Vector3 position, float time)
{
timers.Add(timer.Once(time, () =>
{
var nearby = Pool.GetList<SurveyCrater>();
Vis.Entities(position, 1f, nearby);
foreach (var ent in nearby)
if (ent.PrefabName.Contains(prefab)) ent.KillMessage();
Pool.FreeList(ref nearby);
}));
}
private void GetLocation(Vector3 startPos, out Vector3 pos, out Quaternion rot)
{
pos = startPos;
pos.y = 0f;
rot = Quaternion.Euler(0f, Random.Range(0f, 360f), 0f);
RaycastHit raycastHit;
if (TerrainMeta.HeightMap)
{
var height = TerrainMeta.HeightMap.GetHeight(pos) - 0.2f;
pos.y = Mathf.Max(pos.y, height);
}
if (TransformUtil.GetGroundInfo(pos, out raycastHit, 20f, -1063190527))
// Слив плагинов server-rust by Apolo YouGame
{
pos = raycastHit.point;
rot = Quaternion.LookRotation(rot * Vector3.forward, raycastHit.normal);
}
}
private T GetConfig<T>(string name, string name2, T defaultValue)
{
var data = Config[name] as Dictionary<string, object>;
if (data == null)
{
data = new Dictionary<string, object>();
Config[name] = data;
}
object value;
if (!data.TryGetValue(name2, out value))
{
value = defaultValue;
data[name2] = value;
}
return (T)Convert.ChangeType(Config[name, name2], typeof(T));
}
private bool IsAllowed(BasePlayer player, bool perm = false)
{
return player.net?.connection?.authLevel > 1 || perm && permission.UserHasPermission(player.UserIDString, oilCrateAllow);
}
}
}