From b3991f219d99945ee67aab7aec90792514a47376 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Wed, 30 Oct 2019 05:46:45 +0100 Subject: [PATCH] project: music plugin --- .../client/plugins/music/MusicPlugin.java | 3 -- .../net/runelite/mixins/RSClientMixin.java | 20 ++++++++++- .../java/net/runelite/rs/api/RSClient.java | 18 ++++++++-- .../net/runelite/rs/api/RSMidiPcmStream.java | 33 +++++++++++++++++++ runescape-client/src/main/java/Client.java | 9 ++--- .../src/main/java/ClientPacket.java | 2 +- .../src/main/java/DynamicObject.java | 4 +-- .../src/main/java/HealthBarUpdate.java | 4 +-- .../src/main/java/MidiPcmStream.java | 3 +- .../src/main/java/MouseRecorder.java | 2 +- .../src/main/java/MusicPatchNode2.java | 6 ++-- runescape-client/src/main/java/NetSocket.java | 8 ++--- runescape-client/src/main/java/TileItem.java | 3 +- .../src/main/java/UserComparator4.java | 2 +- .../src/main/java/WorldMapData_0.java | 2 +- .../src/main/java/WorldMapSprite.java | 2 +- runescape-client/src/main/java/class83.java | 6 ++-- 17 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.java 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 index 2c23510a81..5c1b2d5b87 100644 --- 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 @@ -37,7 +37,6 @@ 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; @@ -73,7 +72,6 @@ import net.runelite.client.plugins.PluginDescriptor; name = "Music", description = "Adds search and filter for the music list, and additional volume control" ) -@Slf4j public class MusicPlugin extends Plugin { @Inject @@ -220,7 +218,6 @@ public class MusicPlugin extends Plugin private void onVolumeChanged(VolumeChanged volumeChanged) { - log.info(volumeChanged.getType().toString()); applyMusicVolumeConfig(); } 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 1df200fe01..2cacebda23 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -1784,6 +1784,24 @@ public abstract class RSClientMixin implements RSClient } } + @Inject + @Override + public void setMusicVolume(int volume) + { + if (volume > 0 && client.getMusicVolume() <= 0 && client.getcurrentTrackGroupId() != -1) + { + client.playMusicTrack(client.getMusicTracks(), client.getcurrentTrackGroupId(), 0, volume, false); + } + + client.setClientMusicVolume(volume); + client.setMusicTrackVolume(volume); + if (client.getMidiPcmStream() != null) + { + client.getMidiPcmStream().setPcmStreamVolume(volume); + } + } + + @Copy("changeGameOptions") public static void rs$changeGameOptions(int var0) { @@ -1798,7 +1816,7 @@ public abstract class RSClientMixin implements RSClient int type = client.getVarpDefinition(var0).getType(); if (type == 3 || type == 4 || type == 10) { - VolumeChanged volumeChanged = new VolumeChanged(null); + VolumeChanged volumeChanged = new VolumeChanged(type == 3 ? VolumeChanged.Type.MUSIC : type == 4 ? VolumeChanged.Type.EFFECTS : VolumeChanged.Type.AREA); client.getCallbacks().post(VolumeChanged.class, volumeChanged); } } 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 f863d9afbe..9220907d8c 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 @@ -449,6 +449,9 @@ public interface RSClient extends RSGameShell, Client @Import("SpriteBuffer_spritePalette") void setIndexedSpritePalette(int[] indexedSpritePalette); + @Import("archive6") + RSAbstractArchive getMusicTracks(); + @Import("archive8") @Override RSAbstractArchive getIndexSprites(); @@ -1047,8 +1050,7 @@ public interface RSClient extends RSGameShell, Client int getMusicVolume(); @Import("musicVolume") - @Override - void setMusicVolume(int volume); + void setClientMusicVolume(int volume); @Import("areaSoundEffectVolume") @Override @@ -1066,9 +1068,21 @@ public interface RSClient extends RSGameShell, Client @Override void setSoundEffectVolume(int volume); + @Import("musicTrackVolume") + void setMusicTrackVolume(int volume); + @Import("viewportWalking") void setViewportWalking(boolean viewportWalking); + @Import("playMusicTrack") + void playMusicTrack(RSAbstractArchive var0, int var1, int var2, int var3, boolean var4); + + @Import("midiPcmStream") + RSMidiPcmStream getMidiPcmStream(); + + @Import("currentTrackGroupId") + int getcurrentTrackGroupId(); + @Import("crossSprites") @Override RSSprite[] getCrossSprites(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.java b/runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.java new file mode 100644 index 0000000000..596fed9c2a --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSMidiPcmStream.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018, trimbe + * 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.rs.api; + +import net.runelite.mapping.Import; + +public interface RSMidiPcmStream +{ + @Import("setPcmStreamVolume") + void setPcmStreamVolume(int volume); +} diff --git a/runescape-client/src/main/java/Client.java b/runescape-client/src/main/java/Client.java index ed958509cf..b180621394 100644 --- a/runescape-client/src/main/java/Client.java +++ b/runescape-client/src/main/java/Client.java @@ -202,7 +202,8 @@ public final class Client extends GameShell implements Usernamed { @ObfuscatedGetter( intValue = -910754411 ) - static int field666; + @Export("currentTrackGroupId") + static int currentTrackGroupId; @ObfuscatedName("mo") @ObfuscatedGetter( intValue = -1946560921 @@ -1511,7 +1512,7 @@ public final class Client extends GameShell implements Usernamed { destinationY = 0; minimapState = 0; musicVolume = 255; - field666 = -1; + currentTrackGroupId = -1; field759 = false; soundEffectVolume = 127; areaSoundEffectVolume = 127; @@ -1653,7 +1654,7 @@ public final class Client extends GameShell implements Usernamed { var5 = 0; } - class49.midiPcmStream.method3760(var5); + class49.midiPcmStream.setPcmStreamVolume(var5); } else { class49.midiPcmStream.clear(); class49.midiPcmStream.removeAll(); @@ -1765,7 +1766,7 @@ public final class Client extends GameShell implements Usernamed { if (class49.midiPcmStream.loadMusicTrack(class197.musicTrack, class197.musicPatchesArchive, FriendLoginUpdate.soundCache, 22050)) { class49.midiPcmStream.clearAll(); - class49.midiPcmStream.method3760(TileItem.field1223); + class49.midiPcmStream.setPcmStreamVolume(TileItem.musicTrackVolume); class49.midiPcmStream.setMusicTrack(class197.musicTrack, WorldMapSectionType.musicTrackBoolean); class197.field2386 = 0; class197.musicTrack = null; diff --git a/runescape-client/src/main/java/ClientPacket.java b/runescape-client/src/main/java/ClientPacket.java index 1aa118148e..0a4c2d67e8 100644 --- a/runescape-client/src/main/java/ClientPacket.java +++ b/runescape-client/src/main/java/ClientPacket.java @@ -705,7 +705,7 @@ public class ClientPacket implements class181 { @Export("playSoundJingle") static void playSoundJingle(int var0, int var1) { if (Client.musicVolume != 0 && var0 != -1) { - class83.method2068(ClanMate.archive11, var0, 0, Client.musicVolume, false); + class83.playMusicTrack(ClanMate.archive11, var0, 0, Client.musicVolume, false); Client.field759 = true; } diff --git a/runescape-client/src/main/java/DynamicObject.java b/runescape-client/src/main/java/DynamicObject.java index 4fca28b6c8..70af692726 100644 --- a/runescape-client/src/main/java/DynamicObject.java +++ b/runescape-client/src/main/java/DynamicObject.java @@ -213,10 +213,10 @@ public class DynamicObject extends Entity { class197.musicTrackArchive = null; class188.musicTrackGroupId = -1; class49.musicTrackFileId = -1; - TileItem.field1223 = 0; + TileItem.musicTrackVolume = 0; WorldMapSectionType.musicTrackBoolean = false; MusicPatchNode2.field2382 = 2; - Client.field666 = -1; + Client.currentTrackGroupId = -1; Client.field759 = false; ClientPacket.method3581(); MouseRecorder.updateGameState(10); diff --git a/runescape-client/src/main/java/HealthBarUpdate.java b/runescape-client/src/main/java/HealthBarUpdate.java index f708052a85..9ee52efe8e 100644 --- a/runescape-client/src/main/java/HealthBarUpdate.java +++ b/runescape-client/src/main/java/HealthBarUpdate.java @@ -151,8 +151,8 @@ public class HealthBarUpdate extends Node { } if (!var12) { - if (Client.musicVolume != 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, Client.musicVolume, false); + if (Client.musicVolume != 0 && Client.currentTrackGroupId != -1) { + class83.playMusicTrack(class225.archive6, Client.currentTrackGroupId, 0, Client.musicVolume, false); } Client.field759 = false; diff --git a/runescape-client/src/main/java/MidiPcmStream.java b/runescape-client/src/main/java/MidiPcmStream.java index 8517ab3ad0..1328296848 100644 --- a/runescape-client/src/main/java/MidiPcmStream.java +++ b/runescape-client/src/main/java/MidiPcmStream.java @@ -131,7 +131,8 @@ public class MidiPcmStream extends PcmStream { signature = "(II)V", garbageValue = "-1812413582" ) - public synchronized void method3760(int var1) { + @Export("setPcmStreamVolume") + public synchronized void setPcmStreamVolume(int var1) { this.field2393 = var1; } diff --git a/runescape-client/src/main/java/MouseRecorder.java b/runescape-client/src/main/java/MouseRecorder.java index 27b34c85d8..e4c96908da 100644 --- a/runescape-client/src/main/java/MouseRecorder.java +++ b/runescape-client/src/main/java/MouseRecorder.java @@ -205,7 +205,7 @@ public class MouseRecorder implements Runnable { class197.musicTrackArchive = null; class188.musicTrackGroupId = -1; class49.musicTrackFileId = -1; - TileItem.field1223 = 0; + TileItem.musicTrackVolume = 0; WorldMapSectionType.musicTrackBoolean = false; MusicPatchNode2.field2382 = 2; DirectByteArrayCopier.method3924(true); diff --git a/runescape-client/src/main/java/MusicPatchNode2.java b/runescape-client/src/main/java/MusicPatchNode2.java index a5e9bec39c..b8d9652cc8 100644 --- a/runescape-client/src/main/java/MusicPatchNode2.java +++ b/runescape-client/src/main/java/MusicPatchNode2.java @@ -64,19 +64,19 @@ public class MusicPatchNode2 { static void playSong(int var0) { if (var0 == -1 && !Client.field759) { VertexNormal.method2960(); - } else if (var0 != -1 && var0 != Client.field666 && Client.musicVolume != 0 && !Client.field759) { + } else if (var0 != -1 && var0 != Client.currentTrackGroupId && Client.musicVolume != 0 && !Client.field759) { Archive var1 = class225.archive6; int var2 = Client.musicVolume; class197.field2386 = 1; class197.musicTrackArchive = var1; class188.musicTrackGroupId = var0; class49.musicTrackFileId = 0; - TileItem.field1223 = var2; + TileItem.musicTrackVolume = var2; WorldMapSectionType.musicTrackBoolean = false; field2382 = 2; } - Client.field666 = var0; + Client.currentTrackGroupId = var0; } @ObfuscatedName("ic") diff --git a/runescape-client/src/main/java/NetSocket.java b/runescape-client/src/main/java/NetSocket.java index 9207e17a34..91bd0f9c49 100644 --- a/runescape-client/src/main/java/NetSocket.java +++ b/runescape-client/src/main/java/NetSocket.java @@ -438,16 +438,16 @@ public final class NetSocket extends AbstractSocket implements Runnable { } if (var3 != Client.musicVolume) { - if (Client.musicVolume == 0 && Client.field666 != -1) { - class83.method2068(class225.archive6, Client.field666, 0, var3, false); + if (Client.musicVolume == 0 && Client.currentTrackGroupId != -1) { + class83.playMusicTrack(class225.archive6, Client.currentTrackGroupId, 0, var3, false); Client.field759 = false; } else if (var3 == 0) { VertexNormal.method2960(); Client.field759 = false; } else if (class197.field2386 != 0) { - TileItem.field1223 = var3; + TileItem.musicTrackVolume = var3; } else { - class49.midiPcmStream.method3760(var3); + class49.midiPcmStream.setPcmStreamVolume(var3); } Client.musicVolume = var3; diff --git a/runescape-client/src/main/java/TileItem.java b/runescape-client/src/main/java/TileItem.java index 434cb090cf..ed26f437dc 100644 --- a/runescape-client/src/main/java/TileItem.java +++ b/runescape-client/src/main/java/TileItem.java @@ -17,7 +17,8 @@ public final class TileItem extends Entity { @ObfuscatedGetter( intValue = 1727946021 ) - public static int field1223; + @Export("musicTrackVolume") + public static int musicTrackVolume; @ObfuscatedName("z") @ObfuscatedGetter( intValue = -1488876063 diff --git a/runescape-client/src/main/java/UserComparator4.java b/runescape-client/src/main/java/UserComparator4.java index b378fd8030..57a91245ec 100644 --- a/runescape-client/src/main/java/UserComparator4.java +++ b/runescape-client/src/main/java/UserComparator4.java @@ -43,7 +43,7 @@ public class UserComparator4 implements Comparator { public static void method3349(AbstractArchive var0, String var1, String var2, int var3, boolean var4) { int var5 = var0.getGroupId(var1); int var6 = var0.getFileId(var5, var2); - class83.method2068(var0, var5, var6, var3, var4); + class83.playMusicTrack(var0, var5, var6, var3, var4); } @ObfuscatedName("ka") diff --git a/runescape-client/src/main/java/WorldMapData_0.java b/runescape-client/src/main/java/WorldMapData_0.java index e53aa1e1bd..4ad065e0e8 100644 --- a/runescape-client/src/main/java/WorldMapData_0.java +++ b/runescape-client/src/main/java/WorldMapData_0.java @@ -263,7 +263,7 @@ public class WorldMapData_0 extends AbstractWorldMapData { class197.musicTrackArchive = var1; class188.musicTrackGroupId = var6; class49.musicTrackFileId = var7; - TileItem.field1223 = var4; + TileItem.musicTrackVolume = var4; WorldMapSectionType.musicTrackBoolean = var5; MusicPatchNode2.field2382 = var0; } diff --git a/runescape-client/src/main/java/WorldMapSprite.java b/runescape-client/src/main/java/WorldMapSprite.java index 8b9b430622..ead6c24039 100644 --- a/runescape-client/src/main/java/WorldMapSprite.java +++ b/runescape-client/src/main/java/WorldMapSprite.java @@ -107,7 +107,7 @@ public final class WorldMapSprite { class197.musicTrackArchive = null; class188.musicTrackGroupId = -1; class49.musicTrackFileId = -1; - TileItem.field1223 = 0; + TileItem.musicTrackVolume = 0; WorldMapSectionType.musicTrackBoolean = false; MusicPatchNode2.field2382 = 2; } diff --git a/runescape-client/src/main/java/class83.java b/runescape-client/src/main/java/class83.java index 029b7c87e1..7f501cdb88 100644 --- a/runescape-client/src/main/java/class83.java +++ b/runescape-client/src/main/java/class83.java @@ -1,5 +1,6 @@ import java.awt.Component; import java.math.BigInteger; +import net.runelite.mapping.Export; import net.runelite.mapping.ObfuscatedGetter; import net.runelite.mapping.ObfuscatedName; import net.runelite.mapping.ObfuscatedSignature; @@ -37,12 +38,13 @@ public class class83 { signature = "(Lhp;IIIZI)V", garbageValue = "-476776598" ) - public static void method2068(AbstractArchive var0, int var1, int var2, int var3, boolean var4) { + @Export("playMusicTrack") + public static void playMusicTrack(AbstractArchive var0, int var1, int var2, int var3, boolean var4) { class197.field2386 = 1; class197.musicTrackArchive = var0; class188.musicTrackGroupId = var1; class49.musicTrackFileId = var2; - TileItem.field1223 = var3; + TileItem.musicTrackVolume = var3; WorldMapSectionType.musicTrackBoolean = var4; MusicPatchNode2.field2382 = 10000; }