Decompiled source of SummonUndeadSpell v1.1.1

BepInEx/plugins/SummonUndead/Summon Undead Spell.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BlackMagicAPI.Enums;
using BlackMagicAPI.Managers;
using BlackMagicAPI.Modules.Spells;
using FishNet;
using FishNet.Connection;
using FishNet.Managing.Server;
using FishNet.Object;
using FishUtilities.Managers;
using HarmonyLib;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("SummonSkeletonSpellMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SummonSkeletonSpellMod")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("a0a2ff6b-6f0b-47f8-ae45-70b101cca695")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
[HarmonyPatch(typeof(Generator2D), "RpcLogic___ServerSpawnSkeleMage_2166136261")]
public static class SkeleMageSpawnPatch
{
	[CompilerGenerated]
	private sealed class <DestroySpawnedRocksDelayed>d__2 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <DestroySpawnedRocksDelayed>d__2(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = null;
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<>2__current = null;
				<>1__state = 2;
				return true;
			case 2:
			{
				<>1__state = -1;
				GameObject[] array = (from n in Object.FindObjectsOfType<NetworkObject>()
					select ((Component)n).gameObject into o
					where ((Object)o).name.Contains("HiltRock") || ((Object)o).name.Contains("BladeRock")
					select o).ToArray();
				foreach (GameObject val in array)
				{
					Object.Destroy((Object)(object)val);
					Debug.Log((object)("[SkeleMageSpawnMod] Destroyed spawned rock: " + ((Object)val).name));
				}
				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();
		}
	}

	[HarmonyPrefix]
	public static void Prefix()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Expected O, but got Unknown
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		if (!SummonUndeadPlugin.OverrideSpawnPosition.HasValue)
		{
			return;
		}
		GameObject val = new GameObject("ForcedSpawnNode");
		val.tag = "ainodes";
		val.transform.position = SummonUndeadPlugin.OverrideSpawnPosition.Value;
		GameObject[] array = GameObject.FindGameObjectsWithTag("ainodes");
		foreach (GameObject val2 in array)
		{
			if ((Object)(object)val2 != (Object)(object)val)
			{
				val2.tag = "Untagged";
			}
		}
		Vector3 position = val.transform.position;
		Debug.Log((object)("[SummonUndeadPlugin] Placed fake ainode at " + ((object)(Vector3)(ref position)).ToString()));
	}

	private static void Postfix(Generator2D __instance)
	{
		((MonoBehaviour)SummonUndeadPlugin.Instance).StartCoroutine(DestroySpawnedRocksDelayed());
	}

	[IteratorStateMachine(typeof(<DestroySpawnedRocksDelayed>d__2))]
	private static IEnumerator DestroySpawnedRocksDelayed()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DestroySpawnedRocksDelayed>d__2(0);
	}
}
internal class SummonUndeadData : SpellData
{
	public override SpellType SpellType => (SpellType)0;

	public override string Name => "Summon Undead";

	public override float Cooldown => 15f;

	public override Color GlowColor => Color.green;
}
internal class SummonUndeadLogic : SpellLogic
{
	public override void CastSpell(GameObject caster, PageController page, Vector3 direction, Vector3 targetPoint, int level)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: 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)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		if (direction == Vector3.zero)
		{
			direction = caster.transform.forward;
		}
		Vector3 val = SummonUndeadPlugin.FindValidNavMeshSpawn(caster.transform.position + ((Vector3)(ref direction)).normalized * 10f);
		SummonUndeadPlugin.AddForcedAINode(val);
		SummonUndeadPlugin.SetNextSpawnPosition(val);
		SummonUndeadPlugin.PostSpawnAdjustments(SummonUndeadPlugin.ForceSpawnSkeleMage(val), caster);
	}
}
[BepInPlugin("Freezie.summonskeletonspell.91", "Summon Skeleton Spell", "1.0.0")]
public class SummonUndeadPlugin : BaseUnityPlugin
{
	[CompilerGenerated]
	private sealed class <DelayedAdjustHP>d__18 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public GameObject skeleMage;

