i forgor
This commit is contained in:
@@ -117,9 +117,9 @@ class Bde_particles : ModInitializer {
|
|||||||
|
|
||||||
|
|
||||||
fun init() {
|
fun init() {
|
||||||
addToRegister("DEFAULT", EmitterParams.DEFAULT)
|
addToRegister("DEFAULT", EmitterParams.DEFAULT, 137)
|
||||||
addToRegister("DEBUG", EmitterParams.DEBUG)
|
addToRegister("DEBUG", EmitterParams.DEBUG, 137)
|
||||||
addToRegister("STRESS_TEST", EmitterParams.STRESS_TEST)
|
addToRegister("STRESS_TEST", EmitterParams.STRESS_TEST, 1532)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -147,9 +147,8 @@ fun tick(server: MinecraftServer) {
|
|||||||
synchronized(ALL_PARTICLE_EMITTERS) {
|
synchronized(ALL_PARTICLE_EMITTERS) {
|
||||||
ALL_PARTICLE_EMITTERS = ALL_PARTICLE_EMITTERS.toMutableList().apply { remove(emitter) }.toTypedArray()
|
ALL_PARTICLE_EMITTERS = ALL_PARTICLE_EMITTERS.toMutableList().apply { remove(emitter) }.toTypedArray()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
emitter.tick()
|
|
||||||
}
|
}
|
||||||
|
else { emitter.tick() }
|
||||||
}
|
}
|
||||||
}.awaitAll()
|
}.awaitAll()
|
||||||
}
|
}
|
||||||
@@ -160,7 +159,7 @@ fun onRightClick(player: PlayerEntity, world: ServerWorld, hand: Hand) : TypedAc
|
|||||||
val handItem = player.getStackInHand(hand)
|
val handItem = player.getStackInHand(hand)
|
||||||
val (isEmitterTool, emitterId) = ParticleEmitterTool.getToolDetails(handItem)
|
val (isEmitterTool, emitterId) = ParticleEmitterTool.getToolDetails(handItem)
|
||||||
val hitResult = raycastFromPlayer(player as ServerPlayerEntity, 200.0)
|
val hitResult = raycastFromPlayer(player as ServerPlayerEntity, 200.0)
|
||||||
val emitterParams = getParamsById(emitterId)
|
val emitterParams = getEmitterDataById(emitterId)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!isEmitterTool
|
!isEmitterTool
|
||||||
@@ -171,7 +170,13 @@ fun onRightClick(player: PlayerEntity, world: ServerWorld, hand: Hand) : TypedAc
|
|||||||
}
|
}
|
||||||
|
|
||||||
val debug = world.gameRules.getBoolean(Bde_particles.SHOW_PARTICLE_DEBUG)
|
val debug = world.gameRules.getBoolean(Bde_particles.SHOW_PARTICLE_DEBUG)
|
||||||
val emitter = ParticleEmitter(hitResult.pos, Vector2f(0.0f, 0.0f), world, emitterParams, debug)
|
val emitter = ParticleEmitter(
|
||||||
|
hitResult.pos,
|
||||||
|
Vector2f(0.0f, 0.0f),
|
||||||
|
world,
|
||||||
|
emitterParams,
|
||||||
|
debug
|
||||||
|
)
|
||||||
ALL_PARTICLE_EMITTERS += emitter
|
ALL_PARTICLE_EMITTERS += emitter
|
||||||
|
|
||||||
return TypedActionResult(ActionResult.PASS, handItem)
|
return TypedActionResult(ActionResult.PASS, handItem)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import net.minecraft.world.World
|
|||||||
import org.joml.Vector2f
|
import org.joml.Vector2f
|
||||||
import org.joml.Vector3f
|
import org.joml.Vector3f
|
||||||
import org.joml.Vector4f
|
import org.joml.Vector4f
|
||||||
|
import java.util.SplittableRandom
|
||||||
import kotlin.math.*
|
import kotlin.math.*
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
@@ -79,7 +80,7 @@ fun randomFloatBetween(min: Float, max: Float) : Float {
|
|||||||
|
|
||||||
|
|
||||||
fun randomIntBetween(min: Int, max: Int) : Int {
|
fun randomIntBetween(min: Int, max: Int) : Int {
|
||||||
return Random.nextInt(min, max)
|
return Random.nextInt(max - min) + min
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -104,9 +104,9 @@ data class EmitterParams (
|
|||||||
)
|
)
|
||||||
val STRESS_TEST = EmitterParams(
|
val STRESS_TEST = EmitterParams(
|
||||||
maxCount = 10000,
|
maxCount = 10000,
|
||||||
spawnRate = 50,
|
spawnRate = 5000,
|
||||||
spawnChance = 1.0f,
|
spawnChance = 1.0f,
|
||||||
spawnDuration = ParamClasses.Duration.SingleBurst(100),
|
spawnDuration = ParamClasses.Duration.SingleBurst(1),
|
||||||
spawnPosOffset = Vector3f(0.0f, 0.0f, 0.0f),
|
spawnPosOffset = Vector3f(0.0f, 0.0f, 0.0f),
|
||||||
lifeTime = ParamClasses.PairInt(75, 100),
|
lifeTime = ParamClasses.PairInt(75, 100),
|
||||||
shape = SpawningShape.Circle(10.0f, true),
|
shape = SpawningShape.Circle(10.0f, true),
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import com.bytedice.bde_particles.LerpCurves
|
|||||||
import com.bytedice.bde_particles.randomFloatBetween
|
import com.bytedice.bde_particles.randomFloatBetween
|
||||||
import com.bytedice.bde_particles.randomIntBetween
|
import com.bytedice.bde_particles.randomIntBetween
|
||||||
import org.joml.Vector3f
|
import org.joml.Vector3f
|
||||||
import kotlin.math.abs
|
|
||||||
import kotlin.math.atan2
|
import kotlin.math.atan2
|
||||||
import kotlin.math.pow
|
import kotlin.math.pow
|
||||||
import kotlin.math.sqrt
|
import kotlin.math.sqrt
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package com.bytedice.bde_particles.particles
|
|||||||
import com.bytedice.bde_particles.Bde_particles
|
import com.bytedice.bde_particles.Bde_particles
|
||||||
import com.bytedice.bde_particles.LIVING_PARTICLE_COUNT
|
import com.bytedice.bde_particles.LIVING_PARTICLE_COUNT
|
||||||
import com.bytedice.bde_particles.randomFloatBetween
|
import com.bytedice.bde_particles.randomFloatBetween
|
||||||
|
import kotlinx.coroutines.async
|
||||||
|
import kotlinx.coroutines.awaitAll
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
import net.minecraft.server.world.ServerWorld
|
import net.minecraft.server.world.ServerWorld
|
||||||
import net.minecraft.util.math.Vec3d
|
import net.minecraft.util.math.Vec3d
|
||||||
import org.joml.Vector2f
|
import org.joml.Vector2f
|
||||||
@@ -26,15 +29,38 @@ class ParticleEmitter(
|
|||||||
var isDead = false
|
var isDead = false
|
||||||
|
|
||||||
|
|
||||||
fun tick() {
|
suspend fun tick() {
|
||||||
if (isTicking) { count() }
|
if (isTicking) { count() }
|
||||||
if (isTicking) { addParticle() }
|
if (isTicking) { addParticle() }
|
||||||
if (!isTicking && allParticles.isEmpty()) { isDead = true }
|
if (!isTicking && allParticles.isEmpty()) { isDead = true }
|
||||||
|
|
||||||
for (particle in allParticles) {
|
processParticlesInBatches(world, 100)
|
||||||
if (particle.isDead) { allParticles = allParticles.toMutableList().apply { remove(particle) }.toTypedArray() }
|
|
||||||
else { particle.tick(world) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private suspend fun processParticlesInBatches(
|
||||||
|
world: ServerWorld,
|
||||||
|
batchSize: Int
|
||||||
|
) = coroutineScope {
|
||||||
|
val batches = allParticles.toMutableList().chunked(batchSize)
|
||||||
|
|
||||||
|
val jobs = batches.map { batch ->
|
||||||
|
async {
|
||||||
|
val toRemove = mutableListOf<Particle>()
|
||||||
|
batch.forEach { particle ->
|
||||||
|
if (particle.isDead) {
|
||||||
|
toRemove.add(particle)
|
||||||
|
} else {
|
||||||
|
particle.tick(world)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
synchronized(allParticles) {
|
||||||
|
allParticles = allParticles.toMutableList().apply { removeAll(toRemove) }.toTypedArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jobs.awaitAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ val idRegister: MutableMap<String, EmitterParams> = mutableMapOf()
|
|||||||
val forbiddenIds = arrayOf("", "NULL")
|
val forbiddenIds = arrayOf("", "NULL")
|
||||||
|
|
||||||
|
|
||||||
fun addToRegister(id: String, params: EmitterParams) : Pair<String, Boolean> {
|
fun addToRegister(id: String, params: EmitterParams, cacheLength: Int) : Pair<String, Boolean> {
|
||||||
val newId = replaceForbiddenChars(id.replace(" ", "_"))
|
val newId = replaceForbiddenChars(id.replace(" ", "_"))
|
||||||
|
|
||||||
if (idRegister.containsKey(newId)) {
|
if (idRegister.containsKey(newId)) {
|
||||||
@@ -40,7 +40,7 @@ fun removeFromRegister(id: String) : Boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun getParamsById(id: String) : EmitterParams? {
|
fun getEmitterDataById(id: String) : EmitterParams? {
|
||||||
return idRegister[id]
|
return idRegister[id]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ fun updateRegistered(id: String, newParams: EmitterParams) {
|
|||||||
|
|
||||||
|
|
||||||
fun updateParam(id: String, paramName: String, paramValue: Any) : Boolean {
|
fun updateParam(id: String, paramName: String, paramValue: Any) : Boolean {
|
||||||
val emitter = getParamsById(id) ?: return false
|
val emitter = getEmitterDataById(id) ?: return false
|
||||||
val updatedValues = updateParams(emitter, paramName, paramValue)
|
val updatedValues = updateParams(emitter, paramName, paramValue)
|
||||||
|
|
||||||
return updatedValues.second
|
return updatedValues.second
|
||||||
|
|||||||
Reference in New Issue
Block a user