diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 904586dbe..12c1ee35f 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -78,9 +78,10 @@ dependencies { // Dynamically Loaded slim(libs.paralithic) slim(libs.paperlib) - slim(libs.adventure.api) slim(libs.adventure.minimessage) slim(libs.adventure.platform) + slim(libs.adventure.gson) + slim(libs.adventure.legacy) slim(libs.bstats) slim(libs.sentry) @@ -112,6 +113,11 @@ dependencies { slim(libs.mavenCore) } } + + constraints { + slim(libs.gson) + compileOnly(libs.gson) + } } java { @@ -135,8 +141,7 @@ slimJar { )) relocate("com.dfsek.paralithic", "$lib.paralithic") - relocate("io.papermc.lib", "$lib.paper") - relocate("net.kyori", "$lib.kyori") + relocate("net.kyori.audience", "$lib.audience") relocate("org.bstats", "$lib.metrics") relocate("io.sentry", "$lib.sentry") relocate("org.apache.maven", "$lib.maven") diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java b/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java index fd057b300..080e9908b 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandObject.java @@ -128,7 +128,7 @@ public class CommandObject implements DecreeExecutor { public Engine getEngine() { return null; } - }; + }.sync(world); } @Decree(description = "Check the composition of an object") diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java index e02728d80..c203aaffd 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java @@ -47,18 +47,14 @@ import com.volmit.iris.util.io.IO; import com.volmit.iris.util.json.JSONArray; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.MantleChunk; -import com.volmit.iris.util.math.M; -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.math.*; import com.volmit.iris.util.noise.CNG; 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.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; 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.entity.Player; import org.bukkit.event.inventory.InventoryType; @@ -77,6 +73,7 @@ import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Date; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; @@ -174,7 +171,7 @@ public class CommandStudio implements DecreeExecutor { PlatformChunkGenerator plat = IrisToolbelt.access(world); Engine engine = plat.getEngine(); DecreeContext.touch(sender); - try (SyncExecutor executor = new SyncExecutor(20)) { + try (var executor = Iris.platform.createRegionExecutor(20)) { int x = loc.getBlockX() >> 4; int z = loc.getBlockZ() >> 4; @@ -376,7 +373,7 @@ public class CommandStudio implements DecreeExecutor { var loc = player.getLocation(); int totalTasks = d * d; 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(() -> { var region = engine.getRegion((x << 4) + 8, (z << 4) + 8); data.computeIfAbsent(region.getLoadKey(), (k) -> new AtomicInteger(0)) @@ -385,7 +382,7 @@ public class CommandStudio implements DecreeExecutor { })).setOffset(loc.getBlockX(), loc.getBlockZ()).drain(); executor.complete(); multiBurst.close(); - J.car(c); + c.cancel(); sender.sendMessage(C.GREEN + "Done!"); 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() { if (!IrisToolbelt.isIrisWorld(player().getWorld())) { 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."); return; } - KList chunks = new KList<>(); - int bx = player().getLocation().getChunk().getX(); - int bz = player().getLocation().getChunk().getZ(); + KMap> chunks = new KMap<>(); + var location = player().getLocation(); + 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 { - 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 cz = l.getChunk().getZ(); - new Spiraler(3, 3, (x, z) -> chunks.addIfMissing(world.getChunkAt(x + cx, z + cz))).drain(); + int cx = l.getBlockX() >> 4; + int cz = l.getBlockZ() >> 4; + new Spiraler(3, 3, (x, z) -> spiraled.on(x + cx, z + cz)).drain(); + }, null); + if (task != null) task.getResult().join(); } catch (Throwable 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."); try { 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("Chunks: (" + chunks.size() + "): "); - for (Chunk i : chunks) { + for (Position2 i : chunks.keySet()) { pw.println("- [" + i.getX() + ", " + i.getZ() + "]"); } @@ -784,25 +789,31 @@ public class CommandStudio implements DecreeExecutor { Iris.reportError(e); } - KList biomes = new KList<>(); - KList caveBiomes = new KList<>(); - KMap>> objects = new KMap<>(); + KSet biomes = new KSet<>(); + KSet caveBiomes = new KSet<>(); + KMap>> objects = new KMap<>(); - for (Chunk i : chunks) { - for (int j = 0; j < 16; j += 3) { + var engine = engine(); + assert engine != null; - for (int k = 0; k < 16; k += 3) { - - assert engine() != null; - IrisBiome bb = engine().getSurfaceBiome((i.getX() * 16) + j, (i.getZ() * 16) + k); - IrisBiome bxf = engine().getCaveBiome((i.getX() * 16) + j, (i.getZ() * 16) + k); - biomes.addIfMissing(bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")"); - caveBiomes.addIfMissing(bxf.getName() + " (" + bxf.getLoadFile().getName() + ")"); - exportObjects(bb, pw, engine(), objects); - exportObjects(bxf, pw, engine(), objects); + KList> futures = new KList<>(chunks.size()); + for (var future : chunks.values()) { + futures.add(future.thenAccept(i -> { + int bX = i.getX() << 4; + int bZ = i.getZ() << 4; + for (int j = 0; j < 16; j += 3) { + for (int k = 0; k < 16; k += 3) { + IrisBiome bb = engine.getSurfaceBiome(bX + j, bZ + k); + 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; @@ -822,6 +833,13 @@ public class CommandStudio implements DecreeExecutor { pw.println("- " + i); } 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 =="); @@ -847,8 +865,8 @@ public class CommandStudio implements DecreeExecutor { } } - private void exportObjects(IrisBiome bb, PrintWriter pw, Engine g, KMap>> objects) { - String n1 = bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")"; + private void exportObjects(IrisBiome bb, PrintWriter pw, Engine g, KMap>> objects) { + String n1 = bb.getName() + " [" + Form.capitalize(String.valueOf(bb.getInferredType()).toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")"; int m = 0; KSet stop = new KSet<>(); for (IrisObjectPlacement f : bb.getObjects()) { @@ -873,7 +891,7 @@ public class CommandStudio implements DecreeExecutor { String n3 = nn3; objects.computeIfAbsent(n1, (k1) -> new KMap<>()) - .computeIfAbsent(n2, (k) -> new KList<>()).addIfMissing(n3); + .computeIfAbsent(n2, (k) -> new KSet<>()).add(n3); } } } diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java b/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java index c2c8015da..c26376085 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java @@ -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() { BlockData bd; try { diff --git a/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java b/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java index 60ac6a243..0fce7e919 100644 --- a/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java +++ b/core/src/main/java/com/volmit/iris/core/edit/JigsawEditor.java @@ -107,21 +107,26 @@ public class JigsawEditor implements Listener { } public Location toLocation(IrisPosition i) { - return origin.clone() + return toBlock(origin.clone() .add(new Vector(i.getX(), i.getY(), i.getZ())) - .add(object.getCenter()) - .getBlock() - .getLocation(); + .add(object.getCenter())); } public IrisPosition toPosition(Location l) { - return new IrisPosition(l.clone().getBlock().getLocation() + return new IrisPosition(l.clone() .subtract(origin.clone()) .subtract(object.getCenter()) .add(1, 1, 1) .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 public void on(PlayerInteractEvent e) { if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { diff --git a/core/src/main/java/com/volmit/iris/core/service/TreeSVC.java b/core/src/main/java/com/volmit/iris/core/service/TreeSVC.java index 58be7738c..69a937367 100644 --- a/core/src/main/java/com/volmit/iris/core/service/TreeSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/TreeSVC.java @@ -142,9 +142,10 @@ public class TreeSVC implements IrisService { public void set(int x, int y, int z, BlockData d) { Block b = event.getWorld().getBlockAt(x, y, z); BlockState state = b.getState(); - if (d instanceof IrisCustomData data) + if (d instanceof IrisCustomData data) { 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()); dataCache.put(new Location(event.getWorld(), x, y, z), d); } @@ -207,8 +208,7 @@ public class TreeSVC implements IrisService { event.setCancelled(true); - J.s(() -> { - + Iris.platform.getRegionScheduler().run(event.getLocation(), () -> { StructureGrowEvent iGrow = new StructureGrowEvent(event.getLocation(), event.getSpecies(), event.isFromBonemeal(), event.getPlayer(), blockStateList); block = true; Bukkit.getServer().getPluginManager().callEvent(iGrow); diff --git a/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index 2e867a87b..db1ae2405 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -60,9 +60,7 @@ import java.lang.ref.WeakReference; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; +import java.util.concurrent.*; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -199,21 +197,39 @@ public class IrisWorldManager extends EngineAssignedWorldManager { } private void updateChunks() { - for (Player i : getEngine().getWorld().realWorld().getPlayers()) { - int r = 1; + int radius = 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(() -> { Chunk c = i.getLocation().getChunk(); - for (int x = -r; x <= r; x++) { - for (int z = -r; z <= r; z++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { int cX = c.getX() + x; 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; + } 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()) { 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() { diff --git a/core/src/main/java/com/volmit/iris/engine/framework/placer/SafeObjectPlacer.java b/core/src/main/java/com/volmit/iris/engine/framework/placer/SafeObjectPlacer.java new file mode 100644 index 000000000..f7fd61109 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/framework/placer/SafeObjectPlacer.java @@ -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(); + } +} diff --git a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java index c045cf922..72662fcac 100644 --- a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java +++ b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java @@ -160,8 +160,9 @@ public class PlannedStructure { }, null, getData().getEngine() != null ? getData() : eng.getData()) != -1; } + //TODO properly fix for folia public void place(WorldObjectPlacer placer, Consumer 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() { diff --git a/core/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java b/core/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java index 3a7a89a38..46c955cec 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IObjectPlacer.java @@ -18,9 +18,12 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.Iris; import com.volmit.iris.core.loader.IrisData; 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; public interface IObjectPlacer { @@ -47,4 +50,10 @@ public interface IObjectPlacer { void setTile(int xx, int yy, int zz, TileData tile); Engine getEngine(); + + default IObjectPlacer sync(World world) { + if (Iris.platform.getType() == Type.FOLIA) + return new SafeObjectPlacer(world, this); + return this; + } } diff --git a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java index c3a3b13c5..a68dd5481 100644 --- a/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java +++ b/core/src/main/java/com/volmit/iris/engine/platform/BukkitChunkGenerator.java @@ -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.ChunkDataHunkHolder; 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.J; import com.volmit.iris.util.scheduling.Looper; +import de.crazydev22.platformutils.scheduler.IRegionExecutor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Setter; @@ -194,13 +196,12 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun } @Override - public void injectChunkReplacement(World world, int x, int z, Executor syncExecutor) { + public void injectChunkReplacement(World world, int x, int z, IRegionExecutor executor) { try { loadLock.acquire(); IrisBiomeStorage st = new IrisBiomeStorage(); TerrainChunk tc = TerrainChunk.createUnsafe(world, st); - this.world.bind(world); - getEngine().generate(x << 4, z << 4, tc, IrisSettings.get().getGenerator().useMulticore); + generateNoise(world, RNG.r, x, z, tc); Chunk c = Iris.platform.getChunkAtAsync(world, x, z) .thenApply(d -> { @@ -223,7 +224,7 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun KList> futures = new KList<>(1 + getEngine().getHeight() >> 4); for (int i = getEngine().getHeight() >> 4; i >= 0; i--) { int finalI = i << 4; - futures.add(CompletableFuture.runAsync(() -> { + futures.add(executor.queue(world, x, z, () -> { for (int xx = 0; xx < 16; xx++) { for (int yy = 0; yy < 16; yy++) { 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])) - .thenRunAsync(() -> { + CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)) + .thenCompose($ -> executor.queue(world, x, z, () -> INMS.get().placeStructures(c))) + .thenCompose($ -> executor.queue(world, x, z, () -> { c.removePluginChunkTicket(Iris.instance); engine.getWorldManager().onChunkLoad(c, true); - }, syncExecutor) + })) .get(); Iris.debug("Regenerated " + x + " " + z); @@ -254,14 +255,6 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun e.printStackTrace(); Iris.reportErrorChunk(x, z, e, "CHUNK"); 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()); - } - } } } diff --git a/core/src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java b/core/src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java index 93066fb62..5a6427d8e 100644 --- a/core/src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java +++ b/core/src/main/java/com/volmit/iris/engine/platform/PlatformChunkGenerator.java @@ -23,12 +23,12 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineTarget; import com.volmit.iris.engine.framework.Hotloadable; import com.volmit.iris.util.data.DataProvider; +import de.crazydev22.platformutils.scheduler.IRegionExecutor; import org.bukkit.World; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; public interface PlatformChunkGenerator extends Hotloadable, DataProvider { @Nullable @@ -42,7 +42,7 @@ public interface PlatformChunkGenerator extends Hotloadable, DataProvider { @NotNull EngineTarget getTarget(); - void injectChunkReplacement(World world, int x, int z, Executor syncExecutor); + void injectChunkReplacement(World world, int x, int z, IRegionExecutor executor); void close(); diff --git a/core/src/main/java/com/volmit/iris/util/data/Cuboid.java b/core/src/main/java/com/volmit/iris/util/data/Cuboid.java index df377fec6..2411bb621 100644 --- a/core/src/main/java/com/volmit/iris/util/data/Cuboid.java +++ b/core/src/main/java/com/volmit/iris/util/data/Cuboid.java @@ -316,17 +316,17 @@ public class Cuboid implements Iterable, Cloneable, ConfigurationSerializ * * @return array of Block objects representing the Cuboid corners */ - public Block[] corners() { - Block[] res = new Block[8]; + public Location[] corners() { + Location[] res = new Location[8]; World w = getWorld(); - res[0] = w.getBlockAt(x1, y1, z1); - res[1] = w.getBlockAt(x1, y1, z2); - res[2] = w.getBlockAt(x1, y2, z1); - res[3] = w.getBlockAt(x1, y2, z2); - res[4] = w.getBlockAt(x2, y1, z1); - res[5] = w.getBlockAt(x2, y1, z2); - res[6] = w.getBlockAt(x2, y2, z1); - res[7] = w.getBlockAt(x2, y2, z2); + res[0] = new Location(w, x1, y1, z1); + res[1] = new Location(w, x1, y1, z2); + res[2] = new Location(w, x1, y2, z1); + res[3] = new Location(w, x1, y2, z2); + res[4] = new Location(w, x2, y1, z1); + res[5] = new Location(w, x2, y1, z2); + res[6] = new Location(w, x2, y2, z1); + res[7] = new Location(w, x2, y2, z2); return res; } @@ -648,6 +648,7 @@ public class Cuboid implements Iterable, Cloneable, ConfigurationSerializ * @see java.lang.Iterable#iterator() */ @Override + @Deprecated(forRemoval = true) public Iterator iterator() { return new CuboidIterator(getWorld(), x1, y1, z1, x2, y2, z2); } diff --git a/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java b/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java index 4bd5e9168..c370d8f9b 100644 --- a/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java +++ b/core/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java @@ -31,8 +31,8 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.plugin.CommandDummy; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.ChronoLatch; -import com.volmit.iris.util.scheduling.J; import lombok.Data; +import org.bukkit.entity.Entity; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -493,7 +493,10 @@ public class VirtualDecreeCommand { }; 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 { rx.run(); } diff --git a/core/src/main/java/com/volmit/iris/util/math/BlockPosition.java b/core/src/main/java/com/volmit/iris/util/math/BlockPosition.java index 9ca1363f8..ec564fca2 100644 --- a/core/src/main/java/com/volmit/iris/util/math/BlockPosition.java +++ b/core/src/main/java/com/volmit/iris/util/math/BlockPosition.java @@ -89,6 +89,7 @@ public class BlockPosition { return toLong(getX(), getY(), getZ()); } + @Deprecated(forRemoval = true) public Block toBlock(World world) { return world.getBlockAt(x, y, z); } diff --git a/core/src/main/java/com/volmit/iris/util/parallel/SyncExecutor.java b/core/src/main/java/com/volmit/iris/util/parallel/SyncExecutor.java deleted file mode 100644 index 00966b226..000000000 --- a/core/src/main/java/com/volmit/iris/util/parallel/SyncExecutor.java +++ /dev/null @@ -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 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(); - } -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c99bd4b2b..309eca7ee 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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 adventure-api = "4.24.0" # https://github.com/KyoriPowered/adventure 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 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" } # 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-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" } paralithic = { module = "com.dfsek:paralithic", version.ref = "paralithic" }