Decompiled source of LoLItems v1.3.1
LoLItems.dll
Decompiled 3 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Collections.ObjectModel; 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.Configuration; using BepInEx.Logging; using LoLItems; using Microsoft.CodeAnalysis; using On.RoR2; using On.RoR2.Items; using On.RoR2.UI; using R2API; using R2API.Utils; using RoR2; using RoR2.Orbs; using RoR2.UI; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using UnityEngine.Rendering; [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LoLItems")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyProduct("LoLItems")] [assembly: AssemblyTitle("LoLItems")] [assembly: AssemblyInformationalVersion("1.0.0+982688563d07229a24b7fa878a92496ffc01f36f")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [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 { [Microsoft.CodeAnalysis.Embedded] [CompilerGenerated] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } public static class MyAssets { public static AssetBundle icons; public static AssetBundle prefabs; public const string iconsName = "icons"; public const string prefabsName = "prefabs"; public static string IconAssetBundlePath => Path.Combine(Path.GetDirectoryName(global::LoLItems.LoLItems.PInfo.Location), "icons"); public static string PrefabAssetBundlePath => Path.Combine(Path.GetDirectoryName(global::LoLItems.LoLItems.PInfo.Location), "prefabs"); public static void Init() { icons = AssetBundle.LoadFromFile(IconAssetBundlePath); prefabs = AssetBundle.LoadFromFile(PrefabAssetBundlePath); } } internal class MyNetworkComponent : NetworkBehaviour { private static MyNetworkComponent _instance; private static int kTargetRpcTargetSyncDictionary; private void Awake() { _instance = this; } public static void Invoke(NetworkUser user, NetworkInstanceId netId, float value, string dictToken) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) _instance.CallTargetSyncDictionary(((NetworkBehaviour)user).connectionToClient, netId, value, dictToken); } [TargetRpc] private void TargetSyncDictionary(NetworkConnection target, NetworkInstanceId netId, float value, string dictToken) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) global::LoLItems.LoLItems.networkMappings.TryGetValue(dictToken, out var value2); NetworkManager.GetCharacterMasterFromNetId(netId, out var characterMaster); if (value2 != null && (Object)(object)characterMaster != (Object)null && !NetworkServer.active) { Utilities.SetValueInDictionary(ref value2, characterMaster, value, dictToken); } } private void UNetVersion() { } protected static void InvokeRpcTargetSyncDictionary(NetworkBehaviour obj, NetworkReader reader) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) if (!NetworkClient.active) { Debug.LogError((object)"TargetRPC TargetSyncDictionary called on server."); } else { ((MyNetworkComponent)(object)obj).TargetSyncDictionary(ClientScene.readyConnection, reader.ReadNetworkId(), reader.ReadSingle(), reader.ReadString()); } } public void CallTargetSyncDictionary(NetworkConnection target, NetworkInstanceId netId, float value, string dictToken) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0058: 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) if (!NetworkServer.active) { Debug.LogError((object)"TargetRPC Function TargetSyncDictionary called on client."); return; } if (target is ULocalConnectionToServer) { Debug.LogError((object)"TargetRPC Function TargetSyncDictionary called on connection to server"); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kTargetRpcTargetSyncDictionary); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(netId); val.Write(value); val.Write(dictToken); ((NetworkBehaviour)this).SendTargetRPCInternal(target, val, 0, "TargetSyncDictionary"); } static MyNetworkComponent() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown kTargetRpcTargetSyncDictionary = 1824529895; NetworkBehaviour.RegisterRpcDelegate(typeof(MyNetworkComponent), kTargetRpcTargetSyncDictionary, new CmdDelegate(InvokeRpcTargetSyncDictionary)); NetworkCRC.RegisterBehaviour("MyNetworkComponent", 0); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { bool result = default(bool); return result; } public override void OnDeserialize(NetworkReader reader, bool initialState) { } } namespace ExamplePlugin { internal static class Log { internal static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void LogDebug(object data) { _logSource.LogDebug(data); } internal static void LogError(object data) { _logSource.LogError(data); } internal static void LogFatal(object data) { _logSource.LogFatal(data); } internal static void LogInfo(object data) { _logSource.LogInfo(data); } internal static void LogMessage(object data) { _logSource.LogMessage(data); } internal static void LogWarning(object data) { _logSource.LogWarning(data); } } } namespace LoLItems { internal class BannerOfCommand { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_TakeDamage <>9__24_0; internal void <Hooks>b__24_0(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); object obj; if (component == null) { obj = null; } else { CharacterMaster master = component.master; if (master == null) { obj = null; } else { MinionOwnership minionOwnership = master.minionOwnership; obj = ((minionOwnership != null) ? minionOwnership.ownerMaster : null); } } CharacterMaster val = (CharacterMaster)obj; if (Object.op_Implicit((Object)(object)((val != null) ? val.inventory : null))) { int itemCount = val.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0) { float num = 1f + (float)itemCount * DamagePercentAmp.Value / 100f; Utilities.AddValueInDictionary(ref bonusDamageDealt, val, num * damageInfo.damage, bonusDamageDealtToken); damageInfo.damage *= num; } } } orig.Invoke(self, damageInfo); } } public static ItemDef myItemDef; public static Dictionary<NetworkInstanceId, float> bonusDamageDealt = new Dictionary<NetworkInstanceId, float>(); public static string bonusDamageDealtToken = "BannerOfCommand.bonusDamageDealt"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static ConfigEntry<float> DamagePercentAmp { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "BannerOfCommand"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Banner of Command", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Banner of Command", "Rarity", "Tier1Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Banner of Command", "Void Items", "", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); DamagePercentAmp = LoLItems.MyConfig.Bind<float>("Banner of Command", "Damage Amp", 10f, "Amount of damage amp each stack will grant."); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "BannerOfCommand"; myItemDef.nameToken = "BannerOfCommand"; myItemDef.pickupToken = "BannerOfCommandItem"; myItemDef.descriptionToken = "BannerOfCommandDesc"; myItemDef.loreToken = "BannerOfCommandLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("BannerOfCommandIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("BannerOfCommandPrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 }; } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__24_0; if (obj == null) { hook_TakeDamage val = delegate(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); object obj2; if (component == null) { obj2 = null; } else { CharacterMaster master = component.master; if (master == null) { obj2 = null; } else { MinionOwnership minionOwnership = master.minionOwnership; obj2 = ((minionOwnership != null) ? minionOwnership.ownerMaster : null); } } CharacterMaster val2 = (CharacterMaster)obj2; if (Object.op_Implicit((Object)(object)((val2 != null) ? val2.inventory : null))) { int itemCount = val2.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0) { float num = 1f + (float)itemCount * DamagePercentAmp.Value / 100f; Utilities.AddValueInDictionary(ref bonusDamageDealt, val2, num * damageInfo.damage, bonusDamageDealtToken); damageInfo.damage *= num; } } } orig.Invoke(self, damageInfo); }; <>c.<>9__24_0 = val; obj = (object)val; } HealthComponent.TakeDamage += (hook_TakeDamage)obj; } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myItemDef.descriptionToken), ""); } string text = ""; float value; return new ValueTuple<string, string>(item2: (!bonusDamageDealt.TryGetValue(((NetworkBehaviour)masterRef).netId, out value)) ? (text + "<br><br>Damage dealt: 0") : (text + "<br><br>Damage dealt: " + $"{value:#, ##0.##}"), item1: Language.GetString(myItemDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("BannerOfCommand", "Banner of Command"); LanguageAPI.Add("BannerOfCommandItem", "Increase allied minion damage."); LanguageAPI.Add("BannerOfCommandDesc", "Increase the damage of allied minions by <style=cIsUtility>" + DamagePercentAmp.Value + "%</style> <style=cStack>(+" + DamagePercentAmp.Value + "%)</style>."); LanguageAPI.Add("BannerOfCommandLore", "Split pushing is boring."); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(bonusDamageDealtToken, bonusDamageDealt); } } internal class Bork { [CompilerGenerated] private static class <>O { public static Func<CharacterMaster, (string, string)> <0>__GetDisplayInformation; public static StatHookEventHandler <1>__RecalculateStatsAPI_GetStatCoefficients; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnHitEnemy <>9__54_0; internal void <Hooks>b__54_0(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); if (!NetworkServer.active || !Object.op_Implicit((Object)(object)damageInfo.attacker)) { return; } CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if (!Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null))) { return; } int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0 && damageInfo.procCoefficient > 0f && !component2.HasBuff(myTimerBuffDef)) { int buffCount = component2.healthComponent.body.GetBuffCount(myCounterBuffDef); if ((float)buffCount < ProcForBigHit.Value - 1f && NetworkServer.active) { component2.healthComponent.body.AddBuff(myCounterBuffDef); return; } Utilities.RemoveBuffStacks(component2, myCounterBuffDef.buffIndex); Utilities.AddTimedBuff(component2, myTimerBuffDef, BigOnHitTimer.Value); float val = component2.healthComponent.health * (float)itemCount * OnHitDamageAmount.Value / 100f * damageInfo.procCoefficient; val = Math.Max(ProcDamageMin.Value * component.damage, Math.Min(ProcDamageMax.Value * component.damage, val)); damageInfo.crit = false; damageInfo.procCoefficient = 0f; damageInfo.damageType = DamageTypeCombo.op_Implicit((DamageType)0); damageInfo.inflictor = damageInfo.attacker; damageInfo.damage = val; damageInfo.damageColorIndex = (DamageColorIndex)10; component2.healthComponent.TakeDamage(damageInfo); Utilities.AddValueInDictionary(ref borkBonusDamage, component.master, val, borkBonusDamageToken); float num = val * (OnHitHealPercent.Value / 100f); component.healthComponent.Heal(num, damageInfo.procChainMask, true); Utilities.AddValueInDictionary(ref borkBonusHeal, component.master, num, borkBonusHealToken); AkSoundEngine.PostEvent(procSoundEffect, ((Component)component).gameObject); } } } public static ItemDef myItemDef; public static BuffDef myCounterBuffDef; public static BuffDef myTimerBuffDef; public static Dictionary<NetworkInstanceId, float> borkBonusDamage = new Dictionary<NetworkInstanceId, float>(); public static string borkBonusDamageToken = "Bork.borkBonusDamage"; public static Dictionary<NetworkInstanceId, float> borkBonusHeal = new Dictionary<NetworkInstanceId, float>(); public static string borkBonusHealToken = "Bork.borkBonusHeal"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static uint procSoundEffect = 3722891417u; public static ConfigEntry<float> OnHitDamageAmount { get; set; } public static ConfigEntry<float> ProcForBigHit { get; set; } public static ConfigEntry<float> OnHitHealPercent { get; set; } public static ConfigEntry<float> BigOnHitTimer { get; set; } public static ConfigEntry<float> ProcDamageMin { get; set; } public static ConfigEntry<float> ProcDamageMax { get; set; } public static ConfigEntry<float> AttackSpeed { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); CreateBuff(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); ContentAddition.AddBuffDef(myCounterBuffDef); ContentAddition.AddBuffDef(myTimerBuffDef); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "Bork"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Blade of the Ruined King", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Blade of the Ruined King", "Rarity", "VoidTier2Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Blade of the Ruined King", "Void Items", "Syringe,Seed", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); OnHitDamageAmount = LoLItems.MyConfig.Bind<float>("Blade of the Ruined King", "On Hit Damage Percent", 5f, "Amount of on hit current health damage percent each item will grant."); ProcForBigHit = LoLItems.MyConfig.Bind<float>("Blade of the Ruined King", "On Hit Proc Requirement", 3f, "Amount of hits required to proc the on hit damage."); OnHitHealPercent = LoLItems.MyConfig.Bind<float>("Blade of the Ruined King", "Heal Percent", 20f, "Percentage of damage dealt to be gained as healing."); BigOnHitTimer = LoLItems.MyConfig.Bind<float>("Blade of the Ruined King", "Proc Cooldown", 10f, "Cooldown per enemy."); ProcDamageMin = LoLItems.MyConfig.Bind<float>("Blade of the Ruined King", "Min Proc Damage", 2f, "Multiplied by your base damage to determine the minimum proc damage."); ProcDamageMax = LoLItems.MyConfig.Bind<float>("Blade of the Ruined King", "Max Proc Damage", 25f, "Multiplied by your base damage to determine the maximum proc damage."); AttackSpeed = LoLItems.MyConfig.Bind<float>("Blade of the Ruined King", "Attack Speed", 5f, "Amount of attack speed each item will grant."); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "Bork"; myItemDef.nameToken = "Bork"; myItemDef.pickupToken = "BorkItem"; myItemDef.descriptionToken = "BorkDesc"; myItemDef.loreToken = "BorkLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("BorkIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("BorkPrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[2] { (ItemTag)1, (ItemTag)2 }; } private static void CreateBuff() { myCounterBuffDef = ScriptableObject.CreateInstance<BuffDef>(); myCounterBuffDef.iconSprite = Resources.Load<Sprite>("Textures/MiscIcons/texMysteryIcon"); ((Object)myCounterBuffDef).name = "BorkCounterBuff"; myCounterBuffDef.canStack = true; myCounterBuffDef.isDebuff = false; myCounterBuffDef.isCooldown = false; myCounterBuffDef.isHidden = true; myTimerBuffDef = ScriptableObject.CreateInstance<BuffDef>(); myTimerBuffDef.iconSprite = Resources.Load<Sprite>("Textures/MiscIcons/texMysteryIcon"); ((Object)myTimerBuffDef).name = "BorkTimerBuff"; myTimerBuffDef.canStack = true; myTimerBuffDef.isDebuff = false; myTimerBuffDef.isCooldown = true; myTimerBuffDef.isHidden = true; } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //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 object obj = <>c.<>9__54_0; if (obj == null) { hook_OnHitEnemy val = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); if (NetworkServer.active && Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null))) { int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0 && damageInfo.procCoefficient > 0f && !component2.HasBuff(myTimerBuffDef)) { int buffCount = component2.healthComponent.body.GetBuffCount(myCounterBuffDef); if ((float)buffCount < ProcForBigHit.Value - 1f && NetworkServer.active) { component2.healthComponent.body.AddBuff(myCounterBuffDef); } else { Utilities.RemoveBuffStacks(component2, myCounterBuffDef.buffIndex); Utilities.AddTimedBuff(component2, myTimerBuffDef, BigOnHitTimer.Value); float val3 = component2.healthComponent.health * (float)itemCount * OnHitDamageAmount.Value / 100f * damageInfo.procCoefficient; val3 = Math.Max(ProcDamageMin.Value * component.damage, Math.Min(ProcDamageMax.Value * component.damage, val3)); damageInfo.crit = false; damageInfo.procCoefficient = 0f; damageInfo.damageType = DamageTypeCombo.op_Implicit((DamageType)0); damageInfo.inflictor = damageInfo.attacker; damageInfo.damage = val3; damageInfo.damageColorIndex = (DamageColorIndex)10; component2.healthComponent.TakeDamage(damageInfo); Utilities.AddValueInDictionary(ref borkBonusDamage, component.master, val3, borkBonusDamageToken); float num = val3 * (OnHitHealPercent.Value / 100f); component.healthComponent.Heal(num, damageInfo.procChainMask, true); Utilities.AddValueInDictionary(ref borkBonusHeal, component.master, num, borkBonusHealToken); AkSoundEngine.PostEvent(procSoundEffect, ((Component)component).gameObject); } } } } }; <>c.<>9__54_0 = val; obj = (object)val; } GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj; object obj2 = <>O.<1>__RecalculateStatsAPI_GetStatCoefficients; if (obj2 == null) { StatHookEventHandler val2 = RecalculateStatsAPI_GetStatCoefficients; <>O.<1>__RecalculateStatsAPI_GetStatCoefficients = val2; obj2 = (object)val2; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj2; } private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody characterBody, StatHookEventArgs args) { float baseAttackSpeedAdd = args.baseAttackSpeedAdd; int? obj; if (characterBody == null) { obj = null; } else { Inventory inventory = characterBody.inventory; obj = ((inventory != null) ? new int?(inventory.GetItemCount(myItemDef)) : null); } args.baseAttackSpeedAdd = baseAttackSpeedAdd + ((float?)obj / 100f * AttackSpeed.Value).GetValueOrDefault(); } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myItemDef.descriptionToken), ""); } string text = ""; text = ((!borkBonusDamage.TryGetValue(((NetworkBehaviour)masterRef).netId, out var value)) ? (text + "<br><br>Damage dealt: 0") : (text + "<br><br>Damage dealt: " + $"{value:#, ##0.##}")); float value2; return new ValueTuple<string, string>(item2: (!borkBonusHeal.TryGetValue(((NetworkBehaviour)masterRef).netId, out value2)) ? (text + "<br>Healing: 0") : (text + "<br>Healing: " + $"{value2:#, ##0.##}"), item1: Language.GetString(myItemDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("Bork", "Blade of the Ruined King"); LanguageAPI.Add("BorkItem", "Increases attack speed. Every " + ProcForBigHit.Value + " hits do damage and heal, and has a cooldown. Corrupts <style=cIsVoid>Syringes</style> and <style=cIsVoid>Leaching Seeds</style>."); LanguageAPI.Add("BorkDesc", "Gives <style=cIsDamage>" + AttackSpeed.Value + "%</style> <style=cStack>(+" + AttackSpeed.Value + "%)</style> attack speed. Deals <style=cIsDamage>" + OnHitDamageAmount.Value + "%</style> <style=cStack>(+" + OnHitDamageAmount.Value + "%)</style> current enemy hp every third hit, and heal for <style=cIsHealing>" + OnHitHealPercent.Value + "%</style> of that damage on a " + BigOnHitTimer.Value + " second cooldown. Corrupts <style=cIsVoid>Syringes</style> and <style=cIsVoid>Leaching Seeds</style>."); LanguageAPI.Add("BorkLore", "Viego is a plague to everything he touches."); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(borkBonusDamageToken, borkBonusDamage); LoLItems.networkMappings.Add(borkBonusHealToken, borkBonusHeal); } } internal class Cull { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnCharacterDeath <>9__32_0; public static hook_OnInventoryChanged <>9__32_1; public static hook_Start <>9__32_2; internal void <Hooks>b__32_0(orig_OnCharacterDeath orig, GlobalEventManager globalEventManager, DamageReport damageReport) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: 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_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(globalEventManager, damageReport); if (!NetworkServer.active) { return; } GameObject val = null; Transform val2 = null; Vector3 origin = Vector3.zero; if (Object.op_Implicit((Object)(object)damageReport.victim)) { val = ((Component)damageReport.victim).gameObject; val2 = val.transform; origin = val2.position; } CharacterMaster attackerMaster = damageReport.attackerMaster; if (!Object.op_Implicit((Object)(object)((attackerMaster != null) ? attackerMaster.inventory : null))) { return; } int itemCount = damageReport.attackerMaster.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount <= 0) { return; } float num = GoldOnKill.Value * (float)itemCount; GoldOrb val3 = new GoldOrb { origin = origin, target = Util.FindBodyMainHurtBox(damageReport.attackerBody), goldAmount = (uint)num }; OrbManager.instance.AddOrb((Orb)(object)val3); if (NetworkServer.active) { for (int i = 0; i < itemCount; i++) { damageReport.attackerBody.AddBuff(myBuffDef); } } if ((float)damageReport.attackerBody.GetBuffCount(myBuffDef) >= KillsToBreak.Value) { if (NetworkServer.active) { damageReport.attackerBody.inventory.RemoveItem(myItemDef, 1); damageReport.attackerBody.inventory.GiveItem(Items.ScrapWhite, 1); } CharacterMasterNotificationQueue.SendTransformNotification(damageReport.attackerMaster, myItemDef.itemIndex, Items.ScrapWhite.itemIndex, (TransformationType)0); if (itemCount == 1) { Utilities.RemoveBuffStacks(damageReport.attackerBody, myBuffDef.buffIndex); } else if (NetworkServer.active) { for (int j = 0; (float)j < KillsToBreak.Value; j++) { damageReport.attackerBody.RemoveBuff(myBuffDef); } } } Utilities.SetValueInDictionary(ref buffStacks, damageReport.attackerBody.master, damageReport.attackerBody.GetBuffCount(myBuffDef.buffIndex), buffStacksToken); Utilities.AddValueInDictionary(ref goldGained, damageReport.attackerBody.master, num, goldGainedToken); } internal void <Hooks>b__32_1(orig_OnInventoryChanged orig, CharacterBody self) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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) orig.Invoke(self); if (NetworkServer.active && self.inventory.GetItemCount(myItemDef.itemIndex) == 0 && self.GetBuffCount(myBuffDef.buffIndex) > 0) { Utilities.RemoveBuffStacks(self, myBuffDef.buffIndex); } } internal void <Hooks>b__32_2(orig_Start orig, CharacterBody self) { //IL_0028: 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) orig.Invoke(self); if (NetworkServer.active && Object.op_Implicit((Object)(object)self.master) && buffStacks.TryGetValue(((NetworkBehaviour)self.master).netId, out var value)) { for (int i = 0; (float)i < value; i++) { self.AddBuff(myBuffDef.buffIndex); } } } } public static ItemDef myItemDef; public static BuffDef myBuffDef; public static Dictionary<NetworkInstanceId, float> goldGained = new Dictionary<NetworkInstanceId, float>(); public static string goldGainedToken = "Cull.goldGained"; public static Dictionary<NetworkInstanceId, float> buffStacks = new Dictionary<NetworkInstanceId, float>(); public static string buffStacksToken = "Cull.buffStacks"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static ConfigEntry<float> GoldOnKill { get; set; } public static ConfigEntry<float> KillsToBreak { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); CreateBuff(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); ContentAddition.AddBuffDef(myBuffDef); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "Cull"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Cull", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Cull", "Rarity", "Tier1Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Cull", "Void Items", "", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); GoldOnKill = LoLItems.MyConfig.Bind<float>("Cull", "Gold Per Kill", 1f, "Amount of gold each kill will grant."); KillsToBreak = LoLItems.MyConfig.Bind<float>("Cull", "Kills To Convert", 100f, "Amount of kills needed to convert the item."); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "Cull"; myItemDef.nameToken = "Cull"; myItemDef.pickupToken = "CullItem"; myItemDef.descriptionToken = "CullDesc"; myItemDef.loreToken = "CullLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("CullIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("CullPrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 }; } private static void CreateBuff() { myBuffDef = ScriptableObject.CreateInstance<BuffDef>(); myBuffDef.iconSprite = MyAssets.icons.LoadAsset<Sprite>("CullIcon"); ((Object)myBuffDef).name = "Cull Stacks"; myBuffDef.canStack = true; myBuffDef.isDebuff = false; myBuffDef.isCooldown = false; myBuffDef.isHidden = false; } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown object obj = <>c.<>9__32_0; if (obj == null) { hook_OnCharacterDeath val = delegate(orig_OnCharacterDeath orig, GlobalEventManager globalEventManager, DamageReport damageReport) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: 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_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(globalEventManager, damageReport); if (NetworkServer.active) { GameObject val4 = null; Transform val5 = null; Vector3 origin = Vector3.zero; if (Object.op_Implicit((Object)(object)damageReport.victim)) { val4 = ((Component)damageReport.victim).gameObject; val5 = val4.transform; origin = val5.position; } CharacterMaster attackerMaster = damageReport.attackerMaster; if (Object.op_Implicit((Object)(object)((attackerMaster != null) ? attackerMaster.inventory : null))) { int itemCount = damageReport.attackerMaster.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0) { float num = GoldOnKill.Value * (float)itemCount; GoldOrb val6 = new GoldOrb { origin = origin, target = Util.FindBodyMainHurtBox(damageReport.attackerBody), goldAmount = (uint)num }; OrbManager.instance.AddOrb((Orb)(object)val6); if (NetworkServer.active) { for (int j = 0; j < itemCount; j++) { damageReport.attackerBody.AddBuff(myBuffDef); } } if ((float)damageReport.attackerBody.GetBuffCount(myBuffDef) >= KillsToBreak.Value) { if (NetworkServer.active) { damageReport.attackerBody.inventory.RemoveItem(myItemDef, 1); damageReport.attackerBody.inventory.GiveItem(Items.ScrapWhite, 1); } CharacterMasterNotificationQueue.SendTransformNotification(damageReport.attackerMaster, myItemDef.itemIndex, Items.ScrapWhite.itemIndex, (TransformationType)0); if (itemCount == 1) { Utilities.RemoveBuffStacks(damageReport.attackerBody, myBuffDef.buffIndex); } else if (NetworkServer.active) { for (int k = 0; (float)k < KillsToBreak.Value; k++) { damageReport.attackerBody.RemoveBuff(myBuffDef); } } } Utilities.SetValueInDictionary(ref buffStacks, damageReport.attackerBody.master, damageReport.attackerBody.GetBuffCount(myBuffDef.buffIndex), buffStacksToken); Utilities.AddValueInDictionary(ref goldGained, damageReport.attackerBody.master, num, goldGainedToken); } } } }; <>c.<>9__32_0 = val; obj = (object)val; } GlobalEventManager.OnCharacterDeath += (hook_OnCharacterDeath)obj; object obj2 = <>c.<>9__32_1; if (obj2 == null) { hook_OnInventoryChanged val2 = delegate(orig_OnInventoryChanged orig, CharacterBody self) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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) orig.Invoke(self); if (NetworkServer.active && self.inventory.GetItemCount(myItemDef.itemIndex) == 0 && self.GetBuffCount(myBuffDef.buffIndex) > 0) { Utilities.RemoveBuffStacks(self, myBuffDef.buffIndex); } }; <>c.<>9__32_1 = val2; obj2 = (object)val2; } CharacterBody.OnInventoryChanged += (hook_OnInventoryChanged)obj2; object obj3 = <>c.<>9__32_2; if (obj3 == null) { hook_Start val3 = delegate(orig_Start orig, CharacterBody self) { //IL_0028: 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) orig.Invoke(self); if (NetworkServer.active && Object.op_Implicit((Object)(object)self.master) && buffStacks.TryGetValue(((NetworkBehaviour)self.master).netId, out var value)) { for (int i = 0; (float)i < value; i++) { self.AddBuff(myBuffDef.buffIndex); } } }; <>c.<>9__32_2 = val3; obj3 = (object)val3; } CharacterBody.Start += (hook_Start)obj3; } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myItemDef.descriptionToken), ""); } string text = ""; float value; return new ValueTuple<string, string>(item2: (!goldGained.TryGetValue(((NetworkBehaviour)masterRef).netId, out value)) ? (text + "<br><br>Total gold gained: 0") : (text + "<br><br>Total gold gained: " + $"{value:#, ##0.##}"), item1: Language.GetString(myItemDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("Cull", "Cull"); LanguageAPI.Add("CullItem", "Gives gold when killing enemies. Turns into White Scrap when <style=cIsUtility>" + KillsToBreak.Value + "</style> enemies are killed."); LanguageAPI.Add("CullDesc", "Gives <style=cIsUtility>" + GoldOnKill.Value + "</style> <style=cStack>(+" + GoldOnKill.Value + ")</style> gold when killing an enemy. Upon killing <style=cIsUtility>" + KillsToBreak.Value + "</style> enemies, turns into White Scrap."); LanguageAPI.Add("CullLore", "I personally like Doran's Blade more."); LanguageAPI.Add("CullBuff", "Gold gained"); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(goldGainedToken, goldGained); LoLItems.networkMappings.Add(buffStacksToken, buffStacks); } } internal class ExperimentalHexplate { [CompilerGenerated] private static class <>O { public static Func<CharacterMaster, (string, string)> <0>__GetDisplayInformation; public static StatHookEventHandler <1>__RecalculateStatsAPI_GetStatCoefficients; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnSkillActivated <>9__34_0; internal void <Hooks>b__34_0(orig_OnSkillActivated orig, CharacterBody self, GenericSkill genericSkill) { if (!NetworkServer.active) { orig.Invoke(self, genericSkill); return; } GenericSkill val = self.skillLocator?.special; Inventory inventory = self.inventory; if (inventory != null && inventory.GetItemCount(myItemDef) > 0 && (Object)(object)val == (Object)(object)genericSkill) { Utilities.AddTimedBuff(self, myBuffDef, Duration.Value); Utilities.AddValueInDictionary(ref totalTimesActivated, self.master, 1f, totalTimesActivatedToken, checkMinionOwnership: false); } orig.Invoke(self, genericSkill); } } public static ItemDef myItemDef; public static BuffDef myBuffDef; public static Dictionary<NetworkInstanceId, float> totalTimesActivated = new Dictionary<NetworkInstanceId, float>(); public static string totalTimesActivatedToken = "ExperimentalHexplate.totalTimesActivated"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static ConfigEntry<float> Duration { get; set; } public static ConfigEntry<float> AttackSpeed { get; set; } public static ConfigEntry<float> MoveSpeed { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); CreateBuff(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); ContentAddition.AddBuffDef(myBuffDef); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "ExperimentalHexplate"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Experimental Hexplate", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Experimental Hexplate", "Rarity", "Tier2Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Experimental Hexplate", "Void Items", "", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); Duration = LoLItems.MyConfig.Bind<float>("Experimental Hexplate", "Duration", 5f, "The duration of the item buff."); AttackSpeed = LoLItems.MyConfig.Bind<float>("Experimental Hexplate", "Attack Speed", 40f, "The amount of attack speed the item proc grants."); MoveSpeed = LoLItems.MyConfig.Bind<float>("Experimental Hexplate", "Movespeed", 32f, "The amount of movespeed the item proc grants."); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "ExperimentalHexplate"; myItemDef.nameToken = "ExperimentalHexplate"; myItemDef.pickupToken = "ExperimentalHexplateItem"; myItemDef.descriptionToken = "ExperimentalHexplateDesc"; myItemDef.loreToken = "ExperimentalHexplateLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("ExperimentalHexplateIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("ExperimentalHexplatePrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[2] { (ItemTag)1, (ItemTag)3 }; } private static void CreateBuff() { myBuffDef = ScriptableObject.CreateInstance<BuffDef>(); myBuffDef.iconSprite = MyAssets.icons.LoadAsset<Sprite>("ExperimentalHexplateIcon"); ((Object)myBuffDef).name = "ExperimentalHexplateBuff"; myBuffDef.canStack = false; myBuffDef.isDebuff = false; myBuffDef.isCooldown = false; myBuffDef.isHidden = false; } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //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 object obj = <>c.<>9__34_0; if (obj == null) { hook_OnSkillActivated val = delegate(orig_OnSkillActivated orig, CharacterBody self, GenericSkill genericSkill) { if (!NetworkServer.active) { orig.Invoke(self, genericSkill); } else { GenericSkill val3 = self.skillLocator?.special; Inventory inventory = self.inventory; if (inventory != null && inventory.GetItemCount(myItemDef) > 0 && (Object)(object)val3 == (Object)(object)genericSkill) { Utilities.AddTimedBuff(self, myBuffDef, Duration.Value); Utilities.AddValueInDictionary(ref totalTimesActivated, self.master, 1f, totalTimesActivatedToken, checkMinionOwnership: false); } orig.Invoke(self, genericSkill); } }; <>c.<>9__34_0 = val; obj = (object)val; } CharacterBody.OnSkillActivated += (hook_OnSkillActivated)obj; object obj2 = <>O.<1>__RecalculateStatsAPI_GetStatCoefficients; if (obj2 == null) { StatHookEventHandler val2 = RecalculateStatsAPI_GetStatCoefficients; <>O.<1>__RecalculateStatsAPI_GetStatCoefficients = val2; obj2 = (object)val2; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj2; } private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody characterBody, StatHookEventArgs args) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) int? obj; if (characterBody == null) { obj = null; } else { Inventory inventory = characterBody.inventory; obj = ((inventory != null) ? new int?(inventory.GetItemCount(myItemDef.itemIndex)) : null); } int? num = obj; int valueOrDefault = num.GetValueOrDefault(); if (valueOrDefault > 0 && characterBody.HasBuff(myBuffDef)) { args.baseAttackSpeedAdd += ((valueOrDefault == 1) ? ((float)valueOrDefault * AttackSpeed.Value / 100f) : ((float)(valueOrDefault - 1) * AttackSpeed.Value / 100f / 2f + AttackSpeed.Value / 100f)); args.baseMoveSpeedAdd += ((valueOrDefault == 1) ? ((float)valueOrDefault * MoveSpeed.Value / 10f) : ((float)(valueOrDefault - 1) * MoveSpeed.Value / 10f / 2f + MoveSpeed.Value / 10f)); } } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myItemDef.descriptionToken), ""); } string text = ""; float value; return new ValueTuple<string, string>(item2: (!totalTimesActivated.TryGetValue(((NetworkBehaviour)masterRef).netId, out value)) ? (text + "<br><br>Times activated: 0") : (text + "<br><br>Times activated: " + $"{value:#, ##0.##}"), item1: Language.GetString(myItemDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("ExperimentalHexplate", "Experimental Hexplate"); LanguageAPI.Add("ExperimentalHexplateItem", "Using your Special skill temporarily increases your attack speed and movespeed."); LanguageAPI.Add("ExperimentalHexplateDesc", "Using your Special skill increases your attack speed by <style=cIsDamage>" + AttackSpeed.Value + "%</style> <style=cStack>(+ " + AttackSpeed.Value / 2f + "%)</style> and your movespeed by <style=cIsUtility>" + MoveSpeed.Value + "%</style> <style=cStack>(+ " + MoveSpeed.Value / 2f + "%)</style> for " + Duration.Value + " seconds."); LanguageAPI.Add("ExperimentalHexplateLore", "Was it wise to put on something this experimental? <br><br>Probably."); LanguageAPI.Add("ExperimentalHexplateBuff", "Experimental Hexplate"); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(totalTimesActivatedToken, totalTimesActivated); } } internal class GargoyleStoneplate { [CompilerGenerated] private static class <>O { public static Func<CharacterMaster, (string, string)> <0>__GetDisplayInformation; public static StatHookEventHandler <1>__RecalculateStatsAPI_GetStatCoefficients; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_PerformEquipmentAction <>9__31_0; internal bool <Hooks>b__31_0(orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) { if (NetworkServer.active && (Object)(object)equipmentDef == (Object)(object)myEquipmentDef) { return ActivateEquipment(self); } return orig.Invoke(self, equipmentDef); } } public static BuffDef gargoyleArmorBuff; public static EquipmentDef myEquipmentDef; public static Dictionary<NetworkInstanceId, float> totalBarrierGiven = new Dictionary<NetworkInstanceId, float>(); public static string totalBarrierGivenToken = "GargoyleStoneplate.totalBarrierGiven"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<EquipmentIcon, CharacterMaster> IconToMasterRef = new Dictionary<EquipmentIcon, CharacterMaster>(); public static uint activateSoundEffectID = 2213188569u; public static ConfigEntry<float> BarrierPercent { get; set; } public static ConfigEntry<float> BarrierCooldown { get; set; } public static ConfigEntry<float> ArmorDuration { get; set; } public static ConfigEntry<float> ArmorValue { get; set; } public static ConfigEntry<bool> Enabled { get; set; } internal static void Init() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); CreateBuff(); ContentAddition.AddBuffDef(gargoyleArmorBuff); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomEquipment(myEquipmentDef, val)); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, myEquipmentDef, GetDisplayInformation); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Gargoyle Stoneplate", "Enabled", true, "Determines if the item should be loaded by the game."); BarrierPercent = LoLItems.MyConfig.Bind<float>("Gargoyle Stoneplate", "Barrier Percentage", 60f, "Percent of barrier Gargoyle Stoneplate will grant you."); BarrierCooldown = LoLItems.MyConfig.Bind<float>("Gargoyle Stoneplate", "Barrier Cooldown", 60f, "Cooldown of the item."); ArmorDuration = LoLItems.MyConfig.Bind<float>("Gargoyle Stoneplate", "Armor Duration", 2f, "Duration of the armor buff."); ArmorValue = LoLItems.MyConfig.Bind<float>("Gargoyle Stoneplate", "Armor Value", 100f, "Armor value given during the buff."); } private static void CreateItem() { myEquipmentDef = ScriptableObject.CreateInstance<EquipmentDef>(); ((Object)myEquipmentDef).name = "GargoyleStoneplate"; myEquipmentDef.nameToken = "GargoyleStoneplate"; myEquipmentDef.pickupToken = "GargoyleStoneplateItem"; myEquipmentDef.descriptionToken = "GargoyleStoneplateDesc"; myEquipmentDef.loreToken = "GargoyleStoneplateLore"; myEquipmentDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("GargoyleStoneplateIcon"); myEquipmentDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("GargoyleStoneplatePrefab"); myEquipmentDef.canDrop = true; myEquipmentDef.appearsInMultiPlayer = true; myEquipmentDef.appearsInSinglePlayer = true; myEquipmentDef.canBeRandomlyTriggered = true; myEquipmentDef.enigmaCompatible = true; myEquipmentDef.cooldown = BarrierCooldown.Value; } private static void CreateBuff() { gargoyleArmorBuff = ScriptableObject.CreateInstance<BuffDef>(); gargoyleArmorBuff.iconSprite = MyAssets.icons.LoadAsset<Sprite>("GargoyleStoneplateIcon"); ((Object)gargoyleArmorBuff).name = "Gargoyle Stoneplate Armor Buff"; gargoyleArmorBuff.canStack = false; gargoyleArmorBuff.isDebuff = false; gargoyleArmorBuff.isCooldown = true; gargoyleArmorBuff.isHidden = false; } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //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 object obj = <>c.<>9__31_0; if (obj == null) { hook_PerformEquipmentAction val = (orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef) => (NetworkServer.active && (Object)(object)equipmentDef == (Object)(object)myEquipmentDef) ? ActivateEquipment(self) : orig.Invoke(self, equipmentDef); <>c.<>9__31_0 = val; obj = (object)val; } EquipmentSlot.PerformEquipmentAction += (hook_PerformEquipmentAction)obj; object obj2 = <>O.<1>__RecalculateStatsAPI_GetStatCoefficients; if (obj2 == null) { StatHookEventHandler val2 = RecalculateStatsAPI_GetStatCoefficients; <>O.<1>__RecalculateStatsAPI_GetStatCoefficients = val2; obj2 = (object)val2; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj2; } private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody characterBody, StatHookEventArgs args) { if (NetworkServer.active && characterBody.HasBuff(gargoyleArmorBuff)) { args.armorAdd += ArmorValue.Value; } } private static bool ActivateEquipment(EquipmentSlot slot) { float num = slot.characterBody.healthComponent.fullHealth * BarrierPercent.Value / 100f; if (num > slot.characterBody.healthComponent.fullHealth) { num = slot.characterBody.healthComponent.fullHealth; } slot.characterBody.healthComponent.AddBarrier(num); Utilities.AddTimedBuff(slot.characterBody, gargoyleArmorBuff, ArmorDuration.Value); Utilities.AddValueInDictionary(ref totalBarrierGiven, slot.characterBody.master, num, totalBarrierGivenToken, checkMinionOwnership: false); AkSoundEngine.PostEvent(activateSoundEffectID, ((Component)slot.characterBody).gameObject); return true; } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myEquipmentDef.descriptionToken), ""); } string text = ""; float value; return new ValueTuple<string, string>(item2: (!totalBarrierGiven.TryGetValue(((NetworkBehaviour)masterRef).netId, out value)) ? (text + "<br><br>Barrier given: 0") : (text + "<br><br>Barrier given: " + $"{value:#, ##0.##}"), item1: Language.GetString(myEquipmentDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("GargoyleStoneplate", "Gargoyle Stoneplate"); LanguageAPI.Add("GargoyleStoneplateItem", "Temporarily gain armor and a barrier based on your maximum health."); LanguageAPI.Add("GargoyleStoneplateDesc", $"Temporarily gain <style=cIsHealing>{ArmorValue.Value}</style> armor for <style=cIsUtility>{ArmorDuration.Value}s</style> and a barrier for <style=cIsHealing>{BarrierPercent.Value}%</style> of your maximum health."); LanguageAPI.Add("GargoyleStoneplateLore", "Whoever thought of breaking this off of a gargoyle's body and strapping it onto their own body was a genius."); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(totalBarrierGivenToken, totalBarrierGiven); } } internal class GuardiansBlade { [CompilerGenerated] private static class <>O { public static Func<CharacterMaster, (string, string)> <0>__GetDisplayInformation; public static StatHookEventHandler <1>__RecalculateStatsAPI_GetStatCoefficients; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_HandleInventoryChanged <>9__24_0; internal void <Hooks>b__24_0(orig_HandleInventoryChanged orig, Inventory self) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); int itemCount = self.GetItemCount(myItemDef.itemIndex); if (itemCount > 0) { float num = Math.Abs(Utilities.HyperbolicScale(itemCount, CooldownReduction.Value / 100f) - 1f); Utilities.SetValueInDictionary(ref cooldownReductionTracker, ((Component)self).GetComponentInParent<CharacterMaster>(), Math.Abs(num - 1f) * 100f, cooldownReductionTrackerToken, checkMinionOwnership: false); } } } public static ItemDef myItemDef; public static Dictionary<NetworkInstanceId, float> cooldownReductionTracker = new Dictionary<NetworkInstanceId, float>(); public static string cooldownReductionTrackerToken = "GuardiansBlade.cooldownReductionTracker"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static ConfigEntry<float> CooldownReduction { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "GuardiansBlade"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Guardians Blade", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Guardians Blade", "Rarity", "Tier1Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Guardians Blade", "Void Items", "", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); CooldownReduction = LoLItems.MyConfig.Bind<float>("Guardians Blade", "Cooldown Reduction", 10f, "Amount of cooldown reduction each item will grant."); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "GuardiansBlade"; myItemDef.nameToken = "GuardiansBlade"; myItemDef.pickupToken = "GuardiansBladeItem"; myItemDef.descriptionToken = "GuardiansBladeDesc"; myItemDef.loreToken = "GuardiansBladeLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("GuardiansBladeIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("GuardiansBladePrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 }; } private 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_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 object obj = <>O.<1>__RecalculateStatsAPI_GetStatCoefficients; if (obj == null) { StatHookEventHandler val = RecalculateStatsAPI_GetStatCoefficients; <>O.<1>__RecalculateStatsAPI_GetStatCoefficients = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; object obj2 = <>c.<>9__24_0; if (obj2 == null) { hook_HandleInventoryChanged val2 = delegate(orig_HandleInventoryChanged orig, Inventory self) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); int itemCount = self.GetItemCount(myItemDef.itemIndex); if (itemCount > 0) { float num = Math.Abs(Utilities.HyperbolicScale(itemCount, CooldownReduction.Value / 100f) - 1f); Utilities.SetValueInDictionary(ref cooldownReductionTracker, ((Component)self).GetComponentInParent<CharacterMaster>(), Math.Abs(num - 1f) * 100f, cooldownReductionTrackerToken, checkMinionOwnership: false); } }; <>c.<>9__24_0 = val2; obj2 = (object)val2; } Inventory.HandleInventoryChanged += (hook_HandleInventoryChanged)obj2; } private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody characterBody, StatHookEventArgs args) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) int? obj; if (characterBody == null) { obj = null; } else { Inventory inventory = characterBody.inventory; obj = ((inventory != null) ? new int?(inventory.GetItemCount(myItemDef.itemIndex)) : null); } int? num = obj; int valueOrDefault = num.GetValueOrDefault(); if (valueOrDefault > 0) { float num2 = Utilities.HyperbolicScale(valueOrDefault, CooldownReduction.Value / 100f); args.utilityCooldownMultAdd -= num2; args.secondaryCooldownMultAdd -= num2; } } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myItemDef.descriptionToken), ""); } string text = ""; float value; return new ValueTuple<string, string>(item2: (!cooldownReductionTracker.TryGetValue(((NetworkBehaviour)masterRef).netId, out value)) ? (text + "<br><br>Cooldown reduction: 0") : (text + "<br><br>Cooldown reduction: " + $"{value:F1}"), item1: Language.GetString(myItemDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("GuardiansBlade", "Guardian's Blade"); LanguageAPI.Add("GuardiansBladeItem", "Reduce the cooldown on secondary and utility skills."); LanguageAPI.Add("GuardiansBladeDesc", "Reduce the cooldown on your secondary and utility skills by <style=cIsUtility>" + CooldownReduction.Value + "%</style> <style=cStack>(+" + CooldownReduction.Value + ")</style>. Scales hyperbolically, just like tougher times."); LanguageAPI.Add("GuardiansBladeLore", "Awesome refund And movement."); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(cooldownReductionTrackerToken, cooldownReductionTracker); } } internal class GuinsoosRageblade { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnHitEnemy <>9__24_0; internal void <Hooks>b__24_0(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null))) { int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0 && damageInfo.procCoefficient > 0f) { float num = ProcCoef.Value * (float)itemCount; Utilities.SetValueInDictionary(ref totalProcCoef, component.master, num, totalProcCoefToken); damageInfo.procCoefficient += num; } } } orig.Invoke(self, damageInfo, victim); } } public static ItemDef myItemDef; public static Dictionary<NetworkInstanceId, float> totalProcCoef = new Dictionary<NetworkInstanceId, float>(); public static string totalProcCoefToken = "GuinsoosRageblade.totalProcCoef"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static ConfigEntry<float> ProcCoef { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "GuinsoosRageblade"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Guinsoos Rageblade", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Guinsoos Rageblade", "Rarity", "Tier2Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Guinsoos Rageblade", "Void Items", "", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); ProcCoef = LoLItems.MyConfig.Bind<float>("Guinsoos Rageblade", "ProcCoef", 0.1f, "Amount of profCoef each item will grant"); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "GuinsoosRageblade"; myItemDef.nameToken = "GuinsoosRageblade"; myItemDef.pickupToken = "GuinsoosRagebladeItem"; myItemDef.descriptionToken = "GuinsoosRagebladeDesc"; myItemDef.loreToken = "GuinsoosRagebladeLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("GuinsoosRagebladeIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("GuinsoosRagebladePrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 }; } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__24_0; if (obj == null) { hook_OnHitEnemy val = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null))) { int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0 && damageInfo.procCoefficient > 0f) { float num = ProcCoef.Value * (float)itemCount; Utilities.SetValueInDictionary(ref totalProcCoef, component.master, num, totalProcCoefToken); damageInfo.procCoefficient += num; } } } orig.Invoke(self, damageInfo, victim); }; <>c.<>9__24_0 = val; obj = (object)val; } GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj; } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myItemDef.descriptionToken), ""); } string text = ""; float value; return new ValueTuple<string, string>(item2: (!totalProcCoef.TryGetValue(((NetworkBehaviour)masterRef).netId, out value)) ? (text + "<br><br>Extra procCoef: 0") : (text + "<br><br>Extra procCoef: " + $"{value:F1}"), item1: Language.GetString(myItemDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("GuinsoosRageblade", "Guinsoo's Rageblade"); LanguageAPI.Add("GuinsoosRagebladeItem", "Increase proc coefficient of everything."); LanguageAPI.Add("GuinsoosRagebladeDesc", "Gives <style=cIsUtility>" + ProcCoef.Value + "</style> <style=cStack>(+" + ProcCoef.Value + ")</style> proc coefficient to everything."); LanguageAPI.Add("GuinsoosRagebladeLore", "Procs go brrrrrrr."); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(totalProcCoefToken, totalProcCoef); } } internal class Heartsteel { [CompilerGenerated] private static class <>O { public static Func<CharacterMaster, (string, string)> <0>__GetDisplayInformation; public static StatHookEventHandler <1>__RecalculateStatsAPI_GetStatCoefficients; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnCharacterDeath <>9__37_0; public static hook_OnHitEnemy <>9__37_1; internal void <Hooks>b__37_0(orig_OnCharacterDeath orig, GlobalEventManager globalEventManager, DamageReport damageReport) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: 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_0095: 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) //IL_00af: Expected O, but got Unknown orig.Invoke(globalEventManager, damageReport); GameObject val = null; Transform val2 = null; Vector3 origin = Vector3.zero; if (Object.op_Implicit((Object)(object)damageReport.victim)) { val = ((Component)damageReport.victim).gameObject; val2 = val.transform; origin = val2.position; } CharacterMaster attackerMaster = damageReport.attackerMaster; if ((Object)(object)((attackerMaster != null) ? attackerMaster.inventory : null) != (Object)null) { int itemCount = damageReport.attackerMaster.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0) { InfusionOrb val3 = new InfusionOrb { origin = origin, target = Util.FindBodyMainHurtBox(damageReport.attackerBody), maxHpValue = 0 }; OrbManager.instance.AddOrb((Orb)(object)val3); Utilities.AddValueInDictionary(ref heartsteelHealth, damageReport.attackerMaster, BonusHealthAmount.Value * (float)itemCount, heartsteelHealthToken, checkMinionOwnership: false); } } } internal void <Hooks>b__37_1(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0069: 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) //IL_0113: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); if (!Object.op_Implicit((Object)(object)damageInfo.attacker) || !(damageInfo.procCoefficient > 0f)) { return; } CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null))) { int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0 && !component.HasBuff(myTimerBuffDef)) { component.healthComponent.body.AddTimedBuff(myTimerBuffDef, DamageCooldown.Value); float num = component.healthComponent.fullHealth * (float)itemCount * DamageBonus.Value / 100f * damageInfo.procCoefficient; damageInfo.procCoefficient = 1f; damageInfo.damageType = DamageTypeCombo.op_Implicit((DamageType)0); damageInfo.inflictor = damageInfo.attacker; damageInfo.damage = num; damageInfo.damageColorIndex = (DamageColorIndex)3; component2.healthComponent.TakeDamage(damageInfo); Utilities.AddValueInDictionary(ref heartsteelBonusDamage, component.master, num, heartsteelBonusDamageToken, checkMinionOwnership: false); AkSoundEngine.PostEvent(triggerSoundEffectID, damageInfo.attacker.gameObject); } } } } public static ItemDef myItemDef; public static BuffDef myTimerBuffDef; public static Dictionary<NetworkInstanceId, float> heartsteelHealth = new Dictionary<NetworkInstanceId, float>(); public static string heartsteelHealthToken = "Heartsteel.heartsteelHealth"; public static Dictionary<NetworkInstanceId, float> heartsteelBonusDamage = new Dictionary<NetworkInstanceId, float>(); public static string heartsteelBonusDamageToken = "Heartsteel.heartsteelBonusDamage"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static uint triggerSoundEffectID = 3202319100u; public static ConfigEntry<float> BonusHealthAmount { get; set; } public static ConfigEntry<float> DamageCooldown { get; set; } public static ConfigEntry<float> DamageBonus { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); CreateBuff(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); ContentAddition.AddBuffDef(myTimerBuffDef); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "Heartsteel"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Heartsteel", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Heartsteel", "Rarity", "Tier3Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Heartsteel", "Void Items", "", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); BonusHealthAmount = LoLItems.MyConfig.Bind<float>("Heartsteel", "Health Per Kill", 2f, "Amount of health per kill each item will grant."); DamageCooldown = LoLItems.MyConfig.Bind<float>("Heartsteel", "Damage Cooldown", 10f, "The cooldown of the damage proc."); DamageBonus = LoLItems.MyConfig.Bind<float>("Heartsteel", "Bonus Damage Percent", 50f, "The percentage of your health that will be dealt as damage."); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "Heartsteel"; myItemDef.nameToken = "Heartsteel"; myItemDef.pickupToken = "HeartsteelItem"; myItemDef.descriptionToken = "HeartsteelDesc"; myItemDef.loreToken = "HeartsteelLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("HeartsteelIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("HeartsteelPrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[2] { (ItemTag)2, (ItemTag)6 }; } private static void CreateBuff() { //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) myTimerBuffDef = ScriptableObject.CreateInstance<BuffDef>(); myTimerBuffDef.iconSprite = MyAssets.icons.LoadAsset<Sprite>("HeartsteelIcon"); ((Object)myTimerBuffDef).name = "Heartsteel Timer Debuff"; myTimerBuffDef.canStack = false; myTimerBuffDef.isDebuff = true; myTimerBuffDef.isCooldown = true; myTimerBuffDef.isHidden = false; myTimerBuffDef.buffColor = Color.grey; } private static void Hooks() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_005b: 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_0066: Expected O, but got Unknown object obj = <>c.<>9__37_0; if (obj == null) { hook_OnCharacterDeath val = delegate(orig_OnCharacterDeath orig, GlobalEventManager globalEventManager, DamageReport damageReport) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: 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_0095: 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) //IL_00af: Expected O, but got Unknown orig.Invoke(globalEventManager, damageReport); GameObject val4 = null; Transform val5 = null; Vector3 origin = Vector3.zero; if (Object.op_Implicit((Object)(object)damageReport.victim)) { val4 = ((Component)damageReport.victim).gameObject; val5 = val4.transform; origin = val5.position; } CharacterMaster attackerMaster = damageReport.attackerMaster; if ((Object)(object)((attackerMaster != null) ? attackerMaster.inventory : null) != (Object)null) { int itemCount2 = damageReport.attackerMaster.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount2 > 0) { InfusionOrb val6 = new InfusionOrb { origin = origin, target = Util.FindBodyMainHurtBox(damageReport.attackerBody), maxHpValue = 0 }; OrbManager.instance.AddOrb((Orb)(object)val6); Utilities.AddValueInDictionary(ref heartsteelHealth, damageReport.attackerMaster, BonusHealthAmount.Value * (float)itemCount2, heartsteelHealthToken, checkMinionOwnership: false); } } }; <>c.<>9__37_0 = val; obj = (object)val; } GlobalEventManager.OnCharacterDeath += (hook_OnCharacterDeath)obj; object obj2 = <>c.<>9__37_1; if (obj2 == null) { hook_OnHitEnemy val2 = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim) { //IL_0069: 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) //IL_0113: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, damageInfo, victim); if (Object.op_Implicit((Object)(object)damageInfo.attacker) && damageInfo.procCoefficient > 0f) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); CharacterBody component2 = victim.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null))) { int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex); if (itemCount > 0 && !component.HasBuff(myTimerBuffDef)) { component.healthComponent.body.AddTimedBuff(myTimerBuffDef, DamageCooldown.Value); float num = component.healthComponent.fullHealth * (float)itemCount * DamageBonus.Value / 100f * damageInfo.procCoefficient; damageInfo.procCoefficient = 1f; damageInfo.damageType = DamageTypeCombo.op_Implicit((DamageType)0); damageInfo.inflictor = damageInfo.attacker; damageInfo.damage = num; damageInfo.damageColorIndex = (DamageColorIndex)3; component2.healthComponent.TakeDamage(damageInfo); Utilities.AddValueInDictionary(ref heartsteelBonusDamage, component.master, num, heartsteelBonusDamageToken, checkMinionOwnership: false); AkSoundEngine.PostEvent(triggerSoundEffectID, damageInfo.attacker.gameObject); } } } }; <>c.<>9__37_1 = val2; obj2 = (object)val2; } GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj2; object obj3 = <>O.<1>__RecalculateStatsAPI_GetStatCoefficients; if (obj3 == null) { StatHookEventHandler val3 = RecalculateStatsAPI_GetStatCoefficients; <>O.<1>__RecalculateStatsAPI_GetStatCoefficients = val3; obj3 = (object)val3; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj3; } private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody characterBody, StatHookEventArgs args) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) CharacterMaster master = characterBody.master; if (master != null) { _ = ((NetworkBehaviour)master).netId; if (true && heartsteelHealth.TryGetValue(((NetworkBehaviour)characterBody.master).netId, out var value)) { args.baseHealthAdd += value; } } } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)masterRef == (Object)null) { return (Language.GetString(myItemDef.descriptionToken), ""); } string text = ""; text = ((!heartsteelHealth.TryGetValue(((NetworkBehaviour)masterRef).netId, out var value)) ? (text + "<br><br>Health gained: 0") : (text + "<br><br>Health gained: " + $"{value:#, ##0.##}")); float value2; return new ValueTuple<string, string>(item2: (!heartsteelBonusDamage.TryGetValue(((NetworkBehaviour)masterRef).netId, out value2)) ? (text + "<br>Damage dealt: 0") : (text + "<br>Damage dealt: " + $"{value2:#, ##0.##}"), item1: Language.GetString(myItemDef.descriptionToken)); } private static void AddTokens() { LanguageAPI.Add("Heartsteel", "Heartsteel"); LanguageAPI.Add("HeartsteelItem", "Gain permanent health on kill with no cap. Every few seconds deal a portion of your health as extra damage on hit."); LanguageAPI.Add("HeartsteelDesc", "Adds <style=cIsHealth>" + BonusHealthAmount.Value + "</style> <style=cStack>(+" + BonusHealthAmount.Value + ")</style> base health per kill with no cap. Every <style=cIsUtility>" + DamageCooldown.Value + "</style> seconds deal <style=cIsDamage>" + DamageBonus.Value + "%</style> of your max health as damage on hit."); LanguageAPI.Add("HeartsteelLore", "Lore was meant to go here, but Sion trampled it."); } public static void SetupNetworkMappings() { LoLItems.networkMappings.Add(heartsteelBonusDamageToken, heartsteelBonusDamage); LoLItems.networkMappings.Add(heartsteelHealthToken, heartsteelHealth); } } internal class ImmortalShieldbow { [CompilerGenerated] private static class <>O { public static Func<CharacterMaster, (string, string)> <0>__GetDisplayInformation; public static StatHookEventHandler <1>__RecalculateStatsAPI_GetStatCoefficients; } public static ItemDef myItemDef; public static BuffDef myBuffDefCooldown; public static Dictionary<NetworkInstanceId, float> totalShieldGiven = new Dictionary<NetworkInstanceId, float>(); public static string totalShieldGivenToken = "ImmortalShieldbow.totalShieldGiven"; public static Dictionary<ItemInventoryDisplay, CharacterMaster> DisplayToMasterRef = new Dictionary<ItemInventoryDisplay, CharacterMaster>(); public static Dictionary<ItemIcon, CharacterMaster> IconToMasterRef = new Dictionary<ItemIcon, CharacterMaster>(); public static uint procSoundEffect = 2060112413u; public static ConfigEntry<float> BarrierPercent { get; set; } public static ConfigEntry<float> BuffCooldown { get; set; } public static ConfigEntry<float> BarrierThreshold { get; set; } public static ConfigEntry<bool> Enabled { get; set; } public static ConfigEntry<string> Rarity { get; set; } public static ConfigEntry<string> VoidItems { get; set; } internal static void Init() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown LoadConfig(); if (Enabled.Value) { CreateItem(); CreateBuff(); AddTokens(); ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null); ItemAPI.Add(new CustomItem(myItemDef, val)); ContentAddition.AddBuffDef(myBuffDefCooldown); Hooks(); Utilities.SetupReadOnlyHooks(DisplayToMasterRef, IconToMasterRef, myItemDef, GetDisplayInformation, Rarity, VoidItems, "ImmortalShieldbow"); SetupNetworkMappings(); } } private static void LoadConfig() { Enabled = LoLItems.MyConfig.Bind<bool>("Immortal Shieldbow", "Enabled", true, "Determines if the item should be loaded by the game."); Rarity = LoLItems.MyConfig.Bind<string>("Immortal Shieldbow", "Rarity", "Tier2Def", "Set the rarity of the item. Valid values: Tier1Def, Tier2Def, Tier3Def, VoidTier1Def, VoidTier2Def, and VoidTier3Def."); VoidItems = LoLItems.MyConfig.Bind<string>("Immortal Shieldbow", "Void Items", "", "Set regular items to convert into this void item (Only if the rarity is set as a void tier). Items should be separated by a comma, no spaces. The item should be the in game item ID, which may differ from the item name."); BarrierPercent = LoLItems.MyConfig.Bind<float>("Immortal Shieldbow", "Barrier Percent", 40f, "Amount of percent max health barrier each item will grant."); BuffCooldown = LoLItems.MyConfig.Bind<float>("Immortal Shieldbow", "Cooldown", 40f, "Cooldown of the barrier."); BarrierThreshold = LoLItems.MyConfig.Bind<float>("Immortal Shieldbow", "Health Threshold", 30f, "Health threshold to trigger the barrier."); } private static void CreateItem() { //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) myItemDef = ScriptableObject.CreateInstance<ItemDef>(); ((Object)myItemDef).name = "ImmortalShieldbow"; myItemDef.nameToken = "ImmortalShieldbow"; myItemDef.pickupToken = "ImmortalShieldbowItem"; myItemDef.descriptionToken = "ImmortalShieldbowDesc"; myItemDef.loreToken = "ImmortalShieldbowLore"; myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)Utilities.GetRarityFromString(Rarity.Value)).WaitForCompletion(); myItemDef.pickupIconSprite = MyAssets.icons.LoadAsset<Sprite>("ImmortalShieldbowIcon"); myItemDef.pickupModelPrefab = MyAssets.prefabs.LoadAsset<GameObject>("ImmortalShieldbowPrefab"); myItemDef.canRemove = true; myItemDef.hidden = false; myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)2 }; } private static void CreateBuff() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) myBuffDefCooldown = ScriptableObject.CreateInstance<BuffDef>(); myBuffDefCooldown.iconSprite = MyAssets.icons.LoadAsset<Sprite>("ImmortalShieldbowIcon"); ((Object)myBuffDefCooldown).name = "Immortal Shieldbow Cooldown"; myBuffDefCooldown.buffColor = Color.gray; myBuffDefCooldown.canStack = false; myBuffDefCooldown.isDebuff = true; myBuffDefCooldown.isCooldown = true; myBuffDefCooldown.isHidden = false; } private 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.<1>__RecalculateStatsAPI_GetStatCoefficients; if (obj == null) { StatHookEventHandler val = RecalculateStatsAPI_GetStatCoefficients; <>O.<1>__RecalculateStatsAPI_GetStatCoefficients = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; } private static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody characterBody, StatHookEventArgs args) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) int? obj; if (characterBody == null) { obj = null; } else { Inventory inventory = characterBody.inventory; obj = ((inventory != null) ? new int?(inventory.GetItemCount(myItemDef.itemIndex)) : null); } int? num = obj; int valueOrDefault = num.GetValueOrDefault(); if (valueOrDefault <= 0) { return; } float? num2 = characterBody.healthComponent?.health; HealthComponent healthComponent = characterBody.healthComponent; if (!(num2 < ((healthComponent != null) ? new float?(healthComponent.fullHealth) : null) * BarrierThreshold.Value / 100f) || characterBody.HasBuff(myBuffDefCooldown)) { return; } AkSoundEngine.PostEvent(procSoundEffect, ((Component)characterBody).gameObject); if (NetworkServer.active) { float num3 = characterBody.healthComponent.fullHealth * BarrierPercent.Value / 100f * (float)valueOrDefault; if (num3 > characterBody.healthComponent.fullHealth) { num3 = characterBody.healthComponent.fullHealth; } characterBody.healthComponent.AddBarrier(num3); Utilities.AddTimedBuff(characterBody, myBuffDefCooldown, BuffCooldown.Value); Utilities.AddValueInDictionary(ref totalShieldGiven, characterBody.master, num3, totalShieldGivenToken, checkMinionOwnership: false); } } private static (string, string) GetDisplayInformation(CharacterMaster masterRef) { //IL_0034: Unknown re