minecraft-src/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java
2025-07-04 02:00:41 +03:00

88 lines
2.5 KiB
Java

package net.minecraft.world.entity.ai.goal;
import java.util.function.Predicate;
import net.minecraft.world.Difficulty;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.block.Block;
public class BreakDoorGoal extends DoorInteractGoal {
private static final int DEFAULT_DOOR_BREAK_TIME = 240;
private final Predicate<Difficulty> validDifficulties;
protected int breakTime;
protected int lastBreakProgress = -1;
protected int doorBreakTime = -1;
public BreakDoorGoal(Mob mob, Predicate<Difficulty> validDifficulties) {
super(mob);
this.validDifficulties = validDifficulties;
}
public BreakDoorGoal(Mob mob, int doorBreakTime, Predicate<Difficulty> validDifficulties) {
this(mob, validDifficulties);
this.doorBreakTime = doorBreakTime;
}
protected int getDoorBreakTime() {
return Math.max(240, this.doorBreakTime);
}
@Override
public boolean canUse() {
if (!super.canUse()) {
return false;
} else {
return !getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)
? false
: this.isValidDifficulty(this.mob.level().getDifficulty()) && !this.isOpen();
}
}
@Override
public void start() {
super.start();
this.breakTime = 0;
}
@Override
public boolean canContinueToUse() {
return this.breakTime <= this.getDoorBreakTime()
&& !this.isOpen()
&& this.doorPos.closerToCenterThan(this.mob.position(), 2.0)
&& this.isValidDifficulty(this.mob.level().getDifficulty());
}
@Override
public void stop() {
super.stop();
this.mob.level().destroyBlockProgress(this.mob.getId(), this.doorPos, -1);
}
@Override
public void tick() {
super.tick();
if (this.mob.getRandom().nextInt(20) == 0) {
this.mob.level().levelEvent(1019, this.doorPos, 0);
if (!this.mob.swinging) {
this.mob.swing(this.mob.getUsedItemHand());
}
}
this.breakTime++;
int i = (int)((float)this.breakTime / this.getDoorBreakTime() * 10.0F);
if (i != this.lastBreakProgress) {
this.mob.level().destroyBlockProgress(this.mob.getId(), this.doorPos, i);
this.lastBreakProgress = i;
}
if (this.breakTime == this.getDoorBreakTime() && this.isValidDifficulty(this.mob.level().getDifficulty())) {
this.mob.level().removeBlock(this.doorPos, false);
this.mob.level().levelEvent(1021, this.doorPos, 0);
this.mob.level().levelEvent(2001, this.doorPos, Block.getId(this.mob.level().getBlockState(this.doorPos)));
}
}
private boolean isValidDifficulty(Difficulty difficulty) {
return this.validDifficulties.test(difficulty);
}
}