Skip to content

Commit 34346db

Browse files
committed
Include better vanilla gen + fix placeDecoration
1 parent ee714d1 commit 34346db

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+5195
-6
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ Based on plugins made by [wode490390](https://github.com/wode490390)
1111
- https://github.com/wode490390/MultiTemplateStructurePopulator
1212
- https://github.com/wode490390/SingleTemplateStructurePopulator
1313
- https://github.com/wode490390/ScatteredBuildingPopulator
14-
- https://github.com/wode490390/TheEnd
14+
- https://github.com/wode490390/BetterVanillaGenerator
15+
- https://github.com/wode490390/TheEnd

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>worldgeneratorextension</groupId>
77
<artifactId>WorldGeneratorExtension</artifactId>
8-
<version>1.6.0</version>
8+
<version>1.7.0</version>
99
<build>
1010
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
1111
<plugins>

src/main/java/worldgeneratorextension/Loader.java

+16-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import cn.nukkit.item.RuntimeItemMapping;
88
import cn.nukkit.item.RuntimeItems;
99
import cn.nukkit.level.Level;
10+
import cn.nukkit.level.generator.Generator;
1011
import cn.nukkit.level.generator.Normal;
1112
import cn.nukkit.level.generator.Void;
1213
import cn.nukkit.level.generator.populator.type.Populator;
@@ -36,6 +37,7 @@
3637
import worldgeneratorextension.theend.noise.SimplexNoise;
3738
import worldgeneratorextension.theend.object.theend.ObsidianPillar;
3839
import worldgeneratorextension.theend.populator.theend.*;
40+
import worldgeneratorextension.vanillagenerator.NormalGenerator;
3941
import worldgeneratorextension.vipop.populator.PopulatorVillage;
4042
import worldgeneratorextension.vipop.structure.VillagePieces;
4143

@@ -58,10 +60,21 @@ public void onLoad() {
5860

5961
@Override
6062
public void onEnable() {
63+
Plugin betterVanillaGenerator = getServer().getPluginManager().getPlugin("BetterVanillaGenerator");
64+
if (betterVanillaGenerator != null && "cn.wode490390.nukkit.vanillagenerator.BetterGenerator".equals(betterVanillaGenerator.getDescription().getMain())) {
65+
getLogger().warning("Already loaded plugin cn.wode490390.nukkit.vanillagenerator.BetterGenerator found. Using WorldGeneratorExtension instead is recommended.");
66+
}
67+
6168
Plugin theEnd = getServer().getPluginManager().getPlugin("TheEnd");
6269
if (theEnd != null && "cn.wode490390.nukkit.theend.TheEnd".equals(theEnd.getDescription().getMain())) {
63-
getLogger().info("Disabling already loaded cn.wode490390.nukkit.theend.TheEnd");
64-
getServer().getPluginManager().disablePlugin(theEnd);
70+
getLogger().warning("Already loaded plugin cn.wode490390.nukkit.theend.TheEnd found. Using WorldGeneratorExtension instead is recommended.");
71+
}
72+
73+
boolean vanillaOverworld = getServer().getPropertyBoolean("wgenext.vanilla-overworld");
74+
if (vanillaOverworld) {
75+
getLogger().info("Using better vanilla overworld generator");
76+
Generator.addGenerator(NormalGenerator.class, "default", NormalGenerator.TYPE_INFINITE);
77+
Generator.addGenerator(NormalGenerator.class, "normal", NormalGenerator.TYPE_INFINITE);
6578
}
6679

6780
PopulatorFossil.init();
@@ -87,7 +100,7 @@ public void onEnable() {
87100
populatorsOverworld.add(new PopulatorPillagerOutpost());
88101
populatorsOverworld.add(new PopulatorOceanRuin());
89102
populatorsOverworld.add(new PopulatorRuinedPortal());
90-
populatorsOverworld.add(new PopulatorVillage(Normal.seaHeight > 62));
103+
populatorsOverworld.add(new PopulatorVillage(!vanillaOverworld && Normal.seaHeight > 62));
91104
populatorsOverworld.add(new PopulatorStronghold());
92105
populatorsOverworld.add(new PopulatorOceanMonument());
93106
populatorsOverworld.add(new PopulatorMineshaft());

src/main/java/worldgeneratorextension/pm1e/populator/PopulatorCoralCrust.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package worldgeneratorextension.pm1e.populator;
22

33
import cn.nukkit.Server;
4+
import cn.nukkit.block.Block;
45
import cn.nukkit.block.BlockID;
56
import cn.nukkit.block.BlockLayer;
67
import cn.nukkit.level.ChunkManager;
@@ -98,7 +99,7 @@ private static void placeDecoration(NukkitRandom random, FullChunk chunk, int am
9899
int z = random.nextBoundedInt(16);
99100
int y = getHighestWorkableBlock(chunk, x, z);
100101

101-
if (y >= 40 && y < Normal.seaHeight) {
102+
if (y >= 40 && y < Normal.seaHeight && Block.isWater(chunk.getBlockId(x, y, z))) {
102103
chunk.setBlock(x, y, z, id, random.nextBoundedInt(type));
103104
chunk.setBlockAtLayer(x, y, z, BlockLayer.WATERLOGGED, BlockID.WATER);
104105
}

src/main/java/worldgeneratorextension/vanillagenerator/LICENSE

+387
Large diffs are not rendered by default.

src/main/java/worldgeneratorextension/vanillagenerator/NormalGenerator.java

+505
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package worldgeneratorextension.vanillagenerator.biome;
2+
3+
import cn.nukkit.level.biome.Biome;
4+
import cn.nukkit.level.biome.EnumBiome;
5+
import cn.nukkit.math.NukkitRandom;
6+
import worldgeneratorextension.vanillagenerator.noise.bukkit.SimplexOctaveGenerator;
7+
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
8+
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
9+
10+
public class BiomeClimate {
11+
12+
private static final Int2ObjectMap<Climate> CLIMATE_MAP = new Int2ObjectOpenHashMap<>();
13+
private static final SimplexOctaveGenerator noiseGen;
14+
15+
static {
16+
int[] biomes = new int[Biome.unorderedBiomes.size()];
17+
for (int i = 0; i < biomes.length; i++) {
18+
biomes[i] = Biome.unorderedBiomes.get(i).getId();
19+
}
20+
setBiomeClimate(Climate.DEFAULT, biomes);
21+
setBiomeClimate(Climate.PLAINS, EnumBiome.PLAINS.id, EnumBiome.SUNFLOWER_PLAINS.id, EnumBiome.BEACH.id);
22+
setBiomeClimate(Climate.DESERT, EnumBiome.DESERT.id, EnumBiome.DESERT_HILLS.id, EnumBiome.DESERT_M.id, EnumBiome.MESA.id, EnumBiome.MESA_BRYCE.id, EnumBiome.MESA_PLATEAU.id, EnumBiome.MESA_PLATEAU_F.id, EnumBiome.MESA_PLATEAU_M.id, EnumBiome.MESA_PLATEAU_F_M.id, EnumBiome.HELL.id);
23+
setBiomeClimate(Climate.EXTREME_HILLS, EnumBiome.EXTREME_HILLS.id, EnumBiome.EXTREME_HILLS_PLUS.id, EnumBiome.EXTREME_HILLS_M.id, EnumBiome.EXTREME_HILLS_PLUS_M.id, EnumBiome.STONE_BEACH.id, EnumBiome.EXTREME_HILLS_EDGE.id);
24+
setBiomeClimate(Climate.FOREST, EnumBiome.FOREST.id, EnumBiome.FOREST_HILLS.id, EnumBiome.FLOWER_FOREST.id, EnumBiome.ROOFED_FOREST.id, EnumBiome.ROOFED_FOREST_M.id);
25+
setBiomeClimate(Climate.BIRCH_FOREST, EnumBiome.BIRCH_FOREST.id, EnumBiome.BIRCH_FOREST_HILLS.id, EnumBiome.BIRCH_FOREST_M.id, EnumBiome.BIRCH_FOREST_HILLS_M.id);
26+
setBiomeClimate(Climate.TAIGA, EnumBiome.TAIGA.id, EnumBiome.TAIGA_HILLS.id, EnumBiome.TAIGA_M.id, EnumBiome.MEGA_SPRUCE_TAIGA.id, EnumBiome.MEGA_SPRUCE_TAIGA_HILLS.id);
27+
setBiomeClimate(Climate.SWAMPLAND, EnumBiome.SWAMP.id, EnumBiome.SWAMPLAND_M.id);
28+
setBiomeClimate(Climate.ICE_PLAINS, EnumBiome.ICE_PLAINS.id, EnumBiome.ICE_PLAINS_SPIKES.id, EnumBiome.FROZEN_RIVER.id, EnumBiome.FROZEN_OCEAN.id, EnumBiome.ICE_MOUNTAINS.id);
29+
setBiomeClimate(Climate.MUSHROOM, EnumBiome.MUSHROOM_ISLAND.id, EnumBiome.MUSHROOM_ISLAND_SHORE.id);
30+
setBiomeClimate(Climate.COLD_BEACH, EnumBiome.COLD_BEACH.id);
31+
setBiomeClimate(Climate.JUNGLE, EnumBiome.JUNGLE.id, EnumBiome.JUNGLE_HILLS.id, EnumBiome.JUNGLE_M.id, EnumBiome.BAMBOO_JUNGLE.id, EnumBiome.BAMBOO_JUNGLE_HILLS.id);
32+
setBiomeClimate(Climate.JUNGLE_EDGE, EnumBiome.JUNGLE_EDGE.id, EnumBiome.JUNGLE_EDGE_M.id);
33+
setBiomeClimate(Climate.COLD_TAIGA, EnumBiome.COLD_TAIGA.id, EnumBiome.COLD_TAIGA_HILLS.id, EnumBiome.COLD_TAIGA_M.id);
34+
setBiomeClimate(Climate.MEGA_TAIGA, EnumBiome.MEGA_TAIGA.id, EnumBiome.MEGA_TAIGA_HILLS.id);
35+
setBiomeClimate(Climate.SAVANNA, EnumBiome.SAVANNA.id);
36+
setBiomeClimate(Climate.SAVANNA_MOUNTAINS, EnumBiome.SAVANNA_M.id);
37+
setBiomeClimate(Climate.SAVANNA_PLATEAU, EnumBiome.SAVANNA_PLATEAU.id);
38+
setBiomeClimate(Climate.SAVANNA_PLATEAU_MOUNTAINS, EnumBiome.SAVANNA_PLATEAU_M.id);
39+
setBiomeClimate(Climate.SKY);//, EnumBiome.THE_END.id, EnumBiome.SMALL_END_ISLANDS.id, EnumBiome.END_MIDLANDS.id, EnumBiome.END_HIGHLANDS.id, EnumBiome.END_BARRENS.id
40+
41+
noiseGen = new SimplexOctaveGenerator(new NukkitRandom(1234), 1);
42+
noiseGen.setScale(1 / 8.0D);
43+
}
44+
45+
public static double getTemperature(int biome) {
46+
return CLIMATE_MAP.get(biome).getTemperature();
47+
}
48+
49+
public static double getHumidity(int biome) {
50+
return CLIMATE_MAP.get(biome).getHumidity();
51+
}
52+
53+
public static boolean isWet(int biome) {
54+
return getHumidity(biome) > 0.85D;
55+
}
56+
57+
public static boolean isCold(int biome, int x, int y, int z) {
58+
return getVariatedTemperature(biome, x, y, z) < 0.15D;
59+
}
60+
61+
public static boolean isRainy(int biome, int x, int y, int z) {
62+
boolean rainy = CLIMATE_MAP.get(biome).isRainy();
63+
return rainy && !isCold(biome, x, y, z);
64+
}
65+
66+
public static boolean isSnowy(int biome, int x, int y, int z) {
67+
boolean rainy = CLIMATE_MAP.get(biome).isRainy();
68+
return rainy && isCold(biome, x, y, z);
69+
}
70+
71+
private static double getVariatedTemperature(int biome, int x, int y, int z) {
72+
double temp = CLIMATE_MAP.get(biome).getTemperature();
73+
if (y > 64) {
74+
double variation = noiseGen.noise(x, z, 0.5D, 2.0D) * 4.0D;
75+
return temp - (variation + (y - 64)) * 0.05D / 30.0D;
76+
} else {
77+
return temp;
78+
}
79+
}
80+
81+
private static void setBiomeClimate(Climate temp, int... biomes) {
82+
for (int biome : biomes) {
83+
CLIMATE_MAP.put(biome, temp);
84+
}
85+
}
86+
87+
private static class Climate {
88+
89+
public static final Climate DEFAULT = new Climate(0.5D, 0.5D, true);
90+
public static final Climate PLAINS = new Climate(0.8D, 0.4D, true);
91+
public static final Climate DESERT = new Climate(2.0D, 0.0D, false);
92+
public static final Climate EXTREME_HILLS = new Climate(0.2D, 0.3D, true);
93+
public static final Climate FOREST = new Climate(0.7D, 0.8D, true);
94+
public static final Climate BIRCH_FOREST = new Climate(0.6D, 0.6D, true);
95+
public static final Climate TAIGA = new Climate(0.25D, 0.8D, true);
96+
public static final Climate SWAMPLAND = new Climate(0.8D, 0.9D, true);
97+
public static final Climate ICE_PLAINS = new Climate(0.0D, 0.5D, true);
98+
public static final Climate MUSHROOM = new Climate(0.9D, 1.0D, true);
99+
public static final Climate COLD_BEACH = new Climate(0.05D, 0.3D, true);
100+
public static final Climate JUNGLE = new Climate(0.95D, 0.9D, true);
101+
public static final Climate JUNGLE_EDGE = new Climate(0.95D, 0.8D, true);
102+
public static final Climate COLD_TAIGA = new Climate(-0.5D, 0.4D, true);
103+
public static final Climate MEGA_TAIGA = new Climate(0.3D, 0.8D, true);
104+
public static final Climate SAVANNA = new Climate(1.2D, 0.0D, false);
105+
public static final Climate SAVANNA_MOUNTAINS = new Climate(1.1D, 0.0D, false);
106+
public static final Climate SAVANNA_PLATEAU = new Climate(1.0D, 0.0D, false);
107+
public static final Climate SAVANNA_PLATEAU_MOUNTAINS = new Climate(0.5D, 0.0D, false);
108+
public static final Climate SKY = new Climate(0.5D, 0.5D, false);
109+
110+
private final double temperature;
111+
private final double humidity;
112+
private final boolean rainy;
113+
114+
Climate(double temperature, double humidity, boolean rainy) {
115+
this.temperature = temperature;
116+
this.humidity = humidity;
117+
this.rainy = rainy;
118+
}
119+
120+
public double getTemperature() {
121+
return this.temperature;
122+
}
123+
124+
public double getHumidity() {
125+
return this.humidity;
126+
}
127+
128+
public boolean isRainy() {
129+
return this.rainy;
130+
}
131+
}
132+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package worldgeneratorextension.vanillagenerator.biomegrid;
2+
3+
import cn.nukkit.level.Level;
4+
import cn.nukkit.level.biome.EnumBiome;
5+
import cn.nukkit.level.generator.Generator;
6+
import cn.nukkit.math.NukkitRandom;
7+
import worldgeneratorextension.vanillagenerator.NormalGenerator;
8+
import worldgeneratorextension.vanillagenerator.biomegrid.MapLayerWhittaker.ClimateType;
9+
import worldgeneratorextension.vanillagenerator.biomegrid.MapLayerZoom.ZoomType;
10+
11+
public abstract class MapLayer {
12+
13+
private final NukkitRandom random = new NukkitRandom();
14+
private final long seed;
15+
16+
public MapLayer(long seed) {
17+
this.seed = seed;
18+
}
19+
20+
/**
21+
* Creates the instances for the given map.
22+
* @param seed the world seed
23+
* @param environment the type of dimension
24+
* @param worldType the world generator
25+
* @return an array of all map layers this dimension needs
26+
*/
27+
public static MapLayer[] initialize(long seed, int environment, int worldType) {
28+
if (environment == Level.DIMENSION_OVERWORLD && worldType == Generator.TYPE_FLAT) {
29+
return new MapLayer[]{new MapLayerBiomeConstant(seed, EnumBiome.PLAINS.id), null};
30+
} else if (environment == Level.DIMENSION_NETHER) {
31+
return new MapLayer[]{new MapLayerBiomeConstant(seed, EnumBiome.HELL.id), null};
32+
} else if (environment == Level.DIMENSION_THE_END) {
33+
return new MapLayer[]{new MapLayerBiomeConstant(seed, 9), null};//EnumBiome.THE_END.id
34+
}
35+
36+
int zoom = 2;
37+
if (worldType == NormalGenerator.TYPE_LARGE_BIOMES) {
38+
zoom = 4;
39+
}
40+
41+
MapLayer layer = new MapLayerNoise(seed); // this is initial land spread layer
42+
layer = new MapLayerWhittaker(seed + 1, layer, ClimateType.WARM_WET);
43+
layer = new MapLayerWhittaker(seed + 1, layer, ClimateType.COLD_DRY);
44+
layer = new MapLayerWhittaker(seed + 2, layer, ClimateType.LARGER_BIOMES);
45+
for (int i = 0; i < 2; i++) {
46+
layer = new MapLayerZoom(seed + 100 + i, layer, ZoomType.BLURRY);
47+
}
48+
for (int i = 0; i < 2; i++) {
49+
layer = new MapLayerErosion(seed + 3 + i, layer);
50+
}
51+
layer = new MapLayerDeepOcean(seed + 4, layer);
52+
53+
MapLayer layerMountains = new MapLayerBiomeVariation(seed + 200, layer);
54+
for (int i = 0; i < 2; i++) {
55+
layerMountains = new MapLayerZoom(seed + 200 + i, layerMountains);
56+
}
57+
58+
layer = new MapLayerBiome(seed + 5, layer);
59+
for (int i = 0; i < 2; i++) {
60+
layer = new MapLayerZoom(seed + 200 + i, layer);
61+
}
62+
layer = new MapLayerBiomeEdge(seed + 200, layer);
63+
layer = new MapLayerBiomeVariation(seed + 200, layer, layerMountains);
64+
layer = new MapLayerRarePlains(seed + 201, layer);
65+
layer = new MapLayerZoom(seed + 300, layer);
66+
layer = new MapLayerErosion(seed + 6, layer);
67+
layer = new MapLayerZoom(seed + 400, layer);
68+
layer = new MapLayerBiomeEdgeThin(seed + 400, layer);
69+
layer = new MapLayerShore(seed + 7, layer);
70+
for (int i = 0; i < zoom; i++) {
71+
layer = new MapLayerZoom(seed + 500 + i, layer);
72+
}
73+
74+
MapLayer layerRiver = layerMountains;
75+
layerRiver = new MapLayerZoom(seed + 300, layerRiver);
76+
layerRiver = new MapLayerZoom(seed + 400, layerRiver);
77+
for (int i = 0; i < zoom; i++) {
78+
layerRiver = new MapLayerZoom(seed + 500 + i, layerRiver);
79+
}
80+
layerRiver = new MapLayerRiver(seed + 10, layerRiver);
81+
layer = new MapLayerRiver(seed + 1000, layerRiver, layer);
82+
83+
MapLayer layerLowerRes = layer;
84+
for (int i = 0; i < 2; i++) {
85+
layer = new MapLayerZoom(seed + 2000 + i, layer);
86+
}
87+
88+
layer = new MapLayerSmooth(seed + 1001, layer);
89+
90+
return new MapLayer[]{layer, layerLowerRes};
91+
}
92+
93+
public void setCoordsSeed(int x, int z) {
94+
this.random.setSeed(this.seed);
95+
this.random.setSeed(x * this.random.nextInt() + z * this.random.nextInt() ^ this.seed);
96+
}
97+
98+
public int nextInt(int max) {
99+
return this.random.nextBoundedInt(max);
100+
}
101+
102+
public abstract int[] generateValues(int x, int z, int sizeX, int sizeZ);
103+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package worldgeneratorextension.vanillagenerator.biomegrid;
2+
3+
import cn.nukkit.level.biome.EnumBiome;
4+
5+
public class MapLayerBiome extends MapLayer {
6+
7+
private static final int[] WARM = new int[]{EnumBiome.DESERT.id, EnumBiome.DESERT.id, EnumBiome.DESERT.id, EnumBiome.SAVANNA.id, EnumBiome.SAVANNA.id, EnumBiome.PLAINS.id};
8+
private static final int[] WET = new int[]{EnumBiome.PLAINS.id, EnumBiome.PLAINS.id, EnumBiome.FOREST.id, EnumBiome.BIRCH_FOREST.id, EnumBiome.ROOFED_FOREST.id, EnumBiome.EXTREME_HILLS.id, EnumBiome.SWAMP.id};
9+
private static final int[] DRY = new int[]{EnumBiome.PLAINS.id, EnumBiome.FOREST.id, EnumBiome.TAIGA.id, EnumBiome.EXTREME_HILLS.id};
10+
private static final int[] COLD = new int[]{EnumBiome.ICE_PLAINS.id, EnumBiome.ICE_PLAINS.id, EnumBiome.COLD_TAIGA.id};
11+
private static final int[] WARM_LARGE = new int[]{EnumBiome.MESA_PLATEAU_F.id, EnumBiome.MESA_PLATEAU_F.id, EnumBiome.MESA_PLATEAU.id};
12+
private static final int[] DRY_LARGE = new int[]{EnumBiome.MEGA_TAIGA.id};
13+
private static final int[] WET_LARGE = new int[]{EnumBiome.JUNGLE.id, EnumBiome.JUNGLE.id, EnumBiome.BAMBOO_JUNGLE.id};
14+
15+
private final MapLayer belowLayer;
16+
17+
public MapLayerBiome(long seed, MapLayer belowLayer) {
18+
super(seed);
19+
this.belowLayer = belowLayer;
20+
}
21+
22+
@Override
23+
public int[] generateValues(int x, int z, int sizeX, int sizeZ) {
24+
int[] values = this.belowLayer.generateValues(x, z, sizeX, sizeZ);
25+
26+
int[] finalValues = new int[sizeX * sizeZ];
27+
for (int i = 0; i < sizeZ; i++) {
28+
for (int j = 0; j < sizeX; j++) {
29+
int val = values[j + i * sizeX];
30+
if (val != 0) {
31+
setCoordsSeed(x + j, z + i);
32+
switch (val) {
33+
case 1:
34+
val = DRY[nextInt(DRY.length)];
35+
break;
36+
case 2:
37+
val = WARM[nextInt(WARM.length)];
38+
break;
39+
case 3:
40+
case 1003:
41+
val = COLD[nextInt(COLD.length)];
42+
break;
43+
case 4:
44+
val = WET[nextInt(WET.length)];
45+
break;
46+
case 1001:
47+
val = DRY_LARGE[nextInt(DRY_LARGE.length)];
48+
break;
49+
case 1002:
50+
val = WARM_LARGE[nextInt(WARM_LARGE.length)];
51+
break;
52+
case 1004:
53+
val = WET_LARGE[nextInt(WET_LARGE.length)];
54+
break;
55+
default:
56+
break;
57+
}
58+
}
59+
finalValues[j + i * sizeX] = val;
60+
}
61+
}
62+
return finalValues;
63+
}
64+
}

0 commit comments

Comments
 (0)