Skip to content

Particle format

MoParticles reads Bedrock particle_effect JSON files — the same format used by resource packs and the SnowStorm effect library. The goal is broad compatibility: components MoParticles doesn't understand are safely ignored, so most Bedrock effect files just work.

Where particles live

Drop .json files into:

text
plugins/MoParticles/particles/

Three effects are bundled by default (fire.json, loading.json, rainbow.json). After adding or changing files, run:

text
/moparticles reload

or restart the server.

File structure

A particle file has a format_version, a particle_effect object with a description, and a components block:

json
{
  "format_version": "1.10.0",
  "particle_effect": {
    "description": {
      "identifier": "snowstorm:fire",
      "basic_render_parameters": {
        "material": "particles_add",
        "texture": "textures/particle/moparticles/cube"
      }
    },
    "components": {
      "minecraft:emitter_rate_steady": {
        "spawn_rate": 45,
        "max_particles": 100
      },
      "minecraft:emitter_lifetime_looping": {
        "active_time": 1
      },
      "minecraft:emitter_shape_point": {
        "offset": ["math.random(-0.1, 0.15)", 0, "math.random(-0.1, 0.15)"]
      },
      "minecraft:particle_lifetime_expression": {
        "max_lifetime": "math.random(1, 1.5)"
      },
      "minecraft:particle_initial_speed": 0,
      "minecraft:particle_motion_dynamic": {
        "linear_acceleration": [0, 2.5, 0],
        "linear_drag_coefficient": 1
      },
      "minecraft:particle_appearance_billboard": {
        "size": [0.15, 0.15],
        "facing_camera_mode": "rotate_xyz",
        "uv": {
          "texture_width": 16,
          "texture_height": 16,
          "uv": [0, 0],
          "uv_size": [16, 16]
        }
      },
      "minecraft:particle_appearance_tinting": {
        "color": ["1.0", "0.85", "0.2", "1"]
      }
    }
  }
}

description

FieldTypeDescription
identifierstringThe effect ID, e.g. snowstorm:fire. This is what you use in commands and the API
basic_render_parameters.texturestringTexture path used for the effect, e.g. textures/particle/moparticles/cube
basic_render_parameters.materialstringparticles_add or particles_alpha

Supported components

ComponentPurpose
minecraft:emitter_initializationRun MoLang on emitter creation (creation_expression) — declare variable.* state
minecraft:emitter_lifetime_onceEmitter fires once (lifetime)
minecraft:emitter_lifetime_loopingEmitter loops for a duration (active_time)
minecraft:emitter_lifetime_expressionEmitter lifetime from a MoLang expression (max_lifetime)
minecraft:emitter_rate_steadySteady spawn rate (spawn_rate, max_particles)
minecraft:emitter_rate_instantBurst-spawn a fixed count (num_particles)
minecraft:emitter_rate_manualReserved for manual spawning (no auto-spawn)
minecraft:emitter_shape_pointSpawn at a point, with an optional offset
minecraft:emitter_shape_boxSpawn inside a box
minecraft:emitter_shape_sphereSpawn inside/around a sphere
minecraft:emitter_shape_discSpawn inside a disc
minecraft:emitter_shape_customCustom shape data
minecraft:emitter_shape_entity_aabbSpawn within an entity-sized box
minecraft:particle_initial_speedFixed initial speed, or a MoLang expression
minecraft:particle_initial_velocityInitial velocity vector (x/y/z, each a number or expression)
minecraft:particle_motion_dynamicAcceleration, drag, and wind (linear_acceleration, linear_drag_coefficient)
minecraft:particle_motion_parametricPosition/velocity/rotation curves over life (x, y, z curve objects)
minecraft:particle_appearance_billboardSize (constant or expression), facing mode, and UV layout
minecraft:particle_appearance_tintingRGB(A) color per particle — each channel may be a MoLang expression

Components present in a file but not in this table (for example minecraft:particle_initial_spin or minecraft:emitter_local_space) are ignored, which keeps Bedrock files valid.

MoLang support

Anywhere a value may be an expression, you can use:

  • Variablesvariable.particle_age, variable.particle_lifetime, variable.emitter_age, plus any variable.* you declare in emitter_initialization.
  • Math functions — the common MoLang set: math.random, math.sin, math.cos, math.abs, math.pow, math.sqrt, math.floor, math.ceil, math.clamp, math.lerp, math.log, etc.
  • Operators — standard arithmetic, comparison, and ternary (? :) operators.

For example, a classic fade-out tint:

json
"minecraft:particle_appearance_tinting": {
  "color": [
    "1.0 - 0.8 * (variable.particle_age / variable.particle_lifetime)",
    "0.85 * math.pow(1.0 - (variable.particle_age / variable.particle_lifetime), 2)",
    "0.2",
    "1 - (variable.particle_age / variable.particle_lifetime)"
  ]
}

Effect IDs

Commands and the API accept a few forms of an effect ID:

You typeResolves to
snowstorm:firesnowstorm:fire (exact match)
firemoparticles:fire (namespace defaults to moparticles), or any loaded ID ending in :fire
FIREcase-insensitive match

Adding your own textures

Texture files referenced by your effects are looked up in:

text
plugins/MoParticles/textures/particle/

Two textures ship by default: circle.png and cube.png. The generated resource pack includes everything it finds here, so a custom .png + a .json effect is all you need to add a brand-new look.

Full bundled example

The complete snowstorm:fire effect ships in the repository at src/main/resources/particles/fire.json — it's a good template: steady emission, a looping emitter, dynamic motion (upward acceleration + drag), and an age-based color tint.

Free, open-source software for Minecraft servers.