aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/slayer
diff options
context:
space:
mode:
authorhannibal2 <24389977+hannibal00212@users.noreply.github.com>2022-09-23 17:31:10 +0200
committerhannibal2 <24389977+hannibal00212@users.noreply.github.com>2022-09-23 17:31:10 +0200
commit3736fb833f7609b833d960d50f037208b2dcee6e (patch)
tree5a0febc0b8b03bbed28a170d5381e055571e7840 /src/main/java/at/hannibal2/skyhanni/features/slayer
parente49183a248f1a007b924d76909274081f2d0fce2 (diff)
downloadskyhanni-3736fb833f7609b833d960d50f037208b2dcee6e.tar.gz
skyhanni-3736fb833f7609b833d960d50f037208b2dcee6e.tar.bz2
skyhanni-3736fb833f7609b833d960d50f037208b2dcee6e.zip
blaze slayer features
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features/slayer')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillarTimer.kt85
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerWeaponHelper.kt153
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/SwordMode.kt9
3 files changed, 247 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillarTimer.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillarTimer.kt
new file mode 100644
index 000000000..b75da2cc5
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerPillarTimer.kt
@@ -0,0 +1,85 @@
+package at.hannibal2.skyhanni.features.slayer.blaze
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.events.LorenzChatEvent
+import at.hannibal2.skyhanni.features.damageindicator.BossType
+import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.LorenzUtils.matchRegex
+import at.hannibal2.skyhanni.utils.RenderUtils.renderString
+import net.minecraft.client.Minecraft
+import net.minecraft.entity.item.EntityArmorStand
+import net.minecraftforge.client.event.RenderGameOverlayEvent
+import net.minecraftforge.event.world.WorldEvent
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import net.minecraftforge.fml.common.gameevent.TickEvent
+import java.text.DecimalFormat
+import java.util.regex.Pattern
+
+class BlazeSlayerPillarTimer {
+
+ private var pattern = Pattern.compile("§cYou took §r§f(.+) §r§ctrue damage from an exploding fire pillar!")
+
+ private var lastFound = -1L
+
+ private val pillarTimerEntities = mutableListOf<EntityArmorStand>()
+
+ var tick = 0
+
+ @SubscribeEvent
+ fun onTick(event: TickEvent.ClientTickEvent) {
+ if (!isEnabled()) return
+ for (armorStand in Minecraft.getMinecraft().theWorld.loadedEntityList.filterIsInstance<EntityArmorStand>()) {
+ val name = armorStand.name
+ if (name.matchRegex("§6§l.s §c§l8 hits")) {
+ if (armorStand !in pillarTimerEntities) {
+ pillarTimerEntities.add(armorStand)
+ lastFound = System.currentTimeMillis()
+ }
+ }
+ }
+ }
+
+ @SubscribeEvent
+ fun onChatMessage(event: LorenzChatEvent) {
+ if (!isEnabled()) return
+
+ val message = event.message
+ val matcher = pattern.matcher(message)
+ if (matcher.matches()) {
+ lastFound = -1L
+ }
+ if (message == " §r§a§lSLAYER QUEST COMPLETE!") {
+ lastFound = -1L
+ }
+
+ if (message == "§eYour Slayer boss was despawned, but you have kept your quest progress!") {
+ lastFound = -1L
+ }
+ }
+
+ @SubscribeEvent
+ fun renderOverlay(event: RenderGameOverlayEvent.Post) {
+ if (!isEnabled()) return
+ if (lastFound == -1L) return
+
+ val duration = System.currentTimeMillis() - lastFound
+ val maxDuration = 7_000
+
+ val remainingLong = maxDuration - duration
+ val remaining = (remainingLong.toFloat() / 1000)
+ val format = DecimalFormat("0.0").format(remaining + 0.1)
+ SkyHanniMod.feature.slayer.firePillarsPos.renderString("§cBlaze Pillar: §a${format}s")
+ }
+
+ private fun isEnabled(): Boolean {
+ return LorenzUtils.inSkyblock && SkyHanniMod.feature.slayer.firePillars && DamageIndicatorManager.isBossSpawned(
+ BossType.SLAYER_BLAZE_2, BossType.SLAYER_BLAZE_3, BossType.SLAYER_BLAZE_4
+ )
+ }
+
+ @SubscribeEvent
+ fun onWorldChange(event: WorldEvent.Load) {
+ pillarTimerEntities.clear()
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerWeaponHelper.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerWeaponHelper.kt
new file mode 100644
index 000000000..475df5ce9
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/BlazeSlayerWeaponHelper.kt
@@ -0,0 +1,153 @@
+package at.hannibal2.skyhanni.features.slayer.blaze
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.config.core.util.render.TextRenderUtils
+import at.hannibal2.skyhanni.events.PacketEvent
+import at.hannibal2.skyhanni.utils.ItemUtils.name
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import net.minecraft.client.Minecraft
+import net.minecraft.client.entity.EntityPlayerSP
+import net.minecraft.client.gui.ScaledResolution
+import net.minecraft.client.renderer.GlStateManager
+import net.minecraft.network.play.client.C07PacketPlayerDigging
+import net.minecraft.network.play.server.S45PacketTitle
+import net.minecraftforge.client.event.RenderGameOverlayEvent
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import net.minecraftforge.fml.common.gameevent.TickEvent
+
+class BlazeSlayerWeaponHelper {
+
+ var textToRenderA = ""
+ var textToRenderB = ""
+ var clientSideClicked = false
+
+ @SubscribeEvent
+ fun onTick(event: TickEvent.ClientTickEvent) {
+ if (!isEnabled()) return
+
+ val sword = getSwordInHand()
+ if (sword != null) {
+ textToRenderA = getSwordText(sword)
+ textToRenderB = getSwordText(sword.other())
+ return
+ }
+
+ textToRenderA = ""
+ textToRenderB = ""
+ }
+
+ private fun getSwordInHand(): Sword? {
+ val player = Minecraft.getMinecraft().thePlayer
+ val itemName = getName(player)
+ for (sword in Sword.values()) {
+ if (itemName.contains(sword.swordName)) {
+ return sword
+ }
+ }
+
+ return null
+ }
+
+ private fun getSwordText(sword: Sword): String {
+ var activeAbility = ""
+ var inactiveAbility = ""
+ for (mode in sword.modes) {
+ if (mode.active) {
+ activeAbility = mode.color + "§l" + mode
+ } else {
+ inactiveAbility = " §7/ " + mode.color + mode.toString().lowercase()
+ }
+ }
+ if (activeAbility == "") return ""
+ return "$activeAbility$inactiveAbility"
+
+ }
+
+ private fun getName(player: EntityPlayerSP): String {
+ val itemStack = player.inventory.mainInventory[player.inventory.currentItem] ?: return ""
+ return itemStack.name ?: ""
+ }
+
+ @SubscribeEvent
+ fun onReceiveCurrentMode(event: PacketEvent.ReceiveEvent) {
+ if (!isEnabled()) return
+
+ val packet = event.packet
+
+ if (packet !is S45PacketTitle) return
+ val message = packet.message ?: return
+ val formattedText = message.formattedText
+
+ for (swordMode in SwordMode.values()) {
+ if (swordMode.formattedName + "§r" == formattedText) {
+ Sword.values().filter { swordMode in it.modes }.forEach {
+ it.modes.forEach { mode -> mode.active = false }
+ }
+ swordMode.active = true
+ event.isCanceled = true
+ clientSideClicked = false
+ return
+ }
+ }
+ }
+
+ private fun isEnabled(): Boolean {
+ return LorenzUtils.inSkyblock && SkyHanniMod.feature.slayer.blazeDaggers
+ }
+
+ @SubscribeEvent
+ fun onRightClick(event: PacketEvent.SendEvent) {
+ if (!isEnabled()) return
+
+ if (clientSideClicked) return
+
+ val packet = event.packet
+
+ if (packet is C07PacketPlayerDigging) {
+ val status = packet.status
+ if (status == C07PacketPlayerDigging.Action.RELEASE_USE_ITEM) {
+ val sword = getSwordInHand()
+ sword?.modes?.forEach { mode -> mode.active = !mode.active }
+ clientSideClicked = true
+ }
+ }
+ }
+
+ enum class Sword(val swordName: String, vararg val modes: SwordMode) {
+ TWILIGHT("Twilight Dagger", SwordMode.SPIRIT, SwordMode.CRYSTAL),
+ FIREDUST("Firedust Dagger", SwordMode.ASHEN, SwordMode.AURIC),
+ ;
+
+ fun other(): Sword = if (this == TWILIGHT) {
+ FIREDUST
+ } else {
+ TWILIGHT
+ }
+ }
+
+ @SubscribeEvent
+ fun renderOverlay(event: RenderGameOverlayEvent.Post) {
+ if (!isEnabled()) return
+ if (event.type != RenderGameOverlayEvent.ElementType.ALL) return
+
+ val scaledResolution = ScaledResolution(Minecraft.getMinecraft())
+ val width = scaledResolution.scaledWidth
+ val height = scaledResolution.scaledHeight
+
+ GlStateManager.enableBlend()
+ GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0)
+ val renderer = Minecraft.getMinecraft().fontRendererObj
+
+ GlStateManager.pushMatrix()
+ GlStateManager.translate((width / 2).toFloat(), (height / 1.85).toFloat(), 0.0f)
+ GlStateManager.scale(4.0f, 4.0f, 4.0f)
+ TextRenderUtils.drawStringCenteredScaledMaxWidth(textToRenderA, renderer, 0f, 0f, false, 55, 0)
+ GlStateManager.popMatrix()
+
+ GlStateManager.pushMatrix()
+ GlStateManager.translate((width / 2).toFloat(), (height / 1.65).toFloat(), 0.0f)
+ GlStateManager.scale(4.0f, 4.0f, 4.0f)
+ TextRenderUtils.drawStringCenteredScaledMaxWidth(textToRenderB, renderer, 0f, 0f, false, 40, 0)
+ GlStateManager.popMatrix()
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/SwordMode.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/SwordMode.kt
new file mode 100644
index 000000000..deeb24244
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/blaze/SwordMode.kt
@@ -0,0 +1,9 @@
+package at.hannibal2.skyhanni.features.slayer.blaze
+
+enum class SwordMode(val formattedName: String, val color: String, var active: Boolean = false) {
+ AURIC("§e§lAURIC", "§e"),
+ ASHEN("§8§lASHEN", "§8"),
+ SPIRIT("§f§lSPIRIT", "§f"),
+ CRYSTAL("§b§lCRYSTAL", "§b"),
+ ;
+} \ No newline at end of file