aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md11
-rw-r--r--FEATURES.md5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Ashfang.java2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicator.java5
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Mobs.java11
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarUpdateTimer.kt11
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt52
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/damageindicator/EntityData.kt10
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/fishing/BarnFishingTimer.kt7
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt11
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/mobs/AreaMiniBossFeatures.kt10
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt7
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt8
-rw-r--r--src/main/java/at/hannibal2/skyhanni/test/LorenzTest.kt22
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt40
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt59
19 files changed, 162 insertions, 125 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd5bc03f4..3e38d7b16 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@
## Version 0.17.UNRELEASED
+### Features
++ Added **Time to Kill** - Show the time it takes to kill the Slayer boss.
+
### Changed
+ Barbarian Duke Damage Indicator only starts showing after getting close (< 30 blocks)
@@ -44,7 +47,7 @@
### Features
+ Added Bazaar Update Timer - Forrick.
+ Added Crimson Isle Reputation Helper.
-+ Added **Barn Timer** - Shows the time and amount of sea creatures while fishing on the barn via hub.
++ Added **Barn Timer** - Show the time and amount of sea creatures while fishing on the barn via hub.
+ Added **Shark Fish Counter** - Counts how many sharks have been caught.
+ Added **Hide Silver Duplicates** - Hiding chat message when catching a duplicate silver trophy fish.
@@ -82,7 +85,7 @@
+ Add catacombs class level color to party finder.
+ Add wishing compass uses amount display.
+ Saves missing items from cancelled buy orders to clipboard for faster re-entry.
-+ Adds a visual highlight to the Croesus inventory that shows what chests have not yet been opened.
++ Adds a visual highlight to the Croesus inventory that show what chests have not yet been opened.
### Removals
- Removed additional settings for the chat design, like channel prefix and skyblock level
@@ -273,11 +276,11 @@
## Version 0.5 - Minions and RNG Meter
### New Features
-- Added a display that shows the last time the hopper inside a minion has been emptied
+- Added a display that show 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 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 a display timer that show the real time
- Added overlay features to the RNG meter inventory (Highlight selected drop and floors without a drop and show floor)
- Added 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)
diff --git a/FEATURES.md b/FEATURES.md
index 11e9c64aa..6b255f940 100644
--- a/FEATURES.md
+++ b/FEATURES.md
@@ -83,7 +83,7 @@
## Minion
-- A display that shows the last time the hopper inside a minion has been emptied.
+- A display that show 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 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)
@@ -101,7 +101,7 @@
- **Hide Bronze/Silver Duplicates** - Hiding chat message when catching a duplicate bronze/silver trophy fish.
- **Shorten Fishing Message** (Replacing the green chat message when fishing a sea creature with a more clean format)
- Highlight Thunder Sparks that spawn after killing a Thunder.
-- **Barn Timer** - Shows the time and amount of sea creatures while fishing on the barn via hub.
+- **Barn Timer** - Show the time and amount of sea creatures while fishing on the barn via hub.
- **Shark Fish Counter** - Counts how many sharks have been caught.
- **Added Odger waypoint** - Show the Odger waypoint when trophy fishes are in the inventory and no lava rod in hand.
@@ -117,6 +117,7 @@
- Option to show the health of Voidgloom Seraph 4 during the laser phase (useful when trying to phase skip)
- Show when Revenant Horror 5 is about to BOOM.
- Hide the vanilla nametag of damage indicator bosses.
+- **Time to Kill** - Show the time it takes to kill the Slayer boss.
## Slayer
+ Hide poor slayer drop chat messages.
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Ashfang.java b/src/main/java/at/hannibal2/skyhanni/config/features/Ashfang.java
index f92b576b1..9708f5dd4 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Ashfang.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Ashfang.java
@@ -20,7 +20,7 @@ public class Ashfang {
public Position freezeCooldownPos = new Position(10, 10, false, true);
@Expose
- @ConfigOption(name = "Reset Time", desc = "Shows the cooldown until ashfang pulls his underlings back.")
+ @ConfigOption(name = "Reset Time", desc = "Show the cooldown until ashfang pulls his underlings back.")
@ConfigEditorBoolean
public boolean nextResetCooldown = false;
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicator.java b/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicator.java
index c8a9dd750..c392edeba 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicator.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/DamageIndicator.java
@@ -81,4 +81,9 @@ public class DamageIndicator {
@ConfigOption(name = "Hide Nametag", desc = "Hide the vanilla nametag of damage indicator bosses.")
@ConfigEditorBoolean
public boolean hideVanillaNametag = false;
+
+ @Expose
+ @ConfigOption(name = "Time to Kill", desc = "Show the time it takes to kill the Slayer boss.")
+ @ConfigEditorBoolean
+ public boolean timeToKillSlayer = true;
}
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java b/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java
index 325dd1333..9bb106829 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Fishing.java
@@ -60,7 +60,7 @@ public class Fishing {
@Expose
@ConfigOption(
name = "Barn Fishing Timer",
- desc = "Shows the time and amount of sea creatures while fishing on the barn via hub."
+ desc = "Show the time and amount of sea creatures while fishing on the barn via hub."
)
@ConfigEditorBoolean
@ConfigAccordionId(id = 2)
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Mobs.java b/src/main/java/at/hannibal2/skyhanni/config/features/Mobs.java
index 2253dc3eb..d135427e0 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Mobs.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Mobs.java
@@ -38,7 +38,10 @@ public class Mobs {
public boolean zealotBruiserHighlighter = false;
@Expose
- @ConfigOption(name = "Special Zealots", desc = "Highlight Special Zealots in The End. (The one that drops Summoning Eyes)")
+ @ConfigOption(
+ name = "Special Zealots",
+ desc = "Highlight Special Zealots in The End. (The one that drops Summoning Eyes)"
+ )
@ConfigEditorBoolean
@ConfigAccordionId(id = 0)
public boolean specialZealotHighlighter = true;
@@ -55,7 +58,11 @@ public class Mobs {
public boolean timers = false;
@Expose
- @ConfigOption(name = "Area Boss", desc = "Show a timer when Golden Ghoul, Old Wolf, Voidling Extremist or Millenia-Aged Blaze respawns.")
+ @ConfigOption(
+ name = "Area Boss",
+ desc = "Show a timer when Golden Ghoul, Old Wolf, Voidling Extremist or Millenia-Aged Blaze respawns. " +
+ "§cSometimes it takes 20-30 seconds to calibrate correctly."
+ )
@ConfigEditorBoolean
@ConfigAccordionId(id = 1)
public boolean areaBossRespawnTimer = false;
diff --git a/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarUpdateTimer.kt b/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarUpdateTimer.kt
index 0a99f942a..a60af8ec8 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarUpdateTimer.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/bazaar/BazaarUpdateTimer.kt
@@ -5,10 +5,11 @@ import at.hannibal2.skyhanni.events.BazaarUpdateEvent
import at.hannibal2.skyhanni.utils.InventoryUtils
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings
+import at.hannibal2.skyhanni.utils.TimeUnit
+import at.hannibal2.skyhanni.utils.TimeUtils
import net.minecraftforge.client.event.GuiScreenEvent
import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
-import java.text.DecimalFormat
class BazaarUpdateTimer {
private var lastBazaarUpdateTime = 0L
@@ -24,13 +25,11 @@ class BazaarUpdateTimer {
if (!isEnabled()) return
if (!BazaarApi.isBazaarInventory(InventoryUtils.openInventoryName())) return
- val duration = System.currentTimeMillis() - lastBazaarUpdateTime
- val durationSeconds = duration.toDouble() / 1000
- val nextUpdateIn = 10 - durationSeconds
- val format = if (nextUpdateIn < 0) {
+ val duration = 10_000 - (System.currentTimeMillis() - lastBazaarUpdateTime)
+ val format = if (duration < 0) {
"Updating"
} else {
- DecimalFormat("0.0").format(nextUpdateIn)
+ TimeUtils.formatDuration(duration, TimeUnit.SECOND, showMilliSeconds = true)
}
val list = mutableListOf<String>()
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 2f7e09184..c0b282e18 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/BossType.kt
@@ -1,6 +1,6 @@
package at.hannibal2.skyhanni.features.damageindicator
-enum class BossType(val fullName: String, val bossTypeToggle: Int, val shortName: String = fullName) {
+enum class BossType(val fullName: String, val bossTypeToggle: Int, val shortName: String = fullName, val showDeathTime: Boolean = false) {
GENERIC_DUNGEON_BOSS("Generic Dungeon boss", 0),//TODO split into different bosses
//Nether Mini Bosses
@@ -15,31 +15,31 @@ enum class BossType(val fullName: String, val bossTypeToggle: Int, val shortName
END_ENDSTONE_PROTECTOR("§cEndstone Protector", 3),
END_ENDER_DRAGON("Ender Dragon", 4),//TODO fix totally
- SLAYER_ZOMBIE_1("§aRevenant Horror 1", 5, "§aRev 1"),
- SLAYER_ZOMBIE_2("§eRevenant Horror 2", 5, "§eRev 2"),
- SLAYER_ZOMBIE_3("§cRevenant Horror 3", 5, "§cRev 3"),
- SLAYER_ZOMBIE_4("§4Revenant Horror 4", 5, "§4Rev 4"),
- SLAYER_ZOMBIE_5("§5Revenant Horror 5", 5, "§5Rev 5"),
-
- SLAYER_SPIDER_1("§aTarantula Broodfather 1", 6, "§aTara 1"),
- SLAYER_SPIDER_2("§eTarantula Broodfather 2", 6, "§eTara 2"),
- SLAYER_SPIDER_3("§cTarantula Broodfather 3", 6, "§cTara 3"),
- SLAYER_SPIDER_4("§4Tarantula Broodfather 4", 6, "§4Tara 4"),
-
- SLAYER_WOLF_1("§aSven Packmaster 1", 7, "§aSven 1"),
- SLAYER_WOLF_2("§eSven Packmaster 2", 7, "§eSven 2"),
- SLAYER_WOLF_3("§cSven Packmaster 3", 7, "§cSven 3"),
- SLAYER_WOLF_4("§4Sven Packmaster 4", 7, "§4Sven 4"),
-
- SLAYER_ENDERMAN_1("§aVoidgloom Seraph 1", 8, "§aVoid 1"),
- SLAYER_ENDERMAN_2("§eVoidgloom Seraph 2", 8, "§eVoid 2"),
- SLAYER_ENDERMAN_3("§cVoidgloom Seraph 3", 8, "§cVoid 3"),
- SLAYER_ENDERMAN_4("§4Voidgloom Seraph 4", 8, "§4Void 4"),
-
- SLAYER_BLAZE_1("§aInferno Demonlord 1", 9, "§aInferno 1"),
- SLAYER_BLAZE_2("§aInferno Demonlord 2", 9, "§aInferno 2"),
- SLAYER_BLAZE_3("§aInferno Demonlord 3", 9, "§aInferno 3"),
- SLAYER_BLAZE_4("§aInferno Demonlord 4", 9, "§aInferno 4"),
+ SLAYER_ZOMBIE_1("§aRevenant Horror 1", 5, "§aRev 1", showDeathTime = true),
+ SLAYER_ZOMBIE_2("§eRevenant Horror 2", 5, "§eRev 2", showDeathTime = true),
+ SLAYER_ZOMBIE_3("§cRevenant Horror 3", 5, "§cRev 3", showDeathTime = true),
+ SLAYER_ZOMBIE_4("§4Revenant Horror 4", 5, "§4Rev 4", showDeathTime = true),
+ SLAYER_ZOMBIE_5("§5Revenant Horror 5", 5, "§5Rev 5", showDeathTime = true),
+
+ SLAYER_SPIDER_1("§aTarantula Broodfather 1", 6, "§aTara 1", showDeathTime = true),
+ SLAYER_SPIDER_2("§eTarantula Broodfather 2", 6, "§eTara 2", showDeathTime = true),
+ SLAYER_SPIDER_3("§cTarantula Broodfather 3", 6, "§cTara 3", showDeathTime = true),
+ SLAYER_SPIDER_4("§4Tarantula Broodfather 4", 6, "§4Tara 4", showDeathTime = true),
+
+ SLAYER_WOLF_1("§aSven Packmaster 1", 7, "§aSven 1", showDeathTime = true),
+ SLAYER_WOLF_2("§eSven Packmaster 2", 7, "§eSven 2", showDeathTime = true),
+ SLAYER_WOLF_3("§cSven Packmaster 3", 7, "§cSven 3", showDeathTime = true),
+ SLAYER_WOLF_4("§4Sven Packmaster 4", 7, "§4Sven 4", showDeathTime = true),
+
+ SLAYER_ENDERMAN_1("§aVoidgloom Seraph 1", 8, "§aVoid 1", showDeathTime = true),
+ SLAYER_ENDERMAN_2("§eVoidgloom Seraph 2", 8, "§eVoid 2", showDeathTime = true),
+ SLAYER_ENDERMAN_3("§cVoidgloom Seraph 3", 8, "§cVoid 3", showDeathTime = true),
+ SLAYER_ENDERMAN_4("§4Voidgloom Seraph 4", 8, "§4Void 4", showDeathTime = true),
+
+ SLAYER_BLAZE_1("§aInferno Demonlord 1", 9, "§aInferno 1", showDeathTime = true),
+ SLAYER_BLAZE_2("§aInferno Demonlord 2", 9, "§aInferno 2", showDeathTime = true),
+ SLAYER_BLAZE_3("§aInferno Demonlord 3", 9, "§aInferno 3", showDeathTime = true),
+ SLAYER_BLAZE_4("§aInferno Demonlord 4", 9, "§aInferno 4", showDeathTime = true),
SLAYER_BLAZE_TYPHOEUS_1("§aInferno Typhoeus 1", 9, "§aTyphoeus 1"),
SLAYER_BLAZE_TYPHOEUS_2("§eInferno Typhoeus 2", 9, "§eTyphoeus 2"),
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 7390393d9..44c2e47ad 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/DamageIndicatorManager.kt
@@ -32,7 +32,6 @@ 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.text.DecimalFormat
import java.util.*
import java.util.regex.Pattern
import kotlin.math.max
@@ -40,7 +39,6 @@ import kotlin.math.max
class DamageIndicatorManager {
private var mobFinder: MobFinder? = null
- private val decimalFormat = DecimalFormat("0.0")
private val maxHealth = mutableMapOf<UUID, Long>()
companion object {
@@ -294,8 +292,8 @@ class DamageIndicatorManager {
else -> LorenzColor.WHITE
}
- val d = (delay * 1.0) / 1000
- return color.getChatColor() + decimalFormat.format(d)
+ val format = TimeUtils.formatDuration(delay, showMilliSeconds = true)
+ return color.getChatColor() + format
}
@SubscribeEvent
@@ -331,6 +329,9 @@ class DamageIndicatorManager {
entityData.nameAbove = ""
val customHealthText = if (health == 0L) {
entityData.dead = true
+ if (entityData.bossType.showDeathTime && SkyHanniMod.feature.damageIndicator.timeToKillSlayer) {
+ entityData.nameAbove = entityData.timeToKill
+ }
"§cDead"
} else {
getCustomHealth(entityData, health, entity, maxHealth) ?: return
@@ -714,7 +715,8 @@ class DamageIndicatorManager {
entityResult.ignoreBlocks,
entityResult.delayedStart,
entityResult.finalDungeonBoss,
- entityResult.bossType
+ entityResult.bossType,
+ foundTime = System.currentTimeMillis()
)
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/EntityData.kt b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/EntityData.kt
index 2c7acc54b..7055b7df4 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/damageindicator/EntityData.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/damageindicator/EntityData.kt
@@ -1,6 +1,8 @@
package at.hannibal2.skyhanni.features.damageindicator
import at.hannibal2.skyhanni.utils.LorenzVec
+import at.hannibal2.skyhanni.utils.TimeUnit
+import at.hannibal2.skyhanni.utils.TimeUtils
import net.minecraft.entity.EntityLivingBase
class EntityData(
@@ -10,6 +12,7 @@ class EntityData(
val finalDungeonBoss: Boolean,
val bossType: BossType,
val damageCounter: DamageCounter = DamageCounter(),
+ val foundTime: Long,
var lastHealth: Long = 0L,
var healthText: String = "",
@@ -19,4 +22,9 @@ class EntityData(
var nameAbove: String = "",
var dead: Boolean = false,
var deathLocation: LorenzVec? = null,
-) \ No newline at end of file
+) {
+ val timeToKill by lazy {
+ val duration = System.currentTimeMillis() - foundTime
+ "§e" + TimeUtils.formatDuration(duration, TimeUnit.SECOND, showMilliSeconds = true)
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/fishing/BarnFishingTimer.kt b/src/main/java/at/hannibal2/skyhanni/features/fishing/BarnFishingTimer.kt
index baa5898c8..0487dfa2f 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/fishing/BarnFishingTimer.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/fishing/BarnFishingTimer.kt
@@ -2,12 +2,9 @@ package at.hannibal2.skyhanni.features.fishing
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.IslandType
-import at.hannibal2.skyhanni.utils.LocationUtils
-import at.hannibal2.skyhanni.utils.LorenzUtils
-import at.hannibal2.skyhanni.utils.LorenzVec
+import at.hannibal2.skyhanni.utils.*
import at.hannibal2.skyhanni.utils.RenderUtils.renderString
import at.hannibal2.skyhanni.utils.SoundUtils.playSound
-import at.hannibal2.skyhanni.utils.StringUtils
import net.minecraft.client.Minecraft
import net.minecraft.client.audio.ISound
import net.minecraft.client.audio.PositionedSound
@@ -101,7 +98,7 @@ class BarnFishingTimer {
val duration = System.currentTimeMillis() - startTime
val barnTimerAlertTime = SkyHanniMod.feature.fishing.barnTimerAlertTime * 1_000
val color = if (duration > barnTimerAlertTime) "§c" else "§e"
- val timeFormat = StringUtils.formatDuration(duration / 1000, decimalFormat = true)
+ val timeFormat = TimeUtils.formatDuration(duration, biggestUnit = TimeUnit.MINUTE)
val name = if (currentCount == 1) "sea creature" else "sea creatures"
val text = "$color$timeFormat §8(§e$currentCount §b$name§8)"
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 cbf3f7fd1..30849e01d 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/minion/MinionFeatures.kt
@@ -235,7 +235,7 @@ class MinionFeatures {
if (SkyHanniMod.feature.minions.emptiedTimeDisplay) {
if (lastEmptied != 0L) {
val duration = System.currentTimeMillis() - lastEmptied
- val format = StringUtils.formatDuration(duration / 1000) + " ago"
+ val format = TimeUtils.formatDuration(duration, longName = true) + " ago"
val text = "§eHopper Emptied: $format"
event.drawString(location.add(0.0, 1.15, 0.0), text, true)
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt
index 65b7992d6..7d118c1c5 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/misc/NonGodPotEffectDisplay.kt
@@ -9,7 +9,8 @@ import at.hannibal2.skyhanni.utils.ItemUtils.name
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.sorted
import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings
-import at.hannibal2.skyhanni.utils.StringUtils
+import at.hannibal2.skyhanni.utils.TimeUnit
+import at.hannibal2.skyhanni.utils.TimeUtils
import net.minecraft.network.play.server.S30PacketWindowItems
import net.minecraft.network.play.server.S47PacketPlayerListHeaderFooter
import net.minecraftforge.client.event.RenderGameOverlayEvent
@@ -81,8 +82,8 @@ class NonGodPotEffectDisplay {
if (label.contains("Fumes")) continue
val until = effect.value
- val seconds = (until - now) / 1000
- val format = StringUtils.formatDuration(seconds)
+ val seconds = until - now
+ val format = TimeUtils.formatDuration(seconds, TimeUnit.HOUR)
val color = colorForTime(seconds)
@@ -213,8 +214,8 @@ class NonGodPotEffectDisplay {
if (label.contains("Invisibility")) {
activeEffects[label] = System.currentTimeMillis() + 1000 * 60 * 60 * 24
} else {
- activeEffects[label] = newValue
- }
+ activeEffects[label] = newValue
+ }
}
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/mobs/AreaMiniBossFeatures.kt b/src/main/java/at/hannibal2/skyhanni/features/mobs/AreaMiniBossFeatures.kt
index 163563981..09f125dbf 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/mobs/AreaMiniBossFeatures.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/mobs/AreaMiniBossFeatures.kt
@@ -4,12 +4,8 @@ import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.EntityMaxHealthUpdateEvent
import at.hannibal2.skyhanni.events.withAlpha
import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper
+import at.hannibal2.skyhanni.utils.*
import at.hannibal2.skyhanni.utils.EntityUtils.hasMaxHealth
-import at.hannibal2.skyhanni.utils.LocationUtils
-import at.hannibal2.skyhanni.utils.LorenzColor
-import at.hannibal2.skyhanni.utils.LorenzUtils
-import at.hannibal2.skyhanni.utils.LorenzUtils.round
-import at.hannibal2.skyhanni.utils.LorenzVec
import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
import net.minecraft.entity.EntityLiving
import net.minecraft.entity.monster.EntityBlaze
@@ -70,8 +66,8 @@ class AreaMiniBossFeatures {
private fun AreaMiniBossType.getTime(): String {
val duration = System.currentTimeMillis() - lastTime
val estimatedTime = respawnCooldown - duration % respawnCooldown
- val double = (estimatedTime.toDouble() / 1000).round(1)
- return color.getChatColor() + "" + LorenzUtils.formatDouble(double, "0.0") + "s"
+ val format = TimeUtils.formatDuration(estimatedTime, showMilliSeconds = true)
+ return color.getChatColor() + format
}
@SubscribeEvent
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt
index 6fb7be0ff..2bafd6507 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangFreezeCooldown.kt
@@ -7,9 +7,9 @@ import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RenderUtils.renderString
import at.hannibal2.skyhanni.utils.StringUtils.matchRegex
+import at.hannibal2.skyhanni.utils.TimeUtils
import net.minecraftforge.client.event.RenderGameOverlayEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
-import java.text.DecimalFormat
class AshfangFreezeCooldown {
@@ -34,9 +34,8 @@ class AshfangFreezeCooldown {
val remainingLong = maxDuration - duration
if (remainingLong > 0) {
- val remaining = (remainingLong.toFloat() / 1000)
- val format = DecimalFormat("0.0").format(remaining + 0.1)
- SkyHanniMod.feature.ashfang.freezeCooldownPos.renderString("§cAshfang Freeze: §a${format}s")
+ var format = TimeUtils.formatDuration(remainingLong, showMilliSeconds = true)
+ SkyHanniMod.feature.ashfang.freezeCooldownPos.renderString("§cAshfang Freeze: §a$format")
}
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt
index 5fe8c7d8a..011c716df 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/nether/ashfang/AshfangNextResetCooldown.kt
@@ -5,13 +5,14 @@ import at.hannibal2.skyhanni.features.damageindicator.BossType
import at.hannibal2.skyhanni.features.damageindicator.DamageIndicatorManager
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RenderUtils.renderString
+import at.hannibal2.skyhanni.utils.TimeUnit
+import at.hannibal2.skyhanni.utils.TimeUtils
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
import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent
-import java.text.DecimalFormat
class AshfangNextResetCooldown {
@@ -37,9 +38,8 @@ class AshfangNextResetCooldown {
val remainingTime = spawnTime + 46_100 - System.currentTimeMillis()
if (remainingTime > 0) {
- val remaining = (remainingTime.toFloat() / 1000)
- val format = DecimalFormat("0.0").format(remaining + 0.1)
- SkyHanniMod.feature.ashfang.nextResetCooldownPos.renderString("§cAshfang next reset in: §a${format}s")
+ val format = TimeUtils.formatDuration(remainingTime, TimeUnit.SECOND, showMilliSeconds = true)
+ SkyHanniMod.feature.ashfang.nextResetCooldownPos.renderString("§cAshfang next reset in: §a$format")
} else {
spawnTime = -1
}
diff --git a/src/main/java/at/hannibal2/skyhanni/test/LorenzTest.kt b/src/main/java/at/hannibal2/skyhanni/test/LorenzTest.kt
index 983459531..0002e0db8 100644
--- a/src/main/java/at/hannibal2/skyhanni/test/LorenzTest.kt
+++ b/src/main/java/at/hannibal2/skyhanni/test/LorenzTest.kt
@@ -146,22 +146,22 @@ class LorenzTest {
SkyHanniMod.feature.dev.debugPos.renderString(text)
}
- @SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true)
+ @SubscribeEvent
fun onHypExplosions(event: ReceiveParticleEvent) {
-// if (!LorenzUtils.inSkyblock) return
-// when (event.type) {
-// EnumParticleTypes.EXPLOSION_LARGE,
-// EnumParticleTypes.EXPLOSION_HUGE,
-// EnumParticleTypes.EXPLOSION_NORMAL,
-// -> event.isCanceled = true
-//
-// else -> {}
-// }
+ if (!LorenzUtils.inSkyBlock) return
+ when (event.type) {
+ EnumParticleTypes.EXPLOSION_LARGE,
+ EnumParticleTypes.EXPLOSION_HUGE,
+ EnumParticleTypes.EXPLOSION_NORMAL,
+ -> event.isCanceled = true
+ else -> {}
+ }
}
@SubscribeEvent
fun onEnderTeleport(event: EnderTeleportEvent) {
-// event.isCanceled = true
+ if (!LorenzUtils.inSkyBlock) return
+ event.isCanceled = true
}
@SubscribeEvent
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt
index 877e0edf6..4b01f9499 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/StringUtils.kt
@@ -1,12 +1,9 @@
package at.hannibal2.skyhanni.utils
import org.intellij.lang.annotations.Language
-import java.text.DecimalFormat
import java.util.*
object StringUtils {
- private val durationFormat = DecimalFormat("00")
-
fun String.firstLetterUppercase(): String {
if (isEmpty()) return this
@@ -35,43 +32,6 @@ object StringUtils {
return builder.toString()
}
- fun formatDuration(seconds: Long, decimalFormat: Boolean = false): String {
- var sec: Long = seconds
-
- var minutes: Long = sec / 60
- sec %= 60
-
- var hours = minutes / 60
- minutes %= 60
-
- val days = hours / 24
- hours %= 24
-
-
- val formatHours = durationFormat.format(hours)
- val formatMinutes = durationFormat.format(minutes)
- val formatSeconds = durationFormat.format(sec)
-
- if (decimalFormat) {
- return "$formatMinutes:$formatSeconds"
- }
-
- if (days > 0) {
- return "${days}d $formatHours:$formatMinutes:$formatSeconds"
- }
- if (hours > 0) {
- return "$formatHours:$formatMinutes:$formatSeconds".removeAtBeginning("0")
- }
- if (minutes > 0) {
- return "$formatMinutes:$formatSeconds".removeAtBeginning("0")
- }
- if (sec > 0) {
- return "${sec}s"
- }
-
- return "Now"
- }
-
/**
* From https://stackoverflow.com/questions/10711494/get-values-in-treemap-whose-string-keys-start-with-a-pattern
*/
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt
new file mode 100644
index 000000000..107395886
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt
@@ -0,0 +1,59 @@
+package at.hannibal2.skyhanni.utils
+
+object TimeUtils {
+ fun formatDuration(
+ millis: Long,
+ biggestUnit: TimeUnit = TimeUnit.YEAR,
+ showMilliSeconds: Boolean = false,
+ longName: Boolean = false
+ ): String {
+ var milliseconds = millis
+ val map = mutableMapOf<TimeUnit, Int>()
+ for (unit in TimeUnit.values()) {
+ if (unit.ordinal >= biggestUnit.ordinal) {
+ val factor = unit.factor
+ map[unit] = (milliseconds / factor).toInt()
+ milliseconds %= factor
+ }
+ }
+
+ val builder = StringBuilder()
+ for ((unit, value) in map.entries) {
+ if (value > 0 || builder.isNotEmpty() || unit == TimeUnit.SECOND) {
+ builder.append(value)
+ val name = if (longName) {
+ " " + unit.longName + if (value > 1) "s" else ""
+ } else {
+ unit.shortName
+ }
+
+ if (unit == TimeUnit.SECOND) {
+ if (showMilliSeconds) {
+ val formatMillis = milliseconds / 100
+ builder.append(".")
+ builder.append(formatMillis)
+ }
+ builder.append(name)
+ } else {
+ builder.append("$name ")
+ }
+ }
+ }
+ return builder.toString()
+ }
+}
+
+private const val FACTOR_SECONDS = 1000L
+private const val FACTOR_MINUTES = FACTOR_SECONDS * 60
+private const val FACTOR_HOURS = FACTOR_MINUTES * 60
+private const val FACTOR_DAYS = FACTOR_HOURS * 24
+private const val FACTOR_YEARS = (FACTOR_DAYS * 365.25).toLong()
+
+enum class TimeUnit(val factor: Long, val shortName: String, val longName: String) {
+ YEAR(FACTOR_YEARS, "y", "Year"),
+ DAY(FACTOR_DAYS, "d", "Day"),
+ HOUR(FACTOR_HOURS, "h", "Hour"),
+ MINUTE(FACTOR_MINUTES, "m", "Minute"),
+ SECOND(FACTOR_SECONDS, "s", "Second"),
+ ;
+} \ No newline at end of file