From 4bd6e01e211901f94be1376c9311fb394a931e63 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Fri, 22 Apr 2016 18:20:05 -0500 Subject: [PATCH] Vehicle Event Cancellation Changes diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 5f134d0..6950acf 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -1700,6 +1700,10 @@ public abstract class Entity implements ICommandListener { } public boolean a(Entity entity, boolean flag) { + return this.mountEntity(entity, flag, false); // Paper - OBFHELPER + } + + public boolean mountEntity(Entity entity, boolean flag, boolean suppressEvents) { // Paper if (!flag && (!this.n(entity) || !entity.q(this))) { return false; } else { @@ -1708,7 +1712,7 @@ public abstract class Entity implements ICommandListener { } this.au = entity; - this.au.o(this); + this.au.addRider(this, suppressEvents); // Paper return true; } } @@ -1735,12 +1739,20 @@ public abstract class Entity implements ICommandListener { } protected void o(Entity entity) { + // Paper start - OBFHELPER + this.addRider(entity, false); + } + + private void addRider(Entity entity, boolean suppressEvents) { + // Paper end if (entity.bB() != this) { throw new IllegalStateException("Use x.startRiding(y), not y.addPassenger(x)"); } else { // CraftBukkit start com.google.common.base.Preconditions.checkState(!entity.passengers.contains(this), "Circular entity riding! %s %s", this, entity); + if (!suppressEvents) { // Paper - Make event calls suppressible + // ============================================================= CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); if (getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4, false)) { // Boolean not used @@ -1763,6 +1775,8 @@ public abstract class Entity implements ICommandListener { return; } // Spigot end + // ============================================================= + } // Paper - end suppressible block if (!this.world.isClientSide && entity instanceof EntityHuman && !(this.bw() instanceof EntityHuman)) { this.passengers.add(0, entity); } else { @@ -1788,16 +1802,29 @@ public abstract class Entity implements ICommandListener { CraftEntity craftn = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity n = craftn == null ? null : craftn.getHandle(); if (event.isCancelled() || n != orig) { + this.cancelDismount(entity); // Paper return; } } // CraftBukkit end - Bukkit.getPluginManager().callEvent( new org.spigotmc.event.entity.EntityDismountEvent(entity.getBukkitEntity(), this.getBukkitEntity())); // Spigot + // Paper start - make EntityDismountEvent cancellable + if (!new org.spigotmc.event.entity.EntityDismountEvent(entity.getBukkitEntity(), this.getBukkitEntity()).callEvent()) { + this.cancelDismount(entity); + return; + } + // Paper end this.passengers.remove(entity); entity.j = 60; } } + // Paper start + private void cancelDismount(Entity dismounter) { + this.passengers.remove(dismounter); + dismounter.mountEntity(this, false, true); + } + // Paper end + protected boolean q(Entity entity) { return this.bx().size() < 1; } -- 2.10.1.windows.1