语音指令处理器 (Voiced Handlers)
语音指令处理器是服务器的一项功能,允许玩家使用 .command 格式的新指令。这些指令通常用于自动化任务或访问特定的窗口。
要创建新的语音指令,您有几种选择:可以复制现有文件、使用提供的示例作为模板,或者通过实现 IVoicedCommandHandler 接口从头开始创建一个新类。
无论选择哪种方法创建类,您都需要实现 useVoicedCommand 方法来处理指令。单个 Java 文件可以处理多个指令,通常根据相似的功能进行分组。
指令有两种类型:简单指令和带参数的指令。目前,还没有标准的参数过滤(tokenize)方法。一些技术涉及按空格分割,但如果您的参数可能包含空格,按逗号分割可能是一个可行的选择。分词方法的选择取决于您的具体需求。
现在,让我们探索一个基础语音指令的结构。
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 {
// 这些是您要包含的指令。
private static final String[] VOICED_COMMANDS = {
"simple",
"withparams"
};
@Override
public boolean useVoicedCommand(String command, L2PcInstance player, String params) {
switch (command) {
case "simple": {
player.sendMessage("调用了简单语音指令 simple!");
// 在下方添加与此指令关联的逻辑。
break;
}
case "withparams": {
final var parameters = params.split(" ");
// 仅检查是否至少提供了一个参数。
if (parameters.length == 0) {
player.sendMessage("调用了带参数的语音指令 withparams,但未提供参数!");
return false;
}
player.sendMessage("调用了语音指令 withparams,第一个参数为 " + parameters[0] + "!");
// 在下方添加与此指令关联的逻辑。
break;
}
}
return true;
}
@Override
public String[] getVoicedCommandList() {
return VOICED_COMMANDS;
}
}
BasicVoicedCommand 类处理两个指令:simple 和 withparams。这些指令使用 switch 块进行处理,尽管也可以使用 if-else-if 结构。在 simple 的情况下,系统会向玩家发送一条消息,并附带注释鼓励添加自定义逻辑。对于 withparams,通过在空格上分割来解析参数。需要注意的是,params 参数可能是一个空字符串,也可能是玩家提供的实际输入。
代码会验证是否传递了至少一个参数。如果没有,系统会向玩家显示一条消息,指令返回 false 以指示其执行失败。另一方面,如果提供了一个或 多个参数,则会向玩家发送一条不同的消息,其中包括第一个参数。
要完成设置,您需要对位于 com.l2jserver.datapack.handlers 包中的 MasterHandler 类进行修改。在该类中找到 VOICED_COMMAND_HANDLERS 数组,并相应地添加您的类。
import com.l2jserver.datapack.handlers.voicedcommandhandlers.BasicVoicedCommand;
// ...
private static final Class<?>[] VOICED_COMMAND_HANDLERS = {
AutoLoot.class,
StatsVCmd.class,
// TODO: 为这些语音指令添加配置选项:
// 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,
};
// ...
确保您也将 BasicVoicedCommand 类导入到 MasterHandler 类中。