From e72ea21b6bdb80754c10f4138e051b3b0f2e53da Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 12 Oct 2020 00:18:05 -0400 Subject: [PATCH] Fix commands & support regeneration --- icon.png | Bin 0 -> 9764 bytes pom.xml | 2 +- src/main/java/com/volmit/iris/Iris.java | 52 ++++++ .../java/com/volmit/iris/IrisSettings.java | 4 + .../com/volmit/iris/command/CommandIris.java | 3 + .../volmit/iris/command/CommandIrisRegen.java | 72 +++++++++ .../com/volmit/iris/edit/BlockEditor.java | 9 ++ .../volmit/iris/edit/BukkitBlockEditor.java | 27 ++++ .../com/volmit/iris/edit/WEBlockEditor.java | 29 +++- .../iris/gen/ContextualTerrainProvider.java | 2 + .../volmit/iris/gen/IrisTerrainProvider.java | 36 ++++- .../iris/gen/ParallaxTerrainProvider.java | 50 +++++- .../iris/gen/atomics/AtomicSliverMap.java | 15 ++ .../iris/gen/provisions/ProvisionBukkit.java | 148 +++++++++++++++++- .../volmit/iris/gen/scaffold/Provisioned.java | 4 + .../iris/gen/scaffold/TerrainProvider.java | 12 +- .../com/volmit/iris/manager/EditManager.java | 23 ++- .../volmit/iris/manager/IrisBoardManager.java | 1 + .../com/volmit/iris/manager/IrisProject.java | 3 +- .../volmit/iris/manager/ProjectManager.java | 103 +----------- .../java/com/volmit/iris/util/Spiraler.java | 11 +- 21 files changed, 486 insertions(+), 120 deletions(-) create mode 100644 icon.png create mode 100644 src/main/java/com/volmit/iris/command/CommandIrisRegen.java diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..15e047e47cd50b6eb27d0cc7abc77d379b70c6bb GIT binary patch literal 9764 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 X%> z@9gQo*za&`)0ORak`2cTA~n?T+6z#w*^4HV1Qg@cKK8W(tlGwi%=OkZzQV{Z9PA%d zCqlm%#~wwx!O^Ac%curdk$-BfuKLeDL7Cdf(9j9O-sa zAH9}zO{kN!)H3qUEmo%kKft-1qS+#oUeadQ+qfR%d4{2fCA_Xd97J#vYtSL#yG7^^J^~t z9QOvr+E1QduPM?mH5-)t#$gWKJ{}SVE0`}EnJgYfs5(twSa8HKCE{<2}96CgC z_46|+jzh!xN(tBDMmOyvp5xSlK1zcARMp465D^@f|?MY>i~{vbgomGy7>V2l!Vofa8z`e=O`-r|{PfwG4pgJy?r>~MsEY#Vn6wpTSYJ}ylB&v- z97fojY>=l3`ycq+oEHm;r2Z=%llg_4K6sc5_`S#b%949u-*5cy(fuGIDOScLwYiQF zC4C+Zy%)8hfUNelkOYkzuH74T4l9xEU<08y0XuRQ~eJ^cjX%zqm!R+Vls3_5!} o$qO0Z|3oDJM^A=GBR`-enB4B#Qh{Io0Uv;jgra!0sB!Rr0Blx?_W%F@ literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index a90717a15..88ef43393 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 bytecode.ninja Iris - 1.0.6 + 1.0.9 Iris false diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index b9cdbc569..a809ca80f 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -38,10 +38,13 @@ import com.volmit.iris.util.IO; import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.J; import com.volmit.iris.util.KList; +import com.volmit.iris.util.M; import com.volmit.iris.util.MortarPlugin; import com.volmit.iris.util.NastyRunnable; import com.volmit.iris.util.Permission; +import com.volmit.iris.util.Queue; import com.volmit.iris.util.RNG; +import com.volmit.iris.util.ShurikenQueue; public class Iris extends MortarPlugin { @@ -57,6 +60,7 @@ public class Iris extends MortarPlugin public static String nmsTag = findNMSTag(); public static MultiverseCoreLink linkMultiverseCore; private static IrisLock lock = new IrisLock("Iris"); + private static final Queue syncJobs = new ShurikenQueue<>(); public static boolean customModels = doesSupportCustomModels(); public static boolean awareEntities = doesSupportAwareness(); public static boolean biome3d = doesSupport3DBiomes(); @@ -156,9 +160,44 @@ public class Iris extends MortarPlugin J.a(() -> IO.delete(getTemp())); J.a(() -> bstats()); J.s(this::splash, 20); + J.sr(() -> tickQueue(syncJobs), 0); super.onEnable(); } + public static void sq(Runnable r) + { + synchronized(syncJobs) + { + syncJobs.queue(r); + } + } + + private void tickQueue(Queue q) + { + synchronized(q) + { + if(!q.hasNext()) + { + return; + } + + long ms = M.ms(); + + while(q.hasNext() && M.ms() - ms < 25) + { + try + { + q.next().run(); + } + + catch(Throwable e) + { + e.printStackTrace(); + } + } + } + } + private void bstats() { new Metrics(this, 8757); @@ -400,4 +439,17 @@ public class Iris extends MortarPlugin } }, RNG.r.i(100, 1200)); } + + public static String jobCount() + { + return syncJobs.size() + "S"; + } + + public static void clearQueues() + { + synchronized(syncJobs) + { + syncJobs.clear(); + } + } } diff --git a/src/main/java/com/volmit/iris/IrisSettings.java b/src/main/java/com/volmit/iris/IrisSettings.java index 3b10a50b6..884b1b148 100644 --- a/src/main/java/com/volmit/iris/IrisSettings.java +++ b/src/main/java/com/volmit/iris/IrisSettings.java @@ -34,6 +34,10 @@ public class IrisSettings @Desc("Compress parallax data in memory to reduce memory usage in exchange for more cpu usage.") public boolean parallaxCompression = true; + @DontObfuscate + @Desc("Uses a lot of cpu and slows down hotloading") + public boolean regenerateLoadedChunksOnHotload = false; + @DontObfuscate @Desc("Useful information when creating iris worlds. Shows object loads & more.") public boolean verbose = false; diff --git a/src/main/java/com/volmit/iris/command/CommandIris.java b/src/main/java/com/volmit/iris/command/CommandIris.java index 1d1f9e091..9bd850905 100644 --- a/src/main/java/com/volmit/iris/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/command/CommandIris.java @@ -34,6 +34,9 @@ public class CommandIris extends MortarCommand @Command private CommandIrisLMM lmm; + @Command + private CommandIrisRegen regen; + @Command private CommandIrisPregen pregen; diff --git a/src/main/java/com/volmit/iris/command/CommandIrisRegen.java b/src/main/java/com/volmit/iris/command/CommandIrisRegen.java new file mode 100644 index 000000000..4ac4d163a --- /dev/null +++ b/src/main/java/com/volmit/iris/command/CommandIrisRegen.java @@ -0,0 +1,72 @@ +package com.volmit.iris.command; + +import org.bukkit.World; +import org.bukkit.entity.Player; + +import com.volmit.iris.Iris; +import com.volmit.iris.gen.provisions.ProvisionBukkit; +import com.volmit.iris.gen.scaffold.Provisioned; +import com.volmit.iris.util.MortarCommand; +import com.volmit.iris.util.MortarSender; +import com.volmit.iris.util.Spiraler; + +public class CommandIrisRegen extends MortarCommand +{ + public CommandIrisRegen() + { + super("regenerate", "regen", "rg"); + setDescription("Regenerate chunks"); + requiresPermission(Iris.perm.studio); + setCategory("Regen"); + } + + @Override + public boolean handle(MortarSender sender, String[] args) + { + if(sender.isPlayer()) + { + Player p = sender.player(); + World world = p.getWorld(); + if(!(world.getGenerator() instanceof ProvisionBukkit)) + { + sender.sendMessage("You must be in an iris world."); + return true; + } + + Provisioned pr = (Provisioned) world.getGenerator(); + pr.clearRegeneratedLists(); + if(args.length == 0) + { + sender.sendMessage("Regenerating your chunk"); + pr.regenerate(p.getLocation().getChunk().getX(), p.getLocation().getChunk().getZ()); + return true; + } + + try + { + int m = Integer.valueOf(args[0]); + sender.sendMessage("Regenerating " + (m * m) + " Chunks Surrounding you"); + new Spiraler(m, m, (a, b) -> pr.regenerate(a + p.getLocation().getChunk().getX(), b + p.getLocation().getChunk().getZ())).drain(); + } + + catch(Throwable e) + { + sender.sendMessage("/iris regen [SIZE]"); + } + return true; + } + + else + { + sender.sendMessage("Players only."); + } + + return true; + } + + @Override + protected String getArgsUsage() + { + return "/iris regen [size]"; + } +} diff --git a/src/main/java/com/volmit/iris/edit/BlockEditor.java b/src/main/java/com/volmit/iris/edit/BlockEditor.java index 7e809efc9..acdbbe708 100644 --- a/src/main/java/com/volmit/iris/edit/BlockEditor.java +++ b/src/main/java/com/volmit/iris/edit/BlockEditor.java @@ -2,6 +2,7 @@ package com.volmit.iris.edit; import java.io.Closeable; +import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; public interface BlockEditor extends Closeable @@ -11,7 +12,15 @@ public interface BlockEditor extends Closeable public void set(int x, int y, int z, BlockData d); public BlockData get(int x, int y, int z); + + public void setBiome(int x, int z, Biome b); + + public void setBiome(int x, int y, int z, Biome b); @Override public void close(); + + public Biome getBiome(int x, int y, int z); + + public Biome getBiome(int x, int z); } diff --git a/src/main/java/com/volmit/iris/edit/BukkitBlockEditor.java b/src/main/java/com/volmit/iris/edit/BukkitBlockEditor.java index b4df1f3c1..20f07e71f 100644 --- a/src/main/java/com/volmit/iris/edit/BukkitBlockEditor.java +++ b/src/main/java/com/volmit/iris/edit/BukkitBlockEditor.java @@ -1,6 +1,7 @@ package com.volmit.iris.edit; import org.bukkit.World; +import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import com.volmit.iris.util.M; @@ -37,4 +38,30 @@ public class BukkitBlockEditor implements BlockEditor { return M.ms(); } + + @SuppressWarnings("deprecation") + @Override + public void setBiome(int x, int z, Biome b) + { + world.setBiome(x, z, b); + } + + @Override + public void setBiome(int x, int y, int z, Biome b) + { + world.setBiome(x, y, z, b); + } + + @Override + public Biome getBiome(int x, int y, int z) + { + return world.getBiome(x, y, z); + } + + @SuppressWarnings("deprecation") + @Override + public Biome getBiome(int x, int z) + { + return world.getBiome(x, z); + } } diff --git a/src/main/java/com/volmit/iris/edit/WEBlockEditor.java b/src/main/java/com/volmit/iris/edit/WEBlockEditor.java index 274480d03..4a7a39464 100644 --- a/src/main/java/com/volmit/iris/edit/WEBlockEditor.java +++ b/src/main/java/com/volmit/iris/edit/WEBlockEditor.java @@ -1,12 +1,15 @@ package com.volmit.iris.edit; import org.bukkit.World; +import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.world.biome.BiomeTypes; import com.volmit.iris.util.M; public class WEBlockEditor implements BlockEditor @@ -22,12 +25,21 @@ public class WEBlockEditor implements BlockEditor es = WorldEdit.getInstance().newEditSessionBuilder().world(BukkitAdapter.adapt(world)).build(); } + @SuppressWarnings("deprecation") + public void setBiome(int x, int z, Biome b) + { + es.setBiome(BlockVector2.at(x, z), BiomeTypes.get("minecraft:" + b.name().toLowerCase())); + } + + public void setBiome(int x, int y, int z, Biome b) + { + es.setBiome(BlockVector3.at(x, y, z), BiomeTypes.get("minecraft:" + b.name().toLowerCase())); + } + @Override public void set(int x, int y, int z, BlockData d) { - last = M.ms(); es.rawSetBlock(BlockVector3.at(x, y, z), BukkitAdapter.adapt(d)); - world.getBlockAt(x, y, z).setBlockData(d, false); } @Override @@ -48,4 +60,17 @@ public class WEBlockEditor implements BlockEditor { return last; } + + @Override + public Biome getBiome(int x, int y, int z) + { + return world.getBiome(x, y, z); + } + + @SuppressWarnings("deprecation") + @Override + public Biome getBiome(int x, int z) + { + return world.getBiome(x, z); + } } diff --git a/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java index 58b4c506a..036820dcd 100644 --- a/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java @@ -26,6 +26,7 @@ import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.gen.atomics.AtomicMulticache; import com.volmit.iris.gen.scaffold.IrisContext; import com.volmit.iris.gen.scaffold.IrisMetrics; +import com.volmit.iris.gen.scaffold.Provisioned; import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainProvider; import com.volmit.iris.gen.scaffold.TerrainTarget; @@ -54,6 +55,7 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = false) public abstract class ContextualTerrainProvider implements TerrainProvider, Listener { + private Provisioned provisioner; private KList noLoot; private BlockPosition allowLoot; private AtomicMulticache cache; diff --git a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java index 2fcfd7e55..6a6c0fc58 100644 --- a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java @@ -3,6 +3,7 @@ package com.volmit.iris.gen; import java.awt.Color; import java.io.IOException; import java.util.Random; +import java.util.function.Function; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -12,6 +13,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.BlockVector; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; @@ -442,6 +444,32 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte trySpawn(dim.getEntityInitialSpawns(), c, rng); } + @Override + public BlockVector computeSpawn(Function allowed) + { + RNG r = new RNG(489886222).nextParallelRNG(-293667771); + int x = 0; + int y = 0; + int z = 0; + + for(int i = 0; i < 64; i++) + { + x = r.i(-64 - (i * 2), 64 + (i * 2)); + z = r.i(-64 - (i * 2), 64 + (i * 2)); + y = (int) Math.round(getTerrainHeight(x, z)); + BlockVector b = new BlockVector(x, y, z); + + if(y <= getFluidHeight() || !allowed.apply(b)) + { + continue; + } + + return b; + } + + return new BlockVector(x, y, z); + } + @Override protected void onSpawn(EntitySpawnEvent e) { @@ -546,7 +574,7 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte { return false; } - + return getDimension().isVanillaCaves(); } @@ -557,21 +585,19 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte { return false; } - + return getDimension().isVanillaStructures(); } @Override public boolean shouldGenerateMobs() { - // TODO Auto-generated method stub return false; } @Override public boolean shouldGenerateDecorations() { - // TODO Auto-generated method stub - return false; + return true; } } diff --git a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java index 6e2f8883f..b3273294d 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxTerrainProvider.java @@ -3,9 +3,13 @@ package com.volmit.iris.gen; import java.io.IOException; import java.util.List; +import org.bukkit.Chunk; +import org.bukkit.World; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; import org.bukkit.generator.BlockPopulator; +import com.volmit.iris.IrisSettings; import com.volmit.iris.gen.atomics.AtomicSliver; import com.volmit.iris.gen.atomics.AtomicSliverMap; import com.volmit.iris.gen.atomics.AtomicWorldData; @@ -33,6 +37,7 @@ import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; +import com.volmit.iris.util.Spiraler; import lombok.Data; import lombok.EqualsAndHashCode; @@ -96,6 +101,24 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName()); super.onHotload(); setCacheID(RNG.r.simax()); + + if(IrisSettings.get().isRegenerateLoadedChunksOnHotload()) + { + World w = getTarget().getRealWorld(); + + if(w != null) + { + for(Player i : w.getPlayers()) + { + new Spiraler(10, 10, (a, b) -> getProvisioner().regenerate(i.getLocation().getChunk().getX() + a, i.getLocation().getChunk().getZ() + b)).drain(); + } + + for(Chunk i : w.getLoadedChunks()) + { + getProvisioner().regenerate(i.getX(), i.getZ()); + } + } + } } @Override @@ -174,6 +197,27 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider return g; } + public void forgetThisParallaxChunk(int x, int z) + { + getParallaxChunk(x, z).reset(); + getSliverCache().clear(); + getCache().drop(); + } + + public void forgetParallaxChunksNear(int x, int z) + { + getSliverCache().clear(); + getCache().drop(); + ChunkPosition rad = getDimension().getParallaxSize(this); + for(int ii = x - (rad.getX() / 2); ii <= x + (rad.getX() / 2); ii++) + { + for(int jj = z - (rad.getZ() / 2); jj <= z + (rad.getZ() / 2); jj++) + { + getParallaxChunk(ii, jj).reset(); + } + } + } + @Override protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) { @@ -219,8 +263,8 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider for(int jj = z - (rad.getZ() / 2); jj <= z + (rad.getZ() / 2); jj++) { int j = jj; - - RNG random = getMasterRandom().nextParallelRNG(i).nextParallelRNG(j); + RNG salt = new RNG(2922 + i + j).nextParallelRNG(i - 293938).nextParallelRNG(j + 294416); + RNG random = getMasterRandom().nextParallelRNG(i + salt.imax()).nextParallelRNG(j + salt.imax()); if(isParallaxGenerated(ii, jj)) { @@ -236,7 +280,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider { IrisBiome b = sampleTrueBiome((i * 16) + 7, (j * 16) + 7); IrisRegion r = sampleRegion((i * 16) + 7, (j * 16) + 7); - RNG ro = getMasterRandom().nextParallelRNG(496888 + i + j); + RNG ro = getMasterRandom().nextParallelRNG(196888 + i + j + 2225).nextParallelRNG(salt.i(-i, i)).nextParallelRNG(salt.i(-j, j)); int g = 1; g = placeMutations(ro, random, i, j, g); g = placeText(random, r, b, i, j, g); diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicSliverMap.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicSliverMap.java index fd21a5469..15b9b2837 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicSliverMap.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicSliverMap.java @@ -210,4 +210,19 @@ public class AtomicSliverMap } } } + + public void reset() + { + setParallaxGenerated(false); + setWorldGenerated(false); + getStructures().clear(); + + for(int i = 0; i < 16; i++) + { + for(int j = 0; j < 16; j++) + { + slivers[i * 16 + j] = new AtomicSliver(i, j); + } + } + } } diff --git a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java index f90f1bef4..dfdaea5d7 100644 --- a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java +++ b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java @@ -2,18 +2,27 @@ package com.volmit.iris.gen.provisions; import java.util.List; import java.util.Random; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import java.util.function.Consumer; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; +import com.volmit.iris.Iris; +import com.volmit.iris.IrisSettings; +import com.volmit.iris.gen.IrisTerrainProvider; import com.volmit.iris.gen.scaffold.HeightedFakeWorld; import com.volmit.iris.gen.scaffold.Provisioned; import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainProvider; import com.volmit.iris.util.ChunkPosition; +import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.RNG; @@ -28,21 +37,107 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned private boolean worldSet = false; private final TerrainProvider provider; private final KMap precache; + private KList regenerated = new KList(); + private Executor e = Executors.newFixedThreadPool(IrisSettings.get().getThreads()); + private World cachedWorld; public ProvisionBukkit(TerrainProvider provider) { this.provider = provider; + provider.setProvisioner(this); precache = new KMap<>(); } + public void clearRegeneratedLists() + { + regenerated.clear(); + Iris.clearQueues(); + } + + @SuppressWarnings("deprecation") + @Override + public void regenerate(int x, int z) + { + boolean exists = cachedWorld.loadChunk(x, z, false); + + if(!exists) + { + return; + } + + ChunkPosition ccp = new ChunkPosition(x, z); + + if(regenerated.contains(ccp)) + { + return; + } + + regenerated.add(ccp); + e.execute(() -> + { + ((IrisTerrainProvider) getProvider()).forgetParallaxChunksNear(x, z); + TerrainChunk snapshot = TerrainChunk.create(cachedWorld); + snapshot.setRaw(generateChunkData(cachedWorld, getRNG(cachedWorld, x, z), x, z, snapshot)); + + int cx = x * 16; + int cz = z * 16; + Iris.sq(() -> + { + for(int hh = 0; hh < 16; hh++) + { + int h = hh; + + for(int i = 0; i < 16; i++) + { + for(int j = 0; j < 16; j++) + { + for(int k = 0; k < 16; k++) + { + BlockData b = snapshot.getBlockData(i, (h * 16) + j, k); + + if(!Iris.edit.get(cachedWorld, i + cx, (h * 16) + j, k + cz).equals(b)) + { + Iris.edit.set(cachedWorld, i + cx, (h * 16) + j, k + cz, b); + } + + if(Iris.biome3d) + { + Biome bo = snapshot.getBiome(i, (h * 16) + j, k); + + if(!Iris.edit.getBiome(cachedWorld, i, (h * 16) + j, k).equals(bo)) + { + Iris.edit.setBiome(cachedWorld, i + cx, (h * 16) + j, k + cz, bo); + } + + } + + else if(j == 0 && h == 0) + { + Biome bo = snapshot.getBiome(i, k); + + if(!Iris.edit.getBiome(cachedWorld, i, k).equals(bo)) + { + Iris.edit.setBiome(cachedWorld, i + cx, k + cz, bo); + } + } + } + } + } + } + }); + }); + } + public void generate(World world, int x, int z) { + cachedWorld = world; world.loadChunk(x, z, true); world.unloadChunkRequest(x, z); } public void generateAsync(World world, int x, int z, Consumer onDone) { + cachedWorld = world; ChunkPosition c = new ChunkPosition(x, z); if(!precache.containsKey(c)) @@ -59,13 +154,61 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned } } + public void fixSpawn(World w) + { + cachedWorld = w; + if(w.getSpawnLocation().getY() == 0 && w.getSpawnLocation().getZ() == 0 && w.getSpawnLocation().getX() == 0) + { + w.setSpawnLocation(provider.computeSpawn((b) -> + { + Location at = b.toLocation(w); + Location ab = at.clone().add(0, 1, 0); + Location bl = at.clone().add(0, -1, 0); + + if(!bl.getBlock().getType().isSolid()) + { + return false; + } + + if(ab.getBlock().getType().isSolid()) + { + return false; + } + + if(at.getBlock().getType().isSolid()) + { + return false; + } + + if(!ab.getBlock().getType().isAir()) + { + return false; + } + + if(!at.getBlock().getType().isAir()) + { + return false; + } + + return true; + }).toLocation(w)); + Iris.info("Fixed " + w.getName() + " Spawn to " + w.getSpawnLocation().getBlockX() + ", " + w.getSpawnLocation().getBlockY() + ", " + w.getSpawnLocation().getBlockZ()); + } + } + @Override public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome) { + cachedWorld = world; if(!worldSet) { worldSet = true; provider.getTarget().setRealWorld(world); + + if(world.getSpawnLocation().getY() == 0 && world.getSpawnLocation().getZ() == 0 && world.getSpawnLocation().getX() == 0) + { + Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> fixSpawn(world)); + } } if(precache.size() > 0) @@ -86,25 +229,28 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned private Random getRNG(World world, int x, int z) { + cachedWorld = world; return new RNG(world.getSeed()).nextParallelRNG(x).nextParallelRNG(z); } @Override public boolean canSpawn(World world, int x, int z) { + cachedWorld = world; return provider.canSpawn(x, z); } @Override public List getDefaultPopulators(World world) { + cachedWorld = world; return provider.getPopulators(); } @Override public Location getFixedSpawnLocation(World world, Random random) { - return super.getFixedSpawnLocation(world, random); + return null; } @Override diff --git a/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java b/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java index bbb8a5a63..250737a1e 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java @@ -2,5 +2,9 @@ package com.volmit.iris.gen.scaffold; public interface Provisioned { + public void clearRegeneratedLists(); + public TerrainProvider getProvider(); + + public void regenerate(int x, int z); } diff --git a/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java b/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java index e5a88e237..7f2e60eb2 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java @@ -2,12 +2,20 @@ package com.volmit.iris.gen.scaffold; import java.util.List; import java.util.Random; +import java.util.function.Function; import org.bukkit.generator.BlockPopulator; +import org.bukkit.util.BlockVector; public interface TerrainProvider { public TerrainTarget getTarget(); + + public Provisioned getProvisioner(); + + public void setProvisioner(Provisioned p); + + public BlockVector computeSpawn(Function allowed); public void generate(Random random, int x, int z, TerrainChunk chunk); @@ -18,9 +26,9 @@ public interface TerrainProvider public boolean isParallelCapable(); public boolean shouldGenerateMobs(); - + public boolean shouldGenerateCaves(); - + public boolean shouldGenerateDecorations(); public boolean shouldGenerateVanillaStructures(); diff --git a/src/main/java/com/volmit/iris/manager/EditManager.java b/src/main/java/com/volmit/iris/manager/EditManager.java index 89d1f79a0..4585ebcc9 100644 --- a/src/main/java/com/volmit/iris/manager/EditManager.java +++ b/src/main/java/com/volmit/iris/manager/EditManager.java @@ -2,6 +2,7 @@ package com.volmit.iris.manager; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -22,7 +23,7 @@ public class EditManager implements Listener { this.editors = new KMap<>(); Iris.instance.registerListener(this); - Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::update, 0, 20); + Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::update, 0, 0); } public BlockData get(World world, int x, int y, int z) @@ -35,6 +36,26 @@ public class EditManager implements Listener open(world).set(x, y, z, d); } + public void setBiome(World world, int x, int y, int z, Biome d) + { + open(world).setBiome(x, y, z, d); + } + + public void setBiome(World world, int x, int z, Biome d) + { + open(world).setBiome(x, z, d); + } + + public Biome getBiome(World world, int x, int y, int z) + { + return open(world).getBiome(x, y, z); + } + + public Biome getBiome(World world, int x, int z) + { + return open(world).getBiome(x, z); + } + @EventHandler public void on(WorldUnloadEvent e) { diff --git a/src/main/java/com/volmit/iris/manager/IrisBoardManager.java b/src/main/java/com/volmit/iris/manager/IrisBoardManager.java index 5a0075238..5f3c13450 100644 --- a/src/main/java/com/volmit/iris/manager/IrisBoardManager.java +++ b/src/main/java/com/volmit/iris/manager/IrisBoardManager.java @@ -110,6 +110,7 @@ public class IrisBoardManager implements BoardProvider, Listener v.add(C.GREEN + "Parallax" + C.GRAY + ": " + Form.f((int) g.getParallaxMap().getLoadedChunks().size())); v.add(C.GREEN + "Objects" + C.GRAY + ": " + Form.f(g.getData().getObjectLoader().count())); v.add(C.GREEN + "Memory" + C.GRAY + ": " + mem); + v.add(C.GREEN + "Jobs" + C.GRAY + ": " + Iris.jobCount()); v.add("&7&m------------------"); v.add(C.GREEN + "Heightmap" + C.GRAY + ": " + (int) g.getTerrainHeight(x, z)); diff --git a/src/main/java/com/volmit/iris/manager/IrisProject.java b/src/main/java/com/volmit/iris/manager/IrisProject.java index a90b142b0..bc13d8a87 100644 --- a/src/main/java/com/volmit/iris/manager/IrisProject.java +++ b/src/main/java/com/volmit/iris/manager/IrisProject.java @@ -7,7 +7,6 @@ import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.WorldType; @@ -207,7 +206,7 @@ public class IrisProject if(sender.isPlayer()) { - sender.player().teleport(new Location(world, 0, 0, world.getHighestBlockYAt(0, 0))); + sender.player().teleport(world.getSpawnLocation()); } Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> diff --git a/src/main/java/com/volmit/iris/manager/ProjectManager.java b/src/main/java/com/volmit/iris/manager/ProjectManager.java index 014af067d..03b5f5337 100644 --- a/src/main/java/com/volmit/iris/manager/ProjectManager.java +++ b/src/main/java/com/volmit/iris/manager/ProjectManager.java @@ -12,14 +12,7 @@ import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; -import com.volmit.iris.object.InterpolationMethod; -import com.volmit.iris.object.IrisBiome; -import com.volmit.iris.object.IrisBiomeGeneratorLink; import com.volmit.iris.object.IrisDimension; -import com.volmit.iris.object.IrisGenerator; -import com.volmit.iris.object.IrisInterpolator; -import com.volmit.iris.object.IrisNoiseGenerator; -import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.Form; import com.volmit.iris.util.IO; import com.volmit.iris.util.J; @@ -448,101 +441,7 @@ public class ProjectManager public void create(MortarSender sender, String s) { - if(generate(sender, s)) - { - Iris.proj.open(sender, s); - } - } - - private boolean generate(MortarSender sender, String s) - { - IrisDimension dimension = new IrisDimension(); - dimension.setLoadKey(s); - dimension.setName(Form.capitalizeWords(s.replaceAll("\\Q-\\E", " "))); - - if(getWorkspaceFile(dimension.getLoadKey(), "dimensions", dimension.getLoadKey() + ".json").exists()) - { - sender.sendMessage("Project Already Exists! Open it instead!"); - return false; - } - sender.sendMessage("Creating New Project \"" + dimension.getName() + "\"..."); - IrisRegion exampleRegion = new IrisRegion(); - exampleRegion.setName("Example Region"); - exampleRegion.setLoadKey("example-region"); - IrisBiome exampleLand1 = new IrisBiome(); - exampleLand1.setName("Example Land 1"); - exampleLand1.setLoadKey("land-1"); - IrisBiome exampleShore1 = new IrisBiome(); - exampleShore1.setName("Example Shore"); - exampleShore1.setLoadKey("shore"); - IrisBiome exampleOcean1 = new IrisBiome(); - exampleOcean1.setName("Example Sea"); - exampleOcean1.setLoadKey("sea"); - IrisBiome exampleLand2 = new IrisBiome(); - exampleLand2.setName("Example Land 2"); - exampleLand2.setLoadKey("land-2"); - exampleLand2.setRarity(4); - dimension.setSeaZoom(1); - dimension.setLandZoom(1.5); - IrisGenerator gen = new IrisGenerator(); - IrisNoiseGenerator gg = new IrisNoiseGenerator(true); - gen.getComposite().add(gg); - IrisInterpolator it = new IrisInterpolator(); - it.setFunction(InterpolationMethod.BILINEAR_STARCAST_9); - it.setHorizontalScale(9); - gen.setInterpolator(it); - gen.setLoadKey("example-generator"); - IrisBiomeGeneratorLink b1 = new IrisBiomeGeneratorLink(); - b1.setGenerator(gen.getLoadKey()); - b1.setMin(3); - b1.setMax(7); - IrisBiomeGeneratorLink b2 = new IrisBiomeGeneratorLink(); - b2.setGenerator(gen.getLoadKey()); - b2.setMin(12); - b2.setMax(35); - IrisBiomeGeneratorLink b3 = new IrisBiomeGeneratorLink(); - b3.setGenerator(gen.getLoadKey()); - b3.setMin(-1); - b3.setMax(1); - IrisBiomeGeneratorLink b4 = new IrisBiomeGeneratorLink(); - b4.setGenerator(gen.getLoadKey()); - b4.setMin(-5); - b4.setMax(-38); - exampleLand1.getGenerators().clear(); - exampleLand1.getGenerators().add(b1); - exampleLand2.getGenerators().clear(); - exampleLand2.getGenerators().add(b2); - exampleShore1.getGenerators().clear(); - exampleShore1.getGenerators().add(b3); - exampleOcean1.getGenerators().clear(); - exampleOcean1.getGenerators().add(b4); - exampleRegion.getLandBiomes().add(exampleLand1.getLoadKey()); - exampleRegion.getLandBiomes().add(exampleLand2.getLoadKey()); - exampleRegion.getShoreBiomes().add(exampleShore1.getLoadKey()); - exampleRegion.getSeaBiomes().add(exampleOcean1.getLoadKey()); - dimension.getRegions().add(exampleRegion.getLoadKey()); - IrisProject project = new IrisProject(getWorkspaceFolder(dimension.getLoadKey())); - try - { - JSONObject ws = project.createCodeWorkspaceConfig(); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), "dimensions", dimension.getLoadKey() + ".json"), new JSONObject(new Gson().toJson(dimension)).toString(4)); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), "regions", exampleRegion.getLoadKey() + ".json"), new JSONObject(new Gson().toJson(exampleRegion)).toString(4)); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), "biomes", exampleLand1.getLoadKey() + ".json"), new JSONObject(new Gson().toJson(exampleLand1)).toString(4)); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), "biomes", exampleLand2.getLoadKey() + ".json"), new JSONObject(new Gson().toJson(exampleLand2)).toString(4)); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), "biomes", exampleShore1.getLoadKey() + ".json"), new JSONObject(new Gson().toJson(exampleShore1)).toString(4)); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), "biomes", exampleOcean1.getLoadKey() + ".json"), new JSONObject(new Gson().toJson(exampleOcean1)).toString(4)); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), "generators", gen.getLoadKey() + ".json"), new JSONObject(new Gson().toJson(gen)).toString(4)); - IO.writeAll(getWorkspaceFile(dimension.getLoadKey(), dimension.getLoadKey() + ".code-workspace"), ws.toString(0)); - } - - catch(JSONException | IOException e) - { - sender.sendMessage("Failed! Check the console."); - e.printStackTrace(); - return false; - } - - return true; + create(sender, s, "example"); } public void updateWorkspace() diff --git a/src/main/java/com/volmit/iris/util/Spiraler.java b/src/main/java/com/volmit/iris/util/Spiraler.java index 8edfbaba2..f2fd39f03 100644 --- a/src/main/java/com/volmit/iris/util/Spiraler.java +++ b/src/main/java/com/volmit/iris/util/Spiraler.java @@ -14,15 +14,24 @@ public class Spiraler retarget(sizeX, sizeZ); } + public void drain() + { + while(hasNext()) + { + next(); + } + } + static void Spiral(int X, int Y) { } - public void setOffset(int ox, int oz) + public Spiraler setOffset(int ox, int oz) { this.ox = ox; this.oz = oz; + return this; } public void retarget(int sizeX, int sizeZ)