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

55 lines
1.9 KiB
Java

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 mob, boolean alertOthersOfSameType) {
this.mob = mob;
this.alertOthersOfSameType = alertOthersOfSameType;
}
@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(mob -> mob != this.mob)
.map(mob -> (NeutralMob)mob)
.forEach(NeutralMob::forgetCurrentTargetAndRefreshUniversalAnger);
}
super.start();
}
private List<? extends Mob> getNearbyMobsOfSameType() {
double d = this.mob.getAttributeValue(Attributes.FOLLOW_RANGE);
AABB aABB = AABB.unitCubeFromLowerCorner(this.mob.position()).inflate(d, 10.0, d);
return this.mob.level().getEntitiesOfClass(this.mob.getClass(), aABB, EntitySelector.NO_SPECTATORS);
}
}