geforkt von Mirrors/Paper
d627cfa110
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes:17da3420
Fix reading custom persistent entity data83783357
SPIGOT-4980: Shields will not be put on cooldown when hit with an axe8d0f3722
SPIGOT-4752: Fixed inconsistency between isChunkLoaded and chunk load/unload events3f9f31c3
SPIGOT-4982: Armor disappearing while breaking the armor stand
138 Zeilen
6.2 KiB
Diff
138 Zeilen
6.2 KiB
Diff
From d8846d1d9b36f7499c06538d5ca4d2ea56b1fc21 Mon Sep 17 00:00:00 2001
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
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 e58c68275b..a9d85e71f1 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -1995,12 +1995,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
|
|
}
|
|
|
|
}
|
|
@@ -2051,7 +2054,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 {
|
|
@@ -2061,7 +2067,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();
|
|
@@ -2072,7 +2078,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 2f614dfb6b..4bea5f1ea2 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityHuman.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
|
|
@@ -937,9 +937,11 @@ public abstract class EntityHuman extends EntityLiving {
|
|
return -0.35D;
|
|
}
|
|
|
|
- @Override
|
|
- public void stopRiding() {
|
|
- super.stopRiding();
|
|
+ // Paper start
|
|
+ @Override public void stopRiding() { stopRiding(false); }
|
|
+ @Override public void stopRiding(boolean suppressCancellation) {
|
|
+ // Paper end
|
|
+ super.stopRiding(suppressCancellation); // Paper - suppress
|
|
this.j = 0;
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
index 76aba7ea5b..1d8d589efb 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
@@ -2661,11 +2661,13 @@ public abstract class EntityLiving extends Entity {
|
|
return ((Byte) this.datawatcher.get(EntityLiving.ar) & 4) != 0;
|
|
}
|
|
|
|
- @Override
|
|
- public void stopRiding() {
|
|
+ // Paper start
|
|
+ @Override public void stopRiding() { stopRiding(false); }
|
|
+ @Override 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.B(entity);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
index 2e068ec2d9..a05b31f73f 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
@@ -997,11 +997,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
|
|
}
|
|
}
|
|
|
|
- @Override
|
|
- public void stopRiding() {
|
|
+ // Paper start
|
|
+ @Override public void stopRiding() { stopRiding(false); }
|
|
+ @Override 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
|
|
|