diff --git a/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt b/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt index 0cedc6d..0abab38 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt @@ -86,9 +86,8 @@ class Bde_particles : ModInitializer { } CommandRegistrationCallback.EVENT.register { dispatcher, registryAccess, _ -> - val registryClone = registryAccess - GiveEmitterTool.register(dispatcher, registryClone) - ManageEmitters .register(dispatcher, registryClone) + GiveEmitterTool.register(dispatcher, registryAccess) + ManageEmitters .register(dispatcher, registryAccess) KillAllEmitters.register(dispatcher) SpawnEmitter .register(dispatcher) } diff --git a/src/main/kotlin/com/bytedice/bde_particles/commands/ConfigArgs.kt b/src/main/kotlin/com/bytedice/bde_particles/commands/ConfigArgs.kt index d082335..7a5f14b 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/commands/ConfigArgs.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/commands/ConfigArgs.kt @@ -1,3 +1,5 @@ +@file:Suppress("UNCHECKED_CAST") + package com.bytedice.bde_particles.commands 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.IntegerArgumentType import com.mojang.brigadier.arguments.StringArgumentType -import com.mojang.brigadier.builder.ArgumentBuilder import com.mojang.brigadier.builder.LiteralArgumentBuilder import com.mojang.brigadier.builder.RequiredArgumentBuilder import com.mojang.brigadier.context.CommandContext @@ -25,32 +26,26 @@ import kotlin.reflect.* import kotlin.reflect.full.memberProperties -typealias CommandArgumentBuilder = KFunction> +typealias CommandArgumentBuilder = ( + access: KProperty1, + config: LiteralArgumentBuilder, + reg: CommandRegistryAccess +) -> LiteralArgumentBuilder? -// TODO: doesn't apply shape & duration. Error applying shape other than circle - fun listConfigArgs(configArgs: Array, rootArg: RequiredArgumentBuilder, registryAccess: CommandRegistryAccess - ) : RequiredArgumentBuilder + ): RequiredArgumentBuilder { configArgs.forEach { arg -> var configArg = CommandManager.literal(arg) val argAccess = parseArgNameToAccess(arg)!! - val func = parseArgTypeToFunc(argAccess.returnType) + val func = parseArgTypeToFunc(argAccess.returnType, configArg) if (func != null) { - if (func.parameters.lastIndex == 0) { - configArg.then(func.call(argAccess)) - } - else if (func.parameters.lastIndex == 1) { - configArg = func.call(argAccess, configArg) as LiteralArgumentBuilder? - } - else { - configArg = func.call(argAccess, configArg, registryAccess) as LiteralArgumentBuilder? - } + configArg = func(argAccess, configArg, registryAccess) } rootArg.then(configArg) @@ -60,6 +55,7 @@ fun listConfigArgs(configArgs: Array, } + fun dataClassToArray(dataClass: KClass<*>): Array { return dataClass.memberProperties.map { it.name }.toTypedArray() } @@ -72,22 +68,48 @@ fun parseArgNameToAccess(name: String) : KProperty1? { return access } -fun parseArgTypeToFunc(type: KType) : CommandArgumentBuilder? { +fun parseArgTypeToFunc(type: KType, configArg: LiteralArgumentBuilder): CommandArgumentBuilder? { return when (type.classifier) { - Int::class -> ::intArg - Float::class -> ::floatArg - String::class -> ::stringArg - ParamClasses.Duration::class -> ::durArg - Vector3f::class -> ::vec3fArg - ParamClasses.PairInt::class -> ::pairIntArg - SpawningShape::class -> ::shapeArg - ParamClasses.PairVec3f::class -> ::pairVec3fArg - ParamClasses.PairFloat::class -> ::pairFloatArg - ParamClasses.TransformWithVel::class -> ::transformWithVelArg - ParamClasses.StringCurve::class -> ::stringCurveArg - ParamClasses.LerpVal::class -> ::lerpValArg - ParamClasses.ForceFieldArray::class -> ::forceFieldArg - else -> null + Int::class -> { access, _, _ -> + configArg.then(intArg(access as KProperty1)) + } + Float::class -> { access, _, _ -> + configArg.then(floatArg(access as KProperty1)) + } + String::class -> { access, _, _ -> + configArg.then(stringArg(access as KProperty1)) + } + ParamClasses.Duration::class -> { access, config, _ -> + durArg(access as KProperty1, config) + } + Vector3f::class -> { access, _, _ -> + configArg.then(vec3fArg(access as KProperty1)) + } + ParamClasses.PairInt::class -> { access, _, _ -> + configArg.then(pairIntArg(access as KProperty1)) + } + SpawningShape::class -> { access, config, _ -> + shapeArg(access as KProperty1, config) + } + ParamClasses.PairVec3f::class -> { access, config, _ -> + pairVec3fArg(access as KProperty1, config) + } + ParamClasses.PairFloat::class -> { access, _, _ -> + configArg.then(pairFloatArg(access as KProperty1)) + } + ParamClasses.TransformWithVel::class -> { access, config, _ -> + transformWithVelArg(access as KProperty1, config) + } + ParamClasses.StringCurve::class -> { access, config, reg -> + stringCurveArg(access as KProperty1, config, reg) + } + ParamClasses.LerpVal::class -> { access, config, _ -> + lerpValArg(access as KProperty1, config) + } + ParamClasses.ForceFieldArray::class -> { access, config, _ -> + forceFieldArg(access as KProperty1, config) + } + else -> null } } @@ -364,7 +386,7 @@ fun pairVec3fArg(access: KProperty1, ) } -fun pairFloatArg(access: KProperty1) : RequiredArgumentBuilder { +fun pairFloatArg(access: KProperty1) : RequiredArgumentBuilder { return CommandManager.argument("Min Float", FloatArgumentType.floatArg()) .then(CommandManager.argument("Max Float", FloatArgumentType.floatArg()) .executes { context -> @@ -419,12 +441,12 @@ fun transformWithVelArg(access: KProperty1, configArg: LiteralArgumentBuilder, - //registryAccess: CommandRegistryAccess + registryAccess: CommandRegistryAccess ) : LiteralArgumentBuilder { return configArg .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()) .executes { context -> val index = IntegerArgumentType.getInteger(context, "Index") @@ -528,7 +550,7 @@ fun stringCurveRemoveArg(context: CommandContext, successText(access, "--$item", id, context) } -fun lerpValArg(access: KProperty1, +fun lerpValArg(access: KProperty1, configArg: LiteralArgumentBuilder ) : LiteralArgumentBuilder {