diff options
author | Nate Mortensen <nate.richard.mortensen@gmail.com> | 2013-07-12 16:45:42 -0600 |
---|---|---|
committer | Nate Mortensen <nate.richard.mortensen@gmail.com> | 2013-07-13 13:29:32 -0600 |
commit | cebc247b78e14c7bc236d69010e1000d53be28ef (patch) | |
tree | a54345c2058257476570d19aba1572955c9da659 /src/main/java/net/minecraft/server/Entity.java | |
parent | 67f15266dae4d2963d5351fb20f40de63acd721e (diff) | |
download | craftbukkit-cebc247b78e14c7bc236d69010e1000d53be28ef.tar craftbukkit-cebc247b78e14c7bc236d69010e1000d53be28ef.tar.gz craftbukkit-cebc247b78e14c7bc236d69010e1000d53be28ef.tar.lz craftbukkit-cebc247b78e14c7bc236d69010e1000d53be28ef.tar.xz craftbukkit-cebc247b78e14c7bc236d69010e1000d53be28ef.zip |
Correctly fire VehicleExitEvent. Fixes BUKKIT-3761
This change makes it so that EntityHuman#setPassengerOf(Entity) invokes
its parent method when leaving vehicles so that VehicleExitEvent is fired
for players leaving vehicles.
This change also fixes BUKKIT-2110, making it so VehicleExitEvent
correctly handles cancellation. The implementation of VehicleExitEvent
completely ignored the cancellation state of the event, making it so that
cancelling the event had no effect. Cancelling a VehicleExitEvent now
causes the entity to remain inside of the vehicle, with no visual stutter.
Diffstat (limited to 'src/main/java/net/minecraft/server/Entity.java')
-rw-r--r-- | src/main/java/net/minecraft/server/Entity.java | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 671384d5..50edbdb5 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -1391,6 +1391,8 @@ public abstract class Entity { // b(null) doesn't really fly for overloaded methods, // so this method is needed + Entity originalVehicle = this.vehicle; + Entity originalPassenger = this.vehicle == null ? null : this.vehicle.passenger; PluginManager pluginManager = Bukkit.getPluginManager(); this.getBukkitEntity(); // make sure bukkitEntity is initialised // CraftBukkit end @@ -1402,6 +1404,10 @@ public abstract class Entity { if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) { VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); pluginManager.callEvent(event); + + if (event.isCancelled() || this.vehicle != originalVehicle) { + return; + } } // CraftBukkit end @@ -1413,10 +1419,28 @@ public abstract class Entity { } else { // CraftBukkit start if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4)) { + // It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are. + VehicleExitEvent exitEvent = null; + if (this.vehicle != null) { + exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); + pluginManager.callEvent(exitEvent); + + if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { + return; + } + } + VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity); pluginManager.callEvent(event); - if (event.isCancelled()) { + // If a plugin messes with the vehicle or the vehicle's passenger + if (event.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { + // If we only cancelled the enterevent then we need to put the player in a decent position. + if (exitEvent != null && this.vehicle == originalVehicle && this.vehicle != null && this.vehicle.passenger == originalPassenger) { + this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); + this.vehicle.passenger = null; + this.vehicle = null; + } return; } } |