diff options
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/utils')
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 { |
