Иконка ресурса

FREE LootItems : 1.2.1 1.2.1

Нет прав для скачивания
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;
            }
        }
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя 15FPS

Сверху