1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
package moe.nea.firmament.features.world
import kotlinx.serialization.Serializable
import net.minecraft.text.Text
import net.minecraft.util.math.BlockPos
import moe.nea.firmament.Firmament
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 {
@Serializable
data class ColeWeightWaypoint(
val x: Int,
val y: Int,
val z: Int,
val r: Int = 0,
val g: Int = 0,
val b: Int = 0,
)
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 {
FirmWaypoints.Waypoint(it.x + relativeTo.x, it.y + relativeTo.y, it.z + relativeTo.z)
}
return FirmWaypoints(
"Imported Waypoints",
"imported",
null,
w.toMutableList(),
false
)
}
fun copyAndInform(
source: DefaultSource,
origin: BlockPos,
positiveFeedback: (Int) -> Text,
) {
val waypoints = Waypoints.useNonEmptyWaypoints()
?.let { fromFirm(it, origin) }
if (waypoints == null) {
source.sendError(Waypoints.textNothingToExport())
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 ?: BlockPos.ORIGIN) }
val waypoints = wr.getOrElse {
source.sendError(
tr("firmament.command.waypoint.import.cw.error",
"Could not import ColeWeight waypoints."))
Firmament.logger.error(it)
return
}
waypoints.lastRelativeImport = pos
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.cw.relative",
"Copied $it relative waypoints to clipboard in ColeWeight format. Make sure to stand in the same position when importing.")
}
}
}
thenLiteral("importcw") {
thenExecute {
importAndInform(source, null) {
Text.stringifiedTranslatable("firmament.command.waypoint.import.cw",
it)
}
}
}
thenLiteral("importrelativecw") {
thenExecute {
importAndInform(source, MC.player!!.blockPos) {
tr("firmament.command.waypoint.import.cw.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>> {
return runCatching {
Firmament.tightJson.decodeFromString<List<ColeWeightWaypoint>>(string)
}
}
}
|