mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-18 20:53:09 +01:00
da9d110d5b
This patch does not appear to be doing anything useful, and may hide errors. Currently, the save logic does not run through this path either so it did not do anything. Additionally, properly implement support for handling RegionFileSizeException in Moonrise.
166 lines
8.2 KiB
Diff
166 lines
8.2 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 90587b5acee5c2d854604b53ef83c5f7d8c87a08..a2342c9cfa8db2c012a77cc95378e3adb2a98287 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
@@ -2826,9 +2826,15 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
|
|
|
|
@Override
|
|
public void stopRiding() {
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ this.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 instanceof LivingEntity entityliving) {
|
|
Iterator iterator = entityliving.getActiveEffects().iterator();
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index e67d8da5be50e07cb0473b7bfe6d381da044155a..a430a3e2c3b4ae53cad1fbaf4dd71b9e2f24ccf7 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -2822,17 +2822,28 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
}
|
|
|
|
public void removeVehicle() {
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ this.removeVehicle(false);
|
|
+ }
|
|
+ public void removeVehicle(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
|
|
}
|
|
|
|
}
|
|
|
|
public void stopRiding() {
|
|
- this.removeVehicle();
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ this.stopRiding(false);
|
|
+ }
|
|
+
|
|
+ public void stopRiding(boolean suppressCancellation) {
|
|
+ this.removeVehicle(suppressCancellation);
|
|
+ // Paper end - Force entity dismount during teleportation
|
|
}
|
|
|
|
protected void addPassenger(Entity passenger) {
|
|
@@ -2857,7 +2868,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
}
|
|
}
|
|
|
|
- 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 {
|
|
@@ -2867,7 +2881,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
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) {
|
|
@@ -2880,7 +2894,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
|
}
|
|
}
|
|
|
|
- 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 7ba5e60eae4fc230c86956ed8ee895c9e1585d42..901336aac08f4c49328316aeccb7c48a591ed6b0 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3757,9 +3757,15 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
|
|
@Override
|
|
public void stopRiding() {
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ this.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/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java
|
|
index 04e973430bf5706d5264423c24d73b903bc3f0aa..dc1870baf172982ebb34eccd4ee79497f48f8050 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java
|
|
@@ -289,7 +289,13 @@ public class Shulker extends AbstractGolem implements VariantHolder<Optional<Dye
|
|
|
|
@Override
|
|
public void stopRiding() {
|
|
- super.stopRiding();
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ this.stopRiding(false);
|
|
+ }
|
|
+ @Override
|
|
+ public void stopRiding(boolean suppressCancellation) {
|
|
+ super.stopRiding(suppressCancellation);
|
|
+ // Paper end - Force entity dismount during teleportation
|
|
if (this.level().isClientSide) {
|
|
this.clientOldAttachPosition = this.blockPosition();
|
|
}
|
|
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 7eb4563299e7c54ec4df53c966f6d1a86fb2ec4e..4d8929a1f5390af10fbde1dcc13c0136b0a3a745 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
|
|
@@ -1131,7 +1131,13 @@ public abstract class Player extends LivingEntity {
|
|
|
|
@Override
|
|
public void removeVehicle() {
|
|
- super.removeVehicle();
|
|
+ // Paper start - Force entity dismount during teleportation
|
|
+ this.removeVehicle(false);
|
|
+ }
|
|
+ @Override
|
|
+ public void removeVehicle(boolean suppressCancellation) {
|
|
+ super.removeVehicle(suppressCancellation);
|
|
+ // Paper end - Force entity dismount during teleportation
|
|
this.boardingCooldown = 0;
|
|
}
|
|
|