diff --git a/pom.xml b/pom.xml
index 10357a43b..a0d52f42d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -188,12 +188,6 @@
1.16.2
provided
-
- org.bukkit.craftbukkit
- cb-1.16.1
- 1.16.1
- provided
-
org.bukkit.craftbukkit
cb-1.15.1
diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java
index 68f1c7237..90a5ff214 100644
--- a/src/main/java/com/volmit/iris/Iris.java
+++ b/src/main/java/com/volmit/iris/Iris.java
@@ -19,6 +19,7 @@ import org.bukkit.plugin.Plugin;
import com.volmit.iris.command.CommandIris;
import com.volmit.iris.command.PermissionIris;
import com.volmit.iris.gen.IrisTerrainProvider;
+import com.volmit.iris.gen.nms.INMS;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainTarget;
@@ -60,7 +61,6 @@ public class Iris extends MortarPlugin
public static StructureManager struct;
public static EditManager edit;
public static IrisBoardManager board;
- public static String nmsTag = findNMSTag();
public static MultiverseCoreLink linkMultiverseCore;
public static MythicMobsLink linkMythicMobs;
private static IrisLock lock = new IrisLock("Iris");
@@ -79,6 +79,7 @@ public class Iris extends MortarPlugin
public Iris()
{
+ INMS.get();
IO.delete(new File("iris"));
lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4gb
}
@@ -97,22 +98,6 @@ public class Iris extends MortarPlugin
return tc;
}
- private static String findNMSTag()
- {
- try
- {
- return Bukkit.getServer().getClass().getCanonicalName().split("\\Q.\\E")[3];
- }
-
- catch(Throwable e)
- {
- Iris.error("Failed to determine server nms version!");
- e.printStackTrace();
- }
-
- return "UNKNOWN NMS VERSION";
- }
-
public ProvisionBukkit createProvisionBukkit(IrisGenConfiguration config)
{
return new ProvisionBukkit(createIrisProvider(config));
@@ -277,6 +262,13 @@ public class Iris extends MortarPlugin
public static void msg(String string)
{
lock.lock();
+ if(instance == null)
+ {
+ System.out.println("[Iris]: " + string);
+ lock.unlock();
+ return;
+ }
+
String msg = C.GREEN + "[Iris]: " + C.GRAY + string;
Bukkit.getConsoleSender().sendMessage(msg);
lock.unlock();
@@ -438,11 +430,6 @@ public class Iris extends MortarPlugin
}
}
- public static String nmsTag()
- {
- return nmsTag;
- }
-
@SuppressWarnings("deprecation")
public static void later(NastyRunnable object)
{
diff --git a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java
index 03c7eaee2..3ce7e8ddc 100644
--- a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java
+++ b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java
@@ -9,7 +9,7 @@ import org.bukkit.WorldType;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.IrisTerrainProvider;
-import com.volmit.iris.gen.nms.NMSCreator;
+import com.volmit.iris.gen.nms.INMS;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainTarget;
@@ -109,7 +109,7 @@ public class CommandIrisCreate extends MortarCommand
WorldCreator wc = new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment());
- World world = NMSCreator.createWorld(wc, false);
+ World world = INMS.get().createWorld(wc, false);
done.set(true);
sender.sendMessage(worldName + " Spawn Area generated.");
diff --git a/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java
index 6384df3fb..a83003fa8 100644
--- a/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/ContextualTerrainProvider.java
@@ -24,6 +24,7 @@ import org.bukkit.event.world.WorldUnloadEvent;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.gen.atomics.AtomicMulticache;
+import com.volmit.iris.gen.scaffold.GeneratedChunk;
import com.volmit.iris.gen.scaffold.IrisContext;
import com.volmit.iris.gen.scaffold.IrisMetrics;
import com.volmit.iris.gen.scaffold.Provisioned;
@@ -42,6 +43,7 @@ import com.volmit.iris.util.B;
import com.volmit.iris.util.BlockPosition;
import com.volmit.iris.util.C;
import com.volmit.iris.util.ChronoLatch;
+import com.volmit.iris.util.HeightMap;
import com.volmit.iris.util.J;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.KSet;
@@ -112,7 +114,7 @@ public abstract class ContextualTerrainProvider implements TerrainProvider, List
warnings.add(warning);
}
- protected abstract void onGenerate(RNG masterRandom, int x, int z, TerrainChunk chunk);
+ protected abstract GeneratedChunk onGenerate(RNG masterRandom, int x, int z, TerrainChunk chunk);
protected abstract void onInit(RNG masterRandom);
@@ -382,7 +384,7 @@ public abstract class ContextualTerrainProvider implements TerrainProvider, List
}
@Override
- public void generate(Random no, int x, int z, TerrainChunk terrain)
+ public GeneratedChunk generate(Random no, int x, int z, TerrainChunk terrain)
{
setHotloadable(false);
if(!isDev())
@@ -394,20 +396,20 @@ public abstract class ContextualTerrainProvider implements TerrainProvider, List
if(failing)
{
generateFailure(terrain);
- return;
+ return GeneratedChunk.builder().build();
}
try
{
RNG random = new RNG(getTarget().getSeed());
init(random.nextParallelRNG(0));
- onGenerate(random, x, z, terrain);
+ GeneratedChunk c = onGenerate(random, x, z, terrain);
generated++;
long hits = CNG.hits;
CNG.hits = 0;
Iris.instance.hit(hits);
setHotloadable(true);
- return;
+ return c;
}
catch(Throwable e)
@@ -417,6 +419,7 @@ public abstract class ContextualTerrainProvider implements TerrainProvider, List
setHotloadable(true);
generateFailure(terrain);
+ return GeneratedChunk.builder().build();
}
private void doCheckHotload()
diff --git a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java
index a075202ad..3833a31ca 100644
--- a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java
@@ -20,6 +20,7 @@ import org.bukkit.util.BlockVector;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.atomics.AtomicRegionData;
+import com.volmit.iris.gen.scaffold.GeneratedChunk;
import com.volmit.iris.gen.scaffold.IrisContext;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainChunk;
@@ -91,18 +92,19 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte
}
@Override
- public void generate(Random no, int x, int z, TerrainChunk terrain)
+ public GeneratedChunk generate(Random no, int x, int z, TerrainChunk terrain)
{
PrecisionStopwatch s = PrecisionStopwatch.start();
- super.generate(no, x, z, terrain);
+ GeneratedChunk c = 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, TerrainChunk terrain)
+ protected GeneratedChunk onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
- super.onGenerate(random, x, z, terrain);
+ return super.onGenerate(random, x, z, terrain);
}
public void onInit(RNG rng)
@@ -566,10 +568,10 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte
}
}
}
-
+
catch(Throwable xe)
{
-
+
}
}
diff --git a/src/main/java/com/volmit/iris/gen/ParallelTerrainProvider.java b/src/main/java/com/volmit/iris/gen/ParallelTerrainProvider.java
index 6c7a4bf5b..6059aa10b 100644
--- a/src/main/java/com/volmit/iris/gen/ParallelTerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/ParallelTerrainProvider.java
@@ -3,6 +3,7 @@ package com.volmit.iris.gen;
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.GeneratedChunk;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.BiomeMap;
@@ -44,7 +45,7 @@ public abstract class ParallelTerrainProvider extends DimensionalTerrainProvider
Iris.info("Thread Count changed to " + getThreads());
}
- protected abstract void onGenerateColumn(int cx, int cz, int wx, int wz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, boolean sampled);
+ protected abstract int onGenerateColumn(int cx, int cz, int wx, int wz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, boolean sampled);
protected void onGenerateColumn(int cx, int cz, int wx, int wz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap)
{
@@ -62,7 +63,7 @@ public abstract class ParallelTerrainProvider extends DimensionalTerrainProvider
return onSampleColumnHeight(x >> 4, z >> 4, x, z, x & 15, z & 15);
}
- protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
+ protected GeneratedChunk onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
PrecisionStopwatch p = PrecisionStopwatch.start();
AtomicSliverMap map = new AtomicSliverMap();
@@ -103,6 +104,14 @@ public abstract class ParallelTerrainProvider extends DimensionalTerrainProvider
getMetrics().getTerrain().put(p.getMilliseconds());
p = PrecisionStopwatch.start();
onPostGenerate(random, x, z, terrain, height, biomeMap, map);
+ return GeneratedChunk.builder()
+ .biomeMap(biomeMap)
+ .sliverMap(map)
+ .height(height)
+ .terrain(terrain)
+ .x(x)
+ .z(z)
+ .build();
}
protected void onClose()
diff --git a/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java b/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java
index 72cd02ea8..01eb44e3f 100644
--- a/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java
@@ -4,6 +4,7 @@ import org.bukkit.generator.ChunkGenerator.ChunkData;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.post.PostMasterPatcher;
+import com.volmit.iris.gen.scaffold.GeneratedChunk;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.CaveResult;
@@ -39,13 +40,13 @@ public abstract class PostBlockTerrainProvider extends ParallaxTerrainProvider i
}
@Override
- protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
+ protected GeneratedChunk onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
- super.onGenerate(random, x, z, terrain);
+ GeneratedChunk map = super.onGenerate(random, x, z, terrain);
if(!getDimension().isPostProcessing())
{
- return;
+ return map;
}
int rx, i;
@@ -74,6 +75,7 @@ public abstract class PostBlockTerrainProvider extends ParallaxTerrainProvider i
p.end();
getMetrics().getPost().put(p.getMilliseconds());
+ return map;
}
@Override
diff --git a/src/main/java/com/volmit/iris/gen/SkyTerrainProvider.java b/src/main/java/com/volmit/iris/gen/SkyTerrainProvider.java
index 37f25bc29..e1cd7b983 100644
--- a/src/main/java/com/volmit/iris/gen/SkyTerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/SkyTerrainProvider.java
@@ -1,5 +1,6 @@
package com.volmit.iris.gen;
+import com.volmit.iris.gen.scaffold.GeneratedChunk;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.util.RNG;
@@ -12,8 +13,8 @@ public abstract class SkyTerrainProvider extends PostBlockTerrainProvider
}
@Override
- protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
+ protected GeneratedChunk onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
- super.onGenerate(random, x, z, terrain);
+ return super.onGenerate(random, x, z, terrain);
}
}
diff --git a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java
index c0050331d..8e4c3efd3 100644
--- a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java
@@ -12,6 +12,7 @@ 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.layer.GenLayerRavine;
+import com.volmit.iris.gen.scaffold.GeneratedChunk;
import com.volmit.iris.gen.scaffold.TerrainChunk;
import com.volmit.iris.gen.scaffold.TerrainTarget;
import com.volmit.iris.noise.CNG;
@@ -119,7 +120,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider
}
@Override
- protected void onGenerateColumn(int cx, int cz, int rx, int rz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, boolean sampled)
+ protected int onGenerateColumn(int cx, int cz, int rx, int rz, int x, int z, AtomicSliver sliver, BiomeMap biomeMap, boolean sampled)
{
if(x > 15 || x < 0 || z > 15 || z < 0)
{
@@ -339,17 +340,21 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider
{
decorateLand(crand, biome, sliver, Math.max(height, fluidHeight), rx, rz, block);
}
+
+ return height;
}
@Override
- protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
+ protected GeneratedChunk onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
- super.onGenerate(random, x, z, terrain);
+ GeneratedChunk map = super.onGenerate(random, x, z, terrain);
if(!getDimension().isVanillaCaves())
{
generateDeposits(random.nextParallelRNG(x * ((z * 39) + 10000)).nextParallelRNG(z + z - x), terrain, x, z);
}
+
+ return map;
}
private void decorateLand(RNG rng, IrisBiome biome, AtomicSliver sliver, int k, int rx, int rz, FastBlockData block)
diff --git a/src/main/java/com/volmit/iris/gen/nms/INMS.java b/src/main/java/com/volmit/iris/gen/nms/INMS.java
new file mode 100644
index 000000000..61943a745
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/INMS.java
@@ -0,0 +1,66 @@
+package com.volmit.iris.gen.nms;
+
+import org.bukkit.Bukkit;
+
+import com.volmit.iris.Iris;
+import com.volmit.iris.gen.nms.v16_2.NMSBinding16_2;
+import com.volmit.iris.gen.nms.v1X.NMSBinding1X;
+import com.volmit.iris.util.KMap;
+
+public class INMS
+{
+ //@builder
+ private static final KMap> bindings = new KMap>()
+ .qput("v1_16_R2", NMSBinding16_2.class);
+ //@done
+ private static final INMSBinding binding = bind();
+
+ public static INMSBinding get()
+ {
+ return binding;
+ }
+
+ private static final String getNMSTag()
+ {
+ try
+ {
+ return Bukkit.getServer().getClass().getCanonicalName().split("\\Q.\\E")[3];
+ }
+
+ catch(Throwable e)
+ {
+ Iris.error("Failed to determine server nms version!");
+ e.printStackTrace();
+ }
+
+ return "BUKKIT";
+ }
+
+ private static final INMSBinding bind()
+ {
+ String code = getNMSTag();
+ Iris.info("Locating NMS Binding for " + code);
+
+ if(bindings.containsKey(code))
+ {
+ try
+ {
+ INMSBinding b = bindings.get(code).getConstructor().newInstance();
+ Iris.info("Craftbukkit " + code + " <-> " + b.getClass().getSimpleName() + " Successfully Bound");
+
+ return b;
+ }
+
+ catch(Throwable e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ Iris.info("Craftbukkit " + code + " <-> " + NMSBinding1X.class.getSimpleName() + " Successfully Bound");
+ Iris.warn("Note: Some features of Iris may not work the same since you are on an unsupported version of Minecraft.");
+ Iris.warn("Note: If this is a new version, expect an update soon.");
+
+ return new NMSBinding1X();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/INMSBinding.java b/src/main/java/com/volmit/iris/gen/nms/INMSBinding.java
new file mode 100644
index 000000000..861b13431
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/INMSBinding.java
@@ -0,0 +1,19 @@
+package com.volmit.iris.gen.nms;
+
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+
+public interface INMSBinding
+{
+ public INMSCreator getCreator();
+
+ default World createWorld(WorldCreator creator)
+ {
+ return getCreator().createWorld(creator);
+ }
+
+ default World createWorld(WorldCreator creator, boolean loadSpawn)
+ {
+ return getCreator().createWorld(creator, loadSpawn);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/INMSCreator.java b/src/main/java/com/volmit/iris/gen/nms/INMSCreator.java
new file mode 100644
index 000000000..02abc85b9
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/INMSCreator.java
@@ -0,0 +1,14 @@
+package com.volmit.iris.gen.nms;
+
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+
+public interface INMSCreator
+{
+ default World createWorld(WorldCreator creator)
+ {
+ return createWorld(creator, false);
+ }
+
+ public World createWorld(WorldCreator creator, boolean loadSpawn);
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java
deleted file mode 100644
index 18d28835d..000000000
--- a/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.volmit.iris.gen.nms;
-
-import org.bukkit.Bukkit;
-import org.bukkit.World;
-import org.bukkit.WorldCreator;
-
-import com.volmit.iris.Iris;
-import com.volmit.iris.IrisSettings;
-
-import io.papermc.lib.PaperLib;
-
-public class NMSCreator
-{
- public static World createWorld(WorldCreator creator)
- {
- return createWorld(creator, true);
- }
-
- public static World createWorld(WorldCreator creator, boolean loadSpawn)
- {
- if(IrisSettings.get().isSkipPrepareSpawnNMS())
- {
- if(!PaperLib.isPaper())
- {
- 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)
- {
-
- }
- }
- }
-
- return Bukkit.createWorld(creator);
- }
-}
diff --git a/src/main/java/com/volmit/iris/gen/nms/WorldCracker162.java b/src/main/java/com/volmit/iris/gen/nms/WorldCracker162.java
deleted file mode 100644
index 8b98c94f3..000000000
--- a/src/main/java/com/volmit/iris/gen/nms/WorldCracker162.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.volmit.iris.gen.nms;
-
-import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_16_R2.CraftWorld;
-
-import net.minecraft.server.v1_16_R2.ChunkGenerator;
-import net.minecraft.server.v1_16_R2.DimensionManager;
-import net.minecraft.server.v1_16_R2.IChunkAccess;
-import net.minecraft.server.v1_16_R2.MinecraftServer;
-import net.minecraft.server.v1_16_R2.RegistryMaterials;
-import net.minecraft.server.v1_16_R2.StructureManager;
-import net.minecraft.server.v1_16_R2.StructureSettings;
-import net.minecraft.server.v1_16_R2.WorldChunkManager;
-import net.minecraft.server.v1_16_R2.WorldDataServer;
-import net.minecraft.server.v1_16_R2.WorldDimension;
-import net.minecraft.server.v1_16_R2.WorldServer;
-
-public class WorldCracker162
-{
- @SuppressWarnings("unused")
- public static void printSignature(World world, int x, int z) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
- {
- WorldServer ws = ((CraftWorld) world).getHandle();
- MinecraftServer server = ws.getMinecraftServer();
- WorldDataServer wds = ws.worldDataServer;
- StructureManager sm = ws.getStructureManager();
- RegistryMaterials registrymaterials = wds.getGeneratorSettings().d();
- WorldDimension wdm = (WorldDimension) registrymaterials.a(WorldDimension.OVERWORLD);
- DimensionManager dm = wdm.b();
- ChunkGenerator cg = wdm.c();
- StructureSettings ss = cg.getSettings();
- IChunkAccess ica = ws.getChunkAt(x, z);
- WorldChunkManager wcm = cg.getWorldChunkManager();
- }
-}
diff --git a/src/main/java/com/volmit/iris/gen/nms/v14_1/NMSCreator14_1.java b/src/main/java/com/volmit/iris/gen/nms/v14_1/NMSCreator14_1.java
deleted file mode 100644
index 9231c1f17..000000000
--- a/src/main/java/com/volmit/iris/gen/nms/v14_1/NMSCreator14_1.java
+++ /dev/null
@@ -1,144 +0,0 @@
-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.Location;
-import org.bukkit.World;
-import org.bukkit.WorldCreator;
-import org.bukkit.craftbukkit.v1_14_R1.CraftServer;
-import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
-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;
-import net.minecraft.server.v1_14_R1.ChunkCoordIntPair;
-import net.minecraft.server.v1_14_R1.TicketType;
-import net.minecraft.server.v1_14_R1.Unit;
-
-public class NMSCreator141
-{
- public static void addStartTicket(Location center, int size)
- {
- ((CraftWorld) center.getWorld()).getHandle().getChunkProvider().addTicket(TicketType.START, new ChunkCoordIntPair(center.getBlockX() >> 4, center.getBlockZ() >> 4), size, Unit.INSTANCE);
- }
-
- @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/v15_1/NMSCreator15_1.java b/src/main/java/com/volmit/iris/gen/nms/v15_1/NMSCreator15_1.java
deleted file mode 100644
index b84b6e4a9..000000000
--- a/src/main/java/com/volmit/iris/gen/nms/v15_1/NMSCreator15_1.java
+++ /dev/null
@@ -1,144 +0,0 @@
-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.Location;
-import org.bukkit.World;
-import org.bukkit.WorldCreator;
-import org.bukkit.craftbukkit.v1_15_R1.CraftServer;
-import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
-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;
-import net.minecraft.server.v1_15_R1.ChunkCoordIntPair;
-import net.minecraft.server.v1_15_R1.TicketType;
-import net.minecraft.server.v1_15_R1.Unit;
-
-public class NMSCreator151
-{
- public static void addStartTicket(Location center, int size)
- {
- ((CraftWorld) center.getWorld()).getHandle().getChunkProvider().addTicket(TicketType.START, new ChunkCoordIntPair(center.getBlockX() >> 4, center.getBlockZ() >> 4), size, Unit.INSTANCE);
- }
-
- @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/v16_1/NMSCreator16_1.java b/src/main/java/com/volmit/iris/gen/nms/v16_1/NMSCreator16_1.java
deleted file mode 100644
index f2df0b366..000000000
--- a/src/main/java/com/volmit/iris/gen/nms/v16_1/NMSCreator16_1.java
+++ /dev/null
@@ -1,218 +0,0 @@
-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.Location;
-import org.bukkit.World;
-import org.bukkit.WorldCreator;
-import org.bukkit.craftbukkit.v1_16_R1.CraftServer;
-import org.bukkit.craftbukkit.v1_16_R1.CraftWorld;
-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;
-import net.minecraft.server.v1_16_R1.ChunkCoordIntPair;
-import net.minecraft.server.v1_16_R1.TicketType;
-import net.minecraft.server.v1_16_R1.Unit;
-
-public class NMSCreator161
-{
- public static void addStartTicket(Location center, int size)
- {
- ((CraftWorld) center.getWorld()).getHandle().getChunkProvider().addTicket(TicketType.START, new ChunkCoordIntPair(center.getBlockX() >> 4, center.getBlockZ() >> 4), size, Unit.INSTANCE);
- }
-
- @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/v16_2/NMSBinding16_2.java b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSBinding16_2.java
new file mode 100644
index 000000000..7045e6101
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSBinding16_2.java
@@ -0,0 +1,16 @@
+package com.volmit.iris.gen.nms.v16_2;
+
+import com.volmit.iris.gen.atomics.AtomicCache;
+import com.volmit.iris.gen.nms.INMSBinding;
+import com.volmit.iris.gen.nms.INMSCreator;
+
+public class NMSBinding16_2 implements INMSBinding
+{
+ private final AtomicCache creator = new AtomicCache<>();
+
+ @Override
+ public INMSCreator getCreator()
+ {
+ return creator.aquire(() -> new NMSCreator16_2());
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2.java b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2.java
new file mode 100644
index 000000000..bd6cddd15
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2.java
@@ -0,0 +1,981 @@
+package com.volmit.iris.gen.nms.v16_2;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nullable;
+
+import org.bukkit.Material;
+import org.bukkit.block.Biome;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.craftbukkit.v1_16_R2.block.CraftBlock;
+import org.bukkit.craftbukkit.v1_16_R2.block.data.CraftBlockData;
+import org.bukkit.craftbukkit.v1_16_R2.util.CraftMagicNumbers;
+import org.bukkit.generator.ChunkGenerator.BiomeGrid;
+import org.bukkit.generator.ChunkGenerator.ChunkData;
+import org.bukkit.material.MaterialData;
+
+import com.mojang.serialization.Codec;
+import com.volmit.iris.gen.IrisTerrainProvider;
+import com.volmit.iris.gen.provisions.ProvisionBukkit;
+import com.volmit.iris.gen.scaffold.GeneratedChunk;
+import com.volmit.iris.gen.scaffold.Provisioned;
+import com.volmit.iris.util.O;
+import com.volmit.iris.util.V;
+
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import it.unimi.dsi.fastutil.objects.ObjectList;
+import it.unimi.dsi.fastutil.objects.ObjectListIterator;
+import net.minecraft.server.v1_16_R2.BiomeBase;
+import net.minecraft.server.v1_16_R2.BiomeManager;
+import net.minecraft.server.v1_16_R2.BiomeSettingsGeneration;
+import net.minecraft.server.v1_16_R2.BiomeSettingsMobs;
+import net.minecraft.server.v1_16_R2.Block;
+import net.minecraft.server.v1_16_R2.BlockColumn;
+import net.minecraft.server.v1_16_R2.BlockPosition;
+import net.minecraft.server.v1_16_R2.Blocks;
+import net.minecraft.server.v1_16_R2.ChunkCoordIntPair;
+import net.minecraft.server.v1_16_R2.ChunkGenerator;
+import net.minecraft.server.v1_16_R2.ChunkGeneratorAbstract;
+import net.minecraft.server.v1_16_R2.CrashReport;
+import net.minecraft.server.v1_16_R2.CrashReportSystemDetails;
+import net.minecraft.server.v1_16_R2.DefinedStructureManager;
+import net.minecraft.server.v1_16_R2.EnumCreatureType;
+import net.minecraft.server.v1_16_R2.GeneratorAccess;
+import net.minecraft.server.v1_16_R2.GeneratorAccessSeed;
+import net.minecraft.server.v1_16_R2.GeneratorSettingBase;
+import net.minecraft.server.v1_16_R2.HeightMap;
+import net.minecraft.server.v1_16_R2.IBlockAccess;
+import net.minecraft.server.v1_16_R2.IBlockData;
+import net.minecraft.server.v1_16_R2.IChunkAccess;
+import net.minecraft.server.v1_16_R2.IRegistry;
+import net.minecraft.server.v1_16_R2.IRegistryCustom;
+import net.minecraft.server.v1_16_R2.IStructureAccess;
+import net.minecraft.server.v1_16_R2.MathHelper;
+import net.minecraft.server.v1_16_R2.NoiseGenerator;
+import net.minecraft.server.v1_16_R2.NoiseGenerator3;
+import net.minecraft.server.v1_16_R2.NoiseGenerator3Handler;
+import net.minecraft.server.v1_16_R2.NoiseGeneratorOctaves;
+import net.minecraft.server.v1_16_R2.NoiseGeneratorPerlin;
+import net.minecraft.server.v1_16_R2.NoiseSettings;
+import net.minecraft.server.v1_16_R2.PacketDebug;
+import net.minecraft.server.v1_16_R2.ProtoChunk;
+import net.minecraft.server.v1_16_R2.RegionLimitedWorldAccess;
+import net.minecraft.server.v1_16_R2.ReportedException;
+import net.minecraft.server.v1_16_R2.ResourceKey;
+import net.minecraft.server.v1_16_R2.SectionPosition;
+import net.minecraft.server.v1_16_R2.SeededRandom;
+import net.minecraft.server.v1_16_R2.SpawnerCreature;
+import net.minecraft.server.v1_16_R2.StructureBoundingBox;
+import net.minecraft.server.v1_16_R2.StructureFeature;
+import net.minecraft.server.v1_16_R2.StructureFeatures;
+import net.minecraft.server.v1_16_R2.StructureGenerator;
+import net.minecraft.server.v1_16_R2.StructureManager;
+import net.minecraft.server.v1_16_R2.StructurePiece;
+import net.minecraft.server.v1_16_R2.StructureSettingsFeature;
+import net.minecraft.server.v1_16_R2.StructureStart;
+import net.minecraft.server.v1_16_R2.SystemUtils;
+import net.minecraft.server.v1_16_R2.WorldChunkManager;
+import net.minecraft.server.v1_16_R2.WorldChunkManagerTheEnd;
+import net.minecraft.server.v1_16_R2.WorldGenFeatureConfigured;
+import net.minecraft.server.v1_16_R2.WorldGenFeatureDefinedStructureJigsawJunction;
+import net.minecraft.server.v1_16_R2.WorldGenFeatureDefinedStructurePoolTemplate;
+import net.minecraft.server.v1_16_R2.WorldGenFeaturePillagerOutpostPoolPiece;
+import net.minecraft.server.v1_16_R2.WorldGenStage;
+import net.minecraft.server.v1_16_R2.WorldServer;
+
+public class NMSChunkGenerator16_2 extends ChunkGenerator
+{
+ private static final float[] i = SystemUtils.a((new float[13824]), (afloat) ->
+ { // CraftBukkit - decompile error
+ for(int i = 0; i < 24; ++i)
+ {
+ for(int j = 0; j < 24; ++j)
+ {
+ for(int k = 0; k < 24; ++k)
+ {
+ afloat[i * 24 * 24 + j * 24 + k] = (float) b(j - 12, k - 12, i - 12);
+ }
+ }
+ }
+
+ });
+ private static final float[] j = SystemUtils.a((new float[25]), (afloat) ->
+ { // CraftBukkit - decompile error
+ for(int i = -2; i <= 2; ++i)
+ {
+ for(int j = -2; j <= 2; ++j)
+ {
+ float f = 10.0F / MathHelper.c((float) (i * i + j * j) + 0.2F);
+
+ afloat[i + 2 + (j + 2) * 5] = f;
+ }
+ }
+
+ });
+ private static final IBlockData k = Blocks.AIR.getBlockData();
+ private final Provisioned provisioned;
+ private final int maxHeight;
+ private final int m;
+ private final int n;
+ private final int xzSize;
+ private final int p;
+ protected final SeededRandom e;
+ private final NoiseGeneratorOctaves q;
+ private final NoiseGeneratorOctaves r;
+ private final NoiseGeneratorOctaves s;
+ private final NoiseGenerator t;
+ private final NoiseGeneratorOctaves u;
+ private final NoiseGenerator3Handler v;
+ protected final IBlockData f;
+ protected final IBlockData g;
+ private final long w;
+ protected final Supplier h;
+ private final O ws;
+
+ public NMSChunkGenerator16_2(Provisioned p, O ws, WorldChunkManager worldchunkmanager, long i, Supplier supplier)
+ {
+ this(p, ws, worldchunkmanager, worldchunkmanager, i, supplier);
+ }
+
+ private NMSChunkGenerator16_2(Provisioned p, O ws, WorldChunkManager worldchunkmanager, WorldChunkManager worldchunkmanager1, long i, Supplier supplier)
+ {
+ super(worldchunkmanager, worldchunkmanager1, supplier.get().a(), i);
+ this.provisioned = p;
+ this.ws = ws;
+ this.w = i;
+ GeneratorSettingBase generatorsettingbase = supplier.get();
+
+ this.h = supplier;
+ NoiseSettings noisesettings = generatorsettingbase.b();
+
+ this.maxHeight = noisesettings.f() * 4;
+ this.m = noisesettings.e() * 4;
+ this.f = generatorsettingbase.c();
+ this.g = generatorsettingbase.d();
+ this.n = 16 / this.m;
+ this.xzSize = noisesettings.a() / this.maxHeight;
+ this.p = 16 / this.m;
+ this.e = new SeededRandom(i);
+ this.q = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-15, 0));
+ this.r = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-15, 0));
+ this.s = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-7, 0));
+ this.t = (NoiseGenerator) (noisesettings.i() ? new NoiseGenerator3(this.e, IntStream.rangeClosed(-3, 0)) : new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-3, 0)));
+ this.e.a(2620);
+ this.u = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-15, 0));
+ if(noisesettings.k())
+ {
+ SeededRandom seededrandom = new SeededRandom(i);
+
+ seededrandom.a(17292);
+ this.v = new NoiseGenerator3Handler(seededrandom);
+ }
+ else
+ {
+ this.v = null;
+ }
+ }
+
+ public int getSpawnHeight()
+ {
+ return getSeaLevel() + 8;
+ }
+
+ public WorldChunkManager getWorldChunkManager()
+ {
+ return this.c;
+ }
+
+ public int getGenerationDepth()
+ {
+ return 256;
+ }
+
+ public void doCarving(long i, BiomeManager biomemanager, IChunkAccess ichunkaccess, WorldGenStage.Features worldgenstage_features)
+ {
+ if(((IrisTerrainProvider) provisioned.getProvider()).getDimension().isVanillaCaves())
+ {
+ super.doCarving(i, biomemanager, ichunkaccess, worldgenstage_features);
+ }
+ }
+
+ @Override
+ protected Codec extends ChunkGenerator> a()
+ {
+ return ChunkGeneratorAbstract.d;
+ }
+
+ public boolean a(long i, ResourceKey resourcekey)
+ {
+ return this.w == i && this.h.get().a(resourcekey);
+ }
+
+ private double a(int i, int j, int k, double d0, double d1, double d2, double d3)
+ {
+ double d4 = 0.0D;
+ double d5 = 0.0D;
+ double d6 = 0.0D;
+ double d7 = 1.0D;
+
+ for(int l = 0; l < 16; ++l)
+ {
+ double d8 = NoiseGeneratorOctaves.a((double) i * d0 * d7);
+ double d9 = NoiseGeneratorOctaves.a((double) j * d1 * d7);
+ double d10 = NoiseGeneratorOctaves.a((double) k * d0 * d7);
+ double d11 = d1 * d7;
+ NoiseGeneratorPerlin noisegeneratorperlin = this.q.a(l);
+
+ if(noisegeneratorperlin != null)
+ {
+ d4 += noisegeneratorperlin.a(d8, d9, d10, d11, (double) j * d11) / d7;
+ }
+
+ NoiseGeneratorPerlin noisegeneratorperlin1 = this.r.a(l);
+
+ if(noisegeneratorperlin1 != null)
+ {
+ d5 += noisegeneratorperlin1.a(d8, d9, d10, d11, (double) j * d11) / d7;
+ }
+
+ if(l < 8)
+ {
+ NoiseGeneratorPerlin noisegeneratorperlin2 = this.s.a(l);
+
+ if(noisegeneratorperlin2 != null)
+ {
+ d6 += noisegeneratorperlin2.a(NoiseGeneratorOctaves.a((double) i * d2 * d7), NoiseGeneratorOctaves.a((double) j * d3 * d7), NoiseGeneratorOctaves.a((double) k * d2 * d7), d3 * d7, (double) j * d3 * d7) / d7;
+ }
+ }
+
+ d7 /= 2.0D;
+ }
+
+ return MathHelper.b(d4 / 512.0D, d5 / 512.0D, (d6 / 10.0D + 1.0D) / 2.0D);
+ }
+
+ private double[] getFilledNoiseArray(int x, int z)
+ {
+ double[] noiseArray = new double[this.xzSize + 1];
+
+ this.fillNoiseArray(noiseArray, x, z);
+ return noiseArray;
+ }
+
+ private void fillNoiseArray(double[] noiseArray, int x, int z)
+ {
+ NoiseSettings noisesettings = this.h.get().b();
+ double d0;
+ double d1;
+ double d2;
+ double d3;
+
+ if(this.v != null)
+ {
+ d0 = (double) (WorldChunkManagerTheEnd.a(this.v, x, z) - 8.0F);
+ if(d0 > 0.0D)
+ {
+ d1 = 0.25D;
+ }
+ else
+ {
+ d1 = 1.0D;
+ }
+ }
+ else
+ {
+ float f = 0.0F;
+ float f1 = 0.0F;
+ float f2 = 0.0F;
+ int k = this.getSeaLevel();
+ float f3 = this.b.getBiome(x, k, z).h();
+
+ for(int l = -2; l <= 2; ++l)
+ {
+ for(int i1 = -2; i1 <= 2; ++i1)
+ {
+ BiomeBase biomebase = this.b.getBiome(x + l, k, z + i1);
+ float f4 = biomebase.h();
+ float f5 = biomebase.j();
+ float f6;
+ float f7;
+
+ if(noisesettings.l() && f4 > 0.0F)
+ {
+ f6 = 1.0F + f4 * 2.0F;
+ f7 = 1.0F + f5 * 4.0F;
+ }
+ else
+ {
+ f6 = f4;
+ f7 = f5;
+ }
+ // CraftBukkit start - fix MC-54738
+ if(f6 < -1.8F)
+ {
+ f6 = -1.8F;
+ }
+ // CraftBukkit end
+
+ float f8 = f4 > f3 ? 0.5F : 1.0F;
+ float f9 = f8 * NMSChunkGenerator16_2.j[l + 2 + (i1 + 2) * 5] / (f6 + 2.0F);
+
+ f += f7 * f9;
+ f1 += f6 * f9;
+ f2 += f9;
+ }
+ }
+
+ float f10 = f1 / f2;
+ float f11 = f / f2;
+
+ d2 = (double) (f10 * 0.5F - 0.125F);
+ d3 = (double) (f11 * 0.9F + 0.1F);
+ d0 = d2 * 0.265625D;
+ d1 = 96.0D / d3;
+ }
+
+ double d4 = 684.412D * noisesettings.b().a();
+ double d5 = 684.412D * noisesettings.b().b();
+ double d6 = d4 / noisesettings.b().c();
+ double d7 = d5 / noisesettings.b().d();
+
+ d2 = (double) noisesettings.c().a();
+ d3 = (double) noisesettings.c().b();
+ double d8 = (double) noisesettings.c().c();
+ double d9 = (double) noisesettings.d().a();
+ double d10 = (double) noisesettings.d().b();
+ double d11 = (double) noisesettings.d().c();
+ double d12 = noisesettings.j() ? this.c(x, z) : 0.0D;
+ double d13 = noisesettings.g();
+ double d14 = noisesettings.h();
+
+ for(int j1 = 0; j1 <= this.xzSize; ++j1)
+ {
+ double d15 = this.a(x, j1, z, d4, d5, d6, d7);
+ double d16 = 1.0D - (double) j1 * 2.0D / (double) this.xzSize + d12;
+ double d17 = d16 * d13 + d14;
+ double d18 = (d17 + d0) * d1;
+
+ if(d18 > 0.0D)
+ {
+ d15 += d18 * 4.0D;
+ }
+ else
+ {
+ d15 += d18;
+ }
+
+ double d19;
+
+ if(d3 > 0.0D)
+ {
+ d19 = ((double) (this.xzSize - j1) - d8) / d3;
+ d15 = MathHelper.b(d2, d15, d19);
+ }
+
+ if(d10 > 0.0D)
+ {
+ d19 = ((double) j1 - d11) / d10;
+ d15 = MathHelper.b(d9, d15, d19);
+ }
+
+ noiseArray[j1] = d15;
+ }
+
+ }
+
+ private double c(int x, int z)
+ {
+ double noiseOrSomething = this.u.a((double) (x * 200), 10.0D, (double) (z * 200), 1.0D, 0.0D, true);
+ double noiseOrSomething2;
+
+ if(noiseOrSomething < 0.0D)
+ {
+ noiseOrSomething2 = -noiseOrSomething * 0.3D;
+ }
+ else
+ {
+ noiseOrSomething2 = noiseOrSomething;
+ }
+
+ double result = noiseOrSomething2 * 24.575625D - 2.0D;
+
+ return result < 0.0D ? result * 0.009486607142857142D : Math.min(result, 1.0D) * 0.006640625D;
+ }
+
+ @Override
+ public int getBaseHeight(int i, int j, HeightMap.Type heightmap_type)
+ {
+ return this.a(i, j, (IBlockData[]) null, heightmap_type.e());
+ }
+
+ @Override
+ public IBlockAccess a(int x, int z)
+ {
+ IBlockData[] aiblockdata = new IBlockData[this.xzSize * this.maxHeight];
+
+ this.a(x, z, aiblockdata, (Predicate) null);
+ return new BlockColumn(aiblockdata);
+ }
+
+ private int a(int i, int j, @Nullable IBlockData[] aiblockdata, @Nullable Predicate predicate)
+ {
+ int k = Math.floorDiv(i, this.m);
+ int l = Math.floorDiv(j, this.m);
+ int i1 = Math.floorMod(i, this.m);
+ int j1 = Math.floorMod(j, this.m);
+ double d0 = (double) i1 / (double) this.m;
+ double d1 = (double) j1 / (double) this.m;
+ double[][] noiseArrayNeighbors = new double[][] {this.getFilledNoiseArray(k, l), this.getFilledNoiseArray(k, l + 1), this.getFilledNoiseArray(k + 1, l), this.getFilledNoiseArray(k + 1, l + 1)};
+
+ for(int k1 = this.xzSize - 1; k1 >= 0; --k1)
+ {
+ double d2 = noiseArrayNeighbors[0][k1];
+ double d3 = noiseArrayNeighbors[1][k1];
+ double d4 = noiseArrayNeighbors[2][k1];
+ double d5 = noiseArrayNeighbors[3][k1];
+ double d6 = noiseArrayNeighbors[0][k1 + 1];
+ double d7 = noiseArrayNeighbors[1][k1 + 1];
+ double d8 = noiseArrayNeighbors[2][k1 + 1];
+ double d9 = noiseArrayNeighbors[3][k1 + 1];
+
+ for(int l1 = this.maxHeight - 1; l1 >= 0; --l1)
+ {
+ double d10 = (double) l1 / (double) this.maxHeight;
+ double d11 = MathHelper.a(d10, d0, d1, d2, d6, d4, d8, d3, d7, d5, d9);
+ int i2 = k1 * this.maxHeight + l1;
+ IBlockData iblockdata = this.a(d11, i2);
+
+ if(aiblockdata != null)
+ {
+ aiblockdata[i2] = iblockdata;
+ }
+
+ if(predicate != null && predicate.test(iblockdata))
+ {
+ return i2 + 1;
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ protected IBlockData a(double d0, int i)
+ {
+ IBlockData iblockdata;
+
+ if(d0 > 0.0D)
+ {
+ iblockdata = this.f;
+ }
+ else if(i < this.getSeaLevel())
+ {
+ iblockdata = this.g;
+ }
+ else
+ {
+ iblockdata = NMSChunkGenerator16_2.k;
+ }
+
+ return iblockdata;
+ }
+
+ @Override
+ public void buildBase(RegionLimitedWorldAccess regionlimitedworldaccess, IChunkAccess ichunkaccess)
+ {
+
+ }
+
+ @Override
+ public void buildNoise(GeneratorAccess generatoraccess, StructureManager structuremanager, IChunkAccess ichunkaccess)
+ {
+ ObjectList objectlist = new ObjectArrayList(10);
+ ObjectList objectlist1 = new ObjectArrayList(32);
+ ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
+ int i = chunkcoordintpair.x;
+ int j = chunkcoordintpair.z;
+
+ if(((IrisTerrainProvider) provisioned.getProvider()).shouldGenerateVanillaStructures())
+ {
+ int k = i << 4;
+ int l = j << 4;
+ Iterator> iterator = StructureGenerator.t.iterator();
+
+ while(iterator.hasNext())
+ {
+ StructureGenerator> structuregenerator = (StructureGenerator>) iterator.next();
+
+ structuremanager.a(SectionPosition.a(chunkcoordintpair, 0), structuregenerator).forEach((structurestart) ->
+ {
+ Iterator> iterator1 = structurestart.d().iterator();
+
+ while(iterator1.hasNext())
+ {
+ StructurePiece structurepiece = (StructurePiece) iterator1.next();
+
+ if(structurepiece.a(chunkcoordintpair, 12))
+ {
+ if(structurepiece instanceof WorldGenFeaturePillagerOutpostPoolPiece)
+ {
+ WorldGenFeaturePillagerOutpostPoolPiece worldgenfeaturepillageroutpostpoolpiece = (WorldGenFeaturePillagerOutpostPoolPiece) structurepiece;
+ WorldGenFeatureDefinedStructurePoolTemplate.Matching worldgenfeaturedefinedstructurepooltemplate_matching = worldgenfeaturepillageroutpostpoolpiece.b().e();
+
+ if(worldgenfeaturedefinedstructurepooltemplate_matching == WorldGenFeatureDefinedStructurePoolTemplate.Matching.RIGID)
+ {
+ objectlist.add(worldgenfeaturepillageroutpostpoolpiece);
+ }
+
+ Iterator> iterator2 = worldgenfeaturepillageroutpostpoolpiece.e().iterator();
+
+ while(iterator2.hasNext())
+ {
+ WorldGenFeatureDefinedStructureJigsawJunction worldgenfeaturedefinedstructurejigsawjunction = (WorldGenFeatureDefinedStructureJigsawJunction) iterator2.next();
+ int i1 = worldgenfeaturedefinedstructurejigsawjunction.a();
+ int j1 = worldgenfeaturedefinedstructurejigsawjunction.c();
+
+ if(i1 > k - 12 && j1 > l - 12 && i1 < k + 15 + 12 && j1 < l + 15 + 12)
+ {
+ objectlist1.add(worldgenfeaturedefinedstructurejigsawjunction);
+ }
+ }
+ }
+ else
+ {
+ objectlist.add(structurepiece);
+ }
+ }
+ }
+ });
+ }
+ }
+
+ ProtoChunk protochunk = (ProtoChunk) ichunkaccess;
+ HeightMap heightmap = protochunk.a(HeightMap.Type.OCEAN_FLOOR_WG);
+ HeightMap heightmap1 = protochunk.a(HeightMap.Type.WORLD_SURFACE_WG);
+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
+ ObjectListIterator objectlistiterator = objectlist.iterator();
+ ObjectListIterator objectlistiterator1 = objectlist1.iterator();
+ GeneratedChunk gc = ((ProvisionBukkit) provisioned).generateNMSChunkData(ws.get().getWorld(), new Random(i + j), i, j, new ChunkData()
+ {
+ public int getMaxHeight()
+ {
+ return 256;
+ }
+
+ public void setBlock(int x, int y, int z, Material material)
+ {
+ this.setBlock(x, y, z, material.createBlockData());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void setBlock(int x, int y, int z, MaterialData material)
+ {
+ this.setBlock(x, y, z, CraftMagicNumbers.getBlock((MaterialData) material));
+ }
+
+ public void setBlock(int x, int y, int z, BlockData blockData)
+ {
+ this.setBlock(x, y, z, ((CraftBlockData) blockData).getState());
+ }
+
+ public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, Material material)
+ {
+ this.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material.createBlockData());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, MaterialData material)
+ {
+ this.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, CraftMagicNumbers.getBlock((MaterialData) material));
+ }
+
+ public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, BlockData blockData)
+ {
+ this.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, ((CraftBlockData) blockData).getState());
+ }
+
+ public Material getType(int x, int y, int z)
+ {
+ return CraftMagicNumbers.getMaterial((Block) this.getTypeId(x, y, z).getBlock());
+ }
+
+ @SuppressWarnings("deprecation")
+ public MaterialData getTypeAndData(int x, int y, int z)
+ {
+ return CraftMagicNumbers.getMaterial((IBlockData) this.getTypeId(x, y, z));
+ }
+
+ public BlockData getBlockData(int x, int y, int z)
+ {
+ return CraftBlockData.fromData((IBlockData) this.getTypeId(x, y, z));
+ }
+
+ public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, IBlockData type)
+ {
+ if(xMin > 15 || yMin >= getMaxHeight() || zMin > 15)
+ {
+ return;
+ }
+ if(xMin < 0)
+ {
+ xMin = 0;
+ }
+ if(yMin < 0)
+ {
+ yMin = 0;
+ }
+ if(zMin < 0)
+ {
+ zMin = 0;
+ }
+ if(xMax > 16)
+ {
+ xMax = 16;
+ }
+ if(yMax > getMaxHeight())
+ {
+ yMax = getMaxHeight();
+ }
+ if(zMax > 16)
+ {
+ zMax = 16;
+ }
+ if(xMin >= xMax || yMin >= yMax || zMin >= zMax)
+ {
+ return;
+ }
+ int y = yMin;
+ while(y < yMax)
+ {
+ int x = xMin;
+ while(x < xMax)
+ {
+ int z = zMin;
+ while(z < zMax)
+ {
+ protochunk.setType(new BlockPosition(x, y, z), type, false);
+ ++z;
+ }
+ ++x;
+ }
+ ++y;
+ }
+ }
+
+ public IBlockData getTypeId(int x, int y, int z)
+ {
+ if(x != (x & 15) || y < 0 || y >= getMaxHeight() || z != (z & 15))
+ {
+ return Blocks.AIR.getBlockData();
+ }
+ return protochunk.getType(new BlockPosition(x, y, z));
+ }
+
+ public byte getData(int x, int y, int z)
+ {
+ return CraftMagicNumbers.toLegacyData((IBlockData) this.getTypeId(x, y, z));
+ }
+
+ private void setBlock(int x, int y, int z, IBlockData type)
+ {
+ if(x != (x & 15) || y < 0 || y >= getMaxHeight() || z != (z & 15))
+ {
+ return;
+ }
+
+ protochunk.setType(new BlockPosition(x, y, z), type, false);
+
+ if(type.getBlock().isTileEntity())
+ {
+ // if (this.tiles == null) {
+ // this.tiles = new HashSet();
+ // }
+ // this.tiles.add(new BlockPosition(x, y, z));
+ }
+ }
+ }, new BiomeGrid()
+ {
+ @Override
+ public void setBiome(int x, int y, int z, Biome bio)
+ {
+ protochunk.getBiomeIndex().setBiome(x, y, z, CraftBlock.biomeToBiomeBase(ws.get().r().b(IRegistry.ay), bio));
+ }
+
+ @Override
+ public void setBiome(int x, int z, Biome bio)
+ {
+ protochunk.getBiomeIndex().setBiome(x, 0, z, CraftBlock.biomeToBiomeBase(ws.get().r().b(IRegistry.ay), bio));
+ }
+
+ @Override
+ public Biome getBiome(int x, int y, int z)
+ {
+ return CraftBlock.biomeBaseToBiome(ws.get().r().b(IRegistry.ay), protochunk.getBiomeIndex().getBiome(x, y, z));
+ }
+
+ @Override
+ public Biome getBiome(int x, int z)
+ {
+ return CraftBlock.biomeBaseToBiome(ws.get().r().b(IRegistry.ay), protochunk.getBiomeIndex().getBiome(x, 0, z));
+ }
+ });
+
+ for(int xx = 0; xx < 16; xx++)
+ {
+ for(int zz = 0; zz < 16; zz++)
+ {
+ int y = gc.getHeight().getHeight(xx, zz);
+ if(y < getSeaLevel())
+ {
+ heightmap.a(xx, y, zz, Blocks.STONE.getBlockData());
+ }
+ heightmap1.a(xx, Math.max(y, getSeaLevel()), zz, Blocks.STONE.getBlockData());
+ }
+ }
+ }
+
+ public void addDecorations(RegionLimitedWorldAccess regionlimitedworldaccess, StructureManager structuremanager)
+ {
+ if(((IrisTerrainProvider) provisioned.getProvider()).shouldGenerateVanillaStructures())
+ {
+ int i = regionlimitedworldaccess.a();
+ int j = regionlimitedworldaccess.b();
+ int k = i * 16;
+ int l = j * 16;
+ BlockPosition blockposition = new BlockPosition(k, 0, l);
+ BiomeBase biomebase = this.b.getBiome((i << 2) + 2, 2, (j << 2) + 2);
+ SeededRandom seededrandom = new SeededRandom();
+ long i1 = seededrandom.a(regionlimitedworldaccess.getSeed(), k, l);
+ try
+ {
+ a(biomebase, structuremanager, this, regionlimitedworldaccess, i1, seededrandom, blockposition);
+ }
+ catch(Exception exception)
+ {
+
+ }
+ }
+ }
+
+ public void a(BiomeBase bbase, StructureManager var0, ChunkGenerator var1, RegionLimitedWorldAccess var2, long var3, SeededRandom var5, BlockPosition var6)
+ {
+ if(!((IrisTerrainProvider) provisioned.getProvider()).shouldGenerateVanillaStructures())
+ {
+ return;
+ }
+
+ int stages = WorldGenStage.Decoration.values().length;
+ for(int stage = 0; stage < stages; ++stage)
+ {
+ WorldGenStage.Decoration st = WorldGenStage.Decoration.values()[stage];
+
+ if(st.equals(WorldGenStage.Decoration.LAKES))
+ {
+ continue;
+ }
+
+ if(st.equals(WorldGenStage.Decoration.LOCAL_MODIFICATIONS))
+ {
+ continue;
+ }
+
+ if(st.equals(WorldGenStage.Decoration.RAW_GENERATION))
+ {
+ continue;
+ }
+
+ if(st.equals(WorldGenStage.Decoration.TOP_LAYER_MODIFICATION))
+ {
+ continue;
+ }
+
+ if(st.equals(WorldGenStage.Decoration.UNDERGROUND_DECORATION))
+ {
+ continue;
+ }
+
+ if(st.equals(WorldGenStage.Decoration.UNDERGROUND_ORES))
+ {
+ continue;
+ }
+
+ if(st.equals(WorldGenStage.Decoration.VEGETAL_DECORATION))
+ {
+ continue;
+ }
+
+ StructureGenerator> var13;
+ int var10 = 0;
+ if(var0.a())
+ {
+ @SuppressWarnings("unchecked")
+ List> structureGenerators = ((Map>>) new V(bbase).get("g")).getOrDefault(stage, Collections.emptyList());
+ Iterator> iterator = structureGenerators.iterator();
+ while(iterator.hasNext())
+ {
+ var13 = (StructureGenerator>) iterator.next();
+ var5.b(var3, var10, stage);
+ int var14 = var6.getX() >> 4;
+ int var15 = var6.getZ() >> 4;
+ int var16 = var14 << 4;
+ int var17 = var15 << 4;
+
+ try
+ {
+ var0.a(SectionPosition.a((BlockPosition) var6), var13).forEach(var8 -> var8.a((GeneratorAccessSeed) var2, var0, var1, (Random) var5, new StructureBoundingBox(var16, var17, var16 + 15, var17 + 15), new ChunkCoordIntPair(var14, var15)));
+ }
+ catch(Exception var18)
+ {
+
+ }
+
+ ++var10;
+ }
+ }
+ }
+ }
+
+ private static double b(int i, int j, int k)
+ {
+ double d0 = (double) (i * i + k * k);
+ double d1 = (double) j + 0.5D;
+ double d2 = d1 * d1;
+ double d3 = Math.pow(2.718281828459045D, -(d2 / 16.0D + d0 / 16.0D));
+ double d4 = -d1 * MathHelper.i(d2 / 2.0D + d0 / 2.0D) / 2.0D;
+
+ return d4 * d3;
+ }
+
+ @Override
+ public int getSeaLevel()
+ {
+ return ((IrisTerrainProvider) provisioned.getProvider()).getFluidHeight();
+ }
+
+ @Override
+ public List getMobsFor(BiomeBase biomebase, StructureManager structuremanager, EnumCreatureType enumcreaturetype, BlockPosition blockposition)
+ {
+ if(structuremanager.a(blockposition, true, StructureGenerator.SWAMP_HUT).e())
+ {
+ if(enumcreaturetype == EnumCreatureType.MONSTER)
+ {
+ return StructureGenerator.SWAMP_HUT.c();
+ }
+
+ if(enumcreaturetype == EnumCreatureType.CREATURE)
+ {
+ return StructureGenerator.SWAMP_HUT.j();
+ }
+ }
+
+ if(enumcreaturetype == EnumCreatureType.MONSTER)
+ {
+ if(structuremanager.a(blockposition, false, StructureGenerator.PILLAGER_OUTPOST).e())
+ {
+ return StructureGenerator.PILLAGER_OUTPOST.c();
+ }
+
+ if(structuremanager.a(blockposition, false, StructureGenerator.MONUMENT).e())
+ {
+ return StructureGenerator.MONUMENT.c();
+ }
+
+ if(structuremanager.a(blockposition, true, StructureGenerator.FORTRESS).e())
+ {
+ return StructureGenerator.FORTRESS.c();
+ }
+ }
+
+ return super.getMobsFor(biomebase, structuremanager, enumcreaturetype, blockposition);
+ }
+
+ @Override
+ public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess)
+ {
+ int i = regionlimitedworldaccess.a();
+ int j = regionlimitedworldaccess.b();
+ BiomeBase biomebase = regionlimitedworldaccess.getBiome((new ChunkCoordIntPair(i, j)).l());
+ SeededRandom seededrandom = new SeededRandom();
+ seededrandom.a(regionlimitedworldaccess.getSeed(), i << 4, j << 4);
+ SpawnerCreature.a(regionlimitedworldaccess, biomebase, i, j, seededrandom);
+ }
+
+ public void createStructures(IRegistryCustom iregistrycustom, StructureManager structuremanager, IChunkAccess ichunkaccess, DefinedStructureManager definedstructuremanager, long i)
+ {
+ ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
+ BiomeBase biomebase = this.b.getBiome((chunkcoordintpair.x << 2) + 2, 0, (chunkcoordintpair.z << 2) + 2);
+ this.a(StructureFeatures.k, iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i, chunkcoordintpair, biomebase);
+ for(Supplier supplier : biomebase.e().a())
+ {
+ StructureFeature structurefeature = (StructureFeature) supplier.get();
+ if(StructureFeature.c == StructureGenerator.STRONGHOLD)
+ {
+ StructureFeature structureFeature = structurefeature;
+ synchronized(structureFeature)
+ {
+ this.a(structurefeature, iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i, chunkcoordintpair, biomebase);
+ continue;
+ }
+ }
+ this.a(structurefeature, iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i, chunkcoordintpair, biomebase);
+ }
+ }
+
+ private void a(StructureFeature, ?> structurefeature, IRegistryCustom iregistrycustom, StructureManager structuremanager, IChunkAccess ichunkaccess, DefinedStructureManager definedstructuremanager, long i, ChunkCoordIntPair chunkcoordintpair, BiomeBase biomebase)
+ {
+ StructureStart structurestart = structuremanager.a(SectionPosition.a((ChunkCoordIntPair) ichunkaccess.getPos(), (int) 0), structurefeature.d, (IStructureAccess) ichunkaccess);
+ int j = structurestart != null ? structurestart.j() : 0;
+ StructureSettingsFeature structuresettingsfeature = getSettings().a(structurefeature.d);
+ if(structuresettingsfeature != null)
+ {
+ StructureStart structurestart1 = structurefeature.a(iregistrycustom, this, this.b, definedstructuremanager, i, chunkcoordintpair, biomebase, j, structuresettingsfeature);
+ structuremanager.a(SectionPosition.a((ChunkCoordIntPair) ichunkaccess.getPos(), (int) 0), structurefeature.d, structurestart1, (IStructureAccess) ichunkaccess);
+ }
+ }
+
+ public void storeStructures(GeneratorAccessSeed generatoraccessseed, StructureManager structuremanager, IChunkAccess ichunkaccess)
+ {
+ boolean flag = true;
+ int i = ichunkaccess.getPos().x;
+ int j = ichunkaccess.getPos().z;
+ int k = i << 4;
+ int l = j << 4;
+ SectionPosition sectionposition = SectionPosition.a((ChunkCoordIntPair) ichunkaccess.getPos(), (int) 0);
+ int i1 = i - 8;
+ while(i1 <= i + 8)
+ {
+ int j1 = j - 8;
+ while(j1 <= j + 8)
+ {
+ long k1 = ChunkCoordIntPair.pair((int) i1, (int) j1);
+ for(StructureStart structurestart : generatoraccessseed.getChunkAt(i1, j1).h().values())
+ {
+ try
+ {
+ if(structurestart == StructureStart.a || !structurestart.c().a(k, l, k + 15, l + 15))
+ continue;
+ structuremanager.a(sectionposition, structurestart.l(), k1, (IStructureAccess) ichunkaccess);
+ PacketDebug.a((GeneratorAccessSeed) generatoraccessseed, (StructureStart) structurestart);
+ }
+ catch(Exception exception)
+ {
+ CrashReport crashreport = CrashReport.a((Throwable) exception, (String) "Generating structure reference");
+ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Structure");
+ crashreportsystemdetails.a("Name", () -> structurestart.l().i());
+ crashreportsystemdetails.a("Class", () -> structurestart.l().getClass().getCanonicalName());
+ throw new ReportedException(crashreport);
+ }
+ }
+ ++j1;
+ }
+ ++i1;
+ }
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_BACKUP.java b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_BACKUP.java
new file mode 100644
index 000000000..72de474dd
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_BACKUP.java
@@ -0,0 +1,793 @@
+package com.volmit.iris.gen.nms.v16_2;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nullable;
+
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import it.unimi.dsi.fastutil.objects.ObjectList;
+import it.unimi.dsi.fastutil.objects.ObjectListIterator;
+import net.minecraft.server.v1_16_R2.BiomeBase;
+import net.minecraft.server.v1_16_R2.BiomeSettingsMobs;
+import net.minecraft.server.v1_16_R2.BlockColumn;
+import net.minecraft.server.v1_16_R2.BlockPosition;
+import net.minecraft.server.v1_16_R2.Blocks;
+import net.minecraft.server.v1_16_R2.ChunkCoordIntPair;
+import net.minecraft.server.v1_16_R2.ChunkGenerator;
+import net.minecraft.server.v1_16_R2.ChunkGeneratorAbstract;
+import net.minecraft.server.v1_16_R2.ChunkSection;
+import net.minecraft.server.v1_16_R2.EnumCreatureType;
+import net.minecraft.server.v1_16_R2.GeneratorAccess;
+import net.minecraft.server.v1_16_R2.GeneratorSettingBase;
+import net.minecraft.server.v1_16_R2.HeightMap;
+import net.minecraft.server.v1_16_R2.IBlockAccess;
+import net.minecraft.server.v1_16_R2.IBlockData;
+import net.minecraft.server.v1_16_R2.IChunkAccess;
+import net.minecraft.server.v1_16_R2.MathHelper;
+import net.minecraft.server.v1_16_R2.NoiseGenerator;
+import net.minecraft.server.v1_16_R2.NoiseGenerator3;
+import net.minecraft.server.v1_16_R2.NoiseGenerator3Handler;
+import net.minecraft.server.v1_16_R2.NoiseGeneratorOctaves;
+import net.minecraft.server.v1_16_R2.NoiseGeneratorPerlin;
+import net.minecraft.server.v1_16_R2.NoiseSettings;
+import net.minecraft.server.v1_16_R2.ProtoChunk;
+import net.minecraft.server.v1_16_R2.RegionLimitedWorldAccess;
+import net.minecraft.server.v1_16_R2.ResourceKey;
+import net.minecraft.server.v1_16_R2.SectionPosition;
+import net.minecraft.server.v1_16_R2.SeededRandom;
+import net.minecraft.server.v1_16_R2.SpawnerCreature;
+import net.minecraft.server.v1_16_R2.StructureBoundingBox;
+import net.minecraft.server.v1_16_R2.StructureGenerator;
+import net.minecraft.server.v1_16_R2.StructureManager;
+import net.minecraft.server.v1_16_R2.StructurePiece;
+import net.minecraft.server.v1_16_R2.SystemUtils;
+import net.minecraft.server.v1_16_R2.WorldChunkManager;
+import net.minecraft.server.v1_16_R2.WorldChunkManagerTheEnd;
+import net.minecraft.server.v1_16_R2.WorldGenFeatureDefinedStructureJigsawJunction;
+import net.minecraft.server.v1_16_R2.WorldGenFeatureDefinedStructurePoolTemplate;
+import net.minecraft.server.v1_16_R2.WorldGenFeaturePillagerOutpostPoolPiece;
+
+public class NMSChunkGenerator16_2_BACKUP extends ChunkGenerator
+{
+ //@builder
+ public static final Codec d = RecordCodecBuilder.create((instance) -> {
+ return instance.group(WorldChunkManager.a.fieldOf("biome_source").forGetter((chunkgeneratorabstract) -> {
+ return chunkgeneratorabstract.b;
+ }), Codec.LONG.fieldOf("seed").stable().forGetter((chunkgeneratorabstract) -> {
+ return chunkgeneratorabstract.w;
+ }), GeneratorSettingBase.b.fieldOf("settings").forGetter((chunkgeneratorabstract) -> {
+ return chunkgeneratorabstract.h;
+ })).apply(instance, instance.stable(NMSChunkGenerator16_2_BACKUP::new));
+ });
+ //@done
+
+ private static final float[] i = SystemUtils.a((new float[13824]), (afloat) ->
+ { // CraftBukkit - decompile error
+ for(int i = 0; i < 24; ++i)
+ {
+ for(int j = 0; j < 24; ++j)
+ {
+ for(int k = 0; k < 24; ++k)
+ {
+ afloat[i * 24 * 24 + j * 24 + k] = (float) b(j - 12, k - 12, i - 12);
+ }
+ }
+ }
+
+ });
+ private static final float[] j = SystemUtils.a((new float[25]), (afloat) ->
+ { // CraftBukkit - decompile error
+ for(int i = -2; i <= 2; ++i)
+ {
+ for(int j = -2; j <= 2; ++j)
+ {
+ float f = 10.0F / MathHelper.c((float) (i * i + j * j) + 0.2F);
+
+ afloat[i + 2 + (j + 2) * 5] = f;
+ }
+ }
+
+ });
+ private static final IBlockData k = Blocks.AIR.getBlockData();
+ private final int l;
+ private final int m;
+ private final int n;
+ private final int o;
+ private final int p;
+ protected final SeededRandom e;
+ private final NoiseGeneratorOctaves q;
+ private final NoiseGeneratorOctaves r;
+ private final NoiseGeneratorOctaves s;
+ private final NoiseGenerator t;
+ private final NoiseGeneratorOctaves u;
+ private final NoiseGenerator3Handler v;
+ protected final IBlockData f;
+ protected final IBlockData g;
+ private final long w;
+ protected final Supplier h;
+ private final int x;
+
+ public NMSChunkGenerator16_2_BACKUP(WorldChunkManager worldchunkmanager, long i, Supplier supplier)
+ {
+ this(worldchunkmanager, worldchunkmanager, i, supplier);
+ }
+
+ private NMSChunkGenerator16_2_BACKUP(WorldChunkManager worldchunkmanager, WorldChunkManager worldchunkmanager1, long i, Supplier supplier)
+ {
+ super(worldchunkmanager, worldchunkmanager1, supplier.get().a(), i);
+ this.w = i;
+ GeneratorSettingBase generatorsettingbase = supplier.get();
+
+ this.h = supplier;
+ NoiseSettings noisesettings = generatorsettingbase.b();
+
+ this.x = noisesettings.a();
+ this.l = noisesettings.f() * 4;
+ this.m = noisesettings.e() * 4;
+ this.f = generatorsettingbase.c();
+ this.g = generatorsettingbase.d();
+ this.n = 16 / this.m;
+ this.o = noisesettings.a() / this.l;
+ this.p = 16 / this.m;
+ this.e = new SeededRandom(i);
+ this.q = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-15, 0));
+ this.r = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-15, 0));
+ this.s = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-7, 0));
+ this.t = (NoiseGenerator) (noisesettings.i() ? new NoiseGenerator3(this.e, IntStream.rangeClosed(-3, 0)) : new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-3, 0)));
+ this.e.a(2620);
+ this.u = new NoiseGeneratorOctaves(this.e, IntStream.rangeClosed(-15, 0));
+ if(noisesettings.k())
+ {
+ SeededRandom seededrandom = new SeededRandom(i);
+
+ seededrandom.a(17292);
+ this.v = new NoiseGenerator3Handler(seededrandom);
+ }
+ else
+ {
+ this.v = null;
+ }
+
+ }
+
+ @Override
+ protected Codec extends ChunkGenerator> a()
+ {
+ return ChunkGeneratorAbstract.d;
+ }
+
+ public boolean a(long i, ResourceKey resourcekey)
+ {
+ return this.w == i && this.h.get().a(resourcekey);
+ }
+
+ private double a(int i, int j, int k, double d0, double d1, double d2, double d3)
+ {
+ double d4 = 0.0D;
+ double d5 = 0.0D;
+ double d6 = 0.0D;
+ double d7 = 1.0D;
+
+ for(int l = 0; l < 16; ++l)
+ {
+ double d8 = NoiseGeneratorOctaves.a((double) i * d0 * d7);
+ double d9 = NoiseGeneratorOctaves.a((double) j * d1 * d7);
+ double d10 = NoiseGeneratorOctaves.a((double) k * d0 * d7);
+ double d11 = d1 * d7;
+ NoiseGeneratorPerlin noisegeneratorperlin = this.q.a(l);
+
+ if(noisegeneratorperlin != null)
+ {
+ d4 += noisegeneratorperlin.a(d8, d9, d10, d11, (double) j * d11) / d7;
+ }
+
+ NoiseGeneratorPerlin noisegeneratorperlin1 = this.r.a(l);
+
+ if(noisegeneratorperlin1 != null)
+ {
+ d5 += noisegeneratorperlin1.a(d8, d9, d10, d11, (double) j * d11) / d7;
+ }
+
+ if(l < 8)
+ {
+ NoiseGeneratorPerlin noisegeneratorperlin2 = this.s.a(l);
+
+ if(noisegeneratorperlin2 != null)
+ {
+ d6 += noisegeneratorperlin2.a(NoiseGeneratorOctaves.a((double) i * d2 * d7), NoiseGeneratorOctaves.a((double) j * d3 * d7), NoiseGeneratorOctaves.a((double) k * d2 * d7), d3 * d7, (double) j * d3 * d7) / d7;
+ }
+ }
+
+ d7 /= 2.0D;
+ }
+
+ return MathHelper.b(d4 / 512.0D, d5 / 512.0D, (d6 / 10.0D + 1.0D) / 2.0D);
+ }
+
+ private double[] b(int i, int j)
+ {
+ double[] adouble = new double[this.o + 1];
+
+ this.a(adouble, i, j);
+ return adouble;
+ }
+
+ private void a(double[] adouble, int i, int j)
+ {
+ NoiseSettings noisesettings = this.h.get().b();
+ double d0;
+ double d1;
+ double d2;
+ double d3;
+
+ if(this.v != null)
+ {
+ d0 = (double) (WorldChunkManagerTheEnd.a(this.v, i, j) - 8.0F);
+ if(d0 > 0.0D)
+ {
+ d1 = 0.25D;
+ }
+ else
+ {
+ d1 = 1.0D;
+ }
+ }
+ else
+ {
+ float f = 0.0F;
+ float f1 = 0.0F;
+ float f2 = 0.0F;
+ int k = this.getSeaLevel();
+ float f3 = this.b.getBiome(i, k, j).h();
+
+ for(int l = -2; l <= 2; ++l)
+ {
+ for(int i1 = -2; i1 <= 2; ++i1)
+ {
+ BiomeBase biomebase = this.b.getBiome(i + l, k, j + i1);
+ float f4 = biomebase.h();
+ float f5 = biomebase.j();
+ float f6;
+ float f7;
+
+ if(noisesettings.l() && f4 > 0.0F)
+ {
+ f6 = 1.0F + f4 * 2.0F;
+ f7 = 1.0F + f5 * 4.0F;
+ }
+ else
+ {
+ f6 = f4;
+ f7 = f5;
+ }
+ // CraftBukkit start - fix MC-54738
+ if(f6 < -1.8F)
+ {
+ f6 = -1.8F;
+ }
+ // CraftBukkit end
+
+ float f8 = f4 > f3 ? 0.5F : 1.0F;
+ float f9 = f8 * NMSChunkGenerator16_2_BACKUP.j[l + 2 + (i1 + 2) * 5] / (f6 + 2.0F);
+
+ f += f7 * f9;
+ f1 += f6 * f9;
+ f2 += f9;
+ }
+ }
+
+ float f10 = f1 / f2;
+ float f11 = f / f2;
+
+ d2 = (double) (f10 * 0.5F - 0.125F);
+ d3 = (double) (f11 * 0.9F + 0.1F);
+ d0 = d2 * 0.265625D;
+ d1 = 96.0D / d3;
+ }
+
+ double d4 = 684.412D * noisesettings.b().a();
+ double d5 = 684.412D * noisesettings.b().b();
+ double d6 = d4 / noisesettings.b().c();
+ double d7 = d5 / noisesettings.b().d();
+
+ d2 = (double) noisesettings.c().a();
+ d3 = (double) noisesettings.c().b();
+ double d8 = (double) noisesettings.c().c();
+ double d9 = (double) noisesettings.d().a();
+ double d10 = (double) noisesettings.d().b();
+ double d11 = (double) noisesettings.d().c();
+ double d12 = noisesettings.j() ? this.c(i, j) : 0.0D;
+ double d13 = noisesettings.g();
+ double d14 = noisesettings.h();
+
+ for(int j1 = 0; j1 <= this.o; ++j1)
+ {
+ double d15 = this.a(i, j1, j, d4, d5, d6, d7);
+ double d16 = 1.0D - (double) j1 * 2.0D / (double) this.o + d12;
+ double d17 = d16 * d13 + d14;
+ double d18 = (d17 + d0) * d1;
+
+ if(d18 > 0.0D)
+ {
+ d15 += d18 * 4.0D;
+ }
+ else
+ {
+ d15 += d18;
+ }
+
+ double d19;
+
+ if(d3 > 0.0D)
+ {
+ d19 = ((double) (this.o - j1) - d8) / d3;
+ d15 = MathHelper.b(d2, d15, d19);
+ }
+
+ if(d10 > 0.0D)
+ {
+ d19 = ((double) j1 - d11) / d10;
+ d15 = MathHelper.b(d9, d15, d19);
+ }
+
+ adouble[j1] = d15;
+ }
+
+ }
+
+ private double c(int i, int j)
+ {
+ double d0 = this.u.a((double) (i * 200), 10.0D, (double) (j * 200), 1.0D, 0.0D, true);
+ double d1;
+
+ if(d0 < 0.0D)
+ {
+ d1 = -d0 * 0.3D;
+ }
+ else
+ {
+ d1 = d0;
+ }
+
+ double d2 = d1 * 24.575625D - 2.0D;
+
+ return d2 < 0.0D ? d2 * 0.009486607142857142D : Math.min(d2, 1.0D) * 0.006640625D;
+ }
+
+ @Override
+ public int getBaseHeight(int i, int j, HeightMap.Type heightmap_type)
+ {
+ return this.a(i, j, (IBlockData[]) null, heightmap_type.e());
+ }
+
+ @Override
+ public IBlockAccess a(int i, int j)
+ {
+ IBlockData[] aiblockdata = new IBlockData[this.o * this.l];
+
+ this.a(i, j, aiblockdata, (Predicate) null);
+ return new BlockColumn(aiblockdata);
+ }
+
+ private int a(int i, int j, @Nullable IBlockData[] aiblockdata, @Nullable Predicate predicate)
+ {
+ int k = Math.floorDiv(i, this.m);
+ int l = Math.floorDiv(j, this.m);
+ int i1 = Math.floorMod(i, this.m);
+ int j1 = Math.floorMod(j, this.m);
+ double d0 = (double) i1 / (double) this.m;
+ double d1 = (double) j1 / (double) this.m;
+ double[][] adouble = new double[][] {this.b(k, l), this.b(k, l + 1), this.b(k + 1, l), this.b(k + 1, l + 1)};
+
+ for(int k1 = this.o - 1; k1 >= 0; --k1)
+ {
+ double d2 = adouble[0][k1];
+ double d3 = adouble[1][k1];
+ double d4 = adouble[2][k1];
+ double d5 = adouble[3][k1];
+ double d6 = adouble[0][k1 + 1];
+ double d7 = adouble[1][k1 + 1];
+ double d8 = adouble[2][k1 + 1];
+ double d9 = adouble[3][k1 + 1];
+
+ for(int l1 = this.l - 1; l1 >= 0; --l1)
+ {
+ double d10 = (double) l1 / (double) this.l;
+ double d11 = MathHelper.a(d10, d0, d1, d2, d6, d4, d8, d3, d7, d5, d9);
+ int i2 = k1 * this.l + l1;
+ IBlockData iblockdata = this.a(d11, i2);
+
+ if(aiblockdata != null)
+ {
+ aiblockdata[i2] = iblockdata;
+ }
+
+ if(predicate != null && predicate.test(iblockdata))
+ {
+ return i2 + 1;
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ protected IBlockData a(double d0, int i)
+ {
+ IBlockData iblockdata;
+
+ if(d0 > 0.0D)
+ {
+ iblockdata = this.f;
+ }
+ else if(i < this.getSeaLevel())
+ {
+ iblockdata = this.g;
+ }
+ else
+ {
+ iblockdata = NMSChunkGenerator16_2_BACKUP.k;
+ }
+
+ return iblockdata;
+ }
+
+ @Override
+ public void buildBase(RegionLimitedWorldAccess regionlimitedworldaccess, IChunkAccess ichunkaccess)
+ {
+ ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
+ int i = chunkcoordintpair.x;
+ int j = chunkcoordintpair.z;
+ SeededRandom seededrandom = new SeededRandom();
+
+ seededrandom.a(i, j);
+ ChunkCoordIntPair chunkcoordintpair1 = ichunkaccess.getPos();
+ int k = chunkcoordintpair1.d();
+ int l = chunkcoordintpair1.e();
+ // double d0 = 0.0625D;
+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
+
+ for(int i1 = 0; i1 < 16; ++i1)
+ {
+ for(int j1 = 0; j1 < 16; ++j1)
+ {
+ int k1 = k + i1;
+ int l1 = l + j1;
+ int i2 = ichunkaccess.getHighestBlock(HeightMap.Type.WORLD_SURFACE_WG, i1, j1) + 1;
+ double d1 = this.t.a((double) k1 * 0.0625D, (double) l1 * 0.0625D, 0.0625D, (double) i1 * 0.0625D) * 15.0D;
+
+ regionlimitedworldaccess.getBiome(blockposition_mutableblockposition.d(k + i1, i2, l + j1)).a(seededrandom, ichunkaccess, k1, l1, i2, d1, this.f, this.g, this.getSeaLevel(), regionlimitedworldaccess.getSeed());
+ }
+ }
+
+ this.a(ichunkaccess, seededrandom);
+ }
+
+ private void a(IChunkAccess ichunkaccess, Random random)
+ {
+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
+ int i = ichunkaccess.getPos().d();
+ int j = ichunkaccess.getPos().e();
+ GeneratorSettingBase generatorsettingbase = this.h.get();
+ int k = generatorsettingbase.f();
+ int l = this.x - 1 - generatorsettingbase.e();
+ boolean flag1 = l + 4 >= 0 && l < this.x;
+ boolean flag2 = k + 4 >= 0 && k < this.x;
+
+ if(flag1 || flag2)
+ {
+ Iterator iterator = BlockPosition.b(i, 0, j, i + 15, 0, j + 15).iterator();
+
+ while(iterator.hasNext())
+ {
+ BlockPosition blockposition = iterator.next();
+ int i1;
+
+ if(flag1)
+ {
+ for(i1 = 0; i1 < 5; ++i1)
+ {
+ if(i1 <= random.nextInt(5))
+ {
+ ichunkaccess.setType(blockposition_mutableblockposition.d(blockposition.getX(), l - i1, blockposition.getZ()), Blocks.BEDROCK.getBlockData(), false);
+ }
+ }
+ }
+
+ if(flag2)
+ {
+ for(i1 = 4; i1 >= 0; --i1)
+ {
+ if(i1 <= random.nextInt(5))
+ {
+ ichunkaccess.setType(blockposition_mutableblockposition.d(blockposition.getX(), k + i1, blockposition.getZ()), Blocks.BEDROCK.getBlockData(), false);
+ }
+ }
+ }
+ }
+
+ }
+ }
+
+ @Override
+ public void buildNoise(GeneratorAccess generatoraccess, StructureManager structuremanager, IChunkAccess ichunkaccess)
+ {
+ ObjectList objectlist = new ObjectArrayList(10);
+ ObjectList objectlist1 = new ObjectArrayList(32);
+ ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
+ int i = chunkcoordintpair.x;
+ int j = chunkcoordintpair.z;
+ int k = i << 4;
+ int l = j << 4;
+ Iterator> iterator = StructureGenerator.t.iterator();
+
+ while(iterator.hasNext())
+ {
+ StructureGenerator> structuregenerator = (StructureGenerator>) iterator.next();
+
+ structuremanager.a(SectionPosition.a(chunkcoordintpair, 0), structuregenerator).forEach((structurestart) ->
+ {
+ Iterator> iterator1 = structurestart.d().iterator();
+
+ while(iterator1.hasNext())
+ {
+ StructurePiece structurepiece = (StructurePiece) iterator1.next();
+
+ if(structurepiece.a(chunkcoordintpair, 12))
+ {
+ if(structurepiece instanceof WorldGenFeaturePillagerOutpostPoolPiece)
+ {
+ WorldGenFeaturePillagerOutpostPoolPiece worldgenfeaturepillageroutpostpoolpiece = (WorldGenFeaturePillagerOutpostPoolPiece) structurepiece;
+ WorldGenFeatureDefinedStructurePoolTemplate.Matching worldgenfeaturedefinedstructurepooltemplate_matching = worldgenfeaturepillageroutpostpoolpiece.b().e();
+
+ if(worldgenfeaturedefinedstructurepooltemplate_matching == WorldGenFeatureDefinedStructurePoolTemplate.Matching.RIGID)
+ {
+ objectlist.add(worldgenfeaturepillageroutpostpoolpiece);
+ }
+
+ Iterator> iterator2 = worldgenfeaturepillageroutpostpoolpiece.e().iterator();
+
+ while(iterator2.hasNext())
+ {
+ WorldGenFeatureDefinedStructureJigsawJunction worldgenfeaturedefinedstructurejigsawjunction = (WorldGenFeatureDefinedStructureJigsawJunction) iterator2.next();
+ int i1 = worldgenfeaturedefinedstructurejigsawjunction.a();
+ int j1 = worldgenfeaturedefinedstructurejigsawjunction.c();
+
+ if(i1 > k - 12 && j1 > l - 12 && i1 < k + 15 + 12 && j1 < l + 15 + 12)
+ {
+ objectlist1.add(worldgenfeaturedefinedstructurejigsawjunction);
+ }
+ }
+ }
+ else
+ {
+ objectlist.add(structurepiece);
+ }
+ }
+ }
+
+ });
+ }
+
+ double[][][] adouble = new double[2][this.p + 1][this.o + 1];
+
+ for(int i1 = 0; i1 < this.p + 1; ++i1)
+ {
+ adouble[0][i1] = new double[this.o + 1];
+ this.a(adouble[0][i1], i * this.n, j * this.p + i1);
+ adouble[1][i1] = new double[this.o + 1];
+ }
+
+ ProtoChunk protochunk = (ProtoChunk) ichunkaccess;
+ HeightMap heightmap = protochunk.a(HeightMap.Type.OCEAN_FLOOR_WG);
+ HeightMap heightmap1 = protochunk.a(HeightMap.Type.WORLD_SURFACE_WG);
+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
+ ObjectListIterator objectlistiterator = objectlist.iterator();
+ ObjectListIterator objectlistiterator1 = objectlist1.iterator();
+
+ for(int j1 = 0; j1 < this.n; ++j1)
+ {
+ int k1;
+
+ for(k1 = 0; k1 < this.p + 1; ++k1)
+ {
+ this.a(adouble[1][k1], i * this.n + j1 + 1, j * this.p + k1);
+ }
+
+ for(k1 = 0; k1 < this.p; ++k1)
+ {
+ ChunkSection chunksection = protochunk.a(15);
+
+ chunksection.a();
+
+ for(int l1 = this.o - 1; l1 >= 0; --l1)
+ {
+ double d0 = adouble[0][k1][l1];
+ double d1 = adouble[0][k1 + 1][l1];
+ double d2 = adouble[1][k1][l1];
+ double d3 = adouble[1][k1 + 1][l1];
+ double d4 = adouble[0][k1][l1 + 1];
+ double d5 = adouble[0][k1 + 1][l1 + 1];
+ double d6 = adouble[1][k1][l1 + 1];
+ double d7 = adouble[1][k1 + 1][l1 + 1];
+
+ for(int i2 = this.l - 1; i2 >= 0; --i2)
+ {
+ int j2 = l1 * this.l + i2;
+ int k2 = j2 & 15;
+ int l2 = j2 >> 4;
+
+ if(chunksection.getYPosition() >> 4 != l2)
+ {
+ chunksection.b();
+ chunksection = protochunk.a(l2);
+ chunksection.a();
+ }
+
+ double d8 = (double) i2 / (double) this.l;
+ double d9 = MathHelper.d(d8, d0, d4);
+ double d10 = MathHelper.d(d8, d2, d6);
+ double d11 = MathHelper.d(d8, d1, d5);
+ double d12 = MathHelper.d(d8, d3, d7);
+
+ for(int i3 = 0; i3 < this.m; ++i3)
+ {
+ int j3 = k + j1 * this.m + i3;
+ int k3 = j3 & 15;
+ double d13 = (double) i3 / (double) this.m;
+ double d14 = MathHelper.d(d13, d9, d10);
+ double d15 = MathHelper.d(d13, d11, d12);
+
+ for(int l3 = 0; l3 < this.m; ++l3)
+ {
+ int i4 = l + k1 * this.m + l3;
+ int j4 = i4 & 15;
+ double d16 = (double) l3 / (double) this.m;
+ double d17 = MathHelper.d(d16, d14, d15);
+ double d18 = MathHelper.a(d17 / 200.0D, -1.0D, 1.0D);
+
+ int k4;
+ int l4;
+ int i5;
+
+ for(d18 = d18 / 2.0D - d18 * d18 * d18 / 24.0D; objectlistiterator.hasNext(); d18 += a(k4, l4, i5) * 0.8D)
+ {
+ StructurePiece structurepiece = objectlistiterator.next();
+ StructureBoundingBox structureboundingbox = structurepiece.g();
+
+ k4 = Math.max(0, Math.max(structureboundingbox.a - j3, j3 - structureboundingbox.d));
+ l4 = j2 - (structureboundingbox.b + (structurepiece instanceof WorldGenFeaturePillagerOutpostPoolPiece ? ((WorldGenFeaturePillagerOutpostPoolPiece) structurepiece).d() : 0));
+ i5 = Math.max(0, Math.max(structureboundingbox.c - i4, i4 - structureboundingbox.f));
+ }
+
+ objectlistiterator.back(objectlist.size());
+
+ while(objectlistiterator1.hasNext())
+ {
+ WorldGenFeatureDefinedStructureJigsawJunction worldgenfeaturedefinedstructurejigsawjunction = objectlistiterator1.next();
+ int j5 = j3 - worldgenfeaturedefinedstructurejigsawjunction.a();
+
+ k4 = j2 - worldgenfeaturedefinedstructurejigsawjunction.b();
+ l4 = i4 - worldgenfeaturedefinedstructurejigsawjunction.c();
+ d18 += a(j5, k4, l4) * 0.4D;
+ }
+
+ objectlistiterator1.back(objectlist1.size());
+ IBlockData iblockdata = this.a(d18, j2);
+
+ if(iblockdata != NMSChunkGenerator16_2_BACKUP.k)
+ {
+ if(iblockdata.f() != 0)
+ {
+ blockposition_mutableblockposition.d(j3, j2, i4);
+ protochunk.k(blockposition_mutableblockposition);
+ }
+
+ chunksection.setType(k3, k2, j4, iblockdata, false);
+ heightmap.a(k3, j2, j4, iblockdata);
+ heightmap1.a(k3, j2, j4, iblockdata);
+ }
+ }
+ }
+ }
+ }
+
+ chunksection.b();
+ }
+
+ double[][] adouble1 = adouble[0];
+
+ adouble[0] = adouble[1];
+ adouble[1] = adouble1;
+ }
+
+ }
+
+ private static double a(int i, int j, int k)
+ {
+ int l = i + 12;
+ int i1 = j + 12;
+ int j1 = k + 12;
+
+ return l >= 0 && l < 24 ? (i1 >= 0 && i1 < 24 ? (j1 >= 0 && j1 < 24 ? (double) NMSChunkGenerator16_2_BACKUP.i[j1 * 24 * 24 + l * 24 + i1] : 0.0D) : 0.0D) : 0.0D;
+ }
+
+ private static double b(int i, int j, int k)
+ {
+ double d0 = (double) (i * i + k * k);
+ double d1 = (double) j + 0.5D;
+ double d2 = d1 * d1;
+ double d3 = Math.pow(2.718281828459045D, -(d2 / 16.0D + d0 / 16.0D));
+ double d4 = -d1 * MathHelper.i(d2 / 2.0D + d0 / 2.0D) / 2.0D;
+
+ return d4 * d3;
+ }
+
+ @Override
+ public int getGenerationDepth()
+ {
+ return this.x;
+ }
+
+ @Override
+ public int getSeaLevel()
+ {
+ return this.h.get().g();
+ }
+
+ @Override
+ public List getMobsFor(BiomeBase biomebase, StructureManager structuremanager, EnumCreatureType enumcreaturetype, BlockPosition blockposition)
+ {
+ if(structuremanager.a(blockposition, true, StructureGenerator.SWAMP_HUT).e())
+ {
+ if(enumcreaturetype == EnumCreatureType.MONSTER)
+ {
+ return StructureGenerator.SWAMP_HUT.c();
+ }
+
+ if(enumcreaturetype == EnumCreatureType.CREATURE)
+ {
+ return StructureGenerator.SWAMP_HUT.j();
+ }
+ }
+
+ if(enumcreaturetype == EnumCreatureType.MONSTER)
+ {
+ if(structuremanager.a(blockposition, false, StructureGenerator.PILLAGER_OUTPOST).e())
+ {
+ return StructureGenerator.PILLAGER_OUTPOST.c();
+ }
+
+ if(structuremanager.a(blockposition, false, StructureGenerator.MONUMENT).e())
+ {
+ return StructureGenerator.MONUMENT.c();
+ }
+
+ if(structuremanager.a(blockposition, true, StructureGenerator.FORTRESS).e())
+ {
+ return StructureGenerator.FORTRESS.c();
+ }
+ }
+
+ return super.getMobsFor(biomebase, structuremanager, enumcreaturetype, blockposition);
+ }
+
+ @Override
+ public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess)
+ {
+ int i = regionlimitedworldaccess.a();
+ int j = regionlimitedworldaccess.b();
+ BiomeBase biomebase = regionlimitedworldaccess.getBiome((new ChunkCoordIntPair(i, j)).l());
+ SeededRandom seededrandom = new SeededRandom();
+ seededrandom.a(regionlimitedworldaccess.getSeed(), i << 4, j << 4);
+ SpawnerCreature.a(regionlimitedworldaccess, biomebase, i, j, seededrandom);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java
index 0171a6bd8..b2cf4915f 100644
--- a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java
+++ b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java
@@ -1,4 +1,4 @@
-package com.volmit.iris.gen.nms;
+package com.volmit.iris.gen.nms.v16_2;
import java.io.File;
import java.io.IOException;
@@ -23,8 +23,12 @@ 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.gen.nms.INMSCreator;
+import com.volmit.iris.gen.scaffold.Provisioned;
+import com.volmit.iris.util.O;
import com.volmit.iris.util.V;
+import io.papermc.lib.PaperLib;
import net.minecraft.server.v1_16_R2.BiomeBase;
import net.minecraft.server.v1_16_R2.BiomeManager;
import net.minecraft.server.v1_16_R2.Convertable;
@@ -38,6 +42,7 @@ 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.IRegistryCustom.Dimension;
import net.minecraft.server.v1_16_R2.IWorldDataServer;
import net.minecraft.server.v1_16_R2.MinecraftKey;
import net.minecraft.server.v1_16_R2.MinecraftServer;
@@ -52,16 +57,19 @@ 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.WorldChunkManager;
+import net.minecraft.server.v1_16_R2.WorldChunkManagerOverworld;
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
+class NMSCreator16_2 implements INMSCreator
{
@SuppressWarnings({"unchecked", "rawtypes", "resource"})
- public static World createWorld(WorldCreator creator, boolean loadSpawn)
+ public World createWorld(WorldCreator creator, boolean loadSpawn)
{
+ Provisioned pro = (Provisioned) creator.generator();
CraftServer server = ((CraftServer) Bukkit.getServer());
Map worlds = new V(server).get("worlds");
DedicatedServer console = new V(server).get("console");
@@ -121,7 +129,7 @@ public class NMSCreator162
}
MinecraftServer.convertWorld(worldSession);
final boolean hardcore = creator.hardcore();
- final RegistryReadOps registryreadops = (RegistryReadOps) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f);
+ final RegistryReadOps registryreadops = (RegistryReadOps) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), getConsoleDimension(console));
WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
if(worlddata == null)
{
@@ -130,7 +138,7 @@ public class NMSCreator162
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);
+ final GeneratorSettings generatorsettings = GeneratorSettings.a(getConsoleDimension(console), 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());
@@ -147,18 +155,10 @@ public class NMSCreator162
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();
- }
-
+ long ll = new Random().nextLong();
+ dimensionmanager = (DimensionManager) getConsoleDimension(console).a().d(DimensionManager.OVERWORLD);
+ O ws = new O();
+ chunkgenerator = new NMSChunkGenerator16_2(pro, ws, (WorldChunkManager) new WorldChunkManagerOverworld(ll, false, false, (IRegistry) getConsoleDimension(console).b(IRegistry.ay)), ll, () -> (GeneratorSettingBase) getConsoleDimension(console).b(IRegistry.ar).d(GeneratorSettingBase.c));
final ResourceKey worldKey = (ResourceKey) ResourceKey.a(IRegistry.L, new MinecraftKey(name.toLowerCase(Locale.ENGLISH)));
//@builder
final WorldServer internal = new WorldServer((MinecraftServer) console,
@@ -173,8 +173,9 @@ public class NMSCreator162
(List) ((creator.environment() == World.Environment.NORMAL) ? list : ImmutableList.of()),
true,
creator.environment(),
- generator);
+ server.getGenerator(name));
//@done
+ ws.set(internal);
if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH)))
{
try
@@ -189,10 +190,12 @@ public class NMSCreator162
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);
@@ -206,4 +209,14 @@ public class NMSCreator162
server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld()));
return (World) internal.getWorld();
}
+
+ private Dimension getConsoleDimension(DedicatedServer console)
+ {
+ if(PaperLib.isPaper())
+ {
+ return new V((MinecraftServer) console, true).get("customRegistry");
+ }
+
+ return console.f;
+ }
}
diff --git a/src/main/java/com/volmit/iris/gen/nms/v1X/NMSBinding1X.java b/src/main/java/com/volmit/iris/gen/nms/v1X/NMSBinding1X.java
new file mode 100644
index 000000000..57eae74a4
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/v1X/NMSBinding1X.java
@@ -0,0 +1,16 @@
+package com.volmit.iris.gen.nms.v1X;
+
+import com.volmit.iris.gen.atomics.AtomicCache;
+import com.volmit.iris.gen.nms.INMSBinding;
+import com.volmit.iris.gen.nms.INMSCreator;
+
+public class NMSBinding1X implements INMSBinding
+{
+ private final AtomicCache creator = new AtomicCache<>();
+
+ @Override
+ public INMSCreator getCreator()
+ {
+ return creator.aquire(() -> new NMSCreator1X());
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/nms/v1X/NMSCreator1X.java b/src/main/java/com/volmit/iris/gen/nms/v1X/NMSCreator1X.java
new file mode 100644
index 000000000..987b0dcd2
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/nms/v1X/NMSCreator1X.java
@@ -0,0 +1,14 @@
+package com.volmit.iris.gen.nms.v1X;
+
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+
+import com.volmit.iris.gen.nms.INMSCreator;
+
+class NMSCreator1X implements INMSCreator
+{
+ public World createWorld(WorldCreator creator, boolean loadSpawn)
+ {
+ return creator.createWorld();
+ }
+}
diff --git a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java
index 872bce6f8..46a8b094e 100644
--- a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java
+++ b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java
@@ -15,6 +15,7 @@ import org.bukkit.generator.ChunkGenerator;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.IrisTerrainProvider;
+import com.volmit.iris.gen.scaffold.GeneratedChunk;
import com.volmit.iris.gen.scaffold.HeightedFakeWorld;
import com.volmit.iris.gen.scaffold.Provisioned;
import com.volmit.iris.gen.scaffold.TerrainChunk;
@@ -198,17 +199,7 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned
@Override
public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome)
{
- cachedWorld = world;
- if(!worldSet)
- {
- worldSet = true;
- provider.getTarget().setRealWorld(world);
-
- if(world.getSpawnLocation().getY() == 0 && world.getSpawnLocation().getZ() == 0 && world.getSpawnLocation().getX() == 0)
- {
- Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> fixSpawn(world));
- }
- }
+ cacheWorld(world);
if(precache.size() > 0)
{
@@ -226,6 +217,28 @@ public class ProvisionBukkit extends ChunkGenerator implements Provisioned
return terrain.getRaw();
}
+ public GeneratedChunk generateNMSChunkData(World world, Random random, int x, int z, ChunkData nmsData, BiomeGrid biome)
+ {
+ cacheWorld(world);
+ TerrainChunk terrain = TerrainChunk.create(nmsData, biome);
+ return getProvider().generate(getRNG(world, x, z), x, z, terrain);
+ }
+
+ private void cacheWorld(World world)
+ {
+ cachedWorld = world;
+ if(!worldSet)
+ {
+ worldSet = true;
+ provider.getTarget().setRealWorld(world);
+
+ if(world.getSpawnLocation().getY() == 0 && world.getSpawnLocation().getZ() == 0 && world.getSpawnLocation().getX() == 0)
+ {
+ Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> fixSpawn(world));
+ }
+ }
+ }
+
private Random getRNG(World world, int x, int z)
{
cachedWorld = world;
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/GeneratedChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/GeneratedChunk.java
new file mode 100644
index 000000000..70e03d35b
--- /dev/null
+++ b/src/main/java/com/volmit/iris/gen/scaffold/GeneratedChunk.java
@@ -0,0 +1,20 @@
+package com.volmit.iris.gen.scaffold;
+
+import com.volmit.iris.gen.atomics.AtomicSliverMap;
+import com.volmit.iris.util.BiomeMap;
+import com.volmit.iris.util.HeightMap;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Builder
+@Data
+public class GeneratedChunk
+{
+ private int x;
+ private int z;
+ private TerrainChunk terrain;
+ private HeightMap height;
+ private AtomicSliverMap sliverMap;
+ private BiomeMap biomeMap;
+}
diff --git a/src/main/java/com/volmit/iris/gen/scaffold/LinkedTerrainChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/LinkedTerrainChunk.java
index 9a5d8f06e..50658e2ec 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/LinkedTerrainChunk.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/LinkedTerrainChunk.java
@@ -23,6 +23,14 @@ public class LinkedTerrainChunk implements TerrainChunk
this(null, maxHeight);
}
+ public LinkedTerrainChunk(BiomeGrid storage, ChunkData data)
+ {
+ this.storage = storage;
+ rawChunkData = data;
+ biome2D = storage != null ? null : Iris.biome3d ? null : new Biome[256];
+ biome3D = storage != null ? null : Iris.biome3d ? new IrisBiomeStorage() : null;
+ }
+
public LinkedTerrainChunk(BiomeGrid storage, int maxHeight)
{
this.storage = storage;
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 6d7dfa286..d8fe1b974 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java
@@ -23,6 +23,11 @@ public interface TerrainChunk extends BiomeGrid, ChunkData
return create(world.getMaxHeight(), grid);
}
+ public static TerrainChunk create(ChunkData raw, BiomeGrid grid)
+ {
+ return new LinkedTerrainChunk(grid, raw);
+ }
+
public static TerrainChunk create(int maxHeight, BiomeGrid grid)
{
return new LinkedTerrainChunk(grid, maxHeight);
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 7f2e60eb2..643f4f71a 100644
--- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java
+++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java
@@ -7,6 +7,8 @@ import java.util.function.Function;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.util.BlockVector;
+import com.volmit.iris.util.HeightMap;
+
public interface TerrainProvider
{
public TerrainTarget getTarget();
@@ -17,7 +19,7 @@ public interface TerrainProvider
public BlockVector computeSpawn(Function allowed);
- public void generate(Random random, int x, int z, TerrainChunk chunk);
+ public GeneratedChunk generate(Random random, int x, int z, TerrainChunk chunk);
public boolean canSpawn(int x, int z);
diff --git a/src/main/java/com/volmit/iris/manager/IrisProject.java b/src/main/java/com/volmit/iris/manager/IrisProject.java
index 4cc3a0fa0..31d93ba4d 100644
--- a/src/main/java/com/volmit/iris/manager/IrisProject.java
+++ b/src/main/java/com/volmit/iris/manager/IrisProject.java
@@ -16,7 +16,7 @@ import com.google.gson.Gson;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.IrisTerrainProvider;
-import com.volmit.iris.gen.nms.NMSCreator;
+import com.volmit.iris.gen.nms.INMS;
import com.volmit.iris.gen.provisions.ProvisionBukkit;
import com.volmit.iris.gen.scaffold.IrisGenConfiguration;
import com.volmit.iris.gen.scaffold.TerrainTarget;
@@ -191,7 +191,7 @@ public class IrisProject
});
//@builder
- World world = NMSCreator.createWorld(new WorldCreator(wfp)
+ World world = INMS.get().createWorld(new WorldCreator(wfp)
.seed(1337)
.generator(gen)
.generateStructures(d.isVanillaStructures())