9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-23 17:19:16 +00:00

Fix commands & support regeneration

This commit is contained in:
Daniel Mills
2020-10-12 00:18:05 -04:00
parent a46f57eaab
commit e72ea21b6b
21 changed files with 486 additions and 120 deletions

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>bytecode.ninja</groupId> <groupId>bytecode.ninja</groupId>
<artifactId>Iris</artifactId> <artifactId>Iris</artifactId>
<version>1.0.6</version> <version>1.0.9</version>
<name>Iris</name> <name>Iris</name>
<properties> <properties>
<skip.copy>false</skip.copy> <skip.copy>false</skip.copy>

View File

@@ -38,10 +38,13 @@ import com.volmit.iris.util.IO;
import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.IrisLock;
import com.volmit.iris.util.J; import com.volmit.iris.util.J;
import com.volmit.iris.util.KList; import com.volmit.iris.util.KList;
import com.volmit.iris.util.M;
import com.volmit.iris.util.MortarPlugin; import com.volmit.iris.util.MortarPlugin;
import com.volmit.iris.util.NastyRunnable; import com.volmit.iris.util.NastyRunnable;
import com.volmit.iris.util.Permission; import com.volmit.iris.util.Permission;
import com.volmit.iris.util.Queue;
import com.volmit.iris.util.RNG; import com.volmit.iris.util.RNG;
import com.volmit.iris.util.ShurikenQueue;
public class Iris extends MortarPlugin public class Iris extends MortarPlugin
{ {
@@ -57,6 +60,7 @@ public class Iris extends MortarPlugin
public static String nmsTag = findNMSTag(); public static String nmsTag = findNMSTag();
public static MultiverseCoreLink linkMultiverseCore; public static MultiverseCoreLink linkMultiverseCore;
private static IrisLock lock = new IrisLock("Iris"); private static IrisLock lock = new IrisLock("Iris");
private static final Queue<Runnable> syncJobs = new ShurikenQueue<>();
public static boolean customModels = doesSupportCustomModels(); public static boolean customModels = doesSupportCustomModels();
public static boolean awareEntities = doesSupportAwareness(); public static boolean awareEntities = doesSupportAwareness();
public static boolean biome3d = doesSupport3DBiomes(); public static boolean biome3d = doesSupport3DBiomes();
@@ -156,9 +160,44 @@ public class Iris extends MortarPlugin
J.a(() -> IO.delete(getTemp())); J.a(() -> IO.delete(getTemp()));
J.a(() -> bstats()); J.a(() -> bstats());
J.s(this::splash, 20); J.s(this::splash, 20);
J.sr(() -> tickQueue(syncJobs), 0);
super.onEnable(); super.onEnable();
} }
public static void sq(Runnable r)
{
synchronized(syncJobs)
{
syncJobs.queue(r);
}
}
private void tickQueue(Queue<Runnable> 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() private void bstats()
{ {
new Metrics(this, 8757); new Metrics(this, 8757);
@@ -400,4 +439,17 @@ public class Iris extends MortarPlugin
} }
}, RNG.r.i(100, 1200)); }, RNG.r.i(100, 1200));
} }
public static String jobCount()
{
return syncJobs.size() + "S";
}
public static void clearQueues()
{
synchronized(syncJobs)
{
syncJobs.clear();
}
}
} }

View File

@@ -34,6 +34,10 @@ public class IrisSettings
@Desc("Compress parallax data in memory to reduce memory usage in exchange for more cpu usage.") @Desc("Compress parallax data in memory to reduce memory usage in exchange for more cpu usage.")
public boolean parallaxCompression = true; public boolean parallaxCompression = true;
@DontObfuscate
@Desc("Uses a lot of cpu and slows down hotloading")
public boolean regenerateLoadedChunksOnHotload = false;
@DontObfuscate @DontObfuscate
@Desc("Useful information when creating iris worlds. Shows object loads & more.") @Desc("Useful information when creating iris worlds. Shows object loads & more.")
public boolean verbose = false; public boolean verbose = false;

View File

@@ -34,6 +34,9 @@ public class CommandIris extends MortarCommand
@Command @Command
private CommandIrisLMM lmm; private CommandIrisLMM lmm;
@Command
private CommandIrisRegen regen;
@Command @Command
private CommandIrisPregen pregen; private CommandIrisPregen pregen;

