diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index b05967307e..407a3b17f3 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -317,6 +317,7 @@ ttf png gif + wav diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index be6fef1d6d..4c349b2131 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -31,10 +31,10 @@ import net.runelite.api.Constants; public interface RuneLiteConfig extends Config { @ConfigItem( - keyName = "gameSize", - name = "Game size", - description = "The game will resize to this resolution upon starting the client", - position = 10 + keyName = "gameSize", + name = "Game size", + description = "The game will resize to this resolution upon starting the client", + position = 10 ) default Dimension gameSize() { @@ -42,10 +42,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "automaticResizeType", - name = "Resize type", - description = "Choose how the window should resize when opening and closing panels", - position = 11 + keyName = "automaticResizeType", + name = "Resize type", + description = "Choose how the window should resize when opening and closing panels", + position = 11 ) default ExpandResizeType automaticResizeType() { @@ -53,10 +53,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "lockWindowSize", - name = "Lock window size", - description = "Determines if the window resizing is allowed or not", - position = 12 + keyName = "lockWindowSize", + name = "Lock window size", + description = "Determines if the window resizing is allowed or not", + position = 12 ) default boolean lockWindowSize() { @@ -64,10 +64,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "enablePlugins", - name = "Enable loading of external plugins", - description = "Enable loading of external plugins", - position = 10 + keyName = "enablePlugins", + name = "Enable loading of external plugins", + description = "Enable loading of external plugins", + position = 10 ) default boolean enablePlugins() { @@ -75,10 +75,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "containInScreen", - name = "Contain in screen", - description = "Makes the client stay contained in the screen when attempted to move out of it.
Note: Only works if custom chrome is enabled.", - position = 13 + keyName = "containInScreen", + name = "Contain in screen", + description = "Makes the client stay contained in the screen when attempted to move out of it.
Note: Only works if custom chrome is enabled.", + position = 13 ) default boolean containInScreen() { @@ -86,10 +86,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "rememberScreenBounds", - name = "Remember client position", - description = "Save the position and size of the client after exiting", - position = 14 + keyName = "rememberScreenBounds", + name = "Remember client position", + description = "Save the position and size of the client after exiting", + position = 14 ) default boolean rememberScreenBounds() { @@ -97,11 +97,11 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "uiEnableCustomChrome", - name = "Enable custom window chrome", - description = "Use Runelite's custom window title and borders.", - warning = "Please restart your client after changing this setting", - position = 15 + keyName = "uiEnableCustomChrome", + name = "Enable custom window chrome", + description = "Use Runelite's custom window title and borders.", + warning = "Please restart your client after changing this setting", + position = 15 ) default boolean enableCustomChrome() { @@ -109,10 +109,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "gameAlwaysOnTop", - name = "Enable client always on top", - description = "The game will always be on the top of the screen", - position = 16 + keyName = "gameAlwaysOnTop", + name = "Enable client always on top", + description = "The game will always be on the top of the screen", + position = 16 ) default boolean gameAlwaysOnTop() { @@ -120,10 +120,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "warningOnExit", - name = "Display warning on exit", - description = "Toggles a warning popup when trying to exit the client", - position = 17 + keyName = "warningOnExit", + name = "Display warning on exit", + description = "Toggles a warning popup when trying to exit the client", + position = 17 ) default WarningOnExit warningOnExit() { @@ -131,10 +131,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "usernameInTitle", - name = "Show display name in title", - description = "Toggles displaying of local player's display name in client title", - position = 18 + keyName = "usernameInTitle", + name = "Show display name in title", + description = "Toggles displaying of local player's display name in client title", + position = 18 ) default boolean usernameInTitle() { @@ -142,10 +142,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "notificationTray", - name = "Enable tray notifications", - description = "Enables tray notifications", - position = 20 + keyName = "notificationTray", + name = "Enable tray notifications", + description = "Enables tray notifications", + position = 20 ) default boolean enableTrayNotifications() { @@ -153,10 +153,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "notificationRequestFocus", - name = "Request focus on notification", - description = "Toggles window focus request", - position = 21 + keyName = "notificationRequestFocus", + name = "Request focus on notification", + description = "Toggles window focus request", + position = 21 ) default boolean requestFocusOnNotification() { @@ -164,10 +164,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "notificationSound", - name = "Enable sound on notifications", - description = "Enables the playing of a beep sound when notifications are displayed", - position = 22 + keyName = "notificationSound", + name = "Enable sound on notifications", + description = "Enables the playing of a beep sound when notifications are displayed", + position = 22 ) default boolean enableNotificationSound() { @@ -175,10 +175,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "notificationGameMessage", - name = "Enable game message notifications", - description = "Puts a notification message in the chatbox", - position = 23 + keyName = "notificationGameMessage", + name = "Enable game message notifications", + description = "Puts a notification message in the chatbox", + position = 23 ) default boolean enableGameMessageNotification() { @@ -186,10 +186,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "notificationFlash", - name = "Enable flash notification", - description = "Flashes the game frame as a notification", - position = 24 + keyName = "notificationFlash", + name = "Enable flash notification", + description = "Flashes the game frame as a notification", + position = 24 ) default boolean enableFlashNotification() { @@ -197,10 +197,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "notificationFocused", - name = "Send notifications when focused", - description = "Toggles all notifications for when the client is focused", - position = 25 + keyName = "notificationFocused", + name = "Send notifications when focused", + description = "Toggles all notifications for when the client is focused", + position = 25 ) default boolean sendNotificationsWhenFocused() { @@ -208,10 +208,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "fontType", - name = "Dynamic Overlay Font", - description = "Configures what font type is used for in-game overlays such as player name, ground items, etc.", - position = 30 + keyName = "fontType", + name = "Dynamic Overlay Font", + description = "Configures what font type is used for in-game overlays such as player name, ground items, etc.", + position = 30 ) default FontType fontType() { @@ -219,10 +219,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "tooltipFontType", - name = "Tooltip Font", - description = "Configures what font type is used for in-game tooltips such as food stats, NPC names, etc.", - position = 31 + keyName = "tooltipFontType", + name = "Tooltip Font", + description = "Configures what font type is used for in-game tooltips such as food stats, NPC names, etc.", + position = 31 ) default FontType tooltipFontType() { @@ -230,10 +230,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "interfaceFontType", - name = "Interface Overlay Font", - description = "Configures what font type is used for in-game interface overlays such as panels, opponent info, clue scrolls etc.", - position = 32 + keyName = "interfaceFontType", + name = "Interface Overlay Font", + description = "Configures what font type is used for in-game interface overlays such as panels, opponent info, clue scrolls etc.", + position = 32 ) default FontType interfaceFontType() { @@ -241,10 +241,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "menuEntryShift", - name = "Require Shift for overlay menu", - description = "Overlay right-click menu will require shift to be added", - position = 33 + keyName = "menuEntryShift", + name = "Require Shift for overlay menu", + description = "Overlay right-click menu will require shift to be added", + position = 33 ) default boolean menuEntryShift() { @@ -252,10 +252,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "infoBoxVertical", - name = "Display infoboxes vertically", - description = "Toggles the infoboxes to display vertically", - position = 40 + keyName = "infoBoxVertical", + name = "Display infoboxes vertically", + description = "Toggles the infoboxes to display vertically", + position = 40 ) default boolean infoBoxVertical() { @@ -263,10 +263,10 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "infoBoxWrap", - name = "Infobox wrap count", - description = "Configures the amount of infoboxes shown before wrapping", - position = 41 + keyName = "infoBoxWrap", + name = "Infobox wrap count", + description = "Configures the amount of infoboxes shown before wrapping", + position = 41 ) default int infoBoxWrap() { @@ -274,13 +274,26 @@ public interface RuneLiteConfig extends Config } @ConfigItem( - keyName = "infoBoxSize", - name = "Infobox size (px)", - description = "Configures the size of each infobox in pixels", - position = 42 + keyName = "infoBoxSize", + name = "Infobox size (px)", + description = "Configures the size of each infobox in pixels", + position = 42 ) default int infoBoxSize() { return 35; } + + @Range( max = 100, min = 0 ) + @ConfigItem( + keyName = "volume", + name = "Runelite Volume", + description = "Sets the volume of custom Runelite sounds (not the client sounds)", + position = 43 + ) + default int volume() + { + return 100; + } + } diff --git a/runelite-client/src/main/java/net/runelite/client/game/Sound.java b/runelite-client/src/main/java/net/runelite/client/game/Sound.java new file mode 100644 index 0000000000..aeeddd8b34 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/Sound.java @@ -0,0 +1,41 @@ +package net.runelite.client.game; + +public enum Sound +{ + FIFTEEN_SECONDS(1, "net/runelite/client/game/sounds/15seconds.wav"), + FIVE_SECONDS(2, "net/runelite/client/game/sounds/5seconds.wav"), + ATTACK_WITH_MAGIC(3, "net/runelite/client/game/sounds/attackmagic.wav"), + ATTACK_WITH_MELEE(4, "net/runelite/client/game/sounds/attackmelee.wav"), + ATTACK_WITH_RANGED(5, "net/runelite/client/game/sounds/attackranged.wav"), + INCOMING(6, "net/runelite/client/game/sounds/incoming.wav"), + MOVE(7, "net/runelite/client/game/sounds/move.wav"), + PRAY_MAGIC(8, "net/runelite/client/game/sounds/praymagic.wav"), + PRAY_MELEE(9, "net/runelite/client/game/sounds/praymelee.wav"), + PRAY_RANGED(10, "net/runelite/client/game/sounds/prayranged.wav"), + REENABLE_PRAYER(11, "net/runelite/client/game/sounds/reenableprayer.wav"), + RUNAWAY(12, "net/runelite/client/game/sounds/runaway.wav"), + LOW_HEATLH(13, "net/runelite/client/game/sounds/lowhealth.wav"), + LOW_PRAYER(14, "net/runelite/client/game/sounds/lowprayer.wav"), + OUT_OF_COMBAT(15, "net/runelite/client/game/sounds/outofcombat.wav"), + RESTORED_SPECIAL_ATTACK(16, "net/runelite/client/game/sounds/restorespec.wav"), + IDLE(17, "net/runelite/client/game/sounds/idle.wav"); + + private String filePath; + private int id; + + private Sound(int id, String filePath) + { + this.id = id; + this.filePath = filePath; + } + + public String getFilePath() + { + return this.filePath; + } + + public int getId() + { + return this.id; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/game/SoundManager.java b/runelite-client/src/main/java/net/runelite/client/game/SoundManager.java new file mode 100644 index 0000000000..2ea639918c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/game/SoundManager.java @@ -0,0 +1,95 @@ +package net.runelite.client.game; + +import com.google.inject.Inject; +import java.io.IOException; +import javax.inject.Singleton; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.BooleanControl; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.FloatControl; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.UnsupportedAudioFileException; +import net.runelite.client.config.RuneLiteConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Singleton +public class SoundManager +{ + private static final Logger log = LoggerFactory.getLogger(SoundManager.class); + private final RuneLiteConfig runeliteConfig; + + @Inject + private SoundManager(RuneLiteConfig runeLiteConfig) + { + this.runeliteConfig = runeLiteConfig; + } + + public void playSound(final Sound sound) + { + new Thread(new Runnable() + { + + @Override + public void run() + { + try + { + AudioInputStream in = AudioSystem.getAudioInputStream(this.getClass().getClassLoader().getResource(sound.getFilePath())); + AudioFormat outFormat = SoundManager.this.getOutFormat(in.getFormat()); + DataLine.Info info = new DataLine.Info(SourceDataLine.class, outFormat); + SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info); + if (line != null) + { + line.open(outFormat, 2200); + if (line.isControlSupported(FloatControl.Type.MASTER_GAIN)) + { + int volume = SoundManager.this.runeliteConfig.volume(); + FloatControl gainControl = (FloatControl)line.getControl(FloatControl.Type.MASTER_GAIN); + BooleanControl muteControl = (BooleanControl)line.getControl(BooleanControl.Type.MUTE); + if (volume == 0) + { + muteControl.setValue(true); + } + else + { + muteControl.setValue(false); + gainControl.setValue((float)(Math.log((double)volume / 100.0) / Math.log(10.0) * 20.0)); + } + } + line.start(); + SoundManager.this.stream(AudioSystem.getAudioInputStream(outFormat, in), line); + line.drain(); + line.stop(); + } + } + catch (IOException | LineUnavailableException | UnsupportedAudioFileException e) + { + throw new IllegalStateException(e); + } + } + }).start(); + } + + private AudioFormat getOutFormat(AudioFormat inFormat) + { + int ch = inFormat.getChannels(); + float rate = inFormat.getSampleRate(); + return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, rate, 16, ch, ch * 2, rate, false); + } + + private void stream(AudioInputStream in, SourceDataLine line) throws IOException + { + byte[] buffer = new byte[2200]; + int n = 0; + while (n != -1) + { + line.write(buffer, 0, n); + n = in.read(buffer, 0, buffer.length); + } + } + +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java index c39bf1ef97..f8ad288e45 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierConfig.java @@ -32,10 +32,10 @@ import net.runelite.client.config.ConfigItem; public interface IdleNotifierConfig extends Config { @ConfigItem( - keyName = "animationidle", - name = "Idle Animation Notifications", - description = "Configures if idle animation notifications are enabled", - position = 1 + keyName = "animationidle", + name = "Idle Animation Notifications", + description = "Configures if idle animation notifications are enabled", + position = 1 ) default boolean animationIdle() { @@ -43,10 +43,21 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "interactionidle", - name = "Idle Interaction Notifications", - description = "Configures if idle interaction notifications are enabled e.g. combat, fishing", - position = 2 + keyName = "animationidlesound", + name = "Idle Animation Sound", + description = "Plays a custom sound accompanying Idle Animation notifications", + position = 2 + ) + default boolean animationIdleSound() + { + return false; + } + + @ConfigItem( + keyName = "interactionidle", + name = "Idle Interaction Notifications", + description = "Configures if idle interaction notifications are enabled e.g. combat, fishing", + position = 3 ) default boolean interactionIdle() { @@ -54,10 +65,21 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "logoutidle", - name = "Idle Logout Notifications", - description = "Configures if the idle logout notifications are enabled", - position = 3 + keyName = "interactionidlesound", + name = "Idle Interaction Sound", + description = "Plays a custom sound accompanying Idle Interaction notifications", + position = 4 + ) + default boolean interactionIdleSound() + { + return false; + } + + @ConfigItem( + keyName = "logoutidle", + name = "Idle Logout Notifications", + description = "Configures if the idle logout notifications are enabled", + position = 5 ) default boolean logoutIdle() { @@ -65,10 +87,21 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - position = 4, - keyName = "skullNotification", - name = "Skull Notification", - description = "Receive a notification when you skull." + keyName = "outofcombatsound", + name = "Out of Combat Sound", + description = "Plays a custom sound whenever you leave combat", + position = 6 + ) + default boolean outOfCombatSound() + { + return false; + } + + @ConfigItem( + position = 7, + keyName = "skullNotification", + name = "Skull Notification", + description = "Receive a notification when you skull." ) default boolean showSkullNotification() { @@ -76,10 +109,10 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - position = 5, - keyName = "unskullNotification", - name = "Unskull Notification", - description = "Receive a notification when you unskull." + position = 8, + keyName = "unskullNotification", + name = "Unskull Notification", + description = "Receive a notification when you unskull." ) default boolean showUnskullNotification() { @@ -87,10 +120,10 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "timeout", - name = "Idle Notification Delay (ms)", - description = "The notification delay after the player is idle", - position = 6 + keyName = "timeout", + name = "Idle Notification Delay (ms)", + description = "The notification delay after the player is idle", + position = 9 ) default int getIdleNotificationDelay() { @@ -98,10 +131,10 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "hitpoints", - name = "Hitpoints Notification Threshold", - description = "The amount of hitpoints to send a notification at. A value of 0 will disable notification.", - position = 7 + keyName = "hitpoints", + name = "Hitpoints Notification Threshold", + description = "The amount of hitpoints to send a notification at. A value of 0 will disable notification.", + position = 10 ) default int getHitpointsThreshold() { @@ -109,10 +142,21 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "prayer", - name = "Prayer Notification Threshold", - description = "The amount of prayer points to send a notification at. A value of 0 will disable notification.", - position = 8 + keyName = "playHealthSound", + name = "Play sound for Low Health", + description = "Will play a sound for every Low Health notification sent", + position = 12 + ) + default boolean getPlayHealthSound() + { + return false; + } + + @ConfigItem( + keyName = "prayer", + name = "Prayer Notification Threshold", + description = "The amount of prayer points to send a notification at. A value of 0 will disable notification.", + position = 12 ) default int getPrayerThreshold() { @@ -120,10 +164,21 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "oxygen", - name = "Oxygen Notification Threshold", - position = 9, - description = "The amount of remaining oxygen to send a notification at. A value of 0 will disable notification." + keyName = "playPrayerSound", + name = "Play sound for Low Prayer", + description = "Will play a sound for every Low Prayer notification sent", + position = 13 + ) + default boolean getPlayPrayerSound() + { + return false; + } + + @ConfigItem( + keyName = "oxygen", + name = "Oxygen Notification Threshold", + position = 14, + description = "The amount of remaining oxygen to send a notification at. A value of 0 will disable notification." ) default int getOxygenThreshold() { @@ -131,10 +186,10 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "spec", - name = "Special Attack Energy Notification Threshold", - position = 10, - description = "The amount of spec energy reached to send a notification at. A value of 0 will disable notification." + keyName = "spec", + name = "Special Attack Energy Notification Threshold", + position = 15, + description = "The amount of spec energy reached to send a notification at. A value of 0 will disable notification." ) default int getSpecEnergyThreshold() { @@ -142,12 +197,34 @@ public interface IdleNotifierConfig extends Config } @ConfigItem( - keyName = "pkers", - name = "PKer Notifier", - position = 9, - description = "Notifies if an attackable player based on your level range appears on screen.", - group = "PvP", - warning = "This will not notify you if the player is in your cc or is online on your friends list." + keyName = "specSound", + name = "Special Attack Energy Sound", + description = "Plays a custom sound accompanying Special Attack energy notifications", + position = 16 + ) + default boolean getSpecSound() + { + return false; + } + + @ConfigItem( + keyName = "overspec", + name = "Over Special Energy Notification", + description = "Will repeat notifications for any value over the special energy threshold", + position = 17 + ) + default boolean getOverSpecEnergy() + { + return false; + } + + @ConfigItem( + keyName = "pkers", + name = "PKer Notifier", + position = 18, + description = "Notifies if an attackable player based on your level range appears on screen.", + group = "PvP", + warning = "This will not notify you if the player is in your cc or is online on your friends list." ) default boolean notifyPkers() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java index d43ef4bdc2..dd7951586f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java @@ -27,12 +27,18 @@ package net.runelite.client.plugins.idlenotifier; import com.google.inject.Provides; import java.awt.TrayIcon; +//import java.io.IOException; import java.time.Duration; import java.time.Instant; import java.util.Arrays; import java.util.EnumSet; import java.util.List; import javax.inject.Inject; +//import javax.sound.sampled.LineUnavailableException; +//import javax.sound.sampled.UnsupportedAudioFileException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.runelite.api.Actor; import net.runelite.api.AnimationID; import static net.runelite.api.AnimationID.COOKING_FIRE; @@ -145,6 +151,8 @@ import net.runelite.api.events.PlayerSpawned; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.Sound; +import net.runelite.client.game.SoundManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.util.PvPUtil; @@ -156,6 +164,8 @@ import net.runelite.client.util.PvPUtil; ) public class IdleNotifierPlugin extends Plugin { + private static final Logger logger = LoggerFactory.getLogger(IdleNotifierPlugin.class); + // This must be more than 500 client ticks (10 seconds) before you get AFK kicked private static final int LOGOUT_WARNING_MILLIS = (4 * 60 + 40) * 1000; // 4 minutes and 40 seconds private static final int COMBAT_WARNING_MILLIS = 19 * 60 * 1000; // 19 minutes @@ -173,6 +183,9 @@ public class IdleNotifierPlugin extends Plugin @Inject private Client client; + @Inject + private SoundManager soundManager; + @Inject private IdleNotifierConfig config; @@ -509,28 +522,47 @@ public class IdleNotifierPlugin extends Plugin if (config.animationIdle() && checkAnimationIdle(waitDuration, local)) { notifier.notify("[" + local.getName() + "] is now idle!"); + if (config.animationIdleSound()) + { + soundManager.playSound(Sound.IDLE); + } } - if (config.interactionIdle() && checkInteractionIdle(waitDuration, local)) { if (lastInteractWasCombat) { notifier.notify("[" + local.getName() + "] is now out of combat!"); + if (config.outOfCombatSound()) + { + soundManager.playSound(Sound.OUT_OF_COMBAT); + } } else { notifier.notify("[" + local.getName() + "] is now idle!"); + if (config.interactionIdleSound()) + { + soundManager.playSound(Sound.IDLE); + } } } if (checkLowHitpoints()) { notifier.notify("[" + local.getName() + "] has low hitpoints!"); + if (config.getPlayHealthSound()) + { + soundManager.playSound(Sound.LOW_HEATLH); + } } if (checkLowPrayer()) { notifier.notify("[" + local.getName() + "] has low prayer!"); + if (config.getPlayPrayerSound()) + { + soundManager.playSound(Sound.LOW_PRAYER); + } } if (checkLowOxygen()) @@ -541,6 +573,10 @@ public class IdleNotifierPlugin extends Plugin if (checkFullSpecEnergy()) { notifier.notify("[" + local.getName() + "] has restored spec energy!"); + if (config.getSpecSound()) + { + soundManager.playSound(Sound.RESTORED_SPECIAL_ATTACK); + } } } @@ -557,8 +593,10 @@ public class IdleNotifierPlugin extends Plugin // Check if we have regenerated over the threshold, and that the // regen was small enough. - boolean notify = lastSpecEnergy < threshold && currentSpecEnergy >= threshold - && currentSpecEnergy - lastSpecEnergy <= 100; + boolean notify = lastSpecEnergy < threshold && currentSpecEnergy >= threshold && currentSpecEnergy - lastSpecEnergy <= 100; + + notify = (notify) || ((config.getOverSpecEnergy()) && (currentSpecEnergy >= threshold) && (currentSpecEnergy != lastSpecEnergy) && (currentSpecEnergy - lastSpecEnergy <= 100)); + lastSpecEnergy = currentSpecEnergy; return notify; } @@ -794,4 +832,4 @@ public class IdleNotifierPlugin extends Plugin lastTickSkull = currentTickSkull; } } -} \ No newline at end of file +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java index 3955d043a2..2911317a38 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahConfig.java @@ -44,4 +44,14 @@ public interface ZulrahConfig extends Config { return true; } + + @ConfigItem( + keyName = "sounds", + name = "Sounds Enabled", + description = "Configures whether client sounds are enabled for zulrah" + ) + default boolean sounds() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java index 493092ec6a..839c1b20d7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/ZulrahPlugin.java @@ -28,6 +28,9 @@ package net.runelite.client.plugins.zulrah; import com.google.inject.Provides; import javax.inject.Inject; +//import javax.sound.sampled.LineUnavailableException; +//import javax.sound.sampled.UnsupportedAudioFileException; + import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -38,6 +41,8 @@ import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.game.Sound; +import net.runelite.client.game.SoundManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; @@ -51,8 +56,11 @@ import net.runelite.client.plugins.zulrah.patterns.ZulrahPatternB; import net.runelite.client.plugins.zulrah.patterns.ZulrahPatternC; import net.runelite.client.plugins.zulrah.patterns.ZulrahPatternD; import net.runelite.client.plugins.zulrah.phase.ZulrahPhase; +import net.runelite.client.plugins.zulrah.phase.ZulrahType; import net.runelite.client.ui.overlay.OverlayManager; +//import java.io.IOException; + @PluginDescriptor( name = "Zulrah Helper", description = "Shows tiles on where to stand during the phases and what prayer to use.", @@ -79,6 +87,9 @@ public class ZulrahPlugin extends Plugin @Inject private OverlayManager overlayManager; + @Inject + private SoundManager soundManager; + @Inject private ZulrahCurrentPhaseOverlay currentPhaseOverlay; @@ -108,6 +119,8 @@ public class ZulrahPlugin extends Plugin private ZulrahInstance instance; + private ZulrahPhase phase; + @Override protected void startUp() throws Exception { @@ -126,6 +139,7 @@ public class ZulrahPlugin extends Plugin overlayManager.remove(zulrahOverlay); zulrah = null; instance = null; + phase = null; } @Subscribe @@ -153,6 +167,22 @@ public class ZulrahPlugin extends Plugin } ZulrahPhase currentPhase = ZulrahPhase.valueOf(zulrah, instance.getStartLocation()); + ZulrahType type = phase.getType(); + + + if (config.sounds()) + { + if (type == ZulrahType.RANGE) + { + soundManager.playSound(Sound.PRAY_RANGED); + } + + if (type == ZulrahType.MAGIC) + { + soundManager.playSound(Sound.PRAY_MAGIC); + } + } + if (instance.getPhase() == null) { instance.setPhase(currentPhase); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java index b6c9cec4ab..04cd35e278 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPattern.java @@ -74,4 +74,4 @@ public abstract class ZulrahPattern { return index >= pattern.size(); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java index 3b9aa40edb..893ffcaff4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/patterns/ZulrahPatternC.java @@ -53,4 +53,4 @@ public class ZulrahPatternC extends ZulrahPattern { return "Pattern C"; } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java index 8af7402574..c1fc54b7da 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/zulrah/phase/ZulrahPhase.java @@ -69,12 +69,12 @@ public class ZulrahPhase public String toString() { return "ZulrahPhase{" + - "zulrahLocation=" + zulrahLocation + - ", type=" + type + - ", jad=" + jad + - ", standLocation=" + standLocation + - ", prayer=" + prayer + - '}'; + "zulrahLocation=" + zulrahLocation + + ", type=" + type + + ", jad=" + jad + + ", standLocation=" + standLocation + + ", prayer=" + prayer + + '}'; } // world location @@ -184,4 +184,4 @@ public class ZulrahPhase } return RANGE_COLOR; } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav new file mode 100644 index 0000000000..d7cf952977 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/15seconds.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav new file mode 100644 index 0000000000..17c05cd53b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/5seconds.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav new file mode 100644 index 0000000000..e7a4383f1b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmagic.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav new file mode 100644 index 0000000000..9838762423 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackmelee.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav new file mode 100644 index 0000000000..da26385656 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/attackranged.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav new file mode 100644 index 0000000000..f8945891df Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/idle.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav new file mode 100644 index 0000000000..532b0083f9 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/incoming.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav new file mode 100644 index 0000000000..49b21d32ac Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowhealth.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav new file mode 100644 index 0000000000..8a632ac14e Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/lowprayer.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav new file mode 100644 index 0000000000..3e90326a5b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/move.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav new file mode 100644 index 0000000000..23d99f59d5 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/outofcombat.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav new file mode 100644 index 0000000000..8994a0faef Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymagic.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav new file mode 100644 index 0000000000..985f222670 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/praymelee.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav new file mode 100644 index 0000000000..25e37ee07e Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/prayranged.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav new file mode 100644 index 0000000000..1f046c9aed Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/reenableprayer.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav new file mode 100644 index 0000000000..66f2077b10 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/restorespec.wav differ diff --git a/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav b/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav new file mode 100644 index 0000000000..90760c346f Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/game/sounds/runaway.wav differ