Compare commits

...

14 Commits

Author SHA1 Message Date
Karli
ce480a1185 update 2025-10-12 21:43:27 +03:00
riktenx
9324c7f55c Merge pull request #56 from Toofifty/textoutline
text visibility enhancements
2025-08-30 17:33:45 -04:00
riktenx
aa89432e84 contrib/version 2025-08-29 12:03:15 -04:00
riktenx
5cb7de46c6 text visibility enhancements
* add config for text outline, draw text over gameobject highlight
* add configurable dynamic overlay font
* space heat/action text according to font height
* draw text manually
* add configurable text background
2025-08-29 11:59:15 -04:00
riktenx
00b214af3f Merge pull request #55 from Toofifty/removelocation
remove unused Location enum
2025-08-28 15:05:06 -04:00
riktenx
210350e627 remove unused Location enum 2025-08-28 15:04:44 -04:00
riktenx
b374307309 Merge pull request #54 from Toofifty/v1010
set v1.0.10
2025-08-28 14:42:20 -04:00
riktenx
0c812ac666 set v1.0.10 2025-08-28 14:42:02 -04:00
riktenx
c3bea71867 Merge pull request #53 from Toofifty/contrib
add Aiadan to contributors
2025-08-28 14:41:37 -04:00
riktenx
bbc7fddf58 add Aiadan to contributors 2025-08-28 14:41:06 -04:00
riktenx
cbd778b598 Merge pull request #52 from Aiadan/metal-info-box
Added an info box for Giants' Foundry
2025-08-28 14:36:52 -04:00
riktenx
257288a6a3 fixup 2025-08-28 14:34:17 -04:00
Christopher Riwik
82d6add928 Default to not show info box anywhere.
Added a red "Open bank" text if you haven't opened the bank yet.
Updated the count to only update when itemContainerChanged triggers.
2025-08-27 18:28:56 +02:00
Christopher Riwik
50d72f9635 Added an info box showing the total amount of usable metal you own for Giants' foundry, with possibility to filter for any combination of equipment, metal bars and ore. 2025-08-20 17:53:48 +02:00
13 changed files with 1106 additions and 99 deletions

View File

