fix region overlap

This commit is contained in:
dfsek
2021-12-22 16:11:56 -07:00
parent 737f95e458
commit 17e2bdc6f7
4 changed files with 23 additions and 18 deletions

View File

@@ -24,7 +24,7 @@ public final class TerraCLI {
ConfigPack generate = platform.getConfigRegistry().get("OVERWORLD").orElseThrow(); // TODO: make this a cli argument 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(); world.generate();

View File

@@ -7,6 +7,7 @@ import com.dfsek.terra.cli.NBTSerializable;
import com.dfsek.terra.cli.world.chunk.CLIChunk; import com.dfsek.terra.cli.world.chunk.CLIChunk;
import com.google.common.collect.Streams;
import net.jafama.FastMath; import net.jafama.FastMath;
import com.dfsek.terra.api.block.entity.BlockEntity; 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>>> { public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector2Int, MCAFile>>> {
private static final Logger LOGGER = LoggerFactory.getLogger(CLIWorld.class); private static final Logger LOGGER = LoggerFactory.getLogger(CLIWorld.class);
private static final int regionBlocks = 32 * 16;
private final Region[] regions; private final Region[] regions;
private final Region[] negativeRegions;
private final int size; private final int size;
private final long seed; private final long seed;
private final int maxHeight; private final int maxHeight;
@@ -48,7 +49,7 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
private final ConfigPack pack; private final ConfigPack pack;
private final AtomicInteger amount = new AtomicInteger(0); 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, public CLIWorld(int size,
long seed, long seed,
@@ -64,10 +65,13 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
this.pack = pack; this.pack = pack;
this.regions = new Region[(size + 1) * (size + 1)]; size+=1;
for(int x = 0; x < size + 1; x++) { this.regions = new Region[size * size];
for(int z = 0; z < size + 1; z++) { this.negativeRegions = new Region[size * size];
regions[x + z * (size + 1)] = new Region(this, x, z); 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 @Override
public CLIChunk getChunkAt(int x, int z) { public CLIChunk getChunkAt(int x, int z) {
int cx = x + (size + 1) * 16; return getRegion(FastMath.floorDiv(x, 32), FastMath.floorDiv(z, 32))
int cz = z + (size + 1) * 16;
return regions[FastMath.floorDiv(cx, regionBlocks) + regionBlocks * FastMath.floorDiv(cz, regionBlocks)]
.get(FastMath.floorMod(x, 32), FastMath.floorMod(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 @Override
public long getSeed() { public long getSeed() {
return seed; return seed;
@@ -212,7 +220,9 @@ public class CLIWorld implements ServerWorld, NBTSerializable<Stream<Pair<Vector
@Override @Override
public Stream<Pair<Vector2Int, MCAFile>> serialize() { 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 { private static final class CLIProtoWorld implements ProtoWorld {

View File

@@ -1,11 +1,10 @@
package com.dfsek.terra.cli.world; package com.dfsek.terra.cli.world;
import net.querz.mca.MCAFile;
import com.dfsek.terra.cli.NBTSerializable; import com.dfsek.terra.cli.NBTSerializable;
import com.dfsek.terra.cli.world.chunk.CLIChunk; import com.dfsek.terra.cli.world.chunk.CLIChunk;
import net.querz.mca.MCAFile;
import net.querz.mca.MCAUtil;
public class Region implements NBTSerializable<MCAFile> { public class Region implements NBTSerializable<MCAFile> {
private final CLIChunk[] chunks; private final CLIChunk[] chunks;

View File

@@ -1,6 +1,5 @@
package com.dfsek.terra.cli.world.chunk; package com.dfsek.terra.cli.world.chunk;
import net.querz.mca.Section;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.api.block.state.BlockState; 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.api.world.chunk.generation.ProtoChunk;
import com.dfsek.terra.cli.NBTSerializable; import com.dfsek.terra.cli.NBTSerializable;
import com.dfsek.terra.cli.block.CLIBlockState; import com.dfsek.terra.cli.block.CLIBlockState;
import com.dfsek.terra.cli.handle.CLIWorldHandle;
import com.dfsek.terra.cli.world.CLIWorld; import com.dfsek.terra.cli.world.CLIWorld;
import java.lang.reflect.Field;
import static com.dfsek.terra.cli.handle.CLIWorldHandle.getAIR; import static com.dfsek.terra.cli.handle.CLIWorldHandle.getAIR;