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
Worldde specs al arrancar el servidor - Para acceder a un componente en un sistema:
ReadStorage<'a, Health>oWriteStorage<'a, Health> - Para agregar un componente nuevo, definilo en
common/src/comp/, registralo encommon/src/comp/mod.rs, y registrá el storage en el servidor - Los componentes deben implementar
Componentde specs y típicamenteClone,Debug, yserde::Serialize/Deserializesi necesitan ser sincronizados por red