From eb51274be66ea5528f88a96fb47566325f46b0ce Mon Sep 17 00:00:00 2001 From: Shane Freeder 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, while we now lose the ability for plugins to monitor this specific case of entity dismount, the alternative is that we allow a cancellable event, but silently ignore the cancelled status, which might cause further issues for plugins tracking state Given that nobody can be relying on the Cancellable state of those events during teleportation due to the issues that arise from this, this is a small trade off diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 32b90f30d9..2377175f83 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -2096,12 +2096,15 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } - public void stopRiding() { + // Paper start + public void stopRiding() { stopRiding(false); } + public void stopRiding(boolean force) { + // 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, force)) this.vehicle = entity; // CraftBukkit // Paper } } @@ -2146,10 +2149,14 @@ 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 force) { // CraftBukkit + // Paper end if (entity.getVehicle() == this) { throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); } else { + if (!force) { // Paper // CraftBukkit start CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); @@ -2172,6 +2179,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke if (event.isCancelled()) { return false; } + } // Paper // Spigot end this.passengers.remove(entity); entity.k = 60; diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java index 4490b63258..4fcbbae7d4 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java @@ -776,10 +776,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } } - public void stopRiding() { + // Paper start + public void stopRiding() { stopRiding(false);}; + public void stopRiding(boolean force) { + // paper end Entity entity = this.getVehicle(); - super.stopRiding(); + super.stopRiding(force); // Paper Entity entity1 = this.getVehicle(); if (entity1 != entity && this.playerConnection != null) { diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java index 73bd0dc4a1..ec52f385eb 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -619,7 +619,7 @@ public abstract class PlayerList { } public EntityPlayer moveToWorld(EntityPlayer entityplayer, DimensionManager dimensionmanager, boolean flag, Location location, boolean avoidSuffocation) { - entityplayer.stopRiding(); // CraftBukkit + entityplayer.stopRiding(true); // CraftBukkit // Paper entityplayer.getWorldServer().getTracker().untrackPlayer(entityplayer); // entityplayer.getWorldServer().getTracker().untrackEntity(entityplayer); // CraftBukkit entityplayer.getWorldServer().getPlayerChunkMap().removePlayer(entityplayer); -- 2.19.1