diff options
Diffstat (limited to 'Spigot-Server-Patches/0396-force-entity-dismount-during-teleportation.patch')
-rw-r--r-- | Spigot-Server-Patches/0396-force-entity-dismount-during-teleportation.patch | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0396-force-entity-dismount-during-teleportation.patch b/Spigot-Server-Patches/0396-force-entity-dismount-during-teleportation.patch new file mode 100644 index 0000000000..1f4c47f467 --- /dev/null +++ b/Spigot-Server-Patches/0396-force-entity-dismount-during-teleportation.patch @@ -0,0 +1,134 @@ +From e5b4fd7a68006fa22e4d6efea4893026f03e284e Mon Sep 17 00:00:00 2001 +From: Shane Freeder <[email protected]> +Date: Thu, 15 Nov 2018 13:38:37 +0000 +Subject: [PATCH] force entity dismount during teleportation + +Entities must be dismounted before teleportation in order to avoid +multiple issues in the server with regards to teleportation, shamefully, +too many plugins rely on the events firing, which means that not firing +these events caues more issues than it solves; + +In order to counteract this, Entity dismount/exit vehicle events have +been modified to supress cancellation (and has a method to allow plugins +to check if this has been set), noting that cancellation will be silently +surpressed given that plugins are not expecting this event to not be cancellable. + +This is a far from ideal scenario, however: given the current state of this +event and other alternatives causing issues elsewhere, I believe that +this is going to be the best soultion all around. + +Improvements/suggestions welcome! + +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index f745ed8fee..a678dc89c8 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -2097,12 +2097,15 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + + } + +- public void stopRiding() { ++ // Paper start ++ public void stopRiding() { stopRiding(false); } ++ public void stopRiding(boolean suppressCancellation) { ++ // Paper end + if (this.vehicle != null) { + Entity entity = this.vehicle; + + this.vehicle = null; +- if (!entity.removePassenger(this)) this.vehicle = entity; // CraftBukkit ++ if (!entity.removePassenger(this, suppressCancellation)) this.vehicle = entity; // CraftBukkit // Paper + } + + } +@@ -2147,7 +2150,10 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + return true; // CraftBukkit + } + +- protected boolean removePassenger(Entity entity) { // CraftBukkit ++ // Paper start ++ protected boolean removePassenger(Entity entity) { return removePassenger(entity, false);} ++ protected boolean removePassenger(Entity entity, boolean suppressCancellation) { // CraftBukkit ++ // Paper end + if (entity.getVehicle() == this) { + throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); + } else { +@@ -2157,7 +2163,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + if (getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) { + VehicleExitEvent event = new VehicleExitEvent( + (Vehicle) getBukkitEntity(), +- (LivingEntity) entity.getBukkitEntity() ++ (LivingEntity) entity.getBukkitEntity(), !suppressCancellation // Paper + ); + Bukkit.getPluginManager().callEvent(event); + CraftEntity craftn = (CraftEntity) entity.getBukkitEntity().getVehicle(); +@@ -2168,7 +2174,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + } + // CraftBukkit end + // Spigot start +- org.spigotmc.event.entity.EntityDismountEvent event = new org.spigotmc.event.entity.EntityDismountEvent(entity.getBukkitEntity(), this.getBukkitEntity()); ++ org.spigotmc.event.entity.EntityDismountEvent event = new org.spigotmc.event.entity.EntityDismountEvent(entity.getBukkitEntity(), this.getBukkitEntity(), !suppressCancellation); // Paper + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; +diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java +index 4bbf577523..f5d9b4abc2 100644 +--- a/src/main/java/net/minecraft/server/EntityHuman.java ++++ b/src/main/java/net/minecraft/server/EntityHuman.java +@@ -991,8 +991,11 @@ public abstract class EntityHuman extends EntityLiving { + return -0.35D; + } + +- public void stopRiding() { +- super.stopRiding(); ++ // Paper start ++ public void stopRiding() { stopRiding(false); } ++ public void stopRiding(boolean suppressCancellation) { ++ // Paper end ++ super.stopRiding(suppressCancellation); // Paper - suppress + this.k = 0; + } + +diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java +index 14f1029687..4d5459d24f 100644 +--- a/src/main/java/net/minecraft/server/EntityLiving.java ++++ b/src/main/java/net/minecraft/server/EntityLiving.java +@@ -2479,10 +2479,13 @@ public abstract class EntityLiving extends Entity { + return ((Byte) this.datawatcher.get(EntityLiving.aw) & 4) != 0; + } + +- public void stopRiding() { ++ // Paper start ++ public void stopRiding() { stopRiding(false); } ++ public void stopRiding(boolean suppressCancellation) { ++ // Paper end + Entity entity = this.getVehicle(); + +- super.stopRiding(); ++ super.stopRiding(suppressCancellation); // Paper - suppress + if (entity != null && entity != this.getVehicle() && !this.world.isClientSide) { + this.A(entity); + } +diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java +index 5b1bbc7724..57c6455bd8 100644 +--- a/src/main/java/net/minecraft/server/EntityPlayer.java ++++ b/src/main/java/net/minecraft/server/EntityPlayer.java +@@ -784,10 +784,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting { + } + } + +- public void stopRiding() { ++ // Paper start ++ public void stopRiding() { stopRiding(false); } ++ public void stopRiding(boolean suppressCancellation) { ++ // paper end + Entity entity = this.getVehicle(); + +- super.stopRiding(); ++ super.stopRiding(suppressCancellation); // Paper + Entity entity1 = this.getVehicle(); + + if (entity1 != entity && this.playerConnection != null) { +-- +2.21.0 + |