Skip to content

Commit 99866c8

Browse files
feat: add current task overlay
Adds an overlay displaying the current task. This is the same overlay that is used in the GenerateTask videos.
1 parent 4016142 commit 99866c8

6 files changed

Lines changed: 107 additions & 4 deletions

File tree

src/main/java/com/westerhoud/osrs/taskman/TaskmanConfig.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,13 @@ default String spreadsheetKey() {
2424
default String passphrase() {
2525
return "";
2626
}
27+
28+
@ConfigItem(
29+
position = 2,
30+
keyName = "showOverlay",
31+
name = "Show current task overlay",
32+
description = "Adds an overlay displaying the current task to the game client")
33+
default boolean showOverlay() {
34+
return true;
35+
}
2736
}

src/main/java/com/westerhoud/osrs/taskman/TaskmanPlugin.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.westerhoud.osrs.taskman.domain.AccountProgress;
66
import com.westerhoud.osrs.taskman.domain.Task;
77
import com.westerhoud.osrs.taskman.service.SheetService;
8+
import com.westerhoud.osrs.taskman.ui.CurrentTaskOverlay;
89
import com.westerhoud.osrs.taskman.ui.TaskmanPluginPanel;
910
import java.awt.image.BufferedImage;
1011
import javax.inject.Inject;
@@ -18,6 +19,7 @@
1819
import net.runelite.client.plugins.PluginDescriptor;
1920
import net.runelite.client.ui.ClientToolbar;
2021
import net.runelite.client.ui.NavigationButton;
22+
import net.runelite.client.ui.overlay.OverlayManager;
2123
import net.runelite.client.util.ImageUtil;
2224
import okhttp3.OkHttpClient;
2325

@@ -28,6 +30,8 @@ public class TaskmanPlugin extends Plugin {
2830
@Inject private ClientToolbar clientToolbar;
2931
@Inject private TaskmanConfig config;
3032
@Inject private OkHttpClient okHttpClient;
33+
@Inject private OverlayManager overlayManager;
34+
@Inject private CurrentTaskOverlay currentTaskOverlay;
3135

3236
private TaskmanPluginPanel sidePanel;
3337
private SheetService sheetService;
@@ -49,6 +53,7 @@ protected void startUp() throws Exception {
4953
.panel(sidePanel)
5054
.build();
5155
clientToolbar.addNavigation(navigationButton);
56+
overlayManager.add(currentTaskOverlay);
5257
}
5358

5459
@Override
@@ -58,15 +63,21 @@ protected void shutDown() throws Exception {
5863
}
5964

6065
public Task getCurrentTask() throws Exception {
61-
return sheetService.getCurrentTask(getCredentials().getIdentifier());
66+
final Task task = sheetService.getCurrentTask(getCredentials().getIdentifier());
67+
currentTaskOverlay.setTask(task);
68+
return task;
6269
}
6370

6471
public Task generateTask() throws Exception {
65-
return sheetService.generateTask(getCredentials());
72+
final Task task = sheetService.generateTask(getCredentials());
73+
currentTaskOverlay.setTask(task);
74+
return task;
6675
}
6776

6877
public Task completeTask() throws Exception {
69-
return sheetService.completeTask(getCredentials());
78+
final Task task = sheetService.completeTask(getCredentials());
79+
currentTaskOverlay.setTask(task);
80+
return task;
7081
}
7182

7283
public AccountProgress progress() throws Exception {

src/main/java/com/westerhoud/osrs/taskman/domain/Task.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@
1515
public class Task {
1616
private String name;
1717
private String imageUrl;
18+
private transient BufferedImage image;
1819

1920
public String getImageUrl() {
2021
return imageUrl.startsWith("http://") ? imageUrl.replace("http://", "https://") : imageUrl;
2122
}
2223

2324
public BufferedImage getImage() {
24-
BufferedImage image = null;
25+
if (image != null) {
26+
return image;
27+
}
28+
2529
try {
2630
final URL imageUrl = new URL(getImageUrl());
2731
image = ImageIO.read(imageUrl);
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.westerhoud.osrs.taskman.ui;
2+
3+
import com.westerhoud.osrs.taskman.domain.Task;
4+
import java.awt.Dimension;
5+
import java.awt.Graphics2D;
6+
import java.awt.Image;
7+
import java.awt.Point;
8+
import java.awt.Rectangle;
9+
import java.awt.image.BufferedImage;
10+
import lombok.Getter;
11+
import lombok.RequiredArgsConstructor;
12+
import lombok.Setter;
13+
import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity;
14+
import net.runelite.client.util.ImageUtil;
15+
16+
@RequiredArgsConstructor
17+
@Setter
18+
public class CurrentTaskComponent implements LayoutableRenderableEntity {
19+
20+
public static final int BORDER_SIZE = 15;
21+
private final Task task;
22+
private final BufferedImage background =
23+
ImageUtil.loadImageResource(getClass(), "empty_dark.png");
24+
25+
@Getter private final Rectangle bounds = new Rectangle();
26+
private Point preferredLocation = new Point();
27+
28+
@Override
29+
public void setPreferredSize(final Dimension dimension) {}
30+
31+
@Override
32+
public Dimension render(final Graphics2D graphics) {
33+
graphics.drawImage(background, preferredLocation.x, preferredLocation.y, null);
34+
35+
final int taskIconSize = background.getHeight() - (BORDER_SIZE * 2);
36+
final int taskIconX = background.getWidth() - BORDER_SIZE - taskIconSize;
37+
38+
final Image resizedTaskIcon = resizeImage(task.getImage(), taskIconSize, taskIconSize);
39+
graphics.drawImage(resizedTaskIcon, taskIconX, BORDER_SIZE, null);
40+
41+
final Dimension dimension = new Dimension(background.getWidth(), background.getHeight());
42+
bounds.setLocation(preferredLocation);
43+
bounds.setSize(dimension);
44+
return dimension;
45+
}
46+
47+
private Image resizeImage(final BufferedImage image, final int width, final int height) {
48+
return image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
49+
}
50+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.westerhoud.osrs.taskman.ui;
2+
3+
import com.westerhoud.osrs.taskman.TaskmanConfig;
4+
import com.westerhoud.osrs.taskman.domain.Task;
5+
import java.awt.Dimension;
6+
import java.awt.Graphics2D;
7+
import javax.inject.Inject;
8+
import lombok.Setter;
9+
import net.runelite.client.ui.overlay.OverlayPanel;
10+
11+
public class CurrentTaskOverlay extends OverlayPanel {
12+
13+
@Setter private Task task;
14+
private final TaskmanConfig config;
15+
16+
@Inject
17+
public CurrentTaskOverlay(final TaskmanConfig config) {
18+
this.config = config;
19+
}
20+
21+
@Override
22+
public Dimension render(final Graphics2D graphics) {
23+
if (!config.showOverlay() || task == null) {
24+
return null;
25+
}
26+
panelComponent.getChildren().add(new CurrentTaskComponent(task));
27+
return super.render(graphics);
28+
}
29+
}
12.8 KB
Loading

0 commit comments

Comments
 (0)