diff --git a/pom.xml b/pom.xml
index 1b3282972..d2e755221 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,12 +161,31 @@
1.16.1-R0.1-SNAPSHOT
provided
+
org.bukkit.craftbukkit
cb-1.16.2
1.16.2
provided
+
+ org.bukkit.craftbukkit
+ cb-1.16.1
+ 1.16.1
+ provided
+
+
+ org.bukkit.craftbukkit
+ cb-1.15.1
+ 1.15.1
+ provided
+
+
+ org.bukkit.craftbukkit
+ cb-1.14.4
+ 1.14.4
+ provided
+
org.bstats
diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java
index 4c3f9bc74..a32a03f77 100644
--- a/src/main/java/com/volmit/iris/Iris.java
+++ b/src/main/java/com/volmit/iris/Iris.java
@@ -4,15 +4,14 @@ import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.World;
+import org.bukkit.World.Environment;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
-import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
import org.bukkit.event.HandlerList;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.Plugin;
@@ -27,6 +26,9 @@ import com.volmit.iris.gen.post.PostPotholeFiller;
import com.volmit.iris.gen.post.PostSlabber;
import com.volmit.iris.gen.post.PostWallPatcher;
import com.volmit.iris.gen.post.PostWaterlogger;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
+import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.link.MultiverseCoreLink;
import com.volmit.iris.util.C;
import com.volmit.iris.util.Form;
@@ -37,7 +39,6 @@ import com.volmit.iris.util.IrisPostBlockFilter;
import com.volmit.iris.util.J;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.MortarPlugin;
-import com.volmit.iris.util.NMSVersion;
import com.volmit.iris.util.Permission;
public class Iris extends MortarPlugin
@@ -86,6 +87,16 @@ public class Iris extends MortarPlugin
return "UNKNOWN NMS VERSION";
}
+ public ProvisionBukkit createProvisionBukkit(IrisGenConfiguration config)
+ {
+ return new ProvisionBukkit(createIrisProvider(config));
+ }
+
+ public IrisChunkGenerator createIrisProvider(IrisGenConfiguration config)
+ {
+ return new IrisChunkGenerator(config);
+ }
+
private static boolean doesSupport3DBiomes()
{
int v = Integer.valueOf(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]);
@@ -160,9 +171,9 @@ public class Iris extends MortarPlugin
for(World i : Bukkit.getWorlds())
{
- if(i.getGenerator() instanceof IrisChunkGenerator)
+ if(i.getGenerator() instanceof ProvisionBukkit)
{
- ((IrisChunkGenerator) i.getGenerator()).close();
+ ((IrisChunkGenerator) ((ProvisionBukkit) i.getGenerator()).getProvider()).close();
}
}
@@ -208,7 +219,18 @@ public class Iris extends MortarPlugin
@Override
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
{
- return new IrisChunkGenerator(IrisSettings.get().threads);
+ //@builder
+ return createProvisionBukkit(IrisGenConfiguration.builder()
+ .threads(IrisSettings.get().threads)
+ .target(TerrainTarget
+ .builder()
+ .environment(Environment.NORMAL)
+ .folder(new File(worldName))
+ .name(worldName)
+ .seed(worldName.hashCode())
+ .build()
+ ).build());
+ //@done
}
public static void msg(String string)
diff --git a/src/main/java/com/volmit/iris/IrisBoardManager.java b/src/main/java/com/volmit/iris/IrisBoardManager.java
index 6a33cfe5a..b562cb4b4 100644
--- a/src/main/java/com/volmit/iris/IrisBoardManager.java
+++ b/src/main/java/com/volmit/iris/IrisBoardManager.java
@@ -9,6 +9,7 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import com.volmit.iris.gen.IrisChunkGenerator;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.BoardManager;
@@ -54,7 +55,7 @@ public class IrisBoardManager implements BoardProvider, Listener
@DontObfuscate
private boolean isIrisWorld(World w)
{
- return (w.getGenerator() instanceof IrisChunkGenerator) && ((IrisChunkGenerator) w.getGenerator()).isDev();
+ return (w.getGenerator() instanceof ProvisionBukkit) && ((IrisChunkGenerator) ((ProvisionBukkit) w.getGenerator()).getProvider()).isDev();
}
public void updatePlayer(Player p)
@@ -88,7 +89,7 @@ public class IrisBoardManager implements BoardProvider, Listener
return v;
}
- IrisChunkGenerator g = (IrisChunkGenerator) player.getWorld().getGenerator();
+ IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) player.getWorld().getGenerator()).getProvider();
if(cl.flip())
{
diff --git a/src/main/java/com/volmit/iris/IrisContext.java b/src/main/java/com/volmit/iris/IrisContext.java
index a913b427a..719450a68 100644
--- a/src/main/java/com/volmit/iris/IrisContext.java
+++ b/src/main/java/com/volmit/iris/IrisContext.java
@@ -1,7 +1,6 @@
package com.volmit.iris;
-import org.bukkit.World;
-
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.IrisRegion;
@@ -9,17 +8,19 @@ import com.volmit.iris.util.KMap;
public interface IrisContext
{
- static KMap contexts = new KMap<>();
+ static KMap contexts = new KMap<>();
public static void pushContext(IrisContext context)
{
- contexts.put(context.getWorld(), context);
+ contexts.put(context.getTarget(), context);
}
- public static IrisContext of(World world)
+ public static IrisContext of(TerrainTarget world)
{
return contexts.get(world);
}
+
+ public TerrainTarget getTarget();
public IrisBiome getBiome(int x, int z);
@@ -31,7 +32,5 @@ public interface IrisContext
public int getHeight(int x, int z);
- public World getWorld();
-
public void onHotloaded();
}
diff --git a/src/main/java/com/volmit/iris/ProjectManager.java b/src/main/java/com/volmit/iris/ProjectManager.java
index db47f5d51..fa03857d5 100644
--- a/src/main/java/com/volmit/iris/ProjectManager.java
+++ b/src/main/java/com/volmit/iris/ProjectManager.java
@@ -27,7 +27,11 @@ import org.zeroturnaround.zip.commons.FileUtils;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.volmit.iris.gen.IrisChunkGenerator;
+import com.volmit.iris.gen.nms.NMSCreator;
import com.volmit.iris.gen.post.Post;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
+import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.DecorationPart;
import com.volmit.iris.object.Envelope;
import com.volmit.iris.object.InterpolationMethod;
@@ -316,7 +320,11 @@ public class ProjectManager
Iris.globaldata.dump();
sender.sendMessage("Loading " + dimm + "...");
- IrisChunkGenerator gx = new IrisChunkGenerator(dimm, IrisSettings.get().threads);
+ String wfp = "iris/" + UUID.randomUUID();
+ ProvisionBukkit gen = Iris.instance.createProvisionBukkit(IrisGenConfiguration.builder().threads(IrisSettings.get().threads).dimension(dimm).target(TerrainTarget.builder().environment(d.getEnvironment()).folder(new File(wfp)).name(wfp).seed(1337).build()).build());
+ //@done
+
+ IrisChunkGenerator gx = (IrisChunkGenerator) gen.getProvider();
currentProject = gx;
gx.setDev(true);
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
@@ -365,13 +373,14 @@ public class ProjectManager
});
//@builder
- World world = Bukkit.createWorld(new WorldCreator("iris/" + UUID.randomUUID())
+ World world = NMSCreator.createWorld(new WorldCreator(wfp)
.seed(1337)
- .generator(gx)
+ .generator(gen)
.generateStructures(d.isVanillaStructures())
.type(WorldType.NORMAL)
- .environment(d.getEnvironment()));
+ .environment(d.getEnvironment()), false);
//@done
+ gx.getTarget().setRealWorld(world);
Iris.linkMultiverseCore.removeFromConfig(world);
done.set(true);
@@ -400,9 +409,9 @@ public class ProjectManager
if(isProjectOpen())
{
currentProject.close();
- File folder = currentProject.getWorld().getWorldFolder();
- Iris.linkMultiverseCore.removeFromConfig(currentProject.getWorld());
- Bukkit.unloadWorld(currentProject.getWorld(), false);
+ File folder = currentProject.getTarget().getFolder();
+ Iris.linkMultiverseCore.removeFromConfig(currentProject.getTarget().getName());
+ Bukkit.unloadWorld(currentProject.getTarget().getName(), false);
currentProject = null;
Iris.globaldata.dump();
Iris.globaldata.preferFolder(null);
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisCTC.java b/src/main/java/com/volmit/iris/command/CommandIrisCTC.java
index 7c90f2578..c9ba80d3e 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisCTC.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisCTC.java
@@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.IrisChunkGenerator;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@@ -26,13 +27,13 @@ public class CommandIrisCTC extends MortarCommand
Player p = sender.player();
World world = p.getWorld();
- if(!(world.getGenerator() instanceof IrisChunkGenerator))
+ if(!(world.getGenerator() instanceof ProvisionBukkit))
{
sender.sendMessage("You must be in an iris world.");
return true;
}
- IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
+ IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
int m = Math.min(Math.max(Integer.valueOf(args[0]), 2), 256);
g.changeThreadCount(m);
sender.sendMessage("Thread count changed to " + m);
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java
index 735f29502..7dc936fec 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java
@@ -14,6 +14,10 @@ import com.volmit.iris.Iris;
import com.volmit.iris.IrisDataManager;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.IrisChunkGenerator;
+import com.volmit.iris.gen.nms.NMSCreator;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
+import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.IO;
@@ -138,7 +142,20 @@ public class CommandIrisCreate extends MortarCommand
}
sender.sendMessage(worldName + " type installed. Generating Spawn Area...");
- IrisChunkGenerator gen = new IrisChunkGenerator("", 16);
+ //@builder
+ ProvisionBukkit gen = Iris.instance.createProvisionBukkit(
+ IrisGenConfiguration.builder()
+ .threads(IrisSettings.get().threads)
+ .dimension(dim.getLoadKey())
+ .target(TerrainTarget
+ .builder()
+ .environment(dim.getEnvironment())
+ .folder(folder)
+ .name(worldName)
+ .seed(seed)
+ .build()
+ ).build());
+ //@done
sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk");
O done = new O();
@@ -151,7 +168,7 @@ public class CommandIrisCreate extends MortarCommand
while(!done.get())
{
boolean derp = false;
- double v = (double) gen.getGenerated() / (double) req;
+ double v = (double) ((IrisChunkGenerator) gen.getProvider()).getGenerated() / (double) req;
if(last > v || v > 1)
{
@@ -169,7 +186,10 @@ public class CommandIrisCreate extends MortarCommand
}
});
- World world = Bukkit.createWorld(new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment()));
+ WorldCreator wc = new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment());
+
+ World world = NMSCreator.createWorld(wc, false);
+
done.set(true);
sender.sendMessage(worldName + " Spawn Area generated.");
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java b/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java
index 2321475b6..5523df365 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java
@@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisMetrics;
import com.volmit.iris.gen.IrisChunkGenerator;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.util.C;
import com.volmit.iris.util.Form;
import com.volmit.iris.util.MortarCommand;
@@ -28,7 +29,13 @@ public class CommandIrisMetrics extends MortarCommand
{
Player p = sender.player();
World world = p.getWorld();
- IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
+ if(!(world.getGenerator() instanceof ProvisionBukkit))
+ {
+ sender.sendMessage("You must be in an iris world.");
+ return true;
+ }
+
+ IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
IrisMetrics m = g.getMetrics();
sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2));
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java b/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java
index 6659287f1..b3d09ef20 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java
@@ -40,7 +40,7 @@ public class CommandIrisStudioClose extends MortarCommand
for(World i : Bukkit.getWorlds())
{
- if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getWorld().getWorldFolder().getAbsolutePath()))
+ if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getTarget().getFolder().getAbsolutePath()))
{
continue;
}
@@ -51,7 +51,7 @@ public class CommandIrisStudioClose extends MortarCommand
if(f == null)
{
- for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers())
+ for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers())
{
i.kickPlayer("Project Closing, No other world to put you in. Rejoin Please!");
}
@@ -59,7 +59,7 @@ public class CommandIrisStudioClose extends MortarCommand
else
{
- for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers())
+ for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers())
{
i.teleport(f.getSpawnLocation());
}
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java b/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java
index 3779a5151..ac715a40b 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java
@@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.IrisChunkGenerator;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@@ -30,7 +31,7 @@ public class CommandIrisStudioGoto extends MortarCommand
sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json");
return true;
}
-
+
if(args.length < 1)
{
sender.sendMessage("/iris world goto " + getArgsUsage());
@@ -42,13 +43,13 @@ public class CommandIrisStudioGoto extends MortarCommand
Player p = sender.player();
World world = p.getWorld();
- if(!(world.getGenerator() instanceof IrisChunkGenerator))
+ if(!(world.getGenerator() instanceof ProvisionBukkit))
{
sender.sendMessage("You must be in an iris world.");
return true;
}
- IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
+ IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
int tries = 10000;
boolean cave = false;
IrisBiome biome2 = null;
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java b/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java
index cbf9996fd..3cca4f74f 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java
@@ -6,6 +6,7 @@ import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.IrisChunkGenerator;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@@ -27,19 +28,18 @@ public class CommandIrisStudioHotload extends MortarCommand
sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json");
return true;
}
-
+
if(sender.isPlayer())
{
Player p = sender.player();
World world = p.getWorld();
-
- if(!(world.getGenerator() instanceof IrisChunkGenerator))
+ if(!(world.getGenerator() instanceof ProvisionBukkit))
{
sender.sendMessage("You must be in an iris world.");
return true;
}
- IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
+ IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider();
g.onHotload();
sender.sendMessage("Hotloaded!");
return true;
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisWhat.java b/src/main/java/com/volmit/iris/command/CommandIrisWhat.java
index 83674224a..b84313769 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisWhat.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisWhat.java
@@ -1,14 +1,7 @@
package com.volmit.iris.command;
-import org.bukkit.World;
-import org.bukkit.entity.Player;
-
import com.volmit.iris.Iris;
-import com.volmit.iris.IrisMetrics;
-import com.volmit.iris.gen.IrisChunkGenerator;
-import com.volmit.iris.util.C;
import com.volmit.iris.util.Command;
-import com.volmit.iris.util.Form;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
@@ -32,26 +25,7 @@ public class CommandIrisWhat extends MortarCommand
@Override
public boolean handle(MortarSender sender, String[] args)
{
- if(sender.isPlayer())
- {
- Player p = (Player) sender;
- World world = p.getWorld();
- IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator();
- IrisMetrics m = g.getMetrics();
- sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads());
- sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2));
- sender.sendMessage(" Terrain : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTerrain().getAverage(), 2));
- sender.sendMessage(" Parallax: " + C.BOLD + "" + C.WHITE + Form.duration(m.getParallax().getAverage(), 2));
- sender.sendMessage(" Post : " + C.BOLD + "" + C.WHITE + Form.duration(m.getPost().getAverage(), 2));
-
- return true;
- }
-
- else
- {
- sender.sendMessage("Players only.");
- }
-
+ printHelp(sender);
return true;
}
diff --git a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java
index ffc6dc5ba..fb55797f9 100644
--- a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java
+++ b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java
@@ -1,13 +1,10 @@
package com.volmit.iris.gen;
-import java.util.List;
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.GameMode;
-import org.bukkit.Location;
-import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -23,8 +20,6 @@ import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.event.world.WorldUnloadEvent;
-import org.bukkit.generator.BlockPopulator;
-import org.bukkit.generator.ChunkGenerator;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisContext;
@@ -32,6 +27,9 @@ import com.volmit.iris.IrisDataManager;
import com.volmit.iris.IrisMetrics;
import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.gen.atomics.AtomicMulticache;
+import com.volmit.iris.gen.scaffold.TerrainChunk;
+import com.volmit.iris.gen.scaffold.TerrainProvider;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension;
@@ -53,7 +51,7 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
-public abstract class ContextualChunkGenerator extends ChunkGenerator implements Listener
+public abstract class ContextualChunkGenerator implements TerrainProvider, Listener
{
private KList noLoot;
private BlockPosition allowLoot;
@@ -69,16 +67,17 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
private ChronoLatch pushLatch;
private AtomicCache dimCache;
private IrisMetrics metrics;
- private World world;
private int generated;
private int ticks;
private long hlast;
private boolean fastPregen = false;
private boolean pregenDone;
private volatile boolean hotloadable = false;
+ private final TerrainTarget target;
- public ContextualChunkGenerator()
+ public ContextualChunkGenerator(TerrainTarget target)
{
+ this.target = target;
pushLatch = new ChronoLatch(3000);
tickLatch = new ChronoLatch(650);
perSecond = new ChronoLatch(1000);
@@ -97,9 +96,9 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
noLoot = new KList<>(1285);
}
- protected abstract void onGenerate(RNG masterRandom, int x, int z, ChunkData data, BiomeGrid grid);
+ protected abstract void onGenerate(RNG masterRandom, int x, int z, TerrainChunk chunk);
- protected abstract void onInit(World world, RNG masterRandom);
+ protected abstract void onInit(RNG masterRandom);
protected abstract void onTick(int ticks);
@@ -150,21 +149,20 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
return isDev() ? Iris.globaldata : data;
}
- private void init(World world, RNG rng)
+ private void init(RNG rng)
{
if(initialized)
{
return;
}
- this.world = world;
- setData(new IrisDataManager(getWorld().getWorldFolder()));
- setMasterRandom(new RNG(world.getSeed()));
+ setData(new IrisDataManager(getTarget().getFolder()));
+ setMasterRandom(new RNG(getTarget().getSeed()));
setMetrics(new IrisMetrics(128));
setInitialized(true);
setTask(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::tick, 0, 0));
Bukkit.getServer().getPluginManager().registerEvents(this, Iris.instance);
- onInit(world, masterRandom);
+ onInit(masterRandom);
setHotloadable(true);
}
@@ -185,7 +183,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
setGenerated(0);
}
- checkHotload();
+ doCheckHotload();
if(getNoLoot().size() > 1024)
{
@@ -217,7 +215,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockBreakEvent e)
{
- if(!e.getBlock().getWorld().equals(getWorld()))
+ if(!getTarget().isWorld(e.getBlock().getWorld()))
{
return;
}
@@ -238,7 +236,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockPlaceEvent e)
{
- if(!e.getBlock().getWorld().equals(getWorld()))
+ if(!getTarget().isWorld(e.getBlock().getWorld()))
{
return;
}
@@ -249,7 +247,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(BlockDropItemEvent e)
{
- if(!e.getBlock().getWorld().equals(getWorld()))
+ if(!getTarget().isWorld(e.getBlock().getWorld()))
{
return;
}
@@ -269,13 +267,13 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerTeleportEvent e)
{
- if(e.getFrom().getWorld().equals(world) && !e.getTo().getWorld().equals(world))
+ if(getTarget().isWorld(e.getFrom().getWorld()) && !getTarget().isWorld(e.getTo().getWorld()))
{
tick();
onPlayerLeft(e.getPlayer());
}
- if(!e.getFrom().getWorld().equals(world) && e.getTo().getWorld().equals(world))
+ if(!getTarget().isWorld(e.getFrom().getWorld()) && getTarget().isWorld(e.getTo().getWorld()))
{
tick();
onPlayerJoin(e.getPlayer());
@@ -285,7 +283,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerQuitEvent e)
{
- if(e.getPlayer().getWorld().equals(world))
+ if(getTarget().isWorld(e.getPlayer().getWorld()))
{
tick();
onPlayerLeft(e.getPlayer());
@@ -295,7 +293,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(PlayerJoinEvent e)
{
- if(e.getPlayer().getWorld().equals(world))
+ if(getTarget().isWorld(e.getPlayer().getWorld()))
{
tick();
onPlayerJoin(e.getPlayer());
@@ -305,7 +303,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(ChunkLoadEvent e)
{
- if(e.getWorld().equals(world))
+ if(getTarget().isWorld(e.getWorld()))
{
tick();
onChunkLoaded(e.getChunk());
@@ -315,7 +313,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(ChunkUnloadEvent e)
{
- if(e.getWorld().equals(world))
+ if(getTarget().isWorld(e.getWorld()))
{
tick();
onChunkUnloaded(e.getChunk());
@@ -325,7 +323,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
@EventHandler(priority = EventPriority.MONITOR)
public void on(WorldUnloadEvent e)
{
- if(world != null && e.getWorld().equals(world))
+ if(getTarget().isWorld(e.getWorld()))
{
close();
}
@@ -345,16 +343,8 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
onClose();
}
- @Override
- public boolean canSpawn(World world, int x, int z)
+ protected void generateFailure(Random no, int x, int z, TerrainChunk chunk)
{
- return super.canSpawn(world, x, z);
- }
-
- protected ChunkData generateChunkDataFailure(World world, Random no, int x, int z, BiomeGrid biomeGrid)
- {
- ChunkData c = Bukkit.createChunkData(world);
-
for(int i = 0; i < 16; i++)
{
for(int j = 0; j < 16; j++)
@@ -363,46 +353,19 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
if(j == i || j + i == 16)
{
- c.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA"));
+ chunk.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA"));
}
else
{
- c.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA"));
+ chunk.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA"));
}
}
}
-
- return c;
- }
-
- protected ChunkData generateChunkFastPregen(World world, Random no, int x, int z, BiomeGrid biomeGrid)
- {
- ChunkData c = Bukkit.createChunkData(world);
-
- for(int i = 0; i < 16; i++)
- {
- for(int j = 0; j < 16; j++)
- {
- int h = 0;
-
- if(j == i || j + i == 16)
- {
- c.setBlock(i, h, j, B.getBlockData("BLUE_TERRACOTTA"));
- }
-
- else
- {
- c.setBlock(i, h, j, B.getBlockData("WHITE_TERRACOTTA"));
- }
- }
- }
-
- return c;
}
@Override
- public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid)
+ public void generate(Random no, int x, int z, TerrainChunk terrain)
{
setHotloadable(false);
if(!isDev())
@@ -413,32 +376,21 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
if(failing)
{
- return generateChunkDataFailure(world, no, x, z, biomeGrid);
+ generateFailure(no, x, z, terrain);
+ return;
}
try
{
- RNG random = new RNG(world.getSeed());
- init(world, random.nextParallelRNG(0));
-
- ChunkData c = Bukkit.createChunkData(world);
-
- if(!pregenDone && fastPregen)
- {
- c = generateChunkFastPregen(world, no, x, z, biomeGrid);
- }
-
- else
- {
- onGenerate(random, x, z, c, biomeGrid);
- }
-
+ RNG random = new RNG(getTarget().getSeed());
+ init(random.nextParallelRNG(0));
+ onGenerate(random, x, z, terrain);
generated++;
long hits = CNG.hits;
CNG.hits = 0;
Iris.instance.hit(hits);
setHotloadable(true);
- return c;
+ return;
}
catch(Throwable e)
@@ -447,36 +399,23 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
}
setHotloadable(true);
- return generateChunkDataFailure(world, no, x, z, biomeGrid);
+ generateFailure(no, x, z, terrain);
}
- public void checkHotload()
- {
- if(M.ms() - getHlast() < 1000)
- {
- return;
- }
-
- if(getWorld() != null)
- {
- checkHotload(getWorld());
- }
- }
-
- private void checkHotload(World world)
+ private void doCheckHotload()
{
if(!isHotloadable())
{
return;
}
+ if(M.ms() - getHlast() < 1000)
+ {
+ return;
+ }
+
if(getPushLatch().flip())
{
- if(getWorld() == null)
- {
- setWorld(world);
- }
-
Iris.hotloader.check((IrisContext) this);
if(this instanceof IrisContext)
@@ -511,7 +450,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
Iris.error("ERROR! Failed to generate chunk! Iris has entered a failed state!");
Iris.error("---------------------------------------------------------------------------------------------------------");
- for(Player i : world.getPlayers())
+ for(Player i : getTarget().getPlayers())
{
Iris.instance.imsg(i, C.DARK_RED + "Iris Generator has crashed!");
Iris.instance.imsg(i, C.RED + "- Check the console for the error.");
@@ -523,18 +462,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements
onFailure(e);
}
- @Override
- public List getDefaultPopulators(World world)
- {
- return super.getDefaultPopulators(world);
- }
-
- @Override
- public Location getFixedSpawnLocation(World world, Random random)
- {
- return super.getFixedSpawnLocation(world, random);
- }
-
@Override
public boolean isParallelCapable()
{
diff --git a/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java b/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java
index e3e4f71ad..364dc4719 100644
--- a/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java
+++ b/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java
@@ -3,11 +3,11 @@ package com.volmit.iris.gen;
import java.io.File;
import org.bukkit.Material;
-import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import com.volmit.iris.Iris;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.InferredType;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension;
@@ -28,27 +28,14 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator
protected static final BlockData BEDROCK = Material.BEDROCK.createBlockData();
protected static final BlockData WATER = Material.WATER.createBlockData();
- public DimensionChunkGenerator(String dimensionName)
+ public DimensionChunkGenerator(TerrainTarget t, String dimensionName)
{
- super();
+ super(t);
setDimensionName(dimensionName);
- }
- public void onPlayerLeft(Player p)
- {
-
- }
-
- public void onTick(int m)
- {
-
- }
-
- public void onInit(World world, RNG masterRandom)
- {
if(getDimensionName().isEmpty())
{
- File folder = new File(world.getWorldFolder(), "iris/dimensions");
+ File folder = new File(getTarget().getFolder(), "iris/dimensions");
if(!folder.exists())
{
@@ -71,9 +58,32 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator
fail(new RuntimeException("Missing dimension folder/file in " + folder.getAbsolutePath()));
}
+ try
+ {
+ getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
+ }
+
+ catch(Throwable e)
+ {
+
+ }
+ }
+
+ public void onPlayerLeft(Player p)
+ {
+
+ }
+
+ public void onTick(int m)
+ {
getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName());
}
+ public void onInit(RNG masterRandom)
+ {
+
+ }
+
public IrisDimension getDimension()
{
IrisDimension d = loadDimension(getDimensionName());
diff --git a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java
index 80605f76e..71393a425 100644
--- a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java
+++ b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java
@@ -7,7 +7,6 @@ import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
-import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockDropItemEvent;
@@ -18,6 +17,9 @@ import com.volmit.iris.Iris;
import com.volmit.iris.IrisContext;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.atomics.AtomicRegionData;
+import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
+import com.volmit.iris.gen.scaffold.TerrainChunk;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.gui.Renderer;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
@@ -43,19 +45,24 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
private IrisRegion hr = null;
private boolean spawnable = false;
- public IrisChunkGenerator(String dimensionName, int threads)
+ public IrisChunkGenerator(IrisGenConfiguration config)
{
- super(dimensionName, threads);
+ super(config.getTarget(), config.getDimension(), config.getThreads());
}
- public IrisChunkGenerator(String dimensionName)
+ public IrisChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
- super(dimensionName, 16);
+ super(t, dimensionName, threads);
}
- public IrisChunkGenerator(int tc)
+ public IrisChunkGenerator(TerrainTarget t, String dimensionName)
{
- super("", tc);
+ super(t, dimensionName, 16);
+ }
+
+ public IrisChunkGenerator(TerrainTarget t, int tc)
+ {
+ super(t, "", tc);
}
public void hotload()
@@ -73,26 +80,25 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
}
@Override
- public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid)
+ public void generate(Random no, int x, int z, TerrainChunk terrain)
{
PrecisionStopwatch s = PrecisionStopwatch.start();
- ChunkData c = super.generateChunkData(world, no, x, z, biomeGrid);
+ super.generate(no, x, z, terrain);
s.end();
getMetrics().getTotal().put(s.getMilliseconds());
- return c;
}
@Override
- protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
+ protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
- super.onGenerate(random, x, z, data, grid);
+ super.onGenerate(random, x, z, terrain);
}
- public void onInit(World world, RNG rng)
+ public void onInit(RNG rng)
{
try
{
- super.onInit(world, rng);
+ super.onInit(rng);
}
catch(Throwable e)
@@ -124,7 +130,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
{
spawnable = true;
super.onTick(ticks);
- for(Player i : getWorld().getPlayers())
+ for(Player i : getTarget().getPlayers())
{
Location l = i.getLocation();
IrisRegion r = sampleRegion(l.getBlockX(), l.getBlockZ());
@@ -160,7 +166,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
}
setSliverCache(null);
- Iris.info("Closing Iris Dimension " + getWorld().getName());
+ Iris.info("Closing Iris Dimension " + getTarget().getName());
}
@Override
@@ -231,35 +237,6 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
return bytes / 2;
}
- @Override
- public boolean shouldGenerateCaves()
- {
- return false;
- }
-
- @Override
- public boolean shouldGenerateDecorations()
- {
- return false;
- }
-
- @Override
- public boolean shouldGenerateMobs()
- {
- return true;
- }
-
- @Override
- public boolean shouldGenerateStructures()
- {
- if(!isInitialized())
- {
- return false;
- }
-
- return getDimension().isVanillaStructures();
- }
-
public Renderer createRenderer()
{
return (x, z) -> render(x, z);
@@ -514,4 +491,36 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC
return false;
}
+
+ @Override
+ public boolean canSpawn(int x, int z)
+ {
+ return true;
+ }
+
+ @Override
+ public boolean shouldGenerateCaves()
+ {
+ return getDimension().isVanillaCaves();
+ }
+
+ @Override
+ public boolean shouldGenerateVanillaStructures()
+ {
+ 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;
+ }
}
diff --git a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java
index 4d387ba9f..b5cb5b5c6 100644
--- a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java
+++ b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java
@@ -3,7 +3,6 @@ package com.volmit.iris.gen;
import java.io.IOException;
import java.util.List;
-import org.bukkit.World;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BlockPopulator;
@@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicWorldData;
import com.volmit.iris.gen.atomics.MasterLock;
import com.volmit.iris.gen.layer.GenLayerText;
import com.volmit.iris.gen.layer.GenLayerUpdate;
+import com.volmit.iris.gen.scaffold.TerrainChunk;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisBiomeMutation;
import com.volmit.iris.object.IrisObjectPlacement;
@@ -49,18 +50,18 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
private GenLayerText glText;
private int sliverBuffer;
- public ParallaxChunkGenerator(String dimensionName, int threads)
+ public ParallaxChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
- super(dimensionName, threads);
+ super(t, dimensionName, threads);
setSliverCache(new KMap<>());
setSliverBuffer(sliverBuffer);
setMasterLock(new MasterLock());
}
- public void onInit(World world, RNG rng)
+ public void onInit(RNG rng)
{
- super.onInit(world, rng);
- setParallaxMap(new AtomicWorldData(world));
+ super.onInit(rng);
+ setParallaxMap(new AtomicWorldData(getTarget()));
setGlText(new GenLayerText(this, rng.nextParallelRNG(32485)));
setGlUpdate(null);
J.a(() -> getDimension().getParallaxSize(this));
@@ -156,15 +157,15 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
return new AtomicSliverMap();
}
-
+
@Override
- public List getDefaultPopulators(World world)
+ public List getPopulators()
{
- List g = super.getDefaultPopulators(world);
+ List g = new KList<>();
if(getGlUpdate() == null)
{
- setGlUpdate(new GenLayerUpdate(this, world));
+ setGlUpdate(new GenLayerUpdate(this));
}
g.add(getGlUpdate());
@@ -172,20 +173,20 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
}
@Override
- protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
+ protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
if(getSliverCache().size() > 20000)
{
getSliverCache().clear();
}
- super.onPostGenerate(random, x, z, data, grid, height, biomeMap, map);
+ super.onPostGenerate(random, x, z, terrain, height, biomeMap, map);
PrecisionStopwatch p = PrecisionStopwatch.start();
if(getDimension().isPlaceObjects())
{
onGenerateParallax(random, x, z);
- getParallaxChunk(x, z).inject(data);
+ getParallaxChunk(x, z).inject(terrain);
getParallaxChunk(x, z).injectUpdates(map);
getParallaxChunk(x, z).setWorldGenerated(true);
}
@@ -194,7 +195,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple
getMasterLock().clear();
p.end();
getMetrics().getParallax().put(p.getMilliseconds());
- super.onPostParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map);
+ super.onPostParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map);
getParallaxMap().clean(getTicks());
getData().getObjectLoader().clean();
}
diff --git a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java
index 5341b13cc..a6d19c0e1 100644
--- a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java
+++ b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java
@@ -1,10 +1,10 @@
package com.volmit.iris.gen;
-import org.bukkit.World;
-
import com.volmit.iris.Iris;
import com.volmit.iris.gen.atomics.AtomicSliver;
import com.volmit.iris.gen.atomics.AtomicSliverMap;
+import com.volmit.iris.gen.scaffold.TerrainChunk;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.BiomeMap;
import com.volmit.iris.util.GroupedExecutor;
import com.volmit.iris.util.HeightMap;
@@ -22,9 +22,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
private int threads;
private boolean cachingAllowed;
- public ParallelChunkGenerator(String dimensionName, int threads)
+ public ParallelChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
- super(dimensionName);
+ super(t, dimensionName);
setThreads(threads);
setCachingAllowed(false);
}
@@ -33,7 +33,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
{
setThreads(tc);
GroupedExecutor e = getAccelerant();
- setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getWorld().getName()));
+ setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getTarget().getName()));
;
Iris.executors.add(getAccelerant());
@@ -54,16 +54,16 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
protected abstract int onSampleColumnHeight(int cx, int cz, int wx, int wz, int x, int z);
- protected abstract void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
+ protected abstract void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
- protected abstract void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
+ protected abstract void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map);
protected int sampleHeight(int x, int z)
{
return onSampleColumnHeight(x >> 4, z >> 4, x, z, x & 15, z & 15);
}
- protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
+ protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
getCache().targetChunk(x, z);
PrecisionStopwatch p = PrecisionStopwatch.start();
@@ -73,7 +73,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
BiomeMap biomeMap = new BiomeMap();
int ii, jj;
- onPreGenerate(random, x, z, data, grid, height, biomeMap, map);
+ onPreGenerate(random, x, z, terrain, height, biomeMap, map);
for(ii = 0; ii < 16; ii++)
{
@@ -101,10 +101,10 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
}
accelerant.waitFor(key);
- map.write(data, grid, height);
+ map.write(terrain, terrain, height);
getMetrics().getTerrain().put(p.getMilliseconds());
p = PrecisionStopwatch.start();
- onPostGenerate(random, x, z, data, grid, height, biomeMap, map);
+ onPostGenerate(random, x, z, terrain, height, biomeMap, map);
}
protected void onClose()
@@ -113,9 +113,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator
Iris.executors.remove(accelerant);
}
- public void onInit(World world, RNG rng)
+ public void onInit(RNG rng)
{
- super.onInit(world, rng);
+ super.onInit(rng);
changeThreadCount(getThreads());
}
diff --git a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java
index d18ec4867..68ff4d076 100644
--- a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java
+++ b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java
@@ -1,7 +1,7 @@
package com.volmit.iris.gen;
-import org.bukkit.World;
import org.bukkit.block.data.BlockData;
+import org.bukkit.generator.ChunkGenerator.ChunkData;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.post.PostFloatingNibDeleter;
@@ -11,6 +11,8 @@ import com.volmit.iris.gen.post.PostPotholeFiller;
import com.volmit.iris.gen.post.PostSlabber;
import com.volmit.iris.gen.post.PostWallPatcher;
import com.volmit.iris.gen.post.PostWaterlogger;
+import com.volmit.iris.gen.scaffold.TerrainChunk;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.CaveResult;
import com.volmit.iris.util.IPostBlockAccess;
import com.volmit.iris.util.IrisLock;
@@ -31,22 +33,22 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
private int minPhase;
private int maxPhase;
- public PostBlockChunkGenerator(String dimensionName, int threads)
+ public PostBlockChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
- super(dimensionName, threads);
+ super(t, dimensionName, threads);
setPostKey("post-" + dimensionName);
setPostLock(new IrisLock("PostChunkGenerator"));
}
- public void onInit(World world, RNG rng)
+ public void onInit(RNG rng)
{
- super.onInit(world, rng);
+ super.onInit(rng);
}
@Override
- protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
+ protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
- super.onGenerate(random, x, z, data, grid);
+ super.onGenerate(random, x, z, terrain);
if(!getDimension().isPostProcessing())
{
@@ -76,7 +78,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
{
if(f.getPhase() == hh)
{
- f.onPost(rxx, rzz, x, z, data);
+ f.onPost(rxx, rzz, x, z, terrain);
}
}
});
diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java
index 0ea6aa226..e6e50d46b 100644
--- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java
+++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java
@@ -1,7 +1,6 @@
package com.volmit.iris.gen;
import org.bukkit.Material;
-import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.Bisected.Half;
@@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicSliverMap;
import com.volmit.iris.gen.layer.GenLayerBiome;
import com.volmit.iris.gen.layer.GenLayerCarve;
import com.volmit.iris.gen.layer.GenLayerCave;
+import com.volmit.iris.gen.scaffold.TerrainChunk;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.DecorationPart;
import com.volmit.iris.object.InferredType;
@@ -53,17 +54,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
private CNG masterFracture;
private ChronoLatch cwarn = new ChronoLatch(1000);
- public TerrainChunkGenerator(String dimensionName, int threads)
+ public TerrainChunkGenerator(TerrainTarget t, String dimensionName, int threads)
{
- super(dimensionName, threads);
+ super(t, dimensionName, threads);
setGenerators(new KMap<>());
setRegionLock(new IrisLock("BiomeChunkGenerator"));
}
@Override
- public void onInit(World world, RNG rng)
+ public void onInit(RNG rng)
{
- super.onInit(world, rng);
+ super.onInit(rng);
loadGenerators();
buildGenLayers(getMasterRandom());
}
@@ -113,7 +114,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
}
@Override
- protected void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
+ protected void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
}
@@ -336,23 +337,23 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
}
@Override
- protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid)
+ protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
- super.onGenerate(random, x, z, data, grid);
+ super.onGenerate(random, x, z, terrain);
RNG ro = random.nextParallelRNG((x * x * x) - z);
IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7);
IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7);
for(IrisDepositGenerator k : getDimension().getDeposits())
{
- k.generate(data, ro, this, x, z);
+ k.generate(terrain, ro, this, x, z);
}
for(IrisDepositGenerator k : region.getDeposits())
{
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
{
- k.generate(data, ro, this, x, z);
+ k.generate(terrain, ro, this, x, z);
}
}
@@ -360,7 +361,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
{
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++)
{
- k.generate(data, ro, this, x, z);
+ k.generate(terrain, ro, this, x, z);
}
}
}
@@ -546,17 +547,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
}
@Override
- protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
+ protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
- onPreParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map);
+ onPreParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map);
}
- protected void onPreParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
+ protected void onPreParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
}
- protected void onPostParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
+ protected void onPostParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
}
@@ -815,7 +816,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
return 0;
});
- return M.lerp(lo, hi, gen.getHeight(rx, rz, getWorld().getSeed() + 239945));
+ return M.lerp(lo, hi, gen.getHeight(rx, rz, getTarget().getSeed() + 239945));
}
protected void loadGenerators()
diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java
index 1170691cd..fdd3d88e4 100644
--- a/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java
+++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java
@@ -7,10 +7,9 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
-import org.bukkit.World;
-
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.ByteArrayTag;
import com.volmit.iris.util.CompoundTag;
import com.volmit.iris.util.CustomOutputStream;
@@ -21,10 +20,10 @@ import com.volmit.iris.util.Tag;
public class AtomicRegionData
{
- private final World world;
+ private final TerrainTarget world;
private Tag[] tag;
- public AtomicRegionData(World world)
+ public AtomicRegionData(TerrainTarget world)
{
this.world = world;
tag = new Tag[1024];
@@ -148,7 +147,7 @@ public class AtomicRegionData
return data;
}
- public World getWorld()
+ public TerrainTarget getWorld()
{
return world;
}
diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java
index 99923df15..75b09c91e 100644
--- a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java
+++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java
@@ -5,9 +5,8 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import org.bukkit.World;
-
import com.volmit.iris.Iris;
+import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KMap;
@@ -15,7 +14,7 @@ import com.volmit.iris.util.M;
public class AtomicWorldData
{
- private World world;
+ private TerrainTarget world;
private KMap loadedChunks;
private KMap loadedSections;
private KMap lastRegion;
@@ -24,7 +23,7 @@ public class AtomicWorldData
private KList unloadChunks;
private long last = M.ms();
- public AtomicWorldData(World world)
+ public AtomicWorldData(TerrainTarget world)
{
this.world = world;
loadedSections = new KMap<>();
@@ -254,7 +253,7 @@ public class AtomicWorldData
public File getSubregionFolder()
{
- return new File(world.getWorldFolder(), "region-parallax");
+ return new File(world.getFolder(), "parallax");
}
public KMap getLoadedChunks()
diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java
index 614ae4d13..43f474557 100644
--- a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java
+++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java
@@ -32,10 +32,10 @@ public class GenLayerUpdate extends BlockPopulator
private ParallaxChunkGenerator gen;
private RNG rng;
- public GenLayerUpdate(ParallaxChunkGenerator gen, World w)
+ public GenLayerUpdate(ParallaxChunkGenerator gen)
{
this.gen = gen;
- this.rng = new RNG(w.getSeed() + 4996788).nextParallelRNG(-98618289);
+ this.rng = new RNG(gen.getTarget().getSeed() + 4996788).nextParallelRNG(-98618289);
}
@Override
diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java
new file mode 100644
index 000000000..488178255
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java
@@ -0,0 +1,48 @@
+package com.volmit.iris.gen.nms;
+
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+
+import com.volmit.iris.Iris;
+
+public class NMSCreator
+{
+ public static World createWorld(WorldCreator creator)
+ {
+ return createWorld(creator, true);
+ }
+
+ public static World createWorld(WorldCreator creator, boolean loadSpawn)
+ {
+ try
+ {
+ String code = Iris.nmsTag();
+
+ if(code.equals("v1_16_R2"))
+ {
+ return NMSCreator162.createWorld(creator, loadSpawn);
+ }
+ else if(code.equals("v1_16_R1"))
+ {
+ return NMSCreator161.createWorld(creator, loadSpawn);
+ }
+ else if(code.equals("v1_15_R1"))
+ {
+ return NMSCreator151.createWorld(creator, loadSpawn);
+ }
+ else if(code.equals("v1_14_R1"))
+ {
+ return NMSCreator141.createWorld(creator, loadSpawn);
+ }
+ }
+
+ catch(Throwable e)
+ {
+ e.printStackTrace();
+ Iris.warn("Failed to load NMS Spawn for MC:" + Iris.nmsTag() + ". Using Bukkit...");
+ }
+
+ return Bukkit.createWorld(creator);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java
new file mode 100644
index 000000000..c07fc5833
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java
@@ -0,0 +1,134 @@
+package com.volmit.iris.gen.nms;
+
+import java.io.File;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.lang.Validate;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.craftbukkit.v1_14_R1.CraftServer;
+import org.bukkit.event.Event;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.generator.ChunkGenerator;
+
+import com.google.common.base.Preconditions;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.volmit.iris.util.V;
+
+import net.minecraft.server.v1_14_R1.DedicatedServer;
+import net.minecraft.server.v1_14_R1.DimensionManager;
+import net.minecraft.server.v1_14_R1.EnumDifficulty;
+import net.minecraft.server.v1_14_R1.EnumGamemode;
+import net.minecraft.server.v1_14_R1.GameProfilerFiller;
+import net.minecraft.server.v1_14_R1.MinecraftServer;
+import net.minecraft.server.v1_14_R1.WorldData;
+import net.minecraft.server.v1_14_R1.WorldNBTStorage;
+import net.minecraft.server.v1_14_R1.WorldProvider;
+import net.minecraft.server.v1_14_R1.WorldServer;
+import net.minecraft.server.v1_14_R1.WorldSettings;
+
+public class NMSCreator141
+{
+ @SuppressWarnings({"resource", "deprecation"})
+ public static World createWorld(WorldCreator creator, boolean loadSpawn)
+ {
+ CraftServer server = ((CraftServer) Bukkit.getServer());
+ Map worlds = new V(server).get("worlds");
+ DedicatedServer console = new V(server).get("console");
+ WorldSettings worldSettings;
+ Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP");
+ Validate.notNull((Object) creator, (String) "Creator may not be null");
+ String name = creator.name();
+ ChunkGenerator generator = creator.generator();
+ File folder = new File(server.getWorldContainer(), name);
+ World world = server.getWorld(name);
+ net.minecraft.server.v1_14_R1.WorldType type = net.minecraft.server.v1_14_R1.WorldType.getType((String) creator.type().getName());
+ boolean generateStructures = creator.generateStructures();
+ if(world != null)
+ {
+ return world;
+ }
+ if(folder.exists() && !folder.isDirectory())
+ {
+ throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
+ }
+ if(generator == null)
+ {
+ generator = server.getGenerator(name);
+ }
+ console.convertWorld(name);
+ int dimension = 10 + console.worldServer.size();
+ boolean used = false;
+ block0: do
+ {
+ for(WorldServer ss : console.getWorlds())
+ {
+ @SuppressWarnings("unused")
+ boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
+ if(!used)
+ continue;
+ ++dimension;
+ continue block0;
+ }
+ }
+ while(used);
+ boolean hardcore = false;
+ WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager);
+ WorldData worlddata = sdm.getWorldData();
+ if(worlddata == null)
+ {
+ worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
+ JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
+ if(parsedSettings.isJsonObject())
+ {
+ worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject());
+ }
+ worlddata = new WorldData(worldSettings, name);
+ }
+ else
+ {
+ worlddata.setName(name);
+ worldSettings = new WorldSettings(worlddata);
+ }
+ DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId());
+ DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension));
+ //@builder
+ WorldServer internal = new WorldServer(
+ (MinecraftServer)console,
+ console.executorService,
+ sdm,
+ worlddata,
+ internalDimension,
+ (GameProfilerFiller)console.getMethodProfiler(),
+ server.getServer().worldLoadListenerFactory.create(11),
+ creator.environment(),
+ generator);
+ //@done
+ if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
+ {
+ return null;
+ }
+ console.initWorld(internal, worlddata, worldSettings);
+ internal.worldData.setDifficulty(EnumDifficulty.EASY);
+ internal.setSpawnFlags(true, true);
+ console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
+ server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
+
+ if(loadSpawn)
+ {
+ server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
+ }
+
+ else
+ {
+ MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
+ }
+
+ server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
+ return internal.getWorld();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java
new file mode 100644
index 000000000..6b29deea1
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java
@@ -0,0 +1,134 @@
+package com.volmit.iris.gen.nms;
+
+import java.io.File;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.lang.Validate;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.craftbukkit.v1_15_R1.CraftServer;
+import org.bukkit.event.Event;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.generator.ChunkGenerator;
+
+import com.google.common.base.Preconditions;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.volmit.iris.util.V;
+
+import net.minecraft.server.v1_15_R1.DedicatedServer;
+import net.minecraft.server.v1_15_R1.DimensionManager;
+import net.minecraft.server.v1_15_R1.EnumDifficulty;
+import net.minecraft.server.v1_15_R1.EnumGamemode;
+import net.minecraft.server.v1_15_R1.GameProfilerFiller;
+import net.minecraft.server.v1_15_R1.MinecraftServer;
+import net.minecraft.server.v1_15_R1.WorldData;
+import net.minecraft.server.v1_15_R1.WorldNBTStorage;
+import net.minecraft.server.v1_15_R1.WorldProvider;
+import net.minecraft.server.v1_15_R1.WorldServer;
+import net.minecraft.server.v1_15_R1.WorldSettings;
+
+public class NMSCreator151
+{
+ @SuppressWarnings({"resource", "deprecation"})
+ public static World createWorld(WorldCreator creator, boolean loadSpawn)
+ {
+ CraftServer server = ((CraftServer) Bukkit.getServer());
+ Map worlds = new V(server).get("worlds");
+ DedicatedServer console = new V(server).get("console");
+ WorldSettings worldSettings;
+ Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP");
+ Validate.notNull((Object) creator, (String) "Creator may not be null");
+ String name = creator.name();
+ ChunkGenerator generator = creator.generator();
+ File folder = new File(server.getWorldContainer(), name);
+ World world = server.getWorld(name);
+ net.minecraft.server.v1_15_R1.WorldType type = net.minecraft.server.v1_15_R1.WorldType.getType((String) creator.type().getName());
+ boolean generateStructures = creator.generateStructures();
+ if(world != null)
+ {
+ return world;
+ }
+ if(folder.exists() && !folder.isDirectory())
+ {
+ throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
+ }
+ if(generator == null)
+ {
+ generator = server.getGenerator(name);
+ }
+ console.convertWorld(name);
+ int dimension = 10 + console.worldServer.size();
+ boolean used = false;
+ block0: do
+ {
+ for(WorldServer ss : console.getWorlds())
+ {
+ @SuppressWarnings("unused")
+ boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
+ if(!used)
+ continue;
+ ++dimension;
+ continue block0;
+ }
+ }
+ while(used);
+ boolean hardcore = false;
+ WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager);
+ WorldData worlddata = sdm.getWorldData();
+ if(worlddata == null)
+ {
+ worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
+ JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
+ if(parsedSettings.isJsonObject())
+ {
+ worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject());
+ }
+ worlddata = new WorldData(worldSettings, name);
+ }
+ else
+ {
+ worlddata.setName(name);
+ worldSettings = new WorldSettings(worlddata);
+ }
+ DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId());
+ DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension.getGenLayerZoomer(), actualDimension));
+ //@builder
+ WorldServer internal = new WorldServer(
+ (MinecraftServer)console,
+ console.executorService,
+ sdm,
+ worlddata,
+ internalDimension,
+ (GameProfilerFiller)console.getMethodProfiler(),
+ server.getServer().worldLoadListenerFactory.create(11),
+ creator.environment(),
+ generator);
+ //@done
+ if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
+ {
+ return null;
+ }
+ console.initWorld(internal, worlddata, worldSettings);
+ internal.worldData.setDifficulty(EnumDifficulty.EASY);
+ internal.setSpawnFlags(true, true);
+ console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
+ server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
+
+ if(loadSpawn)
+ {
+ server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
+ }
+
+ else
+ {
+ MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
+ }
+
+ server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
+ return internal.getWorld();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java
new file mode 100644
index 000000000..1192288ad
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java
@@ -0,0 +1,208 @@
+package com.volmit.iris.gen.nms;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.Random;
+
+import org.apache.commons.lang.Validate;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
+import org.bukkit.event.Event;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.mojang.serialization.DynamicOps;
+import com.mojang.serialization.Lifecycle;
+import com.volmit.iris.util.V;
+
+import net.minecraft.server.v1_16_R1.BiomeManager;
+import net.minecraft.server.v1_16_R1.Convertable;
+import net.minecraft.server.v1_16_R1.DedicatedServer;
+import net.minecraft.server.v1_16_R1.DimensionManager;
+import net.minecraft.server.v1_16_R1.DynamicOpsNBT;
+import net.minecraft.server.v1_16_R1.EnumDifficulty;
+import net.minecraft.server.v1_16_R1.EnumGamemode;
+import net.minecraft.server.v1_16_R1.GameRules;
+import net.minecraft.server.v1_16_R1.GeneratorSettings;
+import net.minecraft.server.v1_16_R1.IRegistry;
+import net.minecraft.server.v1_16_R1.IWorldDataServer;
+import net.minecraft.server.v1_16_R1.MinecraftKey;
+import net.minecraft.server.v1_16_R1.MinecraftServer;
+import net.minecraft.server.v1_16_R1.MobSpawner;
+import net.minecraft.server.v1_16_R1.MobSpawnerCat;
+import net.minecraft.server.v1_16_R1.MobSpawnerPatrol;
+import net.minecraft.server.v1_16_R1.MobSpawnerPhantom;
+import net.minecraft.server.v1_16_R1.MobSpawnerTrader;
+import net.minecraft.server.v1_16_R1.NBTBase;
+import net.minecraft.server.v1_16_R1.RegistryMaterials;
+import net.minecraft.server.v1_16_R1.RegistryReadOps;
+import net.minecraft.server.v1_16_R1.ResourceKey;
+import net.minecraft.server.v1_16_R1.SaveData;
+import net.minecraft.server.v1_16_R1.VillageSiege;
+import net.minecraft.server.v1_16_R1.WorldDataServer;
+import net.minecraft.server.v1_16_R1.WorldDimension;
+import net.minecraft.server.v1_16_R1.WorldServer;
+import net.minecraft.server.v1_16_R1.WorldSettings;
+
+public class NMSCreator161
+{
+ @SuppressWarnings({"unchecked", "rawtypes", "resource"})
+ public static World createWorld(WorldCreator creator, boolean loadSpawn)
+ {
+ CraftServer server = ((CraftServer) Bukkit.getServer());
+ Map worlds = new V(server).get("worlds");
+ DedicatedServer console = new V(server).get("console");
+ Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP");
+ Validate.notNull((Object) creator, "Creator may not be null");
+ final String name = creator.name();
+ org.bukkit.generator.ChunkGenerator generator = creator.generator();
+ final File folder = new File(server.getWorldContainer(), name);
+ final World world = server.getWorld(name);
+
+ if(world != null)
+ {
+ return world;
+ }
+
+ if(folder.exists() && !folder.isDirectory())
+ {
+ throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
+ }
+
+ if(generator == null)
+ {
+ generator = server.getGenerator(name);
+ }
+
+ ResourceKey actualDimension = null;
+ switch(creator.environment())
+ {
+ case NORMAL:
+ {
+ actualDimension = (ResourceKey) WorldDimension.OVERWORLD;
+ break;
+ }
+ case NETHER:
+ {
+ actualDimension = (ResourceKey) WorldDimension.THE_NETHER;
+ break;
+ }
+ case THE_END:
+ {
+ actualDimension = (ResourceKey) WorldDimension.THE_END;
+ break;
+ }
+ default:
+ {
+ throw new IllegalArgumentException("Illegal dimension");
+ }
+ }
+ Convertable.ConversionSession worldSession;
+ try
+ {
+ worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension);
+ }
+ catch(IOException ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ MinecraftServer.convertWorld(worldSession);
+ final boolean hardcore = creator.hardcore();
+ final RegistryReadOps registryreadops = (RegistryReadOps) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
+ WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
+ if(worlddata == null)
+ {
+ final Properties properties = new Properties();
+ properties.put("generator-settings", Objects.toString(creator.generatorSettings()));
+ properties.put("level-seed", Objects.toString(creator.seed()));
+ properties.put("generate-structures", Objects.toString(creator.generateStructures()));
+ properties.put("level-type", Objects.toString(creator.type().getName()));
+ GeneratorSettings generatorsettings = GeneratorSettings.a((Properties) properties);
+ @SuppressWarnings("deprecation")
+ final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration);
+ worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable());
+ }
+ worlddata.checkName(name);
+ worlddata.a(console.getServerModName(), console.getModded().isPresent());
+ final long j = BiomeManager.a(creator.seed());
+ final List list = (List) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata));
+ RegistryMaterials registrymaterials = worlddata.getGeneratorSettings().e();
+ final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension);
+ DimensionManager dimensionmanager;
+ net.minecraft.server.v1_16_R1.ChunkGenerator chunkgenerator;
+
+ if(worlddimension == null)
+ {
+ dimensionmanager = DimensionManager.a();
+ chunkgenerator = GeneratorSettings.a((long) new Random().nextLong());
+ }
+
+ else
+ {
+ dimensionmanager = worlddimension.b();
+ chunkgenerator = worlddimension.c();
+ }
+
+ ResourceKey typeKey = (ResourceKey) console.f.a().c(dimensionmanager).orElseThrow(() -> new IllegalStateException("Unregistered dimension type: " + (Object) dimensionmanager));
+ ResourceKey worldKey = ResourceKey.a((ResourceKey) IRegistry.ae, (MinecraftKey) new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
+
+ //@builder
+ WorldServer internal = new WorldServer(
+ (MinecraftServer)console,
+ console.executorService,
+ worldSession,
+ (IWorldDataServer)worlddata,
+ worldKey,
+ typeKey,
+ dimensionmanager,
+ server.getServer().worldLoadListenerFactory.create(11),
+ chunkgenerator,
+ worlddata.getGeneratorSettings().isDebugWorld(),
+ j,
+ (List)(creator.environment() == World.Environment.NORMAL ? list : ImmutableList.of()),
+ true,
+ creator.environment(),
+ generator);
+
+ //@done
+ if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
+ {
+ try
+ {
+ internal.close();
+ }
+
+ catch(IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+ console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings());
+ internal.setSpawnFlags(true, true);
+ console.worldServer.put(internal.getDimensionKey(), internal);
+ server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
+ if(loadSpawn)
+ {
+ server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
+ }
+
+ else
+ {
+ MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
+ }
+
+ server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
+ return (World) internal.getWorld();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java
new file mode 100644
index 000000000..0171a6bd8
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java
@@ -0,0 +1,209 @@
+package com.volmit.iris.gen.nms;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.Random;
+
+import org.apache.commons.lang.Validate;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.craftbukkit.v1_16_R2.CraftServer;
+import org.bukkit.event.Event;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.mojang.serialization.DynamicOps;
+import com.mojang.serialization.Lifecycle;
+import com.volmit.iris.util.V;
+
+import net.minecraft.server.v1_16_R2.BiomeBase;
+import net.minecraft.server.v1_16_R2.BiomeManager;
+import net.minecraft.server.v1_16_R2.Convertable;
+import net.minecraft.server.v1_16_R2.DataConverterRegistry;
+import net.minecraft.server.v1_16_R2.DedicatedServer;
+import net.minecraft.server.v1_16_R2.DimensionManager;
+import net.minecraft.server.v1_16_R2.DynamicOpsNBT;
+import net.minecraft.server.v1_16_R2.EnumDifficulty;
+import net.minecraft.server.v1_16_R2.EnumGamemode;
+import net.minecraft.server.v1_16_R2.GameRules;
+import net.minecraft.server.v1_16_R2.GeneratorSettingBase;
+import net.minecraft.server.v1_16_R2.GeneratorSettings;
+import net.minecraft.server.v1_16_R2.IRegistry;
+import net.minecraft.server.v1_16_R2.IWorldDataServer;
+import net.minecraft.server.v1_16_R2.MinecraftKey;
+import net.minecraft.server.v1_16_R2.MinecraftServer;
+import net.minecraft.server.v1_16_R2.MobSpawner;
+import net.minecraft.server.v1_16_R2.MobSpawnerCat;
+import net.minecraft.server.v1_16_R2.MobSpawnerPatrol;
+import net.minecraft.server.v1_16_R2.MobSpawnerPhantom;
+import net.minecraft.server.v1_16_R2.MobSpawnerTrader;
+import net.minecraft.server.v1_16_R2.NBTBase;
+import net.minecraft.server.v1_16_R2.RegistryMaterials;
+import net.minecraft.server.v1_16_R2.RegistryReadOps;
+import net.minecraft.server.v1_16_R2.ResourceKey;
+import net.minecraft.server.v1_16_R2.SaveData;
+import net.minecraft.server.v1_16_R2.VillageSiege;
+import net.minecraft.server.v1_16_R2.WorldDataServer;
+import net.minecraft.server.v1_16_R2.WorldDimension;
+import net.minecraft.server.v1_16_R2.WorldServer;
+import net.minecraft.server.v1_16_R2.WorldSettings;
+
+public class NMSCreator162
+{
+ @SuppressWarnings({"unchecked", "rawtypes", "resource"})
+ public static World createWorld(WorldCreator creator, boolean loadSpawn)
+ {
+ CraftServer server = ((CraftServer) Bukkit.getServer());
+ Map worlds = new V(server).get("worlds");
+ DedicatedServer console = new V(server).get("console");
+ Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP");
+ Validate.notNull((Object) creator, "Creator may not be null");
+ final String name = creator.name();
+ org.bukkit.generator.ChunkGenerator generator = creator.generator();
+ final File folder = new File(server.getWorldContainer(), name);
+ final World world = server.getWorld(name);
+
+ if(world != null)
+ {
+ return world;
+ }
+
+ if(folder.exists() && !folder.isDirectory())
+ {
+ throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
+ }
+
+ if(generator == null)
+ {
+ generator = server.getGenerator(name);
+ }
+
+ ResourceKey actualDimension = null;
+ switch(creator.environment())
+ {
+ case NORMAL:
+ {
+ actualDimension = (ResourceKey) WorldDimension.OVERWORLD;
+ break;
+ }
+ case NETHER:
+ {
+ actualDimension = (ResourceKey) WorldDimension.THE_NETHER;
+ break;
+ }
+ case THE_END:
+ {
+ actualDimension = (ResourceKey) WorldDimension.THE_END;
+ break;
+ }
+ default:
+ {
+ throw new IllegalArgumentException("Illegal dimension");
+ }
+ }
+ Convertable.ConversionSession worldSession;
+ try
+ {
+ worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension);
+ }
+ catch(IOException ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ MinecraftServer.convertWorld(worldSession);
+ final boolean hardcore = creator.hardcore();
+ final RegistryReadOps registryreadops = (RegistryReadOps) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
+ WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
+ if(worlddata == null)
+ {
+ final Properties properties = new Properties();
+ properties.put("generator-settings", Objects.toString(creator.generatorSettings()));
+ properties.put("level-seed", Objects.toString(creator.seed()));
+ properties.put("generate-structures", Objects.toString(creator.generateStructures()));
+ properties.put("level-type", Objects.toString(creator.type().getName()));
+ final GeneratorSettings generatorsettings = GeneratorSettings.a(console.aX(), properties);
+ @SuppressWarnings("deprecation")
+ final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration);
+ worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable());
+ }
+ worlddata.checkName(name);
+ worlddata.a(console.getServerModName(), console.getModded().isPresent());
+ if(console.options.has("forceUpgrade"))
+ {
+ net.minecraft.server.v1_16_R2.Main.convertWorld(worldSession, DataConverterRegistry.a(), console.options.has("eraseCache"), () -> true, (ImmutableSet) worlddata.getGeneratorSettings().d().d().stream().map(entry -> ResourceKey.a(IRegistry.K, entry.getKey().a())).collect(ImmutableSet.toImmutableSet()));
+ }
+ final long j = BiomeManager.a(creator.seed());
+ final List list = (List) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata));
+ final RegistryMaterials registrymaterials = (RegistryMaterials) worlddata.getGeneratorSettings().d();
+ final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension);
+ DimensionManager dimensionmanager;
+ net.minecraft.server.v1_16_R2.ChunkGenerator chunkgenerator;
+
+ if(worlddimension == null)
+ {
+ dimensionmanager = (DimensionManager) console.f.a().d(DimensionManager.OVERWORLD);
+ chunkgenerator = (net.minecraft.server.v1_16_R2.ChunkGenerator) GeneratorSettings.a((IRegistry) console.f.b(IRegistry.ay), (IRegistry) console.f.b(IRegistry.ar), new Random().nextLong());
+ }
+ else
+ {
+ dimensionmanager = worlddimension.b();
+ chunkgenerator = worlddimension.c();
+ }
+
+ final ResourceKey worldKey = (ResourceKey) ResourceKey.a(IRegistry.L, new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
+ //@builder
+ final WorldServer internal = new WorldServer((MinecraftServer) console,
+ console.executorService, worldSession,
+ (IWorldDataServer) worlddata,
+ (ResourceKey) worldKey,
+ dimensionmanager,
+ server.getServer().worldLoadListenerFactory.create(11),
+ chunkgenerator,
+ worlddata.getGeneratorSettings().isDebugWorld(),
+ j,
+ (List) ((creator.environment() == World.Environment.NORMAL) ? list : ImmutableList.of()),
+ true,
+ creator.environment(),
+ generator);
+ //@done
+ if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
+ {
+ try
+ {
+ internal.close();
+ }
+
+ catch(IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+ console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings());
+ internal.setSpawnFlags(true, true);
+ console.worldServer.put(internal.getDimensionKey(), internal);
+ server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld()));
+ if(loadSpawn)
+ {
+ server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal);
+ }
+
+ else
+ {
+ MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore.");
+ }
+
+ server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
+ return (World) internal.getWorld();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java
new file mode 100644
index 000000000..bfc19e222
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java
@@ -0,0 +1,93 @@
+package com.volmit.iris.gen.provisions;
+
+import java.util.List;
+import java.util.Random;
+
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.generator.BlockPopulator;
+import org.bukkit.generator.ChunkGenerator;
+
+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 lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ProvisionBukkit extends ChunkGenerator implements Provisioned
+{
+ private HeightedFakeWorld fakeworld = null;
+ private boolean worldSet = false;
+ private final TerrainProvider provider;
+
+ public ProvisionBukkit(TerrainProvider provider)
+ {
+ this.provider = provider;
+ }
+
+ @Override
+ public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
+ {
+ if(!worldSet)
+ {
+ worldSet = true;
+ provider.getTarget().setRealWorld(world);
+ }
+
+ TerrainChunk terrain = TerrainChunk.create(world, biome);
+ getProvider().generate(random, x, z, terrain);
+ return terrain.getRaw();
+ }
+
+ @Override
+ public boolean canSpawn(World world, int x, int z)
+ {
+ return provider.canSpawn(x, z);
+ }
+
+ @Override
+ public List getDefaultPopulators(World world)
+ {
+ return provider.getPopulators();
+ }
+
+ @Override
+ public Location getFixedSpawnLocation(World world, Random random)
+ {
+ return super.getFixedSpawnLocation(world, random);
+ }
+
+ @Override
+ public boolean isParallelCapable()
+ {
+ return provider.isParallelCapable();
+ }
+
+ @Override
+ public boolean shouldGenerateCaves()
+ {
+ return provider.shouldGenerateCaves();
+ }
+
+ @Override
+ public boolean shouldGenerateDecorations()
+ {
+ return super.shouldGenerateDecorations();
+ }
+
+ @Override
+ public boolean shouldGenerateMobs()
+ {
+ return provider.shouldGenerateMobs();
+ }
+
+ @Override
+ public boolean shouldGenerateStructures()
+ {
+ return provider.shouldGenerateVanillaStructures();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/BukkitTerrainProvider.java b/src/main/java/com/volmit/iris/gen/scaffold/BukkitTerrainProvider.java
deleted file mode 100644
index c110f0b86..000000000
--- a/src/main/java/com/volmit/iris/gen/scaffold/BukkitTerrainProvider.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.volmit.iris.gen.bindings;
-
-import java.util.List;
-import java.util.Random;
-
-import org.bukkit.Location;
-import org.bukkit.World;
-import org.bukkit.generator.BlockPopulator;
-import org.bukkit.generator.ChunkGenerator;
-
-public abstract class BukkitTerrainProvider extends ChunkGenerator implements TerrainProvider
-{
- private final TerrainTarget target;
-
- public BukkitTerrainProvider(TerrainTarget target)
- {
- this.target = target;
- }
-
- @Override
- public abstract void generate(Random random, int x, int z, TerrainChunk chunk);
-
- @Override
- public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
- {
- TerrainChunk terrain = TerrainChunk.create(world);
- generate(random, x, z, terrain);
- return terrain;
- }
-
- @Override
- public abstract boolean canSpawn(World world, int x, int z);
-
- @Override
- public boolean canSpawnDefault(World world, int x, int z)
- {
- return super.canSpawn(world, x, z);
- }
-
- @Override
- public abstract List getDefaultPopulators(World world);
-
- @Override
- public abstract Location getFixedSpawnLocation(World world, Random random);
-
- @Override
- public abstract boolean isParallelCapable();
-
- @Override
- public abstract boolean shouldGenerateCaves();
-
- @Override
- public abstract boolean shouldGenerateDecorations();
-
- @Override
- public abstract boolean shouldGenerateMobs();
-
- @Override
- public abstract boolean shouldGenerateStructures();
-
- @Override
- public TerrainTarget getTarget()
- {
- return target;
- }
-}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java b/src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java
new file mode 100644
index 000000000..a5a640512
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java
@@ -0,0 +1,1305 @@
+package com.volmit.iris.gen.scaffold;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Predicate;
+
+import org.bukkit.BlockChangeDelegate;
+import org.bukkit.Chunk;
+import org.bukkit.ChunkSnapshot;
+import org.bukkit.Difficulty;
+import org.bukkit.Effect;
+import org.bukkit.FluidCollisionMode;
+import org.bukkit.GameRule;
+import org.bukkit.HeightMap;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.Particle;
+import org.bukkit.Raid;
+import org.bukkit.Sound;
+import org.bukkit.SoundCategory;
+import org.bukkit.StructureType;
+import org.bukkit.TreeType;
+import org.bukkit.World;
+import org.bukkit.WorldBorder;
+import org.bukkit.WorldType;
+import org.bukkit.block.Biome;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.boss.DragonBattle;
+import org.bukkit.entity.AbstractArrow;
+import org.bukkit.entity.Arrow;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.FallingBlock;
+import org.bukkit.entity.Item;
+import org.bukkit.entity.LightningStrike;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.generator.BlockPopulator;
+import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.material.MaterialData;
+import org.bukkit.metadata.MetadataValue;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.util.BoundingBox;
+import org.bukkit.util.Consumer;
+import org.bukkit.util.RayTraceResult;
+import org.bukkit.util.Vector;
+
+@SuppressWarnings("deprecation")
+public class HeightedFakeWorld implements World
+{
+ private final int height;
+
+ public HeightedFakeWorld(int height)
+ {
+ this.height = height;
+ }
+
+ @Override
+ public void sendPluginMessage(Plugin source, String channel, byte[] message)
+ {
+
+ }
+
+ @Override
+ public Set getListeningPluginChannels()
+ {
+
+ return null;
+ }
+
+ @Override
+ public void setMetadata(String metadataKey, MetadataValue newMetadataValue)
+ {
+
+ }
+
+ @Override
+ public List getMetadata(String metadataKey)
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean hasMetadata(String metadataKey)
+ {
+
+ return false;
+ }
+
+ @Override
+ public void removeMetadata(String metadataKey, Plugin owningPlugin)
+ {
+
+ }
+
+ @Override
+ public Block getBlockAt(int x, int y, int z)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Block getBlockAt(Location location)
+ {
+
+ return null;
+ }
+
+ @Override
+ public int getHighestBlockYAt(int x, int z)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public int getHighestBlockYAt(Location location)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public Block getHighestBlockAt(int x, int z)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Block getHighestBlockAt(Location location)
+ {
+
+ return null;
+ }
+
+ @Override
+ public int getHighestBlockYAt(int x, int z, HeightMap heightMap)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public int getHighestBlockYAt(Location location, HeightMap heightMap)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public Block getHighestBlockAt(int x, int z, HeightMap heightMap)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Block getHighestBlockAt(Location location, HeightMap heightMap)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Chunk getChunkAt(int x, int z)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Chunk getChunkAt(Location location)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Chunk getChunkAt(Block block)
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean isChunkLoaded(Chunk chunk)
+ {
+
+ return false;
+ }
+
+ @Override
+ public Chunk[] getLoadedChunks()
+ {
+
+ return null;
+ }
+
+ @Override
+ public void loadChunk(Chunk chunk)
+ {
+
+ }
+
+ @Override
+ public boolean isChunkLoaded(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean isChunkGenerated(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean isChunkInUse(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public void loadChunk(int x, int z)
+ {
+
+ }
+
+ @Override
+ public boolean loadChunk(int x, int z, boolean generate)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean unloadChunk(Chunk chunk)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean unloadChunk(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean unloadChunk(int x, int z, boolean save)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean unloadChunkRequest(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean regenerateChunk(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean refreshChunk(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean isChunkForceLoaded(int x, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public void setChunkForceLoaded(int x, int z, boolean forced)
+ {
+
+ }
+
+ @Override
+ public Collection getForceLoadedChunks()
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean addPluginChunkTicket(int x, int z, Plugin plugin)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean removePluginChunkTicket(int x, int z, Plugin plugin)
+ {
+
+ return false;
+ }
+
+ @Override
+ public void removePluginChunkTickets(Plugin plugin)
+ {
+
+ }
+
+ @Override
+ public Collection getPluginChunkTickets(int x, int z)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Map> getPluginChunkTickets()
+ {
+
+ return null;
+ }
+
+ @Override
+ public Item dropItem(Location location, ItemStack item)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Item dropItemNaturally(Location location, ItemStack item)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Arrow spawnArrow(Location location, Vector direction, float speed, float spread)
+ {
+
+ return null;
+ }
+
+ @Override
+ public T spawnArrow(Location location, Vector direction, float speed, float spread, Class clazz)
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean generateTree(Location location, TreeType type)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate)
+ {
+
+ return false;
+ }
+
+ @Override
+ public Entity spawnEntity(Location loc, EntityType type)
+ {
+
+ return null;
+ }
+
+ @Override
+ public LightningStrike strikeLightning(Location loc)
+ {
+
+ return null;
+ }
+
+ @Override
+ public LightningStrike strikeLightningEffect(Location loc)
+ {
+
+ return null;
+ }
+
+ @Override
+ public List getEntities()
+ {
+
+ return null;
+ }
+
+ @Override
+ public List getLivingEntities()
+ {
+
+ return null;
+ }
+
+ @Override
+ public Collection getEntitiesByClass(@SuppressWarnings("unchecked") Class... classes)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Collection getEntitiesByClass(Class cls)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Collection getEntitiesByClasses(Class>... classes)
+ {
+
+ return null;
+ }
+
+ @Override
+ public List getPlayers()
+ {
+
+ return null;
+ }
+
+ @Override
+ public Collection getNearbyEntities(Location location, double x, double y, double z)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Collection getNearbyEntities(Location location, double x, double y, double z, Predicate filter)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Collection getNearbyEntities(BoundingBox boundingBox)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Collection getNearbyEntities(BoundingBox boundingBox, Predicate filter)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, Predicate filter)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize, Predicate filter)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks)
+ {
+
+ return null;
+ }
+
+ @Override
+ public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, Predicate filter)
+ {
+
+ return null;
+ }
+
+ @Override
+ public String getName()
+ {
+
+ return null;
+ }
+
+ @Override
+ public UUID getUID()
+ {
+
+ return null;
+ }
+
+ @Override
+ public Location getSpawnLocation()
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean setSpawnLocation(Location location)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean setSpawnLocation(int x, int y, int z)
+ {
+
+ return false;
+ }
+
+ @Override
+ public long getTime()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setTime(long time)
+ {
+
+ }
+
+ @Override
+ public long getFullTime()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setFullTime(long time)
+ {
+
+ }
+
+ @Override
+ public boolean hasStorm()
+ {
+
+ return false;
+ }
+
+ @Override
+ public void setStorm(boolean hasStorm)
+ {
+
+ }
+
+ @Override
+ public int getWeatherDuration()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setWeatherDuration(int duration)
+ {
+
+ }
+
+ @Override
+ public boolean isThundering()
+ {
+
+ return false;
+ }
+
+ @Override
+ public void setThundering(boolean thundering)
+ {
+
+ }
+
+ @Override
+ public int getThunderDuration()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setThunderDuration(int duration)
+ {
+
+ }
+
+ @Override
+ public boolean createExplosion(double x, double y, double z, float power)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean createExplosion(double x, double y, double z, float power, boolean setFire)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean createExplosion(Location loc, float power)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean createExplosion(Location loc, float power, boolean setFire)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean createExplosion(Location loc, float power, boolean setFire, boolean breakBlocks)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean createExplosion(Location loc, float power, boolean setFire, boolean breakBlocks, Entity source)
+ {
+
+ return false;
+ }
+
+ @Override
+ public Environment getEnvironment()
+ {
+
+ return null;
+ }
+
+ @Override
+ public long getSeed()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public boolean getPVP()
+ {
+
+ return false;
+ }
+
+ @Override
+ public void setPVP(boolean pvp)
+ {
+
+ }
+
+ @Override
+ public ChunkGenerator getGenerator()
+ {
+
+ return null;
+ }
+
+ @Override
+ public void save()
+ {
+
+ }
+
+ @Override
+ public List getPopulators()
+ {
+
+ return null;
+ }
+
+ @Override
+ public T spawn(Location location, Class clazz) throws IllegalArgumentException
+ {
+
+ return null;
+ }
+
+ @Override
+ public T spawn(Location location, Class clazz, Consumer function) throws IllegalArgumentException
+ {
+
+ return null;
+ }
+
+ @Override
+ public FallingBlock spawnFallingBlock(Location location, MaterialData data) throws IllegalArgumentException
+ {
+
+ return null;
+ }
+
+ @Override
+ public FallingBlock spawnFallingBlock(Location location, BlockData data) throws IllegalArgumentException
+ {
+
+ return null;
+ }
+
+ @Override
+ public FallingBlock spawnFallingBlock(Location location, Material material, byte data) throws IllegalArgumentException
+ {
+
+ return null;
+ }
+
+ @Override
+ public void playEffect(Location location, Effect effect, int data)
+ {
+
+ }
+
+ @Override
+ public void playEffect(Location location, Effect effect, int data, int radius)
+ {
+
+ }
+
+ @Override
+ public void playEffect(Location location, Effect effect, T data)
+ {
+
+ }
+
+ @Override
+ public void playEffect(Location location, Effect effect, T data, int radius)
+ {
+
+ }
+
+ @Override
+ public ChunkSnapshot getEmptyChunkSnapshot(int x, int z, boolean includeBiome, boolean includeBiomeTemp)
+ {
+
+ return null;
+ }
+
+ @Override
+ public void setSpawnFlags(boolean allowMonsters, boolean allowAnimals)
+ {
+
+ }
+
+ @Override
+ public boolean getAllowAnimals()
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean getAllowMonsters()
+ {
+
+ return false;
+ }
+
+ @Override
+ public Biome getBiome(int x, int z)
+ {
+
+ return null;
+ }
+
+ @Override
+ public Biome getBiome(int x, int y, int z)
+ {
+
+ return null;
+ }
+
+ @Override
+ public void setBiome(int x, int z, Biome bio)
+ {
+
+ }
+
+ @Override
+ public void setBiome(int x, int y, int z, Biome bio)
+ {
+
+ }
+
+ @Override
+ public double getTemperature(int x, int z)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public double getTemperature(int x, int y, int z)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public double getHumidity(int x, int z)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public double getHumidity(int x, int y, int z)
+ {
+
+ return 0;
+ }
+
+ @Override
+ public int getMaxHeight()
+ {
+
+ return height;
+ }
+
+ @Override
+ public int getSeaLevel()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public boolean getKeepSpawnInMemory()
+ {
+
+ return false;
+ }
+
+ @Override
+ public void setKeepSpawnInMemory(boolean keepLoaded)
+ {
+
+ }
+
+ @Override
+ public boolean isAutoSave()
+ {
+
+ return false;
+ }
+
+ @Override
+ public void setAutoSave(boolean value)
+ {
+
+ }
+
+ @Override
+ public void setDifficulty(Difficulty difficulty)
+ {
+
+ }
+
+ @Override
+ public Difficulty getDifficulty()
+ {
+
+ return null;
+ }
+
+ @Override
+ public File getWorldFolder()
+ {
+
+ return null;
+ }
+
+ @Override
+ public WorldType getWorldType()
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean canGenerateStructures()
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean isHardcore()
+ {
+
+ return false;
+ }
+
+ @Override
+ public void setHardcore(boolean hardcore)
+ {
+
+ }
+
+ @Override
+ public long getTicksPerAnimalSpawns()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns)
+ {
+
+ }
+
+ @Override
+ public long getTicksPerMonsterSpawns()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns)
+ {
+
+ }
+
+ @Override
+ public long getTicksPerWaterSpawns()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setTicksPerWaterSpawns(int ticksPerWaterSpawns)
+ {
+
+ }
+
+ @Override
+ public long getTicksPerWaterAmbientSpawns()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setTicksPerWaterAmbientSpawns(int ticksPerAmbientSpawns)
+ {
+
+ }
+
+ @Override
+ public long getTicksPerAmbientSpawns()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns)
+ {
+
+ }
+
+ @Override
+ public int getMonsterSpawnLimit()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setMonsterSpawnLimit(int limit)
+ {
+
+ }
+
+ @Override
+ public int getAnimalSpawnLimit()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setAnimalSpawnLimit(int limit)
+ {
+
+ }
+
+ @Override
+ public int getWaterAnimalSpawnLimit()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setWaterAnimalSpawnLimit(int limit)
+ {
+
+ }
+
+ @Override
+ public int getWaterAmbientSpawnLimit()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setWaterAmbientSpawnLimit(int limit)
+ {
+
+ }
+
+ @Override
+ public int getAmbientSpawnLimit()
+ {
+
+ return 0;
+ }
+
+ @Override
+ public void setAmbientSpawnLimit(int limit)
+ {
+
+ }
+
+ @Override
+ public void playSound(Location location, Sound sound, float volume, float pitch)
+ {
+
+ }
+
+ @Override
+ public void playSound(Location location, String sound, float volume, float pitch)
+ {
+
+ }
+
+ @Override
+ public void playSound(Location location, Sound sound, SoundCategory category, float volume, float pitch)
+ {
+
+ }
+
+ @Override
+ public void playSound(Location location, String sound, SoundCategory category, float volume, float pitch)
+ {
+
+ }
+
+ @Override
+ public String[] getGameRules()
+ {
+
+ return null;
+ }
+
+ @Override
+ public String getGameRuleValue(String rule)
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean setGameRuleValue(String rule, String value)
+ {
+
+ return false;
+ }
+
+ @Override
+ public boolean isGameRule(String rule)
+ {
+
+ return false;
+ }
+
+ @Override
+ public T getGameRuleValue(GameRule rule)
+ {
+
+ return null;
+ }
+
+ @Override
+ public T getGameRuleDefault(GameRule rule)
+ {
+
+ return null;
+ }
+
+ @Override
+ public boolean setGameRule(GameRule rule, T newValue)
+ {
+
+ return false;
+ }
+
+ @Override
+ public WorldBorder getWorldBorder()
+ {
+
+ return null;
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, Location location, int count)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, double x, double y, double z, int count)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, Location location, int count, T data)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, double x, double y, double z, int count, T data)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, T data)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, T data)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force)
+ {
+
+ }
+
+ @Override
+ public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force)
+ {
+
+ }
+
+ @Override
+ public Location locateNearestStructure(Location origin, StructureType structureType, int radius, boolean findUnexplored)
+ {
+ return null;
+ }
+
+ @Override
+ public int getViewDistance()
+ {
+ return 0;
+ }
+
+ @Override
+ public Spigot spigot()
+ {
+ return null;
+ }
+
+ @Override
+ public Raid locateNearestRaid(Location location, int radius)
+ {
+ return null;
+ }
+
+ @Override
+ public List getRaids()
+ {
+ return null;
+ }
+
+ @Override
+ public DragonBattle getEnderDragonBattle()
+ {
+ return null;
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java
index 3a562edcb..1fd66fed0 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java
@@ -1,4 +1,4 @@
-package com.volmit.iris.gen.bindings;
+package com.volmit.iris.gen.scaffold;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisGenConfiguration.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisGenConfiguration.java
new file mode 100644
index 000000000..6820a7521
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisGenConfiguration.java
@@ -0,0 +1,24 @@
+package com.volmit.iris.gen.scaffold;
+
+import com.volmit.iris.gen.IrisChunkGenerator;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class IrisGenConfiguration
+{
+ private TerrainTarget target;
+
+ @Builder.Default
+ private int threads = 16;
+
+ @Builder.Default
+ private String dimension = "";
+
+ public IrisChunkGenerator buildGenerator()
+ {
+ return new IrisChunkGenerator(this);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java
index b88c65381..d98c1d73c 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java
@@ -1,10 +1,10 @@
-package com.volmit.iris.gen.bindings;
-
-import java.lang.reflect.Constructor;
+package com.volmit.iris.gen.scaffold;
+import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
+import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import org.bukkit.generator.ChunkGenerator.ChunkData;
import org.bukkit.material.MaterialData;
@@ -16,39 +16,26 @@ public class IrisTerrainChunk implements TerrainChunk
private final Biome[] biome2D;
private final IrisBiomeStorage biome3D;
private final ChunkData rawChunkData;
- private final Constructor> construct = buildConstruct();
+ private final BiomeGrid storage;
public IrisTerrainChunk(int maxHeight)
{
- rawChunkData = createChunkData(maxHeight);
- biome2D = Iris.biome3d ? null : new Biome[256];
- biome3D = Iris.biome3d ? new IrisBiomeStorage() : null;
+ this(null, maxHeight);
}
- private Constructor> buildConstruct()
+ public IrisTerrainChunk(BiomeGrid storage, int maxHeight)
{
- try
- {
- Class> chunkDatazz = Class.forName("org.bukkit.craftbukkit." + Iris.nmsTag() + ".generator.CraftChunkData");
- Constructor> construct = chunkDatazz.getConstructor(int.class);
- construct.setAccessible(true);
- return construct;
- }
-
- catch(Throwable e)
- {
- Iris.error("Failed create construct for ChunkData(int)");
- e.printStackTrace();
- }
-
- return null;
+ this.storage = storage;
+ rawChunkData = createChunkData(maxHeight);
+ biome2D = storage != null ? null : Iris.biome3d ? null : new Biome[256];
+ biome3D = storage != null ? null : Iris.biome3d ? new IrisBiomeStorage() : null;
}
private ChunkData createChunkData(int maxHeight)
{
try
{
- return (ChunkData) construct.newInstance(maxHeight);
+ return Bukkit.createChunkData(new HeightedFakeWorld(maxHeight));
}
catch(Throwable e)
@@ -62,6 +49,11 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public Biome getBiome(int x, int z)
{
+ if(storage != null)
+ {
+ return storage.getBiome(x, z);
+ }
+
if(biome2D != null)
{
return biome2D[(z << 4) | x];
@@ -73,6 +65,11 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public Biome getBiome(int x, int y, int z)
{
+ if(storage != null)
+ {
+ return storage.getBiome(x, y, z);
+ }
+
if(biome2D != null)
{
return biome2D[(z << 4) | x];
@@ -84,6 +81,12 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public void setBiome(int x, int z, Biome bio)
{
+ if(storage != null)
+ {
+ storage.setBiome(x, z, bio);
+ return;
+ }
+
if(biome2D != null)
{
biome2D[(z << 4) | x] = bio;
@@ -96,6 +99,12 @@ public class IrisTerrainChunk implements TerrainChunk
@Override
public void setBiome(int x, int y, int z, Biome bio)
{
+ if(storage != null)
+ {
+ storage.setBiome(x, y, z, bio);
+ return;
+ }
+
if(biome2D != null)
{
biome2D[(z << 4) | x] = bio;
@@ -177,4 +186,10 @@ public class IrisTerrainChunk implements TerrainChunk
{
return rawChunkData.getData(x, y, z);
}
+
+ @Override
+ public ChunkData getRaw()
+ {
+ return rawChunkData;
+ }
}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java
new file mode 100644
index 000000000..0fdcbc6dc
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java
@@ -0,0 +1,23 @@
+package com.volmit.iris.gen.scaffold;
+
+import org.bukkit.World;
+
+import com.volmit.iris.gen.IrisChunkGenerator;
+
+public class IrisWorlds
+{
+ public boolean isIrisWorld(World world)
+ {
+ return world.getGenerator() instanceof Provisioned;
+ }
+
+ public IrisChunkGenerator getProvider(World world)
+ {
+ if(isIrisWorld(world))
+ {
+ return (IrisChunkGenerator) ((Provisioned) world.getGenerator()).getProvider();
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java b/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java
new file mode 100644
index 000000000..bbb8a5a63
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java
@@ -0,0 +1,6 @@
+package com.volmit.iris.gen.scaffold;
+
+public interface Provisioned
+{
+ public TerrainProvider getProvider();
+}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java
index dd67b449c..b5fd84818 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java
@@ -1,4 +1,4 @@
-package com.volmit.iris.gen.bindings;
+package com.volmit.iris.gen.scaffold;
import org.bukkit.World;
import org.bukkit.block.Biome;
@@ -18,6 +18,16 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
return new IrisTerrainChunk(maxHeight);
}
+ public static TerrainChunk create(World world, BiomeGrid grid)
+ {
+ return create(world.getMaxHeight(), grid);
+ }
+
+ public static TerrainChunk create(int maxHeight, BiomeGrid grid)
+ {
+ return new IrisTerrainChunk(grid, maxHeight);
+ }
+
/**
* Get biome at x, z within chunk being generated
*
@@ -114,4 +124,6 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
* outside the chunk's bounds
*/
public BlockData getBlockData(int x, int y, int z);
+
+ public ChunkData getRaw();
}
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 cd3ba8bbc..e5a88e237 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java
@@ -1,10 +1,8 @@
-package com.volmit.iris.gen.bindings;
+package com.volmit.iris.gen.scaffold;
import java.util.List;
import java.util.Random;
-import org.bukkit.Location;
-import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
public interface TerrainProvider
@@ -13,21 +11,17 @@ public interface TerrainProvider
public void generate(Random random, int x, int z, TerrainChunk chunk);
- public boolean canSpawn(World world, int x, int z);
+ public boolean canSpawn(int x, int z);
- public boolean canSpawnDefault(World world, int x, int z);
-
- public List getDefaultPopulators(World world);
-
- public Location getFixedSpawnLocation(World world, Random random);
+ public List getPopulators();
public boolean isParallelCapable();
+ public boolean shouldGenerateMobs();
+
public boolean shouldGenerateCaves();
-
+
public boolean shouldGenerateDecorations();
- public boolean shouldGenerateMobs();
-
- public boolean shouldGenerateStructures();
+ public boolean shouldGenerateVanillaStructures();
}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java b/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java
index 88cb7871e..4033bb8cb 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java
@@ -1,9 +1,13 @@
-package com.volmit.iris.gen.bindings;
+package com.volmit.iris.gen.scaffold;
import java.io.File;
+import java.util.List;
import org.bukkit.World;
import org.bukkit.World.Environment;
+import org.bukkit.entity.Player;
+
+import com.volmit.iris.util.KList;
import lombok.Builder;
import lombok.Data;
@@ -16,6 +20,20 @@ public class TerrainTarget
private Environment environment;
private String name;
private File folder;
+ private static final KList emptyPlayers = new KList<>();
+ private World realWorld;
+
+ public void setRealWorld(World realWorld)
+ {
+ if(this.realWorld == null || realWorld != this.realWorld)
+ {
+ this.realWorld = realWorld;
+ this.seed = realWorld.getSeed();
+ this.folder = realWorld.getWorldFolder();
+ this.environment = realWorld.getEnvironment();
+ this.name = realWorld.getName();
+ }
+ }
public static TerrainTarget from(World world)
{
@@ -25,7 +43,61 @@ public class TerrainTarget
.seed(world.getSeed())
.folder(world.getWorldFolder())
.name(world.getName())
+ .realWorld(world)
.build();
//@done
}
+
+ public List getPlayers()
+ {
+ return realWorld != null ? realWorld.getPlayers() : emptyPlayers;
+ }
+
+ public boolean isWorld(World world)
+ {
+ return world.getName().equals(getName()) && world.getSeed() == getSeed() && getEnvironment().equals(world.getEnvironment()) && world.getWorldFolder().equals(getFolder());
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if(this == obj)
+ return true;
+ if(obj == null)
+ return false;
+ if(getClass() != obj.getClass())
+ return false;
+ TerrainTarget other = (TerrainTarget) obj;
+ if(environment != other.environment)
+ return false;
+ if(folder == null)
+ {
+ if(other.folder != null)
+ return false;
+ }
+ else if(!folder.equals(other.folder))
+ return false;
+ if(name == null)
+ {
+ if(other.name != null)
+ return false;
+ }
+ else if(!name.equals(other.name))
+ return false;
+ if(seed != other.seed)
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((environment == null) ? 0 : environment.hashCode());
+ result = prime * result + ((folder == null) ? 0 : folder.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + (int) (seed ^ (seed >>> 32));
+ return result;
+ }
}
diff --git a/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java b/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java
index 1ca978d0c..7cc6a5c88 100644
--- a/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java
+++ b/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java
@@ -81,6 +81,17 @@ public class MultiverseCoreLink
getList().remove(world.getName());
saveConfig();
}
+
+ public void removeFromConfig(String world)
+ {
+ if(!supported())
+ {
+ return;
+ }
+
+ getList().remove(world);
+ saveConfig();
+ }
public void saveConfig()
{
diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java
index 362f3c76a..c6b48e65f 100644
--- a/src/main/java/com/volmit/iris/object/IrisDimension.java
+++ b/src/main/java/com/volmit/iris/object/IrisDimension.java
@@ -137,6 +137,10 @@ public class IrisDimension extends IrisRegistrant
@DontObfuscate
@Desc("Carve terrain or not")
private boolean carving = true;
+
+ @DontObfuscate
+ @Desc("Generate vanilla caves")
+ private boolean vanillaCaves = false;
@DontObfuscate
@Desc("Generate vanilla structures")
diff --git a/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java b/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java
index 0c167cee2..279d17121 100644
--- a/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java
+++ b/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java
@@ -76,9 +76,9 @@ public class IrisEntitySpawn
return null;
}
- if(rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4)).i(1, getRarity()) == 1)
+ if(rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)).i(1, getRarity()) == 1)
{
- return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4)));
+ return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)));
}
return null;