aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenz <lo.scherf@gmail.com>2022-08-26 21:05:20 +0200
committerLorenz <lo.scherf@gmail.com>2022-08-26 21:05:20 +0200
commitddbf374e9302ae47d43aa981c0caf33a264b2496 (patch)
tree1e5f4dc18170060d204164373f2261b14f0f8e8d
parentd3e2991644880b2766d9d50b7419466ece9027c1 (diff)
downloadskyhanni-ddbf374e9302ae47d43aa981c0caf33a264b2496.tar.gz
skyhanni-ddbf374e9302ae47d43aa981c0caf33a264b2496.tar.bz2
skyhanni-ddbf374e9302ae47d43aa981c0caf33a264b2496.zip
added summoning mob features
-rw-r--r--CHANGELOG.md8
-rw-r--r--FEATURES.md10
-rw-r--r--src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java3
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/Features.java5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Abilities.java27
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Chat.java12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt184
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/chat/NewChatFilter.kt18
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt31
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt69
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt14
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt17
14 files changed, 304 insertions, 98 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 69e90037a..ffb2a8e59 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,9 @@
### New Features
- Added /wiki command (using hypixel-skyblock.fandom.com instead of Hypixel wiki)
- Added Ashfang Blazing Souls display
-- Added hiding damage splashes while inside the boss room (fixing Skytils feature)
+- Added hiding damage splashes while inside the boss room (replacing a broken feature from Skytils)
+- Added Summoning Mob Display (Show the health of your spawned summoning mobs listed in an extra GUI element and hiding the corresponding spawning/despawning chat messages)
+- Added option to hide the nametag of your spawned summoning mobs
### Minor Changes
- Optimizing the highlight block size for minions, blazing souls and gravity orbs
@@ -17,7 +19,7 @@
### New Features
- Added a display that shows the last time the hopper inside a minion has been emptied
- Added a marker to the last opened minion for a couple of seconds (Seen through walls)
-- Added option to hide mob name tags close to minions
+- Added option to hide mob nametags close to minions
- Added showing stars on all items (Not only dungeon stars and master stars but also on crimson armors, cloaks and fishing rods)
- Added a display timer that shows the real time
- Added overlay features to the RNG meter inventory (Highlight selected drop and floors without a drop and show floor)
@@ -26,7 +28,7 @@
### Minor Changes
- Summoning souls display is rendering better close to corners
- Ashfang gravity orbs are now rendering better close to corners
-- Showing the name of ashfang gravity orbs as a name tag above
+- Showing the name of ashfang gravity orbs as a nametag above the orb
- Bazaar how knows books and essences (Thanks again, HyPixel)
### Bug Fixes
diff --git a/FEATURES.md b/FEATURES.md
index 4daceefa7..2523afd71 100644
--- a/FEATURES.md
+++ b/FEATURES.md
@@ -21,13 +21,13 @@
- Death Counter (Changing color depending on amount)
- Clean End (Hiding all entities and particles from displaying after the last dungeon boss dies, showing dungeon chests, still)
- Option to exclude guardians in F3 and M3 from the clean end feature (only when sneaking)
-- Hiding damage splashes while inside the boss room (fixing Skytils feature)
+- Hiding damage splashes while inside the boss room (replacing a broken feature from Skytils)
## Inventory
- Not Clickable Items: Mark items gray in your inventory when they are not supposed to be moved in certain GUIs (in NPC sell inventories, ender chests and backpacks, salvaging in dungeon hub, player trade, bazaar, action house, accessory bag, sack of sacks, fishing bag, potion bag, chests on the private island, attribute fusion and equipment GUI)
- Option to change the gray-out opacity for 'Not Clickable Items'
- Set stack number for specific items (stars for crimson armor, minion tier, pet level, new year cake, for golden and diamond dungeon heads the floor number and the tier of master skull and master star)
-- Sack name (show hort name of sacks)
+- Sack name (show short name of sacks)
- Anvil Combine Helper (When putting an enchanted book into the first slot of the anvil, all items with the same enchantment are highlighted in the inventory)
- Added compact star counter on all items (not only on items with dungeon stars and master stars but also on crimson armors, cloaks and fishing rods)
- RNG meter features (in the catacombs RNG meter inventory show the dungeon floor number and highlight floors without a drop selected and highlighting the selected drop in the RNG meter inventory for slayer or catacombs)
@@ -38,11 +38,13 @@
- Show a timer until ashfang is going to pull his minions back to him
- Ashfang Gravity Orbs display
- Ashfang Blazing Souls display
+- Summoning mob display (Show the health of your spawned summoning mobs listed in an extra GUI element and hiding the corresponding spawning/despawning chat messages)
+- Option to hide the nametag of your spawned summoning mobs
## Minion
- A display that shows the last time the hopper inside a minion has been emptied
- A marker to the last opened minion for a couple of seconds (seen through walls)
-- Option to hide mob name tags close to minions
+- Option to hide mob nametags close to minions
- Minion hopper coins per day display (Using the held coins in the hopper and the last time the hopper was collected to calculate the coins a hopper collects in a day)
## Bazaar
@@ -70,6 +72,6 @@
- Allow to copy, paste, and mark selected text in signs (not visual, but it's working still)
- Pet Display (showing the currently selected pet as GUI element, without any fancy XP or level or percentage, but with auto-pet support)
- Hiding exp Bottles lying on the ground
-- Summon Soul Display (show the name of a dropped soul, not working in dungeon when Skytils' "Hide Non-Starred Mobs Name tags" is enabled)
+- Summon Soul Display (show the name of a dropped soul, not working in dungeon when Skytils' "Hide Non-Starred Mobs Nametags" is enabled)
- Fixing Skytils custom Damage Splash
- Gui element showing the real time
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
index 353cfa934..d77c4f9cc 100644
--- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
+++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
@@ -15,7 +15,6 @@ import at.hannibal2.skyhanni.features.bazaar.BazaarBestSellMethod;
import at.hannibal2.skyhanni.features.bazaar.BazaarOrderHelper;
import at.hannibal2.skyhanni.features.chat.ChatFilter;
import at.hannibal2.skyhanni.features.chat.ChatManager;
-import at.hannibal2.skyhanni.features.chat.NewChatFilter;
import at.hannibal2.skyhanni.features.chat.PlayerChatFilter;
import at.hannibal2.skyhanni.features.commands.WikiCommand;
import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager;
@@ -68,7 +67,6 @@ public class SkyHanniMod {
registerEvent(new BazaarOrderHelper());
registerEvent(new ChatFilter());
- registerEvent(new NewChatFilter());
registerEvent(new PlayerChatFilter());
registerEvent(new DungeonChatFilter());
registerEvent(new HideNotClickableItems());
@@ -98,6 +96,7 @@ public class SkyHanniMod {
registerEvent(new RealTime());
registerEvent(new RngMeterInventory());
registerEvent(new WikiCommand());
+ registerEvent(new SummoningMobManager());
Commands.init();
diff --git a/src/main/java/at/hannibal2/skyhanni/config/Features.java b/src/main/java/at/hannibal2/skyhanni/config/Features.java
index ba3b49129..16e2b42f0 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/Features.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/Features.java
@@ -71,6 +71,11 @@ public class Features {
editOverlay(activeConfigCategory, 200, 16, minions.hopperProfitPos);
return;
}
+
+ if (runnableId.equals("summoningMobDisplay")) {
+ editOverlay(activeConfigCategory, 200, 16, abilities.summoningMobDisplayPos);
+ return;
+ }
}
@Expose
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Abilities.java b/src/main/java/at/hannibal2/skyhanni/config/features/Abilities.java
index 646047710..6a6995b23 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Abilities.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Abilities.java
@@ -1,7 +1,7 @@
package at.hannibal2.skyhanni.config.features;
-import at.hannibal2.skyhanni.config.gui.core.config.annotations.ConfigEditorBoolean;
-import at.hannibal2.skyhanni.config.gui.core.config.annotations.ConfigOption;
+import at.hannibal2.skyhanni.config.gui.core.config.Position;
+import at.hannibal2.skyhanni.config.gui.core.config.annotations.*;
import com.google.gson.annotations.Expose;
public class Abilities {
@@ -15,4 +15,27 @@ public class Abilities {
@ConfigOption(name = "Ability Cooldown Background", desc = "Show the cooldown color of item abilities in the background.")
@ConfigEditorBoolean
public boolean itemAbilityCooldownBackground = false;
+
+ @Expose
+ @ConfigOption(name = "Summoning Mob", desc = "")
+ @ConfigEditorAccordion(id = 0)
+ public boolean summoningMob = false;
+
+ @Expose
+ @ConfigOption(name = "Summoning Mob Display", desc = "Show the health of your spawned summoning mobs")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 0)
+ public boolean summoningMobDisplay = false;
+
+ @Expose
+ @ConfigOption(name = "Summoning Mob Display Position", desc = "")
+ @ConfigEditorButton(runnableId = "summoningMobDisplay", buttonText = "Edit")
+ @ConfigAccordionId(id = 0)
+ public Position summoningMobDisplayPos = new Position(10, 10, false, true);
+
+ @Expose
+ @ConfigOption(name = "Summoning Mob Nametag", desc = "Hide the nametag of your spawned summoning mobs")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 0)
+ public boolean summoningMobHideNametag = false;
}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Chat.java b/src/main/java/at/hannibal2/skyhanni/config/features/Chat.java
index bdd7e8f0d..c7bfa2973 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Chat.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Chat.java
@@ -10,38 +10,38 @@ public class Chat {
@Expose
@ConfigOption(name = "Chat Filter Types", desc = "")
- @ConfigEditorAccordion(id = 1)
+ @ConfigEditorAccordion(id = 0)
public boolean filterTypes = false;
@Expose
@ConfigOption(name = "HyPixel Hub", desc = "Block messages outside SkyBlock in the HyPixel lobby: player joins, loot boxes, prototype lobby messages, radiating generosity and HyPixel tournaments.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 1)
+ @ConfigAccordionId(id = 0)
public boolean hypixelHub = false;
@Expose
@ConfigOption(name = "Empty", desc = "Hide all the empty messages from the chat.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 1)
+ @ConfigAccordionId(id = 0)
public boolean empty = false;
@Expose
@ConfigOption(name = "Warping", desc = "Block 'sending request to join ..' and 'warping ..' messages.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 1)
+ @ConfigAccordionId(id = 0)
public boolean warping = false;
@Expose
@ConfigOption(name = "Welcome", desc = "Hide the 'welcome to skyblock' message.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 1)
+ @ConfigAccordionId(id = 0)
public boolean welcome = false;
//TODO remove
@Expose
@ConfigOption(name = "Others", desc = "Hide other annoying messages.")
@ConfigEditorBoolean
- @ConfigAccordionId(id = 1)
+ @ConfigAccordionId(id = 0)
public boolean others = false;
@Expose
diff --git a/src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt b/src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt
new file mode 100644
index 000000000..5dca40d1b
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/SummoningMobManager.kt
@@ -0,0 +1,184 @@
+package at.hannibal2.skyhanni.features
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.events.LorenzChatEvent
+import at.hannibal2.skyhanni.utils.LocationUtils
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth
+import at.hannibal2.skyhanni.utils.NumberUtil
+import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings
+import at.hannibal2.skyhanni.utils.getLorenzVec
+import net.minecraft.client.Minecraft
+import net.minecraft.entity.EntityLiving
+import net.minecraft.entity.EntityLivingBase
+import net.minecraft.entity.item.EntityArmorStand
+import net.minecraftforge.client.event.RenderGameOverlayEvent
+import net.minecraftforge.client.event.RenderLivingEvent
+import net.minecraftforge.event.world.WorldEvent
+import net.minecraftforge.fml.common.eventhandler.EventPriority
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import net.minecraftforge.fml.common.gameevent.TickEvent
+import java.util.regex.Pattern
+
+class SummoningMobManager {
+
+ private val summoningMobs = mutableMapOf<EntityLiving, SummoningMob>()
+ private val summoningMobNametags = mutableListOf<EntityArmorStand>()
+ private var summoningsSpawned = 0
+ private var searchArmorStands = false
+ private var searchMobs = false
+
+ //§aYou have spawned your Tank Zombie §r§asoul! §r§d(249 Mana)
+ private val spawnPatter = Pattern.compile("§aYou have spawned your (.+) §r§asoul! §r§d\\((\\d+) Mana\\)")
+ private val despawnPatter = Pattern.compile("§cYou have despawned your (monster|monsters)!")
+
+ //§a§ohannibal2's Tank Zombie§r §a160k§c❤
+ private val healthPattern = Pattern.compile("§a§o(.+)'s (.+)§r §[ae]([\\dkm]+)§c❤")
+
+ @SubscribeEvent
+ fun onChatMessage(event: LorenzChatEvent) {
+ if (!LorenzUtils.isOnHypixel) return
+
+ val message = event.message
+ val matcher = spawnPatter.matcher(message)
+ if (matcher.matches()) {
+ if (SkyHanniMod.feature.abilities.summoningMobDisplay) {
+ event.blockedReason = "summoning_soul"
+ }
+ summoningsSpawned++
+ searchArmorStands = true
+ searchMobs = true
+ }
+
+ if (despawnPatter.matcher(message).matches() || message.startsWith("§c ☠ §r§7You ")) {
+ despawned()
+ if (SkyHanniMod.feature.abilities.summoningMobDisplay && !message.contains("☠")) {
+ event.blockedReason = "summoning_soul"
+ }
+ }
+ }
+
+ var tick = 0
+
+ @SubscribeEvent
+ fun onTick(event: TickEvent.ClientTickEvent) {
+ if (!isEnabled()) return
+
+ if (SkyHanniMod.feature.abilities.summoningMobDisplay) {
+ if (tick++ % 20 == 0) {
+ updateData()
+ }
+ }
+
+ if (searchArmorStands) {
+ Minecraft.getMinecraft().theWorld.loadedEntityList
+ .filter { it is EntityArmorStand && it !in summoningMobNametags }
+ .forEach {
+ val name = it.displayName.unformattedText
+ val matcher = healthPattern.matcher(name)
+ if (matcher.matches()) {
+ val playerName = Minecraft.getMinecraft().thePlayer.name
+ if (name.contains(playerName)) {
+ summoningMobNametags.add(it as EntityArmorStand)
+ if (summoningMobNametags.size == summoningsSpawned) {
+ searchArmorStands = false
+ }
+ }
+ }
+ }
+ }
+ if (searchMobs) {
+
+ val playerLocation = LocationUtils.playerLocation()
+ Minecraft.getMinecraft().theWorld.loadedEntityList
+ .filter {
+ it is EntityLiving && it !in summoningMobs.keys && it.getLorenzVec().distance(playerLocation) < 3
+ }
+ .forEach {
+ summoningMobs[it as EntityLiving] = SummoningMob(System.currentTimeMillis(), name = "Mob")
+ updateData()
+ if (summoningMobs.size == summoningsSpawned) {
+ searchMobs = false
+ }
+ }
+ }
+ }
+
+ private fun updateData() {
+ if (summoningMobs.isEmpty()) return
+
+ for (entry in HashMap(summoningMobs)) {
+ val entityLiving = entry.key
+ val summoningMob = entry.value
+
+ val currentHealth = entityLiving.health.toInt()
+ val name = summoningMob.name
+ if (currentHealth == 0) {
+ summoningMobs.remove(entityLiving)
+ LorenzUtils.chat("§e[SkyHanni] your Summoning Mob just §cdied!")
+ continue
+ }
+
+ val maxHealth = entityLiving.baseMaxHealth.toInt()
+ val color = NumberUtil.percentageColor(currentHealth, maxHealth).getChatColor()
+
+ val currentFormat = NumberUtil.format(currentHealth)
+ val maxFormat = NumberUtil.format(maxHealth)
+ summoningMob.lastDisplayName = "§a$name $color$currentFormat/$maxFormat"
+ }
+ }
+
+ @SubscribeEvent
+ fun renderOverlay(event: RenderGameOverlayEvent.Post) {
+ if (!SkyHanniMod.feature.abilities.summoningMobDisplay) return
+ if (summoningMobs.isEmpty()) return
+
+ val list = mutableListOf<String>()
+ list.add("Summoning mobs: " + summoningMobs.size)
+ var id = 1
+ for (mob in summoningMobs) {
+ val name = mob.value.lastDisplayName
+ list.add("#$id $name")
+ id++
+ }
+
+ SkyHanniMod.feature.abilities.summoningMobDisplayPos.renderStrings(list)
+ }
+
+ @SubscribeEvent
+ fun renderOverlay(event: WorldEvent.Load) {
+ despawned()
+ }
+
+ @SubscribeEvent(priority = EventPriority.HIGH)
+ fun onRenderLiving(event: RenderLivingEvent.Specials.Pre<EntityLivingBase>) {
+ if (!LorenzUtils.inSkyblock) return
+ if (!SkyHanniMod.feature.abilities.summoningMobHideNametag) return
+
+ val entity = event.entity
+ if (entity !is EntityArmorStand) return
+ if (!entity.hasCustomName()) return
+ if (entity.isDead) return
+
+ event.isCanceled = entity in summoningMobNametags
+ }
+
+ private fun despawned() {
+ summoningMobs.clear()
+ summoningMobNametags.clear()
+ summoningsSpawned = 0
+ searchArmorStands = false
+ searchMobs = false
+ println("despawning")
+ }
+
+ private fun isEnabled(): Boolean {
+ return LorenzUtils.inSkyblock && (SkyHanniMod.feature.abilities.summoningMobDisplay || SkyHanniMod.feature.abilities.summoningMobHideNametag)
+ }
+
+ class SummoningMob(
+ val spawnTime: Long,
+ var name: String = "",
+ var lastDisplayName: String = "",
+ )
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt b/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt
index 1f0144620..1a659f171 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/SummoningSoulsName.kt
@@ -2,12 +2,12 @@ package at.hannibal2.skyhanni.features
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.test.GriffinJavaUtils
+import at.hannibal2.skyhanni.utils.EntityUtils.getNameTagWith
import at.hannibal2.skyhanni.utils.ItemUtils.getSkullTexture
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.RenderUtils.drawString
import at.hannibal2.skyhanni.utils.getLorenzVec
-import at.hannibal2.skyhanni.utils.getNameTagWith
import net.minecraft.client.Minecraft
import net.minecraft.entity.EntityLiving
import net.minecraft.entity.item.EntityArmorStand
diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/NewChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/NewChatFilter.kt
deleted file mode 100644
index bf73917aa..000000000
--- a/src/main/java/at/hannibal2/skyhanni/features/chat/NewChatFilter.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package at.hannibal2.skyhanni.features.chat
-
-import at.hannibal2.skyhanni.events.LorenzChatEvent
-import at.hannibal2.skyhanni.utils.LorenzUtils
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
-
-class NewChatFilter {
-
- @SubscribeEvent
- fun onChatMessage(event: LorenzChatEvent) {
- if (!LorenzUtils.isOnHypixel) return
-
-// val blockReason = block(event.message)
-// if (blockReason != "") {
-// event.blockedReason = blockReason
-// }
- }
-} \ No newline at end of file
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 047b4c7ed..0004d9e97 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt
@@ -7,6 +7,8 @@ import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.features.dungeon.DungeonData
import at.hannibal2.skyhanni.test.LorenzTest
import at.hannibal2.skyhanni.utils.*
+import at.hannibal2.skyhanni.utils.EntityUtils.getNameTagWith
+import at.hannibal2.skyhanni.utils.EntityUtils.hasNameTagWith
import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth
import at.hannibal2.skyhanni.utils.LorenzUtils.between
import at.hannibal2.skyhanni.utils.StringUtils.removeColor
@@ -239,7 +241,7 @@ class DamageIndicatorManager {
if (customHealthText.isNotEmpty()) {
entityData.healthText = customHealthText
} else {
- val color = percentageColor(health, maxHealth)
+ val color = NumberUtil.percentageColor(health, maxHealth)
entityData.healthText = color.getChatColor() + NumberUtil.format(health)
}
entityData.timeLastTick = System.currentTimeMillis()
@@ -316,7 +318,7 @@ class DamageIndicatorManager {
18 -> "§e4/6"
16 -> "§e5/6"
else -> {
- val color = percentageColor(health, 10_000_000)
+ val color = NumberUtil.percentageColor(health, 10_000_000)
entityData.namePrefix = "§a6/6"
return color.getChatColor() + NumberUtil.format(health)
}
@@ -352,7 +354,7 @@ class DamageIndicatorManager {
}
if (calcHealth == -1) return null
- val color = percentageColor(calcHealth, maxHealth)
+ val color = NumberUtil.percentageColor(calcHealth, maxHealth)
return color.getChatColor() + NumberUtil.format(calcHealth)
}
@@ -408,7 +410,8 @@ class DamageIndicatorManager {
}
else -> return null
}
- val result = percentageColor(calcHealth, calcMaxHealth).getChatColor() + NumberUtil.format(calcHealth)
+ val result =
+ NumberUtil.percentageColor(calcHealth, calcMaxHealth).getChatColor() + NumberUtil.format(calcHealth)
//Hit phase
@@ -423,7 +426,7 @@ class DamageIndicatorManager {
}
val name = armorStandHits.name.removeColor()
val hits = name.between("Seraph ", " Hit").toInt()
- return percentageColor(hits, maxHits).getChatColor() + "$hits Hits"
+ return NumberUtil.percentageColor(hits, maxHits).getChatColor() + "$hits Hits"
}
//Laser phase
@@ -436,7 +439,7 @@ class DamageIndicatorManager {
if (SkyHanniMod.feature.damageIndicator.showHealthDuringLaser) {
entityData.nameSuffix = " §f" + formatDelay(remainingTicks * 50)
} else {
- return formatDelay(remainingTicks * 50)
+ return formatDelay(remainingTicks * 50)
}
}
@@ -486,7 +489,7 @@ class DamageIndicatorManager {
LorenzUtils.error("Invalid thorn floor!")
return null
}
- val color = percentageColor(health, maxHealth)
+ val color = NumberUtil.percentageColor(health, maxHealth)
return color.getChatColor() + health + "/" + maxHealth
}
@@ -508,20 +511,6 @@ class DamageIndicatorManager {
}
}
- private fun percentageColor(
- have: Int,
- max: Int,
- ): LorenzColor {
- val percentage = have.toDouble() / max.toDouble()
- return when {
- percentage > 0.9 -> LorenzColor.DARK_GREEN
- percentage > 0.75 -> LorenzColor.GREEN
- percentage > 0.5 -> LorenzColor.YELLOW
- percentage > 0.25 -> LorenzColor.GOLD
- else -> LorenzColor.RED
- }
- }
-
private fun grabData(entity: EntityLivingBase): EntityData? {
if (data.contains(entity.uniqueID)) return data[entity.uniqueID]
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 636fff106..537a9850f 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/MobFinder.kt
@@ -1,12 +1,12 @@
package at.hannibal2.skyhanni.features.damageindicator
import at.hannibal2.skyhanni.features.dungeon.DungeonData
+import at.hannibal2.skyhanni.utils.EntityUtils.hasNameTagWith
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth
import at.hannibal2.skyhanni.utils.LorenzUtils.matchRegex
import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.getLorenzVec
-import at.hannibal2.skyhanni.utils.hasNameTagWith
import net.minecraft.client.Minecraft
import net.minecraft.client.entity.EntityOtherPlayerMP
import net.minecraft.entity.Entity
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt
index acfcd86d4..143ba4ca1 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/EntityUtils.kt
@@ -4,43 +4,42 @@ import net.minecraft.entity.EntityLiving
import net.minecraft.entity.item.EntityArmorStand
import net.minecraft.util.AxisAlignedBB
-class EntityUtils {
-}
+object EntityUtils {
-//TODO move into utils method
-fun EntityLiving.hasNameTagWith(
- y: Int,
- contains: String,
- debugRightEntity: Boolean = false,
- inaccuracy: Double = 1.6,
- debugWrongEntity: Boolean = false,
-): Boolean {
- return getNameTagWith(y, contains, debugRightEntity, inaccuracy, debugWrongEntity) != null
-}
+ fun EntityLiving.hasNameTagWith(
+ y: Int,
+ contains: String,
+ debugRightEntity: Boolean = false,
+ inaccuracy: Double = 1.6,
+ debugWrongEntity: Boolean = false,
+ ): Boolean {
+ return getNameTagWith(y, contains, debugRightEntity, inaccuracy, debugWrongEntity) != null
+ }
-fun EntityLiving.getNameTagWith(
- y: Int,
- contains: String,
- debugRightEntity: Boolean = false,
- inaccuracy: Double = 1.6,
- debugWrongEntity: Boolean = false,
-): EntityArmorStand? {
- val center = getLorenzVec().add(0, y, 0)
- val a = center.add(-inaccuracy, -inaccuracy - 3, -inaccuracy).toBlocPos()
- val b = center.add(inaccuracy, inaccuracy + 3, inaccuracy).toBlocPos()
- val alignedBB = AxisAlignedBB(a, b)
- val clazz = EntityArmorStand::class.java
- val found = worldObj.getEntitiesWithinAABB(clazz, alignedBB)
- return found.find {
- val result = it.name.contains(contains)
- if (debugWrongEntity && !result) {
- println("wrong entity in aabb: '" + it.name + "'")
- }
- if (debugRightEntity && result) {
- println("mob: " + center.printWithAccuracy(2))
- println("nametag: " + it.getLorenzVec().printWithAccuracy(2))
- println("accuracy: " + it.getLorenzVec().subtract(center).printWithAccuracy(3))
+ fun EntityLiving.getNameTagWith(
+ y: Int,
+ contains: String,
+ debugRightEntity: Boolean = false,
+ inaccuracy: Double = 1.6,
+ debugWrongEntity: Boolean = false,
+ ): EntityArmorStand? {
+ val center = getLorenzVec().add(0, y, 0)
+ val a = center.add(-inaccuracy, -inaccuracy - 3, -inaccuracy).toBlocPos()
+ val b = center.add(inaccuracy, inaccuracy + 3, inaccuracy).toBlocPos()
+ val alignedBB = AxisAlignedBB(a, b)
+ val clazz = EntityArmorStand::class.java
+ val found = worldObj.getEntitiesWithinAABB(clazz, alignedBB)
+ return found.find {
+ val result = it.name.contains(contains)
+ if (debugWrongEntity && !result) {
+ println("wrong entity in aabb: '" + it.name + "'")
+ }
+ if (debugRightEntity && result) {
+ println("mob: " + center.printWithAccuracy(2))
+ println("nametag: " + it.getLorenzVec().printWithAccuracy(2))
+ println("accuracy: " + it.getLorenzVec().subtract(center).printWithAccuracy(3))
+ }
+ result
}
- result
}
} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt b/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt
index 1d4701397..afc35b3ec 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt
@@ -156,4 +156,18 @@ object NumberUtil {
fun String.isInt(): Boolean {
return isNotEmpty() && pattern.matcher(this).matches()
}
+
+ fun percentageColor(
+ have: Int,
+ max: Int,
+ ): LorenzColor {
+ val percentage = have.toDouble() / max.toDouble()
+ return when {
+ percentage > 0.9 -> LorenzColor.DARK_GREEN
+ percentage > 0.75 -> LorenzColor.GREEN
+ percentage > 0.5 -> LorenzColor.YELLOW
+ percentage > 0.25 -> LorenzColor.GOLD
+ else -> LorenzColor.RED
+ }
+ }
} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
index 9de886f37..39c7217f6 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
@@ -409,7 +409,7 @@ object RenderUtils {
return lastValue + (currentValue - lastValue) * multiplier
}
- fun Position.renderString(string: String) {
+ fun Position.renderString(string: String, offsetY: Int = 0) {
if (string == "") return
val textToRender = "§f$string"
@@ -421,14 +421,21 @@ object RenderUtils {
val offsetX = (200 - renderer.getStringWidth(textToRender.removeColor())) / 2
val x = getAbsX(resolution, 200) + offsetX
- val y = getAbsY(resolution, 16)
-
-
+ val y = getAbsY(resolution, 16) + offsetY
GlStateManager.translate(x + 1.0, y + 1.0, 0.0)
renderer.drawStringWithShadow(textToRender, 0f, 0f, 0)
-
GlStateManager.popMatrix()
}
+
+ fun Position.renderStrings(list: List<String>) {
+ if (list.isEmpty()) return
+
+ var offsetY = 0
+ for (s in list) {
+ renderString(s, offsetY)
+ offsetY += 14
+ }
+ }
} \ No newline at end of file