Merge pull request #568 from runelite-extended/sounds
Runelite Client Sounds
This commit is contained in:
@@ -317,6 +317,7 @@
|
|||||||
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
|
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
|
||||||
<nonFilteredFileExtension>png</nonFilteredFileExtension>
|
<nonFilteredFileExtension>png</nonFilteredFileExtension>
|
||||||
<nonFilteredFileExtension>gif</nonFilteredFileExtension>
|
<nonFilteredFileExtension>gif</nonFilteredFileExtension>
|
||||||
|
<nonFilteredFileExtension>wav</nonFilteredFileExtension>
|
||||||
</nonFilteredFileExtensions>
|
</nonFilteredFileExtensions>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|||||||
@@ -283,4 +283,17 @@ public interface RuneLiteConfig extends Config
|
|||||||
{
|
{
|
||||||
return 35;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -42,22 +42,44 @@ public interface IdleNotifierConfig extends Config
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "animationidlesound",
|
||||||
|
name = "Idle Animation Sound",
|
||||||
|
description = "Plays a custom sound accompanying Idle Animation notifications",
|
||||||
|
position = 2
|
||||||
|
)
|
||||||
|
default boolean animationIdleSound()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
keyName = "interactionidle",
|
keyName = "interactionidle",
|
||||||
name = "Idle Interaction Notifications",
|
name = "Idle Interaction Notifications",
|
||||||
description = "Configures if idle interaction notifications are enabled e.g. combat, fishing",
|
description = "Configures if idle interaction notifications are enabled e.g. combat, fishing",
|
||||||
position = 2
|
position = 3
|
||||||
)
|
)
|
||||||
default boolean interactionIdle()
|
default boolean interactionIdle()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "interactionidlesound",
|
||||||
|
name = "Idle Interaction Sound",
|
||||||
|
description = "Plays a custom sound accompanying Idle Interaction notifications",
|
||||||
|
position = 4
|
||||||
|
)
|
||||||
|
default boolean interactionIdleSound()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
keyName = "logoutidle",
|
keyName = "logoutidle",
|
||||||
name = "Idle Logout Notifications",
|
name = "Idle Logout Notifications",
|
||||||
description = "Configures if the idle logout notifications are enabled",
|
description = "Configures if the idle logout notifications are enabled",
|
||||||
position = 3
|
position = 5
|
||||||
)
|
)
|
||||||
default boolean logoutIdle()
|
default boolean logoutIdle()
|
||||||
{
|
{
|
||||||
@@ -65,7 +87,18 @@ public interface IdleNotifierConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 4,
|
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",
|
keyName = "skullNotification",
|
||||||
name = "Skull Notification",
|
name = "Skull Notification",
|
||||||
description = "Receive a notification when you skull."
|
description = "Receive a notification when you skull."
|
||||||
@@ -76,7 +109,7 @@ public interface IdleNotifierConfig extends Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
position = 5,
|
position = 8,
|
||||||
keyName = "unskullNotification",
|
keyName = "unskullNotification",
|
||||||
name = "Unskull Notification",
|
name = "Unskull Notification",
|
||||||
description = "Receive a notification when you unskull."
|
description = "Receive a notification when you unskull."
|
||||||
@@ -90,7 +123,7 @@ public interface IdleNotifierConfig extends Config
|
|||||||
keyName = "timeout",
|
keyName = "timeout",
|
||||||
name = "Idle Notification Delay (ms)",
|
name = "Idle Notification Delay (ms)",
|
||||||
description = "The notification delay after the player is idle",
|
description = "The notification delay after the player is idle",
|
||||||
position = 6
|
position = 9
|
||||||
)
|
)
|
||||||
default int getIdleNotificationDelay()
|
default int getIdleNotificationDelay()
|
||||||
{
|
{
|
||||||
@@ -101,28 +134,50 @@ public interface IdleNotifierConfig extends Config
|
|||||||
keyName = "hitpoints",
|
keyName = "hitpoints",
|
||||||
name = "Hitpoints Notification Threshold",
|
name = "Hitpoints Notification Threshold",
|
||||||
description = "The amount of hitpoints to send a notification at. A value of 0 will disable notification.",
|
description = "The amount of hitpoints to send a notification at. A value of 0 will disable notification.",
|
||||||
position = 7
|
position = 10
|
||||||
)
|
)
|
||||||
default int getHitpointsThreshold()
|
default int getHitpointsThreshold()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
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(
|
@ConfigItem(
|
||||||
keyName = "prayer",
|
keyName = "prayer",
|
||||||
name = "Prayer Notification Threshold",
|
name = "Prayer Notification Threshold",
|
||||||
description = "The amount of prayer points to send a notification at. A value of 0 will disable notification.",
|
description = "The amount of prayer points to send a notification at. A value of 0 will disable notification.",
|
||||||
position = 8
|
position = 12
|
||||||
)
|
)
|
||||||
default int getPrayerThreshold()
|
default int getPrayerThreshold()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
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(
|
@ConfigItem(
|
||||||
keyName = "oxygen",
|
keyName = "oxygen",
|
||||||
name = "Oxygen Notification Threshold",
|
name = "Oxygen Notification Threshold",
|
||||||
position = 9,
|
position = 14,
|
||||||
description = "The amount of remaining oxygen to send a notification at. A value of 0 will disable notification."
|
description = "The amount of remaining oxygen to send a notification at. A value of 0 will disable notification."
|
||||||
)
|
)
|
||||||
default int getOxygenThreshold()
|
default int getOxygenThreshold()
|
||||||
@@ -133,7 +188,7 @@ public interface IdleNotifierConfig extends Config
|
|||||||
@ConfigItem(
|
@ConfigItem(
|
||||||
keyName = "spec",
|
keyName = "spec",
|
||||||
name = "Special Attack Energy Notification Threshold",
|
name = "Special Attack Energy Notification Threshold",
|
||||||
position = 10,
|
position = 15,
|
||||||
description = "The amount of spec energy reached to send a notification at. A value of 0 will disable notification."
|
description = "The amount of spec energy reached to send a notification at. A value of 0 will disable notification."
|
||||||
)
|
)
|
||||||
default int getSpecEnergyThreshold()
|
default int getSpecEnergyThreshold()
|
||||||
@@ -141,10 +196,32 @@ public interface IdleNotifierConfig extends Config
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
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(
|
@ConfigItem(
|
||||||
keyName = "pkers",
|
keyName = "pkers",
|
||||||
name = "PKer Notifier",
|
name = "PKer Notifier",
|
||||||
position = 9,
|
position = 18,
|
||||||
description = "Notifies if an attackable player based on your level range appears on screen.",
|
description = "Notifies if an attackable player based on your level range appears on screen.",
|
||||||
group = "PvP",
|
group = "PvP",
|
||||||
warning = "This will not notify you if the player is in your cc or is online on your friends list."
|
warning = "This will not notify you if the player is in your cc or is online on your friends list."
|
||||||
|
|||||||
@@ -27,12 +27,18 @@ package net.runelite.client.plugins.idlenotifier;
|
|||||||
|
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import java.awt.TrayIcon;
|
import java.awt.TrayIcon;
|
||||||
|
//import java.io.IOException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.inject.Inject;
|
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.Actor;
|
||||||
import net.runelite.api.AnimationID;
|
import net.runelite.api.AnimationID;
|
||||||
import static net.runelite.api.AnimationID.COOKING_FIRE;
|
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.Notifier;
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
import net.runelite.client.eventbus.Subscribe;
|
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.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
import net.runelite.client.util.PvPUtil;
|
import net.runelite.client.util.PvPUtil;
|
||||||
@@ -156,6 +164,8 @@ import net.runelite.client.util.PvPUtil;
|
|||||||
)
|
)
|
||||||
public class IdleNotifierPlugin extends Plugin
|
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
|
// 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 LOGOUT_WARNING_MILLIS = (4 * 60 + 40) * 1000; // 4 minutes and 40 seconds
|
||||||
private static final int COMBAT_WARNING_MILLIS = 19 * 60 * 1000; // 19 minutes
|
private static final int COMBAT_WARNING_MILLIS = 19 * 60 * 1000; // 19 minutes
|
||||||
@@ -173,6 +183,9 @@ public class IdleNotifierPlugin extends Plugin
|
|||||||
@Inject
|
@Inject
|
||||||
private Client client;
|
private Client client;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SoundManager soundManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private IdleNotifierConfig config;
|
private IdleNotifierConfig config;
|
||||||
|
|
||||||
@@ -509,28 +522,47 @@ public class IdleNotifierPlugin extends Plugin
|
|||||||
if (config.animationIdle() && checkAnimationIdle(waitDuration, local))
|
if (config.animationIdle() && checkAnimationIdle(waitDuration, local))
|
||||||
{
|
{
|
||||||
notifier.notify("[" + local.getName() + "] is now idle!");
|
notifier.notify("[" + local.getName() + "] is now idle!");
|
||||||
|
if (config.animationIdleSound())
|
||||||
|
{
|
||||||
|
soundManager.playSound(Sound.IDLE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.interactionIdle() && checkInteractionIdle(waitDuration, local))
|
if (config.interactionIdle() && checkInteractionIdle(waitDuration, local))
|
||||||
{
|
{
|
||||||
if (lastInteractWasCombat)
|
if (lastInteractWasCombat)
|
||||||
{
|
{
|
||||||
notifier.notify("[" + local.getName() + "] is now out of combat!");
|
notifier.notify("[" + local.getName() + "] is now out of combat!");
|
||||||
|
if (config.outOfCombatSound())
|
||||||
|
{
|
||||||
|
soundManager.playSound(Sound.OUT_OF_COMBAT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
notifier.notify("[" + local.getName() + "] is now idle!");
|
notifier.notify("[" + local.getName() + "] is now idle!");
|
||||||
|
if (config.interactionIdleSound())
|
||||||
|
{
|
||||||
|
soundManager.playSound(Sound.IDLE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkLowHitpoints())
|
if (checkLowHitpoints())
|
||||||
{
|
{
|
||||||
notifier.notify("[" + local.getName() + "] has low hitpoints!");
|
notifier.notify("[" + local.getName() + "] has low hitpoints!");
|
||||||
|
if (config.getPlayHealthSound())
|
||||||
|
{
|
||||||
|
soundManager.playSound(Sound.LOW_HEATLH);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkLowPrayer())
|
if (checkLowPrayer())
|
||||||
{
|
{
|
||||||
notifier.notify("[" + local.getName() + "] has low prayer!");
|
notifier.notify("[" + local.getName() + "] has low prayer!");
|
||||||
|
if (config.getPlayPrayerSound())
|
||||||
|
{
|
||||||
|
soundManager.playSound(Sound.LOW_PRAYER);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkLowOxygen())
|
if (checkLowOxygen())
|
||||||
@@ -541,6 +573,10 @@ public class IdleNotifierPlugin extends Plugin
|
|||||||
if (checkFullSpecEnergy())
|
if (checkFullSpecEnergy())
|
||||||
{
|
{
|
||||||
notifier.notify("[" + local.getName() + "] has restored spec energy!");
|
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
|
// Check if we have regenerated over the threshold, and that the
|
||||||
// regen was small enough.
|
// regen was small enough.
|
||||||
boolean notify = lastSpecEnergy < threshold && currentSpecEnergy >= threshold
|
boolean notify = lastSpecEnergy < threshold && currentSpecEnergy >= threshold && currentSpecEnergy - lastSpecEnergy <= 100;
|
||||||
&& currentSpecEnergy - lastSpecEnergy <= 100;
|
|
||||||
|
notify = (notify) || ((config.getOverSpecEnergy()) && (currentSpecEnergy >= threshold) && (currentSpecEnergy != lastSpecEnergy) && (currentSpecEnergy - lastSpecEnergy <= 100));
|
||||||
|
|
||||||
lastSpecEnergy = currentSpecEnergy;
|
lastSpecEnergy = currentSpecEnergy;
|
||||||
return notify;
|
return notify;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,4 +44,14 @@ public interface ZulrahConfig extends Config
|
|||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ConfigItem(
|
||||||
|
keyName = "sounds",
|
||||||
|
name = "Sounds Enabled",
|
||||||
|
description = "Configures whether client sounds are enabled for zulrah"
|
||||||
|
)
|
||||||
|
default boolean sounds()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ package net.runelite.client.plugins.zulrah;
|
|||||||
|
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
//import javax.sound.sampled.LineUnavailableException;
|
||||||
|
//import javax.sound.sampled.UnsupportedAudioFileException;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
@@ -38,6 +41,8 @@ import net.runelite.api.events.NpcDespawned;
|
|||||||
import net.runelite.api.events.NpcSpawned;
|
import net.runelite.api.events.NpcSpawned;
|
||||||
import net.runelite.client.config.ConfigManager;
|
import net.runelite.client.config.ConfigManager;
|
||||||
import net.runelite.client.eventbus.Subscribe;
|
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.Plugin;
|
||||||
import net.runelite.client.plugins.PluginDescriptor;
|
import net.runelite.client.plugins.PluginDescriptor;
|
||||||
import net.runelite.client.plugins.PluginType;
|
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.ZulrahPatternC;
|
||||||
import net.runelite.client.plugins.zulrah.patterns.ZulrahPatternD;
|
import net.runelite.client.plugins.zulrah.patterns.ZulrahPatternD;
|
||||||
import net.runelite.client.plugins.zulrah.phase.ZulrahPhase;
|
import net.runelite.client.plugins.zulrah.phase.ZulrahPhase;
|
||||||
|
import net.runelite.client.plugins.zulrah.phase.ZulrahType;
|
||||||
import net.runelite.client.ui.overlay.OverlayManager;
|
import net.runelite.client.ui.overlay.OverlayManager;
|
||||||
|
|
||||||
|
//import java.io.IOException;
|
||||||
|
|
||||||
@PluginDescriptor(
|
@PluginDescriptor(
|
||||||
name = "Zulrah Helper",
|
name = "Zulrah Helper",
|
||||||
description = "Shows tiles on where to stand during the phases and what prayer to use.",
|
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
|
@Inject
|
||||||
private OverlayManager overlayManager;
|
private OverlayManager overlayManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private SoundManager soundManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ZulrahCurrentPhaseOverlay currentPhaseOverlay;
|
private ZulrahCurrentPhaseOverlay currentPhaseOverlay;
|
||||||
|
|
||||||
@@ -108,6 +119,8 @@ public class ZulrahPlugin extends Plugin
|
|||||||
|
|
||||||
private ZulrahInstance instance;
|
private ZulrahInstance instance;
|
||||||
|
|
||||||
|
private ZulrahPhase phase;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void startUp() throws Exception
|
protected void startUp() throws Exception
|
||||||
{
|
{
|
||||||
@@ -126,6 +139,7 @@ public class ZulrahPlugin extends Plugin
|
|||||||
overlayManager.remove(zulrahOverlay);
|
overlayManager.remove(zulrahOverlay);
|
||||||
zulrah = null;
|
zulrah = null;
|
||||||
instance = null;
|
instance = null;
|
||||||
|
phase = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@@ -153,6 +167,22 @@ public class ZulrahPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
ZulrahPhase currentPhase = ZulrahPhase.valueOf(zulrah, instance.getStartLocation());
|
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)
|
if (instance.getPhase() == null)
|
||||||
{
|
{
|
||||||
instance.setPhase(currentPhase);
|
instance.setPhase(currentPhase);
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user