Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
8ee4223
Migrate writes to base64 encoded string
ETcodehome Sep 16, 2025
c706cba
Read Base64 data
ETcodehome Sep 16, 2025
c1064ab
Stop using strings as ints
ETcodehome Sep 17, 2025
20ad986
reorder processing
ETcodehome Sep 17, 2025
786b0a6
Merge read freq changes
ETcodehome Sep 17, 2025
514e80e
Working
ETcodehome Sep 17, 2025
8810a8e
Code cleanup
ETcodehome Sep 17, 2025
2eccf40
Fix double counting of layers
ETcodehome Sep 17, 2025
f19c80a
Guard config change handler
ETcodehome Sep 17, 2025
82bd288
Fix empty region cleanup
ETcodehome Sep 18, 2025
e1e67c2
Merge branch 'master' of github.com:ETcodehome/Tileman-Mode into etay…
ETcodehome Sep 18, 2025
c300ab9
rename load methods
ETcodehome Sep 18, 2025
d8e78b0
Working total conversion
ETcodehome Sep 19, 2025
2982ac8
Add proper profiling
ETcodehome Sep 19, 2025
2ff9f6a
Wayfinding experiment
ETcodehome Sep 20, 2025
00c926a
Wayfinding fundamentals
ETcodehome Sep 21, 2025
fd194be
Nicer tile setup
ETcodehome Sep 21, 2025
4022e36
Render costs
ETcodehome Sep 22, 2025
8d76985
Working Tidy No configs
ETcodehome Sep 22, 2025
e7d21ce
Disable wayfinder while interacting
ETcodehome Sep 22, 2025
97c99a1
Prevent path to same point
ETcodehome Sep 23, 2025
79b0178
Animate path
ETcodehome Sep 25, 2025
1c10290
move wayfinding to renderer
ETcodehome Sep 25, 2025
48bd983
Framework for configs
ETcodehome Sep 26, 2025
820b12f
Start adding configs
ETcodehome Sep 26, 2025
e35bd47
Expose performance metrics
ETcodehome Sep 26, 2025
1eeb422
Add config values
ETcodehome Sep 27, 2025
dedc325
Smooth tile anims
ETcodehome Sep 27, 2025
3249f20
Handle null ptr
ETcodehome Sep 28, 2025
e99a105
Merge branch 'master' of github.com:ETcodehome/Tileman-Mode into etay…
ETcodehome Sep 29, 2025
2e621e4
Merge branch 'etaylor_groupTileMan' of github.com:ETcodehome/Tileman-…
ETcodehome Oct 9, 2025
dfafde5
Readme updates
ETcodehome Oct 9, 2025
a343db7
Rendering refinements
ETcodehome Oct 10, 2025
2b6bf76
Merge branch 'etaylor_fixPlanewalking' of github.com:ETcodehome/Tilem…
ETcodehome Oct 13, 2025
c859517
code cleanup
ETcodehome Oct 13, 2025
8c8d6be
Add group configs
ETcodehome Oct 14, 2025
22c0d46
Configure group tiles
ETcodehome Oct 14, 2025
4958c04
Fix counts showing when shifting
ETcodehome Oct 15, 2025
eee01c9
smaller functions
ETcodehome Oct 15, 2025
15303e1
Profiling
ETcodehome Oct 15, 2025
877048b
Final tweaks
ETcodehome Oct 17, 2025
4f1fb6f
Update pathing orders
ETcodehome Oct 29, 2025
4a7fce1
Merge branch 'master' of github.com:ETcodehome/Tileman-Mode into etay…
ETcodehome Nov 13, 2025
eb2205e
Update readme
ETcodehome Nov 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@ Feel free to contact me on discord at Conleck#6160 with any bug reports or sugge

# Changelog

## November 2025 Minor Update

**Expanded overlay customization options**
> - A large number of new customization options are available for rendering tile overlays.

