Skip to content

Commit 2aafd3b

Browse files
Backport topo map mode from newer JourneyMap (#70)
* feat: add topo to MapType.Name enum with factory and predicate * feat: render topo map tiles via TopoRenderer in ChunkRenderController * fix: move topoG2D to method scope for consistent resource cleanup * feat: insert topo into J-key map type toggle cycle * feat: add topo button to fullscreen map type toolbar * fix: untoggle topo button when day/night selected in fullscreen * feat: add lang key for topo map mode button * fix: use MapType.topo(dim) in topo button listener to avoid vSlice mismatch * fix: render topo tiles alongside day/night instead of as separate task * simplify: cache MapType.topo() in local var; skip topo toggle in non-overworld * feat: enable topo mode in all dimensions, not just overworld * feat: hide topo button and skip topo toggle in dimensions with a ceiling * feat: add topo icon to Vault and Victorian themes * docs: update changelog for topo map mode * Update changelog.html
1 parent e2cbc0a commit 2aafd3b

8 files changed

Lines changed: 101 additions & 6 deletions

File tree

doc/changelog.html

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,5 @@ <h1>JourneyMap ${version} for Minecraft ${mcversion}</h1>
2323

2424
<p>New in ${version}</p>
2525
<ul>
26-
<li>Added: New Option for minimap smoothing.</li>
27-
<li>Added: Add checkbox to delete Journeymap data when deleting a world.</li>
28-
<li>Changed: Now the color palette file is created on demand and not on every game start.</li>
29-
<li>Fixed: Reduce memory usage by removing block atlas copy.</li>
26+
<li>Added: Topographic map mode (Topo) backported from newer JourneyMap versions. Accessible via toolbar button in fullscreen map and J-key toggle cycle. Hidden in dimensions with a ceiling (e.g. Nether) (Eldrinn-Elantey).</li>
3027
</ul>

src/main/java/journeymap/client/cartography/ChunkRenderController.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import journeymap.client.cartography.render.EndRenderer;
1111
import journeymap.client.cartography.render.NetherRenderer;
1212
import journeymap.client.cartography.render.SurfaceRenderer;
13+
import journeymap.client.cartography.render.TopoRenderer;
1314
import journeymap.client.io.RegionImageHandler;
1415
import journeymap.client.log.LogFormatter;
1516
import journeymap.client.model.*;
@@ -29,9 +30,11 @@ public class ChunkRenderController
2930
private final IChunkRenderer endRenderer;
3031
private final SurfaceRenderer overWorldSurfaceRenderer;
3132
private final IChunkRenderer overWorldCaveRenderer;
33+
private final TopoRenderer overWorldTopoRenderer;
3234
private final BufferedImage reusableBuffer1;
3335
private final BufferedImage reusableBuffer2;
3436
private final BufferedImage reusableBuffer3;
37+
private final BufferedImage reusableBuffer4;
3538

3639
public ChunkRenderController()
3740
{
@@ -41,9 +44,11 @@ public ChunkRenderController()
4144
overWorldSurfaceRenderer = surfaceRenderer;
4245
overWorldCaveRenderer = new CaveRenderer(surfaceRenderer);
4346
//standardRenderer = new ChunkTopoRenderer();
47+
overWorldTopoRenderer = new TopoRenderer();
4448
reusableBuffer1 = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
4549
reusableBuffer2 = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
4650
reusableBuffer3 = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
51+
reusableBuffer4 = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
4752
}
4853

4954
public boolean renderChunk(RegionCoord rCoord, MapType mapType, ChunkMD chunkMd)
@@ -56,6 +61,7 @@ public boolean renderChunk(RegionCoord rCoord, MapType mapType, ChunkMD chunkMd)
5661
ChunkPainter undergroundG2D = null;
5762
ChunkPainter dayG2D = null;
5863
ChunkPainter nightG2D = null;
64+
ChunkPainter topoG2D = null;
5965
boolean renderOkay = false;
6066

6167
try
@@ -91,6 +97,20 @@ public boolean renderChunk(RegionCoord rCoord, MapType mapType, ChunkMD chunkMd)
9197
}
9298
}
9399
}
100+
else if (mapType.isTopo())
101+
{
102+
MapType topoMapType = MapType.topo(rCoord.dimension);
103+
BufferedImage imageTopo = regionImageSet.getChunkImage(chunkMd, topoMapType);
104+
if (imageTopo != null)
105+
{
106+
topoG2D = new ChunkPainter(reusableBuffer4, RegionImageHandler.initRenderingHints(imageTopo.createGraphics()));
107+
renderOkay = overWorldTopoRenderer.render(topoG2D, chunkMd, null);
108+
if (renderOkay)
109+
{
110+
regionImageSet.setChunkImage(chunkMd, topoMapType, imageTopo);
111+
}
112+
}
113+
}
94114
else
95115
{
96116
BufferedImage imageDay = regionImageSet.getChunkImage(chunkMd, MapType.day(rCoord.dimension));
@@ -112,6 +132,17 @@ public boolean renderChunk(RegionCoord rCoord, MapType mapType, ChunkMD chunkMd)
112132
{
113133
regionImageSet.setChunkImage(chunkMd, MapType.day(rCoord.dimension), imageDay);
114134
regionImageSet.setChunkImage(chunkMd, MapType.night(rCoord.dimension), imageNight);
135+
136+
MapType topoMapType = MapType.topo(rCoord.dimension);
137+
BufferedImage imageTopo = regionImageSet.getChunkImage(chunkMd, topoMapType);
138+
if (imageTopo != null)
139+
{
140+
topoG2D = new ChunkPainter(reusableBuffer4, RegionImageHandler.initRenderingHints(imageTopo.createGraphics()));
141+
if (overWorldTopoRenderer.render(topoG2D, chunkMd, null))
142+
{
143+
regionImageSet.setChunkImage(chunkMd, topoMapType, imageTopo);
144+
}
145+
}
115146
}
116147
}
117148

