Repository: petertalbanese/SoundSwapper
Pull request #25: Implemented simple sound ID Swapping to soundswapper plugin
Author: login: touchtouch105
Created: 2025-05-01T16:37:51Z | Merged: 2025-05-19T01:35:53Z

Added configuration option to allow for direct replacement of one sound id for another.


Diff:
diff --git a/README.md b/README.md
index c79b8da..ada7347 100644
--- a/README.md
+++ b/README.md
@@ -11,4 +11,17 @@ Plugin on the hub.
 
 If you experience any issues or have any concerns, please reach out to Pete OR Damen via a GitHub Issue or by Discord Messaging directly ("Cyber#4309" OR "damen") OR via the Runelite Discord by mentioning @Paperman AND/OR @Damen.
 
-You can also receive assistance for any plugin that Damen manages on the plugin hub in the following **Discord**: https://discord.gg/F2mfSvcnaj - This Discord will cover FAQ, Known Issues, and Feature Requests.
\ No newline at end of file
+You can also receive assistance for any plugin that Damen manages on the plugin hub in the following **Discord**: https://discord.gg/F2mfSvcnaj - This Discord will cover FAQ, Known Issues, and Feature Requests.
+
+# Native Sound ID Swaps
+In order to replace one native sound ID with another native sound ID, the Native Sound ID section can be enabled and populated. 
+
+An example configuration to make sound ID 2508 play the sound corresponding to sound ID 3512 is:
+IDs to Replace: 2508
+Replacement IDs: 3892
+
+In order to add more entries, create a comma separated list of values in the 'IDs to Replace' field, and give them a corresponding replacement id in the 'Replacement IDs' field. 
+
+An example configuration of multiple native sound ID swaps:
+IDs to Replace: 2508,1234,1111
+Replacement IDs: 3892,1051,3892
\ No newline at end of file
diff --git a/src/main/java/com/soundswapper/SoundSwapperConfig.java b/src/main/java/com/soundswapper/SoundSwapperConfig.java
index 9708ce7..4aea785 100644
--- a/src/main/java/com/soundswapper/SoundSwapperConfig.java
+++ b/src/main/java/com/soundswapper/SoundSwapperConfig.java
@@ -47,6 +47,12 @@ public interface SoundSwapperConfig extends Config
     )
     String AREA_SOUND_EFFECTS_SECTION = "areaSoundEffects";
 
+    @ConfigSection(
+            name = "Native Sound ID Swaps",
+            description = "Configuration Settings for Simple Sound ID Substitutions",
+            position = 3
+    )
+    String SIMPLE_ID_SWAPS_SECTION = "nativeSoundIdSwaps";
     /**
      * Config Items
      */
@@ -228,4 +234,35 @@ default int customAreaSoundsVolume()
             position = 98
     )
     default boolean debugSoundEffects() { return false; }
+    @ConfigItem(
+            keyName = "nativeSoundIDSwapEnable",
+            name = "Enable Native ID Swaps",
+            description = "Enables direct replacements of native Sound IDs with another native Sound ID",
+            position = 1,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default boolean nativeSoundIDSwapEnable() { return false; }
+
+    @ConfigItem(
+            keyName = "nativeSoundIDsToReplace",
+            name = "IDs to Replace",
+            description = "Sound IDs to replace with replacement IDs. Comma separated vals. Ex: 2508,1321,1316",
+            position = 2,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default String nativeSoundIDsToReplace()
+    {
+        return "";
+    }
+    @ConfigItem(
+            keyName = "nativeSoundIDReplacements",
+            name = "Replacement IDs",
+            description = "Sound IDs to replace the items in IDs to replace",
+            position = 3,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default String nativeSoundIDReplacements()
+    {
+        return "";
+    }
 }
diff --git a/src/main/java/com/soundswapper/SoundSwapperPlugin.java b/src/main/java/com/soundswapper/SoundSwapperPlugin.java
index 48d1484..d9c7fa6 100644
--- a/src/main/java/com/soundswapper/SoundSwapperPlugin.java
+++ b/src/main/java/com/soundswapper/SoundSwapperPlugin.java
@@ -29,6 +29,8 @@
 import lombok.extern.slf4j.Slf4j;
 import net.runelite.api.Client;
 import net.runelite.api.GameState;
+import net.runelite.api.Preferences;
+import net.runelite.api.SoundEffectVolume;
 import net.runelite.api.events.AreaSoundEffectPlayed;
 import net.runelite.api.events.GameStateChanged;
 import net.runelite.api.events.SoundEffectPlayed;
@@ -85,6 +87,8 @@ public class SoundSwapperPlugin extends Plugin
     public List<Integer> whitelistedAreaSounds = new ArrayList<>();
     public List<Integer> blacklistedSounds = new ArrayList<>();
     public List<Integer> blacklistedAreaSounds = new ArrayList<>();
+    public List<Integer> nativeSoundIDsToSwap = new ArrayList<>();
+    public List<Integer> nativeSoundIDReplacements = new ArrayList<>();
 
     private static final File SOUND_DIR = new File(RuneLite.RUNELITE_DIR, "SoundSwapper");
 
@@ -182,6 +186,16 @@ public void onConfigChanged(ConfigChanged event)
                 });
                 break;
             }
