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 2234494131..000879a802 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -177,5 +177,24 @@ public interface Client extends GameEngine List getProjectiles(); + /** + * Play a sound effect at the player's current location. + * This is how UI, and player-generated (e.g. mining, woodcutting) sound effects are normally played + * + * @param id the ID of the sound to play + */ + void playSoundEffect(int id); + + /** + * Play a sound effect from some point in the world. + * + * @param id the ID of the sound to play + * @param x the ground coordinate on the x axis + * @param y the ground coordinate on the y axis + * @param range the number of tiles away that the sound can be heard from + */ + void playSoundEffect(int id, int x, int y, int range); + + BufferProvider getBufferProvider(); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java new file mode 100644 index 0000000000..456dac2765 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/PlaySoundEffectMixin.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * 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.mixins; + +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSClient; +import net.runelite.rs.api.RSSoundEffect; + +@Mixin(RSClient.class) +public abstract class PlaySoundEffectMixin implements RSClient +{ + + @Inject + @Override + public void playSoundEffect(int id) + { + playSoundEffect(id, 0, 0, 0); + } + + @Inject + @Override + public void playSoundEffect(int id, int x, int y, int range) + { + int position = ((x & 255) << 16) + ((y & 255) << 8) + (range & 255); + + int[] queuedSoundEffectIDs = getQueuedSoundEffectIDs(); + int[] unknownSoundValues1 = getUnknownSoundValues1(); + int[] unknownSoundValues2 = getUnknownSoundValues2(); + RSSoundEffect[] audioEffects = getAudioEffects(); + int[] soundLocations = getSoundLocations(); + int queuedSoundEffectCount = getQueuedSoundEffectCount(); + + queuedSoundEffectIDs[queuedSoundEffectCount] = id; + unknownSoundValues1[queuedSoundEffectCount] = 0; + unknownSoundValues2[queuedSoundEffectCount] = 0; + audioEffects[queuedSoundEffectCount] = null; + soundLocations[queuedSoundEffectCount] = position; + + setQueuedSoundEffectCount(queuedSoundEffectCount + 1); + } +} 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 4d6865e185..1892c7e97f 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 @@ -352,6 +352,27 @@ public interface RSClient extends RSGameEngine, Client @Override boolean isIgnored(String name); + @Import("audioEffects") + RSSoundEffect[] getAudioEffects(); + + @Import("queuedSoundEffectIDs") + int[] getQueuedSoundEffectIDs(); + + @Import("soundLocations") + int[] getSoundLocations(); + + @Import("unknownSoundValues1") + int[] getUnknownSoundValues1(); + + @Import("unknownSoundValues2") + int[] getUnknownSoundValues2(); + + @Import("queuedSoundEffectCount") + int getQueuedSoundEffectCount(); + + @Import("queuedSoundEffectCount") + void setQueuedSoundEffectCount(int queuedSoundEffectCount); + @Import("rasterProvider") @Override BufferProvider getBufferProvider(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java new file mode 100644 index 0000000000..4ced2f19d5 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSoundEffect.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * 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; + +public interface RSSoundEffect +{ +}