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

FREE MagicLoot : 0.1.24 0.1.24

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Rust;
namespace Oxide.Plugins {
    [Info("MagicLoot", "Norn / Kunazai", "0.1.24", ResourceId = 2212)]
    [Description("Basic loot multiplier.")]
    class MagicLoot : RustPlugin {
        int VANILLA_MULTIPLIER = 1;
        int MAX_LOOT_CONTAINER_SLOTS = 18;
        bool INIT = false;
        bool LoadedDefaultConfig = false;
        Configuration Exclude = new Configuration();
        Configuration ExcludeFromMultiplication = new Configuration();
        MultiplierConfiguration Components = new MultiplierConfiguration();
        CrateEnabledConfiguration Crates = new CrateEnabledConfiguration();
        MLData LootData = new MLData();
        class MLData {
            public Dictionary<string, int> ExtraLootList = new Dictionary<string, int>();
            public MLData() {
            }
        }
        public class CrateData {
            public bool enabled;
            public int minExtraItems;
            public int maxExtraItems;
            public double lootMultiplier;
            public CrateData() {
                enabled = true;
                minExtraItems = 0;
                maxExtraItems = 0;
                lootMultiplier = 1.0;
            }
        }
        public class MultiplierConfiguration {
            public Dictionary<String, double> list;
            public MultiplierConfiguration() {
                list = new Dictionary<String, double>();
            }
        }
        public class CrateEnabledConfiguration {
            public Dictionary<String, CrateData> list;
            public CrateEnabledConfiguration() {
                list = new Dictionary<String, CrateData>();
            }
        }
        public class Configuration {
            public List<String> list;
            public Configuration() {
                list = new List<String>();
            }
        }
        void SaveMagicLootData() {
            Interface.Oxide.DataFileSystem.WriteObject(this.Title, LootData);
        }
        void LoadMagicLootData() {
            int newitems = 0;
            LootData = Interface.Oxide.DataFileSystem.ReadObject<MLData>(this.Title);
            if (LootData.ExtraLootList.Count == 0) {
                Puts("Generating item list with limits...");
                {
                    foreach (var item in ItemManager.itemList) {
                        LootData.ExtraLootList.Add(item.shortname, item.stackable);
                    }
                    SaveMagicLootData();
                }
            }
            foreach (var item in ItemManager.itemList) {
                if (!LootData.ExtraLootList.ContainsKey(item.shortname)) {
                    LootData.ExtraLootList.Add(item.shortname, item.stackable);
                    newitems++;
                }
            }
            if (newitems != 0) {
                Puts("Added " + newitems.ToString() + " new items to /data/" + this.Title + ".json");
                SaveMagicLootData();
            }
            // RCon Logging
            Puts("Loaded " + LootData.ExtraLootList.Count + " item limits from /data/" + this.Title + ".json");
            Puts("Loaded " + Components.list.Count + " components from /config/" + this.Title + ".json");
        }
        void OnServerInitialized() {
            INIT = true;
            // Server has fully loaded.VerifyConfig();
            if (LoadedDefaultConfig) {
                foreach (ItemDefinition q in ItemManager.itemList.Where(p => p.category == ItemCategory.Component)) {
                    Components.list.Add(q.shortname, 1.0);
                }
                Components.list.Add("antiradpills", 1.0);
                Components.list.Add("wood", 1.0);
                Components.list.Add("apple", 1.0);
                Components.list.Add("chocholate", 1.0);
                Components.list.Add("granolabar", 1.0);
                Components.list.Add("can.beans", 1.0);
                Components.list.Add("can.tuna", 1.0);
                Components.list.Add("metal.fragments", 1.0);
                Components.list.Add("lowgradefuel", 1.0);
                Components.list.Add("largemedkit", 1.0);
                Components.list.Add("syringe.medical", 1.0);
                Components.list.Add("black.raspberries", 1.0);
                Components.list.Add("blueberries", 1.0);
                Components.list.Add("bandage", 1.0);
                Components.list.Add("metal.refined", 1.0);
                Components.list.Add("scrap", 1.0);
                Config["ItemList"] = Components;
                foreach (var container in UnityEngine.Resources.FindObjectsOfTypeAll<LootContainer>().Where(c => c.enabled).Cast<BaseEntity>().GroupBy(c => c.ShortPrefabName).OrderBy(c => c.Key)) {
                    Crates.list.Add(container.Key.ToString(), new CrateData());
                }
                Config["LootContainersEnabled"] = Crates;
                SaveConfig();
                LoadedDefaultConfig = false;
            }
            //if (Config["Loot", "RefreshMinutes"] == null) { Config["Loot", "RefreshMinutes"] = 25; SaveConfig(); }
            //if(Config["Settings", "RefreshMessage"] == null) { Config["Settings", "RefreshMessage"] = true;  SaveConfig(); }
            try {
                Exclude = JsonConvert.DeserializeObject<Configuration>(JsonConvert.SerializeObject(Config["Exclude"]).ToString());
            }
            catch {
                Puts("ERROR: Could not load Exclude list!");
            }
            try {
                Components = JsonConvert.DeserializeObject<MultiplierConfiguration>(JsonConvert.SerializeObject(Config["ItemList"]).ToString());
            }
            catch {
                Puts("ERROR: Could not load Item list!");
            }
            try {
                Crates = JsonConvert.DeserializeObject<CrateEnabledConfiguration>(JsonConvert.SerializeObject(Config["LootContainersEnabled"]).ToString());
            }
            catch {
                Puts("ERROR: Could not load LootContainer list!");
            }
            try {
                ExcludeFromMultiplication = JsonConvert.DeserializeObject<Configuration>(JsonConvert.SerializeObject(Config["ExcludeFromMultiplication"]).ToString());
            }
            catch {
            }
            LoadMagicLootData();
            // RCon Logging
            Puts("Loaded at x" + Config["_Settings", "Multiplier"].ToString() + " vanilla rate | components rate x" + Config["_Settings", "ItemListMultiplier"].ToString() + "  [Extra Loot: " + Config["ExtraLoot", "Enabled"].ToString() + " | X Only Components: " + Config["_Settings", "MultiplyOnlyItemList"].ToString() + "]");
            RefreshLootContainers();
        }
        private readonly Dictionary<string, List<ulong>> skinsCache = new Dictionary<string, List<ulong>>();
        private List<ulong> GetSkins(ItemDefinition def) {
            List<ulong> skins;
            if (skinsCache.TryGetValue(def.shortname, out skins)) return skins;
            skins = new List<ulong> {
                0
            }
            ;
            skins.AddRange(ItemSkinDirectory.ForItem(def).Select(skin => (ulong)skin.id));
            skins.AddRange(Rust.Workshop.Approved.All.Where(skin => skin.Skinnable.ItemName == def.shortname).Select(skin => skin.WorkshopdId));
            skinsCache.Add(def.shortname, skins);
            return skins;
        }
        //List<ItemDefinition> ItemList = new List<ItemDefinition>();
        Dictionary<Rarity, List<ItemDefinition>> RarityList = new Dictionary<Rarity, List<ItemDefinition>>();
        void GenerateRarityList() {
            RarityList.Add(Rarity.Common, new List<ItemDefinition>(ItemManager.itemList.Where(z => z.rarity == Rarity.Common).Select(z => z)));
            Puts("Added " + RarityList[Rarity.Common].Count.ToString() + " items to Common list.");
            RarityList.Add(Rarity.Rare, new List<ItemDefinition>(ItemManager.itemList.Where(z => z.rarity == Rarity.Rare).Select(z => z)));
            Puts("Added " + RarityList[Rarity.Rare].Count.ToString() + " items to Rare list.");
            RarityList.Add(Rarity.Uncommon, new List<ItemDefinition>(ItemManager.itemList.Where(z => z.rarity == Rarity.Uncommon).Select(z => z)));
            Puts("Added " + RarityList[Rarity.Uncommon].Count.ToString() + " items to Uncommon list.");
            RarityList.Add(Rarity.VeryRare, new List<ItemDefinition>(ItemManager.itemList.Where(z => z.rarity == Rarity.VeryRare).Select(z => z)));
            Puts("Added " + RarityList[Rarity.VeryRare].Count.ToString() + " items to Very Rare list.");
            int itemsremoved = 0;
            foreach(var ra in RarityList[Rarity.Common].ToList()) {
                int limit = 0;
                if (LootData.ExtraLootList.TryGetValue(ra.shortname, out limit)) {
                    if (limit == 0) {
                        RarityList[Rarity.Common].Remove(ra);
                        itemsremoved++;
                    }
                }
            }
            foreach(var ra in RarityList[Rarity.Rare].ToList()) {
                int limit = 0;
                if (LootData.ExtraLootList.TryGetValue(ra.shortname, out limit)) {
                    if (limit == 0) {
                        RarityList[Rarity.Rare].Remove(ra);
                        itemsremoved++;
                    }
                }
            }
            foreach (var ra in RarityList[Rarity.Uncommon].ToList()) {
                int limit = 0;
                if (LootData.ExtraLootList.TryGetValue(ra.shortname, out limit)) {
                    if (limit == 0) {
                        RarityList[Rarity.Uncommon].Remove(ra);
                        itemsremoved++;
                    }
                }
            }
            foreach (var ra in RarityList[Rarity.VeryRare].ToList()) {
                int limit = 0;
                if (LootData.ExtraLootList.TryGetValue(ra.shortname, out limit)) {
                    if (limit == 0) {
                        RarityList[Rarity.VeryRare].Remove(ra);
                        itemsremoved++;
                    }
                }
            }
            if(itemsremoved != 0) {
                Puts("Removed " + itemsremoved.ToString() + " items from loot table.[ LIMIT = 0 ]");
            }
        }
        protected override void LoadDefaultConfig() {
            // -- [ RESET ] ---
            Config.Clear();
            Puts("No configuration file found, generating...");
            // -- [ SETTINGS ] ---
            Config["_Settings", "Multiplier"] = VANILLA_MULTIPLIER;
            Config["_Settings", "ItemListMultiplier"] = VANILLA_MULTIPLIER;
            Config["_Settings", "MultiplyOnlyItemList"] = false;
            Config["_Settings", "RandomWorkshopSkins"] = true;
            Config["_Settings", "ForceRefreshDisabledCratesOnLoad"] = false;
            Config["_Settings", "ReportMissingConfigCrates"] = true;
            Config["_Settings", "DisableBlueprintDropMultiplier"] = true;
            Config["_Settings", "DisableBlueprintDrops"] = false;
            Config["ExtraLoot", "Enabled"] = false;
            Config["ExtraLoot", "VanillaLootTablesOnly"] = true;
            Config["ExtraLoot", "ExtraItemsMin"] = 1;
            Config["ExtraLoot", "ExtraItemsMax"] = 3;
            Config["ExtraLoot", "ItemStackSizeMin"] = 1;
            Config["ExtraLoot", "PreventDuplicates"] = false;
            Config["DeveloperDebug", "_EnableLogs"] = false;
            Config["DeveloperDebug", "Skins"] = false;
            Config["DeveloperDebug", "AmountChange"] = false;
            Config["DeveloperDebug", "ExtraItem"] = false;
            Config["DeveloperDebug", "LootRefresh"] = false;
            //Exclude.list.Add("supply.signal");
            Exclude.list.Add("ammo.rocket.smoke");
            Config["Exclude"] = Exclude;
            ExcludeFromMultiplication.list.Add("crude.oil");
            Config["ExcludeFromMultiplication"] = ExcludeFromMultiplication;
            if (INIT) {
                foreach (ItemDefinition q in ItemManager.itemList.Where(p => p.category == ItemCategory.Component)) {
                    Components.list.Add(q.shortname, 1.0);
                }
                Components.list.Add("antiradpills", 1.0);
                Components.list.Add("wood", 1.0);
                Components.list.Add("apple", 1.0);
                Components.list.Add("chocholate", 1.0);
                Components.list.Add("granolabar", 1.0);
                Components.list.Add("can.beans", 1.0);
                Components.list.Add("can.tuna", 1.0);
                Components.list.Add("metal.fragments", 1.0);
                Components.list.Add("lowgradefuel", 1.0);
                Components.list.Add("largemedkit", 1.0);
                Components.list.Add("syringe.medical", 1.0);
                Components.list.Add("black.raspberries", 1.0);
                Components.list.Add("blueberries", 1.0);
                Components.list.Add("bandage", 1.0);
                Components.list.Add("metal.refined", 1.0);
                Components.list.Add("scrap", 1.0);
            }
            else LoadedDefaultConfig = true;
            Puts("Added " + Components.list.Count.ToString() + " components to configuration file.");
            Config["ItemList"] = Components;
            //foreach (var container in UnityEngine.Resources.FindObjectsOfTypeAll<LootContainer>().Where(c => c.isActiveAndEnabled).Cast<BaseEntity>().GroupBy(c => c.ShortPrefabName))
            if (INIT) {
                foreach (var container in UnityEngine.Resources.FindObjectsOfTypeAll<LootContainer>().Where(c => c.enabled).Cast<BaseEntity>().GroupBy(c => c.ShortPrefabName).OrderBy(c => c.Key)) {
                    Crates.list.Add(container.Key.ToString(), new CrateData());
                }
            }
            else LoadedDefaultConfig = true;
            //if (!Crates.list.ContainsKey("crate_elite")) Crates.list.Add("crate_elite", true);
            //if (!Crates.list.ContainsKey("bradley_crate")) Crates.list.Add("bradley_crate", false);
            //if (!Crates.list.ContainsKey("heli_crate")) Crates.list.Add("heli_crate", false);
            //if (!Crates.list.ContainsKey("supply_drop")) Crates.list.Add("supply_drop", false);
            Config["LootContainersEnabled"] = Crates;
        }
        private void VerifyConfig() {
            bool doSave = false;
            // -- [ SETTINGS ] ---
            if (Config["_Settings", "Multiplier"] == null) {
                Config["_Settings", "Multiplier"] = VANILLA_MULTIPLIER;
                doSave = true;
            }
            if (Config["_Settings", "ItemListMultiplier"] == null) {
                Config["_Settings", "ItemListMultiplier"] = VANILLA_MULTIPLIER;
                doSave = true;
            }
            if (Config["_Settings", "MultiplyOnlyItemList"] == null) {
                Config["_Settings", "MultiplyOnlyItemList"] = false;
                doSave = true;
            }
            if (Config["_Settings", "RandomWorkshopSkins"] == null) {
                Config["_Settings", "RandomWorkshopSkins"] = true;
                doSave = true;
            }
            if (Config["_Settings", "ForceRefreshDisabledCratesOnLoad"] == null) {
                Config["_Settings", "ForceRefreshDisabledCratesOnLoad"] = false;
                doSave = true;
            }
            if (Config["_Settings", "ReportMissingConfigCrates"] == null) {
                Config["_Settings", "ReportMissingConfigCrates"] = true;
                doSave = true;
            }
            if (Config["_Settings", "DisableBlueprintDropMultiplier"] == null) {
                Config["_Settings", "DisableBlueprintDropMultiplier"] = true;
                doSave = true;
            }
            if (Config["_Settings", "DisableBlueprintDrops"] == null) {
                Config["_Settings", "DisableBlueprintDrops"] = false;
                doSave = true;
            }
            if (Config["ExtraLoot", "Enabled"] == null) {
                Config["ExtraLoot", "Enabled"] = false;
                doSave = true;
            }
            if (Config["ExtraLoot", "VanillaLootTablesOnly"] == null) {
                Config["ExtraLoot", "VanillaLootTablesOnly"] = true;
                doSave = true;
            }
            if (Config["ExtraLoot", "ExtraItemsMin"] == null) {
                Config["ExtraLoot", "ExtraItemsMin"] = 1;
                doSave = true;
            }
            if (Config["ExtraLoot", "ExtraItemsMax"] == null) {
                Config["ExtraLoot", "ExtraItemsMax"] = 3;
                doSave = true;
            }
            if (Config["ExtraLoot", "ItemStackSizeMin"] == null) {
                Config["ExtraLoot", "ItemStackSizeMin"] = 1;
                doSave = true;
            }
            if (Config["ExtraLoot", "PreventDuplicates"] == null) {
                Config["ExtraLoot", "PreventDuplicates"] = false;
                doSave = true;
            }
            if (Config["DeveloperDebug", "_EnableLogs"] == null) {
                Config["DeveloperDebug", "_EnableLogs"] = false;
                doSave = true;
            }
            if (Config["DeveloperDebug", "Skins"] == null) {
                Config["DeveloperDebug", "Skins"] = false;
                doSave = true;
            }
            if (Config["DeveloperDebug", "AmountChange"] == null) {
                Config["DeveloperDebug", "AmountChange"] = false;
                doSave = true;
            }
            if (Config["DeveloperDebug", "ExtraItem"] == null) {
                Config["DeveloperDebug", "ExtraItem"] = false;
                doSave = true;
            }
            if (Config["DeveloperDebug", "LootRefresh"] == null) {
                Config["DeveloperDebug", "LootRefresh"] = false;
                doSave = true;
            }
            if (Config["Exclude"] == null) {
                Config["Exclude"] = Exclude;
                doSave = true;
            }
            if (Config["ExcludeFromMultiplication"] == null) {
                Config["ExcludeFromMultiplication"] = ExcludeFromMultiplication;
                doSave = true;
            }
            if (Config["ItemList"] == null) {
                Config["ItemList"] = Components;
                doSave = true;
            }
            if (Config["LootContainersEnabled"] == null) {
                Config["LootContainersEnabled"] = Crates;
                doSave = true;
            }
            if (doSave) SaveConfig();
        }
        private IEnumerable<int> CalculateStacks(int amount, ItemDefinition item) {
            var results = Enumerable.Repeat(item.stackable, amount / item.stackable);
            if (amount % item.stackable > 0) {
                results = results.Concat(Enumerable.Repeat(amount % item.stackable, 1));
            }
            return results;
        }
        private void RefreshLootContainers() {
            int count = 0;
            foreach (var container in UnityEngine.Object.FindObjectsOfType<LootContainer>()) {
                if (IsLootContainerEnabled(container)) {
                    RepopulateContainer(container);
                    count++;
                }
                /*
				else if (Convert.ToBoolean(Config["_Settings", "ForceRefreshDisabledCratesOnLoad"]))
				{
					container.SpawnLoot();
				}
				*/
            }
            Puts("Repopulated " + count.ToString() + " loot containers.");
        }
        private bool IsLootContainerEnabled(LootContainer container) {
            CrateData data = null;
            if (!Crates.list.TryGetValue(container.ShortPrefabName.ToString(), out data) || data == null) {
                if (Convert.ToBoolean(Config["_Settings", "ReportMissingConfigCrates"])) Puts("Auto added " + container.ShortPrefabName.ToString() + " to config.");
                Crates.list.Add(container.ShortPrefabName.ToString(), new CrateData());
                Config["LootContainersEnabled"] = Crates;
                SaveConfig();
            }
            /*
				if (!enabled)
					Puts("" + container.ShortPrefabName.ToString() + " is not enabled; MagicLoot skipped");
				*/
            return (data != null && data.enabled != null && data.enabled);
        }
        private void SpawnExtraVanillaLoot(LootContainer container) {
            CrateData data = null;
            int min = Convert.ToInt16(Config["ExtraLoot", "ExtraItemsMin"]);
            int max = Convert.ToInt16(Config["ExtraLoot", "ExtraItemsMax"]);
            if (Crates.list.TryGetValue(container.ShortPrefabName.ToString(), out data) && data != null) {
                min += data.minExtraItems;
                max += data.maxExtraItems;
            }
            int itemsToGive = UnityEngine.Random.Range(min, max);
            int tempCapacity = container.inventory.capacity;
            container.inventory.capacity = MAX_LOOT_CONTAINER_SLOTS;
            container.inventorySlots = MAX_LOOT_CONTAINER_SLOTS;
            //Puts("subspawn length: " + container.lootDefinition.subSpawn.Length + " " + container + " give: " + itemsToGive + "  min/max: " + Convert.ToInt16(Config["ExtraLoot", "ExtraItemsMin"]) + "/" + Convert.ToInt16(Config["ExtraLoot", "ExtraItemsMax"]));
            //Puts("itemsToGive: " + itemsToGive + "  min/max: " + min + "/" + max + " - " + container);
            SpawnItem(container, itemsToGive);
            int fcapacity = Math.Max(tempCapacity, container.inventory.itemList.Count());
            container.inventory.capacity = fcapacity;
            container.inventorySlots = fcapacity;
        }
        private void SpawnItem(LootContainer container, int itemsToSpawn = 1) {
            if (container.lootDefinition != null) {
                for (int i = 0; i < itemsToSpawn; i++) {
                    container.lootDefinition.SpawnIntoContainer(container.inventory);
                }
            }
            if (container.SpawnType == LootContainer.spawnType.ROADSIDE || container.SpawnType == LootContainer.spawnType.TOWN) {
                foreach (Item item in container.inventory.itemList) {
                    if (!item.hasCondition) {
                        continue;
                    }
                    item.condition = UnityEngine.Random.Range(item.info.condition.foundCondition.fractionMin, item.info.condition.foundCondition.fractionMax) * item.info.condition.max;
                }
            }
        }
        void RepopulateContainer(LootContainer container) {
            if (container != null) {
                ClearContainer(container);
                container.PopulateLoot();
                if (Convert.ToBoolean(Config["ExtraLoot", "Enabled"]) && Convert.ToBoolean(Config["ExtraLoot", "VanillaLootTablesOnly"]))  // Extra Loot Items
                {
                    SpawnExtraVanillaLoot(container);
                }
                // Check for blueprint drops to remove
                if (Convert.ToBoolean(Config["_Settings", "DisableBlueprintDrops"])) {
                    int count = 0;
                    int itemsToReplace = 0;
                    bool foundBlueprint = true;
                    List<Item> ItemsToRemove = new List<Item>();
                    while (count < 3 && foundBlueprint) {
                        for (int i = 0; i < itemsToReplace; i++) {
                            SpawnItem(container);
                        }
                        // iterate through inventory to find blueprints and mark for removal.foreach (Item lootitem in container.inventory.itemList) { if (lootitem.IsBlueprint()) { ItemsToRemove.Add(lootitem); continue; } }
                        if (ItemsToRemove.Count > 0) {
                            itemsToReplace = ItemsToRemove.Count;
                            foreach (Item k in ItemsToRemove) {
                                //Puts("" + k + " was removed from " + container + " at " + container.GetEstimatedWorldPosition());
                                container.inventory.itemList.Remove(k);
                                k.RemoveFromContainer();
                            }
                            ItemsToRemove.Clear();
                        }
                        else {
                            foundBlueprint = false;
                        }
                        count++;
                    }
                }
                ModifyContainerContents(container);
            }
        }
        void ClearContainer(LootContainer container) {
            while (container.inventory.itemList.Count > 0) {
                var item = container.inventory.itemList[0];
                item.RemoveFromContainer();
                item.Remove(0f);
            }
        }
        void ModifyContainerContents(BaseNetworkable entity) {
            var e = entity as LootContainer;
            if (e?.inventory?.itemList == null) return;
            List<Rarity> RaritiesUsed = new List<Rarity>();
            List<Item> ItemsToRemove = new List<Item>();
            foreach (Item lootitem in e.inventory.itemList) {
                if (Exclude.list.Contains(lootitem.info.shortname)) {
                    ItemsToRemove.Add(lootitem);
                    continue;
                }
                if (lootitem.IsBlueprint() && Convert.ToBoolean(Config["_Settings", "DisableBlueprintDropMultiplier"])) {
                    continue;
                }
                if (ExcludeFromMultiplication.list.Contains(lootitem.info.shortname)) {
                    continue;
                }
                var skins = GetSkins(ItemManager.FindItemDefinition(lootitem.info.itemid));
                if (skins.Count > 1 && Convert.ToBoolean(Config["_Settings", "RandomWorkshopSkins"]))  // If workshop skins enabled, randomise skin
                {
                    lootitem.skin = skins.GetRandom();
                    if (lootitem.GetHeldEntity() != null) {
                        lootitem.GetHeldEntity().skinID = lootitem.skin;
                    }
                    // Debug msges
                    if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "Skins"])) {
                        string debugs = "[" + lootitem.info.displayName.english + "] Skin has been modified to: " + lootitem.skin;
                        Puts(debugs);
                        PrintToChat(debugs);
                    }
                }
                double multiplier = 1.0;
                if (Components.list.TryGetValue(lootitem.info.shortname, out multiplier)) {
                    CrateData data = null;
                    Crates.list.TryGetValue(e.ShortPrefabName.ToString(), out data);
                    if (Convert.ToInt16(Config["_Settings", "ItemListMultiplier"]) != VANILLA_MULTIPLIER || multiplier != VANILLA_MULTIPLIER || (data != null && data.lootMultiplier != VANILLA_MULTIPLIER) ) {
                        if (lootitem.info.stackable > 1)  // Detect whether to change Amounts
                        {
                            // Debug msges
                            if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "AmountChange"])) {
                                string debugs = "[<color=green>" + e.GetInstanceID().ToString() + "</color> | " + e.ShortPrefabName + "] <color=yellow>" + lootitem.info.displayName.english + " : original amount: " + lootitem.amount.ToString() + "</color>";
                                Puts(debugs);
                                PrintToChat(debugs);
                            }
                            double crateMult = 1.0;
                            if (data != null) crateMult = data.lootMultiplier;
                            int limit = 0;
                            int ac = (int) (lootitem.amount * Convert.ToUInt16(Config["_Settings", "ItemListMultiplier"]) * multiplier * crateMult);
                            if (LootData.ExtraLootList.TryGetValue(lootitem.info.shortname, out limit)) {
                                lootitem.amount = Math.Min(ac, Math.Min(limit, lootitem.info.stackable));
                            }
                            else {
                                break;
                            }
                            if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "AmountChange"])) {
                                string debugs = "[<color=green>" + e.GetInstanceID().ToString() + "</color> | " + e.ShortPrefabName + "] <color=white>" + lootitem.info.displayName.english + " : new amount: " + lootitem.amount.ToString() + "</color>";
                                Puts(debugs);
                                PrintToChat(debugs);
                            }
                        }
                    }
                }
                else {
                    CrateData data = null;
                    Crates.list.TryGetValue(e.ShortPrefabName.ToString(), out data);
                    if (Convert.ToInt16(Config["_Settings", "Multiplier"]) != VANILLA_MULTIPLIER || (data != null && data.lootMultiplier != VANILLA_MULTIPLIER)) {
                        if (lootitem.info.stackable > 1 && !Convert.ToBoolean(Config["_Settings", "MultiplyOnlyItemList"]))  // Detect whether to change Amounts
                        {
                            // Debug msges
                            if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "AmountChange"])) {
                                string debugs = "[<color=green>" + e.GetInstanceID().ToString() + "</color> | " + e.ShortPrefabName + "] <color=yellow>" + lootitem.info.displayName.english + " : original amount: " + lootitem.amount.ToString() + "</color>";
                                Puts(debugs);
                                PrintToChat(debugs);
                            }
                            double crateMult = 1.0;
                            if (data != null) crateMult = data.lootMultiplier;
                            int limit = 0;
                            int ac = (int) (lootitem.amount * Convert.ToUInt16(Config["_Settings", "Multiplier"]) * crateMult);
                            if (LootData.ExtraLootList.TryGetValue(lootitem.info.shortname, out limit)) {
                                lootitem.amount = Math.Min(ac, Math.Min(limit, lootitem.info.stackable));
                            }
                            else {
                                break;
                            }
                            // Debug msges
                            if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "AmountChange"])) {
                                string debugs = "[<color=green>" + e.GetInstanceID().ToString() + "</color> | " + e.ShortPrefabName + "] <color=white>" + lootitem.info.displayName.english + " : new amount: " + lootitem.amount.ToString() + "</color>";
                                Puts(debugs);
                                PrintToChat(debugs);
                            }
                        }
                    }
                }
                if (lootitem.info.rarity != Rarity.None && !RaritiesUsed.Contains(lootitem.info.rarity)) {
                    RaritiesUsed.Add(lootitem.info.rarity);
                }
            }
            if (ItemsToRemove.Count > 0) {
                foreach (Item k in ItemsToRemove) {
                    k.RemoveFromContainer();
                    e.inventory.itemList.Remove(k);
                }
            }
            if (Convert.ToBoolean(Config["ExtraLoot", "Enabled"]) && !Convert.ToBoolean(Config["ExtraLoot", "VanillaLootTablesOnly"]))  // Extra Loot Items
            {
                if (RarityList.Count == 0) {
                    GenerateRarityList();
                }
                //Puts("RarityList.Count: " + RarityList.Count + "  RaritiesUsed.Count - " + RaritiesUsed.Count + " " + e.GetEstimatedWorldPosition());
                if (RaritiesUsed.Count >= 1 && RaritiesUsed != null) {
                    Rarity rarity = RaritiesUsed.GetRandom();
                    ItemDefinition item;
                    CrateData data = null;
                    int min = Convert.ToInt16(Config["ExtraLoot", "ExtraItemsMin"]);
                    int max = Convert.ToInt16(Config["ExtraLoot", "ExtraItemsMax"]);
                    if (Crates.list.TryGetValue(e.ShortPrefabName.ToString(), out data) && data != null) {
                        min += data.minExtraItems;
                        max += data.maxExtraItems;
                    }
                    int itemstogive = UnityEngine.Random.Range(min, max);
                    int tempCap = e.inventory.capacity;
                    e.inventory.capacity = MAX_LOOT_CONTAINER_SLOTS;
                    e.inventorySlots = MAX_LOOT_CONTAINER_SLOTS;
                    for (int i = 1; i <= itemstogive; i++) {
                        item = RarityList[rarity].GetRandom();
                        if (e.inventory.FindItemsByItemID(item.itemid).Count >= 1 && item.stackable == 1 && Convert.ToBoolean(Config["ExtraLoot", "PreventDuplicates"])) {
                            break;
                        }
                        if (item != null) {
                            if (Exclude.list.Contains(item.shortname)) {
                                break;
                            }
                            int limit = 0;
                            int amounttogive = 0;
                            if (LootData.ExtraLootList.TryGetValue(item.shortname, out limit) && item.stackable > 1) {
                                amounttogive = UnityEngine.Random.Range(Convert.ToInt16(Config["ExtraLoot", "ItemStackSizeMin"]), Math.Min(limit, item.stackable));
                            }
                            else {
                                amounttogive = item.stackable;
                            }
                            var skins = GetSkins(item);
                            if (skins.Count > 1 && Convert.ToBoolean(Config["_Settings", "RandomWorkshopSkins"])) {
                                Item skinned = ItemManager.CreateByItemID(item.itemid, amounttogive, skins.GetRandom());
                                skinned.MoveToContainer(e.inventory, -1, false);
                            }
                            else {
                                e.inventory.AddItem(item, amounttogive);
                            }
                            // Debug msges
                            if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "ExtraItem"])) {
                                string debugs = "[<color=green>" + e.GetInstanceID().ToString() + "</color> | " + e.ShortPrefabName + "] <color=white>Extra Item: " + item.displayName.english + " : amount: " + amounttogive.ToString() + "</color>";
                                Puts(debugs);
                                PrintToChat(debugs);
                            }
                        }
                    }
                    int fcapacity = Math.Max(tempCap, e.inventory.itemList.Count());
                    e.inventory.capacity = fcapacity;
                    e.inventorySlots = fcapacity;
                }
            }
        }
        object OnLootSpawn(LootContainer container) {
            if (INIT) {
                if (container?.inventory?.itemList == null) return null;
                if (!IsLootContainerEnabled(container)) return null;
                RepopulateContainer(container);
                // Debug msg
                if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "LootRefresh"])) {
                    string debugs = "Repopulated: " + container.ToString() + " : isLootable[" + container.isLootable + "]";
                    Puts(debugs);
                }
                if (container.shouldRefreshContents && container.isLootable) {
                    // Debug msg
                    if (Convert.ToBoolean(Config["DeveloperDebug", "_EnableLogs"]) && Convert.ToBoolean(Config["DeveloperDebug", "LootRefresh"])) {
                        string debugs = "Invoked refresh on " + container.ToString();
                        Puts(debugs);
                    }
                    container.Invoke(new Action(container.SpawnLoot), UnityEngine.Random.Range(container.minSecondsBetweenRefresh, container.maxSecondsBetweenRefresh));
                }
                return container;
            }
            return null;
        }
    }
}

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