71c84c8132
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 9a80d38c SPIGOT-336, SPIGOT-3366, SPIGOT-5768, SPIGOT-6409, SPIGOT-6861, PR-722: Add EntityRemoveEvent 258086d9 SPIGOT-7417, PR-967: Add Sign#getTargetSide and Sign#getAllowedEditor ffaba051 SPIGOT-7584: Add missing Tag.ITEMS_NON_FLAMMABLE_WOOD CraftBukkit Changes: 98b6c1ac7 SPIGOT-7589 Fix NullPointerException when bans expire a2736ddb0 SPIGOT-336, SPIGOT-3366, SPIGOT-5768, SPIGOT-6409, SPIGOT-6861, PR-1008: Add EntityRemoveEvent 5bf12cb89 SPIGOT-7565: Throw a more descriptive error message when a developer tries to spawn an entity from a CraftBukkit class 76d95fe7e SPIGOT-7417, PR-1343: Add Sign#getTargetSide and Sign#getAllowedEditor Spigot Changes: e9ec5485 Rebuild patches f1b62e0c Rebuild patches
114 Zeilen
5.8 KiB
Diff
114 Zeilen
5.8 KiB
Diff
From 0000000000000000000000000000000000000000 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/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index 31ff851cc15216fb5855f829f3fc22c1d26ece21..cb453b843ecf82454a8ade369d424d5e7bbda4c4 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -2570,11 +2570,16 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
|
}
|
|
|
|
public void removeVehicle() {
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ stopRiding(false);
|
|
+ }
|
|
+ public void stopRiding(boolean suppressCancellation) {
|
|
+ // Paper end - Force entity dismount during teleportation
|
|
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 - Force entity dismount during teleportation
|
|
}
|
|
|
|
}
|
|
@@ -2605,7 +2610,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
|
}
|
|
}
|
|
|
|
- protected boolean removePassenger(Entity entity) { // CraftBukkit
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ protected boolean removePassenger(Entity entity) { return removePassenger(entity, false);}
|
|
+ protected boolean removePassenger(Entity entity, boolean suppressCancellation) { // CraftBukkit
|
|
+ // Paper end - Force entity dismount during teleportation
|
|
if (entity.getVehicle() == this) {
|
|
throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)");
|
|
} else {
|
|
@@ -2615,7 +2623,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
|
if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) {
|
|
VehicleExitEvent event = new VehicleExitEvent(
|
|
(Vehicle) this.getBukkitEntity(),
|
|
- (LivingEntity) entity.getBukkitEntity()
|
|
+ (LivingEntity) entity.getBukkitEntity(), !suppressCancellation // Paper - Force entity dismount during teleportation
|
|
);
|
|
// Suppress during worldgen
|
|
if (this.valid) {
|
|
@@ -2628,7 +2636,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
|
}
|
|
}
|
|
|
|
- EntityDismountEvent event = new EntityDismountEvent(entity.getBukkitEntity(), this.getBukkitEntity());
|
|
+ EntityDismountEvent event = new EntityDismountEvent(entity.getBukkitEntity(), this.getBukkitEntity(), !suppressCancellation); // Paper - Force entity dismount during teleportation
|
|
// Suppress during worldgen
|
|
if (this.valid) {
|
|
Bukkit.getPluginManager().callEvent(event);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index 5a1dc8f196b274a822db4aa1fa48cd066f12da94..f619171b3e436d7263d5229f7f9131954a0941f8 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3492,9 +3492,15 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
|
|
@Override
|
|
public void stopRiding() {
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ stopRiding(false);
|
|
+ }
|
|
+ @Override
|
|
+ public void stopRiding(boolean suppressCancellation) {
|
|
+ // Paper end - Force entity dismount during teleportation
|
|
Entity entity = this.getVehicle();
|
|
|
|
- super.stopRiding();
|
|
+ super.stopRiding(suppressCancellation); // Paper - Force entity dismount during teleportation
|
|
if (entity != null && entity != this.getVehicle() && !this.level().isClientSide) {
|
|
this.dismountVehicle(entity);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
index 83c7ba56900ce40f71d98062bf15110a76597dce..3c3c953f05c18279d3245fe6bc8afef83cd62cd1 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
@@ -1141,7 +1141,13 @@ public abstract class Player extends LivingEntity {
|
|
|
|
@Override
|
|
public void removeVehicle() {
|
|
- super.removeVehicle();
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ stopRiding(false);
|
|
+ }
|
|
+ @Override
|
|
+ public void stopRiding(boolean suppressCancellation) {
|
|
+ super.stopRiding(suppressCancellation);
|
|
+ // Paper end - Force entity dismount during teleportation
|
|
this.boardingCooldown = 0;
|
|
}
|
|
|