From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Wed, 7 Feb 2024 06:58:52 +0000 Subject: [PATCH] Prevent teleportAsync calling during moving event being diff --git a/src/main/java/me/earthme/luminol/config/modules/fixes/FoliaTeleportAsyncFixConfig.java b/src/main/java/me/earthme/luminol/config/modules/fixes/FoliaTeleportAsyncFixConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..8f1449545d6d217b46a9ffae705123daefe55b25 --- /dev/null +++ b/src/main/java/me/earthme/luminol/config/modules/fixes/FoliaTeleportAsyncFixConfig.java @@ -0,0 +1,24 @@ +package me.earthme.luminol.config.modules.fixes; + +import me.earthme.luminol.config.ConfigInfo; +import me.earthme.luminol.config.EnumConfigCategory; +import me.earthme.luminol.config.IConfigModule; + +public class FoliaTeleportAsyncFixConfig implements IConfigModule { + @ConfigInfo(baseName = "enabled", comments = + "A fix which fixed some bugs of teleportAsync " + + "that caused by plugins(such as Residence)") + public static boolean enabled = false; + @ConfigInfo(baseName = "throw_on_detected") + public static boolean throwOnDetected = true; + + @Override + public EnumConfigCategory getCategory() { + return EnumConfigCategory.FIXES; + } + + @Override + public String getBaseName() { + return "folia.prevent_teleportasync_call_during_moving"; + } +} diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java index 20f8c9bfdde62f1572e22319ebb752d12d9d5bac..24f4370b35d2cc50340de36d81b6c6d9aa250e4c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -347,6 +347,10 @@ public class ServerPlayer extends Player { public double lastEntitySpawnRadiusSquared = -1.0; // Paper end - optimise chunk tick iteration + //Luminol start - Prevent teleportAsync calling during moving event being handled + public boolean handlingMoveEvent = false; + //Luminol end + public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile, ClientInformation clientOptions) { super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); this.chatVisibility = ChatVisiblity.FULL; diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java index b4c4e72ddd09231747f82962a9d2883c6415ce30..bd666d03324291ec847136bab905f0aec726a211 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -695,7 +695,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); + this.player.handlingMoveEvent = true; //Luminol - Prevent teleportAsync calling during moving event being handled this.cserver.getPluginManager().callEvent(event); + this.player.handlingMoveEvent = false; //Luminol - Prevent teleportAsync calling during moving event being handled // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { @@ -1612,7 +1614,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); + this.player.handlingMoveEvent = true; //Luminol - Prevent teleportAsync calling during moving event being handled this.cserver.getPluginManager().callEvent(event); + this.player.handlingMoveEvent = false; //Luminol - Prevent teleportAsync calling during moving event being handled // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java index f39e8291d2d8b15201835b8c018776ef6eda8d24..7112c529a652b6ab6a418b3a44fc1f075061cc74 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -4033,6 +4033,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess java.util.function.Consumer teleportComplete) { io.papermc.paper.util.TickThread.ensureTickThread(this, "Cannot teleport entity async"); + //Luminol start - Prevent teleportAsync calling during moving event being handled + if (this instanceof ServerPlayer player && me.earthme.luminol.config.modules.fixes.FoliaTeleportAsyncFixConfig.enabled){ + if (player.handlingMoveEvent){ + if (me.earthme.luminol.config.modules.fixes.FoliaTeleportAsyncFixConfig.throwOnDetected){ + throw new IllegalStateException("Player " + player.getScoreboardName() + " is trying to teleport to " + pos + " during move event handling!"); + } + MinecraftServer.LOGGER.warn("Player {} is trying to teleport to {} during move event handling!",player.getScoreboardName(),pos); + return false; + } + } + //Luminol end + if (!ServerLevel.isInSpawnableBounds(new BlockPos(io.papermc.paper.util.CoordinateUtils.getBlockX(pos), io.papermc.paper.util.CoordinateUtils.getBlockY(pos), io.papermc.paper.util.CoordinateUtils.getBlockZ(pos)))) { return false; } diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java index 4d7454e5a64fc18e63793a221daa94617f17c666..a1dc46ec6d53389eb7c801a7a14c4169406de580 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -375,7 +375,21 @@ public abstract class AbstractMinecart extends VehicleEntity { this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); if (!from.equals(to)) { + //Luminol start - Prevent teleportAsync calling during moving event being handled + for (Entity passenger : this.getPassengers()) { + if (passenger instanceof net.minecraft.server.level.ServerPlayer player){ + player.handlingMoveEvent = true; + } + } + //Luminol end this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); + //Luminol start - Prevent teleportAsync calling during moving event being handled + for (Entity passenger : this.getPassengers()) { + if (passenger instanceof net.minecraft.server.level.ServerPlayer player){ + player.handlingMoveEvent = false; + } + } + //Luminol end } // CraftBukkit end if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) { diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java index b068cff9b5aa457d65b679529956e8210296d799..d002519a356072284faa5f879e188f3e3062939f 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -370,8 +370,22 @@ public class Boat extends VehicleEntity implements VariantHolder { server.getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); if (this.lastLocation != null && !this.lastLocation.equals(to)) { + //Luminol start - Prevent teleportAsync calling during moving event being handled + for (Entity passenger : this.getPassengers()) { + if (passenger instanceof net.minecraft.server.level.ServerPlayer player){ + player.handlingMoveEvent = true; + } + } + //Luminol end VehicleMoveEvent event = new VehicleMoveEvent(vehicle, this.lastLocation, to); server.getPluginManager().callEvent(event); + //Luminol start - Prevent teleportAsync calling during moving event being handled + for (Entity passenger : this.getPassengers()) { + if (passenger instanceof net.minecraft.server.level.ServerPlayer player){ + player.handlingMoveEvent = false; + } + } + //Luminol end } this.lastLocation = vehicle.getLocation(); // CraftBukkit end