Merge pull request #1286 from ypperlig/master

Motherlode Mine - Sack overlay and region check
This commit is contained in:
Adam
2018-04-13 10:01:00 -04:00
committed by GitHub
6 changed files with 239 additions and 25 deletions

View File

@@ -202,6 +202,7 @@ public enum Varbits
* Motherlode mine sack * Motherlode mine sack
*/ */
SACK_NUMBER(5558), SACK_NUMBER(5558),
SACK_UPGRADED(5556),
/** /**
* Experience tracker * Experience tracker

View File

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2018, Seth <Sethtroll3@gmail.com> * Copyright (c) 2018, Seth <Sethtroll3@gmail.com>
* Copyright (c) 2018, Lars <lars.oernlo@gmail.com>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -31,14 +32,14 @@ import net.runelite.client.config.ConfigItem;
@ConfigGroup( @ConfigGroup(
keyName = "motherlode", keyName = "motherlode",
name = "Motherlode Mine", name = "Motherlode Mine",
description = "Configuration for the motherlode plugin" description = "Configuration for the Motherlode Mine plugin"
) )
public interface MotherlodeConfig extends Config public interface MotherlodeConfig extends Config
{ {
@ConfigItem( @ConfigItem(
keyName = "showRocks", keyName = "showRocks",
name = "Show Pay-dirt mining spots", name = "Show pay-dirt mining spots",
description = "Configures whether or not the pay-dirt minings spots is displayed" description = "Configures whether or not the pay-dirt mining spots are displayed."
) )
default boolean showRocks() default boolean showRocks()
{ {
@@ -48,7 +49,7 @@ public interface MotherlodeConfig extends Config
@ConfigItem( @ConfigItem(
keyName = "statTimeout", keyName = "statTimeout",
name = "Reset stats (minutes)", name = "Reset stats (minutes)",
description = "Configures the time until statistic is reset" description = "Configures the time until statistics are reset"
) )
default int statTimeout() default int statTimeout()
{ {
@@ -57,8 +58,8 @@ public interface MotherlodeConfig extends Config
@ConfigItem( @ConfigItem(
keyName = "showSack", keyName = "showSack",
name = "Show Pay-dirt Sack", name = "Show pay-dirt sack",
description = "Configures whether to Pay-dirt sack is displayed" description = "Configures whether the pay-dirt sack is displayed or not."
) )
default boolean showSack() default boolean showSack()
{ {
@@ -67,11 +68,31 @@ public interface MotherlodeConfig extends Config
@ConfigItem( @ConfigItem(
keyName = "showMiningStats", keyName = "showMiningStats",
name = "Show Mining session stats", name = "Show mining session stats",
description = "Configures whether to display mining session stats" description = "Configures whether to display mining session stats"
) )
default boolean showMiningStats() default boolean showMiningStats()
{ {
return true; 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;
}
} }

View File

@@ -24,7 +24,7 @@
*/ */
package net.runelite.client.plugins.motherlode; 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.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
@@ -49,7 +49,7 @@ import net.runelite.client.ui.overlay.components.PanelComponent;
class MotherlodeOverlay extends Overlay class MotherlodeOverlay extends Overlay
{ {
private static final Set<Integer> MINING_ANIMATION_IDS = Sets.newHashSet( private static final Set<Integer> MINING_ANIMATION_IDS = ImmutableSet.of(
MINING_MOTHERLODE_BRONZE, MINING_MOTHERLODE_IRON, MINING_MOTHERLODE_STEEL, MINING_MOTHERLODE_BRONZE, MINING_MOTHERLODE_IRON, MINING_MOTHERLODE_STEEL,
MINING_MOTHERLODE_BLACK, MINING_MOTHERLODE_MITHRIL, MINING_MOTHERLODE_ADAMANT, MINING_MOTHERLODE_BLACK, MINING_MOTHERLODE_MITHRIL, MINING_MOTHERLODE_ADAMANT,
MINING_MOTHERLODE_RUNE, MINING_MOTHERLODE_DRAGON, MINING_MOTHERLODE_DRAGON_ORN, MINING_MOTHERLODE_RUNE, MINING_MOTHERLODE_DRAGON, MINING_MOTHERLODE_DRAGON_ORN,
@@ -73,7 +73,7 @@ class MotherlodeOverlay extends Overlay
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
if (!config.showMiningStats()) if (!plugin.isInMlm() || !config.showMiningStats())
{ {
return null; return null;
} }
@@ -95,15 +95,22 @@ class MotherlodeOverlay extends Overlay
panelComponent.getLines().clear(); panelComponent.getLines().clear();
if (MINING_ANIMATION_IDS.contains(client.getLocalPlayer().getAnimation())) if (config.showMiningState())
{ {
panelComponent.setTitle("You are mining"); if (MINING_ANIMATION_IDS.contains(client.getLocalPlayer().getAnimation()))
panelComponent.setTitleColor(Color.GREEN); {
panelComponent.setTitle("You are mining");
panelComponent.setTitleColor(Color.GREEN);
}
else
{
panelComponent.setTitle("You are NOT mining");
panelComponent.setTitleColor(Color.RED);
}
} }
else else
{ {
panelComponent.setTitle("You are NOT mining"); panelComponent.setTitle(null);
panelComponent.setTitleColor(Color.RED);
} }
panelComponent.getLines().add(new PanelComponent.Line( panelComponent.getLines().add(new PanelComponent.Line(

View File

@@ -1,6 +1,7 @@
/* /*
* Copyright (c) 2018, Seth <Sethtroll3@gmail.com> * Copyright (c) 2018, Seth <Sethtroll3@gmail.com>
* Copyright (c) 2018, Adam <Adam@sigterm.info> * Copyright (c) 2018, Adam <Adam@sigterm.info>
* Copyright (c) 2018, Lars <lars.oernlo@gmail.com>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -25,7 +26,7 @@
*/ */
package net.runelite.client.plugins.motherlode; 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.common.eventbus.Subscribe;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.time.Duration; import java.time.Duration;
@@ -39,20 +40,28 @@ import javax.inject.Inject;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
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.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_26661;
import static net.runelite.api.ObjectID.ORE_VEIN_26662; 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_26663;
import static net.runelite.api.ObjectID.ORE_VEIN_26664; import static net.runelite.api.ObjectID.ORE_VEIN_26664;
import static net.runelite.api.ObjectID.ROCKFALL; import static net.runelite.api.ObjectID.ROCKFALL;
import static net.runelite.api.ObjectID.ROCKFALL_26680; import static net.runelite.api.ObjectID.ROCKFALL_26680;
import net.runelite.api.Varbits;
import net.runelite.api.WallObject; import net.runelite.api.WallObject;
import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.GameObjectChanged; import net.runelite.api.events.GameObjectChanged;
import net.runelite.api.events.GameObjectDespawned; import net.runelite.api.events.GameObjectDespawned;
import net.runelite.api.events.GameObjectSpawned; import net.runelite.api.events.GameObjectSpawned;
import net.runelite.api.events.GameStateChanged; 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.WallObjectChanged;
import net.runelite.api.events.WallObjectDespawned; import net.runelite.api.events.WallObjectDespawned;
import net.runelite.api.events.WallObjectSpawned; import net.runelite.api.events.WallObjectSpawned;
@@ -68,8 +77,14 @@ import net.runelite.client.ui.overlay.Overlay;
) )
public class MotherlodePlugin extends Plugin public class MotherlodePlugin extends Plugin
{ {
private static final Set<Integer> MINE_SPOTS = Sets.newHashSet(ORE_VEIN_26661, ORE_VEIN_26662, ORE_VEIN_26663, ORE_VEIN_26664); private static final Set<Integer> MOTHERLODE_MAP_REGIONS = ImmutableSet.of(14679, 14680, 14681, 14935, 14936, 14937, 15191, 15192, 15193);
private static final Set<Integer> ROCK_OBSTACLES = Sets.newHashSet(ROCKFALL, ROCKFALL_26680); private static final Set<Integer> MINE_SPOTS = ImmutableSet.of(ORE_VEIN_26661, ORE_VEIN_26662, ORE_VEIN_26663, ORE_VEIN_26664);
private static final Set<Integer> 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<Integer> ROCK_OBSTACLES = ImmutableSet.of(ROCKFALL, ROCKFALL_26680);
private static final int SACK_LARGE_SIZE = 162;
private static final int SACK_SIZE = 81;
@Inject @Inject
private MotherlodeOverlay overlay; private MotherlodeOverlay overlay;
@@ -83,6 +98,19 @@ public class MotherlodePlugin extends Plugin
@Inject @Inject
private MotherlodeConfig config; 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(); private final MotherlodeSession session = new MotherlodeSession();
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@@ -114,9 +142,25 @@ public class MotherlodePlugin extends Plugin
return session; 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 @Subscribe
public void onChatMessage(ChatMessage event) public void onChatMessage(ChatMessage event)
{ {
if (!inMlm)
{
return;
}
if (event.getType() == ChatMessageType.FILTERED) if (event.getType() == ChatMessageType.FILTERED)
{ {
if (event.getMessage().equals("You manage to mine some pay-dirt.")) if (event.getMessage().equals("You manage to mine some pay-dirt."))
@@ -132,6 +176,13 @@ public class MotherlodePlugin extends Plugin
) )
public void checkMining() public void checkMining()
{ {
if (!inMlm)
{
return;
}
depositsLeft = calculateDepositsLeft();
Instant lastPayDirtMined = session.getLastPayDirtMined(); Instant lastPayDirtMined = session.getLastPayDirtMined();
if (lastPayDirtMined == null) if (lastPayDirtMined == null)
{ {
@@ -149,8 +200,13 @@ public class MotherlodePlugin extends Plugin
} }
@Subscribe @Subscribe
public void onWallObjectSpanwed(WallObjectSpawned event) public void onWallObjectSpawned(WallObjectSpawned event)
{ {
if (!inMlm)
{
return;
}
WallObject wallObject = event.getWallObject(); WallObject wallObject = event.getWallObject();
if (MINE_SPOTS.contains(wallObject.getId())) if (MINE_SPOTS.contains(wallObject.getId()))
{ {
@@ -161,6 +217,11 @@ public class MotherlodePlugin extends Plugin
@Subscribe @Subscribe
public void onWallObjectChanged(WallObjectChanged event) public void onWallObjectChanged(WallObjectChanged event)
{ {
if (!inMlm)
{
return;
}
WallObject previous = event.getPrevious(); WallObject previous = event.getPrevious();
WallObject wallObject = event.getWallObject(); WallObject wallObject = event.getWallObject();
@@ -174,6 +235,11 @@ public class MotherlodePlugin extends Plugin
@Subscribe @Subscribe
public void onWallObjectDespawned(WallObjectDespawned event) public void onWallObjectDespawned(WallObjectDespawned event)
{ {
if (!inMlm)
{
return;
}
WallObject wallObject = event.getWallObject(); WallObject wallObject = event.getWallObject();
veins.remove(wallObject); veins.remove(wallObject);
} }
@@ -181,6 +247,11 @@ public class MotherlodePlugin extends Plugin
@Subscribe @Subscribe
public void onGameObjectSpawned(GameObjectSpawned event) public void onGameObjectSpawned(GameObjectSpawned event)
{ {
if (!inMlm)
{
return;
}
GameObject gameObject = event.getGameObject(); GameObject gameObject = event.getGameObject();
if (ROCK_OBSTACLES.contains(gameObject.getId())) if (ROCK_OBSTACLES.contains(gameObject.getId()))
{ {
@@ -191,6 +262,11 @@ public class MotherlodePlugin extends Plugin
@Subscribe @Subscribe
public void onGameObjectChanged(GameObjectChanged event) public void onGameObjectChanged(GameObjectChanged event)
{ {
if (!inMlm)
{
return;
}
GameObject previous = event.getPrevious(); GameObject previous = event.getPrevious();
GameObject gameObject = event.getGameObject(); GameObject gameObject = event.getGameObject();
@@ -205,10 +281,21 @@ public class MotherlodePlugin extends Plugin
@Subscribe @Subscribe
public void onGameObjectDespawned(GameObjectDespawned event) public void onGameObjectDespawned(GameObjectDespawned event)
{ {
if (!inMlm)
{
return;
}
GameObject gameObject = event.getGameObject(); GameObject gameObject = event.getGameObject();
rocks.remove(gameObject); rocks.remove(gameObject);
} }
@Subscribe
public void onRegionChanged(MapRegionChanged event)
{
inMlm = checkInMlm();
}
@Subscribe @Subscribe
public void onGameStateChanged(GameStateChanged event) public void onGameStateChanged(GameStateChanged event)
{ {
@@ -218,5 +305,78 @@ public class MotherlodePlugin extends Plugin
veins.clear(); veins.clear();
rocks.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;
} }
} }

View File

@@ -1,6 +1,7 @@
/* /*
* Copyright (c) 2018, Seth <Sethtroll3@gmail.com> * Copyright (c) 2018, Seth <Sethtroll3@gmail.com>
* Copyright (c) 2018, Adam <Adam@sigterm.info> * Copyright (c) 2018, Adam <Adam@sigterm.info>
* Copyright (c) 2018, Lars <lars.oernlo@gmail.com>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -70,7 +71,7 @@ class MotherlodeRocksOverlay extends Overlay
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
if (!config.showRocks()) if (!config.showRocks() || !plugin.isInMlm())
{ {
return null; return null;
} }

View File

@@ -1,6 +1,7 @@
/* /*
* Copyright (c) 2018, Seth <Sethtroll3@gmail.com> * Copyright (c) 2018, Seth <Sethtroll3@gmail.com>
* Copyright (c) 2018, Adam <Adam@sigterm.info> * Copyright (c) 2018, Adam <Adam@sigterm.info>
* Copyright (c) 2018, Lars <lars.oernlo@gmail.com>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * 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.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Color;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Varbits; import net.runelite.api.Varbits;
@@ -40,19 +42,27 @@ class MotherlodeSackOverlay extends Overlay
{ {
private final Client client; private final Client client;
private final MotherlodeConfig config; private final MotherlodeConfig config;
private final MotherlodePlugin plugin;
private final PanelComponent panelComponent = new PanelComponent(); private final PanelComponent panelComponent = new PanelComponent();
@Inject @Inject
MotherlodeSackOverlay(Client client, MotherlodeConfig config) MotherlodeSackOverlay(Client client, MotherlodeConfig config, MotherlodePlugin plugin)
{ {
setPosition(OverlayPosition.TOP_LEFT); setPosition(OverlayPosition.TOP_LEFT);
this.client = client; this.client = client;
this.config = config; this.config = config;
this.plugin = plugin;
} }
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
if (!plugin.isInMlm())
{
return null;
}
Widget sack = client.getWidget(WidgetInfo.MOTHERLODE_MINE); Widget sack = client.getWidget(WidgetInfo.MOTHERLODE_MINE);
panelComponent.getLines().clear(); panelComponent.getLines().clear();
@@ -65,7 +75,21 @@ class MotherlodeSackOverlay extends Overlay
{ {
panelComponent.getLines().add(new PanelComponent.Line( panelComponent.getLines().add(new PanelComponent.Line(
"Pay-dirt in sack:", "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)
)); ));
} }
} }