From 74eb59388ebed1b9bed6def8a2c2382c00b720f6 Mon Sep 17 00:00:00 2001 From: TheRealNull Date: Mon, 4 Jan 2021 03:04:29 -0500 Subject: [PATCH 1/2] project: music plugin bs staging --- .../main/java/net/runelite/api/Client.java | 4 + .../java/net/runelite/api/ParamHolder.java | 57 ++ .../main/java/net/runelite/api/ParamID.java | 48 + .../main/java/net/runelite/api/SpriteID.java | 4 + .../net/runelite/api/StructComposition.java | 38 + .../main/java/net/runelite/api/StructID.java | 37 + .../main/java/net/runelite/api/Varbits.java | 7 + .../api/events/PostStructComposition.java | 41 + .../java/net/runelite/api/widgets/Widget.java | 32 + .../net/runelite/api/widgets/WidgetInfo.java | 6 + .../client/plugins/music/MusicConfig.java | 158 +++ .../client/plugins/music/MusicPlugin.java | 927 ++++++++++++++++++ 12 files changed, 1359 insertions(+) create mode 100644 runelite-api/src/main/java/net/runelite/api/ParamHolder.java create mode 100644 runelite-api/src/main/java/net/runelite/api/ParamID.java create mode 100644 runelite-api/src/main/java/net/runelite/api/StructComposition.java create mode 100644 runelite-api/src/main/java/net/runelite/api/StructID.java create mode 100644 runelite-api/src/main/java/net/runelite/api/events/PostStructComposition.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java 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 bbfd3731b9..a0cd2c1f21 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -2075,4 +2075,8 @@ public interface Client extends GameShell ScriptEvent createScriptEvent(Object[] args); int getViewportColor(); + + NodeCache getStructCompositionCache(); + + void setMusicVolume(int i); } diff --git a/runelite-api/src/main/java/net/runelite/api/ParamHolder.java b/runelite-api/src/main/java/net/runelite/api/ParamHolder.java new file mode 100644 index 0000000000..9ccc1328bf --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/ParamHolder.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Abex + * 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; + +/** + * A composition that can hold `param` keys. This lets Jagex attach arbitrary constant + * data to certain items, objects, npcs, or structs for use in cs2 + * + * @see ParamID + */ +public interface ParamHolder +{ + IterableHashTable getParams(); + void setParams(IterableHashTable params); + + /** + * Gets the value of a given {@link ParamID}, or its default if it is unset + */ + int getIntValue(int paramID); + + /** + * Sets the value of a given {@link ParamID} + */ + void setValue(int paramID, int value); + + /** + * Gets the value of a given {@link ParamID}, or its default if it is unset + */ + String getStringValue(int paramID); + + /** + * Sets the value of a given {@link ParamID} + */ + void setValue(int paramID, String value); +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/ParamID.java b/runelite-api/src/main/java/net/runelite/api/ParamID.java new file mode 100644 index 0000000000..3c2cae2109 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/ParamID.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Abex + * 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; + +/** + * @see ParamHolder + */ +public class ParamID +{ + /** + * @see SettingID + */ + public static final int SETTING_ID = 1077; + // defaults to 5 + // 1 is continuous + public static final int SETTING_SLIDER_STEPS = 1101; + public static final int SETTING_CUSTOM_TRANSMIT = 1085; + // defaults to true + // track is foreground + public static final int SETTING_FOREGROUND_CLICKZONE = 1105; + public static final int SETTING_SLIDER_CUSTOM_ONOP = 1106; + public static final int SETTING_SLIDER_CUSTOM_SETPOS = 1107; + public static final int SETTING_SLIDER_IS_DRAGGABLE = 1108; + public static final int SETTING_SLIDER_DEADZONE = 1109; + public static final int SETTING_SLIDER_DEADTIME = 1110; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java index bc9da1e230..67ccfc56ae 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpriteID.java +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -1596,4 +1596,8 @@ public final class SpriteID public static final int FRIENDS_CHAT_RANK_TRIPLE_CHEVRON_SERGEANT = 2831; public static final int FRIENDS_CHAT_RANK_DOUBLE_CHEVRON_CORPORAL = 2832; public static final int FRIENDS_CHAT_RANK_SINGLE_CHEVRON_RECRUIT = 2833; + + public static final int SETTINGS_SLIDER_HANDLE_BLUE = 2858; + public static final int SETTINGS_SLIDER_HANDLE_RED = 2859; + public static final int SETTINGS_SLIDER_HANDLE_GREEN = 2860; } diff --git a/runelite-api/src/main/java/net/runelite/api/StructComposition.java b/runelite-api/src/main/java/net/runelite/api/StructComposition.java new file mode 100644 index 0000000000..5edc073bd4 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/StructComposition.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Abex + * 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; + +/** + * A config type dedicated to holding params. + * + * Historically items were often used for this before structs were made + * available, and there are many of these still around. + * + * @see ParamHolder + */ +public interface StructComposition extends ParamHolder +{ + int getId(); +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/StructID.java b/runelite-api/src/main/java/net/runelite/api/StructID.java new file mode 100644 index 0000000000..d12d8ed0ec --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/StructID.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Abex + * 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; + +/** + * @see StructComposition + * @see Client#getStructComposition(int) + */ +public class StructID +{ + public static final int SETTINGS_MUSIC_VOLUME = 2753; + public static final int SETTINGS_EFFECT_VOLUME = 2754; + public static final int SETTINGS_AREA_VOLUME = 2755; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 213aea68a5..90128c71d6 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -784,6 +784,13 @@ public enum Varbits LEAGUE_RELIC_5(10053), LEAGUE_RELIC_6(11696), + /** + * Muted volume restore values + */ + MUTED_MUSIC_VOLUME(9666), + MUTED_SOUND_EFFECT_VOLUME(9674), + MUTED_AREA_EFFECT_VOLUME(9675), + /** * Whether the Special Attack orb is disabled due to being in a PvP area * diff --git a/runelite-api/src/main/java/net/runelite/api/events/PostStructComposition.java b/runelite-api/src/main/java/net/runelite/api/events/PostStructComposition.java new file mode 100644 index 0000000000..1d947572a6 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/PostStructComposition.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Abex + * 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.events; + +import lombok.Data; +import net.runelite.api.StructComposition; + +/** + * An event called after a new {@link StructComposition} is created and + * its data is initialized. + */ +@Data +public class PostStructComposition +{ + /** + * The newly created struct. + */ + private StructComposition structComposition; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index 8df03376da..f4bef64c7a 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -1026,4 +1026,36 @@ public interface Widget System.out.println("ERROR: IMPLEMENT"); //Would throw but that breaks widget inspector return false; } + + /** + * Sets a script to be ran when a drag operation is finished on this widget + * + * @param args A ScriptID, then the args for the script + */ + void setOnDragCompleteListener(Object ...args); + + /** + * Sets a script to be ran when this widget moves due to a drag + * + * @param args A ScriptID, then the args for the script + */ + void setOnDragListener(Object ...args); + + /** + * Container this can be dragged in + */ + Widget getDragParent(); + + /** + * Container this can be dragged in + */ + void setDragParent(Widget dragParent); + + /** + * Sets a script to be ran when a varplayer changes + * + * @param args A ScriptID, then the args for the script + */ + void setOnVarTransmitListener(Object ...args); +} } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 8f5161c777..fe9f449276 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -888,6 +888,12 @@ public enum WidgetInfo SEED_VAULT_ITEM_CONTAINER(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_CONTAINER), SEED_VAULT_ITEM_TEXT(WidgetID.SEED_VAULT_GROUP_ID, WidgetID.SeedVault.ITEM_TEXT), SEED_VAULT_INVENTORY_ITEMS_CONTAINER(WidgetID.SEED_VAULT_INVENTORY_GROUP_ID, WidgetID.SeedVault.INVENTORY_ITEM_CONTAINER), + + SETTINGS_SIDE_CAMERA_ZOOM_SLIDER_TRACK(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.CAMERA_ZOOM_SLIDER_TRACK), + SETTINGS_SIDE_MUSIC_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.MUSIC_SLIDER), + SETTINGS_SIDE_SOUND_EFFECT_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.SOUND_EFFECT_SLIDER), + SETTINGS_SIDE_AREA_SOUND_SLIDER(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.AREA_SOUND_SLIDER), + JEWELLERY_BOX_DUEL_RING(WidgetID.JEWELLERY_BOX_GROUP_ID, WidgetID.JewelBox.DUEL_RING), JEWELLERY_BOX_GAME_NECK(WidgetID.JEWELLERY_BOX_GROUP_ID, WidgetID.JewelBox.GAME_NECK), JEWELLERY_BOX_COMB_BRAC(WidgetID.JEWELLERY_BOX_GROUP_ID, WidgetID.JewelBox.COMB_BRAC), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java new file mode 100644 index 0000000000..67922bccbb --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2019, 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.plugins.music; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("music") +public interface MusicConfig extends Config +{ + String GRANULAR_SLIDERS = "granularSliders"; + + @ConfigItem( + keyName = "muteOwnAreaSounds", + name = "Mute player area sounds", + description = "Mute area sounds caused by yourself", + position = 0 + ) + default boolean muteOwnAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "muteOtherAreaSounds", + name = "Mute other players' area sounds", + description = "Mute area sounds caused by other players", + position = 1 + ) + default boolean muteOtherAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "muteOtherAreaNPCSounds", + name = "Mute NPCs' area sounds", + description = "Mute area sounds caused by NPCs", + position = 2 + ) + default boolean muteNpcAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "muteOtherAreaEnvironmentSounds", + name = "Mute environment area sounds", + description = "Mute area sounds caused by neither NPCs nor players", + position = 3 + ) + default boolean muteEnvironmentAreaSounds() + { + return false; + } + + @ConfigItem( + keyName = "mutePrayerSounds", + name = "Mute prayer sounds", + description = "Mute prayer activation and deactivation sounds", + position = 4 + ) + default boolean mutePrayerSounds() + { + return false; + } + + @ConfigItem( + keyName = GRANULAR_SLIDERS, + name = "Granular volume sliders", + description = "Make the volume sliders allow better control of volume", + position = 5 + ) + default boolean granularSliders() + { + return true; + } + + @ConfigItem( + keyName = "musicVolume", + name = "", + description = "", + hidden = true + ) + default int getMusicVolume() + { + return 0; + } + + @ConfigItem( + keyName = "musicVolume", + name = "", + description = "", + hidden = true + ) + void setMusicVolume(int vol); + + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true + ) + default int getSoundEffectVolume() + { + return 0; + } + + @ConfigItem( + keyName = "soundEffectVolume", + name = "", + description = "", + hidden = true + ) + void setSoundEffectVolume(int val); + + @ConfigItem( + keyName = "areaSoundEffectVolume", + name = "", + description = "", + hidden = true + ) + default int getAreaSoundEffectVolume() + { + return 0; + } + + @ConfigItem( + keyName = "areaSoundEffectVolume", + name = "", + description = "", + hidden = true + ) + void setAreaSoundEffectVolume(int vol); +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java new file mode 100644 index 0000000000..e20d59f37d --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -0,0 +1,927 @@ +/* + * Copyright (c) 2019, Anthony Chen + * Copyright (c) 2019, Adam + * Copyright (c) 2020, Sean Dewar + * 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.music; + +import com.google.common.collect.ImmutableSet; +import com.google.common.primitives.Ints; +import com.google.inject.Provides; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; +import java.util.stream.Collectors; +import javax.inject.Inject; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.NPC; +import net.runelite.api.ParamID; +import net.runelite.api.Player; +import net.runelite.api.Preferences; +import net.runelite.api.ScriptEvent; +import net.runelite.api.ScriptID; +import net.runelite.api.SettingID; +import net.runelite.api.SoundEffectID; +import net.runelite.api.SpriteID; +import net.runelite.api.StructComposition; +import net.runelite.api.StructID; +import net.runelite.api.VarClientInt; +import net.runelite.api.VarPlayer; +import net.runelite.api.Varbits; +import net.runelite.api.events.AreaSoundEffectPlayed; +import net.runelite.api.events.BeforeRender; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.PostStructComposition; +import net.runelite.api.events.ScriptPreFired; +import net.runelite.api.events.SoundEffectPlayed; +import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.VolumeChanged; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.JavaScriptCallback; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetPositionMode; +import net.runelite.api.widgets.WidgetType; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; +import net.runelite.client.game.chatbox.ChatboxPanelManager; +import net.runelite.client.game.chatbox.ChatboxTextInput; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.tooltip.Tooltip; +import net.runelite.client.ui.overlay.tooltip.TooltipManager; + +@Slf4j +@PluginDescriptor( + name = "Music", + description = "Adds search and filter for the music list, and additional volume control", + tags = {"sound", "volume"} +) +public class MusicPlugin extends Plugin +{ + private static final int SLIDER_HANDLE_SIZE = 16; + + private static final Set SOURCELESS_PLAYER_SOUNDS = ImmutableSet.of( + SoundEffectID.TELEPORT_VWOOP + ); + + private static final Set PRAYER_SOUNDS = ImmutableSet.of( + SoundEffectID.PRAYER_ACTIVATE_THICK_SKIN, + SoundEffectID.PRAYER_ACTIVATE_BURST_OF_STRENGTH, + SoundEffectID.PRAYER_ACTIVATE_CLARITY_OF_THOUGHT, + SoundEffectID.PRAYER_ACTIVATE_SHARP_EYE_RIGOUR, + SoundEffectID.PRAYER_ACTIVATE_MYSTIC_WILL_AUGURY, + SoundEffectID.PRAYER_ACTIVATE_ROCK_SKIN, + SoundEffectID.PRAYER_ACTIVATE_SUPERHUMAN_STRENGTH, + SoundEffectID.PRAYER_ACTIVATE_IMPROVED_REFLEXES, + SoundEffectID.PRAYER_ACTIVATE_RAPID_RESTORE_PRESERVE, + SoundEffectID.PRAYER_ACTIVATE_RAPID_HEAL, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_ITEM, + SoundEffectID.PRAYER_ACTIVATE_HAWK_EYE, + SoundEffectID.PRAYER_ACTIVATE_MYSTIC_LORE, + SoundEffectID.PRAYER_ACTIVATE_STEEL_SKIN, + SoundEffectID.PRAYER_ACTIVATE_ULTIMATE_STRENGTH, + SoundEffectID.PRAYER_ACTIVATE_INCREDIBLE_REFLEXES, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_FROM_MAGIC, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_FROM_MISSILES, + SoundEffectID.PRAYER_ACTIVATE_PROTECT_FROM_MELEE, + SoundEffectID.PRAYER_ACTIVATE_EAGLE_EYE, + SoundEffectID.PRAYER_ACTIVATE_MYSTIC_MIGHT, + SoundEffectID.PRAYER_ACTIVATE_RETRIBUTION, + SoundEffectID.PRAYER_ACTIVATE_REDEMPTION, + SoundEffectID.PRAYER_ACTIVATE_SMITE, + SoundEffectID.PRAYER_ACTIVATE_CHIVALRY, + SoundEffectID.PRAYER_ACTIVATE_PIETY, + SoundEffectID.PRAYER_DEACTIVE_VWOOP + ); + + @Inject + private Client client; + + @Inject + private ClientThread clientThread; + + @Inject + private MusicConfig musicConfig; + + @Inject + private ChatboxPanelManager chatboxPanelManager; + + @Inject + private TooltipManager tooltipManager; + + private Channel musicChannel; + private Channel effectChannel; + private Channel areaChannel; + private Channel[] channels; + + private ChatboxTextInput searchInput; + + private Widget musicSearchButton; + private Widget musicFilterButton; + + private Collection tracks; + + private MusicState currentMusicFilter = MusicState.ALL; + + private Tooltip sliderTooltip; + private boolean shuttingDown = false; + + @Override + protected void startUp() + { + clientThread.invoke(() -> + { + this.shuttingDown = false; + + Preferences preferences = client.getPreferences(); + musicChannel = new Channel("Music", + VarPlayer.MUSIC_VOLUME, Varbits.MUTED_MUSIC_VOLUME, + musicConfig::getMusicVolume, musicConfig::setMusicVolume, + client::setMusicVolume, 255, + WidgetInfo.SETTINGS_SIDE_MUSIC_SLIDER); + effectChannel = new Channel("Sound Effects", + VarPlayer.SOUND_EFFECT_VOLUME, Varbits.MUTED_SOUND_EFFECT_VOLUME, + musicConfig::getSoundEffectVolume, musicConfig::setSoundEffectVolume, + preferences::setSoundEffectVolume, 127, + WidgetInfo.SETTINGS_SIDE_SOUND_EFFECT_SLIDER); + areaChannel = new Channel("Area Sounds", + VarPlayer.AREA_EFFECT_VOLUME, Varbits.MUTED_AREA_EFFECT_VOLUME, + musicConfig::getAreaSoundEffectVolume, musicConfig::setAreaSoundEffectVolume, + preferences::setAreaSoundEffectVolume, 127, + WidgetInfo.SETTINGS_SIDE_AREA_SOUND_SLIDER); + channels = new Channel[]{musicChannel, effectChannel, areaChannel}; + + addMusicButtons(); + updateMusicOptions(); + resetSettingsWindow(); + }); + } + + @Override + protected void shutDown() + { + Widget header = client.getWidget(WidgetInfo.MUSIC_WINDOW); + if (header != null) + { + header.deleteAllChildren(); + } + + tracks = null; + clientThread.invoke(() -> + { + shuttingDown = true; + teardownMusicOptions(); + }); + } + + @Provides + MusicConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(MusicConfig.class); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN) + { + // Reset music filter on logout + currentMusicFilter = MusicState.ALL; + tracks = null; + } + } + + @Subscribe + public void onWidgetLoaded(WidgetLoaded widgetLoaded) + { + if (widgetLoaded.getGroupId() == WidgetID.MUSIC_GROUP_ID) + { + tracks = null; + // Reset filter state as the widget has been reloaded. + // It is too early here to call updateFilter() + currentMusicFilter = MusicState.ALL; + addMusicButtons(); + } + + if ((widgetLoaded.getGroupId() == WidgetID.SETTINGS_GROUP_ID || widgetLoaded.getGroupId() == WidgetID.SETTINGS_SIDE_GROUP_ID) + && musicConfig.granularSliders()) + { + updateMusicOptions(); + } + } + + private void addMusicButtons() + { + Widget header = client.getWidget(WidgetInfo.MUSIC_WINDOW); + + if (header == null) + { + return; + } + + header.deleteAllChildren(); + + //Creation of the search and toggle status buttons + musicSearchButton = header.createChild(-1, WidgetType.GRAPHIC); + musicSearchButton.setSpriteId(SpriteID.GE_SEARCH); + musicSearchButton.setOriginalWidth(18); + musicSearchButton.setOriginalHeight(17); + musicSearchButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + musicSearchButton.setOriginalX(5); + musicSearchButton.setOriginalY(32); + musicSearchButton.setHasListener(true); + musicSearchButton.setAction(1, "Open"); + musicSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); + musicSearchButton.setName("Search"); + musicSearchButton.revalidate(); + + musicFilterButton = header.createChild(-1, WidgetType.GRAPHIC); + musicFilterButton.setSpriteId(SpriteID.MINIMAP_ORB_PRAYER); + musicFilterButton.setOriginalWidth(15); + musicFilterButton.setOriginalHeight(15); + musicFilterButton.setXPositionMode(WidgetPositionMode.ABSOLUTE_RIGHT); + musicFilterButton.setOriginalX(25); + musicFilterButton.setOriginalY(34); + musicFilterButton.setHasListener(true); + musicFilterButton.setAction(1, "Toggle"); + musicFilterButton.setOnOpListener((JavaScriptCallback) e -> toggleStatus()); + musicFilterButton.setName("All"); + musicFilterButton.revalidate(); + } + + @Subscribe + public void onVarClientIntChanged(VarClientIntChanged varClientIntChanged) + { + if (isChatboxOpen() && !isOnMusicTab()) + { + chatboxPanelManager.close(); + } + } + + @Subscribe + public void onVolumeChanged(VolumeChanged volumeChanged) + { + if (musicConfig.granularSliders()) + { + updateMusicOptions(); + } + } + + @Subscribe + public void onConfigChanged(ConfigChanged configChanged) + { + if ("music".equals(configChanged.getGroup())) + { + clientThread.invoke(() -> + { + if (MusicConfig.GRANULAR_SLIDERS.equals(configChanged.getKey())) + { + if (musicConfig.granularSliders()) + { + updateMusicOptions(); + resetSettingsWindow(); + } + else + { + teardownMusicOptions(); + } + } + else + { + updateMusicOptions(); + } + }); + } + } + + private boolean isOnMusicTab() + { + return client.getVar(VarClientInt.INVENTORY_TAB) == 13; + } + + private boolean isChatboxOpen() + { + return searchInput != null && chatboxPanelManager.getCurrentInput() == searchInput; + } + + private String getChatboxInput() + { + return isChatboxOpen() ? searchInput.getValue() : ""; + } + + private void toggleStatus() + { + MusicState[] states = MusicState.values(); + currentMusicFilter = states[(currentMusicFilter.ordinal() + 1) % states.length]; + musicFilterButton.setSpriteId(currentMusicFilter.getSpriteID()); + musicFilterButton.setName(currentMusicFilter.getName()); + updateFilter(getChatboxInput()); + client.playSoundEffect(SoundEffectID.UI_BOOP); + } + + private void openSearch() + { + updateFilter(""); + client.playSoundEffect(SoundEffectID.UI_BOOP); + musicSearchButton.setAction(1, "Close"); + musicSearchButton.setOnOpListener((JavaScriptCallback) e -> closeSearch()); + searchInput = chatboxPanelManager.openTextInput("Search music list") + .onChanged(s -> clientThread.invokeLater(() -> updateFilter(s.trim()))) + .onDone(s -> false) + .onClose(() -> + { + clientThread.invokeLater(() -> updateFilter("")); + musicSearchButton.setOnOpListener((JavaScriptCallback) e -> openSearch()); + musicSearchButton.setAction(1, "Open"); + }) + .build(); + } + + private void closeSearch() + { + updateFilter(""); + chatboxPanelManager.close(); + client.playSoundEffect(SoundEffectID.UI_BOOP); + } + + private void updateFilter(String input) + { + final Widget container = client.getWidget(WidgetInfo.MUSIC_WINDOW); + final Widget musicList = client.getWidget(WidgetInfo.MUSIC_TRACK_LIST); + + if (container == null || musicList == null) + { + return; + } + + String filter = input.toLowerCase(); + updateList(musicList, filter); + } + + private void updateList(Widget musicList, String filter) + { + if (tracks == null) + { + tracks = Arrays.stream(musicList.getDynamicChildren()) + .sorted(Comparator.comparing(Widget::getRelativeY)) + .collect(Collectors.toList()); + } + + tracks.forEach(w -> w.setHidden(true)); + + Collection relevantTracks = tracks.stream() + .filter(w -> w.getText().toLowerCase().contains(filter)) + .filter(w -> currentMusicFilter == MusicState.ALL || w.getTextColor() == currentMusicFilter.getColor()) + .collect(Collectors.toList()); + + // Original music track list has a little offset + int y = 3; + + for (Widget track : relevantTracks) + { + track.setHidden(false); + track.setOriginalY(y); + track.revalidate(); + + y += track.getHeight(); + } + + y += 3; + + int newHeight = 0; + + if (musicList.getScrollHeight() > 0) + { + newHeight = (musicList.getScrollY() * y) / musicList.getScrollHeight(); + } + + musicList.setScrollHeight(y); + musicList.revalidateScroll(); + + client.runScript( + ScriptID.UPDATE_SCROLLBAR, + WidgetInfo.MUSIC_TRACK_SCROLLBAR.getId(), + WidgetInfo.MUSIC_TRACK_LIST.getId(), + newHeight + ); + } + + @AllArgsConstructor + @Getter + private enum MusicState + { + NOT_FOUND(0xff0000, "Locked", SpriteID.MINIMAP_ORB_HITPOINTS), + FOUND(0xdc10d, "Unlocked", SpriteID.MINIMAP_ORB_HITPOINTS_POISON), + ALL(0, "All", SpriteID.MINIMAP_ORB_PRAYER); + + private final int color; + private final String name; + private final int spriteID; + } + + @RequiredArgsConstructor + private class Slider + { + @Getter + protected final Channel channel; + + protected Widget track; + protected Widget handle; + + public void update() + { + handle.setOnDragListener((JavaScriptCallback) this::drag); + handle.setOnDragCompleteListener((JavaScriptCallback) this::drag); + handle.setHasListener(true); + + track.setOnMouseRepeatListener((JavaScriptCallback) ev -> + { + int value = channel.getValue(); + int percent = (int) Math.round((value * 100.0 / channel.getMax())); + + sliderTooltip = new Tooltip(channel.getName() + ": " + percent + "%"); + }); + track.setOnClickListener((JavaScriptCallback) this::click); + track.setHasListener(true); + } + + public void shutDown() + { + if (handle != null) + { + handle.setDragParent(null); + handle.setOnDragListener((Object[]) null); + handle.setOnDragCompleteListener((Object[]) null); + } + if (track != null) + { + track.setOnMouseRepeatListener((Object[]) null); + track.setOnClickListener((Object[]) null); + } + } + + protected void drag(ScriptEvent ev) + { + moveHandle(ev.getMouseX()); + } + + protected void click(ScriptEvent ev) + { + moveHandle(ev.getMouseX() - (SLIDER_HANDLE_SIZE / 2)); + } + + protected void moveHandle(int x) + { + int level = (x * channel.max) / getWidth(); + level = Ints.constrainToRange(level, 0, channel.max); + channel.setLevel(level); + } + + protected int getWidth() + { + return track.getWidth() - SLIDER_HANDLE_SIZE; + } + } + + private class SettingsSideSlider extends Slider + { + private final WidgetInfo root; + private Widget icon; + + SettingsSideSlider(Channel channel, WidgetInfo root) + { + super(channel); + this.root = root; + } + + @Override + public void update() + { + Widget root = client.getWidget(this.root); + if (root == null) + { + return; + } + + Object[] onLoad = root.getOnLoadListener(); + if (onLoad == null || onLoad.length != 5) + { + return; + } + + this.icon = client.getWidget((Integer) onLoad[1]); + this.track = client.getWidget((Integer) onLoad[2]); + this.handle = client.getWidget((Integer) onLoad[3]); + if (this.track == null || this.handle == null) + { + return; + } + + for (Widget w : track.getChildren()) + { + if (w != null) + { + w.setAction(0, null); + } + } + + handle.setOnVarTransmitListener((Object[]) null); + handle.setDragParent(track); + handle.setSpriteId(SpriteID.SETTINGS_SLIDER_HANDLE_GREEN); + super.update(); + + int val = channel.getValue(); + handle.setOriginalX((val * getWidth()) / channel.getMax()); + handle.revalidate(); + + // emulate [proc,settings_update_icon] + boolean unmuted = val != 0; + icon.getChild(1).setHidden(unmuted); + icon.setAction(0, unmuted ? "Mute" : "Unmute"); + // Set name + no tooltip; we have our own for ops + icon.setName(channel.getName()); + icon.setOnMouseRepeatListener((Object[]) null); + icon.setOnOpListener((JavaScriptCallback) ev -> channel.toggleMute()); + } + + @Override + public void shutDown() + { + super.shutDown(); + handle.setSpriteId(SpriteID.SETTINGS_SLIDER_HANDLE_BLUE); + + this.icon.setOnOpListener((Object[]) null); + + Widget root = client.getWidget(this.root); + if (root != null) + { + client.createScriptEvent(root.getOnLoadListener()) + .setSource(root) + .run(); + } + + this.handle = this.track = this.icon = null; + } + } + + private class SettingsSlider extends Slider + { + private final int offsetX; + private final int offsetY; + private final int width; + private final Widget realTrack; + + SettingsSlider(Channel channel, Widget handle, Widget track, int width, int offsetY, int offsetX, Widget realTrack) + { + super(channel); + this.handle = handle; + this.track = track; + this.width = width; + this.offsetX = offsetX; + this.offsetY = offsetY; + this.realTrack = realTrack; + } + + @Override + public void update() + { + super.update(); + + int val = channel.getValue(); + handle.setOriginalX(offsetX + (val * getWidth()) / channel.getMax()); + handle.setOriginalY(offsetY); + handle.revalidate(); + } + + @Override + protected int getWidth() + { + return width - SLIDER_HANDLE_SIZE; + } + + @Override + protected void click(ScriptEvent ev) + { + super.click(ev); + realTrack.setOriginalX(offsetX); + realTrack.setOriginalY(offsetY); + realTrack.setOriginalWidth(this.width); + realTrack.setOriginalHeight(SLIDER_HANDLE_SIZE); + realTrack.revalidate(); + } + + @Override + @SuppressWarnings("PMD.UselessOverridingMethod") + public void shutDown() + { + // calling settings_init will do teardown for us + super.shutDown(); + } + } + + @Subscribe + private void onPostStructComposition(PostStructComposition ev) + { + if (shuttingDown) + { + return; + } + + StructComposition sc = ev.getStructComposition(); + switch (sc.getId()) + { + case StructID.SETTINGS_MUSIC_VOLUME: + case StructID.SETTINGS_EFFECT_VOLUME: + case StructID.SETTINGS_AREA_VOLUME: + if (!musicConfig.granularSliders()) + { + return; + } + + sc.setValue(ParamID.SETTING_SLIDER_STEPS, 1); + sc.setValue(ParamID.SETTING_CUSTOM_TRANSMIT, 0); + sc.setValue(ParamID.SETTING_FOREGROUND_CLICKZONE, 0); + sc.setValue(ParamID.SETTING_SLIDER_CUSTOM_ONOP, 1); + sc.setValue(ParamID.SETTING_SLIDER_CUSTOM_SETPOS, 1); + sc.setValue(ParamID.SETTING_SLIDER_IS_DRAGGABLE, 1); + sc.setValue(ParamID.SETTING_SLIDER_DEADZONE, 0); + sc.setValue(ParamID.SETTING_SLIDER_DEADZONE, 0); + break; + } + } + + @Subscribe + private void onScriptPreFired(ScriptPreFired ev) + { + if (shuttingDown) + { + return; + } + + if (ev.getScriptId() == ScriptID.SETTINGS_SLIDER_CHOOSE_ONOP) + { + if (!musicConfig.granularSliders()) + { + return; + } + + int arg = client.getIntStackSize() - 7; + int[] is = client.getIntStack(); + Channel channel; + switch (is[arg]) + { + case SettingID.MUSIC_VOLUME: + channel = musicChannel; + break; + case SettingID.EFFECT_VOLUME: + channel = effectChannel; + break; + case SettingID.AREA_VOLUME: + channel = areaChannel; + break; + default: + return; + } + + Widget track = client.getScriptActiveWidget(); + Widget handle = client.getWidget(is[arg + 1]) + .getChild(is[arg + 2]); + Widget realTrack = client.getWidget(is[arg + 6]); + SettingsSlider s = new SettingsSlider(channel, handle, track, is[arg + 3], is[arg + 4], is[arg + 5], realTrack); + s.update(); + s.getChannel().setWindowSlider(s); + } + } + + private class Channel + { + @Getter + private final String name; + private final VarPlayer var; + private final Varbits mutedVar; + private final IntSupplier getter; + private final Consumer setter; + private final IntConsumer volumeChanger; + + @Getter + private final int max; + + private final Slider sideSlider; + + @Setter + private Slider windowSlider; + + Channel(String name, + VarPlayer var, Varbits mutedVar, + IntSupplier getter, Consumer setter, + IntConsumer volumeChanger, int max, + WidgetInfo sideRoot) + { + this.name = name; + this.var = var; + this.mutedVar = mutedVar; + this.getter = getter; + this.setter = setter; + this.volumeChanger = volumeChanger; + this.max = max; + this.sideSlider = new SettingsSideSlider(this, sideRoot); + } + + private int getValueRaw() + { + int value = getter.getAsInt(); + if (value == 0) + { + // Use the vanilla value + + // the varps are known by the engine and it requires they are stored so + // 0 = max and 4 = muted + int raw = 4 - client.getVar(var); + if (raw == 0) + { + raw = -(4 - client.getVar(mutedVar)); + } + value = ((raw * max) / 4); + + // readd our 1 offset for unknown's place + value += value < 0 ? -1 : 1; + } + + return value; + } + + private int getValue() + { + int value = getValueRaw(); + + // muted with saved restore point + if (value < 0) + { + return 0; + } + + // 0 is used for unknown, so config values are 1 away from zero + return value - 1; + } + + public void toggleMute() + { + int val = -getValueRaw(); + if (val == -1) + { + // muted without a reset value + val = max / 2; + } + setter.accept(val); + } + + public void setLevel(int level) + { + setter.accept(level + 1); + update(); + } + + public void update() + { + volumeChanger.accept(getValue()); + sideSlider.update(); + if (windowSlider != null) + { + windowSlider.update(); + } + } + + public void shutDown() + { + sideSlider.shutDown(); + if (windowSlider != null) + { + windowSlider.shutDown(); + } + + int raw = 4 - client.getVar(var); + int value = ((raw * max) / 4); + volumeChanger.accept(value); + } + } + + private void updateMusicOptions() + { + for (Channel channel : channels) + { + channel.update(); + } + } + + private void teardownMusicOptions() + { + // the side panel uses this too, so it has to run before they get shut down + client.getStructCompositionCache().reset(); + + for (Channel channel : channels) + { + channel.shutDown(); + } + + resetSettingsWindow(); + } + + private void resetSettingsWindow() + { + client.getStructCompositionCache().reset(); + + Widget init = client.getWidget(WidgetInfo.SETTINGS_INIT); + if (init != null) + { + // [clientscript, settings_init] + client.createScriptEvent(init.getOnLoadListener()) + .setSource(init) + .run(); + } + } + + @Subscribe + private void onBeforeRender(BeforeRender ev) + { + if (sliderTooltip != null) + { + tooltipManager.add(sliderTooltip); + sliderTooltip = null; + } + } + + @Subscribe + public void onAreaSoundEffectPlayed(AreaSoundEffectPlayed areaSoundEffectPlayed) + { + Actor source = areaSoundEffectPlayed.getSource(); + int soundId = areaSoundEffectPlayed.getSoundId(); + if (source == client.getLocalPlayer() + && musicConfig.muteOwnAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + else if (source != client.getLocalPlayer() + && (source instanceof Player || (source == null && SOURCELESS_PLAYER_SOUNDS.contains(soundId))) + && musicConfig.muteOtherAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + else if (source instanceof NPC + && musicConfig.muteNpcAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + else if (source == null + && !SOURCELESS_PLAYER_SOUNDS.contains(soundId) + && musicConfig.muteEnvironmentAreaSounds()) + { + areaSoundEffectPlayed.consume(); + } + } + + @Subscribe + public void onSoundEffectPlayed(SoundEffectPlayed soundEffectPlayed) + { + if (musicConfig.mutePrayerSounds() + && PRAYER_SOUNDS.contains(soundEffectPlayed.getSoundId())) + { + soundEffectPlayed.consume(); + } + } +} \ No newline at end of file From b5bb349259080fa152547db7d136864e9ac6ae06 Mon Sep 17 00:00:00 2001 From: TheRealNull Date: Mon, 4 Jan 2021 06:58:20 -0500 Subject: [PATCH 2/2] project: we are actually up to date now, thanks blue! --- injector/injector.gradle.kts | 3 + .../injector/injectors/RSApiInjector.java | 6 +- .../injectors/rsapi/InjectSetter.java | 10 +- .../main/java/net/runelite/api/Client.java | 100 ++++++++++---- .../net/runelite/api/ItemComposition.java | 2 +- .../net/runelite/api/IterableHashTable.java | 1 + .../java/net/runelite/api/NPCComposition.java | 2 +- .../net/runelite/api/ObjectComposition.java | 2 +- .../java/net/runelite/api/Preferences.java | 24 +++- .../main/java/net/runelite/api/ScriptID.java | 14 ++ .../api/events/WidgetHiddenChanged.java | 44 ------ .../net/runelite/api/hooks/Callbacks.java | 17 ++- .../java/net/runelite/api/widgets/Widget.java | 15 +-- .../net/runelite/api/widgets/WidgetInfo.java | 1 - .../net/runelite/mixins/ParamHolderMixin.java | 118 ++++++++++++++++ .../net/runelite/mixins/RSClientMixin.java | 127 +++++++++++++----- .../mixins/RSClientPreferencesMixin.java | 31 ----- .../net/runelite/mixins/RSGameShellMixin.java | 5 +- .../mixins/RSParamCompositionMixin.java | 16 +++ .../runelite/mixins/RSScriptEventMixin.java | 21 +++ .../mixins/RSStructCompositionMixin.java | 26 ++++ .../net/runelite/mixins/RSWidgetMixin.java | 73 ---------- .../net/runelite/mixins/ScriptVMMixin.java | 50 +++++-- .../java/net/runelite/mixins/VarbitMixin.java | 14 +- .../java/net/runelite/rs/api/RSClient.java | 30 +++++ .../runelite/rs/api/RSClientPreferences.java | 1 - .../runelite/rs/api/RSInterfaceParent.java | 4 + .../runelite/rs/api/RSItemComposition.java | 6 + .../rs/api/RSIterableNodeHashTable.java | 5 + .../net/runelite/rs/api/RSNPCComposition.java | 6 + .../runelite/rs/api/RSObjectComposition.java | 6 + .../net/runelite/rs/api/RSObjectNode.java | 8 +- .../runelite/rs/api/RSParamComposition.java | 17 +++ .../runelite/rs/api/RSParamDefinition.java | 3 - .../java/net/runelite/rs/api/RSScript.java | 6 + .../net/runelite/rs/api/RSScriptEvent.java | 3 + .../runelite/rs/api/RSStructComposition.java | 16 +++ .../runelite/rs/api/RSStructDefinition.java | 3 - .../java/net/runelite/rs/api/RSWidget.java | 22 ++- .../src/main/java/AbstractWorldMapIcon.java | 10 +- runescape-client/src/main/java/Canvas.java | 4 +- .../src/main/java/ChatChannel.java | 10 +- runescape-client/src/main/java/Client.java | 4 +- .../src/main/java/DynamicObject.java | 2 +- .../src/main/java/EnumComposition.java | 2 +- runescape-client/src/main/java/FontName.java | 2 +- runescape-client/src/main/java/Frames.java | 4 +- ...GrandExchangeOfferUnitPriceComparator.java | 2 +- .../src/main/java/GraphicsObject.java | 2 +- .../src/main/java/HorizontalAlignment.java | 2 +- .../src/main/java/ItemComposition.java | 2 +- runescape-client/src/main/java/Messages.java | 2 +- runescape-client/src/main/java/ModeWhere.java | 2 +- runescape-client/src/main/java/NPC.java | 8 +- .../src/main/java/NPCComposition.java | 2 +- .../src/main/java/ObjectComposition.java | 2 +- ...mDefinition.java => ParamComposition.java} | 8 +- runescape-client/src/main/java/Player.java | 6 +- .../src/main/java/PlayerComposition.java | 3 +- .../src/main/java/Projectile.java | 2 +- .../src/main/java/SceneTilePaint.java | 8 +- .../src/main/java/ScriptFrame.java | 2 +- .../src/main/java/SecureRandomCallable.java | 2 +- runescape-client/src/main/java/Skeleton.java | 2 +- .../main/java/SpotAnimationDefinition.java | 2 +- ...Definition.java => StructComposition.java} | 6 +- .../src/main/java/StudioGame.java | 2 +- runescape-client/src/main/java/Tiles.java | 4 +- .../src/main/java/UserComparator9.java | 2 +- .../src/main/java/WorldMapData_0.java | 4 +- .../src/main/java/WorldMapData_1.java | 2 +- .../src/main/java/WorldMapID.java | 6 +- .../src/main/java/WorldMapRectangle.java | 4 +- runescape-client/src/main/java/class13.java | 2 +- runescape-client/src/main/java/class200.java | 2 +- runescape-client/src/main/java/class231.java | 8 +- runescape-client/src/main/java/class238.java | 2 +- runescape-client/src/main/java/class277.java | 2 +- runescape-client/src/main/java/class51.java | 2 +- 79 files changed, 668 insertions(+), 335 deletions(-) delete mode 100644 runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java create mode 100644 runelite-mixins/src/main/java/net/runelite/mixins/ParamHolderMixin.java delete mode 100644 runelite-mixins/src/main/java/net/runelite/mixins/RSClientPreferencesMixin.java create mode 100644 runelite-mixins/src/main/java/net/runelite/mixins/RSParamCompositionMixin.java create mode 100644 runelite-mixins/src/main/java/net/runelite/mixins/RSScriptEventMixin.java create mode 100644 runelite-mixins/src/main/java/net/runelite/mixins/RSStructCompositionMixin.java create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSParamComposition.java delete mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSParamDefinition.java create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSStructComposition.java delete mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSStructDefinition.java rename runescape-client/src/main/java/{ParamDefinition.java => ParamComposition.java} (96%) rename runescape-client/src/main/java/{StructDefinition.java => StructComposition.java} (96%) diff --git a/injector/injector.gradle.kts b/injector/injector.gradle.kts index 79e4cfc2c0..00c2bb7d3f 100644 --- a/injector/injector.gradle.kts +++ b/injector/injector.gradle.kts @@ -31,6 +31,9 @@ tasks.register("inject") { main = "com.openosrs.injector.Injector" classpath = sourceSets["main"].runtimeClasspath args(vanillaDep.singleFile, openosrsVersion) + outputs.upToDateWhen { + false + } } tasks { diff --git a/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java b/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java index a9b4bf6b26..d904d3cb26 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/RSApiInjector.java @@ -118,9 +118,9 @@ public class RSApiInjector extends AbstractInjector final Signature sig = apiMethod.getSignature(); - if (sig.isVoid()) + if (sig.size() == 1) { - if (sig.size() == 1) + if (sig.isVoid() || sig.getReturnValue().equals(Type.fromAsmString(apiMethod.getClazz().getName()))) { Type type = InjectUtil.apiToDeob(inject, sig.getTypeOfArg(0)); if (deobType.equals(type)) @@ -276,7 +276,7 @@ public class RSApiInjector extends AbstractInjector final ClassFile targetClass = InjectUtil.vanillaFromApiMethod(inject, apiMethod); apiMethod.setInjected(true); - if (apiMethod.getSignature().isVoid()) + if (apiMethod.getSignature().getArguments().size() == 1) { ++set; log.debug("[DEBUG] Injecting setter {} for {} into {}", apiMethod.getMethod(), field.getPoolField(), targetClass.getPoolClass()); diff --git a/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java b/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java index 492c5649f1..9eb137d2b7 100644 --- a/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java +++ b/injector/src/main/java/com/openosrs/injector/injectors/rsapi/InjectSetter.java @@ -102,7 +102,15 @@ public class InjectSetter ins.add(new PutField(instructions, field)); } - ins.add(new VReturn(instructions)); + if (!apiMethod.getSignature().getReturnValue().equals(Type.VOID)) + { + ins.add(new ALoad(instructions, 0)); + ins.add(InjectUtil.createReturnForType(instructions, apiMethod.getSignature().getReturnValue())); + } + else + { + ins.add(new VReturn(instructions)); + } targetClass.addMethod(method); } 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 a0cd2c1f21..3ea377157c 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -526,6 +526,16 @@ public interface Client extends GameShell @Nullable Widget getWidget(int groupId, int childId); + /** + * Gets a widget by it's packed ID. + * + *

+ * Note: Use {@link #getWidget(WidgetInfo)} or {@link #getWidget(int, int)} for + * a more readable version of this method. + */ + @Nullable + Widget getWidget(int packedID); + /** * Gets an array containing the x-axis canvas positions * of all widgets. @@ -784,6 +794,15 @@ public interface Client extends GameShell */ void setVarbit(Varbits varbit, int value); + /** + * Gets the varbit composition for a given varbit id + * + * @param id + * @return + */ + @Nullable + VarbitComposition getVarbit(int id); + /** * Gets the value of a given variable. * @@ -817,10 +836,11 @@ public interface Client extends GameShell void setVarbitValue(int[] varps, int varbit, int value); /** - * Gets the varbit composition for a given varbit id + * Mark the given varp as changed, causing var listeners to be + * triggered next tick + * @param varp */ - @Nullable - VarbitComposition getVarbitDefinition(int id); + void queueChangedVarp(int varp); /** * Gets the widget flags table. @@ -898,16 +918,6 @@ public interface Client extends GameShell */ IterableHashTable getMessages(); - /** - * Gets the viewport widget. - *

- * The viewport is the area of the game above the chatbox - * and to the left of the mini-map. - * - * @return the viewport widget - */ - Widget getViewportWidget(); - /** * Gets the object composition corresponding to an objects ID. * @@ -926,6 +936,18 @@ public interface Client extends GameShell */ NPCComposition getNpcDefinition(int npcId); + /** + * Gets the {@link StructComposition} for a given struct ID + * + * @see StructID + */ + StructComposition getStructComposition(int structID); + + /** + * Gets the client's cache of in memory struct compositions + */ + NodeCache getStructCompositionCache(); + /** * Gets an array of all world areas * @@ -1017,6 +1039,18 @@ public interface Client extends GameShell */ List getGraphicsObjects(); + /** + * Gets the music volume + * @return volume 0-255 inclusive + */ + int getMusicVolume(); + + /** + * Sets the music volume + * @param volume 0-255 inclusive + */ + void setMusicVolume(int volume); + /** * Play a sound effect at the player's current location. This is how UI, * and player-generated (e.g. mining, woodcutting) sound effects are @@ -1160,6 +1194,20 @@ public interface Client extends GameShell */ String[] getStringStack(); + /** + * Gets the cs2 vm's active widget + * + * This is used for all {@code cc_*} operations with a {@code 0} operand + */ + Widget getScriptActiveWidget(); + + /** + * Gets the cs2 vm's "dot" widget + * + * This is used for all {@code .cc_*} operations with a {@code 1} operand + */ + Widget getScriptDotWidget(); + /** * Checks whether a player is on the friends list. * @@ -1329,11 +1377,21 @@ public interface Client extends GameShell *

* This method must be ran on the client thread and is not reentrant * + * This method is shorthand for {@code client.createScriptEvent(args).run()} + * * @param args the script id, then any additional arguments to execute the script with * @see ScriptID */ void runScript(Object... args); + /** + * Creates a blank ScriptEvent for executing a ClientScript2 script + * + * @param args the script id, then any additional arguments to execute the script with + * @see ScriptID + */ + ScriptEvent createScriptEvent(Object ...args); + /** * Checks whether or not there is any active hint arrow. * @@ -2063,20 +2121,4 @@ public interface Client extends GameShell void setOutdatedScript(String outdatedScript); List getOutdatedScripts(); - - void queueChangedVarp(int varp); - - VarbitComposition getVarbit(int id); - - Widget getWidget(int param1); - - Widget getScriptActiveWidget(); - - ScriptEvent createScriptEvent(Object[] args); - - int getViewportColor(); - - NodeCache getStructCompositionCache(); - - void setMusicVolume(int i); } diff --git a/runelite-api/src/main/java/net/runelite/api/ItemComposition.java b/runelite-api/src/main/java/net/runelite/api/ItemComposition.java index b556ef1748..fcd0ce25a0 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemComposition.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemComposition.java @@ -5,7 +5,7 @@ import javax.annotation.Nullable; /** * Represents the template of a specific item type. */ -public interface ItemComposition +public interface ItemComposition extends ParamHolder { /** * Gets the items name. diff --git a/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java b/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java index 48894f1863..016888cc80 100644 --- a/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java +++ b/runelite-api/src/main/java/net/runelite/api/IterableHashTable.java @@ -27,4 +27,5 @@ package net.runelite.api; public interface IterableHashTable extends Iterable { T get(long hash); + void put(T node, long hash); } diff --git a/runelite-api/src/main/java/net/runelite/api/NPCComposition.java b/runelite-api/src/main/java/net/runelite/api/NPCComposition.java index d730529e42..07773db029 100644 --- a/runelite-api/src/main/java/net/runelite/api/NPCComposition.java +++ b/runelite-api/src/main/java/net/runelite/api/NPCComposition.java @@ -27,7 +27,7 @@ package net.runelite.api; /** * Information about a specific {@link NpcID} */ -public interface NPCComposition +public interface NPCComposition extends ParamHolder { /** * Gets the name of the NPC. diff --git a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java index 43fa5aa88a..1d0357b78a 100644 --- a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java @@ -27,7 +27,7 @@ package net.runelite.api; /** * Information about a specific {@link ObjectID} */ -public interface ObjectComposition +public interface ObjectComposition extends ParamHolder { /** * Gets ID for the object. diff --git a/runelite-api/src/main/java/net/runelite/api/Preferences.java b/runelite-api/src/main/java/net/runelite/api/Preferences.java index b134b96bdf..d7b67242bf 100644 --- a/runelite-api/src/main/java/net/runelite/api/Preferences.java +++ b/runelite-api/src/main/java/net/runelite/api/Preferences.java @@ -43,15 +43,27 @@ public interface Preferences */ void setRememberedUsername(String username); + /** + * Gets the sound effect volume + * @return volume 0-127 inclusive + */ int getSoundEffectVolume(); - void setSoundEffectVolume(int i); + /** + * Sets the sound effect volume + * @param volume 0-127 inclusive + */ + void setSoundEffectVolume(int volume); + /** + * Gets the area sound effect volume + * @return volume 0-127 inclusive + */ int getAreaSoundEffectVolume(); - void setAreaSoundEffectVolume(int i); - - int getMusicVolume(); - - void setClientMusicVolume(int i); + /** + * Sets the area sound effect volume + * @param volume 0-127 inclusive + */ + void setAreaSoundEffectVolume(int volume); } 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 40c5e09cc9..215a871a6f 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -348,6 +348,20 @@ public final class ScriptID @ScriptArguments() public static final int BANKMAIN_SEARCHING = 514; + /** + * Chooses the click handler for a {@link ParamID#SETTING_SLIDER_CUSTOM_ONOP} = 1 settings slider + * + * The active widget is set to the track created by {@link ParamID#SETTING_FOREGROUND_CLICKZONE} + *

    + *
  • int {@link ParamID#SETTING_ID}
  • + *
  • int (WidgetID) Slider handle ID
  • + *
  • int (widget index) Slider handle index
  • + *
  • int track width
  • + *
  • int y offset
  • + *
  • int x offset
  • + *
  • int (WidgetID) drag parent
  • + *
+ */ @ScriptArguments(integer = 7) public static final int SETTINGS_SLIDER_CHOOSE_ONOP = 3885; diff --git a/runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java b/runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java deleted file mode 100644 index 578adbe296..0000000000 --- a/runelite-api/src/main/java/net/runelite/api/events/WidgetHiddenChanged.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.events; - -import net.runelite.api.widgets.Widget; -import lombok.Data; - -/** - * An event where the hidden state of a {@link Widget} has been modified. - */ -@Data -public class WidgetHiddenChanged implements Event -{ - /** - * The affected widget. - */ - private Widget widget; - /** - * The new hidden state of the widget. - */ - private boolean hidden; -} diff --git a/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java index 59111a5eda..82257ace52 100644 --- a/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java +++ b/runelite-api/src/main/java/net/runelite/api/hooks/Callbacks.java @@ -72,9 +72,6 @@ public interface Callbacks */ void drawAboveOverheads(); - void drawLayer(Widget layer, List widgetItems); - - void drawInterface(int interfaceId, List widgetItems); /** * Client top-most draw method, rendering over top of most of game interfaces. * @@ -85,6 +82,20 @@ public interface Callbacks */ void draw(MainBufferProvider mainBufferProvider, Graphics graphics, int x, int y); + /** + * Called after an interface has been drawn + * @param interfaceId the interface id + * @param widgetItems Widget items within the interface + */ + void drawInterface(int interfaceId, List widgetItems); + + /** + * Called after a widget layer has been drawn + * @param layer The layer + * @param widgetItems Widget items within the layer + */ + void drawLayer(Widget layer, List widgetItems); + /** * Mouse pressed event. If this event will be consumed it will not be propagated further to client. * diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index f4bef64c7a..5e35a8cccf 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -70,6 +70,10 @@ public interface Widget int getButtonType(); + boolean isWidgetItemDragged(int index); + + Point getWidgetItemDragOffsets(); + /** * Gets the type of content displayed by the widget. */ @@ -1017,16 +1021,6 @@ public interface Widget */ void setOnReleaseListener(Object ...args); - boolean isWidgetItemDragged(int index); - - Point getWidgetItemDragOffsets(); - - static boolean getDragParent(Widget widget) - { - System.out.println("ERROR: IMPLEMENT"); //Would throw but that breaks widget inspector - return false; - } - /** * Sets a script to be ran when a drag operation is finished on this widget * @@ -1057,5 +1051,4 @@ public interface Widget * @param args A ScriptID, then the args for the script */ void setOnVarTransmitListener(Object ...args); -} } \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index fe9f449276..d074b92c07 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -927,7 +927,6 @@ public enum WidgetInfo HEALTH_OVERLAY_BAR(WidgetID.HEALTH_OVERLAY_BAR_GROUP_ID, WidgetID.EncounterHealthBar.CONTAINER), SETTINGS_INIT(WidgetID.SETTINGS_GROUP_ID, WidgetID.Settings.INIT), - SETTINGS_SIDE_CAMERA_ZOOM_SLIDER_TRACK(WidgetID.SETTINGS_SIDE_GROUP_ID, WidgetID.SettingsSide.CAMERA_ZOOM_SLIDER_TRACK), TRAILBLAZER_AREA_TELEPORT(WidgetID.TRAILBLAZER_AREAS_GROUP_ID, WidgetID.TrailblazerAreas.TELEPORT), ; diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/ParamHolderMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ParamHolderMixin.java new file mode 100644 index 0000000000..2f750e0871 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ParamHolderMixin.java @@ -0,0 +1,118 @@ +package net.runelite.mixins; + +import net.runelite.api.ParamHolder; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Mixins; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSIntegerNode; +import net.runelite.rs.api.RSItemComposition; +import net.runelite.rs.api.RSNPCComposition; +import net.runelite.rs.api.RSNode; +import net.runelite.rs.api.RSObjectComposition; +import net.runelite.rs.api.RSObjectNode; +import net.runelite.rs.api.RSParamComposition; +import net.runelite.rs.api.RSStructComposition; + +@Mixins({ + @Mixin(RSStructComposition.class), + @Mixin(RSObjectComposition.class), + @Mixin(RSNPCComposition.class), + @Mixin(RSItemComposition.class) +}) +public abstract class ParamHolderMixin implements ParamHolder +{ + @Shadow("client") + private static RSClient client; + + @Inject + private RSNode getParam(int id) + { + return this.getParams() == null ? null : (RSNode) this.getParams().get(id); + } + + @Inject + private void setParam(int id, RSNode node) + { + RSParamComposition comp = client.getRSParamComposition(id); + if (comp.isString() != (node instanceof RSObjectNode)) + { + if (comp.isString()) + { + throw new IllegalArgumentException("trying to put int into string param"); + } + else + { + throw new IllegalArgumentException("trying to put string into int param"); + } + } + else + { + if (getParams() == null) + { + setParams(client.newIterableNodeHashTable(16)); + } + + getParams().put(node, id); + } + } + + @Inject + @Override + public int getIntValue(int paramID) + { + RSNode param = getParam(paramID); + if (param != null) + { + RSIntegerNode node = (RSIntegerNode) param; + return node.getValue(); + } + else + { + RSParamComposition comp = client.getRSParamComposition(paramID); + if (comp.isString()) + { + throw new IllegalArgumentException("trying to get int from string param"); + } + + return comp.getDefaultInt(); + } + } + + @Inject + @Override + public void setValue(int id, int val) + { + setParam(id, client.newIntegerNode(val)); + } + + @Inject + @Override + public String getStringValue(int paramID) + { + RSNode param = getParam(paramID); + if (param != null) + { + RSObjectNode node = (RSObjectNode) param; + return (String) node.getValue(); + } + else + { + RSParamComposition comp = client.getRSParamComposition(paramID); + if (!comp.isString()) + { + throw new IllegalArgumentException("trying to get string from int param"); + } + + return comp.getDefaultStr(); + } + } + + @Inject + @Override + public void setValue(int id, String val) + { + setParam(id, client.newObjectNode(val)); + } +} 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 919067d7b0..55bad41e67 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -67,17 +67,19 @@ import net.runelite.api.NPC; import net.runelite.api.NPCComposition; import net.runelite.api.NameableContainer; import net.runelite.api.Node; +import net.runelite.api.NodeCache; import net.runelite.api.ObjectComposition; import static net.runelite.api.Perspective.LOCAL_TILE_SIZE; import net.runelite.api.Player; import net.runelite.api.Point; import net.runelite.api.Prayer; import net.runelite.api.Projectile; +import net.runelite.api.ScriptEvent; import net.runelite.api.Skill; import net.runelite.api.SpritePixels; +import net.runelite.api.StructComposition; import net.runelite.api.Tile; import net.runelite.api.VarPlayer; -import net.runelite.api.VarbitComposition; import net.runelite.api.Varbits; import net.runelite.api.WidgetNode; import net.runelite.api.WorldType; @@ -101,11 +103,13 @@ import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.PlayerDespawned; import net.runelite.api.events.PlayerMenuOptionsChanged; import net.runelite.api.events.PlayerSpawned; +import net.runelite.api.events.PostStructComposition; import net.runelite.api.events.ResizeableChanged; import net.runelite.api.events.StatChanged; import net.runelite.api.events.UsernameChanged; import net.runelite.api.events.VarbitChanged; import net.runelite.api.events.VolumeChanged; +import net.runelite.api.events.WidgetClosed; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.events.WorldChanged; import net.runelite.api.hooks.Callbacks; @@ -129,6 +133,7 @@ import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSEnumComposition; import net.runelite.rs.api.RSFriendSystem; import net.runelite.rs.api.RSIndexedSprite; +import net.runelite.rs.api.RSInterfaceParent; import net.runelite.rs.api.RSItemContainer; import net.runelite.rs.api.RSNPC; import net.runelite.rs.api.RSNode; @@ -137,7 +142,9 @@ import net.runelite.rs.api.RSNodeHashTable; import net.runelite.rs.api.RSPacketBuffer; import net.runelite.rs.api.RSPlayer; import net.runelite.rs.api.RSScene; +import net.runelite.rs.api.RSScriptEvent; import net.runelite.rs.api.RSSpritePixels; +import net.runelite.rs.api.RSStructComposition; import net.runelite.rs.api.RSTile; import net.runelite.rs.api.RSTileItem; import net.runelite.rs.api.RSUsername; @@ -727,24 +734,6 @@ public abstract class RSClientMixin implements RSClient setChatCycle(getCycleCntr()); } - @Inject - @Override - public Widget getViewportWidget() - { - if (isResized()) - { - if (getVar(Varbits.SIDE_PANELS) == 1) - { - return getWidget(WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE); - } - else - { - return getWidget(WidgetInfo.RESIZABLE_VIEWPORT_OLD_SCHOOL_BOX); - } - } - return getWidget(WidgetInfo.FIXED_VIEWPORT); - } - @Inject @Override public MenuEntry[] getMenuEntries() @@ -1565,24 +1554,23 @@ public abstract class RSClientMixin implements RSClient else if (widget.getContentType() == WidgetType.RECTANGLE) { if (renderX == client.getViewportXOffset() && renderY == client.getViewportYOffset() - && widget.getWidth() == client.getViewportWidth() && widget.getHeight() == client.getViewportHeight() + && widget.getWidth() == client.getViewportWidth() && widget.getHeight() == client.getViewportHeight() && widget.getOpacity() > 0 && widget.isFilled() && client.isGpu()) { int tc = widget.getTextColor(); - int alpha = widget.getOpacity() & 0xFF; - int inverseAlpha = 256 - alpha; - int vpc = viewportColor; - int c1 = (alpha * (tc & 0xff00ff) >> 8 & 0xFF00FF) + (alpha * (tc & 0x00FF00) >> 8 & 0x00FF00); - int c2 = (inverseAlpha * (vpc & 0xff00ff) >> 8 & 0xFF00FF) + (inverseAlpha * (vpc & 0x00FF00) >> 8 & 0x00FF00); - int outAlpha = alpha + ((vpc >>> 24) * (255 - alpha) * 0x8081 >>> 23); - viewportColor = outAlpha << 24 | c1 + c2; - widget.setHidden(true); - hiddenWidgets.add(widget); - continue; + int alpha = widget.getOpacity() & 0xFF; + int inverseAlpha = 256 - alpha; + int vpc = viewportColor; + int c1 = (alpha * (tc & 0xff00ff) >> 8 & 0xFF00FF) + (alpha * (tc & 0x00FF00) >> 8 & 0x00FF00); + int c2 = (inverseAlpha * (vpc & 0xff00ff) >> 8 & 0xFF00FF) + (inverseAlpha * (vpc & 0x00FF00) >> 8 & 0x00FF00); + int outAlpha = alpha + ((vpc >>> 24) * (255 - alpha) * 0x8081 >>> 23); + viewportColor = outAlpha << 24 | c1 + c2; + widget.setHidden(true); + hiddenWidgets.add(widget); + continue; } } - WidgetNode childNode = componentTable.get(widget.getId()); if (childNode != null) { @@ -2108,16 +2096,85 @@ public abstract class RSClientMixin implements RSClient @Inject @Override - public VarbitComposition getVarbit(int id) + public ScriptEvent createScriptEvent(Object... args) { - return getVarbitDefinition(id); + return createRSScriptEvent(args); } @Inject @Override - public int getViewportColor() + public RSScriptEvent createRSScriptEvent(Object... args) { - return viewportColor; + RSScriptEvent event = createScriptEvent(); + event.setArguments(args); + return event; + } + + @Inject + @Override + public NodeCache getStructCompositionCache() + { + assert client.isClientThread() : "getStructCompositionCache must be called on client thread"; + + return getRSStructCompositionCache(); + } + + @Inject + @Override + public StructComposition getStructComposition(int structID) + { + assert client.isClientThread() : "getStructComposition must be called on client thread"; + + return getRSStructComposition(structID); + } + + @Copy("StructDefinition_getStructDefinition") + @Replace("StructDefinition_getStructDefinition") + @SuppressWarnings("InfiniteRecursion") + static RSStructComposition copy$getStructComposition(int id) + { + RSStructComposition comp = copy$getStructComposition(id); + + if (comp.getId() == -1) + { + comp.setId(id); + PostStructComposition event = new PostStructComposition(); + event.setStructComposition(comp); + client.getCallbacks().post(event); + } + + return comp; + } + + @Inject + @Override + public int getMusicVolume() + { + return client.getPreferences().getMusicVolume(); + } + + @Inject + @Override + public void setMusicVolume(int volume) + { + if (volume > 0 && client.getPreferences().getMusicVolume() <= 0 && client.getCurrentTrackGroupId() != -1) + { + client.playMusicTrack(1000, client.getMusicTracks(), client.getCurrentTrackGroupId(), 0, volume, false); + } + + client.getPreferences().setMusicVolume(volume); + client.setMusicTrackVolume(volume); + if (client.getMidiPcmStream() != null) + { + client.getMidiPcmStream().setPcmStreamVolume(volume); + } + } + + @Inject + @MethodHook("closeInterface") + public static void preCloseInterface(RSInterfaceParent iface, boolean willUnload) + { + client.getCallbacks().post(new WidgetClosed(iface.getId(), iface.getModalMode(), willUnload)); } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientPreferencesMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientPreferencesMixin.java deleted file mode 100644 index bada618176..0000000000 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientPreferencesMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.runelite.mixins; - -import net.runelite.api.mixins.Inject; -import net.runelite.api.mixins.Mixin; -import net.runelite.api.mixins.Shadow; -import net.runelite.rs.api.RSClient; -import net.runelite.rs.api.RSClientPreferences; - -@Mixin(RSClientPreferences.class) -public abstract class RSClientPreferencesMixin implements RSClientPreferences -{ - @Shadow("client") - private static RSClient client; - - @Inject - @Override - public void setClientMusicVolume(int volume) - { - if (volume > 0 && client.getPreferences().getMusicVolume() <= 0 && client.getCurrentTrackGroupId() != -1) - { - client.playMusicTrack(1000, client.getMusicTracks(), client.getCurrentTrackGroupId(), 0, volume, false); - } - - client.getPreferences().setMusicVolume(volume); - client.setMusicTrackVolume(volume); - if (client.getMidiPcmStream() != null) - { - client.getMidiPcmStream().setPcmStreamVolume(volume); - } - } -} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java index eda0eabfed..7ef5b558bb 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSGameShellMixin.java @@ -42,6 +42,9 @@ public abstract class RSGameShellMixin implements RSGameShell @Shadow("client") private static RSClient client; + @Shadow("viewportColor") + private static int viewportColor; + @Inject private Thread thread; @@ -83,7 +86,7 @@ public abstract class RSGameShellMixin implements RSGameShell DrawCallbacks drawCallbacks = client.getDrawCallbacks(); if (drawCallbacks != null) { - drawCallbacks.draw(client.getViewportColor()); + drawCallbacks.draw(viewportColor); } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSParamCompositionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSParamCompositionMixin.java new file mode 100644 index 0000000000..d5d3a90f60 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSParamCompositionMixin.java @@ -0,0 +1,16 @@ +package net.runelite.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSParamComposition; + +@Mixin(RSParamComposition.class) +public abstract class RSParamCompositionMixin implements RSParamComposition +{ + @Inject + @Override + public boolean isString() + { + return getType() == 's'; + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSScriptEventMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSScriptEventMixin.java new file mode 100644 index 0000000000..33a30fa81a --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSScriptEventMixin.java @@ -0,0 +1,21 @@ +package net.runelite.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSScriptEvent; + +@Mixin(RSScriptEvent.class) +public abstract class RSScriptEventMixin implements RSScriptEvent +{ + @Shadow("client") + private static RSClient client; + + @Inject + @Override + public void run() + { + client.runScriptEvent(this); + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSStructCompositionMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSStructCompositionMixin.java new file mode 100644 index 0000000000..63a0690439 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSStructCompositionMixin.java @@ -0,0 +1,26 @@ +package net.runelite.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSStructComposition; + +@Mixin(RSStructComposition.class) +public abstract class RSStructCompositionMixin implements RSStructComposition +{ + @Inject + private int id = -1; + + @Inject + @Override + public int getId() + { + return id; + } + + @Inject + @Override + public void setId(int id) + { + this.id = id; + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index dbcd39e347..c940376ba4 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -28,7 +28,6 @@ import net.runelite.api.HashTable; import net.runelite.api.Node; import net.runelite.api.Point; import net.runelite.api.WidgetNode; -import net.runelite.api.events.WidgetHiddenChanged; import net.runelite.api.events.WidgetPositioned; import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.FieldHook; @@ -410,78 +409,6 @@ public abstract class RSWidgetMixin implements RSWidget return bounds != null && bounds.contains(new java.awt.Point(point.getX(), point.getY())); } - @Inject - @Override - public void broadcastHidden(boolean hidden) - { - WidgetHiddenChanged event = new WidgetHiddenChanged(); - event.setWidget(this); - event.setHidden(hidden); - - client.getCallbacks().post(event); - - RSWidget[] children = getChildren(); - - if (children != null) - { - // recursive through children - for (RSWidget child : children) - { - // if the widget is hidden it will not magically unhide from its parent changing - if (child == null || child.isSelfHidden()) - { - continue; - } - - child.broadcastHidden(hidden); - } - } - - // make sure we iterate nested children as well - // cannot be null - Widget[] nestedChildren = getNestedChildren(); - - for (Widget nestedChild : nestedChildren) - { - if (nestedChild == null || nestedChild.isSelfHidden()) - { - continue; - } - - ((RSWidget) nestedChild).broadcastHidden(hidden); - } - } - - @FieldHook("isHidden") - @Inject - public void onHiddenChanged(int idx) - { - int id = getId(); - - if (id == -1) - { - return; - } - - Widget parent = getParent(); - - // if the parent is hidden then changes in this widget don't have any visual effect - // so ignore them - if (parent != null) - { - if (parent.isHidden()) - { - return; - } - } - else if (TO_GROUP(id) != client.getWidgetRoot()) - { - return; - } - - broadcastHidden(isSelfHidden()); - } - @FieldHook("y") @Inject public void onPositionChanged(int idx) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java index 6f8af59204..c6c50846f6 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/ScriptVMMixin.java @@ -27,7 +27,7 @@ package net.runelite.mixins; import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.runelite.api.Client; +import static net.runelite.api.Opcodes.*; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptPostFired; import net.runelite.api.events.ScriptPreFired; @@ -40,13 +40,12 @@ import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSScript; import net.runelite.rs.api.RSScriptEvent; -import static net.runelite.api.Opcodes.*; @Mixin(RSClient.class) public abstract class ScriptVMMixin implements RSClient { @Shadow("client") - private static Client client; + private static RSClient client; @Inject private static RSScript currentScript; @@ -172,11 +171,44 @@ public abstract class ScriptVMMixin implements RSClient @Override public void runScript(Object... args) { - assert isClientThread(); - assert currentScript == null; - assert args[0] instanceof Integer || args[0] instanceof JavaScriptCallback : "The first argument should always be a ScriptID!"; - RSScriptEvent se = createScriptEvent(); - se.setArguments(args); - runScript(se, 5000000); + runScriptEvent(createRSScriptEvent(args)); + } + + @Inject + @Override + public void runScriptEvent(RSScriptEvent event) + { + assert isClientThread() : "runScriptEvent must be called on client thread"; + assert currentScript == null : "scripts are not reentrant"; + runScript(event, 5000000); + boolean assertionsEnabled = false; + assert assertionsEnabled = true; + + Object[] args = event.getArguments(); + if (assertionsEnabled && args[0] instanceof Integer) + { + int scriptId = (int) args[0]; + RSScript script = (RSScript) client.getScriptCache().get(scriptId); + + if (script != null) + { + int intCount = 0, stringCount = 0; + for (int i = 1; i < args.length; i++) + { + if (args[i] instanceof Integer) + { + intCount++; + } + else + { + stringCount++; + } + } + + assert script.getIntArgumentCount() == intCount && script.getStringArgumentCount() == stringCount : + "Script " + scriptId + " was called with the incorrect number of arguments; takes " + + script.getIntArgumentCount() + "+" + script.getStringArgumentCount() + ", got " + intCount + "+" + stringCount; + } + } } } \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java index 12c3997263..26fc556f90 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java @@ -2,6 +2,7 @@ package net.runelite.mixins; import net.runelite.api.VarClientInt; import net.runelite.api.VarClientStr; +import net.runelite.api.VarbitComposition; import net.runelite.api.Varbits; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -55,7 +56,7 @@ public abstract class VarbitMixin implements RSClient @Inject @Override - public RSVarbitComposition getVarbitDefinition(int id) + public RSVarbitComposition getVarbitComposition(int id) { assert client.isClientThread() : "getVarbitDefinition must be called on client thread"; @@ -78,7 +79,7 @@ public abstract class VarbitMixin implements RSClient { assert client.isClientThread(); - RSVarbitComposition v = getVarbitDefinition(varbitId); + RSVarbitComposition v = getVarbitComposition(varbitId); if (v == null) { throw new IndexOutOfBoundsException("Varbit " + varbitId + " does not exist!"); // oob for "backwards compatibility lol" @@ -95,7 +96,7 @@ public abstract class VarbitMixin implements RSClient @Override public void setVarbitValue(int[] varps, int varbitId, int value) { - RSVarbitComposition v = getVarbitDefinition(varbitId); + RSVarbitComposition v = getVarbitComposition(varbitId); if (v == null) { throw new IndexOutOfBoundsException(String.format("Varbit %d does not exist!", varbitId)); // oob for "backwards compatibility lol" @@ -161,4 +162,11 @@ public abstract class VarbitMixin implements RSClient { return getVarcs().getVarcMap(); } + + @Inject + @Override + public VarbitComposition getVarbit(int id) + { + return getVarbitComposition(id); + } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index 148e635658..90d9cb0779 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -1320,4 +1320,34 @@ public interface RSClient extends RSGameShell, Client @Import("scriptActiveWidget") RSWidget getScriptActiveWidget(); + + @Import("scriptDotWidget") + RSWidget getScriptDotWidget(); + + RSScriptEvent createRSScriptEvent(Object... args); + + void runScriptEvent(RSScriptEvent event); + + @Import("Script_cached") + RSEvictingDualNodeHashTable getScriptCache(); + + @Import("StructDefinition_cached") + RSEvictingDualNodeHashTable getRSStructCompositionCache(); + + @Import("StructDefinition_getStructDefinition") + RSStructComposition getRSStructComposition(int id); + + @Import("getParamDefinition") + RSParamComposition getRSParamComposition(int id); + + @Construct + RSIntegerNode newIntegerNode(int contents); + + @Construct + RSObjectNode newObjectNode(Object contents); + + @Construct + RSIterableNodeHashTable newIterableNodeHashTable(int size); + + RSVarbitComposition getVarbitComposition(int id); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java index edb36c8e72..9eaecdee24 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClientPreferences.java @@ -30,7 +30,6 @@ public interface RSClientPreferences extends Preferences void setAreaSoundEffectVolume(int i); @Import("musicVolume") - @Override int getMusicVolume(); @Import("musicVolume") diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java index f89d359baf..76d7909db2 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSInterfaceParent.java @@ -8,4 +8,8 @@ public interface RSInterfaceParent extends RSNode, WidgetNode @Import("group") @Override int getId(); + + @Import("type") + @Override + int getModalMode(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java index 4575fc6299..90c8b3bc89 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSItemComposition.java @@ -84,4 +84,10 @@ public interface RSItemComposition extends ItemComposition @Import("retextureTo") short[] getTextureToReplaceWith(); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java index 3d8c5efab0..352dfebf03 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSIterableNodeHashTable.java @@ -1,6 +1,7 @@ package net.runelite.rs.api; import net.runelite.api.IterableHashTable; +import net.runelite.api.Node; import net.runelite.mapping.Import; public interface RSIterableNodeHashTable extends IterableHashTable @@ -8,4 +9,8 @@ public interface RSIterableNodeHashTable extends IterableHashTable @Import("get") @Override RSNode get(long hash); + + @Import("put") + @Override + void put(Node node, long hash); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java index 41e9a15942..adeb25cab7 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNPCComposition.java @@ -59,4 +59,10 @@ public interface RSNPCComposition extends NPCComposition @Import("headIconPrayer") int getRsOverheadIcon(); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java index 254af94bc4..5b9dd8ae19 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java @@ -32,4 +32,10 @@ public interface RSObjectComposition extends ObjectComposition @Import("transform") @Override RSObjectComposition getImpostor(); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java index feba04d142..4883bc0db9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectNode.java @@ -1,3 +1,9 @@ package net.runelite.rs.api; -public interface RSObjectNode {} +import net.runelite.mapping.Import; + +public interface RSObjectNode extends RSNode +{ + @Import("obj") + Object getValue(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSParamComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSParamComposition.java new file mode 100644 index 0000000000..bb340d575f --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSParamComposition.java @@ -0,0 +1,17 @@ +package net.runelite.rs.api; + +import net.runelite.mapping.Import; + +public interface RSParamComposition +{ + boolean isString(); + + @Import("type") + char getType(); + + @Import("defaultInt") + int getDefaultInt(); + + @Import("defaultStr") + String getDefaultStr(); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSParamDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSParamDefinition.java deleted file mode 100644 index e01e7f14e3..0000000000 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSParamDefinition.java +++ /dev/null @@ -1,3 +0,0 @@ -package net.runelite.rs.api; - -public interface RSParamDefinition {} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java index 7a1c730f5a..7a7551a5b9 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScript.java @@ -12,4 +12,10 @@ public interface RSScript extends Script, RSDualNode @Import("opcodes") @Override int[] getInstructions(); + + @Import("intArgumentCount") + int getIntArgumentCount(); + + @Import("stringArgumentCount") + int getStringArgumentCount(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java index 63d9b5f23a..7c2dfc8e00 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSScriptEvent.java @@ -43,6 +43,9 @@ public interface RSScriptEvent extends ScriptEvent @Import("widget") Widget getSource(); + @Import("widget") + RSScriptEvent setSource(Widget widget); + @Import("opIndex") int getOp(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSStructComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSStructComposition.java new file mode 100644 index 0000000000..4016e536f6 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSStructComposition.java @@ -0,0 +1,16 @@ +package net.runelite.rs.api; + +import net.runelite.api.StructComposition; +import net.runelite.mapping.Import; + +public interface RSStructComposition extends StructComposition +{ + int getId(); + void setId(int id); + + @Import("params") + RSIterableNodeHashTable getParams(); + + @Import("params") + void setParams(RSIterableNodeHashTable params); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSStructDefinition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSStructDefinition.java deleted file mode 100644 index 157caf32f4..0000000000 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSStructDefinition.java +++ /dev/null @@ -1,3 +0,0 @@ -package net.runelite.rs.api; - -public interface RSStructDefinition {} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java index 7f08e6cdbd..ace10f8461 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSWidget.java @@ -345,8 +345,6 @@ public interface RSWidget extends Widget @Import("paddingY") int getYPitch(); - void broadcastHidden(boolean hidden); - @Import("onOp") @Override void setOnOpListener(Object... args); @@ -570,4 +568,24 @@ public interface RSWidget extends Widget @Import("onClick") @Override void setOnClickListener(Object[] o); + + @Import("onDragComplete") + @Override + void setOnDragCompleteListener(Object[] o); + + @Import("onDrag") + @Override + void setOnDragListener(Object[] o); + + @Import("parent") + @Override + RSWidget getDragParent(); + + @Import("parent") + @Override + void setDragParent(Widget dragParent); + + @Import("onVarTransmit") + @Override + void setOnVarTransmitListener(Object[] o); } \ No newline at end of file diff --git a/runescape-client/src/main/java/AbstractWorldMapIcon.java b/runescape-client/src/main/java/AbstractWorldMapIcon.java index d8a8054a5d..c3ab085c59 100644 --- a/runescape-client/src/main/java/AbstractWorldMapIcon.java +++ b/runescape-client/src/main/java/AbstractWorldMapIcon.java @@ -178,19 +178,19 @@ public abstract class AbstractWorldMapIcon { garbageValue = "5" ) @Export("StructDefinition_getStructDefinition") - public static StructDefinition StructDefinition_getStructDefinition(int var0) { - StructDefinition var1 = (StructDefinition)StructDefinition.StructDefinition_cached.get((long)var0); // L: 23 + public static StructComposition StructDefinition_getStructDefinition(int var0) { + StructComposition var1 = (StructComposition) StructComposition.StructDefinition_cached.get((long)var0); // L: 23 if (var1 != null) { // L: 24 return var1; } else { - byte[] var2 = StructDefinition.StructDefinition_archive.takeFile(34, var0); // L: 25 - var1 = new StructDefinition(); // L: 26 + byte[] var2 = StructComposition.StructDefinition_archive.takeFile(34, var0); // L: 25 + var1 = new StructComposition(); // L: 26 if (var2 != null) { // L: 27 var1.decode(new Buffer(var2)); } var1.postDecode(); // L: 28 - StructDefinition.StructDefinition_cached.put(var1, (long)var0); // L: 29 + StructComposition.StructDefinition_cached.put(var1, (long)var0); // L: 29 return var1; // L: 30 } } diff --git a/runescape-client/src/main/java/Canvas.java b/runescape-client/src/main/java/Canvas.java index 6598a0ec55..5d60bc2c12 100644 --- a/runescape-client/src/main/java/Canvas.java +++ b/runescape-client/src/main/java/Canvas.java @@ -274,7 +274,7 @@ public final class Canvas extends java.awt.Canvas { ObjectComposition.ObjectDefinition_modelsArchive = var4; // L: 1917 ObjectComposition.ObjectDefinition_isLowDetail = var17; // L: 1918 World.method1849(DynamicObject.archive2, BuddyRankComparator.archive7); // L: 1920 - ParamDefinition.method4526(DynamicObject.archive2); // L: 1921 + ParamComposition.method4526(DynamicObject.archive2); // L: 1921 Actor.method1821(DynamicObject.archive2, BuddyRankComparator.archive7, Client.isMembersWorld, class297.fontPlain11); // L: 1922 PcmPlayer.method2538(DynamicObject.archive2, SceneTilePaint.archive0, WorldMapSprite.archive1); // L: 1923 ModelData0.method3331(DynamicObject.archive2, BuddyRankComparator.archive7); // L: 1924 @@ -294,7 +294,7 @@ public final class Canvas extends java.awt.Canvas { class195.Widget_loadedInterfaces = new boolean[class58.Widget_archive.getGroupCount()]; // L: 1941 Archive var11 = DynamicObject.archive2; // L: 1943 InvDefinition.InvDefinition_archive = var11; // L: 1945 - StructDefinition.method4545(DynamicObject.archive2); // L: 1947 + StructComposition.method4545(DynamicObject.archive2); // L: 1947 ModelData0.method3330(DynamicObject.archive2); // L: 1948 class13.method129(DynamicObject.archive2); // L: 1949 Varcs.varcs = new Varcs(); // L: 1950 diff --git a/runescape-client/src/main/java/ChatChannel.java b/runescape-client/src/main/java/ChatChannel.java index 08574b23de..6120a77d72 100644 --- a/runescape-client/src/main/java/ChatChannel.java +++ b/runescape-client/src/main/java/ChatChannel.java @@ -109,19 +109,19 @@ public class ChatChannel { garbageValue = "1207819240" ) @Export("getParamDefinition") - public static ParamDefinition getParamDefinition(int var0) { - ParamDefinition var1 = (ParamDefinition)ParamDefinition.ParamDefinition_cached.get((long)var0); // L: 25 + public static ParamComposition getParamDefinition(int var0) { + ParamComposition var1 = (ParamComposition) ParamComposition.ParamDefinition_cached.get((long)var0); // L: 25 if (var1 != null) { // L: 26 return var1; } else { - byte[] var2 = ParamDefinition.ParamDefinition_archive.takeFile(11, var0); // L: 27 - var1 = new ParamDefinition(); // L: 28 + byte[] var2 = ParamComposition.ParamDefinition_archive.takeFile(11, var0); // L: 27 + var1 = new ParamComposition(); // L: 28 if (var2 != null) { // L: 29 var1.decode(new Buffer(var2)); } var1.postDecode(); // L: 30 - ParamDefinition.ParamDefinition_cached.put(var1, (long)var0); // L: 31 + ParamComposition.ParamDefinition_cached.put(var1, (long)var0); // L: 31 return var1; // L: 32 } } diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index 1e5c93adcf..69fafe983f 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -5098,9 +5098,9 @@ public final class Client extends GameShell implements Usernamed { field707 = (field707 + 1) % 100; // L: 6209 String var34 = AbstractFont.escapeBrackets(ServerPacket.method3663(AttackOption.method2135(var3))); // L: 6210 if (var60.modIcon != -1) { // L: 6211 - UserComparator10.addChatMessage(9, class25.method248(var60.modIcon) + var38, var34, ParamDefinition.base37DecodeLong(var22)); + UserComparator10.addChatMessage(9, class25.method248(var60.modIcon) + var38, var34, ParamComposition.base37DecodeLong(var22)); } else { - UserComparator10.addChatMessage(9, var38, var34, ParamDefinition.base37DecodeLong(var22)); // L: 6212 + UserComparator10.addChatMessage(9, var38, var34, ParamComposition.base37DecodeLong(var22)); // L: 6212 } } diff --git a/runescape-client/src/main/java/DynamicObject.java b/runescape-client/src/main/java/DynamicObject.java index 6bef8a7cfa..ff8cf6f652 100644 --- a/runescape-client/src/main/java/DynamicObject.java +++ b/runescape-client/src/main/java/DynamicObject.java @@ -93,7 +93,7 @@ public class DynamicObject extends Renderable this.x = var5; // L: 24 this.y = var6; // L: 25 if (var7 != -1) { // L: 26 - this.sequenceDefinition = ParamDefinition.SequenceDefinition_get(var7); // L: 27 + this.sequenceDefinition = ParamComposition.SequenceDefinition_get(var7); // L: 27 this.frame = 0; // L: 28 this.cycleStart = Client.cycle - 1; // L: 29 if (this.sequenceDefinition.field3548 == 0 && var9 != null && var9 instanceof DynamicObject) { // L: 30 diff --git a/runescape-client/src/main/java/EnumComposition.java b/runescape-client/src/main/java/EnumComposition.java index 814d22e1d6..1eb35168ef 100644 --- a/runescape-client/src/main/java/EnumComposition.java +++ b/runescape-client/src/main/java/EnumComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jx") -@Implements("EnumDefinition") +@Implements("EnumComposition") public class EnumComposition extends DualNode { @ObfuscatedName("rk") @ObfuscatedGetter( diff --git a/runescape-client/src/main/java/FontName.java b/runescape-client/src/main/java/FontName.java index d136a76b55..a4562658d8 100644 --- a/runescape-client/src/main/java/FontName.java +++ b/runescape-client/src/main/java/FontName.java @@ -596,7 +596,7 @@ public class FontName { CollisionMap.invalidateWidget(var10); } } else { - SequenceDefinition var47 = ParamDefinition.SequenceDefinition_get(var20); // L: 9272 + SequenceDefinition var47 = ParamComposition.SequenceDefinition_get(var20); // L: 9272 var41 = var10.getModel(var47, var10.modelFrame, var36, PlayerComposition.localPlayer.appearance); // L: 9273 if (var41 == null && Widget.field2603) { // L: 9274 CollisionMap.invalidateWidget(var10); diff --git a/runescape-client/src/main/java/Frames.java b/runescape-client/src/main/java/Frames.java index ed78f2a295..5a85512a43 100644 --- a/runescape-client/src/main/java/Frames.java +++ b/runescape-client/src/main/java/Frames.java @@ -96,7 +96,7 @@ public class Frames extends DualNode { if (var0 != ScriptOpcodes.CC_CALLONRESIZE && var0 != ScriptOpcodes.IF_CALLONRESIZE) { // L: 1145 int var4; if (var0 == 1928) { // L: 1162 - var6 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 1163 + var6 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1163 var4 = Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]; // L: 1164 if (var4 >= 1 && var4 <= 10) { // L: 1165 class3.widgetDefaultMenuAction(var4, var6.id, var6.childIndex, var6.itemId, ""); // L: 1168 @@ -124,7 +124,7 @@ public class Frames extends DualNode { if (var0 >= 2000) { // L: 1150 var6 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 1151 } else { - var6 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 1153 + var6 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1153 } if (var6.onResize == null) { // L: 1154 diff --git a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java index d27b6ea178..ceb4604b4e 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferUnitPriceComparator.java @@ -75,7 +75,7 @@ final class GrandExchangeOfferUnitPriceComparator implements Comparator { garbageValue = "-613147121" ) static int method200(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 1041 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1041 if (var0 == ScriptOpcodes.CC_GETSCROLLX) { // L: 1042 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = var3.scrollX; // L: 1043 return 1; // L: 1044 diff --git a/runescape-client/src/main/java/GraphicsObject.java b/runescape-client/src/main/java/GraphicsObject.java index ad2271dea2..39dfdb58ae 100644 --- a/runescape-client/src/main/java/GraphicsObject.java +++ b/runescape-client/src/main/java/GraphicsObject.java @@ -81,7 +81,7 @@ public final class GraphicsObject extends Renderable int var8 = TileItem.SpotAnimationDefinition_get(this.id).sequence; // L: 27 if (var8 != -1) { // L: 28 this.isFinished = false; // L: 29 - this.sequenceDefinition = ParamDefinition.SequenceDefinition_get(var8); // L: 30 + this.sequenceDefinition = ParamComposition.SequenceDefinition_get(var8); // L: 30 } else { this.isFinished = true; // L: 32 } diff --git a/runescape-client/src/main/java/HorizontalAlignment.java b/runescape-client/src/main/java/HorizontalAlignment.java index 7ee117bd51..992a76edc9 100644 --- a/runescape-client/src/main/java/HorizontalAlignment.java +++ b/runescape-client/src/main/java/HorizontalAlignment.java @@ -148,7 +148,7 @@ public enum HorizontalAlignment implements Enumerated { return 1; // L: 3442 } else { int var4; - ParamDefinition var5; + ParamComposition var5; if (var0 == ScriptOpcodes.NC_PARAM) { // L: 3444 VarcInt.Interpreter_intStackSize -= 2; // L: 3445 var3 = Interpreter.Interpreter_intStack[VarcInt.Interpreter_intStackSize]; // L: 3446 diff --git a/runescape-client/src/main/java/ItemComposition.java b/runescape-client/src/main/java/ItemComposition.java index 508edaa1f7..010bbcff13 100644 --- a/runescape-client/src/main/java/ItemComposition.java +++ b/runescape-client/src/main/java/ItemComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jq") -@Implements("ItemDefinition") +@Implements("ItemComposition") public class ItemComposition extends DualNode { @ObfuscatedName("p") @Export("ItemDefinition_inMembersWorld") diff --git a/runescape-client/src/main/java/Messages.java b/runescape-client/src/main/java/Messages.java index d5ff5af2a5..9ef82f2c62 100644 --- a/runescape-client/src/main/java/Messages.java +++ b/runescape-client/src/main/java/Messages.java @@ -63,7 +63,7 @@ public class Messages { garbageValue = "-729014462" ) static int method2283(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 1012 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1012 if (var0 == ScriptOpcodes.CC_GETX) { // L: 1013 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = var3.x; // L: 1014 return 1; // L: 1015 diff --git a/runescape-client/src/main/java/ModeWhere.java b/runescape-client/src/main/java/ModeWhere.java index aa90cb4d63..99c3e2d6b8 100644 --- a/runescape-client/src/main/java/ModeWhere.java +++ b/runescape-client/src/main/java/ModeWhere.java @@ -131,7 +131,7 @@ public enum ModeWhere implements Enumerated { var0 -= 1000; // L: 948 var3 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 949 } else { - var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 951 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 951 } String var4 = Interpreter.Interpreter_stringStack[--Interpreter.Interpreter_stringStackSize]; // L: 952 diff --git a/runescape-client/src/main/java/NPC.java b/runescape-client/src/main/java/NPC.java index f82a5c4de0..8f30d2b937 100644 --- a/runescape-client/src/main/java/NPC.java +++ b/runescape-client/src/main/java/NPC.java @@ -71,7 +71,7 @@ public final class NPC extends Actor { --var4; // L: 35 } - if (super.sequence != -1 && ParamDefinition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 37 + if (super.sequence != -1 && ParamComposition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 37 super.sequence = -1; } @@ -96,7 +96,7 @@ public final class NPC extends Actor { garbageValue = "-169739231" ) final void method2106(int var1, int var2, boolean var3) { - if (super.sequence != -1 && ParamDefinition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 50 + if (super.sequence != -1 && ParamComposition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 50 super.sequence = -1; } @@ -140,8 +140,8 @@ public final class NPC extends Actor { if (this.definition == null) { // L: 77 return null; } else { - SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamDefinition.SequenceDefinition_get(super.sequence) : null; // L: 78 - SequenceDefinition var2 = super.movementSequence != -1 && (super.idleSequence != super.movementSequence || var1 == null) ? ParamDefinition.SequenceDefinition_get(super.movementSequence) : null; // L: 79 + SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamComposition.SequenceDefinition_get(super.sequence) : null; // L: 78 + SequenceDefinition var2 = super.movementSequence != -1 && (super.idleSequence != super.movementSequence || var1 == null) ? ParamComposition.SequenceDefinition_get(super.movementSequence) : null; // L: 79 Model var3 = this.definition.getModel(var1, super.sequenceFrame, var2, super.movementFrame); // L: 80 if (var3 == null) { return null; diff --git a/runescape-client/src/main/java/NPCComposition.java b/runescape-client/src/main/java/NPCComposition.java index b5f6f85d01..70c8521202 100644 --- a/runescape-client/src/main/java/NPCComposition.java +++ b/runescape-client/src/main/java/NPCComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jd") -@Implements("NPCDefinition") +@Implements("NPCComposition") public class NPCComposition extends DualNode { @ObfuscatedName("h") @ObfuscatedSignature( diff --git a/runescape-client/src/main/java/ObjectComposition.java b/runescape-client/src/main/java/ObjectComposition.java index 9171913f44..c4f4028c87 100644 --- a/runescape-client/src/main/java/ObjectComposition.java +++ b/runescape-client/src/main/java/ObjectComposition.java @@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jm") -@Implements("ObjectDefinition") +@Implements("ObjectComposition") public class ObjectComposition extends DualNode { @ObfuscatedName("h") @Export("ObjectDefinition_isLowDetail") diff --git a/runescape-client/src/main/java/ParamDefinition.java b/runescape-client/src/main/java/ParamComposition.java similarity index 96% rename from runescape-client/src/main/java/ParamDefinition.java rename to runescape-client/src/main/java/ParamComposition.java index 9d9e906218..286aa3b34a 100644 --- a/runescape-client/src/main/java/ParamDefinition.java +++ b/runescape-client/src/main/java/ParamComposition.java @@ -5,8 +5,8 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jl") -@Implements("ParamDefinition") -public class ParamDefinition extends DualNode { +@Implements("ParamComposition") +public class ParamComposition extends DualNode { @ObfuscatedName("h") @ObfuscatedSignature( descriptor = "Lib;" @@ -39,7 +39,7 @@ public class ParamDefinition extends DualNode { ParamDefinition_cached = new EvictingDualNodeHashTable(64); // L: 12 } - ParamDefinition() { + ParamComposition() { this.autoDisable = true; // L: 16 } // L: 18 @@ -120,7 +120,7 @@ public class ParamDefinition extends DualNode { garbageValue = "1899658312" ) public static void method4526(AbstractArchive var0) { - StructDefinition.StructDefinition_archive = var0; // L: 19 + StructComposition.StructDefinition_archive = var0; // L: 19 } // L: 20 @ObfuscatedName("v") diff --git a/runescape-client/src/main/java/Player.java b/runescape-client/src/main/java/Player.java index 91290450b8..fd66ee817f 100644 --- a/runescape-client/src/main/java/Player.java +++ b/runescape-client/src/main/java/Player.java @@ -384,8 +384,8 @@ public final class Player extends Actor { if (this.appearance == null) { // L: 149 return null; } else { - SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamDefinition.SequenceDefinition_get(super.sequence) : null; // L: 150 - SequenceDefinition var2 = super.movementSequence == -1 || this.isUnanimated || super.idleSequence == super.movementSequence && var1 != null ? null : ParamDefinition.SequenceDefinition_get(super.movementSequence); // L: 151 + SequenceDefinition var1 = super.sequence != -1 && super.sequenceDelay == 0 ? ParamComposition.SequenceDefinition_get(super.sequence) : null; // L: 150 + SequenceDefinition var2 = super.movementSequence == -1 || this.isUnanimated || super.idleSequence == super.movementSequence && var1 != null ? null : ParamComposition.SequenceDefinition_get(super.movementSequence); // L: 151 Model var3 = this.appearance.getModel(var1, super.sequenceFrame, var2, super.movementFrame); // L: 152 if (var3 == null) { // L: 153 return null; @@ -451,7 +451,7 @@ public final class Player extends Actor { garbageValue = "1635620178" ) final void method1313(int var1, int var2, byte var3) { - if (super.sequence != -1 && ParamDefinition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 199 + if (super.sequence != -1 && ParamComposition.SequenceDefinition_get(super.sequence).field3555 == 1) { // L: 199 super.sequence = -1; } diff --git a/runescape-client/src/main/java/PlayerComposition.java b/runescape-client/src/main/java/PlayerComposition.java index c3c875a7df..76c7f06d42 100644 --- a/runescape-client/src/main/java/PlayerComposition.java +++ b/runescape-client/src/main/java/PlayerComposition.java @@ -37,7 +37,8 @@ public class PlayerComposition @ObfuscatedSignature( descriptor = "Lhe;" ) - static Widget field2561; + @Export("scriptDotWidget") + static Widget scriptDotWidget; @ObfuscatedName("kn") @ObfuscatedSignature( descriptor = "Lbq;" diff --git a/runescape-client/src/main/java/Projectile.java b/runescape-client/src/main/java/Projectile.java index 055ed7e6ab..4a52eab604 100644 --- a/runescape-client/src/main/java/Projectile.java +++ b/runescape-client/src/main/java/Projectile.java @@ -150,7 +150,7 @@ public final class Projectile extends Renderable this.isMoving = false; // L: 47 int var12 = TileItem.SpotAnimationDefinition_get(this.id).sequence; // L: 48 if (var12 != -1) { // L: 49 - this.sequenceDefinition = ParamDefinition.SequenceDefinition_get(var12); + this.sequenceDefinition = ParamComposition.SequenceDefinition_get(var12); } else { this.sequenceDefinition = null; // L: 50 } diff --git a/runescape-client/src/main/java/SceneTilePaint.java b/runescape-client/src/main/java/SceneTilePaint.java index 89f945d96e..f6c6f7ec56 100644 --- a/runescape-client/src/main/java/SceneTilePaint.java +++ b/runescape-client/src/main/java/SceneTilePaint.java @@ -74,7 +74,7 @@ public final class SceneTilePaint var0.isWalking = false; // L: 4080 SequenceDefinition var1; if (var0.movementSequence != -1) { // L: 4081 - var1 = ParamDefinition.SequenceDefinition_get(var0.movementSequence); // L: 4082 + var1 = ParamComposition.SequenceDefinition_get(var0.movementSequence); // L: 4082 if (var1 != null && var1.frameIds != null) { // L: 4083 ++var0.movementFrameCycle; // L: 4084 if (var0.movementFrame < var1.frameIds.length && var0.movementFrameCycle > var1.frameLengths[var0.movementFrame]) { // L: 4085 @@ -100,7 +100,7 @@ public final class SceneTilePaint int var3 = TileItem.SpotAnimationDefinition_get(var0.spotAnimation).sequence; // L: 4100 if (var3 != -1) { // L: 4101 - SequenceDefinition var2 = ParamDefinition.SequenceDefinition_get(var3); // L: 4102 + SequenceDefinition var2 = ParamComposition.SequenceDefinition_get(var3); // L: 4102 if (var2 != null && var2.frameIds != null) { // L: 4103 ++var0.spotAnimationFrameCycle; // L: 4104 if (var0.spotAnimationFrame < var2.frameIds.length && var0.spotAnimationFrameCycle > var2.frameLengths[var0.spotAnimationFrame]) { // L: 4105 @@ -121,7 +121,7 @@ public final class SceneTilePaint } if (var0.sequence != -1 && var0.sequenceDelay <= 1) { // L: 4118 - var1 = ParamDefinition.SequenceDefinition_get(var0.sequence); // L: 4119 + var1 = ParamComposition.SequenceDefinition_get(var0.sequence); // L: 4119 if (var1.field3560 == 1 && var0.field996 > 0 && var0.field984 <= Client.cycle && var0.field973 < Client.cycle) { // L: 4120 4121 var0.sequenceDelay = 1; // L: 4122 return; // L: 4123 @@ -129,7 +129,7 @@ public final class SceneTilePaint } if (var0.sequence != -1 && var0.sequenceDelay == 0) { // L: 4127 - var1 = ParamDefinition.SequenceDefinition_get(var0.sequence); // L: 4128 + var1 = ParamComposition.SequenceDefinition_get(var0.sequence); // L: 4128 if (var1 != null && var1.frameIds != null) { // L: 4129 ++var0.sequenceFrameCycle; // L: 4130 if (var0.sequenceFrame < var1.frameIds.length && var0.sequenceFrameCycle > var1.frameLengths[var0.sequenceFrame]) { // L: 4131 diff --git a/runescape-client/src/main/java/ScriptFrame.java b/runescape-client/src/main/java/ScriptFrame.java index 995fd9cfcb..5b7d46d369 100644 --- a/runescape-client/src/main/java/ScriptFrame.java +++ b/runescape-client/src/main/java/ScriptFrame.java @@ -50,7 +50,7 @@ public class ScriptFrame { var4 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 778 var3 = false; // L: 779 } else { - var4 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 781 + var4 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 781 } int var11; diff --git a/runescape-client/src/main/java/SecureRandomCallable.java b/runescape-client/src/main/java/SecureRandomCallable.java index 01a6eb62bb..0cfbb60420 100644 --- a/runescape-client/src/main/java/SecureRandomCallable.java +++ b/runescape-client/src/main/java/SecureRandomCallable.java @@ -63,7 +63,7 @@ public class SecureRandomCallable implements Callable { boolean var3 = false; // L: 110 for (Node var4 = var1.params.first(); var4 != null; var4 = var1.params.next()) { // L: 111 - ParamDefinition var5 = ChatChannel.getParamDefinition((int)var4.key); // L: 112 + ParamComposition var5 = ChatChannel.getParamDefinition((int)var4.key); // L: 112 if (var5.autoDisable) { // L: 113 var4.remove(); } else { diff --git a/runescape-client/src/main/java/Skeleton.java b/runescape-client/src/main/java/Skeleton.java index fbb05c8ac4..62201856dd 100644 --- a/runescape-client/src/main/java/Skeleton.java +++ b/runescape-client/src/main/java/Skeleton.java @@ -135,7 +135,7 @@ public class Skeleton extends Node { } if (var5 != -1) { // L: 10614 - SequenceDefinition var6 = ParamDefinition.SequenceDefinition_get(var5); // L: 10615 + SequenceDefinition var6 = ParamComposition.SequenceDefinition_get(var5); // L: 10615 for (var3.modelFrameCycle += Client.field850; var3.modelFrameCycle > var6.frameLengths[var3.modelFrame]; CollisionMap.invalidateWidget(var3)) { // L: 10616 10617 10624 var3.modelFrameCycle -= var6.frameLengths[var3.modelFrame]; // L: 10618 diff --git a/runescape-client/src/main/java/SpotAnimationDefinition.java b/runescape-client/src/main/java/SpotAnimationDefinition.java index 7ebe5b2386..16ad8b213c 100644 --- a/runescape-client/src/main/java/SpotAnimationDefinition.java +++ b/runescape-client/src/main/java/SpotAnimationDefinition.java @@ -203,7 +203,7 @@ public class SpotAnimationDefinition extends DualNode { Model var5; if (this.sequence != -1 && var1 != -1) { // L: 103 - var5 = ParamDefinition.SequenceDefinition_get(this.sequence).transformSpotAnimationModel(var2, var1); + var5 = ParamComposition.SequenceDefinition_get(this.sequence).transformSpotAnimationModel(var2, var1); } else { var5 = var2.toSharedSpotAnimationModel(true); // L: 104 } diff --git a/runescape-client/src/main/java/StructDefinition.java b/runescape-client/src/main/java/StructComposition.java similarity index 96% rename from runescape-client/src/main/java/StructDefinition.java rename to runescape-client/src/main/java/StructComposition.java index 6ca0347a2b..a35e9cb579 100644 --- a/runescape-client/src/main/java/StructDefinition.java +++ b/runescape-client/src/main/java/StructComposition.java @@ -4,8 +4,8 @@ import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @ObfuscatedName("jb") -@Implements("StructDefinition") -public class StructDefinition extends DualNode { +@Implements("StructComposition") +public class StructComposition extends DualNode { @ObfuscatedName("h") @ObfuscatedSignature( descriptor = "Lib;" @@ -29,7 +29,7 @@ public class StructDefinition extends DualNode { StructDefinition_cached = new EvictingDualNodeHashTable(64); // L: 13 } - StructDefinition() { + StructComposition() { } // L: 16 @ObfuscatedName("x") diff --git a/runescape-client/src/main/java/StudioGame.java b/runescape-client/src/main/java/StudioGame.java index 134a352f60..69c0ce51c4 100644 --- a/runescape-client/src/main/java/StudioGame.java +++ b/runescape-client/src/main/java/StudioGame.java @@ -81,7 +81,7 @@ public enum StudioGame implements Enumerated { garbageValue = "1020902177" ) public static void method4185() { - ParamDefinition.ParamDefinition_cached.clear(); // L: 72 + ParamComposition.ParamDefinition_cached.clear(); // L: 72 } // L: 73 @ObfuscatedName("ak") diff --git a/runescape-client/src/main/java/Tiles.java b/runescape-client/src/main/java/Tiles.java index 784185c34d..7f12c265ab 100644 --- a/runescape-client/src/main/java/Tiles.java +++ b/runescape-client/src/main/java/Tiles.java @@ -166,7 +166,7 @@ public final class Tiles { @Export("performPlayerAnimation") static void performPlayerAnimation(Player var0, int var1, int var2) { if (var0.sequence == var1 && var1 != -1) { // L: 4151 - int var3 = ParamDefinition.SequenceDefinition_get(var1).field3548; // L: 4152 + int var3 = ParamComposition.SequenceDefinition_get(var1).field3548; // L: 4152 if (var3 == 1) { // L: 4153 var0.sequenceFrame = 0; // L: 4154 var0.sequenceFrameCycle = 0; // L: 4155 @@ -177,7 +177,7 @@ public final class Tiles { if (var3 == 2) { // L: 4159 var0.field974 = 0; // L: 4160 } - } else if (var1 == -1 || var0.sequence == -1 || ParamDefinition.SequenceDefinition_get(var1).field3557 >= ParamDefinition.SequenceDefinition_get(var0.sequence).field3557) { // L: 4163 + } else if (var1 == -1 || var0.sequence == -1 || ParamComposition.SequenceDefinition_get(var1).field3557 >= ParamComposition.SequenceDefinition_get(var0.sequence).field3557) { // L: 4163 var0.sequence = var1; // L: 4164 var0.sequenceFrame = 0; // L: 4165 var0.sequenceFrameCycle = 0; // L: 4166 diff --git a/runescape-client/src/main/java/UserComparator9.java b/runescape-client/src/main/java/UserComparator9.java index 0335918164..f6a43035e5 100644 --- a/runescape-client/src/main/java/UserComparator9.java +++ b/runescape-client/src/main/java/UserComparator9.java @@ -64,7 +64,7 @@ public class UserComparator9 extends AbstractUserComparator { var0 -= 1000; // L: 735 var3 = CollisionMap.getWidget(Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]); // L: 736 } else { - var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 738 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 738 } CollisionMap.invalidateWidget(var3); // L: 739 diff --git a/runescape-client/src/main/java/WorldMapData_0.java b/runescape-client/src/main/java/WorldMapData_0.java index 35e9cab7c1..96e1b3bbf1 100644 --- a/runescape-client/src/main/java/WorldMapData_0.java +++ b/runescape-client/src/main/java/WorldMapData_0.java @@ -461,7 +461,7 @@ public class WorldMapData_0 extends AbstractWorldMapData { var7 = var1.readUnsignedByte(); // L: 7166 if (var6 == var15.sequence && var6 != -1) { // L: 7167 - var8 = ParamDefinition.SequenceDefinition_get(var6).field3548; // L: 7168 + var8 = ParamComposition.SequenceDefinition_get(var6).field3548; // L: 7168 if (var8 == 1) { // L: 7169 var15.sequenceFrame = 0; // L: 7170 var15.sequenceFrameCycle = 0; // L: 7171 @@ -472,7 +472,7 @@ public class WorldMapData_0 extends AbstractWorldMapData { if (var8 == 2) { // L: 7175 var15.field974 = 0; // L: 7176 } - } else if (var6 == -1 || var15.sequence == -1 || ParamDefinition.SequenceDefinition_get(var6).field3557 >= ParamDefinition.SequenceDefinition_get(var15.sequence).field3557) { // L: 7179 + } else if (var6 == -1 || var15.sequence == -1 || ParamComposition.SequenceDefinition_get(var6).field3557 >= ParamComposition.SequenceDefinition_get(var15.sequence).field3557) { // L: 7179 var15.sequence = var6; // L: 7180 var15.sequenceFrame = 0; // L: 7181 var15.sequenceFrameCycle = 0; // L: 7182 diff --git a/runescape-client/src/main/java/WorldMapData_1.java b/runescape-client/src/main/java/WorldMapData_1.java index 8d404bdf6c..40ccbef1e6 100644 --- a/runescape-client/src/main/java/WorldMapData_1.java +++ b/runescape-client/src/main/java/WorldMapData_1.java @@ -188,7 +188,7 @@ public class WorldMapData_1 extends AbstractWorldMapData { var4 = Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]; // L: 553 var3 = CollisionMap.getWidget(var4); // L: 554 } else { - var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 556 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 556 } if (var0 == ScriptOpcodes.CC_SETSCROLLPOS) { // L: 557 diff --git a/runescape-client/src/main/java/WorldMapID.java b/runescape-client/src/main/java/WorldMapID.java index a4505bd99a..ad95f758af 100644 --- a/runescape-client/src/main/java/WorldMapID.java +++ b/runescape-client/src/main/java/WorldMapID.java @@ -119,7 +119,7 @@ public class WorldMapID { VarcInt.Interpreter_intStackSize -= 2; // L: 1387 var10 = Interpreter.Interpreter_intStack[VarcInt.Interpreter_intStackSize]; // L: 1388 var16 = Interpreter.Interpreter_intStack[VarcInt.Interpreter_intStackSize + 1]; // L: 1389 - Widget var13 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 1390 + Widget var13 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1390 class13.clickWidget(var13, var10, var16); // L: 1391 return 1; // L: 1392 } else if (var0 == ScriptOpcodes.MOUSECAM) { @@ -256,7 +256,7 @@ public class WorldMapID { return 1; // L: 1534 } else if (var0 == 3140) { Client.field810 = 3; // L: 1537 - Client.field811 = var2 ? PlayerComposition.field2561.id * -437932207 * 653064625 : VarcInt.scriptActiveWidget.id * -437932207 * 653064625; // L: 1538 + Client.field811 = var2 ? PlayerComposition.scriptDotWidget.id * -437932207 * 653064625 : VarcInt.scriptActiveWidget.id * -437932207 * 653064625; // L: 1538 return 1; // L: 1539 } else { boolean var11; @@ -528,7 +528,7 @@ public class WorldMapID { if (var0.field984 >= Client.cycle) { // L: 3878 WorldMapManager.method672(var0); } else if (var0.field973 >= Client.cycle) { // L: 3879 - if (var0.field973 == Client.cycle || var0.sequence == -1 || var0.sequenceDelay != 0 || var0.sequenceFrameCycle + 1 > ParamDefinition.SequenceDefinition_get(var0.sequence).frameLengths[var0.sequenceFrame]) { // L: 3880 + if (var0.field973 == Client.cycle || var0.sequence == -1 || var0.sequenceDelay != 0 || var0.sequenceFrameCycle + 1 > ParamComposition.SequenceDefinition_get(var0.sequence).frameLengths[var0.sequenceFrame]) { // L: 3880 var2 = var0.field973 - var0.field984; // L: 3881 var3 = Client.cycle - var0.field984; // L: 3882 var4 = var0.field941 * 64 + var0.field981 * 128; // L: 3883 diff --git a/runescape-client/src/main/java/WorldMapRectangle.java b/runescape-client/src/main/java/WorldMapRectangle.java index 825bda145a..2a05e24647 100644 --- a/runescape-client/src/main/java/WorldMapRectangle.java +++ b/runescape-client/src/main/java/WorldMapRectangle.java @@ -57,7 +57,7 @@ public final class WorldMapRectangle { garbageValue = "470419605" ) static int method331(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 1124 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1124 if (var0 == ScriptOpcodes.CC_GETTARGETMASK) { // L: 1125 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = ServerPacket.Widget_unpackTargetMask(FaceNormal.getWidgetFlags(var3)); // L: 1126 return 1; // L: 1127 @@ -126,7 +126,7 @@ public final class WorldMapRectangle { WorldMapID.method601(); // L: 2883 HealthBarDefinition.method4509(); // L: 2884 VarcInt.method4426(); // L: 2885 - StructDefinition.StructDefinition_cached.clear(); // L: 2887 + StructComposition.StructDefinition_cached.clear(); // L: 2887 StudioGame.method4185(); // L: 2889 WorldMapElement.WorldMapElement_cachedSprites.clear(); // L: 2891 PlayerComposition.PlayerAppearance_cachedModels.clear(); // L: 2894 diff --git a/runescape-client/src/main/java/class13.java b/runescape-client/src/main/java/class13.java index b3699bdbe3..e9b1d55d42 100644 --- a/runescape-client/src/main/java/class13.java +++ b/runescape-client/src/main/java/class13.java @@ -13,7 +13,7 @@ public final class class13 { garbageValue = "2" ) public static void method129(AbstractArchive var0) { - ParamDefinition.ParamDefinition_archive = var0; // L: 21 + ParamComposition.ParamDefinition_archive = var0; // L: 21 } // L: 22 @ObfuscatedName("x") diff --git a/runescape-client/src/main/java/class200.java b/runescape-client/src/main/java/class200.java index ff06f8eaee..1fd2e14d6b 100644 --- a/runescape-client/src/main/java/class200.java +++ b/runescape-client/src/main/java/class200.java @@ -56,7 +56,7 @@ public class class200 { var3 = Interpreter.Interpreter_intStack[--VarcInt.Interpreter_intStackSize]; // L: 503 var4 = CollisionMap.getWidget(var3); // L: 504 } else { - var4 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 506 + var4 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 506 } if (var0 == ScriptOpcodes.CC_SETPOSITION) { // L: 507 diff --git a/runescape-client/src/main/java/class231.java b/runescape-client/src/main/java/class231.java index 70e2c42abb..09d2134947 100644 --- a/runescape-client/src/main/java/class231.java +++ b/runescape-client/src/main/java/class231.java @@ -157,7 +157,7 @@ public class class231 { var12.isIf3 = true; // L: 452 var6.children[var11] = var12; // L: 453 if (var2) { // L: 454 - PlayerComposition.field2561 = var12; + PlayerComposition.scriptDotWidget = var12; } else { VarcInt.scriptActiveWidget = var12; // L: 455 } @@ -169,7 +169,7 @@ public class class231 { } else { Widget var3; if (var0 == ScriptOpcodes.CC_DELETE) { // L: 459 - var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 460 + var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 460 Widget var10 = CollisionMap.getWidget(var3.id); // L: 461 var10.children[var3.childIndex] = null; // L: 462 CollisionMap.invalidateWidget(var10); // L: 463 @@ -185,7 +185,7 @@ public class class231 { if (var3 != null) { // L: 487 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = 1; // L: 488 if (var2) { // L: 489 - PlayerComposition.field2561 = var3; + PlayerComposition.scriptDotWidget = var3; } else { VarcInt.scriptActiveWidget = var3; // L: 490 } @@ -205,7 +205,7 @@ public class class231 { if (var5 != null && var4 != -1) { // L: 477 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = 1; // L: 478 if (var2) { // L: 479 - PlayerComposition.field2561 = var5; + PlayerComposition.scriptDotWidget = var5; } else { VarcInt.scriptActiveWidget = var5; // L: 480 } diff --git a/runescape-client/src/main/java/class238.java b/runescape-client/src/main/java/class238.java index 20382e130c..f3ad65c1a4 100644 --- a/runescape-client/src/main/java/class238.java +++ b/runescape-client/src/main/java/class238.java @@ -41,7 +41,7 @@ public class class238 { garbageValue = "1585982662" ) public static String method4166(CharSequence var0) { - String var1 = ParamDefinition.base37DecodeLong(Renderable.method3340(var0)); // L: 75 + String var1 = ParamComposition.base37DecodeLong(Renderable.method3340(var0)); // L: 75 if (var1 == null) { // L: 76 var1 = ""; } diff --git a/runescape-client/src/main/java/class277.java b/runescape-client/src/main/java/class277.java index 04246f6f8c..358fba78e8 100644 --- a/runescape-client/src/main/java/class277.java +++ b/runescape-client/src/main/java/class277.java @@ -10,7 +10,7 @@ public class class277 { garbageValue = "-1829984749" ) static int method5005(int var0, Script var1, boolean var2) { - Widget var3 = var2 ? PlayerComposition.field2561 : VarcInt.scriptActiveWidget; // L: 1106 + Widget var3 = var2 ? PlayerComposition.scriptDotWidget : VarcInt.scriptActiveWidget; // L: 1106 if (var0 == ScriptOpcodes.CC_GETINVOBJECT) { // L: 1107 Interpreter.Interpreter_intStack[++VarcInt.Interpreter_intStackSize - 1] = var3.itemId; // L: 1108 return 1; // L: 1109 diff --git a/runescape-client/src/main/java/class51.java b/runescape-client/src/main/java/class51.java index 4c0bfe4bff..2be0dd5edb 100644 --- a/runescape-client/src/main/java/class51.java +++ b/runescape-client/src/main/java/class51.java @@ -213,7 +213,7 @@ public class class51 implements WorldMapSection { var0.field963 = 0; // L: 3987 } else { if (var0.sequence != -1 && var0.sequenceDelay == 0) { // L: 3990 - SequenceDefinition var1 = ParamDefinition.SequenceDefinition_get(var0.sequence); // L: 3991 + SequenceDefinition var1 = ParamComposition.SequenceDefinition_get(var0.sequence); // L: 3991 if (var0.field996 > 0 && var1.field3560 == 0) { // L: 3992 ++var0.field963; // L: 3993 return; // L: 3994