diff --git a/pom.xml b/pom.xml
index 0e2f36e..b23ab2d 100755
--- a/pom.xml
+++ b/pom.xml
@@ -82,7 +82,7 @@
paper-repo
- https://papermc.io/repo/repository/maven-public/
+ https://repo.papermc.io/repository/maven-public/
codemc-repo
@@ -100,9 +100,9 @@
bukkit: org.bukkit
-->
- io.papermc.paper
- paper-api
- 1.19-R0.1-SNAPSHOT
+ dev.folia
+ folia-api
+ 1.19.4-R0.1-SNAPSHOT
provided
diff --git a/src/main/java/net/coreprotect/CoreProtect.java b/src/main/java/net/coreprotect/CoreProtect.java
index c7300dc..ba9d9ea 100755
--- a/src/main/java/net/coreprotect/CoreProtect.java
+++ b/src/main/java/net/coreprotect/CoreProtect.java
@@ -21,6 +21,7 @@ import net.coreprotect.listener.player.PlayerQuitListener;
import net.coreprotect.paper.PaperAdapter;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.thread.NetworkHandler;
+import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Color;
import net.coreprotect.utility.Util;
@@ -94,7 +95,7 @@ public final class CoreProtect extends JavaPlugin {
Chat.console(Phrase.build(Phrase.LINK_DISCORD, "www.coreprotect.net/discord/"));
Chat.console("--------------------");
- getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
+ Scheduler.scheduleSyncDelayedTask(this, () -> {
try {
Thread networkHandler = new Thread(new NetworkHandler(true, true));
networkHandler.start();
diff --git a/src/main/java/net/coreprotect/config/Config.java b/src/main/java/net/coreprotect/config/Config.java
index 3c67fd3..d0500a7 100644
--- a/src/main/java/net/coreprotect/config/Config.java
+++ b/src/main/java/net/coreprotect/config/Config.java
@@ -20,6 +20,7 @@ import org.bukkit.World;
import net.coreprotect.CoreProtect;
import net.coreprotect.language.Language;
+import net.coreprotect.thread.Scheduler;
public class Config extends Language {
@@ -383,7 +384,7 @@ public class Config extends Language {
// for now this solution is good enough to ensure we only modify on the main thread
final CompletableFuture complete = new CompletableFuture<>();
- Bukkit.getScheduler().runTask(CoreProtect.getInstance(), () -> {
+ Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
parseConfig(data);
}
diff --git a/src/main/java/net/coreprotect/config/ConfigHandler.java b/src/main/java/net/coreprotect/config/ConfigHandler.java
index 3d60e8e..4d1f7a7 100644
--- a/src/main/java/net/coreprotect/config/ConfigHandler.java
+++ b/src/main/java/net/coreprotect/config/ConfigHandler.java
@@ -55,6 +55,7 @@ public class ConfigHandler extends Queue {
public static HikariDataSource hikariDataSource = null;
public static final boolean isSpigot = Util.isSpigot();
public static final boolean isPaper = Util.isPaper();
+ public static final boolean isFolia = Util.isFolia();
public static volatile boolean serverRunning = false;
public static volatile boolean converterRunning = false;
public static volatile boolean purgeRunning = false;
diff --git a/src/main/java/net/coreprotect/consumer/Queue.java b/src/main/java/net/coreprotect/consumer/Queue.java
index caed20c..660a058 100755
--- a/src/main/java/net/coreprotect/consumer/Queue.java
+++ b/src/main/java/net/coreprotect/consumer/Queue.java
@@ -24,6 +24,7 @@ import net.coreprotect.config.ConfigHandler;
import net.coreprotect.consumer.process.Process;
import net.coreprotect.listener.block.BlockUtil;
import net.coreprotect.model.BlockGroup;
+import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
public class Queue {
@@ -85,7 +86,7 @@ public class Queue {
}
protected static void queueBlockBreakValidate(final String user, final Block block, final BlockState blockState, final Material type, final String blockData, final int extraData, int ticks) {
- Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
+ Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
if (!block.getType().equals(type)) {
queueBlockBreak(user, blockState, type, blockData, null, extraData, 0);
@@ -94,7 +95,7 @@ public class Queue {
catch (Exception e) {
e.printStackTrace();
}
- }, ticks);
+ }, block.getLocation(), ticks);
}
protected static void queueBlockBreak(String user, BlockState block, Material type, String blockData, Material breakType, int extraData, int blockNumber) {
@@ -178,18 +179,18 @@ public class Queue {
}
protected static void queueBlockPlaceDelayed(final String user, final Location placed, final Material type, final String blockData, final BlockState replaced, int ticks) {
- Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
+ Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
queueBlockPlace(user, placed.getBlock().getState(), type, replaced, null, -1, 0, blockData);
}
catch (Exception e) {
e.printStackTrace();
}
- }, ticks);
+ }, placed, ticks);
}
protected static void queueBlockPlaceValidate(final String user, final BlockState blockLocation, final Block block, final BlockState blockReplaced, final Material forceT, final int forceD, final int forceData, final String blockData, int ticks) {
- Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
+ Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
Material blockType = block.getType();
if (blockType.equals(forceT)) {
@@ -204,11 +205,11 @@ public class Queue {
catch (Exception e) {
e.printStackTrace();
}
- }, ticks);
+ }, blockLocation.getLocation(), ticks);
}
protected static void queueBlockGravityValidate(final String user, final Location location, final Block block, final Material blockType, int ticks) {
- Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
+ Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
Block placementBlock = BlockUtil.gravityScan(location, blockType, user);
if (!block.equals(placementBlock)) {
@@ -218,7 +219,7 @@ public class Queue {
catch (Exception e) {
e.printStackTrace();
}
- }, ticks);
+ }, location, ticks);
}
protected static void queueContainerBreak(String user, Location location, Material type, ItemStack[] oldInventory) {
diff --git a/src/main/java/net/coreprotect/database/ContainerRollback.java b/src/main/java/net/coreprotect/database/ContainerRollback.java
index 14e1e7b..61ea742 100644
--- a/src/main/java/net/coreprotect/database/ContainerRollback.java
+++ b/src/main/java/net/coreprotect/database/ContainerRollback.java
@@ -6,7 +6,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
-import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -24,6 +23,7 @@ import net.coreprotect.consumer.Queue;
import net.coreprotect.consumer.process.Process;
import net.coreprotect.language.Phrase;
import net.coreprotect.model.BlockGroup;
+import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Util;
@@ -46,9 +46,9 @@ public class ContainerRollback extends Queue {
Queue.queueRollbackUpdate(userString, location, lookupList, Process.CONTAINER_ROLLBACK_UPDATE, rollbackType); // Perform update transaction in consumer
final String finalUserString = userString;
- ConfigHandler.rollbackHash.put(userString, new int[] { 0, 0, 0, 0 });
+ ConfigHandler.rollbackHash.put(userString, new int[] { 0, 0, 0, 0, 0 });
- Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), new Runnable() {
+ Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), new Runnable() {
@Override
public void run() {
try {
@@ -140,13 +140,13 @@ public class ContainerRollback extends Queue {
}
matchingFrames.clear();
- ConfigHandler.rollbackHash.put(finalUserString, new int[] { itemCount, modifyCount, entityCount, 1 });
+ ConfigHandler.rollbackHash.put(finalUserString, new int[] { itemCount, modifyCount, entityCount, 1, 1 });
}
catch (Exception e) {
e.printStackTrace();
}
}
- }, 0);
+ }, location, 0);
int[] rollbackHashData = ConfigHandler.rollbackHash.get(finalUserString);
int next = rollbackHashData[3];
diff --git a/src/main/java/net/coreprotect/database/Rollback.java b/src/main/java/net/coreprotect/database/Rollback.java
index 84b599c..b5b76c2 100644
--- a/src/main/java/net/coreprotect/database/Rollback.java
+++ b/src/main/java/net/coreprotect/database/Rollback.java
@@ -10,6 +10,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -90,6 +91,7 @@ import net.coreprotect.language.Phrase;
import net.coreprotect.language.Selector;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.thread.CacheHandler;
+import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.ChestTool;
import net.coreprotect.utility.Color;
@@ -145,9 +147,10 @@ public class Rollback extends Queue {
itemList = Lookup.performLookupRaw(statement, user, checkUuids, checkUsers, itemRestrictList, itemExcludeList, excludeUserList, itemActionList, location, radius, null, startTime, endTime, -1, -1, restrictWorld, lookup);
}
+ LinkedHashSet worldList = new LinkedHashSet<>();
TreeMap chunkList = new TreeMap<>();
- HashMap> dataList = new HashMap<>();
- HashMap> itemDataList = new HashMap<>();
+ HashMap>> dataList = new HashMap<>();
+ HashMap>> itemDataList = new HashMap<>();
boolean inventoryRollback = actionList.contains(11);
/*
@@ -216,33 +219,43 @@ public class Rollback extends Queue {
UserStatement.loadName(statement.getConnection(), userId);
}
- HashMap> modifyList = dataList;
+ HashMap>> modifyList = dataList;
if (listC == 1) {
modifyList = itemDataList;
}
- if (modifyList.get(chunkKey) == null) {
- // Integer[][] chunkSections = new Integer[((worldMax - worldMin) >> 4)][];
- // adjacentDataList.put(chunkKey, chunkSections);
- dataList.put(chunkKey, new ArrayList<>());
- itemDataList.put(chunkKey, new ArrayList<>());
+ if (modifyList.get(rowWorldId) == null) {
+ dataList.put(rowWorldId, new HashMap<>());
+ itemDataList.put(rowWorldId, new HashMap<>());
+ worldList.add(rowWorldId);
}
- modifyList.get(chunkKey).add(result);
+ if (modifyList.get(rowWorldId).get(chunkKey) == null) {
+ // Integer[][] chunkSections = new Integer[((worldMax - worldMin) >> 4)][];
+ // adjacentDataList.put(chunkKey, chunkSections);
+ dataList.get(rowWorldId).put(chunkKey, new ArrayList<>());
+ itemDataList.get(rowWorldId).put(chunkKey, new ArrayList<>());
+ }
+
+ modifyList.get(rowWorldId).get(chunkKey).add(result);
}
listC++;
}
if (rollbackType == 1) { // Restore
- Iterator>> dlIterator = dataList.entrySet().iterator();
+ Iterator>>> dlIterator = dataList.entrySet().iterator();
while (dlIterator.hasNext()) {
- Collections.reverse(dlIterator.next().getValue());
+ for (ArrayList