diff --git a/runelite-api/src/main/java/net/runelite/api/events/player/headicon/OverheadPrayerChanged.java b/runelite-api/src/main/java/net/runelite/api/events/player/headicon/OverheadPrayerChanged.java new file mode 100644 index 0000000000..687a17f6dd --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/player/headicon/OverheadPrayerChanged.java @@ -0,0 +1,17 @@ +package net.runelite.api.events.player.headicon; + +import lombok.Data; +import net.runelite.api.HeadIcon; +import net.runelite.api.Player; +import net.runelite.api.events.Event; + +@Data +public class OverheadPrayerChanged implements Event +{ + private final Player player; + + private final HeadIcon oldHeadIcon; + + private final HeadIcon newHeadIcon; + +} diff --git a/runelite-api/src/main/java/net/runelite/api/events/player/headicon/PlayerSkullChanged.java b/runelite-api/src/main/java/net/runelite/api/events/player/headicon/PlayerSkullChanged.java new file mode 100644 index 0000000000..b66c558888 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/player/headicon/PlayerSkullChanged.java @@ -0,0 +1,17 @@ +package net.runelite.api.events.player.headicon; + +import lombok.Data; +import net.runelite.api.Player; +import net.runelite.api.SkullIcon; +import net.runelite.api.events.Event; + +@Data +public class PlayerSkullChanged implements Event +{ + private final Player player; + + private final SkullIcon oldSkullIcon; + + private final SkullIcon newSkullIcon; + +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java index d36d369e89..772c15e81b 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -46,7 +46,10 @@ import static net.runelite.api.SkullIcon.SKULL; import static net.runelite.api.SkullIcon.SKULL_FIGHT_PIT; import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.PlayerAppearanceChanged; +import net.runelite.api.events.player.headicon.OverheadPrayerChanged; +import net.runelite.api.events.player.headicon.PlayerSkullChanged; import net.runelite.api.mixins.Copy; +import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; @@ -67,6 +70,12 @@ public abstract class RSPlayerMixin implements RSPlayer @Inject private boolean friended; + @Inject + private int oldHeadIcon = -1; + + @Inject + private int oldSkullIcon = -1; + @Inject @Override public String getName() @@ -88,11 +97,53 @@ public abstract class RSPlayerMixin implements RSPlayer return name.replace('\u00A0', ' '); } + @Inject + @FieldHook("headIconPrayer") + public void prayerChanged(int idx) + { + if (!(getRsOverheadIcon() == -1 && oldHeadIcon == -1)) + { + final HeadIcon headIcon = getHeadIcon(getRsOverheadIcon()); + if (getRsOverheadIcon() != oldHeadIcon) + { + client.getCallbacks().post(OverheadPrayerChanged.class, + new OverheadPrayerChanged(this, getHeadIcon(oldHeadIcon), headIcon)); + } + } + oldHeadIcon = getRsOverheadIcon(); + } + @Inject @Override public HeadIcon getOverheadIcon() { - switch (getRsOverheadIcon()) + return getHeadIcon(getRsOverheadIcon()); + } + + @Inject + @FieldHook("headIconPk") + public void skullChanged(int idx) + { + final SkullIcon skullIcon = skullFromInt(getRsSkullIcon()); + if (getRsSkullIcon() != oldSkullIcon) + { + client.getCallbacks().post(PlayerSkullChanged.class, + new PlayerSkullChanged(this, skullFromInt(getRsSkullIcon()), skullIcon)); + } + oldSkullIcon = getRsSkullIcon(); + } + + @Inject + @Override + public SkullIcon getSkullIcon() + { + return skullFromInt(getRsSkullIcon()); + } + + @Inject + private HeadIcon getHeadIcon(int overheadIcon) + { + switch (overheadIcon) { case 0: return MELEE; @@ -112,10 +163,9 @@ public abstract class RSPlayerMixin implements RSPlayer } @Inject - @Override - public SkullIcon getSkullIcon() + private SkullIcon skullFromInt(int skull) { - switch (getRsSkullIcon()) + switch (skull) { case 0: return SKULL;