Height shader and snow blocks work.

This commit is contained in:
Harrison Deng 2020-05-03 11:42:24 -05:00
parent d4c0fa259c
commit 1db4811d66
3 changed files with 27 additions and 18 deletions

View File

@ -11,6 +11,7 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -83,25 +84,24 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene
Biome[] currentBiomeSet = biomeSet[localX][localZ];
int terrainHeight = heightShader.getTerrainHeight(worldX, worldZ, currentBiomeSet);
int currentTerrainHeight = terrainHeight;
int currentTerrainHeight = terrainHeight - 1;
int bedrockHeight = random.nextInt(5) + 1;
if (layerShader.hasSpecialLayers(currentBiomeSet[0])) {
Material currentMaterial = layerShader.getMaterialForHeight(worldX, worldZ, currentTerrainHeight, terrainHeight, currentBiomeSet[0]);
BlockData currentMaterial = layerShader.getMaterialForHeight(worldX, worldZ, currentTerrainHeight, terrainHeight - 1, currentBiomeSet[0]);
while (currentMaterial != null) {
chunkData.setBlock(localX, currentTerrainHeight, localZ, currentMaterial);
currentTerrainHeight --;
currentMaterial = layerShader.getMaterialForHeight(worldX, worldZ, currentTerrainHeight, terrainHeight, currentBiomeSet[0]);
currentTerrainHeight--;
currentMaterial = layerShader.getMaterialForHeight(worldX, worldZ, currentTerrainHeight, terrainHeight - 1, currentBiomeSet[0]);
}
} else {
int surfaceThickness = layerShader.getSurfaceThickness(worldX, worldZ, currentBiomeSet[0]);
currentTerrainHeight -= surfaceThickness;
chunkData.setRegion(localX, currentTerrainHeight, localZ, localX + 1, currentTerrainHeight + surfaceThickness, localZ + 1, layerShader.getSurfaceMaterial(currentBiomeSet[0]));
currentTerrainHeight = currentTerrainHeight - surfaceThickness;
chunkData.setRegion(localX, currentTerrainHeight, localZ, localX + 1, currentTerrainHeight + surfaceThickness + 1, localZ + 1, layerShader.getSurfaceMaterial(currentBiomeSet[0]));
int transitionThickness = layerShader.getTransitionMaterialThickness(worldX, worldZ, currentBiomeSet[0]);
currentTerrainHeight -= transitionThickness;
chunkData.setRegion(localX, currentTerrainHeight, localZ, localX + 1, currentTerrainHeight + transitionThickness, localZ + 1, layerShader.getTransitionMaterial(currentBiomeSet[0]));
currentTerrainHeight = currentTerrainHeight - transitionThickness;
chunkData.setRegion(localX, currentTerrainHeight, localZ, localX + 1, currentTerrainHeight + transitionThickness + 1, localZ + 1, layerShader.getTransitionMaterial(currentBiomeSet[0]));
}
chunkData.setRegion(localX, bedrockHeight, localZ, localX + 1, currentTerrainHeight + 1, localZ + 1, Material.STONE);
if (terrainHeight < seaLevel) {
chunkData.setRegion(localX, terrainHeight, localZ, localX + 1, seaLevel, localZ + 1, Material.WATER);
}

View File

@ -34,6 +34,8 @@ public class WorldHeightShader {
height = getIslandBiomeHeight(worldX, worldZ, biomeSet[0]) + 1;
}
if (biomeName.contains("snowy")) height++;
if (height > worldHeight) throw new IllegalStateException("Resulting height is greater than world height! Biome this occurred on: " + biomeName);
height = Math.max(minimumHeight, height);
return height;
@ -57,7 +59,6 @@ public class WorldHeightShader {
} else {
res = (int) calculateTerrainFactor(worldX, worldZ, 35d);
}
return res;
}

View File

@ -4,6 +4,8 @@ import java.util.Random;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Snowable;
import ca.recrown.islandsurvivalcraft.world.IslandWorldMapper;
@ -46,7 +48,7 @@ public class WorldLayerShader {
* @param biome the associated biome.
* @return the material for the layer. Returning null means no more special layers.
*/
public Material getMaterialForHeight(int worldX, int worldZ, int y, int highestPoint, Biome biome) {
public BlockData getMaterialForHeight(int worldX, int worldZ, int y, int highestPoint, Biome biome) {
String biomeName = biome.toString().toLowerCase();
if (biomeName.contains("badlands")) {
int seedOffset = (worldX + worldZ) / 1000;
@ -62,18 +64,24 @@ public class WorldLayerShader {
for (int i = 0; i < selected.length; i++) {
selected[i] = badlandTerrocota[random.nextInt(amountOfLayers)];
}
return selected[subLayer];
return selected[subLayer].createBlockData();
} else {
return Material.TERRACOTTA;
return Material.TERRACOTTA.createBlockData();
}
}
} else if (biomeName.contains("snowy")) {
if (highestPoint == y) {
return Material.SNOW;
} else if (y >= highestPoint - getSurfaceThickness(worldX, worldZ, biome)) {
return getSurfaceMaterial(biome);
} else if (y >= highestPoint - getTransitionMaterialThickness(worldX, worldZ, biome)) {
return getTransitionMaterial(biome);
return Material.SNOW.createBlockData();
} else if (y > highestPoint - 1 - getSurfaceThickness(worldX, worldZ, biome)) {
Material surfaceMaterial = getSurfaceMaterial(biome);
BlockData res = surfaceMaterial.createBlockData();
if (getSurfaceMaterial(biome) == Material.GRASS_BLOCK) {
Snowable snowable = (Snowable) res;
snowable.setSnowy(true);
}
return res;
} else if (y > highestPoint - 1 - getSurfaceThickness(worldX, worldZ, biome) - getTransitionMaterialThickness(worldX, worldZ, biome)) {
return getTransitionMaterial(biome).createBlockData();
}
}
return null;