+
+            case "nativeSoundIDsToReplace": {
+                nativeSoundIDsToSwap = getIds( event.getNewValue() );
+                break;
+            }
+
+            case "nativeSoundIDReplacements": {
+                nativeSoundIDReplacements = getIds( event.getNewValue() );
+                break;
+            }
         }
 
         soundEffectOverlay.resetLines();
@@ -218,6 +232,16 @@ void updateLists()
         {
             blacklistedAreaSounds = getIds(config.blacklistedAreaSounds());
         }
+
+        if (!config.nativeSoundIDsToReplace().isEmpty())
+        {
+            nativeSoundIDsToSwap = getIds(config.nativeSoundIDsToReplace());
+        }
+
+        if (!config.nativeSoundIDReplacements().isEmpty())
+        {
+            nativeSoundIDReplacements = getIds(config.nativeSoundIDReplacements());
+        }
     }
 
     @Subscribe
@@ -225,6 +249,30 @@ public void onSoundEffectPlayed(SoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.nativeSoundIDSwapEnable()) {
+            if (nativeSoundIDsToSwap.contains(soundId))
+            {
+                int idx = nativeSoundIDsToSwap.indexOf(soundId);
+                Preferences preferences = client.getPreferences();
+                int originalVolume = preferences.getSoundEffectVolume();
+                int soundVolume =  originalVolume;
+
+                if (config.enableCustomSoundsVolume())
+                {
+                    soundVolume = config.customSoundsVolume() * SoundEffectVolume.HIGH / 100;
+                }
+
+                if (idx < nativeSoundIDReplacements.size())
+                {
+                    event.consume();
+                    preferences.setSoundEffectVolume(soundVolume);
+                    client.playSoundEffect(nativeSoundIDReplacements.get(idx), soundVolume);
+                    preferences.setSoundEffectVolume(originalVolume);
+                    return;
+                }
+            }
+        }
+
         if (config.soundEffects())
         {
             if (customSounds.containsKey(soundId))
@@ -253,6 +301,30 @@ public void onAreaSoundEffectPlayed(AreaSoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.nativeSoundIDSwapEnable()) {
+            if (nativeSoundIDsToSwap.contains(soundId))
+            {
+                int idx = nativeSoundIDsToSwap.indexOf(soundId);
+                Preferences preferences = client.getPreferences();
+                int originalVolume = preferences.getAreaSoundEffectVolume();
+                int soundVolume =  originalVolume;
+
+                if (config.enableCustomSoundsVolume())
+                {
+                    soundVolume = config.customSoundsVolume() * SoundEffectVolume.HIGH / 100;
+                }
+
+                if (idx < nativeSoundIDReplacements.size())
+                {
+                    event.consume();
+                    preferences.setAreaSoundEffectVolume(soundVolume);
+                    client.playSoundEffect(nativeSoundIDReplacements.get(idx), soundVolume);
+                    preferences.setAreaSoundEffectVolume(originalVolume);
+                    return;
+                }
+            }
+        }
+
         if (config.areaSoundEffects())
         {
             if (customAreaSounds.containsKey(soundId))
@@ -397,6 +469,8 @@ private void reset()
         whitelistedAreaSounds = new ArrayList<>();
         blacklistedSounds = new ArrayList<>();
         blacklistedAreaSounds = new ArrayList<>();
+        nativeSoundIDsToSwap = new ArrayList<>();
+        nativeSoundIDReplacements = new ArrayList<>();
         soundEffectOverlay.resetLines();
     }
 }


