Zum Inhalt

Introducción al Desarrollo de Mods para Hytale

Bienvenido a la guía completa de desarrollo de mods para Hytale. Esta guía te introducirá al mundo del modding, explicando qué son los mods, qué puedes hacer con ellos, y cómo empezar.

¿Qué es un Mod?

Un mod (modificación) es un paquete que extiende y modifica Hytale, agregando contenido personalizado como:

  • Bloques y items nuevos
  • Entidades y criaturas
  • Mecánicas de juego
  • Sistemas completos
  • Assets visuales y sonoros

Mods vs Plugins

Plugins

Los plugins modifican el código del servidor en tiempo de ejecución usando transformación de bytecode.

Características: - Se cargan antes del servidor (early plugins) - Pueden modificar cualquier clase del juego - Útiles para cambiar comportamiento existente - No requieren assets adicionales - Principalmente código Java

Ejemplo de uso:

// Plugin que modifica comportamiento existente
public class DamageMultiplierPlugin implements ClassTransformer {
    @Override
    public byte[] transform(String className, String classPath, byte[] bytecode) {
        // Modificar método takeDamage() para multiplicar daño x2
        return transformedBytecode;
    }
}

Mods

Los mods combinan plugins con contenido personalizado (assets, configuraciones JSON, etc.).

Características: - Incluyen early plugins para lógica custom - Definen bloques, items, entidades nuevos - Incluyen assets (modelos, texturas, sonidos) - Configuraciones JSON para contenido - Sistema completo de modding

Ejemplo de estructura:

mi-mod/
├── earlyplugin/
│   └── MiModPlugin.jar          # Early plugin con lógica
├── assets/
│   ├── blocks/
│   │   └── custom_block.json    # Definición de bloque
│   ├── items/
│   │   └── custom_item.json     # Definición de item
│   └── models/
│       └── custom_block.vox     # Modelo 3D
└── mod.json                      # Metadata del mod

¿Cuándo Usar Cada Uno?

Necesitas... Usa
Cambiar comportamiento existente Plugin
Agregar nuevos bloques/items Mod
Modificar mecánicas del juego Plugin
Crear nuevas criaturas Mod
Sistema complejo con assets Mod
Hook simple sin assets Plugin

Recomendación: La mayoría de modificaciones complejas usan ambos - un early plugin para la lógica y un mod para el contenido.

¿Qué Puedes Hacer con Mods?

1. Bloques Personalizados

Crear bloques completamente nuevos con propiedades custom.

{
  "id": "mymod:custom_ore",
  "name": "Custom Ore",
  "hardness": 3.5,
  "model": "mymod:models/custom_ore",
  "drops": [
    {
      "item": "mymod:custom_gem",
      "count": {"min": 1, "max": 3}
    }
  ],
  "interactions": {
    "Mine": "mymod:mine_custom_ore"
  }
}

2. Items Personalizados

Items con funcionalidad única.

{
  "id": "mymod:magic_staff",
  "name": "Magic Staff",
  "type": "Tool",
  "maxStackSize": 1,
  "durability": 500,
  "interactions": {
    "RightClick": "mymod:cast_spell",
    "LeftClick": "mymod:melee_attack"
  },
  "model": "mymod:models/magic_staff"
}

3. Entidades y Criaturas

NPCs, enemigos, y criaturas personalizadas.

{
  "id": "mymod:custom_npc",
  "name": "Village Elder",
  "type": "NPC",
  "health": 100,
  "ai": "mymod:npc_ai",
  "interactions": {
    "Talk": "mymod:npc_dialogue",
    "Trade": "mymod:npc_trading"
  },
  "model": "mymod:models/village_elder"
}

4. Sistemas de Juego Completos

Combinar plugins y assets para crear sistemas complejos.

Ejemplo: Sistema de Magia

graph TD
    A[Sistema de Magia] --> B[Early Plugin]
    A --> C[Assets]
    B --> D[Spell Registry]
    B --> E[Mana System]
    B --> F[Casting Logic]
    C --> G[Spell Items]
    C --> H[Particle Effects]
    C --> I[Sound Effects]

5. Mecánicas Avanzadas

  • Sistemas de crafteo personalizados
  • Quest systems
  • Economía y comercio
  • Facciones y guilds
  • Skills y progresión
  • Minijuegos

Arquitectura de un Mod

Un mod bien estructurado sigue esta arquitectura:

graph LR
    A[Mod Package] --> B[Early Plugin]
    A --> C[Assets]
    A --> D[Configurations]
    B --> E[Core Logic]
    B --> F[Registries]
    B --> G[Event Handlers]
    C --> H[Models]
    C --> I[Textures]
    C --> J[Sounds]
    D --> K[JSON Configs]
    D --> L[Data Files]

Componentes Principales

1. Early Plugin

Código Java que se ejecuta antes del servidor.

package com.ejemplo.mimod;

import com.hypixel.hytale.plugin.early.ClassTransformer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class MiModPlugin implements ClassTransformer {

    @Override
    public int priority() {
        return 100;
    }

    @Override
    @Nullable
    public byte[] transform(@Nonnull String className,
                           @Nonnull String classPath,
                           @Nonnull byte[] bytecode) {
        // Inicializar mod al transformar HytaleServer
        if (className.equals("com.hypixel.hytale.server.core.HytaleServer")) {
            return injectModInitialization(bytecode);
        }

        return null;
    }

    private byte[] injectModInitialization(byte[] bytecode) {
        // Inyectar llamada a: MiMod.initialize()
        // Esto registrará bloques, items, etc.
        return transformedBytecode;
    }
}

2. Mod Registry

Sistema central que registra todo el contenido del mod.

package com.ejemplo.mimod;

import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
import java.util.List;

public class MiMod {

    public static final String MOD_ID = "mymod";
    public static final String MOD_NAME = "Mi Mod Increíble";
    public static final String VERSION = "1.0.0";

    /**
     * Inicializa el mod.
     * Llamado desde el early plugin.
     */
    public static void initialize() {
        System.out.println("[" + MOD_NAME + "] Initializing v" + VERSION);

        // Registrar interacciones
        registerInteractions();

        // Registrar bloques
        registerBlocks();

        // Registrar items
        registerItems();

        System.out.println("[" + MOD_NAME + "] Initialized successfully!");
    }

    private static void registerInteractions() {
        var store = Interaction.getAssetStore();
        store.loadAssets(MOD_ID + ":" + MOD_ID, List.of(
            new CastSpellInteraction(),
            new MineCustomOreInteraction(),
            new NPCDialogueInteraction()
        ));
    }

    private static void registerBlocks() {
        // Registrar bloques custom
        // Los JSONs en assets/ se cargarán automáticamente
    }

    private static void registerItems() {
        // Registrar items custom
        // Los JSONs en assets/ se cargarán automáticamente
    }
}

3. Assets

Archivos de configuración y recursos.

Estructura de assets:

assets/
├── blocks/
│   ├── custom_ore.json
│   └── magic_block.json
├── items/
│   ├── magic_staff.json
│   └── custom_gem.json
├── entities/
│   └── custom_npc.json
├── interactions/
│   ├── cast_spell.json
│   └── mine_custom_ore.json
├── models/
│   ├── custom_ore.vox
│   ├── magic_staff.vox
│   └── custom_npc.vox
├── textures/
│   ├── custom_ore.png
│   └── magic_staff.png
└── sounds/
    ├── spell_cast.ogg
    └── ore_break.ogg

Herramientas Necesarias

1. Desarrollo de Código

  • JDK 17+: Para compilar código Java
  • IntelliJ IDEA o Eclipse: IDE para desarrollo
  • Gradle o Maven: Build tools
  • Git: Control de versiones

2. Creación de Assets

  • MagicaVoxel: Editor de modelos voxel
  • GIMP o Photoshop: Edición de texturas
  • Audacity: Edición de sonidos
  • Blender: Modelado 3D avanzado (opcional)

3. Testing

  • Servidor de Hytale: Para probar tu mod
  • Debugger: Para debugging
  • Profiler: Para optimización

Primeros Pasos

1. Configurar Entorno de Desarrollo

# Crear directorio del proyecto
mkdir mi-primer-mod
cd mi-primer-mod

# Inicializar Git
git init

# Crear estructura básica
mkdir -p src/main/java/com/ejemplo/mimod
mkdir -p src/main/resources/META-INF/services
mkdir -p assets/{blocks,items,models,textures,sounds}

2. Crear build.gradle

plugins {
    id 'java'
}

group = 'com.ejemplo.mimod'
version = '1.0.0'

sourceCompatibility = '17'
targetCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    // Hytale API
    compileOnly files('libs/hytale-api.jar')

    // ASM para transformación
    implementation 'org.ow2.asm:asm:9.6'
    implementation 'org.ow2.asm:asm-commons:9.6'

    // FastUtil
    compileOnly 'it.unimi.dsi:fastutil:8.5.12'

    // Testing
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.3'
}