		public float newHP;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <DelayedAdjustHP>d__18(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = null;
				<>1__state = 1;
				return true;
			case 1:
			{
				<>1__state = -1;
				Component component = skeleMage.GetComponent("SkelemageController");
				if ((Object)(object)component != (Object)null)
				{
					FieldInfo field = ((object)component).GetType().GetField("hp", BindingFlags.Instance | BindingFlags.NonPublic);
					if (field != null)
					{
						field.SetValue(component, newHP);
						Debug.Log((object)$"[SkeleMageSpawnMod] Delayed HP set to {newHP}");
					}
					else
					{
						Debug.LogWarning((object)"[SkeleMageSpawnMod] Could not find 'hp' field via reflection.");
					}
				}
				else
				{
					Debug.LogWarning((object)"[SkeleMageSpawnMod] SkeleMageController not found on spawned mage.");
				}
				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 <DelayedInject>d__8 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <DelayedInject>d__8(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = (object)new WaitForSeconds(2f);
				<>1__state = 1;
				return true;
			case 1:
				<>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 <DelayedTeleport>d__21 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <DelayedTeleport>d__21(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = (object)new WaitForSeconds(0.5f);
				<>1__state = 1;
				return true;
			case 1:
			{
				<>1__state = -1;
				GameObject[] array = (from n in Object.FindObjectsOfType<NetworkObject>()
					where ((Object)n).name.Contains("SkeleMage")
					select ((Component)n).gameObject).ToArray();
				if (array.Length == 0)
				{
					Debug.LogError((object)"[SkeleMageSpawnMod] No SkeleMage found after spawn!");
					return false;
				}
				GameObject val = array.OrderByDescending((GameObject s) => ((Object)s).GetInstanceID()).First();
				if (OverrideSpawnPosition.HasValue)
				{
					val.transform.position = OverrideSpawnPosition.Value;
					Vector3 value = OverrideSpawnPosition.Value;
					Debug.Log((object)("[SkeleMageSpawnMod] Teleported SkeleMage to " + ((object)(Vector3)(ref value)).ToString()));
					OverrideSpawnPosition = null;
				}
				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 string modsync = "all";

	public static SummonUndeadPlugin Instance;

	public static Vector3? OverrideSpawnPosition = null;

	private static GameObject forcedNode;

	private static List<GameObject> cachedAINodes = new List<GameObject>();

	private bool hasInjectedPage;

	public static MonoBehaviour SceneContext;

	private static GameObject skeleMagePrefab;

	private void Awake()
	{
		//IL_0005: 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: Expected O, but got Unknown
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject("FishContextHelper");
		Object.DontDestroyOnLoad((Object)val);
		val.AddComponent<FishContextHelper>();
		Instance = this;
		BlackMagicManager.RegisterSpell((BaseUnityPlugin)(object)this, typeof(SummonUndeadData), typeof(SummonUndeadLogic));
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Summon Undead Test Plugin Loaded.");
		new Harmony("com.freezie.skelemagespawnmod").PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"SkeleMage Spawn Override Patch Applied.");
		TryFindSkeleMagePrefab();
		FishManager.RegisterNetworkObjectPrefab((BaseUnityPlugin)(object)Instance, (MonoBehaviour)(object)FishContextHelper.Instance, "SkeleMage", false);
	}

	[IteratorStateMachine(typeof(<DelayedInject>d__8))]
	private IEnumerator DelayedInject()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DelayedInject>d__8(0);
	}

	private void SpawnSummonUndeadPage()
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: 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_00e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GameObject.FindGameObjectWithTag("NetItemManager");
		if ((Object)(object)val == (Object)null)
		{
			Debug.LogError((object)"[SummonUndeadPlugin] NetItemManager not found.");
			return;
		}
		PageLootTable component = val.GetComponent<PageLootTable>();
		if ((Object)(object)component == (Object)null || component.Pages.Length <= 7)
		{
			Debug.LogError((object)"[SummonUndeadPlugin] PageLootTable not found or SummonUndeadPage not loaded.");
			return;
		}
		PlayerMovement val2 = Object.FindObjectOfType<PlayerMovement>();
		if ((Object)(object)val2 == (Object)null)
		{
			Debug.LogError((object)"[SummonUndeadPlugin] Player not found.");
			return;
		}
		Vector3 position = ((Component)val2).transform.position + Vector3.forward * 2f;
		GameObject val3 = Object.Instantiate<GameObject>(component.Pages[7]);
		val3.transform.position = position;
		val3.transform.localRotation = Quaternion.Euler(10f, 0f, 180f);
		if ((Object)(object)val3.GetComponent<NetworkObject>() != (Object)null)
		{
			ServerManager val4 = Object.FindObjectOfType<ServerManager>();
			if ((Object)(object)val4 != (Object)null)
			{
				val4.Spawn(val3, (NetworkConnection)null, default(Scene));
				Debug.Log((object)"[SummonUndeadPlugin] SummonUndeadPage spawned via ServerManager.");
			}
			else
			{
				Debug.LogError((object)"[SummonUndeadPlugin] ServerManager not found.");
			}
		}
		else
		{
			Debug.LogError((object)"[SummonUndeadPlugin] Spawned page has no NetworkObject!");
		}
	}

	public static void SetNextSpawnPosition(Vector3 position)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		OverrideSpawnPosition = position;
	}

	public static void AddForcedAINode(Vector3 position)
	{
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Expected O, but got Unknown
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)forcedNode != (Object)null)
		{
			Object.Destroy((Object)(object)forcedNode);
		}
		forcedNode = new GameObject("ForcedAINode");
		forcedNode.tag = "ainodes";
		forcedNode.transform.position = position;
		Vector3 val = position;
		Debug.Log((object)("[SkeleMageSpawnMod] Forced AINode created at: " + ((object)(Vector3)(ref val)).ToString()));
	}

	public static GameObject ForceSpawnSkeleMage(Vector3 spawnPosition)
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)skeleMagePrefab == (Object)null)
		{
			Debug.LogError((object)"[SkeleMageSpawnMod] SkeleMage prefab not cached. Did you run TryFindSkeleMagePrefab?");
			return null;
		}
		GameObject val = Object.Instantiate<GameObject>(skeleMagePrefab, spawnPosition, Quaternion.identity);
		val.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
		Vector3 val2 = spawnPosition;
		Debug.Log((object)("[SkeleMageSpawnMod] Spawned SkeleMage manually at: " + ((object)(Vector3)(ref val2)).ToString()));
		if (InstanceFinder.IsServer)
		{
			ServerManager serverManager = InstanceFinder.ServerManager;
			if ((Object)(object)serverManager != (Object)null)
			{
				serverManager.Spawn(val, (NetworkConnection)null, default(Scene));
				Debug.Log((object)"[SkeleMageSpawnMod] Spawned SkeleMage via ServerManager.");
			}
			else
			{
				Debug.LogError((object)"[SkeleMageSpawnMod] ServerManager not available.");
			}
			Debug.Log((object)"[SkeleMageSpawnMod] Spawned SkeleMage via FishManager.");
		}
		else
		{
			Debug.LogWarning((object)"[SkeleMageSpawnMod] Not on server, skipping network spawn.");
		}
		return val;
	}

	public static Vector3 FindValidNavMeshSpawn(Vector3 desiredPoint, int maxAttempts = 10, float stepOut = 0.5f)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: 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_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: 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_007e: Unknown result type (might be due to invalid IL or missing references)
		RaycastHit val = default(RaycastHit);
		for (int i = 0; i < maxAttempts; i++)
		{
			if (Physics.Raycast(desiredPoint + Vector3.right * stepOut * (float)i + Vector3.up * 5f, Vector3.down, ref val, 10f) && ((RaycastHit)(ref val)).normal.y > 0.5f)
			{
				Debug.Log((object)$"[SkeleMageSpawnMod] Found ground surface at {((RaycastHit)(ref val)).point} on attempt {i + 1}");
				return ((RaycastHit)(ref val)).point;
			}
		}
		Debug.LogWarning((object)"[SkeleMageSpawnMod] Could not find valid NavMesh ground. Defaulting to original point.");
		return desiredPoint;
	}

	public static void TryFindSkeleMagePrefab()
	{
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)skeleMagePrefab != (Object)null)
		{
			Debug.Log((object)"[SummonUndead] Prefab already cached.");
			return;
		}
		GameObject[] array = Resources.FindObjectsOfTypeAll<GameObject>();
		Debug.Log((object)$"[SummonUndead] Scanning {array.Length} objects for SkeleMage...");
		GameObject[] array2 = array;
		foreach (GameObject val in array2)
		{
			if (((Object)val).name.Contains("SkeleMage"))
			{
				Scene scene = val.scene;
				if (((Scene)(ref scene)).rootCount == 0 && (int)((Object)val).hideFlags == 0)
				{
					skeleMagePrefab = val;
					Debug.Log((object)("[SummonUndead] Found SkeleMage prefab: " + ((Object)val).name));
					return;
				}
			}
		}
		Debug.LogWarning((object)"[SummonUndead] No valid SkeleMage prefab found in memory.");
	}

	public static void PostSpawnAdjustments(GameObject skeleMage, GameObject caster)
	{
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)skeleMage == (Object)null)
		{
			return;
		}
		NavMeshAgent component = skeleMage.GetComponent<NavMeshAgent>();
		if ((Object)(object)component != (Object)null)
		{
			bool flag = component.Warp(skeleMage.transform.position);
			Debug.Log((object)$"[SummonUndead] Warp success: {flag}");
		}
		SkelemageController component2 = skeleMage.GetComponent<SkelemageController>();
		if ((Object)(object)component2 != (Object)null)
		{
			Transform val = FindTargetAtLookDirection() ?? caster.transform;
			FieldInfo field = typeof(SkelemageController).GetField("CurrentTarget", BindingFlags.Instance | BindingFlags.NonPublic);
			if (field != null)
			{
				field.SetValue(component2, val);
				Debug.Log((object)"[SkeleMageSpawnMod] Assigned CurrentTarget.");
			}
			if ((Object)(object)component2.AniController != (Object)null && (Object)(object)val != (Object)null)
			{
				component2.AniController.target = val;
				Debug.Log((object)"[SkeleMageSpawnMod] Assigned AniController target.");
			}
		}
		AdjustSkeleMageHPWithDelay(skeleMage);
	}

	public static void AdjustSkeleMageHPWithDelay(GameObject skeleMage, float newHP = 50f)
	{
		((MonoBehaviour)Instance).StartCoroutine(DelayedAdjustHP(skeleMage, newHP));
	}

	[IteratorStateMachine(typeof(<DelayedAdjustHP>d__18))]
	private static IEnumerator DelayedAdjustHP(GameObject skeleMage, float newHP)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DelayedAdjustHP>d__18(0)
		{
			skeleMage = skeleMage,
			newHP = newHP
		};
	}

	public static void AdjustSkeleMageHP(GameObject skeleMage, float newHP = 50f)
	{
		Component component = skeleMage.GetComponent("SkelemageController");
		if ((Object)(object)component != (Object)null)
		{
			FieldInfo field = ((object)component).GetType().GetField("hp", BindingFlags.Instance | BindingFlags.NonPublic);
			if (field != null)
			{
				field.SetValue(component, newHP);
				Debug.Log((object)$"[SkeleMageSpawnMod] Set {((Object)skeleMage).name} HP to {newHP} via reflection.");
			}
			else
			{
				Debug.LogWarning((object)"[SkeleMageSpawnMod] Could not find 'hp' field via reflection.");
			}
		}
	}

	public static Transform FindTargetAtLookDirection()
	{
		//IL_000c: 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_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: 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_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		Camera main = Camera.main;
		Ray val = new Ray(((Component)main).transform.position, ((Component)main).transform.forward);
		Vector3 val2 = ((Component)main).transform.position + ((Component)main).transform.forward * 100f;
		RaycastHit val3 = default(RaycastHit);
		if (Physics.Raycast(val, ref val3, 100f))
		{
			val2 = ((RaycastHit)(ref val3)).point;
		}
		Transform[] array = (from pm in Object.FindObjectsOfType<PlayerMovement>()
			select ((Component)pm).transform).ToArray();
		Transform result = null;
		float num = float.PositiveInfinity;
		Transform[] array2 = array;
		foreach (Transform val4 in array2)
		{
			float num2 = Vector3.Distance(val4.position, val2);
			if (num2 < num && num2 < 10f)
			{
				result = val4;
				num = num2;
			}
		}
		return result;
	}

	[IteratorStateMachine(typeof(<DelayedTeleport>d__21))]
	private static IEnumerator DelayedTeleport()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DelayedTeleport>d__21(0);
	}

	private static void SetSkeleMageTarget(SkelemageController controller, Transform target)
	{
		FieldInfo field = typeof(SkelemageController).GetField("CurrentTarget", BindingFlags.Instance | BindingFlags.NonPublic);
		if (field != null)
		{
			field.SetValue(controller, target);
			Debug.Log((object)("[SkeleMageSpawnMod] Assigned target to SkeleMage: " + ((Object)target).name));
		}
		else
		{
			Debug.LogError((object)"[SkeleMageSpawnMod] Failed to find 'CurrentTarget' field on SkelemageController.");
		}
	}

	public static void TeleportLastSpawnedSkeleMage()
	{
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		GameObject[] array = (from n in Object.FindObjectsOfType<NetworkObject>()
			where ((Object)n).name.Contains("SkeleMage")
			select ((Component)n).gameObject).ToArray();
		if (array.Length == 0)
		{
			Debug.LogError((object)"[SkeleMageSpawnMod] No SkeleMage found after spawn!");
			return;
		}
		GameObject val = array.OrderByDescending((GameObject s) => ((Object)s).GetInstanceID()).First();
		if (OverrideSpawnPosition.HasValue)
		{
			val.transform.position = OverrideSpawnPosition.Value;
			Vector3 value = OverrideSpawnPosition.Value;
			Debug.Log((object)("[SkeleMageSpawnMod] Teleported SkeleMage to " + ((object)(Vector3)(ref value)).ToString()));
			OverrideSpawnPosition = null;
		}
	}
}
public class FishContextHelper : MonoBehaviour
{
	public static FishContextHelper Instance;

	private void Awake()
	{
		Instance = this;
	}
}
namespace SummonSkeletonSpellMod;

public class Class1
{
}
internal class SpawnSummonUndeadPage
{
}