Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of EnemiesWithItems v3.0.8
plugins/EnemiesWithItems/EnemiesWithItems.dll
Decompiled a year 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); } } }