jar {
    archiveFileName = "${project.name}-${project.version}.jar"

    manifest {
        attributes(
            'Implementation-Title': project.name,
            'Implementation-Version': project.version
        )
    }

    // Incluir dependencias
    from {
        configurations.runtimeClasspath.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }

    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

tasks.named('test') {
    useJUnitPlatform()
}

3. Crear mod.json

{
  "id": "mymod",
  "name": "Mi Primer Mod",
  "version": "1.0.0",
  "description": "Un mod de ejemplo para Hytale",
  "authors": ["Tu Nombre"],
  "website": "https://ejemplo.com/mymod",
  "license": "MIT",

  "dependencies": {
    "hytale": ">=1.0.0"
  },

  "earlyPlugin": {
    "main": "com.ejemplo.mimod.MiModPlugin",
    "priority": 100
  },

  "assets": {
    "blocks": "assets/blocks",
    "items": "assets/items",
    "entities": "assets/entities",
    "interactions": "assets/interactions",
    "models": "assets/models",
    "textures": "assets/textures",
    "sounds": "assets/sounds"
  }
}

4. Estructura Completa del Proyecto

mi-primer-mod/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/
│       │       └── ejemplo/
│       │           └── mimod/
│       │               ├── MiModPlugin.java
│       │               ├── MiMod.java
│       │               ├── interactions/
│       │               │   ├── CastSpellInteraction.java
│       │               │   └── MineCustomOreInteraction.java
│       │               └── util/
│       │                   └── ModHelper.java
│       └── resources/
│           └── META-INF/
│               └── services/
│                   └── com.hypixel.hytale.plugin.early.ClassTransformer
├── assets/
│   ├── blocks/
│   ├── items/
│   ├── models/
│   └── textures/
├── build.gradle
├── settings.gradle
├── mod.json
├── README.md
└── LICENSE

Flujo de Trabajo de Desarrollo

graph TD
    A[Idea de Mod] --> B[Diseñar Contenido]
    B --> C[Crear Assets]
    B --> D[Escribir Código]
    C --> E[Configurar JSONs]
    D --> F[Implementar Lógica]
    E --> G[Compilar Mod]
    F --> G
    G --> H[Probar en Servidor]
    H --> I{¿Funciona?}
    I -->|No| J[Debug]
    J --> D
    I -->|Sí| K[Optimizar]
    K --> L[Documentar]
    L --> M[Publicar]

Conceptos Clave

1. Mod ID

Identificador único de tu mod. Debe ser: - Minúsculas - Sin espacios - Alfanumérico (y guiones bajos) - Único en el ecosistema de mods

public static final String MOD_ID = "mymod";

2. Namespacing

Todos los recursos usan el patrón modid:resource:

{
  "id": "mymod:custom_block",
  "texture": "mymod:textures/custom_block",
  "model": "mymod:models/custom_block"
}

3. Asset Loading

Hytale carga assets automáticamente desde directorios especificados en mod.json.

4. Registro de Contenido

Todo contenido custom debe registrarse en el AssetStore apropiado:

// Registrar interacciones
Interaction.getAssetStore().loadAssets("mymod:mymod", interactions);

// Registrar bloques
Block.getAssetStore().loadAssets("mymod:mymod", blocks);

// Registrar items
Item.getAssetStore().loadAssets("mymod:mymod", items);

Ejemplos de Mods

Mod Simple: Custom Block

Un mod básico que agrega un bloque personalizado.

Contenido: - 1 bloque custom - 1 interacción de minado - Textura y modelo

Mod Intermedio: Magic System

Un sistema de magia con: - Items mágicos (staffs, wands) - Interacciones de casting - Partículas y efectos - Sistema de mana

Mod Avanzado: RPG Extension

Un mod completo de RPG con: - Sistema de clases - Skills y habilidades - Quest system - NPCs y diálogos - Economía - Dungeons

Próximos Pasos

Ahora que entiendes los conceptos básicos, continúa con:

  1. Creating a Mod: Tutorial paso a paso para crear tu primer mod completo
  2. Interaction System: Aprende a crear interacciones personalizadas
  3. Meta System Usage: Usa el sistema de metadata para datos persistentes

Recursos Adicionales


¿Listo para empezar? Continúa con Creating a Mod