using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("GjallStaff")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Hewlett-Packard Company")] [assembly: AssemblyProduct("GjallStaff")] [assembly: AssemblyCopyright("Copyright © Hewlett-Packard Company 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("ff0ad91f-daf2-4851-a245-7f5371304e28")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] [BepInPlugin("youdied.gjallsummoner", "Gjall Summoner", "1.2.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class GjallStaffMod : BaseUnityPlugin { [HarmonyPatch(typeof(Player), "OnSpawned")] public static class PlayerSpawnedPatch { private static void Postfix(Player __instance) { if ((Object)(object)__instance == (Object)(object)Player.m_localPlayer) { currentGjall = 0; lastCastTime = -999f; Logger.LogInfo((object)"[GjallStaff] Player spawned — Gjall counters reset."); } } } [HarmonyPatch(typeof(Character), "OnDeath")] public static class GjallDeathPatch { private static void Prefix(Character __instance) { if ((Object)(object)((Component)__instance).GetComponent() != (Object)null) { currentGjall = Mathf.Max(0, currentGjall - 1); Logger.LogInfo((object)"Summoned Gjall died — currentGjall decremented."); } } } [HarmonyPatch(typeof(Character), "Awake")] public static class TickTamerPatch { private static void Postfix(Character __instance) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Invalid comparison between Unknown and I4 //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) if (!((Object)__instance).name.StartsWith("Tick")) { return; } foreach (Character allCharacter in Character.GetAllCharacters()) { if (!((Object)allCharacter).name.StartsWith("Gjall") || (int)allCharacter.m_faction != 0 || !(Vector3.Distance(((Component)allCharacter).transform.position, ((Component)__instance).transform.position) < 20f)) { continue; } if (DisableTicks.Value) { ZNetView component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null && component.IsOwner()) { ZNetScene.instance.Destroy(((Component)__instance).gameObject); } else { Object.Destroy((Object)(object)((Component)__instance).gameObject); } } else { __instance.m_faction = (Faction)0; } break; } } } [HarmonyPatch(typeof(VisEquipment), "SetLeftHandEquipped")] public static class VisEquipLeftHandPatch { private class TickHandFX : MonoBehaviour { } private static void Postfix(VisEquipment __instance) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Expected O, but got Unknown //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) Transform val = (Transform)(typeof(VisEquipment).GetField("m_leftHand", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(__instance)); if ((Object)(object)val == (Object)null) { return; } TickVisualMarker componentInChildren = ((Component)val).GetComponentInChildren(); TickHandFX componentInChildren2 = ((Component)val).GetComponentInChildren(); if ((Object)(object)componentInChildren == (Object)null) { if ((Object)(object)componentInChildren2 != (Object)null) { Object.Destroy((Object)(object)((Component)componentInChildren2).gameObject); } } else { if ((Object)(object)componentInChildren2 != (Object)null) { return; } GameObject prefab = PrefabManager.Instance.GetPrefab("StaffSkeleton"); if ((Object)(object)prefab == (Object)null) { Logger.LogWarning((object)"[GjallStaff] StaffSkeleton prefab not found"); return; } Transform val2 = null; Transform[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (Transform val3 in componentsInChildren) { if (((Object)val3).name == "equiped") { val2 = val3; break; } } if ((Object)(object)val2 == (Object)null) { Logger.LogWarning((object)"[GjallStaff] equiped child not found in StaffSkeleton"); return; } GameObject val4 = Object.Instantiate(((Component)val2).gameObject, val, false); ((Object)val4).name = "TickHandFX"; val4.AddComponent(); val4.transform.localPosition = new Vector3(0f, -0.02f, 0.05f); val4.transform.localRotation = Quaternion.identity; val4.SetActive(true); ParticleSystem[] componentsInChildren2 = val4.GetComponentsInChildren(true); foreach (ParticleSystem val5 in componentsInChildren2) { if (!(((Object)((Component)val5).gameObject).name == "flames") && !(((Object)((Component)val5).gameObject).name == "embers")) { continue; } ((Component)val5).gameObject.SetActive(true); MainModule main = val5.main; ((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(0.3f, 0f, 0.8f, 1f), new Color(0.15f, 0f, 0.6f, 0.8f)); ParticleSystemRenderer component = ((Component)val5).GetComponent(); if ((Object)(object)component != (Object)null) { ((Renderer)component).material = new Material(((Renderer)component).material); ((Renderer)component).material.color = new Color(0.3f, 0f, 0.8f, 1f); if (((Renderer)component).material.HasProperty("_TintColor")) { ((Renderer)component).material.SetColor("_TintColor", new Color(0.2f, 0f, 0.7f, 0.5f)); } if (((Renderer)component).material.HasProperty("_Color")) { ((Renderer)component).material.SetColor("_Color", new Color(0.3f, 0f, 0.8f, 1f)); } if (((Renderer)component).material.HasProperty("_EmissionColor")) { ((Renderer)component).material.SetColor("_EmissionColor", new Color(0.3f, 0f, 0.8f) * 2f); } } val5.Play(true); } Logger.LogInfo((object)"[GjallStaff] StaffSkeleton equiped FX attached to tick"); } } } [HarmonyPatch(typeof(Player), "PlayerAttackInput")] public static class BlockSkeletonAttackPatch { private static bool Prefix(Player __instance) { if ((Object)(object)Player.m_localPlayer != (Object)(object)__instance) { return true; } ItemData currentWeapon = ((Humanoid)__instance).GetCurrentWeapon(); if (currentWeapon != null && (Object)(object)currentWeapon.m_dropPrefab != (Object)null && ((Object)currentWeapon.m_dropPrefab).name == "gjall_summoning_staff") { return false; } return true; } } [HarmonyPatch(typeof(Player), "Update")] public static class UpdatePatch { private static void Postfix(Player __instance) { if (!((Object)(object)Player.m_localPlayer != (Object)(object)__instance) && !InventoryGui.IsVisible() && !Menu.IsVisible() && Input.GetMouseButtonDown(0)) { ItemData currentWeapon = ((Humanoid)__instance).GetCurrentWeapon(); if (currentWeapon != null && (Object)(object)currentWeapon.m_dropPrefab != (Object)null && ((Object)currentWeapon.m_dropPrefab).name == "gjall_summoning_staff") { SummonGjall(__instance, currentWeapon.m_quality); } } } } [CompilerGenerated] private sealed class d__13 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Player player; public GameObject prefab; public int staffQuality; public float delay; private Vector3 5__1; private Camera 5__2; private GameObject 5__3; private Character 5__4; private Ray 5__5; private RaycastHit 5__6; private int 5__7; private string 5__8; private FieldInfo 5__9; private ZNetView 5__10; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; 5__3 = null; 5__4 = null; 5__8 = null; 5__9 = null; 5__10 = null; <>1__state = -2; } private bool MoveNext() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0178: 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_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(delay); <>1__state = 1; return true; case 1: <>1__state = -1; if ((Object)(object)player == (Object)null) { currentGjall--; return false; } 5__2 = Camera.main; if ((Object)(object)5__2 != (Object)null) { 5__5 = new Ray(((Component)5__2).transform.position, ((Component)5__2).transform.forward); if (Physics.Raycast(5__5, ref 5__6, 30f, ~LayerMask.GetMask(new string[3] { "character", "CharacterTrigger", "piece_nonsolid" }))) { 5__1 = ((RaycastHit)(ref 5__6)).point + Vector3.up * 3f; } else { 5__1 = ((Component)5__2).transform.position + ((Component)5__2).transform.forward * 30f; } } else { 5__1 = ((Component)player).transform.position + ((Component)player).transform.forward * 10f + Vector3.up * 8f; } 5__3 = Object.Instantiate(prefab, 5__1, Quaternion.identity); 5__3.transform.localScale = Vector3.one * 0.7f; 5__4 = 5__3.GetComponent(); if ((Object)(object)5__4 != (Object)null) { 5__4.m_faction = (Faction)0; 5__7 = Mathf.Clamp(staffQuality - 1, 0, 2); if (5__7 > 0) { 5__9 = typeof(Character).GetField("m_nview", BindingFlags.Instance | BindingFlags.NonPublic); ref ZNetView reference = ref 5__10; object? obj = 5__9?.GetValue(5__4); reference = (ZNetView)((obj is ZNetView) ? obj : null); ZNetView obj2 = 5__10; if (obj2 != null) { ZDO zDO = obj2.GetZDO(); if (zDO != null) { zDO.Set(ZDOVars.s_level, 5__7 + 1, false); } } 5__4.SetLevel(5__7 + 1); 5__9 = null; 5__10 = null; } 5__3.AddComponent().Init(player, 5__4); if (DespawnTime.Value > 0f) { 5__3.AddComponent().Init(DespawnTime.Value); } 5__3.AddComponent(); 5__8 = ((5__7 == 0) ? "" : ((5__7 == 1) ? " ⭐" : " ⭐⭐")); ((Character)player).Message((MessageType)2, "Gjall summoned!" + 5__8, 0, (Sprite)null); 5__8 = null; } else { currentGjall--; Object.Destroy((Object)(object)5__3); } 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(); } } public static ConfigEntry MaxGjall; public static ConfigEntry Cooldown; public static ConfigEntry DespawnTime; public static ConfigEntry EitrCost; public static ConfigEntry DisableTicks; private static float lastCastTime = -999f; public static int currentGjall = 0; private static GjallStaffMod instance; private const string STAFF_PREFAB_NAME = "gjall_summoning_staff"; private void Awake() { instance = this; MaxGjall = ((BaseUnityPlugin)this).Config.Bind("General", "MaxGjall", 1, "Maximum active Gjall"); Cooldown = ((BaseUnityPlugin)this).Config.Bind("General", "Cooldown", 30f, "Cooldown in seconds"); DespawnTime = ((BaseUnityPlugin)this).Config.Bind("General", "DespawnTime", 120f, "Lifetime of Gjall in seconds"); EitrCost = ((BaseUnityPlugin)this).Config.Bind("General", "EitrCost", 100f, "Eitr cost per cast"); DisableTicks = ((BaseUnityPlugin)this).Config.Bind("General", "DisableTicks", false, "Disable Tick spawning from summoned Gjall"); PrefabManager.OnVanillaPrefabsAvailable += CreateStaff; Harmony.CreateAndPatchAll(typeof(GjallStaffMod).Assembly, "com.rob.gjallsummoner"); } private void CreateStaff() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Expected O, but got Unknown //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Expected O, but got Unknown //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Expected O, but got Unknown //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Expected O, but got Unknown //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Expected O, but got Unknown //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Expected O, but got Unknown //IL_00f5: 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) PrefabManager.OnVanillaPrefabsAvailable -= CreateStaff; Sprite val = null; Assembly executingAssembly = Assembly.GetExecutingAssembly(); using (Stream stream = executingAssembly.GetManifestResourceStream("GjallSummoner.tick.png")) { if (stream != null) { byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); Texture2D val2 = new Texture2D(64, 64, (TextureFormat)4, false); MethodInfo methodInfo = Type.GetType("UnityEngine.ImageConversion, UnityEngine.ImageConversionModule")?.GetMethod("LoadImage", new Type[2] { typeof(Texture2D), typeof(byte[]) }); if (methodInfo != null && (bool)methodInfo.Invoke(null, new object[2] { val2, array })) { val = Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0.5f)); Logger.LogInfo((object)"Gjall Staff: icon loaded from assembly."); } } else { Logger.LogWarning((object)"Gjall Staff: embedded tick.png not found in assembly."); } } ItemConfig val3 = new ItemConfig(); val3.Name = "Gjall Summoner"; val3.Description = "Summons a loyal Gjall to fight for you. Upgrade the staff to summon stronger Gjall."; val3.CraftingStation = CraftingStations.GaldrTable; val3.MinStationLevel = 1; val3.Icons = (Sprite[])(object)((!((Object)(object)val != (Object)null)) ? null : new Sprite[1] { val }); val3.Requirements = (RequirementConfig[])(object)new RequirementConfig[4] { new RequirementConfig { Item = "BlackCore", Amount = 5, AmountPerLevel = 5 }, new RequirementConfig { Item = "GiantBloodSack", Amount = 4, AmountPerLevel = 2 }, new RequirementConfig { Item = "Bilebag", Amount = 3, AmountPerLevel = 2 }, new RequirementConfig { Item = "TrophyGjall", Amount = 2, AmountPerLevel = 1 } }; ItemConfig val4 = val3; CustomItem val5 = new CustomItem("gjall_summoning_staff", "StaffSkeleton", val4); if (val5 != null && val5.IsValid()) { SharedData shared = val5.ItemDrop.m_itemData.m_shared; shared.m_attack.m_attackEitr = EitrCost.Value; SwapHeldVisualToTick(((Component)val5.ItemDrop).gameObject); ItemManager.Instance.AddItem(val5); Logger.LogInfo((object)"Gjall Summoner Loaded."); } } private static void SwapHeldVisualToTick(GameObject itemPrefab) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Expected O, but got Unknown //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Expected O, but got Unknown //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Expected O, but got Unknown //IL_02c6: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: Expected O, but got Unknown //IL_03de: Unknown result type (might be due to invalid IL or missing references) //IL_03f0: Unknown result type (might be due to invalid IL or missing references) //IL_0402: Unknown result type (might be due to invalid IL or missing references) //IL_040c: Unknown result type (might be due to invalid IL or missing references) Transform val = itemPrefab.transform.Find("attach"); if ((Object)(object)val == (Object)null) { Logger.LogWarning((object)"Gjall Staff: could not find 'attach' child on item prefab."); return; } List list = new List(); foreach (Transform item in val) { Transform val2 = item; if (((Object)val2).name.StartsWith("fi_vil_combs")) { list.Add(((Component)val2).gameObject); } } foreach (GameObject item2 in list) { Object.DestroyImmediate((Object)(object)item2); } GameObject prefab = PrefabManager.Instance.GetPrefab("Tick"); if ((Object)(object)prefab == (Object)null) { Logger.LogWarning((object)"Gjall Staff: could not find Tick prefab."); return; } Transform val3 = prefab.transform.Find("Visual"); if ((Object)(object)val3 == (Object)null) { Logger.LogWarning((object)"Gjall Staff: could not find Visual child on Tick prefab."); return; } GameObject val4 = new GameObject("TickVisual"); val4.AddComponent(); val4.transform.SetParent(val, false); val4.transform.localPosition = new Vector3(0f, -0.05f, -0.006f); val4.transform.localRotation = new Quaternion(0.6107058f, -0.3564245f, -0.6107058f, -0.3564245f); val4.transform.localScale = Vector3.one * 0.25f; SkinnedMeshRenderer[] componentsInChildren = ((Component)val3).GetComponentsInChildren(); foreach (SkinnedMeshRenderer val5 in componentsInChildren) { Mesh val6 = new Mesh(); val5.BakeMesh(val6); GameObject val7 = new GameObject(((Object)val5).name); val7.transform.SetParent(val4.transform, false); MeshFilter val8 = val7.AddComponent(); val8.sharedMesh = val6; MeshRenderer val9 = val7.AddComponent(); ((Renderer)val9).sharedMaterials = ((Renderer)val5).sharedMaterials; Material[] materials = ((Renderer)val9).materials; Material[] array = materials; foreach (Material val10 in array) { val10.EnableKeyword("_EMISSION"); val10.SetColor("_EmissionColor", new Color(0.25f, 0.05f, 0.7f) * 0.25f); } ((Renderer)val9).materials = materials; } GameObject val11 = new GameObject("GlowLight"); val11.transform.SetParent(val, false); val11.transform.localPosition = Vector3.zero; Light val12 = val11.AddComponent(); val12.type = (LightType)2; val12.color = new Color(0.69f, 0.265f, 0.816f, 1f); val12.intensity = 0.4f; val12.range = 0.6f; val12.shadows = (LightShadows)0; GameObject prefab2 = PrefabManager.Instance.GetPrefab("StaffSkeleton"); if (!((Object)(object)prefab2 != (Object)null)) { return; } Transform val13 = prefab2.transform.Find("attach"); Transform val14 = ((val13 != null) ? val13.Find("equiped") : null); if (!((Object)(object)val14 != (Object)null)) { return; } foreach (Transform item3 in val14) { Transform val15 = item3; if ((Object)(object)((Component)val15).GetComponent() != (Object)null) { GameObject val16 = Object.Instantiate(((Component)val15).gameObject, val); ((Object)val16).name = ((Object)val15).name; val16.transform.localPosition = Vector3.zero; val16.transform.localRotation = Quaternion.identity; val16.transform.localScale = Vector3.one * 0.5f; val16.SetActive(true); ParticleSystem component = val16.GetComponent(); if ((Object)(object)component != (Object)null) { component.Play(true); } } } } public static void SummonGjall(Player player, int staffQuality = 1) { //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown if (Time.time - lastCastTime < Cooldown.Value) { ((Character)player).Message((MessageType)2, $"Cooldown: {Mathf.CeilToInt(Cooldown.Value - (Time.time - lastCastTime))}s", 0, (Sprite)null); return; } if (currentGjall >= MaxGjall.Value) { ((Character)player).Message((MessageType)2, "Maximum Gjall reached", 0, (Sprite)null); return; } if (player.GetEitr() < EitrCost.Value) { ((Character)player).Message((MessageType)2, "Not enough Eitr", 0, (Sprite)null); return; } GameObject prefab = PrefabManager.Instance.GetPrefab("Gjall"); if ((Object)(object)prefab == (Object)null) { return; } FieldInfo field = typeof(Character).GetField("m_zanim", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { ZSyncAnimation val = (ZSyncAnimation)field.GetValue(player); if ((Object)(object)val != (Object)null) { val.SetTrigger("staff_summon"); } } ((Character)player).UseEitr(EitrCost.Value); currentGjall++; lastCastTime = Time.time; ((MonoBehaviour)instance).StartCoroutine(SpawnGjallDelayed(player, prefab, staffQuality, 1f)); } [IteratorStateMachine(typeof(d__13))] private static IEnumerator SpawnGjallDelayed(Player player, GameObject prefab, int staffQuality, float delay) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__13(0) { player = player, prefab = prefab, staffQuality = staffQuality, delay = delay }; } } public class SummonedGjallTag : MonoBehaviour { } public class TickVisualMarker : MonoBehaviour { } public class GjallDespawn : MonoBehaviour { private float timer; public void Init(float time) { timer = time; } private void Update() { timer -= Time.deltaTime; if (timer <= 0f) { GjallStaffMod.currentGjall = Mathf.Max(0, GjallStaffMod.currentGjall - 1); ZNetView component = ((Component)this).GetComponent(); if (Object.op_Implicit((Object)(object)component) && component.IsOwner()) { ZNetScene.instance.Destroy(((Component)this).gameObject); } else { Object.Destroy((Object)(object)((Component)this).gameObject); } } } } public class TamedGjallAI : MonoBehaviour { private Character character; private Player owner; private float scanTimer; public void Init(Player player, Character charRef) { owner = player; character = charRef; BaseAI component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null) { FieldInfo field = typeof(BaseAI).GetField("m_followTarget", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { field.SetValue(component, ((Component)player).gameObject); } MethodInfo method = typeof(BaseAI).GetMethod("SetAlerted", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method != null) { method.Invoke(component, new object[1] { true }); } } } private void Update() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_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) if ((Object)(object)owner == (Object)null || (Object)(object)character == (Object)null) { return; } if (Vector3.Distance(((Component)this).transform.position, ((Component)owner).transform.position) > 85f) { ((Component)this).transform.position = ((Component)owner).transform.position + Vector3.up * 10f; } scanTimer += Time.deltaTime; if (scanTimer >= 2f) { scanTimer = 0f; Character val = FindClosestEnemy(50f); if ((Object)(object)val != (Object)null) { character.StartAttack(val, false); } } } private Character FindClosestEnemy(float range) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 //IL_003e: 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) Character result = null; float num = range; foreach (Character allCharacter in Character.GetAllCharacters()) { if ((Object)(object)allCharacter != (Object)null && (int)allCharacter.m_faction > 0) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)allCharacter).transform.position); if (num2 < num) { result = allCharacter; num = num2; } } } return result; } }