From a7744ac751842e1adbeb1ee125bf8be093d4e0bc Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Fri, 16 Dec 2011 12:31:00 -0800 Subject: [PATCH] Prevent VehicleEnterEvent being sent when player exits vehicle. Fix for BUKKIT-223. Issue BUKKIT-223: When a player exits a minecart or boat, both a VehicleExitEvent and a VehicleEnterEvent are fired. Only the VehicleExitEvent should fire. Reason for bug: This occurs because the VehicleEnterEvent is fired in EntityBoat.b and EntityMinecart.b *any* time a player right-clicks on a vehicle, whether the right-click is to enter the vehicle or exit it. Fix: By moving the creation of VehicleEnterEvents from EntityBoat.b and EntityMinecart.b to Entity.setPassengerOf, we can create either a VehicleEnterEvent or a VehicleExitEvent, depending on whether the player is entering or exiting a vehicle. --- .../java/net/minecraft/server/Entity.java | 12 +++++++++++ .../java/net/minecraft/server/EntityBoat.java | 9 --------- .../net/minecraft/server/EntityMinecart.java | 20 +------------------ 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 4759b92bfc..4110512764 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -14,6 +14,7 @@ import org.bukkit.event.entity.EntityCombustByBlockEvent; import org.bukkit.event.entity.EntityCombustByEntityEvent; import org.bukkit.event.painting.PaintingBreakByEntityEvent; import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; +import org.bukkit.event.vehicle.VehicleEnterEvent; import org.bukkit.event.vehicle.VehicleExitEvent; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.event.entity.EntityCombustEvent; @@ -1228,6 +1229,17 @@ public abstract class Entity { this.vehicle = null; this.setPositionRotation(entity.locX, entity.boundingBox.b + (double) entity.length, entity.locZ, this.yaw, this.pitch); } else { + // CraftBukkit start + if ((this.getBukkitEntity() instanceof LivingEntity) && (entity != null) && (entity.getBukkitEntity() instanceof Vehicle)) { + VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), (LivingEntity) this.getBukkitEntity()); + this.world.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; + } + } + // CraftBukkit end + if (this.vehicle != null) { this.vehicle.passenger = null; } diff --git a/src/main/java/net/minecraft/server/EntityBoat.java b/src/main/java/net/minecraft/server/EntityBoat.java index f3666af9ad..6ed6d9287c 100644 --- a/src/main/java/net/minecraft/server/EntityBoat.java +++ b/src/main/java/net/minecraft/server/EntityBoat.java @@ -420,15 +420,6 @@ public class EntityBoat extends Entity { return true; } else { if (!this.world.isStatic) { - // CraftBukkit start - VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) this.getBukkitEntity(), entityhuman.getBukkitEntity()); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - // CraftBukkit end - entityhuman.mount(this); } diff --git a/src/main/java/net/minecraft/server/EntityMinecart.java b/src/main/java/net/minecraft/server/EntityMinecart.java index b50d5bccaf..4d755d0aa0 100644 --- a/src/main/java/net/minecraft/server/EntityMinecart.java +++ b/src/main/java/net/minecraft/server/EntityMinecart.java @@ -725,14 +725,7 @@ public class EntityMinecart extends Entity implements IInventory { } if (entity instanceof EntityLiving && !(entity instanceof EntityHuman) && this.type == 0 && this.motX * this.motX + this.motZ * this.motZ > 0.01D && this.passenger == null && entity.vehicle == null) { - if (!collisionEvent.isPickupCancelled()) { - VehicleEnterEvent enterEvent = new VehicleEnterEvent(vehicle, hitEntity); - this.world.getServer().getPluginManager().callEvent(enterEvent); - - if (!enterEvent.isCancelled()) { - entity.mount(this); - } - } + entity.mount(this); } // CraftBukkit end @@ -857,17 +850,6 @@ public class EntityMinecart extends Entity implements IInventory { } if (!this.world.isStatic) { - // CraftBukkit start - org.bukkit.entity.Entity player = (entityhuman == null) ? null : entityhuman.getBukkitEntity(); - - VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) this.getBukkitEntity(), player); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - // CraftBukkit end - entityhuman.mount(this); } } else if (this.type == 1) {