diff options
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/config/features/combat/SummoningsConfig.java | 5 | ||||
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt | 231 |
2 files changed, 74 insertions, 162 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/combat/SummoningsConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/combat/SummoningsConfig.java index cfa899b8f..521459ece 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/combat/SummoningsConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/combat/SummoningsConfig.java @@ -37,4 +37,9 @@ public class SummoningsConfig { @ConfigEditorBoolean @FeatureToggle public boolean summoningMobColored = false; + + @Expose + @ConfigOption(name = "Summon Chat Messages", desc = "Sends a chat message when a summon dies and hides other summon related messages.") + @ConfigEditorBoolean + public boolean summonMessages = false; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt b/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt index 8c1f254ca..7a78280da 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/summonings/SummoningMobManager.kt @@ -2,55 +2,56 @@ package at.hannibal2.skyhanni.features.summonings import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator +import at.hannibal2.skyhanni.data.mob.Mob import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzChatEvent -import at.hannibal2.skyhanni.events.LorenzTickEvent -import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent +import at.hannibal2.skyhanni.events.MobEvent import at.hannibal2.skyhanni.events.SkyHanniRenderEntityEvent -import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ChatUtils -import at.hannibal2.skyhanni.utils.ColorUtils.withAlpha -import at.hannibal2.skyhanni.utils.EntityUtils -import at.hannibal2.skyhanni.utils.LocationUtils +import at.hannibal2.skyhanni.utils.DelayedRun import at.hannibal2.skyhanni.utils.LorenzColor import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth +import at.hannibal2.skyhanni.utils.MobUtils.mob import at.hannibal2.skyhanni.utils.NumberUtil import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat -import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher -import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings -import at.hannibal2.skyhanni.utils.getLorenzVec +import at.hannibal2.skyhanni.utils.RegexUtils.matches +import at.hannibal2.skyhanni.utils.RenderUtils.renderRenderable +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import at.hannibal2.skyhanni.utils.renderables.Renderable import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern -import net.minecraft.entity.EntityLiving -import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.item.EntityArmorStand import net.minecraftforge.fml.common.eventhandler.EventPriority import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.seconds @SkyHanniModule object SummoningMobManager { private val config get() = SkyHanniMod.feature.combat.summonings + private var mobs = mutableSetOf<Mob>() - private val summoningMobs = mutableMapOf<EntityLiving, SummoningMob>() - private val summoningMobNametags = mutableListOf<EntityArmorStand>() - private var summoningsSpawned = 0 - private var searchArmorStands = false - private var searchMobs = false + private var lastChatTime: SimpleTimeMark = SimpleTimeMark.farPast() + private val timeOut = 2.seconds private val patternGroup = RepoPattern.group("summoning.mobs") - private val spawnPattern by patternGroup.pattern( //§aYou have spawned your Tank Zombie §r§asoul! §r§d(249 Mana) + + /** + * REGEX-TEST: §aYou have spawned your Tank Zombie §r§asoul! §r§d(249 Mana) + */ + private val spawnPattern by patternGroup.pattern( "spawn", - "§aYou have spawned your (.+) §r§asoul! §r§d\\((\\d+) Mana\\)" + "§aYou have spawned your (.+) §r§asoul! §r§d\\((\\d+) Mana\\)", ) + + /** + * REGEX-TEST: §cYou have despawned your monster! + * REGEX-TEST: §cYou have despawned your monsters! + */ private val despawnPattern by patternGroup.pattern( "despawn", - "§cYou have despawned your (monster|monsters)!" - ) - private val healthPattern by patternGroup.pattern( //§a§ohannibal2's Tank Zombie§r §a160k§c❤ - "health", - "§a§o(.+)'s (.+)§r §[ae]([\\dkm]+)§c❤" + "§cYou have despawned your monsters?!", ) /** @@ -59,170 +60,76 @@ object SummoningMobManager { */ private val seraphRecallPattern by patternGroup.pattern( "seraphrecall", - "§cThe Seraph recalled your (\\d+) summoned allies!" + "§cThe Seraph recalled your (\\d+) summoned allies!", + ) + + private val despawnPatterns = listOf( + despawnPattern, + seraphRecallPattern, ) @SubscribeEvent fun onChat(event: LorenzChatEvent) { - if (!LorenzUtils.inSkyBlock) return - - val message = event.message - spawnPattern.matchMatcher(message) { - if (config.summoningMobDisplay) { - event.blockedReason = "summoning_soul" - } - summoningsSpawned++ - searchArmorStands = true - searchMobs = true - } + if (!LorenzUtils.inSkyBlock || !config.summonMessages) return + if (spawnPattern.matches(event.message)) event.blockedReason = "summoning_soul" - if (despawnPattern.matcher(message).matches() || message.startsWith("§c ☠ §r§7You ")) { - despawned() - if (config.summoningMobDisplay && !message.contains("☠")) { - event.blockedReason = "summoning_soul" - } - } - if (message == "§cThe Seraph recalled your summoned ally!" || seraphRecallPattern.matcher(message).matches()) { - despawned() - if (config.summoningMobDisplay) { - event.blockedReason = "summoning_soul" - } + if (despawnPatterns.any { it.matches(event.message) }) { + event.blockedReason = "summoning_soul" + lastChatTime = SimpleTimeMark.now() } } @SubscribeEvent - fun onTick(event: LorenzTickEvent) { - if (!isEnabled()) return - - if (config.summoningMobDisplay && event.repeatSeconds(1)) { - updateData() - } - - if (searchArmorStands) { - for (it in EntityUtils.getEntities<EntityArmorStand>().filter { it !in summoningMobNametags }) { - val name = it.displayName.unformattedText - healthPattern.matchMatcher(name) { - val playerName = LorenzUtils.getPlayerName() - if (name.contains(playerName)) { - summoningMobNametags.add(it) - if (summoningMobNametags.size == summoningsSpawned) { - searchArmorStands = false - } - } - } - } - } + fun onMobSpawn(event: MobEvent.Spawn.Summon) { + if (event.mob.owner?.ownerName != LorenzUtils.getPlayerName()) return - if (!searchMobs) return - val playerLocation = LocationUtils.playerLocation() - val list = EntityUtils.getEntities<EntityLiving>().filter { - it !in summoningMobs.keys && it.getLorenzVec() - .distance(playerLocation) < 10 && it.ticksExisted < 2 - } - for (entity in list) { - summoningMobs[entity] = SummoningMob(System.currentTimeMillis(), name = "Mob") - entity.setColor(LorenzColor.GREEN) - updateData() - if (summoningMobs.size == summoningsSpawned) { - searchMobs = false - } - } + mobs += event.mob + if (config.summoningMobColored) event.mob.highlight(LorenzColor.GREEN.toColor()) } - private fun updateData() { - if (summoningMobs.isEmpty()) return - - for (entry in HashMap(summoningMobs)) { - val entityLiving = entry.key - val summoningMob = entry.value - - val currentHealth = entityLiving.health.toInt() - val name = summoningMob.name - if (currentHealth == 0) { - summoningMobs.remove(entityLiving) - entityLiving.setColor(null) + @SubscribeEvent + fun onMobDeSpawn(event: MobEvent.DeSpawn.Summon) { + val mob = event.mob + if (mob !in mobs) return + mobs -= mob + + if (!mob.isInRender()) return + DelayedRun.runNextTick { + if (lastChatTime.passedSince() > timeOut) { ChatUtils.chat("Your Summoning Mob just §cdied!") - continue } - - val maxHealth = entityLiving.baseMaxHealth - val color = NumberUtil.percentageColor(currentHealth.toLong(), maxHealth.toLong()).getChatColor() - - val currentFormat = currentHealth.shortFormat() - val maxFormat = maxHealth.shortFormat() - summoningMob.lastDisplayName = "§a$name $color$currentFormat/$maxFormat" } } - @SubscribeEvent - fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { - if (!LorenzUtils.inSkyBlock) return - if (!config.summoningMobDisplay) return - if (summoningMobs.isEmpty()) return - - val list = mutableListOf<String>() - list.add("Summoning mobs: " + summoningMobs.size) - var id = 1 - for (mob in summoningMobs) { - val name = mob.value.lastDisplayName - list.add("#$id $name") - id++ - } - - config.summoningMobDisplayPos.renderStrings(list, posLabel = "Summoning Mob Display") + @SubscribeEvent(priority = EventPriority.HIGH) + fun onRenderLiving(event: SkyHanniRenderEntityEvent.Specials.Pre<EntityArmorStand>) { + if (!LorenzUtils.inSkyBlock || !config.summoningMobHideNametag) return + if (event.entity.mob !in mobs) return + event.cancel() } @SubscribeEvent - fun onWorldChange(event: LorenzWorldChangeEvent) { - despawned() - } - - @SubscribeEvent(priority = EventPriority.HIGH) - fun onRenderLiving(event: SkyHanniRenderEntityEvent.Specials.Pre<EntityLivingBase>) { - if (!LorenzUtils.inSkyBlock) return - if (!config.summoningMobHideNametag) return - - val entity = event.entity - if (entity !is EntityArmorStand) return - if (!entity.hasCustomName()) return - if (entity.isDead) return + fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) { + if (!LorenzUtils.inSkyBlock || !config.summoningMobDisplay) return + if (mobs.isEmpty()) return + + val list = buildList { + add("Summoning mobs: " + mobs.size) + mobs.forEachIndexed { index, mob -> + val entity = mob.baseEntity + val health = entity.health + val maxHealth = entity.baseMaxHealth + val color = NumberUtil.percentageColor(health.toLong(), maxHealth.toLong()).getChatColor() + add("#${index + 1} §a${mob.name} $color${health.shortFormat()}§2/${maxHealth.shortFormat()}§c❤") + } + }.map { Renderable.string(it) } - if (entity in summoningMobNametags) { - event.cancel() - } + val renderable = Renderable.verticalContainer(list) + config.summoningMobDisplayPos.renderRenderable(renderable, posLabel = "Summoning Mob Display") } @SubscribeEvent fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) { event.move(2, "summonings", "combat.summonings") } - - private fun despawned() { - summoningMobs.clear() - summoningMobNametags.clear() - summoningsSpawned = 0 - searchArmorStands = false - searchMobs = false - } - - private fun isEnabled(): Boolean { - return LorenzUtils.inSkyBlock && (config.summoningMobDisplay || config.summoningMobHideNametag) - } - - class SummoningMob( - val spawnTime: Long, - var name: String = "", - var lastDisplayName: String = "", - ) - - private infix fun EntityLivingBase.setColor(color: LorenzColor?) { - if (color != null) { - RenderLivingEntityHelper.setEntityColorWithNoHurtTime( - this, - color.toColor().withAlpha(127), - ) { isEnabled() && config.summoningMobColored } - } else { - RenderLivingEntityHelper.removeCustomRender(this) - } - } } |