diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index f9a50d178e..a80419d931 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -24,27 +24,28 @@ */ package net.runelite.client.callback; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ProjectileMoved; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.SetMessage; import com.google.common.eventbus.EventBus; import com.google.inject.Injector; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import lombok.extern.slf4j.Slf4j; -import net.runelite.api.Actor; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; -import net.runelite.api.GameObject; import net.runelite.api.MainBufferProvider; import net.runelite.api.MenuAction; import net.runelite.api.MessageNode; import net.runelite.api.PacketBuffer; import net.runelite.api.Point; import net.runelite.api.Projectile; -import net.runelite.api.Skill; -import net.runelite.api.Tile; import net.runelite.client.RuneLite; import net.runelite.client.chat.ChatMessageManager; -import net.runelite.client.events.*; import net.runelite.client.game.DeathChecker; import net.runelite.client.task.Scheduler; import net.runelite.client.ui.overlay.OverlayRenderer; @@ -57,7 +58,7 @@ public class Hooks private static final Injector injector = RuneLite.getInjector(); private static final Client client = injector.getInstance(Client.class); - private static final EventBus eventBus = injector.getInstance(EventBus.class); + public static final EventBus eventBus = injector.getInstance(EventBus.class); private static final Scheduler scheduler = injector.getInstance(Scheduler.class); private static final InfoBoxManager infoBoxManager = injector.getInstance(InfoBoxManager.class); private static final ChatMessageManager chatMessageManager = injector.getInstance(ChatMessageManager.class); @@ -111,109 +112,6 @@ public class Hooks } } - /** - * - * @param name Hook-name that was used in the @Hook-annotation. - * @param idx The index if hooked to an array. -1 if not hooked to an - * array. - * @param object The object where the hook was placed in, NOT the - * variable that was hooked to. - */ - public static void callHook(String name, int idx, Object object) - { - switch (name) - { - case "experienceChanged": - { - ExperienceChanged experienceChanged = new ExperienceChanged(); - Skill[] possibleSkills = Skill.values(); - - // We subtract one here because 'Overall' isn't considered a skill that's updated. - if (idx < possibleSkills.length - 1) - { - Skill updatedSkill = possibleSkills[idx]; - experienceChanged.setSkill(updatedSkill); - eventBus.post(experienceChanged); - } - break; - } - case "mapRegionsChanged": - { - MapRegionChanged regionChanged = new MapRegionChanged(); - regionChanged.setIndex(idx); - eventBus.post(regionChanged); - break; - } - case "playerMenuOptionsChanged": - { - PlayerMenuOptionsChanged optionsChanged = new PlayerMenuOptionsChanged(); - optionsChanged.setIndex(idx); - eventBus.post(optionsChanged); - break; - } - case "animationChanged": - { - Actor actor = (Actor) object; - AnimationChanged animationChange = new AnimationChanged(); - animationChange.setActor(actor); - eventBus.post(animationChange); - break; - } - case "gameStateChanged": - { - GameStateChanged gameStateChange = new GameStateChanged(); - gameStateChange.setGameState(client.getGameState()); - eventBus.post(gameStateChange); - break; - } - case "varbitChanged": - { - VarbitChanged varbitChanged = new VarbitChanged(); - eventBus.post(varbitChanged); - break; - } - case "clanMembersChanged": - { - ClanMembersChanged clanMembersChanged = new ClanMembersChanged(); - eventBus.post(clanMembersChanged); - break; - } - case "resizeChanged": - { - //maybe couple with varbitChanged. resizeable may not be a varbit but it would fit with the other client settings. - ResizeableChanged resizeableChanged = new ResizeableChanged(); - resizeableChanged.setResized(client.isResized()); - eventBus.post(resizeableChanged); - break; - } - case "gameObjectsChanged": - if (idx != -1) // this happens from the field assignment - { - // GameObject that was changed. - GameObject go = ((Tile) object).getGameObjects()[idx]; - if (go != null) - { - GameObjectsChanged gameObjectsChanged = new GameObjectsChanged(); - gameObjectsChanged.setGameObject(go); - eventBus.post(gameObjectsChanged); - } - } - break; - default: - log.warn("Unknown event {} triggered on {}", name, object); - return; - } - - if (object != null) - { - log.trace("Event {} (idx {}) triggered on {}", name, idx, object); - } - else - { - log.trace("Event {} (idx {}) triggered", name, idx); - } - } - public static void menuActionHook(int actionParam, int widgetId, int menuAction, int id, String menuOption, String menuTarget, int var6, int var7) { /* Along the way, the RuneScape client may change a menuAction by incrementing it with 2000. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java index 2b00345015..8658dc212b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/reportbutton/ReportButtonPlugin.java @@ -37,10 +37,10 @@ import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.api.events.GameStateChanged; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.config.ConfigManager; -import net.runelite.client.events.GameStateChanged; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java index 51c692375d..b4d8b4364b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java @@ -43,6 +43,7 @@ import net.runelite.api.ItemID; import net.runelite.client.config.ConfigManager; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.MenuOptionClicked; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; diff --git a/runelite-mixins/pom.xml b/runelite-mixins/pom.xml index 593b83510d..b7a86647f5 100644 --- a/runelite-mixins/pom.xml +++ b/runelite-mixins/pom.xml @@ -41,6 +41,12 @@ net.runelite.rs api ${project.version} + provided + + + com.google.guava + guava + provided diff --git a/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java new file mode 100644 index 0000000000..77efdc2703 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018, Adam + * 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.api.mixins; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.FIELD}) +@Documented +public @interface FieldHook +{ + String value(); +} diff --git a/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java new file mode 100644 index 0000000000..e0e0c51ae8 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018, Adam + * 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.callback; + +import com.google.common.eventbus.EventBus; + +/** + * Dummy class to make the mixins to compile. + * + * @author Adam + */ +public class Hooks +{ + public static EventBus eventBus; +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java index 698476fc48..3637b2a769 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java @@ -34,9 +34,12 @@ import static net.runelite.api.Perspective.LOCAL_COORD_BITS; import net.runelite.api.Player; import net.runelite.api.Point; import net.runelite.api.SpritePixels; +import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; +import net.runelite.api.events.AnimationChanged; +import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSActor; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSCombatInfo1; @@ -173,4 +176,13 @@ public abstract class RSActorMixin implements RSActor { return Perspective.worldToMiniMap(client, getX(), getY()); } + + @FieldHook("animation") + @Inject + public void animationChanged(int idx) + { + AnimationChanged animationChange = new AnimationChanged(); + animationChange.setActor(this); + eventBus.post(animationChange); + } } 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 70cade0279..94fd5bf693 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -37,10 +37,20 @@ import net.runelite.api.Point; import net.runelite.api.Prayer; import net.runelite.api.Skill; import net.runelite.api.Varbits; +import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.events.ClanMembersChanged; +import net.runelite.api.events.ExperienceChanged; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.MapRegionChanged; +import net.runelite.api.events.PlayerMenuOptionsChanged; +import net.runelite.api.events.ResizeableChanged; +import net.runelite.api.events.VarbitChanged; +import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSWidget; @@ -48,6 +58,9 @@ import net.runelite.rs.api.RSWidget; @Mixin(RSClient.class) public abstract class RSClientMixin implements RSClient { + @Shadow("clientInstance") + private static RSClient client; + @Inject @Override public List getPlayers() @@ -324,4 +337,73 @@ public abstract class RSClientMixin implements RSClient { setRSModIcons((RSIndexedSprite[]) modIcons); } + + @FieldHook("skillExperiences") + @Inject + public static void experiencedChanged(int idx) + { + ExperienceChanged experienceChanged = new ExperienceChanged(); + Skill[] possibleSkills = Skill.values(); + + // We subtract one here because 'Overall' isn't considered a skill that's updated. + if (idx < possibleSkills.length - 1) + { + Skill updatedSkill = possibleSkills[idx]; + experienceChanged.setSkill(updatedSkill); + eventBus.post(experienceChanged); + } + } + + @FieldHook("mapRegions") + @Inject + public static void mapRegionsChanged(int idx) + { + MapRegionChanged regionChanged = new MapRegionChanged(); + regionChanged.setIndex(idx); + eventBus.post(regionChanged); + } + + @FieldHook("playerOptions") + @Inject + public static void playerOptionsChanged(int idx) + { + PlayerMenuOptionsChanged optionsChanged = new PlayerMenuOptionsChanged(); + optionsChanged.setIndex(idx); + eventBus.post(optionsChanged); + } + + @FieldHook("gameState") + @Inject + public static void gameStateChanged(int idx) + { + GameStateChanged gameStateChange = new GameStateChanged(); + gameStateChange.setGameState(client.getGameState()); + eventBus.post(gameStateChange); + } + + @FieldHook("settings") + @Inject + public static void settingsChanged(int idx) + { + VarbitChanged varbitChanged = new VarbitChanged(); + eventBus.post(varbitChanged); + } + + @FieldHook("clanMembers") + @Inject + public static void clanMembersChanged(int idx) + { + ClanMembersChanged clanMembersChanged = new ClanMembersChanged(); + eventBus.post(clanMembersChanged); + } + + @FieldHook("isResized") + @Inject + public static void resizeChanged(int idx) + { + //maybe couple with varbitChanged. resizeable may not be a varbit but it would fit with the other client settings. + ResizeableChanged resizeableChanged = new ResizeableChanged(); + resizeableChanged.setResized(client.isResized()); + eventBus.post(resizeableChanged); + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java index df1a529667..cd6b221e71 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java @@ -24,11 +24,15 @@ */ package net.runelite.mixins; +import net.runelite.api.GameObject; import net.runelite.api.Perspective; import net.runelite.api.Point; +import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; +import net.runelite.api.events.GameObjectsChanged; +import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSTile; @@ -60,4 +64,21 @@ public abstract class RSTileMixin implements RSTile Point regionLocation = getRegionLocation(); return Perspective.regionToLocal(client, regionLocation); } + + @FieldHook("objects") + @Inject + public void animationChanged(int idx) + { + if (idx != -1) // this happens from the field assignment + { + // GameObject that was changed. + GameObject go = getGameObjects()[idx]; + if (go != null) + { + GameObjectsChanged gameObjectsChanged = new GameObjectsChanged(); + gameObjectsChanged.setGameObject(go); + eventBus.post(gameObjectsChanged); + } + } + } } diff --git a/runescape-api/src/main/java/net/runelite/mapping/Hook.java b/runescape-api/src/main/java/net/runelite/mapping/Hook.java index 0fc8105b82..6fa13fb8d5 100644 --- a/runescape-api/src/main/java/net/runelite/mapping/Hook.java +++ b/runescape-api/src/main/java/net/runelite/mapping/Hook.java @@ -24,6 +24,7 @@ */ package net.runelite.mapping; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -32,8 +33,9 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target( { - ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR + ElementType.METHOD, ElementType.CONSTRUCTOR }) +@Documented public @interface Hook { String value();