From 739c04f5b9a51a54efaa43c94fd93e89315d0b62 Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Fri, 6 Jun 2025 23:02:05 +0100 Subject: [PATCH 01/12] add invincibility timer --- .../ravenAddons/config/ravenAddonsConfig.kt | 9 +++ .../features/skyblock/InvincibilityTimer.kt | 59 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt diff --git a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt index 2fb123a9..332abdb9 100644 --- a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt +++ b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt @@ -176,6 +176,15 @@ object ravenAddonsConfig : Vigilant( ) var blazetekkHamRadioMessageHider = false + @Property( + type = PropertyType.SWITCH, + name = "Invincibility Timer", + description = "Display a timer for Bonzo Mask, Phoenix Pet and Spirit Mask.\n§Note: The mod assumes that your Phoenix Pet is level 100.", + category = "SkyBlock", + subcategory = "Invincibility" + ) + var invincibilityTimer = false + @Property( type = PropertyType.SWITCH, name = "Mining Ability Notification", diff --git a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt new file mode 100644 index 00000000..d967748d --- /dev/null +++ b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt @@ -0,0 +1,59 @@ + +import at.raven.ravenAddons.config.ravenAddonsConfig +import at.raven.ravenAddons.data.HypixelGame +import at.raven.ravenAddons.event.chat.ChatReceivedEvent +import at.raven.ravenAddons.loadmodule.LoadModule +import at.raven.ravenAddons.ravenAddons +import at.raven.ravenAddons.utils.RegexUtils.matches +import at.raven.ravenAddons.utils.ServerTimeMark +import at.raven.ravenAddons.utils.TitleManager +import kotlinx.coroutines.delay +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import java.util.regex.Pattern +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +@LoadModule +object InvincibilityTimer { + + enum class Invincibility(val pattern: Pattern, val cooldown: Duration) { + BONZO("^Your (?:. )?Bonzo's Mask saved your life!".toPattern(), 3.seconds), + PHOENIX("^Your Phoenix Pet saved you from certain death!".toPattern(), 4.seconds), + SPIRIT("^Second Wind Activated! Your Spirit Mask saved your life!".toPattern(), 3.seconds); + + companion object { + fun match(message: String): Invincibility? = + entries.find { it.pattern.matches(message) } + } + } + + @SubscribeEvent + fun onChat(event: ChatReceivedEvent) { + if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer) return + + val invincibility = Invincibility.match(event.cleanMessage) + if (invincibility != null) { + ravenAddons.launchCoroutine { + val timer = ServerTimeMark.now() + invincibility.cooldown + while (timer.isInFuture()) { + val timeUntil = timer.timeUntil() + val formattedTime = timeUntil.inWholeMilliseconds / 1000f + val color = when { + timeUntil > 2.seconds -> "§a" + timeUntil > 1.seconds -> "§e" + else -> "§c" + } + TitleManager.setTitle( + "$color%.3f".format(formattedTime), + "", + 1.seconds, + 0.seconds, + 0.seconds + ) + delay(50) + } + TitleManager.setTitle("", "", 0.seconds, 0.seconds, 0.seconds) + } + } + } +} \ No newline at end of file From 9e479a6bfd22fb3e6bc85c04a14d54275aadc01b Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 17:14:52 +0100 Subject: [PATCH 02/12] reset on WorldChangeEvent --- .../features/skyblock/InvincibilityTimer.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt index d967748d..319007e9 100644 --- a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt +++ b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt @@ -1,6 +1,7 @@ import at.raven.ravenAddons.config.ravenAddonsConfig import at.raven.ravenAddons.data.HypixelGame +import at.raven.ravenAddons.event.WorldChangeEvent import at.raven.ravenAddons.event.chat.ChatReceivedEvent import at.raven.ravenAddons.loadmodule.LoadModule import at.raven.ravenAddons.ravenAddons @@ -16,6 +17,8 @@ import kotlin.time.Duration.Companion.seconds @LoadModule object InvincibilityTimer { + private var activeInvincibility = false + enum class Invincibility(val pattern: Pattern, val cooldown: Duration) { BONZO("^Your (?:. )?Bonzo's Mask saved your life!".toPattern(), 3.seconds), PHOENIX("^Your Phoenix Pet saved you from certain death!".toPattern(), 4.seconds), @@ -33,6 +36,7 @@ object InvincibilityTimer { val invincibility = Invincibility.match(event.cleanMessage) if (invincibility != null) { + activeInvincibility = true ravenAddons.launchCoroutine { val timer = ServerTimeMark.now() + invincibility.cooldown while (timer.isInFuture()) { @@ -56,4 +60,10 @@ object InvincibilityTimer { } } } + + @SubscribeEvent + fun onWorldLoad(event: WorldChangeEvent) { + if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer || !activeInvincibility) return + TitleManager.setTitle("", "", 0.seconds, 0.seconds, 0.seconds) + } } \ No newline at end of file From d743293940dcbfb9e4a89750fb8eb92c7ab531ca Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 17:15:12 +0100 Subject: [PATCH 03/12] oops --- .../raven/ravenAddons/features/skyblock/InvincibilityTimer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt index 319007e9..fe10db3e 100644 --- a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt +++ b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt @@ -66,4 +66,4 @@ object InvincibilityTimer { if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer || !activeInvincibility) return TitleManager.setTitle("", "", 0.seconds, 0.seconds, 0.seconds) } -} \ No newline at end of file +} From fc4cb6f724dcb7c34530642e04c82ef0b9d3ea3f Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 17:25:46 +0100 Subject: [PATCH 04/12] thank you dave --- detekt/detekt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detekt/detekt.yml b/detekt/detekt.yml index d69e828d..bdaea0ad 100644 --- a/detekt/detekt.yml +++ b/detekt/detekt.yml @@ -16,7 +16,7 @@ style: - 'HandleEvent' - 'Mod.EventHandler' MaxLineLength: - active: true + active: false maxLineLength: 140 excludeCommentStatements: true LoopWithTooManyJumpStatements: From b14746b443b5c67ff080b046324e75a91f5a7e04 Mon Sep 17 00:00:00 2001 From: raaaaaven <168305416+raaaaaven@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:28:25 +0100 Subject: [PATCH 05/12] Update src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt Co-authored-by: David Cole <40234707+DavidArthurCole@users.noreply.github.com> --- .../kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt index 58c72840..271f25cf 100644 --- a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt +++ b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt @@ -197,7 +197,8 @@ object ravenAddonsConfig : Vigilant( @Property( type = PropertyType.SWITCH, name = "Invincibility Timer", - description = "Display a timer for Bonzo Mask, Phoenix Pet and Spirit Mask.\n§Note: The mod assumes that your Phoenix Pet is level 100.", + description = "Display a timer for Bonzo Mask, Phoenix Pet and Spirit Mask."\n" + + "§Note: The mod assumes that your Phoenix Pet is level 100.", category = "SkyBlock", subcategory = "Invincibility" ) From 05ac974c26d61688315bc215a17435d4065a9655 Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 17:29:21 +0100 Subject: [PATCH 06/12] thank you dave --- .../kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt index 271f25cf..d7a8271e 100644 --- a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt +++ b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt @@ -197,7 +197,7 @@ object ravenAddonsConfig : Vigilant( @Property( type = PropertyType.SWITCH, name = "Invincibility Timer", - description = "Display a timer for Bonzo Mask, Phoenix Pet and Spirit Mask."\n" + + description = "Display a timer for Bonzo Mask, Phoenix Pet and Spirit Mask.\n" + "§Note: The mod assumes that your Phoenix Pet is level 100.", category = "SkyBlock", subcategory = "Invincibility" From 7a0dd7b406d4be8dd57026f64dbbf85f23aa73b5 Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 17:36:44 +0100 Subject: [PATCH 07/12] thank you dave --- .../kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt index d7a8271e..c1e70656 100644 --- a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt +++ b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt @@ -198,7 +198,7 @@ object ravenAddonsConfig : Vigilant( type = PropertyType.SWITCH, name = "Invincibility Timer", description = "Display a timer for Bonzo Mask, Phoenix Pet and Spirit Mask.\n" + - "§Note: The mod assumes that your Phoenix Pet is level 100.", + "§Note: The mod assumes that your Phoenix Pet is level 100.", category = "SkyBlock", subcategory = "Invincibility" ) From 54b0681d45a21403524bcf010ee0f394ca68bd5d Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 18:01:41 +0100 Subject: [PATCH 08/12] thank you jordo --- .../kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt index c1e70656..4d4458f3 100644 --- a/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt +++ b/src/main/kotlin/at/raven/ravenAddons/config/ravenAddonsConfig.kt @@ -198,7 +198,7 @@ object ravenAddonsConfig : Vigilant( type = PropertyType.SWITCH, name = "Invincibility Timer", description = "Display a timer for Bonzo Mask, Phoenix Pet and Spirit Mask.\n" + - "§Note: The mod assumes that your Phoenix Pet is level 100.", + "§cNote: The mod assumes that your Phoenix Pet is level 100.", category = "SkyBlock", subcategory = "Invincibility" ) From 1e86f18d53783ac5879cefaefc0cf639d7b346b0 Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 19:21:15 +0100 Subject: [PATCH 09/12] create invincibilityJob --- .../features/skyblock/InvincibilityTimer.kt | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt index fe10db3e..c1584db5 100644 --- a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt +++ b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt @@ -8,6 +8,8 @@ import at.raven.ravenAddons.ravenAddons import at.raven.ravenAddons.utils.RegexUtils.matches import at.raven.ravenAddons.utils.ServerTimeMark import at.raven.ravenAddons.utils.TitleManager +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.Job import kotlinx.coroutines.delay import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import java.util.regex.Pattern @@ -17,7 +19,9 @@ import kotlin.time.Duration.Companion.seconds @LoadModule object InvincibilityTimer { - private var activeInvincibility = false + private var invincibilityActive = false + + private var invincibilityJob: Job? = null enum class Invincibility(val pattern: Pattern, val cooldown: Duration) { BONZO("^Your (?:. )?Bonzo's Mask saved your life!".toPattern(), 3.seconds), @@ -36,34 +40,39 @@ object InvincibilityTimer { val invincibility = Invincibility.match(event.cleanMessage) if (invincibility != null) { - activeInvincibility = true - ravenAddons.launchCoroutine { - val timer = ServerTimeMark.now() + invincibility.cooldown - while (timer.isInFuture()) { - val timeUntil = timer.timeUntil() - val formattedTime = timeUntil.inWholeMilliseconds / 1000f - val color = when { - timeUntil > 2.seconds -> "§a" - timeUntil > 1.seconds -> "§e" - else -> "§c" + invincibilityActive = true + invincibilityJob?.cancel() + invincibilityJob = ravenAddons.launchCoroutine { + try { + val timer = ServerTimeMark.now() + invincibility.cooldown + while (timer.isInFuture()) { + val timeUntil = timer.timeUntil() + val formattedTime = timeUntil.inWholeMilliseconds / 1000f + val color = when { + timeUntil > 2.seconds -> "§a" + timeUntil > 1.seconds -> "§e" + else -> "§c" + } + TitleManager.setTitle( + "$color%.3f".format(formattedTime), + "", + 1.seconds, + 0.seconds, + 0.seconds + ) + delay(50) } - TitleManager.setTitle( - "$color%.3f".format(formattedTime), - "", - 1.seconds, - 0.seconds, - 0.seconds - ) - delay(50) + } catch (_: CancellationException) { } - TitleManager.setTitle("", "", 0.seconds, 0.seconds, 0.seconds) } } } @SubscribeEvent fun onWorldLoad(event: WorldChangeEvent) { - if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer || !activeInvincibility) return - TitleManager.setTitle("", "", 0.seconds, 0.seconds, 0.seconds) + if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer || !invincibilityActive) return + + invincibilityJob?.cancel() + invincibilityActive = false } } From d2eaf0d8417faabd8be81e6c2c4e0608ffc4917e Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Mon, 9 Jun 2025 20:59:42 +0100 Subject: [PATCH 10/12] remove invincibilityActive --- .../ravenAddons/features/skyblock/InvincibilityTimer.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt index c1584db5..c20e24a6 100644 --- a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt +++ b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt @@ -19,8 +19,6 @@ import kotlin.time.Duration.Companion.seconds @LoadModule object InvincibilityTimer { - private var invincibilityActive = false - private var invincibilityJob: Job? = null enum class Invincibility(val pattern: Pattern, val cooldown: Duration) { @@ -40,7 +38,6 @@ object InvincibilityTimer { val invincibility = Invincibility.match(event.cleanMessage) if (invincibility != null) { - invincibilityActive = true invincibilityJob?.cancel() invincibilityJob = ravenAddons.launchCoroutine { try { @@ -70,9 +67,8 @@ object InvincibilityTimer { @SubscribeEvent fun onWorldLoad(event: WorldChangeEvent) { - if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer || !invincibilityActive) return + if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer) return invincibilityJob?.cancel() - invincibilityActive = false } } From 73ae044798dd020e7234b709b3430d714f5e428c Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Sat, 14 Jun 2025 22:41:29 +0100 Subject: [PATCH 11/12] push changes --- .../features/skyblock/InvincibilityTimer.kt | 60 ++++++++++--------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt index c20e24a6..5095e168 100644 --- a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt +++ b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt @@ -8,7 +8,6 @@ import at.raven.ravenAddons.ravenAddons import at.raven.ravenAddons.utils.RegexUtils.matches import at.raven.ravenAddons.utils.ServerTimeMark import at.raven.ravenAddons.utils.TitleManager -import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job import kotlinx.coroutines.delay import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -18,17 +17,19 @@ import kotlin.time.Duration.Companion.seconds @LoadModule object InvincibilityTimer { - private var invincibilityJob: Job? = null - enum class Invincibility(val pattern: Pattern, val cooldown: Duration) { + enum class Invincibility( + val pattern: Pattern, + val cooldown: Duration, + ) { BONZO("^Your (?:. )?Bonzo's Mask saved your life!".toPattern(), 3.seconds), PHOENIX("^Your Phoenix Pet saved you from certain death!".toPattern(), 4.seconds), - SPIRIT("^Second Wind Activated! Your Spirit Mask saved your life!".toPattern(), 3.seconds); + SPIRIT("^Second Wind Activated! Your Spirit Mask saved your life!".toPattern(), 3.seconds), + ; companion object { - fun match(message: String): Invincibility? = - entries.find { it.pattern.matches(message) } + fun match(message: String): Invincibility? = entries.find { it.pattern.matches(message) } } } @@ -36,39 +37,40 @@ object InvincibilityTimer { fun onChat(event: ChatReceivedEvent) { if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer) return - val invincibility = Invincibility.match(event.cleanMessage) - if (invincibility != null) { - invincibilityJob?.cancel() - invincibilityJob = ravenAddons.launchCoroutine { - try { - val timer = ServerTimeMark.now() + invincibility.cooldown - while (timer.isInFuture()) { - val timeUntil = timer.timeUntil() - val formattedTime = timeUntil.inWholeMilliseconds / 1000f - val color = when { + val invincibility = Invincibility.match(event.cleanMessage) ?: return + invincibilityJob?.cancel() + invincibilityJob = + ravenAddons.launchCoroutine { + val timer = ServerTimeMark.now() + invincibility.cooldown + while (timer.isInFuture()) { + val timeUntil = timer.timeUntil() + val formattedTime = timeUntil.inWholeMilliseconds / 1000f + val color = + when { timeUntil > 2.seconds -> "§a" timeUntil > 1.seconds -> "§e" else -> "§c" } - TitleManager.setTitle( - "$color%.3f".format(formattedTime), - "", - 1.seconds, - 0.seconds, - 0.seconds - ) - delay(50) - } - } catch (_: CancellationException) { + TitleManager.setTitle( + "$color%.3f".format(formattedTime), + "", + 1.seconds, + 0.seconds, + 0.seconds, + ) + delay(50) } } - } } @SubscribeEvent fun onWorldLoad(event: WorldChangeEvent) { if (!HypixelGame.inSkyBlock || !ravenAddonsConfig.invincibilityTimer) return - - invincibilityJob?.cancel() + invincibilityJob?.let { + if (it.isActive) { + it.cancel() + } + invincibilityJob = null + } } } From cd531e95beb8562936a378fb4dc5dea99016dfdc Mon Sep 17 00:00:00 2001 From: raaaaaven Date: Sat, 14 Jun 2025 22:50:18 +0100 Subject: [PATCH 12/12] push remaining changes --- .../features/skyblock/InvincibilityTimer.kt | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt index 5095e168..881ae6e8 100644 --- a/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt +++ b/src/main/kotlin/at/raven/ravenAddons/features/skyblock/InvincibilityTimer.kt @@ -5,9 +5,11 @@ import at.raven.ravenAddons.event.WorldChangeEvent import at.raven.ravenAddons.event.chat.ChatReceivedEvent import at.raven.ravenAddons.loadmodule.LoadModule import at.raven.ravenAddons.ravenAddons +import at.raven.ravenAddons.utils.ChatUtils import at.raven.ravenAddons.utils.RegexUtils.matches import at.raven.ravenAddons.utils.ServerTimeMark import at.raven.ravenAddons.utils.TitleManager +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job import kotlinx.coroutines.delay import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -41,24 +43,28 @@ object InvincibilityTimer { invincibilityJob?.cancel() invincibilityJob = ravenAddons.launchCoroutine { - val timer = ServerTimeMark.now() + invincibility.cooldown - while (timer.isInFuture()) { - val timeUntil = timer.timeUntil() - val formattedTime = timeUntil.inWholeMilliseconds / 1000f - val color = - when { - timeUntil > 2.seconds -> "§a" - timeUntil > 1.seconds -> "§e" - else -> "§c" - } - TitleManager.setTitle( - "$color%.3f".format(formattedTime), - "", - 1.seconds, - 0.seconds, - 0.seconds, - ) - delay(50) + try { + val timer = ServerTimeMark.now() + invincibility.cooldown + while (timer.isInFuture()) { + val timeUntil = timer.timeUntil() + val formattedTime = timeUntil.inWholeMilliseconds / 1000f + val color = + when { + timeUntil > 2.seconds -> "§a" + timeUntil > 1.seconds -> "§e" + else -> "§c" + } + TitleManager.setTitle( + "$color%.3f".format(formattedTime), + "", + 1.seconds, + 0.seconds, + 0.seconds, + ) + delay(50) + } + } catch (e: CancellationException) { + ChatUtils.debug("Invincibility Timer: Invincibility Job cancelled: ${e.message}") } } }