KillZone.cs
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;
// Находим объект локального игрока в сцене
var localPush = Scene.GetAllComponents<PushAbility>().FirstOrDefault( x => !x.IsProxy );
var localPlayerObj = localPush?.GameObject.Root;
// Определяем, кто упал: вы или бот
if ( localPlayerObj.IsValid() && targetObj == localPlayerObj )
{
// Упал ваш игрок -> засчитываем смерть (-20 очков, +1 смерть)
ScoreManager.Instance?.AddDeath();
}
else
{
// Упал бот -> начисляем +1 очко за сбитие
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 ) { }
}