Crear Entidades en Hytale

Hytale: Guías, Mods, Opiniones | Videojuegos en CIBERED

Esta guía te mostrará cómo crear y generar entidades en Hytale. Se recomienda tener conocimientos del ECS antes de continuar. Puedes consultar la guía de ECS aquí.

Explorando el Código de HytaleServer.jar

Obtener el Objeto World

Antes de generar una entidad, necesitas acceder al objeto World. Hay varias formas de hacerlo:

Usando el Objeto Player

World world = player.getWorld();

Usando la Clase Universe

World world = Universe.get().getWorld("your-world-uuid");

Luego, obtén el Store<EntityStore> del mundo:

Store<EntityStore> store = world.getEntityStore().getStore();

Crear Entidades

Una entidad es simplemente un Holder<EntityStore> con varios componentes adjuntos. Para crearla:

Holder<EntityStore> holder = EntityStore.REGISTRY.newHolder();

⚠️ Nota importante:
Para interactuar con el World, algunas operaciones requieren ejecutarse dentro del contexto del mundo. Usa world.execute() para encolar la tarea en el hilo del mundo:

world.execute(() -> {
    // Código de creación y spawn de entidades aquí
});

Obtener un Modelo

Cada entidad necesita un modelo (Model). Puedes consultar la lista de entidades disponibles aquí. Ejemplo usando un Minecart:

ModelAsset modelAsset = ModelAsset.getAssetMap().getAsset("Minecart");
Model model = Model.createScaledModel(modelAsset, 1.0f);

Transform Component

El TransformComponent indica la posición y rotación de la entidad en el mundo.

Desde el Jugador

TransformComponent transform = store.getComponent(playerRef.getReference(), EntityModule.get().getTransformComponentType());

Crear uno nuevo

Vector3d position = new Vector3d(0, 0, 0);
Vector3f rotation = new Vector3f(0, 0, 0);
TransformComponent transform = new TransformComponent(position, rotation);

Agregar Componentes a la Entidad

Todos los componentes que necesita la entidad se agregan al Holder:

holder.addComponent(TransformComponent.getComponentType(), new TransformComponent(position, rotation));
holder.addComponent(PersistentModel.getComponentType(), new PersistentModel(model.toReference()));
holder.addComponent(ModelComponent.getComponentType(), new ModelComponent(model));
holder.addComponent(BoundingBox.getComponentType(), new BoundingBox(model.getBoundingBox()));
holder.addComponent(NetworkId.getComponentType(), new NetworkId(store.getExternalData().takeNextNetworkId()));
holder.addComponent(Interactions.getComponentType(), new Interactions());

Componentes necesarios de Hytale

Estos son componentes que Hytale espera que existan en todas las entidades:

holder.ensureComponent(UUIDComponent.getComponentType());
holder.ensureComponent(Interactable.getComponentType()); // si la entidad será interactuable

Generar la Entidad en el Mundo

Finalmente, agrega la entidad al mundo usando addEntity. Recuerda que esto debe ejecutarse dentro del hilo del mundo (world.execute()):

store.addEntity(holder, AddReason.SPAWN);