Skip to content

Commit b13b9ea

Browse files
committed
Merge branch 'master' into feature/combat
2 parents bcb6546 + 9620e55 commit b13b9ea

File tree

6 files changed

+89
-11
lines changed

6 files changed

+89
-11
lines changed

common/src/main/kotlin/com/lambda/command/commands/BuildCommand.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package com.lambda.command.commands
1919

2020
import com.lambda.brigadier.CommandResult
21+
import com.lambda.brigadier.CommandResult.Companion.failure
22+
import com.lambda.brigadier.CommandResult.Companion.success
2123
import com.lambda.brigadier.argument.greedyString
2224
import com.lambda.brigadier.argument.literal
2325
import com.lambda.brigadier.argument.value
@@ -28,6 +30,7 @@ import com.lambda.interaction.construction.StructureRegistry
2830
import com.lambda.interaction.construction.blueprint.Blueprint.Companion.toStructure
2931
import com.lambda.interaction.construction.blueprint.StaticBlueprint.Companion.toBlueprint
3032
import com.lambda.task.TaskFlow.run
33+
import com.lambda.task.tasks.BuildTask
3134
import com.lambda.task.tasks.BuildTask.Companion.build
3235
import com.lambda.threading.runSafe
3336
import com.lambda.util.Communication.info
@@ -42,6 +45,8 @@ object BuildCommand : LambdaCommand(
4245
description = "Builds a structure",
4346
usage = "build <structure>"
4447
) {
48+
private var lastBuildTask: BuildTask? = null
49+
4550
override fun CommandBuilder.create() {
4651
required(literal("place")) {
4752
required(greedyString("structure")) { structure ->
@@ -57,27 +62,38 @@ object BuildCommand : LambdaCommand(
5762
.loadStructureByRelativePath(Path.of(pathString))
5863
?.let { template ->
5964
info("Building structure $pathString with dimensions ${template.size.toShortString()} created by ${template.author}")
60-
template.toStructure()
65+
lastBuildTask = template.toStructure()
6166
.move(player.blockPos)
6267
.toBlueprint()
6368
.build()
6469
.run()
6570

66-
return@executeWithResult CommandResult.success()
71+
return@executeWithResult success()
6772
}
6873
} catch (e: InvalidPathException) {
69-
return@executeWithResult CommandResult.failure("Invalid path $pathString")
74+
return@executeWithResult failure("Invalid path $pathString")
7075
} catch (e: NoSuchFileException) {
71-
return@executeWithResult CommandResult.failure("Structure $pathString not found")
76+
return@executeWithResult failure("Structure $pathString not found")
7277
} catch (e: Exception) {
73-
return@executeWithResult CommandResult.failure(
78+
return@executeWithResult failure(
7479
e.message ?: "Failed to load structure $pathString"
7580
)
7681
}
7782
}
7883

79-
CommandResult.failure("Structure $pathString not found")
84+
failure("Structure $pathString not found")
85+
}
86+
}
87+
}
88+
89+
required(literal("cancel")) {
90+
executeWithResult {
91+
lastBuildTask?.cancel() ?: run {
92+
return@executeWithResult failure("No build task to cancel")
8093
}
94+
this@BuildCommand.info("$lastBuildTask cancelled")
95+
lastBuildTask = null
96+
success()
8197
}
8298
}
8399
}

common/src/main/kotlin/com/lambda/command/commands/ConfigCommand.kt

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@
1717

1818
package com.lambda.command.commands
1919

20+
import com.google.gson.JsonParser
21+
import com.lambda.brigadier.CommandResult
22+
import com.lambda.brigadier.CommandResult.Companion.failure
2023
import com.lambda.brigadier.CommandResult.Companion.success
2124
import com.lambda.brigadier.argument.literal
25+
import com.lambda.brigadier.argument.string
26+
import com.lambda.brigadier.argument.value
27+
import com.lambda.brigadier.argument.word
2228
import com.lambda.brigadier.executeWithResult
2329
import com.lambda.brigadier.required
2430
import com.lambda.command.LambdaCommand
@@ -28,8 +34,8 @@ import com.lambda.util.extension.CommandBuilder
2834

