refactor: Move coleweight compat into its own class
This commit is contained in:
@@ -2,8 +2,16 @@ package moe.nea.firmament.features.world
|
|||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import net.minecraft.text.Text
|
import net.minecraft.text.Text
|
||||||
|
import net.minecraft.util.math.BlockPos
|
||||||
import moe.nea.firmament.Firmament
|
import moe.nea.firmament.Firmament
|
||||||
import moe.nea.firmament.util.ErrorUtil
|
import moe.nea.firmament.annotations.Subscribe
|
||||||
|
import moe.nea.firmament.commands.DefaultSource
|
||||||
|
import moe.nea.firmament.commands.thenExecute
|
||||||
|
import moe.nea.firmament.commands.thenLiteral
|
||||||
|
import moe.nea.firmament.events.CommandEvent
|
||||||
|
import moe.nea.firmament.util.ClipboardUtils
|
||||||
|
import moe.nea.firmament.util.MC
|
||||||
|
import moe.nea.firmament.util.tr
|
||||||
|
|
||||||
object ColeWeightCompat {
|
object ColeWeightCompat {
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -16,9 +24,15 @@ object ColeWeightCompat {
|
|||||||
val b: Int = 0,
|
val b: Int = 0,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun intoFirm(waypoints: List<ColeWeightWaypoint>): FirmWaypoints {
|
fun fromFirm(waypoints: FirmWaypoints, relativeTo: BlockPos): List<ColeWeightWaypoint> {
|
||||||
|
return waypoints.waypoints.map {
|
||||||
|
ColeWeightWaypoint(it.x - relativeTo.x, it.y - relativeTo.y, it.z - relativeTo.z)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun intoFirm(waypoints: List<ColeWeightWaypoint>, relativeTo: BlockPos): FirmWaypoints {
|
||||||
val w = waypoints.map {
|
val w = waypoints.map {
|
||||||
FirmWaypoints.Waypoint(it.x, it.y, it.z)
|
FirmWaypoints.Waypoint(it.x + relativeTo.x, it.y + relativeTo.y, it.z + relativeTo.z)
|
||||||
}
|
}
|
||||||
return FirmWaypoints(
|
return FirmWaypoints(
|
||||||
"Imported Waypoints",
|
"Imported Waypoints",
|
||||||
@@ -29,6 +43,80 @@ object ColeWeightCompat {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun copyAndInform(
|
||||||
|
source: DefaultSource,
|
||||||
|
origin: BlockPos,
|
||||||
|
positiveFeedback: (Int) -> Text,
|
||||||
|
) {
|
||||||
|
val waypoints = Waypoints.useNonEmptyWaypoints()
|
||||||
|
?.let { fromFirm(it, origin) }
|
||||||
|
if (waypoints == null) {
|
||||||
|
source.sendError(tr("firmament.command.waypoint.export.nowaypoints",
|
||||||
|
"No waypoints to export found."))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val data =
|
||||||
|
Firmament.tightJson.encodeToString<List<ColeWeightWaypoint>>(waypoints)
|
||||||
|
ClipboardUtils.setTextContent(data)
|
||||||
|
source.sendFeedback(positiveFeedback(waypoints.size))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun importAndInform(
|
||||||
|
source: DefaultSource,
|
||||||
|
pos: BlockPos,
|
||||||
|
positiveFeedback: (Int) -> Text
|
||||||
|
) {
|
||||||
|
val text = ClipboardUtils.getTextContents()
|
||||||
|
val wr = tryParse(text).map { intoFirm(it, pos) }
|
||||||
|
val waypoints = wr.getOrElse {
|
||||||
|
source.sendError(
|
||||||
|
tr("firmament.command.waypoint.import.cw.error",
|
||||||
|
"Could not import ColeWeight waypoints."))
|
||||||
|
Firmament.logger.error(it)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Waypoints.waypoints = waypoints
|
||||||
|
source.sendFeedback(positiveFeedback(waypoints.size))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
fun onEvent(event: CommandEvent.SubCommand) {
|
||||||
|
event.subcommand(Waypoints.WAYPOINTS_SUBCOMMAND) {
|
||||||
|
thenLiteral("exportcw") {
|
||||||
|
thenExecute {
|
||||||
|
copyAndInform(source, BlockPos.ORIGIN) {
|
||||||
|
tr("firmament.command.waypoint.export.cw",
|
||||||
|
"Copied $it waypoints to clipboard in ColeWeight format.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thenLiteral("exportrelativecw") {
|
||||||
|
thenExecute {
|
||||||
|
copyAndInform(source, MC.player?.blockPos ?: BlockPos.ORIGIN) {
|
||||||
|
tr("firmament.command.waypoint.export.relative",
|
||||||
|
"Copied $it relative waypoints to clipboard in ColeWeight format. Make sure to stand in the same position when importing.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thenLiteral("import") {
|
||||||
|
thenExecute {
|
||||||
|
importAndInform(source, BlockPos.ORIGIN) { it: Int ->
|
||||||
|
Text.stringifiedTranslatable("firmament.command.waypoint.import",
|
||||||
|
it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thenLiteral("importrelative") {
|
||||||
|
thenExecute {
|
||||||
|
importAndInform(source, MC.player!!.blockPos) {
|
||||||
|
tr("firmament.command.waypoint.import.relative",
|
||||||
|
"Imported $it relative waypoints from clipboard. Make sure you stand in the same position as when you exported these waypoints for them to line up correctly.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun tryParse(string: String): Result<List<ColeWeightWaypoint>> {
|
fun tryParse(string: String): Result<List<ColeWeightWaypoint>> {
|
||||||
return runCatching {
|
return runCatching {
|
||||||
Firmament.tightJson.decodeFromString<List<ColeWeightWaypoint>>(string)
|
Firmament.tightJson.decodeFromString<List<ColeWeightWaypoint>>(string)
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ object Waypoints : FirmamentFeature {
|
|||||||
fun useEditableWaypoints(): FirmWaypoints {
|
fun useEditableWaypoints(): FirmWaypoints {
|
||||||
var w = waypoints
|
var w = waypoints
|
||||||
if (w == null) {
|
if (w == null) {
|
||||||
w = FirmWaypoints("Unlabeled", "unlabeled", null, mutableListOf(), false)
|
w = FirmWaypoints("Unlabeled", "unknown", null, mutableListOf(), false)
|
||||||
waypoints = w
|
waypoints = w
|
||||||
}
|
}
|
||||||
return w
|
return w
|
||||||
@@ -104,6 +104,8 @@ object Waypoints : FirmamentFeature {
|
|||||||
return w
|
return w
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val WAYPOINTS_SUBCOMMAND = "waypoints"
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
fun onCommand(event: CommandEvent.SubCommand) {
|
fun onCommand(event: CommandEvent.SubCommand) {
|
||||||
event.subcommand("waypoint") {
|
event.subcommand("waypoint") {
|
||||||
@@ -120,10 +122,10 @@ object Waypoints : FirmamentFeature {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
event.subcommand("waypoints") {
|
event.subcommand(WAYPOINTS_SUBCOMMAND) {
|
||||||
thenLiteral("clear") {
|
thenLiteral("clear") {
|
||||||
thenExecute {
|
thenExecute {
|
||||||
waypoints?.waypoints?.clear()
|
waypoints = null
|
||||||
source.sendFeedback(Text.translatable("firmament.command.waypoint.clear"))
|
source.sendFeedback(Text.translatable("firmament.command.waypoint.clear"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -165,65 +167,8 @@ object Waypoints : FirmamentFeature {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
thenLiteral("export") {
|
|
||||||
thenExecute {
|
|
||||||
TODO()
|
|
||||||
// val data = Firmament.tightJson.encodeToString<List<ColeWeightWaypoint>>(waypoints.map {
|
|
||||||
// ColeWeightWaypoint(it.x,
|
|
||||||
// it.y,
|
|
||||||
// it.z)
|
|
||||||
// })
|
|
||||||
// ClipboardUtils.setTextContent(data)
|
|
||||||
// source.sendFeedback(tr("firmament.command.waypoint.export",
|
|
||||||
// "Copied ${waypoints.size} waypoints to clipboard"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
thenLiteral("exportrelative") {
|
|
||||||
thenExecute {
|
|
||||||
TODO()
|
|
||||||
// val playerPos = MC.player!!.blockPos
|
|
||||||
// val x = playerPos.x
|
|
||||||
// val y = playerPos.y
|
|
||||||
// val z = playerPos.z
|
|
||||||
// val data = Firmament.tightJson.encodeToString<List<ColeWeightWaypoint>>(waypoints.map {
|
|
||||||
// ColeWeightWaypoint(it.x - x,
|
|
||||||
// it.y - y,
|
|
||||||
// it.z - z)
|
|
||||||
// })
|
|
||||||
// ClipboardUtils.setTextContent(data)
|
|
||||||
// source.sendFeedback(tr("firmament.command.waypoint.export.relative",
|
|
||||||
// "Copied ${waypoints.size} relative waypoints to clipboard. Make sure to stand in the same position when importing."))
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
|
||||||
thenLiteral("import") {
|
|
||||||
thenExecute {
|
|
||||||
source.sendFeedback(
|
|
||||||
importRelative(BlockPos.ORIGIN)// TODO: rework imports
|
|
||||||
?: Text.stringifiedTranslatable("firmament.command.waypoint.import",
|
|
||||||
useNonEmptyWaypoints()?.waypoints?.size),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
thenLiteral("importrelative") {
|
|
||||||
thenExecute {
|
|
||||||
source.sendFeedback(
|
|
||||||
importRelative(MC.player!!.blockPos) ?: tr("firmament.command.waypoint.import.relative",
|
|
||||||
"Imported ${useNonEmptyWaypoints()?.waypoints?.size} relative waypoints from clipboard. Make sure you stand in the same position as when you exported these waypoints for them to line up correctly."),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun importRelative(pos: BlockPos): Text? {
|
|
||||||
val contents = ClipboardUtils.getTextContents()
|
|
||||||
val cw = ColeWeightCompat.tryParse(contents).map { ColeWeightCompat.intoFirm(it) }
|
|
||||||
waypoints = cw.getOrNull() // TODO: directly parse firm waypoints
|
|
||||||
return null // TODO: show error if this does not work
|
|
||||||
// TODO: make relative imports work again
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <E> List<E>.wrappingWindow(startIndex: Int, windowSize: Int): List<E> {
|
fun <E> List<E>.wrappingWindow(startIndex: Int, windowSize: Int): List<E> {
|
||||||
|
|||||||
Reference in New Issue
Block a user