From 8f14ff2dab6c16b7f0a2d64b018c05e2e5907a17 Mon Sep 17 00:00:00 2001 From: ILike2WatchMemes Date: Tue, 31 Mar 2026 18:22:37 +0200 Subject: [PATCH 1/2] add slayer kills pbs --- .../skyhanni/config/ConfigUpdaterMigrator.kt | 2 +- .../config/features/slayer/SlayerConfig.kt | 22 ++----- .../slayer/SlayerTimeMessagesConfig.kt | 32 +++++++++++ .../config/storage/PlayerSpecificStorage.kt | 5 ++ .../features/slayer/SlayerTimeMessages.kt | 57 +++++++++++++++---- 5 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerTimeMessagesConfig.kt diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt index cd40fe9b0a4c..636df03e849b 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt @@ -13,7 +13,7 @@ import com.google.gson.JsonPrimitive object ConfigUpdaterMigrator { val logger = SkyHanniLogger("ConfigMigration") - const val CONFIG_VERSION = 129 + const val CONFIG_VERSION = 130 fun JsonElement.at(chain: List, init: Boolean): JsonElement? { if (chain.isEmpty()) return this if (this !is JsonObject) return null diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerConfig.kt b/src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerConfig.kt index da767ad9adfe..cd62a6414a91 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerConfig.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerConfig.kt @@ -68,6 +68,11 @@ class SlayerConfig { @Accordion val slayerBossWarning: SlayerBossWarningConfig = SlayerBossWarningConfig() + @Expose + @ConfigOption(name = "Slayer Time Messages", desc = "") + @Accordion + val slayerTimeMessages: SlayerTimeMessagesConfig = SlayerTimeMessagesConfig() + @Expose @ConfigOption(name = "Remaining Kills", desc = "Display the names and remaining amount of mob kills needed until the boss spawns.") @ConfigEditorBoolean @@ -167,23 +172,6 @@ class SlayerConfig { @ConfigEditorSlider(minValue = 0f, maxValue = 100f, minStep = 1f) var hideIrrelevantMobsTransparency: Int = 40 - @Expose - @ConfigOption(name = "Time to Kill Message", desc = "Sends time to kill a slayer in chat.") - @ConfigEditorBoolean - @FeatureToggle - var timeToKillMessage: Boolean = true - - @Expose - @ConfigOption(name = "Quest Complete Message", desc = "Sends time to complete (Spawn & Kill) a slayer quest in chat.") - @ConfigEditorBoolean - @FeatureToggle - var questCompleteMessage: Boolean = true - - @Expose - @ConfigOption(name = "Compact Time Messages", desc = "Shorter Time to Kill and Quest Complete messages.") - @ConfigEditorBoolean - var compactTimeMessage: Boolean = false - @Expose @ConfigOption(name = "Slayer Cocoon Title", desc = "Send title when Slayer Boss is cocooned.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerTimeMessagesConfig.kt b/src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerTimeMessagesConfig.kt new file mode 100644 index 000000000000..e8dba88e2a51 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/slayer/SlayerTimeMessagesConfig.kt @@ -0,0 +1,32 @@ +package at.hannibal2.skyhanni.config.features.slayer + +import at.hannibal2.skyhanni.config.FeatureToggle +import com.google.gson.annotations.Expose +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean +import io.github.notenoughupdates.moulconfig.annotations.ConfigOption + +class SlayerTimeMessagesConfig { + + @Expose + @ConfigOption(name = "Time to Kill", desc = "Sends time to kill a slayer in chat.") + @ConfigEditorBoolean + @FeatureToggle + var timeToKill: Boolean = true + + @Expose + @ConfigOption(name = "Time to Kill Personal Bests", desc = "Sends personal best for killing a slayer in chat.") + @ConfigEditorBoolean + @FeatureToggle + var timeToKillPersonalBests: Boolean = false + + @Expose + @ConfigOption(name = "Quest Complete", desc = "Sends time to complete (Spawn & Kill) a slayer quest in chat.") + @ConfigEditorBoolean + @FeatureToggle + var questComplete: Boolean = true + + @Expose + @ConfigOption(name = "Compact Time Messages", desc = "Shorter Time to Kill and Quest Complete messages.") + @ConfigEditorBoolean + var compact: Boolean = false +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/storage/PlayerSpecificStorage.kt b/src/main/java/at/hannibal2/skyhanni/config/storage/PlayerSpecificStorage.kt index 4bae4c1106d6..5116aeaa0422 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/storage/PlayerSpecificStorage.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/storage/PlayerSpecificStorage.kt @@ -2,6 +2,7 @@ package at.hannibal2.skyhanni.config.storage import at.hannibal2.skyhanni.features.bingo.card.goals.BingoGoal import at.hannibal2.skyhanni.features.chat.CurrentChatDisplay +import at.hannibal2.skyhanni.features.combat.damageindicator.BossType import at.hannibal2.skyhanni.features.fame.UpgradeReminder.CommunityShopUpgrade import at.hannibal2.skyhanni.features.misc.UserLuckBreakdown import at.hannibal2.skyhanni.utils.NeuInternalName @@ -9,6 +10,7 @@ import at.hannibal2.skyhanni.utils.SimpleTimeMark import at.hannibal2.skyhanni.utils.SimpleTimeMark.Companion.farPast import com.google.gson.annotations.Expose import java.time.LocalDate +import kotlin.time.Duration class PlayerSpecificStorage { @Expose @@ -95,4 +97,7 @@ class PlayerSpecificStorage { @Expose var userLuck: Float = 0f } + + @Expose + var slayerPersonalBests: MutableMap = mutableMapOf() } diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt index 300f182de21f..0227afaef30d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt @@ -1,6 +1,9 @@ package at.hannibal2.skyhanni.features.slayer +import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.api.event.HandleEvent +import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator +import at.hannibal2.skyhanni.data.ProfileStorageData import at.hannibal2.skyhanni.data.SlayerApi import at.hannibal2.skyhanni.data.mob.Mob.Companion.belongsToPlayer import at.hannibal2.skyhanni.events.DamageIndicatorDeathEvent @@ -8,39 +11,73 @@ import at.hannibal2.skyhanni.features.combat.damageindicator.BossType import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.TimeUtils.format +import kotlin.time.Duration @SkyHanniModule object SlayerTimeMessages { - private val config get() = SlayerApi.config + private val config get() = SkyHanniMod.feature.slayer.slayerTimeMessages @HandleEvent fun onDamageIndicatorDeathEvent(event: DamageIndicatorDeathEvent) { val (bossType, timeToKill) = with(event.data) { bossType to timeToKill } - if (!config.timeToKillMessage || !bossType.isSlayer || !event.data.entity.belongsToPlayer()) return + if (!bossType.isSlayer || !event.data.entity.belongsToPlayer()) return if (event.data.bossType == BossType.SLAYER_SPIDER_5_1) return - ChatUtils.chat( - if (config.compactTimeMessage) - "${bossType.shortName}§e took §b$timeToKill§e." - else - "It took §b$timeToKill§e to kill ${bossType.fullName}.", - ) + val compact = config.compact + + val bossDisplayName = if (compact) bossType.shortName else bossType.fullName + + val currentPb = ProfileStorageData.playerSpecific?.slayerPersonalBests?.get(bossType) + val timeToKillDuration = Duration.parse(timeToKill) + + val isNewPersonalBest = timeToKillDuration < (currentPb ?: Duration.INFINITE) + if (isNewPersonalBest) ProfileStorageData.playerSpecific?.slayerPersonalBests?.set(bossType, timeToKillDuration) + + val messages = buildList { + if (config.timeToKill) add( + if (compact) "$bossDisplayName §etook §b${timeToKill}" + else "It took §b${timeToKill}§e to kill $bossDisplayName", + ) + + if (config.timeToKillPersonalBests) { + val currentPbDisplay = currentPb?.format(showMilliSeconds = true) ?: "None" + + add( + if (isNewPersonalBest) { + if (compact) "§e§lNEW PB! $bossDisplayName §ein §c$currentPbDisplay §e-> §a$timeToKill" + else "§e§lNEW PERSONAL BEST! §a$timeToKill §7(Previous $currentPbDisplay) §efor $bossDisplayName" + } else { + if (compact) "$bossDisplayName §ePB: §6$currentPbDisplay" + else "$bossDisplayName §ePersonal best: §6$currentPbDisplay" + }, + ) + } + } + + messages.forEach { ChatUtils.chat(it) } } @HandleEvent fun onSlayerQuestComplete() { val startTime = SlayerApi.questStartTime - if (!config.questCompleteMessage || startTime.isFarPast()) return + if (!config.questComplete || startTime.isFarPast()) return val duration = startTime.passedSince().format() ChatUtils.chat( - if (config.compactTimeMessage) + if (config.compact) "Quest took §b$duration§e in total." else "Slayer quest took §b$duration§e to complete.", ) } + + @HandleEvent + fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { + event.move(130, "slayer.timeToKillMessage", "slayer.slayerTimeMessages.timeToKill") + event.move(130, "slayer.questCompleteMessage", "slayer.slayerTimeMessages.questComplete") + event.move(130, "slayer.compactTimeMessage", "slayer.slayerTimeMessages.compact") + } } From 2ff7d00e31de66648330b44a9484902f8f2c4923 Mon Sep 17 00:00:00 2001 From: ILike2WatchMemes Date: Tue, 31 Mar 2026 18:52:07 +0200 Subject: [PATCH 2/2] remove curly braces --- .../hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt index 0227afaef30d..3dc49749bfa0 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerTimeMessages.kt @@ -37,8 +37,8 @@ object SlayerTimeMessages { val messages = buildList { if (config.timeToKill) add( - if (compact) "$bossDisplayName §etook §b${timeToKill}" - else "It took §b${timeToKill}§e to kill $bossDisplayName", + if (compact) "$bossDisplayName §etook §b$timeToKill" + else "It took §b$timeToKill§e to kill $bossDisplayName", ) if (config.timeToKillPersonalBests) {