View File

@@ -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]";
}
}

View File

@@ -2,6 +2,7 @@ package com.volmit.iris.edit;
import java.io.Closeable; import java.io.Closeable;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
public interface BlockEditor extends Closeable public interface BlockEditor extends Closeable
@@ -12,6 +13,14 @@ public interface BlockEditor extends Closeable
public BlockData get(int x, int y, int z); 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 @Override
public void close(); public void close();
public Biome getBiome(int x, int y, int z);
public Biome getBiome(int x, int z);
} }

View File

@@ -1,6 +1,7 @@
package com.volmit.iris.edit; package com.volmit.iris.edit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import com.volmit.iris.util.M; import com.volmit.iris.util.M;
@@ -37,4 +38,30 @@ public class BukkitBlockEditor implements BlockEditor
{ {
return M.ms(); 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);
}
} }

View File

@@ -1,12 +1,15 @@
package com.volmit.iris.edit; package com.volmit.iris.edit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.biome.BiomeTypes;
import com.volmit.iris.util.M; import com.volmit.iris.util.M;
public class WEBlockEditor implements BlockEditor public class WEBlockEditor implements BlockEditor
@@ -22,12 +25,21 @@ public class WEBlockEditor implements BlockEditor
es = WorldEdit.getInstance().newEditSessionBuilder().world(BukkitAdapter.adapt(world)).build(); 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 @Override
public void set(int x, int y, int z, BlockData d) public void set(int x, int y, int z, BlockData d)
{ {
last = M.ms();
es.rawSetBlock(BlockVector3.at(x, y, z), BukkitAdapter.adapt(d)); es.rawSetBlock(BlockVector3.at(x, y, z), BukkitAdapter.adapt(d));
world.getBlockAt(x, y, z).setBlockData(d, false);
} }
@Override @Override
@@ -48,4 +60,17 @@ public class WEBlockEditor implements BlockEditor
{ {
return last; 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);
}
} }

View File

