2025-08-05 13:37:51 +02:00
|
|
|
package server.worldgen.replacer;
|
2025-07-22 21:20:06 +02:00
|
|
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
|
|
|
import common.block.natural.BlockColoredClay;
|
2025-07-24 22:49:22 +02:00
|
|
|
import common.dimension.Dimension;
|
2025-07-22 21:20:06 +02:00
|
|
|
import common.init.Blocks;
|
|
|
|
import common.rng.Random;
|
|
|
|
import common.world.State;
|
2025-07-24 22:49:22 +02:00
|
|
|
import server.dimension.GeneratorData;
|
|
|
|
import server.rng.PerlinGen;
|
2025-07-22 21:20:06 +02:00
|
|
|
import server.world.WorldServer;
|
2025-08-05 13:37:51 +02:00
|
|
|
import server.worldgen.ChunkPrimer;
|
2025-07-22 21:20:06 +02:00
|
|
|
|
|
|
|
public class ReplacerMesa extends ReplacerBiome
|
|
|
|
{
|
|
|
|
private final State[] layers;
|
2025-07-24 22:49:22 +02:00
|
|
|
private PerlinGen baseBryceGen;
|
|
|
|
private PerlinGen highBryceGen;
|
|
|
|
private PerlinGen clayColorGen;
|
|
|
|
private PerlinGen soilGen;
|
|
|
|
private PerlinGen peakGen;
|
2025-07-22 21:20:06 +02:00
|
|
|
private final State surface;
|
|
|
|
|
2025-07-24 22:49:22 +02:00
|
|
|
public ReplacerMesa(State surface) {
|
2025-07-22 21:20:06 +02:00
|
|
|
this.layers = new State[64];
|
|
|
|
Arrays.fill(this.layers, Blocks.hardened_clay.getState());
|
2025-07-24 22:49:22 +02:00
|
|
|
this.surface = surface;
|
|
|
|
}
|
|
|
|
|
|
|
|
public State getTop() {
|
|
|
|
return Blocks.dirt.getState();
|
|
|
|
}
|
|
|
|
|
|
|
|
public State getSurface() {
|
|
|
|
return this.surface;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void init(Random rand, Dimension dim, GeneratorData gen) {
|
|
|
|
super.init(rand, dim, gen);
|
2025-07-22 21:20:06 +02:00
|
|
|
this.clayColorGen = new PerlinGen(rand, 1);
|
|
|
|
this.baseBryceGen = new PerlinGen(rand, 4);
|
|
|
|
this.highBryceGen = new PerlinGen(rand, 1);
|
2025-07-22 23:59:00 +02:00
|
|
|
this.soilGen = new PerlinGen(rand, 8);
|
|
|
|
this.peakGen = new PerlinGen(rand, 8);
|
2025-07-22 21:20:06 +02:00
|
|
|
this.setupLayers(rand);
|
|
|
|
}
|
|
|
|
|
|
|
|
private State getBlockAt(int x, int y, int z)
|
|
|
|
{
|
|
|
|
int i = (int)Math.round(this.clayColorGen.generate((double)x * 1.0D / 512.0D, (double)x * 1.0D / 512.0D) * 2.0D);
|
|
|
|
return this.layers[(y + i + 64) % 64];
|
|
|
|
}
|
|
|
|
|
|
|
|
public void genTerrainBlocks(WorldServer world, Random rand, ChunkPrimer primer, int x, int z, double noise)
|
|
|
|
{
|
2025-07-23 16:04:55 +02:00
|
|
|
boolean soil = this.soilGen.generate((double)((x & ~15) | (z & 15)) * 0.5D, (double)((z & ~15) | (x & 15)) * 0.5D) > 0.1;
|
|
|
|
boolean peak = this.peakGen.generate((double)((x & ~15) | (z & 15)) * 0.5D, (double)((z & ~15) | (x & 15)) * 0.5D) > 0.1;
|
2025-07-22 23:59:00 +02:00
|
|
|
|
2025-07-22 21:20:06 +02:00
|
|
|
double d4 = 0.0D;
|
|
|
|
|
2025-07-22 23:59:00 +02:00
|
|
|
if (peak)
|
2025-07-22 21:20:06 +02:00
|
|
|
{
|
|
|
|
int i = (x & -16) + (z & 15);
|
|
|
|
int j = (z & -16) + (x & 15);
|
|
|
|
double d0 = Math.min(Math.abs(noise), this.baseBryceGen.generate((double)i * 0.25D, (double)j * 0.25D));
|
|
|
|
|
|
|
|
if (d0 > 0.0D)
|
|
|
|
{
|
|
|
|
double d1 = 0.001953125D;
|
|
|
|
double d2 = Math.abs(this.highBryceGen.generate((double)i * d1, (double)j * d1));
|
|
|
|
d4 = d0 * d0 * 2.5D;
|
|
|
|
double d3 = Math.ceil(d2 * 50.0D) + 14.0D;
|
|
|
|
|
|
|
|
if (d4 > d3)
|
|
|
|
{
|
|
|
|
d4 = d3;
|
|
|
|
}
|
|
|
|
|
|
|
|
d4 = d4 + 64.0D;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int bx = x & 15;
|
|
|
|
int by = z & 15;
|
2025-07-31 14:26:28 +02:00
|
|
|
State surface = Blocks.beige_clay.getState();
|
|
|
|
State top = Blocks.beige_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
int rng = (int)(noise / 3.0D + 3.0D + rand.doublev() * 0.25D);
|
|
|
|
boolean hard = Math.cos(noise / 3.0D * Math.PI) > 0.0D;
|
|
|
|
int sel = -1;
|
|
|
|
boolean base = false;
|
|
|
|
|
|
|
|
for (int i1 = primer.height - 1; i1 >= 0; --i1)
|
|
|
|
{
|
|
|
|
if (primer.get(by, i1, bx).getBlock() == Blocks.air && i1 < (int)d4)
|
|
|
|
{
|
|
|
|
primer.set(by, i1, bx, this.filler);
|
|
|
|
}
|
|
|
|
|
|
|
|
State iblockstate1 = primer.get(by, i1, bx);
|
|
|
|
|
|
|
|
if (iblockstate1.getBlock() == Blocks.air)
|
|
|
|
{
|
|
|
|
sel = -1;
|
|
|
|
}
|
|
|
|
else if (iblockstate1.getBlock() == this.fillerBlock)
|
|
|
|
{
|
|
|
|
if (sel == -1)
|
|
|
|
{
|
|
|
|
base = false;
|
|
|
|
|
|
|
|
if (rng <= 0)
|
|
|
|
{
|
|
|
|
surface = null;
|
|
|
|
top = this.filler;
|
|
|
|
}
|
|
|
|
else if (i1 >= this.seaLevel - 4 && i1 <= this.seaLevel + 1)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
surface = Blocks.beige_clay.getState();
|
|
|
|
top = Blocks.beige_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (i1 < this.seaLevel && (surface == null || surface.getBlock() == Blocks.air))
|
|
|
|
{
|
|
|
|
surface = this.liquid;
|
|
|
|
}
|
|
|
|
|
|
|
|
sel = rng + Math.max(0, i1 - this.seaLevel);
|
|
|
|
|
|
|
|
if (i1 < this.seaLevel - 1)
|
|
|
|
{
|
|
|
|
primer.set(by, i1, bx, top);
|
|
|
|
|
|
|
|
if (top.getBlock() instanceof BlockColoredClay)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
primer.set(by, i1, bx, Blocks.light_brown_clay.getState());
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
}
|
2025-07-22 23:59:00 +02:00
|
|
|
else if (soil && i1 > 86 + rng * 2)
|
2025-07-22 21:20:06 +02:00
|
|
|
{
|
|
|
|
if (hard)
|
|
|
|
{
|
|
|
|
primer.set(by, i1, bx, Blocks.coarse_dirt.getState());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2025-07-23 16:04:55 +02:00
|
|
|
primer.set(by, i1, bx, Blocks.dirt.getState());
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (i1 <= this.seaLevel + 3 + rng)
|
|
|
|
{
|
|
|
|
primer.set(by, i1, bx, this.surface);
|
|
|
|
base = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
State iblockstate4;
|
|
|
|
|
|
|
|
if (i1 >= 64 && i1 <= 127)
|
|
|
|
{
|
|
|
|
if (hard)
|
|
|
|
{
|
|
|
|
iblockstate4 = Blocks.hardened_clay.getState();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
iblockstate4 = this.getBlockAt(x, i1, z);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
iblockstate4 = Blocks.light_brown_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
primer.set(by, i1, bx, iblockstate4);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (sel > 0)
|
|
|
|
{
|
|
|
|
--sel;
|
|
|
|
|
|
|
|
if (base)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
primer.set(by, i1, bx, Blocks.light_brown_clay.getState());
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
State iblockstate2 = this.getBlockAt(x, i1, z);
|
|
|
|
primer.set(by, i1, bx, iblockstate2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setupLayers(Random random)
|
|
|
|
{
|
|
|
|
for (int l1 = 0; l1 < 64; ++l1)
|
|
|
|
{
|
|
|
|
l1 += random.roll(5);
|
|
|
|
|
|
|
|
if (l1 < 64)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
this.layers[l1] = Blocks.light_brown_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int i2 = random.range(2, 5);
|
|
|
|
|
|
|
|
for (int i = 0; i < i2; ++i)
|
|
|
|
{
|
|
|
|
int j = random.roll(3);
|
|
|
|
int k = random.zrange(64);
|
|
|
|
|
|
|
|
for (int l = 0; k + l < 64 && l < j; ++l)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
this.layers[k + l] = Blocks.white_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int j2 = random.range(2, 5);
|
|
|
|
|
|
|
|
for (int k2 = 0; k2 < j2; ++k2)
|
|
|
|
{
|
|
|
|
int i3 = random.range(2, 4);
|
|
|
|
int l3 = random.zrange(64);
|
|
|
|
|
|
|
|
for (int i1 = 0; l3 + i1 < 64 && i1 < i3; ++i1)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
this.layers[l3 + i1] = Blocks.dark_brown_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int l2 = random.range(2, 5);
|
|
|
|
|
|
|
|
for (int j3 = 0; j3 < l2; ++j3)
|
|
|
|
{
|
|
|
|
int i4 = random.roll(3);
|
|
|
|
int k4 = random.zrange(64);
|
|
|
|
|
|
|
|
for (int j1 = 0; k4 + j1 < 64 && j1 < i4; ++j1)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
this.layers[k4 + j1] = Blocks.dark_red_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int k3 = random.range(3, 5);
|
|
|
|
int j4 = 0;
|
|
|
|
|
|
|
|
for (int l4 = 0; l4 < k3; ++l4)
|
|
|
|
{
|
|
|
|
int i5 = 1;
|
|
|
|
j4 += random.range(4, 19);
|
|
|
|
|
|
|
|
for (int k1 = 0; j4 + k1 < 64 && k1 < i5; ++k1)
|
|
|
|
{
|
2025-07-31 14:26:28 +02:00
|
|
|
this.layers[j4 + k1] = Blocks.beige_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
|
|
|
|
if (j4 + k1 > 1 && random.chance())
|
|
|
|
{
|
2025-07-28 17:36:14 +02:00
|
|
|
this.layers[j4 + k1 - 1] = Blocks.light_gray_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (j4 + k1 < 63 && random.chance())
|
|
|
|
{
|
2025-07-28 17:36:14 +02:00
|
|
|
this.layers[j4 + k1 + 1] = Blocks.light_gray_clay.getState();
|
2025-07-22 21:20:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|