From d113346b6df223f1c5546fdd95294f2203274db3 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 27 Mar 2023 20:24:32 -0700 Subject: [PATCH] Fix isTickThread(world, blockX, blockZ) Need to convert the Z to chunk, not block... Also throw for CraftPlayer#teleport and friends --- patches/server/0004-Threaded-Regions.patch | 98 ++++++++++++++----- patches/server/0007-Max-pending-logins.patch | 2 +- ...-getHandle-and-overrides-perform-thr.patch | 8 +- 3 files changed, 78 insertions(+), 30 deletions(-) diff --git a/patches/server/0004-Threaded-Regions.patch b/patches/server/0004-Threaded-Regions.patch index 93a7b2c..da183b1 100644 --- a/patches/server/0004-Threaded-Regions.patch +++ b/patches/server/0004-Threaded-Regions.patch @@ -10423,7 +10423,7 @@ index c856a9a0d085b278da416c59996fc131811f790c..915cbf8c02c4bba0c62e5589229ee27e * Converts an NMS entity's current location to a Bukkit Location * @param entity diff --git a/src/main/java/io/papermc/paper/util/TickThread.java b/src/main/java/io/papermc/paper/util/TickThread.java -index fc57850b80303fcade89ca95794f63910404a407..aa2924f4bb6ada1e722c4ce181c22d720fb61dca 100644 +index fc57850b80303fcade89ca95794f63910404a407..294ea54d59e1e0b00f67d1623a5c807f9d368df6 100644 --- a/src/main/java/io/papermc/paper/util/TickThread.java +++ b/src/main/java/io/papermc/paper/util/TickThread.java @@ -1,8 +1,22 @@ @@ -10530,7 +10530,7 @@ index fc57850b80303fcade89ca95794f63910404a407..aa2924f4bb6ada1e722c4ce181c22d72 + } + + public static boolean isTickThreadFor(final ServerLevel world, final double blockX, final double blockZ) { -+ return isTickThreadFor(world, CoordinateUtils.getChunkCoordinate(blockX), CoordinateUtils.getBlockCoordinate(blockZ)); ++ return isTickThreadFor(world, CoordinateUtils.getChunkCoordinate(blockX), CoordinateUtils.getChunkCoordinate(blockZ)); + } + + public static boolean isTickThreadFor(final ServerLevel world, final Vec3 position, final Vec3 deltaMovement, final int buffer) { @@ -15793,7 +15793,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 for (ServerPlayer player : ServerLevel.this.players) { player.getBukkitEntity().onEntityRemove(entity); diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index a3cef477646abf6172d4e50a28ed30f04c30d667..7c04fc2b9ba50d5a7e35a04a17e28db472fff697 100644 +index a3cef477646abf6172d4e50a28ed30f04c30d667..d2ba72653cad27380600f0e013d0954ee22baf9c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -187,7 +187,7 @@ import org.bukkit.inventory.MainHand; @@ -16282,7 +16282,19 @@ index a3cef477646abf6172d4e50a28ed30f04c30d667..7c04fc2b9ba50d5a7e35a04a17e28db4 @Nullable @Override public Entity changeDimension(ServerLevel destination) { -@@ -2098,6 +2474,12 @@ public class ServerPlayer extends Player { +@@ -1168,6 +1544,11 @@ public class ServerPlayer extends Player { + + @Nullable + public Entity changeDimension(ServerLevel worldserver, PlayerTeleportEvent.TeleportCause cause) { ++ // Folia start - region threading ++ if (true) { ++ throw new UnsupportedOperationException("Must use teleportAsync while in region threading"); ++ } ++ // Folia end - region threading + // CraftBukkit end + if (this.isSleeping()) return this; // CraftBukkit - SPIGOT-3154 + // this.isChangingDimension = true; // CraftBukkit - Moved down and into PlayerList#changeDimension +@@ -2098,6 +2479,12 @@ public class ServerPlayer extends Player { public void setCamera(@Nullable Entity entity) { Entity entity1 = this.getCamera(); @@ -16295,7 +16307,7 @@ index a3cef477646abf6172d4e50a28ed30f04c30d667..7c04fc2b9ba50d5a7e35a04a17e28db4 this.camera = (Entity) (entity == null ? this : entity); if (entity1 != this.camera) { // Paper start - Add PlayerStartSpectatingEntityEvent and PlayerStopSpectatingEntity Event -@@ -2559,7 +2941,7 @@ public class ServerPlayer extends Player { +@@ -2559,7 +2946,7 @@ public class ServerPlayer extends Player { this.experienceLevel = this.newLevel; this.totalExperience = this.newTotalExp; this.experienceProgress = 0; @@ -17077,7 +17089,7 @@ index 2ff578e4a953ffcf5176815ba8e3f06f73499989..2e96377d628b3a07fb565020074d665f private State() {} } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885afdc1c3f 100644 +index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..0bdd6f4bea2b3fa7fef2c0a739af37f9c21ff5cd 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -139,7 +139,7 @@ public abstract class PlayerList { @@ -17308,7 +17320,19 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 event.disallow(PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure } } -@@ -976,10 +1037,10 @@ public abstract class PlayerList { +@@ -782,6 +843,11 @@ public abstract class PlayerList { + + public ServerPlayer respawn(ServerPlayer entityplayer, ServerLevel worldserver, boolean flag, Location location, boolean avoidSuffocation, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag...respawnFlags) { + // Paper end ++ // Folia start - region threading ++ if (true) { ++ throw new UnsupportedOperationException("Must use teleportAsync while in region threading"); ++ } ++ // Folia end - region threading + entityplayer.stopRiding(); // CraftBukkit + this.players.remove(entityplayer); + this.playersByName.remove(entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot +@@ -976,10 +1042,10 @@ public abstract class PlayerList { public void tick() { if (++this.sendAllPlayerInfoIn > 600) { // CraftBukkit start @@ -17322,7 +17346,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 @Override public boolean test(ServerPlayer input) { return target.getBukkitEntity().canSee(input.getBukkitEntity()); -@@ -1005,18 +1066,17 @@ public abstract class PlayerList { +@@ -1005,18 +1071,17 @@ public abstract class PlayerList { // CraftBukkit start - add a world/entity limited version public void broadcastAll(Packet packet, net.minecraft.world.entity.player.Player entityhuman) { @@ -17345,7 +17369,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 } } -@@ -1060,8 +1120,7 @@ public abstract class PlayerList { +@@ -1060,8 +1125,7 @@ public abstract class PlayerList { if (scoreboardteambase == null) { this.broadcastSystemMessage(message, false); } else { @@ -17355,7 +17379,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 if (entityplayer.getTeam() != scoreboardteambase) { entityplayer.sendSystemMessage(message); -@@ -1072,10 +1131,12 @@ public abstract class PlayerList { +@@ -1072,10 +1136,12 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { @@ -17371,7 +17395,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 } return astring; -@@ -1094,7 +1155,9 @@ public abstract class PlayerList { +@@ -1094,7 +1160,9 @@ public abstract class PlayerList { ServerPlayer entityplayer = this.getPlayer(profile.getId()); if (entityplayer != null) { @@ -17381,7 +17405,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 } } -@@ -1104,7 +1167,10 @@ public abstract class PlayerList { +@@ -1104,7 +1172,10 @@ public abstract class PlayerList { ServerPlayer entityplayer = this.getPlayer(profile.getId()); if (entityplayer != null) { @@ -17392,7 +17416,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 } } -@@ -1165,8 +1231,7 @@ public abstract class PlayerList { +@@ -1165,8 +1236,7 @@ public abstract class PlayerList { } public void broadcast(@Nullable net.minecraft.world.entity.player.Player player, double x, double y, double z, double distance, ResourceKey worldKey, Packet packet) { @@ -17402,7 +17426,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 // CraftBukkit start - Test if player receiving packet can see the source of the packet if (player != null && !entityplayer.getBukkitEntity().canSee(player.getBukkitEntity())) { -@@ -1196,9 +1261,12 @@ public abstract class PlayerList { +@@ -1196,9 +1266,12 @@ public abstract class PlayerList { io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main MinecraftTimings.savePlayers.startTiming(); // Paper int numSaved = 0; @@ -17418,7 +17442,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 if (interval == -1 || now - entityplayer.lastSave >= interval) { this.save(entityplayer); if (interval != -1 && ++numSaved <= io.papermc.paper.configuration.GlobalConfiguration.get().playerAutoSave.maxPerTick()) { break; } -@@ -1318,6 +1386,20 @@ public abstract class PlayerList { +@@ -1318,6 +1391,20 @@ public abstract class PlayerList { } public void removeAll(boolean isRestarting) { @@ -17439,7 +17463,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e79d96f8c6dccc2289a93a66c25df885 // Paper end // CraftBukkit start - disconnect safely for (ServerPlayer player : this.players) { -@@ -1327,7 +1409,7 @@ public abstract class PlayerList { +@@ -1327,7 +1414,7 @@ public abstract class PlayerList { // CraftBukkit end // Paper start - Remove collideRule team if it exists @@ -17590,7 +17614,7 @@ index 93a1e990b0a6caae4143c2f9d09bfb368fa1d6db..ad3166481dd37f4b5380f8bf28653bb4 itemstack = entityliving2.getMainHandItem(); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9a1e8589e6b371869b2199650172d61ae186c907..29df951426d344885c1bded236f03c059c7878a3 100644 +index 9a1e8589e6b371869b2199650172d61ae186c907..f038f6d4e9fc4b76d5774fc637171191405ee7bb 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -165,7 +165,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -18525,7 +18549,19 @@ index 9a1e8589e6b371869b2199650172d61ae186c907..29df951426d344885c1bded236f03c05 @Nullable public Entity changeDimension(ServerLevel destination) { // CraftBukkit start -@@ -3904,17 +4675,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3388,6 +4159,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + + @Nullable + public Entity teleportTo(ServerLevel worldserver, PositionImpl location) { ++ // Folia start - region threading ++ if (true) { ++ throw new UnsupportedOperationException("Must use teleportAsync while in region threading"); ++ } ++ // Folia end - region threading + // CraftBukkit end + // Paper start - fix bad state entities causing dupes + if (!isAlive() || !valid) { +@@ -3904,17 +4680,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // Paper start public void startSeenByPlayer(ServerPlayer player) { @@ -18545,7 +18581,7 @@ index 9a1e8589e6b371869b2199650172d61ae186c907..29df951426d344885c1bded236f03c05 } // Paper end -@@ -4405,7 +5172,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4405,7 +5177,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } // Paper end - fix MC-4 @@ -18555,7 +18591,7 @@ index 9a1e8589e6b371869b2199650172d61ae186c907..29df951426d344885c1bded236f03c05 synchronized (this.posLock) { // Paper this.position = new Vec3(x, y, z); } // Paper -@@ -4426,7 +5194,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4426,7 +5199,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // Paper start - never allow AABB to become desynced from position // hanging has its own special logic @@ -18564,7 +18600,7 @@ index 9a1e8589e6b371869b2199650172d61ae186c907..29df951426d344885c1bded236f03c05 this.setBoundingBox(this.makeBoundingBox()); } // Paper end -@@ -4513,6 +5281,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4513,6 +5286,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return this.removalReason != null; } @@ -18577,7 +18613,7 @@ index 9a1e8589e6b371869b2199650172d61ae186c907..29df951426d344885c1bded236f03c05 @Nullable public Entity.RemovalReason getRemovalReason() { return this.removalReason; -@@ -4537,7 +5311,23 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4537,7 +5316,23 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { if (reason != RemovalReason.UNLOADED_TO_CHUNK) this.getPassengers().forEach(Entity::stopRiding); // Paper - chunk system - don't adjust passenger state when unloading, it's just not safe (and messes with our logic in entity chunk unload) this.levelCallback.onRemove(reason); @@ -23979,7 +24015,7 @@ index 57a0dbb23a32123d30c3b3572f4d129be9d97847..3f46d9398add0e97a2b8b072f66b48b0 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index e769c1c2a99a13941124c7442d44a509e7859666..867838df8a6144fd00e7cf01eb840ad836d6125b 100644 +index e769c1c2a99a13941124c7442d44a509e7859666..aac6d175e17b8419f7938c432a8fbbf3c34f3fbe 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -564,7 +564,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -23991,7 +24027,19 @@ index e769c1c2a99a13941124c7442d44a509e7859666..867838df8a6144fd00e7cf01eb840ad8 if (this.getHandle().connection == null) return; this.getHandle().connection.disconnect(message == null ? "" : message, org.bukkit.event.player.PlayerKickEvent.Cause.PLUGIN); // Paper - kick event cause -@@ -1779,7 +1779,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1259,6 +1259,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + + @Override + public boolean teleport(Location location, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause, io.papermc.paper.entity.TeleportFlag... flags) { ++ // Folia start - region threading ++ if (true) { ++ throw new UnsupportedOperationException("Must use teleportAsync while in region threading"); ++ } ++ // Folia end - region threading + java.util.Set relativeArguments; + java.util.Set allFlags; + if (flags.length == 0) { +@@ -1779,7 +1784,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private void unregisterEntity(Entity other) { // Paper end ChunkMap tracker = ((ServerLevel) this.getHandle().level).getChunkSource().chunkMap; @@ -24000,7 +24048,7 @@ index e769c1c2a99a13941124c7442d44a509e7859666..867838df8a6144fd00e7cf01eb840ad8 if (entry != null) { entry.removePlayer(this.getHandle()); } -@@ -1858,7 +1858,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1858,7 +1863,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(otherPlayer))); } diff --git a/patches/server/0007-Max-pending-logins.patch b/patches/server/0007-Max-pending-logins.patch index 875e53c..3ca1599 100644 --- a/patches/server/0007-Max-pending-logins.patch +++ b/patches/server/0007-Max-pending-logins.patch @@ -19,7 +19,7 @@ index 2e96377d628b3a07fb565020074d665f594f32e8..75b1877f8c3e4da3183437f327ef3376 } // Folia - region threading - remove delayed accept diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index e79d96f8c6dccc2289a93a66c25df885afdc1c3f..bdaca45377985abdb1f8b47df519d06a0674c4f2 100644 +index 0bdd6f4bea2b3fa7fef2c0a739af37f9c21ff5cd..44c6ff04b7310f3b59a7fa4c600e3221cbec7bb8 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -177,6 +177,17 @@ public abstract class PlayerList { diff --git a/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index 0be9991..8d5c9d3 100644 --- a/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -51,7 +51,7 @@ index d9687722e02dfd4088c7030abbf5008eb0a092c8..62484ebf4550b05182f693a3180bbac5 TickThread.ensureTickThread(thisEntity, "May not tick entity scheduler asynchronously"); final List toRun; diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 29df951426d344885c1bded236f03c059c7878a3..89a08239318ffba8e9e84aa92f7d4c2e52d08cc3 100644 +index f038f6d4e9fc4b76d5774fc637171191405ee7bb..55a03a3b22c37338d32aeb0878169c4462d1a1d0 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -2767,6 +2767,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -2147,7 +2147,7 @@ index beea227855f0b978e655efc298024120df8f4945..e1b7922ed298b6b3068c3f5fbe3b4030 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 867838df8a6144fd00e7cf01eb840ad836d6125b..10d69f6a4811908275dd56133747dfce8aa2a971 100644 +index aac6d175e17b8419f7938c432a8fbbf3c34f3fbe..34bddd5478a2bb6cd880970765933abcfdde173f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -584,7 +584,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -2159,7 +2159,7 @@ index 867838df8a6144fd00e7cf01eb840ad836d6125b..10d69f6a4811908275dd56133747dfce final ServerGamePacketListenerImpl connection = this.getHandle().connection; if (connection != null) { connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message, cause); -@@ -1963,9 +1963,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1968,9 +1968,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this; } @@ -2177,7 +2177,7 @@ index 867838df8a6144fd00e7cf01eb840ad836d6125b..10d69f6a4811908275dd56133747dfce } public void setHandle(final ServerPlayer entity) { -@@ -2991,7 +2998,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2996,7 +3003,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { { if ( CraftPlayer.this.getHealth() <= 0 && CraftPlayer.this.isOnline() ) {