Reviews:
user: login: petertalbanese
body: Thanks a bunch for putting this together 😄 I am definitely a fan of the idea!

I've left some comments for things to fix up. Also please make sure to:
1. Update the README.md with some info on these new configurations
2. Share a screenshot of the new settings so I can see what they look like (thanks)
3. Test this out with some spam-y sounds. I haven't used this method of playing sounds before so we should make sure it won't crash people clients. For example, when you click on a bank tab it always plays a "dink" sound. Try replacing that with something longer like a surge spell sound effect and then spam it a bunch to see if your game lags.

I haven't been on OSRS in a little while, but let me know if you need any help!
state: COMMENTED
author_association: OWNER
submitted_at: 2025-05-02T23:25:36Z
user: login: touchtouch105
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-03T00:44:30Z
user: login: touchtouch105
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-03T00:52:08Z
user: login: touchtouch105
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-03T01:13:12Z
user: login: touchtouch105
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-03T01:13:20Z
user: login: touchtouch105
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-03T01:14:53Z
user: login: petertalbanese
state: COMMENTED
author_association: OWNER
submitted_at: 2025-05-05T02:59:19Z
user: login: touchtouch105
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-05T23:59:32Z
user: login: petertalbanese
state: APPROVED
author_association: OWNER
submitted_at: 2025-05-17T02:44:45Z

Review comments:
diff_hunk: @@ -47,6 +47,12 @@ public interface SoundSwapperConfig extends Config
     )
     String AREA_SOUND_EFFECTS_SECTION = "areaSoundEffects";
 
