mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-19 15:09:18 +00:00
make studio tools work on folia
This commit is contained in:
@@ -78,9 +78,10 @@ dependencies {
|
|||||||
// Dynamically Loaded
|
// Dynamically Loaded
|
||||||
slim(libs.paralithic)
|
slim(libs.paralithic)
|
||||||
slim(libs.paperlib)
|
slim(libs.paperlib)
|
||||||
slim(libs.adventure.api)
|
|
||||||
slim(libs.adventure.minimessage)
|
slim(libs.adventure.minimessage)
|
||||||
slim(libs.adventure.platform)
|
slim(libs.adventure.platform)
|
||||||
|
slim(libs.adventure.gson)
|
||||||
|
slim(libs.adventure.legacy)
|
||||||
slim(libs.bstats)
|
slim(libs.bstats)
|
||||||
slim(libs.sentry)
|
slim(libs.sentry)
|
||||||
|
|
||||||
@@ -112,6 +113,11 @@ dependencies {
|
|||||||
slim(libs.mavenCore)
|
slim(libs.mavenCore)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constraints {
|
||||||
|
slim(libs.gson)
|
||||||
|
compileOnly(libs.gson)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
@@ -135,8 +141,7 @@ slimJar {
|
|||||||
))
|
))
|
||||||
|
|
||||||
relocate("com.dfsek.paralithic", "$lib.paralithic")
|
relocate("com.dfsek.paralithic", "$lib.paralithic")
|
||||||
relocate("io.papermc.lib", "$lib.paper")
|
relocate("net.kyori.audience", "$lib.audience")
|
||||||
relocate("net.kyori", "$lib.kyori")
|
|
||||||
relocate("org.bstats", "$lib.metrics")
|
relocate("org.bstats", "$lib.metrics")
|
||||||
relocate("io.sentry", "$lib.sentry")
|
relocate("io.sentry", "$lib.sentry")
|
||||||
relocate("org.apache.maven", "$lib.maven")
|
relocate("org.apache.maven", "$lib.maven")
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ public class CommandObject implements DecreeExecutor {
|
|||||||
public Engine getEngine() {
|
public Engine getEngine() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
};
|
}.sync(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Decree(description = "Check the composition of an object")
|
@Decree(description = "Check the composition of an object")
|
||||||
|
|||||||
@@ -47,18 +47,14 @@ import com.volmit.iris.util.io.IO;
|
|||||||
import com.volmit.iris.util.json.JSONArray;
|
import com.volmit.iris.util.json.JSONArray;
|
||||||
import com.volmit.iris.util.json.JSONObject;
|
import com.volmit.iris.util.json.JSONObject;
|
||||||
import com.volmit.iris.util.mantle.MantleChunk;
|
import com.volmit.iris.util.mantle.MantleChunk;
|
||||||
import com.volmit.iris.util.math.M;
|
import com.volmit.iris.util.math.*;
|
||||||
import com.volmit.iris.util.math.Position2;
|
|
||||||
import com.volmit.iris.util.math.RNG;
|
|
||||||
import com.volmit.iris.util.math.Spiraler;
|
|
||||||
import com.volmit.iris.util.noise.CNG;
|
import com.volmit.iris.util.noise.CNG;
|
||||||
import com.volmit.iris.util.parallel.MultiBurst;
|
import com.volmit.iris.util.parallel.MultiBurst;
|
||||||
import com.volmit.iris.util.parallel.SyncExecutor;
|
|
||||||
import com.volmit.iris.util.plugin.VolmitSender;
|
import com.volmit.iris.util.plugin.VolmitSender;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
||||||
import com.volmit.iris.util.scheduling.jobs.ParallelQueueJob;
|
import com.volmit.iris.util.scheduling.jobs.ParallelQueueJob;
|
||||||
import io.papermc.lib.PaperLib;
|
import de.crazydev22.platformutils.scheduler.task.Task;
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.InventoryType;
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
@@ -77,6 +73,7 @@ import java.time.temporal.ChronoUnit;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@@ -174,7 +171,7 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
PlatformChunkGenerator plat = IrisToolbelt.access(world);
|
PlatformChunkGenerator plat = IrisToolbelt.access(world);
|
||||||
Engine engine = plat.getEngine();
|
Engine engine = plat.getEngine();
|
||||||
DecreeContext.touch(sender);
|
DecreeContext.touch(sender);
|
||||||
try (SyncExecutor executor = new SyncExecutor(20)) {
|
try (var executor = Iris.platform.createRegionExecutor(20)) {
|
||||||
int x = loc.getBlockX() >> 4;
|
int x = loc.getBlockX() >> 4;
|
||||||
int z = loc.getBlockZ() >> 4;
|
int z = loc.getBlockZ() >> 4;
|
||||||
|
|
||||||
@@ -376,7 +373,7 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
var loc = player.getLocation();
|
var loc = player.getLocation();
|
||||||
int totalTasks = d * d;
|
int totalTasks = d * d;
|
||||||
AtomicInteger completedTasks = new AtomicInteger(0);
|
AtomicInteger completedTasks = new AtomicInteger(0);
|
||||||
int c = J.ar(() -> sender.sendProgress((double) completedTasks.get() / totalTasks, "Finding regions"), 0);
|
Task c = J.ar(() -> sender.sendProgress((double) completedTasks.get() / totalTasks, "Finding regions"), 0);
|
||||||
new Spiraler(d, d, (x, z) -> executor.queue(() -> {
|
new Spiraler(d, d, (x, z) -> executor.queue(() -> {
|
||||||
var region = engine.getRegion((x << 4) + 8, (z << 4) + 8);
|
var region = engine.getRegion((x << 4) + 8, (z << 4) + 8);
|
||||||
data.computeIfAbsent(region.getLoadKey(), (k) -> new AtomicInteger(0))
|
data.computeIfAbsent(region.getLoadKey(), (k) -> new AtomicInteger(0))
|
||||||
@@ -385,7 +382,7 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
})).setOffset(loc.getBlockX(), loc.getBlockZ()).drain();
|
})).setOffset(loc.getBlockX(), loc.getBlockZ()).drain();
|
||||||
executor.complete();
|
executor.complete();
|
||||||
multiBurst.close();
|
multiBurst.close();
|
||||||
J.car(c);
|
c.cancel();
|
||||||
|
|
||||||
sender.sendMessage(C.GREEN + "Done!");
|
sender.sendMessage(C.GREEN + "Done!");
|
||||||
var loader = engine.getData().getRegionLoader();
|
var loader = engine.getData().getRegionLoader();
|
||||||
@@ -718,7 +715,7 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Decree(aliases = "find-objects", description = "Get information about nearby structures")
|
@Decree(aliases = "find-objects", description = "Get information about nearby structures", origin = DecreeOrigin.PLAYER)
|
||||||
public void objects() {
|
public void objects() {
|
||||||
if (!IrisToolbelt.isIrisWorld(player().getWorld())) {
|
if (!IrisToolbelt.isIrisWorld(player().getWorld())) {
|
||||||
sender().sendMessage(C.RED + "You must be in an Iris world");
|
sender().sendMessage(C.RED + "You must be in an Iris world");
|
||||||
@@ -731,21 +728,29 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
sender().sendMessage("You must be in an iris world.");
|
sender().sendMessage("You must be in an iris world.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
KList<Chunk> chunks = new KList<>();
|
KMap<Position2, CompletableFuture<Chunk>> chunks = new KMap<>();
|
||||||
int bx = player().getLocation().getChunk().getX();
|
var location = player().getLocation();
|
||||||
int bz = player().getLocation().getChunk().getZ();
|
int bx = location.getBlockX() >> 4;
|
||||||
|
int bz = location.getBlockZ() >> 4;
|
||||||
|
|
||||||
|
Spiraled spiraled = (x, z) -> chunks.putIfAbsent(new Position2(x, z), Iris.platform.getChunkAtAsync(world, x, z));
|
||||||
try {
|
try {
|
||||||
Location l = player().getTargetBlockExact(48, FluidCollisionMode.NEVER).getLocation();
|
var player = player();
|
||||||
|
var task = Iris.platform.getEntityScheduler(player).run(() -> {
|
||||||
|
var target = player.getTargetBlockExact(48, FluidCollisionMode.NEVER);
|
||||||
|
if (target == null) return;
|
||||||
|
Location l = target.getLocation();
|
||||||
|
|
||||||
int cx = l.getChunk().getX();
|
int cx = l.getBlockX() >> 4;
|
||||||
int cz = l.getChunk().getZ();
|
int cz = l.getBlockZ() >> 4;
|
||||||
new Spiraler(3, 3, (x, z) -> chunks.addIfMissing(world.getChunkAt(x + cx, z + cz))).drain();
|
new Spiraler(3, 3, (x, z) -> spiraled.on(x + cx, z + cz)).drain();
|
||||||
|
}, null);
|
||||||
|
if (task != null) task.getResult().join();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Iris.reportError(e);
|
Iris.reportError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
new Spiraler(3, 3, (x, z) -> chunks.addIfMissing(world.getChunkAt(x + bx, z + bz))).drain();
|
new Spiraler(3, 3, (x, z) -> spiraled.on(x + bx, z + bz)).drain();
|
||||||
sender().sendMessage("Capturing IGenData from " + chunks.size() + " nearby chunks.");
|
sender().sendMessage("Capturing IGenData from " + chunks.size() + " nearby chunks.");
|
||||||
try {
|
try {
|
||||||
File ff = Iris.instance.getDataFile("reports/" + M.ms() + ".txt");
|
File ff = Iris.instance.getDataFile("reports/" + M.ms() + ".txt");
|
||||||
@@ -759,7 +764,7 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
pw.println("Report Captured At: " + new Date());
|
pw.println("Report Captured At: " + new Date());
|
||||||
pw.println("Chunks: (" + chunks.size() + "): ");
|
pw.println("Chunks: (" + chunks.size() + "): ");
|
||||||
|
|
||||||
for (Chunk i : chunks) {
|
for (Position2 i : chunks.keySet()) {
|
||||||
pw.println("- [" + i.getX() + ", " + i.getZ() + "]");
|
pw.println("- [" + i.getX() + ", " + i.getZ() + "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -784,25 +789,31 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
Iris.reportError(e);
|
Iris.reportError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
KList<String> biomes = new KList<>();
|
KSet<String> biomes = new KSet<>();
|
||||||
KList<String> caveBiomes = new KList<>();
|
KSet<String> caveBiomes = new KSet<>();
|
||||||
KMap<String, KMap<String, KList<String>>> objects = new KMap<>();
|
KMap<String, KMap<String, KSet<String>>> objects = new KMap<>();
|
||||||
|
|
||||||
for (Chunk i : chunks) {
|
var engine = engine();
|
||||||
for (int j = 0; j < 16; j += 3) {
|
assert engine != null;
|
||||||
|
|
||||||
for (int k = 0; k < 16; k += 3) {
|
KList<CompletableFuture<?>> futures = new KList<>(chunks.size());
|
||||||
|
for (var future : chunks.values()) {
|
||||||
assert engine() != null;
|
futures.add(future.thenAccept(i -> {
|
||||||
IrisBiome bb = engine().getSurfaceBiome((i.getX() * 16) + j, (i.getZ() * 16) + k);
|
int bX = i.getX() << 4;
|
||||||
IrisBiome bxf = engine().getCaveBiome((i.getX() * 16) + j, (i.getZ() * 16) + k);
|
int bZ = i.getZ() << 4;
|
||||||
biomes.addIfMissing(bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")");
|
for (int j = 0; j < 16; j += 3) {
|
||||||
caveBiomes.addIfMissing(bxf.getName() + " (" + bxf.getLoadFile().getName() + ")");
|
for (int k = 0; k < 16; k += 3) {
|
||||||
exportObjects(bb, pw, engine(), objects);
|
IrisBiome bb = engine.getSurfaceBiome(bX + j, bZ + k);
|
||||||
exportObjects(bxf, pw, engine(), objects);
|
IrisBiome bxf = engine.getCaveBiome(bX + j, bZ + k);
|
||||||
|
biomes.add(bb.getName() + " [" + Form.capitalize(String.valueOf(bb.getInferredType()).toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")");
|
||||||
|
caveBiomes.add(bxf.getName() + " (" + bxf.getLoadFile().getName() + ")");
|
||||||
|
exportObjects(bb, pw, engine, objects);
|
||||||
|
exportObjects(bxf, pw, engine, objects);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}));
|
||||||
}
|
}
|
||||||
|
CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).join();
|
||||||
|
|
||||||
regions = Objects.requireNonNull(new File(world.getWorldFolder().getPath() + "/region").list()).length;
|
regions = Objects.requireNonNull(new File(world.getWorldFolder().getPath() + "/region").list()).length;
|
||||||
|
|
||||||
@@ -822,6 +833,13 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
pw.println("- " + i);
|
pw.println("- " + i);
|
||||||
}
|
}
|
||||||
pw.println();
|
pw.println();
|
||||||
|
pw.println("== Cave Biome Info ==");
|
||||||
|
pw.println("Found " + caveBiomes.size() + " Cave Biome(s): ");
|
||||||
|
|
||||||
|
for (String i : caveBiomes) {
|
||||||
|
pw.println("- " + i);
|
||||||
|
}
|
||||||
|
pw.println();
|
||||||
|
|
||||||
pw.println("== Object Info ==");
|
pw.println("== Object Info ==");
|
||||||
|
|
||||||
@@ -847,8 +865,8 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void exportObjects(IrisBiome bb, PrintWriter pw, Engine g, KMap<String, KMap<String, KList<String>>> objects) {
|
private void exportObjects(IrisBiome bb, PrintWriter pw, Engine g, KMap<String, KMap<String, KSet<String>>> objects) {
|
||||||
String n1 = bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")";
|
String n1 = bb.getName() + " [" + Form.capitalize(String.valueOf(bb.getInferredType()).toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")";
|
||||||
int m = 0;
|
int m = 0;
|
||||||
KSet<String> stop = new KSet<>();
|
KSet<String> stop = new KSet<>();
|
||||||
for (IrisObjectPlacement f : bb.getObjects()) {
|
for (IrisObjectPlacement f : bb.getObjects()) {
|
||||||
@@ -873,7 +891,7 @@ public class CommandStudio implements DecreeExecutor {
|
|||||||
|
|
||||||
String n3 = nn3;
|
String n3 = nn3;
|
||||||
objects.computeIfAbsent(n1, (k1) -> new KMap<>())
|
objects.computeIfAbsent(n1, (k1) -> new KMap<>())
|
||||||
.computeIfAbsent(n2, (k) -> new KList<>()).addIfMissing(n3);
|
.computeIfAbsent(n2, (k) -> new KSet<>()).add(n3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public class CommandWhat implements DecreeExecutor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Decree(description = "What block am i looking at?", origin = DecreeOrigin.PLAYER)
|
@Decree(description = "What block am i looking at?", origin = DecreeOrigin.PLAYER, sync = true)
|
||||||
public void block() {
|
public void block() {
|
||||||
BlockData bd;
|
BlockData bd;
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -107,21 +107,26 @@ public class JigsawEditor implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Location toLocation(IrisPosition i) {
|
public Location toLocation(IrisPosition i) {
|
||||||
return origin.clone()
|
return toBlock(origin.clone()
|
||||||
.add(new Vector(i.getX(), i.getY(), i.getZ()))
|
.add(new Vector(i.getX(), i.getY(), i.getZ()))
|
||||||
.add(object.getCenter())
|
.add(object.getCenter()));
|
||||||
.getBlock()
|
|
||||||
.getLocation();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IrisPosition toPosition(Location l) {
|
public IrisPosition toPosition(Location l) {
|
||||||
return new IrisPosition(l.clone().getBlock().getLocation()
|
return new IrisPosition(l.clone()
|
||||||
.subtract(origin.clone())
|
.subtract(origin.clone())
|
||||||
.subtract(object.getCenter())
|
.subtract(object.getCenter())
|
||||||
.add(1, 1, 1)
|
.add(1, 1, 1)
|
||||||
.toVector());
|
.toVector());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Location toBlock(Location location) {
|
||||||
|
location.setX(Math.floor(location.getX()));
|
||||||
|
location.setY(Math.floor(location.getY()));
|
||||||
|
location.setZ(Math.floor(location.getZ()));
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void on(PlayerInteractEvent e) {
|
public void on(PlayerInteractEvent e) {
|
||||||
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
|
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
|
||||||
|
|||||||
@@ -142,9 +142,10 @@ public class TreeSVC implements IrisService {
|
|||||||
public void set(int x, int y, int z, BlockData d) {
|
public void set(int x, int y, int z, BlockData d) {
|
||||||
Block b = event.getWorld().getBlockAt(x, y, z);
|
Block b = event.getWorld().getBlockAt(x, y, z);
|
||||||
BlockState state = b.getState();
|
BlockState state = b.getState();
|
||||||
if (d instanceof IrisCustomData data)
|
if (d instanceof IrisCustomData data) {
|
||||||
state.setBlockData(data.getBase());
|
state.setBlockData(data.getBase());
|
||||||
else state.setBlockData(d);
|
Iris.service(ExternalDataSVC.class).processUpdate(engine, b, data.getCustom());
|
||||||
|
} else state.setBlockData(d);
|
||||||
blockStateList.add(b.getState());
|
blockStateList.add(b.getState());
|
||||||
dataCache.put(new Location(event.getWorld(), x, y, z), d);
|
dataCache.put(new Location(event.getWorld(), x, y, z), d);
|
||||||
}
|
}
|
||||||
@@ -207,8 +208,7 @@ public class TreeSVC implements IrisService {
|
|||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
|
||||||
J.s(() -> {
|
Iris.platform.getRegionScheduler().run(event.getLocation(), () -> {
|
||||||
|
|
||||||
StructureGrowEvent iGrow = new StructureGrowEvent(event.getLocation(), event.getSpecies(), event.isFromBonemeal(), event.getPlayer(), blockStateList);
|
StructureGrowEvent iGrow = new StructureGrowEvent(event.getLocation(), event.getSpecies(), event.isFromBonemeal(), event.getPlayer(), blockStateList);
|
||||||
block = true;
|
block = true;
|
||||||
Bukkit.getServer().getPluginManager().callEvent(iGrow);
|
Bukkit.getServer().getPluginManager().callEvent(iGrow);
|
||||||
|
|||||||
@@ -60,9 +60,7 @@ import java.lang.ref.WeakReference;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.*;
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@@ -199,21 +197,39 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateChunks() {
|
private void updateChunks() {
|
||||||
for (Player i : getEngine().getWorld().realWorld().getPlayers()) {
|
int radius = 1;
|
||||||
int r = 1;
|
int diameter = radius * 2 + 1;
|
||||||
|
int count = (diameter * diameter) + 1;
|
||||||
|
|
||||||
|
var players = new KList<>(getEngine().getWorld().realWorld().getPlayers());
|
||||||
|
var latch = new CountDownLatch(count * players.size());
|
||||||
|
|
||||||
|
for (Player i : players) {
|
||||||
|
if (!i.isOnline() || !i.isValid() || i.isDead()) {
|
||||||
|
for (int j = 0; j < count; j++) {
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Iris.platform.getEntityScheduler(i).run(() -> {
|
Iris.platform.getEntityScheduler(i).run(() -> {
|
||||||
Chunk c = i.getLocation().getChunk();
|
Chunk c = i.getLocation().getChunk();
|
||||||
for (int x = -r; x <= r; x++) {
|
for (int x = -radius; x <= radius; x++) {
|
||||||
for (int z = -r; z <= r; z++) {
|
for (int z = -radius; z <= radius; z++) {
|
||||||
int cX = c.getX() + x;
|
int cX = c.getX() + x;
|
||||||
int cZ = c.getZ() + z;
|
int cZ = c.getZ() + z;
|
||||||
if (!c.getWorld().isChunkLoaded(cX, cZ) || !Chunks.isSafe(getEngine().getWorld().realWorld(), cX, cZ))
|
if (!c.getWorld().isChunkLoaded(cX, cZ) || !Chunks.isSafe(getEngine().getWorld().realWorld(), cX, cZ)) {
|
||||||
|
latch.countDown();
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (IrisSettings.get().getWorld().isPostLoadBlockUpdates()) {
|
if (IrisSettings.get().getWorld().isPostLoadBlockUpdates()) {
|
||||||
getEngine().updateChunk(c.getWorld().getChunkAt(cX, cZ));
|
Chunk cx = c.getWorld().getChunkAt(cX, cZ);
|
||||||
}
|
J.a(() -> {
|
||||||
|
getEngine().updateChunk(cx);
|
||||||
|
latch.countDown();
|
||||||
|
});
|
||||||
|
} else latch.countDown();
|
||||||
|
|
||||||
if (IrisSettings.get().getWorld().isMarkerEntitySpawningSystem()) {
|
if (IrisSettings.get().getWorld().isMarkerEntitySpawningSystem()) {
|
||||||
Chunk cx = getEngine().getWorld().realWorld().getChunkAt(cX, cZ);
|
Chunk cx = getEngine().getWorld().realWorld().getChunkAt(cX, cZ);
|
||||||
@@ -233,8 +249,17 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, null);
|
latch.countDown();
|
||||||
|
}, () -> {
|
||||||
|
for (int j = 0; j < count; j++) {
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
latch.await();
|
||||||
|
} catch (InterruptedException ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean onAsyncTick() {
|
private boolean onAsyncTick() {
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
package com.volmit.iris.engine.framework.placer;
|
||||||
|
|
||||||
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
|
import com.volmit.iris.engine.object.IObjectPlacer;
|
||||||
|
import com.volmit.iris.engine.object.TileData;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
import static com.volmit.iris.Iris.platform;
|
||||||
|
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class SafeObjectPlacer implements IObjectPlacer {
|
||||||
|
private final World world;
|
||||||
|
private final IObjectPlacer placer;
|
||||||
|
|
||||||
|
public SafeObjectPlacer(World world, IObjectPlacer placer) {
|
||||||
|
this.world = world;
|
||||||
|
this.placer = placer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHighest(int x, int z, IrisData data) {
|
||||||
|
if (!platform.isOwnedByCurrentRegion(world, x >> 4, z >> 4)) {
|
||||||
|
return platform.getRegionScheduler().run(world, x >> 4, z >> 4, () -> getHighest(x, z, data))
|
||||||
|
.getResult()
|
||||||
|
.join();
|
||||||
|
}
|
||||||
|
return placer.getHighest(x, z, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHighest(int x, int z, IrisData data, boolean ignoreFluid) {
|
||||||
|
if (!platform.isOwnedByCurrentRegion(world, x >> 4, z >> 4)) {
|
||||||
|
if (platform.isTickThread()) throw new IllegalStateException("Cannot run async on primary thread!");
|
||||||
|
return platform.getRegionScheduler().run(world, x >> 4, z >> 4, () -> getHighest(x, z, data, ignoreFluid))
|
||||||
|
.getResult()
|
||||||
|
.join();
|
||||||
|
}
|
||||||
|
return placer.getHighest(x, z, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(int x, int y, int z, BlockData d) {
|
||||||
|
if (!platform.isOwnedByCurrentRegion(world, x >> 4, z >> 4)) {
|
||||||
|
if (platform.isTickThread()) throw new IllegalStateException("Cannot run async on primary thread!");
|
||||||
|
platform.getRegionScheduler().run(world, x >> 4, z >> 4, () -> set(x, y, z, d)).getResult().join();
|
||||||
|
} else placer.set(x, y, z, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockData get(int x, int y, int z) {
|
||||||
|
if (!platform.isOwnedByCurrentRegion(world, x >> 4, z >> 4)) {
|
||||||
|
if (platform.isTickThread()) throw new IllegalStateException("Cannot run async on primary thread!");
|
||||||
|
return platform.getRegionScheduler().run(world, x >> 4, z >> 4, () -> get(x, y, z)).getResult().join();
|
||||||
|
}
|
||||||
|
return placer.get(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPreventingDecay() {
|
||||||
|
return placer.isPreventingDecay();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCarved(int x, int y, int z) {
|
||||||
|
return placer.isCarved(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSolid(int x, int y, int z) {
|
||||||
|
if (!platform.isOwnedByCurrentRegion(world, x >> 4, z >> 4)) {
|
||||||
|
if (platform.isTickThread()) throw new IllegalStateException("Cannot run async on primary thread!");
|
||||||
|
return platform.getRegionScheduler().run(world, x >> 4, z >> 4, () -> isSolid(x, y, z)).getResult().join();
|
||||||
|
}
|
||||||
|
return placer.isSolid(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isUnderwater(int x, int z) {
|
||||||
|
if (!platform.isOwnedByCurrentRegion(world, x >> 4, z >> 4)) {
|
||||||
|
if (platform.isTickThread()) throw new IllegalStateException("Cannot run async on primary thread!");
|
||||||
|
return platform.getRegionScheduler().run(world, x >> 4, z >> 4, () -> isUnderwater(x, z)).getResult().join();
|
||||||
|
}
|
||||||
|
return placer.isUnderwater(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getFluidHeight() {
|
||||||
|
return placer.getFluidHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDebugSmartBore() {
|
||||||
|
return placer.isDebugSmartBore();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTile(int xx, int yy, int zz, TileData tile) {
|
||||||
|
if (!platform.isOwnedByCurrentRegion(world, xx >> 4, zz >> 4)) {
|
||||||
|
if (platform.isTickThread()) throw new IllegalStateException("Cannot run async on primary thread!");
|
||||||
|
platform.getRegionScheduler().run(world, xx >> 4, zz >> 4, () -> setTile(xx, yy, zz, tile)).getResult().join();
|
||||||
|
} else placer.setTile(xx, yy, zz, tile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Engine getEngine() {
|
||||||
|
return placer.getEngine();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -160,8 +160,9 @@ public class PlannedStructure {
|
|||||||
}, null, getData().getEngine() != null ? getData() : eng.getData()) != -1;
|
}, null, getData().getEngine() != null ? getData() : eng.getData()) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO properly fix for folia
|
||||||
public void place(WorldObjectPlacer placer, Consumer<Boolean> consumer) {
|
public void place(WorldObjectPlacer placer, Consumer<Boolean> consumer) {
|
||||||
J.s(() -> consumer.accept(place(placer, placer.getMantle().getMantle(), placer.getEngine())));
|
Iris.platform.getRegionScheduler().run(placer.getWorld(), position.getX() >> 4, position.getZ() >> 4, () -> consumer.accept(place(placer, placer.getMantle().getMantle(), placer.getEngine())));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateOutwards() {
|
private void generateOutwards() {
|
||||||
|
|||||||
@@ -18,9 +18,12 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine.object;
|
package com.volmit.iris.engine.object;
|
||||||
|
|
||||||
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import org.bukkit.block.TileState;
|
import com.volmit.iris.engine.framework.placer.SafeObjectPlacer;
|
||||||
|
import de.crazydev22.platformutils.Type;
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
public interface IObjectPlacer {
|
public interface IObjectPlacer {
|
||||||
@@ -47,4 +50,10 @@ public interface IObjectPlacer {
|
|||||||
void setTile(int xx, int yy, int zz, TileData tile);
|
void setTile(int xx, int yy, int zz, TileData tile);
|
||||||
|
|
||||||
Engine getEngine();
|
Engine getEngine();
|
||||||
|
|
||||||
|
default IObjectPlacer sync(World world) {
|
||||||
|
if (Iris.platform.getType() == Type.FOLIA)
|
||||||
|
return new SafeObjectPlacer(world, this);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,9 +38,11 @@ import com.volmit.iris.util.data.IrisBiomeStorage;
|
|||||||
import com.volmit.iris.util.hunk.view.BiomeGridHunkHolder;
|
import com.volmit.iris.util.hunk.view.BiomeGridHunkHolder;
|
||||||
import com.volmit.iris.util.hunk.view.ChunkDataHunkHolder;
|
import com.volmit.iris.util.hunk.view.ChunkDataHunkHolder;
|
||||||
import com.volmit.iris.util.io.ReactiveFolder;
|
import com.volmit.iris.util.io.ReactiveFolder;
|
||||||
|
import com.volmit.iris.util.math.RNG;
|
||||||
import com.volmit.iris.util.scheduling.ChronoLatch;
|
import com.volmit.iris.util.scheduling.ChronoLatch;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
import com.volmit.iris.util.scheduling.Looper;
|
import com.volmit.iris.util.scheduling.Looper;
|
||||||
|
import de.crazydev22.platformutils.scheduler.IRegionExecutor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@@ -194,13 +196,12 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void injectChunkReplacement(World world, int x, int z, Executor syncExecutor) {
|
public void injectChunkReplacement(World world, int x, int z, IRegionExecutor executor) {
|
||||||
try {
|
try {
|
||||||
loadLock.acquire();
|
loadLock.acquire();
|
||||||
IrisBiomeStorage st = new IrisBiomeStorage();
|
IrisBiomeStorage st = new IrisBiomeStorage();
|
||||||
TerrainChunk tc = TerrainChunk.createUnsafe(world, st);
|
TerrainChunk tc = TerrainChunk.createUnsafe(world, st);
|
||||||
this.world.bind(world);
|
generateNoise(world, RNG.r, x, z, tc);
|
||||||
getEngine().generate(x << 4, z << 4, tc, IrisSettings.get().getGenerator().useMulticore);
|
|
||||||
|
|
||||||
Chunk c = Iris.platform.getChunkAtAsync(world, x, z)
|
Chunk c = Iris.platform.getChunkAtAsync(world, x, z)
|
||||||
.thenApply(d -> {
|
.thenApply(d -> {
|
||||||
@@ -223,7 +224,7 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
KList<CompletableFuture<?>> futures = new KList<>(1 + getEngine().getHeight() >> 4);
|
KList<CompletableFuture<?>> futures = new KList<>(1 + getEngine().getHeight() >> 4);
|
||||||
for (int i = getEngine().getHeight() >> 4; i >= 0; i--) {
|
for (int i = getEngine().getHeight() >> 4; i >= 0; i--) {
|
||||||
int finalI = i << 4;
|
int finalI = i << 4;
|
||||||
futures.add(CompletableFuture.runAsync(() -> {
|
futures.add(executor.queue(world, x, z, () -> {
|
||||||
for (int xx = 0; xx < 16; xx++) {
|
for (int xx = 0; xx < 16; xx++) {
|
||||||
for (int yy = 0; yy < 16; yy++) {
|
for (int yy = 0; yy < 16; yy++) {
|
||||||
for (int zz = 0; zz < 16; zz++) {
|
for (int zz = 0; zz < 16; zz++) {
|
||||||
@@ -235,15 +236,15 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, syncExecutor));
|
}));
|
||||||
}
|
}
|
||||||
futures.add(CompletableFuture.runAsync(() -> INMS.get().placeStructures(c), syncExecutor));
|
|
||||||
|
|
||||||
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
|
CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new))
|
||||||
.thenRunAsync(() -> {
|
.thenCompose($ -> executor.queue(world, x, z, () -> INMS.get().placeStructures(c)))
|
||||||
|
.thenCompose($ -> executor.queue(world, x, z, () -> {
|
||||||
c.removePluginChunkTicket(Iris.instance);
|
c.removePluginChunkTicket(Iris.instance);
|
||||||
engine.getWorldManager().onChunkLoad(c, true);
|
engine.getWorldManager().onChunkLoad(c, true);
|
||||||
}, syncExecutor)
|
}))
|
||||||
.get();
|
.get();
|
||||||
Iris.debug("Regenerated " + x + " " + z);
|
Iris.debug("Regenerated " + x + " " + z);
|
||||||
|
|
||||||
@@ -254,14 +255,6 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Iris.reportErrorChunk(x, z, e, "CHUNK");
|
Iris.reportErrorChunk(x, z, e, "CHUNK");
|
||||||
Iris.error("======================================");
|
Iris.error("======================================");
|
||||||
|
|
||||||
ChunkData d = Bukkit.createChunkData(world);
|
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
for (int j = 0; j < 16; j++) {
|
|
||||||
d.setBlock(i, 0, j, Material.RED_GLAZED_TERRACOTTA.createBlockData());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.engine.framework.EngineTarget;
|
import com.volmit.iris.engine.framework.EngineTarget;
|
||||||
import com.volmit.iris.engine.framework.Hotloadable;
|
import com.volmit.iris.engine.framework.Hotloadable;
|
||||||
import com.volmit.iris.util.data.DataProvider;
|
import com.volmit.iris.util.data.DataProvider;
|
||||||
|
import de.crazydev22.platformutils.scheduler.IRegionExecutor;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
|
|
||||||
public interface PlatformChunkGenerator extends Hotloadable, DataProvider {
|
public interface PlatformChunkGenerator extends Hotloadable, DataProvider {
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -42,7 +42,7 @@ public interface PlatformChunkGenerator extends Hotloadable, DataProvider {
|
|||||||
@NotNull
|
@NotNull
|
||||||
EngineTarget getTarget();
|
EngineTarget getTarget();
|
||||||
|
|
||||||
void injectChunkReplacement(World world, int x, int z, Executor syncExecutor);
|
void injectChunkReplacement(World world, int x, int z, IRegionExecutor executor);
|
||||||
|
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
|
|||||||
@@ -316,17 +316,17 @@ public class Cuboid implements Iterable<Block>, Cloneable, ConfigurationSerializ
|
|||||||
*
|
*
|
||||||
* @return array of Block objects representing the Cuboid corners
|
* @return array of Block objects representing the Cuboid corners
|
||||||
*/
|
*/
|
||||||
public Block[] corners() {
|
public Location[] corners() {
|
||||||
Block[] res = new Block[8];
|
Location[] res = new Location[8];
|
||||||
World w = getWorld();
|
World w = getWorld();
|
||||||
res[0] = w.getBlockAt(x1, y1, z1);
|
res[0] = new Location(w, x1, y1, z1);
|
||||||
res[1] = w.getBlockAt(x1, y1, z2);
|
res[1] = new Location(w, x1, y1, z2);
|
||||||
res[2] = w.getBlockAt(x1, y2, z1);
|
res[2] = new Location(w, x1, y2, z1);
|
||||||
res[3] = w.getBlockAt(x1, y2, z2);
|
res[3] = new Location(w, x1, y2, z2);
|
||||||
res[4] = w.getBlockAt(x2, y1, z1);
|
res[4] = new Location(w, x2, y1, z1);
|
||||||
res[5] = w.getBlockAt(x2, y1, z2);
|
res[5] = new Location(w, x2, y1, z2);
|
||||||
res[6] = w.getBlockAt(x2, y2, z1);
|
res[6] = new Location(w, x2, y2, z1);
|
||||||
res[7] = w.getBlockAt(x2, y2, z2);
|
res[7] = new Location(w, x2, y2, z2);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -648,6 +648,7 @@ public class Cuboid implements Iterable<Block>, Cloneable, ConfigurationSerializ
|
|||||||
* @see java.lang.Iterable#iterator()
|
* @see java.lang.Iterable#iterator()
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public Iterator<Block> iterator() {
|
public Iterator<Block> iterator() {
|
||||||
return new CuboidIterator(getWorld(), x1, y1, z1, x2, y2, z2);
|
return new CuboidIterator(getWorld(), x1, y1, z1, x2, y2, z2);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ import com.volmit.iris.util.format.Form;
|
|||||||
import com.volmit.iris.util.plugin.CommandDummy;
|
import com.volmit.iris.util.plugin.CommandDummy;
|
||||||
import com.volmit.iris.util.plugin.VolmitSender;
|
import com.volmit.iris.util.plugin.VolmitSender;
|
||||||
import com.volmit.iris.util.scheduling.ChronoLatch;
|
import com.volmit.iris.util.scheduling.ChronoLatch;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@@ -493,7 +493,10 @@ public class VirtualDecreeCommand {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (getNode().isSync()) {
|
if (getNode().isSync()) {
|
||||||
J.s(rx);
|
switch (sender.getS()) {
|
||||||
|
case Entity entity -> Iris.platform.getEntityScheduler(entity).run(rx, null);
|
||||||
|
case null, default -> Iris.platform.getGlobalScheduler().run(rx);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
rx.run();
|
rx.run();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ public class BlockPosition {
|
|||||||
return toLong(getX(), getY(), getZ());
|
return toLong(getX(), getY(), getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public Block toBlock(World world) {
|
public Block toBlock(World world) {
|
||||||
return world.getBlockAt(x, y, z);
|
return world.getBlockAt(x, y, z);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
package com.volmit.iris.util.parallel;
|
|
||||||
|
|
||||||
import com.volmit.iris.util.math.M;
|
|
||||||
import com.volmit.iris.util.scheduling.SR;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.concurrent.*;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
|
|
||||||
public class SyncExecutor implements Executor, AutoCloseable {
|
|
||||||
private final CountDownLatch latch = new CountDownLatch(1);
|
|
||||||
private final Queue<Runnable> queue = new ConcurrentLinkedQueue<>();
|
|
||||||
private final AtomicBoolean closed = new AtomicBoolean(false);
|
|
||||||
|
|
||||||
public SyncExecutor(int msPerTick) {
|
|
||||||
new SR() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
var time = M.ms() + msPerTick;
|
|
||||||
while (time > M.ms()) {
|
|
||||||
Runnable r = queue.poll();
|
|
||||||
if (r == null) break;
|
|
||||||
r.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (closed.get() && queue.isEmpty()) {
|
|
||||||
cancel();
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(@NotNull Runnable command) {
|
|
||||||
if (closed.get()) throw new IllegalStateException("Executor is closed!");
|
|
||||||
queue.add(command);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() throws Exception {
|
|
||||||
closed.set(true);
|
|
||||||
latch.await();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -17,7 +17,7 @@ spigot = "1.20.1-R0.1-SNAPSHOT" # https://hub.spigotmc.org/nexus/repository/snap
|
|||||||
log4j = "2.19.0" # https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-api
|
log4j = "2.19.0" # https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-api
|
||||||
adventure-api = "4.24.0" # https://github.com/KyoriPowered/adventure
|
adventure-api = "4.24.0" # https://github.com/KyoriPowered/adventure
|
||||||
adventure-platform = "4.4.1" # https://github.com/KyoriPowered/adventure-platform
|
adventure-platform = "4.4.1" # https://github.com/KyoriPowered/adventure-platform
|
||||||
platform-utils = "e396f93d56" # https://github.com/CrazyDev05/PlatformUtils
|
platform-utils = "27453094ed" # https://github.com/CrazyDev05/PlatformUtils
|
||||||
|
|
||||||
annotations = "26.0.2" # https://central.sonatype.com/artifact/org.jetbrains/annotations
|
annotations = "26.0.2" # https://central.sonatype.com/artifact/org.jetbrains/annotations
|
||||||
paralithic = "0.8.1" # https://github.com/PolyhedralDev/Paralithic/
|
paralithic = "0.8.1" # https://github.com/PolyhedralDev/Paralithic/
|
||||||
@@ -68,8 +68,9 @@ annotations = { module = "org.jetbrains:annotations", version.ref = "annotations
|
|||||||
platformUtils = { module = "com.github.CrazyDev05:PlatformUtils", version.ref = "platform-utils" }
|
platformUtils = { module = "com.github.CrazyDev05:PlatformUtils", version.ref = "platform-utils" }
|
||||||
|
|
||||||
# Dynamically Loaded
|
# Dynamically Loaded
|
||||||
adventure-api = { module = "net.kyori:adventure-api", version.ref = "adventure-api" }
|
|
||||||
adventure-minimessage = { module = "net.kyori:adventure-text-minimessage", version.ref = "adventure-api" }
|
adventure-minimessage = { module = "net.kyori:adventure-text-minimessage", version.ref = "adventure-api" }
|
||||||
|
adventure-gson = { module = "net.kyori:adventure-text-serializer-gson", version.ref = "adventure-api" }
|
||||||
|
adventure-legacy = { module = "net.kyori:adventure-text-serializer-legacy", version.ref = "adventure-api" }
|
||||||
adventure-platform = { module = "net.kyori:adventure-platform-bukkit", version.ref = "adventure-platform" }
|
adventure-platform = { module = "net.kyori:adventure-platform-bukkit", version.ref = "adventure-platform" }
|
||||||
|
|
||||||
paralithic = { module = "com.dfsek:paralithic", version.ref = "paralithic" }
|
paralithic = { module = "com.dfsek:paralithic", version.ref = "paralithic" }
|
||||||
|
|||||||
Reference in New Issue
Block a user