Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Prestige Items Beta v0.2.0
plugins/PrestigeItems/PrestigeItems.dll
Decompiled a year 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); } } }