package autodig.client; import autodig.client.bridge.BaritoneBridge; import autodig.client.command.AutoDigCommands; import autodig.client.config.ConfigStore; import autodig.client.config.DigConfig; import autodig.client.config.MineTask; import autodig.client.controller.DigController; import autodig.client.gui.AutoDigGui; import autodig.client.gui.StatusHud; import com.mojang.brigadier.CommandDispatcher; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.KeyBinding; import net.minecraft.client.util.InputUtil; import net.minecraft.text.Text; /** * AutoDig 客户端主入口(Fabric ClientModInitializer)。 * *
负责:加载配置、注册一键唤出 GUI 的快捷键、每帧把配置同步给 Baritone 并 * 驱动挖矿控制器、注册命令。通过单例 {@link #instance()} 向其他模块提供入口。
*/ @Environment(EnvType.CLIENT) public final class AutoDigModClient implements ClientModInitializer { private static AutoDigModClient instance; private final ConfigStore configStore = new ConfigStore(); private final DigController controller = new DigController(); private DigConfig config; private boolean openGuiRequested; private KeyBinding guiKey; /** 上一次同步的任务,用于检测 controller 内部改动(如任务完成)并落盘 */ private MineTask lastTask; private static final int KEY_R = 82; private static final int KEY_LEFT_CTRL = 341; private static final int KEY_RIGHT_CTRL = 345; @Override public void onInitializeClient() { instance = this; this.config = this.configStore.load(); this.lastTask = this.config.task; this.guiKey = KeyBindingHelper.registerKeyBinding(new KeyBinding( "key.autodig.open", KEY_R, "category.autodig")); ClientTickEvents.END_CLIENT_TICK.register(client -> { // 同步模组配置到 Baritone(工具切换 / 避岩浆 / 避怪/保命) this.bridge().applyConfig(this.config); this.controller.tick(this.config); // controller 可能因任务完成而把 task 置空,这里落盘,避免下次进游戏自动挖矿 if (this.config.task != this.lastTask) { this.lastTask = this.config.task; this.saveConfig(); } while (this.guiKey.wasPressed()) { if (this.isCtrlDown(client)) { this.openGui(); } else { this.sendToast("AutoDig: 请按住 Ctrl 再按此快捷键打开界面"); } } if (this.openGuiRequested) { this.openGuiRequested = false; try { client.setScreen(new AutoDigGui(this)); } catch (Throwable t) { if (client.player != null) { client.player.sendMessage(Text.literal("AutoDig GUI \u6253\u5f00\u5931\u8d25: " + t), false); } } } }); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> AutoDigCommands.register(dispatcher)); // 实时状态 HUD:仅在挖矿任务进行中于左上角渲染 HudRenderCallback.EVENT.register((context, tickCounter) -> StatusHud.render(context)); } public static AutoDigModClient instance() { return instance; } public DigController controller() { return this.controller; } public DigConfig config() { return this.config; } public BaritoneBridge bridge() { return this.controller.bridge(); } public void saveConfig() { this.configStore.save(this.config); } /** 请求打开 AutoDig GUI(下一帧安全执行)。 */ public void openGui() { this.openGuiRequested = true; } /** 向玩家聊天栏发送一条提示。 */ public void sendToast(String message) { MinecraftClient client = MinecraftClient.getInstance(); if (client.player != null) { client.player.sendMessage(Text.literal(message), false); } } private boolean isCtrlDown(MinecraftClient client) { long handle = client.getWindow().getHandle(); return InputUtil.isKeyPressed(handle, KEY_LEFT_CTRL) || InputUtil.isKeyPressed(handle, KEY_RIGHT_CTRL); } }