Decompiled source of StadiaJungleBoss v1.1.7

plugins/Moffein-StadiaJungleBoss/StadiaJungleBoss.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using IL.RoR2;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
using RoR2.Navigation;
using StadiaJungleBoss.Components;
using StadiaJungleBoss.Setup;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;

[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("StadiaJungleBoss")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyTitle("StadiaJungleBoss")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: Guid("a6f16744-d914-4f76-ac36-c1e4709acd21")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace StadiaJungleBoss
{
	public static class Assets
	{
		public static class Prefabs
		{
			public static GameObject Button;

			public static GameObject Encounter;
		}

		public static AssetBundle mainAssetBundle;

		public static void PopulateAssets()
		{
			//IL_00bc: 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_011a: 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_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_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)mainAssetBundle))
			{
				using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("StadiaJungleBoss.stadiabossbundle"))
				{
					mainAssetBundle = AssetBundle.LoadFromStream(stream);
				}
				Prefabs.Button = mainAssetBundle.LoadAsset<GameObject>("BossButton");
				Shader shader = LegacyResourcesAPI.Load<Shader>("Shaders/Deferred/hgstandard");
				Material material = ((Renderer)Prefabs.Button.GetComponentInChildren<SkinnedMeshRenderer>()).material;
				material.shader = shader;
				Prefabs.Button.AddComponent<BossButtonController>();
				Prefabs.Button.AddComponent<NetworkIdentity>();
				PrefabAPI.RegisterNetworkPrefab(Prefabs.Button);
				GameObject val = mainAssetBundle.LoadAsset<GameObject>("StadiaJungleEncounter");
				val.AddComponent<NetworkIdentity>();
				TeamFilter val2 = val.AddComponent<TeamFilter>();
				val2.defaultTeam = (TeamIndex)2;
				BossGroup val3 = val.AddComponent<BossGroup>();
				val3.dropTable = Addressables.LoadAssetAsync<PickupDropTable>((object)"RoR2/Base/Common/dtTier3Item.asset").WaitForCompletion();
				val3.bossDropChance = 0f;
				val3.scaleRewardsByPlayerCount = true;
				val3.shouldDisplayHealthBarOnHud = true;
				ScriptedCombatEncounter val4 = val.AddComponent<ScriptedCombatEncounter>();
				val4.grantUniqueBonusScaling = true;
				val4.spawnOnStart = false;
				val4.teamIndex = (TeamIndex)2;
				SpawnInfo val5 = default(SpawnInfo);
				val5.cullChance = 0f;
				val5.spawnCard = (SpawnCard)(object)Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/Base/RoboBallBoss/cscSuperRoboBallBoss.asset").WaitForCompletion();
				SpawnInfo val6 = val5;
				val4.spawns = (SpawnInfo[])(object)new SpawnInfo[1] { val6 };
				EncounterController encounterController = val.AddComponent<EncounterController>();
				PrefabAPI.RegisterNetworkPrefab(val);
				Prefabs.Encounter = val;
			}
		}
	}
	internal static class MagmaWormChanges
	{
		public static bool enabled;

		public static ItemDef StatItem;

		private static BodyIndex MagmaWormIndex;

		public static void Initialize()
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			if (enabled)
			{
				InitItem();
				RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(GetBodyIndex));
				CharacterBody.GetDisplayName += new hook_GetDisplayName(ReplaceName);
				CharacterBody.GetSubtitle += new hook_GetSubtitle(ReplaceSubtitle);
				Util.GetBestBodyName += new Manipulator(SuppressMendingName);
			}
		}

		private static void SuppressMendingName(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallvirt(x, typeof(CharacterBody), "HasBuff")
			});
			val.Emit(OpCodes.Ldloc_0);
			val.EmitDelegate<Func<BuffIndex, CharacterBody, BuffIndex>>((Func<BuffIndex, CharacterBody, BuffIndex>)((BuffIndex buffIndex, CharacterBody body) => (buffIndex == Buffs.EliteEarth.buffIndex && CheckForWorm(body)) ? ((BuffIndex)(-1)) : buffIndex));
		}

		private static string ReplaceSubtitle(orig_GetSubtitle orig, CharacterBody self)
		{
			if (CheckForWorm(self))
			{
				return Language.GetString("STADIAJUNGLEBOSS_BODY_SUBTITLE");
			}
			return orig.Invoke(self);
		}

		private static string ReplaceName(orig_GetDisplayName orig, CharacterBody self)
		{
			if (CheckForWorm(self))
			{
				return Language.GetString("STADIAJUNGLEBOSS_BODY_NAME");
			}
			return orig.Invoke(self);
		}

		private static void GetBodyIndex()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			MagmaWormIndex = BodyCatalog.FindBodyIndex("MagmaWormBody");
		}

		private static void InitItem()
		{
			//IL_0021: 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)
			//IL_0085: Expected O, but got Unknown
			StatItem = ScriptableObject.CreateInstance<ItemDef>();
			((Object)StatItem).name = "StadiaBossMagmaWormItem";
			StatItem.deprecatedTier = (ItemTier)5;
			StatItem.nameToken = "Stadia Worm";
			StatItem.pickupToken = "Changes the attacks of Magma Worms.";
			StatItem.descriptionToken = "Changes the attacks of Magma Worms.";
			ItemDef statItem = StatItem;
			ItemTag[] array = new ItemTag[3];
			RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			statItem.tags = (ItemTag[])(object)array;
			ItemDisplayRule[] array2 = (ItemDisplayRule[])(object)new ItemDisplayRule[0];
			ItemAPI.Add(new CustomItem(StatItem, array2));
		}

		private static bool CheckForWorm(CharacterBody body)
		{
			//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)
			if (body.bodyIndex == MagmaWormIndex && Object.op_Implicit((Object)(object)body.inventory))
			{
				return body.inventory.GetItemCount(StatItem) > 0;
			}
			return false;
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.Moffein.StadiaJungleBoss", "Stadia Jungle Boss", "1.1.7")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	public class StadiaJungleBossPlugin : BaseUnityPlugin
	{
		public static PluginInfo pluginInfo;

		internal static EquipmentDef EliteEarthEquipment = Addressables.LoadAssetAsync<EquipmentDef>((object)"RoR2/DLC1/EliteEarth/EliteEarthEquipment.asset").WaitForCompletion();

		private void Awake()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			pluginInfo = ((BaseUnityPlugin)this).Info;
			Assets.PopulateAssets();
			Tokens.LoadLanguage();
			ReadConfig();
			SceneDirector.Start += new hook_Start(StageSetup.SceneDirectorHook);
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(CreateSpawnCard));
			MagmaWormChanges.Initialize();
		}

		private void ReadConfig()
		{
			//IL_0011: 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_002c: Expected O, but got Unknown
			//IL_002c: Expected O, but got Unknown
			MagmaWormChanges.enabled = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Magma Worm", "Enable Changes"), true, new ConfigDescription("Modify the Mending Magma Worm spawned by this mod, replacing its name and some other stuff.", (AcceptableValueBase)null, Array.Empty<object>())).Value;
		}

		private void CreateSpawnCard()
		{
			//IL_0014: 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_002b: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: 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_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			CharacterSpawnCard val = ScriptableObject.CreateInstance<CharacterSpawnCard>();
			((SpawnCard)val).directorCreditCost = 800;
			((SpawnCard)val).eliteRules = (EliteRules)1;
			val.noElites = false;
			((SpawnCard)val).prefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/MagmaWorm/MagmaWormMaster.prefab").WaitForCompletion();
			((SpawnCard)val).sendOverNetwork = true;
			((SpawnCard)val).requiredFlags = (NodeFlags)0;
			((SpawnCard)val).forbiddenFlags = (NodeFlags)2;
			((SpawnCard)val).occupyPosition = false;
			((SpawnCard)val).nodeGraphType = (GraphType)0;
			((SpawnCard)val).hullSize = (HullClassification)1;
			if (MagmaWormChanges.enabled)
			{
				val.itemsToGrant = (ItemCountPair[])(object)new ItemCountPair[2]
				{
					new ItemCountPair
					{
						itemDef = Items.TeleportWhenOob,
						count = 1
					},
					new ItemCountPair
					{
						itemDef = MagmaWormChanges.StatItem,
						count = 1
					}
				};
			}
			else
			{
				val.itemsToGrant = (ItemCountPair[])(object)new ItemCountPair[1]
				{
					new ItemCountPair
					{
						itemDef = Items.TeleportWhenOob,
						count = 1
					}
				};
			}
			val.equipmentToGrant = (EquipmentDef[])(object)new EquipmentDef[1] { EliteEarthEquipment };
			val.forbiddenAsBoss = true;
			EncounterController.bossCard = val;
		}
	}
}
namespace StadiaJungleBoss.Setup
{
	internal static class StageSetup
	{
		internal static void SceneDirectorHook(orig_Start orig, SceneDirector self)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: 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_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			if (((Scene)(ref activeScene)).name == "rootjungle")
			{
				BossButtonController.buttonsPressed = 0;
				BossButtonController.totalButtons = 0;
				GameObject val = GameObject.Find("HOLDER: Randomization");
				if (!Object.op_Implicit((Object)(object)val))
				{
					Debug.LogError((object)"StadiaJungleBoss: Could not find Randomization");
					return;
				}
				Transform val2 = val.transform.Find("GROUP: Large Treasure Chests");
				if (!Object.op_Implicit((Object)(object)val2))
				{
					Debug.LogError((object)"StadiaJungleBoss: Could not find Large Treasure Chests");
					return;
				}
				for (int i = 0; i < val2.childCount; i++)
				{
					Transform child = val2.GetChild(i);
					if (!Object.op_Implicit((Object)(object)child))
					{
						continue;
					}
					((Component)child).gameObject.SetActive(true);
					Transform val3 = child.Find("GoldChest");
					if (Object.op_Implicit((Object)(object)val3))
					{
						if (NetworkServer.active)
						{
							Debug.Log((object)"StadiaJungleBoss: Placing button.");
							GameObject val4 = Object.Instantiate<GameObject>(Assets.Prefabs.Button);
							val4.transform.position = val3.position - 1.2f * Vector3.up;
							val4.transform.rotation = val3.rotation;
							NetworkServer.Spawn(val4);
						}
						Debug.Log((object)"StadiaJungleBoss: Destroying potential gold chest.");
						Object.Destroy((Object)(object)((Component)val3).gameObject);
					}
					else
					{
						Debug.Log((object)("StadiaJungleBoss: No chest found in category " + i));
					}
				}
				GameObject val5 = Object.Instantiate<GameObject>(Assets.Prefabs.Encounter);
				NetworkServer.Spawn(val5);
			}
			orig.Invoke(self);
		}
	}
	internal static class Tokens
	{
		internal static string assemblyDir => Path.GetDirectoryName(StadiaJungleBossPlugin.pluginInfo.Location);

		internal static string languageRoot => Path.Combine(assemblyDir, "language");

		internal static void LoadLanguage()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			Language.SetFolders += new hook_SetFolders(fixme);
		}

		private static void fixme(orig_SetFolders orig, Language self, IEnumerable<string> newFolders)
		{
			if (Directory.Exists(languageRoot))
			{
				IEnumerable<string> second = Directory.EnumerateDirectories(Path.Combine(languageRoot), self.name);
				orig.Invoke(self, newFolders.Union(second));
			}
			else
			{
				orig.Invoke(self, newFolders);
			}
		}
	}
}
namespace StadiaJungleBoss.Components
{
	public class BossButtonController : NetworkBehaviour
	{
		public delegate void OnButtonPressed();

