From daa63bd914a2f6c5e9b668abb8474884685ee818 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Mon, 7 Oct 2024 15:08:18 +0200 Subject: Fix drill ability cooldown resetting on world swap --- src/main/kotlin/events/ProfileSwitchEvent.kt | 7 +++++++ src/main/kotlin/features/mining/PickaxeAbility.kt | 24 +++++++++++++++-------- src/main/kotlin/util/SBData.kt | 5 +++++ src/main/kotlin/util/SkyBlockIsland.kt | 1 + 4 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/events/ProfileSwitchEvent.kt diff --git a/src/main/kotlin/events/ProfileSwitchEvent.kt b/src/main/kotlin/events/ProfileSwitchEvent.kt new file mode 100644 index 0000000..683b7dd --- /dev/null +++ b/src/main/kotlin/events/ProfileSwitchEvent.kt @@ -0,0 +1,7 @@ +package moe.nea.firmament.events + +import java.util.UUID + +data class ProfileSwitchEvent(val oldProfile: UUID?, val newProfile: UUID?) : FirmamentEvent() { + companion object : FirmamentEventBus() +} diff --git a/src/main/kotlin/features/mining/PickaxeAbility.kt b/src/main/kotlin/features/mining/PickaxeAbility.kt index 318a868..192419f 100644 --- a/src/main/kotlin/features/mining/PickaxeAbility.kt +++ b/src/main/kotlin/features/mining/PickaxeAbility.kt @@ -11,13 +11,16 @@ import net.minecraft.util.Identifier import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HudRenderEvent import moe.nea.firmament.events.ProcessChatEvent +import moe.nea.firmament.events.ProfileSwitchEvent import moe.nea.firmament.events.SlotClickEvent import moe.nea.firmament.events.WorldReadyEvent import moe.nea.firmament.features.FirmamentFeature import moe.nea.firmament.gui.config.ManagedConfig import moe.nea.firmament.util.DurabilityBarEvent import moe.nea.firmament.util.MC +import moe.nea.firmament.util.SBData import moe.nea.firmament.util.SHORT_NUMBER_FORMAT +import moe.nea.firmament.util.SkyBlockIsland import moe.nea.firmament.util.TIME_PATTERN import moe.nea.firmament.util.TimeMark import moe.nea.firmament.util.extraAttributes @@ -58,14 +61,15 @@ object PickaxeAbility : FirmamentFeature { get() = TConfig fun getCooldownPercentage(name: String, cooldown: Duration): Double { - val sinceLastUsage = lastUsage[name]?.passedTime() ?: Duration.INFINITE + val sinceLastUsage = lastUsage[name]?.passedTime() ?: Duration.INFINITE + val sinceLobbyJoin = lobbyJoinTime.passedTime() + if (SBData.skyblockLocation == SkyBlockIsland.MINESHAFT) { + if (sinceLobbyJoin < sinceLastUsage) { + return 1.0 + } + } if (sinceLastUsage < cooldown) return sinceLastUsage / cooldown - val sinceLobbyJoin = lobbyJoinTime.passedTime() - val halfCooldown = cooldown / 2 - if (sinceLobbyJoin < halfCooldown) { - return (sinceLobbyJoin / halfCooldown) - } return 1.0 } @@ -117,11 +121,15 @@ object PickaxeAbility : FirmamentFeature { @Subscribe fun onWorldReady(event: WorldReadyEvent) { - lastUsage.clear() lobbyJoinTime = TimeMark.now() abilityOverride = null } + @Subscribe + fun onProfileSwitch(event: ProfileSwitchEvent) { + lastUsage.clear() + } + val abilityUsePattern = Pattern.compile("You used your (?.*) Pickaxe Ability!") val fuelPattern = Pattern.compile("Fuel: .*/(?$SHORT_NUMBER_FORMAT)") @@ -132,7 +140,7 @@ object PickaxeAbility : FirmamentFeature { fun getCooldownFromLore(itemStack: ItemStack): PickaxeAbilityData? { val lore = itemStack.loreAccordingToNbt - if (!lore.any { it.unformattedString.contains("Breaking Power") == true }) + if (!lore.any { it.unformattedString.contains("Breaking Power") }) return null val cooldown = lore.firstNotNullOfOrNull { cooldownPattern.useMatch(it.unformattedString) { diff --git a/src/main/kotlin/util/SBData.kt b/src/main/kotlin/util/SBData.kt index 353bb06..0b2c404 100644 --- a/src/main/kotlin/util/SBData.kt +++ b/src/main/kotlin/util/SBData.kt @@ -7,6 +7,7 @@ import kotlin.jvm.optionals.getOrNull import kotlin.time.Duration.Companion.seconds import moe.nea.firmament.events.AllowChatEvent import moe.nea.firmament.events.ProcessChatEvent +import moe.nea.firmament.events.ProfileSwitchEvent import moe.nea.firmament.events.ServerConnectedEvent import moe.nea.firmament.events.SkyblockServerUpdateEvent import moe.nea.firmament.events.WorldReadyEvent @@ -54,6 +55,7 @@ object SBData { ProcessChatEvent.subscribe(receivesCancelled = true, "SBData:loadProfile") { event -> val profileMatch = profileRegex.matchEntire(event.unformattedString) if (profileMatch != null) { + val oldProfile = profileId try { profileId = UUID.fromString(profileMatch.groupValues[1]) hasReceivedProfile = true @@ -61,6 +63,9 @@ object SBData { profileId = null e.printStackTrace() } + if (oldProfile != profileId) { + ProfileSwitchEvent.publish(ProfileSwitchEvent(oldProfile, profileId)) + } } } } diff --git a/src/main/kotlin/util/SkyBlockIsland.kt b/src/main/kotlin/util/SkyBlockIsland.kt index bd0567d..c42a55c 100644 --- a/src/main/kotlin/util/SkyBlockIsland.kt +++ b/src/main/kotlin/util/SkyBlockIsland.kt @@ -34,6 +34,7 @@ private constructor( val HUB = forMode("hub") val PRIVATE_ISLAND = forMode("dynamic") val RIFT = forMode("rift") + val MINESHAFT = forMode("mineshaft") } val userFriendlyName -- cgit