diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java
index df14d27f3d..2b29cbac07 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java
@@ -296,11 +296,51 @@ public interface ItemChargeConfig extends Config
)
void explorerRing(int explorerRing);
+ @ConfigItem(
+ keyName = "showRingOfForgingCount",
+ name = "Show Ring of Forging Charges",
+ description = "Configures if the Ring of Forging charge count is shown",
+ position = 20
+ )
+ default boolean showRingOfForgingCount()
+ {
+ return true;
+ }
+
+ @ConfigItem(
+ keyName = "ringOfForging",
+ name = "",
+ description = "",
+ hidden = true
+ )
+ default int ringOfForging()
+ {
+ return -1;
+ }
+
+ @ConfigItem(
+ keyName = "ringOfForging",
+ name = "",
+ description = ""
+ )
+ void ringOfForging(int ringOfForging);
+
+ @ConfigItem(
+ keyName = "ringOfForgingNotification",
+ name = "Ring of Forging Notification",
+ description = "Configures if the Ring of Forging breaking notification is enabled",
+ position = 21
+ )
+ default boolean ringOfForgingNotification()
+ {
+ return true;
+ }
+
@ConfigItem(
keyName = "showInfoboxes",
name = "Show Infoboxes",
description = "Configures whether to show an infobox equipped charge items",
- position = 20
+ position = 22
)
default boolean showInfoboxes()
{
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java
index 10357f95f2..4155410692 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java
@@ -96,6 +96,15 @@ class ItemChargeOverlay extends WidgetItemOverlay
charges = config.explorerRing();
}
+ else if (itemId == ItemID.RING_OF_FORGING)
+ {
+ if (!config.showRingOfForgingCount())
+ {
+ return;
+ }
+
+ charges = config.ringOfForging();
+ }
else
{
ItemWithCharge chargeItem = ItemWithCharge.findItem(itemId);
@@ -134,6 +143,6 @@ class ItemChargeOverlay extends WidgetItemOverlay
return config.showTeleportCharges() || config.showDodgyCount() || config.showFungicideCharges()
|| config.showImpCharges() || config.showWateringCanCharges() || config.showWaterskinCharges()
|| config.showBellowCharges() || config.showBasketCharges() || config.showSackCharges()
- || config.showAbyssalBraceletCharges() || config.showExplorerRingCharges();
+ || config.showAbyssalBraceletCharges() || config.showExplorerRingCharges() || config.showRingOfForgingCount();
}
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java
index d6b4417c55..1474aa4142 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java
@@ -26,6 +26,7 @@
*/
package net.runelite.client.plugins.itemcharges;
+import com.google.common.primitives.Ints;
import com.google.inject.Provides;
import java.awt.Color;
import java.awt.image.BufferedImage;
@@ -75,10 +76,15 @@ public class ItemChargePlugin extends Plugin
private static final Pattern BINDING_USED_PATTERN = Pattern.compile(
"You bind the temple's power into (mud|lava|steam|dust|smoke|mist) runes\\.");
private static final String BINDING_BREAK_TEXT = "Your Binding necklace has disintegrated.";
+ private static final Pattern RING_OF_FORGING_CHECK_PATTERN = Pattern.compile(
+ "You can smelt ([0-9+]+|one) more pieces? of iron ore before a ring melts\\.");
+ private static final String RING_OF_FORGING_USED_TEXT = "You retrieve a bar of iron.";
+ private static final String RING_OF_FORGING_BREAK_TEXT = "
Your Ring of Forging has melted.";
private static final int MAX_DODGY_CHARGES = 10;
private static final int MAX_BINDING_CHARGES = 16;
private static final int MAX_EXPLORER_RING_CHARGES = 30;
+ private static final int MAX_RING_OF_FORGING_CHARGES = 140;
private int lastExplorerRingCharge = -1;
@@ -164,6 +170,11 @@ public class ItemChargePlugin extends Plugin
{
removeInfobox(ItemWithSlot.EXPLORER_RING);
}
+
+ if (!config.showRingOfForgingCount())
+ {
+ removeInfobox(ItemWithSlot.RING_OF_FORGING);
+ }
}
@Subscribe
@@ -175,6 +186,7 @@ public class ItemChargePlugin extends Plugin
Matcher dodgyBreakMatcher = DODGY_BREAK_PATTERN.matcher(message);
Matcher bindingNecklaceCheckMatcher = BINDING_CHECK_PATTERN.matcher(event.getMessage());
Matcher bindingNecklaceUsedMatcher = BINDING_USED_PATTERN.matcher(event.getMessage());
+ Matcher ringOfForgingCheckMatcher = RING_OF_FORGING_CHECK_PATTERN.matcher(message);
if (event.getType() == ChatMessageType.GAMEMESSAGE || event.getType() == ChatMessageType.SPAM)
{
@@ -225,6 +237,44 @@ public class ItemChargePlugin extends Plugin
updateBindingNecklaceCharges(charges);
}
+ else if (ringOfForgingCheckMatcher.find())
+ {
+ final String match = ringOfForgingCheckMatcher.group(1);
+
+ int charges = 1;
+ if (!match.equals("one"))
+ {
+ charges = Integer.parseInt(match);
+ }
+ updateRingOfForgingCharges(charges);
+ }
+ else if (message.equals(RING_OF_FORGING_USED_TEXT))
+ {
+ final ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT);
+
+ // Determine if the player smelted with a Ring of Forging equipped.
+ if (equipment == null)
+ {
+ return;
+ }
+
+ Item[] items = equipment.getItems();
+ if (EquipmentInventorySlot.RING.getSlotIdx() < items.length
+ && items[EquipmentInventorySlot.RING.getSlotIdx()].getId() == ItemID.RING_OF_FORGING)
+ {
+ int charges = Ints.constrainToRange(config.ringOfForging() - 1, 0, MAX_RING_OF_FORGING_CHARGES);
+ updateRingOfForgingCharges(charges);
+ }
+ }
+ else if (message.equals(RING_OF_FORGING_BREAK_TEXT))
+ {
+ if (config.ringOfForgingNotification())
+ {
+ notifier.notify("Your ring of forging has melted.");
+ }
+
+ updateRingOfForgingCharges(MAX_RING_OF_FORGING_CHARGES);
+ }
}
}
@@ -262,6 +312,11 @@ public class ItemChargePlugin extends Plugin
{
updateJewelleryInfobox(ItemWithSlot.EXPLORER_RING, items);
}
+
+ if (config.showRingOfForgingCount())
+ {
+ updateJewelleryInfobox(ItemWithSlot.RING_OF_FORGING, items);
+ }
}
@Subscribe
@@ -341,6 +396,23 @@ public class ItemChargePlugin extends Plugin
}
}
+ private void updateRingOfForgingCharges(final int value)
+ {
+ config.ringOfForging(value);
+
+ if (config.showInfoboxes() && config.showRingOfForgingCount())
+ {
+ final ItemContainer itemContainer = client.getItemContainer(InventoryID.EQUIPMENT);
+
+ if (itemContainer == null)
+ {
+ return;
+ }
+
+ updateJewelleryInfobox(ItemWithSlot.RING_OF_FORGING, itemContainer.getItems());
+ }
+ }
+
private void checkDestroyWidget()
{
final int currentTick = client.getTickCount();
@@ -364,6 +436,9 @@ public class ItemChargePlugin extends Plugin
case "Dodgy necklace":
updateDodgyNecklaceCharges(MAX_DODGY_CHARGES);
break;
+ case "Ring of forging":
+ updateRingOfForgingCharges(MAX_RING_OF_FORGING_CHARGES);
+ break;
}
}
@@ -407,6 +482,10 @@ public class ItemChargePlugin extends Plugin
{
charges = config.explorerRing();
}
+ else if (id == ItemID.RING_OF_FORGING && type == ItemWithSlot.RING_OF_FORGING)
+ {
+ charges = config.ringOfForging();
+ }
}
else if (itemWithCharge.getType() == type.getType())
{
@@ -456,4 +535,4 @@ public class ItemChargePlugin extends Plugin
}
return color;
}
-}
\ No newline at end of file
+}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java
index e88130725a..3a4c411eaf 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java
@@ -37,5 +37,6 @@ enum ItemChargeType
BINDING_NECKLACE,
EXPLORER_RING,
FRUIT_BASKET,
- SACK
+ SACK,
+ RING_OF_FORGING,
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java
index 16c2b0fd1b..cfc2338a33 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java
@@ -37,6 +37,7 @@ enum ItemWithSlot
DODGY_NECKLACE(ItemChargeType.DODGY_NECKLACE, EquipmentInventorySlot.AMULET),
BINDING_NECKLACE(ItemChargeType.BINDING_NECKLACE, EquipmentInventorySlot.AMULET),
EXPLORER_RING(ItemChargeType.EXPLORER_RING, EquipmentInventorySlot.RING),
+ RING_OF_FORGING(ItemChargeType.RING_OF_FORGING, EquipmentInventorySlot.RING),
TELEPORT(ItemChargeType.TELEPORT, EquipmentInventorySlot.WEAPON, EquipmentInventorySlot.AMULET, EquipmentInventorySlot.GLOVES, EquipmentInventorySlot.RING);
private final ItemChargeType type;
diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java
index 805c7822b8..bccf1c69c5 100644
--- a/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java
+++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemcharges/ItemChargePluginTest.java
@@ -31,6 +31,11 @@ import com.google.inject.testing.fieldbinder.BoundFieldModule;
import java.util.concurrent.ScheduledExecutorService;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
+import net.runelite.api.EquipmentInventorySlot;
+import net.runelite.api.InventoryID;
+import net.runelite.api.Item;
+import net.runelite.api.ItemContainer;
+import net.runelite.api.ItemID;
import net.runelite.api.events.ChatMessage;
import net.runelite.client.Notifier;
import net.runelite.client.config.RuneLiteConfig;
@@ -40,8 +45,10 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import static org.mockito.Matchers.eq;
import org.mockito.Mock;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
@@ -52,6 +59,11 @@ public class ItemChargePluginTest
private static final String PROTECT_1 = "Your dodgy necklace protects you. It has 1 charge left.";
private static final String BREAK = "Your dodgy necklace protects you. It then crumbles to dust.";
+ private static final String CHECK_RING_OF_FORGING_FULL = "You can smelt 140 more pieces of iron ore before a ring melts.";
+ private static final String CHECK_RING_OF_FORGING_ONE = "You can smelt one more piece of iron ore before a ring melts.";
+ private static final String USED_RING_OF_FORGING = "You retrieve a bar of iron.";
+ private static final String BREAK_RING_OF_FORGING = "Your Ring of Forging has melted.";
+
@Mock
@Bind
private Client client;
@@ -107,5 +119,35 @@ public class ItemChargePluginTest
itemChargePlugin.onChatMessage(chatMessage);
verify(config).dodgyNecklace(eq(10));
reset(config);
+
+ chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", CHECK_RING_OF_FORGING_ONE, "", 0);
+ itemChargePlugin.onChatMessage(chatMessage);
+ verify(config).ringOfForging(eq(1));
+ reset(config);
+
+ chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", CHECK_RING_OF_FORGING_FULL, "", 0);
+ itemChargePlugin.onChatMessage(chatMessage);
+ verify(config).ringOfForging(eq(140));
+ reset(config);
+
+ when(config.ringOfForging()).thenReturn(90);
+ // Create equipment inventory with ring of forging
+ ItemContainer equipmentItemContainer = mock(ItemContainer.class);
+ when(client.getItemContainer(eq(InventoryID.EQUIPMENT))).thenReturn(equipmentItemContainer);
+ Item[] items = new Item[EquipmentInventorySlot.RING.getSlotIdx() + 1];
+ when(equipmentItemContainer.getItems()).thenReturn(items);
+ Item ring = mock(Item.class);
+ when(ring.getId()).thenReturn(ItemID.RING_OF_FORGING);
+ items[EquipmentInventorySlot.RING.getSlotIdx()] = ring;
+ // Run message
+ chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", USED_RING_OF_FORGING, "", 0);
+ itemChargePlugin.onChatMessage(chatMessage);
+ verify(config).ringOfForging(eq(89));
+ reset(config);
+
+ chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", BREAK_RING_OF_FORGING, "", 0);
+ itemChargePlugin.onChatMessage(chatMessage);
+ verify(config).ringOfForging(eq(140));
+ reset(config);
}
}
\ No newline at end of file