es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo usar Node JS para ejecutar un comando de Minecraft en un servidor de Minecraft envuelto?

Estoy creando un bot de Discord en Node que tendría la capacidad de controlar un servidor de Minecraft, pero por alguna razón no puedo hacer que el bot ejecute comandos de Minecraft en el propio servidor.

En este momento, el bot recibe cadenas normales de Discord de los mensajes y las interpreta como comandos. Este es el código que uso para iniciar el servidor:

var svEnv = cp.spawn("java", [
   "-Xms4096M",
   "-Xmx4096M",
   "-jar",
   "server.jar",
   "nogui"
], { shell: true, detached: true, cwd: <code>${config.server.directoryPath}</code>, stdio: [
   "inherit",
   "inherit",
   "inherit",
   "ipc"
]});
svEnv.stdout.on("data", out => {
   console.log(`Server Feedback: ${out}`);
})
svEnv.stderr.on("data", err => {
   if (!(err == "^C")){
      console.error(`~Server Error: ${err}`);
   }
})

Este es el código que estoy usando para intentar ejecutar los comandos:

svEnv.stdin.write(`${cmd}\n`);

Cada vez que intento usar el código anterior para ejecutar un comando, el servidor no responde en absoluto. Es como si ni siquiera recibiera la entrada.

Todas las soluciones que he visitado, incluso las que tienen el mismo caso de uso exacto que yo, han dicho que esta es la forma correcta de implementarlo. Tengo que suponer que la razón por la que no funciona es por la forma en que tengo configurado el proceso secundario spawn.

Básicamente, lo que estoy preguntando es cómo debe configurarse el proceso secundario spawn para recibir comandos.

Ten en cuenta: esta es la primera vez que uso el módulo de proceso secundario (child process) en Node.js, así que si tienes algún consejo sobre cómo funciona, por favor, házmelo saber.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basándonos en el código proporcionado, parece que el proceso hijo se está generando correctamente, pero puede haber un problema con la forma en que se escriben los comandos en la entrada estándar del proceso.

    Una posible solución es envolver la escritura de comandos en una función de retorno de llamada que espere a que el servidor emita un evento ‘ready’ antes de intentar escribir en la entrada estándar. Aquí tienes un ejemplo:

    const svProcess = cp.spawn('java', ['-jar', 'server.jar'], { cwd: './minecraft-server' });
    
    svProcess.stdout.on('data', (data) => {
      console.log(`Salida del servidor: ${data}`);
    
      // El servidor está listo, envía el comando
      if (data.toString().includes('Done')) {
        sendCommand('say ¡Hola, mundo!');
      }
    });
    
    function sendCommand(cmd) {
      console.log(`Enviando comando: ${cmd}`);
      svProcess.stdin.write(`${cmd}\r\n`);
    }
    

    En este ejemplo estamos escuchando la transmisión de salida estándar del servidor para el evento ‘Done’, que indica que el servidor está listo para recibir comandos. Una vez que recibimos este evento, llamamos a la función sendCommand, que escribe el comando en la entrada estándar del proceso.

    También es importante tener en cuenta que el protocolo del servidor de Minecraft utiliza el carácter de retorno de carro y salto de línea ‘\r\n’ en lugar de solo ‘\n’, así que asegúrate de incluirlo en tus cadenas de comandos.

    ¡Espero que esto ayude! Avísame si tienes alguna otra pregunta.

Comments are closed.