Fix isTickThread(world, blockX, blockZ)

Need to convert the Z to chunk, not block...

Also throw for CraftPlayer#teleport and friends
This commit is contained in:
Spottedleaf 2023-03-27 20:24:32 -07:00
parent 1175350400
commit d113346b6d
3 changed files with 78 additions and 30 deletions

View File

@ -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<Level> 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<net.minecraft.world.entity.RelativeMovement> relativeArguments;
java.util.Set<io.papermc.paper.entity.TeleportFlag> 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)));
}

View File

@ -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 {

View File

@ -51,7 +51,7 @@ index d9687722e02dfd4088c7030abbf5008eb0a092c8..62484ebf4550b05182f693a3180bbac5
TickThread.ensureTickThread(thisEntity, "May not tick entity scheduler asynchronously");
final List<ScheduledTask> 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() )
{