Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 18 additions & 4 deletions src/main/kotlin/com/lambda/module/hud/Coordinates.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ import com.lambda.module.HudModule
import com.lambda.module.tag.ModuleTag
import com.lambda.threading.runSafe
import com.lambda.util.Formatting.asString
import com.lambda.util.Formatting.string
import com.lambda.util.extension.dimensionName
import com.lambda.util.extension.isNether
import com.lambda.util.math.netherCoord
import com.lambda.util.math.overworldCoord
import java.util.Locale

object Coordinates : HudModule(
name = "Coordinates",
Expand All @@ -35,17 +35,31 @@ object Coordinates : HudModule(
) {
private val showDimension by setting("Show Dimension", true)
private val decimals by setting("Decimals", 2, 0..4, 1)
private val groupingStyle by setting("Grouping", Grouping.Comma)
private val coordinateSeparator by setting("Coordinate Separator", " | ")

override fun ImGuiBuilder.buildLayout() {
runSafe {
val pos = player.pos.asString(decimals)
// TODO: Properly localize based on user settings. Waiting on you emy_fops
val locale = when (groupingStyle) {
Grouping.Comma, Grouping.None -> Locale.US
Grouping.Dot -> Locale.GERMANY
}
val numberGrouping = groupingStyle != Grouping.None
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)}"
val coord = if (world.isNether) {
"$pos [${player.overworldCoord.x.string}, ${player.overworldCoord.z.string}]"
"$pos [${player.overworldCoord.x.asString(decimals, locale, numberGrouping)}$coordinateSeparator${player.overworldCoord.z.asString(decimals, locale, numberGrouping)}]"
} else {
"$pos [${player.netherCoord.x.string}, ${player.netherCoord.z.string}]"
"$pos [${player.netherCoord.x.asString(decimals, locale, numberGrouping)}$coordinateSeparator${player.netherCoord.z.asString(decimals, locale, numberGrouping)}]"
}
val dimension = if (showDimension) " ${world.dimensionName}" else ""
textCopyable("$coord$dimension")
}
}

enum class Grouping {
Comma,
Dot,
None
}
}
39 changes: 33 additions & 6 deletions src/main/kotlin/com/lambda/util/Formatting.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,50 @@ import java.time.ZoneId
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.*
import kotlin.math.floor
import kotlin.math.pow

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

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

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

fun Vec3d.asString(decimals: Int = 2): String {
val format = "%.${decimals}f"
return "(${format.format(Locale.US, x)}, ${format.format(Locale.US, y)}, ${format.format(Locale.US, z)})"
fun Double.asString(decimals: Int = 2, locale: Locale = Locale.US, numberGrouping: Boolean = true): String {
val format = if (numberGrouping) "%,.${decimals}f" else "%.${decimals}f"
val factor = 10.0.pow(decimals)
val floored = floor(this * factor) / factor
return format.format(locale, floored)
}

fun BlockPos.asString() = "($x, $y, $z)"
fun Vec3d.asString(decimals: Int = 2, locale: Locale = Locale.US, numberGrouping: Boolean = true): String {
val format = if (numberGrouping) "%,.${decimals}f" else "%.${decimals}f"
val vec = floorToDecimals(this, decimals)
return "(${format.format(locale, vec.x)} ${format.format(locale, vec.y)} ${format.format(locale, vec.z)})"
}

private fun floorToDecimals(vec: Vec3d, decimals: Int): Vec3d {
val factor = 10.0.pow(decimals)
return Vec3d(
floor(vec.x * factor) / factor,
floor(vec.y * factor) / factor,
floor(vec.z * factor) / factor
)
}

fun BlockPos.asString(decimals: Int = 2, locale: Locale = Locale.US, numberGrouping: Boolean = true): String {
val x = x.toDouble().asString(decimals, locale, numberGrouping)
val y = y.toDouble().asString(decimals, locale, numberGrouping)
val z = z.toDouble().asString(decimals, locale, numberGrouping)
return "($x $y $z)"
}

fun getTime(formatter: DateTimeFormatter = DateTimeFormatter.RFC_1123_DATE_TIME): String {
val localDateTime = LocalDateTime.now()
Expand Down
Loading