+    @ConfigSection(
path: src/main/java/com/soundswapper/SoundSwapperConfig.java
user: login: petertalbanese
body: Can you please send a screenshot of the new settings interface in the PR conversation? Just want to see what it looks like with the new additions. Thanks!
created_at: 2025-05-02T22:46:15Z
author_association: OWNER
diff_hunk: @@ -218,13 +230,37 @@ void updateLists()
         {
             blacklistedAreaSounds = getIds(config.blacklistedAreaSounds());
         }
+
+        if (!config.simpleIdsToReplace().isEmpty())
+        {
+            simpleIdsToSwap = getIds(config.simpleIdsReplacements());
+        }
+
+        if (!config.simpleIdsReplacements().isEmpty())
+        {
+            simpleIdReplacements = getIds(config.simpleIdsReplacements());
+        }
     }
 
     @Subscribe
     public void onSoundEffectPlayed(SoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.simpleIdSwaps()) {
+            if (simpleIdsToSwap.contains(soundId))
+            {
+                int idx = simpleIdsToSwap.indexOf(soundId);
+
+                if (idx < simpleIdReplacements.size())
+                {
+                    event.consume();
+                    soundId = -1;
path: src/main/java/com/soundswapper/SoundSwapperPlugin.java
user: login: petertalbanese
body: You can remove this line and instead add a `return` at the end of the `if (simpleIdsToSwap.contains(soundId))` block. We don't want the same sound to trigger multiple swaps/custom sounds.
created_at: 2025-05-02T22:50:08Z
author_association: OWNER
diff_hunk: @@ -218,13 +230,37 @@ void updateLists()
         {
             blacklistedAreaSounds = getIds(config.blacklistedAreaSounds());
         }
+
+        if (!config.simpleIdsToReplace().isEmpty())
+        {
+            simpleIdsToSwap = getIds(config.simpleIdsReplacements());
+        }
+
+        if (!config.simpleIdsReplacements().isEmpty())
+        {
+            simpleIdReplacements = getIds(config.simpleIdsReplacements());
+        }
     }
 
     @Subscribe
     public void onSoundEffectPlayed(SoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.simpleIdSwaps()) {
+            if (simpleIdsToSwap.contains(soundId))
+            {
+                int idx = simpleIdsToSwap.indexOf(soundId);
+
+                if (idx < simpleIdReplacements.size())
+                {
+                    event.consume();
+                    soundId = -1;
+                    client.playSoundEffect(simpleIdReplacements.get(idx), 100 );
path: src/main/java/com/soundswapper/SoundSwapperPlugin.java
user: login: petertalbanese
body: We should use the custom volume if it is configured, otherwise use the default client setting:
```
if (config.enableCustomSoundsVolume())
{
    // Client sound is scaled from 0-127. Ours is 0-100.
    int volume = (config.customSoundsVolume() / 100) * SoundEffectVolume.HIGH;
    client.playSoundEffect(simpleIdReplacements.get(idx), volume);
}
else 
{
    client.playSoundEffect(simpleIdReplacements.get(idx));
}
```

Please double check that the volume rounds correctly so we don't blow people eardrums out haha.
created_at: 2025-05-02T23:06:07Z
author_association: OWNER
diff_hunk: @@ -228,4 +234,35 @@ default int customAreaSoundsVolume()
             position = 98
     )
     default boolean debugSoundEffects() { return false; }
+    @ConfigItem(
+            keyName = "simpleIdSwapsEnable",
+            name = "Enable Simple ID Swaps",
+            description = "Enables direct replacements of sound ID with another sound",
+            position = 1,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default boolean simpleIdSwaps() { return false; }
+
+    @ConfigItem(
+            keyName = "simpleIdsToReplace",
+            name = "IDs to Replace",
+            description = "Sound IDs to replace with replacement IDs. Comma separated vals. Ex: 2508,1321,1316",
+            position = 2,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default String simpleIdsToReplace()
+    {
+        return "";
+    }
+    @ConfigItem(
+            keyName = "simpleIdsReplacements",
+            name = "Replacement IDs",
+            description = "Sound IDs to Replace the 'IDs to Replace' field.Comma separated vals. Ex: 1111,2222,3333",
path: src/main/java/com/soundswapper/SoundSwapperConfig.java
user: login: petertalbanese
body: Tiny nit:

`field.Comma` -> `field. Comma`
created_at: 2025-05-02T23:08:03Z
author_association: OWNER
diff_hunk: @@ -47,6 +47,12 @@ public interface SoundSwapperConfig extends Config
     )
     String AREA_SOUND_EFFECTS_SECTION = "areaSoundEffects";
 
+    @ConfigSection(
+            name = "Simple ID Swaps",
path: src/main/java/com/soundswapper/SoundSwapperConfig.java
user: login: petertalbanese
body: Open to other suggestions, but I'd prefer to have a slightly more descriptive name for this. Maybe something like `In-Game Sound ID Swaps` or `Native Sound ID Swaps`. Just to make it clear that this is for utilizing sounds that exist as part of OSRS.

Then other configs below would look like:
```
            keyName = "nativeSoundIDSwapsEnable",
            name = "Enable Native Sound ID Swaps",
            description = "Enables direct replacement of sound IDs with other in-game sounds",
            ...
```
created_at: 2025-05-02T23:16:01Z
author_association: OWNER
diff_hunk: @@ -228,4 +234,35 @@ default int customAreaSoundsVolume()
             position = 98
     )
     default boolean debugSoundEffects() { return false; }
+    @ConfigItem(
+            keyName = "simpleIdSwapsEnable",
+            name = "Enable Simple ID Swaps",
+            description = "Enables direct replacements of sound ID with another sound",
+            position = 1,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default boolean simpleIdSwaps() { return false; }
+
+    @ConfigItem(
path: src/main/java/com/soundswapper/SoundSwapperConfig.java
user: login: petertalbanese
body: Please add some info to the README.md file to explain how these new fields work. Mention that the sounds in List A will be replaced with the sounds  at the same indexes in List B, that the lists should be the same length, etc.
created_at: 2025-05-02T23:18:54Z
author_association: OWNER
diff_hunk: @@ -253,6 +289,20 @@ public void onAreaSoundEffectPlayed(AreaSoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.simpleIdSwaps()) {
+            if (simpleIdsToSwap.contains(soundId))
+            {
+                int idx = simpleIdsToSwap.indexOf(soundId);
+
+                if (idx < simpleIdReplacements.size())
+                {
+                    event.consume();
+                    soundId = -1;
path: src/main/java/com/soundswapper/SoundSwapperPlugin.java
user: login: petertalbanese
body: Same comments as above. Use a `return` statement to prevent double-processing sounds and use the `customAreaSoundsVolume` if it is configured.
created_at: 2025-05-02T23:20:28Z
author_association: OWNER
diff_hunk: @@ -47,6 +47,12 @@ public interface SoundSwapperConfig extends Config
     )
     String AREA_SOUND_EFFECTS_SECTION = "areaSoundEffects";
 
+    @ConfigSection(
path: src/main/java/com/soundswapper/SoundSwapperConfig.java
user: login: touchtouch105
body: Adds this section below the main
![image](https://github.com/user-attachments/assets/03cf933d-63cd-439b-be9a-cad26632f087)
![image](https://github.com/user-attachments/assets/87979006-67b8-43d3-a948-8dd5d28f84a0)

created_at: 2025-05-03T00:44:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -228,4 +234,35 @@ default int customAreaSoundsVolume()
             position = 98
     )
     default boolean debugSoundEffects() { return false; }
+    @ConfigItem(
+            keyName = "simpleIdSwapsEnable",
+            name = "Enable Simple ID Swaps",
+            description = "Enables direct replacements of sound ID with another sound",
+            position = 1,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default boolean simpleIdSwaps() { return false; }
+
+    @ConfigItem(
+            keyName = "simpleIdsToReplace",
+            name = "IDs to Replace",
+            description = "Sound IDs to replace with replacement IDs. Comma separated vals. Ex: 2508,1321,1316",
+            position = 2,
+            section = SIMPLE_ID_SWAPS_SECTION
+    )
+    default String simpleIdsToReplace()
+    {
+        return "";
+    }
+    @ConfigItem(
+            keyName = "simpleIdsReplacements",
+            name = "Replacement IDs",
+            description = "Sound IDs to Replace the 'IDs to Replace' field.Comma separated vals. Ex: 1111,2222,3333",
path: src/main/java/com/soundswapper/SoundSwapperConfig.java
user: login: touchtouch105
body: seem to have ignored white spaces on this commit or something, its not like that locally, weird
created_at: 2025-05-03T00:52:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -218,13 +230,37 @@ void updateLists()
         {
             blacklistedAreaSounds = getIds(config.blacklistedAreaSounds());
         }
+
+        if (!config.simpleIdsToReplace().isEmpty())
+        {
+            simpleIdsToSwap = getIds(config.simpleIdsReplacements());
+        }
+
+        if (!config.simpleIdsReplacements().isEmpty())
+        {
+            simpleIdReplacements = getIds(config.simpleIdsReplacements());
+        }
     }
 
     @Subscribe
     public void onSoundEffectPlayed(SoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.simpleIdSwaps()) {
+            if (simpleIdsToSwap.contains(soundId))
+            {
+                int idx = simpleIdsToSwap.indexOf(soundId);
+
+                if (idx < simpleIdReplacements.size())
+                {
+                    event.consume();
+                    soundId = -1;
+                    client.playSoundEffect(simpleIdReplacements.get(idx), 100 );
path: src/main/java/com/soundswapper/SoundSwapperPlugin.java
user: login: touchtouch105
body: good shout on this, i played around with swapping bank tab swapping noise to acb spec noise and it did in fact blow my ear drums out
created_at: 2025-05-03T01:13:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -218,13 +230,37 @@ void updateLists()
         {
             blacklistedAreaSounds = getIds(config.blacklistedAreaSounds());
         }
+
+        if (!config.simpleIdsToReplace().isEmpty())
+        {
+            simpleIdsToSwap = getIds(config.simpleIdsReplacements());
+        }
+
+        if (!config.simpleIdsReplacements().isEmpty())
+        {
+            simpleIdReplacements = getIds(config.simpleIdsReplacements());
+        }
     }
 
     @Subscribe
     public void onSoundEffectPlayed(SoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.simpleIdSwaps()) {
+            if (simpleIdsToSwap.contains(soundId))
+            {
+                int idx = simpleIdsToSwap.indexOf(soundId);
+
+                if (idx < simpleIdReplacements.size())
+                {
+                    event.consume();
+                    soundId = -1;
path: src/main/java/com/soundswapper/SoundSwapperPlugin.java
user: login: touchtouch105
body: roger dodger
created_at: 2025-05-03T01:13:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -47,6 +47,12 @@ public interface SoundSwapperConfig extends Config
     )
     String AREA_SOUND_EFFECTS_SECTION = "areaSoundEffects";
 
+    @ConfigSection(
path: src/main/java/com/soundswapper/SoundSwapperConfig.java
user: login: touchtouch105
body: Updating based off feedback
![image](https://github.com/user-attachments/assets/2c818100-33be-406e-b722-e3b9c4a5248d)

created_at: 2025-05-03T01:14:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -218,13 +232,47 @@ void updateLists()
         {
             blacklistedAreaSounds = getIds(config.blacklistedAreaSounds());
         }
+
+        if (!config.nativeSoundIDsToReplace().isEmpty())
+        {
+            nativeSoundIDsToSwap = getIds(config.nativeSoundIDsToReplace());
+        }
+
+        if (!config.nativeSoundIDReplacements().isEmpty())
+        {
+            nativeSoundIDReplacements = getIds(config.nativeSoundIDReplacements());
+        }
     }
 
     @Subscribe
     public void onSoundEffectPlayed(SoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.nativeSoundIDSwapEnable()) {
+            if (nativeSoundIDsToSwap.contains(soundId))
+            {
+                int idx = nativeSoundIDsToSwap.indexOf(soundId);
+                Preferences preferences = client.getPreferences();
path: src/main/java/com/soundswapper/SoundSwapperPlugin.java
user: login: petertalbanese
body: I don't think it's necessary to do this extra configuration. If you call `client.playSoundEffect(id, volume)`, it'll override the client's sound volume for that one instance. Calling `client.playSoundEffect(id)` (without the `volume` argument)  uses the client preference by default.
created_at: 2025-05-05T01:48:27Z
author_association: OWNER
diff_hunk: @@ -218,13 +232,47 @@ void updateLists()
         {
             blacklistedAreaSounds = getIds(config.blacklistedAreaSounds());
         }
+
+        if (!config.nativeSoundIDsToReplace().isEmpty())
+        {
+            nativeSoundIDsToSwap = getIds(config.nativeSoundIDsToReplace());
+        }
+
+        if (!config.nativeSoundIDReplacements().isEmpty())
+        {
+            nativeSoundIDReplacements = getIds(config.nativeSoundIDReplacements());
+        }
     }
 
     @Subscribe
     public void onSoundEffectPlayed(SoundEffectPlayed event)
     {
         int soundId = event.getSoundId();
 
+        if (config.nativeSoundIDSwapEnable()) {
+            if (nativeSoundIDsToSwap.contains(soundId))
+            {
+                int idx = nativeSoundIDsToSwap.indexOf(soundId);
+                Preferences preferences = client.getPreferences();
path: src/main/java/com/soundswapper/SoundSwapperPlugin.java
user: login: touchtouch105
body: Weirdly it seemingly was, couldnt tell you why but without that changing the volume parameter did nothing. Ended up getting that from other plugins that messed with area/sound effect sounds as well, because i was super confused on why it wasnt working
created_at: 2025-05-05T23:59:32Z
author_association: CONTRIBUTOR

PR comments:
user: login: touchtouch105
created_at: 2025-05-03T01:26:16Z
body: Comments addressed. Let me know if you have any further feedback :). Also, I did as you said and replaced bank tab switch sound with arma crossbow spec sound and no crashes or lag so seemed fine on that front
author_association: CONTRIBUTOR
user: login: petertalbanese
created_at: 2025-05-17T02:44:20Z
body: Sorry for the delay on this! Was traveling for work for a couple weeks. LGTM!
author_association: OWNER