From 82963b564695d81172f8e5d25bbe6666ffbbbf2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20=C3=98rnlo?= Date: Mon, 2 Apr 2018 22:05:29 +0200 Subject: [PATCH] Some quality of life changes to the Motherlode Mine Plugin. The following changes have been done: - Added red coloring to Pay-dirt in sack when the number of pay-dirt exceeds or is equal to the maximum allowed. - Added "Deposits left" to sack overlay. This shows the estimated Pay-dirt deposits left before sack is full. This is calculated based on inventory space. This is also colored red when deposits left are 0. - Added region check to most functions --- .../plugins/motherlode/MotherlodeConfig.java | 35 +++- .../plugins/motherlode/MotherlodeOverlay.java | 23 ++- .../plugins/motherlode/MotherlodePlugin.java | 170 +++++++++++++++++- .../motherlode/MotherlodeRocksOverlay.java | 5 +- .../motherlode/MotherlodeSackOverlay.java | 30 +++- 5 files changed, 238 insertions(+), 25 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java index 14bbf78d8e..070195dbfe 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeConfig.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, Seth + * Copyright (c) 2018, Lars * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,14 +32,14 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup( keyName = "motherlode", name = "Motherlode Mine", - description = "Configuration for the motherlode plugin" + description = "Configuration for the Motherlode Mine plugin" ) public interface MotherlodeConfig extends Config { @ConfigItem( keyName = "showRocks", - name = "Show Pay-dirt mining spots", - description = "Configures whether or not the pay-dirt minings spots is displayed" + name = "Show pay-dirt mining spots", + description = "Configures whether or not the pay-dirt mining spots are displayed." ) default boolean showRocks() { @@ -48,7 +49,7 @@ public interface MotherlodeConfig extends Config @ConfigItem( keyName = "statTimeout", name = "Reset stats (minutes)", - description = "Configures the time until statistic is reset" + description = "Configures the time until statistics are reset" ) default int statTimeout() { @@ -57,8 +58,8 @@ public interface MotherlodeConfig extends Config @ConfigItem( keyName = "showSack", - name = "Show Pay-dirt Sack", - description = "Configures whether to Pay-dirt sack is displayed" + name = "Show pay-dirt sack", + description = "Configures whether the pay-dirt sack is displayed or not." ) default boolean showSack() { @@ -67,11 +68,31 @@ public interface MotherlodeConfig extends Config @ConfigItem( keyName = "showMiningStats", - name = "Show Mining session stats", + name = "Show mining session stats", description = "Configures whether to display mining session stats" ) default boolean showMiningStats() { return true; } + + @ConfigItem( + keyName = "showDepositsLeft", + name = "Show deposits left", + description = "Displays deposits left before sack is full" + ) + default boolean showDepositsLeft() + { + return true; + } + + @ConfigItem( + keyName = "showMiningState", + name = "Show current mining state", + description = "Shows current mining state. 'You are currently mining' / 'You are currently NOT mining'" + ) + default boolean showMiningState() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java index 8bca91d7f4..b11486926f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java @@ -24,7 +24,7 @@ */ package net.runelite.client.plugins.motherlode; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; @@ -49,7 +49,7 @@ import net.runelite.client.ui.overlay.components.PanelComponent; class MotherlodeOverlay extends Overlay { - private static final Set MINING_ANIMATION_IDS = Sets.newHashSet( + private static final Set MINING_ANIMATION_IDS = ImmutableSet.of( MINING_MOTHERLODE_BRONZE, MINING_MOTHERLODE_IRON, MINING_MOTHERLODE_STEEL, MINING_MOTHERLODE_BLACK, MINING_MOTHERLODE_MITHRIL, MINING_MOTHERLODE_ADAMANT, MINING_MOTHERLODE_RUNE, MINING_MOTHERLODE_DRAGON, MINING_MOTHERLODE_DRAGON_ORN, @@ -73,7 +73,7 @@ class MotherlodeOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!config.showMiningStats()) + if (!plugin.isInMlm() || !config.showMiningStats()) { return null; } @@ -95,15 +95,22 @@ class MotherlodeOverlay extends Overlay panelComponent.getLines().clear(); - if (MINING_ANIMATION_IDS.contains(client.getLocalPlayer().getAnimation())) + if (config.showMiningState()) { - panelComponent.setTitle("You are mining"); - panelComponent.setTitleColor(Color.GREEN); + if (MINING_ANIMATION_IDS.contains(client.getLocalPlayer().getAnimation())) + { + panelComponent.setTitle("You are mining"); + panelComponent.setTitleColor(Color.GREEN); + } + else + { + panelComponent.setTitle("You are NOT mining"); + panelComponent.setTitleColor(Color.RED); + } } else { - panelComponent.setTitle("You are NOT mining"); - panelComponent.setTitleColor(Color.RED); + panelComponent.setTitle(null); } panelComponent.getLines().add(new PanelComponent.Line( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java index 7b8e330632..3cd7672200 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodePlugin.java @@ -1,6 +1,7 @@ /* * Copyright (c) 2018, Seth -* Copyright (c) 2018, Adam + * Copyright (c) 2018, Adam + * Copyright (c) 2018, Lars * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,7 +26,7 @@ */ package net.runelite.client.plugins.motherlode; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.time.Duration; @@ -39,20 +40,28 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; 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.Item; +import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; import static net.runelite.api.ObjectID.ORE_VEIN_26661; import static net.runelite.api.ObjectID.ORE_VEIN_26662; import static net.runelite.api.ObjectID.ORE_VEIN_26663; import static net.runelite.api.ObjectID.ORE_VEIN_26664; import static net.runelite.api.ObjectID.ROCKFALL; import static net.runelite.api.ObjectID.ROCKFALL_26680; +import net.runelite.api.Varbits; import net.runelite.api.WallObject; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameObjectChanged; import net.runelite.api.events.GameObjectDespawned; import net.runelite.api.events.GameObjectSpawned; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.MapRegionChanged; +import net.runelite.api.events.VarbitChanged; import net.runelite.api.events.WallObjectChanged; import net.runelite.api.events.WallObjectDespawned; import net.runelite.api.events.WallObjectSpawned; @@ -68,8 +77,14 @@ import net.runelite.client.ui.overlay.Overlay; ) public class MotherlodePlugin extends Plugin { - private static final Set MINE_SPOTS = Sets.newHashSet(ORE_VEIN_26661, ORE_VEIN_26662, ORE_VEIN_26663, ORE_VEIN_26664); - private static final Set ROCK_OBSTACLES = Sets.newHashSet(ROCKFALL, ROCKFALL_26680); + private static final Set MOTHERLODE_MAP_REGIONS = ImmutableSet.of(14679, 14680, 14681, 14935, 14936, 14937, 15191, 15192, 15193); + private static final Set MINE_SPOTS = ImmutableSet.of(ORE_VEIN_26661, ORE_VEIN_26662, ORE_VEIN_26663, ORE_VEIN_26664); + private static final Set MLM_ORE_TYPES = ImmutableSet.of(ItemID.RUNITE_ORE, ItemID.ADAMANTITE_ORE, + ItemID.MITHRIL_ORE, ItemID.GOLD_ORE, ItemID.COAL, ItemID.GOLDEN_NUGGET); + private static final Set ROCK_OBSTACLES = ImmutableSet.of(ROCKFALL, ROCKFALL_26680); + + private static final int SACK_LARGE_SIZE = 162; + private static final int SACK_SIZE = 81; @Inject private MotherlodeOverlay overlay; @@ -83,6 +98,19 @@ public class MotherlodePlugin extends Plugin @Inject private MotherlodeConfig config; + @Inject + private Client client; + + @Getter(AccessLevel.PACKAGE) + private boolean inMlm; + + @Getter(AccessLevel.PACKAGE) + private int curSackSize; + @Getter(AccessLevel.PACKAGE) + private int maxSackSize; + @Getter(AccessLevel.PACKAGE) + private Integer depositsLeft; + private final MotherlodeSession session = new MotherlodeSession(); @Getter(AccessLevel.PACKAGE) @@ -114,9 +142,25 @@ public class MotherlodePlugin extends Plugin return session; } + @Subscribe + public void onVarbitChanged(VarbitChanged event) + { + if (inMlm) + { + curSackSize = client.getSetting(Varbits.SACK_NUMBER); + boolean sackUpgraded = client.getSetting(Varbits.SACK_UPGRADED) == 1; + maxSackSize = sackUpgraded ? SACK_LARGE_SIZE : SACK_SIZE; + } + } + @Subscribe public void onChatMessage(ChatMessage event) { + if (!inMlm) + { + return; + } + if (event.getType() == ChatMessageType.FILTERED) { if (event.getMessage().equals("You manage to mine some pay-dirt.")) @@ -132,6 +176,13 @@ public class MotherlodePlugin extends Plugin ) public void checkMining() { + if (!inMlm) + { + return; + } + + depositsLeft = calculateDepositsLeft(); + Instant lastPayDirtMined = session.getLastPayDirtMined(); if (lastPayDirtMined == null) { @@ -149,8 +200,13 @@ public class MotherlodePlugin extends Plugin } @Subscribe - public void onWallObjectSpanwed(WallObjectSpawned event) + public void onWallObjectSpawned(WallObjectSpawned event) { + if (!inMlm) + { + return; + } + WallObject wallObject = event.getWallObject(); if (MINE_SPOTS.contains(wallObject.getId())) { @@ -161,6 +217,11 @@ public class MotherlodePlugin extends Plugin @Subscribe public void onWallObjectChanged(WallObjectChanged event) { + if (!inMlm) + { + return; + } + WallObject previous = event.getPrevious(); WallObject wallObject = event.getWallObject(); @@ -174,6 +235,11 @@ public class MotherlodePlugin extends Plugin @Subscribe public void onWallObjectDespawned(WallObjectDespawned event) { + if (!inMlm) + { + return; + } + WallObject wallObject = event.getWallObject(); veins.remove(wallObject); } @@ -181,6 +247,11 @@ public class MotherlodePlugin extends Plugin @Subscribe public void onGameObjectSpawned(GameObjectSpawned event) { + if (!inMlm) + { + return; + } + GameObject gameObject = event.getGameObject(); if (ROCK_OBSTACLES.contains(gameObject.getId())) { @@ -191,6 +262,11 @@ public class MotherlodePlugin extends Plugin @Subscribe public void onGameObjectChanged(GameObjectChanged event) { + if (!inMlm) + { + return; + } + GameObject previous = event.getPrevious(); GameObject gameObject = event.getGameObject(); @@ -205,10 +281,21 @@ public class MotherlodePlugin extends Plugin @Subscribe public void onGameObjectDespawned(GameObjectDespawned event) { + if (!inMlm) + { + return; + } + GameObject gameObject = event.getGameObject(); rocks.remove(gameObject); } + @Subscribe + public void onRegionChanged(MapRegionChanged event) + { + inMlm = checkInMlm(); + } + @Subscribe public void onGameStateChanged(GameStateChanged event) { @@ -218,5 +305,78 @@ public class MotherlodePlugin extends Plugin veins.clear(); rocks.clear(); } + else if (event.getGameState() == GameState.LOGGED_IN) + { + inMlm = checkInMlm(); + } + } + + private Integer calculateDepositsLeft() + { + if (maxSackSize == 0) // check if maxSackSize has been initialized + { + return null; + } + + double depositsLeft = 0; + int nonPayDirtItems = 0; + + ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); + if (inventory == null) + { + return null; + } + + Item[] result = inventory.getItems(); + assert result != null; + + int inventorySize = result.length; + + for (Item item : result) + { + // Assume that MLM ores are being banked and exclude them from the check, + // so the user doesn't see the Overlay switch between deposits left and N/A. + // + // Count other items at nonPayDirtItems so depositsLeft is calculated accordingly. + if (item.getId() != ItemID.PAYDIRT && item.getId() != -1 && !MLM_ORE_TYPES.contains(item.getId())) + { + nonPayDirtItems += 1; + } + } + + double inventorySpace = inventorySize - nonPayDirtItems; + double sackSizeRemaining = maxSackSize - curSackSize; + + if (inventorySpace > 0 && sackSizeRemaining > 0) + { + depositsLeft = Math.ceil(sackSizeRemaining / inventorySpace); + } + else if (inventorySpace == 0) + { + return null; + } + + return (int) depositsLeft; + } + + private boolean checkInMlm() + { + if (client.getGameState() != GameState.LOGGED_IN) + { + return false; + } + + int[] currentMapRegions = client.getMapRegions(); + + // Verify that all regions exist in MOTHERLODE_MAP_REGIONS + for (int region : currentMapRegions) + { + if (!MOTHERLODE_MAP_REGIONS.contains(region)) + { + return false; + } + } + + return true; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java index a1935f24a7..44a9c43397 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeRocksOverlay.java @@ -1,6 +1,7 @@ /* * Copyright (c) 2018, Seth -* Copyright (c) 2018, Adam + * Copyright (c) 2018, Adam + * Copyright (c) 2018, Lars * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,7 +71,7 @@ class MotherlodeRocksOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!config.showRocks()) + if (!config.showRocks() || !plugin.isInMlm()) { return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java index edc877ab78..5fc548a23a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java @@ -1,6 +1,7 @@ /* * Copyright (c) 2018, Seth -* Copyright (c) 2018, Adam + * Copyright (c) 2018, Adam + * Copyright (c) 2018, Lars * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,6 +28,7 @@ package net.runelite.client.plugins.motherlode; import java.awt.Dimension; import java.awt.Graphics2D; +import java.awt.Color; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Varbits; @@ -40,19 +42,27 @@ class MotherlodeSackOverlay extends Overlay { private final Client client; private final MotherlodeConfig config; + private final MotherlodePlugin plugin; + private final PanelComponent panelComponent = new PanelComponent(); @Inject - MotherlodeSackOverlay(Client client, MotherlodeConfig config) + MotherlodeSackOverlay(Client client, MotherlodeConfig config, MotherlodePlugin plugin) { setPosition(OverlayPosition.TOP_LEFT); this.client = client; this.config = config; + this.plugin = plugin; } @Override public Dimension render(Graphics2D graphics) { + if (!plugin.isInMlm()) + { + return null; + } + Widget sack = client.getWidget(WidgetInfo.MOTHERLODE_MINE); panelComponent.getLines().clear(); @@ -65,7 +75,21 @@ class MotherlodeSackOverlay extends Overlay { panelComponent.getLines().add(new PanelComponent.Line( "Pay-dirt in sack:", - String.valueOf(client.getSetting(Varbits.SACK_NUMBER)) + Color.WHITE, + String.valueOf(client.getSetting(Varbits.SACK_NUMBER)), + plugin.getCurSackSize() >= plugin.getMaxSackSize() ? Color.RED : Color.WHITE + )); + } + + if (config.showDepositsLeft()) + { + Integer depositsLeft = plugin.getDepositsLeft(); + + panelComponent.getLines().add(new PanelComponent.Line( + "Deposits left:", + Color.WHITE, + depositsLeft == null ? "N/A" : String.valueOf(depositsLeft), + depositsLeft == null ? Color.WHITE : (depositsLeft == 0 ? Color.RED : Color.WHITE) )); } }