From 2ef1f29c13975ff45400ce3e1d4d0e5bcfe331ed Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 7 Aug 2019 19:08:31 -0400 Subject: [PATCH] xptracker: support xp gains when offline When xp is gained when offline, the tracker calculates it into the xp/hr, which can lead to very skewed stats due to the tracker being generally paused when the player is offline. This offsets the start xp by the gains when offline to correct for it. --- .../plugins/xptracker/XpStateSingle.java | 13 +++++++--- .../plugins/xptracker/XpTrackerPlugin.java | 26 +++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java index 2b6c694ba1..af37a7ec3c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpStateSingle.java @@ -28,21 +28,20 @@ package net.runelite.client.plugins.xptracker; import java.util.HashMap; import java.util.Map; import lombok.Getter; -import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Experience; import net.runelite.api.Skill; @Slf4j -@RequiredArgsConstructor class XpStateSingle { private final Skill skill; private final Map actions = new HashMap<>(); @Getter - private final long startXp; + @Setter + private long startXp; @Getter private int xpGained = 0; @@ -54,13 +53,19 @@ class XpStateSingle private int startLevelExp = 0; private int endLevelExp = 0; + XpStateSingle(Skill skill, long startXp) + { + this.skill = skill; + this.startXp = startXp; + } + XpAction getXpAction(final XpActionType type) { actions.putIfAbsent(type, new XpAction()); return actions.get(type); } - private long getCurrentXp() + long getCurrentXp() { return startXp + xpGained; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index 6de3527bc9..6aa4238299 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -391,6 +391,32 @@ public class XpTrackerPlugin extends Plugin { initializeTracker = false; + // Check for xp gained while logged out + for (Skill skill : Skill.values()) + { + if (skill == Skill.OVERALL || !xpState.isInitialized(skill)) + { + continue; + } + + XpStateSingle skillState = xpState.getSkill(skill); + final int currentXp = client.getSkillExperience(skill); + if (skillState.getCurrentXp() != currentXp) + { + if (currentXp < skillState.getCurrentXp()) + { + log.debug("Xp is going backwards! {} {} -> {}", skill, skillState.getCurrentXp(), currentXp); + resetState(); + break; + } + + log.debug("Skill xp for {} changed when offline: {} -> {}", skill, skillState.getCurrentXp(), currentXp); + // Offset start xp for offline gains + long diff = skillState.getCurrentXp() - currentXp; + skillState.setStartXp(skillState.getStartXp() + diff); + } + } + // Initialize the tracker with the initial xp if not already initialized for (Skill skill : Skill.values()) {