diff options
4 files changed, 90 insertions, 99 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt index 2995a38e2..4c021929b 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/ScoreboardData.kt @@ -6,7 +6,8 @@ import at.hannibal2.skyhanni.events.ScoreboardChangeEvent import at.hannibal2.skyhanni.events.ScoreboardRawChangeEvent import at.hannibal2.skyhanni.utils.StringUtils.matches import net.minecraft.client.Minecraft -import net.minecraft.network.play.server.S3BPacketScoreboardObjective +import net.minecraft.network.play.server.S3CPacketUpdateScore +import net.minecraft.network.play.server.S3EPacketTeams import net.minecraft.scoreboard.Score import net.minecraft.scoreboard.ScorePlayerTeam import net.minecraftforge.fml.common.eventhandler.EventPriority @@ -72,8 +73,15 @@ class ScoreboardData { @SubscribeEvent(receiveCanceled = true) fun onPacketReceive(event: PacketEvent.ReceiveEvent) { - if (event.packet is S3BPacketScoreboardObjective) { - dirty = true + if (event.packet is S3CPacketUpdateScore) { + if (event.packet.objectiveName == "update") { + dirty = true + } + } + if (event.packet is S3EPacketTeams) { + if (event.packet.name.startsWith("team_")) { + dirty = true + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt b/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt index 5f92da7ae..ec62adda0 100644 --- a/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/data/SlayerAPI.kt @@ -98,10 +98,8 @@ object SlayerAPI { private fun grabActiveSlayer(): SlayerType? { for (line in ScoreboardData.sidebarLinesFormatted) { - for (type in SlayerType.entries) { - if (line.contains(type.displayName)) { - return type - } + SlayerType.getByName(line)?.let { + return it } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt index a90d0eb9f..95ba80060 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerQuestWarning.kt @@ -1,130 +1,91 @@ package at.hannibal2.skyhanni.features.slayer import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.data.ClickType import at.hannibal2.skyhanni.data.SlayerAPI import at.hannibal2.skyhanni.events.EntityHealthUpdateEvent -import at.hannibal2.skyhanni.events.LorenzChatEvent -import at.hannibal2.skyhanni.events.LorenzTickEvent -import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent +import at.hannibal2.skyhanni.events.ItemClickEvent +import at.hannibal2.skyhanni.events.ScoreboardChangeEvent +import at.hannibal2.skyhanni.features.event.diana.DianaAPI +import at.hannibal2.skyhanni.features.rift.RiftAPI import at.hannibal2.skyhanni.utils.ChatUtils +import at.hannibal2.skyhanni.utils.CollectionUtils.nextAfter +import at.hannibal2.skyhanni.utils.DelayedRun +import at.hannibal2.skyhanni.utils.ItemUtils.getInternalNameOrNull import at.hannibal2.skyhanni.utils.LocationUtils.distanceToPlayer import at.hannibal2.skyhanni.utils.LorenzUtils -import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.getLorenzVec -import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.entity.EntityLivingBase import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds class SlayerQuestWarning { private val config get() = SkyHanniMod.feature.slayer - private val talkToMaddoxPattern by RepoPattern.pattern( - "slayer.questwarning.talkto", - " {3}§r§5§l» §r§7Talk to Maddox to claim your .+ Slayer XP!" - ) + private var lastWeaponUse = SimpleTimeMark.farPast() + private val voidItem = "ASPECT_OF_THE_VOID".asInternalName() + private val endItem = "ASPECT_OF_THE_END".asInternalName() - private var needSlayerQuest = false - private var lastWarning = 0L - private var currentReason = "" - private var dirtySidebar = false - private var hasAutoSlayer = false + private val outsideRiftData = SlayerData() + private val insideRiftData = SlayerData() - // TODO add check if player has clicked on an item, before mobs around you gets damage + class SlayerData { + var currentSlayerState: String? = null + var lastSlayerType: SlayerType? = null + } @SubscribeEvent - fun onChat(event: LorenzChatEvent) { - if (!(LorenzUtils.inSkyBlock)) return + fun onScoreboardChange(event: ScoreboardChangeEvent) { + val slayerType = event.newList.nextAfter("Slayer Quest") + val slayerProgress = event.newList.nextAfter("Slayer Quest", skip = 2) ?: "no slayer" + val new = slayerProgress.removeColor() + val slayerData = getSlayerData() - val message = event.message + if (slayerData.currentSlayerState == new) return - // died - if (message == " §r§c§lSLAYER QUEST FAILED!") { - needNewQuest("The old slayer quest has failed!") - } - if (message == " §r§5§lSLAYER QUEST STARTED!") { - needSlayerQuest = false - hasAutoSlayer = true - dirtySidebar = true + slayerData.currentSlayerState?.let { + change(it, new) } - - // no auto slayer - talkToMaddoxPattern.matchMatcher(message) { - needNewQuest("You have no Auto-Slayer active!") + slayerData.currentSlayerState = new + slayerType?.let { + slayerData.lastSlayerType = SlayerType.getByName(it) } - if (message == " §r§a§lSLAYER QUEST COMPLETE!") { - needSlayerQuest = false - } - - if (message == "§aYour Slayer Quest has been cancelled!") { - needSlayerQuest = false - } - - // TODO auto slayer disabled bc of no more money in bank or purse } - private fun needNewQuest(reason: String) { - currentReason = reason - needSlayerQuest = true - } - - @SubscribeEvent - fun onTick(event: LorenzTickEvent) { - if (!(LorenzUtils.inSkyBlock)) return + private fun getSlayerData() = if (RiftAPI.inRift()) outsideRiftData else insideRiftData - if (dirtySidebar && event.repeatSeconds(3)) { - checkSidebar() - } - } - - private fun checkSidebar() { - var loaded = false - - var slayerQuest = false - var bossSlain = false - var slayBoss = false - var nextIsType = false - for (line in ScoreboardData.sidebarLinesFormatted) { - if (nextIsType) { - nextIsType = false - } - if (line == "Slayer Quest") { - slayerQuest = true - nextIsType = true + private fun change(old: String, new: String) { + if (new.contains("Combat")) { + if (!old.contains("Combat")) { + needSlayerQuest = false } - if (line == "§aBoss slain!") { - bossSlain = true - } - if (line == "§eSlay the boss!") { - slayBoss = true - } - if (line == "§ewww.hypixel.net" || line == "§ewww.alpha.hypixel.net") { - loaded = true + } + if (new == "no slayer") { + if (old == "Slay the boss!") { + needNewQuest("The old slayer quest has failed!") } } - - if (loaded) { - dirtySidebar = false - if (slayerQuest && !needSlayerQuest) { - if (bossSlain) { - if (!hasAutoSlayer) { - needNewQuest("You have no Auto-Slayer active!") - hasAutoSlayer = false - } - } else if (slayBoss) { - needNewQuest("You probably switched the server during an active boss and now hypixel doesn't know what to do.") + if (new == "Boss slain!") { + DelayedRun.runDelayed(2.seconds) { + if (getSlayerData().currentSlayerState == "Boss slain!") { + needNewQuest("You have no Auto-Slayer active!") } } } } - @SubscribeEvent - fun onWorldChange(event: LorenzWorldChangeEvent) { - if (!needSlayerQuest) { - dirtySidebar = true - } + private var needSlayerQuest = false + private var lastWarning = 0L + private var currentReason = "" + + private fun needNewQuest(reason: String) { + currentReason = reason + needSlayerQuest = true } private fun tryWarn() { @@ -136,6 +97,10 @@ class SlayerQuestWarning { if (!config.questWarning) return if (lastWarning + 10_000 > System.currentTimeMillis()) return + if (DianaAPI.isDoingDiana()) return + // prevent warnings when mobs are hit by other players + if (lastWeaponUse.passedSince() > 500.milliseconds) return + lastWarning = System.currentTimeMillis() ChatUtils.chat(chatMessage) @@ -170,7 +135,23 @@ class SlayerQuestWarning { ) } } + return (getSlayerData().lastSlayerType == slayerType) && slayerType.clazz.isInstance(entity) + } - return slayerType.clazz.isInstance(entity) + @SubscribeEvent + fun onItemClick(event: ItemClickEvent) { + val internalName = event.itemInHand?.getInternalNameOrNull() + + if (event.clickType == ClickType.RIGHT_CLICK) { + if (internalName == voidItem || internalName == endItem) { + // ignore harmless teleportation + return + } + if (internalName == null) { + // ignore harmless right click + return + } + } + lastWeaponUse = SimpleTimeMark.now() } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt index c7a1f2fde..0fc237b0d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt @@ -14,4 +14,8 @@ enum class SlayerType(val displayName: String, val rngName: String, val clazz: C INFERNO("Inferno Demonlord", "inferno", EntityBlaze::class.java), VAMPIRE("Riftstalker Bloodfiend", "vampire", EntityZombie::class.java) ; + + companion object { + fun getByName(name: String): SlayerType? = entries.firstOrNull {name.contains(it.displayName)} + } } |