Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of TFTItems v1.1.2
BepInEx/plugins/Phorg.TFTItems/ExamplePlugin.dll
Decompiled 3 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using On.RoR2; using R2API; using RoR2; 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 = ".NET Standard 2.1")] [assembly: AssemblyCompany("ExamplePlugin")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+55d03d1a44b7027c98ea24af5ab2afc50c10b02a")] [assembly: AssemblyProduct("ExamplePlugin")] [assembly: AssemblyTitle("ExamplePlugin")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ExamplePlugin { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Phorg.TFTItems", "TFTItems", "1.1.2")] public class ExamplePlugin : BaseUnityPlugin { public static class AssetLoader { private static string pluginDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); private static string bundlePath = Path.Combine(pluginDir, "AssetBundles", "prefabs"); private static AssetBundle bundle = AssetBundle.LoadFromFile(bundlePath); public static GameObject LoadAsset(string assetName) { if ((Object)(object)bundle == (Object)null) { Debug.LogError((object)("Failed to load bundle at " + bundlePath)); } return bundle.LoadAsset<GameObject>(assetName); } public static void ListAllAssets() { string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string text in allAssetNames) { Chat.AddMessage("Bundle contains asset: " + text); } } } public const string PluginGUID = "Phorg.TFTItems"; public const string PluginAuthor = "Phorg"; public const string PluginName = "TFTItems"; public const string PluginVersion = "1.1.2"; public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); TempVFX.Load(); PulseHitVFXListener.Init(); AllyArmor.Define(); AllyArmor.Hooks(); FlickerBlade.Define(); FlickerBlade.Hooks(); HorizonFocus.Define(); HorizonFocus.Hooks(); UnendingDespair.Define(); UnendingDespair.Hooks(); SoulLink.Define(); SoulLink.Hooks(); RegisterLanguage(); } private void Update() { } private static void RegisterLanguage() { LanguageAPI.Add("FLICKERBLADE_NAME", "Flicker Blade"); LanguageAPI.Add("FLICKERBLADE_PICKUP", "Primary hits grant stacking attack-speed."); LanguageAPI.Add("FLICKERBLADE_DESC", "Hits with your <style=cIsUtility>Primary skill</style> grant a stacking buff that increases <style=cIsDamage>Attack Speed by 5% (+1% per stack)</style> for <style=cIsUtility>0.5s (+0.5s per stack)</style>. Duration refreshes on each hit."); LanguageAPI.Add("FLICKERBLADE_LORE", "“The blade is faster than thought…”"); LanguageAPI.Add("LOCKET_OF_THE_IRON_SOLARI_NAME", "Locket of the Iron Solari"); LanguageAPI.Add("LOCKET_OF_THE_IRON_SOLARI_PICKUP", "Allies gain armour from your presence."); LanguageAPI.Add("LOCKET_OF_THE_IRON_SOLARI_DESC", "<style=cIsHealing>Increase armor</style> for minions by <style=cIsHealing>10</style> (+10 per stack)."); LanguageAPI.Add("LOCKET_OF_THE_IRON_SOLARI_LORE", "The sun’s protection, entrusted to you."); LanguageAPI.Add("UNENDING_DESPAIR_NAME", "Unending Despair"); LanguageAPI.Add("UNENDING_DESPAIR_PICKUP", "Gain barrier out-of-combat. Lost barrier erupts in damaging pulses."); LanguageAPI.Add("UNENDING_DESPAIR_DESC", "Out-of-combat, regenerate a <style=cIsHealing>temporary barrier</style> for <style=cIsHealing>10%</style> max health.Losing more than <style=cIsHealing>10%</style> max health in barrier, will emit a pulse dealing <style=cIsDamage>250% of the lost amount</style> (+150% per stack). "); LanguageAPI.Add("UNENDING_DESPAIR_LORE", "Hope is a candle; despair the wind."); LanguageAPI.Add("HORIZON_FOCUS_NAME", "Horizon Focus"); LanguageAPI.Add("HORIZON_FOCUS_PICKUP", "Stunned enemies lose a portion of their health."); LanguageAPI.Add("HORIZON_FOCUS_DESC", "When you <style=cIsDamage>stun or shock</style> an enemy, deal <style=cIsDamage>20%</style> of their current health (+5% per stack) as additional damage."); LanguageAPI.Add("HORIZON_FOCUS_LORE", "The world narrows to a single point…"); LanguageAPI.Add("KNIGHTS_VOW_NAME", "Knight’s Vow"); LanguageAPI.Add("KNIGHTS_VOW_PICKUP", "Bond to an ally; redirect damage and share healing."); LanguageAPI.Add("KNIGHTS_VOW_DESC", "Bond to an ally; redirect \n- If the ally is a <style=cIsUtility>Player</style>: Redirect <style=cIsHealing>20%</style> of their post-mitigated damage to you. When they deal damage, heal you for 15% of damage dealt.\n- If the ally is a <style=cIsUtility>Minion</style>: Redirect <style=cIsHealing>20%</style> of your post-mitigated damage to the minion. When you deal damage, heal the minion for 15% of damage dealt."); LanguageAPI.Add("KNIGHTS_VOW_LORE", "A pledge to stand between harm and those who cannot stand alone."); } public static Sprite LoadSpriteFromFile(string fileName) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(directoryName, "icons", fileName); if (!File.Exists(text)) { Debug.LogError((object)(fileName + " Icon not found at path: " + text)); return null; } byte[] array = File.ReadAllBytes(text); Texture2D val = new Texture2D(2, 2, (TextureFormat)5, false); if (!ImageConversion.LoadImage(val, array)) { Debug.LogError((object)(fileName + " Failed to load image data.")); return null; } return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } } internal static class FlickerBlade { [CompilerGenerated] private static class <>O { public static hook_ProcessHitEnemy <0>__AddAttackSpeedBuff; public static StatHookEventHandler <1>__ApplyRageBuff; } internal static ItemDef ItemDef; internal static BuffDef RageBuff; internal static void Define() { //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Expected O, but got Unknown RageBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)RageBuff).name = "RAGEBLADE_STACK"; RageBuff.iconSprite = ExamplePlugin.LoadSpriteFromFile("FlickerBladeBuff.png"); RageBuff.canStack = true; RageBuff.isDebuff = false; RageBuff.isCooldown = false; RageBuff.isHidden = false; ContentAddition.AddBuffDef(RageBuff); ItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)ItemDef).name = "FLICKERBLADE_NAME"; ItemDef.nameToken = "FLICKERBLADE_NAME"; ItemDef.pickupToken = "FLICKERBLADE_PICKUP"; ItemDef.descriptionToken = "FLICKERBLADE_DESC"; ItemDef.loreToken = "FLICKERBLADE_LORE"; ItemDef.tier = (ItemTier)2; ItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier3Def.asset").WaitForCompletion(); ItemDef.pickupIconSprite = ExamplePlugin.LoadSpriteFromFile("FlickerBlade.png"); ItemDef.canRemove = true; ItemDef.hidden = false; GameObject pickupModelPrefab = ExamplePlugin.AssetLoader.LoadAsset("flickerBladeItem"); ItemDef.pickupModelPrefab = pickupModelPrefab; ItemAPI.Add(new CustomItem(ItemDef, new ItemDisplayRuleDict((ItemDisplayRule[])null))); } internal static void Hooks() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown object obj = <>O.<0>__AddAttackSpeedBuff; if (obj == null) { hook_ProcessHitEnemy val = AddAttackSpeedBuff; <>O.<0>__AddAttackSpeedBuff = val; obj = (object)val; } GlobalEventManager.ProcessHitEnemy += (hook_ProcessHitEnemy)obj; object obj2 = <>O.<1>__ApplyRageBuff; if (obj2 == null) { StatHookEventHandler val2 = ApplyRageBuff; <>O.<1>__ApplyRageBuff = val2; obj2 = (object)val2; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj2; } private static void AddAttackSpeedBuff(orig_ProcessHitEnemy orig, GlobalEventManager self, DamageInfo di, GameObject victim) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, di, victim); CharacterBody val = (Object.op_Implicit((Object)(object)di.attacker) ? di.attacker.GetComponent<CharacterBody>() : null); if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val.inventory)) { return; } bool flag = ((Enum)di.damageType.damageSource).HasFlag((Enum)(object)(DamageSource)1); int itemCount = val.inventory.GetItemCount(ItemDef.itemIndex); if (flag && itemCount != 0) { float num = 0.5f + 0.5f * (float)itemCount; int buffCount = val.GetBuffCount(RageBuff); val.ClearTimedBuffs(RageBuff); for (int i = 0; i <= buffCount; i++) { val.AddTimedBuff(RageBuff, num); } } } private static void ApplyRageBuff(CharacterBody body, StatHookEventArgs args) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) int buffCount = body.GetBuffCount(RageBuff); if (buffCount != 0) { int num = (Object.op_Implicit((Object)(object)body.inventory) ? body.inventory.GetItemCount(ItemDef.itemIndex) : 0); float num2 = 0.05f + 0.01f * (float)(num - 1); args.attackSpeedMultAdd += num2 * (float)buffCount; } } } internal static class HorizonFocus { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnDeathStart <>9__6_0; internal void <Hooks>b__6_0(orig_OnDeathStart orig, CharacterBody self) { if (NetworkServer.active) { _victimReadyAt.Remove(self); } orig.Invoke(self); } } internal static ItemDef ItemDef; private const float BasePctCurrent = 0.1f; private const float StackBonusPct = 0.05f; private const float IcdSeconds = 1f; private static readonly Dictionary<CharacterBody, float> _victimReadyAt = new Dictionary<CharacterBody, float>(); internal static void Define() { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Expected O, but got Unknown ItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)ItemDef).name = "HORIZON_FOCUS_NAME"; ItemDef.nameToken = "HORIZON_FOCUS_NAME"; ItemDef.pickupToken = "HORIZON_FOCUS_PICKUP"; ItemDef.descriptionToken = "HORIZON_FOCUS_DESC"; ItemDef.loreToken = "HORIZON_FOCUS_LORE"; ItemDef.tier = (ItemTier)1; ItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier2Def.asset").WaitForCompletion(); ItemDef.pickupIconSprite = ExamplePlugin.LoadSpriteFromFile("HorizonFocus.png"); ItemDef.canRemove = true; ItemDef.hidden = false; GameObject pickupModelPrefab = ExamplePlugin.AssetLoader.LoadAsset("horizonFocusItem"); ItemDef.pickupModelPrefab = pickupModelPrefab; ItemAPI.Add(new CustomItem(ItemDef, new ItemDisplayRuleDict((ItemDisplayRule[])null))); } internal static void Hooks() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown GlobalEventManager.onServerDamageDealt += OnServerDamageDealt; object obj = <>c.<>9__6_0; if (obj == null) { hook_OnDeathStart val = delegate(orig_OnDeathStart orig, CharacterBody self) { if (NetworkServer.active) { _victimReadyAt.Remove(self); } orig.Invoke(self); }; <>c.<>9__6_0 = val; obj = (object)val; } CharacterBody.OnDeathStart += (hook_OnDeathStart)obj; } private static void OnServerDamageDealt(DamageReport report) { //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_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Expected O, but got Unknown if (!NetworkServer.active || report == null) { return; } CharacterBody victimBody = report.victimBody; CharacterBody attackerBody = report.attackerBody; if (!Object.op_Implicit((Object)(object)victimBody) || !Object.op_Implicit((Object)(object)attackerBody)) { return; } Inventory inventory = attackerBody.inventory; int num = (Object.op_Implicit((Object)(object)inventory) ? inventory.GetItemCount(ItemDef) : 0); if (num <= 0) { return; } DamageTypeCombo damageType = report.damageInfo.damageType; if (DamageTypeCombo.op_Implicit(damageType & DamageTypeCombo.op_Implicit((DamageType)32)) == 0L && DamageTypeCombo.op_Implicit(damageType & DamageTypeCombo.op_Implicit((DamageType)16777216)) == 0) { return; } float time = Time.time; if (_victimReadyAt.TryGetValue(victimBody, out var value) && time < value) { return; } _victimReadyAt[victimBody] = time + 1f; HealthComponent healthComponent = victimBody.healthComponent; if (!Object.op_Implicit((Object)(object)healthComponent) || !healthComponent.alive) { return; } float num2 = 0.1f + 0.05f * (float)Mathf.Max(0, num - 1); if (victimBody.isBoss || victimBody.isChampion) { num2 *= 0.5f; } float num3 = healthComponent.combinedHealth * num2; if (!(num3 <= 0f)) { DamageInfo val = new DamageInfo { attacker = ((Component)attackerBody).gameObject, inflictor = report.damageInfo.inflictor, damage = num3, position = victimBody.corePosition, damageType = DamageTypeCombo.op_Implicit((DamageType)2049), procCoefficient = 0f, crit = false, damageColorIndex = (DamageColorIndex)3 }; healthComponent.TakeDamage(val); GlobalEventManager instance = GlobalEventManager.instance; if (instance != null) { instance.OnHitEnemy(val, ((Component)victimBody).gameObject); } } } private static bool IsPlayer(CharacterBody b) { if (!Object.op_Implicit((Object)(object)b)) { return false; } if (b.isPlayerControlled) { return true; } CharacterMaster master = b.master; return Object.op_Implicit((Object)(object)master) && (Object)(object)master.playerCharacterMasterController != (Object)null; } } internal static class AllyArmor { [CompilerGenerated] private static class <>O { public static StatHookEventHandler <0>__GrantAllyArmor; } internal static ItemDef ItemDef; internal static void Define() { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Expected O, but got Unknown ItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)ItemDef).name = "LOCKET_OF_THE_IRON_SOLARI_NAME"; ItemDef.nameToken = "LOCKET_OF_THE_IRON_SOLARI_NAME"; ItemDef.pickupToken = "LOCKET_OF_THE_IRON_SOLARI_PICKUP"; ItemDef.descriptionToken = "LOCKET_OF_THE_IRON_SOLARI_DESC"; ItemDef.loreToken = "LOCKET_OF_THE_IRON_SOLARI_LORE"; ItemDef.tier = (ItemTier)0; ItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier1Def.asset").WaitForCompletion(); ItemDef.pickupIconSprite = ExamplePlugin.LoadSpriteFromFile("Locket.png"); ItemDef.canRemove = true; ItemDef.hidden = false; GameObject pickupModelPrefab = ExamplePlugin.AssetLoader.LoadAsset("locketItem"); ItemDef.pickupModelPrefab = pickupModelPrefab; ItemAPI.Add(new CustomItem(ItemDef, new ItemDisplayRuleDict((ItemDisplayRule[])null))); } internal static void Hooks() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown object obj = <>O.<0>__GrantAllyArmor; if (obj == null) { StatHookEventHandler val = GrantAllyArmor; <>O.<0>__GrantAllyArmor = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; } private static void GrantAllyArmor(CharacterBody body, StatHookEventArgs args) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.master)) { return; } CharacterMaster master = body.master; if ((Object)(object)master.playerCharacterMasterController != (Object)null || !Object.op_Implicit((Object)(object)master.minionOwnership.ownerMaster)) { return; } Inventory inventory = master.minionOwnership.ownerMaster.inventory; if (Object.op_Implicit((Object)(object)inventory)) { int itemCount = inventory.GetItemCount(ItemDef.itemIndex); if (itemCount > 0) { float num = (float)itemCount * 10f; args.armorAdd += num; } } } private static void AfterRecalc(orig_RecalculateStats orig, CharacterBody body) { float armor = body.armor; orig.Invoke(body); float armor2 = body.armor; if (armor2 != armor) { Chat.AddMessage($"[DEBUG] {body.GetDisplayName()} armor: {armor} → {armor2}"); } } } 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); } } internal static class SoulLink { public static class Targeting { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_Update <>9__3_0; public static hook_OnDestroy <>9__3_1; internal void <HookIndicator>b__3_0(orig_Update orig, EquipmentSlot self) { orig.Invoke(self); UpdateIndicator(self); } internal void <HookIndicator>b__3_1(orig_OnDestroy orig, EquipmentSlot self) { if (_inds.TryGetValue(self, out var value) && value != null) { value.active = false; } _inds.Remove(self); orig.Invoke(self); } } private static GameObject _visPrefab; private static readonly Dictionary<EquipmentSlot, Indicator> _inds = new Dictionary<EquipmentSlot, Indicator>(); internal static void PreloadIndicatorPrefab() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) string[] array = new string[3] { "RoR2/Base/Equipment/PassiveHealing/WoodSpriteIndicator.prefab", "RoR2/Base/Lightning/LightningIndicator.prefab", "RoR2/Base/Recycler/RecyclerIndicator.prefab" }; string[] array2 = array; foreach (string text in array2) { try { GameObject val = Addressables.LoadAssetAsync<GameObject>((object)text).WaitForCompletion(); if (Object.op_Implicit((Object)(object)val)) { _visPrefab = val; break; } } catch { } } bool flag = false; } internal static void HookIndicator() { //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__3_0; if (obj == null) { hook_Update val = delegate(orig_Update orig, EquipmentSlot self) { orig.Invoke(self); UpdateIndicator(self); }; <>c.<>9__3_0 = val; obj = (object)val; } EquipmentSlot.Update += (hook_Update)obj; object obj2 = <>c.<>9__3_1; if (obj2 == null) { hook_OnDestroy val2 = delegate(orig_OnDestroy orig, EquipmentSlot self) { if (_inds.TryGetValue(self, out var value) && value != null) { value.active = false; } _inds.Remove(self); orig.Invoke(self); }; <>c.<>9__3_1 = val2; obj2 = (object)val2; } EquipmentSlot.OnDestroy += (hook_OnDestroy)obj2; } private static void UpdateIndicator(EquipmentSlot slot) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown CharacterBody characterBody = slot.characterBody; Inventory val = (Object.op_Implicit((Object)(object)characterBody) ? characterBody.inventory : null); if (slot.stock <= 0 || slot.cooldownTimer > 0f) { return; } bool flag = Object.op_Implicit((Object)(object)val) && val.currentEquipmentIndex == ItemDef.equipmentIndex; if (!_inds.TryGetValue(slot, out var value) || value == null) { GameObject visPrefab = _visPrefab; if (!Object.op_Implicit((Object)(object)visPrefab)) { return; } value = new Indicator(((Component)slot).gameObject, visPrefab); value.active = false; _inds[slot] = value; } if (!flag || !Object.op_Implicit((Object)(object)characterBody) || !Object.op_Implicit((Object)(object)characterBody.teamComponent)) { value.active = false; value.targetTransform = null; } else { HurtBox val2 = FindFriendlyHurtboxInAim(slot, MaxRange, 20f); value.targetTransform = (Object.op_Implicit((Object)(object)val2) ? ((Component)val2).transform : null); value.active = Object.op_Implicit((Object)(object)val2); } } private static HurtBox FindFriendlyHurtboxInAim(EquipmentSlot slot, float maxRange, float maxAngle) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_0094: 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_00a6: Unknown result type (might be due to invalid IL or missing references) CharacterBody characterBody = slot.characterBody; TeamComponent val = ((characterBody != null) ? characterBody.teamComponent : null); if (!Object.op_Implicit((Object)(object)characterBody) || !Object.op_Implicit((Object)(object)val)) { return null; } float num = default(float); Ray val2 = CameraRigController.ModifyAimRayIfApplicable(slot.GetAimRay(), ((Component)slot).gameObject, ref num); BullseyeSearch val3 = new BullseyeSearch { searchOrigin = ((Ray)(ref val2)).origin, searchDirection = ((Ray)(ref val2)).direction, filterByLoS = true, sortMode = (SortMode)2, maxAngleFilter = maxAngle, maxDistanceFilter = maxRange + num, viewer = characterBody }; val3.teamMaskFilter = TeamMask.none; ((TeamMask)(ref val3.teamMaskFilter)).AddTeam(val.teamIndex); val3.RefreshCandidates(); val3.FilterOutGameObject(((Component)characterBody).gameObject); return val3.GetResults().FirstOrDefault(); } public static CharacterBody FindFriendlyAllyInAim(EquipmentSlot slot, float maxRange, float maxAngle = 20f) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0143: 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_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) CharacterBody characterBody = slot.characterBody; TeamComponent val = ((characterBody != null) ? characterBody.teamComponent : null); if (!Object.op_Implicit((Object)(object)characterBody) || !Object.op_Implicit((Object)(object)val)) { bool flag = false; return null; } float num = default(float); Ray val2 = CameraRigController.ModifyAimRayIfApplicable(slot.GetAimRay(), ((Component)slot).gameObject, ref num); bool flag2 = false; BullseyeSearch val3 = new BullseyeSearch { searchOrigin = ((Ray)(ref val2)).origin, searchDirection = ((Ray)(ref val2)).direction, filterByLoS = true, sortMode = (SortMode)2, maxAngleFilter = maxAngle, maxDistanceFilter = maxRange + num, viewer = characterBody }; val3.teamMaskFilter = TeamMask.none; ((TeamMask)(ref val3.teamMaskFilter)).AddTeam(val.teamIndex); val3.RefreshCandidates(); int num2 = val3.GetResults().Count(); bool flag3 = false; val3.FilterOutGameObject(((Component)characterBody).gameObject); List<HurtBox> list = val3.GetResults().ToList(); bool flag4 = false; HurtBox val4 = ((list.Count > 0) ? list[0] : null); if (Object.op_Implicit((Object)(object)val4)) { CharacterBody val5 = val4.healthComponent?.body; float num3 = Vector3.Distance(((Ray)(ref val2)).origin, ((Component)val4).transform.position); Vector3 direction = ((Ray)(ref val2)).direction; Vector3 val6 = ((Component)val4).transform.position - ((Ray)(ref val2)).origin; float num4 = Vector3.Angle(direction, ((Vector3)(ref val6)).normalized); string text = (Object.op_Implicit((Object)(object)val5) ? Util.GetBestBodyName(((Component)val5).gameObject) : "<?>"); bool flag5 = false; return val5; } bool flag6 = false; return null; } } [CompilerGenerated] private static class <>O { public static hook_TakeDamage <0>__TakeDamage_PreMitRedirect; public static Action<DamageReport> <1>__GlobalOnServerDamageDealt; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_PerformEquipmentAction <>9__8_0; internal bool <Hooks>b__8_0(orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) { if (NetworkServer.active && (Object)(object)equipmentDef == (Object)(object)ItemDef) { return OnUseKnightsVow(self); } return orig.Invoke(self, equipmentDef); } } internal static EquipmentDef ItemDef; public static float MaxRange; public static float Tank; public static float Heal; internal static readonly HashSet<ProtectorBondController> Active = new HashSet<ProtectorBondController>(); internal static readonly ModdedDamageType RedirectTag = DamageAPI.ReserveDamageType(); internal const bool DEBUG_CHAT = false; internal static void Define() { //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Expected O, but got Unknown MaxRange = 50f; Tank = 0.2f; Heal = 0.15f; ItemDef = ScriptableObject.CreateInstance<EquipmentDef>(); ((Object)ItemDef).name = "KNIGHTS_VOW_NAME"; ItemDef.nameToken = "KNIGHTS_VOW_NAME"; ItemDef.pickupToken = "KNIGHTS_VOW_PICKUP"; ItemDef.descriptionToken = "KNIGHTS_VOW_DESC"; ItemDef.loreToken = "KNIGHTS_VOW_LORE"; ItemDef.pickupIconSprite = ExamplePlugin.LoadSpriteFromFile("KnightsVow.png"); ItemDef.isConsumed = false; ItemDef.canDrop = true; ItemDef.canBeRandomlyTriggered = false; ItemDef.isLunar = false; ItemDef.enigmaCompatible = false; ItemDef.cooldown = 15f; GameObject pickupModelPrefab = ExamplePlugin.AssetLoader.LoadAsset("KnightsVowItem"); ItemDef.pickupModelPrefab = pickupModelPrefab; ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomEquipment(ItemDef, val)); } internal 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown object obj = <>c.<>9__8_0; if (obj == null) { hook_PerformEquipmentAction val = (orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) => (NetworkServer.active && (Object)(object)equipmentDef == (Object)(object)ItemDef) ? OnUseKnightsVow(self) : orig.Invoke(self, equipmentDef); <>c.<>9__8_0 = val; obj = (object)val; } EquipmentSlot.PerformEquipmentAction += (hook_PerformEquipmentAction)obj; Targeting.HookIndicator(); Targeting.PreloadIndicatorPrefab(); object obj2 = <>O.<0>__TakeDamage_PreMitRedirect; if (obj2 == null) { hook_TakeDamage val2 = TakeDamage_PreMitRedirect; <>O.<0>__TakeDamage_PreMitRedirect = val2; obj2 = (object)val2; } HealthComponent.TakeDamage += (hook_TakeDamage)obj2; GlobalEventManager.onServerDamageDealt += GlobalOnServerDamageDealt; } private static bool OnUseKnightsVow(EquipmentSlot slot) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return false; } CharacterBody characterBody = slot.characterBody; CharacterBody val = Targeting.FindFriendlyAllyInAim(slot, MaxRange); if (!Object.op_Implicit((Object)(object)characterBody) || !Object.op_Implicit((Object)(object)val)) { return false; } CharacterBody val2; CharacterBody val3; if (IsPlayer(val)) { val2 = val; val3 = characterBody; } else { val2 = characterBody; val3 = val; } if (!Object.op_Implicit((Object)(object)val2.teamComponent) || !Object.op_Implicit((Object)(object)val3.teamComponent) || val2.teamComponent.teamIndex != val3.teamComponent.teamIndex || (Object)(object)val3 == (Object)(object)val2) { return false; } ProtectorBondController protectorBondController = ((Component)val2).GetComponent<ProtectorBondController>(); if (!Object.op_Implicit((Object)(object)protectorBondController)) { protectorBondController = ((Component)val2).gameObject.AddComponent<ProtectorBondController>(); } protectorBondController.Initialize(val2, val3, Tank, Heal, MaxRange); bool flag = false; return true; static bool IsPlayer(CharacterBody b) { int result; if (Object.op_Implicit((Object)(object)b)) { if (!b.isPlayerControlled) { CharacterMaster master = b.master; result = (((Object)(object)((master != null) ? master.playerCharacterMasterController : null) != (Object)null) ? 1 : 0); } else { result = 1; } } else { result = 0; } return (byte)result != 0; } } private static void TakeDamage_PreMitRedirect(orig_TakeDamage orig, HealthComponent self, DamageInfo di) { //IL_0018: 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_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown //IL_014b: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || di == null || Active.Count == 0 || DamageAPI.HasModdedDamageType(di, RedirectTag)) { orig.Invoke(self, di); return; } float damage = di.damage; ProtectorBondController[] array = Active.ToArray(); foreach (ProtectorBondController protectorBondController in array) { if (Object.op_Implicit((Object)(object)protectorBondController) && protectorBondController.IsValidAndInRange() && (Object)(object)self.body == (Object)(object)protectorBondController.Wearer) { float num = Mathf.Max(0f, damage * protectorBondController.Tank); float damage2 = Mathf.Max(0f, damage - num); di.damage = damage2; DamageInfo val = new DamageInfo { attacker = di.attacker, inflictor = (di.inflictor ?? di.attacker), damage = num, position = protectorBondController.Ally.corePosition, damageType = (di.damageType | DamageTypeCombo.op_Implicit((DamageType)2048) | DamageTypeCombo.op_Implicit((DamageType)64) | DamageTypeCombo.op_Implicit((DamageType)2)), procCoefficient = 0f, crit = false }; DamageAPI.AddModdedDamageType(val, RedirectTag); protectorBondController.Ally.healthComponent.TakeDamage(val); GlobalEventManager instance = GlobalEventManager.instance; if (instance != null) { instance.OnHitEnemy(val, ((Component)protectorBondController.Ally).gameObject); } bool flag = false; break; } } orig.Invoke(self, di); } private static void GlobalOnServerDamageDealt(DamageReport report) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || report == null || (Object)(object)report.victimBody == (Object)null || report.damageDealt <= 0f || DamageAPI.HasModdedDamageType(report.damageInfo, RedirectTag) || Active.Count == 0) { return; } foreach (ProtectorBondController item in Active) { if (Object.op_Implicit((Object)(object)item) && item.IsValidAndInRange() && (Object)(object)report.attackerBody == (Object)(object)item.Wearer) { HealthComponent healthComponent = item.Ally.healthComponent; if (healthComponent != null) { healthComponent.Heal(report.damageDealt * item.Heal, default(ProcChainMask), true); } bool flag = false; } } } } public class ProtectorBondController : MonoBehaviour { public CharacterBody Wearer { get; private set; } public CharacterBody Ally { get; private set; } public float Tank { get; private set; } public float Heal { get; private set; } public float MaxRange { get; private set; } public bool AllyIsPlayerControlled { get; private set; } public void Initialize(CharacterBody wearer, CharacterBody ally, float tank, float heal, float maxRange) { Wearer = wearer; Ally = ally; Tank = tank; Heal = heal; MaxRange = maxRange; AllyIsPlayerControlled = IsPlayer(ally); ((Behaviour)this).enabled = true; } private void OnEnable() { SoulLink.Active.Add(this); bool flag = false; } private void OnDisable() { SoulLink.Active.Remove(this); bool flag = false; } private void Update() { if (!HasProtectorVowEquipped(Wearer)) { bool flag = false; Object.Destroy((Object)(object)this); } } public bool IsValidAndInRange() { //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)Wearer) || !Object.op_Implicit((Object)(object)Ally)) { return false; } HealthComponent healthComponent = Wearer.healthComponent; HealthComponent healthComponent2 = Ally.healthComponent; if ((Object)(object)healthComponent == (Object)null || (Object)(object)healthComponent2 == (Object)null || !healthComponent.alive || !healthComponent2.alive) { return false; } if (!Object.op_Implicit((Object)(object)Wearer.teamComponent) || !Object.op_Implicit((Object)(object)Ally.teamComponent)) { return false; } if (Wearer.teamComponent.teamIndex != Ally.teamComponent.teamIndex) { return false; } Vector3 val = Ally.corePosition - Wearer.corePosition; float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude; return sqrMagnitude <= MaxRange * MaxRange; } private static bool HasProtectorVowEquipped(CharacterBody body) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) Inventory val = ((body != null) ? body.inventory : null); if (!Object.op_Implicit((Object)(object)val)) { return false; } return val.currentEquipmentIndex == SoulLink.ItemDef.equipmentIndex; } private static bool IsPlayer(CharacterBody body) { if (!Object.op_Implicit((Object)(object)body)) { return false; } if (body.isPlayerControlled) { return true; } CharacterMaster master = body.master; return Object.op_Implicit((Object)(object)master) && Object.op_Implicit((Object)(object)master.playerCharacterMasterController); } } public class PulseMarker : MonoBehaviour { public Vector3 center; public float ttl = 1f; private void Update() { ttl -= Time.deltaTime; if (ttl <= 0f) { Object.Destroy((Object)(object)((Component)this).gameObject); } } } public class PulseHitVFXListener { public static GameObject OnHitVFXPrefab; public static void Init() { GlobalEventManager.onServerDamageDealt += OnServerDamageDealt; } private static void OnServerDamageDealt(DamageReport report) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || !Object.op_Implicit((Object)(object)report?.victimBody)) { return; } GameObject inflictor = report.damageInfo.inflictor; if (!Object.op_Implicit((Object)(object)inflictor)) { return; } PulseMarker component = inflictor.GetComponent<PulseMarker>(); if (Object.op_Implicit((Object)(object)component)) { Vector3 corePosition = report.victimBody.corePosition; Vector3 val = corePosition - component.center; if (((Vector3)(ref val)).sqrMagnitude > 1E-06f) { ((Vector3)(ref val)).Normalize(); } else { val = Vector3.up; } if (Object.op_Implicit((Object)(object)TempVFX.OnHitImpactPrefab)) { Debug.LogWarning((object)"[UD] OnHitImpactPrefab exists"); EffectManager.SimpleImpactEffect(TempVFX.OnHitImpactPrefab, corePosition, val, true); } } } } public static class TempVFX { public static GameObject OnHitImpactPrefab; public static void Load() { //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) OnHitImpactPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniExplosionVFX.prefab").WaitForCompletion(); if (!Object.op_Implicit((Object)(object)OnHitImpactPrefab)) { Debug.LogWarning((object)"[UD] TempVFX: Could not find OmniImpactVFX, on-hit effects will be skipped."); } } } internal static class UnendingDespair { private class BarrierPulseTracker : MonoBehaviour { private CharacterBody body; private HealthComponent hc; private float lastBarrier; private static readonly float BASE_THRESHOLD_FRAC = 0.1f; private float accumulatedLoss = 0f; private ItemIndex ItemIndex => ItemDef.itemIndex; private void Awake() { body = ((Component)this).GetComponent<CharacterBody>(); hc = body.healthComponent; lastBarrier = hc.barrier; } private void FixedUpdate() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)hc)) { return; } int num = (Object.op_Implicit((Object)(object)body.inventory) ? body.inventory.GetItemCount(ItemIndex) : 0); if (num == 0) { lastBarrier = hc.barrier; return; } float barrier = hc.barrier; if (barrier >= lastBarrier) { lastBarrier = barrier; return; } float num2 = lastBarrier - barrier; if (num2 <= 0f) { lastBarrier = barrier; return; } accumulatedLoss += num2; float num3 = BASE_THRESHOLD_FRAC * body.maxHealth; if (accumulatedLoss >= num3) { FirePulse(accumulatedLoss, num); accumulatedLoss = 0f; } lastBarrier = barrier; } private void FirePulse(float depletedBarrier, int stacks) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //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_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) float num = 2.5f + 1.5f * (float)(stacks - 1); float baseDamage = depletedBarrier * num; GameObject val = new GameObject("UD_PulseMarker"); PulseMarker pulseMarker = val.AddComponent<PulseMarker>(); pulseMarker.center = body.corePosition; pulseMarker.ttl = 1f; BlastAttack val2 = new BlastAttack { attacker = ((Component)body).gameObject, inflictor = val, teamIndex = (Object.op_Implicit((Object)(object)body.teamComponent) ? body.teamComponent.teamIndex : TeamComponent.GetObjectTeam(((Component)body).gameObject)), attackerFiltering = (AttackerFiltering)2, baseDamage = baseDamage, baseForce = 0f, bonusForce = Vector3.zero, crit = body.RollCrit(), damageColorIndex = (DamageColorIndex)3, damageType = DamageTypeCombo.op_Implicit((DamageType)0), falloffModel = (FalloffModel)0, position = body.corePosition, procCoefficient = 0.25f, radius = 12f + 2f * (float)(stacks - 1) }; val2.Fire(); } } [CompilerGenerated] private static class <>O { public static Action<CharacterBody> <0>__AddTrackerIfNeeded; public static hook_FixedUpdate <1>__BarrierOutOfCombat; } internal static ItemDef ItemDef; internal static GameObject PulseVFX; internal static void Define() { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) ItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)ItemDef).name = "UNENDING_DESPAIR_NAME"; ItemDef.nameToken = "UNENDING_DESPAIR_NAME"; ItemDef.pickupToken = "UNENDING_DESPAIR_PICKUP"; ItemDef.descriptionToken = "UNENDING_DESPAIR_DESC"; ItemDef.loreToken = "UNENDING_DESPAIR_LORE"; ItemDef.tier = (ItemTier)2; ItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier3Def.asset").WaitForCompletion(); ItemDef.pickupIconSprite = ExamplePlugin.LoadSpriteFromFile("UnendingDespair.png"); ItemDef.canRemove = true; ItemDef.hidden = false; GameObject pickupModelPrefab = ExamplePlugin.AssetLoader.LoadAsset("unendingDespairItem"); ItemDef.pickupModelPrefab = pickupModelPrefab; ItemAPI.Add(new CustomItem(ItemDef, new ItemDisplayRuleDict((ItemDisplayRule[])null))); PulseVFX = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniExplosionVFX.prefab").WaitForCompletion(); } internal static void Hooks() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown CharacterBody.onBodyStartGlobal += AddTrackerIfNeeded; object obj = <>O.<1>__BarrierOutOfCombat; if (obj == null) { hook_FixedUpdate val = BarrierOutOfCombat; <>O.<1>__BarrierOutOfCombat = val; obj = (object)val; } CharacterBody.FixedUpdate += (hook_FixedUpdate)obj; } private static void AddTrackerIfNeeded(CharacterBody body) { if (!Object.op_Implicit((Object)(object)((Component)body).GetComponent<BarrierPulseTracker>())) { ((Component)body).gameObject.AddComponent<BarrierPulseTracker>(); } } private static void BarrierOutOfCombat(orig_FixedUpdate orig, CharacterBody body) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(body); if (NetworkServer.active && !((Object)(object)body == (Object)null) && !((Object)(object)body.inventory == (Object)null) && body.inventory.GetItemCount(ItemDef.itemIndex) != 0 && body.outOfDanger) { float num = body.maxHealth * 0.1f; float num2 = num - body.healthComponent.barrier; if (num2 > 1f) { body.healthComponent.AddBarrier(num2); } } } } }