diff options
author | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2022-09-23 17:31:10 +0200 |
---|---|---|
committer | hannibal2 <24389977+hannibal00212@users.noreply.github.com> | 2022-09-23 17:31:10 +0200 |
commit | 3736fb833f7609b833d960d50f037208b2dcee6e (patch) | |
tree | 5a0febc0b8b03bbed28a170d5381e055571e7840 /src/main/java/at/hannibal2/skyhanni/features/slayer | |
parent | e49183a248f1a007b924d76909274081f2d0fce2 (diff) | |
download | skyhanni-3736fb833f7609b833d960d50f037208b2dcee6e.tar.gz skyhanni-3736fb833f7609b833d960d50f037208b2dcee6e.tar.bz2 skyhanni-3736fb833f7609b833d960d50f037208b2dcee6e.zip |
blaze slayer features
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features/slayer')
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 |