woodcutting plugin: timeout woodcutting sessions
Also keep and store current axe type being used
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Mantautas Jurksa <https://github.com/Juzzed>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package net.runelite.client.plugins.woodcutting;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_3A_AXE;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_ADAMANT;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_BLACK;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_BRONZE;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_DRAGON;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_INFERNAL;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_IRON;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_MITHRIL;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_RUNE;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_STEEL;
|
||||
import static net.runelite.api.ItemID.ADAMANT_AXE;
|
||||
import static net.runelite.api.ItemID.BLACK_AXE;
|
||||
import static net.runelite.api.ItemID.BRONZE_AXE;
|
||||
import static net.runelite.api.ItemID.DRAGON_AXE;
|
||||
import static net.runelite.api.ItemID.INFERNAL_AXE;
|
||||
import static net.runelite.api.ItemID.IRON_AXE;
|
||||
import static net.runelite.api.ItemID.MITHRIL_AXE;
|
||||
import static net.runelite.api.ItemID.RUNE_AXE;
|
||||
import static net.runelite.api.ItemID.STEEL_AXE;
|
||||
import static net.runelite.api.ItemID._3RD_AGE_AXE;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
enum Axe
|
||||
{
|
||||
BRONZE(WOODCUTTING_BRONZE, BRONZE_AXE),
|
||||
IRON(WOODCUTTING_IRON, IRON_AXE),
|
||||
STEEL(WOODCUTTING_STEEL, STEEL_AXE),
|
||||
BLACK(WOODCUTTING_BLACK, BLACK_AXE),
|
||||
MITHRIL(WOODCUTTING_MITHRIL, MITHRIL_AXE),
|
||||
ADAMANT(WOODCUTTING_ADAMANT, ADAMANT_AXE),
|
||||
RUNE(WOODCUTTING_RUNE, RUNE_AXE),
|
||||
DRAGON(WOODCUTTING_DRAGON, DRAGON_AXE),
|
||||
INFERNAL(WOODCUTTING_INFERNAL, INFERNAL_AXE),
|
||||
THIRDAGE(WOODCUTTING_3A_AXE, _3RD_AGE_AXE);
|
||||
|
||||
private final Integer animId;
|
||||
private final Integer itemId;
|
||||
|
||||
private static final Map<Integer, Axe> AXE_ANIM_IDS = new HashMap<>();
|
||||
|
||||
static
|
||||
{
|
||||
for (Axe axe : values())
|
||||
{
|
||||
AXE_ANIM_IDS.put(axe.animId, axe);
|
||||
}
|
||||
}
|
||||
|
||||
static Axe findAxeByAnimId(int animId)
|
||||
{
|
||||
return AXE_ANIM_IDS.get(animId);
|
||||
}
|
||||
}
|
||||
@@ -36,9 +36,10 @@ import net.runelite.client.config.ConfigItem;
|
||||
public interface WoodcuttingConfig extends Config
|
||||
{
|
||||
@ConfigItem(
|
||||
position = 1,
|
||||
keyName = "statTimeout",
|
||||
name = "Reset stats (minutes)",
|
||||
description = "Configures the time until statistic is reset"
|
||||
description = "Configures the time until statistic is reset. Also configures when tree indicator is hidden"
|
||||
)
|
||||
default int statTimeout()
|
||||
{
|
||||
@@ -46,6 +47,7 @@ public interface WoodcuttingConfig extends Config
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
position = 2,
|
||||
keyName = "showNestNotification",
|
||||
name = "Bird nest notification",
|
||||
description = "Configures whether to notify you of a bird nest spawn"
|
||||
@@ -56,12 +58,13 @@ public interface WoodcuttingConfig extends Config
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
position = 3,
|
||||
keyName = "showWoodcuttingStats",
|
||||
name = "Show Woodcutting session stats",
|
||||
name = "Show session stats",
|
||||
description = "Configures whether to display woodcutting session stats"
|
||||
)
|
||||
default boolean showWoodcuttingStats()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,19 +27,7 @@ package net.runelite.client.plugins.woodcutting;
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.stream.IntStream;
|
||||
import javax.inject.Inject;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_ADAMANT;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_BLACK;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_BRONZE;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_DRAGON;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_INFERNAL;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_IRON;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_MITHRIL;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_RUNE;
|
||||
import static net.runelite.api.AnimationID.WOODCUTTING_STEEL;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.Skill;
|
||||
import net.runelite.client.plugins.xptracker.XpTrackerService;
|
||||
@@ -51,13 +39,6 @@ import net.runelite.client.ui.overlay.components.TitleComponent;
|
||||
|
||||
class WoodcuttingOverlay extends Overlay
|
||||
{
|
||||
private static final int[] animationIds =
|
||||
{
|
||||
WOODCUTTING_BRONZE, WOODCUTTING_IRON, WOODCUTTING_STEEL, WOODCUTTING_BLACK,
|
||||
WOODCUTTING_MITHRIL, WOODCUTTING_ADAMANT, WOODCUTTING_RUNE, WOODCUTTING_DRAGON,
|
||||
WOODCUTTING_INFERNAL
|
||||
};
|
||||
|
||||
private final Client client;
|
||||
private final WoodcuttingPlugin plugin;
|
||||
private final WoodcuttingConfig config;
|
||||
@@ -65,7 +46,7 @@ class WoodcuttingOverlay extends Overlay
|
||||
private final PanelComponent panelComponent = new PanelComponent();
|
||||
|
||||
@Inject
|
||||
public WoodcuttingOverlay(Client client, WoodcuttingPlugin plugin, WoodcuttingConfig config, XpTrackerService xpTrackerService)
|
||||
private WoodcuttingOverlay(Client client, WoodcuttingPlugin plugin, WoodcuttingConfig config, XpTrackerService xpTrackerService)
|
||||
{
|
||||
setPosition(OverlayPosition.TOP_LEFT);
|
||||
this.client = client;
|
||||
@@ -83,23 +64,15 @@ class WoodcuttingOverlay extends Overlay
|
||||
}
|
||||
|
||||
WoodcuttingSession session = plugin.getSession();
|
||||
|
||||
if (session.getLastLogCut() == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Duration statTimeout = Duration.ofMinutes(config.statTimeout());
|
||||
Duration sinceCut = Duration.between(session.getLastLogCut(), Instant.now());
|
||||
|
||||
if (sinceCut.compareTo(statTimeout) >= 0)
|
||||
if (session == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
panelComponent.getChildren().clear();
|
||||
|
||||
if (IntStream.of(animationIds).anyMatch(x -> x == client.getLocalPlayer().getAnimation()))
|
||||
Axe axe = plugin.getAxe();
|
||||
if (axe != null && axe.getAnimId() == client.getLocalPlayer().getAnimation())
|
||||
{
|
||||
panelComponent.getChildren().add(TitleComponent.builder()
|
||||
.text("Woodcutting")
|
||||
@@ -133,4 +106,5 @@ class WoodcuttingOverlay extends Overlay
|
||||
|
||||
return panelComponent.render(graphics);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -26,9 +26,16 @@ package net.runelite.client.plugins.woodcutting;
|
||||
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.google.inject.Provides;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import javax.inject.Inject;
|
||||
import lombok.Getter;
|
||||
import net.runelite.api.ChatMessageType;
|
||||
import net.runelite.api.Client;
|
||||
import net.runelite.api.Player;
|
||||
import net.runelite.api.events.AnimationChanged;
|
||||
import net.runelite.api.events.ChatMessage;
|
||||
import net.runelite.api.events.GameTick;
|
||||
import net.runelite.client.Notifier;
|
||||
import net.runelite.client.config.ConfigManager;
|
||||
import net.runelite.client.plugins.Plugin;
|
||||
@@ -46,13 +53,20 @@ public class WoodcuttingPlugin extends Plugin
|
||||
@Inject
|
||||
private Notifier notifier;
|
||||
|
||||
@Inject
|
||||
private Client client;
|
||||
|
||||
@Inject
|
||||
private WoodcuttingOverlay overlay;
|
||||
|
||||
@Inject
|
||||
private WoodcuttingConfig config;
|
||||
|
||||
private final WoodcuttingSession session = new WoodcuttingSession();
|
||||
@Getter
|
||||
private WoodcuttingSession session;
|
||||
|
||||
@Getter
|
||||
private Axe axe;
|
||||
|
||||
@Provides
|
||||
WoodcuttingConfig getConfig(ConfigManager configManager)
|
||||
@@ -66,9 +80,29 @@ public class WoodcuttingPlugin extends Plugin
|
||||
return overlay;
|
||||
}
|
||||
|
||||
public WoodcuttingSession getSession()
|
||||
@Override
|
||||
protected void shutDown() throws Exception
|
||||
{
|
||||
return session;
|
||||
session = null;
|
||||
axe = null;
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onGameTick(GameTick gameTick)
|
||||
{
|
||||
if (session == null || session.getLastLogCut() == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Duration statTimeout = Duration.ofMinutes(config.statTimeout());
|
||||
Duration sinceCut = Duration.between(session.getLastLogCut(), Instant.now());
|
||||
|
||||
if (sinceCut.compareTo(statTimeout) >= 0)
|
||||
{
|
||||
session = null;
|
||||
axe = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@@ -78,6 +112,11 @@ public class WoodcuttingPlugin extends Plugin
|
||||
{
|
||||
if (event.getMessage().startsWith("You get some") && event.getMessage().endsWith("logs."))
|
||||
{
|
||||
if (session == null)
|
||||
{
|
||||
session = new WoodcuttingSession();
|
||||
}
|
||||
|
||||
session.setLastLogCut();
|
||||
}
|
||||
|
||||
@@ -87,4 +126,22 @@ public class WoodcuttingPlugin extends Plugin
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onAnimationChanged(final AnimationChanged event)
|
||||
{
|
||||
Player local = client.getLocalPlayer();
|
||||
|
||||
if (event.getActor() != local)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int animId = local.getAnimation();
|
||||
Axe axe = Axe.findAxeByAnimId(animId);
|
||||
if (axe != null)
|
||||
{
|
||||
this.axe = axe;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user