World/SpawnZone.cs

A game world SpawnZone component for KOTH that represents a team spawn area. It holds team, spawn time and linked SpawnDoor entries, manages a trigger collider, and listens for trigger enter/exit events to detect PlayerPawn components.

File Access
using Sandbox;
using Sandbox.Diagnostics;

namespace KOTH;

public sealed class SpawnZone : Zone, Component.ITriggerListener
{
	[RequireComponent] BoxCollider TriggerBoxCollider { get; set; }
	[Property] public Team Team { get; private set; } = Team.Unassigned;
	[Property] public float SpawnTime { get; private set; } = 0f;
	[Property] public List<SpawnDoor> SpawnDoors { get; set; } = new();

	private List<PlayerPawn> CurrentPlayerPawns = new();

	public void CreatePlayerCollisionBox()
	{
		Assert.True(Team.GetOpponents() == PlayerState.Local.Team);

		TriggerBoxCollider.IsTrigger = false;
	}

	protected override void OnStart()
	{
		base.OnStart();

		Tags.Add($"{Team}-spawn");
	}

	void ITriggerListener.OnTriggerEnter(Collider Collider)
	{
		var PlayerPawn = Collider.GameObject.Root.Components.Get<PlayerPawn>();

		if (!PlayerPawn.IsValid())
		{
			return;
		}
	}

	void ITriggerListener.OnTriggerExit(Collider Collider)
	{
		var PlayerPawn = Collider.GameObject.Root.Components.Get<PlayerPawn>();
		
		if (!PlayerPawn.IsValid())
		{
			return;
		}
	}
}