		public static OnButtonPressed OnButtonPressedActions;

		public static int totalButtons;

		public static int buttonsPressed;

		[SyncVar]
		public bool isPressedServer = false;

		public bool isPressedLocal = false;

		private bool enableOverlapSphere;

		private float overlapSphereRadius;

		private float overlapSphereStopwatch;

		private float overlapSphereFrequency;

		private Animator animator;

		public bool NetworkisPressedServer
		{
			get
			{
				return isPressedServer;
			}
			[param: In]
			set
			{
				((NetworkBehaviour)this).SetSyncVar<bool>(value, ref isPressedServer, 1u);
			}
		}

		private void Awake()
		{
			animator = ((Component)this).GetComponent<Animator>();
			if (!Object.op_Implicit((Object)(object)animator))
			{
				Debug.LogError((object)"StadiaJungleBoss: Could not find button animator");
			}
			if (NetworkServer.active)
			{
				NetworkisPressedServer = false;
			}
			isPressedLocal = false;
			overlapSphereRadius = 1.5f;
			overlapSphereFrequency = 5f;
			enableOverlapSphere = true;
			if (totalButtons < 4)
			{
				totalButtons++;
			}
		}

		private void FixedUpdate()
		{
			if (NetworkServer.active)
			{
				FixedUpdateServer();
			}
			if (!isPressedLocal && isPressedServer)
			{
				Pressed();
			}
		}

