Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Vikings Summoner v1.4.4
plugins/Vikings_Summoner.dll
Decompiled a week ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using AzuEPI; using AzuEPI.Core.Slots; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HarmonyLib; using ItemManager; using JetBrains.Annotations; using LocalizationManager; using Microsoft.CodeAnalysis; using PieceManager; using ServerSync; using Splatform; using StatusEffectManager; using TMPro; using UnityEngine; using UnityEngine.UI; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.ObjectPool; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Callbacks; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: Guid("E74EB49A-461D-48EA-85BC-F462D60C98C4")] [assembly: ComVisible(false)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyProduct("Vikings_Summoner")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("Vikings_Summoner")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyFileVersion("1.4.4")] [assembly: AssemblyCompany("Radamanto")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.4.4.0")] [module: <0f5dda22-adc4-4eb7-9dec-383820a7c9a5>RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<944d4903-c032-4390-9b7e-e5d8660b6277>Embedded] internal sealed class <944d4903-c032-4390-9b7e-e5d8660b6277>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<944d4903-c032-4390-9b7e-e5d8660b6277>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<944d4903-c032-4390-9b7e-e5d8660b6277>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContextAttribute : Attribute { public readonly byte Flag; public <d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContextAttribute(byte P_0) { Flag = P_0; } } [<944d4903-c032-4390-9b7e-e5d8660b6277>Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [CompilerGenerated] internal sealed class <0f5dda22-adc4-4eb7-9dec-383820a7c9a5>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <0f5dda22-adc4-4eb7-9dec-383820a7c9a5>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Vikings_Summoner { internal static class Registrations_Grimories { public static void RegisterGrimories() { Item item = new Item("rd_armor", "RD_grimoire_01"); item.Configurable = Configurability.Recipe; item.Crafting.Add("RD_necromancer_table", 1); item.RequiredItems.Add("DeerHide", 20); item.RequiredItems.Add("LeatherScraps", 10); item.RequiredItems.Add("Feathers", 15); item.RequiredItems.Add("GreydwarfEye", 10); MaterialReplacer.RegisterGameObjectForShaderSwap(item.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item2 = new Item("rd_armor", "RD_grimoire_summons_01"); item2.Configurable = Configurability.Recipe; item2.Crafting.Add("RD_necromancer_table", 1); item2.RequiredItems.Add("TrophyAbomination", 1); item2.RequiredItems.Add("DeerHide", 20); item2.RequiredItems.Add("Iron", 2); item2.RequiredItems.Add("Guck", 15); MaterialReplacer.RegisterGameObjectForShaderSwap(item2.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item3 = new Item("rd_armor", "RD_grimoire_02"); item3.Configurable = Configurability.Recipe; item3.Crafting.Add("RD_necromancer_table", 1); item3.RequiredItems.Add("WolfPelt", 10); item3.RequiredItems.Add("WolfFang", 4); item3.RequiredItems.Add("Crystal", 5); item3.RequiredItems.Add("Resin", 15); MaterialReplacer.RegisterGameObjectForShaderSwap(item3.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item4 = new Item("rd_armor", "RD_grimoire_summons_02"); item4.Configurable = Configurability.Recipe; item4.Crafting.Add("RD_necromancer_table_02", 1); item4.RequiredItems.Add("TrophyGoblinShaman", 1); item4.RequiredItems.Add("LoxPelt", 20); item4.RequiredItems.Add("BlackMetal", 2); item4.RequiredItems.Add("Tar", 15); MaterialReplacer.RegisterGameObjectForShaderSwap(item4.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item5 = new Item("rd_armor", "RD_grimoire_03"); item5.Configurable = Configurability.Recipe; item5.Crafting.Add("RD_necromancer_table_02", 1); item5.RequiredItems.Add("YmirRemains", 10); item5.RequiredItems.Add("DeerHide", 20); item5.RequiredItems.Add("BlackCore", 5); item5.RequiredItems.Add("Eitr", 15); MaterialReplacer.RegisterGameObjectForShaderSwap(item5.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item6 = new Item("rd_armor", "RD_grimoire_summons_03"); item6.Configurable = Configurability.Recipe; item6.Crafting.Add("RD_necromancer_table_02", 1); item6.RequiredItems.Add("TrophyCharredMage", 1); item6.RequiredItems.Add("AskHide", 10); item6.RequiredItems.Add("FlametalNew", 2); item6.RequiredItems.Add("CelestialFeather", 5); MaterialReplacer.RegisterGameObjectForShaderSwap(item6.Prefab, MaterialReplacer.ShaderType.UseUnityShader); } } internal static class Registrations_Armors { public static void RegisterArmors() { Item item = new Item("rd_armor", "RD_inv_chest_meadows"); item.Configurable = Configurability.Recipe | Configurability.Stats; item.Crafting.Add("RD_necromancer_table", 1); item.RequiredItems.Add("DeerHide", 10); item.RequiredItems.Add("LeatherScraps", 10); item.RequiredUpgradeItems.Add("DeerHide", 2); item.RequiredUpgradeItems.Add("LeatherScraps", 2); item.RequiredUpgradeItems.Add("BoneFragments", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item2 = new Item("rd_armor", "RD_inv_helmet_meadows"); item2.Configurable = Configurability.Recipe | Configurability.Stats; item2.Crafting.Add("RD_necromancer_table", 1); item2.RequiredItems.Add("DeerHide", 4); item2.RequiredItems.Add("LeatherScraps", 4); item2.RequiredUpgradeItems.Add("DeerHide", 2); item2.RequiredUpgradeItems.Add("LeatherScraps", 2); item2.RequiredUpgradeItems.Add("BoneFragments", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item2.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item3 = new Item("rd_armor", "RD_inv_legs_meadows"); item3.Configurable = Configurability.Recipe | Configurability.Stats; item3.Crafting.Add("RD_necromancer_table", 1); item3.RequiredItems.Add("DeerHide", 8); item3.RequiredItems.Add("LeatherScraps", 8); item3.RequiredUpgradeItems.Add("DeerHide", 2); item3.RequiredUpgradeItems.Add("LeatherScraps", 2); item3.RequiredUpgradeItems.Add("BoneFragments", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item3.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item4 = new Item("rd_armor", "RD_inv_cape_meadows"); item4.Configurable = Configurability.Recipe | Configurability.Stats; item4.Crafting.Add("RD_necromancer_table", 1); item4.RequiredItems.Add("DeerHide", 6); item4.RequiredItems.Add("LeatherScraps", 6); item4.RequiredUpgradeItems.Add("DeerHide", 2); item4.RequiredUpgradeItems.Add("LeatherScraps", 2); item4.RequiredUpgradeItems.Add("BoneFragments", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item4.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item5 = new Item("rd_armor", "RD_inv_helmet_bforest"); item5.Configurable = Configurability.Recipe | Configurability.Stats; item5.Crafting.Add("RD_necromancer_table", 1); item5.RequiredItems.Add("TrollHide", 4); item5.RequiredItems.Add("BoneFragments", 6); item5.RequiredItems.Add("Bronze", 5); item5.RequiredUpgradeItems.Add("TrollHide", 1); item5.RequiredUpgradeItems.Add("BoneFragments", 2); item5.RequiredUpgradeItems.Add("Bronze", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item5.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item6 = new Item("rd_armor", "RD_inv_chest_bforest"); item6.Configurable = Configurability.Recipe | Configurability.Stats; item6.Crafting.Add("RD_necromancer_table", 1); item6.RequiredItems.Add("TrollHide", 4); item6.RequiredItems.Add("BoneFragments", 8); item6.RequiredItems.Add("Bronze", 5); item6.RequiredUpgradeItems.Add("TrollHide", 1); item6.RequiredUpgradeItems.Add("BoneFragments", 3); item6.RequiredUpgradeItems.Add("Bronze", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item6.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item7 = new Item("rd_armor", "RD_inv_legs_bforest"); item7.Configurable = Configurability.Recipe | Configurability.Stats; item7.Crafting.Add("RD_necromancer_table", 1); item7.RequiredItems.Add("TrollHide", 4); item7.RequiredItems.Add("BoneFragments", 6); item7.RequiredItems.Add("Bronze", 5); item7.RequiredUpgradeItems.Add("TrollHide", 1); item7.RequiredUpgradeItems.Add("BoneFragments", 4); item7.RequiredUpgradeItems.Add("Bronze", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item7.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item8 = new Item("rd_armor", "RD_inv_cape_bforest"); item8.Configurable = Configurability.Recipe | Configurability.Stats; item8.Crafting.Add("RD_necromancer_table", 1); item8.RequiredItems.Add("TrollHide", 2); item8.RequiredItems.Add("BoneFragments", 4); item8.RequiredItems.Add("Bronze", 2); item8.RequiredUpgradeItems.Add("TrollHide", 1); item8.RequiredUpgradeItems.Add("BoneFragments", 2); item8.RequiredUpgradeItems.Add("Bronze", 1); MaterialReplacer.RegisterGameObjectForShaderSwap(item8.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item9 = new Item("rd_armor", "RD_inv_helmet_swamp"); item9.Configurable = Configurability.Recipe | Configurability.Stats; item9.Crafting.Add("RD_necromancer_table", 2); item9.RequiredItems.Add("Iron", 10); item9.RequiredItems.Add("ElderBark", 10); item9.RequiredItems.Add("Entrails", 6); item9.RequiredUpgradeItems.Add("Iron", 2); item9.RequiredUpgradeItems.Add("ElderBark", 6); item9.RequiredUpgradeItems.Add("Entrails", 3); MaterialReplacer.RegisterGameObjectForShaderSwap(item9.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item10 = new Item("rd_armor", "RD_inv_chest_swamp"); item10.Configurable = Configurability.Recipe | Configurability.Stats; item10.Crafting.Add("RD_necromancer_table", 2); item10.RequiredItems.Add("Iron", 12); item10.RequiredItems.Add("ElderBark", 8); item10.RequiredItems.Add("Entrails", 8); item10.RequiredUpgradeItems.Add("Iron", 3); item10.RequiredUpgradeItems.Add("ElderBark", 4); item10.RequiredUpgradeItems.Add("Entrails", 4); MaterialReplacer.RegisterGameObjectForShaderSwap(item10.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item11 = new Item("rd_armor", "RD_inv_legs_swamp"); item11.Configurable = Configurability.Recipe | Configurability.Stats; item11.Crafting.Add("RD_necromancer_table", 2); item11.RequiredItems.Add("Iron", 12); item11.RequiredItems.Add("ElderBark", 8); item11.RequiredItems.Add("Entrails", 8); item11.RequiredUpgradeItems.Add("Iron", 3); item11.RequiredUpgradeItems.Add("ElderBark", 4); item11.RequiredUpgradeItems.Add("Entrails", 4); MaterialReplacer.RegisterGameObjectForShaderSwap(item11.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item12 = new Item("rd_armor", "RD_inv_cape_swamp"); item12.Configurable = Configurability.Recipe | Configurability.Stats; item12.Crafting.Add("RD_necromancer_table", 2); item12.RequiredItems.Add("ElderBark", 4); item12.RequiredItems.Add("Entrails", 6); item12.RequiredUpgradeItems.Add("ElderBark", 2); item12.RequiredUpgradeItems.Add("Entrails", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item12.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item13 = new Item("rd_armor", "RD_inv_helmet_mountain"); item13.Configurable = Configurability.Recipe | Configurability.Stats; item13.Crafting.Add("RD_necromancer_table", 2); item13.RequiredItems.Add("WolfFang", 3); item13.RequiredItems.Add("WolfPelt", 10); item13.RequiredItems.Add("FreezeGland", 6); item13.RequiredItems.Add("TrollHide", 6); item13.RequiredUpgradeItems.Add("WolfPelt", 6); item13.RequiredUpgradeItems.Add("FreezeGland", 2); item13.RequiredUpgradeItems.Add("TrollHide", 4); MaterialReplacer.RegisterGameObjectForShaderSwap(item13.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item14 = new Item("rd_armor", "RD_inv_chest_mountain"); item14.Configurable = Configurability.Recipe | Configurability.Stats; item14.Crafting.Add("RD_necromancer_table", 2); item14.RequiredItems.Add("WolfClaw", 3); item14.RequiredItems.Add("WolfPelt", 14); item14.RequiredItems.Add("Silver", 18); item14.RequiredItems.Add("DeerHide", 12); item14.RequiredUpgradeItems.Add("WolfPelt", 6); item14.RequiredUpgradeItems.Add("Silver", 8); item14.RequiredUpgradeItems.Add("DeerHide", 6); MaterialReplacer.RegisterGameObjectForShaderSwap(item14.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item15 = new Item("rd_armor", "RD_inv_legs_mountain"); item15.Configurable = Configurability.Recipe | Configurability.Stats; item15.Crafting.Add("RD_necromancer_table", 2); item15.RequiredItems.Add("WolfClaw", 3); item15.RequiredItems.Add("WolfPelt", 12); item15.RequiredItems.Add("Silver", 24); item15.RequiredItems.Add("DeerHide", 16); item15.RequiredUpgradeItems.Add("WolfPelt", 6); item15.RequiredUpgradeItems.Add("Silver", 12); item15.RequiredUpgradeItems.Add("DeerHide", 8); MaterialReplacer.RegisterGameObjectForShaderSwap(item15.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item16 = new Item("rd_armor", "RD_inv_cape_mountain"); item16.Configurable = Configurability.Recipe | Configurability.Stats; item16.Crafting.Add("RD_necromancer_table", 2); item16.RequiredItems.Add("WolfPelt", 12); item16.RequiredItems.Add("Silver", 6); item16.RequiredItems.Add("FreezeGland", 6); item16.RequiredUpgradeItems.Add("WolfPelt", 6); item16.RequiredUpgradeItems.Add("Silver", 4); item16.RequiredUpgradeItems.Add("FreezeGland", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item16.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item17 = new Item("rd_armor", "RD_inv_helmet_plains"); item17.Configurable = Configurability.Recipe | Configurability.Stats; item17.Crafting.Add("RD_necromancer_table_02", 1); item17.RequiredItems.Add("BlackMetal", 16); item17.RequiredItems.Add("LoxPelt", 8); item17.RequiredItems.Add("LinenThread", 6); item17.RequiredItems.Add("JuteRed", 4); item17.RequiredUpgradeItems.Add("BlackMetal", 8); item17.RequiredUpgradeItems.Add("LoxPelt", 4); item17.RequiredUpgradeItems.Add("LinenThread", 3); item17.RequiredUpgradeItems.Add("JuteRed", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item17.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item18 = new Item("rd_armor", "RD_inv_chest_plains"); item18.Configurable = Configurability.Recipe | Configurability.Stats; item18.Crafting.Add("RD_necromancer_table_02", 1); item18.RequiredItems.Add("BlackMetal", 24); item18.RequiredItems.Add("LoxPelt", 12); item18.RequiredItems.Add("LinenThread", 12); item18.RequiredItems.Add("JuteRed", 4); item18.RequiredUpgradeItems.Add("BlackMetal", 12); item18.RequiredUpgradeItems.Add("LoxPelt", 6); item18.RequiredUpgradeItems.Add("LinenThread", 6); item18.RequiredUpgradeItems.Add("JuteRed", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item18.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item19 = new Item("rd_armor", "RD_inv_legs_plains"); item19.Configurable = Configurability.Recipe | Configurability.Stats; item19.Crafting.Add("RD_necromancer_table_02", 1); item19.RequiredItems.Add("BlackMetal", 24); item19.RequiredItems.Add("LoxPelt", 12); item19.RequiredItems.Add("LinenThread", 12); item19.RequiredItems.Add("JuteRed", 4); item19.RequiredUpgradeItems.Add("BlackMetal", 12); item19.RequiredUpgradeItems.Add("LoxPelt", 6); item19.RequiredUpgradeItems.Add("LinenThread", 6); item19.RequiredUpgradeItems.Add("JuteRed", 2); MaterialReplacer.RegisterGameObjectForShaderSwap(item19.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item20 = new Item("rd_armor", "RD_inv_cape_plains"); item20.Configurable = Configurability.Recipe | Configurability.Stats; item20.Crafting.Add("RD_necromancer_table_02", 1); item20.RequiredItems.Add("BlackMetal", 8); item20.RequiredItems.Add("LoxPelt", 6); item20.RequiredItems.Add("LinenThread", 8); item20.RequiredItems.Add("JuteRed", 2); item20.RequiredUpgradeItems.Add("BlackMetal", 4); item20.RequiredUpgradeItems.Add("LoxPelt", 2); item20.RequiredUpgradeItems.Add("LinenThread", 4); item20.RequiredUpgradeItems.Add("JuteRed", 1); MaterialReplacer.RegisterGameObjectForShaderSwap(item20.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item21 = new Item("rd_armor", "RD_inv_helmet_mistlands"); item21.Configurable = Configurability.Recipe | Configurability.Stats; item21.Crafting.Add("RD_necromancer_table_02", 1); item21.RequiredItems.Add("LinenThread", 16); item21.RequiredItems.Add("ScaleHide", 12); item21.RequiredItems.Add("Carapace", 8); item21.RequiredItems.Add("Eitr", 14); item21.RequiredUpgradeItems.Add("ScaleHide", 6); item21.RequiredUpgradeItems.Add("Carapace", 4); item21.RequiredUpgradeItems.Add("Eitr", 8); MaterialReplacer.RegisterGameObjectForShaderSwap(item21.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item22 = new Item("rd_armor", "RD_inv_chest_mistlands"); item22.Configurable = Configurability.Recipe | Configurability.Stats; item22.Crafting.Add("RD_necromancer_table_02", 1); item22.RequiredItems.Add("Mandible", 8); item22.RequiredItems.Add("ScaleHide", 18); item22.RequiredItems.Add("Carapace", 16); item22.RequiredItems.Add("Eitr", 22); item22.RequiredUpgradeItems.Add("ScaleHide", 9); item22.RequiredUpgradeItems.Add("Carapace", 8); item22.RequiredUpgradeItems.Add("Eitr", 11); MaterialReplacer.RegisterGameObjectForShaderSwap(item22.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item23 = new Item("rd_armor", "RD_inv_legs_mistlands"); item23.Configurable = Configurability.Recipe | Configurability.Stats; item23.Crafting.Add("RD_necromancer_table_02", 1); item23.RequiredItems.Add("Mandible", 8); item23.RequiredItems.Add("ScaleHide", 18); item23.RequiredItems.Add("Carapace", 16); item23.RequiredItems.Add("Eitr", 22); item23.RequiredUpgradeItems.Add("ScaleHide", 9); item23.RequiredUpgradeItems.Add("Carapace", 8); item23.RequiredUpgradeItems.Add("Eitr", 11); MaterialReplacer.RegisterGameObjectForShaderSwap(item23.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item24 = new Item("rd_armor", "RD_inv_cape_mistlands"); item24.Configurable = Configurability.Recipe | Configurability.Stats; item24.Crafting.Add("RD_necromancer_table_02", 1); item24.RequiredItems.Add("Mandible", 2); item24.RequiredItems.Add("ScaleHide", 8); item24.RequiredItems.Add("Carapace", 8); item24.RequiredItems.Add("Eitr", 12); item24.RequiredUpgradeItems.Add("ScaleHide", 4); item24.RequiredUpgradeItems.Add("Carapace", 4); item24.RequiredUpgradeItems.Add("Eitr", 6); MaterialReplacer.RegisterGameObjectForShaderSwap(item24.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item25 = new Item("rd_armor", "RD_inv_helmet_ashlands"); item25.Configurable = Configurability.Recipe | Configurability.Stats; item25.Crafting.Add("RD_necromancer_table_02", 1); item25.RequiredItems.Add("GemstoneRed", 1); item25.RequiredItems.Add("AskHide", 8); item25.RequiredItems.Add("CelestialFeather", 4); item25.RequiredItems.Add("FlametalNew", 8); item25.RequiredUpgradeItems.Add("AskHide", 4); item25.RequiredUpgradeItems.Add("CelestialFeather", 2); item25.RequiredUpgradeItems.Add("FlametalNew", 4); MaterialReplacer.RegisterGameObjectForShaderSwap(item25.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item26 = new Item("rd_armor", "RD_inv_chest_ashlands"); item26.Configurable = Configurability.Recipe | Configurability.Stats; item26.Crafting.Add("RD_necromancer_table_02", 1); item26.RequiredItems.Add("GemstoneRed", 1); item26.RequiredItems.Add("AskHide", 28); item26.RequiredItems.Add("CharredBone", 16); item26.RequiredItems.Add("FlametalNew", 26); item26.RequiredUpgradeItems.Add("AskHide", 14); item26.RequiredUpgradeItems.Add("CharredBone", 8); item26.RequiredUpgradeItems.Add("FlametalNew", 14); MaterialReplacer.RegisterGameObjectForShaderSwap(item26.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item27 = new Item("rd_armor", "RD_inv_legs_ashlands"); item27.Configurable = Configurability.Recipe | Configurability.Stats; item27.Crafting.Add("RD_necromancer_table_02", 1); item27.RequiredItems.Add("GemstoneRed", 1); item27.RequiredItems.Add("AskHide", 28); item27.RequiredItems.Add("CharredBone", 16); item27.RequiredItems.Add("FlametalNew", 26); item27.RequiredUpgradeItems.Add("AskHide", 14); item27.RequiredUpgradeItems.Add("CharredBone", 8); item27.RequiredUpgradeItems.Add("FlametalNew", 14); MaterialReplacer.RegisterGameObjectForShaderSwap(item27.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item28 = new Item("rd_armor", "RD_inv_cape_ashlands"); item28.Configurable = Configurability.Recipe | Configurability.Stats; item28.Crafting.Add("RD_necromancer_table_02", 1); item28.RequiredItems.Add("GemstoneRed", 1); item28.RequiredItems.Add("AskHide", 6); item28.RequiredItems.Add("CelestialFeather", 6); item28.RequiredItems.Add("FlametalNew", 12); item28.RequiredUpgradeItems.Add("AskHide", 3); item28.RequiredUpgradeItems.Add("CelestialFeather", 4); item28.RequiredUpgradeItems.Add("FlametalNew", 6); MaterialReplacer.RegisterGameObjectForShaderSwap(item28.Prefab, MaterialReplacer.ShaderType.UseUnityShader); } } internal static class Registrations_Mobs_EnemyHudIcons { internal static void Register() { } } [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] [HarmonyPatch(typeof(EnemyHud), "UpdateHuds")] [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(2)] [HarmonyPriority(0)] internal static class Patch_EnemyHud_UpdateHuds_SummonIcons { [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(1)] private const string CombatSpriteName = "ico_summon_combat"; private static readonly FieldInfo HudsField = AccessTools.Field(typeof(EnemyHud), "m_huds"); private static readonly Type HudDataType = AccessTools.Inner(typeof(EnemyHud), "HudData"); private static readonly FieldInfo CharacterField = ((HudDataType != null) ? AccessTools.Field(HudDataType, "m_character") : null); private static readonly FieldInfo AlertedField = ((HudDataType != null) ? AccessTools.Field(HudDataType, "m_alerted") : null); private static readonly FieldInfo AwareField = ((HudDataType != null) ? AccessTools.Field(HudDataType, "m_aware") : null); private static readonly FieldInfo TargetCreatureField = AccessTools.Field(typeof(MonsterAI), "m_targetCreature"); private static readonly FieldInfo TargetStaticField = AccessTools.Field(typeof(MonsterAI), "m_targetStatic"); private static Sprite _combatSprite; [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Postfix(EnemyHud __instance) { if ((Object)(object)__instance == (Object)null || HudsField == null || CharacterField == null || AlertedField == null || AwareField == null || !(HudsField.GetValue(__instance) is IDictionary dictionary) || dictionary.Count == 0) { return; } EnsureSprites(); foreach (DictionaryEntry item in dictionary) { UpdateSummonHud(item.Value); } } private static void UpdateSummonHud(object hudData) { if (hudData == null) { return; } object? obj = CharacterField?.GetValue(hudData); Character val = (Character)((obj is Character) ? obj : null); VS_SummonMarker vS_SummonMarker = default(VS_SummonMarker); if ((Object)(object)val == (Object)null || !((Component)val).TryGetComponent<VS_SummonMarker>(ref vS_SummonMarker)) { return; } object? obj2 = AlertedField?.GetValue(hudData); RectTransform val2 = (RectTransform)((obj2 is RectTransform) ? obj2 : null); object? obj3 = AwareField?.GetValue(hudData); RectTransform val3 = (RectTransform)((obj3 is RectTransform) ? obj3 : null); if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val3 == (Object)null)) { SetVisible(val2, visible: false); if (!HasRealCombatTarget(val)) { SetVisible(val3, visible: false); return; } ApplySprite(val3, _combatSprite); SetVisible(val3, (Object)(object)_combatSprite != (Object)null); } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static bool HasRealCombatTarget(Character character) { BaseAI baseAI = character.GetBaseAI(); MonsterAI val = (MonsterAI)(object)((baseAI is MonsterAI) ? baseAI : null); if ((Object)(object)val == (Object)null) { return false; } object? obj = TargetCreatureField?.GetValue(val); Character val2 = (Character)((obj is Character) ? obj : null); if ((Object)(object)val2 != (Object)null && !val2.IsDead() && BaseAI.IsEnemy(character, val2)) { return true; } object? obj2 = TargetStaticField?.GetValue(val); StaticTarget val3 = (StaticTarget)((obj2 is StaticTarget) ? obj2 : null); return (Object)(object)val3 != (Object)null; } private static void EnsureSprites() { if (_combatSprite == null) { _combatSprite = Vikings_Summoner_AssetLoader.GetSprite("ico_summon_combat"); } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void ApplySprite(RectTransform rect, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] Sprite sprite) { if (!((Object)(object)sprite == (Object)null)) { Image val = ((Component)rect).GetComponent<Image>(); if ((Object)(object)val == (Object)null) { val = ((Component)rect).GetComponentInChildren<Image>(true); } if (!((Object)(object)val == (Object)null) && (Object)(object)val.sprite != (Object)(object)sprite) { val.sprite = sprite; } } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void SetVisible(RectTransform rect, bool visible) { if (((Component)rect).gameObject.activeSelf != visible) { ((Component)rect).gameObject.SetActive(visible); } } } [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] [HarmonyPatch(typeof(MonsterAI), "UpdateAI")] internal static class Patch_MonsterAI_UpdateAI_SummonOwnerFollow { internal static float GroundStopDistance = 6f; internal static float FlyingStopDistanceHorizontal = 10f; internal static float FlyingFollowHeightOffset = 2.5f; internal static float FlyingVerticalTolerance = 1.5f; internal static float FlyingVerticalDeadzone = 0.75f; private const float MinMoveSqrMagnitude = 0.0001f; private static void Postfix(MonsterAI __instance, float dt, bool __result) { //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) VS_SummonMarker vS_SummonMarker = default(VS_SummonMarker); if ((Object)(object)__instance == (Object)null || !__result || !((Component)__instance).TryGetComponent<VS_SummonMarker>(ref vS_SummonMarker)) { return; } ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || !component.IsValid() || !component.IsOwner()) { return; } ZDO zDO = component.GetZDO(); if (zDO == null) { return; } Player val = ResolveOwnerPlayer(zDO); if ((Object)(object)val == (Object)null) { return; } Character component2 = ((Component)__instance).GetComponent<Character>(); if ((Object)(object)component2 == (Object)null) { return; } Character targetCreature = ((BaseAI)__instance).GetTargetCreature(); StaticTarget staticTarget = __instance.GetStaticTarget(); if (!((Object)(object)staticTarget != (Object)null) && (!((Object)(object)targetCreature != (Object)null) || targetCreature.IsDead() || !((BaseAI)__instance).IsEnemy(targetCreature))) { Vector3 position = ((Component)val).transform.position; Vector3 position2 = ((Component)__instance).transform.position; if (!component2.m_flying) { MoveGround(__instance, position, position2); } else { MoveFlying(__instance, position, position2); } } } private static void MoveGround(MonsterAI ai, Vector3 ownerPos, Vector3 summonPos) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(ownerPos.x - summonPos.x, 0f, ownerPos.z - summonPos.z); float magnitude = ((Vector3)(ref val)).magnitude; if (magnitude < GroundStopDistance) { ((BaseAI)ai).StopMoving(); } else if (((Vector3)(ref val)).sqrMagnitude <= 0.0001f) { ((BaseAI)ai).StopMoving(); } else { ((BaseAI)ai).MoveTowards(((Vector3)(ref val)).normalized, true); } } private static void MoveFlying(MonsterAI ai, Vector3 ownerPos, Vector3 summonPos) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ownerPos + Vector3.up * FlyingFollowHeightOffset; Vector3 val2 = val - summonPos; Vector3 val3 = default(Vector3); ((Vector3)(ref val3))..ctor(val2.x, 0f, val2.z); float magnitude = ((Vector3)(ref val3)).magnitude; float num = Mathf.Abs(val2.y); bool flag = magnitude < FlyingStopDistanceHorizontal; bool flag2 = num <= FlyingVerticalTolerance; if (flag && flag2) { ((BaseAI)ai).StopMoving(); return; } if (num <= FlyingVerticalDeadzone) { val2.y = 0f; } if (((Vector3)(ref val2)).sqrMagnitude <= 0.0001f) { ((BaseAI)ai).StopMoving(); } else { ((BaseAI)ai).MoveTowards(((Vector3)(ref val2)).normalized, true); } } [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] private static Player ResolveOwnerPlayer(ZDO zdo) { string text = zdo.GetString("VS_OwnerSteamID", string.Empty).Trim(); if (text.Length == 0) { return null; } List<Player> allPlayers = Player.GetAllPlayers(); if (allPlayers == null || allPlayers.Count == 0) { return null; } for (int i = 0; i < allPlayers.Count; i++) { Player val = allPlayers[i]; if (!((Object)(object)val == (Object)null) && VS_SteamOwnerIdentity.TryGetSteamIdentity(val, out var steamId, out var _) && string.Equals(text, steamId.Trim(), StringComparison.Ordinal)) { return val; } } return null; } } internal static class Registrations_Mobs_Hp { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] internal static float CalculateFinalHp(Mob_Registry.SummonDef def, int level) { float num = Mathf.Max(1f, def.BaseHpCE.Value); float num2 = Mathf.Max(0f, def.HpPercentPerStarCE.Value); int num3 = Mathf.Max(0, level - 1); return Mathf.Max(1f, num * (1f + (float)num3 * (num2 / 100f))); } } [HarmonyPatch(typeof(Character), "SetupMaxHealth")] internal static class Patch_Character_SetupMaxHealth_SummonHp { private readonly struct State { internal readonly float OldMaxHealth; internal readonly float OldHealth; internal State(float oldMaxHealth, float oldHealth) { OldMaxHealth = oldMaxHealth; OldHealth = oldHealth; } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Prefix(Character __instance, out State __state) { __state = (((Object)(object)__instance == (Object)null) ? default(State) : new State(__instance.GetMaxHealth(), __instance.GetHealth())); } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Postfix(Character __instance, State __state) { VS_SummonMarker vS_SummonMarker = default(VS_SummonMarker); if (!((Object)(object)__instance == (Object)null) && ((Component)__instance).TryGetComponent<VS_SummonMarker>(ref vS_SummonMarker)) { string prefabName = Utils.GetPrefabName(((Component)__instance).gameObject); if (Mob_Registry.TryGet(prefabName, out var def) && def != null) { int level = Mathf.Max(1, __instance.GetLevel()); float num = Registrations_Mobs_Hp.CalculateFinalHp(def, level); float num2 = Mathf.Max(1f, __state.OldMaxHealth); float num3 = Mathf.Max(0f, __state.OldHealth); bool flag = num3 >= num2 - 0.01f; float num4 = Mathf.Clamp01(num3 / num2); __instance.SetMaxHealth(num); __instance.SetHealth(flag ? num : Mathf.Clamp(num * num4, 0f, num)); } } } } [HarmonyPatch(typeof(ZNet), "Awake")] internal static class Patch_ZNet_Awake_SummonOwnerCleanupRpc { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Postfix(ZNet __instance) { if (!((Object)(object)__instance == (Object)null) && !Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<VS_SummonOwnerCleanupRpcRegistrar>())) { ((Component)__instance).gameObject.AddComponent<VS_SummonOwnerCleanupRpcRegistrar>(); } } } internal sealed class VS_SummonOwnerCleanupRpcRegistrar : MonoBehaviour { private static bool _registered; private float _tick; private void Update() { if (_registered) { ((Behaviour)this).enabled = false; return; } _tick -= Time.deltaTime; if (!(_tick > 0f)) { _tick = 0.25f; if (ZRoutedRpc.instance != null) { _registered = true; ZRoutedRpc.instance.Register<string, int>("VS_RPC_RemoveOwnedSummons", (Action<long, string, int>)VS_SummonOwnerCleanup.RPC_RemoveOwnedSummons); ((Behaviour)this).enabled = false; } } } } [HarmonyPatch(typeof(Player), "OnDeath")] internal static class Patch_Player_OnDeath_RemoveOwnedSummons { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Postfix(Player __instance) { if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer)) { VS_SummonOwnerCleanup.RequestRemoveOwnedSummons(__instance, VS_SummonRemovalReason.OwnerDeath); } } } [HarmonyPatch(typeof(Player), "TeleportTo", new Type[] { typeof(Vector3), typeof(Quaternion), typeof(bool) })] internal static class Patch_Player_TeleportTo_RemoveOwnedSummons { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Prefix(Player __instance) { if (!((Object)(object)__instance == (Object)null) && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer)) { VS_SummonOwnerCleanup.RequestRemoveOwnedSummons(__instance, VS_SummonRemovalReason.OwnerTeleport); } } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] internal static class VS_SummonOwnerCleanup { internal static void RequestRemoveOwnedSummons(Player owner, VS_SummonRemovalReason reason) { if ((Object)(object)owner == (Object)null || !VS_SteamOwnerIdentity.TryGetSteamIdentity(owner, out var steamId, out var _)) { return; } steamId = VS_SteamOwnerIdentity.NormalizeOwnerId(steamId); if (!string.IsNullOrWhiteSpace(steamId)) { RemoveOwnedSummonsBySteamId(steamId, reason); if (!VS_SummonState.IsServer() && ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC("VS_RPC_RemoveOwnedSummons", new object[2] { steamId, (int)reason }); } } } internal static void RPC_RemoveOwnedSummons(long sender, string steamId, int reason) { if (VS_SummonState.IsServer()) { steamId = VS_SteamOwnerIdentity.NormalizeOwnerId(steamId); if (!string.IsNullOrWhiteSpace(steamId)) { VS_SummonRemovalReason reason2 = (Enum.IsDefined(typeof(VS_SummonRemovalReason), reason) ? ((VS_SummonRemovalReason)reason) : VS_SummonRemovalReason.OwnerDeath); RemoveOwnedSummonsBySteamId(steamId, reason2); } } } private static void RemoveOwnedSummonsBySteamId(string steamId, VS_SummonRemovalReason reason) { if (string.IsNullOrWhiteSpace(steamId)) { return; } List<Character> allCharacters = Character.GetAllCharacters(); if (allCharacters == null || allCharacters.Count == 0) { return; } VS_SummonMarker vS_SummonMarker = default(VS_SummonMarker); for (int num = allCharacters.Count - 1; num >= 0; num--) { Character val = allCharacters[num]; if (!((Object)(object)val == (Object)null) && Object.op_Implicit((Object)(object)val) && !val.IsDead() && ((Component)val).TryGetComponent<VS_SummonMarker>(ref vS_SummonMarker)) { ZNetView component = ((Component)val).GetComponent<ZNetView>(); if (!((Object)(object)component == (Object)null) && component.IsValid()) { ZDO zDO = component.GetZDO(); if (zDO != null && VS_SteamOwnerIdentity.IsSameOwner(zDO, steamId)) { VS_SummonRemoval.TryRemove(((Component)val).gameObject, reason); } } } } } } [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(2)] internal static class Registrations_Mobs_Lifetime_UpgradeTotem { internal static ItemData ResolveWeapon(Character owner, ItemData weapon) { if (weapon != null && (Object)(object)weapon.m_dropPrefab != (Object)null) { return weapon; } Humanoid val = (Humanoid)(object)((owner is Humanoid) ? owner : null); if (val == null) { return null; } ItemData currentWeapon = val.GetCurrentWeapon(); if (currentWeapon != null && (Object)(object)currentWeapon.m_dropPrefab != (Object)null) { return currentWeapon; } return null; } internal static float GetBonusSeconds(Character owner, ItemData weapon) { ItemData val = ResolveWeapon(owner, weapon); if (val == null || (Object)(object)val.m_dropPrefab == (Object)null) { return 0f; } int num = Mathf.Max(val.m_quality, 1); if (num <= 1) { return 0f; } string prefabName = Utils.GetPrefabName(val.m_dropPrefab); if (string.IsNullOrEmpty(prefabName)) { return 0f; } float num2 = Mathf.Max(Vikings_SummonerPlugin.GetLifetimeUpgradeTotemCE(prefabName).Value, 0f); if (num2 <= 0f) { return 0f; } return (float)(num - 1) * num2; } internal static float GetFinalLifetimeSeconds([<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(1)] string summonPrefab, Character owner, ItemData weapon) { float num = Mathf.Max(Vikings_SummonerPlugin.GetLifetimeCE(summonPrefab).Value, 0.01f); float bonusSeconds = GetBonusSeconds(owner, weapon); return Mathf.Max(num + bonusSeconds, 0.01f); } } internal static class Registrations_Mobs_OwnerDebuff { internal static void Register() { } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] internal sealed class VS_SummonOwnerRegenDebuff : SE_Stats { internal const string EffectName = "SE_VS_SummonOwnerRegenDebuff"; public override string GetIconText() { Character character = ((StatusEffect)this).m_character; Player val = (Player)(object)((character is Player) ? character : null); if (val == null) { return ""; } int num = VS_SummonOwnerDebuffRuntime.CountActiveSummons(val); return (num > 0) ? num.ToString() : ""; } public override string GetTooltipString() { int num = 0; Character character = ((StatusEffect)this).m_character; Player val = (Player)(object)((character is Player) ? character : null); if (val != null) { num = VS_SummonOwnerDebuffRuntime.CountActiveSummons(val); } float num2 = Mathf.Max(0f, (1f - base.m_healthRegenMultiplier) * 100f); string text = ((StatusEffect)this).m_tooltip; if (Localization.instance != null && !string.IsNullOrWhiteSpace(text)) { text = Localization.instance.Localize(text); } if (string.IsNullOrWhiteSpace(text)) { return string.Empty; } return string.Format(text, num, num2.ToString("0.#")); } } [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] internal static class VS_SummonOwnerDebuffRuntime { [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] private static VS_SummonOwnerRegenDebuff _template; private static readonly int EffectHash = StringExtensionMethods.GetStableHashCode("SE_VS_SummonOwnerRegenDebuff"); internal static void EnsureRegistered() { //IL_008c: 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) if (!((Object)(object)_template != (Object)null)) { _template = ScriptableObject.CreateInstance<VS_SummonOwnerRegenDebuff>(); ((Object)_template).name = "SE_VS_SummonOwnerRegenDebuff"; ((StatusEffect)_template).m_name = "$vs_summon_regen_burden_name"; ((StatusEffect)_template).m_tooltip = "$vs_summon_regen_burden_tooltip"; ((StatusEffect)_template).m_category = "Equipment"; ((StatusEffect)_template).m_icon = Vikings_Summoner_AssetLoader.GetSprite("ico_debuff"); ((StatusEffect)_template).m_flashIcon = false; ((StatusEffect)_template).m_cooldownIcon = false; ((StatusEffect)_template).m_startMessageType = (MessageType)2; ((StatusEffect)_template).m_startMessage = ""; ((StatusEffect)_template).m_stopMessageType = (MessageType)2; ((StatusEffect)_template).m_stopMessage = ""; ((StatusEffect)_template).m_ttl = 0f; ((SE_Stats)_template).m_healthRegenMultiplier = 1f; } } internal static void EnsureInObjectDb() { EnsureRegistered(); if (!((Object)(object)ObjectDB.instance == (Object)null) && !((Object)(object)_template == (Object)null) && !ObjectDB.instance.m_StatusEffects.Contains((StatusEffect)(object)_template)) { ObjectDB.instance.m_StatusEffects.Add((StatusEffect)(object)_template); ObjectDB.instance.UpdateRegisters(); } } internal static int CountActiveSummons(Player owner) { if (!TryResolveOwner(owner, out var steamId, out var _)) { return 0; } int num = 0; List<Character> allCharacters = Character.GetAllCharacters(); if (allCharacters == null || allCharacters.Count == 0) { return 0; } VS_SummonMarker vS_SummonMarker = default(VS_SummonMarker); for (int i = 0; i < allCharacters.Count; i++) { Character val = allCharacters[i]; if (!Object.op_Implicit((Object)(object)val) || !((Component)val).TryGetComponent<VS_SummonMarker>(ref vS_SummonMarker) || val.IsDead()) { continue; } ZNetView component = ((Component)val).GetComponent<ZNetView>(); if (!((Object)(object)component == (Object)null) && component.IsValid()) { ZDO zDO = component.GetZDO(); if (zDO != null && !zDO.GetBool("vs_summon_removing", false) && VS_SteamOwnerIdentity.IsSameOwner(zDO, steamId)) { num++; } } } return num; } internal static float CalculateHealthRegenMultiplier(int activeSummons) { float num = Mathf.Max(0f, Vikings_SummonerPlugin.CE_ActiveSummonHealthRegenPenaltyPerSummon.Value); return Mathf.Max(0f, 1f - (float)activeSummons * num); } internal static void UpdateDebuff(Player player) { if ((Object)(object)player == (Object)null) { return; } SEMan seman = ((Character)player).m_seman; if (seman == null) { return; } if (!Vikings_SummonerPlugin.CE_ActiveSummonHealthRegenDebuffEnabled.Value) { seman.RemoveStatusEffect(EffectHash, true); return; } if (!TryResolveOwner(player, out var _, out var _)) { seman.RemoveStatusEffect(EffectHash, true); return; } int num = CountActiveSummons(player); if (num <= 0) { seman.RemoveStatusEffect(EffectHash, true); return; } EnsureInObjectDb(); StatusEffect statusEffect = seman.GetStatusEffect(EffectHash); VS_SummonOwnerRegenDebuff vS_SummonOwnerRegenDebuff = statusEffect as VS_SummonOwnerRegenDebuff; if ((Object)(object)vS_SummonOwnerRegenDebuff == (Object)null) { statusEffect = seman.AddStatusEffect(EffectHash, true, 0, 0f); vS_SummonOwnerRegenDebuff = statusEffect as VS_SummonOwnerRegenDebuff; if ((Object)(object)vS_SummonOwnerRegenDebuff == (Object)null) { return; } } ((SE_Stats)vS_SummonOwnerRegenDebuff).m_healthRegenMultiplier = CalculateHealthRegenMultiplier(num); } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(2)] internal static void EnsureUpdater(Player player) { VS_SummonOwnerDebuffUpdater vS_SummonOwnerDebuffUpdater = default(VS_SummonOwnerDebuffUpdater); if (!((Object)(object)player == (Object)null) && TryResolveOwner(player, out var _, out var _) && !((Component)player).TryGetComponent<VS_SummonOwnerDebuffUpdater>(ref vS_SummonOwnerDebuffUpdater)) { ((Component)player).gameObject.AddComponent<VS_SummonOwnerDebuffUpdater>(); } } internal static bool HasValidOwnerIdentity(Player player) { string steamId; string ownerName; return TryResolveOwner(player, out steamId, out ownerName); } private static bool TryResolveOwner(Player player, out string steamId, out string ownerName) { return VS_SteamOwnerIdentity.TryGetSteamIdentity(player, out steamId, out ownerName); } } internal sealed class VS_SummonOwnerDebuffUpdater : MonoBehaviour { private const float UpdateInterval = 1f; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] private Player _player; private float _tick; private void Awake() { _player = ((Component)this).GetComponent<Player>(); _tick = 0f; } private void Update() { if (!((Object)(object)_player == (Object)null) && !((Character)_player).IsDead() && VS_SummonOwnerDebuffRuntime.HasValidOwnerIdentity(_player)) { _tick -= Time.deltaTime; if (!(_tick > 0f)) { _tick = 1f; VS_SummonOwnerDebuffRuntime.UpdateDebuff(_player); } } } private void OnDestroy() { if (((Character)(_player?)).m_seman != null) { ((Character)_player).m_seman.RemoveStatusEffect(StringExtensionMethods.GetStableHashCode("SE_VS_SummonOwnerRegenDebuff"), true); } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] internal static class Patch_ObjectDB_Awake_SummonOwnerDebuff { private static void Postfix() { VS_SummonOwnerDebuffRuntime.EnsureInObjectDb(); } } [HarmonyPatch(typeof(Player), "SetPlayerID", new Type[] { typeof(long), typeof(string) })] internal static class Patch_Player_SetPlayerID_SummonOwnerDebuff { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Postfix(Player __instance, long playerID, string name) { if (!((Object)(object)__instance == (Object)null)) { VS_SummonOwnerDebuffRuntime.EnsureUpdater(__instance); } } } [HarmonyPatch(typeof(Player), "Start")] internal static class Patch_Player_Start_SummonOwnerDebuff { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static void Postfix(Player __instance) { VS_SummonOwnerDebuffRuntime.EnsureUpdater(__instance); } } internal readonly struct VS_SummonProgressionEntry { internal readonly int MinSkill; internal readonly int MaxSkill; internal readonly int SummonLevel; internal readonly int MaxInstances; internal VS_SummonProgressionEntry(int minSkill, int maxSkill, int summonLevel, int maxInstances) { MinSkill = minSkill; MaxSkill = maxSkill; SummonLevel = ((summonLevel < 1) ? 1 : summonLevel); MaxInstances = ((maxInstances < 1) ? 1 : maxInstances); } } internal readonly struct VS_SummonProgressionResult { internal readonly int SummonLevel; internal readonly int MaxInstances; internal VS_SummonProgressionResult(int summonLevel, int maxInstances) { SummonLevel = ((summonLevel < 1) ? 1 : summonLevel); MaxInstances = ((maxInstances < 1) ? 1 : maxInstances); } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] internal static class VS_SummonProgression { internal static bool TryGetGateFromConfig(string prefab, out int minGate) { minGate = 0; if (!TryParse(prefab, out var result)) { return false; } if (result.Count == 0) { return false; } minGate = result[0].MinSkill; for (int i = 1; i < result.Count; i++) { if (result[i].MinSkill < minGate) { minGate = result[i].MinSkill; } } return true; } internal static bool TryResolve(string prefab, float bloodMagic, out VS_SummonProgressionResult result) { result = default(VS_SummonProgressionResult); if (!TryParse(prefab, out var result2)) { return false; } if (result2.Count == 0) { return false; } int num = Mathf.FloorToInt(bloodMagic); VS_SummonProgressionEntry? vS_SummonProgressionEntry = null; for (int i = 0; i < result2.Count; i++) { VS_SummonProgressionEntry value = result2[i]; if (num < value.MinSkill) { break; } vS_SummonProgressionEntry = value; } if (!vS_SummonProgressionEntry.HasValue) { return false; } result = new VS_SummonProgressionResult(vS_SummonProgressionEntry.Value.SummonLevel, vS_SummonProgressionEntry.Value.MaxInstances); return true; } internal static VS_SummonProgressionResult Resolve(string prefab, float bloodMagic) { if (TryResolve(prefab, bloodMagic, out var result)) { return result; } throw new InvalidOperationException($"Invalid summon progression config for prefab '{prefab}' or Blood Magic '{bloodMagic}'."); } private static bool TryParse(string prefab, out List<VS_SummonProgressionEntry> result) { result = new List<VS_SummonProgressionEntry>(); ConfigEntry<string> progressionCE = Vikings_SummonerPlugin.GetProgressionCE(prefab); if (progressionCE == null) { return false; } string value = progressionCE.Value; if (string.IsNullOrWhiteSpace(value)) { return false; } string[] array = value.Split(new char[1] { ';' }); for (int i = 0; i < array.Length; i++) { string text = array[i].Trim(); if (text.Length == 0) { return false; } string[] array2 = text.Split(new char[1] { ':' }); if (array2.Length != 3) { return false; } string[] array3 = array2[0].Split(new char[1] { '-' }); if (array3.Length != 2) { return false; } if (!int.TryParse(array3[0].Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result2)) { return false; } if (!int.TryParse(array3[1].Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result3)) { return false; } if (!int.TryParse(array2[1].Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result4)) { return false; } if (!int.TryParse(array2[2].Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result5)) { return false; } if (result2 < 0) { return false; } if (result3 < result2) { return false; } if (result4 < 1) { return false; } if (result5 < 1) { return false; } result.Add(new VS_SummonProgressionEntry(result2, result3, result4, result5)); } result.Sort(delegate(VS_SummonProgressionEntry a, VS_SummonProgressionEntry b) { int minSkill = a.MinSkill; return minSkill.CompareTo(b.MinSkill); }); return result.Count > 0; } internal static void EnforceMaxInstances(string prefab, Humanoid owner, int maxInstances) { maxInstances = Mathf.Max(0, maxInstances); Player val = (Player)(object)((owner is Player) ? owner : null); if (val == null || !TryResolveOwner(val, out var steamId, out var ownerName)) { return; } List<BaseAI> list = new List<BaseAI>(); foreach (Character allCharacter in Character.GetAllCharacters()) { if (!Object.op_Implicit((Object)(object)allCharacter) || !Object.op_Implicit((Object)(object)((Component)allCharacter).GetComponent<VS_SummonMarker>())) { continue; } string basePrefab = VS_SummonState.GetBasePrefab(((Component)allCharacter).gameObject); if (!string.Equals(basePrefab, prefab, StringComparison.Ordinal)) { continue; } ZNetView component = ((Component)allCharacter).GetComponent<ZNetView>(); if (!Object.op_Implicit((Object)(object)component) || !component.IsValid()) { continue; } ZDO zDO = component.GetZDO(); if (zDO != null && VS_SteamOwnerIdentity.IsSameOwner(zDO, steamId)) { VS_SteamOwnerIdentity.RepairOwnerZDO(component, zDO, steamId, ownerName); BaseAI component2 = ((Component)allCharacter).GetComponent<BaseAI>(); if (!((Object)(object)component2 == (Object)null)) { list.Add(component2); } } } list.Sort((BaseAI a, BaseAI b) => b.GetTimeSinceSpawned().CompareTo(a.GetTimeSinceSpawned())); int num = list.Count - maxInstances; for (int i = 0; i < num; i++) { TryUnsummonNow(((Component)list[i]).gameObject); } if (num > 0) { ((Character)val).Message((MessageType)2, "$hud_maxsummonsreached", 0, (Sprite)null); } } internal static void EnforceAllSummonLimits(Humanoid owner) { Player val = (Player)(object)((owner is Player) ? owner : null); if (val == null || !TryResolveOwner(val, out var steamId, out var ownerName)) { return; } Skills skills = ((Character)owner).GetSkills(); if ((Object)(object)skills == (Object)null) { return; } float skillLevel = skills.GetSkillLevel((SkillType)10); HashSet<string> hashSet = new HashSet<string>(StringComparer.Ordinal); foreach (Character allCharacter in Character.GetAllCharacters()) { if (!Object.op_Implicit((Object)(object)allCharacter) || !Object.op_Implicit((Object)(object)((Component)allCharacter).GetComponent<VS_SummonMarker>())) { continue; } ZNetView component = ((Component)allCharacter).GetComponent<ZNetView>(); if (!Object.op_Implicit((Object)(object)component) || !component.IsValid()) { continue; } ZDO zDO = component.GetZDO(); if (zDO != null && VS_SteamOwnerIdentity.IsSameOwner(zDO, steamId)) { VS_SteamOwnerIdentity.RepairOwnerZDO(component, zDO, steamId, ownerName); string basePrefab = VS_SummonState.GetBasePrefab(((Component)allCharacter).gameObject); if (!string.IsNullOrEmpty(basePrefab) && Mob_Registry.All.ContainsKey(basePrefab)) { hashSet.Add(basePrefab); } } } foreach (string item in hashSet) { if (!TryResolve(item, skillLevel, out var result)) { EnforceMaxInstances(item, owner, 0); continue; } int maxInstances = SE_SummonExtra.ApplyExtraMaxSummons(owner, result.MaxInstances); EnforceMaxInstances(item, owner, maxInstances); } } private static bool TryResolveOwner(Player p, out string steamId, out string ownerName) { return VS_SteamOwnerIdentity.TryGetSteamIdentity(p, out steamId, out ownerName); } private static void TryUnsummonNow(GameObject go) { VS_SummonRemoval.TryRemove(go, VS_SummonRemovalReason.ProgressionLimit); } } internal enum VS_SummonRemovalReason { Manual, LifetimeExpired, OwnerDeath, OwnerTeleport, ProgressionLimit, DeathCleanup, OwnerIdentityFailed } [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] internal static class VS_SummonRemoval { internal const string ZdoRemoving = "vs_summon_removing"; internal const string ZdoRemovingAtTicks = "vs_summon_removing_at"; internal static bool TryRemove(GameObject go, VS_SummonRemovalReason reason) { //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)go)) { return false; } VS_SummonMarker vS_SummonMarker = default(VS_SummonMarker); if (!go.TryGetComponent<VS_SummonMarker>(ref vS_SummonMarker)) { return false; } ZNetView component = go.GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || !component.IsValid()) { return false; } ZDO zDO = component.GetZDO(); if (zDO == null) { return false; } if (zDO.GetBool("vs_summon_removing", false)) { return false; } if (!component.IsOwner() && (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { component.ClaimOwnership(); } if (!component.IsOwner()) { return false; } zDO.Set("vs_summon_removing", true); zDO.Set("vs_summon_removing_at", VS_SummonTime.NowTicks()); VS_SummonVfxProfile component2 = go.GetComponent<VS_SummonVfxProfile>(); if (reason != VS_SummonRemovalReason.DeathCleanup && (Object)(object)component2 != (Object)null && component2.UnSummonEffect != null && component2.UnSummonEffect.HasEffects()) { component2.UnSummonEffect.Create(go.transform.position, go.transform.rotation, (Transform)null, 1f, -1); } if ((Object)(object)ZNetScene.instance != (Object)null) { ZNetScene.instance.Destroy(go); } else { component.Destroy(); } return true; } internal static bool TryRemove(Component c, VS_SummonRemovalReason reason) { return (Object)(object)c != (Object)null && TryRemove(c.gameObject, reason); } internal static bool TryForceDestroy(GameObject go) { if (!Object.op_Implicit((Object)(object)go)) { return false; } VS_SummonMarker vS_SummonMarker = default(VS_SummonMarker); if (!go.TryGetComponent<VS_SummonMarker>(ref vS_SummonMarker)) { return false; } ZNetView component = go.GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || !component.IsValid()) { return false; } if (!component.IsOwner() && (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { component.ClaimOwnership(); } if (!component.IsOwner()) { return false; } if ((Object)(object)ZNetScene.instance != (Object)null) { ZNetScene.instance.Destroy(go); } else { component.Destroy(); } return true; } } internal static class Registrations_Mobs_SpawnAbility { internal static void Register() { Mob_Registry.Init(); } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] internal static class VS_SpawnAbilityScope { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(0)] private sealed class Marker { } private static readonly ConditionalWeakTable<SpawnAbility, Marker> Marked = new ConditionalWeakTable<SpawnAbility, Marker>(); internal static bool TryGetSummonPrefabs(SpawnAbility sa, out List<GameObject> prefabs) { prefabs = new List<GameObject>(); if ((Object)(object)sa == (Object)null || sa.m_spawnPrefab == null || sa.m_spawnPrefab.Length == 0) { return false; } for (int i = 0; i < sa.m_spawnPrefab.Length; i++) { GameObject val = sa.m_spawnPrefab[i]; if (!Object.op_Implicit((Object)(object)val)) { return false; } string prefabName = Utils.GetPrefabName(((Object)val).name); if (string.IsNullOrEmpty(prefabName)) { return false; } if (!Mob_Registry.All.ContainsKey(prefabName)) { return false; } prefabs.Add(val); } return prefabs.Count > 0; } internal static bool IsMarked(SpawnAbility sa) { Marker value; return (Object)(object)sa != (Object)null && Marked.TryGetValue(sa, out value); } internal static void Mark(SpawnAbility sa) { if (!((Object)(object)sa == (Object)null)) { Unmark(sa); Marked.Add(sa, new Marker()); } } internal static void Unmark(SpawnAbility sa) { if (!((Object)(object)sa == (Object)null)) { Marked.Remove(sa); } } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] internal static class VS_SpawnAbilityContextStore { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(2)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private sealed class SpawnSetupContext { internal Character Owner; internal ItemData Weapon; } private static readonly ConditionalWeakTable<SpawnAbility, SpawnSetupContext> Table = new ConditionalWeakTable<SpawnAbility, SpawnSetupContext>(); [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(2)] internal static void Set([<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(1)] SpawnAbility ability, Character owner, ItemData weapon) { if (!((Object)(object)ability == (Object)null)) { Table.Remove(ability); Table.Add(ability, new SpawnSetupContext { Owner = owner, Weapon = weapon }); } } [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] internal static Character GetOwner(SpawnAbility ability) { SpawnSetupContext value; return ((Object)(object)ability != (Object)null && Table.TryGetValue(ability, out value)) ? value.Owner : null; } [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] internal static ItemData GetWeapon(SpawnAbility ability) { SpawnSetupContext value; return ((Object)(object)ability != (Object)null && Table.TryGetValue(ability, out value)) ? value.Weapon : null; } internal static void Clear(SpawnAbility ability) { if (!((Object)(object)ability == (Object)null)) { Table.Remove(ability); } } } [HarmonyPatch(typeof(SpawnAbility), "Setup")] internal static class Patch_SpawnAbility_Setup_SummonMark { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] private static bool Prefix(SpawnAbility __instance, Character owner, ItemData item) { VS_SpawnAbilityContextStore.Set(__instance, owner, item); if (VS_SummonSpawnAbility.ShouldBlockSetup(__instance, owner)) { VS_SpawnAbilityScope.Unmark(__instance); VS_SpawnAbilityContextStore.Clear(__instance); return false; } VS_SummonSpawnAbility.TryMarkFromSetup(__instance); return true; } } [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(1)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] internal static class VS_SummonSpawnAbility { [<d0224abe-9e35-4939-ae60-73d7162dcac6>NullableContext(2)] [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private readonly struct SpawnContext { [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(1)] internal readonly SpawnAbility Ability; internal readonly Character Owner; internal readonly ItemData Weapon; internal readonly Skills Skills; internal readonly float BloodMagic; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(1)] internal readonly List<GameObject> Prefabs; internal SpawnContext([<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(1)] SpawnAbility ability, Character owner, ItemData weapon, Skills skills, float bloodMagic, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(1)] List<GameObject> prefabs) { Ability = ability; Owner = owner; Weapon = weapon; Skills = skills; BloodMagic = bloodMagic; Prefabs = prefabs; } } [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private readonly struct ValidSummonPrefab { internal readonly GameObject Prefab; internal readonly string Name; internal readonly VS_SummonProgressionResult Progression; internal ValidSummonPrefab(GameObject prefab, string name, VS_SummonProgressionResult progression) { Prefab = prefab; Name = name; Progression = progression; } } [CompilerGenerated] private sealed class <AbortSpawn>d__10 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public <AbortSpawn>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <SpawnOne>d__12 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private object <>2__current; public SpawnContext ctx; public int index; public int spawnCount; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private SpawnAbility <sa>5__1; private Vector3 <targetPosition>5__2; private Vector3 <spawnPoint>5__3; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private GameObject <prefab>5__4; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private string <summonPrefab>5__5; private VS_SummonProgressionResult <progression>5__6; private int <finalMaxInstances>5__7; private float <finalLifetime>5__8; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private GameObject <go>5__9; object IEnumerator<object>.Current { [DebuggerHidden] [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public <SpawnOne>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <sa>5__1 = null; <prefab>5__4 = null; <summonPrefab>5__5 = null; <go>5__9 = null; <>1__state = -2; } private bool MoveNext() { //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_027b: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_0297: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Expected O, but got Unknown //IL_02cd: Unknown result type (might be due to invalid IL or missing references) //IL_02d7: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <sa>5__1 = ctx.Ability; if (!TryResolveSpawnPoint(ctx, index, spawnCount, out <targetPosition>5__2, out <spawnPoint>5__3)) { return false; } if (!TrySelectSummonPrefab(ctx.Prefabs, ctx.BloodMagic, out <prefab>5__4, out <summonPrefab>5__5, out <progression>5__6)) { ShowBloodMagicGateMessageIfPossible(ctx); return false; } <finalMaxInstances>5__7 = SE_SummonExtra.ApplyExtraMaxSummons(ctx.Owner, <progression>5__6.MaxInstances); <finalLifetime>5__8 = Registrations_Mobs_Lifetime_UpgradeTotem.GetFinalLifetimeSeconds(<summonPrefab>5__5, ctx.Owner, ctx.Weapon); <sa>5__1.m_preSpawnEffects.Create(<spawnPoint>5__3, Quaternion.identity, (Transform)null, 1f, -1); if (<sa>5__1.m_preSpawnDelay > 0f) { <>2__current = (object)new WaitForSeconds(<sa>5__1.m_preSpawnDelay); <>1__state = 1; return true; } goto IL_0158; case 1: <>1__state = -1; goto IL_0158; case 2: { <>1__state = -1; break; } IL_0158: <go>5__9 = SpawnSummonInstance(<prefab>5__4, <spawnPoint>5__3); if (!Object.op_Implicit((Object)(object)<go>5__9)) { return false; } ApplyLifetime(<go>5__9, <finalLifetime>5__8); ApplyRandomYRotation(<sa>5__1, <go>5__9); SetupSpawnedProjectile(<sa>5__1, ctx.Owner, <go>5__9, <targetPosition>5__2); ApplyCopiedSkillFactor(<sa>5__1, ctx.Skills, <go>5__9); ApplyProgression(<go>5__9, new VS_SummonProgressionResult(<progression>5__6.SummonLevel, <finalMaxInstances>5__7)); VS_SummonState.Begin(<go>5__9, ctx.Owner, <summonPrefab>5__5, <finalMaxInstances>5__7); RegisterPlayerSummonStat(<sa>5__1, ctx.Owner); ApplyWakeupAnimation(<sa>5__1, <go>5__9); ApplyAiState(<sa>5__1, <go>5__9); SetupAoe(<sa>5__1, <go>5__9.GetComponent<Character>(), <spawnPoint>5__3); <sa>5__1.m_spawnEffects.Create(<spawnPoint>5__3, Quaternion.identity, (Transform)null, 1f, -1); if (<sa>5__1.m_spawnDelay > 0f) { <>2__current = (object)new WaitForSeconds(<sa>5__1.m_spawnDelay); <>1__state = 2; return true; } break; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <SpawnOverride>d__11 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private object <>2__current; public SpawnContext ctx; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private SpawnAbility <sa>5__1; private int <toSpawn>5__2; private int <i>5__3; [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] private IEnumerator <step>5__4; object IEnumerator<object>.Current { [DebuggerHidden] [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] [return: <49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(0)] get { return <>2__current; } } [DebuggerHidden] public <SpawnOverride>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || (uint)(num - 1) <= 1u) { try { } finally { <>m__Finally1(); } } <sa>5__1 = null; <step>5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown try { int num; switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>1__state = -3; <sa>5__1 = ctx.Ability; if (<sa>5__1.m_initialSpawnDelay > 0f) { <>2__current = (object)new WaitForSeconds(<sa>5__1.m_initialSpawnDelay); <>1__state = 1; return true; } goto IL_008f; case 1: <>1__state = -3; goto IL_008f; case 2: { <>1__state = -3; goto IL_00fd; } IL_008f: <toSpawn>5__2 = Random.Range(<sa>5__1.m_minToSpawn, <sa>5__1.m_maxToSpawn); <i>5__3 = 0; goto IL_0126; IL_0126: if (<i>5__3 < <toSpawn>5__2) { <step>5__4 = SpawnOne(ctx, <i>5__3, <toSpawn>5__2); goto IL_00fd; } DestroySpawnAbilityObjectIfNeeded(<sa>5__1); <sa>5__1 = null; <>m__Finally1(); return false; IL_00fd: if (<step>5__4.MoveNext()) { <>2__current = <step>5__4.Current; <>1__state = 2; return true; } <step>5__4 = null; num = <i>5__3 + 1; <i>5__3 = num; goto IL_0126; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; VS_SpawnAbilityScope.Unmark(ctx.Ability); VS_SpawnAbilityContextStore.Clear(ctx.Ability); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static void ShowInvalidProgressionMessage(Character owner) { Player val = (Player)(object)((owner is Player) ? owner : null); if (val != null) { ((Character)val).Message((MessageType)2, "Invalid summon progression config.", 0, (Sprite)null); } } internal static bool ShouldBlockSetup(SpawnAbility sa, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] Character owner) { if ((Object)(object)owner == (Object)null) { return false; } if (!VS_SpawnAbilityScope.TryGetSummonPrefabs(sa, out var prefabs)) { return false; } float num = ResolveRequiredBloodMagic(prefabs); if (num < 0f) { ShowInvalidProgressionMessage(owner); return true; } Skills skills = owner.GetSkills(); if ((Object)(object)skills == (Object)null) { return false; } float skillLevel = skills.GetSkillLevel((SkillType)10); if (skillLevel >= num) { return false; } ShowBloodMagicGateMessage(owner, skillLevel, num); return true; } internal static bool TryMarkFromSetup(SpawnAbility sa) { VS_SpawnAbilityScope.Unmark(sa); if (!VS_SpawnAbilityScope.TryGetSummonPrefabs(sa, out var _)) { return false; } VS_SpawnAbilityScope.Mark(sa); return true; } internal static bool TryBuildSpawnOverride(SpawnAbility sa, ref IEnumerator result) { if (!VS_SpawnAbilityScope.IsMarked(sa)) { return false; } if (!VS_SpawnAbilityScope.TryGetSummonPrefabs(sa, out var prefabs)) { VS_SpawnAbilityScope.Unmark(sa); VS_SpawnAbilityContextStore.Clear(sa); result = AbortSpawn(); return true; } result = SpawnOverride(BuildContext(sa, prefabs)); return true; } private static SpawnContext BuildContext(SpawnAbility sa, List<GameObject> prefabs) { Character owner = VS_SpawnAbilityContextStore.GetOwner(sa); ItemData weapon = VS_SpawnAbilityContextStore.GetWeapon(sa); Skills val = (Object.op_Implicit((Object)(object)owner) ? owner.GetSkills() : null); float bloodMagic = (((Object)(object)val != (Object)null) ? val.GetSkillLevel((SkillType)10) : 0f); return new SpawnContext(sa, owner, weapon, val, bloodMagic, prefabs); } private static float ResolveRequiredBloodMagic(List<GameObject> prefabs) { int num = int.MaxValue; bool flag = false; for (int i = 0; i < prefabs.Count; i++) { string prefabName = Utils.GetPrefabName(((Object)prefabs[i]).name); if (string.IsNullOrEmpty(prefabName)) { return -1f; } if (!VS_SummonProgression.TryGetGateFromConfig(prefabName, out var minGate)) { return -1f; } if (!flag || minGate < num) { num = minGate; flag = true; } } return flag ? ((float)num) : (-1f); } private static void ShowBloodMagicGateMessage(Character owner, float have, float required) { Player val = (Player)(object)((owner is Player) ? owner : null); if (val != null) { int num = Mathf.FloorToInt(have); int num2 = Mathf.FloorToInt(required); string arg = $"<color=red><b>{num}</b></color>"; string arg2 = $"<color=red><b>{num2}</b></color>"; string format = Localization.instance.Localize("$vs_bm_gate_msg"); string text = string.Format(format, arg, arg2); ((Character)val).Message((MessageType)2, text, 0, (Sprite)null); } } private static void ShowBloodMagicGateMessageIfPossible(SpawnContext ctx) { if (!((Object)(object)ctx.Owner == (Object)null)) { float num = ResolveRequiredBloodMagic(ctx.Prefabs); if (num < 0f) { ShowInvalidProgressionMessage(ctx.Owner); } else { ShowBloodMagicGateMessage(ctx.Owner, ctx.BloodMagic, num); } } } [IteratorStateMachine(typeof(<AbortSpawn>d__10))] private static IEnumerator AbortSpawn() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AbortSpawn>d__10(0); } [IteratorStateMachine(typeof(<SpawnOverride>d__11))] private static IEnumerator SpawnOverride(SpawnContext ctx) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SpawnOverride>d__11(0) { ctx = ctx }; } [IteratorStateMachine(typeof(<SpawnOne>d__12))] private static IEnumerator SpawnOne(SpawnContext ctx, int index, int spawnCount) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SpawnOne>d__12(0) { ctx = ctx, index = index, spawnCount = spawnCount }; } private static bool TryResolveSpawnPoint(SpawnContext ctx, int index, int spawnCount, out Vector3 targetPosition, out Vector3 spawnPoint) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) SpawnAbility ability = ctx.Ability; targetPosition = ((Component)ability).transform.position; spawnPoint = targetPosition; if (!TryResolveTargetPosition(ctx, index, spawnCount, out targetPosition)) { return false; } return TryResolveFinalSpawnPoint(ability, targetPosition, index, spawnCount, out spawnPoint); } private static bool TryResolveTargetPosition(SpawnContext ctx, int index, int spawnCount, out Vector3 targetPosition) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Invalid comparison between Unknown and I4 //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Invalid comparison between Unknown and I4 //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) SpawnAbility ability = ctx.Ability; targetPosition = ((Component)ability).transform.position; bool result = false; int num = (((int)ability.m_targetType != 4) ? 1 : 5); for (int i = 0; i < num; i++) { if (result = FindTarget(ability, ctx.Owner, out targetPosition, index, spawnCount)) { break; } if ((int)ability.m_targetType == 4 && i == num - 1) { targetPosition = ((Component)ability).transform.position; result = true; } } return result; } private static bool TryResolveFinalSpawnPoint(SpawnAbility sa, Vector3 targetPosition, int index, int spawnCount, out Vector3 spawnPoint) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) spawnPoint = targetPosition; if ((int)sa.m_targetType == 4) { return true; } Vector3 val = (sa.m_spawnAtTarget ? targetPosition : ((Component)sa).transform.position); Vector2 val2 = (sa.m_circleSpawn ? (GetCirclePoint(index, spawnCount) * sa.m_spawnRadius) : (Random.insideUnitCircle * sa.m_spawnRadius)); spawnPoint = val + new Vector3(val2.x, 0f, val2.y); if (sa.m_snapToTerrain) { if ((Object)(object)ZoneSystem.instance == (Object)null) { return false; } float y = default(float); ZoneSystem.instance.GetSolidHeight(spawnPoint, ref y, sa.m_getSolidHeightMargin); spawnPoint.y = y; } spawnPoint.y += sa.m_spawnGroundOffset; return Mathf.Abs(spawnPoint.y - val.y) <= 100f; } private static bool TrySelectSummonPrefab(List<GameObject> summonPrefabs, float bloodMagic, out GameObject prefab, out string summonPrefab, out VS_SummonProgressionResult progression) { prefab = null; summonPrefab = string.Empty; progression = default(VS_SummonProgressionResult); if (summonPrefabs.Count == 0) { return false; } List<ValidSummonPrefab> list = new List<ValidSummonPrefab>(); for (int i = 0; i < summonPrefabs.Count; i++) { GameObject val = summonPrefabs[i]; if (Object.op_Implicit((Object)(object)val)) { string prefabName = Utils.GetPrefabName(((Object)val).name); if (!string.IsNullOrEmpty(prefabName) && VS_SummonProgression.TryResolve(prefabName, bloodMagic, out var result)) { list.Add(new ValidSummonPrefab(val, prefabName, result)); } } } if (list.Count == 0) { return false; } ValidSummonPrefab validSummonPrefab = list[Random.Range(0, list.Count)]; prefab = validSummonPrefab.Prefab; summonPrefab = validSummonPrefab.Name; progression = validSummonPrefab.Progression; return true; } private static GameObject SpawnSummonInstance(GameObject prefab, Vector3 spawnPoint) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) Quaternion val = Quaternion.Euler(0f, Random.value * 360f, 0f); return Object.Instantiate<GameObject>(prefab, spawnPoint, val); } private static void ApplyLifetime(GameObject go, float finalLifetime) { VS_SummonLifetime.Apply(go, finalLifetime); } private static void ApplyRandomYRotation(SpawnAbility sa, GameObject go) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) if (sa.m_randomYRotation) { go.transform.Rotate(Vector3.up, (float)Random.Range(-180, 180)); } } private static void SetupSpawnedProjectile(SpawnAbility sa, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] Character owner, GameObject go, Vector3 targetPosition) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) Projectile component = go.GetComponent<Projectile>(); if (!((Object)(object)component == (Object)null) && !((Object)(object)owner == (Object)null)) { SetupProjectile(sa, owner, component, targetPosition); } } private static void ApplyCopiedSkillFactor(SpawnAbility sa, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] Skills skills, GameObject go) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)skills == (Object)null) { return; } ZNetView component = go.GetComponent<ZNetView>(); if (!((Object)(object)component == (Object)null) && component.IsValid()) { ZDO zDO = component.GetZDO(); if (zDO != null && (int)sa.m_copySkill != 0 && !(sa.m_copySkillToRandomFactor <= 0f)) { zDO.Set(ZDOVars.s_randomSkillFactor, 1f + skills.GetSkillLevel(sa.m_copySkill) * sa.m_copySkillToRandomFactor); } } } private static void ApplyProgression(GameObject go, VS_SummonProgressionResult progression) { Character component = go.GetComponent<Character>(); if ((Object)(object)component != (Object)null) { component.SetLevel(progression.SummonLevel); } } private static void RegisterPlayerSummonStat(SpawnAbility sa, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] Character owner) { if (sa.m_commandOnSpawn && (Object)(object)owner == (Object)(object)Player.m_localPlayer) { Game.instance.IncrementPlayerStat((PlayerStatType)50, 1f); } } private static void ApplyWakeupAnimation(SpawnAbility sa, GameObject go) { if (sa.m_wakeUpAnimation) { ZSyncAnimation component = go.GetComponent<ZSyncAnimation>(); if (component != null) { component.SetBool("wakeup", true); } } } private static void ApplyAiState(SpawnAbility sa, GameObject go) { BaseAI component = go.GetComponent<BaseAI>(); if (!((Object)(object)component == (Object)null) && sa.m_passiveAggressive) { component.m_passiveAggresive = true; } } private static void DestroySpawnAbilityObjectIfNeeded(SpawnAbility sa) { if (!sa.m_spawnOnAwake) { Object.Destroy((Object)(object)((Component)sa).gameObject); } } private static void SetupProjectile(SpawnAbility sa, Character owner, Projectile projectile, Vector3 targetPoint) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00da: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (sa.m_randomDirection ? GetRandomConeDirection(sa) : (targetPoint - ((Component)projectile).transform.position)); if (((Vector3)(ref val)).sqrMagnitude <= 0.0001f) { val = owner.GetLookDir(); } if (((Vector3)(ref val)).sqrMagnitude <= 0.0001f) { val = ((Component)projectile).transform.forward; } ((Vector3)(ref val)).Normalize(); Vector3 val2 = Vector3.Cross(val, Vector3.up); if (((Vector3)(ref val2)).sqrMagnitude <= 0.0001f) { val2 = Vector3.right; } Vector3 val3 = Quaternion.AngleAxis(Random.Range(0f - sa.m_projectileAccuracy, sa.m_projectileAccuracy), Vector3.up) * (Quaternion.AngleAxis(Random.Range(0f - sa.m_projectileAccuracy, sa.m_projectileAccuracy), ((Vector3)(ref val2)).normalized) * val); float num = ((sa.m_projectileVelocityMax > 0f) ? Random.Range(sa.m_projectileVelocity, sa.m_projectileVelocityMax) : sa.m_projectileVelocity); projectile.Setup(owner, val3 * num, -1f, (HitData)null, (ItemData)null, (ItemData)null); } private static Vector3 GetRandomConeDirection(SpawnAbility sa) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) int num = Random.Range(0, 360); float num2 = Random.Range(sa.m_randomAngleMin, sa.m_randomAngleMax); return Quaternion.AngleAxis((float)num, Vector3.up) * new Vector3(Mathf.Sin(num2), Mathf.Cos(num2), 0f); } private static void SetupAoe(SpawnAbility sa, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] Character owner, Vector3 targetPoint) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)sa.m_aoePrefab == (Object)null) && !((Object)(object)owner == (Object)null)) { Aoe component = Object.Instantiate<GameObject>(sa.m_aoePrefab, targetPoint, Quaternion.identity).GetComponent<Aoe>(); if (!((Object)(object)component == (Object)null)) { component.Setup(owner, Vector3.zero, -1f, (HitData)null, (ItemData)null, (ItemData)null); } } } private static bool FindTarget(SpawnAbility sa, [<49e4b12e-f0b5-4be8-bcf3-f4780f1def32>Nullable(2)] Character owner, out Vector3 point, int i, int spawnCount) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected I4, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_010e: 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) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) point = Vector3.zero; TargetType targetType = sa.m_targetType; TargetType val = targetType; switch ((int)val) { case 0: { if ((Object)(object)owner == (Object)null) { return false; } Character val3 = BaseAI.FindClosestEnemy(owner, ((Component)sa).transform.position, sa.m_maxTargetRange); if (!Object.op_Implicit((Object)(object)val3)) { return false; } point = ((Component)val3).transform.position; return true; } case 1: { if ((Object)(object)owner == (Object)null) { return false; } Character val4 = BaseAI.FindRandomEnemy(owner, ((Component)sa).transform.position, sa.m_maxTargetRange); if (!Object.op_Implicit((Object)(object)val4)) { return false; } point = ((Component)val4).transform.position; return true; } case 2: if ((Object)(object)owner == (Object)null) { return false; } point = ((Component)owner).transform.position; return true; case 3: point = ((Component)sa).transform.position; return true; case 4: { if ((Object)(object)owner == (Object)null) { return false; } if ((Object)(object)ZoneSystem.instance == (Object)null || (Object)(object)Pathfinding.instance == (Object)null) { return false; } List<Vector3> list = new List<Vector3>(); Vector2 insideUnitCircle = Random.insideUnitCircle; Vector2 val2 = ((Vector2)(ref insideUnitCircle)).normalized * Random.Range(sa.m_spawnRadius / 2f, sa.m_spawnRadius); point = ((Component)sa).transform.position + new Vector3(val2.x, 2f, val2.y); float y = default(float); ZoneSystem.instance.GetSolidHeight(point, ref y, 2); point.y = y; if (!Pathfinding.instance.GetPath(((Component)owner).transform.position, point, list, sa.m_targetWhenPathfindingType, true, false, true)) { return false; } if (list.Count == 0) { return false; } point = list[list.Count - 1]; return true; } default: return false; } } private static Vector2 GetCirclePoint(int i, int spawnCount) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) /