@@ -65,4 +65,7 @@ Bonus Click Notification | Information Panel
* Added bonus action tracking
- [TalSk](https://github.com/TalSk "TalSk's github")
* Integrated Smith's outfit effect
- [Aiadan](https://github.com/Aiadan "Aiadan's github")
* Added metal counter
- [Rikten X](https://github.com/riktenx "Rikten X's github")
* Added configs to enhance text visibility

View File

@@ -27,7 +27,7 @@ dependencies {
}
group = 'com.toofifty'
version = '1.0.9'
version = '1.0.11'
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
@@ -62,3 +62,11 @@ tasks.register('shadowJar', Jar) {
archiveFileName.set("${rootProject.name}-${project.version}-all.jar")
}
task runClient(type: JavaExec) {
group = 'application'
description = 'Run the PluginTester main class to launch RuneLite with plugins'
classpath = sourceSets.test.runtimeClasspath
mainClass = 'com.toofifty.easygiantsfoundry.EasyGiantsFoundryPluginTest'
jvmArgs '-ea'
}

0
gradlew vendored Normal file → Executable file
View File

View File

@@ -1,6 +1,9 @@
package com.toofifty.easygiantsfoundry;
import java.awt.Color;
import com.toofifty.easygiantsfoundry.enums.FontType;
import net.runelite.client.config.Alpha;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
@@ -187,6 +190,22 @@ public interface EasyGiantsFoundryConfig extends Config
return true;
}
@Range(
min = 100,
max = 200
)
@ConfigItem(
keyName = "clickboxScale",
name = "Clickbox scale %",
description = "Scale clickbox highlights to make targets easier to click.",
position = 4,
section = highlightList
)
default int clickboxScale()
{
return 150;
}
@ConfigItem(
keyName = "waterLavaHighlight",
name = "Highlight Waterfall/Lava Pool",
@@ -350,6 +369,42 @@ public interface EasyGiantsFoundryConfig extends Config
return false;
}
@ConfigItem(
keyName = "heatDelta",
name = "Heat change",
description = "Show the heat delta and recommended location for the next adjust.",
position = 7,
section = infoPanelList
)
default boolean drawHeatDelta()
{
return true;
}
@ConfigItem(
keyName = "heatPlan",
name = "Heat plan",
description = "Show fast/slow heat action plans with predicted results.",
position = 8,
section = infoPanelList
)
default boolean drawHeatPlan()
{
return true;
}
@ConfigItem(
keyName = "heatActionTimer",
name = "Heat action timer",
description = "Show the active heat action countdown in the info panel.",
position = 9,
section = infoPanelList
)
default boolean drawHeatActionTimer()
{
return true;
}
@ConfigSection(
name = "Info Overlay",
description = "Overlay Text Info On Objects",
@@ -509,6 +564,116 @@ public interface EasyGiantsFoundryConfig extends Config
return Color.CYAN;
}
@ConfigItem(
keyName = "textBackground",
name = "Text Background",
description = "Set a color to draw a box behind text.",
position = 7,
section = colourList
)
@Alpha
default Color textBackground()
{
return null;
}
@ConfigItem(
keyName = "dynamicOverlayFont",
name = "Dynamic Overlay Font",
description = "Choose the font type for the info overlay.<br/>" +
"Defaults to your setting from RuneLite -> Overlay settings -> Dynamic overlay font.",
position = 10,
section = colourList
)
default FontType dynamicOverlayFont()
{
return FontType.DEFAULT;
}
@ConfigItem(
keyName = "textOutline",
name = "Text Outline",
description = "Use an outline around text instead of a shadow.",
position = 11,
section = colourList
)
default boolean textOutline()
{
return false;
}
@ConfigItem(
position = -100,
keyName = "alwaysShowInfoPanel",
name = "Always show",
description = "Always show the info panel, even outside of Giants' Foundry.",
section = infoPanelList
)
default boolean alwaysDrawInfoPanel()
{
return false;
}
@ConfigItem(
position = 100,
keyName = "drawMetals",
name = "Metals",
description = "Show total metals count in the info panel.",
section = infoPanelList
)
default boolean drawMetals()
{
return false;
}
@ConfigItem(
position = 101,
keyName = "drawAllMetals",
name = "Metals: show all",
description = "Show rows for metals even if you don't have any of that type.",
section = infoPanelList
)
default boolean drawAllMetals()
{
return false;
}
@ConfigItem(
position = 110,
keyName = "countOre",
name = "Metals: count ore",
description = "Include raw ores in the metals count.",
section = infoPanelList
)
default boolean countOre()
{
return true;
}
@ConfigItem(
position = 111,
keyName = "countBars",
name = "Metals: count bars",
description = "Include smelted bars in the metals count.",
section = infoPanelList
)
default boolean countBars()
{
return true;
}
@ConfigItem(
position = 112,
keyName = "countEquipment",
name = "Metals: count equipment",
description = "Include equipment in the metals count.",
section = infoPanelList
)
default boolean countEquipment()
{
return true;
}
@ConfigSection(
name = "Advanced",
description = "Advanced Settings",

View File

@@ -1,17 +1,18 @@
package com.toofifty.easygiantsfoundry;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Point;
import net.runelite.client.ui.ColorScheme;
import javax.inject.Singleton;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
@Slf4j
@Singleton
public final class EasyGiantsFoundryHelper
{
public static Color getHeatColor(int actions, int heat)
{
if (heat >= actions)
@@ -26,4 +27,30 @@ public final class EasyGiantsFoundryHelper
return ColorScheme.PROGRESS_ERROR_COLOR;
}
public static void renderTextLocation(Graphics2D graphics, Point point, String text, Color fg, Color bg, boolean outline)
{
if (bg != null)
{
FontMetrics fm = graphics.getFontMetrics();
graphics.setColor(bg);
graphics.fillRect(point.getX(), point.getY() - fm.getHeight(), fm.stringWidth(text), fm.getHeight());
}
graphics.setColor(Color.BLACK);
if (outline)
{
graphics.drawString(text, point.getX(), point.getY() + 1);
graphics.drawString(text, point.getX(), point.getY() - 1);
graphics.drawString(text, point.getX() + 1, point.getY());
graphics.drawString(text, point.getX() - 1, point.getY());
}
else
{
graphics.drawString(text, point.getX() + 1, point.getY() + 1);
}
graphics.setColor(fg);
graphics.drawString(text, point.getX(), point.getY());
}
}

View File

@@ -14,7 +14,7 @@ import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
import net.runelite.api.GameObject;
import net.runelite.api.GameState;
import net.runelite.api.InventoryID;
import net.runelite.api.gameval.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.ItemContainer;
import net.runelite.api.MenuAction;
@@ -75,6 +75,9 @@ public class EasyGiantsFoundryPlugin extends Plugin
@Inject
private EasyGiantsFoundryHelper helper;
@Inject
private MetalBarCounter metalBarCounter;
@Inject
private OverlayManager overlayManager;
@@ -118,6 +121,7 @@ public class EasyGiantsFoundryPlugin extends Plugin
{
overlayManager.remove(overlay2d);
overlayManager.remove(overlay3d);
metalBarCounter.clear();
}
@Subscribe
@@ -253,7 +257,7 @@ public class EasyGiantsFoundryPlugin extends Plugin
@Subscribe
public void onItemContainerChanged(ItemContainerChanged event)
{
if (event.getContainerId() == InventoryID.EQUIPMENT.getId())
if (event.getContainerId() == InventoryID.WORN)
{
if (event.getItemContainer().count(PREFORM) == 0)
{
@@ -265,6 +269,10 @@ public class EasyGiantsFoundryPlugin extends Plugin
updateSmithsOutfitPieces();
}
}
else if (event.getContainerId() == InventoryID.INV || event.getContainerId() == InventoryID.BANK)
{
metalBarCounter.put(event.getItemContainer());
}
}
public void onMenuEntryAdded(MenuEntryAdded event)
@@ -474,7 +482,7 @@ public class EasyGiantsFoundryPlugin extends Plugin
{
int pieces = 0;
ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT);
ItemContainer equipment = client.getItemContainer(InventoryID.WORN);
if (equipment != null)
{
for (Item item : equipment.getItems())

View File

@@ -1,15 +1,15 @@
package com.toofifty.easygiantsfoundry;
import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryHelper.getHeatColor;
import com.toofifty.easygiantsfoundry.enums.Heat;
import com.toofifty.easygiantsfoundry.enums.MetalBarType;
import com.toofifty.easygiantsfoundry.enums.Stage;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import net.runelite.api.Client;
import net.runelite.client.ui.ColorScheme;
import net.runelite.client.ui.overlay.OverlayPanel;
@@ -21,9 +21,12 @@ import net.runelite.client.ui.overlay.components.TitleComponent;
public class FoundryOverlay2D extends OverlayPanel
{
private static final int REGION_ID = 13491;
private static final int PANEL_WIDTH = 240;
private final Client client;
private final EasyGiantsFoundryPlugin plugin;
private final EasyGiantsFoundryState state;
private final MetalBarCounter metalBarCounter;
private final EasyGiantsFoundryConfig config;
@Inject
@@ -31,13 +34,403 @@ public class FoundryOverlay2D extends OverlayPanel
Client client,
EasyGiantsFoundryPlugin plugin,
EasyGiantsFoundryState state,
MetalBarCounter metalBarCounter,
EasyGiantsFoundryConfig config)
{
this.client = client;
this.plugin = plugin;
this.state = state;
this.metalBarCounter = metalBarCounter;
this.config = config;
this.setPosition(OverlayPosition.BOTTOM_LEFT);
setPosition(OverlayPosition.BOTTOM_LEFT);
}
@Override
public Dimension render(Graphics2D graphics)
{
if (!config.alwaysDrawInfoPanel() && client.getLocalPlayer().getWorldLocation().getRegionID() != REGION_ID)
{
return null;
}
panelComponent.getChildren().clear();
panelComponent.setPreferredSize(new Dimension(PANEL_WIDTH, 0));
boolean hasContent = false;
if (config.drawTitle())
{
panelComponent.getChildren().add(TitleComponent.builder().text("Easy Giants' Foundry").build());
hasContent = true;
}
boolean swordPickedUp = state.isEnabled() && state.getCurrentStage() != null;
if (swordPickedUp)
{
hasContent = appendSection(buildStatusLines(), hasContent);
hasContent = appendSection(buildProgressLines(), hasContent);
hasContent = appendSection(buildHeatPlannerLines(), hasContent);
}
hasContent = appendSection(buildReputationLines(), hasContent);
hasContent = appendSection(buildMetalLines(), hasContent);
if (!hasContent)
{
return null;
}
return super.render(graphics);
}
private boolean appendSection(List<LineComponent> lines, boolean hasPreviousContent)
{
if (lines.isEmpty())
{
return hasPreviousContent;
}
if (hasPreviousContent)
{
panelComponent.getChildren().add(LineComponent.builder().left(" ").right("").build());
}
panelComponent.getChildren().addAll(lines);
return true;
}
private List<LineComponent> buildStatusLines()
{
List<LineComponent> lines = new ArrayList<>();
Heat heat = state.getCurrentHeat();
Stage stage = state.getCurrentStage();
if (config.drawHeatInfo())
{
lines.add(
LineComponent.builder()
.left("Heat")
.right(heat.getName() + " (" + state.getHeatAmount() / 10 + "%)")
.rightColor(heat.getColor())
.build()
);
}
if (config.drawStageInfo())
{
lines.add(
LineComponent.builder()
.left("Stage")
.right(stage.getName() + " (" + state.getProgressAmount() / 10 + "%)")
.rightColor(stage.getHeat().getColor())
.build()
);
}
return lines;
}
private List<LineComponent> buildProgressLines()
{
List<LineComponent> lines = new ArrayList<>();
int actionsLeft = state.getActionsLeftInStage();
int heatLeft = state.getActionsForHeatLevel();
if (config.drawActionsLeft())
{
lines.add(LineComponent.builder().left("Actions left").right(Integer.toString(actionsLeft)).build());
}
if (config.drawHeatLeft())
{
lines.add(
LineComponent.builder()
.left("Heat left")
.right(Integer.toString(heatLeft))
.rightColor(getHeatColor(actionsLeft, heatLeft))
.build()
);
}
if (config.drawBonusActions())
{
lines.add(
LineComponent.builder()
.left("Bonus actions")
.right(state.getBonusActionsReceived() + "/" + state.getBonusActionsExpected())
.rightColor(getBonusActionsColor(state.getBonusActionsReceived(), state.getBonusActionsExpected()))
.build()
);
}
return lines;
}
private List<LineComponent> buildHeatPlannerLines()
{
List<LineComponent> lines = new ArrayList<>();
if (!config.drawHeatDelta() && !config.drawHeatPlan() && !config.drawHeatActionTimer())
{
return lines;
}
if (state.getCurrentStage() == null)
{
return lines;
}
int heatChangeNeeded = state.getHeatChangeNeeded();
if (config.drawHeatDelta())
{
lines.add(buildHeatDeltaLine(heatChangeNeeded));
}
if (config.drawHeatPlan())
{
lines.addAll(buildHeatPlanLines(heatChangeNeeded));
}
if (config.drawHeatActionTimer())
{
LineComponent timerLine = buildHeatActionTimerLine();
if (timerLine != null)
{
lines.add(timerLine);
}
}
return lines;
}
private LineComponent buildHeatDeltaLine(int heatChangeNeeded)
{
String location;
if (heatChangeNeeded > 0)
{
location = "Lava";
}
else if (heatChangeNeeded < 0)
{
location = "Waterfall";
}
else
{
location = "In range";
}
String deltaText = heatChangeNeeded == 0
? "0 (in range)"
: String.format("%+d (%s)", heatChangeNeeded, location);
Color color = heatChangeNeeded == 0 ? ColorScheme.PROGRESS_COMPLETE_COLOR : config.lavaWaterfallColour();
return LineComponent.builder()
.left("Heat Δ")
.right(deltaText)
.rightColor(color)
.build();
}
private List<LineComponent> buildHeatPlanLines(int heatChangeNeeded)
{
List<LineComponent> lines = new ArrayList<>();
if (heatChangeNeeded == 0)
{
lines.add(
LineComponent.builder()
.left("Heat plan")
.right("Hold")
.rightColor(ColorScheme.PROGRESS_COMPLETE_COLOR)
.build()
);
return lines;
}
boolean isHeating = heatChangeNeeded > 0;
HeatActionSolver.DurationResult fast = solveHeatAction(true, isHeating);
HeatActionSolver.DurationResult slow = solveHeatAction(false, isHeating);
boolean added = false;
if (fast != null && fast.getDuration() > 0)
{
lines.add(buildHeatPlanLine("Fast", isHeating, true, fast));
added = true;
}
if (slow != null && slow.getDuration() > 0)
{
lines.add(buildHeatPlanLine("Slow", isHeating, false, slow));
added = true;
}
if (!added)
{
lines.add(
LineComponent.builder()
.left("Heat plan")
.right("Hold")
.rightColor(ColorScheme.PROGRESS_COMPLETE_COLOR)
.build()
);
}
return lines;
}
private LineComponent buildHeatPlanLine(String label, boolean isHeating, boolean fast, HeatActionSolver.DurationResult result)
{
String actionName = getActionName(isHeating, fast);
String value = String.format("%s %dt → %s%s",
actionName,
result.getDuration(),
formatPredictedHeat(result.getPredictedHeat()),
formatPlanStatus(result));
return LineComponent.builder()
.left(label)
.right(value)
.rightColor(config.lavaWaterfallColour())
.build();
}
private HeatActionSolver.DurationResult solveHeatAction(boolean fast, boolean isHeating)
{
Stage stage = state.getCurrentStage();
if (stage == null)
{
return null;
}
return HeatActionSolver.solve(
stage,
state.getCurrentHeatRange(),
state.getActionsLeftInStage(),
state.getHeatAmount(),
fast,
isHeating,
config.heatActionPadTicks(),
state.isPlayerRunning()
);
}
private LineComponent buildHeatActionTimerLine()
{
HeatActionStateMachine machine = state.heatActionStateMachine;
if (machine.isIdle() || machine.getActionname() == null)
{
return null;
}
return LineComponent.builder()
.left("Action")
.right(String.format(
"%s %dt → %s%s",
prettifyActionName(machine.getActionname()),
machine.getRemainingDuration(),
formatPredictedHeat(machine.getPredictedHeat()),
machine.isGoalInRange() ? "" : machine.isOverShooting() ? " (overshoot)" : " (limit)"))
.rightColor(config.lavaWaterfallColour())
.build();
}
private String formatPredictedHeat(int predictedHeat)
{
return heatPercent(predictedHeat) + "%";
}
private String formatPlanStatus(HeatActionSolver.DurationResult result)
{
if (result == null || result.isGoalInRange())
{
return "";
}
return result.isOvershooting() ? " (overshoot)" : " (limit)";
}
private String getActionName(boolean isHeating, boolean fast)
{
if (isHeating)
{
return fast ? "Dunk" : "Heat";
}
return fast ? "Quench" : "Cool";
}
private String prettifyActionName(String action)
{
if (action == null || action.isEmpty())
{
return "";
}
switch (action)
{
case "dunks":
return "Dunk";
case "heats":
return "Heat";
case "cools":
return "Cool";
case "quenches":
return "Quench";
default:
return Character.toUpperCase(action.charAt(0)) + action.substring(1);
}
}
private int heatPercent(int heat)
{
return Math.max(0, Math.min(1000, heat)) / 10;
}
private List<LineComponent> buildReputationLines()
{
List<LineComponent> lines = new ArrayList<>();
if (!config.drawShopPoints())
{
return lines;
}
lines.add(LineComponent.builder().left("Reputation").right(Integer.toString(plugin.getReputation())).build());
return lines;
}
private List<LineComponent> buildMetalLines()
{
List<LineComponent> lines = new ArrayList<>();
if (!config.drawMetals())
{
return lines;
}
if (!metalBarCounter.isSeenBank())
{
lines.add(
LineComponent.builder()
.left("Metals: open bank")
.leftColor(Color.RED)
.build()
);
}
addMetalCount(lines, "Bronze bars:", metalBarCounter.get(MetalBarType.BRONZE));
addMetalCount(lines, "Iron bars:", metalBarCounter.get(MetalBarType.IRON));
addMetalCount(lines, "Steel bars:", metalBarCounter.get(MetalBarType.STEEL));
addMetalCount(lines, "Mithril bars:", metalBarCounter.get(MetalBarType.MITHRIL));
addMetalCount(lines, "Adamant bars:", metalBarCounter.get(MetalBarType.ADAMANT));
addMetalCount(lines, "Runite bars:", metalBarCounter.get(MetalBarType.RUNITE));
return lines;
}
private void addMetalCount(List<LineComponent> lines, String displayName, int count)
{
if (count > 0 || config.drawAllMetals())
{
lines.add(LineComponent.builder().left(displayName).right(Integer.toString(count)).build());
}
}
private Color getHeatColor(int actions, int heat)
@@ -64,70 +457,4 @@ public class FoundryOverlay2D extends OverlayPanel
return ColorScheme.PROGRESS_INPROGRESS_COLOR;
}
@Override
public Dimension render(Graphics2D graphics)
{
if (client.getLocalPlayer().getWorldLocation().getRegionID() != REGION_ID)
{
return null;
}
boolean swordPickedUp = state.isEnabled() && state.getCurrentStage() != null;
if (config.drawTitle())
{
panelComponent.getChildren().add(TitleComponent.builder().text("Easy Giants' Foundry").build());
}
if (swordPickedUp)
{
Heat heat = state.getCurrentHeat();
Stage stage = state.getCurrentStage();
if (config.drawHeatInfo())
{
panelComponent.getChildren().add(
LineComponent.builder().left("Heat").right(heat.getName() + " (" + state.getHeatAmount() / 10 + "%)").rightColor(heat.getColor()).build()
);
}
if (config.drawStageInfo())
{
panelComponent.getChildren().add(
LineComponent.builder().left("Stage").right(stage.getName() + " (" + state.getProgressAmount() / 10 + "%)").rightColor(stage.getHeat().getColor()).build()
);
}
int actionsLeft = state.getActionsLeftInStage();
int heatLeft = state.getActionsForHeatLevel();
if (config.drawActionsLeft())
{
panelComponent.getChildren().add(
LineComponent.builder().left("Actions left").right(actionsLeft + "").build()
);
}
if (config.drawHeatLeft())
{
panelComponent.getChildren().add(
LineComponent.builder().left("Heat left").right(heatLeft + "").rightColor(getHeatColor(actionsLeft, heatLeft)).build()
);
}
if (config.drawBonusActions())
{
panelComponent.getChildren().add(
LineComponent.builder().left("Bonus actions").right(state.getBonusActionsReceived() + "/" + state.getBonusActionsExpected()).rightColor(getBonusActionsColor(state.getBonusActionsReceived(), state.getBonusActionsExpected())).build()
);
}
}
//
// int points = plugin.getPointsTracker().getShopPoints();
if (config.drawShopPoints())
{
panelComponent.getChildren().add(
LineComponent.builder().left("Reputation").right(plugin.getReputation() + "").build()
);
}
return super.render(graphics);
}
}

View File

@@ -2,9 +2,11 @@ package com.toofifty.easygiantsfoundry;
import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.*;
import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryHelper.getHeatColor;
import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryHelper.renderTextLocation;
import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_1_VARBIT;
import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_2_VARBIT;
import com.toofifty.easygiantsfoundry.enums.CommissionType;
import com.toofifty.easygiantsfoundry.enums.FontType;
import com.toofifty.easygiantsfoundry.enums.Heat;
import com.toofifty.easygiantsfoundry.enums.Stage;
@@ -12,6 +14,8 @@ import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.inject.Inject;
import net.runelite.api.Client;
@@ -24,7 +28,6 @@ import net.runelite.api.coords.LocalPoint;
import net.runelite.api.widgets.Widget;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayUtil;
import net.runelite.client.ui.overlay.outline.ModelOutlineRenderer;
import org.apache.commons.lang3.StringUtils;
@@ -107,6 +110,11 @@ public class FoundryOverlay3D extends Overlay
return null;
}
if (config.dynamicOverlayFont() != FontType.DEFAULT)
{
graphics.setFont(config.dynamicOverlayFont().getFont());
}
if (config.highlightKovac())
{
drawKovacIfHandIn(graphics);
@@ -147,8 +155,6 @@ public class FoundryOverlay3D extends Overlay
return null;
}
drawActionOverlay(graphics, stageObject);
Heat heat = state.getCurrentHeat();
Color color = getObjectColor(stage, heat);
// TODO Config
@@ -186,6 +192,8 @@ public class FoundryOverlay3D extends Overlay
}
}
drawActionOverlay(graphics, stageObject);
return null;
}
@@ -194,6 +202,7 @@ public class FoundryOverlay3D extends Overlay
Shape objectClickbox = stageObject.getClickbox();
if (objectClickbox != null && config.highlightTools())
{
objectClickbox = scaleShape(objectClickbox);
Point mousePosition = client.getMouseCanvasPosition();
if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY()))
{
@@ -274,7 +283,7 @@ public class FoundryOverlay3D extends Overlay
Color color = config.lavaWaterfallColour();
OverlayUtil.renderTextLocation(graphics, pos, text, color);
renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
}
private void drawHeatChangerOverlay(Graphics2D graphics, GameObject stageObject)
@@ -304,7 +313,7 @@ public class FoundryOverlay3D extends Overlay
Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50);
Color color = config.lavaWaterfallColour();
OverlayUtil.renderTextLocation(graphics, pos, text, color);
renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
}
private void drawHeatChangers(Graphics2D graphics)
@@ -324,6 +333,7 @@ public class FoundryOverlay3D extends Overlay
}
if (shape != null)
{
shape = scaleShape(shape);
Point mousePosition = client.getMouseCanvasPosition();
Color color = config.lavaWaterfallColour();
if (shape.contains(mousePosition.getX(), mousePosition.getY()))
@@ -382,7 +392,7 @@ public class FoundryOverlay3D extends Overlay
{
color = config.generalHighlight();
}
OverlayUtil.renderTextLocation(graphics, pos, text, color);
renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
}
private void drawMouldScoreIfMouldSet(Graphics2D graphics) {
@@ -405,7 +415,7 @@ public class FoundryOverlay3D extends Overlay
Point pos = Perspective.getCanvasTextLocation(client, graphics, mouldLoc, text, 115);
Color color = config.generalHighlight();
OverlayUtil.renderTextLocation(graphics, pos, text, color);
renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
}
private void drawPreformScoreIfPoured(Graphics2D graphics) {
if (client.getVarbitValue(VARBIT_GAME_STAGE) != 2)
@@ -425,7 +435,7 @@ public class FoundryOverlay3D extends Overlay
Color color = config.generalHighlight();
OverlayUtil.renderTextLocation(graphics, pos, text, color);
renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
}
private void drawCrucibleIfMouldSet(Graphics2D graphics)
@@ -439,13 +449,12 @@ public class FoundryOverlay3D extends Overlay
return;
}
drawCrucibleContent(graphics);
if (config.highlightStyle() == HighlightStyle.HIGHLIGHT_CLICKBOX)
{
Shape shape = crucible.getConvexHull();
if (shape != null)
{
shape = scaleShape(shape);
Color color = config.generalHighlight();
if (state.getCrucibleCount() == CRUCIBLE_CAPACITY)
{
@@ -473,6 +482,8 @@ public class FoundryOverlay3D extends Overlay
}
drawObjectOutline(graphics, crucible, color);
}
drawCrucibleContent(graphics);
}
private void drawMouldIfNotSet(Graphics2D graphics)
@@ -489,6 +500,7 @@ public class FoundryOverlay3D extends Overlay
Shape shape = mouldJig.getConvexHull();
if (shape != null)
{
shape = scaleShape(shape);
Color color = config.generalHighlight();
graphics.setColor(color);
graphics.draw(shape);
@@ -510,15 +522,37 @@ public class FoundryOverlay3D extends Overlay
textLocation = new LocalPoint(textLocation.getX(), textLocation.getY());
Point canvasLocation = Perspective.getCanvasTextLocation(client, graphics, textLocation, text, 100);
canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + 10);
OverlayUtil.renderTextLocation(graphics, canvasLocation, text, config.generalHighlight());
renderTextLocation(graphics, canvasLocation, text, config.generalHighlight(), config.textBackground(), config.textOutline());
}
}
private Shape scaleShape(Shape shape)
{
if (shape == null)
{
return null;
}
double scale = config.clickboxScale() / 100.0;
if (Math.abs(scale - 1.0) < 0.01)
{
return shape;
}
Rectangle2D bounds = shape.getBounds2D();
AffineTransform transform = new AffineTransform();
transform.translate(bounds.getCenterX(), bounds.getCenterY());
transform.scale(scale, scale);
transform.translate(-bounds.getCenterX(), -bounds.getCenterY());
return transform.createTransformedShape(shape);
}
private void drawStorage(Graphics2D graphics)
{
Shape shape = storage.getConvexHull();
if (shape != null)
{
shape = scaleShape(shape);
Color color = config.generalHighlight();
graphics.setColor(color);
graphics.draw(shape);
@@ -532,14 +566,15 @@ public class FoundryOverlay3D extends Overlay
Widget handInWidget = client.getWidget(HAND_IN_WIDGET);
if (handInWidget != null && !handInWidget.isHidden())
{
Shape shape = kovac.getConvexHull();
if (shape != null)
{
Color color = config.generalHighlight();
graphics.setColor(color);
graphics.draw(shape);
graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20));
graphics.fill(shape);
Shape shape = kovac.getConvexHull();
if (shape != null)
{
shape = scaleShape(shape);
Color color = config.generalHighlight();
graphics.setColor(color);
graphics.draw(shape);
graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), 20));
graphics.fill(shape);
}
}
}
@@ -562,7 +597,7 @@ public class FoundryOverlay3D extends Overlay
{
return;
}
OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft));
renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft), config.textBackground(), config.textOutline());
}
if (config.drawActionLeftOverlay())
// Draw actions left
@@ -575,8 +610,8 @@ public class FoundryOverlay3D extends Overlay
{
return;
}
canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + 10);
OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft));
canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + graphics.getFontMetrics().getHeight());
renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft), config.textBackground(), config.textOutline());
}
}
}

