fixed bugs, now im hoping for 1.0
This commit is contained in:
@@ -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,23 +449,23 @@ 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.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<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,19 +503,29 @@ fun argRemoveForceField() : LiteralArgumentBuilder<ServerCommandSource> {
|
||||
val forceFields = params!!.particle.forceFields
|
||||
val newForceFields: MutableList<ForceField> = 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<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)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user