827 lines
38 KiB
Diff
827 lines
38 KiB
Diff
|
From 068645a2ea95cdff723b466bf11724c1a9f1c1c1 Mon Sep 17 00:00:00 2001
|
||
|
From: Michael Himing <mhiming@gmail.com>
|
||
|
Date: Thu, 6 Apr 2017 12:59:23 +1000
|
||
|
Subject: [PATCH] Configurable generation
|
||
|
|
||
|
|
||
|
diff --git a/src/main/java/net/frozenorb/generator/GenLayerRemoveSpawnRivers.java b/src/main/java/net/frozenorb/generator/GenLayerRemoveSpawnRivers.java
|
||
|
new file mode 100644
|
||
|
index 000000000..cbff12850
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/frozenorb/generator/GenLayerRemoveSpawnRivers.java
|
||
|
@@ -0,0 +1,39 @@
|
||
|
+package net.frozenorb.generator;
|
||
|
+
|
||
|
+import net.minecraft.server.GenLayer;
|
||
|
+import net.minecraft.server.IntCache;
|
||
|
+import net.minecraft.server.World;
|
||
|
+
|
||
|
+public class GenLayerRemoveSpawnRivers extends GenLayer {
|
||
|
+
|
||
|
+ private final GenLayer parent;
|
||
|
+ private final World world;
|
||
|
+
|
||
|
+ public GenLayerRemoveSpawnRivers(GenLayer parent, World world) {
|
||
|
+ super(1);
|
||
|
+
|
||
|
+ this.parent = parent;
|
||
|
+ this.world = world;
|
||
|
+ }
|
||
|
+
|
||
|
+ @Override
|
||
|
+ public int[] a(int x, int z, int w, int h) {
|
||
|
+ int radiusSqrd = world.generatorConfig.spawnBiomeRadius * world.generatorConfig.spawnBiomeRadius;
|
||
|
+ int[] in = parent.a(x, z, w, h);
|
||
|
+ int[] out = IntCache.a(w * h);
|
||
|
+
|
||
|
+ for (int i = 0; i < w; i++) {
|
||
|
+ for (int j = 0; j < h; j++) {
|
||
|
+ int index = j * w + i;
|
||
|
+ int worldX = (x + i) << 2;
|
||
|
+ int worldZ = (z + j) << 2;
|
||
|
+ if (worldX * worldX + worldZ * worldZ < radiusSqrd) {
|
||
|
+ out[index] = -1;
|
||
|
+ } else {
|
||
|
+ out[index] = in[index];
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return out;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/frozenorb/generator/GenLayerSpawnBiome.java b/src/main/java/net/frozenorb/generator/GenLayerSpawnBiome.java
|
||
|
new file mode 100644
|
||
|
index 000000000..55516ce59
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/frozenorb/generator/GenLayerSpawnBiome.java
|
||
|
@@ -0,0 +1,40 @@
|
||
|
+package net.frozenorb.generator;
|
||
|
+
|
||
|
+import net.minecraft.server.GenLayer;
|
||
|
+import net.minecraft.server.IntCache;
|
||
|
+import net.minecraft.server.World;
|
||
|
+
|
||
|
+public class GenLayerSpawnBiome extends GenLayer {
|
||
|
+
|
||
|
+ private final GenLayer parent;
|
||
|
+ private final int biomeSize;
|
||
|
+ private final World world;
|
||
|
+
|
||
|
+ public GenLayerSpawnBiome(GenLayer parent, int biomeSize, World world) {
|
||
|
+ super(1);
|
||
|
+ this.parent = parent;
|
||
|
+ this.biomeSize = biomeSize;
|
||
|
+ this.world = world;
|
||
|
+ }
|
||
|
+
|
||
|
+ @Override
|
||
|
+ public int[] a(int x, int z, int w, int h) {
|
||
|
+ int radiusSqrd = world.generatorConfig.spawnBiomeRadius * world.generatorConfig.spawnBiomeRadius;
|
||
|
+ int[] in = parent.a(x, z, w, h);
|
||
|
+ int[] out = IntCache.a(w * h);
|
||
|
+
|
||
|
+ for (int i = 0; i < w; i++) {
|
||
|
+ for (int j = 0; j < h; j++) {
|
||
|
+ int index = j * w + i;
|
||
|
+ int worldX = (x + i) << 2 << biomeSize;
|
||
|
+ int worldZ = (z + j) << 2 << biomeSize;
|
||
|
+ if (worldX * worldX + worldZ * worldZ < radiusSqrd) {
|
||
|
+ out[index] = world.generatorConfig.spawnBiome.id;
|
||
|
+ } else {
|
||
|
+ out[index] = in[index];
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return out;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/frozenorb/generator/GeneratorConfig.java b/src/main/java/net/frozenorb/generator/GeneratorConfig.java
|
||
|
new file mode 100644
|
||
|
index 000000000..cdf9703a7
|
||
|
--- /dev/null
|
||
|
+++ b/src/main/java/net/frozenorb/generator/GeneratorConfig.java
|
||
|
@@ -0,0 +1,168 @@
|
||
|
+package net.frozenorb.generator;
|
||
|
+
|
||
|
+import net.minecraft.server.BiomeBase;
|
||
|
+import org.bukkit.configuration.file.YamlConfiguration;
|
||
|
+
|
||
|
+import java.io.File;
|
||
|
+import java.io.IOException;
|
||
|
+
|
||
|
+public class GeneratorConfig {
|
||
|
+
|
||
|
+ private final String worldName;
|
||
|
+ private final File file;
|
||
|
+ private final YamlConfiguration conf;
|
||
|
+
|
||
|
+ public boolean oceans;
|
||
|
+
|
||
|
+ public boolean biomePlains;
|
||
|
+ public boolean biomeDesert;
|
||
|
+ public boolean biomeDesertHills;
|
||
|
+ public boolean biomeExtremeHills;
|
||
|
+ public boolean biomeExtremeHillsPlus;
|
||
|
+ public boolean biomeForest;
|
||
|
+ public boolean biomeForestHills;
|
||
|
+ public boolean biomeTaiga;
|
||
|
+ public boolean biomeTaigaHills;
|
||
|
+ public boolean biomeSwampland;
|
||
|
+ public boolean biomeIcePlains;
|
||
|
+ public boolean biomeIceMountains;
|
||
|
+ public boolean biomeMushroomIsland;
|
||
|
+ public boolean biomeJungle;
|
||
|
+ public boolean biomeJungleHills;
|
||
|
+ public boolean biomeBirchForest;
|
||
|
+ public boolean biomeBirchForestHills;
|
||
|
+ public boolean biomeRoofedForest;
|
||
|
+ public boolean biomeColdTaiga;
|
||
|
+ public boolean biomeColdTaigaHills;
|
||
|
+ public boolean biomeMegaTaiga;
|
||
|
+ public boolean biomeMegaTaigaHills;
|
||
|
+ public boolean biomeSavanna;
|
||
|
+ public boolean biomeSavannaPlateau;
|
||
|
+ public boolean biomeMesa;
|
||
|
+ public boolean biomeMesaPlateauF;
|
||
|
+ public boolean biomeMesaPlateau;
|
||
|
+
|
||
|
+ public BiomeBase spawnBiome;
|
||
|
+ public int spawnBiomeRadius;
|
||
|
+ public boolean spawnBiomeRivers;
|
||
|
+
|
||
|
+ public float cavesMultiplier;
|
||
|
+
|
||
|
+ public float coalMultiplier;
|
||
|
+ public int coalSize;
|
||
|
+ public boolean coalMustTouchAir;
|
||
|
+ public float ironMultiplier;
|
||
|
+ public int ironSize;
|
||
|
+ public boolean ironMustTouchAir;
|
||
|
+ public float goldMultiplier;
|
||
|
+ public int goldSize;
|
||
|
+ public boolean goldMustTouchAir;
|
||
|
+ public float redstoneMultiplier;
|
||
|
+ public int redstoneSize;
|
||
|
+ public boolean redstoneMustTouchAir;
|
||
|
+ public float diamondMultiplier;
|
||
|
+ public int diamondSize;
|
||
|
+ public boolean diamondMustTouchAir;
|
||
|
+ public float lapisMultiplier;
|
||
|
+ public int lapisSize;
|
||
|
+ public boolean lapisMustTouchAir;
|
||
|
+ public float sugarCaneMultiplier;
|
||
|
+
|
||
|
+ public GeneratorConfig(String worldName) {
|
||
|
+ this.worldName = worldName;
|
||
|
+ this.file = new File("config/generator", worldName + ".yml");
|
||
|
+ conf = YamlConfiguration.loadConfiguration(file);
|
||
|
+ conf.options().copyDefaults(true);
|
||
|
+
|
||
|
+ oceans = getBoolean("oceans", true);
|
||
|
+ biomePlains = getBoolean("biome.plains", true);
|
||
|
+ biomeDesert = getBoolean("biome.desert", true);
|
||
|
+ biomeDesertHills = getBoolean("biome.desert-hills", true);
|
||
|
+ biomeExtremeHills = getBoolean("biome.extreme-hills", true);
|
||
|
+ biomeExtremeHillsPlus = getBoolean("biome.extreme-hills-plus", true);
|
||
|
+ biomeForest = getBoolean("biome.forest", true);
|
||
|
+ biomeForestHills = getBoolean("biome.forest-hills", true);
|
||
|
+ biomeTaiga = getBoolean("biome.taiga", true);
|
||
|
+ biomeTaigaHills = getBoolean("biome.taiga-hills", true);
|
||
|
+ biomeSwampland = getBoolean("biome.swampland", true);
|
||
|
+ biomeIcePlains = getBoolean("biome.ice-plains", true);
|
||
|
+ biomeIceMountains = getBoolean("biome.ice-mountains", true);
|
||
|
+ biomeMushroomIsland = getBoolean("biome.mushroom-island", true);
|
||
|
+ biomeJungle = getBoolean("biome.jungle", true);
|
||
|
+ biomeJungleHills = getBoolean("biome.jungle-hills", true);
|
||
|
+ biomeBirchForest = getBoolean("biome.birch-forest", true);
|
||
|
+ biomeBirchForestHills = getBoolean("biome.birch-forest-hills", true);
|
||
|
+ biomeRoofedForest = getBoolean("biome.roofed-forest", true);
|
||
|
+ biomeColdTaiga = getBoolean("biome.cold-taiga", true);
|
||
|
+ biomeColdTaigaHills = getBoolean("biome.cold-taiga-hills", true);
|
||
|
+ biomeMegaTaiga = getBoolean("biome.mega-taiga", true);
|
||
|
+ biomeMegaTaigaHills = getBoolean("biome.mega-taiga-hills", true);
|
||
|
+ biomeSavanna = getBoolean("biome.savanna", true);
|
||
|
+ biomeSavannaPlateau = getBoolean("biome.savanna-plateau", true);
|
||
|
+ biomeMesa = getBoolean("biome.mesa", true);
|
||
|
+ biomeMesaPlateauF = getBoolean("biome.mesa-plateau-f", true);
|
||
|
+ biomeMesaPlateau = getBoolean("biome.mesa-plateau", true);
|
||
|
+
|
||
|
+ spawnBiome = getBiome(getString("spawn.biome", "plains"));
|
||
|
+ spawnBiomeRadius = getInt("spawn.radius", 0);
|
||
|
+ spawnBiomeRivers = getBoolean("spawn.rivers", false);
|
||
|
+
|
||
|
+ cavesMultiplier = (float) getDouble("caves.multiplier", 1.0);
|
||
|
+
|
||
|
+ coalMultiplier = (float) getDouble("ores.coal.multiplier", 1.0);
|
||
|
+ coalSize = getInt("ores.coal.size", 16);
|
||
|
+ coalMustTouchAir = getBoolean("ores.coal.must-touch-air", false);
|
||
|
+ ironMultiplier = (float) getDouble("ores.iron.multiplier", 1.0);
|
||
|
+ ironSize = getInt("ores.iron.size", 8);
|
||
|
+ ironMustTouchAir = getBoolean("ores.iron.must-touch-air", false);
|
||
|
+ goldMultiplier = (float) getDouble("ores.gold.multiplier", 1.0);
|
||
|
+ goldSize = getInt("ores.gold.size", 8);
|
||
|
+ goldMustTouchAir = getBoolean("ores.gold.must-touch-air", false);
|
||
|
+ redstoneMultiplier = (float) getDouble("ores.redstone.multiplier", 1.0);
|
||
|
+ redstoneSize = getInt("ores.redstone.size", 7);
|
||
|
+ redstoneMustTouchAir = getBoolean("ores.redstone.must-touch-air", false);
|
||
|
+ diamondMultiplier = (float) getDouble("ores.diamond.multiplier", 1.0);
|
||
|
+ diamondSize = getInt("ores.diamond.size", 7);
|
||
|
+ diamondMustTouchAir = getBoolean("ores.diamond.must-touch-air", false);
|
||
|
+ lapisMultiplier = (float) getDouble("ores.lapis.multiplier", 1.0);
|
||
|
+ lapisSize = getInt("ores.lapis.size", 6);
|
||
|
+ lapisMustTouchAir = getBoolean("ores.lapis.must-touch-air", false);
|
||
|
+
|
||
|
+ sugarCaneMultiplier = (float) getDouble("sugar-cane.multiplier", 1.0);
|
||
|
+
|
||
|
+ try {
|
||
|
+ conf.save(file);
|
||
|
+ } catch (IOException ex) {
|
||
|
+ ex.printStackTrace();
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ private boolean getBoolean(String path, boolean def) {
|
||
|
+ conf.addDefault(path, def);
|
||
|
+ return conf.getBoolean(path, def);
|
||
|
+ }
|
||
|
+
|
||
|
+ private String getString(String path, String def) {
|
||
|
+ conf.addDefault(path, def);
|
||
|
+ return conf.getString(path, def);
|
||
|
+ }
|
||
|
+
|
||
|
+ private int getInt(String path, int def) {
|
||
|
+ conf.addDefault(path, def);
|
||
|
+ return conf.getInt(path, def);
|
||
|
+ }
|
||
|
+
|
||
|
+ private double getDouble(String path, double def) {
|
||
|
+ conf.addDefault(path, def);
|
||
|
+ return conf.getDouble(path, def);
|
||
|
+ }
|
||
|
+
|
||
|
+ private BiomeBase getBiome(String name) {
|
||
|
+ for (BiomeBase biome : BiomeBase.getBiomes()) {
|
||
|
+ if (biome.af.equalsIgnoreCase(name)) {
|
||
|
+ return biome;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return BiomeBase.PLAINS;
|
||
|
+ }
|
||
|
+}
|
||
|
diff --git a/src/main/java/net/minecraft/server/BiomeDecorator.java b/src/main/java/net/minecraft/server/BiomeDecorator.java
|
||
|
index 064a125ad..3d634a192 100644
|
||
|
--- a/src/main/java/net/minecraft/server/BiomeDecorator.java
|
||
|
+++ b/src/main/java/net/minecraft/server/BiomeDecorator.java
|
||
|
@@ -45,12 +45,15 @@ public class BiomeDecorator {
|
||
|
this.g = new WorldGenSand(Blocks.GRAVEL, 6);
|
||
|
this.h = new WorldGenMinable(Blocks.DIRT, 32);
|
||
|
this.i = new WorldGenMinable(Blocks.GRAVEL, 32);
|
||
|
+ // MineHQ - move down so they can get world config
|
||
|
+ /*
|
||
|
this.j = new WorldGenMinable(Blocks.COAL_ORE, 16);
|
||
|
this.k = new WorldGenMinable(Blocks.IRON_ORE, 8);
|
||
|
this.l = new WorldGenMinable(Blocks.GOLD_ORE, 8);
|
||
|
this.m = new WorldGenMinable(Blocks.REDSTONE_ORE, 7);
|
||
|
this.n = new WorldGenMinable(Blocks.DIAMOND_ORE, 7);
|
||
|
this.o = new WorldGenMinable(Blocks.LAPIS_ORE, 6);
|
||
|
+ */
|
||
|
this.p = new WorldGenFlowers(Blocks.YELLOW_FLOWER);
|
||
|
this.q = new WorldGenFlowers(Blocks.BROWN_MUSHROOM);
|
||
|
this.r = new WorldGenFlowers(Blocks.RED_MUSHROOM);
|
||
|
@@ -74,6 +77,14 @@ public class BiomeDecorator {
|
||
|
this.b = random;
|
||
|
this.c = i;
|
||
|
this.d = j;
|
||
|
+ // MineHQ Start
|
||
|
+ this.j = new WorldGenMinable(Blocks.COAL_ORE, world.generatorConfig.coalSize, world.generatorConfig.coalMustTouchAir);
|
||
|
+ this.k = new WorldGenMinable(Blocks.IRON_ORE, world.generatorConfig.ironSize, world.generatorConfig.ironMustTouchAir);
|
||
|
+ this.l = new WorldGenMinable(Blocks.GOLD_ORE, world.generatorConfig.goldSize, world.generatorConfig.goldMustTouchAir);
|
||
|
+ this.m = new WorldGenMinable(Blocks.REDSTONE_ORE, world.generatorConfig.redstoneSize, world.generatorConfig.redstoneMustTouchAir);
|
||
|
+ this.n = new WorldGenMinable(Blocks.DIAMOND_ORE, world.generatorConfig.diamondSize, world.generatorConfig.diamondMustTouchAir);
|
||
|
+ this.o = new WorldGenMinable(Blocks.LAPIS_ORE, world.generatorConfig.lapisSize, world.generatorConfig.lapisMustTouchAir);
|
||
|
+ // MineHQ end
|
||
|
this.a(biomebase);
|
||
|
this.a = null;
|
||
|
this.b = null;
|
||
|
@@ -201,14 +212,14 @@ public class BiomeDecorator {
|
||
|
this.r.generate(this.a, this.b, j, l, k);
|
||
|
}
|
||
|
|
||
|
- for (j = 0; j < this.C; ++j) {
|
||
|
+ for (j = 0; j < this.C * this.a.generatorConfig.sugarCaneMultiplier; ++j) {
|
||
|
k = this.c + this.b.nextInt(16) + 8;
|
||
|
l = this.d + this.b.nextInt(16) + 8;
|
||
|
i1 = this.b.nextInt(this.getHighestBlockYAt(k, l) * 2); // Spigot
|
||
|
this.t.generate(this.a, this.b, k, i1, l);
|
||
|
}
|
||
|
|
||
|
- for (j = 0; j < 10; ++j) {
|
||
|
+ for (j = 0; j < 10 * this.a.generatorConfig.sugarCaneMultiplier; ++j) {
|
||
|
k = this.c + this.b.nextInt(16) + 8;
|
||
|
l = this.d + this.b.nextInt(16) + 8;
|
||
|
i1 = this.b.nextInt(this.getHighestBlockYAt(k, l) * 2); // Spigot
|
||
|
@@ -269,12 +280,13 @@ public class BiomeDecorator {
|
||
|
protected void a() {
|
||
|
this.a(20, this.h, 0, 256);
|
||
|
this.a(10, this.i, 0, 256);
|
||
|
- this.a(20, this.j, 0, 128);
|
||
|
- this.a(20, this.k, 0, 64);
|
||
|
- this.a(2, this.l, 0, 32);
|
||
|
- this.a(8, this.m, 0, 16);
|
||
|
- this.a(1, this.n, 0, 16);
|
||
|
- this.b(1, this.o, 16, 16);
|
||
|
+ net.frozenorb.generator.GeneratorConfig conf = this.a.generatorConfig;
|
||
|
+ if (conf.coalMultiplier > 0) this.a((int) (20 * conf.coalMultiplier + this.b.nextFloat()), this.j, 0, 128);
|
||
|
+ if (conf.ironMultiplier > 0) this.a((int) (20 * conf.ironMultiplier + this.b.nextFloat()), this.k, 0, 64);
|
||
|
+ if (conf.goldMultiplier > 0) this.a((int) (2 * conf.goldMultiplier + this.b.nextFloat()), this.l, 0, 32);
|
||
|
+ if (conf.redstoneMultiplier > 0) this.a((int) (8 * conf.redstoneMultiplier + this.b.nextFloat()), this.m, 0, 16);
|
||
|
+ if (conf.diamondMultiplier > 0) this.a((int) (1 * conf.diamondMultiplier + this.b.nextFloat()), this.n, 0, 16);
|
||
|
+ if (conf.lapisMultiplier > 0) this.b((int) (1 * conf.lapisMultiplier + this.b.nextFloat()), this.o, 16, 16);
|
||
|
}
|
||
|
|
||
|
// Spigot Start
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderGenerate.java b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
|
||
|
index 251bf4852..6c41753db 100644
|
||
|
--- a/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
|
||
|
@@ -150,7 +150,7 @@ public class ChunkProviderGenerate implements IChunkProvider {
|
||
|
this.z = this.n.getWorldChunkManager().getBiomeBlock(this.z, i * 16, j * 16, 16, 16);
|
||
|
this.a(i, j, ablock, abyte, this.z);
|
||
|
// PaperSpigot start
|
||
|
- if (this.n.paperSpigotConfig.generateCaves) this.t.a(this, this.n, i, j, ablock);
|
||
|
+ if (this.n.paperSpigotConfig.generateCaves && this.n.generatorConfig.cavesMultiplier > 0) this.t.a(this, this.n, i, j, ablock);
|
||
|
if (this.n.paperSpigotConfig.generateCanyon) this.y.a(this, this.n, i, j, ablock);
|
||
|
// PaperSpigot end
|
||
|
if (this.o) {
|
||
|
diff --git a/src/main/java/net/minecraft/server/GenLayer.java b/src/main/java/net/minecraft/server/GenLayer.java
|
||
|
index b15e0f608..7c74243f2 100644
|
||
|
--- a/src/main/java/net/minecraft/server/GenLayer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/GenLayer.java
|
||
|
@@ -1,5 +1,8 @@
|
||
|
package net.minecraft.server;
|
||
|
|
||
|
+import net.frozenorb.generator.GenLayerRemoveSpawnRivers;
|
||
|
+import net.frozenorb.generator.GenLayerSpawnBiome;
|
||
|
+
|
||
|
import java.util.concurrent.Callable;
|
||
|
|
||
|
public abstract class GenLayer {
|
||
|
@@ -9,9 +12,9 @@ public abstract class GenLayer {
|
||
|
private long d;
|
||
|
protected long b;
|
||
|
|
||
|
- public static GenLayer[] a(long i, WorldType worldtype) {
|
||
|
+ public static GenLayer[] a(long i, WorldType worldtype, World world) { // MineHQ - add world
|
||
|
boolean flag = false;
|
||
|
- LayerIsland layerisland = new LayerIsland(1L);
|
||
|
+ LayerIsland layerisland = new LayerIsland(1L, world); // MineHQ - add world
|
||
|
GenLayerZoomFuzzy genlayerzoomfuzzy = new GenLayerZoomFuzzy(2000L, layerisland);
|
||
|
GenLayerIsland genlayerisland = new GenLayerIsland(1L, genlayerzoomfuzzy);
|
||
|
GenLayerZoom genlayerzoom = new GenLayerZoom(2001L, genlayerisland);
|
||
|
@@ -45,7 +48,7 @@ public abstract class GenLayer {
|
||
|
|
||
|
GenLayer genlayer1 = GenLayerZoom.b(1000L, genlayer, 0);
|
||
|
GenLayerCleaner genlayercleaner = new GenLayerCleaner(100L, genlayer1);
|
||
|
- Object object = new GenLayerBiome(200L, genlayer, worldtype);
|
||
|
+ Object object = new GenLayerBiome(200L, genlayer, worldtype, world); // MineHQ - add world
|
||
|
|
||
|
if (!flag) {
|
||
|
GenLayer genlayer2 = GenLayerZoom.b(1000L, (GenLayer) object, 2);
|
||
|
@@ -54,14 +57,20 @@ public abstract class GenLayer {
|
||
|
}
|
||
|
|
||
|
GenLayer genlayer3 = GenLayerZoom.b(1000L, genlayercleaner, 2);
|
||
|
- GenLayerRegionHills genlayerregionhills = new GenLayerRegionHills(1000L, (GenLayer) object, genlayer3);
|
||
|
+ GenLayerRegionHills genlayerregionhills = new GenLayerRegionHills(1000L, (GenLayer) object, genlayer3, world); // MineHQ - add world
|
||
|
|
||
|
genlayer1 = GenLayerZoom.b(1000L, genlayercleaner, 2);
|
||
|
genlayer1 = GenLayerZoom.b(1000L, genlayer1, b0);
|
||
|
- GenLayerRiver genlayerriver = new GenLayerRiver(1L, genlayer1);
|
||
|
+ GenLayer genlayerriver = new GenLayerRiver(1L, genlayer1);
|
||
|
+ if (world.generatorConfig.spawnBiomeRadius > 0 && !world.generatorConfig.spawnBiomeRivers) {
|
||
|
+ genlayerriver = new GenLayerRemoveSpawnRivers(genlayerriver, world);
|
||
|
+ }
|
||
|
GenLayerSmooth genlayersmooth = new GenLayerSmooth(1000L, genlayerriver);
|
||
|
|
||
|
object = new GenLayerPlains(1001L, genlayerregionhills);
|
||
|
+ if (world.generatorConfig.spawnBiomeRadius > 0) {
|
||
|
+ object = new GenLayerSpawnBiome((GenLayer) object, b0, world);
|
||
|
+ }
|
||
|
|
||
|
for (int j = 0; j < b0; ++j) {
|
||
|
object = new GenLayerZoom((long) (1000 + j), (GenLayer) object);
|
||
|
diff --git a/src/main/java/net/minecraft/server/GenLayerBiome.java b/src/main/java/net/minecraft/server/GenLayerBiome.java
|
||
|
index 42fe8f1a1..6c078fa02 100644
|
||
|
--- a/src/main/java/net/minecraft/server/GenLayerBiome.java
|
||
|
+++ b/src/main/java/net/minecraft/server/GenLayerBiome.java
|
||
|
@@ -1,18 +1,84 @@
|
||
|
package net.minecraft.server;
|
||
|
|
||
|
+import java.util.ArrayList;
|
||
|
+import java.util.List;
|
||
|
+
|
||
|
public class GenLayerBiome extends GenLayer {
|
||
|
|
||
|
+ private final World world;
|
||
|
private BiomeBase[] c;
|
||
|
private BiomeBase[] d;
|
||
|
private BiomeBase[] e;
|
||
|
private BiomeBase[] f;
|
||
|
|
||
|
- public GenLayerBiome(long i, GenLayer genlayer, WorldType worldtype) {
|
||
|
+ public GenLayerBiome(long i, GenLayer genlayer, WorldType worldtype, World world) {
|
||
|
super(i);
|
||
|
- this.c = new BiomeBase[] { BiomeBase.DESERT, BiomeBase.DESERT, BiomeBase.DESERT, BiomeBase.SAVANNA, BiomeBase.SAVANNA, BiomeBase.PLAINS};
|
||
|
- this.d = new BiomeBase[] { BiomeBase.FOREST, BiomeBase.ROOFED_FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.PLAINS, BiomeBase.BIRCH_FOREST, BiomeBase.SWAMPLAND};
|
||
|
- this.e = new BiomeBase[] { BiomeBase.FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.TAIGA, BiomeBase.PLAINS};
|
||
|
- this.f = new BiomeBase[] { BiomeBase.ICE_PLAINS, BiomeBase.ICE_PLAINS, BiomeBase.ICE_PLAINS, BiomeBase.COLD_TAIGA};
|
||
|
+ this.world = world;
|
||
|
+ List<BiomeBase> list = new ArrayList<BiomeBase>();
|
||
|
+ //this.c = new BiomeBase[] { BiomeBase.DESERT, BiomeBase.DESERT, BiomeBase.DESERT, BiomeBase.SAVANNA, BiomeBase.SAVANNA, BiomeBase.PLAINS};
|
||
|
+ if (world.generatorConfig.biomeDesert) {
|
||
|
+ list.add(BiomeBase.DESERT);
|
||
|
+ list.add(BiomeBase.DESERT);
|
||
|
+ list.add(BiomeBase.DESERT);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeSavanna) {
|
||
|
+ list.add(BiomeBase.SAVANNA);
|
||
|
+ list.add(BiomeBase.SAVANNA);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomePlains) {
|
||
|
+ list.add(BiomeBase.PLAINS);
|
||
|
+ }
|
||
|
+ this.c = list.toArray(new BiomeBase[list.size()]);
|
||
|
+ list.clear();
|
||
|
+ //this.d = new BiomeBase[] { BiomeBase.FOREST, BiomeBase.ROOFED_FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.PLAINS, BiomeBase.BIRCH_FOREST, BiomeBase.SWAMPLAND};
|
||
|
+ if (world.generatorConfig.biomeForest) {
|
||
|
+ list.add(BiomeBase.FOREST);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeRoofedForest) {
|
||
|
+ list.add(BiomeBase.ROOFED_FOREST);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeExtremeHills) {
|
||
|
+ list.add(BiomeBase.EXTREME_HILLS);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomePlains) {
|
||
|
+ list.add(BiomeBase.PLAINS);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeBirchForest) {
|
||
|
+ list.add(BiomeBase.BIRCH_FOREST);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeSwampland) {
|
||
|
+ list.add(BiomeBase.SWAMPLAND);
|
||
|
+ }
|
||
|
+ if (list.isEmpty() && world.generatorConfig.biomeJungle) {
|
||
|
+ list.add(BiomeBase.JUNGLE);
|
||
|
+ }
|
||
|
+ this.d = list.toArray(new BiomeBase[list.size()]);
|
||
|
+ list.clear();
|
||
|
+ //this.e = new BiomeBase[] { BiomeBase.FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.TAIGA, BiomeBase.PLAINS};
|
||
|
+ if (world.generatorConfig.biomeForest) {
|
||
|
+ list.add(BiomeBase.FOREST);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeExtremeHills) {
|
||
|
+ list.add(BiomeBase.EXTREME_HILLS);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeTaiga) {
|
||
|
+ list.add(BiomeBase.TAIGA);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomePlains) {
|
||
|
+ list.add(BiomeBase.PLAINS);
|
||
|
+ }
|
||
|
+ this.e = list.toArray(new BiomeBase[list.size()]);
|
||
|
+ list.clear();
|
||
|
+ //this.f = new BiomeBase[] { BiomeBase.ICE_PLAINS, BiomeBase.ICE_PLAINS, BiomeBase.ICE_PLAINS, BiomeBase.COLD_TAIGA};
|
||
|
+ if (world.generatorConfig.biomeIcePlains) {
|
||
|
+ list.add(BiomeBase.ICE_PLAINS);
|
||
|
+ list.add(BiomeBase.ICE_PLAINS);
|
||
|
+ list.add(BiomeBase.ICE_PLAINS);
|
||
|
+ }
|
||
|
+ if (world.generatorConfig.biomeColdTaiga) {
|
||
|
+ list.add(BiomeBase.COLD_TAIGA);
|
||
|
+ }
|
||
|
+ this.f = list.toArray(new BiomeBase[list.size()]);
|
||
|
this.a = genlayer;
|
||
|
if (worldtype == WorldType.NORMAL_1_1) {
|
||
|
this.c = new BiomeBase[] { BiomeBase.DESERT, BiomeBase.FOREST, BiomeBase.EXTREME_HILLS, BiomeBase.SWAMPLAND, BiomeBase.PLAINS, BiomeBase.TAIGA};
|
||
|
@@ -35,29 +101,37 @@ public class GenLayerBiome extends GenLayer {
|
||
|
} else if (k1 == BiomeBase.MUSHROOM_ISLAND.id) {
|
||
|
aint1[j1 + i1 * k] = k1;
|
||
|
} else if (k1 == 1) {
|
||
|
+ BiomeBase[] biomes = this.firstNonEmpty(this.c, this.d, this.e, this.f);
|
||
|
if (l1 > 0) {
|
||
|
- if (this.a(3) == 0) {
|
||
|
+ if (this.a(3) == 0 && this.world.generatorConfig.biomeMesaPlateau) {
|
||
|
aint1[j1 + i1 * k] = BiomeBase.MESA_PLATEAU.id;
|
||
|
- } else {
|
||
|
+ } else if (this.world.generatorConfig.biomeMesaPlateauF) {
|
||
|
aint1[j1 + i1 * k] = BiomeBase.MESA_PLATEAU_F.id;
|
||
|
+ } else if (this.world.generatorConfig.biomeMesa) {
|
||
|
+ aint1[j1 + i1 * k] = BiomeBase.MESA.id;
|
||
|
+ } else {
|
||
|
+ aint1[j1 + i1 * k] = biomes[this.a(biomes.length)].id;
|
||
|
}
|
||
|
} else {
|
||
|
- aint1[j1 + i1 * k] = this.c[this.a(this.c.length)].id;
|
||
|
+ aint1[j1 + i1 * k] = biomes[this.a(biomes.length)].id;
|
||
|
}
|
||
|
} else if (k1 == 2) {
|
||
|
- if (l1 > 0) {
|
||
|
+ BiomeBase[] biomes = this.firstNonEmpty(this.d, this.e, this.f, this.c);
|
||
|
+ if (l1 > 0 && this.world.generatorConfig.biomeJungle) {
|
||
|
aint1[j1 + i1 * k] = BiomeBase.JUNGLE.id;
|
||
|
} else {
|
||
|
- aint1[j1 + i1 * k] = this.d[this.a(this.d.length)].id;
|
||
|
+ aint1[j1 + i1 * k] = biomes[this.a(biomes.length)].id;
|
||
|
}
|
||
|
} else if (k1 == 3) {
|
||
|
- if (l1 > 0) {
|
||
|
+ BiomeBase[] biomes = this.firstNonEmpty(this.e, this.f, this.c, this.d);
|
||
|
+ if (l1 > 0 && this.world.generatorConfig.biomeMegaTaiga) {
|
||
|
aint1[j1 + i1 * k] = BiomeBase.MEGA_TAIGA.id;
|
||
|
} else {
|
||
|
- aint1[j1 + i1 * k] = this.e[this.a(this.e.length)].id;
|
||
|
+ aint1[j1 + i1 * k] = biomes[this.a(biomes.length)].id;
|
||
|
}
|
||
|
} else if (k1 == 4) {
|
||
|
- aint1[j1 + i1 * k] = this.f[this.a(this.f.length)].id;
|
||
|
+ BiomeBase[] biomes = this.firstNonEmpty(this.f, this.c, this.d, this.e);
|
||
|
+ aint1[j1 + i1 * k] = biomes[this.a(biomes.length)].id;
|
||
|
} else {
|
||
|
aint1[j1 + i1 * k] = BiomeBase.MUSHROOM_ISLAND.id;
|
||
|
}
|
||
|
@@ -66,4 +140,13 @@ public class GenLayerBiome extends GenLayer {
|
||
|
|
||
|
return aint1;
|
||
|
}
|
||
|
+
|
||
|
+ private BiomeBase[] firstNonEmpty(BiomeBase[]... options) {
|
||
|
+ for (BiomeBase[] option : options) {
|
||
|
+ if (option.length > 0) {
|
||
|
+ return option;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return new BiomeBase[]{BiomeBase.PLAINS};
|
||
|
+ }
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/server/GenLayerRegionHills.java b/src/main/java/net/minecraft/server/GenLayerRegionHills.java
|
||
|
index 7543f301b..ae53a8276 100644
|
||
|
--- a/src/main/java/net/minecraft/server/GenLayerRegionHills.java
|
||
|
+++ b/src/main/java/net/minecraft/server/GenLayerRegionHills.java
|
||
|
@@ -6,10 +6,12 @@ import org.apache.logging.log4j.Logger;
|
||
|
public class GenLayerRegionHills extends GenLayer {
|
||
|
|
||
|
private static final Logger c = LogManager.getLogger();
|
||
|
+ private final World world;
|
||
|
private GenLayer d;
|
||
|
|
||
|
- public GenLayerRegionHills(long i, GenLayer genlayer, GenLayer genlayer1) {
|
||
|
+ public GenLayerRegionHills(long i, GenLayer genlayer, GenLayer genlayer1, World world) {
|
||
|
super(i);
|
||
|
+ this.world = world;
|
||
|
this.a = genlayer;
|
||
|
this.d = genlayer1;
|
||
|
}
|
||
|
@@ -42,43 +44,43 @@ public class GenLayerRegionHills extends GenLayer {
|
||
|
int i2 = k1;
|
||
|
int j2;
|
||
|
|
||
|
- if (k1 == BiomeBase.DESERT.id) {
|
||
|
+ if (k1 == BiomeBase.DESERT.id && this.world.generatorConfig.biomeDesertHills) {
|
||
|
i2 = BiomeBase.DESERT_HILLS.id;
|
||
|
- } else if (k1 == BiomeBase.FOREST.id) {
|
||
|
+ } else if (k1 == BiomeBase.FOREST.id && this.world.generatorConfig.biomeForestHills) {
|
||
|
i2 = BiomeBase.FOREST_HILLS.id;
|
||
|
- } else if (k1 == BiomeBase.BIRCH_FOREST.id) {
|
||
|
+ } else if (k1 == BiomeBase.BIRCH_FOREST.id && this.world.generatorConfig.biomeBirchForestHills) {
|
||
|
i2 = BiomeBase.BIRCH_FOREST_HILLS.id;
|
||
|
- } else if (k1 == BiomeBase.ROOFED_FOREST.id) {
|
||
|
+ } else if (k1 == BiomeBase.ROOFED_FOREST.id && this.world.generatorConfig.biomePlains) {
|
||
|
i2 = BiomeBase.PLAINS.id;
|
||
|
- } else if (k1 == BiomeBase.TAIGA.id) {
|
||
|
+ } else if (k1 == BiomeBase.TAIGA.id && this.world.generatorConfig.biomeTaigaHills) {
|
||
|
i2 = BiomeBase.TAIGA_HILLS.id;
|
||
|
- } else if (k1 == BiomeBase.MEGA_TAIGA.id) {
|
||
|
+ } else if (k1 == BiomeBase.MEGA_TAIGA.id && this.world.generatorConfig.biomeMegaTaigaHills) {
|
||
|
i2 = BiomeBase.MEGA_TAIGA_HILLS.id;
|
||
|
- } else if (k1 == BiomeBase.COLD_TAIGA.id) {
|
||
|
+ } else if (k1 == BiomeBase.COLD_TAIGA.id && this.world.generatorConfig.biomeColdTaigaHills) {
|
||
|
i2 = BiomeBase.COLD_TAIGA_HILLS.id;
|
||
|
} else if (k1 == BiomeBase.PLAINS.id) {
|
||
|
- if (this.a(3) == 0) {
|
||
|
+ if (this.a(3) == 0 && this.world.generatorConfig.biomeForestHills) {
|
||
|
i2 = BiomeBase.FOREST_HILLS.id;
|
||
|
- } else {
|
||
|
+ } else if (this.world.generatorConfig.biomeForest) {
|
||
|
i2 = BiomeBase.FOREST.id;
|
||
|
}
|
||
|
- } else if (k1 == BiomeBase.ICE_PLAINS.id) {
|
||
|
+ } else if (k1 == BiomeBase.ICE_PLAINS.id && this.world.generatorConfig.biomeIceMountains) {
|
||
|
i2 = BiomeBase.ICE_MOUNTAINS.id;
|
||
|
- } else if (k1 == BiomeBase.JUNGLE.id) {
|
||
|
+ } else if (k1 == BiomeBase.JUNGLE.id && this.world.generatorConfig.biomeJungleHills) {
|
||
|
i2 = BiomeBase.JUNGLE_HILLS.id;
|
||
|
} else if (k1 == BiomeBase.OCEAN.id) {
|
||
|
i2 = BiomeBase.DEEP_OCEAN.id;
|
||
|
- } else if (k1 == BiomeBase.EXTREME_HILLS.id) {
|
||
|
+ } else if (k1 == BiomeBase.EXTREME_HILLS.id && this.world.generatorConfig.biomeExtremeHillsPlus) {
|
||
|
i2 = BiomeBase.EXTREME_HILLS_PLUS.id;
|
||
|
- } else if (k1 == BiomeBase.SAVANNA.id) {
|
||
|
+ } else if (k1 == BiomeBase.SAVANNA.id && this.world.generatorConfig.biomeSavannaPlateau) {
|
||
|
i2 = BiomeBase.SAVANNA_PLATEAU.id;
|
||
|
- } else if (a(k1, BiomeBase.MESA_PLATEAU_F.id)) {
|
||
|
+ } else if (a(k1, BiomeBase.MESA_PLATEAU_F.id) && this.world.generatorConfig.biomeMesa) {
|
||
|
i2 = BiomeBase.MESA.id;
|
||
|
} else if (k1 == BiomeBase.DEEP_OCEAN.id && this.a(3) == 0) {
|
||
|
j2 = this.a(2);
|
||
|
- if (j2 == 0) {
|
||
|
+ if (j2 == 0 && this.world.generatorConfig.biomePlains) {
|
||
|
i2 = BiomeBase.PLAINS.id;
|
||
|
- } else {
|
||
|
+ } else if (this.world.generatorConfig.biomeForest) {
|
||
|
i2 = BiomeBase.FOREST.id;
|
||
|
}
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/server/LayerIsland.java b/src/main/java/net/minecraft/server/LayerIsland.java
|
||
|
index 8a21033cc..ae7702d8a 100644
|
||
|
--- a/src/main/java/net/minecraft/server/LayerIsland.java
|
||
|
+++ b/src/main/java/net/minecraft/server/LayerIsland.java
|
||
|
@@ -1,14 +1,28 @@
|
||
|
package net.minecraft.server;
|
||
|
|
||
|
+import java.util.Arrays;
|
||
|
+
|
||
|
public class LayerIsland extends GenLayer {
|
||
|
|
||
|
- public LayerIsland(long i) {
|
||
|
+ // MineHQ start - add world
|
||
|
+ private final World world;
|
||
|
+
|
||
|
+ public LayerIsland(long i, World world) {
|
||
|
super(i);
|
||
|
+ this.world = world;
|
||
|
+ // MineHQ end
|
||
|
}
|
||
|
|
||
|
public int[] a(int i, int j, int k, int l) {
|
||
|
int[] aint = IntCache.a(k * l);
|
||
|
|
||
|
+ // MineHQ start - oceans option
|
||
|
+ if (!world.generatorConfig.oceans) {
|
||
|
+ Arrays.fill(aint, 1);
|
||
|
+ return aint;
|
||
|
+ }
|
||
|
+ // MineHQ end
|
||
|
+
|
||
|
for (int i1 = 0; i1 < l; ++i1) {
|
||
|
for (int j1 = 0; j1 < k; ++j1) {
|
||
|
this.a((long) (i + j1), (long) (j + i1));
|
||
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||
|
index af1a4a741..9f0bf9207 100644
|
||
|
--- a/src/main/java/net/minecraft/server/World.java
|
||
|
+++ b/src/main/java/net/minecraft/server/World.java
|
||
|
@@ -16,6 +16,8 @@ import java.util.concurrent.ExecutorService;
|
||
|
import java.util.concurrent.Executors;
|
||
|
import java.util.HashMap;
|
||
|
import java.util.Map;
|
||
|
+
|
||
|
+import net.frozenorb.generator.GeneratorConfig;
|
||
|
import net.minecraft.util.com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||
|
import org.bukkit.craftbukkit.CraftChunk;
|
||
|
// PaperSpigot end
|
||
|
@@ -245,10 +247,13 @@ public abstract class World implements IBlockAccess {
|
||
|
return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x, z);
|
||
|
}
|
||
|
|
||
|
+ public final net.frozenorb.generator.GeneratorConfig generatorConfig;// MineHQ
|
||
|
+
|
||
|
// Changed signature - added gen and env
|
||
|
public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) {
|
||
|
this.spigotConfig = new org.spigotmc.SpigotWorldConfig( s ); // Spigot
|
||
|
this.paperSpigotConfig = new org.github.paperspigot.PaperSpigotWorldConfig( s ); // PaperSpigot
|
||
|
+ this.generatorConfig = new GeneratorConfig(s); // MineHQ
|
||
|
this.generator = gen;
|
||
|
this.world = new CraftWorld((WorldServer) this, gen, env);
|
||
|
this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldChunkManager.java b/src/main/java/net/minecraft/server/WorldChunkManager.java
|
||
|
index 4b94d1cf6..2e29bd04e 100644
|
||
|
--- a/src/main/java/net/minecraft/server/WorldChunkManager.java
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldChunkManager.java
|
||
|
@@ -23,16 +23,16 @@ public class WorldChunkManager {
|
||
|
this.f.add(BiomeBase.JUNGLE_HILLS);
|
||
|
}
|
||
|
|
||
|
- public WorldChunkManager(long i, WorldType worldtype) {
|
||
|
+ public WorldChunkManager(long i, WorldType worldtype, World world) { // MineHQ - add world
|
||
|
this();
|
||
|
- GenLayer[] agenlayer = GenLayer.a(i, worldtype);
|
||
|
+ GenLayer[] agenlayer = GenLayer.a(i, worldtype, world); // MineHQ - add world
|
||
|
|
||
|
this.c = agenlayer[0];
|
||
|
this.d = agenlayer[1];
|
||
|
}
|
||
|
|
||
|
public WorldChunkManager(World world) {
|
||
|
- this(world.getSeed(), world.getWorldData().getType());
|
||
|
+ this(world.getSeed(), world.getWorldData().getType(), world); // MineHQ - add world
|
||
|
}
|
||
|
|
||
|
public List a() {
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldGenCaves.java b/src/main/java/net/minecraft/server/WorldGenCaves.java
|
||
|
index 707938031..38077bf54 100644
|
||
|
--- a/src/main/java/net/minecraft/server/WorldGenCaves.java
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldGenCaves.java
|
||
|
@@ -173,9 +173,9 @@ public class WorldGenCaves extends WorldGenBase {
|
||
|
}
|
||
|
|
||
|
protected void a(World world, int i, int j, int k, int l, Block[] ablock) {
|
||
|
- int i1 = this.b.nextInt(this.b.nextInt(this.b.nextInt(15) + 1) + 1);
|
||
|
+ int i1 = this.b.nextInt(this.b.nextInt(this.b.nextInt((int) (15 * world.generatorConfig.cavesMultiplier)) + 1) + 1);
|
||
|
|
||
|
- if (this.b.nextInt(7) != 0) {
|
||
|
+ if (this.b.nextFloat() > world.generatorConfig.cavesMultiplier / 7) {
|
||
|
i1 = 0;
|
||
|
}
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/WorldGenMinable.java b/src/main/java/net/minecraft/server/WorldGenMinable.java
|
||
|
index 1d58f3e56..421941035 100644
|
||
|
--- a/src/main/java/net/minecraft/server/WorldGenMinable.java
|
||
|
+++ b/src/main/java/net/minecraft/server/WorldGenMinable.java
|
||
|
@@ -1,12 +1,15 @@
|
||
|
package net.minecraft.server;
|
||
|
|
||
|
+import java.util.HashSet;
|
||
|
import java.util.Random;
|
||
|
+import java.util.Set;
|
||
|
|
||
|
public class WorldGenMinable extends WorldGenerator {
|
||
|
|
||
|
private Block a;
|
||
|
private int b;
|
||
|
private Block c;
|
||
|
+ private boolean mustTouchAir; // MineHQ
|
||
|
|
||
|
public WorldGenMinable(Block block, int i) {
|
||
|
this(block, i, Blocks.STONE);
|
||
|
@@ -18,6 +21,13 @@ public class WorldGenMinable extends WorldGenerator {
|
||
|
this.c = block1;
|
||
|
}
|
||
|
|
||
|
+ // MineHQ start
|
||
|
+ public WorldGenMinable(Block block, int size, boolean mustTouchAir) {
|
||
|
+ this(block, size, Blocks.STONE);
|
||
|
+ this.mustTouchAir = mustTouchAir;
|
||
|
+ }
|
||
|
+ // MineHQ end
|
||
|
+
|
||
|
public boolean generate(World world, Random random, int i, int j, int k) {
|
||
|
float f = random.nextFloat() * 3.1415927F;
|
||
|
double d0 = (double) ((float) (i + 8) + MathHelper.sin(f) * (float) this.b / 8.0F);
|
||
|
@@ -27,6 +37,9 @@ public class WorldGenMinable extends WorldGenerator {
|
||
|
double d4 = (double) (j + random.nextInt(3) - 2);
|
||
|
double d5 = (double) (j + random.nextInt(3) - 2);
|
||
|
|
||
|
+ boolean touchedAir = false;
|
||
|
+ Set<ChunkPosition> blocks = mustTouchAir ? new HashSet<ChunkPosition>() : null;
|
||
|
+
|
||
|
for (int l = 0; l <= this.b; ++l) {
|
||
|
double d6 = d0 + (d1 - d0) * (double) l / (double) this.b;
|
||
|
double d7 = d4 + (d5 - d4) * (double) l / (double) this.b;
|
||
|
@@ -53,7 +66,18 @@ public class WorldGenMinable extends WorldGenerator {
|
||
|
double d14 = ((double) i3 + 0.5D - d8) / (d10 / 2.0D);
|
||
|
|
||
|
if (d12 * d12 + d13 * d13 + d14 * d14 < 1.0D && world.getType(k2, l2, i3) == this.c) {
|
||
|
- world.setTypeAndData(k2, l2, i3, this.a, 0, 2);
|
||
|
+ if (mustTouchAir) {
|
||
|
+ blocks.add(new ChunkPosition(k2, l2, i3));
|
||
|
+ touchedAir |=
|
||
|
+ world.getType(k2 + 1, l2, i3) == Blocks.AIR ||
|
||
|
+ world.getType(k2 - 1, l2, i3) == Blocks.AIR ||
|
||
|
+ world.getType(k2, l2 + 1, i3) == Blocks.AIR ||
|
||
|
+ world.getType(k2, l2 - 1, i3) == Blocks.AIR ||
|
||
|
+ world.getType(k2, l2, i3 + 1) == Blocks.AIR ||
|
||
|
+ world.getType(k2, l2, i3 - 1) == Blocks.AIR;
|
||
|
+ } else {
|
||
|
+ world.setTypeAndData(k2, l2, i3, this.a, 0, 2);
|
||
|
+ }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
@@ -62,6 +86,12 @@ public class WorldGenMinable extends WorldGenerator {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ if (mustTouchAir && touchedAir) {
|
||
|
+ for (ChunkPosition block : blocks) {
|
||
|
+ world.setTypeAndData(block.x, block.y, block.z, this.a, 0, 2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
--
|
||
|
2.13.3
|
||
|
|