**Added wayfinder functionality**
> - Enabling the wayfinder in settings will overlay the path your character will walk to the tile you are hovering in realtime.
> - The unlock cost to walk to the tile can also be displayed as a text overlay on unclaimed tiles.

## October 2025 Major Update

**Significantly improved plugin performance (approx 40x faster)**
Expand Down
113 changes: 113 additions & 0 deletions src/main/java/com/tileman/TileInfoOverlay.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,20 @@
*/
package com.tileman;

import net.runelite.api.Tile;
import net.runelite.api.WorldView;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayMenuEntry;
import net.runelite.client.ui.overlay.OverlayPanel;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.components.LineComponent;
import net.runelite.client.ui.overlay.components.PanelComponent;
import net.runelite.client.ui.overlay.components.TitleComponent;

import javax.inject.Inject;
import java.awt.*;
import java.time.Duration;

import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG;
import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE;
Expand Down Expand Up @@ -85,6 +91,10 @@ public Dimension render(Graphics2D graphics) {
.right(unlockedTiles)
.build());


renderTileInfoPanel(panelComponent);
renderPerformancePanel(panelComponent);

panelComponent.setPreferredSize(new Dimension(
getLongestStringWidth(STRINGS, graphics)
+ getLongestStringWidth(new String[] {unlockedTiles, unspentTiles}, graphics),
Expand All @@ -93,6 +103,109 @@ public Dimension render(Graphics2D graphics) {
return super.render(graphics);
}

private void renderTileInfoPanel(PanelComponent panelComponent) {

if (!config.showTileInfo()) {
return;
}

TitleComponent spacer = TitleComponent.builder().text("").build();
panelComponent.getChildren().add(spacer);

TitleComponent title = TitleComponent.builder().text("Tile Info").color(Color.ORANGE).build();
panelComponent.getChildren().add(title);

WorldPoint target;
try{
target = plugin.getClient().getLocalPlayer().getWorldView().getSelectedSceneTile().getWorldLocation();
} catch (Exception ex) {
panelComponent.getChildren().add(LineComponent.builder()
.left("Invalid Target")
.build());
return;
}

panelComponent.getChildren().add(LineComponent.builder()
.left("RegionID:")
.right(String.valueOf(target.getRegionID()))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("RegionX:")
.right(String.valueOf(target.getRegionX()))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("RegionY:")
.right(String.valueOf(target.getRegionY()))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("RegionPlane:")
.right(String.valueOf(target.getPlane()))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("State:")
.right(plugin.getTilesToRender().contains(target) ? "Unlocked" : "Locked")
.build());
}

private void renderPerformancePanel(PanelComponent panelComponent) {
if (config.showPerformanceInfo()) {

TitleComponent spacer = TitleComponent.builder().text("").build();
panelComponent.getChildren().add(spacer);

TitleComponent title = TitleComponent.builder().text("Performance").color(Color.ORANGE).build();
panelComponent.getChildren().add(title);

panelComponent.getChildren().add(LineComponent.builder()
.left("Region Read:")
.right(prettyDuration(plugin.durationLastRegionRead))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("Region Write:")
.right(prettyDuration(plugin.durationLastRegionWrite))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("Wayfind:")
.right(prettyDuration(plugin.durationLastWayfind))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("Startup:")
.right(prettyDuration(plugin.durationLastStart))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("AutoTile:")
.right(prettyDuration(plugin.durationLastMove))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("Tiles Update:")
.right(prettyDuration(plugin.durationLastTilesUpdate))
.build());

panelComponent.getChildren().add(LineComponent.builder()
.left("Render:")
.right(prettyDuration(plugin.durationLastRender))
.build());
}
}

private String prettyDuration(Duration d)
{
if (d == null) {
return "-";
}
long millis = d.toMillis();
return millis >= 1 ? String.valueOf(millis) + "ms" : "<1ms";
}

private Color getTextColor() {
if(config.enableTileWarnings()) {
if (plugin.getRemainingTiles() <= 0) {
Expand Down
Loading