Hytale Modding
Información recopilada

Información sobre el código del servidor

Slikey compartió algunas ideas sobre el código del servidor el 15 de diciembre de 2025. Este documento recoge los puntos clave y las conclusiones de ese debate.

Nota

La siguiente información se basa en los comentarios compartidos por el director técnico Slikey el 15 de diciembre de 2025 en el servidor Discord de Hytale. Proporciona una visión general de la arquitectura del código del servidor y las capacidades de los complementos.

La mayor parte de este documento son citas directas de Slikey con comentarios mínimos. Se trata más bien de preservar la información compartida que de reformularla.

Código fuente del servidor

El servidor se lanzará como código fuente compartido: tendremos el código fuente sin ofuscación y con todos sus comentarios.

Licencia

La licencia permite el uso para cualquier cosa relacionada con Hytale, siempre y cuando no utilices el servidor o el código fuente para crear tu propio juego o vender sus algoritmos.

Sistema de permisos

Tras ser preguntado en el servidor Hytale Modding, el arquitecto jefe Zero ha respondido:

Es bastante básico, así que no esperes mucho, pero sí, tenemos un sistema de permisos integrado. También admite la implementación de su propio backend. Por ejemplo, si quisieras almacenarlo en una base de datos.

Implementación de Generación del mundo

El siguiente bloque de texto es directamente del jefe de arquitectura Cero:

Puedes implementar fácilmente un generador de mundos personalizado en un complemento. Por lo tanto, si quieres una configuración o lógica totalmente diferente para generar el terreno, puedes añadirla a un complemento y luego configurar un mundo para utilizarla. Tenemos algunos prefabricados de carga y existe código en los generadores de mundos actuales que podría reutilizarse, pero no hay API específicas para los detalles de la generación en sí.

public interface IWorldGenProvider {
    BuilderCodecMapCodec<IWorldGenProvider> CODEC = new BuilderCodecMapCodec<>("Type", true);

    IWorldGen getGenerator() throws WorldGenLoadException;
}
public interface IWorldGen {
    @Nullable
    WorldGenTimingsCollector getTimings();

    CompletableFuture<GeneratedChunk> generate(int seed, long index, int x, int z, LongPredicate stillNeeded);

    @Deprecated
    Transform[] getSpawnPoints(int seed);

    @Nonnull
    default ISpawnProvider getDefaultSpawnProvider(int seed) {
        return new FitToHeightMapSpawnProvider(new IndividualSpawnProvider(getSpawnPoints(seed)));
    }

    default void shutdown() {}
}

Fragmentos de código del servidor

También se compartieron algunos fragmentos de código de un complemento que crearon. Los siguientes fragmentos son citas directas del director técnico Slikey:

Plugin Generador de Bloques

Bien, dejaré aquí algunos fragmentos de código para un plugin sencillo llamado "BlockSpawner", el cual se convertirá en un bloque "aleatorio" cuando se coloque en el mundo, basándose en las reglas que estén configuradas.

Aquí hay más código en general, pero muestra el sistema de activos y el diseño del complemento. Puedes ver que el sistema de assets define "Codecs", los cuales se usan para guardar (serializar) y cargar (deserializar) los datos. Usando estos "Codecs" podemos generar esquemas. Supongamos que te conectas a un servidor y abres el editor de activos: el servidor enviará esos esquemas, de modo que todos los tipos de activos definidos en el lado del servidor, incluso los tuyos propios, pasarán a formar parte del editor de activos del cliente, sin necesidad de hacer nada, solo tienes que disfrutar de la interfaz de usuario del editor para crear los activos que hayas definido.

Generador de Bloques Código 1 Generador de Bloques Código 2 Generador de Bloques Código 3 Manifiesto del Generador de Bloques

Supongo que esta parte también muestra un poco cómo usamos constantes para guardar algunas claves de idioma - Slikey. (en referencia a la imagen de abajo)

Constantes para almacenar claves de idioma

Puedes personalizar completamente el proveedor de almacenamiento de chunks. Por ejemplo, nosotros creamos uno que está vacío, por lo que no carga ningún chunk desde el disco. También podrías añadir un MySQLChunkStorageProvider, que lea los datos desde una base de datos.Lo mismo aplica para la generación del mundo (worldgen): simplemente puedes implementar esta interfaz para crear tu propio generador de mundos.

Chunks 1 Chunks 2 Chunks 3

En esta sección se definen todas las armas disponibles. Aunque existen limitaciones técnicas por descubrir, hay un margen amplio para realizar ajustes. Cabe destacar que este proceso es complejo, por lo que todavía queda pendiente implementar diversas mejoras de calidad de vida (QoL) para optimizar la experiencia

Armas 1