From c65b18c7e95a7cefdeea3c0be9bb69d3195c6283 Mon Sep 17 00:00:00 2001 From: Empa <42304516+ItsEmpa@users.noreply.github.com> Date: Sun, 27 Oct 2024 23:05:25 +0100 Subject: Improvement: Slayer Miniboss Mob Detection (#2081) Co-authored-by: ItsEmpa Co-authored-by: CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> --- .../features/slayer/SlayerMiniBossFeatures.kt | 74 ++++++++-------------- .../skyhanni/features/slayer/SlayerType.kt | 48 ++++++++++++-- 2 files changed, 69 insertions(+), 53 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerMiniBossFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerMiniBossFeatures.kt index 1dabaaba9..75f6ba951 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerMiniBossFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerMiniBossFeatures.kt @@ -1,69 +1,44 @@ package at.hannibal2.skyhanni.features.slayer import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.events.EntityMaxHealthUpdateEvent +import at.hannibal2.skyhanni.data.SlayerAPI +import at.hannibal2.skyhanni.data.mob.Mob import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent -import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent -import at.hannibal2.skyhanni.features.combat.damageindicator.DamageIndicatorManager -import at.hannibal2.skyhanni.features.dungeon.DungeonAPI -import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper +import at.hannibal2.skyhanni.events.MobEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule -import at.hannibal2.skyhanni.utils.CollectionUtils.editCopy -import at.hannibal2.skyhanni.utils.ColorUtils.withAlpha import at.hannibal2.skyhanni.utils.EntityUtils.canBeSeen -import at.hannibal2.skyhanni.utils.EntityUtils.hasMaxHealth import at.hannibal2.skyhanni.utils.LorenzColor -import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.drawLineToEye import at.hannibal2.skyhanni.utils.getLorenzVec -import net.minecraft.entity.EntityCreature -import net.minecraft.entity.monster.EntityBlaze -import net.minecraft.entity.monster.EntityEnderman -import net.minecraft.entity.monster.EntitySpider -import net.minecraft.entity.monster.EntityZombie -import net.minecraft.entity.passive.EntityWolf import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @SkyHanniModule object SlayerMiniBossFeatures { private val config get() = SkyHanniMod.feature.slayer - private var miniBosses = listOf() + private var miniBosses = mutableSetOf() @SubscribeEvent - fun onEntityHealthUpdate(event: EntityMaxHealthUpdateEvent) { - if (!isEnabled()) return - val entity = event.entity as? EntityCreature ?: return - if (DamageIndicatorManager.isBoss(entity)) return - - val maxHealth = event.maxHealth - for (bossType in SlayerMiniBossType.entries) { - if (!bossType.health.any { entity.hasMaxHealth(it, true, maxHealth) }) continue - if (bossType.clazz != entity.javaClass) continue - - miniBosses = miniBosses.editCopy { add(entity) } - RenderLivingEntityHelper.setEntityColorWithNoHurtTime( - entity, - LorenzColor.AQUA.toColor().withAlpha(127) - ) { config.slayerMinibossHighlight } - } + fun onMobSpawn(event: MobEvent.Spawn.SkyblockMob) { + val mob = event.mob + if (!SlayerMiniBossType.isMiniboss(mob.name)) return + miniBosses += mob + if (config.slayerMinibossHighlight) mob.highlight(LorenzColor.AQUA.toColor()) } @SubscribeEvent - fun onWorldChange(event: LorenzWorldChangeEvent) { - miniBosses = emptyList() + fun onMobDeSpawn(event: MobEvent.DeSpawn.SkyblockMob) { + miniBosses -= event.mob } @SubscribeEvent fun onWorldRender(event: LorenzRenderWorldEvent) { + if (!SlayerAPI.isInAnyArea) return if (!config.slayerMinibossLine) return for (mob in miniBosses) { - if (mob.health <= 0) continue - if (mob.isDead) continue - if (!mob.canBeSeen(10)) continue - + if (!mob.baseEntity.canBeSeen(10)) continue event.drawLineToEye( - mob.getLorenzVec().up(), + mob.baseEntity.getLorenzVec().up(), LorenzColor.AQUA.toColor(), config.slayerMinibossLineWidth, true, @@ -71,13 +46,20 @@ object SlayerMiniBossFeatures { } } - private fun isEnabled() = LorenzUtils.inSkyBlock && !DungeonAPI.inDungeon() && !LorenzUtils.inKuudraFight + enum class SlayerMiniBossType(vararg names: String) { + REVENANT("Revenant Sycophant", "Revenant Champion", "Deformed Revenant", "Atoned Champion", "Atoned Revenant"), + TARANTULA("Tarantula Vermin", "Tarantula Beast", "Mutant Tarantula"), + SVEN("Pack Enforcer", "Sven Follower", "Sven Alpha"), + VOIDLING("Voidling Devotee", "Voidling Radical", "Voidcrazed Maniac"), + INFERNAL("Flare Demon", "Kindleheart Demon", "Burningsoul Demon"), + ; - enum class SlayerMiniBossType(val clazz: Class, vararg val health: Int) { - REVENANT(EntityZombie::class.java, 24_000, 90_000, 360_000, 600_000, 2_400_000), - TARANTULA(EntitySpider::class.java, 54_000, 144_000, 576_000), - SVEN(EntityWolf::class.java, 45_000, 120_000, 480_000), - VOIDLING(EntityEnderman::class.java, 8_400_000, 17_500_000, 52_500_000), - INFERNAL(EntityBlaze::class.java, 12_000_000, 25_000_000, 75_000_000), + val names = names.toSet() + + companion object { + private val allNames = entries.flatMap { it.names }.toSet() + + fun isMiniboss(name: String) = name in allNames + } } } 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 0a07e62fe..9fff1bb06 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/SlayerType.kt @@ -6,13 +6,47 @@ import net.minecraft.entity.monster.EntitySpider import net.minecraft.entity.monster.EntityZombie import net.minecraft.entity.passive.EntityWolf -enum class SlayerType(val displayName: String, val rngName: String, val clazz: Class<*>) { - REVENANT("Revenant Horror", "revenant", EntityZombie::class.java), - TARANTULA("Tarantula Broodfather", "tarantula", EntitySpider::class.java), - SVEN("Sven Packmaster", "sven", EntityWolf::class.java), - VOID("Voidgloom Seraph", "voidgloom", EntityEnderman::class.java), - INFERNO("Inferno Demonlord", "inferno", EntityBlaze::class.java), - VAMPIRE("Bloodfiend", "vampire", EntityZombie::class.java) // previously called "Riftstalker Bloodfiend" +enum class SlayerType( + val displayName: String, + val rngName: String, + val clazz: Class<*>, + val miniBossType: SlayerMiniBossFeatures.SlayerMiniBossType? = null, +) { + REVENANT( + "Revenant Horror", + "revenant", + EntityZombie::class.java, + SlayerMiniBossFeatures.SlayerMiniBossType.REVENANT, + ), + TARANTULA( + "Tarantula Broodfather", + "tarantula", + EntitySpider::class.java, + SlayerMiniBossFeatures.SlayerMiniBossType.TARANTULA, + ), + SVEN( + "Sven Packmaster", + "sven", + EntityWolf::class.java, + SlayerMiniBossFeatures.SlayerMiniBossType.SVEN, + ), + VOID( + "Voidgloom Seraph", + "voidgloom", + EntityEnderman::class.java, + SlayerMiniBossFeatures.SlayerMiniBossType.VOIDLING, + ), + INFERNO( + "Inferno Demonlord", + "inferno", + EntityBlaze::class.java, + SlayerMiniBossFeatures.SlayerMiniBossType.INFERNAL, + ), + VAMPIRE( + "Bloodfiend", + "vampire", + EntityZombie::class.java, + ) // previously called "Riftstalker Bloodfiend" ; companion object { -- cgit