2935
object ConfigCommand : LambdaCommand(
3036
name = "config",
31-
aliases = setOf("cfg"),
32-
usage = "config <save | load>",
37+
aliases = setOf("cfg", "settings", "setting"),
38+
usage = "config <save | load | set> <configurable> <setting> <value>",
3339
description = "Save or load the configuration files"
3440
) {
3541
override fun CommandBuilder.create() {
@@ -51,5 +57,51 @@ object ConfigCommand : LambdaCommand(
5157
return@executeWithResult success()
5258
}
5359
}
60+
required(literal("set")) {
61+
required(string("configurable")) { config ->
62+
suggests { _, builder ->
63+
Configuration.configurables.forEach {
64+
builder.suggest("\"${it.name}\"")
65+
}
66+
builder.buildFuture()
67+
}
68+
required(string("setting")) { setting ->
69+
suggests { ctx, builder ->
70+
val conf = config(ctx).value()
71+
Configuration.configurableByName(conf)?.let { configurable ->
72+
configurable.settings.forEach {
73+
builder.suggest("\"${it.name}\"")
74+
}
75+
}
76+
builder.buildFuture()
77+
}
78+
required(string("value as JSON")) { value ->
79+
executeWithResult {
80+
val valueString = value().value()
81+
val confName = config().value()
82+
val settingName = setting().value()
83+
val conf = Configuration.configurableByName(confName) ?: run {
84+
return@executeWithResult failure("$confName is not a valid configurable.")
85+
}
86+
val set = Configuration.settingByName(conf, settingName) ?: run {
87+
return@executeWithResult failure("$settingName is not a valid setting for $confName.")
88+
}
89+
val parsed = try {
90+
JsonParser.parseString("\"$valueString\"")
91+
} catch (e: Exception) {
92+
return@executeWithResult failure("$valueString is not a valid JSON string.")
93+
}
94+
try {
95+
set.loadFromJson(parsed)
96+
} catch (e: Exception) {
97+
return@executeWithResult failure("Failed to load $valueString as a ${set.type::class.simpleName} for $settingName in $confName.")
98+
}
99+
this@ConfigCommand.info("Set $settingName to ${set.value} for $confName.")
100+
return@executeWithResult success()
101+
}
102+
}
103+
}
104+
}
105+
}
54106
}
55107
}

common/src/main/kotlin/com/lambda/command/commands/TransferCommand.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ object TransferCommand : LambdaCommand(
106106
lastContainerTransfer?.cancel() ?: run {
107107
return@executeWithResult failure("No transfer to cancel")
108108
}
109-
info("$lastContainerTransfer cancelled")
109+
this@TransferCommand.info("$lastContainerTransfer cancelled")
110110
lastContainerTransfer = null
111111
success()
112112
}

common/src/main/kotlin/com/lambda/config/AbstractSetting.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ import kotlin.reflect.KProperty
7272
*/
7373
abstract class AbstractSetting<T : Any>(
7474
private val defaultValue: T,
75-
protected val type: Type,
75+
val type: Type,
7676
val description: String,
7777
val visibility: () -> Boolean,
7878
) : Jsonable, Nameable {

common/src/main/kotlin/com/lambda/config/Configuration.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,5 +156,12 @@ abstract class Configuration : Jsonable {
156156

157157
companion object {
158158
val configurations = mutableSetOf<Configuration>()
159+
val configurables: Set<Configurable>
160+
get() = configurations.flatMapTo(mutableSetOf()) { it.configurables }
161+
162+
fun configurableByName(name: String) =
163+
configurables.find { it.name == name }
164+
fun settingByName(configurable: Configurable, name: String) =
165+
configurable.settings.find { it.name == name }
159166
}
160167
}

common/src/main/kotlin/com/lambda/task/TaskFlow.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ object TaskFlow : Task<Unit>() {
2323
override val name get() = "TaskFlow"
2424

2525
@Ta5kBuilder
26-
fun Task<*>.run() = this.execute(this@TaskFlow)
26+
inline fun <reified T : Task<*>> T.run(): T {
27+
execute(this@TaskFlow)
28+
return this
29+
}
2730

2831
@Ta5kBuilder
2932
fun Task<*>.run(task: TaskGenerator<Unit>) {

0 commit comments

Comments
 (0)