From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Sun, 20 Apr 1997 05:37:42 -0800 Subject: [PATCH] Region Threading Base diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java b/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java index 69cdd304d255d52c9b7dc9b6a33ffdb630b79abe..e417c9a140778954572fb8bc190fad64feacffe0 100644 --- a/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java +++ b/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java @@ -1,5 +1,11 @@ package ca.spottedleaf.moonrise.common.util; +import io.papermc.paper.threadedregions.RegionShutdownThread; +import io.papermc.paper.threadedregions.RegionizedServer; +import io.papermc.paper.threadedregions.RegionizedWorldData; +import io.papermc.paper.threadedregions.ThreadedRegionizer; +import io.papermc.paper.threadedregions.TickRegionScheduler; +import io.papermc.paper.threadedregions.TickRegions; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.ChunkPos; @@ -15,8 +21,26 @@ public class TickThread extends Thread { private static final Logger LOGGER = LoggerFactory.getLogger(TickThread.class); + private static String getRegionInfo(final ThreadedRegionizer.ThreadedRegion region) { + if (region == null) { + return "{null}"; + } + + final ChunkPos center = region.getCenterChunk(); + final net.minecraft.server.level.ServerLevel world = region.regioniser.world; + + return "{center=" + center + ",world=" + (world == null ? "null" : WorldUtil.getWorldName(world)) + "}"; + } + private static String getThreadContext() { - return "thread=" + Thread.currentThread().getName(); + final Thread thread = Thread.currentThread(); + + if (!(thread instanceof TickThread)) { + return "[thread=" + thread + ",class=" + thread.getClass().getName() + "]"; + } + + return "[thread=" + thread.getName() + ",class=" + thread.getClass().getName() + ",region=" + getRegionInfo(TickRegionScheduler.getCurrentRegion()) + "]"; + } /** @@ -123,50 +147,157 @@ public class TickThread extends Thread { } public static boolean isShutdownThread() { - return false; + return Thread.currentThread().getClass() == RegionShutdownThread.class; } public static boolean isTickThreadFor(final Level world, final BlockPos pos) { - return isTickThread(); + return isTickThreadFor(world, pos.getX() >> 4, pos.getZ() >> 4); } public static boolean isTickThreadFor(final Level world, final BlockPos pos, final int blockRadius) { - return isTickThread(); + return isTickThreadFor( + world, + (pos.getX() - blockRadius) >> 4, (pos.getZ() - blockRadius) >> 4, + (pos.getX() + blockRadius) >> 4, (pos.getZ() + blockRadius) >> 4 + ); } public static boolean isTickThreadFor(final Level world, final ChunkPos pos) { - return isTickThread(); + return isTickThreadFor(world, pos.x, pos.z); } public static boolean isTickThreadFor(final Level world, final Vec3 pos) { - return isTickThread(); + return isTickThreadFor(world, net.minecraft.util.Mth.floor(pos.x) >> 4, net.minecraft.util.Mth.floor(pos.z) >> 4); } public static boolean isTickThreadFor(final Level world, final int chunkX, final int chunkZ) { - return isTickThread(); + final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { + return isShutdownThread(); + } + return ((net.minecraft.server.level.ServerLevel)world).regioniser.getRegionAtUnsynchronised(chunkX, chunkZ) == region; } public static boolean isTickThreadFor(final Level world, final AABB aabb) { - return isTickThread(); + return isTickThreadFor( + world, + CoordinateUtils.getChunkCoordinate(aabb.minX), CoordinateUtils.getChunkCoordinate(aabb.minZ), + CoordinateUtils.getChunkCoordinate(aabb.maxX), CoordinateUtils.getChunkCoordinate(aabb.maxZ) + ); } public static boolean isTickThreadFor(final Level world, final double blockX, final double blockZ) { - return isTickThread(); + return isTickThreadFor(world, CoordinateUtils.getChunkCoordinate(blockX), CoordinateUtils.getChunkCoordinate(blockZ)); } public static boolean isTickThreadFor(final Level world, final Vec3 position, final Vec3 deltaMovement, final int buffer) { - return isTickThread(); + final int fromChunkX = CoordinateUtils.getChunkX(position); + final int fromChunkZ = CoordinateUtils.getChunkZ(position); + + final int toChunkX = CoordinateUtils.getChunkCoordinate(position.x + deltaMovement.x); + final int toChunkZ = CoordinateUtils.getChunkCoordinate(position.z + deltaMovement.z); + + // expect from < to, but that may not be the case + return isTickThreadFor( + world, + Math.min(fromChunkX, toChunkX) - buffer, + Math.min(fromChunkZ, toChunkZ) - buffer, + Math.max(fromChunkX, toChunkX) + buffer, + Math.max(fromChunkZ, toChunkZ) + buffer + ); } public static boolean isTickThreadFor(final Level world, final int fromChunkX, final int fromChunkZ, final int toChunkX, final int toChunkZ) { - return isTickThread(); + final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { + return isShutdownThread(); + } + + final int shift = ((net.minecraft.server.level.ServerLevel)world).regioniser.sectionChunkShift; + + final int minSectionX = fromChunkX >> shift; + final int maxSectionX = toChunkX >> shift; + final int minSectionZ = fromChunkZ >> shift; + final int maxSectionZ = toChunkZ >> shift; + + for (int secZ = minSectionZ; secZ <= maxSectionZ; ++secZ) { + for (int secX = minSectionX; secX <= maxSectionX; ++secX) { + final int lowerLeftCX = secX << shift; + final int lowerLeftCZ = secZ << shift; + if (((net.minecraft.server.level.ServerLevel)world).regioniser.getRegionAtUnsynchronised(lowerLeftCX, lowerLeftCZ) != region) { + return false; + } + } + } + + return true; } public static boolean isTickThreadFor(final Level world, final int chunkX, final int chunkZ, final int radius) { - return isTickThread(); + return isTickThreadFor(world, chunkX - radius, chunkZ - radius, chunkX + radius, chunkZ + radius); } public static boolean isTickThreadFor(final Entity entity) { - return isTickThread(); + if (entity == null) { + return true; + } + final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { + if (RegionizedServer.isGlobalTickThread()) { + if (entity instanceof net.minecraft.server.level.ServerPlayer serverPlayer) { + final net.minecraft.server.network.ServerGamePacketListenerImpl possibleBad = serverPlayer.connection; + if (possibleBad == null) { + return true; + } + + final net.minecraft.network.PacketListener packetListener = possibleBad.connection.getPacketListener(); + if (packetListener instanceof net.minecraft.server.network.ServerGamePacketListenerImpl gamePacketListener) { + return gamePacketListener.waitingForSwitchToConfig; + } + if (packetListener instanceof net.minecraft.server.network.ServerConfigurationPacketListenerImpl configurationPacketListener) { + return configurationPacketListener.switchToMain == null; + } + return true; + } else { + return false; + } + } + if (isShutdownThread()) { + return true; + } + if (entity instanceof net.minecraft.server.level.ServerPlayer serverPlayer) { + // off-main access to server player is never ok, server player is owned by one of global context or region context always + return false; + } + // only own entities that have not yet been added to the world + + // if the entity is removed, then it was in the world previously - which means that a region containing its location + // owns it + // if the entity has a callback, then it is contained in a world + return entity.hasNullCallback() && !entity.isRemoved(); + } + + final Level world = entity.level(); + if (world != region.regioniser.world) { + // world mismatch + return false; + } + + final RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + + // pass through the check if the entity is removed and we own its chunk + if (worldData.hasEntity(entity)) { + return true; + } + + if (entity instanceof net.minecraft.server.level.ServerPlayer serverPlayer) { + net.minecraft.server.network.ServerGamePacketListenerImpl conn = serverPlayer.connection; + return conn != null && worldData.connections.contains(conn.connection); + } else { + return ((entity.hasNullCallback() || entity.isRemoved())) && isTickThreadFor((net.minecraft.server.level.ServerLevel)world, entity.chunkPosition()); + } } } diff --git a/src/main/java/io/papermc/paper/SparksFly.java b/src/main/java/io/papermc/paper/SparksFly.java index 62e2d5704c348955bc8284dc2d54c933b7bcdd06..b332645ed65928100f580221d8a9948bc77e362e 100644 --- a/src/main/java/io/papermc/paper/SparksFly.java +++ b/src/main/java/io/papermc/paper/SparksFly.java @@ -33,13 +33,13 @@ public final class SparksFly { private final Logger logger; private final PaperSparkModule spark; - private final ConcurrentLinkedQueue mainThreadTaskQueue; + // Folia - region threading private boolean enabled; private boolean disabledInConfigurationWarningLogged; public SparksFly(final Server server) { - this.mainThreadTaskQueue = new ConcurrentLinkedQueue<>(); + // Folia - region threading this.logger = Logger.getLogger(ID); this.logger.log(Level.INFO, "This server bundles the spark profiler. For more information please visit https://docs.papermc.io/paper/profiling"); this.spark = PaperSparkModule.create(Compatibility.VERSION_1_0, server, this.logger, new PaperScheduler() { @@ -50,7 +50,7 @@ public final class SparksFly { @Override public void executeSync(final Runnable runnable) { - SparksFly.this.mainThreadTaskQueue.offer(this.catching(runnable, "synchronous")); + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(this.catching(runnable, "synchronous")); // Folia - region threading } private Runnable catching(final Runnable runnable, final String type) { @@ -88,10 +88,7 @@ public final class SparksFly { } public void executeMainThreadTasks() { - Runnable task; - while ((task = this.mainThreadTaskQueue.poll()) != null) { - task.run(); - } + throw new UnsupportedOperationException(); // Folia - region threading } public void enableEarlyIfRequested() { @@ -119,7 +116,7 @@ public final class SparksFly { private void enable() { if (!this.enabled) { - if (GlobalConfiguration.get().spark.enabled) { + if (false) { // Folia - disable in-built spark profiler this.enabled = true; this.spark.enable(); } else { @@ -171,7 +168,7 @@ public final class SparksFly { } public static boolean isPluginPreferred() { - return Boolean.getBoolean(PREFER_SPARK_PLUGIN_PROPERTY); + return true; // Folia - disable in-built spark profiler } private static boolean isPluginEnabled(final Server server) { diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java index f6266b3ca9c031ef9e96df23e0413c7db5211bd8..388bad4fb53bb4046e7f616557e933339821a0a3 100644 --- a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -83,7 +83,7 @@ public final class ChatProcessor { final CraftPlayer player = this.player.getBukkitEntity(); final AsyncPlayerChatEvent asyncChatEvent = new AsyncPlayerChatEvent(this.async, player, this.craftbukkit$originalMessage, new LazyPlayerSet(this.server)); this.post(asyncChatEvent); - if (listenersOnSyncEvent) { + if (false && listenersOnSyncEvent) { // Folia - region threading final PlayerChatEvent chatEvent = new PlayerChatEvent(player, asyncChatEvent.getMessage(), asyncChatEvent.getFormat(), asyncChatEvent.getRecipients()); chatEvent.setCancelled(asyncChatEvent.isCancelled()); // propagate cancelled state this.queueIfAsyncOrRunImmediately(new Waitable<>() { @@ -150,7 +150,7 @@ public final class ChatProcessor { ae.setCancelled(cancelled); // propagate cancelled state this.post(ae); final boolean listenersOnSyncEvent = canYouHearMe(ChatEvent.getHandlerList()); - if (listenersOnSyncEvent) { + if (false && listenersOnSyncEvent) { // Folia - region threading this.queueIfAsyncOrRunImmediately(new Waitable<>() { @Override protected Void evaluate() { diff --git a/src/main/java/io/papermc/paper/adventure/providers/ClickCallbackProviderImpl.java b/src/main/java/io/papermc/paper/adventure/providers/ClickCallbackProviderImpl.java index e62cfa5f47f52830e37b6ba3108b73d8b18e4c6a..5d6d8b9c9290cadf5ba4db587e240c7cb50a16c5 100644 --- a/src/main/java/io/papermc/paper/adventure/providers/ClickCallbackProviderImpl.java +++ b/src/main/java/io/papermc/paper/adventure/providers/ClickCallbackProviderImpl.java @@ -86,8 +86,8 @@ public class ClickCallbackProviderImpl implements ClickCallback.Provider { abstract static class CallbackManager { private final Predicate locationPredicate; - protected final Map> callbacks = new HashMap<>(); - private final Queue> queue = new ConcurrentLinkedQueue<>(); + protected final Map> callbacks = new java.util.concurrent.ConcurrentHashMap<>(); // Folia - region threading + // Folia - region threading protected CallbackManager(final Predicate locationPredicate) { this.locationPredicate = locationPredicate; @@ -98,27 +98,33 @@ public class ClickCallbackProviderImpl implements ClickCallback.Provider { } public I addCallback(final I id, final @NotNull C callback, final ClickCallback.@NotNull Options options) { - this.queue.add(new StoredCallback<>(callback, options, id)); + this.callbacks.put(id, new StoredCallback<>(callback, options, id)); // Folia - region threading return id; } public void handleQueue(final int currentTick) { // Evict expired entries if (currentTick % 100 == 0) { - this.callbacks.values().removeIf(callback -> !callback.valid()); + this.callbacks.values().removeIf(StoredCallback::expired); // Folia - region threading - don't read uses field } - // Add entries from queue - StoredCallback callback; - while ((callback = this.queue.poll()) != null) { - this.callbacks.put(callback.id(), callback); - } + // Folia - region threading } final void tryConsumeCallback(final I key, final Consumer callbackConsumer) { - final StoredCallback callback = this.callbacks.get(key); - if (callback != null && callback.valid()) { - callback.takeUse(); + // Folia start - region threading + final StoredCallback[] use = new StoredCallback[1]; + this.callbacks.computeIfPresent(key, (final I keyInMap, final StoredCallback value) -> { + if (!value.valid()) { + return null; + } + use[0] = value; + value.takeUse(); + return value.valid() ? value : null; + }); + final StoredCallback callback = use[0]; + if (callback != null) { + // Folia end - region threading callbackConsumer.accept(callback.callback); } } diff --git a/src/main/java/io/papermc/paper/command/PaperCommands.java b/src/main/java/io/papermc/paper/command/PaperCommands.java index 6dfd0b1a85d518828b15158c01472ae4383b8882..cf9996228b320dd466de706928aa75df6df4340f 100644 --- a/src/main/java/io/papermc/paper/command/PaperCommands.java +++ b/src/main/java/io/papermc/paper/command/PaperCommands.java @@ -24,6 +24,7 @@ public final class PaperCommands { public static void registerCommands(final MinecraftServer server) { COMMANDS.put("paper", new PaperCommand("paper")); COMMANDS.put("mspt", new MSPTCommand("mspt")); + COMMANDS.put("tps", new io.papermc.paper.threadedregions.commands.CommandServerHealth()); // Folia - region threading COMMANDS.forEach((s, command) -> { server.server.getCommandMap().register(s, "Paper", command); diff --git a/src/main/java/io/papermc/paper/command/subcommands/EntityCommand.java b/src/main/java/io/papermc/paper/command/subcommands/EntityCommand.java index e3ddc201b3285d5ffdad2e912cc4f75b7a64cd11..2b144ac1a6ec266ce9a2f6c4b17aa1174c2e78a4 100644 --- a/src/main/java/io/papermc/paper/command/subcommands/EntityCommand.java +++ b/src/main/java/io/papermc/paper/command/subcommands/EntityCommand.java @@ -129,7 +129,7 @@ public final class EntityCommand implements PaperSubcommand { final int z = (e.getKey().z << 4) + 8; final Component message = text(" " + e.getValue() + ": " + e.getKey().x + ", " + e.getKey().z + (chunkProviderServer.isPositionTicking(e.getKey().toLong()) ? " (Ticking)" : " (Non-Ticking)")) .hoverEvent(HoverEvent.showText(text("Click to teleport to chunk", GREEN))) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/minecraft:execute as @s in " + world.getWorld().getKey() + " run tp " + x + " " + (world.getWorld().getHighestBlockYAt(x, z, HeightMap.MOTION_BLOCKING) + 1) + " " + z)); + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/minecraft:execute as @s in " + world.getWorld().getKey() + " run tp " + x + " " + (128) + " " + z)); // Folia - region threading - avoid sync load here sender.sendMessage(message); }); } else { diff --git a/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java b/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java index cd2e4d792e972b8bf1e07b8961594a670ae949cf..3ab8dbf2768a4ef8fb53af6f5431f7f6afe6d168 100644 --- a/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java +++ b/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java @@ -18,7 +18,9 @@ import static net.kyori.adventure.text.format.NamedTextColor.YELLOW; public final class HeapDumpCommand implements PaperSubcommand { @Override public boolean execute(final CommandSender sender, final String subCommand, final String[] args) { + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading this.dumpHeap(sender); + }); // Folia - region threading return true; } diff --git a/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java b/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java index bd68139ae635f2ad7ec8e7a21e0056a139c4c62e..48a43341b17247355a531164019d5cc9c5555f26 100644 --- a/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java +++ b/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java @@ -16,7 +16,9 @@ import static net.kyori.adventure.text.format.NamedTextColor.RED; public final class ReloadCommand implements PaperSubcommand { @Override public boolean execute(final CommandSender sender, final String subCommand, final String[] args) { + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading this.doReload(sender); + }); // Folia - region threading return true; } diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java index 3f5e76e4df8ff8152060449f89b522910adee834..04826c91b624cf6e3c8f762a17de52f3693f4fe3 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java @@ -407,4 +407,17 @@ public class GlobalConfiguration extends ConfigurationPart { } } } + // Folia start - threaded regions + public ThreadedRegions threadedRegions; + public class ThreadedRegions extends ConfigurationPart { + + public int threads = -1; + public int gridExponent = 4; + + @PostProcess + public void postProcess() { + io.papermc.paper.threadedregions.TickRegions.init(this); + } + } + // Folia end - threaded regions } diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java index bd1f0ba488ff9f12de4b85c97617638592bab09c..5c735a574a4233b87f19d7b22514a8591f642161 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java @@ -500,6 +500,7 @@ public class WorldConfiguration extends ConfigurationPart { public Chunks chunks; public class Chunks extends ConfigurationPart { + public AutosavePeriod autoSaveInterval = AutosavePeriod.def(); public int maxAutoSaveChunksPerTick = 24; public int fixedChunkInhabitedTime = -1; @@ -518,6 +519,7 @@ public class WorldConfiguration extends ConfigurationPart { @PostProcess private void postProcess() { + this.preventMovingIntoUnloadedChunks = true; // Folia - region threading - force prevent moving into unloaded chunks FeatureHooks.setPlayerChunkUnloadDelay(this.delayChunkUnloadsBy.ticks()); } } diff --git a/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java b/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java index c2174c8ae594fe8ec7741ecdbb53e9acc2bbf5b2..0762cfa9748ed6feff74abe060756d7ad55f96cd 100644 --- a/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java +++ b/src/main/java/io/papermc/paper/console/BrigadierCommandCompleter.java @@ -46,7 +46,7 @@ public final class BrigadierCommandCompleter { final ParseResults results = dispatcher.parse(new StringReader(line.line()), this.commandSourceStack.get()); this.addCandidates( candidates, - CompletableFuture.supplyAsync(() -> dispatcher.getCompletionSuggestions(results, line.cursor()), this.server::scheduleOnMain) + CompletableFuture.supplyAsync(() -> dispatcher.getCompletionSuggestions(results, line.cursor()), io.papermc.paper.threadedregions.RegionizedServer.getInstance()::addTask) // Folia - region threading .thenCompose(Function.identity()) .join() .getList(), diff --git a/src/main/java/io/papermc/paper/entity/PaperSchoolableFish.java b/src/main/java/io/papermc/paper/entity/PaperSchoolableFish.java index 04c8213ae6f38902e88f8dcdc77ad70dbcd36afa..b663b38529f25756cc6f8130e2e4e02fe36caa21 100644 --- a/src/main/java/io/papermc/paper/entity/PaperSchoolableFish.java +++ b/src/main/java/io/papermc/paper/entity/PaperSchoolableFish.java @@ -13,6 +13,7 @@ public class PaperSchoolableFish extends CraftFish implements SchoolableFish { @Override public AbstractSchoolingFish getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractSchoolingFish) this.entity; } diff --git a/src/main/java/io/papermc/paper/entity/activation/ActivationType.java b/src/main/java/io/papermc/paper/entity/activation/ActivationType.java index 493914c8d14a4f4b58e57ca0e2d3723e6fd4c364..90c0bba326dc0b219d41e7b4bcbbb2006c365cf3 100644 --- a/src/main/java/io/papermc/paper/entity/activation/ActivationType.java +++ b/src/main/java/io/papermc/paper/entity/activation/ActivationType.java @@ -21,7 +21,7 @@ public enum ActivationType { RAIDER, MISC; - AABB boundingBox = new AABB(0, 0, 0, 0, 0, 0); + //AABB boundingBox = new AABB(0, 0, 0, 0, 0, 0); // Folia - threaded regions - replaced by local variable /** * Returns the activation type for the given entity. diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperPermissionManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperPermissionManager.java index afe793c35f05a80058e80bcaee76ac45a40b04a2..9ddbb2d72e11c6abbbdb866f3010f276efceda41 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperPermissionManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperPermissionManager.java @@ -32,7 +32,9 @@ abstract class PaperPermissionManager implements PermissionManager { @Override @Nullable public Permission getPermission(@NotNull String name) { + synchronized (this) { // Folia - synchronized return this.permissions().get(name.toLowerCase(java.util.Locale.ENGLISH)); + } // Folia - synchronized } @Override @@ -52,12 +54,24 @@ abstract class PaperPermissionManager implements PermissionManager { private void addPermission(@NotNull Permission perm, boolean dirty) { String name = perm.getName().toLowerCase(java.util.Locale.ENGLISH); + Boolean recalc; // Folia - synchronized + synchronized (this) { // Folia - synchronized if (this.permissions().containsKey(name)) { throw new IllegalArgumentException("The permission " + name + " is already defined!"); } this.permissions().put(name, perm); - this.calculatePermissionDefault(perm, dirty); + recalc = this.calculatePermissionDefault(perm, dirty); + } // Folia - synchronized + // Folia start - synchronize this class - we hold a lock now, prevent deadlock by moving this out + if (recalc != null) { + if (recalc.booleanValue()) { + this.dirtyPermissibles(true); + } else { + this.dirtyPermissibles(false); + } + } + // Folia end - synchronize this class - we hold a lock now, prevent deadlock by moving this out } @Override @@ -80,42 +94,58 @@ abstract class PaperPermissionManager implements PermissionManager { @Override public void recalculatePermissionDefaults(@NotNull Permission perm) { + Boolean recalc = null; // Folia - synchronized + synchronized (this) { // Folia - synchronized // we need a null check here because some plugins for some unknown reason pass null into this? if (perm != null && this.permissions().containsKey(perm.getName().toLowerCase(Locale.ROOT))) { this.defaultPerms().get(true).remove(perm); this.defaultPerms().get(false).remove(perm); - this.calculatePermissionDefault(perm, true); + recalc = this.calculatePermissionDefault(perm, true); // Folia - synchronized + } + } // Folia - synchronized + // Folia start - synchronize this class - we hold a lock now, prevent deadlock by moving this out + if (recalc != null) { + if (recalc.booleanValue()) { + this.dirtyPermissibles(true); + } else { + this.dirtyPermissibles(false); + } } + // Folia end - synchronize this class - we hold a lock now, prevent deadlock by moving this out } - private void calculatePermissionDefault(@NotNull Permission perm, boolean dirty) { + private Boolean calculatePermissionDefault(@NotNull Permission perm, boolean dirty) { // Folia - synchronize this class if ((perm.getDefault() == PermissionDefault.OP) || (perm.getDefault() == PermissionDefault.TRUE)) { this.defaultPerms().get(true).add(perm); if (dirty) { - this.dirtyPermissibles(true); + return Boolean.TRUE; // Folia - synchronize this class - we hold a lock now, prevent deadlock by moving this out } } if ((perm.getDefault() == PermissionDefault.NOT_OP) || (perm.getDefault() == PermissionDefault.TRUE)) { this.defaultPerms().get(false).add(perm); if (dirty) { - this.dirtyPermissibles(false); + return Boolean.FALSE; // Folia - synchronize this class - we hold a lock now, prevent deadlock by moving this out } } + return null; // Folia - synchronize this class } @Override public void subscribeToPermission(@NotNull String permission, @NotNull Permissible permissible) { + synchronized (this) { // Folia - synchronized String name = permission.toLowerCase(java.util.Locale.ENGLISH); Map map = this.permSubs().computeIfAbsent(name, k -> new WeakHashMap<>()); map.put(permissible, true); + } // Folia - synchronized } @Override public void unsubscribeFromPermission(@NotNull String permission, @NotNull Permissible permissible) { String name = permission.toLowerCase(java.util.Locale.ENGLISH); + synchronized (this) { // Folia - synchronized Map map = this.permSubs().get(name); if (map != null) { @@ -125,11 +155,13 @@ abstract class PaperPermissionManager implements PermissionManager { this.permSubs().remove(name); } } + } // Folia - synchronized } @Override @NotNull public Set getPermissionSubscriptions(@NotNull String permission) { + synchronized (this) { // Folia - synchronized String name = permission.toLowerCase(java.util.Locale.ENGLISH); Map map = this.permSubs().get(name); @@ -138,17 +170,21 @@ abstract class PaperPermissionManager implements PermissionManager { } else { return ImmutableSet.copyOf(map.keySet()); } + } // Folia - synchronized } @Override public void subscribeToDefaultPerms(boolean op, @NotNull Permissible permissible) { + synchronized (this) { // Folia - synchronized Map map = this.defSubs().computeIfAbsent(op, k -> new WeakHashMap<>()); map.put(permissible, true); + } // Folia - synchronized } @Override public void unsubscribeFromDefaultPerms(boolean op, @NotNull Permissible permissible) { + synchronized (this) { // Folia - synchronized Map map = this.defSubs().get(op); if (map != null) { @@ -158,11 +194,13 @@ abstract class PaperPermissionManager implements PermissionManager { this.defSubs().remove(op); } } + } // Folia - synchronized } @Override @NotNull public Set getDefaultPermSubscriptions(boolean op) { + synchronized (this) { // Folia - synchronized Map map = this.defSubs().get(op); if (map == null) { @@ -170,19 +208,24 @@ abstract class PaperPermissionManager implements PermissionManager { } else { return ImmutableSet.copyOf(map.keySet()); } + } // Folia - synchronized } @Override @NotNull public Set getPermissions() { + synchronized (this) { // Folia - synchronized return new HashSet<>(this.permissions().values()); + } // Folia - synchronized } @Override public void clearPermissions() { + synchronized (this) { // Folia - synchronized this.permissions().clear(); this.defaultPerms().get(true).clear(); this.defaultPerms().get(false).clear(); + } // Folia - synchronized } diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java index 792ef37481ecd20134e2e41fccf4f124bfb8b7ea..52e96c3cc42f9c418b54b4a94b7a9f56c2d6076b 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java @@ -256,12 +256,7 @@ class PaperPluginInstanceManager { + pluginName + " (Is it up to date?)", ex, plugin); // Paper } - try { - this.server.getScheduler().cancelTasks(plugin); - } catch (Throwable ex) { - this.handlePluginException("Error occurred (in the plugin loader) while cancelling tasks for " - + pluginName + " (Is it up to date?)", ex, plugin); // Paper - } + // Folia - region threading // Paper start - Folia schedulers try { diff --git a/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java b/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java index d3b3a8baca013909fa9c6204d964d7d7efeb2719..fb7c6621e2805f4339c255f6c2e02c55ff4c502e 100644 --- a/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java +++ b/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java @@ -64,6 +64,7 @@ public class PaperPluginMeta implements PluginMeta { private PermissionConfiguration permissionConfiguration = new PermissionConfiguration(PermissionDefault.OP, List.of()); @Required private ApiVersion apiVersion; + private boolean foliaSupported = false; // Folia private Map> dependencies = new EnumMap<>(PluginDependencyLifeCycle.class); @@ -251,6 +252,13 @@ public class PaperPluginMeta implements PluginMeta { return this.apiVersion.getVersionString(); } + // Folia start + @Override + public boolean isFoliaSupported() { + return this.foliaSupported; + } + // Folia end + @Override public @NotNull List getProvidedPlugins() { return this.provides; diff --git a/src/main/java/io/papermc/paper/plugin/provider/type/paper/PaperPluginProviderFactory.java b/src/main/java/io/papermc/paper/plugin/provider/type/paper/PaperPluginProviderFactory.java index 0a27b468560ccf4b9588cd12d50c02e442f3024f..6369b13e1fcdbdb25dd9d6e4d3bffdedbee4f739 100644 --- a/src/main/java/io/papermc/paper/plugin/provider/type/paper/PaperPluginProviderFactory.java +++ b/src/main/java/io/papermc/paper/plugin/provider/type/paper/PaperPluginProviderFactory.java @@ -24,6 +24,11 @@ class PaperPluginProviderFactory implements PluginTypeFactory { + CraftServer.this.dispatchCommand(nmsEntity.getBukkitEntity(), commandLine); + }, + null, + 1L + ); + } else if (sender instanceof ConsoleCommandSender || sender instanceof io.papermc.paper.commands.FeedbackForwardingSender) { + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { + CraftServer.this.dispatchCommand(sender, commandLine); + }); + } else { + // huh? + throw new UnsupportedOperationException("Dispatching command for " + sender); + } + } + // Folia end - region threading + @Override public boolean dispatchCommand(CommandSender rawSender, String commandLine) { Preconditions.checkArgument(rawSender != null, "sender cannot be null"); Preconditions.checkArgument(commandLine != null, "commandLine cannot be null"); org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + commandLine); // Spigot // Paper - Include command in error message + // Folia start - region threading + if ((rawSender instanceof Entity entity)) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(((org.bukkit.craftbukkit.entity.CraftEntity)entity).getHandle(), "Dispatching command async"); + } else if (rawSender instanceof ConsoleCommandSender || rawSender instanceof net.minecraft.server.rcon.RconConsoleSource + || rawSender instanceof org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender + || rawSender instanceof io.papermc.paper.commands.FeedbackForwardingSender) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Dispatching command async"); + } else { + // huh? + throw new UnsupportedOperationException("Dispatching command for " + rawSender); + } + // Folia end - region threading CommandSourceStack sourceStack = VanillaCommandWrapper.getListener(rawSender); String command = StringUtils.normalizeSpace(commandLine.trim()); - + net.minecraft.commands.Commands commands = this.getHandle().getServer().getCommands(); com.mojang.brigadier.CommandDispatcher dispatcher = commands.getDispatcher(); com.mojang.brigadier.ParseResults results = dispatcher.parse(command, sourceStack); @@ -1229,6 +1262,7 @@ public final class CraftServer implements Server { @Override public World createWorld(WorldCreator creator) { + if (true) throw new UnsupportedOperationException(); // Folia - not implemented properly yet Preconditions.checkState(this.console.getAllLevels().iterator().hasNext(), "Cannot create additional worlds on STARTUP"); //Preconditions.checkState(!this.console.isIteratingOverLevels, "Cannot create a world while worlds are being ticked"); // Paper - Cat - Temp disable. We'll see how this goes. Preconditions.checkArgument(creator != null, "WorldCreator cannot be null"); @@ -1426,6 +1460,7 @@ public final class CraftServer implements Server { @Override public boolean unloadWorld(World world, boolean save) { + if (true) throw new UnsupportedOperationException(); // Folia - not implemented properly yet //Preconditions.checkState(!this.console.isIteratingOverLevels, "Cannot unload a world while worlds are being ticked"); // Paper - Cat - Temp disable. We'll see how this goes. if (world == null) { return false; @@ -2921,7 +2956,23 @@ public final class CraftServer implements Server { @Override public double getAverageTickTime() { - return this.getServer().tickTimes5s.getAverage(); + // Folia start - region threading + ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool.SchedulableTick task = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentTickingTask(); + if (task == null) { + // might be on the shutdown thread, try retrieving the current region + if (io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegion() != null) { + // we are on the shutdown thread + task = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle(); + } + } + if (!(task instanceof io.papermc.paper.threadedregions.TickRegionScheduler.RegionScheduleHandle tickHandle)) { + throw new UnsupportedOperationException("Not on any region"); + } + + + long currTime = System.nanoTime(); + return tickHandle.getTickReport5s(currTime).timePerTickData().segmentAll().average() / 1.0E6; + // Folia end - region threading } private final org.bukkit.Server.Spigot spigot = new org.bukkit.Server.Spigot() { @@ -2978,11 +3029,27 @@ public final class CraftServer implements Server { @Override public double[] getTPS() { + // Folia start - region threading + ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool.SchedulableTick task = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentTickingTask(); + if (task == null) { + // might be on the shutdown thread, try retrieving the current region + if (io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegion() != null) { + // we are on the shutdown thread + task = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegion().getData().getRegionSchedulingHandle(); + } + } + if (!(task instanceof io.papermc.paper.threadedregions.TickRegionScheduler.RegionScheduleHandle tickHandle)) { + throw new UnsupportedOperationException("Not on any region"); + } + + // 1m, 5m, 15m + long currTime = System.nanoTime(); return new double[] { - net.minecraft.server.MinecraftServer.getServer().tps1.getAverage(), - net.minecraft.server.MinecraftServer.getServer().tps5.getAverage(), - net.minecraft.server.MinecraftServer.getServer().tps15.getAverage() + tickHandle.getTickReport1m(currTime).tpsData().segmentAll().average(), + tickHandle.getTickReport5m(currTime).tpsData().segmentAll().average(), + tickHandle.getTickReport15m(currTime).tpsData().segmentAll().average(), }; + // Folia end - region threading } @Override @@ -3152,7 +3219,7 @@ public final class CraftServer implements Server { @Override public int getCurrentTick() { - return net.minecraft.server.MinecraftServer.currentTick; + return (int)io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - region threading } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index ee7a4169003b23766b5d2e6edf9221375d80d83c..db04ba86306d8f1e157141fdeda5547f81faff54 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -239,7 +239,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getTickableTileEntityCount() { - return world.blockEntityTickers.size(); + throw new UnsupportedOperationException(); // Folia - region threading - TODO fix this? } @Override @@ -306,7 +306,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start - per world spawn limits for (SpawnCategory spawnCategory : SpawnCategory.values()) { if (CraftSpawnCategory.isValidForLimits(spawnCategory)) { - setSpawnLimit(spawnCategory, this.world.paperConfig().entities.spawning.spawnLimits.getInt(CraftSpawnCategory.toNMS(spawnCategory))); + this.spawnCategoryLimit.put(spawnCategory, this.world.paperConfig().entities.spawning.spawnLimits.getInt(CraftSpawnCategory.toNMS(spawnCategory))); // Folia - region threading } } // Paper end - per world spawn limits @@ -377,6 +377,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public Chunk getChunkAt(int x, int z) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.getHandle(), x, z, "Async chunk retrieval"); // Folia - region threading warnUnsafeChunk("getting a faraway chunk", x, z); // Paper net.minecraft.world.level.chunk.LevelChunk chunk = (net.minecraft.world.level.chunk.LevelChunk) this.world.getChunk(x, z, ChunkStatus.FULL, true); return new CraftChunk(chunk); @@ -407,10 +408,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean isChunkGenerated(int x, int z) { // Paper start - Fix this method - if (!Bukkit.isPrimaryThread()) { + if (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(this.getHandle(), x, z)) { // Folia - region threading return java.util.concurrent.CompletableFuture.supplyAsync(() -> { return CraftWorld.this.isChunkGenerated(x, z); - }, world.getChunkSource().mainThreadProcessor).join(); + }, (run) -> { io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueChunkTask(this.getHandle(), x, z, run);}).join(); // Folia - region threading } ChunkAccess chunk = world.getChunkSource().getChunkAtImmediately(x, z); if (chunk != null) { @@ -480,7 +481,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { } private boolean unloadChunk0(int x, int z, boolean save) { - org.spigotmc.AsyncCatcher.catchOp("chunk unload"); // Spigot + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, x, z, "Cannot unload chunk asynchronously"); // Folia - region threading if (!this.isChunkLoaded(x, z)) { return true; } @@ -497,6 +498,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean refreshChunk(int x, int z) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, x, z, "Cannot refresh chunk asynchronously"); // Folia - region threading ChunkHolder playerChunk = this.world.getChunkSource().chunkMap.getVisibleChunkIfPresent(ChunkPos.asLong(x, z)); if (playerChunk == null) return false; @@ -547,7 +549,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean loadChunk(int x, int z, boolean generate) { - org.spigotmc.AsyncCatcher.catchOp("chunk load"); // Spigot + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.getHandle(), x, z, "May not sync load chunks asynchronously"); // Folia - region threading warnUnsafeChunk("loading a faraway chunk", x, z); // Paper ChunkAccess chunk = this.world.getChunkSource().getChunk(x, z, generate || isChunkGenerated(x, z) ? ChunkStatus.FULL : ChunkStatus.EMPTY, true); // Paper @@ -587,7 +589,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { final DistanceManager distanceManager = this.world.getChunkSource().chunkMap.distanceManager; if (distanceManager.ticketStorage.addPluginRegionTicket(new ChunkPos(x, z), plugin)) { - this.getChunkAt(x, z); // ensure it's loaded + //this.getChunkAt(x, z); // ensure it's loaded // Folia - region threading - do not load chunks for tickets anymore to make this mt-safe return true; } @@ -641,17 +643,20 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean isChunkForceLoaded(int x, int z) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot read force-loaded chunk off global region"); // Folia - region threading return this.getHandle().getForceLoadedChunks().contains(ChunkPos.asLong(x, z)); } @Override public void setChunkForceLoaded(int x, int z, boolean forced) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify force-loaded chunks off global region"); // Folia - region threading warnUnsafeChunk("forceloading a faraway chunk", x, z); // Paper this.getHandle().setChunkForced(x, z, forced); } @Override public Collection getForceLoadedChunks() { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot read force-loaded chunks off global region"); // Folia - region threading Set chunks = new HashSet<>(); for (long coord : this.getHandle().getForceLoadedChunks()) { @@ -775,13 +780,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { - this.world.captureTreeGeneration = true; - this.world.captureBlockStates = true; + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, loc.getX(), loc.getZ(), "Cannot generate tree asynchronously"); // Folia - region threading + io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + worldData.captureTreeGeneration = true; // Folia - region threading + worldData.captureBlockStates = true; // Folia - region threading boolean grownTree = this.generateTree(loc, type); - this.world.captureBlockStates = false; - this.world.captureTreeGeneration = false; + worldData.captureBlockStates = false; // Folia - region threading + worldData.captureTreeGeneration = false; // Folia - region threading if (grownTree) { // Copy block data to delegate - for (BlockState blockstate : this.world.capturedBlockStates.values()) { + for (BlockState blockstate : worldData.capturedBlockStates.values()) { // Folia - region threading BlockPos position = ((CraftBlockState) blockstate).getPosition(); net.minecraft.world.level.block.state.BlockState oldBlock = this.world.getBlockState(position); int flags = ((CraftBlockState) blockstate).getFlags(); @@ -789,10 +796,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { net.minecraft.world.level.block.state.BlockState newBlock = this.world.getBlockState(position); this.world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, newBlock, flags, net.minecraft.world.level.block.Block.UPDATE_LIMIT); } - this.world.capturedBlockStates.clear(); + worldData.capturedBlockStates.clear(); // Folia - region threading return true; } else { - this.world.capturedBlockStates.clear(); + worldData.capturedBlockStates.clear(); // Folia - region threading return false; } } @@ -826,6 +833,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setTime(long time) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify time off of the global region"); // Folia - region threading long margin = (time - this.getFullTime()) % Level.TICKS_PER_DAY; if (margin < 0) margin += Level.TICKS_PER_DAY; this.setFullTime(this.getFullTime() + margin); @@ -838,6 +846,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setFullTime(long time) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify time off of the global region"); // Folia - region threading // Notify anyone who's listening TimeSkipEvent event = new TimeSkipEvent(this, TimeSkipEvent.SkipReason.CUSTOM, time - this.world.getDayTime()); this.server.getPluginManager().callEvent(event); @@ -865,7 +874,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public long getGameTime() { - return this.world.levelData.getGameTime(); + return this.getHandle().getGameTime(); // Folia - region threading } @Override @@ -890,6 +899,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { } public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source, Consumer configurator) { // Paper end - expand explosion API + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, x, z, "Cannot create explosion asynchronously"); // Folia - region threading net.minecraft.world.level.Level.ExplosionInteraction explosionType; if (!breakBlocks) { explosionType = net.minecraft.world.level.Level.ExplosionInteraction.NONE; // Don't break blocks @@ -899,6 +909,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { explosionType = net.minecraft.world.level.Level.ExplosionInteraction.MOB; // Respect mobGriefing gamerule } + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, x, z, "Cannot create explosion asynchronously"); // Folia - region threading net.minecraft.world.entity.Entity entity = (source == null) ? null : ((CraftEntity) source).getHandle(); return !this.world.explode0(entity, Explosion.getDefaultDamageSource(this.world, entity), null, x, y, z, power, setFire, explosionType, ParticleTypes.EXPLOSION, ParticleTypes.EXPLOSION_EMITTER, SoundEvents.GENERIC_EXPLODE, configurator).wasCanceled; // Paper - expand explosion API } @@ -981,6 +992,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getHighestBlockYAt(int x, int z, org.bukkit.HeightMap heightMap) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, x >> 4, z >> 4, "Cannot retrieve chunk asynchronously"); // Folia - region threading warnUnsafeChunk("getting a faraway chunk", x >> 4, z >> 4); // Paper // Transient load for this tick return this.world.getChunk(x >> 4, z >> 4).getHeight(CraftHeightMap.toNMS(heightMap), x, z); @@ -1011,6 +1023,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setBiome(int x, int y, int z, Holder bb) { BlockPos pos = new BlockPos(x, 0, z); + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, pos, "Cannot retrieve chunk asynchronously"); // Folia - region threading if (this.world.hasChunkAt(pos)) { net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkAt(pos); @@ -1341,6 +1354,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setStorm(boolean hasStorm) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify weather off of the global region"); // Folia - region threading this.world.serverLevelData.setRaining(hasStorm, org.bukkit.event.weather.WeatherChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setWeatherDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) @@ -1353,6 +1367,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setWeatherDuration(int duration) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify weather off of the global region"); // Folia - region threading this.world.serverLevelData.setRainTime(duration); } @@ -1363,6 +1378,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThundering(boolean thundering) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify weather off of the global region"); // Folia - region threading this.world.serverLevelData.setThundering(thundering, org.bukkit.event.weather.ThunderChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setThunderDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) @@ -1375,6 +1391,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThunderDuration(int duration) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify weather off of the global region"); // Folia - region threading this.world.serverLevelData.setThunderTime(duration); } @@ -1385,6 +1402,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setClearWeatherDuration(int duration) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify weather off of the global region"); // Folia - region threading this.world.serverLevelData.setClearWeatherTime(duration); } @@ -1583,6 +1601,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setKeepSpawnInMemory(boolean keepLoaded) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify keep spawn in memory off of the global region"); // Folia - region threading if (keepLoaded) { this.setGameRule(GameRule.SPAWN_CHUNK_RADIUS, this.getGameRuleDefault(GameRule.SPAWN_CHUNK_RADIUS)); } else { @@ -1656,6 +1675,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setHardcore(boolean hardcore) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.world.serverLevelData.settings.hardcore = hardcore; } @@ -1668,6 +1688,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setTicksPerSpawns(SpawnCategory.ANIMAL, ticksPerAnimalSpawns); } @@ -1680,6 +1701,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setTicksPerSpawns(SpawnCategory.MONSTER, ticksPerMonsterSpawns); } @@ -1692,6 +1714,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setTicksPerSpawns(SpawnCategory.WATER_ANIMAL, ticksPerWaterSpawns); } @@ -1704,6 +1727,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterAmbientSpawns(int ticksPerWaterAmbientSpawns) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setTicksPerSpawns(SpawnCategory.WATER_AMBIENT, ticksPerWaterAmbientSpawns); } @@ -1716,6 +1740,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterUndergroundCreatureSpawns(int ticksPerWaterUndergroundCreatureSpawns) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setTicksPerSpawns(SpawnCategory.WATER_UNDERGROUND_CREATURE, ticksPerWaterUndergroundCreatureSpawns); } @@ -1728,11 +1753,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setTicksPerSpawns(SpawnCategory.AMBIENT, ticksPerAmbientSpawns); } @Override public void setTicksPerSpawns(SpawnCategory spawnCategory, int ticksPerCategorySpawn) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading Preconditions.checkArgument(spawnCategory != null, "SpawnCategory cannot be null"); Preconditions.checkArgument(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory.%s are not supported", spawnCategory); @@ -1749,21 +1776,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify metadata off of the global region"); // Folia - region threading this.server.getWorldMetadata().setMetadata(this, metadataKey, newMetadataValue); } @Override public List getMetadata(String metadataKey) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot retrieve metadata off of the global region"); // Folia - region threading return this.server.getWorldMetadata().getMetadata(this, metadataKey); } @Override public boolean hasMetadata(String metadataKey) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot retrieve metadata off of the global region"); // Folia - region threading return this.server.getWorldMetadata().hasMetadata(this, metadataKey); } @Override public void removeMetadata(String metadataKey, Plugin owningPlugin) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify metadata off of the global region"); // Folia - region threading this.server.getWorldMetadata().removeMetadata(this, metadataKey, owningPlugin); } @@ -1776,6 +1807,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setMonsterSpawnLimit(int limit) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setSpawnLimit(SpawnCategory.MONSTER, limit); } @@ -1788,6 +1820,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAnimalSpawnLimit(int limit) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setSpawnLimit(SpawnCategory.ANIMAL, limit); } @@ -1800,6 +1833,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAnimalSpawnLimit(int limit) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setSpawnLimit(SpawnCategory.WATER_ANIMAL, limit); } @@ -1812,6 +1846,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAmbientSpawnLimit(int limit) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setSpawnLimit(SpawnCategory.WATER_AMBIENT, limit); } @@ -1824,6 +1859,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterUndergroundCreatureSpawnLimit(int limit) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setSpawnLimit(SpawnCategory.WATER_UNDERGROUND_CREATURE, limit); } @@ -1836,6 +1872,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAmbientSpawnLimit(int limit) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading this.setSpawnLimit(SpawnCategory.AMBIENT, limit); } @@ -1858,6 +1895,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setSpawnLimit(SpawnCategory spawnCategory, int limit) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading Preconditions.checkArgument(spawnCategory != null, "SpawnCategory cannot be null"); Preconditions.checkArgument(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory.%s are not supported", spawnCategory); @@ -1940,7 +1978,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(CraftSound.bukkitToMinecraftHolder(sound), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); - ChunkMap.TrackedEntity entityTracker = this.getHandle().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + ChunkMap.TrackedEntity entityTracker = ((CraftEntity) entity).getHandle().moonrise$getTrackedEntity(); // Folia - region threading if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } @@ -1961,7 +1999,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(Holder.direct(SoundEvent.createVariableRangeEvent(ResourceLocation.parse(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); - ChunkMap.TrackedEntity entityTracker = this.getHandle().getChunkSource().chunkMap.entityMap.get(entity.getEntityId()); + ChunkMap.TrackedEntity entityTracker = ((CraftEntity)entity).getHandle().moonrise$getTrackedEntity(); // Folia - region threading if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } @@ -2044,6 +2082,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRuleValue(String rule, String value) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading // No null values allowed if (rule == null || value == null) return false; @@ -2092,6 +2131,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRule(GameRule rule, T newValue) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify server settings off of the global region"); // Folia - region threading Preconditions.checkArgument(rule != null, "GameRule cannot be null"); Preconditions.checkArgument(newValue != null, "GameRule value cannot be null"); @@ -2319,6 +2359,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void sendGameEvent(Entity sourceEntity, org.bukkit.GameEvent gameEvent, Vector position) { + // Folia start - region threading + if (sourceEntity != null && !Bukkit.isOwnedByCurrentRegion(sourceEntity)) { + throw new IllegalStateException("Cannot send game event asynchronously"); + } + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, position.getX(), position.getZ(), "Cannot send game event asynchronously"); + // Folia end - region threading getHandle().gameEvent(sourceEntity != null ? ((CraftEntity) sourceEntity).getHandle(): null, net.minecraft.core.registries.BuiltInRegistries.GAME_EVENT.get(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(gameEvent.getKey())).orElseThrow(), org.bukkit.craftbukkit.util.CraftVector.toBlockPos(position)); } // Paper end @@ -2353,7 +2399,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { Preconditions.checkArgument(radius >= 0, "Radius value (%s) cannot be negative", radius); Raids persistentRaid = this.world.getRaids(); - net.minecraft.world.entity.raid.Raid raid = persistentRaid.getNearbyRaid(CraftLocation.toBlockPosition(location), radius * radius); + net.minecraft.world.entity.raid.Raid raid = persistentRaid.getNearbyRaid(this.world, CraftLocation.toBlockPosition(location), radius * radius); // Folia - make raids thread-safe - add ServerLevel param return (raid == null) ? null : new CraftRaid(raid, this.world); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index 6809f9dcf8510c714145d99d250eb69f98d9bf27..ed29b6250c80fadcec66c51d3af6551223c6882b 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -75,6 +75,11 @@ public class CraftBlock implements Block { } public net.minecraft.world.level.block.state.BlockState getNMS() { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading return this.world.getBlockState(this.position); } @@ -155,6 +160,11 @@ public class CraftBlock implements Block { } private void setData(final byte data, int flags) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading this.world.setBlock(this.position, CraftMagicNumbers.getBlock(this.getType(), data), flags); } @@ -196,6 +206,11 @@ public class CraftBlock implements Block { } public static boolean setBlockState(LevelAccessor world, BlockPos pos, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState, boolean applyPhysics) { + // Folia start - region threading + if (world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, pos, "Cannot modify world asynchronously"); + } + // Folia end - region threading // SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in block entity cleanup if (oldState.hasBlockEntity() && newState.getBlock() != oldState.getBlock()) { // SPIGOT-3725 remove old block entity if block changes // SPIGOT-4612: faster - just clear tile @@ -344,18 +359,33 @@ public class CraftBlock implements Block { @Override public Biome getBiome() { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading return this.getWorld().getBiome(this.getX(), this.getY(), this.getZ()); } // Paper start @Override public Biome getComputedBiome() { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading return this.getWorld().getComputedBiome(this.getX(), this.getY(), this.getZ()); } // Paper end @Override public void setBiome(Biome bio) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading this.getWorld().setBiome(this.getX(), this.getY(), this.getZ(), bio); } @@ -403,6 +433,11 @@ public class CraftBlock implements Block { @Override public boolean isBlockFaceIndirectlyPowered(BlockFace face) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading int power = this.world.getMinecraftWorld().getSignal(this.position, CraftBlock.blockFaceToNotch(face)); Block relative = this.getRelative(face); @@ -415,6 +450,11 @@ public class CraftBlock implements Block { @Override public int getBlockPower(BlockFace face) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading int power = 0; net.minecraft.world.level.Level world = this.world.getMinecraftWorld(); int x = this.getX(); @@ -504,6 +544,11 @@ public class CraftBlock implements Block { @Override public boolean breakNaturally(ItemStack item, boolean triggerEffect, boolean dropExperience, boolean forceEffect) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading // Paper end // Order matters here, need to drop before setting to air so skulls can get their data net.minecraft.world.level.block.state.BlockState state = this.getNMS(); @@ -548,21 +593,27 @@ public class CraftBlock implements Block { @Override public boolean applyBoneMeal(BlockFace face) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading Direction direction = CraftBlock.blockFaceToNotch(face); BlockFertilizeEvent event = null; ServerLevel world = this.getCraftWorld().getHandle(); UseOnContext context = new UseOnContext(world, null, InteractionHand.MAIN_HAND, Items.BONE_MEAL.getDefaultInstance(), new BlockHitResult(Vec3.ZERO, direction, this.getPosition(), false)); + io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading // SPIGOT-6895: Call StructureGrowEvent and BlockFertilizeEvent - world.captureTreeGeneration = true; + worldData.captureTreeGeneration = true; // Folia - region threading InteractionResult result = BoneMealItem.applyBonemeal(context); - world.captureTreeGeneration = false; + worldData.captureTreeGeneration = false; // Folia - region threading - if (!world.capturedBlockStates.isEmpty()) { - TreeType treeType = SaplingBlock.treeType; - SaplingBlock.treeType = null; - List states = new ArrayList<>(world.capturedBlockStates.values()); - world.capturedBlockStates.clear(); + if (!worldData.capturedBlockStates.isEmpty()) { // Folia - region threading + TreeType treeType = SaplingBlock.treeTypeRT.get(); // Folia - region threading + SaplingBlock.treeTypeRT.set(null); // Folia - region threading + List states = new ArrayList<>(worldData.capturedBlockStates.values()); // Folia - region threading + worldData.capturedBlockStates.clear(); // Folia - region threading StructureGrowEvent structureEvent = null; if (treeType != null) { @@ -650,6 +701,11 @@ public class CraftBlock implements Block { @Override public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading Preconditions.checkArgument(start != null, "Location start cannot be null"); Preconditions.checkArgument(this.getWorld().equals(start.getWorld()), "Location start cannot be a different world"); start.checkFinite(); @@ -691,6 +747,11 @@ public class CraftBlock implements Block { @Override public boolean canPlace(BlockData data) { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading Preconditions.checkArgument(data != null, "BlockData cannot be null"); net.minecraft.world.level.block.state.BlockState iblockdata = ((CraftBlockData) data).getState(); net.minecraft.world.level.Level world = this.world.getMinecraftWorld(); @@ -730,18 +791,32 @@ public class CraftBlock implements Block { @Override public void tick() { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading final ServerLevel level = this.world.getMinecraftWorld(); this.getNMS().tick(level, this.position, level.random); } - @Override public void fluidTick() { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading this.getNMSFluid().tick(this.world.getMinecraftWorld(), this.position, this.getNMS()); } @Override public void randomTick() { + // Folia start - region threading + if (this.world instanceof ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, this.position, "Cannot read world asynchronously"); + } + // Folia end - region threading final ServerLevel level = this.world.getMinecraftWorld(); this.getNMS().randomTick(level, this.position, level.random); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java index 5d4faad9df4824cfd61abfd4df011c006f114424..73d2de2e633cf5ebdac16c8f9a85b166ae7f2acf 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java @@ -32,7 +32,7 @@ public abstract class CraftBlockEntityState extends Craft private final T blockEntity; private final T snapshot; public boolean snapshotDisabled; // Paper - public static boolean DISABLE_SNAPSHOT = false; // Paper + public static final ThreadLocal DISABLE_SNAPSHOT = ThreadLocal.withInitial(() -> Boolean.FALSE); // Paper // Folia - region threading public CraftBlockEntityState(World world, T blockEntity) { super(world, blockEntity.getBlockPos(), blockEntity.getBlockState()); @@ -41,8 +41,8 @@ public abstract class CraftBlockEntityState extends Craft try { // Paper - Show blockstate location if we failed to read it // Paper start - this.snapshotDisabled = DISABLE_SNAPSHOT; - if (DISABLE_SNAPSHOT) { + this.snapshotDisabled = DISABLE_SNAPSHOT.get().booleanValue(); // Folia - region threading + if (snapshotDisabled) { // Folia - region threading this.snapshot = this.blockEntity; } else { this.snapshot = this.createSnapshot(blockEntity); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index 196835bdf95ba0e149b2977e9ef41698971f501f..846b0d6c79ad9c6885ceb8e572323667e67db4aa 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -218,6 +218,12 @@ public class CraftBlockState implements BlockState { LevelAccessor access = this.getWorldHandle(); CraftBlock block = this.getBlock(); + // Folia start - region threading + if (access instanceof net.minecraft.server.level.ServerLevel serverWorld) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, position, "Cannot modify world asynchronously"); + } + // Folia end - region threading + if (block.getType() != this.getType()) { if (!force) { return false; @@ -365,6 +371,9 @@ public class CraftBlockState implements BlockState { @Override public java.util.Collection getDrops(org.bukkit.inventory.ItemStack item, org.bukkit.entity.Entity entity) { + // Folia start - region threading + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(world.getHandle(), position, "Cannot modify world asynchronously"); + // Folia end - region threading this.requirePlaced(); net.minecraft.world.item.ItemStack nms = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(item); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java index 3c9131ac3cfb4f758e76830ca48813feb321e4c6..3a044cf779baec40a2f0f362fba126a69e0791a2 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java @@ -195,14 +195,14 @@ public final class CraftBlockStates { BlockPos pos = craftBlock.getPosition(); net.minecraft.world.level.block.state.BlockState state = craftBlock.getNMS(); BlockEntity blockEntity = craftBlock.getHandle().getBlockEntity(pos); - boolean prev = CraftBlockEntityState.DISABLE_SNAPSHOT; - CraftBlockEntityState.DISABLE_SNAPSHOT = !useSnapshot; + boolean prev = CraftBlockEntityState.DISABLE_SNAPSHOT.get().booleanValue(); // Folia - region threading + CraftBlockEntityState.DISABLE_SNAPSHOT.set(Boolean.valueOf(!useSnapshot)); // Folia - region threading try { CraftBlockState blockState = CraftBlockStates.getBlockState(world, pos, state, blockEntity); blockState.setWorldHandle(craftBlock.getHandle()); // Inject the block's generator access return blockState; } finally { - CraftBlockEntityState.DISABLE_SNAPSHOT = prev; + CraftBlockEntityState.DISABLE_SNAPSHOT.set(Boolean.valueOf(prev)); // Folia - region threading } } diff --git a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java index 13c7992e48264bcbf93f577a21d89dcc1126f625..b81545f8e8a2c1e3fd0db293481ca0b1759fff00 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java +++ b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java @@ -48,7 +48,7 @@ public class ConsoleCommandCompleter implements Completer { return syncEvent.callEvent() ? syncEvent.getCompletions() : com.google.common.collect.ImmutableList.of(); } }; - server.getServer().processQueue.add(syncCompletions); + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(syncCompletions); // Folia - region threading try { final List legacyCompletions = syncCompletions.get(); completions.removeIf(it -> !legacyCompletions.contains(it.suggestion())); // remove any suggestions that were removed @@ -80,7 +80,7 @@ public class ConsoleCommandCompleter implements Completer { return tabEvent.isCancelled() ? Collections.emptyList() : tabEvent.getCompletions(); } }; - server.getServer().processQueue.add(waitable); // Paper - Remove "this." + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(waitable); // Folia - region threading try { List offers = waitable.get(); if (offers == null) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java index 46902cbbaa9e7a8aa86c0b00cde36bd813733008..5ade012f48db8e1126c18b801ec6f7885e43f4c1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java @@ -14,6 +14,7 @@ public abstract class AbstractProjectile extends CraftEntity implements Projecti @Override public net.minecraft.world.entity.projectile.Projectile getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.Projectile) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java index 227f203901139a38ab9938f6120e75a030339b27..2bbdff00eb8867fb8844f29749a7f12ed17a7db7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractArrow.java @@ -23,6 +23,7 @@ public abstract class CraftAbstractArrow extends AbstractProjectile implements A @Override public net.minecraft.world.entity.projectile.AbstractArrow getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.AbstractArrow) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractCow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractCow.java index 4ee1cc51e9c92dd33b9ed49e8e1e0a8281aaf3d4..7ed3fa9d57fe49d129522ef50f74ba5e828e1f98 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractCow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractCow.java @@ -13,6 +13,7 @@ public abstract class CraftAbstractCow extends CraftAnimals implements AbstractC @Override public net.minecraft.world.entity.animal.AbstractCow getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.AbstractCow) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java index ab9747ba5e21b54f6a91879c4699e1e4c759f098..ffa02218212b9c0b3912a1474377f362b6cff3d4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java @@ -21,6 +21,7 @@ public abstract class CraftAbstractHorse extends CraftAnimals implements Abstrac @Override public net.minecraft.world.entity.animal.horse.AbstractHorse getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.horse.AbstractHorse) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractSkeleton.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractSkeleton.java index f59fdd04d991ba31b2715ed68699c9f21074346e..591978cc05625c4dc2ff822a7cf822135f1c9c4c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractSkeleton.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractSkeleton.java @@ -12,6 +12,7 @@ public abstract class CraftAbstractSkeleton extends CraftMonster implements Abst @Override public net.minecraft.world.entity.monster.AbstractSkeleton getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.AbstractSkeleton) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java index 11a72607c4843463028fb1977d041ce7fc89324e..8c424b7da6af7460a78662772db595b9fc0898d7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java @@ -17,6 +17,7 @@ public abstract class CraftAbstractVillager extends CraftAgeable implements Craf @Override public net.minecraft.world.entity.npc.AbstractVillager getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Villager) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractWindCharge.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractWindCharge.java index df1e31c60f3dd3f5a319751f61935d26af25a37a..304951c79eccd0db19143c4e0ec44f71845886ff 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractWindCharge.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractWindCharge.java @@ -11,6 +11,7 @@ public abstract class CraftAbstractWindCharge extends CraftFireball implements A @Override public net.minecraft.world.entity.projectile.windcharge.AbstractWindCharge getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.windcharge.AbstractWindCharge) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAgeable.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAgeable.java index 809639b79db4824524ac09575108e2134e920795..3658c75c87f22542f40049d81b3d950de17f9fde 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAgeable.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAgeable.java @@ -11,6 +11,7 @@ public class CraftAgeable extends CraftCreature implements Ageable { @Override public AgeableMob getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AgeableMob) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java index 3c1f25507b50d20d0ff8885a939ad800445985f5..38f926e87b9c2ea400106af28255a9d49a458ce1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java @@ -18,6 +18,7 @@ public class CraftAllay extends CraftCreature implements org.bukkit.entity.Allay @Override public Allay getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Allay) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAmbient.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAmbient.java index 2cf667d8faf98e429621707703c9e5a73bf3b25f..25dd9f7b9272324690cc0df6ed13379fae1b1228 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAmbient.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAmbient.java @@ -11,6 +11,7 @@ public class CraftAmbient extends CraftMob implements Ambient { @Override public AmbientCreature getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AmbientCreature) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAnimals.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAnimals.java index adde52d936db4e6e363aa99865ab840cf0397f26..64f65e33430e379e7d9cf93787bb66b5817ad5e8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAnimals.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAnimals.java @@ -19,6 +19,7 @@ public class CraftAnimals extends CraftAgeable implements Animals { @Override public Animal getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Animal) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java index 5a73f8e1e32dcca72ce1c5858893445aaac357b2..c66b4068f2ceacebc62661863288309a73f88311 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java @@ -32,6 +32,7 @@ public class CraftAreaEffectCloud extends CraftEntity implements AreaEffectCloud @Override public net.minecraft.world.entity.AreaEffectCloud getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.AreaEffectCloud) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmadillo.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmadillo.java index e7aa85589b6c669916e5f36cfb4a0b6df27e7c68..d82691b31f66c8773dbe2f3c9d7ed8ce8e6e66ad 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmadillo.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmadillo.java @@ -13,6 +13,7 @@ public class CraftArmadillo extends CraftAnimals implements Armadillo { @Override public net.minecraft.world.entity.animal.armadillo.Armadillo getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.armadillo.Armadillo) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java index ac3550c65ca4f44443fe46e3ed3bf548007d936b..685480fba3fd1bb1fa03ac35891137b179bf3e43 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java @@ -17,6 +17,7 @@ public class CraftArmorStand extends CraftLivingEntity implements ArmorStand { @Override public net.minecraft.world.entity.decoration.ArmorStand getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.decoration.ArmorStand) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java index 7926dca4e40f7df06debdfadd55eafb98cae4da3..9d06151e7c6384f6e5ea62e4acb1b066cc0dafe9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java @@ -26,6 +26,7 @@ public class CraftArrow extends CraftAbstractArrow implements Arrow { @Override public net.minecraft.world.entity.projectile.Arrow getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.Arrow) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAxolotl.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAxolotl.java index a77124dfb9816981b87bdd88cdf03ecbca9b504f..f1b1e07bff6a605184c86d2277886910037692c2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAxolotl.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAxolotl.java @@ -12,6 +12,7 @@ public class CraftAxolotl extends CraftAnimals implements Axolotl, io.papermc.pa @Override public net.minecraft.world.entity.animal.axolotl.Axolotl getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.axolotl.Axolotl) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java index 7b29d31272ac6fc497016a1e40194081c6aa6db7..2aeb5c0bf7e44426eb0e9bdca5bbff813fc45b5e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java @@ -11,6 +11,7 @@ public class CraftBat extends CraftAmbient implements Bat { @Override public net.minecraft.world.entity.ambient.Bat getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.ambient.Bat) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java index 1016d762611445f4d97240ebe3e2f9c98330a9f8..966e1eaa6e3a2b5da9b861fbc7acbb67aa42d144 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java @@ -15,6 +15,7 @@ public class CraftBee extends CraftAnimals implements Bee { @Override public net.minecraft.world.entity.animal.Bee getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Bee) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBlaze.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBlaze.java index afd698a2f700b8de6bbc22971f67f1f57cbfb9a6..7028f683d4a7a61ef4f62d33cae728306c680191 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBlaze.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBlaze.java @@ -10,6 +10,7 @@ public class CraftBlaze extends CraftMonster implements Blaze { @Override public net.minecraft.world.entity.monster.Blaze getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Blaze) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockAttachedEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockAttachedEntity.java index 1ccb370e7bfb94ace9e574484c7917ef6d7fe8e7..9045e048cf3a90085f57e5ef119b971511496d69 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockAttachedEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockAttachedEntity.java @@ -10,6 +10,7 @@ public class CraftBlockAttachedEntity extends CraftEntity { @Override public BlockAttachedEntity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (BlockAttachedEntity) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockDisplay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockDisplay.java index 6502c0622e6e34f48cfe41675428f118c6bcac49..1e7fc1256c47124ba9c2fd1a9829c27e8f13a0a3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockDisplay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBlockDisplay.java @@ -14,6 +14,7 @@ public class CraftBlockDisplay extends CraftDisplay implements BlockDisplay { @Override public net.minecraft.world.entity.Display.BlockDisplay getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.Display.BlockDisplay) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java index aba0a70af9081545d214119e16cde9f749bb9914..d745b5e2bd21f6213eaa1bfbf0dadd1488d12aba 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java @@ -14,6 +14,7 @@ public abstract class CraftBoat extends CraftVehicle implements Boat, io.papermc @Override public AbstractBoat getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractBoat) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java index 3db0be03f46ddd07c8f0b79529fa58552b707853..59781fb3253f33fd7f8a39075e84e3db2263b3ab 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java @@ -12,6 +12,7 @@ public class CraftBogged extends CraftAbstractSkeleton implements Bogged, io.pap @Override public net.minecraft.world.entity.monster.Bogged getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Bogged) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBreeze.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBreeze.java index f71864abb9ef825a37af3ed7b0cae33144c98c28..7e5955f2f748840b3e6b7d5b82c335829e794805 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBreeze.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBreeze.java @@ -13,6 +13,7 @@ public class CraftBreeze extends CraftMonster implements Breeze { @Override public net.minecraft.world.entity.monster.breeze.Breeze getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.breeze.Breeze) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBreezeWindCharge.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBreezeWindCharge.java index 59dd96368973beaf3c5cd782f6d86e6151889849..1a02bbd6ad953594e992b06d17aaa0fc7d1ee6aa 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBreezeWindCharge.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBreezeWindCharge.java @@ -10,6 +10,7 @@ public class CraftBreezeWindCharge extends CraftAbstractWindCharge implements Br @Override public net.minecraft.world.entity.projectile.windcharge.BreezeWindCharge getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.windcharge.BreezeWindCharge) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCamel.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCamel.java index 93d7fde68469cb015e22779b83ded336be849dde..6325ea46e0f7707ab607157a9a8fbbb28e8bc6bd 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCamel.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCamel.java @@ -13,6 +13,7 @@ public class CraftCamel extends CraftAbstractHorse implements Camel { @Override public net.minecraft.world.entity.animal.camel.Camel getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.camel.Camel) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java index c3e28e291e7c761f75302d39a1fbcebaa40ea305..1658d1a205d0fc31f4616a5b52e5dfcac35ac40b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java @@ -18,6 +18,7 @@ public class CraftCat extends CraftTameableAnimal implements Cat { @Override public net.minecraft.world.entity.animal.Cat getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Cat) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCaveSpider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCaveSpider.java index 79907f902734ca495affc1c62376d79c18c38416..945bcde02773a9f327ee2fd132f9f08a5707ab9b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCaveSpider.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCaveSpider.java @@ -10,6 +10,7 @@ public class CraftCaveSpider extends CraftSpider implements CaveSpider { @Override public net.minecraft.world.entity.monster.CaveSpider getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.CaveSpider) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftChestBoat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftChestBoat.java index 22ea11d7ada3b296389d98d6096d5bc49d085dd7..d00e4bf0c94b87d9eeb42936cab1815f3301da78 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftChestBoat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftChestBoat.java @@ -15,6 +15,7 @@ public abstract class CraftChestBoat extends CraftBoat implements org.bukkit.ent @Override public AbstractChestBoat getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractChestBoat) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftChestedHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftChestedHorse.java index d05897695fc3cb06fa1bfffff3a0142f651caf34..d572fe3855dd05523e1f8cdb619c138844c73ad1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftChestedHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftChestedHorse.java @@ -12,6 +12,7 @@ public abstract class CraftChestedHorse extends CraftAbstractHorse implements Ch @Override public AbstractChestedHorse getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractChestedHorse) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java index 5b1353d87a119f23d332a94fe4afded908dfdeb9..e5f55a5e48ea720884f84508ffe6e287c64e5c10 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java @@ -19,6 +19,7 @@ public class CraftChicken extends CraftAnimals implements Chicken { @Override public net.minecraft.world.entity.animal.Chicken getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Chicken) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java index ca8c10cca87d2536926ac6c75aeaf856bb83dfb0..dc4f0b9143d4c8ea6f3d34a8a78fabf23925cba5 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java @@ -11,6 +11,7 @@ public class CraftCod extends io.papermc.paper.entity.PaperSchoolableFish implem @Override public net.minecraft.world.entity.animal.Cod getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Cod) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftComplexPart.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftComplexPart.java index 178cadf023bf516b93625c124fbf1a06b0131c58..bf9a8efbaf7b77edac1dc1280de713b01c4c386a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftComplexPart.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftComplexPart.java @@ -14,6 +14,7 @@ public class CraftComplexPart extends CraftEntity implements ComplexEntityPart { @Override public EnderDragonPart getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (EnderDragonPart) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCow.java index c93885fdd01e1c288dfcbf71b455c6519aa210d1..54e71e64897e3b8287f0ac7fe710c057d74851e0 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCow.java @@ -19,6 +19,7 @@ public class CraftCow extends CraftAbstractCow implements Cow { @Override public net.minecraft.world.entity.animal.Cow getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Cow) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreaking.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreaking.java index ebdf5c7df9ce8d56463820a04d9768c6c3a2dce6..94e1d3096655819d93a6cccc96968db52ee37de8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreaking.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreaking.java @@ -19,6 +19,7 @@ public class CraftCreaking extends CraftMonster implements org.bukkit.entity.Cre @Override public Creaking getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Creaking) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java index c99c1d36ebaa7bb69d578bff29cacbb12a3ad7ed..c78999fd85f34905ef7bfd999b1dfd85fd3db8a8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java @@ -11,6 +11,7 @@ public class CraftCreature extends CraftMob implements Creature { @Override public PathfinderMob getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (PathfinderMob) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreeper.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreeper.java index 2fa2811c3a0afd19ae5ab0b86c679c5062a58ee8..9d721d23e6993a064ae4f6ee6facdd6b38c6b75d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreeper.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreeper.java @@ -14,6 +14,7 @@ public class CraftCreeper extends CraftMonster implements Creeper { @Override public net.minecraft.world.entity.monster.Creeper getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Creeper) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java index 90dcaf8e600db2567b6bb00cf50279c42451ba46..8270b6c1c64d3ac33af8ffff89f426266facf190 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java @@ -14,6 +14,7 @@ public class CraftDisplay extends CraftEntity implements Display { @Override public net.minecraft.world.entity.Display getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.Display) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java index 0400e181e4cb32267ef9e4ddaa13654ca563953b..f707a4f2425789eec2fa7a01593e556b97a03b4e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java @@ -13,6 +13,7 @@ public class CraftDolphin extends CraftAgeable implements Dolphin { @Override public net.minecraft.world.entity.animal.Dolphin getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Dolphin) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java index 4dfed6e60ce37cbea44a3682ba1eaa611f4a144e..b04333c57797d0d5469a8a6aa0cf4b9c32d6f41d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java @@ -11,6 +11,7 @@ public class CraftDrowned extends CraftZombie implements Drowned, com.destroysto @Override public net.minecraft.world.entity.monster.Drowned getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Drowned) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEgg.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEgg.java index 6b1c6e0239fc5f40016b8434e85abc1238121fa8..9f23bd1ba97fd779cca36efca067633167b533ae 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEgg.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEgg.java @@ -12,6 +12,7 @@ public class CraftEgg extends CraftThrowableProjectile implements Egg { @Override public ThrownEgg getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ThrownEgg) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java index 2229a03fda7e6a5bbec38ba4778cde8de6881c10..f37e8d5169760de675469a9aea66f61380c7e69d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java @@ -15,6 +15,7 @@ public class CraftEnderCrystal extends CraftEntity implements EnderCrystal { @Override public EndCrystal getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (EndCrystal) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java index a716433db42e46029623777bd4c4ba5ce0509056..d3228234af0ba37daa84946eb6ec7f3fe0605c37 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java @@ -22,6 +22,7 @@ public class CraftEnderDragon extends CraftMob implements EnderDragon, CraftEnem @Override public net.minecraft.world.entity.boss.enderdragon.EnderDragon getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.boss.enderdragon.EnderDragon) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragonPart.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragonPart.java index 9d7268b6b4e9c9a9a1c8b4112e6d66dc26b99f49..60420045190cb424d319d3f9d333201658ad6994 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragonPart.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragonPart.java @@ -11,6 +11,14 @@ public class CraftEnderDragonPart extends CraftComplexPart implements EnderDrago super(server, entity); } + // Folia start - region threading + @Override + public net.minecraft.world.entity.boss.EnderDragonPart getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); + return (net.minecraft.world.entity.boss.EnderDragonPart)this.entity; + } + // Folia end - region threading + @Override public EnderDragon getParent() { return (EnderDragon) super.getParent(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderPearl.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderPearl.java index eb7e63d5697d97357b1319406c81ed3721a13f5e..80312931ec81a0b20fa0a384ce87fcc5ceb8bfe9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderPearl.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderPearl.java @@ -11,6 +11,7 @@ public class CraftEnderPearl extends CraftThrowableProjectile implements EnderPe @Override public ThrownEnderpearl getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ThrownEnderpearl) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java index 4348da60addcea5b7bbd71ec3ddb6540ef9b5167..5065ffcd9f311adf3aba927ae94fd07be445ee93 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java @@ -18,6 +18,7 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal { @Override public EyeOfEnder getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (EyeOfEnder) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java index 52a5240b7a6996d7af77e2a3bfcbf18b38539266..798038361a15231263370aff2b0baf94964e28e0 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java @@ -20,6 +20,7 @@ public class CraftEnderman extends CraftMonster implements Enderman { @Override public EnderMan getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (EnderMan) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java index 000c5ea5d39d5ab6e5592012ab1cc7ee547505dc..ab2ee478c53923be85f5a6d4971bed5b5fc64393 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java @@ -11,6 +11,7 @@ public class CraftEndermite extends CraftMonster implements Endermite { @Override public net.minecraft.world.entity.monster.Endermite getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Endermite) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index b38073628d3b1381ccc4e5c6c44b2b7ec8ba1273..852e1ffef6a022caad7c8eff34091e50112a2290 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -106,6 +106,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return this.apiScheduler; }; // Paper end - Folia schedulers + // Folia start - region threading + public boolean isPurged() { + return this.taskScheduler.isRetiredOffThread(); + } + // Folia end - region threading public CraftEntity(final CraftServer server, final Entity entity) { this.server = server; @@ -140,6 +145,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } public Entity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return this.entity; } @@ -293,6 +299,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @Override public boolean teleport(Location location, 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 // Paper end Preconditions.checkArgument(location != null, "location cannot be null"); location.checkFinite(); @@ -739,7 +750,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { ImmutableSet.Builder players = ImmutableSet.builder(); ServerLevel world = ((CraftWorld) this.getWorld()).getHandle(); - ChunkMap.TrackedEntity entityTracker = world.getChunkSource().chunkMap.entityMap.get(this.getEntityId()); + ChunkMap.TrackedEntity entityTracker = this.getHandle().moonrise$getTrackedEntity(); // Folia - region threading if (entityTracker != null) { for (ServerPlayerConnection connection : entityTracker.seenBy) { @@ -756,7 +767,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { Preconditions.checkArgument(player != null, "Player cannot be null"); ServerLevel world = ((CraftWorld) this.getWorld()).getHandle(); - ChunkMap.TrackedEntity entityTracker = world.getChunkSource().chunkMap.entityMap.get(this.getEntityId()); + ChunkMap.TrackedEntity entityTracker = this.getHandle().moonrise$getTrackedEntity(); // Folia - region threading if (entityTracker == null) return false; return entityTracker.seenBy.contains(((CraftPlayer) player).getHandle().connection); @@ -1067,7 +1078,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } ServerLevel world = ((CraftWorld) this.getWorld()).getHandle(); - ChunkMap.TrackedEntity entityTracker = world.getChunkSource().chunkMap.entityMap.get(this.getEntityId()); + ChunkMap.TrackedEntity entityTracker = this.getHandle().moonrise$getTrackedEntity(); // Folia - region threading if (entityTracker == null) { return; @@ -1084,7 +1095,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } ServerLevel world = ((CraftWorld) this.getWorld()).getHandle(); - ChunkMap.TrackedEntity entityTracker = world.getChunkSource().chunkMap.entityMap.get(this.getEntityId()); + ChunkMap.TrackedEntity entityTracker = this.entity.moonrise$getTrackedEntity(); // Folia - region threading if (entityTracker == null) { return; @@ -1118,29 +1129,43 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { location.checkFinite(); Location locationClone = location.clone(); // clone so we don't need to worry about mutations after this call. - ServerLevel world = ((CraftWorld)locationClone.getWorld()).getHandle(); - CompletableFuture ret = new java.util.concurrent.CompletableFuture<>(); - - world.loadChunksForMoveAsync(this.getHandle().getBoundingBoxAt(locationClone.getX(), locationClone.getY(), locationClone.getZ()), - this instanceof CraftPlayer ? ca.spottedleaf.concurrentutil.util.Priority.HIGHER : ca.spottedleaf.concurrentutil.util.Priority.NORMAL, (list) -> { - MinecraftServer.getServer().scheduleOnMain(() -> { - final ServerChunkCache chunkCache = world.getChunkSource(); - for (final net.minecraft.world.level.chunk.ChunkAccess chunk : list) { - chunkCache.addTicketAtLevel(TicketType.POST_TELEPORT, chunk.getPos(), 33); - } - try { - ret.complete(CraftEntity.this.teleport(locationClone, cause, teleportFlags) ? Boolean.TRUE : Boolean.FALSE); - } catch (Throwable throwable) { - if (throwable instanceof ThreadDeath) { - throw (ThreadDeath)throwable; - } - MinecraftServer.LOGGER.error("Failed to teleport entity " + CraftEntity.this, throwable); - ret.completeExceptionally(throwable); - } - }); - }); + // Folia start - region threading + java.util.concurrent.CompletableFuture ret = new java.util.concurrent.CompletableFuture<>(); + java.util.function.Consumer run = (Entity nmsEntity) -> { + boolean success = nmsEntity.teleportAsync( + ((CraftWorld)locationClone.getWorld()).getHandle(), + new net.minecraft.world.phys.Vec3(locationClone.getX(), locationClone.getY(), locationClone.getZ()), + locationClone.getYaw(), locationClone.getPitch(), net.minecraft.world.phys.Vec3.ZERO, + cause == null ? TeleportCause.UNKNOWN : cause, + Entity.TELEPORT_FLAG_LOAD_CHUNK | Entity.TELEPORT_FLAG_TELEPORT_PASSENGERS, // preserve behavior with old API: dismount the entity so it can teleport + (Entity entityTp) -> { + ret.complete(Boolean.TRUE); + } + ); + if (!success) { + ret.complete(Boolean.FALSE); + } + }; + if (org.bukkit.Bukkit.isOwnedByCurrentRegion(this)) { + run.accept(this.getHandle()); + return ret; + } + boolean scheduled = this.taskScheduler.schedule( + // success + run, + // retired + (Entity nmsEntity) -> { + ret.complete(Boolean.FALSE); + }, + 1L + ); + + if (!scheduled) { + ret.complete(Boolean.FALSE); + } return ret; + // Folia end - region threading } // Paper end - more teleport API / async chunk API @@ -1213,8 +1238,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @Override public Set getTrackedPlayers() { - ServerLevel world = (net.minecraft.server.level.ServerLevel)this.entity.level(); - ChunkMap.TrackedEntity tracker = world == null ? null : world.getChunkSource().chunkMap.entityMap.get(this.entity.getId()); + ChunkMap.TrackedEntity tracker = this.entity.moonrise$getTrackedEntity(); // Folia - region threading if (tracker == null) { return java.util.Collections.emptySet(); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java index 73b50136708d61c71606a212640d11d8bfe1b4cf..7275c172769bfbefd003469bd74d31264a6ce4bb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java @@ -13,6 +13,7 @@ public class CraftEvoker extends CraftSpellcaster implements Evoker { @Override public net.minecraft.world.entity.monster.Evoker getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Evoker) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEvokerFangs.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEvokerFangs.java index 5bf6f079a1fb9c21146cd99ee447bb3c37d969be..44b51c8d47a12a995f5c0ca4ee14816e4fb4eb8e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEvokerFangs.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEvokerFangs.java @@ -13,6 +13,7 @@ public class CraftEvokerFangs extends CraftEntity implements EvokerFangs { @Override public net.minecraft.world.entity.projectile.EvokerFangs getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.EvokerFangs) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftExperienceOrb.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftExperienceOrb.java index 8cd7ba2f4b7ceaebd2ef698b5de80ca4bf1f1569..e2735c6e486783a85408bbd68d38ed5c6693c296 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftExperienceOrb.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftExperienceOrb.java @@ -12,6 +12,7 @@ public class CraftExperienceOrb extends CraftEntity implements ExperienceOrb { @Override public net.minecraft.world.entity.ExperienceOrb getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.ExperienceOrb) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java index eacdc2467fae5ef7e853012329e69ceb9c514c84..3d045111440ce0d5a7b87828ee0e7e10d3f53d94 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java @@ -16,6 +16,7 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock { @Override public FallingBlockEntity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (FallingBlockEntity) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java index 7e53e12c8ec5e7a2f6eeb78b1fa53cae853859dc..b2b14ee16d8902d10abc17f006a9360451ddb026 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java @@ -16,6 +16,7 @@ public class CraftFireball extends AbstractProjectile implements Fireball { @Override public AbstractHurtingProjectile getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractHurtingProjectile) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java index c64e78d548d42eff013582a72bf1f85beedbdea4..f0d27d32517607f8e77039a5292cc23056934ec1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java @@ -20,6 +20,7 @@ public class CraftFirework extends CraftProjectile implements Firework { @Override public FireworkRocketEntity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (FireworkRocketEntity) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java index 207f06a854d28cb836900da73d75be8d0ac01150..c219cdfc0c168d849a63d63c2dd47c279cf5b05f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java @@ -12,6 +12,7 @@ public class CraftFish extends CraftWaterMob implements Fish, io.papermc.paper.e @Override public AbstractFish getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractFish) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java index 327a686a20d86deeb6090dc9747e8367b57ba139..0720ae77e85a2f8dec4a926ed8583ccfef32a0ab 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java @@ -23,6 +23,7 @@ public class CraftFishHook extends CraftProjectile implements FishHook { @Override public FishingHook getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (FishingHook) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java index 8084bd6788658b485046910d711d399be25089e3..053c594c4fab97a3b6abc2852530490251a89481 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java @@ -17,6 +17,7 @@ public class CraftFox extends CraftAnimals implements Fox { @Override public net.minecraft.world.entity.animal.Fox getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Fox) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFrog.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFrog.java index 08df77201f0f3ca05dbae98c42471e526abd5a06..99bb073f3c2546fad1a9cac7ea205690e048178f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFrog.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFrog.java @@ -18,6 +18,7 @@ public class CraftFrog extends CraftAnimals implements org.bukkit.entity.Frog { @Override public Frog getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Frog) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java index 9f699fdbd2f58b7a58c260681beb5b5e18aa4721..794a4f09af20044ca348d43587e1112a40a9285a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java @@ -11,6 +11,7 @@ public class CraftGhast extends CraftMob implements Ghast, CraftEnemy { @Override public net.minecraft.world.entity.monster.Ghast getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Ghast) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGiant.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGiant.java index 84c1dc9bc126a7afa4af69d3c9faf5483aee2d30..3fceb66f0c1c62cdb2ff59b76f5b3639ebf83c49 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGiant.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGiant.java @@ -11,6 +11,7 @@ public class CraftGiant extends CraftMonster implements Giant { @Override public net.minecraft.world.entity.monster.Giant getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Giant) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowItemFrame.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowItemFrame.java index b41bd0515849b18812fd878dd91a1537a1e41687..7e28b50e1e5dc50c064d4e2f72b97b317c3dae63 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowItemFrame.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowItemFrame.java @@ -11,6 +11,7 @@ public class CraftGlowItemFrame extends CraftItemFrame implements GlowItemFrame @Override public net.minecraft.world.entity.decoration.GlowItemFrame getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.decoration.GlowItemFrame) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowSquid.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowSquid.java index dac2ac14a170dcb6994adefe85011b0b6ebdd2b2..4030c165e657b1bff55e3bbc870eb0de6bdf3e15 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowSquid.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGlowSquid.java @@ -12,6 +12,7 @@ public class CraftGlowSquid extends CraftSquid implements GlowSquid { @Override public net.minecraft.world.entity.GlowSquid getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.GlowSquid) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGoat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGoat.java index 1fcab60ca6bd0ed390fd8b6eefa8da7ee33196c2..f06e8524c83a2a2e9bb16d629649f7a09cdaa6f9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGoat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGoat.java @@ -11,6 +11,7 @@ public class CraftGoat extends CraftAnimals implements Goat { @Override public net.minecraft.world.entity.animal.goat.Goat getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.goat.Goat) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGolem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGolem.java index 9cb3dd093f7cca53dced95f3a6823a8ad33644e1..b828e387fc765f51a5de1e55b3fc63f9c9f49c38 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGolem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGolem.java @@ -12,6 +12,7 @@ public class CraftGolem extends CraftCreature implements Golem { @Override public AbstractGolem getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractGolem) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java index 2f68d8708150fd5d2ec662c4c5bcebcc1a0e378f..4d18df27a176007fb83fb7fabc9d468ca5fa1c66 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java @@ -15,6 +15,7 @@ public class CraftGuardian extends CraftMonster implements Guardian { @Override public net.minecraft.world.entity.monster.Guardian getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Guardian) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java index 49f5d3113ce912b95da7fccfadcfeb565172ab7f..599a672b1f70c5e333ed9a5ad80e1299bbb42c1b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java @@ -60,6 +60,7 @@ public class CraftHanging extends CraftBlockAttachedEntity implements Hanging { @Override public HangingEntity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (HangingEntity) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHoglin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHoglin.java index 9565572393d616477a252e3449cc2bdd76f5a6b7..3cd54754745bb3a8d0729bc1cd55e9a3093a2860 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHoglin.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHoglin.java @@ -12,6 +12,7 @@ public class CraftHoglin extends CraftAnimals implements Hoglin, CraftEnemy { @Override public net.minecraft.world.entity.monster.hoglin.Hoglin getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.hoglin.Hoglin) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java index ef8073dfd4c5057a889099d62eaad51158e9ad44..4b062bffcd28904bed9259d28fd72d5253ccd8ba 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java @@ -16,6 +16,7 @@ public class CraftHorse extends CraftAbstractHorse implements Horse { @Override public net.minecraft.world.entity.animal.horse.Horse getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.horse.Horse) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index 8fba3cbac5d2d39e7db3d3261c68317dbc936736..b6b95157ab3a09dddb86f85eb8b5851b7ffe46d3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -102,6 +102,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { @Override public Player getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Player) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllager.java index fdc42e00b23eb4b37440745e00205b2e8952864d..a307ca3dae4c6327b107e57e8ac0b0abb5a159ef 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllager.java @@ -12,6 +12,7 @@ public class CraftIllager extends CraftRaider implements Illager { @Override public AbstractIllager getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractIllager) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java index ed158e3a1167785e61b62d88f27d57bfad8b0878..fca6716be65aa1637559f9be953c0c090fede590 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java @@ -11,6 +11,7 @@ public class CraftIllusioner extends CraftSpellcaster implements Illusioner, com @Override public net.minecraft.world.entity.monster.Illusioner getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Illusioner) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftInteraction.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftInteraction.java index c4f2be2c47890853e4fa8e4e2953f245b42182f5..f23d03a68c1aa1fe06c10c8561b7af9a6aa62526 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftInteraction.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftInteraction.java @@ -14,6 +14,7 @@ public class CraftInteraction extends CraftEntity implements Interaction { @Override public net.minecraft.world.entity.Interaction getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.Interaction) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java index 2d7be6f2afe32fd7555640989313052d37973e61..2401342da336e226b1b5ac86edf880b0e3aa4b5a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java @@ -10,6 +10,7 @@ public class CraftIronGolem extends CraftGolem implements IronGolem { @Override public net.minecraft.world.entity.animal.IronGolem getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.IronGolem) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java index 33a0e5de4b96e3752ed60a77e9f20f38e434104e..4af0e8b35c91051b25a36cb37b62f7b1e9037ed9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java @@ -21,6 +21,7 @@ public class CraftItem extends CraftEntity implements Item { @Override public ItemEntity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ItemEntity) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemDisplay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemDisplay.java index 41c3e5182e83552170e0573cbbed461db7e382fd..93921f15d64fe3d7d52cb38de8e1782144fe24ce 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemDisplay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemDisplay.java @@ -15,6 +15,7 @@ public class CraftItemDisplay extends CraftDisplay implements ItemDisplay { @Override public net.minecraft.world.entity.Display.ItemDisplay getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.Display.ItemDisplay) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java index 31aa6d0c2d727aaa0c26ec421eb5cd78c6d98ca2..1da6259bc7d7b9d6fd78256aa68e153c10217533 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java @@ -19,6 +19,7 @@ public class CraftItemFrame extends CraftHanging implements ItemFrame { @Override public net.minecraft.world.entity.decoration.ItemFrame getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.decoration.ItemFrame) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLargeFireball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLargeFireball.java index 742c0227962903fe7b1f86361886dbdfe2a3f2cd..ad960d6580ef93a0fcd623c01dcd90b09746f1a9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLargeFireball.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLargeFireball.java @@ -11,6 +11,7 @@ public class CraftLargeFireball extends CraftSizedFireball implements LargeFireb @Override public net.minecraft.world.entity.projectile.LargeFireball getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.LargeFireball) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLeash.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLeash.java index 9022661233912809373b975cbf3ae169d38c0d9b..5f94d03c02db50084b419ee0771c6b35c5cc2224 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLeash.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLeash.java @@ -14,6 +14,7 @@ public class CraftLeash extends CraftBlockAttachedEntity implements LeashHitch { @Override public LeashFenceKnotEntity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (LeashFenceKnotEntity) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java index 32e426513f3e710abeda3363a4e2a08fe902c703..2655d6c0c58c27bd532d13fab723863c22d1f535 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java @@ -14,6 +14,7 @@ public class CraftLightningStrike extends CraftEntity implements LightningStrike @Override public LightningBolt getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (LightningBolt) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index 6b4e74b808b4fb6ac0143d5c82571657b2c49683..eca27a179edfd7a78767bd53d87665e981efb2c2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -105,6 +105,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @Override public net.minecraft.world.entity.LivingEntity getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.LivingEntity) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java index 02deb9c37250144be9afa0fe55df2a49017a7070..620cdc4ca5234bc3214ac76f1c6acbc33fb89b5d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java @@ -16,6 +16,7 @@ public class CraftLlama extends CraftChestedHorse implements Llama, com.destroys @Override public net.minecraft.world.entity.animal.horse.Llama getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.horse.Llama) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java index 1425190d510f517d47c4cae85a50350e6556619a..540704b7cff12b103abe7568896ecf3533ed1a18 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java @@ -11,6 +11,7 @@ public class CraftLlamaSpit extends AbstractProjectile implements LlamaSpit { @Override public net.minecraft.world.entity.projectile.LlamaSpit getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.LlamaSpit) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java index 8720425ea9f9f31e43b505b7384e6add6c22c360..3b937e14bbc53308e80bcea3a8dde67afc06cc11 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java @@ -11,6 +11,7 @@ public class CraftMagmaCube extends CraftSlime implements MagmaCube { @Override public net.minecraft.world.entity.monster.MagmaCube getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.MagmaCube) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMarker.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMarker.java index 9a9302fe5694ca67d96b463462521c82ae71673c..65a4468ba70dac615ff8e2114707d258b01085fd 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMarker.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMarker.java @@ -11,6 +11,7 @@ public class CraftMarker extends CraftEntity implements Marker { @Override public net.minecraft.world.entity.Marker getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.Marker) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java index 9c5caa4b9c11b265df6bafce72f43b633b6cc751..63d1bb9cc7c9527dde14b3c7dac4f666d0d2a92a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java @@ -22,6 +22,7 @@ public abstract class CraftMinecart extends CraftVehicle implements Minecart { @Override public AbstractMinecart getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractMinecart) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java index 4279824f8a0e06322a7d6110875513db01c7a826..19dbe0ff207b0647185bb5650a614b25bc9f133e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java @@ -23,6 +23,7 @@ public class CraftMinecartCommand extends CraftMinecart implements CommandMineca @Override public MinecartCommandBlock getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (MinecartCommandBlock) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java index a1f27890787b8d47dda99403f3198e6d69653488..da1914617a53eb1d8da0a09a3cd3e99cb8257fee 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartContainer.java @@ -12,6 +12,7 @@ public abstract class CraftMinecartContainer extends CraftMinecart implements co @Override public AbstractMinecartContainer getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractMinecartContainer) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java index 65d808c2b088ff827de4292ac50af2d2595c7a29..486e52c9ecb4d96ce9cef98cf5cc484f559bb122 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartFurnace.java @@ -13,6 +13,7 @@ public class CraftMinecartFurnace extends CraftMinecart implements PoweredMineca @Override public MinecartFurnace getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (MinecartFurnace) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java index 7933ee5f732736d844726f61ad2e073a717168ec..6736e0e1dbce5c47e48df50d4d9832ded6a4cc5b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java @@ -17,6 +17,7 @@ public class CraftMinecartHopper extends CraftMinecartContainer implements Hoppe @Override public net.minecraft.world.entity.vehicle.MinecartHopper getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.vehicle.MinecartHopper) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartMobSpawner.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartMobSpawner.java index ab1a4dceae22549f1050101b353ceee42f343332..100c8f3006fde689ed438af1bb2891755cc189d3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartMobSpawner.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartMobSpawner.java @@ -27,6 +27,7 @@ public class CraftMinecartMobSpawner extends CraftMinecart implements SpawnerMin @Override public MinecartSpawner getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (MinecartSpawner) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java index bbe67e82a29a4bde87c3d988f778c2f2b70b5011..17c6f7533ba7f32010100bdcd37e07bf6b1e9c5d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java @@ -14,6 +14,7 @@ public class CraftMinecartTNT extends CraftMinecart implements ExplosiveMinecart @Override public MinecartTNT getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (MinecartTNT) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java index 5e1a3e7ca09f4cf92b17e7717949116cc557e63c..edcf0764296431c971c4ef05c41437028a625abd 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java @@ -39,13 +39,14 @@ public abstract class CraftMob extends CraftLivingEntity implements Mob, io.pape @Override public net.minecraft.world.entity.Mob getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.Mob) this.entity; } @Override public void setHandle(net.minecraft.world.entity.Entity entity) { super.setHandle(entity); - this.paperPathfinder.setHandle(getHandle()); + this.paperPathfinder.setHandle((net.minecraft.world.entity.Mob)getHandleRaw()); // Folia - region threading } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java index 52c165714af356490988edfaf8e14d16dfa25da8..f1a6a22e1175b29a4236eac958f825846ded41d6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java @@ -11,6 +11,7 @@ public class CraftMonster extends CraftCreature implements Monster, CraftEnemy { @Override public net.minecraft.world.entity.monster.Monster getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Monster) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java index fb25c0f554a577ef43fbbe8cecf87735ad298e67..5ae8464f1c2ac29b86df900c55909d43bc84145e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java @@ -21,6 +21,7 @@ public class CraftMushroomCow extends CraftAbstractCow implements MushroomCow, i @Override public net.minecraft.world.entity.animal.MushroomCow getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.MushroomCow) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java index b4685c9773eed067879835f1ca8fdf26a256f13a..1b6dd649be7da144bb4d14d5ce0b544a4f9c97e6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java @@ -11,6 +11,7 @@ public class CraftOcelot extends CraftAnimals implements Ocelot { @Override public net.minecraft.world.entity.animal.Ocelot getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Ocelot) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftOminousItemSpawner.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftOminousItemSpawner.java index c8cc8a6956b607d0ca27fde9745f54730f1e55f3..39fc0acef1ea2fa90d00fc7a361d225c6e9a65fe 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftOminousItemSpawner.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftOminousItemSpawner.java @@ -13,6 +13,7 @@ public class CraftOminousItemSpawner extends CraftEntity implements OminousItemS @Override public net.minecraft.world.entity.OminousItemSpawner getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.OminousItemSpawner) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java index 614a17330020b3f3dbabba1708838941a99a452f..265abf0042d28895075a4cd8e2b08e2d7d9da91b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java @@ -16,6 +16,7 @@ public class CraftPainting extends CraftHanging implements Painting { @Override public net.minecraft.world.entity.decoration.Painting getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.decoration.Painting) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java index df2877d055feab59506373775f4ca03e288d8c1f..0cf872287d52f4b1b700ee4a4798290d3f4aaa48 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java @@ -12,6 +12,7 @@ public class CraftPanda extends CraftAnimals implements Panda { @Override public net.minecraft.world.entity.animal.Panda getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Panda) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftParrot.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftParrot.java index 60e1da70c682aed693bbecffcf8ef90ab70ae420..76d2c0ef6e4d1cff1d8841ffedaf94f8953e3687 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftParrot.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftParrot.java @@ -12,6 +12,7 @@ public class CraftParrot extends CraftTameableAnimal implements Parrot { @Override public net.minecraft.world.entity.animal.Parrot getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Parrot) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java index cabdcbef0e6f7ca41ff5677bc2e6a81665ca812d..302f0fd3a8e2641ae312a9f5e5e3f3c715897b0a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java @@ -15,6 +15,7 @@ public class CraftPhantom extends CraftMob implements Phantom, CraftEnemy { @Override public net.minecraft.world.entity.monster.Phantom getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Phantom) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java index 387eed77223a6bc321d685bc87aed1365c724e3c..32b43d2f13a83b5a60f45099dbdc223f7418d060 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPig.java @@ -23,6 +23,7 @@ public class CraftPig extends CraftAnimals implements Pig { @Override public net.minecraft.world.entity.animal.Pig getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Pig) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPigZombie.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPigZombie.java index fa9d7a532e9a552c4839a5b4f86864304d30927c..20ca79530c5180be1036b0ab3b0d3fac2ad58017 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPigZombie.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPigZombie.java @@ -12,6 +12,7 @@ public class CraftPigZombie extends CraftZombie implements PigZombie { @Override public ZombifiedPiglin getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ZombifiedPiglin) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java index 849873a9f5c50a350c7fee499440e7cdef2bb719..24e54fc3bc263eec6b7a8c2aa48e638a55779025 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java @@ -20,6 +20,7 @@ public class CraftPiglin extends CraftPiglinAbstract implements Piglin, com.dest @Override public net.minecraft.world.entity.monster.piglin.Piglin getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.piglin.Piglin) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinAbstract.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinAbstract.java index a30bbedafdbfb7463966291ee9b73c2f73b9fb51..e0841e4f90c5c300a19b31c60e104c19eb18c15a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinAbstract.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinAbstract.java @@ -13,6 +13,7 @@ public class CraftPiglinAbstract extends CraftMonster implements PiglinAbstract @Override public AbstractPiglin getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractPiglin) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinBrute.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinBrute.java index 2fa281466e63f75bb838bfe1f2433eebca2da397..6c403cade870cfed21f333aefb5c22da1064c6d3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinBrute.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglinBrute.java @@ -11,6 +11,7 @@ public class CraftPiglinBrute extends CraftPiglinAbstract implements PiglinBrute @Override public net.minecraft.world.entity.monster.piglin.PiglinBrute getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.piglin.PiglinBrute) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPillager.java index d927938df4ac2b5de7ef2d26a3f0056b8310ddcd..2778d675b436642667780758c2e09d609c2442ec 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPillager.java @@ -13,6 +13,7 @@ public class CraftPillager extends CraftIllager implements Pillager, com.destroy @Override public net.minecraft.world.entity.monster.Pillager getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Pillager) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 322a1e38799a7bf45b8d3ee151b0b62df45d55d7..82d2309f2bc7e9d1e989f4b4212e360b47aa533f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -239,7 +239,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @Override public ServerPlayer getHandle() { - return (ServerPlayer) this.entity; + return (ServerPlayer) this.entity; // Folia - region threading - no checks for players, as it's a total mess } @Override @@ -638,7 +638,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @Override public void kickPlayer(String message) { - org.spigotmc.AsyncCatcher.catchOp("player kick"); // Spigot + //org.spigotmc.AsyncCatcher.catchOp("player kick"); // Spigot // Folia - thread-safe now, as it will simply delay the kick this.getHandle().connection.disconnect(CraftChatMessage.fromStringOrEmpty(message, true), org.bukkit.event.player.PlayerKickEvent.Cause.PLUGIN); // Paper - kick event cause } @@ -651,7 +651,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @Override public void kick(net.kyori.adventure.text.Component message, org.bukkit.event.player.PlayerKickEvent.Cause cause) { - org.spigotmc.AsyncCatcher.catchOp("player kick"); + //org.spigotmc.AsyncCatcher.catchOp("player kick"); // Folia - region threading - no longer needed final ServerGamePacketListenerImpl connection = this.getHandle().connection; if (connection != null) { connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message, cause); @@ -1360,6 +1360,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @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 Set relativeArguments; Set allFlags; if (flags.length == 0) { @@ -2027,7 +2032,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa private void unregisterEntity(Entity other) { // Paper end ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap; - ChunkMap.TrackedEntity entry = tracker.entityMap.get(other.getId()); + ChunkMap.TrackedEntity entry = other.moonrise$getTrackedEntity(); // Folia - region threading if (entry != null) { entry.removePlayer(this.getHandle()); } @@ -2124,7 +2129,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa if (original != null) otherPlayer.setUUID(original); // Paper - uuid override } - ChunkMap.TrackedEntity entry = tracker.entityMap.get(other.getId()); + ChunkMap.TrackedEntity entry = other.moonrise$getTrackedEntity(); // Folia - region threading if (entry != null && !entry.seenBy.contains(this.getHandle().connection)) { entry.updatePlayer(this.getHandle()); } @@ -3268,7 +3273,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @Override public void respawn() { if (CraftPlayer.this.getHealth() <= 0 && CraftPlayer.this.isOnline()) { - CraftPlayer.this.server.getServer().getPlayerList().respawn(CraftPlayer.this.getHandle(), false, Entity.RemovalReason.KILLED, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.PLUGIN); + CraftPlayer.this.getHandle().respawn(null, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.PLUGIN); // Folia - region threading } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java index 1e3b8eb597f6e72f9ce286dcb8be589d3e0e6a8c..a4876bbfc1b934b86706a83600658a7f563b2036 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java @@ -11,6 +11,7 @@ public class CraftPolarBear extends CraftAnimals implements PolarBear { @Override public net.minecraft.world.entity.animal.PolarBear getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.PolarBear) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java index 94ae0f20772053379e5de86c9147bd43b01cbb84..396e48a6254788a25faeb12ed1bc9927aebceddf 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java @@ -11,6 +11,7 @@ public abstract class CraftProjectile extends AbstractProjectile implements Proj @Override public net.minecraft.world.entity.projectile.Projectile getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.Projectile) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java index e63c3bdd1b9f244597489e65b5c36f4ec0f54fcb..6e6e052e3cbaf1457b1506d6d44f5bf75c1e2217 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java @@ -12,6 +12,7 @@ public class CraftPufferFish extends CraftFish implements PufferFish { @Override public Pufferfish getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Pufferfish) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java index 994eb2d881fd3aa202f4893fd44ce50e83ebf6d9..65ba9b17f9066d69e7ac58a0bfa10b0e8e778c52 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java @@ -11,6 +11,7 @@ public class CraftRabbit extends CraftAnimals implements Rabbit { @Override public net.minecraft.world.entity.animal.Rabbit getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Rabbit) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java index 42d89992c82983cf4d9af3d681e568e6155f2743..0023b7bc73760b0e49c7d1702b2fab14fd4d0c47 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java @@ -18,6 +18,7 @@ public abstract class CraftRaider extends CraftMonster implements Raider { @Override public net.minecraft.world.entity.raid.Raider getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.raid.Raider) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java index ec2b5fbeca06534ea94f52f15970f64eea00c2c8..6df1bec46d06f3d402fad053b542dad65056c8de 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java @@ -11,6 +11,7 @@ public class CraftRavager extends CraftRaider implements Ravager { @Override public net.minecraft.world.entity.monster.Ravager getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Ravager) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java index 8b2c8924f66f0d958c6b07df3a643bc791da4f9a..2c130bfa7c48004aa503089def3d1d6612f82ab2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java @@ -12,6 +12,7 @@ public class CraftSalmon extends io.papermc.paper.entity.PaperSchoolableFish imp @Override public net.minecraft.world.entity.animal.Salmon getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Salmon) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java index 95c1535a1c6ca14281e3cdd264cd37bf5da9e9b3..29a080568d738cbffd003f32226094bc65ca2d10 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java @@ -12,6 +12,7 @@ public class CraftSheep extends CraftAnimals implements Sheep, io.papermc.paper. @Override public net.minecraft.world.entity.animal.sheep.Sheep getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.sheep.Sheep) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java index c23b88cada096a768c5cf8cfac484c7a9c0b4f1f..fac35a20720b8e0d0e3b2215e863be61af2ab2fc 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulker.java @@ -15,6 +15,7 @@ public class CraftShulker extends CraftGolem implements Shulker, CraftEnemy { @Override public net.minecraft.world.entity.monster.Shulker getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Shulker) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java index 9a1a581e523d2ec0b8450546bc9ca6fd34127ede..9cd4ddbed036fa67c78f0d55d7103390832f6cd9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java @@ -12,6 +12,7 @@ public class CraftShulkerBullet extends AbstractProjectile implements ShulkerBul @Override public net.minecraft.world.entity.projectile.ShulkerBullet getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.ShulkerBullet) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSilverfish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSilverfish.java index d5acee3d7b9e7085f05cb7355575a8551434ba1a..36e170881c88ea0df31175abc3c0cef033d594a4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSilverfish.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSilverfish.java @@ -11,6 +11,7 @@ public class CraftSilverfish extends CraftMonster implements Silverfish { @Override public net.minecraft.world.entity.monster.Silverfish getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Silverfish) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSizedFireball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSizedFireball.java index 579ec54530786c08a82e6875b80305b236a089e6..49eaddcb13a3bcffa88a69be10f15820aadc2a5c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSizedFireball.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSizedFireball.java @@ -15,6 +15,7 @@ public class CraftSizedFireball extends CraftFireball implements SizedFireball { @Override public Fireball getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Fireball) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java index af73ee0ce87d508387d385c706786855378c3a7e..8f12a2129d5c205b34a5db518d2f1780e7ea1ea9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java @@ -12,6 +12,7 @@ public class CraftSkeleton extends CraftAbstractSkeleton implements Skeleton { @Override public net.minecraft.world.entity.monster.Skeleton getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Skeleton) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java index f40729e9cf8cc5e9210a3165df980221429824f3..5d660c4f8095adc9821b8031d65bec6e1033f225 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java @@ -12,6 +12,7 @@ public class CraftSkeletonHorse extends CraftAbstractHorse implements SkeletonHo @Override public net.minecraft.world.entity.animal.horse.SkeletonHorse getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.horse.SkeletonHorse) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java index 214e636701a51029e46cfaf4d374d1d21f92cf3d..1715cf16f400a432b3c19d2810d01590af46cff9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java @@ -11,6 +11,7 @@ public class CraftSlime extends CraftMob implements Slime, CraftEnemy { @Override public net.minecraft.world.entity.monster.Slime getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Slime) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSmallFireball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSmallFireball.java index fbd3f86bfd0488efa3c642457b24b42dd90547db..481e2063f043f5dda19a345baf6406d9327660e2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSmallFireball.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSmallFireball.java @@ -11,6 +11,7 @@ public class CraftSmallFireball extends CraftSizedFireball implements SmallFireb @Override public net.minecraft.world.entity.projectile.SmallFireball getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.SmallFireball) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java index 808b037b660e5ca3fc88f7bff700390f69208a6d..3917553ac82df4bd153994ae74b390183d1ca619 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java @@ -18,6 +18,7 @@ public class CraftSniffer extends CraftAnimals implements Sniffer { @Override public net.minecraft.world.entity.animal.sniffer.Sniffer getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.sniffer.Sniffer) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowball.java index b31f2a939e95bdc91e7fdaa53dfdb7ce45d05fde..8050313efa2473fa6118c62e14db3ff3023750fe 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowball.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowball.java @@ -11,6 +11,7 @@ public class CraftSnowball extends CraftThrowableProjectile implements Snowball @Override public net.minecraft.world.entity.projectile.Snowball getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.Snowball) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java index f03f9f94c51ef2f2eb24e4f65ec69b542b1c0a07..4bc3fd92cf0dd821438e72a4256c945a5fba6107 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java @@ -12,6 +12,7 @@ public class CraftSnowman extends CraftGolem implements Snowman, com.destroystok @Override public SnowGolem getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (SnowGolem) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSpectralArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSpectralArrow.java index 4afd6e013ac79c5afcbfb278c277424429ce4656..b8b40773cc42359d94b25e28d3632e48e80b2b1f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSpectralArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSpectralArrow.java @@ -11,6 +11,7 @@ public class CraftSpectralArrow extends CraftAbstractArrow implements SpectralAr @Override public net.minecraft.world.entity.projectile.SpectralArrow getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.SpectralArrow) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSpellcaster.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSpellcaster.java index b28ef9d0003c3adbeaa6866008506ab52b8f45a4..5e7a9f8808ff5a2452d3f21c5601a14f9ba4f402 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSpellcaster.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSpellcaster.java @@ -13,6 +13,7 @@ public class CraftSpellcaster extends CraftIllager implements Spellcaster { @Override public SpellcasterIllager getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (SpellcasterIllager) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSpider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSpider.java index 90be754d6aa09290d915d5ea6aa6bd69047755f0..6bddbb2ae47ffe8b347a0804e71bc30a9dc70d34 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSpider.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSpider.java @@ -11,6 +11,7 @@ public class CraftSpider extends CraftMonster implements Spider { @Override public net.minecraft.world.entity.monster.Spider getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Spider) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSquid.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSquid.java index d1a49aaa259caf4a50bb2612020729c46fb1f81e..85dbd9da11d8d911ed4b1d2666bd2cfd1853c0b6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSquid.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSquid.java @@ -11,6 +11,7 @@ public class CraftSquid extends CraftAgeable implements Squid { @Override public net.minecraft.world.entity.animal.Squid getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Squid) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java index 6c03adc7b0dd6b8491d408fc2728c84a52ec13b4..f98c6df5ddcd7641ea0a974c7967fd2b04ac62f6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftStrider.java @@ -16,6 +16,7 @@ public class CraftStrider extends CraftAnimals implements Strider { @Override public net.minecraft.world.entity.monster.Strider getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Strider) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java index 4a62bd61ad3fcd59433e6cb7ddba3af39d714fef..8ba771150f8f14501f3cac9497dcbbd6737a2a65 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java @@ -15,6 +15,7 @@ public class CraftTNTPrimed extends CraftEntity implements TNTPrimed { @Override public PrimedTnt getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (PrimedTnt) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java index 1efb6f720f34fc6995ad7babcf13498062a175d1..c9d3dfe24b9d2d1447cee22c9f31b12ba6a10096 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java @@ -11,6 +11,7 @@ public class CraftTadpole extends CraftFish implements org.bukkit.entity.Tadpole @Override public Tadpole getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Tadpole) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java index d41b159e33fd09b892146b174b2c042a70e0c75c..1129cfdacaf508f70a13061aab463f38cb335b1d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java @@ -17,6 +17,7 @@ public class CraftTameableAnimal extends CraftAnimals implements Tameable, Creat @Override public TamableAnimal getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (TamableAnimal) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java index 36b40c84787aaa9df4eae4c88001c3b180132c26..bbbf2f7772db52eb21a7b687204143d933c648f6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java @@ -15,6 +15,7 @@ public class CraftTextDisplay extends CraftDisplay implements TextDisplay { @Override public net.minecraft.world.entity.Display.TextDisplay getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.Display.TextDisplay) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrowableProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrowableProjectile.java index f34b81ac5a1aade7f2ccc3b0df9cce2f8a06f4ea..75a25c4b297a2f74e5aad403ec76866616634fd1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrowableProjectile.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrowableProjectile.java @@ -14,6 +14,7 @@ public abstract class CraftThrowableProjectile extends CraftProjectile implement @Override public ThrowableItemProjectile getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ThrowableItemProjectile) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownExpBottle.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownExpBottle.java index 9e4b555450d456b6d3f38d2df9a6434f458fb307..376a6e36b2b4c2d363f06c3575f16669538c42dd 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownExpBottle.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownExpBottle.java @@ -12,6 +12,7 @@ public class CraftThrownExpBottle extends CraftThrowableProjectile implements Th @Override public ThrownExperienceBottle getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ThrownExperienceBottle) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownLingeringPotion.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownLingeringPotion.java index 8be9f69889cd7033c4165a29b8a2ca9cfa15ce44..c0a5e1c4d2879fe94ba14387b68870b13b7594ea 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownLingeringPotion.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownLingeringPotion.java @@ -18,6 +18,7 @@ public class CraftThrownLingeringPotion extends CraftThrownPotion implements Lin @Override public ThrownLingeringPotion getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ThrownLingeringPotion) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java index 61becdf5c4addd04e67b46d59ad4ad660f5c829a..4f0adba892966975cfd82bcc3a90ae548f139ff8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownPotion.java @@ -21,6 +21,7 @@ public abstract class CraftThrownPotion extends CraftThrowableProjectile impleme @Override public AbstractThrownPotion getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (AbstractThrownPotion) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownSplashPotion.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownSplashPotion.java index 8e7078878b625674f39119eacc636d9d7670e3da..1b354e3a63f664faf14086eaf14787e40a7d0015 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownSplashPotion.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftThrownSplashPotion.java @@ -18,6 +18,7 @@ public class CraftThrownSplashPotion extends CraftThrownPotion implements Splash @Override public ThrownSplashPotion getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ThrownSplashPotion) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTraderLlama.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTraderLlama.java index 174332208a0e286c874b5672e0da8ed9d42d5909..9bcd108f6983a60ce732e0882fabdb726a90058c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTraderLlama.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTraderLlama.java @@ -11,6 +11,7 @@ public class CraftTraderLlama extends CraftLlama implements TraderLlama { @Override public net.minecraft.world.entity.animal.horse.TraderLlama getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.horse.TraderLlama) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java index 6d4f7d5164ebd3e8d7ad1f10165e05f6df85aade..c77ba416178dcd1c15ef0d0713899697c3421040 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java @@ -14,6 +14,7 @@ public class CraftTrident extends CraftAbstractArrow implements Trident { @Override public ThrownTrident getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (ThrownTrident) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java index 6ec2e173c58fd4fb84c06fe84f67eb3ecc054e38..e68952de02771c6f31faac7540f129650499e201 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java @@ -12,6 +12,7 @@ public class CraftTropicalFish extends io.papermc.paper.entity.PaperSchoolableFi @Override public net.minecraft.world.entity.animal.TropicalFish getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.TropicalFish) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java index 3aae36e3bd039dd44d99bd47e921784f954c0992..fab9b68355636d82bd305307d2de14e7f51c2f3c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java @@ -12,6 +12,7 @@ public class CraftTurtle extends CraftAnimals implements Turtle { @Override public net.minecraft.world.entity.animal.Turtle getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.Turtle) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java index f561b45a20f0b9adac9deb671423f9ed57955789..37269f76b589f789b40b99ea79ddd6fe355c9d75 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java @@ -16,6 +16,7 @@ public class CraftVex extends CraftMonster implements Vex { @Override public net.minecraft.world.entity.monster.Vex getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Vex) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java index df332b6938b81822ba0436a7999ee448913e7c22..83575ea52471378f5363da19115873ba98317d40 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -30,6 +30,7 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { @Override public net.minecraft.world.entity.npc.Villager getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.npc.Villager) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java index c09a3e065bbbc3d922a3727d5dde3866a6eaae2a..40d253f958cdeb980e1c4b3a4e5b3c3eedca9158 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java @@ -16,6 +16,7 @@ public class CraftVillagerZombie extends CraftZombie implements ZombieVillager { @Override public net.minecraft.world.entity.monster.ZombieVillager getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.ZombieVillager) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVindicator.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVindicator.java index 4207a1cd7572b6156f73d98a7ed8ff12e93d54ce..559a10d9211542e9679126f3f52b5ade03c7d487 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVindicator.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVindicator.java @@ -11,6 +11,7 @@ public class CraftVindicator extends CraftIllager implements Vindicator { @Override public net.minecraft.world.entity.monster.Vindicator getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Vindicator) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java index e698cbf4f1e7733cac05ea9737e32dbef305b660..7ce7f3c183b22019b62671a056c19add6652fd7a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java @@ -12,6 +12,7 @@ public class CraftWanderingTrader extends CraftAbstractVillager implements Wande @Override public net.minecraft.world.entity.npc.WanderingTrader getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.npc.WanderingTrader) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java index 7a8f524e0c0dc3aae64f4ff21f2ef48e29848a29..356bb66a4b0b970ee0aacf3a8d90f93a4e28b969 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java @@ -17,6 +17,7 @@ public class CraftWarden extends CraftMonster implements org.bukkit.entity.Warde @Override public Warden getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (Warden) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java index be249743cb53d022ef74d5454b6656f0250ecba3..cc3c16de45f5e2040d8bd310432bd949c0bf47b6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java @@ -12,6 +12,7 @@ public class CraftWaterMob extends CraftCreature implements WaterMob { @Override public WaterAnimal getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (WaterAnimal) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWindCharge.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWindCharge.java index bb3301ff6a9305008a650824f4063699b2341bcc..2050ce6404683ec96949c41ed429f25abc50037b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWindCharge.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWindCharge.java @@ -11,6 +11,7 @@ public class CraftWindCharge extends CraftAbstractWindCharge implements WindChar @Override public net.minecraft.world.entity.projectile.windcharge.WindCharge getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.windcharge.WindCharge) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java index 007a11e4d617f7629b60230349fec8d5e8c169a6..a5c5cbdf8e825ae1afc9323267d9ccff9cfa854e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java @@ -15,6 +15,7 @@ public class CraftWitch extends CraftRaider implements Witch, com.destroystokyo. @Override public net.minecraft.world.entity.monster.Witch getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Witch) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java index 2e11df97e5c8ff5fbf22ba87946d6018ac8bbbed..52d50e0a83218957caf1eb64f9cd0ac204bf325f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java @@ -23,6 +23,7 @@ public class CraftWither extends CraftMonster implements Wither, com.destroystok @Override public WitherBoss getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (WitherBoss) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitherSkull.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitherSkull.java index 027849368189d1f28b26fe87c717b7a775b58dcb..54ff8cd5acd6b25b09c2ad1d54e8d6fce5ec8a32 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitherSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitherSkull.java @@ -11,6 +11,7 @@ public class CraftWitherSkull extends CraftFireball implements WitherSkull { @Override public net.minecraft.world.entity.projectile.WitherSkull getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.WitherSkull) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java index 723a8e659485850632adf173e52669e6e4f3fcc0..8276da4dee7e9bdbd0ae50a519d81c33f9c174f0 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java @@ -19,6 +19,7 @@ public class CraftWolf extends CraftTameableAnimal implements Wolf { @Override public net.minecraft.world.entity.animal.wolf.Wolf getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.animal.wolf.Wolf) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftZoglin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftZoglin.java index 583af956161dab331b14735a7bbf255d0d8c9588..475894ea8c13eb8b2e6bac4d711fce8b9a5b8f1f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftZoglin.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftZoglin.java @@ -11,6 +11,7 @@ public class CraftZoglin extends CraftMonster implements Zoglin { @Override public net.minecraft.world.entity.monster.Zoglin getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Zoglin) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftZombie.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftZombie.java index 9851c3890c9377d9fd1813f82766c2841ae48fd4..034b210ca024dcb3d9f59f1cdeef8c16c2cadccf 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftZombie.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftZombie.java @@ -14,6 +14,7 @@ public class CraftZombie extends CraftMonster implements Zombie { @Override public net.minecraft.world.entity.monster.Zombie getHandle() { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.monster.Zombie) this.entity; } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 49ce3fdcb8f3f6125e60bf667d79f23cc1629085..00416e0fe016b1e6502a0b57ffc623c68e8f2893 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -819,7 +819,7 @@ public class CraftEventFactory { return false; } - public static BlockPos sourceBlockOverride = null; // SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPos up to five methods deep. + public static final ThreadLocal sourceBlockOverrideRT = new ThreadLocal<>(); // SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPos up to five methods deep. // Folia - region threading public static boolean handleBlockSpreadEvent(LevelAccessor world, BlockPos source, BlockPos target, net.minecraft.world.level.block.state.BlockState state, int flags) { return handleBlockSpreadEvent(world, source, target, state, flags, false); @@ -835,7 +835,7 @@ public class CraftEventFactory { CraftBlockState snapshot = CraftBlockStates.getBlockState(world, target); snapshot.setData(state); - BlockSpreadEvent event = new BlockSpreadEvent(snapshot.getBlock(), CraftBlock.at(world, CraftEventFactory.sourceBlockOverride != null ? CraftEventFactory.sourceBlockOverride : source), snapshot); + BlockSpreadEvent event = new BlockSpreadEvent(snapshot.getBlock(), CraftBlock.at(world, CraftEventFactory.sourceBlockOverrideRT.get() != null ? CraftEventFactory.sourceBlockOverrideRT.get() : source), snapshot); // Folia - region threading if (event.callEvent()) { boolean result = snapshot.place(flags); return !checkSetResult || result; diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java index 1354ccfbf525e5e64483ac5f443cc2325ba63850..fad85bea8643a3a88ec5c4194de7a5060e81c136 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java @@ -514,6 +514,7 @@ public class CraftScheduler implements BukkitScheduler { } protected CraftTask handle(final CraftTask task, final long delay) { // Paper + if (true) throw new UnsupportedOperationException(); // Folia - region threading // Paper start if (!this.isAsyncScheduler && !task.isSync()) { this.asyncScheduler.handle(task, delay); diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java index f2878a49fdca9725854bc6ce88031f8a611c96e4..b959fe4311fc6cbae3dcc052ef4710f8c8aefec6 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java @@ -32,6 +32,7 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard { @Override public Objective registerNewObjective(String name, Criteria criteria, net.kyori.adventure.text.Component displayName, RenderType renderType) throws IllegalArgumentException { + if (true) throw new UnsupportedOperationException(); // Folia - not supported yet if (displayName == null) { displayName = net.kyori.adventure.text.Component.empty(); } @@ -177,6 +178,7 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard { @Override public Team registerNewTeam(String name) { + if (true) throw new UnsupportedOperationException(); // Folia - not supported yet Preconditions.checkArgument(name != null, "Team name cannot be null"); Preconditions.checkArgument(name.length() <= Short.MAX_VALUE, "Team name '%s' is longer than the limit of 32767 characters (%s)", name, name.length()); Preconditions.checkArgument(this.getHandle().getPlayerTeam(name) == null, "Team name '%s' is already in use", name); @@ -204,6 +206,7 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard { @Override public void clearSlot(DisplaySlot slot) { + if (true) throw new UnsupportedOperationException(); // Folia - not supported yet Preconditions.checkArgument(slot != null, "Slot cannot be null"); this.getHandle().setDisplayObjective(CraftScoreboardTranslations.fromBukkitSlot(slot), null); } diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java index 582cdc9e028c882dad0504fef4afd5a86f0f8431..c4a5769bd3d27a7d56e0fd29856d824794aa6c2e 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java @@ -39,6 +39,7 @@ public final class CraftScoreboardManager implements ScoreboardManager { @Override public CraftScoreboard getNewScoreboard() { + if (true) throw new UnsupportedOperationException(); // Folia - not supported yet org.spigotmc.AsyncCatcher.catchOp("scoreboard creation"); // Spigot CraftScoreboard scoreboard = new CraftScoreboard(new ServerScoreboard(this.server)); if (io.papermc.paper.configuration.GlobalConfiguration.get().scoreboards.trackPluginScoreboards) { @@ -59,6 +60,7 @@ public final class CraftScoreboardManager implements ScoreboardManager { } public void setPlayerBoard(CraftPlayer player, CraftScoreboard scoreboard) { + if (true) throw new UnsupportedOperationException(); // Folia - not supported yet net.minecraft.world.scores.Scoreboard oldBoard = this.getPlayerBoard(player).getHandle(); net.minecraft.world.scores.Scoreboard newBoard = scoreboard.getHandle(); if (oldBoard == newBoard) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index c1aad9203af20102e560571435dfa75150b37c1b..679529d94c16960527e5d76adb61c7e536f55d3e 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -366,6 +366,12 @@ public final class CraftMagicNumbers implements UnsafeValues { throw new InvalidPluginException("Unsupported API version " + descriptionFile.getAPIVersion()); } + // Folia start - block plugins not marked as supported + if (!descriptionFile.isFoliaSupported()) { + throw new InvalidPluginException("Plugin " + descriptionFile.getFullName() + " is not marked as supporting regionised multithreading"); + } + // Folia end - block plugins not marked as supported + if (toCheck.isOlderThan(minimumVersion)) { // Older than supported throw new InvalidPluginException("Plugin API version " + descriptionFile.getAPIVersion() + " is lower than the minimum allowed version. Please update or replace it."); diff --git a/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java index 0e14f962b26823e49b192a4f97ec6c1f477ef0ff..4c01cff04b48ae93081f72558b71f9f695b97c59 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java +++ b/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java @@ -66,6 +66,13 @@ public abstract class DelegatedGeneratorAccess implements WorldGenLevel { this.delegate = delegate; } + // Folia start - region threading + @Override + public net.minecraft.world.level.StructureManager structureManager() { + return this.delegate.structureManager(); + } + // Folia end - region threading + public WorldGenLevel getDelegate() { return this.delegate; } @@ -793,4 +800,3 @@ public abstract class DelegatedGeneratorAccess implements WorldGenLevel { return this.delegate.getChunkIfLoadedImmediately(x, z); } } - diff --git a/src/main/java/org/spigotmc/SpigotCommand.java b/src/main/java/org/spigotmc/SpigotCommand.java index 1b60abf5f5951288f6d54f522621472673eada6e..4ea06cb7a9e9db0d7feb0981de90015320c092d4 100644 --- a/src/main/java/org/spigotmc/SpigotCommand.java +++ b/src/main/java/org/spigotmc/SpigotCommand.java @@ -35,6 +35,7 @@ public class SpigotCommand extends Command { .build() ); + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading MinecraftServer console = MinecraftServer.getServer(); org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); for (ServerLevel world : console.getAllLevels()) { @@ -43,6 +44,7 @@ public class SpigotCommand extends Command { console.server.reloadCount++; Command.broadcastCommandMessage(sender, text("Reload complete.", NamedTextColor.GREEN)); + }); // Folia - region threading } return true; diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java index ba539e6a37eba4bcee5061b6012829027102d740..d6661b132a2363761f06a8b8d6561dcb6d3ecd5e 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -183,7 +183,7 @@ public class SpigotConfig { SpigotConfig.restartOnCrash = SpigotConfig.getBoolean("settings.restart-on-crash", SpigotConfig.restartOnCrash); SpigotConfig.restartScript = SpigotConfig.getString("settings.restart-script", SpigotConfig.restartScript); SpigotConfig.restartMessage = SpigotConfig.transform(SpigotConfig.getString("messages.restart", "Server is restarting")); - SpigotConfig.commands.put("restart", new RestartCommand("restart")); + //SpigotConfig.commands.put("restart", new RestartCommand("restart")); // Folia - region threading } public static boolean bungee; @@ -229,7 +229,7 @@ public class SpigotConfig { } private static void tpsCommand() { - SpigotConfig.commands.put("tps", new TicksPerSecondCommand("tps")); + //SpigotConfig.commands.put("tps", new TicksPerSecondCommand("tps")); // Folia - region threading } public static int playerSample; diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java index 43c6240ec2855c0f668ce04de29d22a223d2612f..db90ec10300a0541162d456566479299a7eec3a4 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java @@ -393,7 +393,7 @@ public class SpigotWorldConfig { this.otherMultiplier = (float) this.getDouble("hunger.other-multiplier", 0.0); } - public int currentPrimedTnt = 0; + //public int currentPrimedTnt = 0; // Folia - region threading - moved to regionised world data public int maxTntTicksPerTick; private void maxTntPerTick() { if (SpigotConfig.version < 7) { diff --git a/src/test/java/io/papermc/paper/plugin/TestPluginMeta.java b/src/test/java/io/papermc/paper/plugin/TestPluginMeta.java index ba271c35eb2804f94cfc893bf94affb9ae13d3ba..db9285c2ff0c805f5d9564b6e8520c33ea5bb65a 100644 --- a/src/test/java/io/papermc/paper/plugin/TestPluginMeta.java +++ b/src/test/java/io/papermc/paper/plugin/TestPluginMeta.java @@ -20,6 +20,13 @@ public class TestPluginMeta implements PluginMeta { this.identifier = identifier; } + // Folia start - region threading + @Override + public boolean isFoliaSupported() { + return true; + } + // Folia end - region threading + @Override public @NotNull String getName() { return this.identifier;