Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of EnemiesWithItems v3.0.8
plugins/EnemiesWithItems/EnemiesWithItems.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using HG; using HG.Reflection; using RoR2; using RoR2.CharacterAI; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("EnemiesWithItems")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("EnemiesWithItems")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("3.0.8.0")] [module: UnverifiableCode] namespace BaddiesWithItems; [BepInPlugin("com.Anreol.EnemiesWithItems", "EnemiesWithItems", "3.0.8")] public class EnemiesWithItems : BaseUnityPlugin { internal const string ModIdentifier = "EnemiesWithItems"; internal const string ModVer = "3.0.8"; public static EnemiesWithItems instance; public static ConfigEntry<bool> GenerateItems; public static ConfigEntry<string> ItemMultiplier; public static ConfigEntry<string> MaxItemsToGenerateMultiplier; public static ConfigEntry<bool> FixItemMultiplierCaps; public static ConfigEntry<bool> Scaling; public static ConfigEntry<int> StageReq; public static ConfigEntry<string> InheritItemsChance; public static ConfigEntry<bool> InheranceBlacklist; public static ConfigEntry<string> EquipGenChance; public static ConfigEntry<string> ConfigItemBlacklist; public static ConfigEntry<string> ConfigEquipBlacklist; public static ConfigEntry<string> ConfigItemLimiter; public static ConfigEntry<string> ConfigItemTiersEnabledWeights; public static ConfigEntry<string> ConfigItemTiersCaps; public static ConfigEntry<bool> Limiter; public static ConfigEntry<bool> EquipItems; public static ConfigEntry<bool> AutoBanEquipElite; public static ConfigEntry<bool> AutoBanItemAIBlacklisted; public static ConfigEntry<bool> AutoBanItemWorldUniqueAndScrap; public static ConfigEntry<bool> UmbraeBlacklistLimitOperation; public static ConfigEntry<bool> UmbraeMultiplyOperation; public static ConfigEntry<string> DropChance; public static EquipmentDef[] EquipmentBlackList = (EquipmentDef[])(object)new EquipmentDef[0]; public static ItemDef[] ItemBlackList = (ItemDef[])(object)new ItemDef[0]; public static ItemTierDef[] AvailableItemTierDefs = (ItemTierDef[])(object)new ItemTierDef[0]; public static float[] ItemTierWeights = new float[0]; public static int[] ItemTierCaps = new int[0]; public static Dictionary<ItemDef, int> LimitedItemsDictionary = new Dictionary<ItemDef, int>(); public void InitConfigFileValues() { GenerateItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Generator Settings", "GenerateItems", true, "Toggles item generation for enemies."); Scaling = ((BaseUnityPlugin)this).Config.Bind<bool>("Generator Settings", "ScaleAllPlayers", true, "Toggles how the mod balances potential item amount per enemy.\nTrue: Total items of all players\nFalse: Average item count from players"); EquipGenChance = ((BaseUnityPlugin)this).Config.Bind<string>("Generator Settings", "EquipGenChance", "10", "The percent chance for generating a Use item."); InheritItemsChance = ((BaseUnityPlugin)this).Config.Bind<string>("Generator Settings", "InheritItemsChance", "0", "Percent chance for enemies to randomly inherit items from a random player.\nOverrides Generator Settings whenever it happens.\nSet to zero (0) or less to disable."); InheranceBlacklist = ((BaseUnityPlugin)this).Config.Bind<bool>("Generator Settings", "InheranceBlacklist", false, "Should enemies that inherit items, including doppelgangers or gummy clones get their items removed depending on the item blacklist. Default to false to don't mess third-party item additions."); ItemMultiplier = ((BaseUnityPlugin)this).Config.Bind<string>("Generator Settings", "ItemMultiplier", "1", "Multiplies a item generation's amount by this. If inhiring, it multiplies all stacks instead.\nKeep in mind that limiters and caps will apply if possible after multiplication."); MaxItemsToGenerateMultiplier = ((BaseUnityPlugin)this).Config.Bind<string>("Generator Settings", "MaxItemsToGenerateMultiplier", "1", "Multiplies the maximum amount of items to generate by this.\nExtremely destructive, and scales over time. Not recommended."); FixItemMultiplierCaps = ((BaseUnityPlugin)this).Config.Bind<bool>("Generator Settings", "FixItemMultiplierCaps", true, "Whenever item amounts that exceed the current generation cap thanks to a modified ItemMultiplier value should get capped or not.\nSet to false for pre-3.0.4 behavior."); StageReq = ((BaseUnityPlugin)this).Config.Bind<int>("General Settings", "StageReq", 6, "Sets the stage where enemies start to inherit/generate items. If in the final stage in the first loop, it will not apply."); Limiter = ((BaseUnityPlugin)this).Config.Bind<bool>("Generator Settings", "Limiter", true, "Should it clean up the enemies' inventories post item generation to accomodate the item limiter blacklist. Affects normal and inherance generations."); DropChance = ((BaseUnityPlugin)this).Config.Bind<string>("General Settings", "DropChance", "0.1", "Sets the percent chance that an enemy drops one of their items.\nDefault 0.1 means average 1 in a 1000 kills will result in a drop.\nSet to zero (0) to disable dropping."); ConfigItemTiersEnabledWeights = ((BaseUnityPlugin)this).Config.Bind<string>("General Settings", "ConfigItemTiersWeights", "Tier1-40, Tier2-20, Tier3-1, Lunar-0.5", "Percentage chance of items of a certain Item Tier enum (to be queried to ItemTierDef) to be generated.\nEnter the names of Item Tiers as X-Y separated by a comma and a space. X as tier name & Y as percentage. ex) Tier1-40, Tier2-20, VoidTier1-2.\nA item tier lacking an entry here WILL NOT be generated."); ConfigItemTiersCaps = ((BaseUnityPlugin)this).Config.Bind<string>("General Settings", "ConfigItemTiersCaps", "Tier1-0, Tier2-0, Tier3-0, Lunar-0", "Max of items of a certain Item Tier enum (to be queried to ItemTierDef) to be generated.\nEnter the names of the Item Tiers as X-Y separated by a comma and a space. X as tier name & Y as percentage. ex) Tier1-40, Tier2-20, VoidTier1-2.\nA zero (0) disables the cap. Item tiers lacking an entry here, but that exists in ConfigItemTiersEnabledWeights/ConfigItemTiersWeights will default to zero."); EquipItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Generator Settings", "EquipItems", false, "Toggles Use items to be inherited/generated."); AutoBanEquipElite = ((BaseUnityPlugin)this).Config.Bind<bool>("Automatic Ban Lists", "EquipAutoBanElite", true, "Should all elite equipment be automatically put in the blacklist. Works for a few unused elites or modded ones (if they were added to the game properly)."); AutoBanItemAIBlacklisted = ((BaseUnityPlugin)this).Config.Bind<bool>("Automatic Ban Lists", "ItemAutoBanAIBlacklisted", true, "Should all items with the AI blacklisted tag be automatically put in the blacklist. Disable at your own volition! They are blacklisted for a reason."); AutoBanItemWorldUniqueAndScrap = ((BaseUnityPlugin)this).Config.Bind<bool>("Automatic Ban Lists", "AutoBanItemWorldUniqueAndScrap", true, "Should all items that are considered scrap and items that are World Unique (Halcyon Seed or pearls, for example) be banned automatically."); ConfigItemBlacklist = ((BaseUnityPlugin)this).Config.Bind<string>("Ban Lists", "ConfigItemBlacklist", "Missile, Bear, ExplodeOnDeath, NovaOnHeal, BounceNearby, StickyBomb, RoboBallBuddy", "Enter ItemDef names separated by a comma and a space to blacklist certain items. ex) PersonalShield, Syringe\nBasegame ItemDef names: https://risk-of-thunder.github.io/R2Wiki/Mod-Creation/Developer-Reference/Items-and-Equipments-Data/"); ConfigEquipBlacklist = ((BaseUnityPlugin)this).Config.Bind<string>("Ban Lists", "ConfigEquipBlacklist", "CommandMissile, Blackhole, GhostGun, DroneBackup, OrbitalLaser, BFG, Enigma, Lightning, GoldGat, BurnNearby, Scanner, Gateway, FireBallDash, Recycle", "Enter EquipmentDef names separated by a comma and a space to blacklist certain equipments. ex) Saw, DroneBackup\nBasegame EquipmentDef names: https://risk-of-thunder.github.io/R2Wiki/Mod-Creation/Developer-Reference/Items-and-Equipments-Data/#equipments"); ConfigItemLimiter = ((BaseUnityPlugin)this).Config.Bind<string>("Ban Lists", "ConfigItemLimiter", "HealWhileSafe-10, SlowOnHit-1, Medkit-4, Behemoth-2, BleedOnHit-3, IgniteOnKill-2, AutoCastEquipment-1, NearbyDamageBonus-3, DeathMark-0, ArmorPlate-0", "Enter ItemDef names as X-Y separated by a comma and a space to apply caps to certain items. X is the item code name and Y is the number cap. ex) PersonalShield-20, Syringe-5. A zero (0) makes the item be limited by the current number of cleared stages."); UmbraeBlacklistLimitOperation = ((BaseUnityPlugin)this).Config.Bind<bool>("Vengeance Configuration", "UmbraeBlacklistLimitOperation", false, "If UmbraeBlacklistLimitOperation is true, should umbrae or gummy clones get their inventory go through a similar operation as normal inherance does:\n1. Blacklist, if InheranceBlacklist is enabled, 2. Multiply whole inventory by the current ItemMultiplier if UmbraeMultiplyOperation is enabled. 3. Limit items by the limiter list if the Limiter is enabled."); UmbraeMultiplyOperation = ((BaseUnityPlugin)this).Config.Bind<bool>("Vengeance Configuration", "UmbraeMultiplyOperation", false, "If UmbraeMultiplyOperation and UmbraeBlacklistLimitOperation are true, should umbrae or gummy clones get their WHOLE inventory multiplied by the current ItemMultiplier."); } public static float ConfigToFloat(string configline) { if (float.TryParse(configline, out var result)) { return result; } return 1f; } public void Awake() { instance = this; RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate { Debug.LogWarning((object)"Loading EnemiesWithItems 3.0.8..."); InitConfigFileValues(); RebuildConfig(); Debug.Log((object)"EnemiesWithItems 3.0.8 Loaded!"); }); Run.onRunStartGlobal += delegate { RebuildConfig(); }; } public static void AppendEliteEquipment() { EliteDef[] eliteDefs = EliteCatalog.eliteDefs; foreach (EliteDef val in eliteDefs) { ArrayUtils.ArrayAppend<EquipmentDef>(ref EquipmentBlackList, ref val.eliteEquipmentDef); } } public static void AppendAIBlacklisted() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) ItemIndex[] array = ((IEnumerable<ItemIndex>)(object)ItemCatalog.allItems).Where((ItemIndex thing) => ItemCatalog.GetItemDef(thing).ContainsTag((ItemTag)4)).ToArray(); for (int i = 0; i < array.Length; i++) { ItemDef itemDef = ItemCatalog.GetItemDef(array[i]); if ((Object)(object)itemDef != (Object)null) { ArrayUtils.ArrayAppend<ItemDef>(ref ItemBlackList, ref itemDef); } } } public static void AppendWorldUniqueAndScrap() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) ItemIndex[] array = ((IEnumerable<ItemIndex>)(object)ItemCatalog.allItems).Where((ItemIndex thing) => ItemCatalog.GetItemDef(thing).ContainsTag((ItemTag)10) || ItemCatalog.GetItemDef(thing).ContainsTag((ItemTag)9)).ToArray(); for (int i = 0; i < array.Length; i++) { ItemDef itemDef = ItemCatalog.GetItemDef(array[i]); if ((Object)(object)itemDef != (Object)null) { ArrayUtils.ArrayAppend<ItemDef>(ref ItemBlackList, ref itemDef); } } } public void RebuildConfig() { AvailableItemTierDefs = (ItemTierDef[])(object)new ItemTierDef[0]; ItemTierWeights = new float[0]; ItemBlackList = (ItemDef[])(object)new ItemDef[0]; EquipmentBlackList = (EquipmentDef[])(object)new EquipmentDef[0]; LimitedItemsDictionary.Clear(); ReadConfigItemTiers(); ReadConfigItemTierLimiter(); ReadConfigEquipmentBlacklist(); ReadConfigItemBlacklist(); ReadConfigItemLimiter(); if (AutoBanEquipElite.Value) { AppendEliteEquipment(); } if (AutoBanItemAIBlacklisted.Value) { AppendAIBlacklisted(); } if (AutoBanItemWorldUniqueAndScrap.Value) { AppendWorldUniqueAndScrap(); } PickupLists.BuildItemAndEquipmentDictionaries(); Debug.Log((object)"EnemiesWithItems config loaded."); } public static void ReadConfigEquipmentBlacklist() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Invalid comparison between Unknown and I4 string[] array = ConfigEquipBlacklist.Value.Split(new char[2] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { EquipmentDef equipmentDef = EquipmentCatalog.GetEquipmentDef(EquipmentCatalog.FindEquipmentIndex(array[i])); if ((Object)(object)equipmentDef != (Object)null && (int)equipmentDef.equipmentIndex != -1) { ArrayUtils.ArrayAppend<EquipmentDef>(ref EquipmentBlackList, ref equipmentDef); } } } public static void ReadConfigItemBlacklist() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Invalid comparison between Unknown and I4 string[] array = ConfigItemBlacklist.Value.Split(new char[2] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { ItemDef itemDef = ItemCatalog.GetItemDef(ItemCatalog.FindItemIndex(array[i])); if ((Object)(object)itemDef != (Object)null && (int)itemDef.itemIndex != -1) { ArrayUtils.ArrayAppend<ItemDef>(ref ItemBlackList, ref itemDef); } } } public static void ReadConfigItemLimiter() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Invalid comparison between Unknown and I4 string[] array = ConfigItemLimiter.Value.Split(new char[2] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { '-' }); if (array2.Length == 2) { ItemDef itemDef = ItemCatalog.GetItemDef(ItemCatalog.FindItemIndex(array2[0])); if (!LimitedItemsDictionary.ContainsKey(itemDef) && (int)itemDef.itemIndex != -1 && int.TryParse(array2[1], out var result)) { LimitedItemsDictionary.Add(itemDef, result); } } } } public static void ReadConfigItemTiers() { //IL_0051: Unknown result type (might be due to invalid IL or missing references) string[] array = ConfigItemTiersEnabledWeights.Value.Split(new char[2] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { '-' }); if (array2.Length == 2) { ItemTierDef itemTierDef = ItemTierCatalog.GetItemTierDef((ItemTier)Enum.Parse(typeof(ItemTier), array2[0])); if (float.TryParse(array2[1], NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { ArrayUtils.ArrayAppend<ItemTierDef>(ref AvailableItemTierDefs, ref itemTierDef); ArrayUtils.ArrayAppend<float>(ref ItemTierWeights, ref result); } } } } public static void ReadConfigItemTierLimiter() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) ItemTierCaps = new int[AvailableItemTierDefs.Length]; string[] array = ConfigItemTiersCaps.Value.Split(new char[2] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split(new char[1] { '-' }); if (array2.Length != 2) { continue; } ItemTierDef itemTierDef = ItemTierCatalog.GetItemTierDef((ItemTier)Enum.Parse(typeof(ItemTier), array2[0])); for (int j = 0; j < AvailableItemTierDefs.Length; j++) { if ((Object)(object)AvailableItemTierDefs[j] == (Object)(object)itemTierDef && int.TryParse(array2[1], out var result)) { ItemTierCaps[j] = result; } } } } [ConCommand(/*Could not decode attribute arguments.*/)] private static void ShowHelp(ConCommandArgs args) { Debug.Log((object)"ewi_reloadconfig - Reloads the config file, server only.\newi_dumpItemBlackList - Dumps the currently loaded item blacklist.\newi_dumpEquipBlackList - Dumps the currently loaded equipment blacklist.\newi_dumpLimiterBlackList - Dumps the currently loaded item limiter dictionary.\newi_dumpAllItemTierData - Dumps all the currently loaded arrays related to ItemTiers.\newi_dumpItemPool - Dumps the currently loaded item pool, which enemies will generate items from.\newi_dumpEquipPool - Dumps the currently loaded equipment pool, which enemies will generate equipment from.\newi_midRunData - Shows data specific to the run, such as expected amount of items to generate. Only usable in a run."); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void ReloadConfig(ConCommandArgs args) { ((BaseUnityPlugin)instance).Config.Reload(); instance.RebuildConfig(); Debug.LogWarning((object)"Enemies with Items config reloaded!"); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void DumpItemBlackList(ConCommandArgs args) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Invalid comparison between Unknown and I4 Debug.Log((object)("Item Blacklist has a length of " + ItemBlackList.Length)); int num = 0; StringBuilder stringBuilder = new StringBuilder(); ItemDef[] itemBlackList = ItemBlackList; foreach (ItemDef val in itemBlackList) { if ((Object)(object)val != (Object)null && (int)val.itemIndex != -1) { stringBuilder.Append(((object)val)?.ToString() + " | "); num++; } } Debug.Log((object)(stringBuilder.ToString() + num)); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void DumpEquipBlackList(ConCommandArgs args) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Invalid comparison between Unknown and I4 Debug.Log((object)("Equipment Blacklist has a length of " + EquipmentBlackList.Length)); int num = 0; StringBuilder stringBuilder = new StringBuilder(); EquipmentDef[] equipmentBlackList = EquipmentBlackList; foreach (EquipmentDef val in equipmentBlackList) { if ((Object)(object)val != (Object)null && (int)val.equipmentIndex != -1) { stringBuilder.Append(((object)val)?.ToString() + " | "); num++; } } Debug.Log((object)(stringBuilder.ToString() + num)); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void DumpLimiterBlackList(ConCommandArgs args) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Invalid comparison between Unknown and I4 Debug.Log((object)("Item Limiter dictionary has a count of " + LimitedItemsDictionary.Count)); int num = 0; StringBuilder stringBuilder = new StringBuilder(); foreach (KeyValuePair<ItemDef, int> item in LimitedItemsDictionary) { if ((Object)(object)item.Key != (Object)null && (int)item.Key.itemIndex != -1) { stringBuilder.Append(item.ToString() + " Amnt: " + item.Value + " | "); num++; } } Debug.Log((object)(stringBuilder.ToString() + num)); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void DumpAllItemTierData(ConCommandArgs args) { Debug.Log((object)("Length of available item tiers: " + AvailableItemTierDefs.Length)); Debug.Log((object)("Length of weighted item tiers (has to be the same as previous): " + ItemTierWeights.Length)); Debug.Log((object)("Length of capped item tiers: " + ItemTierCaps.Length)); int num = 0; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < AvailableItemTierDefs.Length; i++) { stringBuilder.Append(((object)AvailableItemTierDefs[i])?.ToString() + " W: " + ItemTierWeights[i] + " C: " + ItemTierCaps[i] + " | "); num++; } Debug.Log((object)(stringBuilder.ToString() + num)); } } internal class EWIDeathRewards : MonoBehaviour, IOnKilledServerReceiver { public void OnKilledServer(DamageReport damageReport) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) if (damageReport == null || !Object.op_Implicit((Object)(object)damageReport.attackerBody) || !Object.op_Implicit((Object)(object)damageReport.victimBody) || !TeamManager.IsTeamEnemy(damageReport.attackerBody.master.teamIndex, damageReport.victimBody.master.teamIndex)) { return; } Inventory inventory = damageReport.victimBody.master.inventory; float num = 1f; WeightedSelection<ItemIndex> val = new WeightedSelection<ItemIndex>(8); int i; for (i = 0; i < EnemiesWithItems.AvailableItemTierDefs.Length; i++) { num = EnemiesWithItems.ItemTierWeights[i] * 5f; ItemIndex[] array = inventory.itemAcquisitionOrder.Where((ItemIndex x) => ItemCatalog.GetItemDef(x).tier == EnemiesWithItems.AvailableItemTierDefs[i].tier).ToArray(); if (array.Length != 0) { val.AddChoice(Run.instance.treasureRng.NextElementUniform<ItemIndex>(array), num); } } if (val.Count > 0) { PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(val.Evaluate(Run.instance.treasureRng.nextNormalizedFloat)), damageReport.victimBody.transform.position + Vector3.up * 1.5f, Vector3.up * 20f + damageReport.victimBody.transform.forward * 2f); } } } internal class ItemGeneration { public static readonly Func<ItemIndex, bool> ewiDefaultItemCopyFilterDelegate = EwiDefaultItemCopyFilter; public static readonly Func<ItemIndex, bool> ewiBlacklistItemCopyFilterDelegate = EwiBlacklistCopyFilter; private static int _cachedPlayerCount; private static int _cachedTotalItemCount; private static int maxItemsToGenerate; private const int maxFailedAttempts = 5; [SystemInitializer(new Type[] { typeof(ItemCatalog), typeof(PickupCatalog), typeof(ItemTierCatalog) })] private static void Init() { Run.onServerGameOver += onServerGameOver; PlayerCharacterMasterController.onPlayerAdded += onPlayerAdded; PlayerCharacterMasterController.onPlayerRemoved += onPlayerRemoved; } private static bool EwiDefaultItemCopyFilter(ItemIndex itemIndex) { return true; } private static bool EwiBlacklistCopyFilter(ItemIndex itemIndex) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return !EnemiesWithItems.ItemBlackList.Contains(ItemCatalog.GetItemDef(itemIndex)); } private static void onServerGameOver(Run arg1, GameEndingDef arg2) { _cachedTotalItemCount = 0; } private static void onPlayerRemoved(PlayerCharacterMasterController obj) { if (NetworkServer.active) { ((MonoBehaviour)EnemiesWithItems.instance).StartCoroutine(RebuildPlayers(obj, removing: true)); } } private static void onPlayerAdded(PlayerCharacterMasterController obj) { if (NetworkServer.active) { ((MonoBehaviour)EnemiesWithItems.instance).StartCoroutine(RebuildPlayers(obj, removing: false)); } } private static IEnumerator RebuildPlayers(PlayerCharacterMasterController playerExcited, bool removing) { yield return (object)new WaitForEndOfFrame(); _cachedPlayerCount = PlayerCharacterMasterController.instances.Count; if (removing) { playerExcited.master.inventory.onInventoryChanged -= onInventoryChanged; } else { playerExcited.master.inventory.onInventoryChanged += onInventoryChanged; } } private static void onInventoryChanged() { _cachedTotalItemCount = 0; _cachedTotalItemCount = GetPlayerItems(); } private static int GetPlayerItems() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) int num = 0; for (int i = 0; i < PlayerCharacterMasterController.instances.Count; i++) { CharacterMaster master = PlayerCharacterMasterController.instances[i].master; if (!Object.op_Implicit((Object)(object)master)) { continue; } for (int j = 0; j < master.inventory.itemAcquisitionOrder.Count; j++) { ItemIndex val = master.inventory.itemAcquisitionOrder[j]; if (!ItemCatalog.GetItemDef(val).hidden) { num += master.inventory.GetItemCount(val); } } } return num; } private static ItemDef EvaluateItem() { WeightedSelection<ItemDef> val = new WeightedSelection<ItemDef>(8); int i; for (i = 0; i < EnemiesWithItems.AvailableItemTierDefs.Length; i++) { ItemDef val2 = Run.instance.treasureRng.NextElementUniform<ItemDef>(PickupLists.finalItemDefList.Where((ItemDef itemDefValue) => (Object)(object)itemDefValue != (Object)null && itemDefValue.tier == EnemiesWithItems.AvailableItemTierDefs[i].tier).ToList()); val.AddChoice(val2, EnemiesWithItems.ItemTierWeights[i]); } return val.Evaluate(Run.instance.treasureRng.nextNormalizedFloat); } private static EquipmentDef EvaluateEquipment() { EquipmentDef val = Run.instance.treasureRng.NextElementUniform<EquipmentDef>(PickupLists.finalEquipmentDefs); WeightedSelection<EquipmentDef> obj = new WeightedSelection<EquipmentDef>(8); obj.AddChoice(val, EnemiesWithItems.ConfigToFloat(EnemiesWithItems.EquipGenChance.Value)); obj.AddChoice((EquipmentDef)null, 1f); return obj.Evaluate(Run.instance.treasureRng.nextNormalizedFloat); } public static void GenerateItemsToInventory(Inventory inventory, CharacterMaster masterToCopyFrom) { //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Invalid comparison between Unknown and I4 //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Invalid comparison between Unknown and I4 //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_0330: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Invalid comparison between Unknown and I4 //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) maxItemsToGenerate = 0; if ((EnemiesWithItems.ConfigToFloat(EnemiesWithItems.InheritItemsChance.Value) > 0f && Random.Range(0f, 100f) <= EnemiesWithItems.ConfigToFloat(EnemiesWithItems.InheritItemsChance.Value)) || inventory.GetItemCount(Items.InvadingDoppelganger) > 0 || inventory.GetItemCount(Items.GummyCloneIdentifier) > 0) { CleanInventoryDependingOnConfigAndCopyFromMaster(inventory, masterToCopyFrom); return; } if (EnemiesWithItems.GenerateItems.Value) { if (PickupLists.finalItemDefList == null || PickupLists.finalItemDefList.Length == 0) { return; } maxItemsToGenerate = (int)Math.Pow(Run.instance.stageClearCount + 1, 2.0) + _cachedTotalItemCount; if (!EnemiesWithItems.Scaling.Value) { maxItemsToGenerate = (int)Math.Pow(Run.instance.stageClearCount + 1, 2.0) + _cachedTotalItemCount / _cachedPlayerCount; } float num = EnemiesWithItems.ConfigToFloat(EnemiesWithItems.MaxItemsToGenerateMultiplier.Value); if (num != 1f) { maxItemsToGenerate = Mathf.CeilToInt((float)maxItemsToGenerate * num); } int num2 = 0; int num3 = 0; while (num3 < maxItemsToGenerate && num2 <= 5) { ItemDef evaluation = EvaluateItem(); if ((Object)(object)evaluation == (Object)null || (int)evaluation.itemIndex == -1 || Run.instance.IsItemExpansionLocked(evaluation.itemIndex)) { num2++; continue; } int num4 = 0; int num5 = 0; for (int i = 0; i < EnemiesWithItems.AvailableItemTierDefs.Length; i++) { num5 = EnemiesWithItems.ItemTierCaps[i]; if (inventory.GetTotalItemCountOfTier(EnemiesWithItems.AvailableItemTierDefs[i].tier) > num5 && num5 > 0) { num2++; } } int num6 = Random.Range(1, Mathf.Max(maxItemsToGenerate - num3, 1)); float num7 = EnemiesWithItems.ConfigToFloat(EnemiesWithItems.ItemMultiplier.Value); if (num7 != 1f && num7 != 0f) { num6 = Mathf.CeilToInt((float)num6 * num7); } if (num6 <= 0) { num2++; continue; } if (EnemiesWithItems.LimitedItemsDictionary.ContainsKey(evaluation) && EnemiesWithItems.Limiter.Value) { num4 = EnemiesWithItems.LimitedItemsDictionary.Where(delegate(KeyValuePair<ItemDef, int> kvp) { KeyValuePair<ItemDef, int> keyValuePair2 = kvp; return (Object)(object)keyValuePair2.Key == (Object)(object)evaluation; }).Select(delegate(KeyValuePair<ItemDef, int> kvp) { KeyValuePair<ItemDef, int> keyValuePair = kvp; return keyValuePair.Value; }).FirstOrDefault(); if (num4 <= 0) { num6 = Run.instance.stageClearCount + 1; } } if (num6 > num4 && num4 > 0) { num6 = num4; } if (EnemiesWithItems.FixItemMultiplierCaps.Value && num6 > maxItemsToGenerate - num3) { num6 = maxItemsToGenerate - num3; } inventory.GiveItem(evaluation, num6); num3 += num6; } } if (EnemiesWithItems.EquipItems.Value && (int)inventory.currentEquipmentIndex == -1 && PickupLists.finalEquipmentDefs != null && PickupLists.finalEquipmentDefs.Length != 0) { EquipmentDef val = EvaluateEquipment(); if ((Object)(object)val != (Object)null && (int)val.equipmentIndex != -1 && !Run.instance.IsEquipmentExpansionLocked(val.equipmentIndex)) { inventory.ResetItem(Items.AutoCastEquipment); inventory.GiveItem(Items.AutoCastEquipment, 1); inventory.SetEquipmentIndex(val.equipmentIndex); } } } public static void LimitItems(Inventory inventory, ItemDef item, int cap) { if (inventory.GetItemCount(item) > cap) { inventory.ResetItem(item); inventory.GiveItem(item, cap); } } public static void ResetAllItemsInInventory(Inventory inventory) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) foreach (ItemIndex item in inventory.itemAcquisitionOrder) { inventory.ResetItem(item); } } public static void CleanInventoryDependingOnConfigAndCopyFromMaster(Inventory inventory, CharacterMaster master) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) int itemCount = inventory.GetItemCount(Items.InvadingDoppelganger); int itemCount2 = inventory.GetItemCount(Items.GummyCloneIdentifier); bool flag = itemCount2 > 0 || itemCount > 0; if ((Object)(object)master == (Object)null || (Object)(object)master.inventory == (Object)null) { return; } if (!flag) { foreach (ItemIndex item in inventory.itemAcquisitionOrder) { ItemTierDef[] availableItemTierDefs = EnemiesWithItems.AvailableItemTierDefs; foreach (ItemTierDef val in availableItemTierDefs) { if (ItemCatalog.GetItemDef(item).tier == val.tier) { inventory.ResetItem(item); } } } inventory.AddItemsFrom(master.inventory, EnemiesWithItems.InheranceBlacklist.Value ? ewiBlacklistItemCopyFilterDelegate : ewiDefaultItemCopyFilterDelegate); } BlacklistAndMultiplyAndLimitInventory(inventory, flag && EnemiesWithItems.UmbraeBlacklistLimitOperation.Value); if (EnemiesWithItems.EquipItems.Value) { inventory.ResetItem(Items.AutoCastEquipment); inventory.GiveItem(Items.AutoCastEquipment, 1); inventory.CopyEquipmentFrom(master.inventory); EquipmentDef[] equipmentBlackList = EnemiesWithItems.EquipmentBlackList; foreach (EquipmentDef val2 in equipmentBlackList) { if (inventory.GetEquipmentIndex() == val2.equipmentIndex) { inventory.SetEquipmentIndex((EquipmentIndex)(-1)); break; } } } if (flag) { if (inventory.GetItemCount(Items.InvadingDoppelganger) != itemCount) { inventory.ResetItem(Items.InvadingDoppelganger); inventory.GiveItem(Items.InvadingDoppelganger, itemCount); } if (inventory.GetItemCount(Items.GummyCloneIdentifier) != itemCount2) { inventory.ResetItem(Items.GummyCloneIdentifier); inventory.GiveItem(Items.GummyCloneIdentifier, itemCount2); } } } public static void BlacklistAndMultiplyAndLimitInventory(Inventory inventory, bool alreadyInheriting = false) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) float num = EnemiesWithItems.ConfigToFloat(EnemiesWithItems.ItemMultiplier.Value); ItemDef[] array = (ItemDef[])(object)new ItemDef[0]; foreach (ItemIndex item in inventory.itemAcquisitionOrder) { ItemDef itemDef = ItemCatalog.GetItemDef(item); if (EnemiesWithItems.ItemBlackList.Contains(itemDef)) { if (EnemiesWithItems.InheranceBlacklist.Value) { ArrayUtils.ArrayAppend<ItemDef>(ref array, ref itemDef); } continue; } ItemTierDef[] availableItemTierDefs = EnemiesWithItems.AvailableItemTierDefs; foreach (ItemTierDef val in availableItemTierDefs) { if (itemDef.tier != val.tier) { continue; } int itemCount = inventory.GetItemCount(itemDef); itemCount = ((num != 1f && !alreadyInheriting) ? itemCount : ((int)Math.Ceiling((float)itemCount * num))); inventory.RemoveItem(itemDef, inventory.GetItemCount(itemDef) - 1); if (EnemiesWithItems.LimitedItemsDictionary.ContainsKey(itemDef) && EnemiesWithItems.Limiter.Value) { itemCount = EnemiesWithItems.LimitedItemsDictionary.Where(delegate(KeyValuePair<ItemDef, int> kvp) { KeyValuePair<ItemDef, int> keyValuePair2 = kvp; return (Object)(object)keyValuePair2.Key == (Object)(object)itemDef; }).Select(delegate(KeyValuePair<ItemDef, int> kvp) { KeyValuePair<ItemDef, int> keyValuePair = kvp; return keyValuePair.Value; }).FirstOrDefault(); if (itemCount <= 0) { itemCount = Run.instance.stageClearCount + 1; } } inventory.GiveItem(itemDef, itemCount - 1); } } ItemDef[] array2 = array; foreach (ItemDef val2 in array2) { inventory.ResetItem(val2); } } private static IEnumerator GetTargetOfDoppelganger(Inventory inventoryToCopyTo) { yield return (object)new WaitForEndOfFrame(); BaseAI baseai = ((Component)inventoryToCopyTo).gameObject.GetComponent<BaseAI>(); if ((Object)(object)baseai == (Object)null || (Object)(object)baseai.currentEnemy.characterBody == (Object)null || (Object)(object)baseai.currentEnemy.characterBody.master == (Object)null) { yield return null; } if (Object.op_Implicit((Object)(object)baseai.currentEnemy.characterBody.master.playerCharacterMasterController)) { ResetAllItemsInInventory(inventoryToCopyTo); inventoryToCopyTo.AddItemsFrom(baseai.currentEnemy.characterBody.inventory, EnemiesWithItems.InheranceBlacklist.Value ? ewiBlacklistItemCopyFilterDelegate : ewiDefaultItemCopyFilterDelegate); if (EnemiesWithItems.UmbraeBlacklistLimitOperation.Value) { BlacklistAndMultiplyAndLimitInventory(inventoryToCopyTo); } yield return null; } } [ConCommand(/*Could not decode attribute arguments.*/)] private static void PrintMidRunData(ConCommandArgs args) { if (!Object.op_Implicit((Object)(object)Run.instance)) { Debug.LogWarning((object)"Cannot use command, you are not in a run!"); return; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Cached total item count: " + _cachedTotalItemCount); stringBuilder.AppendLine("Cached player count: " + _cachedPlayerCount); stringBuilder.Append("Max Items To Generate: " + maxItemsToGenerate); Debug.Log((object)stringBuilder.ToString()); } } internal class PickupLists { public static ItemDef[] finalItemDefList; public static EquipmentDef[] finalEquipmentDefs; public static void BuildItemAndEquipmentDictionaries() { //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) if (!((ResourceAvailability)(ref ItemCatalog.availability)).available || !((ResourceAvailability)(ref EquipmentCatalog.availability)).available) { Debug.LogWarning((object)"Attempted to build Enemies With Items' lists before the required catalogs were available"); return; } ItemDef[] array = (ItemDef[])(object)new ItemDef[ItemCatalog.itemCount]; EquipmentDef[] array2 = (EquipmentDef[])(object)new EquipmentDef[EquipmentCatalog.equipmentCount]; if ((Object)(object)Run.instance == (Object)null) { (from item in (IEnumerable<ItemIndex>)(object)ItemCatalog.allItems where (int)item != -1 && !EnemiesWithItems.ItemBlackList.Contains(ItemCatalog.GetItemDef(item)) select ItemCatalog.GetItemDef(item)).ToArray().CopyTo(array, 0); (from item in (IEnumerable<EquipmentIndex>)(object)EquipmentCatalog.allEquipment where (int)item != -1 && !EnemiesWithItems.EquipmentBlackList.Contains(EquipmentCatalog.GetEquipmentDef(item)) select EquipmentCatalog.GetEquipmentDef(item)).ToArray().CopyTo(array2, 0); } else { (from item in (IEnumerable<ItemIndex>)(object)ItemCatalog.allItems where (int)item != -1 && !EnemiesWithItems.ItemBlackList.Contains(ItemCatalog.GetItemDef(item)) && !Run.instance.IsItemExpansionLocked(item) select ItemCatalog.GetItemDef(item)).ToArray().CopyTo(array, 0); (from item in (IEnumerable<EquipmentIndex>)(object)EquipmentCatalog.allEquipment where (int)item != -1 && !EnemiesWithItems.EquipmentBlackList.Contains(EquipmentCatalog.GetEquipmentDef(item)) && !Run.instance.IsEquipmentExpansionLocked(item) select EquipmentCatalog.GetEquipmentDef(item)).ToArray().CopyTo(array2, 0); } finalItemDefList = (ItemDef[])(object)new ItemDef[array.Length]; finalEquipmentDefs = (EquipmentDef[])(object)new EquipmentDef[array2.Length]; array.CopyTo(finalItemDefList, 0); array2.CopyTo(finalEquipmentDefs, 0); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void DumpItemPool(ConCommandArgs args) { if (finalItemDefList == null || finalItemDefList.Length == 0) { Debug.Log((object)"itemDefTierPair is null or empty, cannot continue."); return; } Debug.Log((object)("Item Pool list has a count of " + finalItemDefList.Length)); int num = 0; StringBuilder stringBuilder = new StringBuilder(); ItemDef[] array = finalItemDefList; foreach (ItemDef val in array) { if ((Object)(object)val != (Object)null) { stringBuilder.Append(((object)val)?.ToString() + " | "); num++; } } Debug.Log((object)(stringBuilder.ToString() + num)); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void DumpEquipPool(ConCommandArgs args) { if (finalEquipmentDefs == null || finalEquipmentDefs.Length == 0) { Debug.Log((object)"equipmentDefs is null or empty, cannot continue."); return; } Debug.Log((object)("Equipment Pool list has a length of " + finalEquipmentDefs.Length)); int num = 0; StringBuilder stringBuilder = new StringBuilder(); EquipmentDef[] array = finalEquipmentDefs; foreach (EquipmentDef val in array) { if ((Object)(object)val != (Object)null) { stringBuilder.Append(((object)val)?.ToString() + " | "); num++; } } Debug.Log((object)(stringBuilder.ToString() + num)); } } public static class SpawnCardSubscription { [SystemInitializer(new Type[] { typeof(BodyCatalog) })] public static void BaddiesItems() { SpawnCard.onSpawnedServerGlobal += SpawnResultItemAdder; SpawnCard.onSpawnedServerGlobal += ItemDropperComponentAdder; } public static bool CanStartGivingItems(TeamIndex? teamIndexOfBodyToGive = null) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (Run.instance.stageClearCount + 1 < EnemiesWithItems.StageReq.Value) { return false; } if (EnemiesWithItems.StageReq.Value == 6 && SceneCatalog.mostRecentSceneDef.isFinalStage && Run.instance.loopClearCount == 0) { return false; } if (teamIndexOfBodyToGive.HasValue && !TeamManager.IsTeamEnemy(teamIndexOfBodyToGive.GetValueOrDefault(), (TeamIndex)1)) { return false; } return true; } private static void ItemDropperComponentAdder(SpawnResult obj) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) if (!obj.success) { return; } CharacterMaster val = (Object.op_Implicit((Object)(object)obj.spawnedInstance) ? obj.spawnedInstance.GetComponent<CharacterMaster>() : null); if (!((Object)(object)val == (Object)null) && Util.CheckRoll(EnemiesWithItems.ConfigToFloat(EnemiesWithItems.DropChance.Value), 0f, (CharacterMaster)null) && CanStartGivingItems(obj.spawnRequest.teamIndexOverride)) { GameObject bodyObject = val.GetBodyObject(); if (Object.op_Implicit((Object)(object)bodyObject)) { bodyObject.AddComponent<EWIDeathRewards>(); } } } public static void SpawnResultItemAdder(SpawnResult spawnResult) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) CharacterMaster val = (Object.op_Implicit((Object)(object)spawnResult.spawnedInstance) ? spawnResult.spawnedInstance.GetComponent<CharacterMaster>() : null); if (!((Object)(object)val == (Object)null) && spawnResult.success && !((Object)(object)val.inventory == (Object)null) && CanStartGivingItems(spawnResult.spawnRequest.teamIndexOverride) && Run.instance.livingPlayerCount > 0 && !Run.instance.isGameOverServer) { CharacterMaster master = PlayerCharacterMasterController.instances[Run.instance.nextStageRng.RangeInt(0, Run.instance.livingPlayerCount)].master; master = (((Object)(object)master == (Object)null) ? PlayerCharacterMasterController.instances[0].master : master); ItemGeneration.GenerateItemsToInventory(val.inventory, master); } } }