C#:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Oxide.Plugins
{
[Info("AnimalLoot", "TopPlugin.ru", "0.0.5")]
[Description("Полная настройка выпадаемого лута с животных ")]
class AnimalLoot : RustPlugin
{
/// <summary>
/// Обновление 0.0.4
/// - Полностью переделан конфигурационный файл
/// - Оптимизация кода
/// - Добавлена поддержка кастомных предметов со своим именем и SkinID
/// - Добавлен шанс на выпадение предмета (возможно устанавливать с плавающей точкой, пример : 10.5)
/// - Если у вас не пересоздался конфигурационный файл вручную, удалите его и перезагрузите плагин
/// Обновление 0.0.5
/// - Поправил ошибку при добыче
/// - Добавил возможность включить выпадение лута только после последних ударов
/// </summary>
#region Configuration
private static Configuration config = new Configuration();
private class Configuration
{
[JsonProperty("Настройка животных [животное] - {лут}")]
public Dictionary<String, List<DropLootSettings>> AnimalSettings = new Dictionary<String, List<DropLootSettings>>();
[JsonProperty("Включить(true) стандартный лут от животных(будет совмещен с вашим,из кфг) или отключить(false)")]
public Boolean DefaultLoot;
[JsonProperty("Включить(true) выпадение предметов ТОЛЬКО после последних ударах, вместо выпадения в течение добычи")]
public Boolean BonusDrop;
internal class DropLootSettings
{
[JsonProperty("Shortname")]
public String Shortname;
[JsonProperty("SkinID")]
public UInt64 SkinID;
[JsonProperty("Отображаемое имя")]
public String DisplayName;
[JsonProperty("Шанс выпадения")]
public Single RareDrops;
[JsonProperty("Минимальное количество выпадения")]
public Int32 MinimumAmount;
[JsonProperty("Максимальное количество выпадения")]
public Int32 MaximumAmount;
}
public static Configuration GetNewConfiguration()
{
return new Configuration
{
DefaultLoot = true,
BonusDrop = false,
AnimalSettings = new Dictionary<String, List<DropLootSettings>>
{
["assets/rust.ai/agents/horse/horse.corpse.prefab"] = new List<DropLootSettings>
{
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "wood",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "stones",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "diesel_barrel",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
},
["assets/rust.ai/agents/boar/boar.corpse.prefab"] = new List<DropLootSettings>
{
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "wood",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "stones",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "diesel_barrel",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
},
["assets/rust.ai/agents/chicken/chicken.corpse.prefab"] = new List<DropLootSettings>
{
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "wood",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "stones",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "diesel_barrel",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
},
["assets/rust.ai/agents/stag/stag.corpse.prefab"] = new List<DropLootSettings>
{
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "wood",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "stones",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "diesel_barrel",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
},
["assets/rust.ai/agents/wolf/wolf.corpse.prefab"] = new List<DropLootSettings>
{
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "wood",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "stones",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "diesel_barrel",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
},
["assets/rust.ai/agents/bear/bear.corpse.prefab"] = new List<DropLootSettings>
{
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "wood",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "stones",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
new DropLootSettings
{
RareDrops = 22.3f,
DisplayName = "",
Shortname = "diesel_barrel",
SkinID = 0,
MinimumAmount = 10,
MaximumAmount = 300,
},
},
}
};
}
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch
{
PrintWarning("Ошибка #1915" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Hooks
object OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item)
{
if (dispenser.gatherType != (ResourceDispenser.GatherType)2 || dispenser.name == "assets/prefabs/player/player_corpse.prefab") return null;
if (!config.AnimalSettings.ContainsKey(dispenser.name)) return null;
var player = (BasePlayer)entity;
if (player == null) return null;
if (config.BonusDrop)
{
Int32 RandomHealth = UnityEngine.Random.Range(5, 12);
if (dispenser._baseEntity.Health() <= RandomHealth)
GiveItem(player, dispenser.name);
if (!config.DefaultLoot)
return false;
return null;
}
if (!config.DefaultLoot)
{
GiveItem(player, dispenser.name);
return false;
}
GiveItem(player, dispenser.name);
return null;
}
private Item OnItemSplit(Item item, int amount)
{
if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) return null;
if (item.skin == 0) return null;
List<Configuration.DropLootSettings> ItemList = config.AnimalSettings.FirstOrDefault(x => x.Value.Where(i => (i.DisplayName == item.name && i.SkinID == item.skin && i.Shortname == item.info.shortname)).Any()).Value;
if (ItemList == null) return null;
foreach (var Item in ItemList.Where(i => i.DisplayName == item.name))
{
Item x = ItemManager.CreateByPartialName(Item.Shortname, amount);
x.name = Item.DisplayName;
x.skin = Item.SkinID;
x.amount = amount;
item.amount -= amount;
return x;
}
return null;
}
object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem)
{
if (item.GetItem().skin != targetItem.GetItem().skin) return false;
return null;
}
object CanStackItem(Item item, Item targetItem)
{
if (item.skin != targetItem.skin) return false;
return null;
}
#endregion
#region Metods
public void GiveItem(BasePlayer player, String Animal)
{
var ItemList = config.AnimalSettings[Animal];
var Item = ItemList.FirstOrDefault(i => IsRandomItem(i.RareDrops));
if (Item == null) return;
Item item = ItemManager.CreateByName(Item.Shortname, RandomAmount(Item.MinimumAmount, Item.MaximumAmount), Item.SkinID);
if (!String.IsNullOrWhiteSpace(Item.DisplayName))
item.name = Item.DisplayName;
player.GiveItem(item);
}
public Boolean IsRandomItem(Single Rare)
{
Boolean Result = UnityEngine.Random.Range(0, 100) >= 100 - Rare;
return Result;
}
public Int32 RandomAmount(Int32 Min, Int32 Max)
{
Int32 Amount = UnityEngine.Random.Range(Min, Max);
return Amount;
}
#endregion
}
}