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 4e0fc24130..d43b82c562 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -36,6 +36,7 @@ import javax.annotation.Nullable; import net.runelite.api.annotations.VisibleForExternalPlugins; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.PlayerAppearanceChanged; import net.runelite.api.hooks.Callbacks; import net.runelite.api.hooks.DrawCallbacks; import net.runelite.api.vars.AccountType; @@ -2070,6 +2071,20 @@ public interface Client extends GameShell */ void setMirrored(boolean isMirrored); + /** + * True if the client is comparing player appearance hashes. + */ + boolean isComparingAppearance(); + + /** + * Setting this to true will allow the client to compare + * player appearance hashes and dispatch when one changes + * via the {@link PlayerAppearanceChanged} event. + *
+ * WARNING - THIS METHOD IS CPU-INTENSE. + */ + void setComparingAppearance(boolean comparingAppearance); + /** * Sets the image to be used for the login screen, provided as SpritePixels * If the image is larger than half the width of fixed mode, 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 ccd80a811c..2991c48d18 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -54,7 +54,14 @@ import net.runelite.api.InventoryID; import net.runelite.api.ItemDefinition; import net.runelite.api.MenuEntry; import net.runelite.api.MenuOpcode; -import static net.runelite.api.MenuOpcode.*; +import static net.runelite.api.MenuOpcode.PLAYER_EIGTH_OPTION; +import static net.runelite.api.MenuOpcode.PLAYER_FIFTH_OPTION; +import static net.runelite.api.MenuOpcode.PLAYER_FIRST_OPTION; +import static net.runelite.api.MenuOpcode.PLAYER_FOURTH_OPTION; +import static net.runelite.api.MenuOpcode.PLAYER_SECOND_OPTION; +import static net.runelite.api.MenuOpcode.PLAYER_SEVENTH_OPTION; +import static net.runelite.api.MenuOpcode.PLAYER_SIXTH_OPTION; +import static net.runelite.api.MenuOpcode.PLAYER_THIRD_OPTION; import net.runelite.api.MessageNode; import net.runelite.api.NPC; import net.runelite.api.NPCDefinition; @@ -230,6 +237,9 @@ public abstract class RSClientMixin implements RSClient @Inject private boolean isMirrored = false; + @Inject + private boolean comparingAppearance = false; + @Inject @Override public void setPrintMenuActions(boolean yes) @@ -1912,6 +1922,20 @@ public abstract class RSClientMixin implements RSClient this.isMirrored = isMirrored; } + @Inject + @Override + public boolean isComparingAppearance() + { + return comparingAppearance; + } + + @Inject + @Override + public void setComparingAppearance(boolean comparingAppearance) + { + this.comparingAppearance = comparingAppearance; + } + @Inject @Override public ObjectDefinition getObjectDefinition(int objectId) 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 6dc79d58b1..2c159ba584 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSPlayerMixin.java @@ -297,7 +297,7 @@ public abstract class RSPlayerMixin implements RSPlayer this.copy$read(buffer); - if (getPlayerAppearance().getHash() != appearanceHash) + if (client.isComparingAppearance() && getPlayerAppearance().getHash() != appearanceHash) { client.getCallbacks().post(PlayerAppearanceChanged.class, new PlayerAppearanceChanged(this)); }