View File

@@ -0,0 +1,148 @@
package com.toofifty.easygiantsfoundry;
import com.toofifty.easygiantsfoundry.enums.MetalBarSource;
import com.toofifty.easygiantsfoundry.enums.MetalBarType;
import lombok.Getter;
import lombok.Value;
import net.runelite.api.Item;
import net.runelite.api.ItemContainer;
import net.runelite.api.gameval.InventoryID;
import net.runelite.api.gameval.ItemID;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.HashMap;
import java.util.Map;
@Singleton
public class MetalBarCounter
{
private final Map<Integer, Map<MetalBarType, CountsBySource>> index = new HashMap<>(); // container id -> bar counts
@Inject
private EasyGiantsFoundryConfig config;
@Getter
private boolean seenBank = false;
public int get(MetalBarType type)
{
int count = 0;
for (Map<MetalBarType, CountsBySource> counts : index.values())
{
count += counts.get(type).sum(config);
}
return count;
}
public void clear()
{
index.clear();
seenBank = false;
}
public void put(ItemContainer container)
{
int tinOre = 0;
int copperOre = 0;
int ironOre = 0;
if (container.getId() == InventoryID.BANK)
{
seenBank = true;
}
Map<MetalBarType, CountsBySource> counts = newCounts();
for (Item item : container.getItems())
{
MetalBarValues.Record record = MetalBarValues.get(item.getId());
if (record == null)
{
continue;
}
// ore special cases:
// * add bronze bars equal to min(tin, copper)
// * there is an edge case here where it won't sum quite right multiple item containers but I don't really
// care to code for that right now
// * iron ore counts for both iron and steel
switch (item.getId())
{
case ItemID.TIN_ORE:
case ItemID.Cert.TIN_ORE:
tinOre += item.getQuantity();
break;
case ItemID.COPPER_ORE:
case ItemID.Cert.COPPER_ORE:
copperOre += item.getQuantity();
break;
case ItemID.IRON_ORE:
case ItemID.Cert.IRON_ORE:
ironOre += item.getQuantity();
break;
default:
counts.compute(record.getType(), (k, v) ->
v.add(record.getSource(), record.getValue() * item.getQuantity()));
}
}
int finalTinOre = tinOre;
int finalCopperOre = copperOre;
int finalIronOre = ironOre;
counts.compute(MetalBarType.BRONZE, (k, v) ->
v.add(MetalBarSource.ORE, Math.min(finalTinOre, finalCopperOre)));
counts.compute(MetalBarType.IRON, (k, v) ->
v.add(MetalBarSource.ORE, finalIronOre));
counts.compute(MetalBarType.STEEL, (k, v) ->
v.add(MetalBarSource.ORE, finalIronOre));
index.put(container.getId(), counts);
}
private static Map<MetalBarType, CountsBySource> newCounts()
{
Map<MetalBarType, CountsBySource> counts = new HashMap<>();
counts.put(MetalBarType.BRONZE, CountsBySource.empty());
counts.put(MetalBarType.IRON, CountsBySource.empty());
counts.put(MetalBarType.STEEL, CountsBySource.empty());
counts.put(MetalBarType.MITHRIL, CountsBySource.empty());
counts.put(MetalBarType.ADAMANT, CountsBySource.empty());
counts.put(MetalBarType.RUNITE, CountsBySource.empty());
return counts;
}
@Value
private static class CountsBySource
{
int ores, bars, equipment;
public static CountsBySource empty()
{
return new CountsBySource(0, 0, 0);
}
public CountsBySource add(MetalBarSource source, int count)
{
switch (source)
{
case ORE:
return new CountsBySource(ores + count, bars, equipment);
case BAR:
return new CountsBySource(ores, bars + count, equipment);
case EQUIPMENT:
return new CountsBySource(ores, bars, equipment + count);
default:
return this;
}
}
public int sum(EasyGiantsFoundryConfig config)
{
int sum = config.countOre() ? ores : 0;
sum += config.countBars() ? bars : 0;
sum += config.countEquipment() ? equipment : 0;
return sum;
}
}
}

