diff --git a/runelite-api/src/main/java/net/runelite/api/EnumID.java b/runelite-api/src/main/java/net/runelite/api/EnumID.java
index 0b2d477a84..7d836dc613 100644
--- a/runelite-api/src/main/java/net/runelite/api/EnumID.java
+++ b/runelite-api/src/main/java/net/runelite/api/EnumID.java
@@ -33,4 +33,5 @@ public final class EnumID
{
public static final int MUSIC_TRACK_NAMES = 812;
public static final int MUSIC_TRACK_IDS = 819;
+ public static final int XPDROP_COLORS = 1169;
}
diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
index 039d2c0f48..af79f87a2f 100644
--- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java
+++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java
@@ -275,4 +275,13 @@ public final class ScriptID
*/
@ScriptArguments(integer = 2)
public static final int TOPLEVEL_REDRAW = 907;
+
+ /**
+ * Called to set position of an xpdrop text and sprite(s)
+ *
+ * - XP drop parent component
+ *
+ */
+ @ScriptArguments(integer = 4, string = 1)
+ public static final int XPDROPS_SETDROPSIZE = 996;
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/DefaultColors.java b/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/DefaultColors.java
deleted file mode 100644
index 227d82b3ee..0000000000
--- a/runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/DefaultColors.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2018, Cameron
- * 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.experiencedrop;
-
-import java.awt.Color;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-@AllArgsConstructor
-enum DefaultColors
-{
- WHITE(new Color(0xFF, 0xFF, 0xFF)),
- LILAC(new Color(0xC8, 0xC8, 0xFF)),
- CYAN(new Color(0x00, 0xFF, 0xFF)),
- JADE(new Color(0xC8, 0xFF, 0xC8)),
- LIME(new Color(0x64, 0xFF, 0x64)),
- YELLOW(new Color(0xFF, 0xFF, 0x40)),
- ORANGE(new Color(0xFF, 0x98, 0x1F)),
- PINK(new Color(0xFF, 0xC8, 0xC8));
-
- @Getter
- private final Color color;
-}
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 3a62513b8a..ffbd13a067 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
@@ -31,16 +31,19 @@ import java.util.Map;
import java.util.stream.IntStream;
import javax.inject.Inject;
import net.runelite.api.Client;
+import net.runelite.api.EnumComposition;
+import net.runelite.api.EnumID;
+import static net.runelite.api.ScriptID.XPDROPS_SETDROPSIZE;
import static net.runelite.api.ScriptID.XPDROP_DISABLED;
import net.runelite.api.Skill;
import net.runelite.api.SpriteID;
import net.runelite.api.Varbits;
import net.runelite.api.events.GameTick;
+import net.runelite.api.events.ScriptPreFired;
import net.runelite.api.events.StatChanged;
-import net.runelite.api.events.WidgetHiddenChanged;
import net.runelite.api.widgets.Widget;
-import net.runelite.api.widgets.WidgetID;
-import net.runelite.api.widgets.WidgetInfo;
+import static net.runelite.api.widgets.WidgetInfo.TO_CHILD;
+import static net.runelite.api.widgets.WidgetInfo.TO_GROUP;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.plugins.Plugin;
@@ -49,12 +52,10 @@ import net.runelite.client.plugins.PluginDescriptor;
@PluginDescriptor(
name = "XP Drop",
description = "Enable customization of the way XP drops are displayed",
- tags = {"experience", "levels", "tick", "prayer"}
+ tags = {"experience", "levels", "tick", "prayer", "xpdrop"}
)
public class XpDropPlugin extends Plugin
{
- private static final int XPDROP_PADDING = 2; // space between xp drop icons
-
@Inject
private Client client;
@@ -76,116 +77,81 @@ public class XpDropPlugin extends Plugin
}
@Subscribe
- public void onWidgetHiddenChanged(WidgetHiddenChanged event)
+ public void onScriptPreFired(ScriptPreFired scriptPreFired)
{
- Widget widget = event.getWidget();
-
- int group = WidgetInfo.TO_GROUP(widget.getId());
-
- if (group != WidgetID.EXPERIENCE_DROP_GROUP_ID)
+ if (scriptPreFired.getScriptId() == XPDROPS_SETDROPSIZE)
{
- return;
+ final int[] intStack = client.getIntStack();
+ final int intStackSize = client.getIntStackSize();
+ // This runs prior to the proc being invoked, so the arguments are still on the stack.
+ // Grab the first argument to the script.
+ final int widgetId = intStack[intStackSize - 4];
+ processXpDrop(widgetId);
}
+ }
- if (widget.isHidden())
- {
- return;
- }
+ private void processXpDrop(int widgetId)
+ {
+ final Widget xpdrop = client.getWidget(TO_GROUP(widgetId), TO_CHILD(widgetId));
+ final Widget[] children = xpdrop.getDynamicChildren();
+ // child 0 is the xpdrop text, everything else are sprite ids for skills
+ final Widget text = children[0];
if (config.hideSkillIcons())
{
- if (widget.getSpriteId() > 0)
- {
- widget.setHidden(true);
- return;
- }
- else if (!widget.getText().isEmpty())
- {
- // Align text accordingly to take up hidden skill icon space
- int width = 0;
- for (Widget w : widget.getParent().getDynamicChildren())
- {
- if (w.getSpriteId() != -1)
- {
- if (width > 0)
- {
- // Add in space between sprites
- width += XPDROP_PADDING;
- }
- width += w.getWidth(); // width of sprite
- }
- }
-
- final int xpDropPosition = client.getVar(Varbits.EXPERIENCE_TRACKER_POSITION);
- switch (xpDropPosition)
- {
- case 2: // left
- int cur = widget.getRelativeX();
- cur -= width;
- widget.setRelativeX(cur);
- break;
- case 0: // right
- break;
- case 1: // center
- cur = widget.getRelativeX();
- cur -= width / 2;
- widget.setRelativeX(cur);
- break;
- }
- }
+ // keep only text
+ xpdrop.setChildren(Arrays.copyOf(children, 1));
}
PrayerType prayer = currentTickPrayer;
if (prayer == null)
{
- resetTextColor(widget);
+ resetTextColor(text);
return;
}
- String text = widget.getText();
final IntStream spriteIDs =
- Arrays.stream(widget.getParent().getDynamicChildren()).mapToInt(Widget::getSpriteId);
+ Arrays.stream(children)
+ .skip(1) // skip text
+ .mapToInt(Widget::getSpriteId);
- if (text != null)
+ int color = text.getTextColor();
+
+ switch (prayer)
{
- int color = widget.getTextColor();
-
- switch (prayer)
- {
- case MELEE:
- if (spriteIDs.anyMatch(id ->
- id == SpriteID.SKILL_ATTACK || id == SpriteID.SKILL_STRENGTH || id == SpriteID.SKILL_DEFENCE
- || correctPrayer))
- {
- color = config.getMeleePrayerColor().getRGB();
- correctPrayer = true;
- }
- break;
- case RANGE:
- if (spriteIDs.anyMatch(id -> id == SpriteID.SKILL_RANGED || correctPrayer))
- {
- color = config.getRangePrayerColor().getRGB();
- correctPrayer = true;
- }
- break;
- case MAGIC:
- if (spriteIDs.anyMatch(id -> id == SpriteID.SKILL_MAGIC || correctPrayer))
- {
- color = config.getMagePrayerColor().getRGB();
- correctPrayer = true;
- }
- break;
- }
-
- widget.setTextColor(color);
+ case MELEE:
+ if (correctPrayer || spriteIDs.anyMatch(id ->
+ id == SpriteID.SKILL_ATTACK || id == SpriteID.SKILL_STRENGTH || id == SpriteID.SKILL_DEFENCE))
+ {
+ color = config.getMeleePrayerColor().getRGB();
+ correctPrayer = true;
+ }
+ break;
+ case RANGE:
+ if (correctPrayer || spriteIDs.anyMatch(id -> id == SpriteID.SKILL_RANGED))
+ {
+ color = config.getRangePrayerColor().getRGB();
+ correctPrayer = true;
+ }
+ break;
+ case MAGIC:
+ if (correctPrayer || spriteIDs.anyMatch(id -> id == SpriteID.SKILL_MAGIC))
+ {
+ color = config.getMagePrayerColor().getRGB();
+ correctPrayer = true;
+ }
+ break;
}
+
+ text.setTextColor(color);
}
private void resetTextColor(Widget widget)
{
- int defaultColorIdx = client.getVar(Varbits.EXPERIENCE_DROP_COLOR);
- int defaultColor = DefaultColors.values()[defaultColorIdx].getColor().getRGB();
- widget.setTextColor(defaultColor);
+ EnumComposition colorEnum = client.getEnum(EnumID.XPDROP_COLORS);
+ int defaultColorId = client.getVar(Varbits.EXPERIENCE_DROP_COLOR);
+ int color = colorEnum.getIntValue(defaultColorId);
+ widget.setTextColor(color);
}
private PrayerType getActivePrayerType()