From 188bb70417ff5def01262211208b6a1d086dbcc6 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 3 Mar 2019 14:40:07 -0500 Subject: [PATCH] xptracker: use long for tracking overall xp --- .../main/java/net/runelite/api/Client.java | 7 +++ .../plugins/xptracker/XpPauseState.java | 2 +- .../plugins/xptracker/XpPauseStateSingle.java | 4 +- .../client/plugins/xptracker/XpState.java | 8 +-- .../plugins/xptracker/XpStateSingle.java | 53 ++++++++++--------- .../plugins/xptracker/XpTrackerPlugin.java | 41 ++++++++------ .../net/runelite/mixins/RSClientMixin.java | 26 ++++++--- 7 files changed, 85 insertions(+), 56 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 4c44c7e3ef..e3f29e8041 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -782,6 +782,13 @@ public interface Client extends GameEngine */ int getSkillExperience(Skill skill); + /** + * Get the total experience of the player + * + * @return + */ + long getOverallExperience(); + /** * Gets the game drawing mode. * diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java index 9f57de71c3..194c890c42 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseState.java @@ -49,7 +49,7 @@ class XpPauseState return findPauseState(skill).isPaused(); } - void tickXp(Skill skill, int currentXp, int pauseAfterMinutes) + void tickXp(Skill skill, long currentXp, int pauseAfterMinutes) { final XpPauseStateSingle state = findPauseState(skill); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java index d74d498bd1..9e5cc55622 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPauseStateSingle.java @@ -39,7 +39,7 @@ class XpPauseStateSingle @Getter private long lastChangeMillis; @Getter - private int xp; + private long xp; boolean isPaused() { @@ -66,7 +66,7 @@ class XpPauseStateSingle return pauseReasons.add(XpPauseReason.PAUSE_MANUAL); } - boolean xpChanged(int xp) + boolean xpChanged(long xp) { this.xp = xp; this.lastChangeMillis = System.currentTimeMillis(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java index b12decc9c2..d6a10df1b8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpState.java @@ -56,7 +56,7 @@ class XpState * @param skill Skill to reset * @param currentXp Current XP to set to, if unknown set to -1 */ - void resetSkill(Skill skill, int currentXp) + void resetSkill(Skill skill, long currentXp) { xpSkills.remove(skill); xpSkills.put(skill, new XpStateSingle(skill, currentXp)); @@ -73,7 +73,7 @@ class XpState * @param goalEndXp Possible XP end goal * @return Whether or not the skill has been initialized, there was no change, or it has been updated */ - XpUpdateResult updateSkill(Skill skill, int currentXp, int goalStartXp, int goalEndXp) + XpUpdateResult updateSkill(Skill skill, long currentXp, int goalStartXp, int goalEndXp) { XpStateSingle state = getSkill(skill); @@ -91,7 +91,7 @@ class XpState } else { - int startXp = state.getStartXp(); + long startXp = state.getStartXp(); int gainedXp = state.getXpGained(); if (startXp + gainedXp > currentXp) @@ -191,7 +191,7 @@ class XpState * @param skill Skill to initialize * @param currentXp Current known XP for the skill */ - void initializeSkill(Skill skill, int currentXp) + void initializeSkill(Skill skill, long currentXp) { xpSkills.put(skill, new XpStateSingle(skill, currentXp)); } 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 7f4eef8d1c..2b6c694ba1 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 @@ -42,7 +42,7 @@ class XpStateSingle private final Map actions = new HashMap<>(); @Getter - private final int startXp; + private final long startXp; @Getter private int xpGained = 0; @@ -60,7 +60,7 @@ class XpStateSingle return actions.get(type); } - private int getCurrentXp() + private long getCurrentXp() { return startXp + xpGained; } @@ -86,7 +86,7 @@ class XpStateSingle private int getXpRemaining() { - return endLevelExp - getCurrentXp(); + return endLevelExp - (int) getCurrentXp(); } private int getActionsRemaining() @@ -170,7 +170,7 @@ class XpStateSingle return toHourly(xpGained); } - boolean update(int currentXp, int goalStartXp, int goalEndXp) + boolean update(long currentXp, int goalStartXp, int goalEndXp) { if (startXp == -1) { @@ -178,8 +178,8 @@ class XpStateSingle return false; } - int originalXp = xpGained + startXp; - int actionExp = currentXp - originalXp; + long originalXp = xpGained + startXp; + int actionExp = (int) (currentXp - originalXp); // No experience gained if (actionExp == 0) @@ -210,28 +210,31 @@ class XpStateSingle action.setActions(action.getActions() + 1); // Calculate experience gained - xpGained = currentXp - startXp; + xpGained = (int) (currentXp - startXp); - // Determine XP goals - if (goalStartXp <= 0 || currentXp > goalEndXp) + // Determine XP goals, overall has no goals + if (skill != Skill.OVERALL) { - startLevelExp = Experience.getXpForLevel(Experience.getLevelForXp(currentXp)); - } - else - { - startLevelExp = goalStartXp; - } + if (goalStartXp <= 0 || currentXp > goalEndXp) + { + startLevelExp = Experience.getXpForLevel(Experience.getLevelForXp((int) currentXp)); + } + else + { + startLevelExp = goalStartXp; + } - if (goalEndXp <= 0 || currentXp > goalEndXp) - { - int currentLevel = Experience.getLevelForXp(currentXp); - endLevelExp = currentLevel + 1 <= Experience.MAX_VIRT_LEVEL - ? Experience.getXpForLevel(currentLevel + 1) - : Experience.MAX_SKILL_XP; - } - else - { - endLevelExp = goalEndXp; + if (goalEndXp <= 0 || currentXp > goalEndXp) + { + int currentLevel = Experience.getLevelForXp((int) currentXp); + endLevelExp = currentLevel + 1 <= Experience.MAX_VIRT_LEVEL + ? Experience.getXpForLevel(currentLevel + 1) + : Experience.MAX_SKILL_XP; + } + else + { + endLevelExp = goalEndXp; + } } return true; 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 5930584377..c66c409a16 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 @@ -146,16 +146,6 @@ public class XpTrackerPlugin extends Plugin clientToolbar.removeNavigation(navButton); } - private long getTotalXp() - { - long total = 0; - for (Skill skill : Skill.values()) - { - total += client.getSkillExperience(skill); - } - return total; - } - @Subscribe public void onGameStateChanged(GameStateChanged event) { @@ -195,7 +185,7 @@ public class XpTrackerPlugin extends Plugin return; } - long totalXp = getTotalXp(); + long totalXp = client.getOverallExperience(); // Don't submit xptrack unless xp threshold is reached if (Math.abs(totalXp - lastXp) > XP_THRESHOLD) { @@ -229,7 +219,16 @@ public class XpTrackerPlugin extends Plugin for (Skill skill : Skill.values()) { - int currentXp = client.getSkillExperience(skill); + long currentXp; + if (skill == Skill.OVERALL) + { + currentXp = client.getOverallExperience(); + } + else + { + currentXp = client.getSkillExperience(skill); + } + xpState.initializeSkill(skill, currentXp); } } @@ -306,11 +305,11 @@ public class XpTrackerPlugin extends Plugin if (skill == Skill.CONSTRUCTION && updateResult == XpUpdateResult.INITIALIZED) { // Construction is the last skill initialized on login, now initialize the total experience - xpState.initializeSkill(Skill.OVERALL, client.getSkillExperience(Skill.OVERALL)); + xpState.initializeSkill(Skill.OVERALL, client.getOverallExperience()); } else if (xpState.isInitialized(Skill.OVERALL)) { - xpState.updateSkill(Skill.OVERALL, client.getSkillExperience(Skill.OVERALL), -1, -1); + xpState.updateSkill(Skill.OVERALL, client.getOverallExperience(), -1, -1); xpPanel.updateTotal(xpState.getTotalSnapshot()); } } @@ -341,7 +340,7 @@ public class XpTrackerPlugin extends Plugin rebuildSkills(); if (fetchXp) { - lastXp = getTotalXp(); + lastXp = client.getOverallExperience(); fetchXp = false; } } @@ -470,7 +469,17 @@ public class XpTrackerPlugin extends Plugin // Adjust unpause states for (Skill skill : Skill.values()) { - xpPauseState.tickXp(skill, client.getSkillExperience(skill), xpTrackerConfig.pauseSkillAfter()); + long skillExperience; + if (skill == Skill.OVERALL) + { + skillExperience = client.getOverallExperience(); + } + else + { + skillExperience = client.getSkillExperience(skill); + } + + xpPauseState.tickXp(skill, skillExperience, xpTrackerConfig.pauseSkillAfter()); } xpPauseState.tickLogout(xpTrackerConfig.pauseOnLogout(), !GameState.LOGIN_SCREEN.equals(client.getGameState())); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 7cfef3985c..e2dc26702e 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -504,14 +504,8 @@ public abstract class RSClientMixin implements RSClient if (skill == Skill.OVERALL) { - int totalExperience = 0; - - for (int experience : experiences) - { - totalExperience += experience; - } - - return totalExperience; + logger.debug("getSkillExperience called for {}!", skill); + return (int) getOverallExperience(); } int idx = skill.ordinal(); @@ -526,6 +520,22 @@ public abstract class RSClientMixin implements RSClient return experiences[idx]; } + @Inject + @Override + public long getOverallExperience() + { + int[] experiences = getSkillExperiences(); + + long totalExperience = 0L; + + for (int experience : experiences) + { + totalExperience += experience; + } + + return totalExperience; + } + @Inject @Override public void refreshChat()