Code/net/minecraft/world/entity/ai/goal/target/ResetUniversalAngerTargetGo...

49 lines
2.0 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.entity.ai.goal.target;
import java.util.List;
import net.minecraft.world.entity.EntitySelector;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.NeutralMob;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.phys.AABB;
public class ResetUniversalAngerTargetGoal<T extends Mob & NeutralMob> extends Goal {
private static final int ALERT_RANGE_Y = 10;
private final T mob;
private final boolean alertOthersOfSameType;
private int lastHurtByPlayerTimestamp;
public ResetUniversalAngerTargetGoal(T p_26121_, boolean p_26122_) {
this.mob = p_26121_;
this.alertOthersOfSameType = p_26122_;
}
@Override
public boolean canUse() {
return getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_UNIVERSAL_ANGER) && this.wasHurtByPlayer();
}
private boolean wasHurtByPlayer() {
return this.mob.getLastHurtByMob() != null && this.mob.getLastHurtByMob().getType() == EntityType.PLAYER && this.mob.getLastHurtByMobTimestamp() > this.lastHurtByPlayerTimestamp;
}
@Override
public void start() {
this.lastHurtByPlayerTimestamp = this.mob.getLastHurtByMobTimestamp();
this.mob.forgetCurrentTargetAndRefreshUniversalAnger();
if (this.alertOthersOfSameType) {
this.getNearbyMobsOfSameType().stream().filter(p_26127_ -> p_26127_ != this.mob).map(p_26125_ -> (NeutralMob)p_26125_).forEach(NeutralMob::forgetCurrentTargetAndRefreshUniversalAnger);
}
super.start();
}
private List<? extends Mob> getNearbyMobsOfSameType() {
double d0 = this.mob.getAttributeValue(Attributes.FOLLOW_RANGE);
AABB aabb = AABB.unitCubeFromLowerCorner(this.mob.position()).inflate(d0, 10.0, d0);
return this.mob.level().getEntitiesOfClass((Class<? extends Mob>)this.mob.getClass(), aabb, EntitySelector.NO_SPECTATORS);
}
}