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 Prestige Items Beta v0.2.0
plugins/PrestigeItems/PrestigeItems.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HG.Reflection; using Microsoft.CodeAnalysis; using On.RoR2; using PrestigeItems.Items; using PrestigeItems.Util; using R2API; using RoR2; using RoR2.Items; using UnityEngine; using UnityEngine.AddressableAssets; [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.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("PrestigeItems")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+7fdc85a623dad6f0146cfd4f95c20a58e916c524")] [assembly: AssemblyProduct("PrestigeItems")] [assembly: AssemblyTitle("PrestigeItems")] [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 PrestigeItems { 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.*/)] [BepInPlugin("BlueB.PrestigeItemsMod", "PrestigeItemsMod", "0.2.0")] public class PrestigeItems : BaseUnityPlugin { public const string PluginGUID = "BlueB.PrestigeItemsMod"; public const string PluginAuthor = "BlueB"; public const string PluginName = "PrestigeItemsMod"; public const string PluginVersion = "0.2.0"; public static PluginInfo SavedInfo { get; private set; } public void Awake() { SavedInfo = ((BaseUnityPlugin)this).Info; Log.Init(((BaseUnityPlugin)this).Logger); AssetUtil.Init(); Log.Debug("Asset Bundle loaded from stream. (allegedly)"); DevCube.Init(); PrestigeBleed.Init(); PrestigeFungus.Init(); PrestigeBauble.Init(); PrestigeSymbiote.Init(); } private void Update() { } private void debugSpawnItem(ItemDef itemDef, KeyCode keyTrigger) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005a: 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) //IL_006a: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown(keyTrigger)) { Transform transform = PlayerCharacterMasterController.instances[0].master.GetBodyObject().transform; Log.Info($"Player pressed {keyTrigger}. Spawning our custom item {((Object)itemDef).name} at coordinates {transform.position}"); PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(itemDef.itemIndex), transform.position, transform.forward * 20f); } } } } namespace PrestigeItems.Util { public static class AssetUtil { public static AssetBundle bundle; public const string bundleName = "prestigemodassets"; public static Sprite defaultSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/MiscIcons/texMysteryIcon.png").WaitForCompletion(); public static GameObject defaultModel = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mystery/PickupMystery.prefab").WaitForCompletion(); public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(PrestigeItems.SavedInfo.Location), "prestigemodassets"); public static void Init() { bundle = AssetBundle.LoadFromFile(AssetBundlePath); } private static T SafeLoad<T>(string fileName) where T : Object { try { T val = bundle.LoadAsset<T>(fileName); if ((Object)(object)val == (Object)null) { Log.Debug("Asset " + fileName + " not found in the AssetBundle. Using fallback asset."); } return val; } catch (Exception ex) { Log.Error("Error loading asset " + fileName + ": " + ex.Message + "\n" + ex.StackTrace); return default(T); } } public static Sprite LoadSprite(string filename) { if (!filename.Contains(".")) { filename += ".png"; } return SafeLoad<Sprite>(filename) ?? defaultSprite; } public static GameObject LoadModel(string filename) { if (!filename.Contains(".")) { filename += ".prefab"; } return SafeLoad<GameObject>(filename) ?? defaultModel; } public static Sprite LoadBaseGameSprite(string path) { //IL_0002: 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) return Addressables.LoadAssetAsync<Sprite>((object)path).WaitForCompletion(); } public static GameObject LoadBaseGameModel(string path) { //IL_0002: 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) return Addressables.LoadAssetAsync<GameObject>((object)path).WaitForCompletion(); } } } namespace PrestigeItems.Items { internal class ItemTemplate { public static ItemDef itemDef; private static string itemId = ""; internal static void Init() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown GenerateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(itemDef, val)); Hooks(); } private static void GenerateItem() { itemDef = ScriptableObject.CreateInstance<ItemDef>(); itemId = itemId.Replace(" ", "").ToUpper(); ((Object)itemDef).name = itemId; itemDef.nameToken = itemId + "_NAME"; itemDef.pickupToken = itemId + "_PICKUP"; itemDef.descriptionToken = itemId + "_DESCRIPTION"; itemDef.loreToken = itemId + "_LORE"; ((ResourceAvailability)(ref ItemTierCatalog.availability)).CallWhenAvailable((Action)delegate { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)0; } }); itemDef.pickupIconSprite = AssetUtil.LoadSprite(""); itemDef.pickupModelPrefab = AssetUtil.LoadModel(""); itemDef.canRemove = true; itemDef.hidden = false; itemDef.tags = (ItemTag[])(object)new ItemTag[2] { (ItemTag)11, (ItemTag)3 }; } public static void Hooks() { } private static void AddTokens() { LanguageAPI.Add(itemId ?? "", "Item Name"); LanguageAPI.Add(itemId + "_NAME", "Item Name"); LanguageAPI.Add(itemId + "_PICKUP", "Pickup Flavor Text / Basic Description"); LanguageAPI.Add(itemId + "_DESCRIPTION", "A Detailed Description of the Item's Mechanics."); string text = "Lore Text"; LanguageAPI.Add(itemId + "_LORE", text); } } internal class Boilerplate { public static ItemDef myItemDef; internal static void Init() { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "EXAMPLE_CLOAKONKILL_NAME"; myItemDef.nameToken = "EXAMPLE_CLOAKONKILL_NAME"; myItemDef.pickupToken = "EXAMPLE_CLOAKONKILL_PICKUP"; myItemDef.descriptionToken = "EXAMPLE_CLOAKONKILL_DESC"; myItemDef.loreToken = "EXAMPLE_CLOAKONKILL_LORE"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier2Def.asset").WaitForCompletion(); myItemDef.pickupIconSprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/MiscIcons/texMysteryIcon.png").WaitForCompletion(); myItemDef.pickupModelPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mystery/PickupMystery.prefab").WaitForCompletion(); myItemDef.canRemove = true; myItemDef.hidden = false; ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal; } private static void GlobalEventManager_onCharacterDeathGlobal(DamageReport report) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)report.attacker) || !Object.op_Implicit((Object)(object)report.attackerBody)) { return; } CharacterBody attackerBody = report.attackerBody; if (Object.op_Implicit((Object)(object)attackerBody.inventory)) { int itemCount = attackerBody.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0 && Util.CheckRoll(50f, attackerBody.master)) { attackerBody.AddTimedBuff(Buffs.Cloak, (float)(3 + itemCount)); } } } private static void AddTokens() { ((Object)myItemDef).name = "EXAMPLE_CLOAKONKILL_NAME"; myItemDef.nameToken = "EXAMPLE_CLOAKONKILL_NAME"; myItemDef.pickupToken = "EXAMPLE_CLOAKONKILL_PICKUP"; myItemDef.descriptionToken = "EXAMPLE_CLOAKONKILL_DESC"; myItemDef.loreToken = "EXAMPLE_CLOAKONKILL_LORE"; LanguageAPI.Add("EXAMPLE_CLOAKONKILL_NAME", "Cuthroat's Garb"); LanguageAPI.Add("EXAMPLE_CLOAKONKILL_PICKUP", "chance to cloak on kill."); LanguageAPI.Add("DEVCUBE_DESCRIPTION", "Whenever you <style=cIsDamage>kill an enemy</style>, you have a <style=cIsUtility>50%</style> chance to cloak for <style=cIsUtility>4s</style> <style=cStack>(+1s per stack)</style>."); string text = "Those who visit in the night are either praying for a favour, or preying on a neighbour."; LanguageAPI.Add("DEVCUBE_LORE", text); } } internal class DevCube { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnCharacterDeath <>9__4_0; internal void <Hooks>b__4_0(orig_OnCharacterDeath orig, GlobalEventManager eventManager, DamageReport damageReport) { orig.Invoke(eventManager, damageReport); if (!Object.op_Implicit((Object)(object)damageReport.attacker) || !Object.op_Implicit((Object)(object)damageReport.attackerBody)) { return; } CharacterBody attackerBody = damageReport.attackerBody; if (Object.op_Implicit((Object)(object)attackerBody.inventory)) { int itemCount = attackerBody.inventory.GetItemCount(itemDef); if (itemCount > 0) { List<BuffDef> list = new List<BuffDef> { Buffs.ArmorBoost, Buffs.AttackSpeedOnCrit, Buffs.BanditSkull, Buffs.AffixHauntedRecipient, Buffs.Cloak, Buffs.CloakSpeed, Buffs.ImmuneToDebuffReady, Buffs.ElementalRingsReady, Buffs.ElephantArmorBoost, Buffs.Energized, Buffs.FullCrit, Buffs.Immune, Buffs.HiddenInvincibility, Buffs.KillMoveSpeed, Buffs.LifeSteal, Buffs.MedkitHeal, Buffs.NoCooldowns, Buffs.OutOfCombatArmorBuff, Buffs.PowerBuff, Buffs.CrocoRegen, Buffs.LaserTurbineKillCharge, Buffs.BearVoidReady, Buffs.PrimarySkillShurikenBuff, Buffs.ElementalRingVoidReady, Buffs.SmallArmorBoost, Buffs.TeamWarCry, Buffs.TeslaField, Buffs.TonicBuff, Buffs.VoidSurvivorCorruptMode, Buffs.WarCryBuff, Buffs.Warbanner, Buffs.MushroomVoidActive, Buffs.WhipBoost, Buffs.AffixRed, Buffs.AffixHaunted, Buffs.AffixWhite, Buffs.AffixPoison, Buffs.EliteEarth, Buffs.AffixBlue, Buffs.AffixLunar, Buffs.EliteVoid }; Log.Debug("Enemy killed with Dev Cube in attacker's inventory. BuffList initialized. Conditions met, calculating buff..."); int index = random.Next(list.Count); Log.Debug("Applying " + ((Object)list[index]).name + " to attacker."); attackerBody.AddTimedBuff(list[index], (float)(3 + itemCount)); } } } } public static ItemDef itemDef; private static Random random = new Random(); internal static void Init() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown GenerateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(itemDef, val)); Hooks(); } private static void GenerateItem() { itemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)itemDef).name = "DEVCUBE"; itemDef.nameToken = "DEVCUBE_NAME"; itemDef.pickupToken = "DEVCUBE_PICKUP"; itemDef.descriptionToken = "DEVCUBE_DESCRIPTION"; itemDef.loreToken = "DEVCUBE_LORE"; itemDef.tier = (ItemTier)0; itemDef.pickupIconSprite = AssetUtil.LoadSprite("DevCube.png"); itemDef.pickupModelPrefab = AssetUtil.LoadModel("DevCube.prefab"); itemDef.canRemove = true; itemDef.hidden = false; ItemDef obj = itemDef; ItemTag[] array = new ItemTag[3]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); obj.tags = (ItemTag[])(object)array; } 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__4_0; if (obj == null) { hook_OnCharacterDeath val = delegate(orig_OnCharacterDeath orig, GlobalEventManager eventManager, DamageReport damageReport) { orig.Invoke(eventManager, damageReport); if (Object.op_Implicit((Object)(object)damageReport.attacker) && Object.op_Implicit((Object)(object)damageReport.attackerBody)) { CharacterBody attackerBody = damageReport.attackerBody; if (Object.op_Implicit((Object)(object)attackerBody.inventory)) { int itemCount = attackerBody.inventory.GetItemCount(itemDef); if (itemCount > 0) { List<BuffDef> list = new List<BuffDef> { Buffs.ArmorBoost, Buffs.AttackSpeedOnCrit, Buffs.BanditSkull, Buffs.AffixHauntedRecipient, Buffs.Cloak, Buffs.CloakSpeed, Buffs.ImmuneToDebuffReady, Buffs.ElementalRingsReady, Buffs.ElephantArmorBoost, Buffs.Energized, Buffs.FullCrit, Buffs.Immune, Buffs.HiddenInvincibility, Buffs.KillMoveSpeed, Buffs.LifeSteal, Buffs.MedkitHeal, Buffs.NoCooldowns, Buffs.OutOfCombatArmorBuff, Buffs.PowerBuff, Buffs.CrocoRegen, Buffs.LaserTurbineKillCharge, Buffs.BearVoidReady, Buffs.PrimarySkillShurikenBuff, Buffs.ElementalRingVoidReady, Buffs.SmallArmorBoost, Buffs.TeamWarCry, Buffs.TeslaField, Buffs.TonicBuff, Buffs.VoidSurvivorCorruptMode, Buffs.WarCryBuff, Buffs.Warbanner, Buffs.MushroomVoidActive, Buffs.WhipBoost, Buffs.AffixRed, Buffs.AffixHaunted, Buffs.AffixWhite, Buffs.AffixPoison, Buffs.EliteEarth, Buffs.AffixBlue, Buffs.AffixLunar, Buffs.EliteVoid }; Log.Debug("Enemy killed with Dev Cube in attacker's inventory. BuffList initialized. Conditions met, calculating buff..."); int index = random.Next(list.Count); Log.Debug("Applying " + ((Object)list[index]).name + " to attacker."); attackerBody.AddTimedBuff(list[index], (float)(3 + itemCount)); } } } }; <>c.<>9__4_0 = val; obj = (object)val; } GlobalEventManager.OnCharacterDeath += (hook_OnCharacterDeath)obj; } private static void AddTokens() { LanguageAPI.Add("DEVCUBE", "Dev Cube"); LanguageAPI.Add("DEVCUBE_NAME", "Dev Cube"); LanguageAPI.Add("DEVCUBE_PICKUP", "Applies a random buff upon killing an enemy."); LanguageAPI.Add("DEVCUBE_DESCRIPTION", "<style=cHumanObjective>On kill</style>, grants the holder a <style=cLunarObjective>random buff </style> for <style=cIsUtility>4</style> <style=cStack>(+1 per stack)</style> seconds."); string text = "This is my first custom item. I'll probably use it for testing purposes. Did you read this lore text?"; LanguageAPI.Add("DEVCUBE_LORE", text); } } internal class PrestigeBauble { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action <>9__6_0; public static Action<Run> <>9__7_0; public static hook_OnHitEnemy <>9__7_1; internal void <GenerateItem>b__6_0() { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)2; } } internal void <Hooks>b__7_0(Run orig) { progressionList = new List<BuffDef> { Buffs.Slow50, Buffs.ClayGoo, Buffs.Slow60, Buffs.Slow80, Buffs.Nullified, Buffs.LunarSecondaryRoot }; Log.Debug("PrestigeBauble's Progession List has been initialized."); } internal void <Hooks>b__7_1(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if (!((Object)(object)component != (Object)null) || !((Object)(object)component2 != (Object)null)) { return; } int itemCount = component.inventory.GetItemCount(itemDef.itemIndex); float num = (float)(basePercent + stackPercent * (itemCount - 1)) * damageInfo.procCoefficient; if (itemCount <= 0 || !Util.CheckRoll(num, component.master)) { return; } if (component2.HasBuff(Buffs.LunarSecondaryRoot)) { float num2 = 0f; List<TimedBuff> timedBuffs = component2.timedBuffs; foreach (TimedBuff item in timedBuffs) { if (item.buffIndex == Buffs.LunarSecondaryRoot.buffIndex) { num2 = item.timer; } } component2.AddTimedBuff(Buffs.LunarSecondaryRoot, 3f + num2); return; } for (int num3 = progressionList.Count - 2; num3 >= 0; num3--) { if (component2.HasBuff(progressionList[num3])) { component2.ClearTimedBuffs(progressionList[num3].buffIndex); if (num3 == progressionList.Count - 2) { component2.AddTimedBuff(progressionList[num3 + 1], 3f); } else { component2.AddTimedBuff(progressionList[num3 + 1], 5f); } return; } } component2.AddTimedBuff(progressionList[0], 5f); } } public static ItemDef itemDef; private static string itemId = "PRESTIGEBAUBLE"; private static int basePercent = 10; private static int stackPercent = 10; private static List<BuffDef> progressionList; internal static void Init() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown GenerateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(itemDef, val)); Hooks(); } private static void GenerateItem() { itemDef = ScriptableObject.CreateInstance<ItemDef>(); itemId = itemId.Replace(" ", "").ToUpper(); ((Object)itemDef).name = itemId; itemDef.nameToken = itemId + "_NAME"; itemDef.pickupToken = itemId + "_PICKUP"; itemDef.descriptionToken = itemId + "_DESCRIPTION"; itemDef.loreToken = itemId + "_LORE"; ((ResourceAvailability)(ref ItemTierCatalog.availability)).CallWhenAvailable((Action)delegate { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)2; } }); itemDef.pickupIconSprite = AssetUtil.LoadSprite("PrestigeBauble_Alt"); itemDef.pickupModelPrefab = AssetUtil.LoadModel("PrestigeBauble"); itemDef.canRemove = true; itemDef.hidden = false; itemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 }; } 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 Run.onRunStartGlobal += delegate { progressionList = new List<BuffDef> { Buffs.Slow50, Buffs.ClayGoo, Buffs.Slow60, Buffs.Slow80, Buffs.Nullified, Buffs.LunarSecondaryRoot }; Log.Debug("PrestigeBauble's Progession List has been initialized."); }; object obj = <>c.<>9__7_1; if (obj == null) { hook_OnHitEnemy val = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null) { int itemCount = component.inventory.GetItemCount(itemDef.itemIndex); float num = (float)(basePercent + stackPercent * (itemCount - 1)) * damageInfo.procCoefficient; if (itemCount > 0 && Util.CheckRoll(num, component.master)) { if (component2.HasBuff(Buffs.LunarSecondaryRoot)) { float num2 = 0f; List<TimedBuff> timedBuffs = component2.timedBuffs; foreach (TimedBuff item in timedBuffs) { if (item.buffIndex == Buffs.LunarSecondaryRoot.buffIndex) { num2 = item.timer; } } component2.AddTimedBuff(Buffs.LunarSecondaryRoot, 3f + num2); } else { for (int num3 = progressionList.Count - 2; num3 >= 0; num3--) { if (component2.HasBuff(progressionList[num3])) { component2.ClearTimedBuffs(progressionList[num3].buffIndex); if (num3 == progressionList.Count - 2) { component2.AddTimedBuff(progressionList[num3 + 1], 3f); } else { component2.AddTimedBuff(progressionList[num3 + 1], 5f); } return; } } component2.AddTimedBuff(progressionList[0], 5f); } } } }; <>c.<>9__7_1 = val; obj = (object)val; } GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj; } private static void AddTokens() { LanguageAPI.Add(itemId ?? "", "Promobauble"); LanguageAPI.Add(itemId + "_NAME", "Promobauble"); LanguageAPI.Add(itemId + "_PICKUP", "Gain the ability to inflict and promote slowness debuffs on enemies until they are rooted."); LanguageAPI.Add(itemId + "_DESCRIPTION", $"<style=cIsUtility>{basePercent}%</style> <style=cStack>(+{stackPercent}% per stack)</style> chance to <style=cWorldEvent>promote</style> the <style=cIsUtility>current slowing debuff</style> on the enemy to the <style=cIsUtility>next tier of slowness</style>. Inflicts a <style=cIsUtility>low-level slow</style> to enemies who have <style=cIsUtility>no slowness debuffs</style>."); string text = "\"Wait a minute, that just sounds like Tentabauble with extra steps!\" \n\n(That's what you sound like I bet.)"; LanguageAPI.Add(itemId + "_LORE", text); } } internal class PrestigeBleed { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action <>9__3_0; public static hook_OnHitEnemy <>9__4_0; internal void <GenerateItem>b__3_0() { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)1; } } internal void <Hooks>b__4_0(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null) { int itemCount = component.inventory.GetItemCount(itemDef.itemIndex); if (itemCount > 0 && Util.CheckRoll((10f + 5f * (float)(itemCount - 1)) * damageInfo.procCoefficient, component.master)) { float num = (10f + 5f * (float)(itemCount - 1)) * damageInfo.procCoefficient; Log.Debug($"Enemy hit with Prestige Bleed. Player has {itemCount} stacks in inventory with a total chance of {num}%. Playable character used an attack with a proc coefficient of {damageInfo.procCoefficient}"); component2.AddTimedBuff(Buffs.Cripple, 3f); } } } } public static ItemDef itemDef; private static string itemId = "PRESTIGEBLEED"; internal static void Init() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown GenerateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(itemDef, val)); Hooks(); } private static void GenerateItem() { itemDef = ScriptableObject.CreateInstance<ItemDef>(); itemId = itemId.Replace(" ", "").ToUpper(); ((Object)itemDef).name = itemId; itemDef.nameToken = itemId + "_NAME"; itemDef.pickupToken = itemId + "_PICKUP"; itemDef.descriptionToken = itemId + "_DESCRIPTION"; itemDef.loreToken = itemId + "_LORE"; ((ResourceAvailability)(ref ItemTierCatalog.availability)).CallWhenAvailable((Action)delegate { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)1; } }); itemDef.pickupIconSprite = AssetUtil.LoadSprite("PrestigeBleed_Alt.png"); itemDef.pickupModelPrefab = AssetUtil.LoadModel("PrestigeBleed.prefab"); itemDef.canRemove = true; itemDef.hidden = false; itemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 }; } 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__4_0; if (obj == null) { hook_OnHitEnemy val = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null) { int itemCount = component.inventory.GetItemCount(itemDef.itemIndex); if (itemCount > 0 && Util.CheckRoll((10f + 5f * (float)(itemCount - 1)) * damageInfo.procCoefficient, component.master)) { float num = (10f + 5f * (float)(itemCount - 1)) * damageInfo.procCoefficient; Log.Debug($"Enemy hit with Prestige Bleed. Player has {itemCount} stacks in inventory with a total chance of {num}%. Playable character used an attack with a proc coefficient of {damageInfo.procCoefficient}"); component2.AddTimedBuff(Buffs.Cripple, 3f); } } }; <>c.<>9__4_0 = val; obj = (object)val; } GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj; } private static void AddTokens() { LanguageAPI.Add(itemId ?? "", "Refined Shard"); LanguageAPI.Add(itemId + "_NAME", "Refined Shard"); LanguageAPI.Add(itemId + "_PICKUP", "Chance to cripple enemies on hit."); LanguageAPI.Add(itemId + "_DESCRIPTION", "<style=cIsDamage>10%</style> <style=cStack>(+5% per stack)</style> chance to inflict <style=cLunarObjective>cripple</style> on an enemy."); string text = "10 years ago I saw a woman get dragged away by five men and i did nothing to stop it"; LanguageAPI.Add(itemId + "_LORE", text); } } internal class PrestigeFungus { public class PrestigeFungusBehavior : BaseItemBodyBehavior { private float sprintTimer = 1f; [ItemDefAssociation(useOnServer = true, useOnClient = false)] public static ItemDef GetItemDef() { return itemDef; } private void onEnable() { } private void FixedUpdate() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) if (((BaseItemBodyBehavior)this).body.isSprinting) { sprintTimer -= Time.fixedDeltaTime; if (sprintTimer <= 0f && ((BaseItemBodyBehavior)this).body.moveSpeed > 0f) { double num = basePercentGained + percentGainedPerStack * (float)(((BaseItemBodyBehavior)this).body.inventory.GetItemCount(itemDef.itemIndex) - 1); ((BaseItemBodyBehavior)this).body.master.GiveMoney((uint)(int)Math.Ceiling(num * (double)chestPrice)); sprintTimer = 1f; } } } } public static ItemDef itemDef; private static string itemId = "PRESTIGEFUNGUS"; private static int chestPrice = 25; private static float basePercentGained = 0.04f; private static float percentGainedPerStack = 0.02f; internal static void Init() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown GenerateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(itemDef, val)); Hooks(); } private static void GenerateItem() { itemDef = ScriptableObject.CreateInstance<ItemDef>(); itemId = itemId.Replace(" ", "").ToUpper(); ((Object)itemDef).name = itemId; itemDef.nameToken = itemId + "_NAME"; itemDef.pickupToken = itemId + "_PICKUP"; itemDef.descriptionToken = itemId + "_DESCRIPTION"; itemDef.loreToken = itemId + "_LORE"; ((ResourceAvailability)(ref ItemTierCatalog.availability)).CallWhenAvailable((Action)delegate { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)1; } }); itemDef.pickupIconSprite = AssetUtil.LoadSprite("PrestigeFungus_Alt.png"); itemDef.pickupModelPrefab = AssetUtil.LoadModel("PrestigeFungus.prefab"); itemDef.canRemove = true; itemDef.hidden = false; ItemDef obj = itemDef; ItemTag[] array = new ItemTag[3]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); obj.tags = (ItemTag[])(object)array; } public static void Hooks() { Stage.onStageStartGlobal += delegate { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 PurchaseInteraction[] array = Object.FindObjectsOfType<PurchaseInteraction>(); PurchaseInteraction[] array2 = array; foreach (PurchaseInteraction val in array2) { if (((Object)val).name.Contains("Chest1") && (int)val.costType == 1) { chestPrice = val.cost; Log.Debug($"Found chest price at {chestPrice}"); break; } } }; } private static void AddTokens() { LanguageAPI.Add(itemId ?? "", "Charting Fungus"); LanguageAPI.Add(itemId + "_NAME", "Charting Fungus"); LanguageAPI.Add(itemId + "_PICKUP", "Gain gold while sprinting."); LanguageAPI.Add(itemId + "_DESCRIPTION", $"<style=cIsUtility>Gain {basePercentGained * 100f}%</style> <style=cStack>(+{percentGainedPerStack * 100f}% per stack)</style> of the price of a <style=cHumanObjective>small chest in gold</style> every second <style=cIsUtility>while sprinting.</style>"); string text = "Hello :D \n\n I like money :D"; LanguageAPI.Add(itemId + "_LORE", text); } } internal class PrestigeSymbiote { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action <>9__4_0; public static StatHookEventHandler <>9__5_0; public static hook_OnInventoryChanged <>9__5_1; internal void <GenerateItem>b__4_0() { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)3; } } internal void <Hooks>b__5_0(CharacterBody sender, StatHookEventArgs args) { if ((Object)(object)sender == (Object)null || (Object)(object)sender.inventory == (Object)null) { return; } int itemCount = sender.inventory.GetItemCount(itemDef); if (itemCount > 0) { args.healthMultAdd -= 0.5f; args.baseShieldAdd += sender.maxHealth; if (sender.healthComponent.shield > 0f) { args.healthMultAdd += (float)itemCount * commonScaling; args.regenMultAdd += (float)itemCount * commonScaling; args.moveSpeedMultAdd += (float)itemCount * commonScaling; args.damageMultAdd += (float)itemCount * commonScaling; args.attackSpeedMultAdd += (float)itemCount * commonScaling; args.critAdd += (float)itemCount * (commonScaling * 100f); args.armorAdd += (float)itemCount * (commonScaling * 100f); } } } internal void <Hooks>b__5_1(orig_OnInventoryChanged orig, CharacterBody body) { orig.Invoke(body); if (body.inventory.GetItemCount(itemDef) == 1) { float num = body.maxHealth / 2f; body.maxHealth -= num; body.maxShield += num; if (body.healthComponent.health > body.maxHealth) { body.healthComponent.health = body.maxHealth; } if (body.healthComponent.shield > body.maxShield) { body.healthComponent.shield = body.maxShield; } } body.RecalculateStats(); } } public static ItemDef itemDef; private static string itemId = "PRESTIGESYMBIOTE"; private static readonly float commonScaling = 0.1f; internal static void Init() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown GenerateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(itemDef, val)); Hooks(); } private static void GenerateItem() { itemDef = ScriptableObject.CreateInstance<ItemDef>(); itemId = itemId.Replace(" ", "").ToUpper(); ((Object)itemDef).name = itemId; itemDef.nameToken = itemId + "_NAME"; itemDef.pickupToken = itemId + "_PICKUP"; itemDef.descriptionToken = itemId + "_DESCRIPTION"; itemDef.loreToken = itemId + "_LORE"; ((ResourceAvailability)(ref ItemTierCatalog.availability)).CallWhenAvailable((Action)delegate { if (Object.op_Implicit((Object)(object)itemDef)) { itemDef.tier = (ItemTier)3; } }); itemDef.pickupIconSprite = AssetUtil.LoadSprite("PrestigeSymbiote_Alt.png"); itemDef.pickupModelPrefab = AssetUtil.LoadModel("PrestigeSymbioteClean.prefab"); itemDef.canRemove = true; itemDef.hidden = false; ItemDef obj = itemDef; ItemTag[] array = new ItemTag[3]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); obj.tags = (ItemTag[])(object)array; } 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 //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__5_0; if (obj == null) { StatHookEventHandler val = delegate(CharacterBody sender, StatHookEventArgs args) { if (!((Object)(object)sender == (Object)null) && !((Object)(object)sender.inventory == (Object)null)) { int itemCount = sender.inventory.GetItemCount(itemDef); if (itemCount > 0) { args.healthMultAdd -= 0.5f; args.baseShieldAdd += sender.maxHealth; if (sender.healthComponent.shield > 0f) { args.healthMultAdd += (float)itemCount * commonScaling; args.regenMultAdd += (float)itemCount * commonScaling; args.moveSpeedMultAdd += (float)itemCount * commonScaling; args.damageMultAdd += (float)itemCount * commonScaling; args.attackSpeedMultAdd += (float)itemCount * commonScaling; args.critAdd += (float)itemCount * (commonScaling * 100f); args.armorAdd += (float)itemCount * (commonScaling * 100f); } } } }; <>c.<>9__5_0 = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; object obj2 = <>c.<>9__5_1; if (obj2 == null) { hook_OnInventoryChanged val2 = delegate(orig_OnInventoryChanged orig, CharacterBody body) { orig.Invoke(body); if (body.inventory.GetItemCount(itemDef) == 1) { float num = body.maxHealth / 2f; body.maxHealth -= num; body.maxShield += num; if (body.healthComponent.health > body.maxHealth) { body.healthComponent.health = body.maxHealth; } if (body.healthComponent.shield > body.maxShield) { body.healthComponent.shield = body.maxShield; } } body.RecalculateStats(); }; <>c.<>9__5_1 = val2; obj2 = (object)val2; } CharacterBody.OnInventoryChanged += (hook_OnInventoryChanged)obj2; } private static void AddTokens() { LanguageAPI.Add(itemId ?? "", "Parasitic Symbiosis"); LanguageAPI.Add(itemId + "_NAME", "Parasitic Symbiosis"); LanguageAPI.Add(itemId + "_PICKUP", "Half your health is shield, but ALL of your stats are buffed while your shields are up."); LanguageAPI.Add(itemId + "_DESCRIPTION", "<style=cIsHealing>Convert half your health</style> to <style=cIsHealing>regenerating shields</style>. " + $"<style=cIsUtility>ALL stats</style> are buffed by <style=cIsUtility>{commonScaling * 100f}%</style> " + $"<style=cStack>(+{commonScaling * 100f}% per stack)</style> while you have a <style=cIsHealing>shield active</style>."); string text = "Two bugs, sitting in a yin-yang, five feet apart because they are in perfect harmony <3"; LanguageAPI.Add(itemId + "_LORE", text); } } }