View File

@@ -0,0 +1,238 @@
package com.toofifty.easygiantsfoundry;
import com.toofifty.easygiantsfoundry.enums.MetalBarSource;
import com.toofifty.easygiantsfoundry.enums.MetalBarType;
import lombok.Value;
import net.runelite.api.gameval.ItemID;
import java.util.HashMap;
public class MetalBarValues
{
private static final HashMap<Integer, Record> values = new HashMap<>();
static
{
// tin, copper, and iron are included here so the counter doesn't ignore them, but their actual counts are
// handled as special cases
putOre(ItemID.TIN_ORE, MetalBarType.BRONZE);
putOre(ItemID.COPPER_ORE, MetalBarType.BRONZE);
putOre(ItemID.IRON_BAR, MetalBarType.IRON);
putOre(ItemID.MITHRIL_ORE, MetalBarType.MITHRIL);
putOre(ItemID.ADAMANTITE_ORE, MetalBarType.ADAMANT);
putOre(ItemID.RUNITE_ORE, MetalBarType.RUNITE);
putOre(ItemID.Cert.TIN_ORE, MetalBarType.BRONZE);
putOre(ItemID.Cert.COPPER_ORE, MetalBarType.BRONZE);
putOre(ItemID.Cert.IRON_BAR, MetalBarType.IRON);
putOre(ItemID.Cert.MITHRIL_ORE, MetalBarType.MITHRIL);
putOre(ItemID.Cert.ADAMANTITE_ORE, MetalBarType.ADAMANT);
putOre(ItemID.Cert.RUNITE_ORE, MetalBarType.RUNITE);
putBar(ItemID.BRONZE_BAR, MetalBarType.BRONZE);
putBar(ItemID.IRON_BAR, MetalBarType.IRON);
putBar(ItemID.STEEL_BAR, MetalBarType.STEEL);
putBar(ItemID.MITHRIL_BAR, MetalBarType.MITHRIL);
putBar(ItemID.ADAMANTITE_BAR, MetalBarType.ADAMANT);
putBar(ItemID.RUNITE_BAR, MetalBarType.RUNITE);
putBar(ItemID.Cert.BRONZE_BAR, MetalBarType.BRONZE);
putBar(ItemID.Cert.IRON_BAR, MetalBarType.IRON);
putBar(ItemID.Cert.STEEL_BAR, MetalBarType.STEEL);
putBar(ItemID.Cert.MITHRIL_BAR, MetalBarType.MITHRIL);
putBar(ItemID.Cert.ADAMANTITE_BAR, MetalBarType.ADAMANT);
putBar(ItemID.Cert.RUNITE_BAR, MetalBarType.RUNITE);
putEquipment(ItemID.BRONZE_SCIMITAR, MetalBarType.BRONZE, 1);
putEquipment(ItemID.BRONZE_LONGSWORD, MetalBarType.BRONZE, 1);
putEquipment(ItemID.BRONZE_FULL_HELM, MetalBarType.BRONZE, 1);
putEquipment(ItemID.BRONZE_SQ_SHIELD, MetalBarType.BRONZE, 1);
putEquipment(ItemID.BRONZE_CLAWS, MetalBarType.BRONZE, 1);
putEquipment(ItemID.BRONZE_WARHAMMER, MetalBarType.BRONZE, 2);
putEquipment(ItemID.BRONZE_BATTLEAXE, MetalBarType.BRONZE, 2);
putEquipment(ItemID.BRONZE_CHAINBODY, MetalBarType.BRONZE, 2);
putEquipment(ItemID.BRONZE_KITESHIELD, MetalBarType.BRONZE, 2);
putEquipment(ItemID.BRONZE_2H_SWORD, MetalBarType.BRONZE, 2);
putEquipment(ItemID.BRONZE_PLATELEGS, MetalBarType.BRONZE, 2);
putEquipment(ItemID.BRONZE_PLATESKIRT, MetalBarType.BRONZE, 2);
putEquipment(ItemID.BRONZE_PLATEBODY, MetalBarType.BRONZE, 4);
putEquipment(ItemID.Cert.BRONZE_SCIMITAR, MetalBarType.BRONZE, 1);
putEquipment(ItemID.Cert.BRONZE_LONGSWORD, MetalBarType.BRONZE, 1);
putEquipment(ItemID.Cert.BRONZE_FULL_HELM, MetalBarType.BRONZE, 1);
putEquipment(ItemID.Cert.BRONZE_SQ_SHIELD, MetalBarType.BRONZE, 1);
putEquipment(ItemID.Cert.BRONZE_CLAWS, MetalBarType.BRONZE, 1);
putEquipment(ItemID.Cert.BRONZE_WARHAMMER, MetalBarType.BRONZE, 2);
putEquipment(ItemID.Cert.BRONZE_BATTLEAXE, MetalBarType.BRONZE, 2);
putEquipment(ItemID.Cert.BRONZE_CHAINBODY, MetalBarType.BRONZE, 2);
putEquipment(ItemID.Cert.BRONZE_KITESHIELD, MetalBarType.BRONZE, 2);
putEquipment(ItemID.Cert.BRONZE_2H_SWORD, MetalBarType.BRONZE, 2);
putEquipment(ItemID.Cert.BRONZE_PLATELEGS, MetalBarType.BRONZE, 2);
putEquipment(ItemID.Cert.BRONZE_PLATESKIRT, MetalBarType.BRONZE, 2);
putEquipment(ItemID.Cert.BRONZE_PLATEBODY, MetalBarType.BRONZE, 4);
putEquipment(ItemID.IRON_SCIMITAR, MetalBarType.IRON, 1);
putEquipment(ItemID.IRON_LONGSWORD, MetalBarType.IRON, 1);
putEquipment(ItemID.IRON_FULL_HELM, MetalBarType.IRON, 1);
putEquipment(ItemID.IRON_SQ_SHIELD, MetalBarType.IRON, 1);
putEquipment(ItemID.IRON_CLAWS, MetalBarType.IRON, 1);
putEquipment(ItemID.IRON_WARHAMMER, MetalBarType.IRON, 2);
putEquipment(ItemID.IRON_BATTLEAXE, MetalBarType.IRON, 2);
putEquipment(ItemID.IRON_CHAINBODY, MetalBarType.IRON, 2);
putEquipment(ItemID.IRON_KITESHIELD, MetalBarType.IRON, 2);
putEquipment(ItemID.IRON_2H_SWORD, MetalBarType.IRON, 2);
putEquipment(ItemID.IRON_PLATELEGS, MetalBarType.IRON, 2);
putEquipment(ItemID.IRON_PLATESKIRT, MetalBarType.IRON, 2);
putEquipment(ItemID.IRON_PLATEBODY, MetalBarType.IRON, 4);
putEquipment(ItemID.Cert.IRON_SCIMITAR, MetalBarType.IRON, 1);
putEquipment(ItemID.Cert.IRON_LONGSWORD, MetalBarType.IRON, 1);
putEquipment(ItemID.Cert.IRON_FULL_HELM, MetalBarType.IRON, 1);
putEquipment(ItemID.Cert.IRON_SQ_SHIELD, MetalBarType.IRON, 1);
putEquipment(ItemID.Cert.IRON_CLAWS, MetalBarType.IRON, 1);
putEquipment(ItemID.Cert.IRON_WARHAMMER, MetalBarType.IRON, 2);
putEquipment(ItemID.Cert.IRON_BATTLEAXE, MetalBarType.IRON, 2);
putEquipment(ItemID.Cert.IRON_CHAINBODY, MetalBarType.IRON, 2);
putEquipment(ItemID.Cert.IRON_KITESHIELD, MetalBarType.IRON, 2);
putEquipment(ItemID.Cert.IRON_2H_SWORD, MetalBarType.IRON, 2);
putEquipment(ItemID.Cert.IRON_PLATELEGS, MetalBarType.IRON, 2);
putEquipment(ItemID.Cert.IRON_PLATESKIRT, MetalBarType.IRON, 2);
putEquipment(ItemID.Cert.IRON_PLATEBODY, MetalBarType.IRON, 4);
putEquipment(ItemID.STEEL_SCIMITAR, MetalBarType.STEEL, 1);
putEquipment(ItemID.STEEL_LONGSWORD, MetalBarType.STEEL, 1);
putEquipment(ItemID.STEEL_FULL_HELM, MetalBarType.STEEL, 1);
putEquipment(ItemID.STEEL_SQ_SHIELD, MetalBarType.STEEL, 1);
putEquipment(ItemID.STEEL_CLAWS, MetalBarType.STEEL, 1);
putEquipment(ItemID.STEEL_WARHAMMER, MetalBarType.STEEL, 2);
putEquipment(ItemID.STEEL_BATTLEAXE, MetalBarType.STEEL, 2);
putEquipment(ItemID.STEEL_CHAINBODY, MetalBarType.STEEL, 2);
putEquipment(ItemID.STEEL_KITESHIELD, MetalBarType.STEEL, 2);
putEquipment(ItemID.STEEL_2H_SWORD, MetalBarType.STEEL, 2);
putEquipment(ItemID.STEEL_PLATELEGS, MetalBarType.STEEL, 2);
putEquipment(ItemID.STEEL_PLATESKIRT, MetalBarType.STEEL, 2);
putEquipment(ItemID.STEEL_PLATEBODY, MetalBarType.STEEL, 4);
putEquipment(ItemID.Cert.STEEL_SCIMITAR, MetalBarType.STEEL, 1);
putEquipment(ItemID.Cert.STEEL_LONGSWORD, MetalBarType.STEEL, 1);
putEquipment(ItemID.Cert.STEEL_FULL_HELM, MetalBarType.STEEL, 1);
putEquipment(ItemID.Cert.STEEL_SQ_SHIELD, MetalBarType.STEEL, 1);
putEquipment(ItemID.Cert.STEEL_CLAWS, MetalBarType.STEEL, 1);
putEquipment(ItemID.Cert.STEEL_WARHAMMER, MetalBarType.STEEL, 2);
putEquipment(ItemID.Cert.STEEL_BATTLEAXE, MetalBarType.STEEL, 2);
putEquipment(ItemID.Cert.STEEL_CHAINBODY, MetalBarType.STEEL, 2);
putEquipment(ItemID.Cert.STEEL_KITESHIELD, MetalBarType.STEEL, 2);
putEquipment(ItemID.Cert.STEEL_2H_SWORD, MetalBarType.STEEL, 2);
putEquipment(ItemID.Cert.STEEL_PLATELEGS, MetalBarType.STEEL, 2);
putEquipment(ItemID.Cert.STEEL_PLATESKIRT, MetalBarType.STEEL, 2);
putEquipment(ItemID.Cert.STEEL_PLATEBODY, MetalBarType.STEEL, 4);
putEquipment(ItemID.MITHRIL_SCIMITAR, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.MITHRIL_LONGSWORD, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.MITHRIL_FULL_HELM, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.MITHRIL_SQ_SHIELD, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.MITHRIL_CLAWS, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.MITHRIL_WARHAMMER, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.MITHRIL_BATTLEAXE, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.MITHRIL_CHAINBODY, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.MITHRIL_KITESHIELD, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.MITHRIL_2H_SWORD, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.MITHRIL_PLATELEGS, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.MITHRIL_PLATESKIRT, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.MITHRIL_PLATEBODY, MetalBarType.MITHRIL, 4);
putEquipment(ItemID.Cert.MITHRIL_SCIMITAR, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.Cert.MITHRIL_LONGSWORD, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.Cert.MITHRIL_FULL_HELM, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.Cert.MITHRIL_SQ_SHIELD, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.Cert.MITHRIL_CLAWS, MetalBarType.MITHRIL, 1);
putEquipment(ItemID.Cert.MITHRIL_WARHAMMER, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.Cert.MITHRIL_BATTLEAXE, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.Cert.MITHRIL_CHAINBODY, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.Cert.MITHRIL_KITESHIELD, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.Cert.MITHRIL_2H_SWORD, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.Cert.MITHRIL_PLATELEGS, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.Cert.MITHRIL_PLATESKIRT, MetalBarType.MITHRIL, 2);
putEquipment(ItemID.Cert.MITHRIL_PLATEBODY, MetalBarType.MITHRIL, 4);
putEquipment(ItemID.ADAMANT_SCIMITAR, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.ADAMANT_LONGSWORD, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.ADAMANT_FULL_HELM, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.ADAMANT_SQ_SHIELD, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.ADAMANT_CLAWS, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.ADAMNT_WARHAMMER, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.ADAMANT_BATTLEAXE, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.ADAMANT_CHAINBODY, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.ADAMANT_KITESHIELD, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.ADAMANT_2H_SWORD, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.ADAMANT_PLATELEGS, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.ADAMANT_PLATESKIRT, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.ADAMANT_PLATEBODY, MetalBarType.ADAMANT, 4);
putEquipment(ItemID.Cert.ADAMANT_SCIMITAR, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.Cert.ADAMANT_LONGSWORD, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.Cert.ADAMANT_FULL_HELM, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.Cert.ADAMANT_SQ_SHIELD, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.Cert.ADAMANT_CLAWS, MetalBarType.ADAMANT, 1);
putEquipment(ItemID.Cert.ADAMNT_WARHAMMER, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.Cert.ADAMANT_BATTLEAXE, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.Cert.ADAMANT_CHAINBODY, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.Cert.ADAMANT_KITESHIELD, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.Cert.ADAMANT_2H_SWORD, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.Cert.ADAMANT_PLATELEGS, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.Cert.ADAMANT_PLATESKIRT, MetalBarType.ADAMANT, 2);
putEquipment(ItemID.Cert.ADAMANT_PLATEBODY, MetalBarType.ADAMANT, 4);
putEquipment(ItemID.RUNE_SCIMITAR, MetalBarType.RUNITE, 1);
putEquipment(ItemID.RUNE_LONGSWORD, MetalBarType.RUNITE, 1);
putEquipment(ItemID.RUNE_FULL_HELM, MetalBarType.RUNITE, 1);
putEquipment(ItemID.RUNE_SQ_SHIELD, MetalBarType.RUNITE, 1);
putEquipment(ItemID.RUNE_CLAWS, MetalBarType.RUNITE, 1);
putEquipment(ItemID.RUNE_WARHAMMER, MetalBarType.RUNITE, 2);
putEquipment(ItemID.RUNE_BATTLEAXE, MetalBarType.RUNITE, 2);
putEquipment(ItemID.RUNE_CHAINBODY, MetalBarType.RUNITE, 2);
putEquipment(ItemID.RUNE_KITESHIELD, MetalBarType.RUNITE, 2);
putEquipment(ItemID.RUNE_2H_SWORD, MetalBarType.RUNITE, 2);
putEquipment(ItemID.RUNE_PLATELEGS, MetalBarType.RUNITE, 2);
putEquipment(ItemID.RUNE_PLATESKIRT, MetalBarType.RUNITE, 2);
putEquipment(ItemID.RUNE_PLATEBODY, MetalBarType.RUNITE, 4);
putEquipment(ItemID.Cert.RUNE_SCIMITAR, MetalBarType.RUNITE, 1);
putEquipment(ItemID.Cert.RUNE_LONGSWORD, MetalBarType.RUNITE, 1);
putEquipment(ItemID.Cert.RUNE_FULL_HELM, MetalBarType.RUNITE, 1);
putEquipment(ItemID.Cert.RUNE_SQ_SHIELD, MetalBarType.RUNITE, 1);
putEquipment(ItemID.Cert.RUNE_CLAWS, MetalBarType.RUNITE, 1);
putEquipment(ItemID.Cert.RUNE_WARHAMMER, MetalBarType.RUNITE, 2);
putEquipment(ItemID.Cert.RUNE_BATTLEAXE, MetalBarType.RUNITE, 2);
putEquipment(ItemID.Cert.RUNE_CHAINBODY, MetalBarType.RUNITE, 2);
putEquipment(ItemID.Cert.RUNE_KITESHIELD, MetalBarType.RUNITE, 2);
putEquipment(ItemID.Cert.RUNE_2H_SWORD, MetalBarType.RUNITE, 2);
putEquipment(ItemID.Cert.RUNE_PLATELEGS, MetalBarType.RUNITE, 2);
putEquipment(ItemID.Cert.RUNE_PLATESKIRT, MetalBarType.RUNITE, 2);
putEquipment(ItemID.Cert.RUNE_PLATEBODY, MetalBarType.RUNITE, 4);
}
@Value
public static class Record
{
MetalBarType type;
MetalBarSource source;
int value;
}
public static Record get(int id)
{
return values.get(id);
}
private static void putOre(int id, MetalBarType type)
{
values.put(id, new Record(type, MetalBarSource.ORE, 1));
}
private static void putBar(int id, MetalBarType type)
{
values.put(id, new Record(type, MetalBarSource.BAR, 1));
}
private static void putEquipment(int id, MetalBarType type, int value)
{
values.put(id, new Record(type, MetalBarSource.EQUIPMENT, value));
}
private MetalBarValues()
{
}
}

View File

@@ -0,0 +1,27 @@
package com.toofifty.easygiantsfoundry.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.runelite.client.ui.FontManager;
import java.awt.Font;
@Getter
@AllArgsConstructor
public enum FontType
{
DEFAULT("Default", null),
REGULAR("Regular", FontManager.getRunescapeFont()),
BOLD("Bold", FontManager.getRunescapeBoldFont()),
SMALL("Small", FontManager.getRunescapeSmallFont()),
;
private final String name;
private final Font font;
@Override
public String toString()
{
return name;
}
}

View File

@@ -0,0 +1,9 @@
package com.toofifty.easygiantsfoundry.enums;
public enum MetalBarSource
{
ORE,
BAR,
EQUIPMENT,
;
}

View File

@@ -0,0 +1,12 @@
package com.toofifty.easygiantsfoundry.enums;
public enum MetalBarType
{
BRONZE,
IRON,
STEEL,
MITHRIL,
ADAMANT,
RUNITE,
;
}