diff --git a/Spigot-API-Patches/Shoulder-Entities-Release-API.patch b/Spigot-API-Patches/Shoulder-Entities-Release-API.patch new file mode 100644 index 0000000000..89edf25377 --- /dev/null +++ b/Spigot-API-Patches/Shoulder-Entities-Release-API.patch @@ -0,0 +1,36 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 17 Jun 2017 15:04:51 -0400 +Subject: [PATCH] Shoulder Entities Release API + + +diff --git a/src/main/java/org/bukkit/entity/HumanEntity.java b/src/main/java/org/bukkit/entity/HumanEntity.java +index 518aa2a9..3939d4af 100644 +--- a/src/main/java/org/bukkit/entity/HumanEntity.java ++++ b/src/main/java/org/bukkit/entity/HumanEntity.java +@@ -0,0 +0,0 @@ public interface HumanEntity extends LivingEntity, AnimalTamer, Permissible, Inv + */ + public int getExpToLevel(); + ++ // Paper start ++ /** ++ * If there is an Entity on this entities left shoulder, it will be released to the world and returned. ++ * If no Entity is released, null will be returned. ++ * ++ * @return The released entity, or null ++ */ ++ public Entity releaseLeftShoulderEntity(); ++ ++ /** ++ * If there is an Entity on this entities left shoulder, it will be released to the world and returned. ++ * If no Entity is released, null will be returned. ++ * ++ * @return The released entity, or null ++ */ ++ public Entity releaseRightShoulderEntity(); ++ // Paper end ++ + /** + * Gets the entity currently perched on the left shoulder or null if no + * entity. +-- \ No newline at end of file diff --git a/Spigot-Server-Patches/Shoulder-Entities-Release-API.patch b/Spigot-Server-Patches/Shoulder-Entities-Release-API.patch new file mode 100644 index 0000000000..49d2ac2f39 --- /dev/null +++ b/Spigot-Server-Patches/Shoulder-Entities-Release-API.patch @@ -0,0 +1,101 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 17 Jun 2017 15:18:30 -0400 +Subject: [PATCH] Shoulder Entities Release API + + +diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java +index f5e25e63d..8f3cefaa8 100644 +--- a/src/main/java/net/minecraft/server/EntityHuman.java ++++ b/src/main/java/net/minecraft/server/EntityHuman.java +@@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving { + } + // CraftBukkit end + } ++ // Paper start ++ public Entity releaseLeftShoulderEntity() { ++ Entity entity = this.spawnEntityFromShoulder0(this.getShoulderEntityLeft()); ++ if (entity != null) { ++ this.setShoulderEntityLeft(new NBTTagCompound()); ++ } ++ return entity; ++ } + +- private boolean spawnEntityFromShoulder(@Nullable NBTTagCompound nbttagcompound) { // CraftBukkit void->boolean +- if (!this.world.isClientSide && !nbttagcompound.isEmpty()) { ++ public Entity releaseRightShoulderEntity() { ++ Entity entity = this.spawnEntityFromShoulder0(this.getShoulderEntityRight()); ++ if (entity != null) { ++ this.setShoulderEntityRight(new NBTTagCompound()); ++ } ++ return entity; ++ } ++ ++ // Paper - incase any plugins used NMS to call this... old method signature to avoid other diff ++ private boolean spawnEntityFromShoulder(@Nullable NBTTagCompound nbttagcompound) { ++ return spawnEntityFromShoulder0(nbttagcompound) != null; ++ } ++ // Paper - Moved to new method that now returns entiy, and properly null checks ++ private Entity spawnEntityFromShoulder0(@Nullable NBTTagCompound nbttagcompound) { // CraftBukkit void->boolean - Paper - return Entity ++ if (!this.world.isClientSide && nbttagcompound != null && !nbttagcompound.isEmpty()) { // Paper - null check + Entity entity = EntityTypes.a(nbttagcompound, this.world); ++ if (entity == null) { // Paper - null check ++ return null; ++ } + + if (entity instanceof EntityTameableAnimal) { + ((EntityTameableAnimal) entity).setOwnerUUID(this.uniqueID); + } + + entity.setPosition(this.locX, this.locY + 0.699999988079071D, this.locZ); +- return this.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SHOULDER_ENTITY); // CraftBukkit ++ if (this.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SHOULDER_ENTITY)) { // CraftBukkit ++ return entity; ++ } + } + +- return true; // CraftBukkit ++ return null; + } ++ // Paper end + + public abstract boolean isSpectator(); + +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +index 25e1e5a3f..463dddc98 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +@@ -0,0 +0,0 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { + getHandle().getCooldownTracker().a(CraftMagicNumbers.getItem(material), ticks); + } + ++ // Paper start ++ @Override ++ public org.bukkit.entity.Entity releaseLeftShoulderEntity() { ++ if (!getHandle().getShoulderEntityLeft().isEmpty()) { ++ Entity entity = getHandle().releaseLeftShoulderEntity(); ++ if (entity != null) { ++ return entity.getBukkitEntity(); ++ } ++ } ++ ++ return null; ++ } ++ ++ @Override ++ public org.bukkit.entity.Entity releaseRightShoulderEntity() { ++ if (!getHandle().getShoulderEntityRight().isEmpty()) { ++ Entity entity = getHandle().releaseRightShoulderEntity(); ++ if (entity != null) { ++ return entity.getBukkitEntity(); ++ } ++ } ++ ++ return null; ++ } ++ // Paper end ++ + @Override + public org.bukkit.entity.Entity getShoulderEntityLeft() { + if (!getHandle().getShoulderEntityLeft().isEmpty()) { +-- \ No newline at end of file