summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/utils')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt27
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt12
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt61
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/SimpleTimeMark.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt7
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt34
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt6
8 files changed, 135 insertions, 20 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt
index b93f17fa4..21f731fc2 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt
@@ -51,6 +51,9 @@ object CollectionUtils {
fun <K> MutableMap<K, Double>.addOrPut(key: K, number: Double): Double =
this.merge(key, number, Double::plus)!! // Never returns null since "plus" can't return null
+ fun <K> MutableMap<K, Float>.addOrPut(key: K, number: Float): Float =
+ this.merge(key, number, Float::plus)!! // Never returns null since "plus" can't return null
+
fun <K, N : Number> Map<K, N>.sumAllValues(): Double {
if (values.isEmpty()) return 0.0
@@ -81,6 +84,30 @@ object CollectionUtils {
return null
}
+ fun List<String>.removeNextAfter(after: String, skip: Int = 1) = removeNextAfter({ it == after }, skip)
+
+ fun List<String>.removeNextAfter(after: (String) -> Boolean, skip: Int = 1): List<String> {
+ val newList = mutableListOf<String>()
+ var missing = -1
+ for (line in this) {
+ if (after(line)) {
+ missing = skip - 1
+ continue
+ }
+ if (missing == 0) {
+ missing--
+ continue
+ }
+ if (missing != -1) {
+ missing--
+ }
+ newList.add(line)
+ }
+ return newList
+ }
+
+ fun List<String>.addIfNotNull(element: String?) = element?.let { plus(it) } ?: this
+
fun <K, V> Map<K, V>.editCopy(function: MutableMap<K, V>.() -> Unit) =
toMutableMap().also { function(it) }.toMap()
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt
index a2788a6fa..ed0af59eb 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt
@@ -3,7 +3,7 @@ package at.hannibal2.skyhanni.utils
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.HypixelData
import at.hannibal2.skyhanni.data.IslandType
-import at.hannibal2.skyhanni.data.MayorElection
+import at.hannibal2.skyhanni.data.Perk
import at.hannibal2.skyhanni.data.TitleManager
import at.hannibal2.skyhanni.events.GuiContainerEvent
import at.hannibal2.skyhanni.features.dungeon.DungeonAPI
@@ -270,6 +270,8 @@ object LorenzUtils {
fun IslandType.isInIsland() = inSkyBlock && skyBlockIsland == this
+ fun inAnyIsland(vararg islandTypes: IslandType) = inSkyBlock && islandTypes.any { it.isInIsland() }
+
fun GuiContainerEvent.SlotClickEvent.makeShiftClick() {
if (this.clickedButton == 1 && slot?.stack?.getItemCategoryOrNull() == ItemCategory.SACK) return
slot?.slotNumber?.let { slotNumber ->
@@ -281,7 +283,7 @@ object LorenzUtils {
}
private val recalculateDerpy =
- RecalculatingValue(1.seconds) { MayorElection.isPerkActive("Derpy", "DOUBLE MOBS HP!!!") }
+ RecalculatingValue(1.seconds) { Perk.DOUBLE_MOBS_HP.isActive }
val isDerpy get() = recalculateDerpy.getValue()
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt b/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt
index 92cbe4d57..784b7e9ac 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/NumberUtil.kt
@@ -236,20 +236,22 @@ object NumberUtil {
1_000.0
} else if (text.endsWith("m")) {
text = text.substring(0, text.length - 1)
- 1.milion
+ 1.million
} else if (text.endsWith("b")) {
text = text.substring(0, text.length - 1)
- 1.bilion
+ 1.billion
} else 1.0
return text.toDoubleOrNull()?.let {
it * multiplier
}
}
- val Int.milion get() = this * 1_000_000.0
- private val Int.bilion get() = this * 1_000_000_000.0
- val Double.milion get() = (this * 1_000_000.0).toLong()
+ // Sometimes we just take an L, never find it and forget to write it down
+ val Int.million get() = this * 1_000_000.0
+ private val Int.billion get() = this * 1_000_000_000.0
+ val Double.million get() = (this * 1_000_000.0).toLong()
+
/** @return clamped to [0.0, 1.0]**/
fun Number.fractionOf(maxValue: Number) = maxValue.toDouble().takeIf { it != 0.0 }?.let { max ->
this.toDouble() / max
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
index 32ea32329..d40f98667 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt
@@ -4,6 +4,7 @@ import at.hannibal2.skyhanni.config.core.config.Position
import at.hannibal2.skyhanni.data.GuiEditManager
import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsX
import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getAbsY
+import at.hannibal2.skyhanni.data.GuiEditManager.Companion.getDummySize
import at.hannibal2.skyhanni.events.GuiRenderItemEvent
import at.hannibal2.skyhanni.events.LorenzRenderWorldEvent
import at.hannibal2.skyhanni.features.misc.RoundedRectangleShader
@@ -37,7 +38,16 @@ import kotlin.time.DurationUnit
object RenderUtils {
- enum class HorizontalAlignment { LEFT, CENTER, RIGHT }
+ enum class HorizontalAlignment(private val value: String) {
+ LEFT("Left"),
+ CENTER("Center"),
+ RIGHT("Right"),
+ ;
+
+ override fun toString(): String {
+ return value
+ }
+ }
enum class VerticalAlignment { TOP, CENTER, BOTTOM }
private val beaconBeam = ResourceLocation("textures/entity/beacon_beam.png")
@@ -401,6 +411,36 @@ object RenderUtils {
return renderer.getStringWidth(display)
}
+ // Aligns using the width of element to render
+ private fun Position.renderString0(
+ string: String?,
+ offsetX: Int = 0,
+ offsetY: Int = 0,
+ alignmentEnum: HorizontalAlignment
+ ): Int {
+ val display = "§f$string"
+ GlStateManager.pushMatrix()
+ transform()
+ val minecraft = Minecraft.getMinecraft()
+ val renderer = minecraft.renderManager.fontRenderer
+ val width = this.getDummySize().x / this.scale
+
+ GlStateManager.translate(offsetX + 1.0, offsetY + 1.0, 0.0)
+
+ val strLen: Int = renderer.getStringWidth(string)
+ val x2 = when (alignmentEnum) {
+ HorizontalAlignment.LEFT -> offsetX.toFloat()
+ HorizontalAlignment.CENTER -> offsetX + width / 2f - strLen / 2f
+ HorizontalAlignment.RIGHT -> offsetX + width - strLen.toFloat()
+ }
+ GL11.glTranslatef(x2, 0f, 0f)
+ renderer.drawStringWithShadow(display, 0f, 0f, 0)
+
+ GlStateManager.popMatrix()
+
+ return renderer.getStringWidth(display)
+ }
+
fun Position.renderStrings(list: List<String>, extraSpace: Int = 0, posLabel: String) {
if (list.isEmpty()) return
@@ -416,6 +456,25 @@ object RenderUtils {
GuiEditManager.add(this, posLabel, longestX, offsetY)
}
+ fun Position.renderStringsAlignedWidth(
+ list: List<Pair<String, HorizontalAlignment>>,
+ extraSpace: Int = 0,
+ posLabel: String
+ ) {
+ if (list.isEmpty()) return
+
+ var offsetY = 0
+ var longestX = 0
+ for (pair in list) {
+ val x = renderString0(pair.first, offsetY = offsetY, alignmentEnum = pair.second)
+ if (x > longestX) {
+ longestX = x
+ }
+ offsetY += 10 + extraSpace
+ }
+ GuiEditManager.add(this, posLabel, longestX, offsetY)
+ }
+
fun Position.renderRenderables(
renderables: List<Renderable>,
extraSpace: Int = 0,
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/SimpleTimeMark.kt b/src/main/java/at/hannibal2/skyhanni/utils/SimpleTimeMark.kt
index 784eb85ec..d6df48a67 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/SimpleTimeMark.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/SimpleTimeMark.kt
@@ -35,6 +35,8 @@ value class SimpleTimeMark(private val millis: Long) : Comparable<SimpleTimeMark
fun toSkyBlockTime() = SkyBlockTime.fromInstant(Instant.ofEpochMilli(millis))
+ fun elapsedMinutes() = passedSince().inWholeMinutes
+
companion object {
fun now() = SimpleTimeMark(System.currentTimeMillis())
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt b/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt
index 4fd442c09..a96a31789 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/TabListData.kt
@@ -24,6 +24,7 @@ class TabListData {
private var cache = emptyList<String>()
private var debugCache: List<String>? = null
+ var fullyLoaded = false
// TODO replace with TabListUpdateEvent
fun getTabList() = debugCache ?: cache
@@ -53,7 +54,7 @@ class TabListData {
val tabListLine = line.transformIf({ noColor }) { removeColor() }
if (tabListLine != "") resultList.add("'$tabListLine'")
}
- val tabList = Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay
+ val tabList = getPlayerTabOverlay()
val tabHeader =
tabList.header_skyhanni.conditionalTransform(noColor, { unformattedText }, { formattedText })
val tabFooter =
@@ -62,6 +63,10 @@ class TabListData {
OSUtils.copyToClipboard(string)
ChatUtils.chat("Tab list copied into the clipboard!")
}
+
+ fun getPlayerTabOverlay(): AccessorGuiPlayerTabOverlay {
+ return Minecraft.getMinecraft().ingameGUI.tabList as AccessorGuiPlayerTabOverlay
+ }
}
private val playerOrdering = Ordering.from(PlayerComparator())
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt
index d2b269e9a..58bdb2d77 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeUtils.kt
@@ -1,5 +1,6 @@
package at.hannibal2.skyhanni.utils
+import at.hannibal2.skyhanni.mixins.hooks.tryToReplaceScoreboardLine
import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
import io.github.moulberry.notenoughupdates.util.SkyBlockTime
@@ -129,19 +130,36 @@ object TimeUtils {
}.toLong().toDuration(DurationUnit.MILLISECONDS)
}
- fun SkyBlockTime.formatted(): String {
+ fun SkyBlockTime.formatted(
+ dayAndMonthElement: Boolean = true,
+ yearElement: Boolean = true,
+ hoursAndMinutesElement: Boolean = true
+ ): String {
val hour = if (this.hour > 12) this.hour - 12 else this.hour
- val timeOfDay = if (this.hour > 11) "pm" else "am" // hooray for 12-hour clocks
- var minute = this.minute.toString()
- if (minute.length != 2) {
- minute = minute.padStart(2, '0')
- }
-
+ val timeOfDay = if (this.hour > 11) "pm" else "am"
+ val minute = this.minute.toString().padStart(2, '0')
val month = SkyBlockTime.monthName(this.month)
val day = this.day
val daySuffix = SkyBlockTime.daySuffix(day)
val year = this.year
- return "$month $day$daySuffix, Year $year $hour:${minute}$timeOfDay" // Early Winter 1st Year 300, 12:03pm
+
+ val datePart = when {
+ yearElement -> "$month $day$daySuffix, Year $year"
+ dayAndMonthElement -> "$month $day$daySuffix"
+ else -> ""
+ }
+ val timePart = if (hoursAndMinutesElement) "$hour:$minute$timeOfDay" else ""
+
+ /**
+ * We replace the line here, because the user might want color month names
+ */
+ return tryToReplaceScoreboardLine(
+ if (datePart.isNotEmpty() && timePart.isNotEmpty()) {
+ "$datePart, $timePart"
+ } else {
+ "$datePart$timePart".trim()
+ }
+ ) ?: ""
}
fun getCurrentLocalDate(): LocalDate = LocalDate.now(ZoneId.of("UTC"))
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt
index 9398d0e53..3c6bc5ce0 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/shader/ShaderManager.kt
@@ -19,13 +19,13 @@ object ShaderManager {
/**
* For any future shaders add the object instance in this enum and
- * in the when expression
+ * in the when-expression
*/
enum class Shaders(val shader: Shader) {
-
STANDARD_CHROMA(StandardChromaShader.INSTANCE),
TEXTURED_CHROMA(TexturedChromaShader.INSTANCE),
- ROUNDED_RECTANGLE(RoundedRectangleShader.INSTANCE);
+ ROUNDED_RECTANGLE(RoundedRectangleShader.INSTANCE),
+ ;
companion object {