* committing here because I made something cool and I don't want to lose it * adjusted height * better * good enough * good enough for now
221 lines
No EOL
6.2 KiB
JavaScript
221 lines
No EOL
6.2 KiB
JavaScript
// priority: 0
|
|
"use strict";
|
|
|
|
const $HeightMap = Java.loadClass("net.minecraft.world.level.levelgen.Heightmap")
|
|
const $ForestType = Java.loadClass("net.dries007.tfc.world.chunkdata.ForestType")
|
|
|
|
const ROCK_LAYER_HEIGHT = 40;
|
|
|
|
|
|
// Precompute the aquifer heights as constants as this is not used
|
|
let EMPTY_AQUIFER = [];
|
|
let aquifer_i = 0;
|
|
while (aquifer_i < 16) {
|
|
EMPTY_AQUIFER.push(32);
|
|
aquifer_i++;
|
|
}
|
|
|
|
|
|
// Bare minimum
|
|
TFCEvents.createChunkDataProvider('moon', event => {
|
|
const emptyLayer = TFC.misc.lerpFloatLayer(0, 0, 0, 0);
|
|
|
|
var heights = [];
|
|
for (let x = 0; x < 16; x++) {
|
|
for (let z = 0; z < 16; z++) {
|
|
heights[x + 16 * z] = 80;
|
|
}
|
|
}
|
|
|
|
event.partial((data, chunk) => {
|
|
data.generatePartial(emptyLayer, emptyLayer, 0, 0, 0)
|
|
})
|
|
event.full((data, chunk) => {
|
|
data.generateFull(heights, EMPTY_AQUIFER)
|
|
})
|
|
event.rocks((x, y, z, surfaceY, cache, rockLayers) => {
|
|
return rockLayers.sampleAtLayer(0, 0)
|
|
})
|
|
})
|
|
|
|
|
|
let tempLayer = TFC.misc.newOpenSimplex2D(4621678939469)
|
|
.octaves(2)
|
|
.spread(0.05)
|
|
.scaled(-10, 10)
|
|
let rainLayer = TFC.misc.newOpenSimplex2D(2846746456346)
|
|
.octaves(2)
|
|
.spread(0.05)
|
|
.scaled(-3, 3)
|
|
let forestDensityNoise = TFC.misc.newOpenSimplex2D(98713856895664)
|
|
.octaves(4)
|
|
.spread(0.0025)
|
|
.scaled(-0.2, 1.2)
|
|
.clamped(0, 1)
|
|
let forestWeirdnessNoise = TFC.misc.newOpenSimplex2D(3210378120)
|
|
.octaves(4)
|
|
.spread(0.0025)
|
|
.map(i => 1.1 * Math.abs(i))
|
|
.clamped(0, 1)
|
|
|
|
//TFC.misc.register2DNoiseForInspection('temp', tempLayer)
|
|
//TFC.misc.register2DNoiseForInspection('rain', rainLayer)
|
|
//TFC.misc.register2DNoiseForInspection('forestType', forestDensityNoise)
|
|
//TFC.misc.register2DNoiseForInspection('forestWeirdness', forestWeirdnessNoise)
|
|
|
|
// Forest layer
|
|
let forestLayerNoise = TFC.misc.newOpenSimplex2D(3210378120)
|
|
.octaves(2)
|
|
.spread(0.005)
|
|
.scaled(0, 1)
|
|
|
|
// Rock layer
|
|
const rockLayer = TFC.misc.uniformLayeredArea(413567326);
|
|
for (let i = 0; i < 3; i++) {
|
|
rockLayer.zoom(true, 19763144126).smooth(79784123632);
|
|
}
|
|
for (let i = 0; i < 6; i++) {
|
|
rockLayer.zoom(true, 451364589723);
|
|
}
|
|
rockLayer
|
|
.smooth(71214856214)
|
|
.zoom(true, 854126548632)
|
|
.smooth(145256147896)
|
|
|
|
|
|
TFCEvents.createChunkDataProvider('mars', event => {
|
|
event.partial((data, chunk) => {
|
|
let x = chunk.pos.minBlockX;
|
|
let z = chunk.pos.minBlockZ;
|
|
|
|
const avgTemp1 = calcAverage(z, global.MARS_PLANET_SIZE, global.MARS_MIN_AVG_TEMP, global.MARS_MAX_AVG_TEMP)
|
|
const avgTemp2 = calcAverage(z + 15, global.MARS_PLANET_SIZE, global.MARS_MIN_AVG_TEMP, global.MARS_MAX_AVG_TEMP)
|
|
const avgRain1 = calcAverage(x, global.MARS_PLANET_SIZE, global.MARS_MIN_AVG_RAIN, global.MARS_MAX_AVG_RAIN)
|
|
const avgRain2 = calcAverage(x + 15, global.MARS_PLANET_SIZE, global.MARS_MIN_AVG_RAIN, global.MARS_MAX_AVG_RAIN)
|
|
|
|
let rain = TFC.misc.lerpFloatLayer(
|
|
avgRain1 + rainLayer.noise(x, z),
|
|
avgRain1 + rainLayer.noise(x, z + 15),
|
|
avgRain2 + rainLayer.noise(x + 15, z),
|
|
avgRain2 + rainLayer.noise(x + 15, z + 15)
|
|
);
|
|
let temp = TFC.misc.lerpFloatLayer(
|
|
avgTemp1 + tempLayer.noise(x, z),
|
|
avgTemp1 + tempLayer.noise(x, z + 15),
|
|
avgTemp2 + tempLayer.noise(x + 15, z),
|
|
avgTemp2 + tempLayer.noise(x + 15, z + 15)
|
|
);
|
|
|
|
data.generatePartial(
|
|
rain,
|
|
temp,
|
|
floatToForestType(forestLayerNoise.noise(x, z)),
|
|
forestWeirdnessNoise.noise(x, z), // forest weirdness
|
|
forestDensityNoise.noise(x, z) // forest density
|
|
);
|
|
});
|
|
|
|
event.full((data, chunk) => {
|
|
let heights = [];
|
|
for (let z = 0; z < 16; z++) {
|
|
for (let x = 0; x < 16; x++) {
|
|
heights[x + 16 * z] = chunk.getHeight($HeightMap.Types.OCEAN_FLOOR_WG, x, z);
|
|
}
|
|
}
|
|
data.generateFull(heights, EMPTY_AQUIFER);
|
|
});
|
|
|
|
event.rocks((x, y, z, surfaceY, cache, rockSettings) => {
|
|
return rockSettings.sampleAtLayer(rockLayer.getAt(x, z), (surfaceY - y) / ROCK_LAYER_HEIGHT);
|
|
});
|
|
})
|
|
|
|
TFCEvents.createChunkDataProvider('glacio', event => {
|
|
event.partial((data, chunk) => {
|
|
let x = chunk.pos.minBlockX;
|
|
let z = chunk.pos.minBlockZ;
|
|
|
|
const avgTemp1 = calcAverage(z, global.GLACIO_PLANET_SIZE, 0, 100)
|
|
const avgTemp2 = calcAverage(z + 15, global.GLACIO_PLANET_SIZE, 0, 100)
|
|
const avgRain1 = calcAverage(x, global.GLACIO_PLANET_SIZE, 0, 100)
|
|
const avgRain2 = calcAverage(x + 15, global.GLACIO_PLANET_SIZE, 0, 100)
|
|
|
|
let rain = TFC.misc.lerpFloatLayer(
|
|
avgRain1 + rainLayer.noise(x, z),
|
|
avgRain1 + rainLayer.noise(x, z + 15),
|
|
avgRain2 + rainLayer.noise(x + 15, z),
|
|
avgRain2 + rainLayer.noise(x + 15, z + 15)
|
|
);
|
|
let temp = TFC.misc.lerpFloatLayer(
|
|
avgTemp1 + tempLayer.noise(x, z),
|
|
avgTemp1 + tempLayer.noise(x, z + 15),
|
|
avgTemp2 + tempLayer.noise(x + 15, z),
|
|
avgTemp2 + tempLayer.noise(x + 15, z + 15)
|
|
);
|
|
|
|
data.generatePartial(
|
|
rain,
|
|
temp,
|
|
floatToForestType(forestLayerNoise.noise(x, z)),
|
|
forestWeirdnessNoise.noise(x, z), // forest weirdness
|
|
forestDensityNoise.noise(x, z) // forest density
|
|
);
|
|
});
|
|
|
|
event.full((data, chunk) => {
|
|
let heights = [];
|
|
for (let z = 0; z < 16; z++) {
|
|
for (let x = 0; x < 16; x++) {
|
|
heights[x + 16 * z] = chunk.getHeight($HeightMap.Types.OCEAN_FLOOR_WG, x, z);
|
|
}
|
|
}
|
|
data.generateFull(heights, EMPTY_AQUIFER);
|
|
});
|
|
|
|
event.rocks((x, y, z, surfaceY, cache, rockSettings) => {
|
|
return rockSettings.sampleAtLayer(rockLayer.getAt(x, z), (surfaceY - y) / ROCK_LAYER_HEIGHT);
|
|
});
|
|
})
|
|
|
|
/**
|
|
* @param {number} playerZ The current Z level of the player
|
|
* @param {number} scale The size of the planet, from the south pole to the north (20k on earth with default TFC settings)
|
|
* @param {number} min The average value at the poles
|
|
* @param {number} max The average value at the equator
|
|
* @returns {number}
|
|
*/
|
|
function calcAverage(playerZ, scale, min, max) {
|
|
|
|
let relative = (playerZ / (scale * -1)) + 0.5;
|
|
|
|
// relative is now 1 for peak -z, 0 for peak +z
|
|
|
|
let smoothed = Math.cos(relative * JavaMath.PI);
|
|
|
|
// smoothed is now -1 for peak -z, 1 for peak +z
|
|
|
|
let halfDiff = (min - max) / -2;
|
|
|
|
let temp = (smoothed * halfDiff) - (halfDiff - max);
|
|
|
|
return temp;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param {number} float A number between 0 and 1
|
|
* @returns {$ForestType}
|
|
*/
|
|
// Rhino moment
|
|
function floatToForestType(float) {
|
|
if (float < 0.2)
|
|
return $ForestType.OLD_GROWTH;
|
|
else if (float < 0.4)
|
|
return $ForestType.NORMAL;
|
|
else if (float < 0.6)
|
|
return $ForestType.EDGE;
|
|
else if (float < 0.8)
|
|
return $ForestType.SPARSE;
|
|
else
|
|
return $ForestType.NONE;
|
|
} |