DemoCommands.cs
using SWB.Player;

namespace SWB.Demo;

internal class DemoCommands
{
	[ConCmd( "kill", Help = "Kills the player" )]
	public static void Kill()
	{
		var player = PlayerBase.Local;
		var suicideDamageInfo = new Shared.DamageInfo
		{
			Attacker = player?.GameObject ?? null,
			Inflictor = null,
			Damage = 99999,
		};
		player?.TakeDamage( suicideDamageInfo );
	}

	[ConCmd( "thirdperson", Help = "Toggles thirdperson" )]
	public static void Thirdperson()
	{
		var player = PlayerBase.Local;
		var cam = player.CameraMovement as CameraMovement;
		cam.Distance = cam.Distance > 0 ? 0 : 60;
	}

	[ConCmd( "thirdperson_shoulder", Help = "Switches thirdperson shoulder" )]
	public static void ThirdpersonShoulder()
	{
		var player = PlayerBase.Local;
		var cam = player.CameraMovement as CameraMovement;
		cam.ShoulderOffset = -cam.ShoulderOffset;
	}

	[ConCmd( "respawn", Help = "Respawns the player (host only)" )]
	public static void Respawn()
	{
		var player = PlayerBase.Local;
		if ( !player.IsHost ) return;
		player?.Respawn();
	}

	[ConCmd( "god", Help = "Toggles godmode (host only)" )]
	public static void GodMode()
	{
		var player = PlayerBase.Local;
		if ( !player.IsHost ) return;
		player.GodMode = !player.GodMode;
		Log.Info( (player.GodMode ? "Enabled" : "Disabled") + " Godmode" );
	}

	[ConCmd( "noclip", Help = "Toggles noclip (host only)" )]
	public static void Noclip()
	{
		var player = PlayerBase.Local;
		if ( !player.IsHost ) return;
		player.ToggleNoclip();
		Log.Info( (player.Noclip ? "Enabled" : "Disabled") + " Noclip" );
	}


	[ConCmd( "changemap", Help = "Change the map (host only)" )]
	public static void ChangeMap( string mapIdent )
	{
		var player = PlayerBase.Local;
		if ( player is not null && !player.IsHost ) return;

		SceneLoadOptions options = new()
		{
			ShowLoadingScreen = true,
			DeleteEverything = true,
		};

		var networkManager = Game.ActiveScene.GetComponentInChildren<DemoNetworkManager>();
		options.SetScene( networkManager.MainScene );
		LaunchArguments.Map = mapIdent;
		Game.ChangeScene( options );
	}

	[ConCmd( "setactive", Help = "Changes the active inventory item" )]
	public static void ChangeWeapon( string className )
	{
		var player = PlayerBase.Local;
		player.Inventory.SetActive( className );
	}

	[ConCmd( "bot", Help = "Adds a bot" )]
	public static void Bot()
	{
		var player = PlayerBase.Local;
		if ( !player.IsHost ) return;

		var bot = DemoBot.AddBot();
		Log.Info( bot.DisplayName + " joined the game!" );
	}
}