From 2d7aa534b4c9af1d74870b4f6fe21847276d3094 Mon Sep 17 00:00:00 2001 From: ByteDice Date: Sun, 24 Nov 2024 17:44:49 +0100 Subject: [PATCH] fixed bugs, now im hoping for 1.0 --- .../client/Bde_particlesClient.kt | 10 ++- .../bytedice/bde_particles/Bde_particles.kt | 13 ++- .../commands/ManageConfigArgs.kt | 81 ++++++++++++------- .../bde_particles/particles/EmitterParams.kt | 10 ++- .../bde_particles/particles/Particle.kt | 33 +++----- .../particles/ParticleIdRegister.kt | 2 +- .../bde_particles/particles/ParticleParams.kt | 26 ++++-- .../bde_particles/particles/Shapes.kt | 7 +- 8 files changed, 115 insertions(+), 67 deletions(-) diff --git a/src/client/kotlin/com/bytedice/bde_particles/client/Bde_particlesClient.kt b/src/client/kotlin/com/bytedice/bde_particles/client/Bde_particlesClient.kt index 847d84b..f993ae6 100644 --- a/src/client/kotlin/com/bytedice/bde_particles/client/Bde_particlesClient.kt +++ b/src/client/kotlin/com/bytedice/bde_particles/client/Bde_particlesClient.kt @@ -50,7 +50,15 @@ class Bde_particlesClient : ClientModInitializer { }) ServerLifecycleEvents.SERVER_STARTED.register(ServerLifecycleEvents.ServerStarted { _ -> - println("BDE_ParticleSys - Progress bar filled :3") + println("BPS - Progress bar filled :3") + println( + "\n____________ _____ _____ \n" + + "| ___ \\ ___ \\/ ___| _ |____ |\n" + + "| |_/ / |_/ /\\ `--. (_) / /\n" + + "| ___ \\ __/ `--. \\ \\ \\\n" + + "| |_/ / | /\\__/ / _ .___/ /\n" + + "\\____/\\_| \\____/ (_) \\____/ \n" + ) }) } } \ No newline at end of file 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 84bccdc..f25eb0b 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/Bde_particles.kt @@ -61,7 +61,15 @@ class Bde_particles : ModInitializer { }) ServerLifecycleEvents.SERVER_STARTED.register(ServerLifecycleEvents.ServerStarted { _ -> - println("BDE_ParticleSys - Progress bar filled :3") + println("BPS - Progress bar filled :3") + println( + "\n____________ _____ _____ \n" + + "| ___ \\ ___ \\/ ___| _ |____ |\n" + + "| |_/ / |_/ /\\ `--. (_) / /\n" + + "| ___ \\ __/ `--. \\ \\ \\\n" + + "| |_/ / | /\\__/ / _ .___/ /\n" + + "\\____/\\_| \\____/ (_) \\____/ \n" + ) }) } } @@ -70,6 +78,7 @@ class Bde_particles : ModInitializer { fun init() { addToEmitterRegister("DEFAULT", EmitterParams.DEFAULT) addToEmitterRegister("FIRE_GEYSER", EmitterParams.FIRE_GEYSER) + addToEmitterRegister("RING_EXPLOSION", EmitterParams.RING_EXPLOSION) } @@ -98,7 +107,7 @@ fun tick(server: MinecraftServer) { fun onRightClick(player: PlayerEntity, world: ServerWorld, hand: Hand) : TypedActionResult { val handItem = player.getStackInHand(hand) val (isEmitterTool, emitterId) = ParticleEmitterTool.getToolDetails(handItem) - val hitResult = raycastFromPlayer(player as ServerPlayerEntity, 50.0) + val hitResult = raycastFromPlayer(player as ServerPlayerEntity, 200.0) val emitterParams = getEmitterParams(emitterId) if ( diff --git a/src/main/kotlin/com/bytedice/bde_particles/commands/ManageConfigArgs.kt b/src/main/kotlin/com/bytedice/bde_particles/commands/ManageConfigArgs.kt index ad74f0d..c2f045e 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/commands/ManageConfigArgs.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/commands/ManageConfigArgs.kt @@ -45,7 +45,6 @@ fun updateEmitterParam(context: CommandContext, paramName: fun updateParticleParam(context: CommandContext, paramName: String, typeValue: Any) : MutableText { val emitterIdVal = StringArgumentType.getString(context, "Registered Emitter ID") - val particle = getEmitterParams(emitterIdVal)?.particle val success = updateSingleParticleParam(emitterIdVal, paramName, typeValue) val feedback = if (success) { @@ -173,6 +172,13 @@ class ArgConfigParticleKeys { } ) ) + .then(CommandManager.literal("point") + .executes { context -> + val feedback = updateParticleParam(context, "shape", SpawningShape.POINT) + context.source.sendFeedback( { feedback }, false) + Command.SINGLE_SUCCESS + } + ) } fun blockCurve() : LiteralArgumentBuilder { return CommandManager.literal("blockCurve") @@ -443,23 +449,23 @@ fun argAddForceField() : LiteralArgumentBuilder { .then(CommandManager.argument("X Pos", FloatArgumentType.floatArg()) .then(CommandManager.argument("Y Pos", FloatArgumentType.floatArg()) .then(CommandManager.argument("Z Pos", FloatArgumentType.floatArg()) - .then(CommandManager.argument("Min Force", FloatArgumentType.floatArg()) - .then(CommandManager.argument("Max Force", FloatArgumentType.floatArg()) - .then(CommandManager.literal("sphere") - .then(CommandManager.argument("Radius", FloatArgumentType.floatArg()) + .then(CommandManager.literal("sphere") + .then(CommandManager.argument("Radius", FloatArgumentType.floatArg()) + .then(CommandManager.argument("Min Force", FloatArgumentType.floatArg()) + .then(CommandManager.argument("Max Force", FloatArgumentType.floatArg()) .executes { context -> forceFieldAddSphereExec(context) } ) ) - .then(CommandManager.literal("cube") - .then(CommandManager.argument("X Size", FloatArgumentType.floatArg()) - .then(CommandManager.argument("Y Size", FloatArgumentType.floatArg()) - .then(CommandManager.argument("Z Size", FloatArgumentType.floatArg()) - .then(CommandManager.argument("X Force", FloatArgumentType.floatArg()) - .then(CommandManager.argument("Y Force", FloatArgumentType.floatArg()) - .then(CommandManager.argument("Z Force", FloatArgumentType.floatArg()) - .executes { context -> forceFieldAddCubeExec(context) } - ) - ) + ) + ) + .then(CommandManager.literal("cube") + .then(CommandManager.argument("X Size", FloatArgumentType.floatArg()) + .then(CommandManager.argument("Y Size", FloatArgumentType.floatArg()) + .then(CommandManager.argument("Z Size", FloatArgumentType.floatArg()) + .then(CommandManager.argument("X Force", FloatArgumentType.floatArg()) + .then(CommandManager.argument("Y Force", FloatArgumentType.floatArg()) + .then(CommandManager.argument("Z Force", FloatArgumentType.floatArg()) + .executes { context -> forceFieldAddCubeExec(context) } ) ) ) @@ -474,7 +480,7 @@ fun argAddForceField() : LiteralArgumentBuilder { } -fun argRemoveForceField() : LiteralArgumentBuilder { +fun argRemoveForceField() : LiteralArgumentBuilder { // TODO fix this error somehow return CommandManager.literal("remove") .then(CommandManager.argument("Force Field Name", StringArgumentType.string()) .suggests { context, builder -> @@ -483,8 +489,8 @@ fun argRemoveForceField() : LiteralArgumentBuilder { val params = getEmitterParams(emitterIdVal) val forceFields = params!!.particle.forceFields - forceFields.iterator().forEach { - builder.suggest(it.name) + for (forceField in forceFields) { + builder.suggest(forceField.name) } CompletableFuture.completedFuture(builder.build()) @@ -497,19 +503,29 @@ fun argRemoveForceField() : LiteralArgumentBuilder { val forceFields = params!!.particle.forceFields val newForceFields: MutableList = forceFields.toMutableList() - for (forceField in forceFields) { - if (forceField.name == ffName) { - newForceFields.remove(forceField) - } + if (forceFields.isEmpty()) { + val feedback = Text.literal("BPS - There are no force fields for Emitter ID \"$emitterIdVal\".") + .setStyle(Style.EMPTY.withColor(Color(200, 0, 0).rgb)) + context.source.sendFeedback({ feedback }, false) + Command.SINGLE_SUCCESS + } - val feedback = updateParticleParam( - context, - "forceFields", - newForceFields - ) - context.source.sendFeedback( { feedback }, false) - Command.SINGLE_SUCCESS + else { + for (forceField in forceFields) { + if (forceField.name == ffName) { + newForceFields.apply { remove(forceField) } + } + } + + val feedback = updateParticleParam( + context, + "forceFields", + newForceFields.toTypedArray() + ) + context.source.sendFeedback({ feedback }, false) + Command.SINGLE_SUCCESS + } } ) } @@ -527,11 +543,12 @@ fun forceFieldAddSphereExec(context: CommandContext) : Int val currentParams = getEmitterParams(emitterIdVal) val forceFields = currentParams!!.particle.forceFields + val addedArray = forceFields.toMutableList().apply { add(forceField) }.toTypedArray() val feedback = updateParticleParam( context, "forceFields", - forceFields.toMutableList().add(forceField) + addedArray ) context.source.sendFeedback({ feedback }, false) @@ -555,11 +572,13 @@ fun forceFieldAddCubeExec(context: CommandContext) : Int { val currentParams = getEmitterParams(emitterIdVal) val forceFields = currentParams!!.particle.forceFields + val addedArray = forceFields.toMutableList().apply { add(forceField) }.toTypedArray() + val feedback = updateParticleParam( context, "forceFields", - forceFields.toMutableList().add(forceField) + addedArray ) context.source.sendFeedback({ feedback }, false) diff --git a/src/main/kotlin/com/bytedice/bde_particles/particles/EmitterParams.kt b/src/main/kotlin/com/bytedice/bde_particles/particles/EmitterParams.kt index 31f2f0c..414c932 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/particles/EmitterParams.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/particles/EmitterParams.kt @@ -17,7 +17,7 @@ data class EmitterParams ( var loopDur: Int = 25, var loopDelay: Int = 0, var loopCount: Int = 0, - var particle: ParticleParams = ParticleParams(), + var particle: ParticleParams = ParticleParams.DEFAULT, ) { companion object Presets { @@ -30,5 +30,13 @@ data class EmitterParams ( 0, ParticleParams.FIRE_GEYSER ) + val RING_EXPLOSION = EmitterParams( + 200, + 150, + 1, + 0, + 0, + ParticleParams.RING_EXPLOSION + ) } } \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/particles/Particle.kt b/src/main/kotlin/com/bytedice/bde_particles/particles/Particle.kt index 794abe5..3e34bfe 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/particles/Particle.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/particles/Particle.kt @@ -8,6 +8,9 @@ import org.joml.Vector4f import kotlin.math.* +// TODO: consider moving most params to emitter (such as shape, and forceFields) to store less data + + class Particle(private val particleParams: ParticleParams) { private val initOffset = Vector3f(-0.5f, -0.5f, -0.5f) private var offset = Vector3f(0.0f, 0.0f, 0.0f) @@ -41,27 +44,11 @@ class Particle(private val particleParams: ParticleParams) { val newSpawnPos: Vector3f when (shape) { - is SpawningShape.CIRCLE -> { - val posInCircle = randomInCircle(shape.radius) - newSpawnPos = Vector3f(posInCircle.x, 0.0f, posInCircle.y) - } - - is SpawningShape.SPHERE -> { - newSpawnPos = randomInSphere(shape.radius) - } - - is SpawningShape.RECT -> { - val posInRect = randomInRect(shape.size) - newSpawnPos = Vector3f(posInRect.x, 0.0f, posInRect.y) - } - - is SpawningShape.CUBE -> { - newSpawnPos = randomInCube(shape.size) - } - - null -> { - newSpawnPos = Vector3f(0.0f, 0.0f, 0.0f) - } + is SpawningShape.CIRCLE -> { val posInCircle = randomInCircle(shape.radius); newSpawnPos = Vector3f(posInCircle.x, 0.0f, posInCircle.y) } + is SpawningShape.SPHERE -> { newSpawnPos = randomInSphere(shape.radius) } + is SpawningShape.RECT -> { val posInRect = randomInRect(shape.size); newSpawnPos = Vector3f(posInRect.x, 0.0f, posInRect.y) } + is SpawningShape.CUBE -> { newSpawnPos = randomInCube(shape.size) } + is SpawningShape.POINT -> { newSpawnPos = Vector3f(0.0f, 0.0f, 0.0f) } } offset = newSpawnPos @@ -115,7 +102,6 @@ class Particle(private val particleParams: ParticleParams) { } - // TODO: forceFields private fun calcNewProperties() : DisplayEntityProperties { fun calcBlockCurve(timeAliveClamped: Float) : String { @@ -130,7 +116,8 @@ class Particle(private val particleParams: ParticleParams) { val sdfVal = sdfSphere(forceField.pos, shape.radius, offset) val normalizedSdf = normalizeSdf(sdfVal, shape.radius) val velDir = Vector3f(offset).sub(forceField.pos).normalize() - val velMul = lerp(shape.force.second, shape.force.second, 1 - normalizedSdf) + val velMul = if (sdfVal > 0) { 0.0f } + else { lerp(shape.force.second, shape.force.second, 1 - normalizedSdf) } return velDir.mul(velMul) } diff --git a/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleIdRegister.kt b/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleIdRegister.kt index 8dc4502..211198b 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleIdRegister.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleIdRegister.kt @@ -113,7 +113,7 @@ fun updateSingleParticleParam(params: ParticleParams, paramName: String, paramVa val newParams = params.copy() when (paramName) { - "shape" -> newParams.shape = value as SpawningShape? + "shape" -> newParams.shape = value as SpawningShape "blockCurve" -> newParams.blockCurve = value as Array "rotRandom" -> newParams.rotRandom = value as Pair "rotVelRandom" -> newParams.rotVelRandom = value as Pair diff --git a/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleParams.kt b/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleParams.kt index 1e9c3d1..b7b05b2 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleParams.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/particles/ParticleParams.kt @@ -22,14 +22,14 @@ import org.joml.Vector3f * @param sizeCurve A curve which the size gets multiplied by during the particle's lifetime. */ data class ParticleParams ( - var shape: SpawningShape? = SpawningShape.CIRCLE(3.0f), - var blockCurve: Array = arrayOf("minecraft:shroomlight", "minecraft:orange_concrete", "minecraft:orange_stained_glass", "minecraft:gray_stained_glass", "minecraft:light_gray_stained_glass"), + var shape: SpawningShape = SpawningShape.CIRCLE(3.0f), + var blockCurve: Array = arrayOf("minecraft:purple_concrete", "minecraft:purple_stained_glass"), var rotRandom: Pair = Pair(Vector3f(0.0f, 0.0f, 0.0f), Vector3f(360.0f, 360.0f, 360.0f)), var rotVelRandom: Pair = Pair(Vector3f(-0.2f, -0.2f, -0.2f), Vector3f(0.2f, 0.2f, 0.2f)), var sizeRandom: Pair = Pair(Vector3f(0.5f, 0.5f, 0.5f), Vector3f(1.0f, 1.0f, 1.0f)), var uniformSize: Boolean = true, - var velRandom: Pair = Pair(Vector3f(-0.1f, 0.4f, -0.1f), Vector3f(0.1f, 0.8f, 0.1f)), - var forceFields: Array = arrayOf(ForceField()), + var velRandom: Pair = Pair(Vector3f(-0.1f, 0.3f, -0.1f), Vector3f(0.1f, 0.6f, 0.1f)), + var forceFields: Array = emptyArray(), var gravity: Vector3f = Vector3f(0.0f, -0.01f, 0.0f), var drag: Float = 0.075f, var minVel: Float = 0.0f, @@ -40,7 +40,7 @@ data class ParticleParams ( companion object Presets { val DEFAULT = ParticleParams() val FIRE_GEYSER = ParticleParams( - null, + SpawningShape.POINT, arrayOf("minecraft:shroomlight", "minecraft:orange_concrete", "minecraft:orange_stained_glass", "minecraft:gray_stained_glass", "minecraft:light_gray_stained_glass"), Pair(Vector3f(0.0f, 0.0f, 0.0f), Vector3f(360.0f, 360.0f, 360.0f)), Pair(Vector3f(-0.2f, -0.2f, -0.2f), Vector3f(0.2f, 0.2f, 0.2f)), @@ -55,5 +55,21 @@ data class ParticleParams ( Triple(Vector3f(1.0f, 1.0f, 1.0f), Vector3f(0.0f, 0.0f, 0.0f), InterpolationCurves.SQRT), Triple(Vector3f(1.0f, 1.0f, 1.0f), Vector3f(0.5f, 0.5f, 0.5f), InterpolationCurves.SQRT) ) + val RING_EXPLOSION = ParticleParams( + SpawningShape.CIRCLE(0.1f), + arrayOf("minecraft:shroomlight", "minecraft:orange_concrete", "minecraft:orange_stained_glass", "minecraft:gray_stained_glass", "minecraft:light_gray_stained_glass"), + Pair(Vector3f(0.0f, 0.0f, 0.0f), Vector3f(360.0f, 360.0f, 360.0f)), + Pair(Vector3f(-0.2f, -0.2f, -0.2f), Vector3f(0.2f, 0.2f, 0.2f)), + Pair(Vector3f(10.0f, 10.0f, 10.0f), Vector3f(15.0f, 15.0f, 15.0f)), + true, + Pair(Vector3f(0.0f, 0.0f, 0.0f), Vector3f(0.0f, 0.0f, 0.0f)), + arrayOf(ForceField("init", Vector3f(0.0f, -0.0001f, 0.0f), ForceFieldShape.SPHERE(0.1f, Pair(4.0f, 4.0f)))), + Vector3f(0.0f, 0.0f, 0.0f), + 0.0075f, + 0.0f, + Pair(50, 100), + Triple(Vector3f(1.0f, 1.0f, 1.0f), Vector3f(0.0f, 0.0f, 0.0f), InterpolationCurves.SQRT), + Triple(Vector3f(0.0f, 0.0f, 0.0f), Vector3f(3.0f, 3.0f, 3.0f), InterpolationCurves.SQRT) + ) } } \ No newline at end of file diff --git a/src/main/kotlin/com/bytedice/bde_particles/particles/Shapes.kt b/src/main/kotlin/com/bytedice/bde_particles/particles/Shapes.kt index 162cc26..e185c39 100644 --- a/src/main/kotlin/com/bytedice/bde_particles/particles/Shapes.kt +++ b/src/main/kotlin/com/bytedice/bde_particles/particles/Shapes.kt @@ -4,10 +4,11 @@ import org.joml.Vector2f import org.joml.Vector3f sealed class SpawningShape { - data class CIRCLE(val radius: Float = 1.0f) : SpawningShape() - data class RECT (val size: Vector2f = Vector2f(1.0f, 1.0f)) : SpawningShape() + data class CIRCLE(val radius: Float = 1.0f) : SpawningShape() + data class RECT (val size: Vector2f = Vector2f(1.0f, 1.0f)) : SpawningShape() data class CUBE (val size: Vector3f = Vector3f(1.0f, 1.0f, 1.0f)) : SpawningShape() - data class SPHERE(val radius: Float = 1.0f) : SpawningShape() + data class SPHERE(val radius: Float = 1.0f) : SpawningShape() + data object POINT : SpawningShape() } sealed class ForceFieldShape {