Component that acts as a kill zone trigger. When an object enters the trigger it ignores arena tiles and the kill zone owner, then either increments the local player's death count or increments the score, teleports the object to a spawn point (or a fallback position), and clears character and rigidbody velocities. It also logs a message in Russian when teleporting.
using Sandbox;
using System.Linq;
public sealed class KillZone : Component, Component.ITriggerListener
{
public void OnTriggerEnter( Collider other )
{
if ( !other.IsValid() || !other.GameObject.IsValid() ) return;
var targetObj = other.GameObject.Root;
if ( targetObj == GameObject ) return;
if ( targetObj.Components.Get<ArenaTile>( true ).IsValid() || other.GameObject.Components.Get<ArenaTile>( true ).IsValid() ) return;
var localPush = Scene.GetAllComponents<PushAbility>().FirstOrDefault( x => !x.IsProxy );
var localPlayerObj = localPush?.GameObject.Root;
if ( localPlayerObj.IsValid() && targetObj == localPlayerObj )
{
ScoreManager.Instance?.AddDeath();
}
else
{
ScoreManager.Instance?.AddScore( 1 );
}
var spawn = Scene.GetAllComponents<SpawnPoint>().FirstOrDefault();
Vector3 targetPosition = spawn.IsValid() ? spawn.WorldPosition : new Vector3( 0, 0, 250 );
targetObj.WorldPosition = targetPosition;
var character = targetObj.Components.Get<CharacterController>( true );
if ( character.IsValid() )
{
character.Velocity = Vector3.Zero;
}
var rb = targetObj.Components.Get<Rigidbody>( true );
if ( rb.IsValid() )
{
rb.Velocity = Vector3.Zero;
rb.AngularVelocity = Vector3.Zero;
}
Log.Info( $"Объект {targetObj.Name} упал в KillZone и телепортирован обратно!" );
}
public void OnTriggerExit( Collider other ) { }
}