Geyser命令解析器:自定义指令的语法设计与实现

Geyser命令解析器:自定义指令的语法设计与实现

【免费下载链接】Geyser A bridge/proxy allowing you to connect to Minecraft: Java Edition servers with Minecraft: Bedrock Edition. 【免费下载链接】Geyser 项目地址: https://gitcode.com/GitHub_Trending/ge/Geyser

命令系统架构概览

Geyser作为Minecraft跨版本协议转换工具,其命令解析系统采用分层架构设计,核心模块位于core/src/main/java/org/geysermc/geyser/command目录。该系统基于Incendo Cloud框架构建,实现了Java版与基岩版(Bedrock Edition)的命令语法转换与权限控制。

核心组件关系

mermaid

基础语法设计

命令定义规范

Geyser命令采用"根指令+子指令"的层级结构,默认根指令为geyser,定义于GeyserCommand.java中的DEFAULT_ROOT_COMMAND常量。开发自定义命令需继承GeyserCommand抽象类并实现以下核心要素:

public class CustomCommand extends GeyserCommand {
    public CustomCommand() {
        super(
            "custom",                // 子指令名称
            "geyser.commands.custom.desc",  // 国际化描述键
            "geyser.command.custom", // 权限节点
            TriState.TRUE            // 默认权限
        );
        this.aliases = Arrays.asList("c", "customcmd"); // 别名列表
    }

    @Override
    public void execute(CommandContext<GeyserCommandSource> context) {
        // 命令执行逻辑
    }
}

参数类型支持

命令系统内置多种参数解析器,位于CommandRegistry.java的参数处理逻辑中,支持以下类型:

参数类型解析器实现适用场景
文本StringArrayParser长文本输入
整数IntegerParser数字参数
枚举EnumParser固定选项集合
文字LiteralParser命令字面量

权限控制机制

权限模型设计

Geyser采用三级权限控制体系,通过GeyserPermission.java实现:

  1. 基础权限:命令注册时声明的权限节点
  2. 来源限制:通过playerOnlybedrockOnly控制命令来源
  3. 动态验证:基于上下文的权限计算

权限验证流程实现于GeyserPermission.java

@Override
public @NonNull Result testPermission(@NonNull GeyserCommandSource source) {
    if (bedrockOnly && !(source instanceof BedrockCommandSource)) {
        return Result.denied();
    }
    if (playerOnly && !source.isPlayer()) {
        return Result.denied();
    }
    return source.hasPermission(permission) ? Result.allowed() : Result.denied();
}

权限注册流程

命令权限在CommandRegistry.java中通过事件机制注册:

protected void onRegisterPermissions(GeyserRegisterPermissionsEvent event) {
    for (Map.Entry<String, TriState> permission : permissionDefaults.entrySet()) {
        event.register(permission.getKey(), permission.getValue());
    }
}

命令注册与执行流程

注册流程

  1. 内置命令注册:系统启动时自动注册,如CommandRegistry.java中注册的HelpCommandListCommand等默认命令
  2. 扩展命令注册:通过GeyserDefineCommandsEvent事件注册,实现于CommandRegistry.java
  3. 权限绑定:命令注册时通过commandPermission()方法绑定权限验证器

执行流程

mermaid

错误处理机制

命令执行异常通过ExceptionHandlers.java统一处理,内置处理器包括:

  • 权限缺失异常
  • 参数解析错误
  • 命令不存在
  • 执行时异常

自定义异常处理示例:

ExceptionHandlers.register(cloud, CommandExecutionException.class, (context, exception) -> {
    context.sender().sendMessage("命令执行失败: " + exception.getMessage());
});

实践案例:自定义命令开发

完整示例代码

// 文件名: CustomCommand.java
package org.geysermc.geyser.command.defaults;

import org.geysermc.geyser.command.GeyserCommand;
import org.geysermc.geyser.command.GeyserCommandSource;
import org.incendo.cloud.context.CommandContext;

public class CustomCommand extends GeyserCommand {
    public CustomCommand() {
        super(
            "custom", 
            "geyser.commands.custom.desc", 
            "geyser.command.custom", 
            TriState.TRUE
        );
        this.aliases = Arrays.asList("c", "customcmd");
    }

    @Override
    public void execute(CommandContext<GeyserCommandSource> context) {
        GeyserCommandSource source = context.sender();
        String arg = context.getOrDefault("arg", "default");
        source.sendMessage("自定义命令执行成功,参数: " + arg);
    }

    @Override
    public void register(CommandManager<GeyserCommandSource> manager) {
        manager.command(baseBuilder(manager)
            .required("arg", StringParser.stringParser())
            .handler(this::execute)
        );
    }
}

注册命令

在扩展的onEnable()方法中注册:

eventBus.subscribe(this, GeyserDefineCommandsEvent.class, event -> {
    event.register(new CustomCommand());
});

高级特性

命令别名系统

通过aliases字段支持多别名,实现于GeyserCommand.javaaliases()方法,注册时会自动将别名映射到主命令。

国际化支持

命令描述使用国际化键,通过GeyserLocale.java从语言文件加载对应文本,支持多语言自动切换。

自动补全功能

命令补全通过CommandRegistry.javasuggestionsFor()方法实现,基于当前输入和权限动态生成补全建议。

调试与测试工具

内置调试命令

系统提供connectiontest命令用于测试命令执行流程:

/geyser connectiontest <参数>

实现代码位于ConnectionTestCommand.java

日志输出

命令注册与执行过程会输出调试日志,可在配置文件中开启debug模式查看详细流程:

debug-mode: true

总结与扩展方向

Geyser命令系统通过模块化设计实现了跨版本命令转换,开发者可通过以下方式扩展:

  1. 自定义参数类型:实现ParameterParser接口
  2. 高级权限策略:扩展GeyserPermission
  3. 命令钩子:监听GeyserDefineCommandsEvent事件
  4. 自定义语法:重写baseBuilder()方法实现特殊语法

完整API文档可参考项目README.mdCONTRIBUTING.md中的开发指南。

【免费下载链接】Geyser A bridge/proxy allowing you to connect to Minecraft: Java Edition servers with Minecraft: Bedrock Edition. 【免费下载链接】Geyser 项目地址: https://gitcode.com/GitHub_Trending/ge/Geyser

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值