diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java index fa5aeab690..794484f0fb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropConfig.java @@ -32,6 +32,13 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup("xpdrop") public interface XpDropConfig extends Config { + enum DamageMode + { + NONE, + ABOVE_OPPONENT, + IN_XP_DROP + } + @ConfigItem( keyName = "hideSkillIcons", name = "Hide skill icons", @@ -93,9 +100,9 @@ public interface XpDropConfig extends Config description = "Show what you hit next to the XP drop", position = 5 ) - default boolean showDamage() + default DamageMode showDamage() { - return false; + return DamageMode.NONE; } @ConfigItem( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java index b0fddcd62c..7b95c4d6d3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropOverlay.java @@ -51,7 +51,7 @@ class XpDropOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (config.showDamage() && plugin.getTickShow() > 0) + if (plugin.getTickShow() > 0) { final Actor opponent = plugin.getLastOpponent(); if (opponent != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java index a1a1606c78..7a46184298 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java @@ -36,7 +36,6 @@ import lombok.AccessLevel; import lombok.Getter; import net.runelite.api.Actor; import net.runelite.api.Client; -import net.runelite.api.GameState; import net.runelite.api.NPC; import net.runelite.api.Player; import static net.runelite.api.ScriptID.XPDROP_DISABLED; @@ -44,6 +43,7 @@ import net.runelite.api.Skill; import net.runelite.api.SpriteID; import net.runelite.api.Varbits; import net.runelite.api.WorldType; +import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; @@ -58,6 +58,7 @@ import net.runelite.client.game.NPCManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.ColorUtil; @PluginDescriptor( name = "XP Drop", @@ -94,9 +95,6 @@ public class XpDropPlugin extends Plugin @Getter(AccessLevel.PACKAGE) private Actor lastOpponent; - private double hpExp = 0; - private boolean loginTick = false; - private int tickCounter = 0; private int previousExpGained; private boolean hasDropped = false; @@ -104,6 +102,7 @@ public class XpDropPlugin extends Plugin private Skill lastSkill = null; private Map previousSkillExpTable = new EnumMap<>(Skill.class); private PrayerType currentTickPrayer; + private XpDropConfig.DamageMode damageMode; @Provides XpDropConfig provideConfig(ConfigManager configManager) @@ -114,7 +113,12 @@ public class XpDropPlugin extends Plugin @Override protected void startUp() throws Exception { - overlayManager.add(overlay); + damageMode = config.showDamage(); + + if (damageMode == XpDropConfig.DamageMode.ABOVE_OPPONENT) + { + overlayManager.add(overlay); + } } @Override @@ -124,13 +128,37 @@ public class XpDropPlugin extends Plugin } @Subscribe - public void onGameStateChanged(GameStateChanged event) + public void onConfigChanged(ConfigChanged event) { - if (event.getGameState() == GameState.LOGIN_SCREEN) + if (!event.getGroup().equals("xpdrop")) { - loginTick = true; + return; } + + if (damageMode != XpDropConfig.DamageMode.ABOVE_OPPONENT) + { + damageMode = config.showDamage(); + + if (damageMode == XpDropConfig.DamageMode.ABOVE_OPPONENT) + { + overlayManager.add(overlay); + } + } + else + { + damageMode = config.showDamage(); + + if (damageMode != XpDropConfig.DamageMode.ABOVE_OPPONENT) + { + overlayManager.remove(overlay); + } + } + } + + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { damage = 0; tickShow = 0; } @@ -263,17 +291,12 @@ public class XpDropPlugin extends Plugin @Subscribe public void onGameTick(GameTick tick) { - loginTick = false; lastOpponent = client.getLocalPlayer().getInteracting(); if (tickShow > 0) { tickShow--; } - else - { - damage = 0; - } currentTickPrayer = getActivePrayerType(); correctPrayer = false; @@ -315,32 +338,16 @@ public class XpDropPlugin extends Plugin previousExpGained = xp - previous; hasDropped = true; } - - if (loginTick) - { - return; - } - - if (event.getSkill().equals(Skill.HITPOINTS)) - { - final double oldExp = hpExp; - hpExp = client.getSkillExperience(Skill.HITPOINTS); - - final double diff = hpExp - oldExp; - if (diff < 1) - { - return; - } - - final double damageDealt = calculateDamageDealt(diff); - damage = (int) Math.rint(damageDealt); - tickShow = 3; - } } @Subscribe public void onScriptCallbackEvent(ScriptCallbackEvent e) { + if (config.showDamage() == XpDropConfig.DamageMode.NONE) + { + return; + } + final String eventName = e.getEventName(); // Handles Fake XP drops (Ironman, DMM Cap, 200m xp, etc) @@ -351,19 +358,40 @@ public class XpDropPlugin extends Plugin final int skillId = intStack[intStackSize - 2]; final Skill skill = Skill.values()[skillId]; + if (skill.equals(Skill.HITPOINTS)) { final int exp = intStack[intStackSize - 1]; - final double damageDealt = calculateDamageDealt(exp); - damage = (int) Math.rint(damageDealt); - tickShow = 3; + calculateDamageDealt(exp); } client.setIntStackSize(intStackSize - 2); } + else if (eventName.equals("hpXpGained")) + { + final int[] intStack = client.getIntStack(); + final int intStackSize = client.getIntStackSize(); + + final int exp = intStack[intStackSize - 1]; + calculateDamageDealt(exp); + } + else if (eventName.equals("xpDropAddDamage") && + damageMode == XpDropConfig.DamageMode.IN_XP_DROP && + damage > 0) + { + final String[] stringStack = client.getStringStack(); + final int stringStackSize = client.getStringStackSize(); + + StringBuilder builder = new StringBuilder() + .append(stringStack[stringStackSize - 1]) + .append(ColorUtil.colorTag(config.getDamageColor())) + .append(" (").append(damage).append(")"); + + stringStack[stringStackSize - 1] = builder.toString(); + } } - private double calculateDamageDealt(double diff) + private void calculateDamageDealt(int diff) { double damageDealt = diff / HITPOINT_RATIO; // DeadMan mode has an XP modifier @@ -379,7 +407,9 @@ public class XpDropPlugin extends Plugin // If we are interacting with nothing we may have clicked away at the perfect time fall back to last tick if (!(lastOpponent instanceof NPC) && !(lastOpponent instanceof Player)) { - return damageDealt; + damage = (int) Math.rint(damageDealt); + tickShow = 3; + return; } a = lastOpponent; @@ -387,10 +417,13 @@ public class XpDropPlugin extends Plugin if (a instanceof Player) { - return damageDealt; + damage = (int) Math.rint(damageDealt); + tickShow = 3; + return; } NPC target = (NPC) a; - return damageDealt / npcManager.getXpModifier(target.getId()); + damage = (int) Math.rint(damageDealt / npcManager.getXpModifier(target.getId())); + tickShow = 3; } } diff --git a/runelite-client/src/main/scripts/XpDropChanged.hash b/runelite-client/src/main/scripts/XpDropChanged.hash new file mode 100644 index 0000000000..052dc1acf7 --- /dev/null +++ b/runelite-client/src/main/scripts/XpDropChanged.hash @@ -0,0 +1 @@ +AAA12D64549A1E4573B242AD9D53D8B1A436B947CF55BACBA660812411750E20 \ No newline at end of file diff --git a/runelite-client/src/main/scripts/XpDropChanged.rs2asm b/runelite-client/src/main/scripts/XpDropChanged.rs2asm new file mode 100644 index 0000000000..20574779cf --- /dev/null +++ b/runelite-client/src/main/scripts/XpDropChanged.rs2asm @@ -0,0 +1,905 @@ +.id 1004 +.int_stack_count 34 +.string_stack_count 0 +.int_var_count 48 +.string_var_count 1 + iload 0 + iconst 1 + if_icmpeq LABEL4 + jump LABEL9 +LABEL4: + get_varc_int 207 + iconst -1 + if_icmpeq LABEL8 + jump LABEL9 +LABEL8: + return +LABEL9: + iconst 23 + iconst 1 + add + istore 34 + iload 34 + define_array 83 + iload 34 + define_array 65641 + iconst 0 + istore 35 + iconst 0 + istore 36 + iload 0 + iconst 1 + if_icmpeq LABEL25 + jump LABEL71 +LABEL25: + get_varc_int 207 + iconst -1 + if_icmpne LABEL29 + jump LABEL70 +LABEL29: + iload 35 + iconst 105 + iconst 83 + iconst 681 + get_varc_int 207 + coordx + enum + set_array_int + iload 35 + get_varc_int 207 + coordy + set_array_int 1 + iload 35 + get_array_int + iconst -1 + if_icmpne LABEL46 + jump LABEL55 +LABEL46: + iload 35 + get_array_int 1 + iconst 0 + if_icmpgt LABEL51 + jump LABEL55 +LABEL51: + iload 35 + iconst 1 + add + istore 35 +LABEL55: + get_varc_int 208 + get_varc_int 209 + get_varc_int 210 + get_varc_int 211 + get_varc_int 212 + get_varc_int 213 + iconst -1 + set_varc_int 213 + set_varc_int 212 + set_varc_int 211 + set_varc_int 210 + set_varc_int 209 + set_varc_int 208 + set_varc_int 207 + jump LABEL25 +LABEL70: + jump LABEL508 +LABEL71: + iconst 10 + stat_xp + iload 25 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL80 + jump LABEL90 +LABEL80: + iload 35 + iconst 10 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL90: + iconst 0 + stat_xp + iload 11 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL99 + jump LABEL109 +LABEL99: + iload 35 + iconst 0 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL109: + iconst 2 + stat_xp + iload 12 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL118 + jump LABEL128 +LABEL118: + iload 35 + iconst 2 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL128: + iconst 4 + stat_xp + iload 13 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL137 + jump LABEL147 +LABEL137: + iload 35 + iconst 4 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL147: + iconst 6 + stat_xp + iload 14 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL156 + jump LABEL166 +LABEL156: + iload 35 + iconst 6 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL166: + iconst 1 + stat_xp + iload 15 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL175 + jump LABEL185 +LABEL175: + iload 35 + iconst 1 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL185: + iconst 3 + stat_xp + iload 16 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt HP_XP_GAINED + jump LABEL204 +HP_XP_GAINED: + iload 35 + iconst 3 + set_array_int + iload 35 + iload 36 + sconst "hpXpGained" + runelite_callback + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL204: + iconst 5 + stat_xp + iload 17 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL213 + jump LABEL223 +LABEL213: + iload 35 + iconst 5 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL223: + iconst 16 + stat_xp + iload 18 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL232 + jump LABEL242 +LABEL232: + iload 35 + iconst 16 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL242: + iconst 15 + stat_xp + iload 19 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL251 + jump LABEL261 +LABEL251: + iload 35 + iconst 15 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL261: + iconst 17 + stat_xp + iload 20 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL270 + jump LABEL280 +LABEL270: + iload 35 + iconst 17 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL280: + iconst 12 + stat_xp + iload 21 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL289 + jump LABEL299 +LABEL289: + iload 35 + iconst 12 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL299: + iconst 20 + stat_xp + iload 22 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL308 + jump LABEL318 +LABEL308: + iload 35 + iconst 20 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL318: + iconst 14 + stat_xp + iload 23 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL327 + jump LABEL337 +LABEL327: + iload 35 + iconst 14 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL337: + iconst 13 + stat_xp + iload 24 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL346 + jump LABEL356 +LABEL346: + iload 35 + iconst 13 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL356: + iconst 7 + stat_xp + iload 26 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL365 + jump LABEL375 +LABEL365: + iload 35 + iconst 7 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL375: + iconst 11 + stat_xp + iload 27 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL384 + jump LABEL394 +LABEL384: + iload 35 + iconst 11 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL394: + iconst 8 + stat_xp + iload 28 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL403 + jump LABEL413 +LABEL403: + iload 35 + iconst 8 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL413: + iconst 9 + stat_xp + iload 29 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL422 + jump LABEL432 +LABEL422: + iload 35 + iconst 9 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL432: + iconst 18 + stat_xp + iload 30 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL441 + jump LABEL451 +LABEL441: + iload 35 + iconst 18 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL451: + iconst 19 + stat_xp + iload 31 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL460 + jump LABEL470 +LABEL460: + iload 35 + iconst 19 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL470: + iconst 22 + stat_xp + iload 32 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL479 + jump LABEL489 +LABEL479: + iload 35 + iconst 22 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL489: + iconst 21 + stat_xp + iload 33 + sub + istore 36 + iload 36 + iconst 0 + if_icmpgt LABEL498 + jump LABEL508 +LABEL498: + iload 35 + iconst 21 + set_array_int + iload 35 + iload 36 + set_array_int 1 + iload 35 + iconst 1 + add + istore 35 +LABEL508: + iconst 0 + istore 37 + iconst 0 + istore 38 + iconst 494 + istore 39 + iconst 494 + istore 40 + iconst 16 + istore 41 + iconst 0 + istore 42 + iconst 0 + istore 43 + iconst 0 + istore 44 + iconst 0 + istore 45 + iconst 0 + istore 46 + iconst -1 + istore 47 + sconst "" + sstore 0 + iload 35 + iconst 0 + if_icmpgt LABEL536 + jump LABEL779 +LABEL536: + iload 16 + iconst 0 + if_icmpgt LABEL540 + jump LABEL779 +LABEL540: + clientclock + get_varc_int 76 + sub + iconst 10 + if_icmpgt LABEL546 + jump LABEL779 +LABEL546: + get_varbit 4693 + iconst 1 + if_icmpeq LABEL550 + jump LABEL561 +LABEL550: + invoke 1972 + iconst 0 + if_icmpeq LABEL554 + jump LABEL561 +LABEL554: + iconst 495 + iconst 495 + iconst 25 + istore 41 + istore 40 + istore 39 + jump LABEL575 +LABEL561: + get_varbit 4693 + iconst 2 + if_icmpeq LABEL565 + jump LABEL575 +LABEL565: + invoke 1972 + iconst 0 + if_icmpeq LABEL569 + jump LABEL575 +LABEL569: + iconst 496 + iconst 496 + iconst 25 + istore 41 + istore 40 + istore 39 +LABEL575: + iload 8 + if_getheight + istore 42 + iload 42 + iconst 100 + if_icmplt LABEL582 + jump LABEL584 +LABEL582: + iconst 100 + istore 42 +LABEL584: + iload 41 + iconst 105 + iconst 105 + iconst 1171 + get_varbit 4722 + enum + multiply + iload 42 + div + iconst 1 + add + istore 43 +LABEL596: + iload 37 + iload 35 + if_icmplt LABEL600 + jump LABEL774 +LABEL600: + iload 38 + iconst 0 + if_icmpeq LABEL604 + jump LABEL613 +LABEL604: + iload 0 + iconst 0 + if_icmpeq LABEL608 + jump LABEL613 +LABEL608: + iload 37 + get_array_int + set_varc_int 72 + iconst 1 + istore 38 +LABEL613: + get_varc_int 71 + iconst 0 + if_icmpgt LABEL617 + jump LABEL628 +LABEL617: + get_varc_int 71 + clientclock + iload 43 + sub + if_icmpgt LABEL623 + jump LABEL628 +LABEL623: + get_varc_int 71 + iload 43 + add + istore 44 + jump LABEL630 +LABEL628: + clientclock + istore 44 +LABEL630: + iload 44 + clientclock + iload 43 + iload 10 + multiply + add + if_icmplt LABEL638 + jump LABEL771 +LABEL638: + iconst 105 + iconst 73 + iconst 1163 + get_varc_int 70 + enum + istore 47 + iconst 0 + iload 47 + if_sethide + iload 37 + get_array_int 1 + istore 46 + iload 47 + iconst 5 + iconst 1 + cc_create + iconst 83 + iconst 100 + iconst 255 + iload 37 + get_array_int + enum + cc_setgraphic + iconst 0 + iconst 0 + iconst 0 + iconst 5 + cc_setposition + iconst 1 + cc_sethide + iconst 1 + istore 45 + iload 37 + iconst 1 + add + istore 37 +LABEL674: + get_varbit 4696 + iconst 1 + if_icmpeq LABEL678 + jump LABEL722 +LABEL678: + iload 37 + iload 35 + if_icmplt LABEL682 + jump LABEL722 +LABEL682: + iload 45 + iconst 5 + if_icmplt LABEL686 + jump LABEL722 +LABEL686: + iload 46 + iconst 1000000 + if_icmplt LABEL690 + jump LABEL722 +LABEL690: + iload 46 + iload 37 + get_array_int 1 + add + istore 46 + iload 45 + iconst 1 + add + istore 45 + iload 47 + iconst 5 + iload 45 + cc_create + iconst 83 + iconst 100 + iconst 255 + iload 37 + get_array_int + enum + cc_setgraphic + iconst 0 + iconst 0 + iconst 0 + iconst 5 + cc_setposition + iconst 1 + cc_sethide + iload 37 + iconst 1 + add + istore 37 + jump LABEL674 +LABEL722: + iload 46 + sconst "," + invoke 46 + sconst "xpDropAddDamage" + runelite_callback + sstore 0 + iload 0 + iconst 1 + if_icmpeq LABEL730 + jump LABEL735 +LABEL730: + sconst "" + sconst " " + sload 0 + join_string 3 + sstore 0 +LABEL735: + iload 47 + iconst 0 + cc_find + iconst 1 + if_icmpeq LABEL741 + jump LABEL756 +LABEL741: + sload 0 + cc_settext + iconst 0 + iconst 0 + iconst 0 + iconst 5 + cc_setposition + iconst 1 + cc_sethide + iload 47 + iload 41 + iload 39 + iload 40 + sload 0 + invoke 996 +LABEL756: + iconst 1005 + iload 47 + iload 44 + sconst "Ii" + iload 47 + if_setontimer + iload 44 + set_varc_int 71 + get_varc_int 70 + iconst 1 + add + iload 10 + mod + set_varc_int 70 + jump LABEL773 +LABEL771: + iload 35 + istore 37 +LABEL773: + jump LABEL596 +LABEL774: + iload 1 + iload 3 + iload 8 + iload 9 + invoke 997 +LABEL779: + iload 0 + iconst 0 + if_icmpeq LABEL783 + jump LABEL802 +LABEL783: + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + invoke 999 + iload 1 + iload 2 + iload 3 + iload 4 + iload 5 + iload 6 + iload 7 + iload 8 + iload 9 + iload 10 + invoke 1003 +LABEL802: + return