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 25978b9c25096f252acd60a0924bac400d6026e7..922ce7627bd0d546802ec6b013056f7aa6acbf33 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -331,6 +331,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 e7b510dee355a9865bd67f5aea52c62957226eb3..e0f12426f18b343b27089440cd01127d79600ef0 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -675,7 +675,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()) { @@ -1621,7 +1623,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 cbf5bda50b87b8520ee6fa6d0b41c94b5c9f3583..ac4533f69e9bb22c7375ad8bc83ddc23399a56d7 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -3986,6 +3986,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S 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 d514ec1e4cbdc579c3a61533998437903afdc8b6..ed4cbc459bf5f4b7615c6e2ab0d99728d18f2598 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -378,7 +378,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 db6aa75d642f4a7258f197933671907faf79c8f2..065d4c06e3fd93fb46595b9864b150ea2480f5fc 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -377,8 +377,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