Saltar al contenido principal

Componentes ECS

Referencia de los componentes ECS más usados en Xindeler. Todos están definidos en common/src/comp/.

Para entender el modelo ECS, ver Arquitectura.


Posición y movimiento​

Pos​

pub struct Pos(pub Vec3<f32>);

Posición en el mundo en coordenadas de vóxel. Presente en todas las entidades con existencia física.

Vel​

pub struct Vel(pub Vec3<f32>);

Velocidad actual en metros por tick. El sistema de física la modifica cada tick según fuerzas y colisiones.

Ori​

pub struct Ori(/* quaternion interno */);

Orientación de la entidad. Expone métodos como look_dir(), right(), up().


Stats y vida​

Health​

pub struct Health {
pub current: u32,
pub maximum: u32,
pub is_dead: bool,
}

Vida actual y máxima. Cuando current llega a 0, is_dead se marca true y el sistema de muerte procesa la entidad.

Energy​

pub struct Energy {
pub current: u32,
pub maximum: u32,
}

Recurso consumido por habilidades. Se regenera pasivamente. Algunas clases lo llaman maná, stamina, o rage — el tipo subyacente es el mismo.

Stats​

pub struct Stats {
pub name: String,
pub level: u32,
pub exp: u32,
pub endurance: u32,
pub fitness: u32,
pub willpower: u32,
}

Stats base de la entidad. Afectan los cálculos de daño, vida máxima y regeneración de energía.

Poise​

pub struct Poise {
pub current: f32,
pub maximum: f32,
pub poise_change_rate: f32,
}

Resistencia a aturdimientos. Si llega a 0, la entidad entra en estado Stunned. Se recupera con el tiempo.


Inventario y equipamiento​

Inventory​

pub struct Inventory {
slots: Vec<Option<Item>>,
loadout: Loadout,
}

Contiene los ítems del personaje (mochila) y el equipamiento activo (Loadout). Los slots de equipamiento incluyen: mainhand, offhand, head, chest, back, hands, ring, neck, feet.

SkillSet​

pub struct SkillSet {
pub skills: HashMap<Skill, u8>,
pub exp: HashMap<SkillGroupKind, u32>,
}

Habilidades desbloqueadas y su nivel. La llave Skill es un enum que cubre todas las habilidades del juego.


Comportamiento y alineación​

Alignment​

pub enum Alignment {
Wild, // criaturas salvajes — atacan si se las provoca
Enemy, // hostiles a jugadores siempre
Npc, // neutrales, no atacan
Tame, // mascotas o NPCs domesticados
Owned(Uid), // pertenece a una entidad específica
Passive, // nunca atacan
}

Define el comportamiento de combate por defecto de la entidad.

Agent​

Componente que activa la IA del servidor para una entidad. Sin Agent, la entidad es estática (no patrulle, no reacciona). Contiene el estado del comportamiento actual: patrolling, attacking, fleeing, interacting.

CharacterState​

Estado actual de animación/acción del personaje: Idle, Run, Jump, Attack(ComboMelee { .. }), Roll, Glide, etc. El cliente lo usa para animar al personaje; el servidor lo valida.


Red y sincronización​

Uid​

pub struct Uid(pub u64);

ID único universal de una entidad, sincronizado entre cliente y servidor. El Entity de specs es local al proceso — Uid es el identificador de red.

Client​

Componente presente solo en entidades que tienen un jugador conectado. Contiene el stream QUIC para enviar mensajes al cliente.

Presence​

Indica que la entidad tiene un jugador activo y define el rango de visión (qué chunks y entidades se sincronizan al cliente).


Mundo y terreno​

ChunkPos​

Posición de un chunk en coordenadas de chunk (no de vóxel). ChunkPos(x, y) corresponde al chunk que contiene el vóxel (x*32, y*32).


Convenciones de uso​

  • Los componentes se registran en el World de specs al arrancar el servidor
  • Para acceder a un componente en un sistema: ReadStorage<'a, Health> o WriteStorage<'a, Health>
  • Para agregar un componente nuevo, definilo en common/src/comp/, registralo en common/src/comp/mod.rs, y registrá el storage en el servidor
  • Los componentes deben implementar Component de specs y típicamente Clone, Debug, y serde::Serialize/Deserialize si necesitan ser sincronizados por red