Game component for a hide-and-seek style mode. Manages player spawn as hiders or seeker, tracks scene objects by tag, starts and stops rounds, spawns clones of configured prefab GameObjects, and cleans up ragdolls and spectators.
using Sandbox;
using System.Collections.Generic;
using Sandbox.Network;
using System;
public class game : Component, Component.INetworkListener
{
[Property] public GameObject Hider {get;set;}
[Property] public GameObject Seeker {get;set;}
[Property] public Vector2 Debug_Mode {get;set;}
[Property] public GameObject map {get;set;}
[Property] public GameObject Spectator {get;set;}
List<GameObject> Hiders = new List<GameObject>();
List<GameObject> Seekers = new List<GameObject>();
public List<Connection> Players = new List<Connection>();
List<GameObject> Ragdolls = new List<GameObject>();
List<GameObject> Spawnpoints = new List<GameObject>();
List<GameObject> Spectators = new List<GameObject>();
[Sync] public bool IsActive {get;set;} bool Can_Start_OR_Stop = true;
[Sync] public TimeUntil OverAt {get;set;} Random random;
protected override void OnStart()
{if (IsProxy) return; random = new System.Random();
Networking.CreateLobby(new LobbyConfig());}
public void OnActive(Connection c)
{
if (Debug_Mode.x > 0)
{
var _ = Debug_Mode.y > 0 ? Seeker.Clone() : Hider.Clone();
_.NetworkSpawn(c); Debug_Mode = Debug_Mode.WithY(-Debug_Mode.y);
return; }
if (!IsActive && Players.Count < 2)
{
var spectator = Spectator.Clone();
spectator.NetworkSpawn(c);
}
}
protected override void OnUpdate()
{ if (IsProxy || Debug_Mode.x > 0) return;
Hiders = new List<GameObject>(Scene.FindAllWithTag("hider"));
Seekers = new List<GameObject>(Scene.FindAllWithTag("seeker"));
Players = new List<Connection>(Connection.All);
Ragdolls = new List<GameObject>(Scene.FindAllWithTag("ragdoll"));
Spectators = new List<GameObject>(Scene.FindAllWithTag("spectator"));
for (int i = Players.Count - 1; i >= 0; i--)
{if (!Players[i].IsActive) Players.RemoveAt(i);}
if (Players.Count >= 2 && !IsActive && Can_Start_OR_Stop)
{ Grace(); OverAt = 180; IsActive = true;
Spawnpoints = new List<GameObject>(map.Children);
for (int i = Spawnpoints.Count - 1; i >= 0; i--)
{if (Spawnpoints[i].Name != "info_player_start")
Spawnpoints.RemoveAt(i);}
var seeker = Players[random.Next(Players.Count)];
var seeker_sp = Spawnpoints[random.Next(Spawnpoints.Count)];
foreach (var Player in Players)
{
if (Player == seeker)
{
var skr = Seeker.Clone(seeker_sp.WorldPosition);
skr.NetworkSpawn(Player); Spawnpoints.Remove(seeker_sp);
continue; }
var hider = Hider.Clone(Spawnpoints[random.Next(Spawnpoints.Count)].WorldPosition);
hider.NetworkSpawn(Player);
}
foreach (var ragdoll in Ragdolls)
ragdoll.Destroy();
foreach (var spectator in Spectators)
spectator.Destroy();
}
if ((Hiders.Count <= 0 || Seekers.Count <= 0 || OverAt == true) && IsActive && Can_Start_OR_Stop)
{ Grace(); OverAt = 180; IsActive = false;
foreach (var hider in Hiders)
hider.Destroy();
foreach (var seeker in Seekers)
seeker.Destroy();
foreach (var ragdoll in Ragdolls)
ragdoll.Destroy();
foreach (var spectator in Spectators)
spectator.Destroy();
}
}
async void Grace()
{
Can_Start_OR_Stop = false;
await Task.Delay(50);
Can_Start_OR_Stop = true;
}
}