mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-03 06:16:10 +00:00
fix region overlap
This commit is contained in:
@@ -24,7 +24,7 @@ public final class TerraCLI {
|
||||
|
||||
ConfigPack generate = platform.getConfigRegistry().get("OVERWORLD").orElseThrow(); // TODO: make this a cli argument
|
||||
|
||||
CLIWorld world = new CLIWorld(2, 2, 384, -64, generate);
|
||||
CLIWorld world = new CLIWorld(1, 2, 384, -64, generate);
|
||||
|
||||
world.generate();
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import com.dfsek.terra.cli.NBTSerializable;
|
||||
|
||||
import com.dfsek.terra.cli.world.chunk.CLIChunk;
|
||||
|
||||
import com.google.common.collect.Streams;
|
||||
import net.jafama.FastMath;
|
||||
|
||||
import com.dfsek.terra.api.block.entity.BlockEntity;
|
||||
@@ -37,8 +38,8 @@ import java.util.stream.Stream;
|
||||
|
||||
public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector2Int, MCAFile>>> {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(CLIWorld.class);
|
||||
private static final int regionBlocks = 32 * 16;
|
||||
private final Region[] regions;
|
||||
private final Region[] negativeRegions;
|
||||
private final int size;
|
||||
private final long seed;
|
||||
private final int maxHeight;
|
||||
@@ -48,7 +49,7 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
|
||||
private final ConfigPack pack;
|
||||
private final AtomicInteger amount = new AtomicInteger(0);
|
||||
|
||||
private final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()-1);
|
||||
private final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() - 1);
|
||||
|
||||
public CLIWorld(int size,
|
||||
long seed,
|
||||
@@ -64,10 +65,13 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
|
||||
this.pack = pack;
|
||||
|
||||
|
||||
this.regions = new Region[(size + 1) * (size + 1)];
|
||||
for(int x = 0; x < size + 1; x++) {
|
||||
for(int z = 0; z < size + 1; z++) {
|
||||
regions[x + z * (size + 1)] = new Region(this, x, z);
|
||||
size+=1;
|
||||
this.regions = new Region[size * size];
|
||||
this.negativeRegions = new Region[size * size];
|
||||
for(int x = 0; x < size; x++) {
|
||||
for(int z = 0; z < size; z++) {
|
||||
regions[x + z * size] = new Region(this, x, z);
|
||||
negativeRegions[x + z * size] = new Region(this, x, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -163,12 +167,16 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
|
||||
|
||||
@Override
|
||||
public CLIChunk getChunkAt(int x, int z) {
|
||||
int cx = x + (size + 1) * 16;
|
||||
int cz = z + (size + 1) * 16;
|
||||
return regions[FastMath.floorDiv(cx, regionBlocks) + regionBlocks * FastMath.floorDiv(cz, regionBlocks)]
|
||||
return getRegion(FastMath.floorDiv(x, 32), FastMath.floorDiv(z, 32))
|
||||
.get(FastMath.floorMod(x, 32), FastMath.floorMod(z, 32));
|
||||
}
|
||||
|
||||
public Region getRegion(int x, int z) {
|
||||
int key = x + z * size;
|
||||
if(key >= 0) return regions[key];
|
||||
else return negativeRegions[-key];
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getSeed() {
|
||||
return seed;
|
||||
@@ -212,7 +220,9 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
|
||||
|
||||
@Override
|
||||
public Stream<Pair<Vector2Int, MCAFile>> serialize() {
|
||||
return Arrays.stream(regions).map(region -> Pair.of(Vector2Int.of(region.getX(), region.getZ()), region.serialize()));
|
||||
return Streams
|
||||
.concat(Arrays.stream(regions), Arrays.stream(negativeRegions))
|
||||
.map(region -> Pair.of(Vector2Int.of(region.getX(), region.getZ()), region.serialize()));
|
||||
}
|
||||
|
||||
private static final class CLIProtoWorld implements ProtoWorld {
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package com.dfsek.terra.cli.world;
|
||||
|
||||
import net.querz.mca.MCAFile;
|
||||
|
||||
import com.dfsek.terra.cli.NBTSerializable;
|
||||
import com.dfsek.terra.cli.world.chunk.CLIChunk;
|
||||
|
||||
import net.querz.mca.MCAFile;
|
||||
import net.querz.mca.MCAUtil;
|
||||
|
||||
|
||||
public class Region implements NBTSerializable<MCAFile> {
|
||||
private final CLIChunk[] chunks;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.dfsek.terra.cli.world.chunk;
|
||||
|
||||
import net.querz.mca.Section;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import com.dfsek.terra.api.block.state.BlockState;
|
||||
@@ -9,11 +8,8 @@ import com.dfsek.terra.api.world.chunk.Chunk;
|
||||
import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
|
||||
import com.dfsek.terra.cli.NBTSerializable;
|
||||
import com.dfsek.terra.cli.block.CLIBlockState;
|
||||
import com.dfsek.terra.cli.handle.CLIWorldHandle;
|
||||
import com.dfsek.terra.cli.world.CLIWorld;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import static com.dfsek.terra.cli.handle.CLIWorldHandle.getAIR;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user