CollisionKicker.cs
using Sandbox;


[Title( "Collision Kicker" )]
[Category( "AI" )]
public sealed class CollisionKicker : Component, Component.ITriggerListener
{
	[Property] public SoundEvent KickSound { get; set; }

	public void OnTriggerEnter( Collider other )
	{
		if ( !Networking.IsHost ) return;

		var pc = other.GameObject.Components.Get<PlayerController>( FindMode.EverythingInSelf )
			  ?? other.GameObject.Parent?.Components.Get<PlayerController>( FindMode.EverythingInSelf );

		if ( pc is null ) return;

		if ( KickSound is not null )
			BroadcastSound();

		// Use SteamId (ulong) instead of Connection -- Connection cannot be network serialized
		var owner = pc.GameObject.Network.Owner;
		if ( owner is not null )
			KickPlayer( owner.SteamId );
		else
			Log.Warning( "CollisionKicker: Player has no network owner!" );
	}

	[Rpc.Broadcast]
	private void KickPlayer( ulong targetId )
	{
		if ( Connection.Local.SteamId != targetId ) return;
		Log.Info( "You were kicked!" );
		Game.Disconnect();
	}

	[Rpc.Broadcast]
	private void BroadcastSound()
	{
		if ( KickSound is not null )
			Sound.Play( KickSound, WorldPosition );
	}

	public void OnTriggerExit( Collider other ) { }
}