文件
AutoDig/src/main/java/autodig/client/AutoDigModClient.java
T
lyizai 4135cdd117 feat: 智能升级 v2.2.0 - HUD/AutoTorch/AutoEat 智能食物/提前丢垃圾/剔除中立生物
核心改进:
- 实时状态 HUD(左上角面板:任务/状态/时长/血量/饥饿/背包/进度)
- 自动插火把(黑暗隧道自动防灾,可开关)
- 自动进食跳过金苹果/附魔金苹果/紫颂果等特殊食物
- 背包接近满(≥30格)即提前丢垃圾,防误判满包返回
- 杀戮光环排除 Angerable 中立生物(僵尸猪灵/末影人/狼等)
- 新增 /autodig status 命令
- GUI 补全设置:自动插火把、进食阈值、保命血量、攻击范围
- 会话统计(时长/死亡次数)联动 HUD 与命令
- 补全 README.md 文档
- 版本升至 2.2.0
2026-08-30 22:36:35 +08:00

126 行
4.8 KiB
Java

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)。
*
* <p>负责:加载配置、注册一键唤出 GUI 的快捷键、每帧把配置同步给 Baritone 并
* 驱动挖矿控制器、注册命令。通过单例 {@link #instance()} 向其他模块提供入口。</p>
*/
@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);
}
}