aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningNotificationsConfig.java46
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt116
4 files changed, 169 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
index 622c0d5f8..170dfb524 100644
--- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
+++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt
@@ -266,6 +266,7 @@ import at.hannibal2.skyhanni.features.itemabilities.abilitycooldown.ItemAbilityC
import at.hannibal2.skyhanni.features.mining.DeepCavernsParkour
import at.hannibal2.skyhanni.features.mining.HighlightMiningCommissionMobs
import at.hannibal2.skyhanni.features.mining.KingTalismanHelper
+import at.hannibal2.skyhanni.features.mining.MiningNotifications
import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalHollowsNamesInCore
import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalHollowsWalls
import at.hannibal2.skyhanni.features.mining.eventtracker.MiningEventDisplay
@@ -818,6 +819,7 @@ class SkyHanniMod {
loadModule(HighlightPlaceableNpcs())
loadModule(PresentWaypoints())
loadModule(MiningEventTracker())
+ loadModule(MiningNotifications())
loadModule(JyrreTimer())
loadModule(TotemOfCorruption())
loadModule(NewYearCakeReminder())
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java
index 5beafceb0..92300f690 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java
@@ -37,6 +37,11 @@ public class MiningConfig {
@ConfigOption(name = "Fossil Excavator", desc = "")
@Accordion
public FossilExcavatorConfig fossilExcavator = new FossilExcavatorConfig();
+
+ @Expose
+ @ConfigOption(name = "Notifications", desc = "")
+ @Accordion
+ public MiningNotificationsConfig notifications = new MiningNotificationsConfig();
@Expose
@ConfigOption(name = "Highlight Commission Mobs", desc = "Highlight Mobs that are part of active commissions.")
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningNotificationsConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningNotificationsConfig.java
new file mode 100644
index 000000000..59a74b879
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningNotificationsConfig.java
@@ -0,0 +1,46 @@
+package at.hannibal2.skyhanni.config.features.mining;
+
+import at.hannibal2.skyhanni.config.FeatureToggle;
+import at.hannibal2.skyhanni.features.mining.MiningNotifications.MiningNotificationList;
+import com.google.gson.annotations.Expose;
+import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean;
+import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDraggableList;
+import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorSlider;
+import io.github.notenoughupdates.moulconfig.annotations.ConfigOption;
+import io.github.notenoughupdates.moulconfig.observer.Property;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MiningNotificationsConfig {
+ @Expose
+ @ConfigOption(name = "Enabled", desc = "Toggles the Mining Notifications.")
+ @ConfigEditorBoolean
+ @FeatureToggle
+ public boolean enabled = false;
+
+ @Expose
+ @ConfigOption(
+ name = "Notification List",
+ desc = "Drag text to change which events send a title."
+ )
+ @ConfigEditorDraggableList
+ public List<MiningNotificationList> notifications = new ArrayList<>(Arrays.asList(
+ MiningNotificationList.MINESHAFT_SPAWN,
+ MiningNotificationList.SCRAP,
+ MiningNotificationList.COLD,
+ MiningNotificationList.GOLDEN_GOBLIN,
+ MiningNotificationList.DIAMOND_GOBLIN
+ ));
+
+ @Expose
+ @ConfigOption(name = "Play Sound", desc = "Plays a ding when a notification is triggered.")
+ @ConfigEditorBoolean
+ public boolean playSound = true;
+
+ @Expose
+ @ConfigOption(name = "Cold Threshold", desc = "Change when the Cold notification gets triggered.")
+ @ConfigEditorSlider(minValue = 1, maxValue = 100, minStep = 1)
+ public Property<Integer> coldThreshold = Property.of(50);
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt
new file mode 100644
index 000000000..3115ac48a
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/mining/MiningNotifications.kt
@@ -0,0 +1,116 @@
+package at.hannibal2.skyhanni.features.mining
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.data.IslandType
+import at.hannibal2.skyhanni.events.ConfigLoadEvent
+import at.hannibal2.skyhanni.events.LorenzChatEvent
+import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
+import at.hannibal2.skyhanni.events.ScoreboardChangeEvent
+import at.hannibal2.skyhanni.features.gui.customscoreboard.ScoreboardPattern
+import at.hannibal2.skyhanni.utils.ConditionalUtils
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.SimpleTimeMark
+import at.hannibal2.skyhanni.utils.SoundUtils
+import at.hannibal2.skyhanni.utils.StringUtils.matchFirst
+import at.hannibal2.skyhanni.utils.StringUtils.matches
+import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import kotlin.math.absoluteValue
+import kotlin.time.Duration.Companion.milliseconds
+import kotlin.time.Duration.Companion.seconds
+
+class MiningNotifications {
+
+ enum class MiningNotificationList(val str: String, val notification: String) {
+ MINESHAFT_SPAWN("§bGlacite Mineshaft", "§bMineshaft"),
+ SCRAP("§9Suspicious Scrap", "§9Suspicious Scrap"),
+ GOLDEN_GOBLIN("§6Golden Goblin", "§6Golden Goblin"),
+ DIAMOND_GOBLIN("§bDiamond Goblin", "§bDiamond Goblin"),
+ COLD("§bCold", "§bCold");
+
+ override fun toString(): String {
+ return str
+ }
+ }
+
+ private val patternGroup = RepoPattern.group("mining.notifications")
+ private val mineshaftSpawn by patternGroup.pattern(
+ "mineshaft.spawn",
+ "§5§lWOW! §r§aYou found a §r§bGlacite Mineshaft §r§aportal!"
+ )
+ private val scrapDrop by patternGroup.pattern(
+ "scrapdrop",
+ "§6§lEXCAVATOR! §r§fYou found a §r§9Suspicious Scrap§r§f!"
+ )
+ private val goldenGoblinSpawn by patternGroup.pattern(
+ "goblin.goldspawn",
+ "§6A Golden Goblin has spawned!"
+ )
+ private val diamondGoblinSpawn by patternGroup.pattern(
+ "goblin.diamondspawn",
+ "§6A §r§bDiamond Goblin §r§6has spawned!"
+ )
+ private val coldReset by patternGroup.pattern(
+ "cold.reset",
+ "§cThe warmth of the campfire reduced your §r§b❄ Cold §r§cto 0!"
+ )
+
+ private val config get() = SkyHanniMod.feature.mining.notifications
+
+ private var cold = 0
+ private var hasSentCold = false
+ private var coldResetTimer = SimpleTimeMark.farPast()
+
+ @SubscribeEvent
+ fun onChat(event: LorenzChatEvent) {
+ if (!LorenzUtils.inMiningIsland()) return
+ if (!config.enabled) return
+ val message = event.message
+ when {
+ mineshaftSpawn.matches(message) -> sendNotification(MiningNotificationList.MINESHAFT_SPAWN)
+ scrapDrop.matches(message) -> sendNotification(MiningNotificationList.SCRAP)
+ goldenGoblinSpawn.matches(message) -> sendNotification(MiningNotificationList.GOLDEN_GOBLIN)
+ diamondGoblinSpawn.matches(message) -> sendNotification(MiningNotificationList.DIAMOND_GOBLIN)
+ coldReset.matches(message) -> {
+ cold = 0
+ hasSentCold = false
+ coldResetTimer = SimpleTimeMark.now().plus(1.seconds)
+ }
+ }
+ }
+
+ @SubscribeEvent
+ fun onScoreboardChange(event: ScoreboardChangeEvent) {
+ if (!LorenzUtils.inAnyIsland(IslandType.DWARVEN_MINES, IslandType.MINESHAFT)) return
+ if (!config.enabled) return
+ val newCold = event.newList.matchFirst(ScoreboardPattern.coldPattern) {
+ group("cold").toInt().absoluteValue
+ } ?: 0
+ if (cold == newCold) return
+ cold = newCold
+ if (coldResetTimer.isInFuture()) return
+ if (cold >= config.coldThreshold.get() && !hasSentCold) {
+ hasSentCold = true
+ sendNotification(MiningNotificationList.COLD)
+ }
+ }
+
+ @SubscribeEvent
+ fun onWorldChange(event: LorenzWorldChangeEvent) {
+ cold = 0
+ hasSentCold = false
+ }
+
+ @SubscribeEvent
+ fun onConfigLoad(event: ConfigLoadEvent) {
+ ConditionalUtils.onToggle(config.coldThreshold) {
+ if (cold != config.coldThreshold.get()) hasSentCold = false
+ }
+ }
+
+ private fun sendNotification(type: MiningNotificationList) {
+ if (!config.notifications.contains(type)) return
+ LorenzUtils.sendTitle(type.notification, 1500.milliseconds)
+ if (config.playSound) SoundUtils.playPlingSound()
+ }
+}