SPIGOT-6032: Add best effort target events for new entities

This commit is contained in:
md_5 2020-07-28 19:05:03 +10:00
parent 52fd29c0dc
commit c3a22e7850
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
2 changed files with 70 additions and 0 deletions

View File

@ -0,0 +1,32 @@
--- a/net/minecraft/server/BehaviorAttackTargetForget.java
+++ b/net/minecraft/server/BehaviorAttackTargetForget.java
@@ -3,6 +3,11 @@
import com.google.common.collect.ImmutableMap;
import java.util.Optional;
import java.util.function.Predicate;
+// CraftBukkit start
+import org.bukkit.craftbukkit.entity.CraftLivingEntity;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.entity.EntityTargetEvent;
+// CraftBukkit end
public class BehaviorAttackTargetForget<E extends EntityInsentient> extends Behavior<E> {
@@ -54,6 +59,17 @@
}
private void d(E e0) {
+ // CraftBukkit start
+ EntityLiving old = e0.getBehaviorController().getMemory(MemoryModuleType.ATTACK_TARGET).orElse(null);
+ EntityTargetEvent event = CraftEventFactory.callEntityTargetLivingEvent(e0, old, (old != null && !old.isAlive()) ? EntityTargetEvent.TargetReason.TARGET_DIED : EntityTargetEvent.TargetReason.FORGOT_TARGET);
+ if (event.isCancelled()) {
+ return;
+ }
+ if (event.getTarget() != null) {
+ e0.getBehaviorController().setMemory(MemoryModuleType.ATTACK_TARGET, ((CraftLivingEntity) event.getTarget()).getHandle());
+ return;
+ }
+ // CraftBukkit end
e0.getBehaviorController().removeMemory(MemoryModuleType.ATTACK_TARGET);
}
}

View File

@ -0,0 +1,38 @@
--- a/net/minecraft/server/BehaviorAttackTargetSet.java
+++ b/net/minecraft/server/BehaviorAttackTargetSet.java
@@ -4,6 +4,11 @@
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
+// CraftBukkit start
+import org.bukkit.craftbukkit.entity.CraftLivingEntity;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.entity.EntityTargetEvent;
+// CraftBukkit end
public class BehaviorAttackTargetSet<E extends EntityInsentient> extends Behavior<E> {
@@ -33,13 +38,21 @@
}
protected void a(WorldServer worldserver, E e0, long i) {
- ((Optional) this.c.apply(e0)).ifPresent((entityliving) -> {
+ (this.c.apply(e0)).ifPresent((entityliving) -> { // CraftBukkit - decompile error
this.a(e0, entityliving);
});
}
private void a(E e0, EntityLiving entityliving) {
- e0.getBehaviorController().setMemory(MemoryModuleType.ATTACK_TARGET, (Object) entityliving);
+ // CraftBukkit start
+ EntityTargetEvent event = CraftEventFactory.callEntityTargetLivingEvent(e0, entityliving, (entityliving instanceof EntityPlayer) ? EntityTargetEvent.TargetReason.CLOSEST_PLAYER : EntityTargetEvent.TargetReason.CLOSEST_ENTITY);
+ if (event.isCancelled()) {
+ return;
+ }
+ entityliving = (event.getTarget() != null) ? ((CraftLivingEntity) event.getTarget()).getHandle() : null;
+ // CraftBukkit end
+
+ e0.getBehaviorController().setMemory(MemoryModuleType.ATTACK_TARGET, entityliving); // CraftBukkit - decompile error
e0.getBehaviorController().removeMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE);
}
}