		private void FixedUpdateServer()
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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 (isPressedServer || !enableOverlapSphere)
			{
				return;
			}
			float num = 1f / overlapSphereFrequency;
			overlapSphereStopwatch += Time.fixedDeltaTime;
			if (overlapSphereStopwatch >= num)
			{
				overlapSphereStopwatch -= num;
				if (HGPhysics.DoesOverlapSphere(((Component)this).transform.position, overlapSphereRadius, LayerMask.op_Implicit(CommonMasks.characterBodiesOrDefault) | LayerMask.op_Implicit(CommonMasks.fakeActorLayers), (QueryTriggerInteraction)0))
				{
					NetworkisPressedServer = true;
					buttonsPressed++;
					OnButtonPressedActions?.Invoke();
				}
			}
		}

		private void Pressed()
		{
			isPressedLocal = true;
			enableOverlapSphere = false;
			if (Object.op_Implicit((Object)(object)animator))
			{
				animator.SetBool("pressed", true);
			}
			Util.PlaySound("Play_item_proc_bandolierSpawn", ((Component)this).gameObject);
		}

		private void UNetVersion()
		{
		}

		public override bool OnSerialize(NetworkWriter writer, bool forceAll)
		{
			if (forceAll)
			{
				writer.Write(isPressedServer);
				return true;
			}
			bool flag = false;
			if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0)
			{
				if (!flag)
				{
					writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits);
					flag = true;
				}
				writer.Write(isPressedServer);
			}
			if (!flag)
			{
				writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits);
			}
			return flag;
		}

		public override void OnDeserialize(NetworkReader reader, bool initialState)
		{
			if (initialState)
			{
				isPressedServer = reader.ReadBoolean();
				return;
			}
			int num = (int)reader.ReadPackedUInt32();
			if (((uint)num & (true ? 1u : 0u)) != 0)
			{
				isPressedServer = reader.ReadBoolean();
			}
		}
	}
	public class EncounterController : MonoBehaviour
	{
		public float spawnDelay = 3f;

		public static CharacterSpawnCard bossCard;

		private ScriptedCombatEncounter scriptedCombatEncounter;

		private bool showedWarning = false;

		private bool spawnedBoss = false;

		private float spawnDelayCountdown = 0f;

		private void Awake()
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			scriptedCombatEncounter = ((Component)this).GetComponent<ScriptedCombatEncounter>();
			for (int i = 0; i < scriptedCombatEncounter.spawns.Length; i++)
			{
				scriptedCombatEncounter.spawns[i].spawnCard = (SpawnCard)(object)bossCard;
			}
			BossButtonController.OnButtonPressedActions = (BossButtonController.OnButtonPressed)Delegate.Combine(BossButtonController.OnButtonPressedActions, new BossButtonController.OnButtonPressed(CheckButtons));
			BossGroup component = ((Component)this).GetComponent<BossGroup>();
			GameObject val = new GameObject();
			val.layer = LayerIndex.noCollision.intVal;
			val.transform.position = new Vector3(-156f, 100f, -152.5f);
			Object.Instantiate<GameObject>(val);
			component.dropPosition = val.transform;
		}

		private void OnDestroy()
		{
			BossButtonController.OnButtonPressedActions = (BossButtonController.OnButtonPressed)Delegate.Remove(BossButtonController.OnButtonPressedActions, new BossButtonController.OnButtonPressed(CheckButtons));
		}

		private void CheckButtons()
		{
			//IL_0026: 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_003b: Expected O, but got Unknown
			//IL_006f: 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_0084: Expected O, but got Unknown
			if (!showedWarning && BossButtonController.buttonsPressed == BossButtonController.totalButtons - 1)
			{
				showedWarning = true;
				Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
				{
					baseToken = "STADIAJUNGLEBOSS_SPAWN_WARNING"
				});
			}
			if (!spawnedBoss && BossButtonController.buttonsPressed >= BossButtonController.totalButtons)
			{
				spawnedBoss = true;
				spawnDelayCountdown = spawnDelay;
				Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
				{
					baseToken = "STADIAJUNGLEBOSS_SPAWN_BEGIN"
				});
			}
		}

		private void FixedUpdate()
		{
			if (NetworkServer.active && spawnDelayCountdown > 0f)
			{
				spawnDelayCountdown -= Time.fixedDeltaTime;
				if (spawnDelayCountdown <= 0f)
				{
					DoSpawn();
				}
			}
		}

		private void DoSpawn()
		{
			scriptedCombatEncounter.BeginEncounter();
		}
	}
}