@@ -143,6 +174,10 @@ public boolean renderChunk(RegionCoord rCoord, MapType mapType, ChunkMD chunkMd)
143174
{
144175
undergroundG2D.finishPainting();
145176
}
177+
if (topoG2D != null)
178+
{
179+
topoG2D.finishPainting();
180+
}
146181
}
147182

148183
if (!renderOkay)

src/main/java/journeymap/client/model/MapState.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,22 @@ else if (currentMapType.isDay())
154154
setMapType(MapType.night(player));
155155
}
156156
else if (currentMapType.isNight())
157+
{
158+
if (!ForgeHelper.INSTANCE.hasNoSky(playerEntity))
159+
{
160+
setMapType(MapType.topo(player));
161+
}
162+
else if (underground && caveMappingAllowed)
163+
{
164+
lastMapProperties.showCaves.set(true);
165+
setMapType(MapType.underground(player));
166+
}
167+
else
168+
{
169+
setMapType(MapType.day(player));
170+
}
171+
}
172+
else if (currentMapType.isTopo())
157173
{
158174
if (underground && caveMappingAllowed)
159175
{

src/main/java/journeymap/client/model/MapType.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,16 @@ public static MapType underground(Integer vSlice, int dimension)
7777
return from(Name.underground, vSlice, dimension);
7878
}
7979

80+
public static MapType topo(int dimension)
81+
{
82+
return from(Name.topo, null, dimension);
83+
}
84+
85+
public static MapType topo(EntityDTO player)
86+
{
87+
return from(Name.topo, null, player.dimension);
88+
}
89+
8090
public static String toCacheKey(Name name, Integer vSlice, int dimension)
8191
{
8292
return "" + dimension + name + vSlice;
@@ -117,6 +127,11 @@ public boolean isNight()
117127
return name == Name.night;
118128
}
119129

130+
public boolean isTopo()
131+
{
132+
return name == Name.topo;
133+
}
134+
120135
@Override
121136
public int hashCode()
122137
{
@@ -155,7 +170,7 @@ public boolean equals(Object o)
155170

156171
public enum Name
157172
{
158-
day, night, underground, surface
173+
day, night, underground, surface, topo
159174
}
160175

161176
}

src/main/java/journeymap/client/ui/fullscreen/Fullscreen.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public class Fullscreen extends JmUI
7979
Logger logger = Journeymap.getLogger();
8080
MapChat chat;
8181
ThemeButton buttonFollow, buttonZoomIn, buttonZoomOut, buttonDay, buttonNight, buttonCaves;
82+
ThemeToggle buttonTopo;
8283
ThemeButton buttonAlert, buttonOptions, buttonActions, buttonClose;
8384
ThemeButton buttonTheme, buttonWaypointManager;
8485
ThemeButton buttonMobs, buttonAnimals, buttonPets, buttonVillagers, buttonPlayers, buttonGrid;
@@ -274,6 +275,7 @@ public boolean onToggle(OnOffButton button, boolean toggled)
274275
{
275276
state.setMapType(MapType.Name.day);
276277
buttonNight.setToggled(false);
278+
buttonTopo.setToggled(false);
277279
if (state.isUnderground())
278280
{
279281
buttonCaves.setToggled(false);
@@ -300,6 +302,7 @@ public boolean onToggle(OnOffButton button, boolean toggled)
300302
{
301303
state.setMapType(MapType.night(state.getCurrentMapType().dimension));
302304
buttonDay.setToggled(false);
305+
buttonTopo.setToggled(false);
303306
if (state.isUnderground())
304307
{
305308
buttonCaves.setToggled(false);
@@ -327,6 +330,34 @@ public boolean onToggle(OnOffButton button, boolean toggled)
327330
}
328331
});
329332

333+
// Topo Toggle
334+
buttonTopo = new ThemeToggle(theme, "jm.fullscreen.map_topo", "topo");
335+
buttonTopo.setToggled(mapType.isTopo(), false);
336+
buttonTopo.setDrawButton(!ForgeHelper.INSTANCE.hasNoSky(mc.theWorld));
337+
buttonTopo.addToggleListener(new OnOffButton.ToggleListener()
338+
{
339+
@Override
340+
public boolean onToggle(OnOffButton button, boolean toggled)
341+
{
342+
if (toggled)
343+
{
344+
state.setMapType(MapType.topo(state.getCurrentMapType().dimension));
345+
buttonDay.setToggled(false);
346+
buttonNight.setToggled(false);
347+
if (state.isUnderground())
348+
{
349+
buttonCaves.setToggled(false);
350+
}
351+
state.requireRefresh();
352+
}
353+
else if (state.getCurrentMapType().isTopo())
354+
{
355+
return false;
356+
}
357+
return true;
358+
}
359+
});
360+
330361
// Follow
331362
buttonFollow = new ThemeButton(theme, "jm.fullscreen.follow", "follow");
332363
buttonFollow.addToggleListener(new OnOffButton.ToggleListener()
@@ -492,7 +523,7 @@ public boolean onToggle(OnOffButton button, boolean toggled)
492523
});
493524

494525
// Toolbars
495-
mapTypeToolbar = new ThemeToolbar(theme, buttonCaves, buttonNight, buttonDay);
526+
mapTypeToolbar = new ThemeToolbar(theme, buttonCaves, buttonTopo, buttonNight, buttonDay);
496527
mapTypeToolbar.addAllButtons(this);
497528

498529
optionsToolbar = new ThemeToolbar(theme, buttonMobs, buttonAnimals, buttonPets, buttonVillagers, buttonPlayers, buttonGrid);
1.3 KB
Loading
1.3 KB
Loading

src/main/resources/assets/journeymap/lang/en_US.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ jm.fullscreen.hotkeys_west=Pan West (16 Blocks)
284284
jm.fullscreen.map_caves=Caves
285285
jm.fullscreen.map_day=Day
286286
jm.fullscreen.map_night=Night
287+
jm.fullscreen.map_topo=Topo
287288
jm.fullscreen.minimap=Minimap...
288289
jm.fullscreen.title=Full-screen Map
289290
jm.fullscreen.zoom_in=Zoom In

0 commit comments

Comments
 (0)