Saltar al contenido principal

Manejadores de Comandos Voz

Los Manejadores de Comandos Voz son funcionalidades del servidor que permiten a los jugadores usar nuevos comandos en el formato .comando. Estos comandos suelen utilizarse para automatizar tareas o acceder a ventanas específicas.

Para crear un nuevo comando voz, tienes varias opciones: puedes copiar un archivo existente, usar el ejemplo proporcionado como plantilla, o crear una nueva clase desde cero implementando la interfaz IVoicedCommandHandler.

Independientemente del método elegido para crear la clase, deberás implementar el método useVoicedCommand para procesar el comando. Un único archivo Java puede manejar varios comandos, generalmente agrupados según funcionalidades similares.

Existen dos tipos de comandos: comandos simples y comandos con parámetros. Hasta el momento, no existe un método estándar para tokenizar parámetros. Algunas técnicas implican dividir por espacios, pero si tus tokens pueden contener espacios, dividir por comas podría ser una opción viable. La elección del método de tokenización queda a tu discreción.

Ahora, exploraremos la estructura de un comando voz básico.

package com.l2jserver.datapack.handlers.voicedcommandhandlers;

import com.l2jserver.gameserver.handler.IVoicedCommandHandler;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

public class BasicVoicedCommand implements IVoicedCommandHandler {
// These are the commands you want to include.
private static final String[] VOICED_COMMANDS = {
"simple",
"withparams"
};

@Override
public boolean useVoicedCommand(String command, L2PcInstance player, String params) {
switch (command) {
case "simple": {
player.sendMessage("Invoked simple voiced command simple!");
// Add the logic associated to this command below.

break;
}
case "withparams": {
final var parameters = params.split(" ");

// Just checking if at least one parameter has been provided.
if (parameters.length == 0) {
player.sendMessage("Invoked voiced command withparams without parameters!");
return false;
}

player.sendMessage("Invoked voiced command withparams, with first parameter " + parameters[0] + "!");
// Add the logic associated to this command below.

break;
}
}
return true;
}

@Override
public String[] getVoicedCommandList() {
return VOICED_COMMANDS;
}
}

La clase BasicVoicedCommand maneja dos comandos: simple y withparams. Estos comandos son procesados mediante un bloque switch, aunque también podría usarse una estructura if-else-if. En el caso de simple, se envía un mensaje al jugador junto con un comentario que anima a agregar lógica personalizada. Para withparams, los parámetros se analizan dividiéndolos por espacios. Es importante tener en cuenta que el parámetro params puede ser una cadena vacía o la entrada real proporcionada por el jugador.

El código verifica si se ha pasado al menos un parámetro. Si no es así, se muestra un mensaje al jugador y el comando devuelve false para indicar su fallo. Por otro lado, si se han proporcionado uno o más parámetros, se envía un mensaje diferente al jugador, incluyendo el primer parámetro.

Para completar la configuración, debes realizar modificaciones en la clase MasterHandler ubicada en el paquete com.l2jserver.datapack.handlers. Localiza el arreglo VOICED_COMMAND_HANDLERS dentro de la clase y agrega tu clase correspondientemente.

import com.l2jserver.datapack.handlers.voicedcommandhandlers.BasicVoicedCommand;

// ...

private static final Class<?>[] VOICED_COMMAND_HANDLERS = {
AutoLoot.class,
StatsVCmd.class,
// TODO: Add configuration options for this voiced commands:
// CastleVCmd.class,
// SetVCmd.class,
(customs().allowWedding() ? Wedding.class : null),
(customs().bankingEnabled() ? Banking.class : null),
(customs().chatAdmin() ? ChatAdmin.class : null),
(customs().multiLangEnable() && customs().multiLangVoiceCommand() ? Lang.class : null),
(customs().debugVoiceCommand() ? Debug.class : null),
(customs().allowChangePassword() ? ChangePassword.class : null),
BasicVoicedCommand.class,
};

// ...

Asegúrate de importar también la clase BasicVoicedCommand en la clase MasterHandler.