Particle Data
object ParticleData
Pure resolution of a configured particle into a Particle plus any extra data it needs — extracted from FileConfig so it can be unit-tested without a server.
Regression guard: the effect used to call spawnParticle with no data, which threw for any data-bearing particle (DUST, BLOCK, ITEM, …). This resolves and validates the data once, up front: data-less particles get null, DUST-style particles are built from a colour + size, and anything needing data this plugin doesn't model (or an unknown key) falls back to DEFAULT_PARTICLE with a warning instead of crashing at spawn time.