IVida.cs

Interface IVida and helper Vidas. IVida defines a health/damage contract for entities that nextbots can perceive and attack, including properties for GameObject, position, alive state, current health, damage method, and flags for player and out-of-combat. Vidas provides a utility to enumerate all IVida components in a Scene.

Reflection
namespace SBH;

using Sandbox;
using System.Collections.Generic;

/// <summary>
/// [SBHBase] Algo que los nextbots pueden percibir, perseguir y dañar.
/// La librería trae el componente Vida listo para usar; cada juego puede
/// además implementar esta interfaz en sus propios tipos (p. ej. su Player,
/// delegando en su sistema de daño) y los nextbots los cazarán igual.
/// GameObject y WorldPosition los aporta Component gratis.
/// </summary>
public interface IVida : IValid
{
	GameObject GameObject { get; }
	Vector3 WorldPosition { get; }
	bool EstaMuerto { get; }
	float VidaActual { get; }
	void RecibirDanio( float cantidad, GameObject atacante = null );

	/// <summary>
	/// ¿Es un jugador humano? Lo consultan los interruptores tipo notarget
	/// (sbh.ia.ignorar). Los adaptadores de Player devuelven true.
	/// </summary>
	bool EsJugador => false;

	/// <summary>
	/// ¿Fuera del combate? Sentidos y cerebros lo saltean por completo: no es
	/// objetivo ni enemigo mientras dure. Lo usa la posesión (el cuerpo
	/// estacionado del jugador) y sirve para cinemáticas o estados fantasma.
	/// Sigue siendo dañable — solo desaparece del radar de la IA.
	/// </summary>
	bool FueraDeCombate => false;
}

/// <summary>
/// [SBHBase] Búsqueda de vidas en la escena.
/// </summary>
public static class Vidas
{
	/// <summary> Todas las vidas atacables de la escena (activas), sean componentes Vida o adaptadores del juego. </summary>
	public static IEnumerable<IVida> Todas( Scene escena )
		=> escena.GetAllComponents<IVida>();
}