Try to make climate layer generation more robust (and catch an annoying bug)
This commit is contained in:
parent
406dd93a2f
commit
553641d9bb
4 changed files with 39 additions and 19 deletions
|
@ -128,7 +128,7 @@ public class BiomeProviderBOP extends BiomeProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
// superimpose hot and cold regions an a land and sea layer
|
// superimpose hot and cold regions an a land and sea layer
|
||||||
public static GenLayer climateLayer(BOPWorldSettings settings, long worldSeed)
|
public static GenLayerClimate climateLayer(BOPWorldSettings settings, long worldSeed)
|
||||||
{
|
{
|
||||||
GenLayer temperature;
|
GenLayer temperature;
|
||||||
switch(settings.tempScheme)
|
switch(settings.tempScheme)
|
||||||
|
@ -167,12 +167,12 @@ public class BiomeProviderBOP extends BiomeProvider
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GenLayer climate = new GenLayerClimate(103L, temperature, rainfall);
|
GenLayerClimate climate = new GenLayerClimate(103L, temperature, rainfall);
|
||||||
// stack = new GenLayerEdge(3L, stack, GenLayerEdge.Mode.SPECIAL);
|
// stack = new GenLayerEdge(3L, stack, GenLayerEdge.Mode.SPECIAL);
|
||||||
return climate;
|
return climate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GenLayer allocateBiomes(long worldSeed, BOPWorldSettings settings, GenLayer mainBranch, GenLayer subBiomesInit, GenLayer climateLayer)
|
public static GenLayer allocateBiomes(long worldSeed, BOPWorldSettings settings, GenLayer mainBranch, GenLayer subBiomesInit, GenLayerClimate climateLayer)
|
||||||
{
|
{
|
||||||
// allocate the basic biomes
|
// allocate the basic biomes
|
||||||
GenLayer biomesLayer = new GenLayerBiomeBOP(200L, mainBranch, climateLayer, settings);
|
GenLayer biomesLayer = new GenLayerBiomeBOP(200L, mainBranch, climateLayer, settings);
|
||||||
|
@ -180,16 +180,16 @@ public class BiomeProviderBOP extends BiomeProvider
|
||||||
// magnify everything (using the same seed)
|
// magnify everything (using the same seed)
|
||||||
biomesLayer = new GenLayerZoom(1000L, biomesLayer);
|
biomesLayer = new GenLayerZoom(1000L, biomesLayer);
|
||||||
subBiomesInit = new GenLayerZoom(1000L, subBiomesInit);
|
subBiomesInit = new GenLayerZoom(1000L, subBiomesInit);
|
||||||
climateLayer = new GenLayerZoom(1000L, climateLayer);
|
GenLayer climateLayerZoomed = new GenLayerZoom(1000L, climateLayer);
|
||||||
|
|
||||||
// add medium islands
|
// add medium islands
|
||||||
switch(settings.landScheme)
|
switch(settings.landScheme)
|
||||||
{
|
{
|
||||||
case ARCHIPELAGO:
|
case ARCHIPELAGO:
|
||||||
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayer, 4);
|
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayerZoomed, 4);
|
||||||
break;
|
break;
|
||||||
case CONTINENTS:
|
case CONTINENTS:
|
||||||
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayer, 60);
|
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayerZoomed, 60);
|
||||||
break;
|
break;
|
||||||
case VANILLA: default:
|
case VANILLA: default:
|
||||||
break;
|
break;
|
||||||
|
@ -198,7 +198,7 @@ public class BiomeProviderBOP extends BiomeProvider
|
||||||
// magnify everything again (using the same seed)
|
// magnify everything again (using the same seed)
|
||||||
biomesLayer = new GenLayerZoom(1000L, biomesLayer);
|
biomesLayer = new GenLayerZoom(1000L, biomesLayer);
|
||||||
subBiomesInit = new GenLayerZoom(1000L, subBiomesInit);
|
subBiomesInit = new GenLayerZoom(1000L, subBiomesInit);
|
||||||
climateLayer = new GenLayerZoom(1000L, climateLayer);
|
climateLayerZoomed = new GenLayerZoom(1000L, climateLayerZoomed);
|
||||||
|
|
||||||
// add edge biomes
|
// add edge biomes
|
||||||
biomesLayer = new GenLayerBiomeEdgeBOP(1000L, biomesLayer);
|
biomesLayer = new GenLayerBiomeEdgeBOP(1000L, biomesLayer);
|
||||||
|
@ -210,13 +210,13 @@ public class BiomeProviderBOP extends BiomeProvider
|
||||||
switch(settings.landScheme)
|
switch(settings.landScheme)
|
||||||
{
|
{
|
||||||
case ARCHIPELAGO:
|
case ARCHIPELAGO:
|
||||||
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayer, 8);
|
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayerZoomed, 8);
|
||||||
break;
|
break;
|
||||||
case CONTINENTS:
|
case CONTINENTS:
|
||||||
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayer, 60);
|
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayerZoomed, 60);
|
||||||
break;
|
break;
|
||||||
case VANILLA: default:
|
case VANILLA: default:
|
||||||
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayer, 12);
|
biomesLayer = new GenLayerBiomeIslands(15L, biomesLayer, climateLayerZoomed, 12);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ public class BiomeProviderBOP extends BiomeProvider
|
||||||
GenLayer riversAndSubBiomesInit = new GenLayerRiverInit(100L, mainBranch);
|
GenLayer riversAndSubBiomesInit = new GenLayerRiverInit(100L, mainBranch);
|
||||||
|
|
||||||
// create climate layer
|
// create climate layer
|
||||||
GenLayer climateLayer = climateLayer(settings, worldSeed);
|
GenLayerClimate climateLayer = climateLayer(settings, worldSeed);
|
||||||
|
|
||||||
// allocate the biomes
|
// allocate the biomes
|
||||||
mainBranch = allocateBiomes(worldSeed, settings, mainBranch, riversAndSubBiomesInit, climateLayer);
|
mainBranch = allocateBiomes(worldSeed, settings, mainBranch, riversAndSubBiomesInit, climateLayer);
|
||||||
|
|
|
@ -23,9 +23,9 @@ public class GenLayerBiomeBOP extends BOPGenLayer
|
||||||
|
|
||||||
private BOPWorldSettings settings;
|
private BOPWorldSettings settings;
|
||||||
private GenLayer landMassLayer;
|
private GenLayer landMassLayer;
|
||||||
private GenLayer climateLayer;
|
private GenLayerClimate climateLayer;
|
||||||
|
|
||||||
public GenLayerBiomeBOP(long seed, GenLayer landMassLayer, GenLayer climateLayer, BOPWorldSettings settings)
|
public GenLayerBiomeBOP(long seed, GenLayer landMassLayer, GenLayerClimate climateLayer, BOPWorldSettings settings)
|
||||||
{
|
{
|
||||||
super(seed);
|
super(seed);
|
||||||
this.landMassLayer = landMassLayer;
|
this.landMassLayer = landMassLayer;
|
||||||
|
@ -51,7 +51,18 @@ public class GenLayerBiomeBOP extends BOPGenLayer
|
||||||
int index = z + x * areaWidth;
|
int index = z + x * areaWidth;
|
||||||
this.initChunkSeed((long)(z + areaX), (long)(x + areaY));
|
this.initChunkSeed((long)(z + areaX), (long)(x + areaY));
|
||||||
int landSeaVal = landSeaValues[index];
|
int landSeaVal = landSeaValues[index];
|
||||||
BOPClimates climate = BOPClimates.lookup(climateValues[index]);
|
int climateOrdinal = climateValues[index];
|
||||||
|
|
||||||
|
BOPClimates climate;
|
||||||
|
try {
|
||||||
|
climate = BOPClimates.lookup(climateOrdinal);
|
||||||
|
} catch (java.lang.ArrayIndexOutOfBoundsException e) {
|
||||||
|
// This shouldn't happen - but apparently it (rarely) does (https://github.com/Glitchfiend/BiomesOPlenty/issues/983)
|
||||||
|
// If it does it means that something weird happened with the climate layer / lookup
|
||||||
|
// Rethrow with hopefully a more useful message
|
||||||
|
String msg = "Climate lookup failed climateOrdinal: " + climateOrdinal + " climate layer mapping: " + climateLayer.debugClimateMappingInts();
|
||||||
|
throw new java.lang.RuntimeException(msg,e);
|
||||||
|
}
|
||||||
|
|
||||||
// At this point, oceans and land have been assigned, and so have mushroom islands
|
// At this point, oceans and land have been assigned, and so have mushroom islands
|
||||||
if (landSeaVal == Biome.getIdForBiome(Biomes.DEEP_OCEAN))
|
if (landSeaVal == Biome.getIdForBiome(Biomes.DEEP_OCEAN))
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package biomesoplenty.common.world.layer;
|
package biomesoplenty.common.world.layer;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import biomesoplenty.api.enums.BOPClimates;
|
import biomesoplenty.api.enums.BOPClimates;
|
||||||
import biomesoplenty.api.generation.BOPGenLayer;
|
import biomesoplenty.api.generation.BOPGenLayer;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
@ -28,13 +30,20 @@ public class GenLayerClimate extends BOPGenLayer {
|
||||||
|
|
||||||
for (int i = 0; i < areaWidth * areaHeight; ++i)
|
for (int i = 0; i < areaWidth * areaHeight; ++i)
|
||||||
{
|
{
|
||||||
int index = (temperatureValues[i] * 12) + rainfallValues[i];
|
|
||||||
|
|
||||||
// temperature values from 0 (cold) to 8 (hot) and rainfall values from 0 (wet) to 11 (dry), index is (temperatureValue * 12) + rainfallValue
|
// temperature values from 0 (cold) to 8 (hot) and rainfall values from 0 (wet) to 11 (dry), index is (temperatureValue * 12) + rainfallValue
|
||||||
// index is clamped to account for potential rounding errors due to use of doubles/floats
|
// clamp as a precaution against potential rounding errors due to use of doubles/floats in noise calculations
|
||||||
out[i] = this.climateMapping[MathHelper.clamp(index, 0, this.climateMapping.length - 1)];
|
// this guarantees index is between 0 and 108 (= 9 * 12), the range of indexes in BOPClimates.getClimateMappingInts()
|
||||||
|
int index = ( MathHelper.clamp(temperatureValues[i], 0, 8) * 12 ) + MathHelper.clamp(rainfallValues[i], 0, 11);
|
||||||
|
|
||||||
|
out[i] = this.climateMapping[index];
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// debug method added to assist in troubleshooting a specific bug (https://github.com/Glitchfiend/BiomesOPlenty/issues/983)
|
||||||
|
public String debugClimateMappingInts()
|
||||||
|
{
|
||||||
|
return Arrays.toString(this.climateMapping);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ public class GenLayerTemperatureLatitude extends BOPGenLayer
|
||||||
|
|
||||||
this.initChunkSeed((long)X, (long)Y);
|
this.initChunkSeed((long)X, (long)Y);
|
||||||
|
|
||||||
// set value between 1 and 4 which is periodic in Y (with some random variation)
|
// set value between 0 and 8 which is periodic in Y (with some random variation)
|
||||||
// ocean generally stays as ocean, unless it's ICY when it becomes frozen ocean
|
// ocean generally stays as ocean, unless it's ICY when it becomes frozen ocean
|
||||||
double Yoffset = Y + this.offset + ((this.nextInt(1001) - 500) * this.offsetVariation / 500.0D);
|
double Yoffset = Y + this.offset + ((this.nextInt(1001) - 500) * this.offsetVariation / 500.0D);
|
||||||
out[x + y * areaWidth] = MathHelper.floor(this.amplitude * Math.abs((Math.abs(Yoffset % period) - halfPeriod)));
|
out[x + y * areaWidth] = MathHelper.floor(this.amplitude * Math.abs((Math.abs(Yoffset % period) - halfPeriod)));
|
||||||
|
|
Loading…
Reference in a new issue