53 lines
1.8 KiB
Java
53 lines
1.8 KiB
Java
package net.minecraft.world.entity.ai.goal.target;
|
|
|
|
import java.util.EnumSet;
|
|
import java.util.List;
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import net.minecraft.world.entity.LivingEntity;
|
|
import net.minecraft.world.entity.ai.goal.Goal.Flag;
|
|
import net.minecraft.world.entity.ai.targeting.TargetingConditions;
|
|
import net.minecraft.world.entity.animal.IronGolem;
|
|
import net.minecraft.world.entity.npc.Villager;
|
|
import net.minecraft.world.entity.player.Player;
|
|
import net.minecraft.world.phys.AABB;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public class DefendVillageTargetGoal extends TargetGoal {
|
|
private final IronGolem golem;
|
|
@Nullable
|
|
private LivingEntity potentialTarget;
|
|
private final TargetingConditions attackTargeting = TargetingConditions.forCombat().range(64.0);
|
|
|
|
public DefendVillageTargetGoal(IronGolem golem) {
|
|
super(golem, false, true);
|
|
this.golem = golem;
|
|
this.setFlags(EnumSet.of(Flag.TARGET));
|
|
}
|
|
|
|
@Override
|
|
public boolean canUse() {
|
|
AABB aABB = this.golem.getBoundingBox().inflate(10.0, 8.0, 10.0);
|
|
ServerLevel serverLevel = getServerLevel(this.golem);
|
|
List<? extends LivingEntity> list = serverLevel.getNearbyEntities(Villager.class, this.attackTargeting, this.golem, aABB);
|
|
List<Player> list2 = serverLevel.getNearbyPlayers(this.attackTargeting, this.golem, aABB);
|
|
|
|
for (LivingEntity livingEntity : list) {
|
|
Villager villager = (Villager)livingEntity;
|
|
|
|
for (Player player : list2) {
|
|
int i = villager.getPlayerReputation(player);
|
|
if (i <= -100) {
|
|
this.potentialTarget = player;
|
|
}
|
|
}
|
|
}
|
|
|
|
return this.potentialTarget == null ? false : !(this.potentialTarget instanceof Player player2 && (player2.isSpectator() || player2.isCreative()));
|
|
}
|
|
|
|
@Override
|
|
public void start() {
|
|
this.golem.setTarget(this.potentialTarget);
|
|
super.start();
|
|
}
|
|
}
|