|
37 | 37 | import java.util.List; |
38 | 38 | import java.util.Objects; |
39 | 39 | import java.util.Set; |
| 40 | +import java.util.UUID; |
40 | 41 |
|
41 | 42 | public class DiamondHeadedArrow extends AbstractArrow { |
42 | 43 | private static final int EXPOSED_POTION_DECAY_TIME = 600; |
@@ -315,47 +316,38 @@ protected void onHitEntity(@NotNull EntityHitResult result) { |
315 | 316 | //HOMING BEHAVIOR |
316 | 317 | private void setTarget() { |
317 | 318 | if (target == null || target.isDeadOrDying() || (target instanceof EnderDragon dragon && dragon.getPhaseManager().getCurrentPhase().getPhase() == EnderDragonPhase.DYING)) { |
318 | | - AABB aabb = (new AABB(new BlockPos(this.position()))).inflate(20).expandTowards(0.0D, level.getHeight(), 0.0D); |
319 | | - List<LivingEntity> potentialTargets = this.level.getEntitiesOfClass(LivingEntity.class, aabb); |
320 | | - |
321 | | - if (potentialTargets.size() == 0) { |
322 | | - target = null; |
323 | | - return; |
324 | | - } |
325 | | - |
326 | | - potentialTargets.removeIf(LivingEntity::isDeadOrDying); |
327 | | - potentialTargets.removeIf(entity -> !(entity instanceof Enemy)); |
328 | | - potentialTargets.removeIf(entity -> !entity.hasLineOfSight(this)); |
329 | | - potentialTargets.removeIf(entity -> entity instanceof EnderMan); |
330 | | - potentialTargets.removeIf(entity -> (entity instanceof WitherBoss boss && boss.isPowered())); |
331 | | - potentialTargets.removeIf(entity -> { |
332 | | - if (entity instanceof EnderDragon){ |
333 | | - EnderDragonPhase<? extends DragonPhaseInstance> phase = ((EnderDragon) entity).getPhaseManager().getCurrentPhase().getPhase(); |
334 | | - return phase == EnderDragonPhase.SITTING_ATTACKING || |
335 | | - phase == EnderDragonPhase.SITTING_SCANNING || |
336 | | - phase == EnderDragonPhase.SITTING_FLAMING || |
337 | | - phase == EnderDragonPhase.DYING; |
338 | | - } |
339 | | - return false; |
340 | | - }); |
341 | | - potentialTargets.removeIf(entity -> |
342 | | - entity instanceof Player player && |
343 | | - player.getUUID().equals(Objects.requireNonNull(this.getOwner()).getUUID()) |
344 | | - ); |
345 | | - potentialTargets.removeIf(entity -> |
346 | | - entity instanceof Player player && (player.isCreative() || player.isSpectator()) |
347 | | - ); |
348 | | - potentialTargets.removeIf(entity -> |
349 | | - entity instanceof Player player && this.getOwner() instanceof Player owner && !owner.canHarmPlayer(player) |
350 | | - ); |
351 | | - |
352 | | - |
353 | | - if (potentialTargets.size() == 0) { |
| 319 | + AABB aabb = new AABB(new BlockPos(this.position())).inflate(20).expandTowards(0.0D, level.getHeight(), 0.0D); |
| 320 | + List<LivingEntity> potentialTargets = level.getEntitiesOfClass(LivingEntity.class, aabb) |
| 321 | + .stream() |
| 322 | + .filter(entity -> !entity.isDeadOrDying() && |
| 323 | + entity instanceof Enemy && |
| 324 | + entity.hasLineOfSight(this) && |
| 325 | + !(entity instanceof EnderMan) && |
| 326 | + (!(entity instanceof WitherBoss) || !((WitherBoss) entity).isPowered()) && |
| 327 | + !(entity instanceof EnderDragon) || |
| 328 | + !isDragonSittingOrDying((EnderDragon) entity) && |
| 329 | + !(entity instanceof Player) || |
| 330 | + !playerMatchesOwner((Player) entity)) |
| 331 | + .toList(); |
| 332 | + |
| 333 | + if (potentialTargets.isEmpty()) { |
354 | 334 | target = null; |
355 | 335 | return; |
356 | 336 | } |
357 | 337 |
|
358 | 338 | target = potentialTargets.get(random.nextInt(potentialTargets.size())); |
359 | 339 | } |
360 | 340 | } |
| 341 | + private boolean isDragonSittingOrDying(EnderDragon dragon) { |
| 342 | + EnderDragonPhase<? extends DragonPhaseInstance> phase = dragon.getPhaseManager().getCurrentPhase().getPhase(); |
| 343 | + return phase == EnderDragonPhase.SITTING_ATTACKING || |
| 344 | + phase == EnderDragonPhase.SITTING_SCANNING || |
| 345 | + phase == EnderDragonPhase.SITTING_FLAMING || |
| 346 | + phase == EnderDragonPhase.DYING; |
| 347 | + } |
| 348 | + |
| 349 | + private boolean playerMatchesOwner(Player player) { |
| 350 | + UUID ownerUUID = Objects.requireNonNull(this.getOwner()).getUUID(); |
| 351 | + return player.getUUID().equals(ownerUUID) || player.isCreative() || player.isSpectator(); |
| 352 | + } |
361 | 353 | } |
0 commit comments