fixed bugs, now im hoping for 1.0

This commit is contained in:
2024-11-24 17:44:49 +01:00
parent c87b2f7483
commit 2d7aa534b4
8 changed files with 115 additions and 67 deletions
@@ -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"
)
})
}
}
@@ -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<ItemStack> {
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 (
@@ -45,7 +45,6 @@ fun updateEmitterParam(context: CommandContext<ServerCommandSource>, paramName:
fun updateParticleParam(context: CommandContext<ServerCommandSource>, 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<ServerCommandSource> {
return CommandManager.literal("blockCurve")
@@ -443,13 +449,15 @@ fun argAddForceField() : LiteralArgumentBuilder<ServerCommandSource> {
.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.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())
@@ -469,12 +477,10 @@ fun argAddForceField() : LiteralArgumentBuilder<ServerCommandSource> {
)
)
)
)
)
}
fun argRemoveForceField() : LiteralArgumentBuilder<ServerCommandSource> {
fun argRemoveForceField() : LiteralArgumentBuilder<ServerCommandSource> { // 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<ServerCommandSource> {
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,20 +503,30 @@ fun argRemoveForceField() : LiteralArgumentBuilder<ServerCommandSource> {
val forceFields = params!!.particle.forceFields
val newForceFields: MutableList<ForceField> = forceFields.toMutableList()
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
}
else {
for (forceField in forceFields) {
if (forceField.name == ffName) {
newForceFields.remove(forceField)
newForceFields.apply { remove(forceField) }
}
}
val feedback = updateParticleParam(
context,
"forceFields",
newForceFields
newForceFields.toTypedArray()
)
context.source.sendFeedback( { feedback }, false)
context.source.sendFeedback({ feedback }, false)
Command.SINGLE_SUCCESS
}
}
)
}
@@ -527,11 +543,12 @@ fun forceFieldAddSphereExec(context: CommandContext<ServerCommandSource>) : 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<ServerCommandSource>) : 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)
@@ -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
)
}
}
@@ -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)
}
@@ -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<String>
"rotRandom" -> newParams.rotRandom = value as Pair<Vector3f, Vector3f>
"rotVelRandom" -> newParams.rotVelRandom = value as Pair<Vector3f, Vector3f>
@@ -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<String> = 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<String> = arrayOf("minecraft:purple_concrete", "minecraft:purple_stained_glass"),
var rotRandom: Pair<Vector3f, Vector3f> = Pair(Vector3f(0.0f, 0.0f, 0.0f), Vector3f(360.0f, 360.0f, 360.0f)),
var rotVelRandom: Pair<Vector3f, Vector3f> = Pair(Vector3f(-0.2f, -0.2f, -0.2f), Vector3f(0.2f, 0.2f, 0.2f)),
var sizeRandom: Pair<Vector3f, Vector3f> = Pair(Vector3f(0.5f, 0.5f, 0.5f), Vector3f(1.0f, 1.0f, 1.0f)),
var uniformSize: Boolean = true,
var velRandom: Pair<Vector3f, Vector3f> = Pair(Vector3f(-0.1f, 0.4f, -0.1f), Vector3f(0.1f, 0.8f, 0.1f)),
var forceFields: Array<ForceField> = arrayOf(ForceField()),
var velRandom: Pair<Vector3f, Vector3f> = Pair(Vector3f(-0.1f, 0.3f, -0.1f), Vector3f(0.1f, 0.6f, 0.1f)),
var forceFields: Array<ForceField> = 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)
)
}
}
@@ -8,6 +8,7 @@ sealed class 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 object POINT : SpawningShape()
}
sealed class ForceFieldShape {