if it works then im not touching it anymore

This commit is contained in:
2024-12-22 17:06:16 +01:00
parent 3b47ad870f
commit 3ff032db1d
2 changed files with 58 additions and 37 deletions
@@ -86,9 +86,8 @@ class Bde_particles : ModInitializer {
} }
CommandRegistrationCallback.EVENT.register { dispatcher, registryAccess, _ -> CommandRegistrationCallback.EVENT.register { dispatcher, registryAccess, _ ->
val registryClone = registryAccess GiveEmitterTool.register(dispatcher, registryAccess)
GiveEmitterTool.register(dispatcher, registryClone) ManageEmitters .register(dispatcher, registryAccess)
ManageEmitters .register(dispatcher, registryClone)
KillAllEmitters.register(dispatcher) KillAllEmitters.register(dispatcher)
SpawnEmitter .register(dispatcher) SpawnEmitter .register(dispatcher)
} }
@@ -1,3 +1,5 @@
@file:Suppress("UNCHECKED_CAST")
package com.bytedice.bde_particles.commands package com.bytedice.bde_particles.commands
import com.bytedice.bde_particles.curveListArg import com.bytedice.bde_particles.curveListArg
@@ -10,7 +12,6 @@ import com.mojang.brigadier.arguments.BoolArgumentType
import com.mojang.brigadier.arguments.FloatArgumentType import com.mojang.brigadier.arguments.FloatArgumentType
import com.mojang.brigadier.arguments.IntegerArgumentType import com.mojang.brigadier.arguments.IntegerArgumentType
import com.mojang.brigadier.arguments.StringArgumentType import com.mojang.brigadier.arguments.StringArgumentType
import com.mojang.brigadier.builder.ArgumentBuilder
import com.mojang.brigadier.builder.LiteralArgumentBuilder import com.mojang.brigadier.builder.LiteralArgumentBuilder
import com.mojang.brigadier.builder.RequiredArgumentBuilder import com.mojang.brigadier.builder.RequiredArgumentBuilder
import com.mojang.brigadier.context.CommandContext import com.mojang.brigadier.context.CommandContext
@@ -25,11 +26,13 @@ import kotlin.reflect.*
import kotlin.reflect.full.memberProperties import kotlin.reflect.full.memberProperties
typealias CommandArgumentBuilder = KFunction<ArgumentBuilder<ServerCommandSource, *>> typealias CommandArgumentBuilder = (
access: KProperty1<EmitterParams, *>,
config: LiteralArgumentBuilder<ServerCommandSource>,
reg: CommandRegistryAccess
) -> LiteralArgumentBuilder<ServerCommandSource>?
// TODO: doesn't apply shape & duration. Error applying shape other than circle
fun listConfigArgs(configArgs: Array<String>, fun listConfigArgs(configArgs: Array<String>,
rootArg: RequiredArgumentBuilder<ServerCommandSource, *>, rootArg: RequiredArgumentBuilder<ServerCommandSource, *>,
registryAccess: CommandRegistryAccess registryAccess: CommandRegistryAccess
@@ -39,18 +42,10 @@ fun listConfigArgs(configArgs: Array<String>,
var configArg = CommandManager.literal(arg) var configArg = CommandManager.literal(arg)
val argAccess = parseArgNameToAccess(arg)!! val argAccess = parseArgNameToAccess(arg)!!
val func = parseArgTypeToFunc(argAccess.returnType) val func = parseArgTypeToFunc(argAccess.returnType, configArg)
if (func != null) { if (func != null) {
if (func.parameters.lastIndex == 0) { configArg = func(argAccess, configArg, registryAccess)
configArg.then(func.call(argAccess))
}
else if (func.parameters.lastIndex == 1) {
configArg = func.call(argAccess, configArg) as LiteralArgumentBuilder<ServerCommandSource>?
}
else {
configArg = func.call(argAccess, configArg, registryAccess) as LiteralArgumentBuilder<ServerCommandSource>?
}
} }
rootArg.then(configArg) rootArg.then(configArg)
@@ -60,6 +55,7 @@ fun listConfigArgs(configArgs: Array<String>,
} }
fun dataClassToArray(dataClass: KClass<*>): Array<String> { fun dataClassToArray(dataClass: KClass<*>): Array<String> {
return dataClass.memberProperties.map { it.name }.toTypedArray() return dataClass.memberProperties.map { it.name }.toTypedArray()
} }
@@ -72,21 +68,47 @@ fun parseArgNameToAccess(name: String) : KProperty1<EmitterParams, *>? {
return access return access
} }
fun parseArgTypeToFunc(type: KType) : CommandArgumentBuilder? { fun parseArgTypeToFunc(type: KType, configArg: LiteralArgumentBuilder<ServerCommandSource>): CommandArgumentBuilder? {
return when (type.classifier) { return when (type.classifier) {
Int::class -> ::intArg Int::class -> { access, _, _ ->
Float::class -> ::floatArg configArg.then(intArg(access as KProperty1<EmitterParams, Int>))
String::class -> ::stringArg }
ParamClasses.Duration::class -> ::durArg Float::class -> { access, _, _ ->
Vector3f::class -> ::vec3fArg configArg.then(floatArg(access as KProperty1<EmitterParams, Float>))
ParamClasses.PairInt::class -> ::pairIntArg }
SpawningShape::class -> ::shapeArg String::class -> { access, _, _ ->
ParamClasses.PairVec3f::class -> ::pairVec3fArg configArg.then(stringArg(access as KProperty1<EmitterParams, String>))
ParamClasses.PairFloat::class -> ::pairFloatArg }
ParamClasses.TransformWithVel::class -> ::transformWithVelArg ParamClasses.Duration::class -> { access, config, _ ->
ParamClasses.StringCurve::class -> ::stringCurveArg durArg(access as KProperty1<EmitterParams, ParamClasses.Duration>, config)
ParamClasses.LerpVal::class -> ::lerpValArg }
ParamClasses.ForceFieldArray::class -> ::forceFieldArg Vector3f::class -> { access, _, _ ->
configArg.then(vec3fArg(access as KProperty1<EmitterParams, Vector3f>))
}
ParamClasses.PairInt::class -> { access, _, _ ->
configArg.then(pairIntArg(access as KProperty1<EmitterParams, ParamClasses.PairInt>))
}
SpawningShape::class -> { access, config, _ ->
shapeArg(access as KProperty1<EmitterParams, SpawningShape>, config)
}
ParamClasses.PairVec3f::class -> { access, config, _ ->
pairVec3fArg(access as KProperty1<EmitterParams, ParamClasses.PairVec3f>, config)
}
ParamClasses.PairFloat::class -> { access, _, _ ->
configArg.then(pairFloatArg(access as KProperty1<EmitterParams, ParamClasses.PairFloat>))
}
ParamClasses.TransformWithVel::class -> { access, config, _ ->
transformWithVelArg(access as KProperty1<EmitterParams, ParamClasses.TransformWithVel>, config)
}
ParamClasses.StringCurve::class -> { access, config, reg ->
stringCurveArg(access as KProperty1<EmitterParams, ParamClasses.StringCurve>, config, reg)
}
ParamClasses.LerpVal::class -> { access, config, _ ->
lerpValArg(access as KProperty1<EmitterParams, ParamClasses.LerpVal>, config)
}
ParamClasses.ForceFieldArray::class -> { access, config, _ ->
forceFieldArg(access as KProperty1<EmitterParams, ParamClasses.ForceFieldArray>, config)
}
else -> null else -> null
} }
} }
@@ -364,7 +386,7 @@ fun pairVec3fArg(access: KProperty1<EmitterParams,ParamClasses.PairVec3f>,
) )
} }
fun pairFloatArg(access: KProperty1<EmitterParams, ParamClasses.PairInt>) : RequiredArgumentBuilder<ServerCommandSource, Float> { fun pairFloatArg(access: KProperty1<EmitterParams, ParamClasses.PairFloat>) : RequiredArgumentBuilder<ServerCommandSource, Float> {
return CommandManager.argument("Min Float", FloatArgumentType.floatArg()) return CommandManager.argument("Min Float", FloatArgumentType.floatArg())
.then(CommandManager.argument("Max Float", FloatArgumentType.floatArg()) .then(CommandManager.argument("Max Float", FloatArgumentType.floatArg())
.executes { context -> .executes { context ->
@@ -419,12 +441,12 @@ fun transformWithVelArg(access: KProperty1<EmitterParams, ParamClasses.Transform
fun stringCurveArg(access: KProperty1<EmitterParams, ParamClasses.StringCurve>, fun stringCurveArg(access: KProperty1<EmitterParams, ParamClasses.StringCurve>,
configArg: LiteralArgumentBuilder<ServerCommandSource>, configArg: LiteralArgumentBuilder<ServerCommandSource>,
//registryAccess: CommandRegistryAccess registryAccess: CommandRegistryAccess
) : LiteralArgumentBuilder<ServerCommandSource> ) : LiteralArgumentBuilder<ServerCommandSource>
{ {
return configArg return configArg
.then(CommandManager.literal("Add") .then(CommandManager.literal("Add")
.then(CommandManager.argument("Item", FloatArgumentType.floatArg())//ItemStackArgumentType.itemStack(registryAccess)) .then(CommandManager.argument("Item", ItemStackArgumentType.itemStack(registryAccess))
.then(CommandManager.argument("Index", IntegerArgumentType.integer()) .then(CommandManager.argument("Index", IntegerArgumentType.integer())
.executes { context -> .executes { context ->
val index = IntegerArgumentType.getInteger(context, "Index") val index = IntegerArgumentType.getInteger(context, "Index")
@@ -528,7 +550,7 @@ fun stringCurveRemoveArg(context: CommandContext<ServerCommandSource>,
successText(access, "--$item", id, context) successText(access, "--$item", id, context)
} }
fun lerpValArg(access: KProperty1<EmitterParams,ParamClasses.PairVec3f>, fun lerpValArg(access: KProperty1<EmitterParams,ParamClasses.LerpVal>,
configArg: LiteralArgumentBuilder<ServerCommandSource> configArg: LiteralArgumentBuilder<ServerCommandSource>
) : LiteralArgumentBuilder<ServerCommandSource> ) : LiteralArgumentBuilder<ServerCommandSource>
{ {