diff options
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features')
25 files changed, 1045 insertions, 89 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/CorruptedMobHighlight.kt b/src/main/java/at/hannibal2/skyhanni/features/CorruptedMobHighlight.kt new file mode 100644 index 000000000..cbad9c0e7 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/CorruptedMobHighlight.kt @@ -0,0 +1,61 @@ +package at.hannibal2.skyhanni.features + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.EntityHealthUpdateEvent +import at.hannibal2.skyhanni.events.RenderMobColoredEvent +import at.hannibal2.skyhanni.events.ResetEntityHurtEvent +import at.hannibal2.skyhanni.events.withAlpha +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth +import net.minecraft.entity.EntityLivingBase +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class CorruptedMobHighlight { + + private val corruptedMobs = mutableListOf<EntityLivingBase>() + + @SubscribeEvent + fun onHealthUpdateEvent(event: EntityHealthUpdateEvent) { + if (!LorenzUtils.inSkyblock) return + + val entity = event.entity + if (entity in corruptedMobs) return + + val baseMaxHealth = entity.baseMaxHealth.toFloat() + if (event.health == baseMaxHealth * 3) { + corruptedMobs.add(entity) + } + } + + @SubscribeEvent + fun onRenderMobColored(event: RenderMobColoredEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in corruptedMobs) { + event.color = LorenzColor.DARK_PURPLE.toColor().withAlpha(127) + } + } + + @SubscribeEvent + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in corruptedMobs) { + event.shouldReset = true + } + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + corruptedMobs.clear() + } + + private fun isEnabled(): Boolean { + return LorenzUtils.inSkyblock && SkyHanniMod.feature.misc.corruptedMobHighlight && + LorenzUtils.skyBlockIsland != "Private Island" + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/PlayerMarker.kt b/src/main/java/at/hannibal2/skyhanni/features/PlayerMarker.kt new file mode 100644 index 000000000..e8a12a743 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/PlayerMarker.kt @@ -0,0 +1,90 @@ +package at.hannibal2.skyhanni.features + +import at.hannibal2.skyhanni.events.RenderMobColoredEvent +import at.hannibal2.skyhanni.events.ResetEntityHurtEvent +import at.hannibal2.skyhanni.events.withAlpha +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.LorenzUtils +import net.minecraft.client.Minecraft +import net.minecraft.client.entity.EntityOtherPlayerMP +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +class PlayerMarker { + + companion object { + private val playerNamesToMark = mutableListOf<String>() + private val markedPlayers = mutableMapOf<String, EntityOtherPlayerMP>() + + fun command(args: Array<String>) { + if (args.size != 1) { + LorenzUtils.chat("§cUsage: /shmarkplayer <name>") + return + } + + val displayName = args[0] + val name = displayName.lowercase() + if (name !in playerNamesToMark) { + playerNamesToMark.add(name) + findPlayers() + LorenzUtils.chat("§e[SkyHanni] §amarked §eplayer §b$displayName!") + } else { + playerNamesToMark.remove(name) + markedPlayers.remove(name) + LorenzUtils.chat("§e[SkyHanni] §cunmarked §eplayer §b$displayName!") + } + } + + private fun findPlayers() { + for (entity in Minecraft.getMinecraft().theWorld.loadedEntityList) { + if (entity is EntityOtherPlayerMP) { + if (entity in markedPlayers.values) continue + + val name = entity.name.lowercase() + if (name in playerNamesToMark) { + markedPlayers[name] = entity + } + } + } + } + } + + var tick = 0 + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (!isEnabled()) return + + if (tick++ % 20 == 0) { + findPlayers() + } + } + + @SubscribeEvent + fun onRenderMobColored(event: RenderMobColoredEvent) { + if (!isEnabled()) return + val entity = event.entity + if (entity in markedPlayers.values) { + event.color = LorenzColor.YELLOW.toColor().withAlpha(127) + } + } + + @SubscribeEvent + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { + if (!isEnabled()) return + val entity = event.entity + if (entity in markedPlayers.values) { + event.shouldReset = true + } + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + markedPlayers.clear() + } + + private fun isEnabled(): Boolean { + return LorenzUtils.inSkyblock + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt b/src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt index 74cf7847b..36dbab9ed 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt @@ -3,7 +3,7 @@ package at.hannibal2.skyhanni.features import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.RenderMobColoredEvent -import at.hannibal2.skyhanni.events.ResetEntityHurtTimeEvent +import at.hannibal2.skyhanni.events.ResetEntityHurtEvent import at.hannibal2.skyhanni.events.withAlpha import at.hannibal2.skyhanni.utils.* import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth @@ -177,7 +177,7 @@ class SummoningMobManager { } @SubscribeEvent - fun onResetEntityHurtTime(event: ResetEntityHurtTimeEvent) { + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { val entity = event.entity if (SkyHanniMod.feature.abilities.summoningMobColored && entity in summoningMobs.keys) { event.shouldReset = true @@ -190,7 +190,6 @@ class SummoningMobManager { summoningsSpawned = 0 searchArmorStands = false searchMobs = false - println("despawning") } private fun isEnabled(): Boolean { diff --git a/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt b/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt index 1a659f171..ec813395a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt @@ -12,22 +12,23 @@ import net.minecraft.client.Minecraft import net.minecraft.entity.EntityLiving import net.minecraft.entity.item.EntityArmorStand import net.minecraftforge.client.event.RenderWorldLastEvent +import net.minecraftforge.event.world.WorldEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent class SummoningSoulsName { var tick = 0 - val texture = + private val texture = "ewogICJ0aW1lc3RhbXAiIDogMTYwMTQ3OTI2NjczMywKICAicHJvZmlsZUlkIiA6ICJmMzA1ZjA5NDI0NTg0ZjU" + "4YmEyYjY0ZjAyZDcyNDYyYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJqcm9ja2EzMyIsCiAgInNpZ25hdH" + "VyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgI" + "nVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81YWY0MDM1ZWMwZGMx" + "NjkxNzc4ZDVlOTU4NDAxNzAyMjdlYjllM2UyOTQzYmVhODUzOTI5Y2U5MjNjNTk4OWFkIgogICAgfQogIH0KfQ" - val souls = mutableMapOf<EntityArmorStand, String>() - val mobsLastLocation = mutableMapOf<EntityLiving, LorenzVec>() - val mobsName = mutableMapOf<EntityLiving, String>() + private val souls = mutableMapOf<EntityArmorStand, String>() + private val mobsLastLocation = mutableMapOf<EntityLiving, LorenzVec>() + private val mobsName = mutableMapOf<EntityLiving, String>() @SubscribeEvent fun onTick(event: TickEvent.ClientTickEvent) { @@ -103,6 +104,13 @@ class SummoningSoulsName { } } + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + souls.clear() + mobsLastLocation.clear() + mobsName.clear() + } + private fun isSoul(entity: EntityArmorStand): Boolean { for (stack in entity.inventory) { if (stack != null) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt index 4dc106249..412114c58 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt @@ -72,13 +72,13 @@ class ChatFilter { } private fun uselessNotification(message: String): Boolean { - return when { - message == "§eYour previous §r§6Plasmaflux Power Orb §r§ewas removed!" -> true - - message == "§aYou used your §r§6Mining Speed Boost §r§aPickaxe Ability!" -> true - message == "§cYour Mining Speed Boost has expired!" -> true - message == "§a§r§6Mining Speed Boost §r§ais now available!" -> true + if (message.matchRegex("§aYou tipped (\\d) (player|players)!")) return true + return when (message) { + "§eYour previous §r§6Plasmaflux Power Orb §r§ewas removed!" -> true + "§aYou used your §r§6Mining Speed Boost §r§aPickaxe Ability!" -> true + "§cYour Mining Speed Boost has expired!" -> true + "§a§r§6Mining Speed Boost §r§ais now available!" -> true else -> false } } @@ -92,7 +92,7 @@ class ChatFilter { message == "§cPlace a Dungeon weapon or armor piece above the anvil to salvage it!" -> true message == "§cWhoa! Slow down there!" -> true message == "§cWait a moment before confirming!" -> true - message == "§cYou need to be out of combat for 3 seconds before opening the SkyBlock Menu!" -> true//TODO prevent in the future + message == "§cYou cannot open the SkyBlock menu while in combat!" -> true else -> false } @@ -206,21 +206,22 @@ class ChatFilter { private fun bazaarAndAHMiniMessages(message: String): Boolean = when (message) { "§7Putting item in escrow...", - "§7Putting goods in escrow...", "§7Putting coins in escrow...", //Auction House "§7Setting up the auction...", "§7Processing purchase...", - "§7Claiming order...", "§7Processing bid...", "§7Claiming BIN auction...", //Bazaar - "§7Submitting sell offer...", - "§7Submitting buy order...", - "§7Executing instant sell...", - "§7Executing instant buy...", + "§6[Bazaar] §r§7Submitting sell offer...", + "§6[Bazaar] §r§7Submitting buy order...", + "§6[Bazaar] §r§7Executing instant sell...", + "§6[Bazaar] §r§7Executing instant buy...", + "§6[Bazaar] §r§7Cancelling order...", + "§6[Bazaar] §r§7Claiming order...", + "§6[Bazaar] §r§7Putting goods in escrow...", //Bank "§8Depositing coins...", diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/HideFarDeathMessages.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/HideFarDeathMessages.kt new file mode 100644 index 000000000..0a3ead47d --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/HideFarDeathMessages.kt @@ -0,0 +1,64 @@ +package at.hannibal2.skyhanni.features.chat + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.utils.LocationUtils +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.getLorenzVec +import net.minecraft.client.Minecraft +import net.minecraft.client.entity.EntityOtherPlayerMP +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent +import java.util.regex.Pattern + +class HideFarDeathMessages { + + private var tick = 0 + private val lastTimePlayerSeen = mutableMapOf<String, Long>() + + //§c ☠ §r§7§r§bZeroHazel§r§7 was killed by §r§8§lAshfang§r§7§r§7. + private val pattern = Pattern.compile("§c ☠ §r§7§r§.(.+)§r§7 (.+)") + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (!isEnabled()) return + + if (tick++ % 20 == 0) { + checkOtherPlayers() + } + } + + @SubscribeEvent + fun onChatMessage(event: LorenzChatEvent) { + if (!isEnabled()) return + + val message = event.message + val matcher = pattern.matcher(message) + if (matcher.matches()) { + val name = matcher.group(1) + if (System.currentTimeMillis() > lastTimePlayerSeen.getOrDefault(name, 0) + 30_000) { + event.blockedReason = "far_away_player_death" + } + } + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + HypixelData.skyblock = false + } + + private fun checkOtherPlayers() { + val location = LocationUtils.playerLocation() + for (otherPlayer in Minecraft.getMinecraft().theWorld.loadedEntityList + .filterIsInstance<EntityOtherPlayerMP>() + .filter { it.getLorenzVec().distance(location) < 25 }) { + lastTimePlayerSeen[otherPlayer.name] = System.currentTimeMillis() + } + } + + private fun isEnabled(): Boolean { + return LorenzUtils.inSkyblock && SkyHanniMod.feature.chat.hideFarDeathMessages && !LorenzUtils.inDungeons && !LorenzUtils.inKuudraFight + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerChatFilter.kt index ac6b9fbbe..a96997ba6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/PlayerChatFilter.kt @@ -7,15 +7,18 @@ import at.hannibal2.skyhanni.utils.LorenzLogger import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.StringUtils.removeColor import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import java.util.regex.Pattern class PlayerChatFilter { private val loggerPlayerChat = LorenzLogger("chat/player") + //§8[§9109§8] §b[MVP§c+§b] 4Apex§f§r§f: omg selling + private val patternSkyBlockLevel = Pattern.compile("§8\\[§(.)(\\d+)§8] (.+)") + @SubscribeEvent fun onChatMessage(event: LorenzChatEvent) { if (!LorenzUtils.isOnHypixel) return - if (!SkyHanniMod.feature.chat.playerMessages) return if (shouldBlock(event.message)) { event.blockedReason = "player_chat" @@ -23,10 +26,19 @@ class PlayerChatFilter { } private fun shouldBlock(originalMessage: String): Boolean { - val split = if (originalMessage.contains("§7§r§7: ")) { - originalMessage.split("§7§r§7: ") - } else if (originalMessage.contains("§f: ")) { - originalMessage.split("§f: ") + //since hypixel sends own chat messages really weird " §r§8[§r§d205§r§8] §r§6[MVP§r§c++§r§6] hannibal2" + var rawMessage = originalMessage.replace("§r", "").trim() + + val matcher = patternSkyBlockLevel.matcher(rawMessage) + if (matcher.matches()) { + SkyBlockLevelChatMessage.setData(matcher.group(2).toInt(), matcher.group(1)) + rawMessage = matcher.group(3) + } + + val split = if (rawMessage.contains("§7§7: ")) { + rawMessage.split("§7§7: ") + } else if (rawMessage.contains("§f: ")) { + rawMessage.split("§f: ") } else { return false } @@ -37,6 +49,14 @@ class PlayerChatFilter { rawName = rawName.substring(channel.originalPrefix.length) val name = grabName(rawName) ?: return false + if (!SkyHanniMod.feature.chat.playerMessagesFormat) { + if (SkyHanniMod.feature.chat.hideSkyblockLevel) { + LorenzUtils.chat(rawMessage) + return true + } + return false + } + val message = split[1] send(channel, name.removeColor(), message.removeColor()) return true diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/SkyBlockLevelChatMessage.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/SkyBlockLevelChatMessage.kt new file mode 100644 index 000000000..deacc0de6 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/SkyBlockLevelChatMessage.kt @@ -0,0 +1,49 @@ +package at.hannibal2.skyhanni.features.chat + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.PlayerSendChatEvent +import at.hannibal2.skyhanni.utils.LorenzUtils +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class SkyBlockLevelChatMessage { + + companion object { + var level = -1 + var levelColor = "" + + fun setData(level: Int, levelColor: String) { + this.level = level + this.levelColor = levelColor + } + } + + @SubscribeEvent + fun onChatMessage(event: PlayerSendChatEvent) { + if (level == -1) return + event.cancelledReason = "skyblock level" + + val finalMessage = event.message + val name = event.playerName + val prefix = event.channel.prefix + + if (SkyHanniMod.feature.chat.hideSkyblockLevel) { + LorenzUtils.chat("$prefix §b$name §f$finalMessage") + } else { + + when (SkyHanniMod.feature.chat.skyblockLevelDesign) { + 0 -> { + LorenzUtils.chat("$prefix §8[§${levelColor}${level}§8] §b$name §f$finalMessage") + } + + 1 -> { + LorenzUtils.chat("$prefix §${levelColor}§l${level} §b$name §f$finalMessage") + } + + 2 -> { + LorenzUtils.chat("$prefix §b$name §8[§${levelColor}${level}§8]§f: $finalMessage") + } + } + } + level = -1 + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt index 109bfa9bc..c77738605 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt @@ -62,7 +62,6 @@ enum class BossType(val fullName: String, val bossTypeToggle: Int, val shortName * lost adventurer * frozen adventurer * king midas - * silverfish 2b one tap - deathmite outside trap * in blood room: bonzo, scarf, ?? * f7 blood room giants * diff --git a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt index 3f9c88dac..a6fff41ca 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt @@ -42,6 +42,10 @@ class DamageIndicatorManager { private var data = mutableMapOf<UUID, EntityData>() private val damagePattern: Pattern = Pattern.compile("✧?(\\d+[⚔+✧❤♞☄✷ﬗ]*)") + fun isBoss(entity: EntityLivingBase): Boolean { + return data.values.any { it.entity == entity } + } + fun isDamageSplash(entity: EntityLivingBase): Boolean { if (entity.ticksExisted > 300 || entity !is EntityArmorStand) return false if (!entity.hasCustomName()) return false diff --git a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt index 537a9850f..aa0af27b5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt @@ -237,7 +237,7 @@ class MobFinder { } } if (entity is EntityDragon) { - //TODO testing and make right and so + //TODO testing and use sidebar data return EntityResult(bossType = BossType.END_ENDER_DRAGON) } if (entity is EntityIronGolem) { diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonChatFilter.kt index 0d3dcb77f..031cf41f5 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonChatFilter.kt @@ -29,8 +29,7 @@ class DungeonChatFilter { if (!LorenzUtils.inDungeons) return "" return when { - isKey(message) -> "key" - isDoor(message) -> "door" + isUnsortedBlockedMessage(message) -> "unsorted" isPickup(message) -> "pickup" isReminder(message) -> "reminder" isBuff(message) -> "buff" @@ -44,8 +43,6 @@ class DungeonChatFilter { } } - private fun isDoor(message: String): Boolean = message == "§cThe §r§c§lBLOOD DOOR§r§c has been opened!" - private fun isEnd(message: String): Boolean = when { message.matchRegex("(.*) §r§eunlocked §r§d(.*) Essence §r§8x(.*)§r§e!") -> true message.matchRegex(" §r§d(.*) Essence §r§8x(.*)") -> true @@ -58,6 +55,7 @@ class DungeonChatFilter { message.matchRegex("§7Your Guided Sheep hit §r§c(.*) §r§7enemy for §r§c(.*) §r§7damage.") -> true message == "§6Rapid Fire§r§a is ready to use! Press §r§6§lDROP§r§a to activate it!" -> true message == "§6Castle of Stone§r§a is ready to use! Press §r§6§lDROP§r§a to activate it!" -> true + message == "§6Ragnarok§r§a is ready to use! Press §r§6§lDROP§r§a to activate it!" -> true message.matchRegex("§a§lBUFF! §fYou were splashed by (.*) §fwith §r§cHealing VIII§r§f!") -> true @@ -159,14 +157,10 @@ class DungeonChatFilter { else -> false } - private fun isKey(message: String): Boolean = when { - message.matchRegex("(.*) §r§ehas obtained §r§a§r§6§r§8Wither Key§r§e!") -> true - message.matchRegex("(.*) opened a §r§8§lWITHER §r§adoor!") -> true - message.matchRegex("(.*) §r§ehas obtained §r§a§r§c§r§cBlood Key§r§e!") -> true + //TODO sort out and filter separately + private fun isUnsortedBlockedMessage(message: String): Boolean = when { message.matchRegex("(.*) §r§ehas obtained §r§a§r§9Beating Heart§r§e!") -> true message == "§5A shiver runs down your spine..." -> true - message == "§eA §r§a§r§6§r§8Wither Key§r§e was picked up!" -> true - message == "§eA §r§a§r§c§r§cBlood Key§r§e was picked up!" -> true else -> false } @@ -216,7 +210,7 @@ class DungeonChatFilter { message == "§aYour active Potion Effects have been paused and stored. They will be restored when you leave Dungeons! You are not allowed to use existing Potion Effects while in Dungeons." -> true message.matchRegex("(.*) has started the dungeon countdown. The dungeon will begin in 1 minute.") -> true message.matchRegex("§e[NPC] §bMort§f: §rTalk to me to change your class and ready up.") -> true - message.matchRegex("(.*) §a is now ready!") -> true + message.matchRegex("(.*)§a is now ready!") -> true message.matchRegex("§aDungeon starts in (.*) seconds.") -> true message == "§aDungeon starts in 1 second." -> true message == "§aYou can no longer consume or splash any potions during the remainder of this Dungeon run!" -> true diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt index bdaebc3f7..7222d080d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt @@ -1,17 +1,13 @@ package at.hannibal2.skyhanni.features.dungeon import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.events.CheckRenderEntityEvent -import at.hannibal2.skyhanni.events.DamageIndicatorFinalBossEvent -import at.hannibal2.skyhanni.events.LorenzChatEvent -import at.hannibal2.skyhanni.events.PacketEvent +import at.hannibal2.skyhanni.events.* import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.matchRegex import net.minecraft.client.Minecraft import net.minecraft.client.entity.EntityOtherPlayerMP import net.minecraft.entity.item.EntityArmorStand import net.minecraft.entity.monster.EntityGuardian -import net.minecraft.network.play.server.S1CPacketEntityMetadata import net.minecraft.network.play.server.S2APacketParticles import net.minecraftforge.event.world.WorldEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -61,26 +57,17 @@ class DungeonCleanEnd { } @SubscribeEvent - fun onHealthUpdatePacket(event: PacketEvent.ReceiveEvent) { + fun onHealthUpdateEvent(event: EntityHealthUpdateEvent) { if (!LorenzUtils.inDungeons) return if (!SkyHanniMod.feature.dungeon.cleanEndToggle) return - if (bossDone) return if (lastBossId == -1) return + if (event.entity.entityId != lastBossId) return - val packet = event.packet - if (packet !is S1CPacketEntityMetadata) return - if (packet.entityId != lastBossId) return - - for (watchableObject in packet.func_149376_c()) { - if (watchableObject.dataValueId == 6) { - val health = watchableObject.`object` as Float - if (health < 1) { - val dungeonFloor = DungeonData.dungeonFloor - LorenzUtils.chat("§eFloor $dungeonFloor done!") - bossDone = true - } - } + if (event.health < 1) { + val dungeonFloor = DungeonData.dungeonFloor + LorenzUtils.chat("§eFloor $dungeonFloor done!") + bossDone = true } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt new file mode 100644 index 000000000..79c00619b --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt @@ -0,0 +1,134 @@ +package at.hannibal2.skyhanni.features.dungeon + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.* +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 + +class DungeonCopilot { + + var nextStep = "" + var searchForKey = false + + @SubscribeEvent + fun onChatMessage(event: LorenzChatEvent) { + if (!LorenzUtils.inDungeons) return + + val message = event.message + + if (message.matchRegex("(.*) has started the dungeon countdown. The dungeon will begin in 1 minute.")) { + changeNextStep("Ready up") + } + if (message.endsWith("§a is now ready!")) { + var name = Minecraft.getMinecraft().thePlayer.name + if (message.contains(name)) { + changeNextStep("Wait for the dungeon to start!") + } + } + + var foundKeyOrDoor = false + + //key pickup + if (message.matchRegex("(.*) §r§ehas obtained §r§a§r§6§r§8Wither Key§r§e!") || + message == "§eA §r§a§r§6§r§8Wither Key§r§e was picked up!" + ) { + changeNextStep("Open Wither Door") + foundKeyOrDoor = true + + } + if (message.matchRegex("(.*) §r§ehas obtained §r§a§r§c§r§cBlood Key§r§e!") || + message == "§eA §r§a§r§c§r§cBlood Key§r§e was picked up!" + ) { + changeNextStep("Open Blood Door") + foundKeyOrDoor = true + } + + + if (message.matchRegex("(.*) opened a §r§8§lWITHER §r§adoor!")) { + changeNextStep("Clear next room") + searchForKey = true + foundKeyOrDoor = true + } + + if (message == "§cThe §r§c§lBLOOD DOOR§r§c has been opened!") { + changeNextStep("Wait for Blood Room to fully spawn") + foundKeyOrDoor = true + } + + if (foundKeyOrDoor && SkyHanniMod.feature.dungeon.messageFilterKeysAndDoors) { + event.blockedReason = "dungeon_keys_and_doors" + } + + + if (message == "§c[BOSS] The Watcher§r§f: That will be enough for now.") { + changeNextStep("Clear Blood Room") + } + + if (message == "§c[BOSS] The Watcher§r§f: You have proven yourself. You may pass.") { + changeNextStep("Enter Boss Room") + } + } + + private fun changeNextStep(step: String) { + nextStep = step + } + + @SubscribeEvent + fun onCheckRender(event: CheckRenderEntityEvent<*>) { + if (!LorenzUtils.inDungeons) return + + val entity = event.entity + if (entity !is EntityArmorStand) return + + if (!searchForKey) return + + if (entity.name == "§6§8Wither Key") { + changeNextStep("Pick up Wither Key") + searchForKey = false + } + if (entity.name == "§c§cBlood Key") { + changeNextStep("Pick up Blood Key") + searchForKey = false + } + } + + @SubscribeEvent + fun onDungeonStart(event: DungeonStartEvent) { + changeNextStep("Clear first room") + searchForKey = true + } + + @SubscribeEvent + fun onDungeonStart(event: DungeonEnterEvent) { + changeNextStep("Talk to Mort") + searchForKey = true + } + + @SubscribeEvent + fun onDungeonBossRoomEnter(event: DungeonBossRoomEnterEvent) { + changeNextStep("Defeat the boss! Good luck :)") + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + changeNextStep("") + } + + private fun isEnabled(): Boolean { + return LorenzUtils.inDungeons && SkyHanniMod.feature.dungeon.copilotEnabled + } + + @SubscribeEvent + fun renderOverlay(event: RenderGameOverlayEvent.Post) { + if (!LorenzUtils.inDungeons) return + if (!SkyHanniMod.feature.dungeon.copilotEnabled) return + + SkyHanniMod.feature.dungeon.copilotPos.renderString(nextStep) + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonData.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonData.kt index 93f8c659a..b14bf4b4a 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonData.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonData.kt @@ -1,6 +1,8 @@ package at.hannibal2.skyhanni.features.dungeon import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.events.DungeonBossRoomEnterEvent +import at.hannibal2.skyhanni.events.DungeonEnterEvent import at.hannibal2.skyhanni.events.DungeonStartEvent import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.utils.StringUtils.removeColor @@ -32,7 +34,10 @@ class DungeonData { val message = rawMessage.removeColor() val bossName = message.substringAfter("[BOSS] ").substringBefore(":").trim() if (bossName != "The Watcher" && dungeonFloor != null && checkBossName(dungeonFloor!!, bossName)) { - inBossRoom = true + if (!inBossRoom) { + DungeonBossRoomEnterEvent().postAndCatch() + inBossRoom = true + } } } @@ -59,8 +64,11 @@ class DungeonData { if (event.phase != TickEvent.Phase.START) return if (dungeonFloor == null) { for (line in ScoreboardData.sidebarLines) { + //TODO mixins if (line.contains("The Catacombs (")) { - dungeonFloor = line.substringAfter("(").substringBefore(")") + val floor = line.substringAfter("(").substringBefore(")") + dungeonFloor = floor + DungeonEnterEvent(floor).postAndCatch() break } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt new file mode 100644 index 000000000..faf48e95c --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt @@ -0,0 +1,202 @@ +package at.hannibal2.skyhanni.features.dungeon + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.EntityMovementHelper +import at.hannibal2.skyhanni.events.* +import at.hannibal2.skyhanni.utils.ItemUtils.cleanName +import at.hannibal2.skyhanni.utils.ItemUtils.getSkullTexture +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzVec +import at.hannibal2.skyhanni.utils.getLorenzVec +import net.minecraft.entity.item.EntityArmorStand +import net.minecraft.entity.item.EntityItem +import net.minecraft.network.play.server.S2APacketParticles +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class DungeonHideItems { + + private val hideParticles = mutableMapOf<EntityArmorStand, Long>() + private val movingSkeletonSkulls = mutableMapOf<EntityArmorStand, Long>() + + private val blessingTexture = + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZT" + + "kzZTIwNjg2MTc4NzJjNTQyZWNkYTFkMjdkZjRlY2U5MWM2OTk5MDdiZjMyN2M0ZGRiODUzMDk0MTJkMzkzOSJ9fX0=" + + private val reviveStoneTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJ" + + "lcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjZhNzZjYzIyZTdjMmFiOWM1NDBkMTI0NGVhZGJhNTgxZ" + + "jVkZDllMThmOWFkYWNmMDUyODBhNWI0OGI4ZjYxOCJ9fX0K" + + private val premiumFleshTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0" + + "L3RleHR1cmUvMWE3NWU4YjA0NGM3MjAxYTRiMmU4NTZiZTRmYzMxNmE1YWFlYzY2NTc2MTY5YmFiNTg3MmE4ODUzNGI4MDI1NiJ9fX0K" + + private fun isSkeletonSkull(entity: EntityArmorStand): Boolean { + val itemStack = entity.inventory[4] + if (itemStack != null) { + if (itemStack.cleanName() == "Skeleton Skull") { + return true + } + } + + return false + } + + @SubscribeEvent + fun onCheckRender(event: CheckRenderEntityEvent<*>) { + if (!LorenzUtils.inDungeons) return + + val entity = event.entity + + if (entity is EntityItem) { + val stack = entity.entityItem + if (SkyHanniMod.feature.dungeon.hideReviveStone) { + if (stack.cleanName() == "Revive Stone") { + event.isCanceled = true + } + } + + if (SkyHanniMod.feature.dungeon.hideJournalEntry) { + if (stack.cleanName() == "Journal Entry") { + event.isCanceled = true + } + } + } + + if (entity !is EntityArmorStand) return + + if (SkyHanniMod.feature.dungeon.hideSuperboomTNT) { + if (entity.name.startsWith("§9Superboom TNT")) { + event.isCanceled = true + } + + val itemStack = entity.inventory[4] + if (itemStack != null) { + if (itemStack.cleanName() == "Superboom TNT") { + event.isCanceled = true + hideParticles[entity] = System.currentTimeMillis() + } + } + } + + if (SkyHanniMod.feature.dungeon.hideBlessing) { + if (entity.name.startsWith("§dBlessing of ")) { + event.isCanceled = true + } + + val itemStack = entity.inventory[4] + if (itemStack != null) { + if (itemStack.getSkullTexture() == blessingTexture) { + event.isCanceled = true + } + } + } + + if (SkyHanniMod.feature.dungeon.hideReviveStone) { + if (entity.name == "§6Revive Stone") { + event.isCanceled = true + } + + val itemStack = entity.inventory[4] + if (itemStack != null) { + if (itemStack.getSkullTexture() == reviveStoneTexture) { + event.isCanceled = true + hideParticles[entity] = System.currentTimeMillis() + } + } + } + + if (SkyHanniMod.feature.dungeon.hidePremiumFlesh) { + if (entity.name == "§9Premium Flesh") { + event.isCanceled = true + hideParticles[entity] = System.currentTimeMillis() + } + + val itemStack = entity.inventory[4] + if (itemStack != null) { + if (itemStack.getSkullTexture() == premiumFleshTexture) { + event.isCanceled = true + } + } + } + + if (isSkeletonSkull(entity)) { + EntityMovementHelper.addToTrack(entity) + if (SkyHanniMod.feature.dungeon.hideSkeletonSkull) { + val lastMove = movingSkeletonSkulls.getOrDefault(entity, 0) + if (lastMove + 100 > System.currentTimeMillis()) { + return + } + event.isCanceled = true + } + } + } + + @SubscribeEvent + fun onReceivePacket(event: PacketEvent.ReceiveEvent) { + if (!LorenzUtils.inDungeons) return + if (!SkyHanniMod.feature.dungeon.hideSuperboomTNT && !SkyHanniMod.feature.dungeon.hideReviveStone) return + + val packet = event.packet + if (packet is S2APacketParticles) { + val packetLocation = LorenzVec(packet.xCoordinate, packet.yCoordinate, packet.zCoordinate) + for (armorStand in hideParticles.filter { it.value + 100 > System.currentTimeMillis() }.map { it.key }) { + val distance = packetLocation.distance(armorStand.getLorenzVec()) + if (distance < 2) { + //only hiding white "sparkling" particles + if (packet.particleType.particleID == 3) { + event.isCanceled = true + } + } + } + } + } + + @SubscribeEvent + fun onEntityMove(event: EntityMoveEvent) { + if (!LorenzUtils.inDungeons) return + + val entity = event.entity + if (entity !is EntityArmorStand) return + + if (isSkeletonSkull(entity)) { + movingSkeletonSkulls[entity] = System.currentTimeMillis() + } + } + + @SubscribeEvent + fun onRenderMobColored(event: RenderMobColoredEvent) { + if (!LorenzUtils.inDungeons) return + if (!SkyHanniMod.feature.dungeon.highlightSkeletonSkull) return + val entity = event.entity + if (entity is EntityArmorStand) { + if (isSkeletonSkull(entity)) { + val lastMove = movingSkeletonSkulls.getOrDefault(entity, 0) + if (lastMove + 100 > System.currentTimeMillis()) { + event.color = LorenzColor.GOLD.toColor().withAlpha(60) + } + } + } + } + + @SubscribeEvent + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { + if (!LorenzUtils.inDungeons) return + if (!SkyHanniMod.feature.dungeon.highlightSkeletonSkull) return + val entity = event.entity + if (entity is EntityArmorStand) { + if (isSkeletonSkull(entity)) { + val lastMove = movingSkeletonSkulls.getOrDefault(entity, 0) + if (lastMove + 100 > System.currentTimeMillis()) { + event.shouldReset = true + } + } + } + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + hideParticles.clear() + movingSkeletonSkulls.clear() + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/dungeon/HighlightDungeonDeathmite.kt b/src/main/java/at/hannibal2/skyhanni/features/dungeon/HighlightDungeonDeathmite.kt new file mode 100644 index 000000000..1ce2e315b --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/dungeon/HighlightDungeonDeathmite.kt @@ -0,0 +1,65 @@ +package at.hannibal2.skyhanni.features.dungeon + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.RenderMobColoredEvent +import at.hannibal2.skyhanni.events.ResetEntityHurtEvent +import at.hannibal2.skyhanni.events.withAlpha +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth +import net.minecraft.client.Minecraft +import net.minecraft.entity.monster.EntitySilverfish +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +class HighlightDungeonDeathmite { + + private var tick = 0 + private val deathmites = mutableListOf<EntitySilverfish>() + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (!isEnabled()) return + + if (tick++ % 20 == 0) { + find() + } + } + + @SubscribeEvent + fun onRenderMobColored(event: RenderMobColoredEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in deathmites) { + event.color = LorenzColor.DARK_RED.toColor().withAlpha(20) + } + } + + @SubscribeEvent + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in deathmites) { + event.shouldReset = true + } + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + deathmites.clear() + } + + private fun find() { + Minecraft.getMinecraft().theWorld.loadedEntityList.filterIsInstance<EntitySilverfish>() + .filter { it !in deathmites && it.baseMaxHealth >= 1_000_000_000 } + .forEach(deathmites::add) + } + + private fun isEnabled(): Boolean { + + return LorenzUtils.inDungeons && SkyHanniMod.feature.dungeon.highlightDeathmites + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/end/VoidlingExtremistColor.kt b/src/main/java/at/hannibal2/skyhanni/features/end/VoidlingExtremistColor.kt new file mode 100644 index 000000000..f2dcaed89 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/end/VoidlingExtremistColor.kt @@ -0,0 +1,65 @@ +package at.hannibal2.skyhanni.features.end + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.RenderMobColoredEvent +import at.hannibal2.skyhanni.events.ResetEntityHurtEvent +import at.hannibal2.skyhanni.events.withAlpha +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth +import net.minecraft.client.Minecraft +import net.minecraft.entity.monster.EntityEnderman +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +class VoidlingExtremistColor { + + private var tick = 0 + private val extremists = mutableListOf<EntityEnderman>() + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (!isEnabled()) return + + if (tick++ % 20 == 0) { + find() + } + } + + @SubscribeEvent + fun onRenderMobColored(event: RenderMobColoredEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in extremists) { + event.color = LorenzColor.LIGHT_PURPLE.toColor().withAlpha(127) + } + } + + @SubscribeEvent + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in extremists) { + event.shouldReset = true + } + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + extremists.clear() + } + + private fun find() { + Minecraft.getMinecraft().theWorld.loadedEntityList.filterIsInstance<EntityEnderman>() + .filter { it !in extremists && it.baseMaxHealth % 8_000_000 == 0.0 }.forEach { extremists.add(it) } + } + + private fun isEnabled(): Boolean { + + return LorenzUtils.inSkyblock && LorenzUtils.skyBlockIsland == "The End" && + SkyHanniMod.feature.misc.voidlingExtremistColor + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/items/ItemStars.kt b/src/main/java/at/hannibal2/skyhanni/features/items/ItemStars.kt index 5d45e3908..0301ddb53 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/items/ItemStars.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/items/ItemStars.kt @@ -77,7 +77,7 @@ class ItemStars { GlStateManager.disableBlend() event.fontRenderer.drawStringWithShadow( stackTip, - (event.x + 17 - event.fontRenderer.getStringWidth(stackTip)).toFloat(), + (event.x + 17 - event.fontRenderer.getStringWidth(stackTip)).toFloat(),//TODO search for this line and replace all other methods into an api (event.y + 9).toFloat(), 16777215 ) diff --git a/src/main/java/at/hannibal2/skyhanni/features/items/RngMeterInventory.kt b/src/main/java/at/hannibal2/skyhanni/features/items/RngMeterInventory.kt index 13ba0a34f..19c4ea249 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/items/RngMeterInventory.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/items/RngMeterInventory.kt @@ -72,9 +72,6 @@ class RngMeterInventory { val stack = slot.stack if (stack.getLore().any { it.contains("You don't have an RNG drop") }) { slot highlight LorenzColor.RED -// val color = LorenzColor.RED.addOpacity(160) -// slot.stack.background = color.rgb - //TODO use other coloring logic } } } @@ -86,8 +83,6 @@ class RngMeterInventory { val stack = slot.stack if (stack.getLore().any { it.contains("§aSELECTED") }) { slot highlight LorenzColor.YELLOW -// val color = LorenzColor.YELLOW.addOpacity(160) -// slot.stack.background = color.rgb } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/items/abilitycooldown/ItemAbilityCooldown.kt b/src/main/java/at/hannibal2/skyhanni/features/items/abilitycooldown/ItemAbilityCooldown.kt index 0d094c4b4..b2974837b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/items/abilitycooldown/ItemAbilityCooldown.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/items/abilitycooldown/ItemAbilityCooldown.kt @@ -123,7 +123,6 @@ class ItemAbilityCooldown { GlStateManager.disableLighting() GlStateManager.disableDepth() GlStateManager.disableBlend() - //TODO add option to change the size event.fontRenderer.drawStringWithShadow( stackTip, (event.x + 17 - event.fontRenderer.getStringWidth(stackTip)).toFloat(), diff --git a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt index 87fc2eb49..756b2b285 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt @@ -147,12 +147,7 @@ class MinionFeatures { //§7Held Coins: §b151,389 val coins = line.split(": §b")[1].replace(",", "").toDouble() - println(" ") - println("coins: $coins") - println("duration: $duration") - val coinsPerDay = (coins / (duration.toDouble())) * 1000 * 60 * 60 * 24 - println("coinsPerDay: $coinsPerDay") val format = formatInteger(coinsPerDay.toInt()) val hopperName = stack.name @@ -186,7 +181,6 @@ class MinionFeatures { lastCoinsRecived = System.currentTimeMillis() } if (event.message.startsWith("§aYou picked up a minion!")) { - println("pick up minion message") lastMinionPickedUp = System.currentTimeMillis() } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazes.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazes.kt index bd0a72e7e..b628593a2 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazes.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazes.kt @@ -1,9 +1,9 @@ package at.hannibal2.skyhanni.features.nether.ashfang import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.events.PacketEvent +import at.hannibal2.skyhanni.events.EntityHealthUpdateEvent import at.hannibal2.skyhanni.events.RenderMobColoredEvent -import at.hannibal2.skyhanni.events.ResetEntityHurtTimeEvent +import at.hannibal2.skyhanni.events.ResetEntityHurtEvent import at.hannibal2.skyhanni.events.withAlpha import at.hannibal2.skyhanni.features.damageindicator.BossType import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager @@ -14,7 +14,6 @@ import net.minecraft.client.Minecraft import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.item.EntityArmorStand import net.minecraft.entity.monster.EntityBlaze -import net.minecraft.network.play.server.S1CPacketEntityMetadata import net.minecraftforge.client.event.RenderLivingEvent import net.minecraftforge.event.world.WorldEvent import net.minecraftforge.fml.common.eventhandler.EventPriority @@ -59,20 +58,14 @@ class AshfangBlazes { } @SubscribeEvent - fun onHealthUpdatePacket(event: PacketEvent.ReceiveEvent) { + fun onHealthUpdateEvent(event: EntityHealthUpdateEvent) { if (!isEnabled()) return - val packet = event.packet - if (packet !is S1CPacketEntityMetadata) return - if (packet.entityId !in blazeArmorStand.keys.map { it.entityId }) return + val entityId = event.entity.entityId + if (entityId !in blazeArmorStand.keys.map { it.entityId }) return - for (watchableObject in packet.func_149376_c()) { - if (watchableObject.dataValueId == 6) { - val health = watchableObject.`object` as Float - if (health % 10_000_000 != 0F) { - blazeArmorStand.keys.removeIf { it.entityId == packet.entityId } - } - } + if (event.health % 10_000_000 != 0F) { + blazeArmorStand.keys.removeIf { it.entityId == entityId } } } @@ -90,14 +83,13 @@ class AshfangBlazes { } @SubscribeEvent - fun onResetEntityHurtTime(event: ResetEntityHurtTimeEvent) { + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { if (!isEnabled()) return if (!SkyHanniMod.feature.ashfang.highlightBlazes) return val entity = event.entity if (entity in blazeColor) { event.shouldReset = true } - } @SubscribeEvent(priority = EventPriority.HIGH) diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/EndermanSlayerBeacon.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/EndermanSlayerBeacon.kt new file mode 100644 index 000000000..f2cf90190 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/EndermanSlayerBeacon.kt @@ -0,0 +1,134 @@ +package at.hannibal2.skyhanni.features.slayer + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.CheckRenderEntityEvent +import at.hannibal2.skyhanni.events.PacketEvent +import at.hannibal2.skyhanni.events.RenderMobColoredEvent +import at.hannibal2.skyhanni.events.withAlpha +import at.hannibal2.skyhanni.features.damageindicator.BossType +import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager +import at.hannibal2.skyhanni.test.LorenzTest +import at.hannibal2.skyhanni.utils.* +import at.hannibal2.skyhanni.utils.ItemUtils.name +import at.hannibal2.skyhanni.utils.RenderUtils.drawColor +import at.hannibal2.skyhanni.utils.RenderUtils.drawString +import net.minecraft.entity.Entity +import net.minecraft.entity.item.EntityArmorStand +import net.minecraft.entity.monster.EntityEnderman +import net.minecraft.init.Blocks +import net.minecraft.network.play.server.S23PacketBlockChange +import net.minecraftforge.client.event.RenderWorldLastEvent +import net.minecraftforge.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.EventPriority +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +class EndermanSlayerBeacon { + + private val endermans = mutableListOf<EntityEnderman>() + private val armorStands = mutableListOf<EntityArmorStand>() + private val blocks = mutableListOf<LorenzVec>() + + @SubscribeEvent + fun onCheckRender(event: CheckRenderEntityEvent<*>) { + if (isEnabled()) { + findEntities(event.entity) + } + } + + private fun hasBeaconInHand(entity: EntityEnderman): Boolean { + val heldBlockState = entity.heldBlockState + if (heldBlockState != null) { + val block = heldBlockState.block + if (block != null) { + if (block == Blocks.beacon) { + return true + } + } + } + + return false + } + + private fun findEntities(entity: Entity) { + if (entity in endermans) return + if (entity in armorStands) return + + if (entity is EntityEnderman) { + if (hasBeaconInHand(entity)) { + if (LocationUtils.canSee(LocationUtils.playerEyeLocation(), entity.getLorenzVec())) { + endermans.add(entity) + } + } + } + + if (entity is EntityArmorStand) { + val stack = entity.inventory[4] ?: return + if (stack.name == "Beacon") { + if (LocationUtils.canSee(LocationUtils.playerEyeLocation(), entity.getLorenzVec())) { + armorStands.add(entity) + } + } + } + } + + @SubscribeEvent + fun onRenderMobColored(event: RenderMobColoredEvent) { + if (!isEnabled()) return + + if (event.entity in armorStands) { + event.color = LorenzColor.DARK_RED.toColor().withAlpha(LorenzTest.a.toInt()) + } + } + + @SubscribeEvent + fun onWorldRender(event: RenderWorldLastEvent) { + if (!isEnabled()) return + + endermans.removeIf { it.isDead || !hasBeaconInHand(it) } + + for (enderman in endermans) { + val location = enderman.getLorenzVec().add(-0.5, 0.2, -0.5) + event.drawColor(location, LorenzColor.DARK_RED, alpha = 1f) + } + + for (location in blocks) { + event.drawColor(location, LorenzColor.DARK_RED, alpha = 1f) + event.drawString(location.add(0.5, -0.5, 0.5), "Beacon", true) + } + } + + @SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true) + fun onChatPacket(event: PacketEvent.ReceiveEvent) { + if (!isEnabled()) return + + val packet = event.packet + if (packet is S23PacketBlockChange) { + val vec = packet.blockPosition.toLorenzVec() + val block = packet.blockState.block + if (block == Blocks.beacon) { + if (armorStands.any { vec.distance(it.getLorenzVec()) < 3 }) { + blocks.add(vec) + } + } else { + if (vec in blocks) { + blocks.remove(vec) + } + } + } + } + + private fun isEnabled(): Boolean { + return LorenzUtils.inSkyblock && SkyHanniMod.feature.misc.slayerEndermanBeacon && + LorenzUtils.skyBlockIsland == "The End" && + (DamageIndicatorManager.isBossSpawned(BossType.SLAYER_ENDERMAN_2) || + DamageIndicatorManager.isBossSpawned(BossType.SLAYER_ENDERMAN_3) || + DamageIndicatorManager.isBossSpawned(BossType.SLAYER_ENDERMAN_4)) + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + endermans.clear() + armorStands.clear() + blocks.clear() + } +}
\ No newline at end of file diff --git a/src/main/java/at/hannibal2/skyhanni/features/slayer/HighlightSlayerMiniboss.kt b/src/main/java/at/hannibal2/skyhanni/features/slayer/HighlightSlayerMiniboss.kt new file mode 100644 index 000000000..e2fb2719a --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/slayer/HighlightSlayerMiniboss.kt @@ -0,0 +1,92 @@ +package at.hannibal2.skyhanni.features.slayer + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.RenderMobColoredEvent +import at.hannibal2.skyhanni.events.ResetEntityHurtEvent +import at.hannibal2.skyhanni.events.withAlpha +import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager +import at.hannibal2.skyhanni.utils.LorenzColor +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth +import net.minecraft.client.Minecraft +import net.minecraft.entity.Entity +import net.minecraft.entity.EntityLivingBase +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.event.world.WorldEvent +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +class HighlightSlayerMiniboss { + + private var tick = 0 + private val miniBosses = mutableListOf<Entity>() + + @SubscribeEvent + fun onTick(event: TickEvent.ClientTickEvent) { + if (!isEnabled()) return + + if (tick++ % 20 == 0) { + find() + } + } + + private fun find() { + val entityList = Minecraft.getMinecraft().theWorld.loadedEntityList + val list = mutableListOf<EntityLivingBase>() + + list.addAll(entityList.filterIsInstance<EntityZombie>().filter { + it.baseMaxHealth % 24_000 == 0.0 || it.baseMaxHealth % 90_000 == 0.0 || it.baseMaxHealth % 360_000 == 0.0 || it.baseMaxHealth % 600_000 == 0.0 || it.baseMaxHealth % 2_400_000 == 0.0 + }) + + list.addAll(entityList.filterIsInstance<EntitySpider>().filter { + it.baseMaxHealth % 54_000 == 0.0 || it.baseMaxHealth % 144_000 == 0.0 || it.baseMaxHealth % 576_000 == 0.0 + }) + + list.addAll(entityList.filterIsInstance<EntityWolf>().filter { + it.baseMaxHealth % 45_000 == 0.0 || it.baseMaxHealth % 120_000 == 0.0 || it.baseMaxHealth % 450_000 == 0.0 + }) + + list.addAll(entityList.filterIsInstance<EntityEnderman>().filter { + it.baseMaxHealth % 12_000_000 == 0.0 || it.baseMaxHealth % 25_000_000 == 0.0 + }) + + list.addAll(entityList.filterIsInstance<EntityBlaze>().filter { + it.baseMaxHealth % 12_000_000 == 0.0 || it.baseMaxHealth % 25_000_000 == 0.0 + }) + + list.filter { it !in miniBosses && !DamageIndicatorManager.isBoss(it) }.forEach(miniBosses::add) + } + + @SubscribeEvent + fun onRenderMobColored(event: RenderMobColoredEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in miniBosses) { + event.color = LorenzColor.AQUA.toColor().withAlpha(127) + } + } + + @SubscribeEvent + fun onResetEntityHurtTime(event: ResetEntityHurtEvent) { + if (!isEnabled()) return + val entity = event.entity + + if (entity in miniBosses) { + event.shouldReset = true + } + } + + @SubscribeEvent + fun onWorldChange(event: WorldEvent.Load) { + miniBosses.clear() + } + + private fun isEnabled(): Boolean { + return LorenzUtils.inSkyblock && SkyHanniMod.feature.misc.slayerMinibossHighlight && !LorenzUtils.inDungeons && !LorenzUtils.inKuudraFight + } +}
\ No newline at end of file |