diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt index 22b0da2f6a66..381f23d3c8f5 100644 --- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt +++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.kt @@ -116,6 +116,7 @@ import at.hannibal2.skyhanni.features.dungeon.DungeonHighlightClickedBlocks import at.hannibal2.skyhanni.features.dungeon.DungeonLividFinder import at.hannibal2.skyhanni.features.dungeon.DungeonMilestonesDisplay import at.hannibal2.skyhanni.features.dungeon.DungeonRankTabListColor +import at.hannibal2.skyhanni.features.dungeon.DungeonShadowAssassinNotification import at.hannibal2.skyhanni.features.dungeon.DungeonTeammateOutlines import at.hannibal2.skyhanni.features.dungeon.HighlightDungeonDeathmite import at.hannibal2.skyhanni.features.dungeon.TerracottaPhase @@ -821,6 +822,7 @@ class SkyHanniMod { loadModule(LimboPlaytime()) loadModule(RareDropMessages()) loadModule(CraftMaterialsFromBazaar()) + loadModule(DungeonShadowAssassinNotification()) loadModule(PestProfitTracker) loadModule(NoBitsWarning()) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java index 516346d33530..675e86ca7189 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/dungeon/DungeonConfig.java @@ -110,4 +110,11 @@ public class DungeonConfig { @ConfigEditorBoolean @FeatureToggle public boolean croesusUnopenedChestTracker = true; + + @Expose + @ConfigOption(name = "SA Jump Notification", desc = "Notifies you when a Shadow Assassin is about " + + "to jump on you.") + @ConfigEditorBoolean + @FeatureToggle + public boolean shadowAssassinJumpNotifier = false; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonShadowAssassinNotification.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonShadowAssassinNotification.kt new file mode 100644 index 000000000000..26144f9400d7 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonShadowAssassinNotification.kt @@ -0,0 +1,32 @@ +package at.hannibal2.skyhanni.features.dungeon + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.TitleManager +import at.hannibal2.skyhanni.events.PacketEvent +import at.hannibal2.skyhanni.mixins.transformers.AccessorWorldBoarderPacket +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.SoundUtils +import net.minecraft.network.play.server.S44PacketWorldBorder +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.seconds + +class DungeonShadowAssassinNotification { + private val config get() = SkyHanniMod.feature.dungeon + + @SubscribeEvent + fun onWorldBoarderChange(event: PacketEvent.ReceiveEvent) { + if (!isEnabled()) return + if (DungeonAPI.dungeonFloor?.contains("3") == true && DungeonAPI.inBossRoom) return + + val packet = event.packet as? AccessorWorldBoarderPacket ?: return + val action = packet.action + val warningTime = packet.warningTime + + if (action == S44PacketWorldBorder.Action.INITIALIZE && warningTime == 10000) { + TitleManager.sendTitle("§cShadow Assassin Jumping!", 2.seconds, 3.6, 7.0f) + SoundUtils.playBeepSound() + } + } + + private fun isEnabled() = LorenzUtils.inDungeons && config.shadowAssassinJumpNotifier +} diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorWorldBoarderPacket.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorWorldBoarderPacket.java new file mode 100644 index 000000000000..b658415212e4 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/AccessorWorldBoarderPacket.java @@ -0,0 +1,14 @@ +package at.hannibal2.skyhanni.mixins.transformers; + +import net.minecraft.network.play.server.S44PacketWorldBorder; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(S44PacketWorldBorder.class) +public interface AccessorWorldBoarderPacket { + @Accessor("action") + S44PacketWorldBorder.Action getAction(); + + @Accessor("warningTime") + int getWarningTime(); +}