@@ -26,6 +26,7 @@ import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.gen.atomics.AtomicMulticache; import com.volmit.iris.gen.atomics.AtomicMulticache;
import com.volmit.iris.gen.scaffold.IrisContext; import com.volmit.iris.gen.scaffold.IrisContext;
import com.volmit.iris.gen.scaffold.IrisMetrics; 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.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainProvider; import com.volmit.iris.gen.scaffold.TerrainProvider;
import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.gen.scaffold.TerrainTarget;
@@ -54,6 +55,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public abstract class ContextualTerrainProvider implements TerrainProvider, Listener public abstract class ContextualTerrainProvider implements TerrainProvider, Listener
{ {
private Provisioned provisioner;
private KList<BlockPosition> noLoot; private KList<BlockPosition> noLoot;
private BlockPosition allowLoot; private BlockPosition allowLoot;
private AtomicMulticache cache; private AtomicMulticache cache;

View File

@@ -3,6 +3,7 @@ package com.volmit.iris.gen;
import java.awt.Color; import java.awt.Color;
import java.io.IOException; import java.io.IOException;
import java.util.Random; import java.util.Random;
import java.util.function.Function;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
@@ -12,6 +13,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.util.BlockVector;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings; import com.volmit.iris.IrisSettings;
@@ -442,6 +444,32 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte
trySpawn(dim.getEntityInitialSpawns(), c, rng); trySpawn(dim.getEntityInitialSpawns(), c, rng);
} }
@Override
public BlockVector computeSpawn(Function<BlockVector, Boolean> 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 @Override
protected void onSpawn(EntitySpawnEvent e) protected void onSpawn(EntitySpawnEvent e)
{ {
@@ -564,14 +592,12 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte
@Override @Override
public boolean shouldGenerateMobs() public boolean shouldGenerateMobs()
{ {
// TODO Auto-generated method stub
return false; return false;
} }
@Override @Override
public boolean shouldGenerateDecorations() public boolean shouldGenerateDecorations()
{ {
// TODO Auto-generated method stub return true;
return false;
} }
} }

View File

@@ -3,9 +3,13 @@ package com.volmit.iris.gen;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.atomics.AtomicSliver; import com.volmit.iris.gen.atomics.AtomicSliver;
import com.volmit.iris.gen.atomics.AtomicSliverMap; import com.volmit.iris.gen.atomics.AtomicSliverMap;
import com.volmit.iris.gen.atomics.AtomicWorldData; 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.KMap;
import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.PrecisionStopwatch;
import com.volmit.iris.util.RNG; import com.volmit.iris.util.RNG;
import com.volmit.iris.util.Spiraler;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -96,6 +101,24 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName()); getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
super.onHotload(); super.onHotload();
setCacheID(RNG.r.simax()); 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 @Override
@@ -174,6 +197,27 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
return g; 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 @Override
protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) 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++) for(int jj = z - (rad.getZ() / 2); jj <= z + (rad.getZ() / 2); jj++)
{ {
int j = jj; int j = jj;
RNG salt = new RNG(2922 + i + j).nextParallelRNG(i - 293938).nextParallelRNG(j + 294416);
RNG random = getMasterRandom().nextParallelRNG(i).nextParallelRNG(j); RNG random = getMasterRandom().nextParallelRNG(i + salt.imax()).nextParallelRNG(j + salt.imax());
if(isParallaxGenerated(ii, jj)) if(isParallaxGenerated(ii, jj))
{ {
@@ -236,7 +280,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
{ {
IrisBiome b = sampleTrueBiome((i * 16) + 7, (j * 16) + 7); IrisBiome b = sampleTrueBiome((i * 16) + 7, (j * 16) + 7);
IrisRegion r = sampleRegion((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; int g = 1;
g = placeMutations(ro, random, i, j, g); g = placeMutations(ro, random, i, j, g);
g = placeText(random, r, b, i, j, g); g = placeText(random, r, b, i, j, g);

View File

@@ -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);
}
}
}
} }

View File

@@ -2,18 +2,27 @@ package com.volmit.iris.gen.provisions;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator; 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.HeightedFakeWorld;
import com.volmit.iris.gen.scaffold.Provisioned; import com.volmit.iris.gen.scaffold.Provisioned;
import com.volmit.iris.gen.scaffold.TerrainChunk; import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainProvider; import com.volmit.iris.gen.scaffold.TerrainProvider;
import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KMap; import com.volmit.iris.util.KMap;
import com.volmit.iris.util.RNG; import com.volmit.iris.util.RNG;
@@ -28,21 +37,107 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned
private boolean worldSet = false; private boolean worldSet = false;
private final TerrainProvider provider; private final TerrainProvider provider;
private final KMap<ChunkPosition, TerrainChunk> precache; private final KMap<ChunkPosition, TerrainChunk> precache;
private KList<ChunkPosition> regenerated = new KList<ChunkPosition>();
private Executor e = Executors.newFixedThreadPool(IrisSettings.get().getThreads());
private World cachedWorld;
public ProvisionBukkit(TerrainProvider provider) public ProvisionBukkit(TerrainProvider provider)
{ {
this.provider = provider; this.provider = provider;
provider.setProvisioner(this);
precache = new KMap<>(); 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) public void generate(World world, int x, int z)
{ {
cachedWorld = world;
world.loadChunk(x, z, true); world.loadChunk(x, z, true);
world.unloadChunkRequest(x, z); world.unloadChunkRequest(x, z);
} }
public void generateAsync(World world, int x, int z, Consumer<Boolean> onDone) public void generateAsync(World world, int x, int z, Consumer<Boolean> onDone)
{ {
cachedWorld = world;
ChunkPosition c = new ChunkPosition(x, z); ChunkPosition c = new ChunkPosition(x, z);
if(!precache.containsKey(c)) 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 @Override
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome) public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
{ {
cachedWorld = world;
if(!worldSet) if(!worldSet)
{ {
worldSet = true; worldSet = true;
provider.getTarget().setRealWorld(world); 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) if(precache.size() > 0)
@@ -86,25 +229,28 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned
private Random getRNG(World world, int x, int z) private Random getRNG(World world, int x, int z)
{ {
cachedWorld = world;
return new RNG(world.getSeed()).nextParallelRNG(x).nextParallelRNG(z); return new RNG(world.getSeed()).nextParallelRNG(x).nextParallelRNG(z);
} }
@Override @Override
public boolean canSpawn(World world, int x, int z) public boolean canSpawn(World world, int x, int z)
{ {
cachedWorld = world;
return provider.canSpawn(x, z); return provider.canSpawn(x, z);
} }
@Override @Override
public List<BlockPopulator> getDefaultPopulators(World world) public List<BlockPopulator> getDefaultPopulators(World world)
{ {
cachedWorld = world;
return provider.getPopulators(); return provider.getPopulators();
} }
@Override @Override
public Location getFixedSpawnLocation(World world, Random random) public Location getFixedSpawnLocation(World world, Random random)
{ {
return super.getFixedSpawnLocation(world, random); return null;
} }
@Override @Override

View File

@@ -2,5 +2,9 @@ package com.volmit.iris.gen.scaffold;
public interface Provisioned public interface Provisioned
{ {
public void clearRegeneratedLists();
public TerrainProvider getProvider(); public TerrainProvider getProvider();
public void regenerate(int x, int z);
} }

View File

@@ -2,13 +2,21 @@ package com.volmit.iris.gen.scaffold;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.function.Function;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
import org.bukkit.util.BlockVector;
public interface TerrainProvider public interface TerrainProvider
{ {
public TerrainTarget getTarget(); public TerrainTarget getTarget();
public Provisioned getProvisioner();
public void setProvisioner(Provisioned p);
public BlockVector computeSpawn(Function<BlockVector, Boolean> allowed);
public void generate(Random random, int x, int z, TerrainChunk chunk); public void generate(Random random, int x, int z, TerrainChunk chunk);
public boolean canSpawn(int x, int z); public boolean canSpawn(int x, int z);

View File

@@ -2,6 +2,7 @@ package com.volmit.iris.manager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@@ -22,7 +23,7 @@ public class EditManager implements Listener
{ {
this.editors = new KMap<>(); this.editors = new KMap<>();
Iris.instance.registerListener(this); 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) 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); 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 @EventHandler
public void on(WorldUnloadEvent e) public void on(WorldUnloadEvent e)
{ {

View File

@@ -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 + "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 + "Objects" + C.GRAY + ": " + Form.f(g.getData().getObjectLoader().count()));
v.add(C.GREEN + "Memory" + C.GRAY + ": " + mem); v.add(C.GREEN + "Memory" + C.GRAY + ": " + mem);
v.add(C.GREEN + "Jobs" + C.GRAY + ": " + Iris.jobCount());
v.add("&7&m------------------"); v.add("&7&m------------------");
v.add(C.GREEN + "Heightmap" + C.GRAY + ": " + (int) g.getTerrainHeight(x, z)); v.add(C.GREEN + "Heightmap" + C.GRAY + ": " + (int) g.getTerrainHeight(x, z));

View File

@@ -7,7 +7,6 @@ import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
import org.bukkit.WorldType; import org.bukkit.WorldType;
@@ -207,7 +206,7 @@ public class IrisProject
if(sender.isPlayer()) 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, () -> Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () ->

View File

@@ -12,14 +12,7 @@ import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException; import com.google.gson.JsonSyntaxException;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings; 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.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.Form;
import com.volmit.iris.util.IO; import com.volmit.iris.util.IO;
import com.volmit.iris.util.J; import com.volmit.iris.util.J;
@@ -448,101 +441,7 @@ public class ProjectManager
public void create(MortarSender sender, String s) public void create(MortarSender sender, String s)
{ {
if(generate(sender, s)) create(sender, s, "example");
{
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;
} }
public void updateWorkspace() public void updateWorkspace()

View File

@@ -14,15 +14,24 @@ public class Spiraler
retarget(sizeX, sizeZ); retarget(sizeX, sizeZ);
} }
public void drain()
{
while(hasNext())
{
next();
}
}
static void Spiral(int X, int Y) 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.ox = ox;
this.oz = oz; this.oz = oz;
return this;
} }
public void retarget(int sizeX, int sizeZ) public void retarget(int sizeX, int sizeZ)