aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/CorruptedMobHighlight.kt61
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/PlayerMarker.kt90
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt16
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt27
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/chat/HideFarDeathMessages.kt64
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/chat/PlayerChatFilter.kt30
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/chat/SkyBlockLevelChatMessage.kt49
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt1
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt4
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonChatFilter.kt16
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCleanEnd.kt27
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonCopilot.kt134
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonData.kt12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/dungeon/DungeonHideItems.kt202
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/dungeon/HighlightDungeonDeathmite.kt65
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/end/VoidlingExtremistColor.kt65
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/items/ItemStars.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/items/RngMeterInventory.kt5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/items/abilitycooldown/ItemAbilityCooldown.kt1
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangBlazes.kt24
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/slayer/EndermanSlayerBeacon.kt134
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/slayer/HighlightSlayerMiniboss.kt92
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