文件
AutoDig/src/main/java/autodig/client/miner/DebrisHandler.java
T
2026-08-20 21:04:27 +08:00

125 行
4.0 KiB
Java

package autodig.client.miner;
import autodig.client.bridge.BaritoneBridge;
import autodig.client.config.DigConfig;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.registry.RegistryKey;
import net.minecraft.world.World;
/**
* 远古残骸自动挖矿流转(下界)。
*
* <p>流程:主世界 -> 走进最近传送门 -> 进入下界 -> 挖远古残骸 ->
* (背包满/挖够)-> 找下界传送门走回主世界。死亡重生的返回逻辑由控制器统一处理,
* 本类每次 tick 依据当前所在维度自适应地执行对应阶段。</p>
*/
public final class DebrisHandler {
private final BaritoneBridge bridge;
private enum Stage {
/** 在下界从传送门前往主世界(或已在主世界即完成) */
GO_COMMIT,
/** 在前一个维度前往传送门 */
GO_PORTAL,
/** 挖远古残骸 */
MINE,
/** 返回主世界 */
RETURN_PORTAL
}
private Stage stage = Stage.GO_COMMIT;
private boolean done;
/** 派发节流 */
private long lastIssue;
public DebrisHandler(BaritoneBridge bridge) {
this.bridge = bridge;
}
/** 任务结束或需要切换任务时归还控制权。 */
public void reset() {
this.stage = Stage.GO_COMMIT;
this.done = false;
}
/**
* 每帧推进下界挖矿流转。
*
* @param config 挖矿配置
* @return 是否已全部完成(含回到主世界)
*/
public boolean tick(DigConfig config) {
MinecraftClient client = MinecraftClient.getInstance();
if (client.player == null || client.world == null) {
return this.done;
}
PlayerEntity player = client.player;
RegistryKey<World> dim = client.world.getRegistryKey();
boolean inOverworld = dim == World.OVERWORLD;
boolean inNether = dim == World.NETHER;
switch (this.stage) {
case GO_COMMIT -> {
// 选择去哪个维度
if (inNether) {
this.stage = Stage.MINE;
} else {
this.stage = Stage.GO_PORTAL;
}
}
case GO_PORTAL -> {
if (inNether) {
this.stage = Stage.MINE; // 已通过传送门进入下界
} else {
this.issue(() -> this.bridge.toNetherPortal());
}
}
case MINE -> {
if (!inNether) {
// 意外回到主世界,重走流程
this.stage = Stage.GO_COMMIT;
} else if (this.inventoryFull(player) || this.bridge.isActive() == false) {
// 背包满或 Baritone 空闲即为本段结束;若期望回程则前往传送门
if (config.debrisReturnHome) {
this.stage = Stage.RETURN_PORTAL;
} else {
this.stage = Stage.GO_COMMIT; // 停在下界挖(不返回)
}
} else {
this.issue(() -> this.bridge.mineByName(config.debrisCount, "ancient_debris"));
}
}
case RETURN_PORTAL -> {
if (inOverworld) {
this.done = true; // 已回到主世界,全流程完成
} else {
this.issue(() -> this.bridge.toNetherPortal());
}
}
}
return this.done;
}
private void issue(Runnable action) {
long now = System.currentTimeMillis();
if (now - this.lastIssue > 1000) {
action.run();
this.lastIssue = now;
}
}
private boolean inventoryFull(PlayerEntity player) {
for (int i = 0; i < 36; i++) {
if (player.getInventory().main.get(i).isEmpty()) {
return false;
}
}
return true;
}
public boolean isDone() {
return this.done;
}
}