88 lines
2.5 KiB
Java
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);
|
|
}
|
|
}
|