核心改进: - 实时状态 HUD(左上角面板:任务/状态/时长/血量/饥饿/背包/进度) - 自动插火把(黑暗隧道自动防灾,可开关) - 自动进食跳过金苹果/附魔金苹果/紫颂果等特殊食物 - 背包接近满(≥30格)即提前丢垃圾,防误判满包返回 - 杀戮光环排除 Angerable 中立生物(僵尸猪灵/末影人/狼等) - 新增 /autodig status 命令 - GUI 补全设置:自动插火把、进食阈值、保命血量、攻击范围 - 会话统计(时长/死亡次数)联动 HUD 与命令 - 补全 README.md 文档 - 版本升至 2.2.0
126 行
4.8 KiB
Java
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);
|
|
}
|
|
} |