diff --git a/orebfuscator-api-example/pom.xml b/orebfuscator-api-example/pom.xml
index 2e28ad52d..80d361655 100644
--- a/orebfuscator-api-example/pom.xml
+++ b/orebfuscator-api-example/pom.xml
@@ -13,17 +13,26 @@
jar
-
- org.spigotmc
- spigot-api
- 1.18-R0.1-SNAPSHOT
- provided
-
net.imprex
orebfuscator-api
${revision}
provided
+
+ dev.folia
+ folia-api
+ 1.21.4-R0.1-SNAPSHOT
+ provided
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
\ No newline at end of file
diff --git a/orebfuscator-api-example/src/main/resources/plugin.yml b/orebfuscator-api-example/src/main/resources/plugin.yml
index 8427f0e94..666249853 100644
--- a/orebfuscator-api-example/src/main/resources/plugin.yml
+++ b/orebfuscator-api-example/src/main/resources/plugin.yml
@@ -1,6 +1,7 @@
-api-version: 1.18
+api-version: 1.21
+folia-supported: true
-name: orebfuscator-api-example
+name: ${project.name}
version: ${project.version}
main: net.imprex.api.example.Example
diff --git a/orebfuscator-api/pom.xml b/orebfuscator-api/pom.xml
index 024f90002..45ac76a23 100644
--- a/orebfuscator-api/pom.xml
+++ b/orebfuscator-api/pom.xml
@@ -16,7 +16,7 @@
org.spigotmc
spigot-api
- 1.9.4-R0.1-SNAPSHOT
+ ${dependency.bukkit.version}
provided
diff --git a/orebfuscator-api/src/main/java/net/imprex/orebfuscator/api/OrebfuscatorService.java b/orebfuscator-api/src/main/java/net/imprex/orebfuscator/api/OrebfuscatorService.java
index 8fdeb8e25..bc55fbefe 100644
--- a/orebfuscator-api/src/main/java/net/imprex/orebfuscator/api/OrebfuscatorService.java
+++ b/orebfuscator-api/src/main/java/net/imprex/orebfuscator/api/OrebfuscatorService.java
@@ -12,7 +12,7 @@
*
*
* All calls to this service are expected to originate from the servers
- * main-thread.
+ * main-thread or in case of folia from a region thread (never the global region thread).
*
*
* @since 5.2.0
diff --git a/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/OrebfuscatorCompatibility.java b/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/OrebfuscatorCompatibility.java
index c5f8cd5d0..3c87f7b28 100644
--- a/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/OrebfuscatorCompatibility.java
+++ b/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/OrebfuscatorCompatibility.java
@@ -45,6 +45,10 @@ public static void initialize(Plugin plugin, Config config) {
OFCLogger.debug("Compatibility layer successfully loaded");
}
+ public static boolean isGameThread() {
+ return instance.isGameThread();
+ }
+
public static void runForPlayer(Player player, Runnable runnable) {
instance.getScheduler().runForPlayer(player, runnable);
}
diff --git a/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/compatibility/CompatibilityLayer.java b/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/compatibility/CompatibilityLayer.java
index 0da2a4ab5..15db93d1e 100644
--- a/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/compatibility/CompatibilityLayer.java
+++ b/orebfuscator-compatibility/orebfuscator-compatibility-api/src/main/java/net/imprex/orebfuscator/compatibility/CompatibilityLayer.java
@@ -9,6 +9,8 @@
public interface CompatibilityLayer {
+ boolean isGameThread();
+
CompatibilityScheduler getScheduler();
CompletableFuture getNeighboringChunks(World world, ChunkPosition position);
diff --git a/orebfuscator-compatibility/orebfuscator-compatibility-bukkit/src/main/java/net/imprex/orebfuscator/compatibility/bukkit/BukkitCompatibilityLayer.java b/orebfuscator-compatibility/orebfuscator-compatibility-bukkit/src/main/java/net/imprex/orebfuscator/compatibility/bukkit/BukkitCompatibilityLayer.java
index e1f04579a..6cd899e8f 100644
--- a/orebfuscator-compatibility/orebfuscator-compatibility-bukkit/src/main/java/net/imprex/orebfuscator/compatibility/bukkit/BukkitCompatibilityLayer.java
+++ b/orebfuscator-compatibility/orebfuscator-compatibility-bukkit/src/main/java/net/imprex/orebfuscator/compatibility/bukkit/BukkitCompatibilityLayer.java
@@ -13,6 +13,8 @@
public class BukkitCompatibilityLayer implements CompatibilityLayer {
+ private final Thread mainThread = Thread.currentThread();
+
private final BukkitScheduler scheduler;
private final BukkitChunkLoader chunkLoader;
@@ -21,6 +23,11 @@ public BukkitCompatibilityLayer(Plugin plugin, Config config) {
this.chunkLoader = new BukkitChunkLoader(plugin, config);
}
+ @Override
+ public boolean isGameThread() {
+ return Thread.currentThread() == this.mainThread;
+ }
+
@Override
public CompatibilityScheduler getScheduler() {
return this.scheduler;
diff --git a/orebfuscator-compatibility/orebfuscator-compatibility-folia/src/main/java/net/imprex/orebfuscator/compatibility/folia/FoliaCompatibilityLayer.java b/orebfuscator-compatibility/orebfuscator-compatibility-folia/src/main/java/net/imprex/orebfuscator/compatibility/folia/FoliaCompatibilityLayer.java
index 51225e485..fc0a3906d 100644
--- a/orebfuscator-compatibility/orebfuscator-compatibility-folia/src/main/java/net/imprex/orebfuscator/compatibility/folia/FoliaCompatibilityLayer.java
+++ b/orebfuscator-compatibility/orebfuscator-compatibility-folia/src/main/java/net/imprex/orebfuscator/compatibility/folia/FoliaCompatibilityLayer.java
@@ -8,12 +8,27 @@
public class FoliaCompatibilityLayer extends AbstractPaperCompatibilityLayer {
+ private static final Class> TICK_THREAD_CLASS = getTickThreadClass();
+
+ private static Class> getTickThreadClass() {
+ try {
+ return Class.forName("io.papermc.paper.threadedregions.TickRegionScheduler$TickThreadRunner");
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException("Can't find tick thread class for folia", e);
+ }
+ }
+
private final FoliaScheduler scheduler;
public FoliaCompatibilityLayer(Plugin plugin, Config config) {
this.scheduler = new FoliaScheduler(plugin);
}
+ @Override
+ public boolean isGameThread() {
+ return TICK_THREAD_CLASS.isInstance(Thread.currentThread());
+ }
+
@Override
public CompatibilityScheduler getScheduler() {
return this.scheduler;
diff --git a/orebfuscator-compatibility/orebfuscator-compatibility-paper/src/main/java/net/imprex/orebfuscator/compatibility/paper/PaperCompatibilityLayer.java b/orebfuscator-compatibility/orebfuscator-compatibility-paper/src/main/java/net/imprex/orebfuscator/compatibility/paper/PaperCompatibilityLayer.java
index abd607e37..99a2bafd8 100644
--- a/orebfuscator-compatibility/orebfuscator-compatibility-paper/src/main/java/net/imprex/orebfuscator/compatibility/paper/PaperCompatibilityLayer.java
+++ b/orebfuscator-compatibility/orebfuscator-compatibility-paper/src/main/java/net/imprex/orebfuscator/compatibility/paper/PaperCompatibilityLayer.java
@@ -8,12 +8,19 @@
public class PaperCompatibilityLayer extends AbstractPaperCompatibilityLayer {
+ private final Thread mainThread = Thread.currentThread();
+
private final BukkitScheduler scheduler;
public PaperCompatibilityLayer(Plugin plugin, Config config) {
this.scheduler = new BukkitScheduler(plugin);
}
+ @Override
+ public boolean isGameThread() {
+ return Thread.currentThread() == this.mainThread;
+ }
+
@Override
public CompatibilityScheduler getScheduler() {
return this.scheduler;
diff --git a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/DefaultOrebfuscatorService.java b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/DefaultOrebfuscatorService.java
index 421606b43..1839662f4 100644
--- a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/DefaultOrebfuscatorService.java
+++ b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/DefaultOrebfuscatorService.java
@@ -11,18 +11,16 @@
public final class DefaultOrebfuscatorService implements OrebfuscatorService {
- private final Orebfuscator orebfuscator;
private final ObfuscationSystem obfuscationSystem;
public DefaultOrebfuscatorService(Orebfuscator orebfuscator) {
- this.orebfuscator = orebfuscator;
this.obfuscationSystem = orebfuscator.getObfuscationSystem();
}
@Override
public final void deobfuscate(Collection extends Block> blocks) {
- if (!this.orebfuscator.isGameThread()) {
- throw new IllegalStateException("Asynchronous deobfuscation!");
+ if (!OrebfuscatorCompatibility.isGameThread()) {
+ throw new IllegalStateException("Asynchronous deobfuscation! " + Thread.currentThread());
} else if (blocks == null || blocks.isEmpty()) {
throw new IllegalArgumentException("block list is null or empty");
}
diff --git a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/Orebfuscator.java b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/Orebfuscator.java
index 9eecdaa94..6522c2c69 100644
--- a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/Orebfuscator.java
+++ b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/Orebfuscator.java
@@ -25,8 +25,6 @@ public class Orebfuscator extends JavaPlugin implements Listener {
public static final ThreadGroup THREAD_GROUP = new ThreadGroup("orebfuscator");
- private final Thread mainThread = Thread.currentThread();
-
private OrebfuscatorStatistics statistics;
private OrebfuscatorConfig config;
private OrebfuscatorPlayerMap playerMap;
@@ -137,10 +135,6 @@ public void onEnableFailed(Listener listener, Event event) {
}
}
- public boolean isGameThread() {
- return Thread.currentThread() == this.mainThread;
- }
-
public OrebfuscatorStatistics getStatistics() {
return statistics;
}
diff --git a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/cache/ObfuscationCache.java b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/cache/ObfuscationCache.java
index ec2313257..2e8649160 100644
--- a/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/cache/ObfuscationCache.java
+++ b/orebfuscator-plugin/src/main/java/net/imprex/orebfuscator/cache/ObfuscationCache.java
@@ -17,7 +17,6 @@
public class ObfuscationCache {
- private final Orebfuscator orebfuscator;
private final CacheConfig cacheConfig;
private final OrebfuscatorStatistics statistics;
@@ -25,7 +24,6 @@ public class ObfuscationCache {
private final AsyncChunkSerializer serializer;
public ObfuscationCache(Orebfuscator orebfuscator) {
- this.orebfuscator = orebfuscator;
this.cacheConfig = orebfuscator.getOrebfuscatorConfig().cache();
this.statistics = orebfuscator.getStatistics();
@@ -52,7 +50,7 @@ private void onRemoval(RemovalNotification