ef0e5a642d
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: 9ae3f10f SPIGOT-3842: Add Player#fireworkBoost() and expand Firework API 48c0c547 PR-786: Add methods to get sounds from entities CraftBukkit Changes: 5cc9c022a SPIGOT-7152: Handle hand item changing during air interact event 4ffa1acf6 SPIGOT-7154: Players get kicked when interacting with a conversation 4daa21123 SPIGOT-3842: Add Player#fireworkBoost() and expand Firework API e5d6a9bbf PR-1100: Add methods to get sounds from entities b7e9f1c8b SPIGOT-7146: Reduce use of Material switch in ItemMeta Spigot Changes: 4c157bb4 Rebuild patches
135 Zeilen
6.3 KiB
Diff
135 Zeilen
6.3 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/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
index 4c35529c7ed67c2432ac67e7d8ffe295892757ff..f91da5bc234a8f1c120261823a1a4e4216513329 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
@@ -1351,11 +1351,13 @@ public class ServerPlayer extends Player {
|
|
}
|
|
}
|
|
|
|
- @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.connection != null) {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index 0282b575d4ff68a306053f86b47908dd44dc54ed..424eed2daa3a9574cf1179a7f970f1565ea5fc71 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -2329,11 +2329,16 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
|
}
|
|
|
|
public void removeVehicle() {
|
|
+ // Paper start
|
|
+ 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
|
|
}
|
|
|
|
}
|
|
@@ -2396,7 +2401,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
|
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 {
|
|
@@ -2406,7 +2414,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
|
if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) {
|
|
VehicleExitEvent event = new VehicleExitEvent(
|
|
(Vehicle) this.getBukkitEntity(),
|
|
- (LivingEntity) entity.getBukkitEntity()
|
|
+ (LivingEntity) entity.getBukkitEntity(), !suppressCancellation // Paper
|
|
);
|
|
// Suppress during worldgen
|
|
if (this.valid) {
|
|
@@ -2420,7 +2428,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
|
}
|
|
// 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
|
|
// 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 369b2d92dbae896824b2e54cf30f8a607c43d451..1b907ca310ee217c9496f1b9a63d9cc694c177f0 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3404,9 +3404,15 @@ public abstract class LivingEntity extends Entity {
|
|
|
|
@Override
|
|
public void stopRiding() {
|
|
+ // Paper start
|
|
+ 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.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 2520ba136cf17392120f6187a73015f438c302f1..d308c671ec1c4440777bccf1609ceca6670b98a8 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
@@ -1160,7 +1160,13 @@ public abstract class Player extends LivingEntity {
|
|
|
|
@Override
|
|
public void removeVehicle() {
|
|
- super.removeVehicle();
|
|
+ // Paper start
|
|
+ stopRiding(false);
|
|
+ }
|
|
+ @Override
|
|
+ public void stopRiding(boolean suppressCancellation) {
|
|
+ // Paper end
|
|
+ super.stopRiding(suppressCancellation); // Paper - suppress
|
|
this.boardingCooldown = 0;
|
|
}
|
|
|