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 d7bd5efcc1..a12a2bec3f 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -952,6 +952,42 @@ 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); + + /** + * Gets the sound effect volume + * @return volume 0-127 inclusive + */ + int getSoundEffectVolume(); + + /** + * 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(); + + /** + * Sets the area sound effect volume + * @param volume 0-127 inclusive + */ + void setAreaSoundEffectVolume(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 diff --git a/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java new file mode 100644 index 0000000000..7f846cd214 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/VolumeChanged.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017, 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; + +public class VolumeChanged implements Event +{ + public static final VolumeChanged INSTANCE = new VolumeChanged(); + + private VolumeChanged() + { + // noop + } +} 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..fa2ebbcbbd --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicConfig.java @@ -0,0 +1,89 @@ +/* + * 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 +{ + @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/musiclist/MusicListPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java similarity index 55% rename from runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java rename to runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java index 63bcb717ad..5d251e19ae 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/musiclist/MusicListPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/music/MusicPlugin.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2019, Anthony Chen + * Copyright (c) 2019, Adam * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,33 +23,43 @@ * (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.musiclist; +package net.runelite.client.plugins.music; +import com.google.inject.Provides; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.function.BiConsumer; +import java.util.function.ToIntFunction; import java.util.stream.Collectors; import javax.inject.Inject; -import javax.inject.Singleton; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.ScriptID; import net.runelite.api.SoundEffectID; import net.runelite.api.SpriteID; import net.runelite.api.VarClientInt; +import net.runelite.api.VarPlayer; +import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.VarClientIntChanged; +import net.runelite.api.events.VolumeChanged; import net.runelite.api.events.WidgetLoaded; -import net.runelite.api.vars.InterfaceTab; import net.runelite.api.widgets.JavaScriptCallback; import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetConfig; 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.EventBus; import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.game.chatbox.ChatboxTextInput; @@ -56,11 +67,11 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @PluginDescriptor( - name = "Music List", - description = "Adds search and filter for the music list" + name = "Music", + description = "Adds search and filter for the music list, and additional volume control" ) -@Singleton -public class MusicListPlugin extends Plugin +@Slf4j +public class MusicPlugin extends Plugin { @Inject private Client client; @@ -68,6 +79,9 @@ public class MusicListPlugin extends Plugin @Inject private ClientThread clientThread; + @Inject + private MusicConfig musicConfig; + @Inject private ChatboxPanelManager chatboxPanelManager; @@ -88,14 +102,17 @@ public class MusicListPlugin extends Plugin { addSubscriptions(); - clientThread.invoke(this::addMusicButtons); + clientThread.invoke(() -> + { + addMusicButtons(); + applyMusicVolumeConfig(); + updateMusicOptions(); + }); } @Override protected void shutDown() { - eventBus.unregister(this); - Widget header = client.getWidget(WidgetInfo.MUSIC_WINDOW); if (header != null) { @@ -103,13 +120,24 @@ public class MusicListPlugin extends Plugin } tracks = null; + + clientThread.invoke(this::teardownMusicOptions); + } + + @Provides + MusicConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(MusicConfig.class); } private void addSubscriptions() { + eventBus.subscribe(ConfigChanged.class, this, this::onConfigChanged); eventBus.subscribe(GameStateChanged.class, this, this::onGameStateChanged); eventBus.subscribe(WidgetLoaded.class, this, this::onWidgetLoaded); eventBus.subscribe(VarClientIntChanged.class, this, this::onVarClientIntChanged); + eventBus.subscribe(VolumeChanged.class, this, this::onVolumeChanged); + eventBus.subscribe(ScriptCallbackEvent.class, this, this::onScriptCallbackEvent); } private void onGameStateChanged(GameStateChanged gameStateChanged) @@ -132,6 +160,10 @@ public class MusicListPlugin extends Plugin currentMusicFilter = MusicState.ALL; addMusicButtons(); } + if (widgetLoaded.getGroupId() == WidgetID.OPTIONS_GROUP_ID) + { + updateMusicOptions(); + } } private void addMusicButtons() @@ -181,9 +213,48 @@ public class MusicListPlugin extends Plugin } } + + private void onVolumeChanged(VolumeChanged volumeChanged) + { + applyMusicVolumeConfig(); + } + + private void onConfigChanged(ConfigChanged configChanged) + { + if (configChanged.getGroup().equals("music")) + { + clientThread.invokeLater(this::applyMusicVolumeConfig); + } + } + + private void applyMusicVolumeConfig() + { + log.info("applyMusicVolumeConfig"); + + int musicVolume = musicConfig.getMusicVolume(); + if (musicVolume > 0) + { + client.setMusicVolume(musicVolume - 1); + } + + int soundEffectVolume = musicConfig.getSoundEffectVolume(); + if (soundEffectVolume > 0) + { + client.setSoundEffectVolume(soundEffectVolume - 1); + } + + int areaSoundEffectVolume = musicConfig.getAreaSoundEffectVolume(); + if (areaSoundEffectVolume > 0) + { + client.setAreaSoundEffectVolume(areaSoundEffectVolume - 1); + } + + updateMusicOptions(); + } + private boolean isOnMusicTab() { - return client.getVar(VarClientInt.INTERFACE_TAB) == InterfaceTab.MUSIC.getId(); + return client.getVar(VarClientInt.INTERFACE_TAB) == 13; } private boolean isChatboxOpen() @@ -304,4 +375,175 @@ public class MusicListPlugin extends Plugin private final String name; private final int spriteID; } -} + + @RequiredArgsConstructor + @Getter + private enum MusicSlider + { + MUSIC(WidgetInfo.OPTIONS_MUSIC_SLIDER, VarPlayer.MUSIC_VOLUME, MusicConfig::getMusicVolume, MusicConfig::setMusicVolume, 255), + AREA(WidgetInfo.OPTIONS_AREA_SOUND_SLIDER, VarPlayer.AREA_EFFECT_VOLUME, MusicConfig::getAreaSoundEffectVolume, MusicConfig::setAreaSoundEffectVolume, 127), + EFFECT(WidgetInfo.OPTIONS_SOUND_EFFECT_SLIDER, VarPlayer.SOUND_EFFECT_VOLUME, MusicConfig::getSoundEffectVolume, MusicConfig::setSoundEffectVolume, 127); + + private final WidgetInfo widgetID; + private final VarPlayer var; + private final ToIntFunction getter; + private final BiConsumer setter; + private final int max; + + @Setter + private Widget handle; + + @Setter + private Widget track; + + private static int PADDING = 8; + + private int getX() + { + return getTrack().getRelativeX() + PADDING; + } + + private int getWidth() + { + return getTrack().getWidth() - (PADDING * 2) - handle.getWidth(); + } + } + + private void teardownMusicOptions() + { + for (MusicSlider slider : MusicSlider.values()) + { + Widget icon = client.getWidget(slider.getWidgetID()); + if (icon == null) + { + return; + } + + if (slider.getHandle() != null) + { + { + Widget handle = slider.getHandle(); + Widget[] siblings = handle.getParent().getChildren(); + if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + { + continue; + } + siblings[slider.getTrack().getIndex()] = null; + siblings[handle.getIndex()] = null; + } + + Object[] init = icon.getOnLoadListener(); + init[1] = slider.getWidgetID().getId(); + + // Readd the var transmit triggers and rerun options_allsounds + client.runScript(init); + slider.setHandle(null); + slider.setTrack(null); + } + } + } + + private void updateMusicOptions() + { + for (MusicSlider slider : MusicSlider.values()) + { + Widget icon = client.getWidget(slider.getWidgetID()); + if (icon == null) + { + return; + } + + Widget handle = slider.getHandle(); + if (handle != null) + { + Widget[] siblings = handle.getParent().getChildren(); + if (siblings.length < handle.getIndex() || siblings[handle.getIndex()] != handle) + { + handle = null; + } + } + if (handle == null) + { + Object[] init = icon.getOnLoadListener(); + icon.setVarTransmitTrigger((int[]) null); + + Widget track = icon.getParent().createChild(-1, WidgetType.TEXT); + slider.setTrack(track); + handle = icon.getParent().createChild(-1, WidgetType.GRAPHIC); + slider.setHandle(handle); + + { + // First widget of the track + int wid = (Integer) init[2]; + Widget w = client.getWidget(WidgetInfo.TO_GROUP(wid), WidgetInfo.TO_CHILD(wid)); + + track.setOriginalX(w.getRelativeX()); + track.setOriginalY(w.getRelativeY()); + } + { + // Last widget of the track + int wid = (Integer) init[6]; + Widget w = client.getWidget(WidgetInfo.TO_GROUP(wid), WidgetInfo.TO_CHILD(wid)); + + track.setOriginalWidth((w.getRelativeX() + w.getWidth()) - track.getOriginalX()); + } + + track.setOriginalHeight(16); + track.setNoClickThrough(true); + track.revalidate(); + + handle.setSpriteId(SpriteID.OPTIONS_ZOOM_SLIDER_THUMB); + handle.setOriginalWidth(16); + handle.setOriginalHeight(16); + handle.setClickMask(WidgetConfig.DRAG); + + JavaScriptCallback move = ev -> + { + int newVal = ((ev.getMouseX() - MusicSlider.PADDING - (slider.getHandle().getWidth() / 2)) * slider.getMax()) + / slider.getWidth(); + if (newVal < 0) + { + newVal = 0; + } + if (newVal > slider.getMax()) + { + newVal = slider.getMax(); + } + + // We store +1 so we can tell the difference between 0 and muted + slider.getSetter().accept(musicConfig, newVal + 1); + applyMusicVolumeConfig(); + }; + + track.setOnClickListener(move); + track.setOnHoldListener(move); + track.setOnReleaseListener(move); + track.setHasListener(true); + + client.runScript(ScriptID.OPTIONS_ALLSOUNDS, -1, init[2], init[3], init[4], init[5], init[6]); + } + + int value = slider.getGetter().applyAsInt(musicConfig) - 1; + if (value <= -1) + { + // Use the vanilla value + value = ((4 - client.getVar(slider.getVar())) * slider.getMax()) / 4; + } + + int newX = ((value * slider.getWidth()) / slider.getMax()) + slider.getX(); + slider.getHandle().setOriginalX(newX); + slider.getHandle().setOriginalY(slider.getTrack().getOriginalY()); + slider.getHandle().revalidate(); + } + } + + private void onScriptCallbackEvent(ScriptCallbackEvent ev) + { + switch (ev.getEventName()) + { + case "optionsAllSounds": + // We have to override this script because it gets invoked periodically from the server + client.getIntStack()[client.getIntStackSize() - 1] = -1; + } + } +} \ No newline at end of file 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 e9e82eabaa..dd6457fe6d 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -50,6 +50,7 @@ import net.runelite.api.Ignore; import net.runelite.api.IndexDataBase; import net.runelite.api.IndexedSprite; import net.runelite.api.InventoryID; +import net.runelite.api.MenuEntry; import net.runelite.api.MenuOpcode; import static net.runelite.api.MenuOpcode.PLAYER_EIGTH_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_FIFTH_OPTION; @@ -59,7 +60,6 @@ import static net.runelite.api.MenuOpcode.PLAYER_SECOND_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_SEVENTH_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_SIXTH_OPTION; import static net.runelite.api.MenuOpcode.PLAYER_THIRD_OPTION; -import net.runelite.api.MenuEntry; import net.runelite.api.MessageNode; import net.runelite.api.NPC; import net.runelite.api.Node; @@ -98,6 +98,7 @@ import net.runelite.api.events.PlayerSpawned; import net.runelite.api.events.ResizeableChanged; import net.runelite.api.events.UsernameChanged; import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.VolumeChanged; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.events.WidgetPressed; import net.runelite.api.hooks.Callbacks; @@ -1760,7 +1761,6 @@ public abstract class RSClientMixin implements RSClient return modulus; } - @Inject @Override public void setModulus(BigInteger modulus) @@ -1783,4 +1783,11 @@ public abstract class RSClientMixin implements RSClient client.promptCredentials(true); } } + + @Inject + @MethodHook("changeGameOptions") + public static void changeGameOptions(int var0) + { + client.getCallbacks().post(VolumeChanged.class, VolumeChanged.INSTANCE); + } } \ No newline at end of file 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 a0e6506b08..d068563f23 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 @@ -1038,9 +1038,30 @@ public interface RSClient extends RSGameShell, Client @Import("decimator") RSDecimator getSoundEffectResampler(); + @Import("musicVolume") + @Override + int getMusicVolume(); + + @Import("musicVolume") + @Override + void setMusicVolume(int volume); + + @Import("areaSoundEffectVolume") + @Override + int getAreaSoundEffectVolume(); + + @Import("areaSoundEffectVolume") + @Override + void setAreaSoundEffectVolume(int volume); + @Import("soundEffectVolume") + @Override int getSoundEffectVolume(); + @Import("soundEffectVolume") + @Override + void setSoundEffectVolume(int volume); + @Import("viewportWalking") void setViewportWalking(boolean viewportWalking); 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 06a79327fa..49621b123d 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 @@ -20,4 +20,7 @@ public interface RSScriptEvent extends ScriptEvent @Import("targetName") String getOpbase(); + + @Import("mouseX") + int getMouseX(); } 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 8965d2e348..f292e9c117 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 @@ -496,4 +496,20 @@ public interface RSWidget extends Widget @Import("getSprite") RSSprite getSprite(boolean b); + + @Import("onRelease") + @Override + void setOnReleaseListener(Object[] o); + + @Import("varTransmitTriggers") + @Override + void setVarTransmitTrigger(int[] i); + + @Import("onHold") + @Override + void setOnHoldListener(Object[] o); + + @Import("onClick") + @Override + void setOnClickListener(Object[] o); } diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index f4f8b09f7c..5abeff1ee4 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -213,7 +213,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = 892519291 ) - static int field868; + @Export("areaSoundEffectVolume") + static int areaSoundEffectVolume; @ObfuscatedName("no") static int[] field820; @ObfuscatedName("nb") @@ -363,7 +364,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -114703177 ) - static int field761; + @Export("musicVolume") + static int musicVolume; @ObfuscatedName("pu") @Export("mapIconYs") static int[] mapIconYs; @@ -1508,11 +1510,11 @@ public final class Client extends GameShell implements Usernamed { destinationX = 0; destinationY = 0; minimapState = 0; - field761 = 255; + musicVolume = 255; field666 = -1; field759 = false; soundEffectVolume = 127; - field868 = 127; + areaSoundEffectVolume = 127; soundEffectCount = 0; soundEffectIds = new int[50]; queuedSoundEffectLoops = new int[50]; @@ -4282,7 +4284,7 @@ public final class Client extends GameShell implements Usernamed { Varps.Varps_main[var5] = var16; } - NetSocket.method3472(var5); + NetSocket.changeGameOptions(var5); field782[++field823 - 1 & 31] = var5; var1.serverPacket = null; return true; @@ -4738,7 +4740,7 @@ public final class Client extends GameShell implements Usernamed { Varps.Varps_main[var16] = var40; } - NetSocket.method3472(var16); + NetSocket.changeGameOptions(var16); field782[++field823 - 1 & 31] = var16; var1.serverPacket = null; return true; @@ -4795,7 +4797,7 @@ public final class Client extends GameShell implements Usernamed { for (var16 = 0; var16 < Varps.Varps_main.length; ++var16) { if (Varps.Varps_temp[var16] != Varps.Varps_main[var16]) { Varps.Varps_main[var16] = Varps.Varps_temp[var16]; - NetSocket.method3472(var16); + NetSocket.changeGameOptions(var16); field782[++field823 - 1 & 31] = var16; } } diff --git a/runescape-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java index 4ff2dfbd93..1aa118148e 100644 --- a/runescape-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -704,8 +704,8 @@ public class ClientPacket implements class181 { ) @Export("playSoundJingle") static void playSoundJingle(int var0, int var1) { - if (Client.field761 != 0 && var0 != -1) { - class83.method2068(ClanMate.archive11, var0, 0, Client.field761, false); + if (Client.musicVolume != 0 && var0 != -1) { + class83.method2068(ClanMate.archive11, var0, 0, Client.musicVolume, false); Client.field759 = true; } diff --git a/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java b/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java index d72e0548e2..e43f97006f 100644 --- a/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java +++ b/runescape-client/src/main/java/GrandExchangeOfferTotalQuantityComparator.java @@ -308,7 +308,7 @@ final class GrandExchangeOfferTotalQuantityComparator implements Comparator { var9 = var1.method5511(); if (var38 >= 0 && var4 >= 0 && var38 < 104 && var4 < 104) { var10 = var6 + 1; - if (class223.localPlayer.pathX[0] >= var38 - var10 && class223.localPlayer.pathX[0] <= var10 + var38 && class223.localPlayer.pathY[0] >= var4 - var10 && class223.localPlayer.pathY[0] <= var10 + var4 && Client.field868 != 0 && var7 > 0 && Client.soundEffectCount < 50) { + if (class223.localPlayer.pathX[0] >= var38 - var10 && class223.localPlayer.pathX[0] <= var10 + var38 && class223.localPlayer.pathY[0] >= var4 - var10 && class223.localPlayer.pathY[0] <= var10 + var4 && Client.areaSoundEffectVolume != 0 && var7 > 0 && Client.soundEffectCount < 50) { Client.soundEffectIds[Client.soundEffectCount] = var8; Client.queuedSoundEffectLoops[Client.soundEffectCount] = var7; Client.queuedSoundEffectDelays[Client.soundEffectCount] = var9; diff --git a/runescape-client/src/main/java/HealthBarUpdate.java b/runescape-client/src/main/java/HealthBarUpdate.java index 4808e17910..f708052a85 100644 --- a/runescape-client/src/main/java/HealthBarUpdate.java +++ b/runescape-client/src/main/java/HealthBarUpdate.java @@ -113,7 +113,7 @@ public class HealthBarUpdate extends Node { var8 = 0; } - var2 = (var3 - var8) * Client.field868 / var3; + var2 = (var3 - var8) * Client.areaSoundEffectVolume / var3; } else { var2 = Client.soundEffectVolume; } @@ -151,8 +151,8 @@ public class HealthBarUpdate extends Node { } if (!var12) { - if (Client.field761 != 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, Client.field761, false); + if (Client.musicVolume != 0 && Client.field666 != -1) { + class83.method2068(class225.archive6, Client.field666, 0, Client.musicVolume, false); } Client.field759 = false; diff --git a/runescape-client/src/main/java/InvDefinition.java b/runescape-client/src/main/java/InvDefinition.java index 79415563b7..1417e54281 100644 --- a/runescape-client/src/main/java/InvDefinition.java +++ b/runescape-client/src/main/java/InvDefinition.java @@ -437,7 +437,7 @@ public class InvDefinition extends DualNode { if (var14.cs1Instructions != null && var14.cs1Instructions[0][0] == 5) { int var12 = var14.cs1Instructions[0][1]; Varps.Varps_main[var12] = 1 - Varps.Varps_main[var12]; - NetSocket.method3472(var12); + NetSocket.changeGameOptions(var12); } } else if (opcode == 29) { PacketBufferNode var8 = InterfaceParent.getPacketBufferNode(ClientPacket.field2261, Client.packetWriter.isaacCipher); @@ -448,7 +448,7 @@ public class InvDefinition extends DualNode { int var12 = var14.cs1Instructions[0][1]; if (Varps.Varps_main[var12] != var14.cs1ComparisonValues[0]) { Varps.Varps_main[var12] = var14.cs1ComparisonValues[0]; - NetSocket.method3472(var12); + NetSocket.changeGameOptions(var12); } } } else if (opcode == 30) { diff --git a/runescape-client/src/main/java/KeyHandler.java b/runescape-client/src/main/java/KeyHandler.java index 515a356c44..27f2ff0577 100644 --- a/runescape-client/src/main/java/KeyHandler.java +++ b/runescape-client/src/main/java/KeyHandler.java @@ -320,7 +320,7 @@ public final class KeyHandler implements KeyListener, FocusListener { } else if (var29 == ScriptOpcodes.SET_VARP) { var11 = var6[var17]; Varps.Varps_main[var11] = Interpreter.Interpreter_intStack[--Interpreter.Interpreter_intStackSize]; - NetSocket.method3472(var11); + NetSocket.changeGameOptions(var11); } else if (var29 == ScriptOpcodes.SCONST) { Interpreter.Interpreter_stringStack[++Interpreter.Interpreter_stringStackSize - 1] = var3.stringOperands[var17]; } else if (var29 == ScriptOpcodes.JUMP) { diff --git a/runescape-client/src/main/java/MusicPatchNode2.java b/runescape-client/src/main/java/MusicPatchNode2.java index fa0eca9746..a5e9bec39c 100644 --- a/runescape-client/src/main/java/MusicPatchNode2.java +++ b/runescape-client/src/main/java/MusicPatchNode2.java @@ -64,9 +64,9 @@ public class MusicPatchNode2 { static void playSong(int var0) { if (var0 == -1 && !Client.field759) { VertexNormal.method2960(); - } else if (var0 != -1 && var0 != Client.field666 && Client.field761 != 0 && !Client.field759) { + } else if (var0 != -1 && var0 != Client.field666 && Client.musicVolume != 0 && !Client.field759) { Archive var1 = class225.archive6; - int var2 = Client.field761; + int var2 = Client.musicVolume; class197.field2386 = 1; class197.musicTrackArchive = var1; class188.musicTrackGroupId = var0; diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java index be0b0995ae..42a66bbe21 100644 --- a/runescape-client/src/main/java/NetSocket.java +++ b/runescape-client/src/main/java/NetSocket.java @@ -378,7 +378,8 @@ public final class NetSocket extends AbstractSocket implements Runnable { signature = "(II)V", garbageValue = "-1514465632" ) - static final void method3472(int var0) { + @Export("changeGameOptions") + static final void changeGameOptions(int var0) { class325.method6190(); for (ObjectSound var1 = (ObjectSound)ObjectSound.objectSounds.last(); var1 != null; var1 = (ObjectSound)ObjectSound.objectSounds.previous()) { @@ -436,8 +437,8 @@ public final class NetSocket extends AbstractSocket implements Runnable { var3 = 0; } - if (var3 != Client.field761) { - if (Client.field761 == 0 && Client.field666 != -1) { + if (var3 != Client.musicVolume) { + if (Client.musicVolume == 0 && Client.field666 != -1) { class83.method2068(class225.archive6, Client.field666, 0, var3, false); Client.field759 = false; } else if (var3 == 0) { @@ -449,7 +450,7 @@ public final class NetSocket extends AbstractSocket implements Runnable { class49.midiPcmStream.method3760(var3); } - Client.field761 = var3; + Client.musicVolume = var3; } } @@ -489,23 +490,23 @@ public final class NetSocket extends AbstractSocket implements Runnable { if (var4 == 10) { if (var2 == 0) { - Client.field868 = 127; + Client.areaSoundEffectVolume = 127; } if (var2 == 1) { - Client.field868 = 96; + Client.areaSoundEffectVolume = 96; } if (var2 == 2) { - Client.field868 = 64; + Client.areaSoundEffectVolume = 64; } if (var2 == 3) { - Client.field868 = 32; + Client.areaSoundEffectVolume = 32; } if (var2 == 4) { - Client.field868 = 0; + Client.areaSoundEffectVolume = 0; } } diff --git a/runescape-client/src/main/java/class3.java b/runescape-client/src/main/java/class3.java index 0b53609bd4..af233e8cc4 100644 --- a/runescape-client/src/main/java/class3.java +++ b/runescape-client/src/main/java/class3.java @@ -167,13 +167,13 @@ public class class3 implements Enumerated { var5 += var4.y * 128 - var2; } - if (var5 - 64 <= var4.field1061 && Client.field868 != 0 && var0 == var4.plane) { + if (var5 - 64 <= var4.field1061 && Client.areaSoundEffectVolume != 0 && var0 == var4.plane) { var5 -= 64; if (var5 < 0) { var5 = 0; } - int var6 = (var4.field1061 - var5) * Client.field868 / var4.field1061; + int var6 = (var4.field1061 - var5) * Client.areaSoundEffectVolume / var4.field1061; if (var4.stream1 == null) { if (var4.soundEffectId >= 0) { SoundEffect var7 = SoundEffect.readSoundEffect(GrandExchangeOfferAgeComparator.archive4, var4.soundEffectId, 0); diff --git a/runescape-client/src/main/java/class30.java b/runescape-client/src/main/java/class30.java index 32c030e4b6..6c4842bfeb 100644 --- a/runescape-client/src/main/java/class30.java +++ b/runescape-client/src/main/java/class30.java @@ -122,7 +122,7 @@ public class class30 { ) @Export("addSequenceSoundEffect") static void addSequenceSoundEffect(SequenceDefinition var0, int var1, int var2, int var3) { - if (Client.soundEffectCount < 50 && Client.field868 != 0) { + if (Client.soundEffectCount < 50 && Client.areaSoundEffectVolume != 0) { if (var0.soundEffects != null && var1 < var0.soundEffects.length) { int var4 = var0.soundEffects[var1]; if (var4 != 0) {