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 ) { }
}