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 ConsumedBuff v1.4.0
plugins/ConsumedBuff.dll
Decompiled 5 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using ConsumedBuff.Components; using ConsumedBuff.ItemChanges; using ConsumedBuff.Modules; using HG; using On.RoR2; using R2API; using RoR2; using RoR2.ContentManagement; using RoR2.Items; using RoR2.Projectile; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")] [assembly: AssemblyCompany("ConsumedBuff")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ConsumedBuff")] [assembly: AssemblyTitle("ConsumedBuff")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] namespace ConsumedBuff { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.kking117.ConsumedBuff", "ConsumedBuff", "1.4.0")] public class MainPlugin : BaseUnityPlugin { public const string MODUID = "com.kking117.ConsumedBuff"; public const string MODNAME = "ConsumedBuff"; public const string MODVERSION = "1.4.0"; public const string MODTOKEN = "KKING117_CONSUMEDBUFF_"; private const string Section_Elixir = "Empty Bottle"; private const string Section_Watch = "Delicate Watch (Broken)"; private const string Section_VoidDio = "Pluripotent Larva (Consumed)"; private const string Section_Dio = "Dios Best Friend (Consumed)"; public static bool VoidDio_Enable = false; public static float VoidDio_BlockCooldown = 0.9f; public static float VoidDio_CollapseChance = 100f; public static float VoidDio_CollapseDamage = 4f; public static bool VoidDio_CollapseUseTotal = false; public static bool VoidDio_Corrupt = true; public static float VoidDio_Curse = 0.1f; public static bool Dio_Enable = false; public static float Dio_BlockChance = 15f; public static bool Elixir_Enable = false; public static float Elixir_Buff = 2.5f; public static float Elixir_Regen = 1f; public static bool Watch_Enable = false; public static bool Watch_Indicator = true; public static float Watch_Damage = 0.2f; public static int Watch_HitsToProc = 12; public static int Watch_ProcsToDouble = 12; public static float Watch_SlowBase = 1f; public static float Watch_SlowStack = 0.25f; public static bool Watch_VFX = true; private void Awake() { ReadConfig(); if (Elixir_Enable) { EmptyBottle.Enable(); } if (VoidDio_Enable) { PluripotentLarvaConsumed.Enable(); } if (Watch_Enable) { DelicateWatchBroken.Enable(); } if (Dio_Enable) { DiosBestFriendConsumed.Enable(); } new ContentPacks().Initialize(); } private void ReadConfig() { Elixir_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Empty Bottle", "Enable Changes", false, "Allows this mod to make changes to the Empty Bottle item.").Value; Elixir_Buff = ((BaseUnityPlugin)this).Config.Bind<float>("Empty Bottle", "Regen Buff Duration", 2.5f, "Duration of the regen buff when the Power Elixir item is consumed.").Value; Elixir_Regen = ((BaseUnityPlugin)this).Config.Bind<float>("Empty Bottle", "Passive Regen", 1f, "passive regen per stack this item gives.").Value; Watch_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Delicate Watch (Broken)", "Enable Changes", false, "Allows this mod to make changes to the Delicate Watch (Broken) item.").Value; Watch_Indicator = ((BaseUnityPlugin)this).Config.Bind<bool>("Delicate Watch (Broken)", "Buff Indicator", true, "Enables a buff to help track how many hits the item needs.").Value; Watch_HitsToProc = ((BaseUnityPlugin)this).Config.Bind<int>("Delicate Watch (Broken)", "Hit To Proc", 12, "On this number hit, proc its effect.").Value; Watch_ProcsToDouble = ((BaseUnityPlugin)this).Config.Bind<int>("Delicate Watch (Broken)", "Proc to Double Proc", 12, "On this number proc, double the proc effect. (1 or less disables this)").Value; Watch_Damage = ((BaseUnityPlugin)this).Config.Bind<float>("Delicate Watch (Broken)", "Damage On Proc", 0.2f, "Damage bonus on procs.").Value; Watch_SlowBase = ((BaseUnityPlugin)this).Config.Bind<float>("Delicate Watch (Broken)", "Base Slow On Proc", 1f, "Base duration of the slow effect that this applies on proc.").Value; Watch_SlowStack = ((BaseUnityPlugin)this).Config.Bind<float>("Delicate Watch (Broken)", "Stack Slow On Proc", 0.25f, "Stack duration of the slow effect.").Value; Watch_VFX = ((BaseUnityPlugin)this).Config.Bind<bool>("Delicate Watch (Broken)", "Play Proc VFX", true, "Play a VFX on the target when proccing the item?").Value; VoidDio_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Pluripotent Larva (Consumed)", "Enable Changes", false, "Allows this mod to make changes to the Pluripotent Larva (Consumed) item.").Value; VoidDio_BlockCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Pluripotent Larva (Consumed)", "Block Cooldown", 0.9f, "How much to multiply the block cooldown per stack. (Higher than 1 disables this)").Value; VoidDio_CollapseChance = ((BaseUnityPlugin)this).Config.Bind<float>("Pluripotent Larva (Consumed)", "Collapse Chance", 10f, "The chance to apply Collapse per stack.").Value; VoidDio_CollapseDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Pluripotent Larva (Consumed)", "Collapse Damage", 4f, "How much damage each Collapse stack does.").Value; VoidDio_CollapseUseTotal = ((BaseUnityPlugin)this).Config.Bind<bool>("Pluripotent Larva (Consumed)", "Collapse Total Damage", false, "Should the Collapse stack deal total damage instead of base damage?").Value; VoidDio_Corrupt = ((BaseUnityPlugin)this).Config.Bind<bool>("Pluripotent Larva (Consumed)", "Corrupted Life", true, "Automatically corrupt new items and be classed as void while carrying this item?").Value; VoidDio_Curse = ((BaseUnityPlugin)this).Config.Bind<float>("Pluripotent Larva (Consumed)", "Health Curse", 0.1f, "Health curse per stack.").Value; Dio_Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Dios Best Friend (Consumed)", "Enable", false, "Allows this mod to make changes to the Dios Best Friend (Consumed) item.").Value; Dio_BlockChance = ((BaseUnityPlugin)this).Config.Bind<float>("Dios Best Friend (Consumed)", "Block Chance", 15f, "The chance per stack to block damage.").Value; } } } namespace ConsumedBuff.Modules { public static class Buffs { internal static List<BuffDef> buffDefs = new List<BuffDef>(); internal static BuffDef AddNewBuff(string buffName, Sprite buffIcon, Color buffColor, bool canStack, bool isDebuff, bool isCooldown, bool ignoreNectar = false) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) BuffDef val = ScriptableObject.CreateInstance<BuffDef>(); ((Object)val).name = buffName; val.buffColor = buffColor; val.canStack = canStack; val.isDebuff = isDebuff; val.eliteDef = null; val.iconSprite = buffIcon; val.ignoreGrowthNectar = ignoreNectar; val.isCooldown = isCooldown; ((Object)val).name = ((Object)val).name; buffDefs.Add(val); return val; } } internal class ContentPacks : IContentPackProvider { internal ContentPack contentPack = new ContentPack(); public string identifier => "com.kking117.ConsumedBuff"; public void Initialize() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(ContentManager_collectContentPackProviders); } private void ContentManager_collectContentPackProviders(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)this); } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { contentPack.identifier = identifier; contentPack.buffDefs.Add(Buffs.buffDefs.ToArray()); args.ReportProgress(1f); yield break; } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(contentPack, args.output); args.ReportProgress(1f); yield break; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } } } namespace ConsumedBuff.ItemChanges { public class DelicateWatchBroken { private static bool canDouble = true; public static BuffDef TrackerBuff; public static BuffDef TrackerDoubleBuff; private static Color buffColor = new Color(0.678f, 0.611f, 0.411f, 1f); private static Color buff2Color = new Color(0.96f, 0.623f, 0.282f, 1f); public static void Enable() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown MainPlugin.Watch_HitsToProc = Math.Max(1, MainPlugin.Watch_HitsToProc); if (MainPlugin.Watch_ProcsToDouble < 2) { canDouble = false; } HealthComponent.TakeDamageProcess += new hook_TakeDamageProcess(OnTakeDamage); if (MainPlugin.Watch_Indicator) { CreateBuff(); } UpdateText(); } private static void CreateBuff() { //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_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) Sprite iconSprite = Addressables.LoadAssetAsync<BuffDef>((object)"291df3bb6aed0cd44af68779095c1398").WaitForCompletion().iconSprite; TrackerBuff = Buffs.AddNewBuff("BrokenWatchCounter", iconSprite, buffColor, canStack: true, isDebuff: false, isCooldown: true); if (canDouble) { TrackerDoubleBuff = Buffs.AddNewBuff("BrokenWatchDoubleCounter", iconSprite, buff2Color, canStack: true, isDebuff: false, isCooldown: true, ignoreNectar: true); } } private static string GetNthString(int number) { string result = $"{MainPlugin.Watch_HitsToProc}th hit"; if (number < 0) { number *= -1; } int num = number % 100; if (num < 11 || num > 19) { number %= 10; switch (number) { case 1: result = "hit"; break; case 2: result = $"{MainPlugin.Watch_HitsToProc}nd hit"; break; case 3: result = $"{MainPlugin.Watch_HitsToProc}rd hit"; break; } } return result; } private static void UpdateText() { string text = string.Format(""); string text2 = string.Format(""); bool flag = false; text = $"Every {GetNthString(MainPlugin.Watch_HitsToProc)}"; text2 = $"Every <style=cIsDamage>{GetNthString(MainPlugin.Watch_HitsToProc)}</style>"; if (MainPlugin.Watch_Damage > 0f) { text += $" deals bonus damage"; text2 += string.Format(" deals <style=cIsDamage>{0}%</style> <style=cStack>(+{0}% per stack)</style> extra damage", MainPlugin.Watch_Damage * 100f); flag = true; } if (MainPlugin.Watch_SlowBase > 0f || MainPlugin.Watch_SlowStack > 0f) { if (flag) { text += $" and"; text2 += $" and"; } text += $" slows"; text2 += $" applies <style=cIsUtility>slow</style> for <style=cIsUtility>-60% movement speed</style> for <style=cIsUtility>{MainPlugin.Watch_SlowBase}s</style> <style=cStack>(+{MainPlugin.Watch_SlowStack}s per stack)</style>"; } text += $"."; text2 += $"."; LanguageAPI.Add("ITEM_FRAGILEDAMAGEBONUSCONSUMED_PICKUP", text); LanguageAPI.Add("ITEM_FRAGILEDAMAGEBONUSCONSUMED_DESC", text2); LanguageAPI.Add("ITEM_FRAGILEDAMAGEBONUSCONSUMED_PICKUP", text, "en"); LanguageAPI.Add("ITEM_FRAGILEDAMAGEBONUSCONSUMED_DESC", text2, "en"); } private static void OnTakeDamage(orig_TakeDamageProcess orig, HealthComponent self, DamageInfo damageInfo) { //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown if (NetworkServer.active && self.alive && !self.godMode && !damageInfo.rejected && self.ospTimer <= 0f && Object.op_Implicit((Object)(object)self.body) && Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.inventory)) { int itemCountEffective = component.inventory.GetItemCountEffective(Items.FragileDamageBonusConsumed); if (itemCountEffective > 0) { AddWatchCounter(component); int watchPowerMult = GetWatchPowerMult(component); if (watchPowerMult > 0) { damageInfo.damage *= 1f + (float)itemCountEffective * MainPlugin.Watch_Damage * (float)watchPowerMult; if (MainPlugin.Watch_VFX) { EffectData val = new EffectData { origin = self.body.transform.position }; val.SetNetworkedObjectReference(((Component)self.body).gameObject); EffectManager.SpawnEffect(AssetReferences.fragileDamageBonusBreakEffectPrefab, val, true); } float num = MainPlugin.Watch_SlowBase + (float)Math.Max(0, itemCountEffective - 1) * MainPlugin.Watch_SlowStack * (float)watchPowerMult; if (num > 0f) { self.body.AddTimedBuff(Buffs.Slow60, num); } } } } } orig.Invoke(self, damageInfo); } private static void AddWatchCounter(CharacterBody body) { BrokenWatchCounter brokenWatchCounter = ((Component)body).GetComponent<BrokenWatchCounter>(); if (!Object.op_Implicit((Object)(object)brokenWatchCounter)) { brokenWatchCounter = ((Component)body).gameObject.AddComponent<BrokenWatchCounter>(); } brokenWatchCounter.hits++; if (brokenWatchCounter.hits >= MainPlugin.Watch_HitsToProc) { brokenWatchCounter.hits -= MainPlugin.Watch_HitsToProc; brokenWatchCounter.hitmult = 1; if (canDouble) { brokenWatchCounter.procs++; if (brokenWatchCounter.procs % MainPlugin.Watch_ProcsToDouble == 0) { brokenWatchCounter.procs -= MainPlugin.Watch_ProcsToDouble; brokenWatchCounter.hitmult = 2; } } } else { brokenWatchCounter.hitmult = 0; } UpdateTrackerBuff(body); } private static int PredictWatchBoostMult(CharacterBody body) { BrokenWatchCounter component = ((Component)body).GetComponent<BrokenWatchCounter>(); if (Object.op_Implicit((Object)(object)component)) { int num = component.hits + 1; if (num % MainPlugin.Watch_HitsToProc == 0) { if (canDouble) { int num2 = component.procs + 1; if (num2 % MainPlugin.Watch_ProcsToDouble == 0) { return 2; } } return 1; } } return 0; } private static int GetWatchPowerMult(CharacterBody body) { BrokenWatchCounter component = ((Component)body).GetComponent<BrokenWatchCounter>(); if (Object.op_Implicit((Object)(object)component)) { return component.hitmult; } return 0; } private static void UpdateTrackerBuff(CharacterBody body) { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: 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_00c6: Unknown result type (might be due to invalid IL or missing references) if (!MainPlugin.Watch_Indicator) { return; } int num = 0; int num2 = 0; BrokenWatchCounter component = ((Component)body).GetComponent<BrokenWatchCounter>(); if (Object.op_Implicit((Object)(object)component)) { num = component.hits; num2 = component.procs; } if (canDouble) { while (body.GetBuffCount(TrackerDoubleBuff.buffIndex) > 0) { body.RemoveBuff(TrackerDoubleBuff.buffIndex); } } while (body.GetBuffCount(TrackerBuff.buffIndex) > 0) { body.RemoveBuff(TrackerBuff.buffIndex); } num2++; if (canDouble && num2 % MainPlugin.Watch_ProcsToDouble == 0) { while (body.GetBuffCount(TrackerDoubleBuff.buffIndex) < num) { body.AddBuff(TrackerDoubleBuff.buffIndex); } } else { while (body.GetBuffCount(TrackerBuff.buffIndex) < num) { body.AddBuff(TrackerBuff.buffIndex); } } } } public class DiosBestFriendConsumed { public static void Enable() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown if (MainPlugin.Dio_BlockChance > 0f) { UpdateText(); HealthComponent.TakeDamageProcess += new hook_TakeDamageProcess(OnTakeDamage); } } private static void UpdateText() { string text = ""; string text2 = ""; text = $"Chance to block incoming damage."; text2 = string.Format("<style=cIsHealing>{0}%</style> <style=cStack>(+{0}% per stack)</style> chance to <style=cIsHealing>block</style> incoming damage. <style=cIsUtility>Unaffected by luck</style>.", MainPlugin.Dio_BlockChance); LanguageAPI.Add("ITEM_EXTRALIFECONSUMED_PICKUP", text); LanguageAPI.Add("ITEM_EXTRALIFECONSUMED_DESC", text2); } private static void OnTakeDamage(orig_TakeDamageProcess orig, HealthComponent self, DamageInfo damageInfo) { //IL_004b: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Invalid comparison between Unknown and I4 //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: 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_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_011e: 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) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Expected O, but got Unknown if (NetworkServer.active && self.alive && !self.godMode && !damageInfo.rejected && self.ospTimer <= 0f && (int)DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)64)) <= 0 && Object.op_Implicit((Object)(object)self.body) && Object.op_Implicit((Object)(object)self.body.master)) { Inventory inventory = self.body.inventory; if (Object.op_Implicit((Object)(object)inventory)) { int itemCountEffective = inventory.GetItemCountEffective(Items.ExtraLifeConsumed); if (itemCountEffective > 0 && Util.CheckRoll(Util.ConvertAmplificationPercentageIntoReductionPercentage(MainPlugin.Dio_BlockChance * (float)itemCountEffective), 0f, (CharacterMaster)null)) { EffectData val = new EffectData { origin = damageInfo.position, rotation = Util.QuaternionSafeLookRotation((damageInfo.force != Vector3.zero) ? damageInfo.force : Random.onUnitSphere) }; EffectManager.SpawnEffect(AssetReferences.bearEffectPrefab, val, true); damageInfo.rejected = true; } } } orig.Invoke(self, damageInfo); } } public class EmptyBottle { public static void Enable() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown UpdateText(); if (MainPlugin.Elixir_Regen != 0f) { RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(CalculateStatsHook); } if (MainPlugin.Elixir_Buff > 0f) { CharacterMasterNotificationQueue.PushItemTransformNotification += new hook_PushItemTransformNotification(OnItemAdded); } UpdateText(); } private static void UpdateText() { string text = string.Format(""); string text2 = string.Format(""); if (MainPlugin.Elixir_Regen != 0f) { text = $"Increases health regeneration."; text2 = string.Format("Increases <style=cIsHealing>base health regeneration</style> by <style=cIsHealing>+{0} hp/s</style> <style=cStack>(+{0} per stack)</style>.", MainPlugin.Elixir_Regen); } else { text = $"An empty container from an Elixir you consumed. Does nothing."; text2 = $"A spent item with no remaining power."; } LanguageAPI.Add("ITEM_HEALINGPOTIONCONSUMED_PICKUP", text); LanguageAPI.Add("ITEM_HEALINGPOTIONCONSUMED_DESC", text2); LanguageAPI.Add("ITEM_HEALINGPOTIONCONSUMED_PICKUP", text, "en"); LanguageAPI.Add("ITEM_HEALINGPOTIONCONSUMED_DESC", text2, "en"); } private static void OnItemAdded(orig_PushItemTransformNotification orig, CharacterMaster self, ItemIndex oldItem, ItemIndex newItem, TransformationType transformationType) { //IL_0003: 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_0005: 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_001a: Invalid comparison between Unknown and I4 //IL_0031: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, oldItem, newItem, transformationType); if (NetworkServer.active && (int)transformationType == 0 && Object.op_Implicit((Object)(object)self.GetBody()) && oldItem == Items.HealingPotion.itemIndex && newItem == Items.HealingPotionConsumed.itemIndex) { self.GetBody().AddTimedBuff(Buffs.CrocoRegen, MainPlugin.Elixir_Buff); } } private static void CalculateStatsHook(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.inventory)) { float num = Math.Max(0f, sender.level - 1f); int itemCountEffective = sender.inventory.GetItemCountEffective(Items.HealingPotionConsumed); if (itemCountEffective > 0) { num = MainPlugin.Elixir_Regen * 0.2f * num; args.baseRegenAdd += (float)itemCountEffective * (MainPlugin.Elixir_Regen + num); } } } } public class PluripotentLarvaConsumed { public static void Enable() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown UpdateText(); RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(CalculateStatsHook); if (MainPlugin.VoidDio_Corrupt) { CharacterMaster.OnInventoryChanged += new hook_OnInventoryChanged(OnInventoryChanged); } if (MainPlugin.VoidDio_BlockCooldown <= 1f) { CharacterBody.AddTimedBuff_BuffDef_float += new hook_AddTimedBuff_BuffDef_float(AddTimedBuff); } if (MainPlugin.VoidDio_CollapseChance > 0f) { GlobalEventManager.onServerDamageDealt += OnTakeDamagePost; } } private static void UpdateText() { string text = ""; string text2 = ""; if (MainPlugin.VoidDio_CollapseChance > 0f) { text += $"Chance to collapse enemies on hit."; text2 += string.Format("<style=cIsDamage>{0}%</style> <style=cStack>(+{0}% per stack)</style> chance to <style=cIsDamage>collapse</style> an enemy for <style=cIsDamage>{1}%</style> ", MainPlugin.VoidDio_CollapseChance, MainPlugin.VoidDio_CollapseDamage * 100f); text2 = ((!MainPlugin.VoidDio_CollapseUseTotal) ? (text2 + "base damage.") : (text2 + "TOTAL damage.")); } if (MainPlugin.VoidDio_BlockCooldown <= 1f) { if (text.Length > 0) { text += " "; text2 += " "; } text += $"Block the next source of damage."; text2 += "<style=cIsHealing>Blocks</style> incoming damage once, recharging after <style=cIsUtility>15 "; if (MainPlugin.VoidDio_BlockCooldown < 1f) { text2 += $"<style=cStack>(-{(1f - MainPlugin.VoidDio_BlockCooldown) * 100f}% per stack)</style> "; } text2 += "seconds</style>."; } if (MainPlugin.VoidDio_Curse > 0f) { if (text.Length > 0) { text += " "; text2 += " "; } text += $"Reduced maximum health."; text2 += string.Format("<style=cIsHealth>Reduces maximum health by {0}%</style> <style=cStack>(+{0}% per stack)</style>.", MainPlugin.VoidDio_Curse * 100f); } if (MainPlugin.VoidDio_Corrupt) { if (text.Length > 0) { text += " "; text2 += " "; } text += "<style=cIsVoid>Corrupts ALL items</style>."; text2 += "<style=cIsVoid>Corrupts ALL items</style>."; } LanguageAPI.Add("ITEM_EXTRALIFEVOIDCONSUMED_PICKUP", text); LanguageAPI.Add("ITEM_EXTRALIFEVOIDCONSUMED_DESC", text2); } private static void CalculateStatsHook(CharacterBody sender, StatHookEventArgs args) { if (!Object.op_Implicit((Object)(object)sender) || !Object.op_Implicit((Object)(object)sender.inventory)) { return; } int itemCountEffective = sender.inventory.GetItemCountEffective(Items.ExtraLifeVoidConsumed); if (MainPlugin.VoidDio_Corrupt) { ManageCorruption(sender, itemCountEffective); } if (itemCountEffective > 0) { if (MainPlugin.VoidDio_Curse > 0f) { args.baseCurseAdd += MainPlugin.VoidDio_Curse * (float)itemCountEffective; } if (MainPlugin.VoidDio_BlockCooldown <= 1f && !sender.HasBuff(Buffs.BearVoidCooldown) && !sender.HasBuff(Buffs.BearVoidReady)) { sender.AddBuff(Buffs.BearVoidReady); } } } private static void ManageCorruption(CharacterBody self, int itemCount) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: 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_0038: 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) if (itemCount > 0) { if (!((Enum)self.bodyFlags).HasFlag((Enum)(object)(BodyFlags)1024)) { self.bodyFlags = (BodyFlags)(self.bodyFlags | 0x400); ExtraLifeVoidEffect component = ((Component)self).GetComponent<ExtraLifeVoidEffect>(); if (!Object.op_Implicit((Object)(object)component)) { ((Component)self).gameObject.AddComponent<ExtraLifeVoidEffect>(); } } } else { ExtraLifeVoidEffect component2 = ((Component)self).GetComponent<ExtraLifeVoidEffect>(); if (Object.op_Implicit((Object)(object)component2)) { Object.DestroyImmediate((Object)(object)component2); self.bodyFlags = (BodyFlags)(self.bodyFlags & -1025); } } } private static void AddTimedBuff(orig_AddTimedBuff_BuffDef_float orig, CharacterBody self, BuffDef buffDef, float duration) { if (NetworkServer.active && Object.op_Implicit((Object)(object)self.inventory) && (Object)(object)buffDef == (Object)(object)Buffs.BearVoidCooldown) { int itemCountEffective = self.inventory.GetItemCountEffective(Items.ExtraLifeVoidConsumed); if (itemCountEffective > 0) { duration *= Mathf.Pow(MainPlugin.VoidDio_BlockCooldown, (float)itemCountEffective); } } orig.Invoke(self, buffDef, duration); } private static void OnTakeDamagePost(DamageReport dr) { if (!NetworkServer.active || dr.damageInfo.rejected || dr.damageInfo.procCoefficient <= 0f || !Object.op_Implicit((Object)(object)dr.attacker)) { return; } uint? num = null; if (Object.op_Implicit((Object)(object)dr.damageInfo.inflictor)) { ProjectileDamage component = dr.damageInfo.inflictor.GetComponent<ProjectileDamage>(); if (Object.op_Implicit((Object)(object)component) && component.useDotMaxStacksFromAttacker) { num = component.dotMaxStacksFromAttacker; } } CharacterBody attackerBody = dr.attackerBody; CharacterBody victimBody = dr.victimBody; if (!Object.op_Implicit((Object)(object)attackerBody)) { return; } CharacterMaster master = attackerBody.master; if (!Object.op_Implicit((Object)(object)master) || !Object.op_Implicit((Object)(object)master.inventory)) { return; } Inventory inventory = master.inventory; int itemCountEffective = inventory.GetItemCountEffective(Items.ExtraLifeVoidConsumed); if (itemCountEffective > 0 && Util.CheckRoll(dr.damageInfo.procCoefficient * (float)itemCountEffective * MainPlugin.VoidDio_CollapseChance, master)) { DotDef dotDef = DotController.GetDotDef((DotIndex)8); float num2 = 0f; num2 = ((!MainPlugin.VoidDio_CollapseUseTotal) ? (MainPlugin.VoidDio_CollapseDamage / dotDef.damageCoefficient) : (MainPlugin.VoidDio_CollapseDamage * dr.damageDealt / dotDef.damageCoefficient / attackerBody.damage)); if (num2 > 0f) { DotController.InflictDot(((Component)victimBody).gameObject, ((Component)attackerBody).gameObject, dr.damageInfo.inflictedHurtbox, (DotIndex)8, dotDef.interval, num2, num); } } } private static void OnInventoryChanged(orig_OnInventoryChanged orig, CharacterMaster self) { orig.Invoke(self); int itemCountEffective = self.inventory.GetItemCountEffective(Items.ExtraLifeVoidConsumed); if (itemCountEffective > 0) { CorruptAllItems(self.inventory); } } private static void CorruptAllItems(Inventory inventory) { //IL_0007: 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_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_0019: 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) Enumerator<TransformationInfo> enumerator = ContagiousItemManager.transformationInfos.GetEnumerator(); try { while (enumerator.MoveNext()) { TransformationInfo current = enumerator.Current; ContagiousItemManager.TryForceReplacement(inventory, current.originalItem); } } finally { ((IDisposable)enumerator).Dispose(); } } } } namespace ConsumedBuff.Components { public class BrokenWatchCounter : MonoBehaviour { public int hits = 0; public int procs = 0; public int hitmult = 0; } public class ExtraLifeVoidEffect : MonoBehaviour { } }