From da011362dc06d99ddcf2f7839e5715b3a67e926a Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@GMail.com>
Date: Fri, 27 Jul 2018 22:36:31 -0500
Subject: [PATCH] SkeletonHorse Additions

---
 .../animal/horse/SkeletonTrapGoal.java.patch  | 22 ++++++++++---
 .../world/level/EntityGetter.java.patch       | 31 ++++++++++++++++++-
 .../entity/CraftSkeletonHorse.java            | 12 +++++++
 3 files changed, 60 insertions(+), 5 deletions(-)

diff --git a/paper-server/patches/sources/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch
index 24ffd615a5..8f22bd7fd2 100644
--- a/paper-server/patches/sources/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java.patch
@@ -1,15 +1,29 @@
 --- a/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
 +++ b/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
-@@ -27,7 +27,7 @@
+@@ -20,6 +20,7 @@
+ public class SkeletonTrapGoal extends Goal {
+ 
+     private final SkeletonHorse horse;
++    private java.util.List<org.bukkit.entity.HumanEntity> eligiblePlayers; // Paper
+ 
+     public SkeletonTrapGoal(SkeletonHorse skeletonHorse) {
+         this.horse = skeletonHorse;
+@@ -27,12 +28,13 @@
  
      @Override
      public boolean canUse() {
 -        return this.horse.level().hasNearbyAlivePlayer(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D);
-+        return this.horse.level().hasNearbyAlivePlayerThatAffectsSpawning(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D); // Paper - Affects Spawning API
++        return !(eligiblePlayers = this.horse.level().findNearbyBukkitPlayers(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D, net.minecraft.world.entity.EntitySelector.PLAYER_AFFECTS_SPAWNING)).isEmpty(); // Paper - Affects Spawning API & SkeletonHorseTrapEvent
      }
  
      @Override
-@@ -43,12 +43,12 @@
+     public void tick() {
+         ServerLevel worldserver = (ServerLevel) this.horse.level();
++        if (!new com.destroystokyo.paper.event.entity.SkeletonHorseTrapEvent((org.bukkit.entity.SkeletonHorse) this.horse.getBukkitEntity(), eligiblePlayers).callEvent()) return; // Paper
+         DifficultyInstance difficultydamagescaler = worldserver.getCurrentDifficultyAt(this.horse.blockPosition());
+ 
+         this.horse.setTrap(false);
+@@ -43,12 +45,12 @@
          if (entitylightning != null) {
              entitylightning.moveTo(this.horse.getX(), this.horse.getY(), this.horse.getZ());
              entitylightning.setVisualOnly(true);
@@ -24,7 +38,7 @@
  
                  for (int i = 0; i < 3; ++i) {
                      AbstractHorse entityhorseabstract = this.createHorse(difficultydamagescaler);
-@@ -59,7 +59,7 @@
+@@ -59,7 +61,7 @@
                          if (entityskeleton1 != null) {
                              entityskeleton1.startRiding(entityhorseabstract);
                              entityhorseabstract.push(this.horse.getRandom().triangle(0.0D, 1.1485D), 0.0D, this.horse.getRandom().triangle(0.0D, 1.1485D));
diff --git a/paper-server/patches/sources/net/minecraft/world/level/EntityGetter.java.patch b/paper-server/patches/sources/net/minecraft/world/level/EntityGetter.java.patch
index d2f4c56f21..a77e88b2af 100644
--- a/paper-server/patches/sources/net/minecraft/world/level/EntityGetter.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/level/EntityGetter.java.patch
@@ -12,7 +12,36 @@
      @Nullable
      default Player getNearestPlayer(double x, double y, double z, double maxDistance, @Nullable Predicate<Entity> targetPredicate) {
          double d = -1.0;
-@@ -100,6 +105,20 @@
+@@ -89,6 +94,28 @@
+         return player;
+     }
+ 
++    // Paper start
++    default List<org.bukkit.entity.HumanEntity> findNearbyBukkitPlayers(double x, double y, double z, double radius, boolean notSpectator) {
++        return findNearbyBukkitPlayers(x, y, z, radius, notSpectator ? EntitySelector.NO_SPECTATORS : net.minecraft.world.entity.EntitySelector.NO_CREATIVE_OR_SPECTATOR);
++    }
++
++    default List<org.bukkit.entity.HumanEntity> findNearbyBukkitPlayers(double x, double y, double z, double radius, @Nullable Predicate<Entity> predicate) {
++        com.google.common.collect.ImmutableList.Builder<org.bukkit.entity.HumanEntity> builder = com.google.common.collect.ImmutableList.builder();
++
++        for (Player human : this.players()) {
++            if (predicate == null || predicate.test(human)) {
++                double distanceSquared = human.distanceToSqr(x, y, z);
++
++                if (radius < 0.0D || distanceSquared < radius * radius) {
++                    builder.add(human.getBukkitEntity());
++                }
++            }
++        }
++
++        return builder.build();
++    }
++    // Paper end
++
+     @Nullable
+     default Player getNearestPlayer(Entity entity, double maxDistance) {
+         return this.getNearestPlayer(entity.getX(), entity.getY(), entity.getZ(), maxDistance, false);
+@@ -100,6 +127,20 @@
          return this.getNearestPlayer(x, y, z, maxDistance, predicate);
      }
  
diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java
index 248e4febbe..fbb47491dc 100644
--- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java
+++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java
@@ -44,4 +44,16 @@ public class CraftSkeletonHorse extends CraftAbstractHorse implements SkeletonHo
     public void setTrapTime(int trapTime) {
         this.getHandle().trapTime = trapTime;
     }
+
+    // Paper start - replaced by above methods
+    @Override
+    public boolean isTrap() {
+        return getHandle().isTrap();
+    }
+
+    @Override
+    public void setTrap(boolean trap) {
+        getHandle().setTrap(trap);
+    }
+    // Paper end
 }