C#:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins {
[Info("LootItems", "wazzzup", "1.2.1")]
[Description("LootItems")]
public class LootItems : RustPlugin {
public class Loot {
public string containerName;
public bool enabled = false;
public int pickcount = 0;
public List<LootItem> items = new List<LootItem>();
}
public class LootItem {
public string itemname="";
public string name="";
public ulong skin=0;
public int chance=100;
public int minCount=1;
public int maxCount=1;
}
public ConfigData configData;
public class ConfigData {
public Dictionary<string, Loot> loot = new Dictionary<string, Loot>();
public List<string> watchedItems = new List<string>();
}
bool changed = false;
void SaveConfig(ConfigData config) => Config.WriteObject(config, true);
protected override void LoadDefaultConfig() {
configData = new ConfigData();
SaveConfig(configData);
PrintWarning("New configuration file created.");
}
private Dictionary<string, List<LootItem>> RandomList = new Dictionary<string, List<LootItem>>();
public List<int> watchedItems = new List<int>();
void Init() {
configData = Config.ReadObject<ConfigData>();
SaveConfig(configData);
}
void OnServerInitialized() {
cmd.AddConsoleCommand("loot.add", this, "cmdAddContainer");
foreach (var container in UnityEngine.Object.FindObjectsOfType<LootContainer>()) {
if (!configData.loot.ContainsKey(container.ShortPrefabName)) {
changed = true;
configData.loot.Add(container.ShortPrefabName, new Loot() {
containerName = container.ShortPrefabName, items = new List<LootItem>() {
new LootItem()
}
}
);
}
if (configData.loot[container.ShortPrefabName].enabled) {
container.SpawnLoot();
}
}
foreach(var cont in configData.loot) {
if (!cont.Value.enabled) continue;
foreach (LootItem loot in cont.Value.items) {
if (loot.skin == 0UL) continue;
ItemDefinition itemDefinition = ItemManager.itemList.Find(x => x.shortname == loot.itemname);
if (!configData.watchedItems.Contains(loot.itemname)) {
configData.watchedItems.Add(loot.itemname);
changed = true;
}
if (!watchedItems.Contains(itemDefinition.itemid)) {
watchedItems.Add(itemDefinition.itemid);
}
}
foreach(var item in configData.watchedItems) {
ItemDefinition itemDefinition = ItemManager.itemList.Find(x => x.shortname == item);
if (!watchedItems.Contains(itemDefinition.itemid)) {
watchedItems.Add(itemDefinition.itemid);
}
}
if (changed) SaveConfig(configData);
if (cont.Value.pickcount == 0) continue;
RandomList.Add(cont.Key, new List<LootItem>());
foreach(LootItem loot in cont.Value.items) {
for (int j = 1; j <= loot.chance; j++) {
RandomList[cont.Key].Add(loot);
}
}
Shuffle(RandomList[cont.Key]);
}
}
void cmdAddContainer(ConsoleSystem.Arg arg) {
var player = arg.Connection.player as BasePlayer;
if (player == null || player.net.connection.authLevel<2) return;
AddContainer(arg.Args[0], player);
}
void AddContainer(string name, BasePlayer player = null) {
if (player != null) {
Loot loot = new Loot();
loot.containerName = name;
if (player != null) {
loot.items = GetPlayerItems(player);
}
if (!configData.loot.ContainsKey(name)) configData.loot.Add(name, loot);
else configData.loot[name] = loot;
}
else if (!configData.loot.ContainsKey(name)) {
Loot loot = new Loot();
loot.containerName = name;
configData.loot.Add(name, loot);
}
SaveConfig(configData);
}
static List<LootItem> GetPlayerItems(BasePlayer player) {
List<LootItem> items = new List<LootItem>();
foreach (Item item in player.inventory.containerWear.itemList) {
if (item != null) {
var iteminfo = ProcessItem(item, "wear");
items.Add(iteminfo);
}
}
foreach (Item item in player.inventory.containerMain.itemList) {
if (item != null) {
var iteminfo = ProcessItem(item, "main");
items.Add(iteminfo);
}
}
foreach (Item item in player.inventory.containerBelt.itemList) {
if (item != null) {
var iteminfo = ProcessItem(item, "belt");
items.Add(iteminfo);
}
}
return items;
}
static private LootItem ProcessItem(Item item, string container) {
LootItem iItem = new LootItem();
iItem.itemname = item.info.shortname;
iItem.name = "";
iItem.skin = item.skin;
iItem.chance = 100;
iItem.minCount = item.amount;
iItem.maxCount = item.amount;
return iItem;
}
object ManualSpawn(ItemContainer container, string name, bool giveBack = false) {
if (container == null || !configData.loot.ContainsKey(name)) return false;
Loot cont = configData.loot[name];
if (cont == null || !cont.enabled || cont.items.Count < 1) return false;
List<Item> items = null;
if (giveBack) items = new List<Item>();
if (cont.pickcount == 0) {
foreach (LootItem item in cont.items) {
int current = UnityEngine.Random.Range(0, 100);
if (current <= item.chance) {
var obj = PlaceComponent(container, item.itemname, item.skin, item.name, item.minCount, item.maxCount, giveBack);
if (giveBack) items.Add(obj as Item);
}
}
}
else {
for (var i = 1; i <= cont.pickcount; i++) {
LootItem item = RandomList[name].GetRandom();
var obj = PlaceComponent(container, item.itemname, item.skin, item.name, item.minCount, item.maxCount, giveBack);
if (giveBack) items.Add(obj as Item);
}
}
if (giveBack) return items;
return true;
}
void OnLootSpawn(LootContainer container) {
timer.In(1f, () => {
if (container == null || !configData.loot.ContainsKey(container.ShortPrefabName)) return;
Loot cont = configData.loot[container.ShortPrefabName];
if (cont == null || !cont.enabled || cont.items.Count<1) return;
if (cont.pickcount == 0) {
foreach (LootItem item in cont.items) {
int current = UnityEngine.Random.Range(0, 100);
if (current <= item.chance) {
container.inventorySlots = container.inventory.itemList.Count + 5;
container.inventory.capacity = container.inventory.itemList.Count + 5;
container.SendNetworkUpdateImmediate();
PlaceComponent(container, item.itemname, item.skin, item.name, item.minCount, item.maxCount);
}
}
}
else {
for(var i=1;i<=cont.pickcount;i++) {
LootItem item = RandomList[container.ShortPrefabName].GetRandom();
container.inventorySlots = container.inventory.itemList.Count + 5;
container.inventory.capacity = container.inventory.itemList.Count + 5;
container.SendNetworkUpdateImmediate();
PlaceComponent(container, item.itemname, item.skin, item.name, item.minCount, item.maxCount);
}
}
}
);
}
object PlaceComponent(StorageContainer container, string itemname, ulong skinid, string name, int min, int max, bool giveBack = false) {
return PlaceComponent(container.inventory, itemname, skinid, name, min, max);
}
object PlaceComponent(ItemContainer container, string itemname, ulong skinid, string name, int min, int max, bool giveBack = false) {
Item item = ItemManager.CreateByName(itemname, UnityEngine.Random.Range(min, max), skinid);
if (name!="") item.name = name;
if (giveBack) return item;
if (!item.MoveToContainer(container, -1, true)) item.Drop(container.dropPosition, container.dropVelocity, new Quaternion());
return null;
}
object CanStackItem(Item item, Item anotherItem) {
if (watchedItems.Contains(item.info.itemid) && item.skin != anotherItem.skin) {
return false;
}
return null;
}
object OnItemSplit(Item item, int split_Amount) {
if (!watchedItems.Contains(item.info.itemid)) return null;
Item byItemId = ItemManager.CreateByItemID(item.info.itemid, 1, item.skin);
item.amount -= split_Amount;
byItemId.amount = split_Amount;
item.MarkDirty();
return byItemId;
}
object CanCombineDroppedItem(DroppedItem drItem, DroppedItem anotherDrItem) {
if (watchedItems.Contains(drItem.item.info.itemid) && drItem.item.info.itemid == anotherDrItem.item.info.itemid && drItem.item.skin != anotherDrItem.item.skin) return false;
return null;
}
public System.Random rnd = new System.Random();
void Shuffle(List<LootItem> list) {
int n = list.Count;
while (n > 1) {
n--;
int k = rnd.Next(n + 1);
LootItem value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}
}