geforkt von Mirrors/Paper
4104545b11
"It was from a different time before books were as jank as they are now. As time has gone on they've only proven to be worse and worse."
61 Zeilen
3.8 KiB
Diff
61 Zeilen
3.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Fri, 3 Jul 2020 15:03:33 -0700
|
|
Subject: [PATCH] Improve EntityTargetLivingEntityEvent for 1.16 mobs
|
|
|
|
CraftBukkit has a bug in their implementation and is incorrectly handling forget
|
|
Also adds more target reasons for why it forgot target.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/StopAttackingIfTargetInvalid.java b/src/main/java/net/minecraft/world/entity/ai/behavior/StopAttackingIfTargetInvalid.java
|
|
index 6ee0098de2b55a437f914869643adbd1ddbe7faf..4b2e0379d9bbeb12c104e52817bb2005ed627a78 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/StopAttackingIfTargetInvalid.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/StopAttackingIfTargetInvalid.java
|
|
@@ -50,15 +50,15 @@ public class StopAttackingIfTargetInvalid<E extends Mob> extends Behavior<E> {
|
|
LivingEntity entityliving = this.getAttackTarget(entity);
|
|
|
|
if (!entity.canAttack(entityliving)) {
|
|
- this.clearAttackTarget(entity);
|
|
+ this.clearAttackTarget(entity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_INVALID); // Paper
|
|
} else if (StopAttackingIfTargetInvalid.isTiredOfTryingToReachTarget((LivingEntity) entity)) {
|
|
- this.clearAttackTarget(entity);
|
|
+ this.clearAttackTarget(entity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.FORGOT_TARGET); // Paper
|
|
} else if (this.isCurrentTargetDeadOrRemoved(entity)) {
|
|
- this.clearAttackTarget(entity);
|
|
+ this.clearAttackTarget(entity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_DIED); // Paper
|
|
} else if (this.isCurrentTargetInDifferentLevel(entity)) {
|
|
- this.clearAttackTarget(entity);
|
|
+ this.clearAttackTarget(entity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_OTHER_LEVEL); // Paper
|
|
} else if (this.stopAttackingWhen.test(this.getAttackTarget(entity))) {
|
|
- this.clearAttackTarget(entity);
|
|
+ this.clearAttackTarget(entity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_INVALID); // Paper
|
|
}
|
|
}
|
|
|
|
@@ -82,17 +82,20 @@ public class StopAttackingIfTargetInvalid<E extends Mob> extends Behavior<E> {
|
|
return optional.isPresent() && !((LivingEntity) optional.get()).isAlive();
|
|
}
|
|
|
|
- protected void clearAttackTarget(E entity) {
|
|
+ protected void clearAttackTarget(E entity, EntityTargetEvent.TargetReason reason) {
|
|
// CraftBukkit start
|
|
- LivingEntity old = entity.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).orElse(null);
|
|
- EntityTargetEvent event = CraftEventFactory.callEntityTargetLivingEvent(entity, null, (old != null && !old.isAlive()) ? EntityTargetEvent.TargetReason.TARGET_DIED : EntityTargetEvent.TargetReason.FORGOT_TARGET);
|
|
+ // Paper start - fix this event
|
|
+ //EntityLiving old = e0.getBehaviorController().getMemory(MemoryModuleType.ATTACK_TARGET).orElse(null);
|
|
+ EntityTargetEvent event = CraftEventFactory.callEntityTargetLivingEvent(entity, null, reason);
|
|
if (event.isCancelled()) {
|
|
return;
|
|
}
|
|
- if (event.getTarget() != null) {
|
|
- entity.getBrain().setMemory(MemoryModuleType.ATTACK_TARGET, ((CraftLivingEntity) event.getTarget()).getHandle());
|
|
+ // comment out, bad logic - bad
|
|
+ /*if (event.getTarget() != null) {
|
|
+ e0.getBehaviorController().setMemory(MemoryModuleType.ATTACK_TARGET, ((CraftLivingEntity) event.getTarget()).getHandle());
|
|
return;
|
|
- }
|
|
+ }*/
|
|
+ // Paper end
|
|
// CraftBukkit end
|
|
this.onTargetErased.accept(entity);
|
|
entity.getBrain().eraseMemory(MemoryModuleType.ATTACK_TARGET);
|