Skip to content

Commit e5cc50c

Browse files
committed
Fix coordinate hud element in the most scuffed way possible
1 parent 6c48763 commit e5cc50c

File tree

2 files changed

+51
-10
lines changed

2 files changed

+51
-10
lines changed

src/main/kotlin/com/lambda/module/hud/Coordinates.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ import com.lambda.module.HudModule
2222
import com.lambda.module.tag.ModuleTag
2323
import com.lambda.threading.runSafe
2424
import com.lambda.util.Formatting.asString
25-
import com.lambda.util.Formatting.string
2625
import com.lambda.util.extension.dimensionName
2726
import com.lambda.util.extension.isNether
2827
import com.lambda.util.math.netherCoord
2928
import com.lambda.util.math.overworldCoord
29+
import java.util.Locale
3030

3131
object Coordinates : HudModule(
3232
name = "Coordinates",
@@ -35,17 +35,31 @@ object Coordinates : HudModule(
3535
) {
3636
private val showDimension by setting("Show Dimension", true)
3737
private val decimals by setting("Decimals", 2, 0..4, 1)
38+
private val groupingStyle by setting("Grouping", Grouping.Comma)
39+
private val coordinateSeparator by setting("Coordinate Separator", " | ")
3840

3941
override fun ImGuiBuilder.buildLayout() {
4042
runSafe {
41-
val pos = player.pos.asString(decimals)
43+
// TODO: Properly localize based on user settings. Waiting on you emy_fops
44+
val locale = when (groupingStyle) {
45+
Grouping.Comma, Grouping.None -> Locale.US
46+
Grouping.Dot -> Locale.GERMANY
47+
}
48+
val numberGrouping = groupingStyle != Grouping.None
49+
val pos = "${player.pos.x.asString(decimals, locale, numberGrouping)}$coordinateSeparator${player.pos.y.asString(decimals, locale, numberGrouping)}$coordinateSeparator${player.pos.z.asString(decimals, locale, numberGrouping)}"
4250
val coord = if (world.isNether) {
43-
"$pos [${player.overworldCoord.x.string}, ${player.overworldCoord.z.string}]"
51+
"$pos [${player.overworldCoord.x.asString(decimals, locale, numberGrouping)}$coordinateSeparator${player.overworldCoord.z.asString(decimals, locale, numberGrouping)}]"
4452
} else {
45-
"$pos [${player.netherCoord.x.string}, ${player.netherCoord.z.string}]"
53+
"$pos [${player.netherCoord.x.asString(decimals, locale, numberGrouping)}$coordinateSeparator${player.netherCoord.z.asString(decimals, locale, numberGrouping)}]"
4654
}
4755
val dimension = if (showDimension) " ${world.dimensionName}" else ""
4856
textCopyable("$coord$dimension")
4957
}
5058
}
59+
60+
enum class Grouping {
61+
Comma,
62+
Dot,
63+
None
64+
}
5165
}

src/main/kotlin/com/lambda/util/Formatting.kt

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,50 @@ import java.time.ZoneId
2424
import java.time.ZonedDateTime
2525
import java.time.format.DateTimeFormatter
2626
import java.util.*
27+
import kotlin.math.floor
28+
import kotlin.math.pow
2729

2830
object Formatting {
31+
@Deprecated("Use asString with decimals and locale parameters instead", ReplaceWith("asString(decimals, locale)"))
2932
val Vec3d.string: String
3033
get() = asString()
3134

35+
@Deprecated("Use asString with decimals and locale parameters instead", ReplaceWith("asString(decimals, locale)"))
3236
val Float.string: String
33-
get() = "%.2f".format(Locale.US, this)
37+
get() = "%,.2f".format(Locale.US, this)
3438

39+
@Deprecated("Use asString with decimals and locale parameters instead", ReplaceWith("asString(decimals, locale)"))
3540
val Double.string: String
36-
get() = "%.2f".format(Locale.US, this)
41+
get() = "%,.2f".format(Locale.US, this)
3742

38-
fun Vec3d.asString(decimals: Int = 2): String {
39-
val format = "%.${decimals}f"
40-
return "(${format.format(Locale.US, x)}, ${format.format(Locale.US, y)}, ${format.format(Locale.US, z)})"
43+
fun Double.asString(decimals: Int = 2, locale: Locale = Locale.US, numberGrouping: Boolean = true): String {
44+
val format = if (numberGrouping) "%,.${decimals}f" else "%.${decimals}f"
45+
val factor = 10.0.pow(decimals)
46+
val floored = floor(this * factor) / factor
47+
return format.format(locale, floored)
4148
}
4249

43-
fun BlockPos.asString() = "($x, $y, $z)"
50+
fun Vec3d.asString(decimals: Int = 2, locale: Locale = Locale.US, numberGrouping: Boolean = true): String {
51+
val format = if (numberGrouping) "%,.${decimals}f" else "%.${decimals}f"
52+
val vec = floorToDecimals(this, decimals)
53+
return "(${format.format(locale, vec.x)} ${format.format(locale, vec.y)} ${format.format(locale, vec.z)})"
54+
}
55+
56+
private fun floorToDecimals(vec: Vec3d, decimals: Int): Vec3d {
57+
val factor = 10.0.pow(decimals)
58+
return Vec3d(
59+
floor(vec.x * factor) / factor,
60+
floor(vec.y * factor) / factor,
61+
floor(vec.z * factor) / factor
62+
)
63+
}
64+
65+
fun BlockPos.asString(decimals: Int = 2, locale: Locale = Locale.US, numberGrouping: Boolean = true): String {
66+
val x = x.toDouble().asString(decimals, locale, numberGrouping)
67+
val y = y.toDouble().asString(decimals, locale, numberGrouping)
68+
val z = z.toDouble().asString(decimals, locale, numberGrouping)
69+
return "($x $y $z)"
70+
}
4471

4572
fun getTime(formatter: DateTimeFormatter = DateTimeFormatter.RFC_1123_DATE_TIME): String {
4673
val localDateTime = LocalDateTime.now()

0 commit comments

Comments
 (0)