From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Fri, 27 Jul 2018 22:36:31 -0500 Subject: [PATCH] SkeletonHorse Additions diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java index a3bad391a719363077740aa810c9412df34b4ae5..e92a8c4c49c452e1f3f0c06398f2a74e3432262f 100644 --- a/src/main/java/net/minecraft/world/entity/EntitySelector.java +++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java @@ -25,6 +25,7 @@ public final class EntitySelector { public static final Predicate ATTACK_ALLOWED = (entity) -> { return !(entity instanceof Player) || !entity.isSpectator() && !((Player) entity).isCreative() && entity.level.getDifficulty() != Difficulty.PEACEFUL; }; + public static Predicate notSpectator() { return NO_SPECTATORS; } // Paper - OBFHELPER public static final Predicate NO_SPECTATORS = (entity) -> { return !entity.isSpectator(); }; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java index 7ef99acaa24525c68b1528bd3232738baab8e1c6..eaab482ae341ddda0754e726357cd845121fb043 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java @@ -26,7 +26,7 @@ public class SkeletonHorse extends AbstractHorse { private final SkeletonTrapGoal skeletonTrapGoal = new SkeletonTrapGoal(this); private boolean isTrap; - private int trapTime; + private int trapTime; public int getTrapTime() { return this.trapTime; } // Paper - OBFHELPER public SkeletonHorse(EntityType type, Level world) { super(type, world); @@ -145,10 +145,12 @@ public class SkeletonHorse extends AbstractHorse { return 0.96F; } + public boolean isTrap() { return this.isTrap(); } // Paper - OBFHELPER public boolean isTrap() { return this.isTrap; } + public void setTrap(boolean trap) { this.setTrap(trap); } // Paper - OBFHELPER public void setTrap(boolean trapped) { if (trapped != this.isTrap) { this.isTrap = trapped; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java index 6c2cbaae2afe076c8b7bc53ffa91fe37e423d120..7f5fb28a7deabe1b62ed21e5ed1ea1ecca0d15b8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java @@ -14,10 +14,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; +import org.bukkit.entity.HumanEntity; + +import java.util.List; public class SkeletonTrapGoal extends Goal { private final SkeletonHorse horse; + private List eligiblePlayers; // Paper public SkeletonTrapGoal(SkeletonHorse skeletonHorse) { this.horse = skeletonHorse; @@ -25,12 +29,13 @@ public class SkeletonTrapGoal extends Goal { @Override public boolean canUse() { - return this.horse.level.hasNearbyAlivePlayer(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D); + return !(eligiblePlayers = this.horse.level.findNearbyBukkitPlayers(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D, false)).isEmpty(); // Paper } @Override 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); diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java index 66681b9f0e2531d3da25629e44180417b32b4d66..6a5430fe54a5c8ad119a0f3842961825a54d8d7a 100644 --- a/src/main/java/net/minecraft/world/level/EntityGetter.java +++ b/src/main/java/net/minecraft/world/level/EntityGetter.java @@ -1,6 +1,9 @@ package net.minecraft.world.level; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import org.bukkit.entity.HumanEntity; + import java.util.Iterator; import java.util.List; import java.util.UUID; @@ -115,6 +118,28 @@ public interface EntityGetter { return entityhuman; } + // Paper start + default List findNearbyBukkitPlayers(double x, double y, double z, double radius, boolean notSpectator) { + return findNearbyBukkitPlayers(x, y, z, radius, notSpectator ? EntitySelector.notSpectator() : EntitySelector.canAITarget()); + } + + default List findNearbyBukkitPlayers(double x, double y, double z, double radius, @Nullable Predicate predicate) { + ImmutableList.Builder builder = ImmutableList.builder(); + + for (Player human : this.players()) { + if (predicate == null || predicate.test(human)) { + double distanceSquared = human.getDistanceSquared(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); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java index b52ca4a612e30542ef4029cb1340f616bc4c36e6..7f984639fc2697cad9d0393467b0cb896d1e55a4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java @@ -25,4 +25,26 @@ public class CraftSkeletonHorse extends CraftAbstractHorse implements SkeletonHo public Variant getVariant() { return Variant.SKELETON_HORSE; } + + // Paper start + @Override + public net.minecraft.world.entity.animal.horse.SkeletonHorse getHandle() { + return (net.minecraft.world.entity.animal.horse.SkeletonHorse) super.getHandle(); + } + + @Override + public int getTrapTime() { + return getHandle().getTrapTime(); + } + + @Override + public boolean isTrap() { + return getHandle().isTrap(); + } + + @Override + public void setTrap(boolean trap) { + getHandle().setTrap(trap); + } + // Paper end }