Basic terrain generator implemented.
Needs fine tuning.
This commit is contained in:
parent
784edb0ecf
commit
1dbb329dc1
@ -1,5 +1,8 @@
|
|||||||
package ca.recrown.islandsurvivalcraft;
|
package ca.recrown.islandsurvivalcraft;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
@ -8,6 +11,7 @@ import nl.rutgerkok.worldgeneratorapi.WorldGeneratorApi;
|
|||||||
import nl.rutgerkok.worldgeneratorapi.WorldRef;
|
import nl.rutgerkok.worldgeneratorapi.WorldRef;
|
||||||
|
|
||||||
public class IslandSurvivalCraft extends JavaPlugin {
|
public class IslandSurvivalCraft extends JavaPlugin {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
@ -20,13 +24,12 @@ public class IslandSurvivalCraft extends JavaPlugin {
|
|||||||
super.onDisable();
|
super.onDisable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
|
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
|
||||||
WorldGeneratorApi worldGenAPI = WorldGeneratorApi.getInstance(this, 0, 1);
|
WorldGeneratorApi worldGenAPI = WorldGeneratorApi.getInstance(this, 0, 1);
|
||||||
|
|
||||||
return worldGenAPI.createCustomGenerator(WorldRef.ofName(worldName), gen -> {
|
return worldGenAPI.createCustomGenerator(WorldRef.ofName(worldName), gen -> {
|
||||||
gen.setBaseTerrainGenerator(new IslandBaseTerrainGenerator(getServer().getWorld(worldName).getSeed(), 63, 20, 73));
|
World world = getServer().getWorld(worldName);
|
||||||
|
gen.setBaseTerrainGenerator(new IslandBaseTerrainGenerator(world));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,44 +3,54 @@ package ca.recrown.islandsurvivalcraft.worldgen;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
import org.bukkit.util.noise.PerlinOctaveGenerator;
|
import org.bukkit.util.noise.SimplexOctaveGenerator;
|
||||||
|
|
||||||
import nl.rutgerkok.worldgeneratorapi.BaseTerrainGenerator;
|
import nl.rutgerkok.worldgeneratorapi.BaseTerrainGenerator;
|
||||||
|
import nl.rutgerkok.worldgeneratorapi.BaseNoiseGenerator.TerrainSettings;
|
||||||
|
|
||||||
public class IslandBaseTerrainGenerator implements BaseTerrainGenerator {
|
public class IslandBaseTerrainGenerator implements BaseTerrainGenerator {
|
||||||
private int seaLevel;
|
private TerrainSettings settings;
|
||||||
private int minimumHeight;
|
private SimplexOctaveGenerator baseNoiseGenerator;
|
||||||
private int maximumHeight;
|
private SimplexOctaveGenerator islandShapeGenerator;
|
||||||
|
private final int scale = 100;
|
||||||
|
private final int maximumHeight = 65;
|
||||||
|
private final int minimumHeight = 3;
|
||||||
|
private Random random;
|
||||||
|
private World world;
|
||||||
|
|
||||||
private PerlinOctaveGenerator noiseGenerator;
|
public IslandBaseTerrainGenerator(World world) {
|
||||||
|
this.random = new Random(world.getSeed());
|
||||||
|
this.baseNoiseGenerator = new SimplexOctaveGenerator(random, 8);
|
||||||
|
this.baseNoiseGenerator.setScale(0.015D);
|
||||||
|
this.islandShapeGenerator = new SimplexOctaveGenerator(random, 8);
|
||||||
|
this.islandShapeGenerator.setScale(0.02D);
|
||||||
|
this.settings = new TerrainSettings();
|
||||||
|
this.settings.seaLevel = world.getSeaLevel();
|
||||||
|
|
||||||
public IslandBaseTerrainGenerator(long seed, int seaLevel, int seaFloor, int maximumHeight) {
|
this.world = world;
|
||||||
Random random = new Random(seed);
|
|
||||||
this.seaLevel = seaLevel;
|
|
||||||
this.minimumHeight = seaFloor;
|
|
||||||
this.maximumHeight = maximumHeight;
|
|
||||||
|
|
||||||
this.noiseGenerator = new PerlinOctaveGenerator(random, 8);
|
|
||||||
noiseGenerator.setScale(0.025D);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBlocksInChunk(GeneratingChunk chunk) {
|
public void setBlocksInChunk(GeneratingChunk chunk) {
|
||||||
|
|
||||||
for (int x = 0; x < 16; x++)
|
for (int x = 0; x < 16; x++)
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
int worldX = 16 * chunk.getChunkX() + x;
|
int worldX = 16 * chunk.getChunkX() + x;
|
||||||
int worldZ = 16 * chunk.getChunkZ() + z;
|
int worldZ = 16 * chunk.getChunkZ() + z;
|
||||||
|
|
||||||
int height = baseHeight(worldX, worldZ);
|
int height = baseHeight(worldX, worldZ);
|
||||||
|
Biome biome = chunk.getBiomesForChunk().getBiome(x, height, z);
|
||||||
|
height += additionalHeight(worldX, worldZ, biome);
|
||||||
fillChunkColumn(x, z, height, chunk.getBlocksForChunk());
|
fillChunkColumn(x, z, height, chunk.getBlocksForChunk());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void fillChunkColumn(int x, int z, int height, ChunkData chunkData) {
|
private void fillChunkColumn(int x, int z, int height, ChunkData chunkData) {
|
||||||
if (height <= seaLevel) {
|
if (height <= settings.seaLevel) {
|
||||||
chunkData.setRegion(x, height, z, x+1, seaLevel, z+1, Material.WATER);
|
chunkData.setRegion(x, height, z, x+1, settings.seaLevel, z+1, Material.WATER);
|
||||||
chunkData.setRegion(x, 0, z, x+1, height, z+1, Material.STONE);
|
chunkData.setRegion(x, 0, z, x+1, height, z+1, Material.STONE);
|
||||||
} else {
|
} else {
|
||||||
chunkData.setRegion(x, 0, z, x+1, height, z+1, Material.STONE);
|
chunkData.setRegion(x, 0, z, x+1, height, z+1, Material.STONE);
|
||||||
@ -48,16 +58,44 @@ public class IslandBaseTerrainGenerator implements BaseTerrainGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int baseHeight(int x, int z) {
|
private int baseHeight(int x, int z) {
|
||||||
return (int) ((noiseGenerator.noise(x, z, 0.5D, 0.5D, true) + 1D) * maximumHeight/2D) + minimumHeight;
|
return Math.min((int) ((baseNoiseGenerator.noise(x, z, 0.3D, 0.6D, true) + 1D) * scale/2D) + minimumHeight, maximumHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int additionalHeight(int worldX, int worldZ, Biome biome) {
|
||||||
|
int height = 0;
|
||||||
|
String biomeName = biome.name();
|
||||||
|
if (biomeName.contains("hills")) {
|
||||||
|
height += islandHeight(worldX, worldZ, 0.5D, 0.5D, 15);
|
||||||
|
} else if (biomeName.contains("mountains")) {
|
||||||
|
height += islandHeight(worldX, worldZ, 0.5D, 0.5D, 60);
|
||||||
|
} else if (biomeName.contains("plateau")) {
|
||||||
|
height *= 1.2f;
|
||||||
|
height += Math.min(55, islandHeight(worldX, worldZ, 0.3D, 0.3D, 5));
|
||||||
|
} else if (biomeName.contains("modified")) {
|
||||||
|
height += islandHeight(worldX, worldZ, 0.5D, 0.5D, 20);
|
||||||
|
} else if (biomeName.contains("shattered")) {
|
||||||
|
height += islandHeight(worldX, worldZ, 0.5D, 0.5D, 20);
|
||||||
|
} else if (biomeName.contains("tall")) {
|
||||||
|
height += islandHeight(worldX, worldZ, 0.5D, 0.5D, 30);
|
||||||
|
} else {
|
||||||
|
height += islandHeight(worldX, worldZ, 0.5D, 0.5D, 8);
|
||||||
|
}
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int islandHeight(int x, int z, double freq, double amp, int maximumHeight) {
|
||||||
|
return (int) ((islandShapeGenerator.noise(x, z, 0.5D, 0.5D, true) + 1D) * maximumHeight/2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getHeight(int x, int z, HeightType type) {
|
public int getHeight(int x, int z, HeightType type) {
|
||||||
int baseHeight = baseHeight(x, z);
|
// TODO FIX THIS. Innacurate readings. Due to innacurate biomes.
|
||||||
if (baseHeight <= seaLevel && type == HeightType.WORLD_SURFACE) {
|
Biome biome = world.getBiome(x, settings.seaLevel, z);
|
||||||
return seaLevel;
|
int totalHeight = additionalHeight(x, z, biome) + baseHeight(x, z);
|
||||||
|
if (totalHeight <= settings.seaLevel && type == HeightType.OCEAN_FLOOR) {
|
||||||
|
return totalHeight;
|
||||||
}
|
}
|
||||||
return baseHeight;
|
return totalHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package ca.recrown.islandsurvivalcraft.worldgen;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||||
|
import org.bukkit.util.noise.SimplexOctaveGenerator;
|
||||||
|
|
||||||
|
import nl.rutgerkok.worldgeneratorapi.BaseNoiseGenerator;
|
||||||
|
import nl.rutgerkok.worldgeneratorapi.BiomeGenerator;
|
||||||
|
|
||||||
|
public class IslandNoiseGenerator implements BaseNoiseGenerator {
|
||||||
|
private TerrainSettings settings;
|
||||||
|
private SimplexOctaveGenerator baseNoiseGenerator;
|
||||||
|
private final int maximumHeight = 78;
|
||||||
|
private final int minimumHeight = 3;
|
||||||
|
|
||||||
|
public IslandNoiseGenerator(TerrainSettings settings, Random random) {
|
||||||
|
this.baseNoiseGenerator = new SimplexOctaveGenerator(random, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getNoise(BiomeGenerator biomeGenerator, double[] buffer, int x4, int z4) {
|
||||||
|
for (int multiple = 0; multiple < buffer.length; multiple++) {
|
||||||
|
for (int x = 0; x < 4; x++)
|
||||||
|
for (int z = 0; z < 4; z++) {
|
||||||
|
int xBlock = x4 + x;
|
||||||
|
int zBlock = z4 + z;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillChunkColumn(int x, int z, int height, ChunkData chunkData) {
|
||||||
|
if (height <= settings.seaLevel) {
|
||||||
|
chunkData.setRegion(x, height, z, x+1, settings.seaLevel, z+1, Material.WATER);
|
||||||
|
chunkData.setRegion(x, 0, z, x+1, height, z+1, Material.STONE);
|
||||||
|
} else {
|
||||||
|
chunkData.setRegion(x, 0, z, x+1, height, z+1, Material.STONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int baseHeight(int x, int z) {
|
||||||
|
return (int) ((baseNoiseGenerator.noise(x, z, 0.5D, 0.5D, true) + 1D) * maximumHeight/2D) + minimumHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
#Minecraft server properties
|
#Minecraft server properties
|
||||||
#Sun Apr 19 00:42:51 CDT 2020
|
#Sun Apr 19 03:02:41 CDT 2020
|
||||||
spawn-protection=16
|
spawn-protection=16
|
||||||
max-tick-time=60000
|
max-tick-time=60000
|
||||||
query.port=25565
|
query.port=25565
|
||||||
@ -38,10 +38,10 @@ spawn-animals=true
|
|||||||
white-list=false
|
white-list=false
|
||||||
rcon.password=
|
rcon.password=
|
||||||
generate-structures=true
|
generate-structures=true
|
||||||
online-mode=true
|
|
||||||
max-build-height=256
|
max-build-height=256
|
||||||
|
online-mode=true
|
||||||
level-seed=
|
level-seed=
|
||||||
prevent-proxy-connections=false
|
|
||||||
use-native-transport=true
|
use-native-transport=true
|
||||||
motd=A Minecraft Server
|
prevent-proxy-connections=false
|
||||||
enable-rcon=false
|
enable-rcon=false
|
||||||
|
motd=A Minecraft Server
|
||||||
|
Loading…
x
Reference in New Issue
Block a user