Skip to content

Commit b8a9993

Browse files
committed
Add hovered biome + fix coordinate conversion
1 parent e9990e6 commit b8a9993

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed

src/main/java/dev/xpple/seedmapper/seedmap/SeedMapScreen.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
import java.util.Map;
9494
import java.util.Objects;
9595
import java.util.Optional;
96+
import java.util.OptionalInt;
9697
import java.util.function.IntSupplier;
9798
import java.util.function.ToIntBiFunction;
9899
import java.util.stream.IntStream;
@@ -460,8 +461,12 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partia
460461
this.chestLootWidget.render(guiGraphics, mouseX, mouseY, this.font);
461462
}
462463

463-
// draw hovered coordinates
464-
Component coordinates = accent("x: %d, z: %d".formatted(QuartPos.toBlock(this.mouseQuart.x()), QuartPos.toBlock(this.mouseQuart.z())));
464+
// draw hovered coordinates and biome
465+
MutableComponent coordinates = accent("x: %d, z: %d".formatted(QuartPos.toBlock(this.mouseQuart.x()), QuartPos.toBlock(this.mouseQuart.z())));
466+
OptionalInt optionalBiome = getBiome(this.mouseQuart);
467+
if (optionalBiome.isPresent()) {
468+
coordinates = coordinates.append(" [%s]".formatted(Cubiomes.biome2str(this.version, optionalBiome.getAsInt()).getString(0)));
469+
}
465470
if (this.displayCoordinatesCopiedTicks > 0) {
466471
coordinates = Component.translatable("seedMap.coordinatesCopied", coordinates);
467472
}
@@ -675,6 +680,17 @@ private BitSet calculateCanyonData(TilePos tilePos) {
675680
return canyons;
676681
}
677682

