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 TooManyItems v0.7.2
plugins/TooManyItems.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Threading.Tasks; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HG; using HG.Reflection; using LookingGlass.ItemStatsNameSpace; using Microsoft.CodeAnalysis; using On.RoR2; using On.RoR2.Items; using On.RoR2.UI.LogBook; using ProperSave; using R2API; using R2API.Networking; using R2API.Networking.Interfaces; using R2API.Utils; using RoR2; using RoR2.ExpansionManagement; using RoR2.Items; using RoR2.Orbs; using RoR2.UI.LogBook; using TMPro; using TooManyItems.Extensions; using TooManyItems.Handlers; using TooManyItems.Items.Equip; using TooManyItems.Items.Equip.Lunar; using TooManyItems.Items.Lunar; using TooManyItems.Items.Tier1; using TooManyItems.Items.Tier2; using TooManyItems.Items.Tier3; using TooManyItems.Items.Void; using TooManyItems.Managers; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TooManyItems")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+69fcfef26f0373170908ae8b23c6403b97102d8a")] [assembly: AssemblyProduct("TooManyItems")] [assembly: AssemblyTitle("TooManyItems")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TooManyItems { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInPlugin("shirograhm.TooManyItems", "TooManyItems", "0.7.2")] public class TooManyItems : BaseUnityPlugin { public const string PluginGUID = "shirograhm.TooManyItems"; public const string PluginAuthor = "shirograhm"; public const string PluginName = "TooManyItems"; public const string PluginVersion = "0.7.2"; public static Random RandGen = new Random(); public static ExpansionDef sotvDLC; public static ExpansionDef sotsDLC; public static PluginInfo PInfo { get; private set; } public void Awake() { //IL_0012: 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) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) PInfo = ((BaseUnityPlugin)this).Info; sotvDLC = Addressables.LoadAssetAsync<ExpansionDef>((object)"RoR2/DLC1/Common/DLC1.asset").WaitForCompletion(); sotsDLC = Addressables.LoadAssetAsync<ExpansionDef>((object)"RoR2/DLC2/Common/DLC2.asset").WaitForCompletion(); Log.Init(((BaseUnityPlugin)this).Logger); AssetManager.Init(); GameEventManager.Init(); ConfigOptions.Init(); DamageColorManager.Init(); Utilities.Init(); if (Abacus.isEnabled.Value) { Abacus.Init(); } if (BloodDice.isEnabled.Value) { BloodDice.Init(); } if (GlassMarbles.isEnabled.Value) { GlassMarbles.Init(); } if (Horseshoe.isEnabled.Value) { Horseshoe.Init(); } if (IronHeart.isEnabled.Value) { IronHeart.Init(); } if (Permafrost.isEnabled.Value) { Permafrost.Init(); } if (RustedTrowel.isEnabled.Value) { RustedTrowel.Init(); } if (BrassKnuckles.isEnabled.Value) { BrassKnuckles.Init(); } if (BrokenMask.isEnabled.Value) { BrokenMask.Init(); } if (Epinephrine.isEnabled.Value) { Epinephrine.Init(); } if (HereticSeal.isEnabled.Value) { HereticSeal.Init(); } if (HolyWater.isEnabled.Value) { HolyWater.Init(); } if (Hoodie.isEnabled.Value) { Hoodie.Init(); } if (MagnifyingGlass.isEnabled.Value) { MagnifyingGlass.Init(); } if (RubberDucky.isEnabled.Value) { RubberDucky.Init(); } if (SoulRing.isEnabled.Value) { SoulRing.Init(); } if (BottleCap.isEnabled.Value) { BottleCap.Init(); } if (BreadLoaf.isEnabled.Value) { BreadLoaf.Init(); } if (DebitCard.isEnabled.Value) { DebitCard.Init(); } if (EdibleGlue.isEnabled.Value) { EdibleGlue.Init(); } if (MilkCarton.isEnabled.Value) { MilkCarton.Init(); } if (PaperPlane.isEnabled.Value) { PaperPlane.Init(); } if (Photodiode.isEnabled.Value) { Photodiode.Init(); } if (PropellerHat.isEnabled.Value) { PropellerHat.Init(); } if (RedBlueGlasses.isEnabled.Value) { RedBlueGlasses.Init(); } if ((bool)Thumbtack.isEnabled) { Thumbtack.Init(); } if (Amnesia.isEnabled.Value) { Amnesia.Init(); } if (AncientCoin.isEnabled.Value) { AncientCoin.Init(); } if (CarvingBlade.isEnabled.Value) { CarvingBlade.Init(); } if (Crucifix.isEnabled.Value) { Crucifix.Init(); } if (SpiritStone.isEnabled.Value) { SpiritStone.Init(); } if (DoubleDown.isEnabled.Value) { DoubleDown.Init(); } if (ShadowCrest.isEnabled.Value) { ShadowCrest.Init(); } if (VoidHeart.isEnabled.Value) { VoidHeart.Init(); } if (BuffTotem.isEnabled.Value) { BuffTotem.Init(); } if (TatteredScroll.isEnabled.Value) { TatteredScroll.Init(); } if (Chalice.isEnabled.Value) { Chalice.Init(); } if (Vanity.isEnabled.Value) { Vanity.Init(); } InjectVoidItemTramsforms(); ((ResourceAvailability)(ref ItemCatalog.availability)).CallWhenAvailable((Action)Integrations.Init); Log.Message("Finished initializations."); } private void InjectVoidItemTramsforms() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) ItemRelationshipProvider val = ScriptableObject.CreateInstance<ItemRelationshipProvider>(); ((Object)val).name = "TooManyItems_ContagiousItemProvider"; val.relationshipType = Addressables.LoadAssetAsync<ItemRelationshipType>((object)"RoR2/DLC1/Common/ContagiousItem.asset").WaitForCompletion(); val.relationships = GetContagiousItemRelationships(); if (ContentAddition.AddItemRelationshipProvider(val)) { Log.Debug("Successfully injected void item transformations."); } else { Log.Error("Unable to inject void item transformations."); } } public Pair[] GetContagiousItemRelationships() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) List<Pair> list = new List<Pair>(); if ((bool)RedBlueGlasses.isEnabled) { list.Add(new Pair { itemDef1 = RedBlueGlasses.itemDef, itemDef2 = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC1/CritGlassesVoid/CritGlassesVoid.asset").WaitForCompletion() }); } if ((bool)Thumbtack.isEnabled) { list.Add(new Pair { itemDef1 = Thumbtack.itemDef, itemDef2 = Addressables.LoadAssetAsync<ItemDef>((object)"RoR2/DLC1/BleedOnHitVoid/BleedOnHitVoid.asset").WaitForCompletion() }); } if ((bool)IronHeart.isEnabled && (bool)VoidHeart.isEnabled) { list.Add(new Pair { itemDef1 = IronHeart.itemDef, itemDef2 = VoidHeart.itemDef }); } if ((bool)HereticSeal.isEnabled && (bool)ShadowCrest.isEnabled) { list.Add(new Pair { itemDef1 = HereticSeal.itemDef, itemDef2 = ShadowCrest.itemDef }); } return list.ToArray(); } } public static class Utilities { private class SyncForceRecalculate : INetMessage, ISerializableObject { private NetworkInstanceId netID; public SyncForceRecalculate() { } public SyncForceRecalculate(NetworkInstanceId ID) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) netID = ID; } public void Deserialize(NetworkReader reader) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) netID = reader.ReadNetworkId(); } public void OnReceived() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { return; } GameObject val = Util.FindNetworkObject(netID); if (Object.op_Implicit((Object)(object)val)) { CharacterBody component = val.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component)) { component.RecalculateStats(); } } } public void Serialize(NetworkWriter writer) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) writer.Write(netID); writer.FinishMessage(); } } public static Color BROKEN_MASK_COLOR = new Color(0.38f, 0.38f, 0.82f, 1f); public static Color CARVING_BLADE_COLOR = new Color(0.09f, 0.67f, 0.62f, 1f); public static Color PERMAFROST_COLOR = new Color(0.76f, 0.8f, 0.98f, 1f); public static Color IRON_HEART_COLOR = new Color(0.44f, 0.44f, 0.44f, 1f); public static Color MILK_CARTON_DAMAGE_COLOR = new Color(0.28f, 0.28f, 0.06f, 1f); public static Color TATTERED_SCROLL_COLOR = new Color(0.8f, 0.78f, 0.57f, 1f); public static Color VANITY_COLOR = new Color(0.53f, 0.44f, 0.77f, 1f); public static List<ItemIndex> allVoidTier1Items; public static List<ItemIndex> allVoidTier2Items; public static List<ItemIndex> allVoidTier3Items; public static List<ItemIndex> allBossItems; internal static void Init() { NetworkingAPI.RegisterMessageType<SyncForceRecalculate>(); ((ResourceAvailability)(ref ItemCatalog.availability)).CallWhenAvailable((Action)InitVoidTierItemLists); } private static void InitVoidTierItemLists() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) allVoidTier1Items = (from itemDef in (IEnumerable<ItemDef>)(object)ItemCatalog.allItemDefs where (int)itemDef.tier == 6 select itemDef.itemIndex).ToList(); allVoidTier2Items = (from itemDef in (IEnumerable<ItemDef>)(object)ItemCatalog.allItemDefs where (int)itemDef.tier == 7 select itemDef.itemIndex).ToList(); allVoidTier3Items = (from itemDef in (IEnumerable<ItemDef>)(object)ItemCatalog.allItemDefs where (int)itemDef.tier == 8 select itemDef.itemIndex).ToList(); allBossItems = (from itemDef in (IEnumerable<ItemDef>)(object)ItemCatalog.allItemDefs where (int)itemDef.tier == 4 select itemDef.itemIndex).ToList(); } public static void ForceRecalculate(CharacterBody body) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)body == (Object)null)) { body.RecalculateStats(); if (NetworkServer.active) { new SyncForceRecalculate(((NetworkBehaviour)body).netId); } } } public static CharacterBody GetMinionOwnershipParentBody(CharacterBody body) { if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)body.master) && Object.op_Implicit((Object)(object)body.master.minionOwnership) && Object.op_Implicit((Object)(object)body.master.minionOwnership.ownerMaster) && Object.op_Implicit((Object)(object)body.master.minionOwnership.ownerMaster.GetBody())) { return body.master.minionOwnership.ownerMaster.GetBody(); } return body; } public static bool OnSameTeam(CharacterBody body1, CharacterBody body2) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)body1 == (Object)null) { return false; } if ((Object)(object)body2 == (Object)null) { return false; } return Object.op_Implicit((Object)(object)body1.teamComponent) && Object.op_Implicit((Object)(object)body2.teamComponent) && body1.teamComponent.teamIndex == body2.teamComponent.teamIndex; } public static bool IsSkillDamage(DamageInfo damageInfo) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) return DamageTypeCombo.op_Implicit(damageInfo.damageType) == DamageTypeCombo.op_Implicit(DamageTypeCombo.GenericPrimary) || DamageTypeCombo.op_Implicit(damageInfo.damageType) == DamageTypeCombo.op_Implicit(DamageTypeCombo.GenericSecondary) || DamageTypeCombo.op_Implicit(damageInfo.damageType) == DamageTypeCombo.op_Implicit(DamageTypeCombo.GenericUtility) || DamageTypeCombo.op_Implicit(damageInfo.damageType) == DamageTypeCombo.op_Implicit(DamageTypeCombo.GenericSpecial); } public static uint ScaleGoldWithDifficulty(int goldGranted) { return Convert.ToUInt32((float)goldGranted * (1f + 50f * GetDifficultyAsPercentage())); } public static float GetChanceAfterLuck(float percent, float luckIn) { int num = Mathf.CeilToInt(luckIn); if (num > 0) { return 1f - Mathf.Pow(1f - percent, (float)(num + 1)); } if (num < 0) { return Mathf.Pow(percent, (float)(Mathf.Abs(num) + 1)); } return percent; } public static float GetDifficultyAsPercentage() { return (Stage.instance.entryDifficultyCoefficient - 1f) / 98f; } public static float GetDifficultyAsMultiplier() { return Stage.instance.entryDifficultyCoefficient; } public static float GetLinearStacking(float baseValue, int count) { return GetLinearStacking(baseValue, baseValue, count); } public static float GetLinearStacking(float baseValue, float extraValue, int count) { return baseValue + extraValue * (float)(count - 1); } public static int GetLinearStacking(int baseValue, int count) { return GetLinearStacking(baseValue, baseValue, count); } public static int GetLinearStacking(int baseValue, int extraValue, int count) { return baseValue + extraValue * (count - 1); } public static float GetExponentialStacking(float percent, int count) { return GetExponentialStacking(percent, percent, count); } public static float GetExponentialStacking(float percent, float stackPercent, int count) { return 1f - (1f - percent) * Mathf.Pow(1f - stackPercent, (float)(count - 1)); } public static float GetReverseExponentialStacking(float baseValue, float reducePercent, int count) { return baseValue * Mathf.Pow(1f - reducePercent, (float)(count - 1)); } public static float GetHyperbolicStacking(float percent, int count) { return GetHyperbolicStacking(percent, percent, count); } public static float GetHyperbolicStacking(float percent, float extraPercent, int count) { float num = (1f + percent) * (1f + extraPercent * (float)(count - 1)); return 1f - 1f / num; } public static void SpawnHealEffect(CharacterBody self) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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_0044: Expected O, but got Unknown if (!((Object)(object)self == (Object)null) && !((Object)(object)self.transform == (Object)null)) { EffectData val = new EffectData { origin = self.transform.position, rootObject = ((Component)self).gameObject }; EffectManager.SpawnEffect(PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/MedkitHealEffect"), "TooManyItems_HealEffect"), val, true); } } public static void SendGoldOrbAndEffect(uint goldGain, Vector3 origin, HurtBox target) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0025: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) OrbManager.instance.AddOrb((Orb)new GoldOrb { goldAmount = goldGain, origin = origin, target = target }); EffectManager.SimpleImpactEffect(PrefabAPI.InstantiateClone(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/CoinImpact"), "TooManyItems_GoldEffect"), origin, Vector3.up, true); } public static bool IsItemIndexScrap(ItemIndex itemIndex) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) return itemIndex == Items.ScrapWhite.itemIndex || itemIndex == Items.ScrapGreen.itemIndex || itemIndex == Items.ScrapRed.itemIndex; } public static ItemIndex GetRandomItemOfTier(ItemTier tier) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected I4, but got Unknown //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) switch ((int)tier) { case 0: { ItemIndex[] array4 = ItemCatalog.tier1ItemList.Where((ItemIndex index) => index != Items.ScrapWhite.itemIndex).ToArray(); if (array4.Length == 0) { return (ItemIndex)(-1); } int num4 = Random.Range(0, array4.Length); return array4[num4]; } case 1: { ItemIndex[] array3 = ItemCatalog.tier2ItemList.Where((ItemIndex index) => index != Items.ScrapGreen.itemIndex).ToArray(); if (array3.Length == 0) { return (ItemIndex)(-1); } int num3 = Random.Range(0, array3.Length); return array3[num3]; } case 2: { ItemIndex[] array = ItemCatalog.tier3ItemList.Where((ItemIndex index) => index != Items.ScrapRed.itemIndex).ToArray(); if (array.Length == 0) { return (ItemIndex)(-1); } int num = Random.Range(0, array.Length); return array[num]; } case 3: { ItemIndex[] array2 = ItemCatalog.lunarItemList.Where((ItemIndex index) => index != Amnesia.itemDef.itemIndex).ToArray(); if (array2.Length == 0) { return (ItemIndex)(-1); } int num2 = Random.Range(0, array2.Length); return array2[num2]; } case 6: { if (allVoidTier1Items == null || allVoidTier1Items.Count == 0) { return (ItemIndex)(-1); } int index5 = Random.Range(0, allVoidTier1Items.Count()); return allVoidTier1Items[index5]; } case 7: { if (allVoidTier2Items == null || allVoidTier2Items.Count == 0) { return (ItemIndex)(-1); } int index3 = Random.Range(0, allVoidTier2Items.Count()); return allVoidTier2Items[index3]; } case 8: { if (allVoidTier3Items == null || allVoidTier3Items.Count == 0) { return (ItemIndex)(-1); } int index4 = Random.Range(0, allVoidTier3Items.Count()); return allVoidTier3Items[index4]; } case 4: { if (allBossItems == null || allBossItems.Count == 0) { return (ItemIndex)(-1); } int index2 = Random.Range(0, allBossItems.Count()); return allBossItems[index2]; } default: Log.Error("Invalid tier called for random item."); return (ItemIndex)(-1); } } } } namespace TooManyItems.Managers { public static class AssetManager { public static AssetBundle bundle; public const string bundleName = "tmiassets"; public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(TooManyItems.PInfo.Location), "tmiassets"); public static void Init() { bundle = AssetBundle.LoadFromFile(AssetBundlePath); } } public static class ConfigManager { public static class Scaling { public static ConfigFile config = new ConfigFile(Paths.ConfigPath + "\\TooManyItems.cfg", true); public static string categoryName = "TooManyItems Config"; public static string categoryGUID = "shirograhm.TooManyItems_config"; public static ConfigOptions.ConfigurableValue<bool> useCustomValues = ConfigOptions.ConfigurableValue.CreateBool(categoryGUID, categoryName, config, "! Important !", "Use Custom Config", defaultValue: false, "Set to true to enable custom configurations."); } } public class ConfigurableValue<T> : ConfigOptions.ConfigurableValue<T> { public ConfigurableValue(string section, string key, float defaultValue, string description = "", List<string> stringsToAffect = null, Action<float> onChanged = null) : base(ConfigManager.Scaling.config, section, key, (T)Convert.ChangeType(defaultValue, typeof(T)), description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, (Action<T>)null) { ConfigOptions.ConfigurableValue.CreateFloat(ConfigManager.Scaling.categoryGUID, ConfigManager.Scaling.categoryName, ConfigManager.Scaling.config, section, key, defaultValue, 0f, 1000000f, description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, onChanged); } public ConfigurableValue(string section, string key, int defaultValue, string description = "", List<string> stringsToAffect = null, Action<int> onChanged = null) : base(ConfigManager.Scaling.config, section, key, (T)Convert.ChangeType(defaultValue, typeof(T)), description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, (Action<T>)null) { ConfigOptions.ConfigurableValue.CreateInt(ConfigManager.Scaling.categoryGUID, ConfigManager.Scaling.categoryName, ConfigManager.Scaling.config, section, key, defaultValue, 0, 1000000, description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, onChanged); } public ConfigurableValue(string section, string key, bool defaultValue, string description = "", List<string> stringsToAffect = null, Action<bool> onChanged = null) : base(ConfigManager.Scaling.config, section, key, (T)Convert.ChangeType(defaultValue, typeof(T)), description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, (Action<T>)null) { ConfigOptions.ConfigurableValue.CreateBool(ConfigManager.Scaling.categoryGUID, ConfigManager.Scaling.categoryName, ConfigManager.Scaling.config, section, key, defaultValue, description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, onChanged); } public ConfigurableValue(string section, string key, string defaultValue, string description = "", List<string> stringsToAffect = null, Action<string> onChanged = null) : base(ConfigManager.Scaling.config, section, key, (T)Convert.ChangeType(defaultValue, typeof(T)), description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, (Action<T>)null) { ConfigOptions.ConfigurableValue.CreateString(ConfigManager.Scaling.categoryGUID, ConfigManager.Scaling.categoryName, ConfigManager.Scaling.config, section, key, defaultValue, description, stringsToAffect, ConfigManager.Scaling.useCustomValues.bepinexConfigEntry, restartRequired: false, onChanged); } } public static class ConfigOptions { public abstract class ConfigurableValue { public static List<ConfigurableValue> instancesList = new List<ConfigurableValue>(); public List<string> stringsToAffect = new List<string>(); public string key = ""; public string id = ""; public static ConfigurableValue<T> Create<T>(ConfigFile configFile, string section, string key, T defaultValue, string description = "", List<string> stringsToAffect = null, ConfigEntry<bool> useCustomValueConfigEntry = null, bool restartRequired = false, Action<T> onChanged = null) { return new ConfigurableValue<T>(configFile, section, key, defaultValue, description, stringsToAffect, useCustomValueConfigEntry, restartRequired, onChanged); } public static ConfigurableValue<int> CreateInt(string modGUID, string modName, ConfigFile configFile, string section, string key, int defaultValue, int min = 0, int max = 1000, string description = "", List<string> stringsToAffect = null, ConfigEntry<bool> useCustomValueConfigEntry = null, bool restartRequired = false, Action<int> onChanged = null) { return Create(configFile, section, key, defaultValue, description, stringsToAffect, useCustomValueConfigEntry, restartRequired, onChanged); } public static ConfigurableValue<float> CreateFloat(string modGUID, string modName, ConfigFile configFile, string section, string key, float defaultValue, float min = 0f, float max = 1000f, string description = "", List<string> stringsToAffect = null, ConfigEntry<bool> useCustomValueConfigEntry = null, bool restartRequired = false, Action<float> onChanged = null) { return Create(configFile, section, key, defaultValue, description, stringsToAffect, useCustomValueConfigEntry, restartRequired, onChanged); } public static ConfigurableValue<bool> CreateBool(string modGUID, string modName, ConfigFile configFile, string section, string key, bool defaultValue, string description = "", List<string> stringsToAffect = null, ConfigEntry<bool> useCustomValueConfigEntry = null, bool restartRequired = false, Action<bool> onChanged = null) { return Create(configFile, section, key, defaultValue, description, stringsToAffect, useCustomValueConfigEntry, restartRequired, onChanged); } public static ConfigurableValue<string> CreateString(string modGUID, string modName, ConfigFile configFile, string section, string key, string defaultValue, string description = "", List<string> stringsToAffect = null, ConfigEntry<bool> useCustomValueConfigEntry = null, bool restartRequired = false, Action<string> onChanged = null) { return Create(configFile, section, key, defaultValue, description, stringsToAffect, useCustomValueConfigEntry, restartRequired, onChanged); } } public class ConfigurableValue<T> : ConfigurableValue { public ConfigEntry<T> bepinexConfigEntry; private ConfigEntry<bool> useCustomValueConfigEntry; private T defaultValue; public T Value { get { if (useCustomValueConfigEntry != null && useCustomValueConfigEntry.Value) { return bepinexConfigEntry.Value; } return defaultValue; } } public ConfigurableValue(ConfigFile configFile, string section, string key, T defaultValue, string description = "", List<string> stringsToAffect = null, ConfigEntry<bool> useCustomValueConfigEntry = null, bool restartRequired = false, Action<T> onChanged = null) { ConfigurableValue<T> configurableValue = this; id = Path.GetFileNameWithoutExtension(configFile.ConfigFilePath) + "." + section + "." + key; ConfigurableValue configurableValue2 = ConfigurableValue.instancesList.FirstOrDefault((ConfigurableValue x) => x.id == configurableValue.id); if (configurableValue2 != null) { ConfigurableValue<T> configurableValue3 = configurableValue2 as ConfigurableValue<T>; bepinexConfigEntry = configurableValue3.bepinexConfigEntry; this.useCustomValueConfigEntry = useCustomValueConfigEntry; } else { bepinexConfigEntry = configFile.Bind<T>(section, key, defaultValue, description); ConfigurableValue.instancesList.Add(this); } this.useCustomValueConfigEntry = useCustomValueConfigEntry; base.key = key; this.defaultValue = defaultValue; if (stringsToAffect != null) { base.stringsToAffect = stringsToAffect; } else { base.stringsToAffect = new List<string>(); } if (onChanged != null) { bepinexConfigEntry.SettingChanged += delegate { onChanged(configurableValue.bepinexConfigEntry.Value); reloadLogbook = true; }; onChanged(bepinexConfigEntry.Value); reloadLogbook = true; } } public override string ToString() { return Convert.ToString(Value, CultureInfo.InvariantCulture); } public static implicit operator T(ConfigurableValue<T> configurableValue) { return configurableValue.Value; } } [CompilerGenerated] private static class <>O { public static hook_Awake <0>__LogBookController_Awake; public static hook_GetLocalizedStringByToken <1>__Language_GetLocalizedStringByToken; } private static bool reloadLogbook; internal static void Init() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown object obj = <>O.<0>__LogBookController_Awake; if (obj == null) { hook_Awake val = LogBookController_Awake; <>O.<0>__LogBookController_Awake = val; obj = (object)val; } LogBookController.Awake += (hook_Awake)obj; object obj2 = <>O.<1>__Language_GetLocalizedStringByToken; if (obj2 == null) { hook_GetLocalizedStringByToken val2 = Language_GetLocalizedStringByToken; <>O.<1>__Language_GetLocalizedStringByToken = val2; obj2 = (object)val2; } Language.GetLocalizedStringByToken += (hook_GetLocalizedStringByToken)obj2; } private static void LogBookController_Awake(orig_Awake orig, LogBookController self) { orig.Invoke(self); if (reloadLogbook) { reloadLogbook = false; LogBookController.BuildStaticData(); } } private static string Language_GetLocalizedStringByToken(orig_GetLocalizedStringByToken orig, Language self, string token) { string text = orig.Invoke(self, token); foreach (ConfigurableValue item in ConfigurableValue.instancesList.FindAll((ConfigurableValue x) => x.stringsToAffect.Contains(token))) { text = text.Replace("{" + item.key + "}", item.ToString()); } return text; } } internal class DamageColorManager { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_FindColor <>9__2_0; internal Color <Hooks>b__2_0(orig_FindColor orig, DamageColorIndex colorIndex) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0016: 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) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (registeredColorIndexList.Contains(colorIndex)) { return DamageColor.colors[colorIndex]; } return orig.Invoke(colorIndex); } } public static List<DamageColorIndex> registeredColorIndexList = new List<DamageColorIndex>(); internal static void Init() { Hooks(); } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__2_0; if (obj == null) { hook_FindColor val = (orig_FindColor orig, DamageColorIndex colorIndex) => registeredColorIndexList.Contains(colorIndex) ? DamageColor.colors[colorIndex] : orig.Invoke(colorIndex); <>c.<>9__2_0 = val; obj = (object)val; } DamageColor.FindColor += (hook_FindColor)obj; } public static DamageColorIndex RegisterDamageColor(Color color) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) int num = DamageColor.colors.Length; DamageColorIndex val = (DamageColorIndex)(byte)num; ArrayUtils.ArrayAppend<Color>(ref DamageColor.colors, ref color); registeredColorIndexList.Add(val); return val; } } internal class GameEventManager { public delegate void DamageAttackerVictimEventHandler(DamageInfo damageInfo, GenericCharacterInfo attackerInfo, GenericCharacterInfo victimInfo); public delegate void DamageReportEventHandler(DamageReport damageReport); public class GenericDamageEvent : MonoBehaviour, IOnIncomingDamageServerReceiver, IOnTakeDamageServerReceiver { public HealthComponent healthComponent; public CharacterBody victimBody; public void Start() { healthComponent = ((Component)this).GetComponent<HealthComponent>(); if (!Object.op_Implicit((Object)(object)healthComponent)) { Object.Destroy((Object)(object)this); } else { victimBody = healthComponent.body; } } public void OnIncomingDamageServer(DamageInfo damageInfo) { GenericCharacterInfo attackerInfo = default(GenericCharacterInfo); if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { attackerInfo = new GenericCharacterInfo(damageInfo.attacker.GetComponent<CharacterBody>()); } GenericCharacterInfo victimInfo = new GenericCharacterInfo(victimBody); GameEventManager.BeforeTakeDamage?.Invoke(damageInfo, attackerInfo, victimInfo); } public void OnTakeDamageServer(DamageReport damageReport) { if (Object.op_Implicit((Object)(object)victimBody) && GameEventManager.OnTakeDamage != null) { GameEventManager.OnTakeDamage(damageReport); } } } public struct GenericCharacterInfo { public GameObject gameObject; public CharacterBody body; public CharacterMaster master; public TeamComponent teamComponent; public HealthComponent healthComponent; public Inventory inventory; public TeamIndex teamIndex; public Vector3 aimOrigin; public unsafe GenericCharacterInfo(CharacterBody body) { //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00a1->IL00a1: Incompatible stack types: Ref vs I4 //IL_0096->IL00a1: Incompatible stack types: I4 vs Ref //IL_0096->IL00a1: Incompatible stack types: Ref vs I4 this.body = body; gameObject = (Object.op_Implicit((Object)(object)body) ? ((Component)body).gameObject : null); master = (Object.op_Implicit((Object)(object)body) ? body.master : null); teamComponent = (Object.op_Implicit((Object)(object)body) ? body.teamComponent : null); healthComponent = (Object.op_Implicit((Object)(object)body) ? body.healthComponent : null); inventory = (Object.op_Implicit((Object)(object)master) ? master.inventory : null); ref GenericCharacterInfo reference = ref this; int num; if (Object.op_Implicit((Object)(object)teamComponent)) { reference = ref *(GenericCharacterInfo*)teamComponent.teamIndex; num = (int)(ref reference); } else { num = 0; reference = ref *(GenericCharacterInfo*)num; num = (int)(ref reference); } Unsafe.Write(&((GenericCharacterInfo*)num)->teamIndex, (TeamIndex)(ref reference)); Vector3 normalized; if (!Object.op_Implicit((Object)(object)body)) { Vector3 insideUnitSphere = Random.insideUnitSphere; normalized = ((Vector3)(ref insideUnitSphere)).normalized; } else { normalized = body.aimOrigin; } aimOrigin = normalized; } } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_Awake <>9__14_0; public static hook_OnHitEnemy <>9__14_1; public static Action<DamageReport> <>9__14_2; internal void <Init>b__14_0(orig_Awake orig, HealthComponent self) { ((Component)self).gameObject.AddComponent<GenericDamageEvent>(); orig.Invoke(self); } internal void <Init>b__14_1(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { orig.Invoke(self, damageInfo, victim); if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody body = (Object.op_Implicit((Object)(object)victim) ? victim.GetComponent<CharacterBody>() : null); GenericCharacterInfo attackerInfo = new GenericCharacterInfo(component); GenericCharacterInfo victimInfo = new GenericCharacterInfo(body); GameEventManager.OnHitEnemy?.Invoke(damageInfo, attackerInfo, victimInfo); } } internal void <Init>b__14_2(DamageReport damageReport) { if (NetworkServer.active && damageReport != null) { GameEventManager.OnCharacterDeath?.Invoke(damageReport); } } } public static event DamageAttackerVictimEventHandler OnHitEnemy; public static event DamageAttackerVictimEventHandler BeforeTakeDamage; public static event DamageReportEventHandler OnTakeDamage; public static event DamageReportEventHandler OnCharacterDeath; internal static void Init() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown object obj = <>c.<>9__14_0; if (obj == null) { hook_Awake val = delegate(orig_Awake orig, HealthComponent self) { ((Component)self).gameObject.AddComponent<GenericDamageEvent>(); orig.Invoke(self); }; <>c.<>9__14_0 = val; obj = (object)val; } HealthComponent.Awake += (hook_Awake)obj; object obj2 = <>c.<>9__14_1; if (obj2 == null) { hook_OnHitEnemy val2 = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { orig.Invoke(self, damageInfo, victim); if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody body = (Object.op_Implicit((Object)(object)victim) ? victim.GetComponent<CharacterBody>() : null); GenericCharacterInfo attackerInfo = new GenericCharacterInfo(component); GenericCharacterInfo victimInfo = new GenericCharacterInfo(body); GameEventManager.OnHitEnemy?.Invoke(damageInfo, attackerInfo, victimInfo); } }; <>c.<>9__14_1 = val2; obj2 = (object)val2; } GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj2; GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport damageReport) { if (NetworkServer.active && damageReport != null) { GameEventManager.OnCharacterDeath?.Invoke(damageReport); } }; } } public static class ItemManager { public class DisplayRuleData { public string survivorName; public string partName; public Vector3 localPos; public Vector3 localAngles; public Vector3 localScale; public DisplayRuleData(string survivorModelName, string partName, Vector3 localPos, Vector3 localAngles, Vector3 localScale) { //IL_000f: 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_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) survivorName = survivorModelName; this.partName = partName; this.localPos = localPos; this.localAngles = localAngles; this.localScale = localScale; base..ctor(); } } public static EquipmentDef GenerateEquipment(string name, float cooldown, bool isLunar = false, bool appearsInMultiPlayer = true, bool appearsInSinglePlayer = true, bool canBeRandomlyTriggered = true, bool enigmaCompatible = true, bool canDrop = true) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_0110: Expected O, but got Unknown //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Expected O, but got Unknown //IL_00d6: Unknown result type (might be due to invalid IL or missing references) EquipmentDef val = ScriptableObject.CreateInstance<EquipmentDef>(); ((Object)val).name = name.ToUpperInvariant(); val.AutoPopulateTokens(); GameObject val2 = AssetManager.bundle.LoadAsset<GameObject>(name + ".prefab"); if ((Object)(object)val2 == (Object)null) { Log.Warning("Missing prefab file for equipment " + ((Object)val).name + ". Substituting default..."); val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mystery/PickupMystery.prefab").WaitForCompletion(); } ModelPanelParameters val3 = val2.AddComponent<ModelPanelParameters>(); val3.focusPointTransform = val2.transform; val3.cameraPositionTransform = val2.transform; val3.maxDistance = 10f; val3.minDistance = 5f; val.pickupIconSprite = AssetManager.bundle.LoadAsset<Sprite>(name + ".png"); val.pickupModelPrefab = val2; val.isLunar = isLunar; if (isLunar) { val.colorIndex = (ColorIndex)4; } val.appearsInMultiPlayer = appearsInMultiPlayer; val.appearsInSinglePlayer = appearsInSinglePlayer; val.canBeRandomlyTriggered = canBeRandomlyTriggered; val.enigmaCompatible = enigmaCompatible; val.canDrop = canDrop; val.cooldown = cooldown; ItemDisplayRuleDict val4 = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomEquipment(val, val4)); return val; } public static ItemDef GenerateItem(string name, ItemTag[] tags, ItemTier tier, List<DisplayRuleData> rules = null) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Invalid comparison between Unknown and I4 //IL_0067: 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_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Invalid comparison between Unknown and I4 //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Invalid comparison between Unknown and I4 //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Expected O, but got Unknown //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Invalid comparison between Unknown and I4 //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Expected O, but got Unknown //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) ItemDef val = ScriptableObject.CreateInstance<ItemDef>(); ((Object)val).name = name.ToUpperInvariant(); val.AutoPopulateTokens(); SetItemTier(val, tier); GameObject val2 = AssetManager.bundle.LoadAsset<GameObject>(name + ".prefab"); if ((Object)(object)val2 == (Object)null) { Log.Warning("Missing prefab file for item " + ((Object)val).name + ". Substituting default..."); val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mystery/PickupMystery.prefab").WaitForCompletion(); } ModelPanelParameters val3 = val2.AddComponent<ModelPanelParameters>(); val3.focusPointTransform = val2.transform; val3.cameraPositionTransform = val2.transform; val3.maxDistance = 10f; val3.minDistance = 5f; if ((int)val.tier == 9 || (int)val.tier == 6 || (int)val.tier == 7 || (int)val.tier == 8) { val.requiredExpansion = TooManyItems.sotvDLC; } val.pickupIconSprite = AssetManager.bundle.LoadAsset<Sprite>(name + ".png"); val.pickupModelPrefab = val2; val.canRemove = true; val.hidden = false; val.tags = tags; ItemDisplayRuleDict val4 = new ItemDisplayRuleDict((ItemDisplayRule[])null); if (rules != null) { foreach (DisplayRuleData rule in rules) { val4.Add(rule.survivorName, (ItemDisplayRule[])(object)new ItemDisplayRule[1] { GenerateItemDisplayRule(val2, rule) }); } } ItemAPI.Add(new CustomItem(val, val4)); return val; } public static ItemDisplayRule GenerateItemDisplayRule(GameObject prefab, DisplayRuleData data) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) ItemDisplayRule result = default(ItemDisplayRule); result.ruleType = (ItemDisplayRuleType)0; result.followerPrefab = prefab; result.childName = data.partName; result.localPos = data.localPos; result.localAngles = data.localAngles; result.localScale = data.localScale; return result; } public static BuffDef GenerateBuff(string name, Sprite sprite, bool canStack = false, bool isHidden = false, bool isDebuff = false, bool isCooldown = false) { BuffDef val = ScriptableObject.CreateInstance<BuffDef>(); ((Object)val).name = name; val.iconSprite = sprite; val.canStack = canStack; val.isHidden = isHidden; val.isDebuff = isDebuff; val.isCooldown = isCooldown; return val; } public static void SetItemTier(ItemDef itemDef, ItemTier tier) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) if ((int)tier == 5) { try { itemDef.deprecatedTier = tier; } catch (Exception arg) { Log.Warning($"Error setting deprecatedTier for {((Object)itemDef).name}: {arg}"); } } ((ResourceAvailability)(ref ItemTierCatalog.availability)).CallWhenAvailable((Action)delegate { //IL_0017: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = tier; } }); } } } namespace TooManyItems.Items.Void { public class ShadowCrestItemBehaviour : BaseItemBodyBehavior { [ItemDefAssociation(useOnServer = true, useOnClient = false)] public static ItemDef GetItemDef() { return ShadowCrest.itemDef; } public void FixedUpdate() { if (base.stack > 0) { Utilities.ForceRecalculate(((BaseItemBodyBehavior)this).body); } } } public class ShadowCrest { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static StatHookEventHandler <>9__7_0; internal void <Hooks>b__7_0(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory) && Object.op_Implicit((Object)(object)sender.healthComponent)) { int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0 && sender.healthComponent.combinedHealthFraction < 1f) { args.baseRegenAdd += Utilities.GetHyperbolicStacking(percentRegenPerSecond, percentRegenPerSecondExtraStacks, itemCountEffective) * sender.healthComponent.missingCombinedHealth; } } } } public static ItemDef itemDef; public static ConfigurableValue<bool> isEnabled = new ConfigurableValue<bool>("Item: Shadow Crest", "Enabled", defaultValue: true, "Whether or not the item is enabled.", new List<string>(1) { "ITEM_SHADOWCREST_DESC" }); public static ConfigurableValue<float> regenPerSecond = new ConfigurableValue<float>("Item: Shadow Crest", "Regen Per Second", 1f, "Percentage of missing health regenerated per second.", new List<string>(1) { "ITEM_SHADOWCREST_DESC" }); public static ConfigurableValue<float> regenPerSecondExtraStacks = new ConfigurableValue<float>("Item: Shadow Crest", "Regen Per Second Extra Stacks", 1f, "Percentage of missing health regenerated per second for extra stacks.", new List<string>(1) { "ITEM_SHADOWCREST_DESC" }); public static float percentRegenPerSecond = regenPerSecond.Value / 100f; public static float percentRegenPerSecondExtraStacks = regenPerSecondExtraStacks.Value / 100f; internal static void Init() { itemDef = ItemManager.GenerateItem("ShadowCrest", (ItemTag[])(object)new ItemTag[2] { (ItemTag)2, (ItemTag)31 }, (ItemTier)7); Hooks(); } public static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__7_0; if (obj == null) { StatHookEventHandler val = delegate(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory) && Object.op_Implicit((Object)(object)sender.healthComponent)) { int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0 && sender.healthComponent.combinedHealthFraction < 1f) { args.baseRegenAdd += Utilities.GetHyperbolicStacking(percentRegenPerSecond, percentRegenPerSecondExtraStacks, itemCountEffective) * sender.healthComponent.missingCombinedHealth; } } }; <>c.<>9__7_0 = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; } } internal class VoidHeart { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static StatHookEventHandler <>9__9_0; internal void <Hooks>b__9_0(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory) && Object.op_Implicit((Object)(object)sender.healthComponent)) { int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { args.baseHealthAdd += healthIncrease.Value; args.baseDamageAdd += CalculateDamageBonus(sender, itemCountEffective); } } } } public static ItemDef itemDef; public static ConfigurableValue<bool> isEnabled = new ConfigurableValue<bool>("Item: Defiled Heart", "Enabled", defaultValue: true, "Whether or not the item is enabled.", new List<string>(1) { "ITEM_VOIDHEART_DESC" }); public static ConfigurableValue<float> healthIncrease = new ConfigurableValue<float>("Item: Defiled Heart", "Health Increase", 200f, "Bonus health gained from this item. Does not increase with stacks.", new List<string>(1) { "ITEM_VOIDHEART_DESC" }); public static ConfigurableValue<float> percentDamagePerStack = new ConfigurableValue<float>("Item: Defiled Heart", "Bonus Damage Scaling", 1.5f, "Percent of maximum health gained as base damage.", new List<string>(1) { "ITEM_VOIDHEART_DESC" }); public static ConfigurableValue<float> percentDamagePerExtraStack = new ConfigurableValue<float>("Item: Defiled Heart", "Bonus Damage Scaling Extra Stacks", 1.5f, "Percent of maximum health gained as base damage with extra stacks.", new List<string>(1) { "ITEM_VOIDHEART_DESC" }); public static float multiplierPerStack = percentDamagePerStack.Value / 100f; public static float multiplierPerExtraStack = percentDamagePerExtraStack.Value / 100f; internal static void Init() { ItemTag[] array = new ItemTag[3]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); itemDef = ItemManager.GenerateItem("VoidHeart", (ItemTag[])(object)array, (ItemTier)8); Hooks(); } public static float CalculateDamageBonus(CharacterBody sender, int itemCount) { return sender.healthComponent.fullHealth * Utilities.GetLinearStacking(multiplierPerStack, multiplierPerExtraStack, itemCount); } public static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__9_0; if (obj == null) { StatHookEventHandler val = delegate(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory) && Object.op_Implicit((Object)(object)sender.healthComponent)) { int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { args.baseHealthAdd += healthIncrease.Value; args.baseDamageAdd += CalculateDamageBonus(sender, itemCountEffective); } } }; <>c.<>9__9_0 = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; } } } namespace TooManyItems.Items.Tier3 { internal class Abacus { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static StatHookEventHandler <>9__6_0; public static GameEventManager.DamageReportEventHandler <>9__6_1; internal void <Hooks>b__6_0(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory)) { int buffCount = sender.GetBuffCount(countedBuff); args.critAdd += Utilities.GetLinearStacking(critChancePerStack.Value, critChancePerExtraStack.Value, buffCount); if (sender.inventory.GetItemCountEffective(itemDef) > 0 && sender.crit > 100f) { args.critDamageMultAdd += sender.crit / 100f - 1f; } } } internal void <Hooks>b__6_1(DamageReport damageReport) { CharacterBody attackerBody = damageReport.attackerBody; if (!Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)attackerBody.inventory)) { return; } int itemCountEffective = attackerBody.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { for (int i = 0; i < itemCountEffective; i++) { attackerBody.AddBuff(countedBuff); } Utilities.ForceRecalculate(attackerBody); } } } public static ItemDef itemDef; public static BuffDef countedBuff; public static ConfigurableValue<bool> isEnabled = new ConfigurableValue<bool>("Item: Abacus", "Enabled", defaultValue: true, "Whether or not the item is enabled.", new List<string>(1) { "ITEM_ABACUS_DESC" }); public static ConfigurableValue<float> critChancePerStack = new ConfigurableValue<float>("Item: Abacus", "Crit On Kill", 1f, "Crit chance gained on kill per first stack of item.", new List<string>(1) { "ITEM_ABACUS_DESC" }); public static ConfigurableValue<float> critChancePerExtraStack = new ConfigurableValue<float>("Item: Abacus", "Crit On Kill Extra Stacks", 1f, "Crit chance gained on kill per extra stack of item.", new List<string>(1) { "ITEM_ABACUS_DESC" }); internal static void Init() { ItemTag[] array = new ItemTag[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); itemDef = ItemManager.GenerateItem("Abacus", (ItemTag[])(object)array, (ItemTier)2); countedBuff = ItemManager.GenerateBuff("Counted", AssetManager.bundle.LoadAsset<Sprite>("Counted.png"), canStack: true); ContentAddition.AddBuffDef(countedBuff); Hooks(); } public static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__6_0; if (obj == null) { StatHookEventHandler val = delegate(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory)) { int buffCount = sender.GetBuffCount(countedBuff); args.critAdd += Utilities.GetLinearStacking(critChancePerStack.Value, critChancePerExtraStack.Value, buffCount); if (sender.inventory.GetItemCountEffective(itemDef) > 0 && sender.crit > 100f) { args.critDamageMultAdd += sender.crit / 100f - 1f; } } }; <>c.<>9__6_0 = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; GameEventManager.OnCharacterDeath += delegate(DamageReport damageReport) { CharacterBody attackerBody = damageReport.attackerBody; if (Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)attackerBody.inventory)) { int itemCountEffective = attackerBody.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { for (int i = 0; i < itemCountEffective; i++) { attackerBody.AddBuff(countedBuff); } Utilities.ForceRecalculate(attackerBody); } } }; } } internal class BloodDice { public class Statistics : MonoBehaviour { public class Sync : INetMessage, ISerializableObject { private NetworkInstanceId objId; private float permanentHealth; public Sync() { } public Sync(NetworkInstanceId objId, float health) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) this.objId = objId; permanentHealth = health; } public void Deserialize(NetworkReader reader) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) objId = reader.ReadNetworkId(); permanentHealth = reader.ReadSingle(); } public void OnReceived() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { return; } GameObject val = Util.FindNetworkObject(objId); if ((Object)(object)val != (Object)null) { Statistics component = val.GetComponent<Statistics>(); if (component != null) { component.PermanentHealth = permanentHealth; } } } public void Serialize(NetworkWriter writer) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) writer.Write(objId); writer.Write(permanentHealth); writer.FinishMessage(); } } private float _permanentHealth; public float PermanentHealth { get { return _permanentHealth; } set { //IL_001d: Unknown result type (might be due to invalid IL or missing references) _permanentHealth = value; if (NetworkServer.active) { NetMessageExtensions.Send((INetMessage)(object)new Sync(((Component)this).gameObject.GetComponent<NetworkIdentity>().netId, value), (NetworkDestination)1); } } } } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<CharacterMaster> <>9__10_0; public static hook_GetHealthBarValues <>9__10_1; public static StatHookEventHandler <>9__10_2; public static GameEventManager.DamageReportEventHandler <>9__10_3; internal void <Hooks>b__10_0(CharacterMaster obj) { Inventory inventory = obj.inventory; if (inventory != null) { ((Component)inventory).gameObject.AddComponent<Statistics>(); } } internal HealthBarValues <Hooks>b__10_1(orig_GetHealthBarValues orig, HealthComponent self) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) HealthBarValues result = orig.Invoke(self); if (Object.op_Implicit((Object)(object)self.body) && Object.op_Implicit((Object)(object)self.body.inventory) && self.body.inventory.GetItemCountEffective(itemDef) > 0) { result.hasInfusion = true; } return result; } internal void <Hooks>b__10_2(CharacterBody sender, StatHookEventArgs args) { if (!Object.op_Implicit((Object)(object)sender) || !Object.op_Implicit((Object)(object)sender.inventory)) { return; } int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { Statistics component = ((Component)sender.inventory).GetComponent<Statistics>(); if (Object.op_Implicit((Object)(object)component)) { args.baseHealthAdd += Mathf.Min(component.PermanentHealth, CalculateMaxHealthCap(itemCountEffective)); } } } internal void <Hooks>b__10_3(DamageReport damageReport) { CharacterMaster attackerMaster = damageReport.attackerMaster; CharacterBody attackerBody = damageReport.attackerBody; if (!Object.op_Implicit((Object)(object)attackerMaster) || !Object.op_Implicit((Object)(object)attackerBody) || !Object.op_Implicit((Object)(object)attackerBody.inventory)) { return; } int itemCountEffective = attackerBody.inventory.GetItemCountEffective(itemDef); if (itemCountEffective <= 0) { return; } Statistics component = ((Component)attackerBody.inventory).GetComponent<Statistics>(); if (!Object.op_Implicit((Object)(object)component)) { return; } int num = Math.Min(GetDiceRoll(attackerMaster), Mathf.RoundToInt(CalculateMaxHealthCap(itemCountEffective) - component.PermanentHealth)); if (num > 0) { for (int i = 0; i < num; i++) { OrbManager.instance.AddOrb((Orb)(object)new BloodDiceOrb(damageReport, i)); } } } } public static ItemDef itemDef; public static ConfigurableValue<bool> isEnabled = new ConfigurableValue<bool>("Item: Blood Dice", "Enabled", defaultValue: true, "Whether or not the item is enabled.", new List<string>(1) { "ITEM_BLOODDICE_DESC" }); public static ConfigurableValue<bool> affectedByLuck = new ConfigurableValue<bool>("Item: Blood Dice", "Affected By Luck", defaultValue: true, "Whether or not the likelihood of a high roll is affected by luck.", new List<string>(1) { "ITEM_BLOODDICE_DESC" }); public static ConfigurableValue<int> minHealthGain = new ConfigurableValue<int>("Item: Blood Dice", "Min Gain", 2, "Minimum health that can be gained every kill.", new List<string>(1) { "ITEM_BLOODDICE_DESC" }); public static ConfigurableValue<int> maxHealthGain = new ConfigurableValue<int>("Item: Blood Dice", "Max Gain", 12, "Maximum health that can be gained every kill.", new List<string>(1) { "ITEM_BLOODDICE_DESC" }); public static ConfigurableValue<float> maxHealthPerStack = new ConfigurableValue<float>("Item: Blood Dice", "Maximum Health Per Item", 550f, "Maximum amount of permanent health allowed per first stack.", new List<string>(1) { "ITEM_BLOODDICE_DESC" }); public static ConfigurableValue<float> maxHealthPerExtraStack = new ConfigurableValue<float>("Item: Blood Dice", "Maximum Health Per Extra Item", 550f, "Maximum amount of permanent health allowed per extra stack.", new List<string>(1) { "ITEM_BLOODDICE_DESC" }); internal static void Init() { ItemTag[] array = new ItemTag[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); itemDef = ItemManager.GenerateItem("BloodDice", (ItemTag[])(object)array, (ItemTier)2); NetworkingAPI.RegisterMessageType<Statistics.Sync>(); Hooks(); } public static float CalculateMaxHealthCap(int itemCount) { return Utilities.GetLinearStacking(maxHealthPerStack.Value, maxHealthPerExtraStack.Value, itemCount); } public static void Hooks() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown CharacterMaster.onStartGlobal += delegate(CharacterMaster obj) { Inventory inventory = obj.inventory; if (inventory != null) { ((Component)inventory).gameObject.AddComponent<Statistics>(); } }; object obj2 = <>c.<>9__10_1; if (obj2 == null) { hook_GetHealthBarValues val = delegate(orig_GetHealthBarValues orig, HealthComponent self) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) HealthBarValues result = orig.Invoke(self); if (Object.op_Implicit((Object)(object)self.body) && Object.op_Implicit((Object)(object)self.body.inventory) && self.body.inventory.GetItemCountEffective(itemDef) > 0) { result.hasInfusion = true; } return result; }; <>c.<>9__10_1 = val; obj2 = (object)val; } HealthComponent.GetHealthBarValues += (hook_GetHealthBarValues)obj2; object obj3 = <>c.<>9__10_2; if (obj3 == null) { StatHookEventHandler val2 = delegate(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory)) { int itemCountEffective2 = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective2 > 0) { Statistics component2 = ((Component)sender.inventory).GetComponent<Statistics>(); if (Object.op_Implicit((Object)(object)component2)) { args.baseHealthAdd += Mathf.Min(component2.PermanentHealth, CalculateMaxHealthCap(itemCountEffective2)); } } } }; <>c.<>9__10_2 = val2; obj3 = (object)val2; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj3; GameEventManager.OnCharacterDeath += delegate(DamageReport damageReport) { CharacterMaster attackerMaster = damageReport.attackerMaster; CharacterBody attackerBody = damageReport.attackerBody; if (Object.op_Implicit((Object)(object)attackerMaster) && Object.op_Implicit((Object)(object)attackerBody) && Object.op_Implicit((Object)(object)attackerBody.inventory)) { int itemCountEffective = attackerBody.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { Statistics component = ((Component)attackerBody.inventory).GetComponent<Statistics>(); if (Object.op_Implicit((Object)(object)component)) { int num = Math.Min(GetDiceRoll(attackerMaster), Mathf.RoundToInt(CalculateMaxHealthCap(itemCountEffective) - component.PermanentHealth)); if (num > 0) { for (int i = 0; i < num; i++) { OrbManager.instance.AddOrb((Orb)(object)new BloodDiceOrb(damageReport, i)); } } } } } }; } public static int GetDiceRoll(CharacterMaster master) { float num = 7f; float num2 = 3.5f; if (affectedByLuck.Value) { num += master.luck * num2; } return Mathf.Clamp(GenerateRollNormalDistribution(num, num2), minHealthGain.Value, maxHealthGain.Value); } private static int GenerateRollNormalDistribution(float mean, float deviation) { float num = (float)(1.0 - TooManyItems.RandGen.NextDouble()); float num2 = (float)(1.0 - TooManyItems.RandGen.NextDouble()); float num3 = Mathf.Sqrt(-2f * Mathf.Log(num)) * Mathf.Sin(MathF.PI * 2f * num2); float num4 = mean + deviation * num3; return Mathf.RoundToInt(num4); } } public class BloodDiceOrb : Orb { private readonly float speed = 25f; private readonly CharacterBody targetBody; private Inventory targetInventory; public BloodDiceOrb(DamageReport report, int sequence) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)report.victimBody) && Object.op_Implicit((Object)(object)report.attackerBody)) { targetBody = report.attackerBody ?? null; base.origin = (Object.op_Implicit((Object)(object)report.victimBody) ? report.victimBody.corePosition : Vector3.zero); if (Object.op_Implicit((Object)(object)targetBody)) { base.target = targetBody.mainHurtBox; } } speed += sequence; } public override void Begin() { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown if ((Object)(object)targetBody == (Object)null || (Object)(object)base.target == (Object)null) { ((Orb)this).duration = 0f; targetInventory = null; return; } ((Orb)this).duration = ((Orb)this).distanceToTarget / speed; EffectData val = new EffectData { origin = base.origin, genericFloat = ((Orb)this).duration }; val.SetHurtBoxReference(base.target); EffectManager.SpawnEffect(OrbStorageUtility.Get("Prefabs/Effects/OrbEffects/InfusionOrbEffect"), val, true); targetInventory = targetBody.inventory; } public override void OnArrival() { if (!Object.op_Implicit((Object)(object)targetInventory)) { return; } int itemCountEffective = targetInventory.GetItemCountEffective(BloodDice.itemDef); float num = BloodDice.CalculateMaxHealthCap(itemCountEffective); BloodDice.Statistics component = ((Component)targetInventory).GetComponent<BloodDice.Statistics>(); if (Object.op_Implicit((Object)(object)component)) { component.PermanentHealth += 1f; if (component.PermanentHealth > num) { component.PermanentHealth = num; } } if (Object.op_Implicit((Object)(object)targetBody)) { Utilities.ForceRecalculate(targetBody); } } } internal class GlassMarbles { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static StatHookEventHandler <>9__5_0; internal void <Hooks>b__5_0(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory)) { int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { args.baseDamageAdd += Utilities.GetLinearStacking(damagePerLevelPerStack.Value, damagePerLevelPerExtraStack.Value, itemCountEffective); args.levelDamageAdd += Utilities.GetLinearStacking(damagePerLevelPerStack.Value, damagePerLevelPerExtraStack.Value, itemCountEffective); } } } } public static ItemDef itemDef; public static ConfigurableValue<bool> isEnabled = new ConfigurableValue<bool>("Item: Glass Marbles", "Enabled", defaultValue: true, "Whether or not the item is enabled.", new List<string>(1) { "ITEM_GLASSMARBLES_DESC" }); public static ConfigurableValue<float> damagePerLevelPerStack = new ConfigurableValue<float>("Item: Glass Marbles", "Damage Increase", 2f, "Amount of base damage gained per level per first stack.", new List<string>(1) { "ITEM_GLASSMARBLES_DESC" }); public static ConfigurableValue<float> damagePerLevelPerExtraStack = new ConfigurableValue<float>("Item: Glass Marbles", "Damage Increase Extra Stacks", 2f, "Amount of base damage gained per level per extra stack.", new List<string>(1) { "ITEM_GLASSMARBLES_DESC" }); internal static void Init() { itemDef = ItemManager.GenerateItem("GlassMarbles", (ItemTag[])(object)new ItemTag[2] { (ItemTag)1, (ItemTag)31 }, (ItemTier)2); Hooks(); } public static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__5_0; if (obj == null) { StatHookEventHandler val = delegate(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory)) { int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { args.baseDamageAdd += Utilities.GetLinearStacking(damagePerLevelPerStack.Value, damagePerLevelPerExtraStack.Value, itemCountEffective); args.levelDamageAdd += Utilities.GetLinearStacking(damagePerLevelPerStack.Value, damagePerLevelPerExtraStack.Value, itemCountEffective); } } }; <>c.<>9__5_0 = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; } } internal class Horseshoe { public enum Bonuses { HEALTH, DAMAGE, ATTACK_SPEED, CRIT_CHANCE, CRIT_DAMAGE, ARMOR, HEALTH_REGEN, SHIELD, MOVEMENT_SPEED, NUM_STATS } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<CharacterMaster> <>9__16_0; public static Action<Stage> <>9__16_1; public static hook_GiveItemPermanent_ItemIndex_int <>9__16_2; public static hook_GiveItemTemp <>9__16_3; public static StatHookEventHandler <>9__16_4; internal void <Hooks>b__16_0(CharacterMaster obj) { Inventory inventory = obj.inventory; if (inventory != null) { ((Component)inventory).gameObject.AddComponent<HorseshoeStatisticsHandler>(); } } internal void <Hooks>b__16_1(Stage stage) { foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { CharacterMaster master = instance.master; if (Object.op_Implicit((Object)(object)master) && Object.op_Implicit((Object)(object)master.inventory) && master.inventory.GetItemCountEffective(itemDef) > 0) { Reroll(master.inventory, master.GetBody()); } } } internal void <Hooks>b__16_2(orig_GiveItemPermanent_ItemIndex_int orig, Inventory self, ItemIndex index, int count) { //IL_001f: 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_0060: Unknown result type (might be due to invalid IL or missing references) HorseshoeStatisticsHandler component = ((Component)self).GetComponent<HorseshoeStatisticsHandler>(); CharacterMaster component2 = ((Component)self).GetComponent<CharacterMaster>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component2) && index == itemDef.itemIndex && HasNotRolledYet(component) && Object.op_Implicit((Object)(object)component2.GetBody())) { Reroll(self, component2.GetBody()); } orig.Invoke(self, index, count); } internal void <Hooks>b__16_3(orig_GiveItemTemp orig, Inventory self, ItemIndex index, float count) { //IL_001f: 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_0060: Unknown result type (might be due to invalid IL or missing references) HorseshoeStatisticsHandler component = ((Component)self).GetComponent<HorseshoeStatisticsHandler>(); CharacterMaster component2 = ((Component)self).GetComponent<CharacterMaster>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component2) && index == itemDef.itemIndex && HasNotRolledYet(component) && Object.op_Implicit((Object)(object)component2.GetBody())) { Reroll(self, component2.GetBody()); } orig.Invoke(self, index, count); } internal void <Hooks>b__16_4(CharacterBody sender, StatHookEventArgs args) { if (!Object.op_Implicit((Object)(object)sender) || !Object.op_Implicit((Object)(object)sender.inventory)) { return; } int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { HorseshoeStatisticsHandler component = ((Component)sender.inventory).GetComponent<HorseshoeStatisticsHandler>(); if (Object.op_Implicit((Object)(object)component)) { args.baseHealthAdd += GetScaledValue(component.MaxHealthBonus, sender.level, itemCountEffective); args.baseDamageAdd += GetScaledValue(component.BaseDamageBonus, sender.level, itemCountEffective); args.attackSpeedMultAdd += GetScaledValue(component.AttackSpeedPercentBonus, sender.level, itemCountEffective); args.critAdd += GetScaledValue(component.CritChanceBonus, sender.level, itemCountEffective); args.critDamageMultAdd += GetScaledValue(component.CritDamageBonus, sender.level, itemCountEffective); args.armorAdd += GetScaledValue(component.ArmorBonus, sender.level, itemCountEffective); args.baseRegenAdd += GetScaledValue(component.RegenerationBonus, sender.level, itemCountEffective); args.baseShieldAdd += GetScaledValue(component.ShieldBonus, sender.level, itemCountEffective); args.moveSpeedMultAdd += GetScaledValue(component.MoveSpeedPercentBonus, sender.level, itemCountEffective); } } } } public static ItemDef itemDef; public static ConfigurableValue<bool> isEnabled = new ConfigurableValue<bool>("Item: Golden Horseshoe", "Enabled", defaultValue: true, "Whether or not the item is enabled.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> totalPointsCap = new ConfigurableValue<float>("Item: Golden Horseshoe", "Stat Points Cap", 18f, "Total amount of stat points in each reroll. See following configs for scalings.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> healthPerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Health Per Point", 12f, "Max health gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> damagePerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Damage Per Point", 0.75f, "Base damage gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> attackSpeedPerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Attack Speed Per Point", 4f, "Percent attack speed gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> critChancePerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Crit Chance Per Point", 2f, "Percent crit chance gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> critDamagePerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Crit Damage Per Point", 2f, "Percent crit damage gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> armorPerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Armor Per Point", 2f, "Armor gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> regenPerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Regeneration Per Point", 0.75f, "Regeneration gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> shieldPerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Shield Per Point", 15f, "Shield gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> moveSpeedPerPoint = new ConfigurableValue<float>("Item: Golden Horseshoe", "Move Speed Per Point", 4f, "Percent movement speed gained per stat point invested.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static ConfigurableValue<float> extraStackMultiplier = new ConfigurableValue<float>("Item: Golden Horseshoe", "Increase for Additional Stacks", 30f, "Percent increase to all bonuses given for each additional stack of this item.", new List<string>(1) { "ITEM_HORSESHOE_DESC" }); public static float extraStackMultiplierPercent = extraStackMultiplier.Value / 100f; internal static void Init() { ItemTag[] array = new ItemTag[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); itemDef = ItemManager.GenerateItem("Horseshoe", (ItemTag[])(object)array, (ItemTier)2); NetworkingAPI.RegisterMessageType<HorseshoeStatisticsHandler.Sync>(); Hooks(); } public static void Hooks() { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown CharacterMaster.onStartGlobal += delegate(CharacterMaster obj) { Inventory inventory = obj.inventory; if (inventory != null) { ((Component)inventory).gameObject.AddComponent<HorseshoeStatisticsHandler>(); } }; Stage.onStageStartGlobal += delegate { foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { CharacterMaster master = instance.master; if (Object.op_Implicit((Object)(object)master) && Object.op_Implicit((Object)(object)master.inventory) && master.inventory.GetItemCountEffective(itemDef) > 0) { Reroll(master.inventory, master.GetBody()); } } }; object obj2 = <>c.<>9__16_2; if (obj2 == null) { hook_GiveItemPermanent_ItemIndex_int val = delegate(orig_GiveItemPermanent_ItemIndex_int orig, Inventory self, ItemIndex index, int count) { //IL_001f: 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_0060: Unknown result type (might be due to invalid IL or missing references) HorseshoeStatisticsHandler component4 = ((Component)self).GetComponent<HorseshoeStatisticsHandler>(); CharacterMaster component5 = ((Component)self).GetComponent<CharacterMaster>(); if (Object.op_Implicit((Object)(object)component4) && Object.op_Implicit((Object)(object)component5) && index == itemDef.itemIndex && HasNotRolledYet(component4) && Object.op_Implicit((Object)(object)component5.GetBody())) { Reroll(self, component5.GetBody()); } orig.Invoke(self, index, count); }; <>c.<>9__16_2 = val; obj2 = (object)val; } Inventory.GiveItemPermanent_ItemIndex_int += (hook_GiveItemPermanent_ItemIndex_int)obj2; object obj3 = <>c.<>9__16_3; if (obj3 == null) { hook_GiveItemTemp val2 = delegate(orig_GiveItemTemp orig, Inventory self, ItemIndex index, float count) { //IL_001f: 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_0060: Unknown result type (might be due to invalid IL or missing references) HorseshoeStatisticsHandler component2 = ((Component)self).GetComponent<HorseshoeStatisticsHandler>(); CharacterMaster component3 = ((Component)self).GetComponent<CharacterMaster>(); if (Object.op_Implicit((Object)(object)component2) && Object.op_Implicit((Object)(object)component3) && index == itemDef.itemIndex && HasNotRolledYet(component2) && Object.op_Implicit((Object)(object)component3.GetBody())) { Reroll(self, component3.GetBody()); } orig.Invoke(self, index, count); }; <>c.<>9__16_3 = val2; obj3 = (object)val2; } Inventory.GiveItemTemp += (hook_GiveItemTemp)obj3; object obj4 = <>c.<>9__16_4; if (obj4 == null) { StatHookEventHandler val3 = delegate(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory)) { int itemCountEffective = sender.inventory.GetItemCountEffective(itemDef); if (itemCountEffective > 0) { HorseshoeStatisticsHandler component = ((Component)sender.inventory).GetComponent<HorseshoeStatisticsHandler>(); if (Object.op_Implicit((Object)(object)component)) { args.baseHealthAdd += GetScaledValue(component.MaxHealthBonus, sender.level, itemCountEffective); args.baseDamageAdd += GetScaledValue(component.BaseDamageBonus, sender.level, itemCountEffective); args.attackSpeedMultAdd += GetScaledValue(component.AttackSpeedPercentBonus, sender.level, itemCountEffective); args.critAdd += GetScaledValue(component.CritChanceBonus, sender.level, itemCountEffective); args.critDamageMultAdd += GetScaledValue(component.CritDamageBonus, sender.level, itemCountEffective); args.armorAdd += GetScaledValue(component.ArmorBonus, sender.level, itemCountEffective); args.baseRegenAdd += GetScaledValue(component.RegenerationBonus, sender.level, itemCountEffective); args.baseShieldAdd += GetScaledValue(component.ShieldBonus, sender.level, itemCountEffective); args.moveSpeedMultAdd += GetScaledValue(component.MoveSpeedPercentBonus, sender.level, itemCountEffective); } } } }; <>c.<>9__16_4 = val3; obj4 = (object)val3; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj4; } public static float GetScaledValue(float value, float level, int count) { float num = (level + 11f) / 12f; float num2 = 1f + extraStackMultiplierPercent * (float)count; return value * num * num2; } public static bool HasNotRolledYet(HorseshoeStatisticsHandler bonuses) { if (bonuses.MaxHealthBonus != 0f) { return false; } if (bonuses.BaseDamageBonus != 0f) { return false; } if (bonuses.AttackSpeedPercentBonus != 0f) { return false; } if (bonuses.CritChanceBonus != 0f) { return false; } if (bonuses.CritDamageBonus != 0f) { return false; } if (bonuses.ArmorBonus != 0f) { return false; } if (bonuses.RegenerationBonus != 0f) { return false; } if (bonuses.ShieldBonus != 0f) { return false; } if (bonuses.MoveSpeedPercentBonus != 0f) { return false; } return true; } public static void Reroll(Inventory inventory, CharacterBody body) { HorseshoeStatisticsHandler component = ((Component)inventory).GetComponent<HorseshoeStatisticsHandler>(); if (Object.op_Implicit((Object)(object)component)) { component.MaxHealthBonus = 0f; component.BaseDamageBonus = 0f; component.AttackSpeedPercentBonus = 0f; component.CritChanceBonus = 0f; component.CritDamageBonus = 0f; component.ArmorBonus = 0f; component.RegenerationBonus = 0f; component.ShieldBonus = 0f; component.MoveSpeedPercentBonus = 0f; float num = totalPointsCap.Value; while (num > 0f) { float num2 = 2.5f; float num3 = (float)TooManyItems.RandGen.NextDouble() * num2 + num2; if (num - num3 < num2) { num3 = num; } switch ((Bonuses)TooManyItems.RandGen.Next(0, 9)) { case Bonuses.HEALTH: component.MaxHealthBonus += num3 * healthPerPoint.Value; break; case Bonuses.DAMAGE: component.BaseDamageBonus += num3 * damagePerPoint.Value; break; case Bonuses.ATTACK_SPEED: component.AttackSpeedPercentBonus += num3 * attackSpeedPerPoint.Value / 100f; break; case Bonuses.CRIT_CHANCE: component.CritChanceBonus += num3 * critChancePerPoint.Value; break; case Bonuses.CRIT_DAMAGE: component.CritDamageBonus += num3 * critDamagePerPoint.Value / 100f; break; case Bonuses.ARMOR: component.ArmorBonus += num3 * armorPerPoint.Value; break; case Bonuses.HEALTH_REGEN: component.RegenerationBonus += num3 * regenPerPoint.Value; break; case Bonuses.SHIELD: component.ShieldBonus += num3 * shieldPerPoint.Value; break; case Bonuses.MOVEMENT_SPEED: component.MoveSpeedPercentBonus += num3 * moveSpeedPerPoint.Value / 100f; break; default: Log.Error("Attempted to boost an invalid stat."); break; } num -= num3; } Utilities.ForceRecalculate(body); } else { Log.Error("Unable to reroll Horseshoe statistics."); } } } internal class IronHeart { public class Statistics : MonoBehaviour { public class Sync : INetMessage, ISerializableObject { private NetworkInstanceId objId; private float totalDamageDealt; public Sync() { } public Sync(NetworkInstanceId objId, float totalDamage) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) this.objId = objId; totalDamageDealt = totalDamage; } public void Deserialize(NetworkReader reader) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) objId = reader.ReadNetworkId(); totalDamageDealt = reader.ReadSingle(); } public void OnReceived() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { return; } GameObject val = Util.FindNetworkObject(objId); if ((Object)(object)val != (Object)null) { Statistics component = val.GetComponent<Statistics>(); if (component != null) { component.TotalDamageDealt = totalDamageDealt; } } } public void Serialize(NetworkWriter writer) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) writer.Write(objId); writer.Write(totalDamageDealt); writer.FinishMessage(); } } private float _totalDamageDealt; public float TotalDamageDealt { get { return _totalDamageDealt; } set { //IL_001d: Unknown result type (might be due to invalid IL