Skip to content

Commit 664f46b

Browse files
committed
Elytra Icon For End City Ships
1 parent b6e4e71 commit 664f46b

File tree

4 files changed

+48
-29
lines changed

4 files changed

+48
-29
lines changed
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package dev.xpple.seedmapper.seedmap;
22

3-
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
3+
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
4+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
45
import net.minecraft.world.level.ChunkPos;
56

6-
public record ChunkStructureData(ChunkPos pos, Int2ObjectMap<StructureData> structures) {
7+
public record ChunkStructureData(ChunkPos pos, Object2ObjectMap<String, StructureData> structures) {
8+
public static ChunkStructureData create(ChunkPos pos) {
9+
return new ChunkStructureData(pos, new Object2ObjectOpenHashMap<>());
10+
}
711
}

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

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package dev.xpple.seedmapper.seedmap;
22

33
import com.github.cubiomes.Cubiomes;
4-
import com.github.cubiomes.Piece;
54
import com.github.cubiomes.StructureVariant;
65
import dev.xpple.seedmapper.SeedMapper;
7-
import dev.xpple.seedmapper.feature.StructureChecks;
86
import dev.xpple.seedmapper.util.WorldIdentifier;
97
import net.minecraft.resources.Identifier;
108

@@ -13,7 +11,6 @@
1311
import java.util.Arrays;
1412
import java.util.Map;
1513
import java.util.stream.Collectors;
16-
import java.util.stream.IntStream;
1714

1815
public enum MapFeature {
1916
DESERT_PYRAMID("desert_pyramid", Cubiomes.Desert_Pyramid(), Cubiomes.DIM_OVERWORLD(), Cubiomes.MC_1_3(), "cubiomes_viewer_icons", 19, 20),
@@ -83,21 +80,13 @@ public Texture getVariantTexture(WorldIdentifier identifier, int posX, int posZ,
8380
CANYON("canyon", -1, Cubiomes.DIM_OVERWORLD(), Cubiomes.MC_1_13(), "feature_icons", 20, 20),
8481
FORTRESS("fortress", Cubiomes.Fortress(), Cubiomes.DIM_NETHER(), Cubiomes.MC_1_0(), "cubiomes_viewer_icons", 20, 20),
8582
BASTION("bastion_remnant", Cubiomes.Bastion(), Cubiomes.DIM_NETHER(), Cubiomes.MC_1_16_1(), "cubiomes_viewer_icons", 20, 20),
86-
END_CITY("end_city", Cubiomes.End_City(), Cubiomes.DIM_END(), Cubiomes.MC_1_9(), "cubiomes_viewer_icons", 20, 20) {
87-
private static final Texture END_CITY_SHIP_TEXTURE = new Texture("end_ship", "cubiomes_viewer_icons", 20, 20);
83+
END_CITY("end_city", Cubiomes.End_City(), Cubiomes.DIM_END(), Cubiomes.MC_1_9(), "cubiomes_viewer_icons", 20, 20),
84+
END_CITY_SHIP("end_city_ship", Cubiomes.End_City(), Cubiomes.DIM_END(), Cubiomes.MC_1_9(), "cubiomes_viewer_icons", 20, 20) {
85+
private static final Texture ELYTRA_TEXTURE = new Texture("elytra", "cubiomes_viewer_icons", 20, 20);
86+
8887
@Override
89-
public Texture getVariantTexture(WorldIdentifier identifier, int posX, int posZ, int biome) {
90-
try (Arena arena = Arena.ofConfined()) {
91-
MemorySegment pieces = Piece.allocateArray(StructureChecks.MAX_END_CITY_AND_FORTRESS_PIECES, arena);
92-
int numPieces = Cubiomes.getEndCityPieces(pieces, identifier.seed(), posX >> 4, posZ >> 4);
93-
boolean hasShip = IntStream.range(0, numPieces)
94-
.mapToObj(i -> Piece.asSlice(pieces, i))
95-
.anyMatch(piece -> Piece.type(piece) == Cubiomes.END_SHIP());
96-
if (hasShip) {
97-
return END_CITY_SHIP_TEXTURE;
98-
}
99-
return super.getDefaultTexture();
100-
}
88+
public Texture getDefaultTexture() {
89+
return ELYTRA_TEXTURE;
10190
}
10291
},
10392
END_GATEWAY("end_gateway", Cubiomes.End_Gateway(), Cubiomes.DIM_END(), Cubiomes.MC_1_13(), "cubiomes_viewer_icons", 20, 20),

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

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import dev.xpple.simplewaypoints.api.SimpleWaypointsAPI;
4747
import dev.xpple.simplewaypoints.api.Waypoint;
4848
import it.unimi.dsi.fastutil.ints.AbstractIntCollection;
49-
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
5049
import it.unimi.dsi.fastutil.ints.IntArraySet;
5150
import it.unimi.dsi.fastutil.ints.IntSet;
5251
import it.unimi.dsi.fastutil.objects.Object2IntMap;
@@ -460,6 +459,16 @@ private Tile createSlimeChunkTile(TilePos tilePos, BitSet slimeChunkData) {
460459
}
461460

462461
private @Nullable FeatureWidget addFeatureWidget(GuiGraphics guiGraphics, MapFeature feature, MapFeature.Texture variantTexture, BlockPos pos) {
462+
if (feature == MapFeature.END_CITY_SHIP) {
463+
FeatureWidget toRemove = this.featureWidgets.stream()
464+
.filter(widget -> widget.feature == MapFeature.END_CITY && widget.featureLocation.equals(pos))
465+
.findFirst()
466+
.orElse(null);
467+
if (toRemove != null) {
468+
this.featureWidgets.remove(toRemove);
469+
}
470+
}
471+
463472
FeatureWidget widget = new FeatureWidget(feature, variantTexture, pos);
464473
if (!widget.withinBounds()) {
465474
return null;
@@ -470,14 +479,18 @@ private Tile createSlimeChunkTile(TilePos tilePos, BitSet slimeChunkData) {
470479
}
471480

472481
private void drawFeatureIcons(GuiGraphics guiGraphics) {
473-
if (!this.shouldDrawFeatureIcons()) return;
474-
this.featureWidgets.stream()
482+
if (!this.shouldDrawFeatureIcons()) {
483+
return;
484+
}
485+
List<FeatureWidget> widgets = this.featureWidgets.stream()
475486
.filter(FeatureWidget::withinBounds)
476-
.filter(w -> Configs.ToggledFeatures.contains(w.feature))
477-
.forEach(w -> {
478-
MapFeature.Texture t = w.texture();
479-
this.drawFeatureIcon(guiGraphics, t, w.x, w.y, t.width(), t.height(), 0xFF_FFFFFF);
480-
});
487+
.filter(widget -> Configs.ToggledFeatures.contains(widget.feature))
488+
.sorted(Comparator.comparingInt(widget -> widget.feature == MapFeature.END_CITY_SHIP ? 1 : 0))
489+
.toList();
490+
for (FeatureWidget widget : widgets) {
491+
MapFeature.Texture texture = widget.texture();
492+
this.drawFeatureIcon(guiGraphics, texture, widget.x, widget.y, texture.width(), texture.height(), 0xFF_FFFFFF);
493+
}
481494
}
482495

483496
private void createFeatureToggles() {
@@ -563,6 +576,19 @@ private BitSet calculateSlimeChunkData(TilePos tilePos) {
563576
} else {
564577
texture = feature.getVariantTexture(this.worldIdentifier, pos.getX(), pos.getZ(), optionalBiome.getAsInt());
565578
}
579+
if (feature == MapFeature.END_CITY_SHIP) {
580+
try (Arena tempArena = Arena.ofConfined()) {
581+
MemorySegment pieces = Piece.allocateArray(StructureChecks.MAX_END_CITY_AND_FORTRESS_PIECES, tempArena);
582+
int numPieces = Cubiomes.getEndCityPieces(pieces, this.worldIdentifier.seed(), pos.getX() >> 4, pos.getZ() >> 4);
583+
boolean hasShip = IntStream.range(0, numPieces)
584+
.mapToObj(i -> Piece.asSlice(pieces, i))
585+
.anyMatch(piece -> Piece.type(piece) == Cubiomes.END_SHIP());
586+
if (!hasShip) {
587+
return null;
588+
}
589+
texture = feature.getDefaultTexture();
590+
}
591+
}
566592
return new StructureData(pos, texture);
567593
}
568594

@@ -1747,8 +1773,8 @@ protected void renderSeedMap(GuiGraphics guiGraphics, int mouseX, int mouseY, fl
17471773
}
17481774
ChunkPos chunkPos = new ChunkPos(SectionPos.blockToSectionCoord(Pos.x(structurePos)), SectionPos.blockToSectionCoord(Pos.z(structurePos)));
17491775

1750-
ChunkStructureData chunkStructureData = this.structureCache.computeIfAbsent(chunkPos, _ -> new ChunkStructureData(chunkPos, new Int2ObjectArrayMap<>()));
1751-
StructureData data = chunkStructureData.structures().computeIfAbsent(structure, _ -> this.calculateStructureData(feature, regionPos, structurePos, generationCheck));
1776+
ChunkStructureData chunkStructureData = this.structureCache.computeIfAbsent(chunkPos, _ -> ChunkStructureData.create(chunkPos));
1777+
StructureData data = chunkStructureData.structures().computeIfAbsent(feature.getName(), _ -> this.calculateStructureData(feature, regionPos, structurePos, generationCheck));
17521778
if (data == null) {
17531779
continue;
17541780
}
1.71 KB
Loading

0 commit comments

Comments
 (0)