Configuración de Recarga Automática para Desarrollo de Plugins de Minecraft en IDEA

Durante el proceso de desarrollo de plugins para Minecraft, una de las mayores frustraciones es la necesidad de reconstruir manualmente el plugin y luego recargarlo en el servidor tras cada cambio. Esta tarea repetitiva puede ralentizar significativamente el flujo de trabajo. Afortunadamente, es posible automatizar este proceso utilizando las capacidades de Maven en conjunto con un pequeño script auxiliar.

Esta solución aprovecha dos plugins de Maven, exec-maven-plugin y maven-jar-plugin, para orquestar la compilación, la implementación y la recarga automática del plugin en un servidor de Minecraft en ejecución.

Configuración de Maven

El archivo pom.xml de tu proyecto Maven necesita incluir configuraciones específicas para ambos plugins. El exec-maven-plugin se encargará de ejecutar un script Java personalizado en fases clave del ciclo de vida de Maven para enviar comandos de recarga al servidor. Por su parte, el maven-jar-plugin garantizará que el archivo JAR compilado de tu plugin se copie directamente al directorio de plugins del servidor de Minecraft.

<build>
    <plugins>
        <!-- Plugin para ejecutar comandos Java personalizados -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <!-- Ejecución para descargar el plugin antes de empaquetar -->
                <execution>
                    <id>desactivar-plugin-servidor</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <!-- Clase principal de nuestro script cliente -->
                        <mainClass>dev.reloader.PluginControlClient</mainClass>
                        <arguments>
                            <!-- Puerto de escucha del servidor, acción y nombre del plugin -->
                            <argument>8888</argument>
                            <argument>unload</argument>
                            <argument>MiPluginDesarrollo</argument>
                        </arguments>
                    </configuration>
                </execution>
                <!-- Ejecución para cargar el plugin después de empaquetar -->
                <execution>
                    <id>activar-plugin-servidor</id>
                    <phase>package</phase>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>dev.reloader.PluginControlClient</mainClass>
                        <arguments>
                            <argument>8888</argument>
                            <argument>load</argument>
                            <argument>MiPluginDesarrollo</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Plugin para configurar la salida del JAR -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <!-- Ruta de salida del JAR compilado, directamente a la carpeta de plugins de Minecraft -->
                <outputDirectory>/ruta/a/tu/servidor/minecraft/plugins</outputDirectory>
                <excludes>
                    <exclude>**/*.properties</exclude>
                    <exclude>**/*.xml</exclude>
                    <exclude>static/**</exclude>
                    <exclude>templates/**</exclude>
                    <exclude>**/PluginControlClient.class</exclude> <!-- Excluir nuestro script de control -->
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

Asegúrate de reemplazar MiPluginDesarrollo con el nombre real de tu plugin y /ruta/a/tu/servidor/minecraft/plugins con la ubicación correcta del directorio plugins de tu serviodr de Minecraft.

Cliente de Control de Plugin (Java)

El siguiente script Java, PluginControlClient.java, actúa como un cliente ligero que se conecta al servidor de Minecraft (a través de un plugin del lado del servidor que escuche en el puerto especificado) para enviar comandos de recarga. Este script es ejecutado por el exec-maven-plugin.

package dev.reloader;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class PluginControlClient {
    private static final String SERVER_HOST = "localhost"; // La IP del servidor de Minecraft

    public static void main(String[] args) {
        if (args.length != 3) {
            System.err.println("Uso: java PluginControlClient <puerto> <accion> <nombrePlugin>");
            System.err.println("Ejemplo: java PluginControlClient 8888 unload MyPlugin");
            System.exit(1);
        }

        int port;
        try {
            port = Integer.parseInt(args[0]);
        } catch (NumberFormatException e) {
            System.err.println("Error: El puerto debe ser un número entero válido.");
            System.exit(1);
            return; // unreachable but good practice
        }

        String action = args[1]; // e.g., "load", "unload"
        String pluginIdentifier = args[2]; // e.g., "MiPluginDesarrollo"

        try (Socket clientSocket = new Socket(SERVER_HOST, port);
             OutputStream outputStream = clientSocket.getOutputStream()) {

            // El formato del comando debe coincidir con lo que espera el plugin de recarga del servidor
            String command = String.format("reload_dev %s %s", action, pluginIdentifier);
            outputStream.write(command.getBytes());
            System.out.println("Comando de recarga enviado al servidor: " + command);

        } catch (IOException e) {
            System.err.println("No se pudo conectar al servidor o enviar el comando de recarga.");
            System.err.println("Asegúrate de que el servidor de Minecraft esté corriendo y el plugin de recarga esté activo en el puerto " + port + ".");
            e.printStackTrace();
        }
    }
}

Este script se conecta a localhost:8888 (o el puerto especificado) y envía una cadena de comando como "reload_dev unload MiPluginDesarrollo" o "reload_dev load MiPluginDesarrollo". Para que esto funcione, necesitas un plugin en tu servidro de Minecraft que escuche en ese puerto, analice estos comandos y realice la carga/descarga de plugins en consecuencia. Plugins como "Develop" o una versión modificada de Plugman pueden proporcionar esta funcionalidad.

Etiquetas: Minecraft Plugin Development maven IntelliJ IDEA Hot Reload

Publicado el 7-21 05:34