mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 07:20:24 +01:00
135 lines
6.5 KiB
Diff
135 lines
6.5 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 b68acf219fc61e2ea811d0c732393824fa44db2d..416c21f0a6be8d71a654e18f7ea0fa074f8fc5ff 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
@@ -1258,11 +1258,13 @@ public class ServerPlayer extends Player implements ContainerListener {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- @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 460c6fd61bb45247715d99445821e15e98e4c465..c5d6235a132818dfc78105e9d03d0687f697bb00 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
@@ -2044,12 +2044,15 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
|
||
|
}
|
||
|
|
||
|
- public void removeVehicle() {
|
||
|
+ // Paper start
|
||
|
+ public void removeVehicle() { 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
|
||
|
}
|
||
|
|
||
|
}
|
||
|
@@ -2104,7 +2107,10 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
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 {
|
||
|
@@ -2114,7 +2120,7 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
if (getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) {
|
||
|
VehicleExitEvent event = new VehicleExitEvent(
|
||
|
(Vehicle) getBukkitEntity(),
|
||
|
- (LivingEntity) entity.getBukkitEntity()
|
||
|
+ (LivingEntity) entity.getBukkitEntity(), !suppressCancellation // Paper
|
||
|
);
|
||
|
// Suppress during worldgen
|
||
|
if (this.valid) {
|
||
|
@@ -2128,7 +2134,7 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
}
|
||
|
// 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 7a2292e6907a2ae2026bd7243e864bd8300ecafa..29d4ed42e5d763639a50d849ef274c4d848bc9c9 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
@@ -3012,11 +3012,13 @@ public abstract class LivingEntity extends Entity {
|
||
|
return ((Byte) this.entityData.get(LivingEntity.DATA_LIVING_ENTITY_FLAGS) & 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.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 3aadc4ab5fe7b2ee9e20e0789ddcfe750599972f..0685920073a6a2b2c6a80018d0c9009b2ef860c4 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||
|
@@ -1036,9 +1036,11 @@ public abstract class Player extends LivingEntity {
|
||
|
return -0.35D;
|
||
|
}
|
||
|
|
||
|
- @Override
|
||
|
- public void removeVehicle() {
|
||
|
- super.removeVehicle();
|
||
|
+ // Paper start
|
||
|
+ @Override public void removeVehicle() { stopRiding(false); }
|
||
|
+ @Override public void stopRiding(boolean suppressCancellation) {
|
||
|
+ // Paper end
|
||
|
+ super.stopRiding(suppressCancellation); // Paper - suppress
|
||
|
this.boardingCooldown = 0;
|
||
|
}
|
||
|
|