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
|
||||
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")
|
||||
|
||||
@@ -128,7 +128,7 @@ public class CommandObject implements DecreeExecutor {
|
||||
public Engine getEngine() {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}.sync(world);
|
||||
}
|
||||
|
||||
@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.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<Chunk> chunks = new KList<>();
|
||||
int bx = player().getLocation().getChunk().getX();
|
||||
int bz = player().getLocation().getChunk().getZ();
|
||||
KMap<Position2, CompletableFuture<Chunk>> 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<String> biomes = new KList<>();
|
||||
KList<String> caveBiomes = new KList<>();
|
||||
KMap<String, KMap<String, KList<String>>> objects = new KMap<>();
|
||||
KSet<String> biomes = new KSet<>();
|
||||
KSet<String> caveBiomes = new KSet<>();
|
||||
KMap<String, KMap<String, KSet<String>>> objects = new KMap<>();
|
||||
|
||||
for (Chunk i : chunks) {
|
||||
var engine = engine();
|
||||
assert engine != null;
|
||||
|
||||
KList<CompletableFuture<?>> 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) {
|
||||
|
||||
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);
|
||||
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<String, KMap<String, KList<String>>> objects) {
|
||||
String n1 = bb.getName() + " [" + Form.capitalize(bb.getInferredType().name().toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")";
|
||||
private void exportObjects(IrisBiome bb, PrintWriter pw, Engine g, KMap<String, KMap<String, KSet<String>>> objects) {
|
||||
String n1 = bb.getName() + " [" + Form.capitalize(String.valueOf(bb.getInferredType()).toLowerCase()) + "] " + " (" + bb.getLoadFile().getName() + ")";
|
||||
int m = 0;
|
||||
KSet<String> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
//TODO properly fix for folia
|
||||
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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<CompletableFuture<?>> 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -316,17 +316,17 @@ public class Cuboid implements Iterable<Block>, 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<Block>, Cloneable, ConfigurationSerializ
|
||||
* @see java.lang.Iterable#iterator()
|
||||
*/
|
||||
@Override
|
||||
@Deprecated(forRemoval = true)
|
||||
public Iterator<Block> iterator() {
|
||||
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.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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
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" }
|
||||
|
||||
Reference in New Issue
Block a user