Compare commits

..

13 Commits

Author SHA1 Message Date
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
12 changed files with 655 additions and 23 deletions

View File

@@ -65,4 +65,7 @@ Bonus Click Notification | Information Panel
* Added bonus action tracking * Added bonus action tracking
- [TalSk](https://github.com/TalSk "TalSk's github") - [TalSk](https://github.com/TalSk "TalSk's github")
* Integrated Smith's outfit effect * 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' group = 'com.toofifty'
version = '1.0.9' version = '1.0.11'
tasks.withType(JavaCompile).configureEach { tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' options.encoding = 'UTF-8'

View File

@@ -1,6 +1,9 @@
package com.toofifty.easygiantsfoundry; package com.toofifty.easygiantsfoundry;
import java.awt.Color; 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.Config;
import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ConfigItem;
@@ -509,6 +512,116 @@ public interface EasyGiantsFoundryConfig extends Config
return Color.CYAN; 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( @ConfigSection(
name = "Advanced", name = "Advanced",
description = "Advanced Settings", description = "Advanced Settings",

View File

@@ -1,17 +1,18 @@
package com.toofifty.easygiantsfoundry; package com.toofifty.easygiantsfoundry;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Point;
import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.ColorScheme;
import javax.inject.Singleton; import javax.inject.Singleton;
import java.awt.Color; import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
@Slf4j @Slf4j
@Singleton @Singleton
public final class EasyGiantsFoundryHelper public final class EasyGiantsFoundryHelper
{ {
public static Color getHeatColor(int actions, int heat) public static Color getHeatColor(int actions, int heat)
{ {
if (heat >= actions) if (heat >= actions)
@@ -26,4 +27,30 @@ public final class EasyGiantsFoundryHelper
return ColorScheme.PROGRESS_ERROR_COLOR; 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.Client;
import net.runelite.api.GameObject; import net.runelite.api.GameObject;
import net.runelite.api.GameState; 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.Item;
import net.runelite.api.ItemContainer; import net.runelite.api.ItemContainer;
import net.runelite.api.MenuAction; import net.runelite.api.MenuAction;
@@ -75,6 +75,9 @@ public class EasyGiantsFoundryPlugin extends Plugin
@Inject @Inject
private EasyGiantsFoundryHelper helper; private EasyGiantsFoundryHelper helper;
@Inject
private MetalBarCounter metalBarCounter;
@Inject @Inject
private OverlayManager overlayManager; private OverlayManager overlayManager;
@@ -118,6 +121,7 @@ public class EasyGiantsFoundryPlugin extends Plugin
{ {
overlayManager.remove(overlay2d); overlayManager.remove(overlay2d);
overlayManager.remove(overlay3d); overlayManager.remove(overlay3d);
metalBarCounter.clear();
} }
@Subscribe @Subscribe
@@ -253,7 +257,7 @@ public class EasyGiantsFoundryPlugin extends Plugin
@Subscribe @Subscribe
public void onItemContainerChanged(ItemContainerChanged event) public void onItemContainerChanged(ItemContainerChanged event)
{ {
if (event.getContainerId() == InventoryID.EQUIPMENT.getId()) if (event.getContainerId() == InventoryID.WORN)
{ {
if (event.getItemContainer().count(PREFORM) == 0) if (event.getItemContainer().count(PREFORM) == 0)
{ {
@@ -265,6 +269,10 @@ public class EasyGiantsFoundryPlugin extends Plugin
updateSmithsOutfitPieces(); updateSmithsOutfitPieces();
} }
} }
else if (event.getContainerId() == InventoryID.INV || event.getContainerId() == InventoryID.BANK)
{
metalBarCounter.put(event.getItemContainer());
}
} }
public void onMenuEntryAdded(MenuEntryAdded event) public void onMenuEntryAdded(MenuEntryAdded event)
@@ -474,7 +482,7 @@ public class EasyGiantsFoundryPlugin extends Plugin
{ {
int pieces = 0; int pieces = 0;
ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT); ItemContainer equipment = client.getItemContainer(InventoryID.WORN);
if (equipment != null) if (equipment != null)
{ {
for (Item item : equipment.getItems()) for (Item item : equipment.getItems())

View File

@@ -1,7 +1,7 @@
package com.toofifty.easygiantsfoundry; package com.toofifty.easygiantsfoundry;
import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryHelper.getHeatColor;
import com.toofifty.easygiantsfoundry.enums.Heat; import com.toofifty.easygiantsfoundry.enums.Heat;
import com.toofifty.easygiantsfoundry.enums.MetalBarType;
import com.toofifty.easygiantsfoundry.enums.Stage; import com.toofifty.easygiantsfoundry.enums.Stage;
import java.awt.Color; import java.awt.Color;
@@ -24,6 +24,7 @@ public class FoundryOverlay2D extends OverlayPanel
private final Client client; private final Client client;
private final EasyGiantsFoundryPlugin plugin; private final EasyGiantsFoundryPlugin plugin;
private final EasyGiantsFoundryState state; private final EasyGiantsFoundryState state;
private final MetalBarCounter metalBarCounter;
private final EasyGiantsFoundryConfig config; private final EasyGiantsFoundryConfig config;
@Inject @Inject
@@ -31,11 +32,13 @@ public class FoundryOverlay2D extends OverlayPanel
Client client, Client client,
EasyGiantsFoundryPlugin plugin, EasyGiantsFoundryPlugin plugin,
EasyGiantsFoundryState state, EasyGiantsFoundryState state,
MetalBarCounter metalBarCounter,
EasyGiantsFoundryConfig config) EasyGiantsFoundryConfig config)
{ {
this.client = client; this.client = client;
this.plugin = plugin; this.plugin = plugin;
this.state = state; this.state = state;
this.metalBarCounter = metalBarCounter;
this.config = config; this.config = config;
this.setPosition(OverlayPosition.BOTTOM_LEFT); this.setPosition(OverlayPosition.BOTTOM_LEFT);
} }
@@ -68,7 +71,7 @@ public class FoundryOverlay2D extends OverlayPanel
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
if (client.getLocalPlayer().getWorldLocation().getRegionID() != REGION_ID) if (!config.alwaysDrawInfoPanel() && client.getLocalPlayer().getWorldLocation().getRegionID() != REGION_ID)
{ {
return null; return null;
} }
@@ -79,6 +82,11 @@ public class FoundryOverlay2D extends OverlayPanel
panelComponent.getChildren().add(TitleComponent.builder().text("Easy Giants' Foundry").build()); panelComponent.getChildren().add(TitleComponent.builder().text("Easy Giants' Foundry").build());
} }
if (config.drawMetals())
{
drawMetals(graphics);
}
if (swordPickedUp) if (swordPickedUp)
{ {
Heat heat = state.getCurrentHeat(); Heat heat = state.getCurrentHeat();
@@ -130,4 +138,37 @@ public class FoundryOverlay2D extends OverlayPanel
return super.render(graphics); return super.render(graphics);
} }
private void drawMetals(Graphics2D graphics2D)
{
if (!metalBarCounter.isSeenBank())
{
panelComponent.getChildren().add(
LineComponent.builder()
.left("Metals: open bank")
.leftColor(Color.RED)
.build()
);
}
drawMetalCount(graphics2D, "Bronze bars:", metalBarCounter.get(MetalBarType.BRONZE));
drawMetalCount(graphics2D, "Iron bars:", metalBarCounter.get(MetalBarType.IRON));
drawMetalCount(graphics2D, "Steel bars:", metalBarCounter.get(MetalBarType.STEEL));
drawMetalCount(graphics2D, "Mithril bars:", metalBarCounter.get(MetalBarType.MITHRIL));
drawMetalCount(graphics2D, "Adamant bars:", metalBarCounter.get(MetalBarType.ADAMANT));
drawMetalCount(graphics2D, "Runite bars:", metalBarCounter.get(MetalBarType.RUNITE));
}
private void drawMetalCount(Graphics2D graphics2D, String displayName, int count)
{
if (count > 0 || config.drawAllMetals())
{
panelComponent.getChildren().add(
LineComponent.builder()
.left(displayName)
.right(Integer.toString(count))
.build()
);
}
}
} }

View File

@@ -2,9 +2,11 @@ package com.toofifty.easygiantsfoundry;
import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.*; import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryClientIDs.*;
import static com.toofifty.easygiantsfoundry.EasyGiantsFoundryHelper.getHeatColor; 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_1_VARBIT;
import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_2_VARBIT; import static com.toofifty.easygiantsfoundry.MouldHelper.SWORD_TYPE_2_VARBIT;
import com.toofifty.easygiantsfoundry.enums.CommissionType; import com.toofifty.easygiantsfoundry.enums.CommissionType;
import com.toofifty.easygiantsfoundry.enums.FontType;
import com.toofifty.easygiantsfoundry.enums.Heat; import com.toofifty.easygiantsfoundry.enums.Heat;
import com.toofifty.easygiantsfoundry.enums.Stage; import com.toofifty.easygiantsfoundry.enums.Stage;
@@ -24,7 +26,6 @@ import net.runelite.api.coords.LocalPoint;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayUtil;
import net.runelite.client.ui.overlay.outline.ModelOutlineRenderer; import net.runelite.client.ui.overlay.outline.ModelOutlineRenderer;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -107,6 +108,11 @@ public class FoundryOverlay3D extends Overlay
return null; return null;
} }
if (config.dynamicOverlayFont() != FontType.DEFAULT)
{
graphics.setFont(config.dynamicOverlayFont().getFont());
}
if (config.highlightKovac()) if (config.highlightKovac())
{ {
drawKovacIfHandIn(graphics); drawKovacIfHandIn(graphics);
@@ -147,8 +153,6 @@ public class FoundryOverlay3D extends Overlay
return null; return null;
} }
drawActionOverlay(graphics, stageObject);
Heat heat = state.getCurrentHeat(); Heat heat = state.getCurrentHeat();
Color color = getObjectColor(stage, heat); Color color = getObjectColor(stage, heat);
// TODO Config // TODO Config
@@ -186,6 +190,8 @@ public class FoundryOverlay3D extends Overlay
} }
} }
drawActionOverlay(graphics, stageObject);
return null; return null;
} }
@@ -274,7 +280,7 @@ public class FoundryOverlay3D extends Overlay
Color color = config.lavaWaterfallColour(); 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) private void drawHeatChangerOverlay(Graphics2D graphics, GameObject stageObject)
@@ -304,7 +310,7 @@ public class FoundryOverlay3D extends Overlay
Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50); Point pos = Perspective.getCanvasTextLocation(client, graphics, stageLoc, text, 50);
Color color = config.lavaWaterfallColour(); Color color = config.lavaWaterfallColour();
OverlayUtil.renderTextLocation(graphics, pos, text, color); renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
} }
private void drawHeatChangers(Graphics2D graphics) private void drawHeatChangers(Graphics2D graphics)
@@ -382,7 +388,7 @@ public class FoundryOverlay3D extends Overlay
{ {
color = config.generalHighlight(); color = config.generalHighlight();
} }
OverlayUtil.renderTextLocation(graphics, pos, text, color); renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
} }
private void drawMouldScoreIfMouldSet(Graphics2D graphics) { private void drawMouldScoreIfMouldSet(Graphics2D graphics) {
@@ -405,7 +411,7 @@ public class FoundryOverlay3D extends Overlay
Point pos = Perspective.getCanvasTextLocation(client, graphics, mouldLoc, text, 115); Point pos = Perspective.getCanvasTextLocation(client, graphics, mouldLoc, text, 115);
Color color = config.generalHighlight(); Color color = config.generalHighlight();
OverlayUtil.renderTextLocation(graphics, pos, text, color); renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
} }
private void drawPreformScoreIfPoured(Graphics2D graphics) { private void drawPreformScoreIfPoured(Graphics2D graphics) {
if (client.getVarbitValue(VARBIT_GAME_STAGE) != 2) if (client.getVarbitValue(VARBIT_GAME_STAGE) != 2)
@@ -425,7 +431,7 @@ public class FoundryOverlay3D extends Overlay
Color color = config.generalHighlight(); Color color = config.generalHighlight();
OverlayUtil.renderTextLocation(graphics, pos, text, color); renderTextLocation(graphics, pos, text, color, config.textBackground(), config.textOutline());
} }
private void drawCrucibleIfMouldSet(Graphics2D graphics) private void drawCrucibleIfMouldSet(Graphics2D graphics)
@@ -439,8 +445,6 @@ public class FoundryOverlay3D extends Overlay
return; return;
} }
drawCrucibleContent(graphics);
if (config.highlightStyle() == HighlightStyle.HIGHLIGHT_CLICKBOX) if (config.highlightStyle() == HighlightStyle.HIGHLIGHT_CLICKBOX)
{ {
Shape shape = crucible.getConvexHull(); Shape shape = crucible.getConvexHull();
@@ -473,6 +477,8 @@ public class FoundryOverlay3D extends Overlay
} }
drawObjectOutline(graphics, crucible, color); drawObjectOutline(graphics, crucible, color);
} }
drawCrucibleContent(graphics);
} }
private void drawMouldIfNotSet(Graphics2D graphics) private void drawMouldIfNotSet(Graphics2D graphics)
@@ -510,7 +516,7 @@ public class FoundryOverlay3D extends Overlay
textLocation = new LocalPoint(textLocation.getX(), textLocation.getY()); textLocation = new LocalPoint(textLocation.getX(), textLocation.getY());
Point canvasLocation = Perspective.getCanvasTextLocation(client, graphics, textLocation, text, 100); Point canvasLocation = Perspective.getCanvasTextLocation(client, graphics, textLocation, text, 100);
canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + 10); 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());
} }
} }
@@ -562,7 +568,7 @@ public class FoundryOverlay3D extends Overlay
{ {
return; return;
} }
OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft)); renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft), config.textBackground(), config.textOutline());
} }
if (config.drawActionLeftOverlay()) if (config.drawActionLeftOverlay())
// Draw actions left // Draw actions left
@@ -575,8 +581,8 @@ public class FoundryOverlay3D extends Overlay
{ {
return; return;
} }
canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + 10); canvasLocation = new Point(canvasLocation.getX(), canvasLocation.getY() + graphics.getFontMetrics().getHeight());
OverlayUtil.renderTextLocation(graphics, canvasLocation, text, getHeatColor(actionsLeft, heatLeft)); 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,
;
}