diff --git a/icon.png b/icon.png
new file mode 100644
index 000000000..15e047e47
Binary files /dev/null and b/icon.png differ
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)