Skip to content

Commit 0eaf0f3

Browse files
xpplecev-api
authored andcommitted
Add hovered biome + fix coordinate conversion
1 parent 11c31e2 commit 0eaf0f3

File tree

5 files changed

+41
-10
lines changed

5 files changed

+41
-10
lines changed

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@
119119
import java.util.Objects;
120120
import java.util.Optional;
121121
import java.util.Set;
122+
import java.util.OptionalInt;
123+
import java.util.function.IntSupplier;
122124
import java.util.function.ToIntBiFunction;
123125
import java.util.stream.IntStream;
124126

@@ -526,8 +528,12 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partia
526528
this.chestLootWidget.render(guiGraphics, mouseX, mouseY, this.font);
527529
}
528530

529-
// draw hovered coordinates
530-
Component coordinates = accent("x: %d, z: %d".formatted(QuartPos.toBlock(this.mouseQuart.x()), QuartPos.toBlock(this.mouseQuart.z())));
531+
// draw hovered coordinates and biome
532+
MutableComponent coordinates = accent("x: %d, z: %d".formatted(QuartPos.toBlock(this.mouseQuart.x()), QuartPos.toBlock(this.mouseQuart.z())));
533+
OptionalInt optionalBiome = getBiome(this.mouseQuart);
534+
if (optionalBiome.isPresent()) {
535+
coordinates = coordinates.append(" [%s]".formatted(Cubiomes.biome2str(this.version, optionalBiome.getAsInt()).getString(0)));
536+
}
531537
if (this.displayCoordinatesCopiedTicks > 0) {
532538
coordinates = Component.translatable("seedMap.coordinatesCopied", coordinates);
533539
}
@@ -769,6 +775,17 @@ private BitSet calculateCanyonData(TilePos tilePos) {
769775
return canyons;
770776
}
771777

778+
private OptionalInt getBiome(QuartPos2 pos) {
779+
TilePos tilePos = TilePos.fromQuartPos(pos);
780+
int[] biomeCache = this.biomeCache.get(tilePos);
781+
if (biomeCache == null) {
782+
return OptionalInt.empty();
783+
}
784+
QuartPos2 quartPos = QuartPos2.fromTilePos(tilePos);
785+
QuartPos2 relQuartPos = pos.subtract(quartPos);
786+
return OptionalInt.of(biomeCache[relQuartPos.x() + relQuartPos.z() * Tile.TEXTURE_SIZE]);
787+
}
788+
772789
private BlockPos calculateSpawnData() {
773790
MemorySegment pos = Cubiomes.getSpawn(this.arena, this.biomeGenerator);
774791
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)