683+
private OptionalInt getBiome(QuartPos2 pos) {
684+
TilePos tilePos = TilePos.fromQuartPos(pos);
685+
int[] biomeCache = this.biomeCache.get(tilePos);
686+
if (biomeCache == null) {
687+
return OptionalInt.empty();
688+
}
689+
QuartPos2 quartPos = QuartPos2.fromTilePos(tilePos);
690+
QuartPos2 relQuartPos = pos.subtract(quartPos);
691+
return OptionalInt.of(biomeCache[relQuartPos.x() + relQuartPos.z() * Tile.TEXTURE_SIZE]);
692+
}
693+
678694
private BlockPos calculateSpawnData() {
679695
MemorySegment pos = Cubiomes.getSpawn(this.arena, this.biomeGenerator);
680696
return new BlockPos(Pos.x(pos), 0, Pos.z(pos));

src/main/java/dev/xpple/seedmapper/seedmap/Tile.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
import net.minecraft.client.renderer.texture.DynamicTexture;
44

55
public record Tile(TilePos pos, DynamicTexture texture) {
6+
7+
public static final int TEXTURE_SIZE = TilePos.TILE_SIZE_CHUNKS * SeedMapScreen.SCALED_CHUNK_SIZE;
8+
69
public Tile(TilePos pos, long seed, int dimension) {
710
this(pos, initTexture(pos, seed, dimension));
811
}
912

1013
private static DynamicTexture initTexture(TilePos pos, long seed, int dimension) {
11-
int size = TilePos.TILE_SIZE_CHUNKS * SeedMapScreen.SCALED_CHUNK_SIZE;
12-
return new DynamicTexture("Tile %s %s (%d/%d)".formatted(pos.x(), pos.z(), seed, dimension), size, size, true);
14+
return new DynamicTexture("Tile %s %s (%d/%d)".formatted(pos.x(), pos.z(), seed, dimension), TEXTURE_SIZE, TEXTURE_SIZE, true);
1315
}
1416

1517
public void close() {

src/main/java/dev/xpple/seedmapper/seedmap/TilePos.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@
22

33
import dev.xpple.seedmapper.util.QuartPos2;
44
import net.minecraft.core.QuartPos;
5+
import net.minecraft.util.Mth;
56
import net.minecraft.world.level.ChunkPos;
67

78
public record TilePos(int x, int z) {
89
public static final int TILE_SIZE_CHUNKS = 25;
910

1011
public static TilePos fromQuartPos(QuartPos2 quartPos) {
11-
return new TilePos(QuartPos.toSection(quartPos.x()) / TILE_SIZE_CHUNKS, QuartPos.toSection(quartPos.z()) / TILE_SIZE_CHUNKS);
12+
return new TilePos(Mth.floorDiv(QuartPos.toSection(quartPos.x()), TILE_SIZE_CHUNKS), Mth.floorDiv(QuartPos.toSection(quartPos.z()), TILE_SIZE_CHUNKS));
1213
}
1314

1415
public static TilePos fromChunkPos(ChunkPos chunkPos) {
15-
return new TilePos(chunkPos.x / TILE_SIZE_CHUNKS, chunkPos.z / TILE_SIZE_CHUNKS);
16+
return new TilePos(Mth.floorDiv(chunkPos.x, TILE_SIZE_CHUNKS), Mth.floorDiv(chunkPos.z, TILE_SIZE_CHUNKS));
1617
}
1718

1819
public ChunkPos toChunkPos() {

src/main/java/dev/xpple/seedmapper/thread/SeedMapCache.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,14 @@ public SeedMapCache(Object2ObjectMap<K, V> cache, SeedMapExecutor executor) {
4242
});
4343
return null;
4444
}
45+
46+
/**
47+
* Returns the value associated with the given key if the key is present,
48+
* otherwise {@code null}.
49+
* @param key the key
50+
* @return the nullable value
51+
*/
52+
public @Nullable V get(K key) {
53+
return this.cache.get(key);
54+
}
4555
}

src/main/java/dev/xpple/seedmapper/util/RegionPos.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,32 @@
44
import net.minecraft.core.BlockPos;
55
import net.minecraft.core.QuartPos;
66
import net.minecraft.core.SectionPos;
7+
import net.minecraft.util.Mth;
78
import net.minecraft.world.level.ChunkPos;
89

910
public record RegionPos(int x, int z, int regionSizeChunks) {
1011
public static RegionPos fromBlockPos(BlockPos blockPos, int regionSizeChunks) {
11-
return new RegionPos(SectionPos.blockToSectionCoord(blockPos.getX()) / regionSizeChunks, SectionPos.blockToSectionCoord(blockPos.getZ()) / regionSizeChunks, regionSizeChunks);
12+
return new RegionPos(Mth.floorDiv(SectionPos.blockToSectionCoord(blockPos.getX()), regionSizeChunks), Mth.floorDiv(SectionPos.blockToSectionCoord(blockPos.getZ()), regionSizeChunks), regionSizeChunks);
1213
}
1314

1415
public BlockPos toBlockPos() {
1516
return new BlockPos(SectionPos.sectionToBlockCoord(this.x * this.regionSizeChunks), 0, SectionPos.sectionToBlockCoord(this.z * this.regionSizeChunks));
1617
}
1718

1819
public static RegionPos fromQuartPos(QuartPos2 quartPos, int regionSizeChunks) {
19-
return new RegionPos(QuartPos.toSection(quartPos.x()) / regionSizeChunks, QuartPos.toSection(quartPos.z()) / regionSizeChunks, regionSizeChunks);
20+
return new RegionPos(Mth.floorDiv(QuartPos.toSection(quartPos.x()), regionSizeChunks), Mth.floorDiv(QuartPos.toSection(quartPos.z()), regionSizeChunks), regionSizeChunks);
2021
}
2122

2223
public static RegionPos fromChunkPos(ChunkPos chunkPos, int regionSizeChunks) {
23-
return new RegionPos(chunkPos.x / regionSizeChunks, chunkPos.z / regionSizeChunks, regionSizeChunks);
24+
return new RegionPos(Mth.floorDiv(chunkPos.x, regionSizeChunks), Mth.floorDiv(chunkPos.z, regionSizeChunks), regionSizeChunks);
2425
}
2526

2627
public ChunkPos toChunkPos() {
2728
return new ChunkPos(this.x * this.regionSizeChunks, this.z * this.regionSizeChunks);
2829
}
2930

3031
public static RegionPos fromTilePos(TilePos tilePos, int regionSize) {
31-
return new RegionPos(TilePos.TILE_SIZE_CHUNKS * tilePos.x() / regionSize, TilePos.TILE_SIZE_CHUNKS * tilePos.z() / regionSize, regionSize);
32+
return new RegionPos(Mth.floorDiv(TilePos.TILE_SIZE_CHUNKS * tilePos.x(), regionSize), Mth.floorDiv(TilePos.TILE_SIZE_CHUNKS * tilePos.z(), regionSize), regionSize);
3233
}
3334

3435
public RegionPos add(RegionPos regionPos) {

0 commit comments

Comments
 (0)