The emitter is the invisible spawner behind every particle effect. Its components decide when it runs, how many particles it makes and where they start. They all go in the components block of a particle file, next to the particle components.
New to particles? Start with Your first particle, which builds a full ruby sparkle step by step.
What every emitter needs
An emitter needs one lifetime component and one rate component, or it will not spawn anything. A shape is optional: without one, particles start at the centre of the emitter. Use only one component from each of these groups.
Most number fields on this page accept either a plain number or a Molang string like "math.random(1, 3)". The tables mark when a field is worked out: once when the emitter starts, per loop, or per particle each time one spawns.
Setup
These run before anything spawns. You can use them together with any other components.
| Component | What it does | Key fields |
|---|---|---|
minecraft:emitter_initialization | Runs Molang on the emitter, mostly to set your own variables that other fields read later | creation_expression: runs once when the emitter starts. per_update_expression: runs on every update |
minecraft:emitter_local_space | For effects attached to a mob: choose whether particles move along with the mob or stay where they were born | position, rotation, velocity (all true or false, default false) |
Setting variables
emitter_initialization is the place to roll a random number once and share it with every particle:
"minecraft:emitter_initialization": {
"creation_expression": "variable.ruby_hue = math.random(0.2, 0.4);"
}Every particle from this emitter can now read variable.ruby_hue, for example in its tint.
Local space
By default, particles start at the emitter and then live on their own in the world. If a mob walks away, its old particles stay behind, like a trail.
position: truemakes particles move with the mob. Use it for a glow that should stay wrapped around it.rotation: truealso turns them with the mob. It only works together withposition: true.velocity: trueadds the mob's speed to each new particle, so sparks thrown by a running mob fly forward.
"minecraft:emitter_local_space": {
"position": true,
"rotation": true
}Only for attached effects
Local space does nothing for effects played with /particle or a script at a spot in the world. It only matters when a mob or attachable plays the effect.
Rate
The rate decides how many particles appear and how fast. Pick one.
| Component | What it does | Key fields |
|---|---|---|
minecraft:emitter_rate_instant | Spawns a group of particles all at the same moment, like a burst | num_particles (default 10, per loop) |
minecraft:emitter_rate_steady | Spawns particles one after another, at an even pace | spawn_rate: particles per second (default 1). max_particles: most alive at one time (default 50) |
minecraft:emitter_rate_manual | Spawns nothing by itself. The game spawns particles one by one when it needs them | max_particles (default 50) |
Instant: a burst
"minecraft:emitter_rate_instant": {
"num_particles": 12
}If the emitter loops, it bursts again at the start of each loop.
Steady: a stream
"minecraft:emitter_rate_steady": {
"spawn_rate": 20,
"max_particles": 40
}This makes 20 particles per second, but stops adding new ones while 40 are alive. max_particles is a safety limit: keep it low, because hundreds of particles can slow down weaker phones.
Manual: for events
emitter_rate_manual is used by built-in effects that the game spawns one particle at a time, like rain splashes. For your own effects, you will mostly use it for small effects that other effects spawn with an event of type particle (see events). For anything you play yourself, use instant or steady.
Lifetime
The lifetime decides how long the emitter keeps working. Pick one, then add lifetime events if you need them.
| Component | What it does | Key fields |
|---|---|---|
minecraft:emitter_lifetime_once | Runs one time, then removes itself | active_time: seconds it spawns for (default 10) |
minecraft:emitter_lifetime_looping | Runs, pauses, runs again, until something removes it | active_time: seconds on (default 10). sleep_time: seconds off between loops (default 0) |
minecraft:emitter_lifetime_expression | Turns on and off by Molang, checked every frame | activation_expression: spawns while this is not 0 (default 1). expiration_expression: removes the emitter once this is not 0 (default 0) |
minecraft:emitter_lifetime_events | Fires your events at moments in the emitter's life | creation_event, expiration_event, timeline, travel_distance_events, looping_travel_distance_events |
Once
The best choice for a one-time effect from a command or script:
"minecraft:emitter_lifetime_once": {
"active_time": 1
}With emitter_rate_instant, the burst happens at the start, so active_time can be short.
Looping
"minecraft:emitter_lifetime_looping": {
"active_time": 2,
"sleep_time": 3
}This sparkles for 2 seconds, rests for 3, and repeats. Use looping for effects attached to a mob or played from an animation controller, where the game removes the emitter for you when the mob or state goes away.
Expression
Great for effects that follow a mob and switch on and off by themselves:
"minecraft:emitter_lifetime_expression": {
"activation_expression": "query.ground_speed > 0.1",
"expiration_expression": 0
}This only sparkles while the mob is walking, and never removes itself. Queries like query.ground_speed read the mob the effect is attached to.
Events
emitter_lifetime_events points at names in the events block of the same file. Each field takes one event name or a list of names.
"minecraft:emitter_lifetime_events": {
"creation_event": "flash",
"expiration_event": "pop",
"timeline": {
"0.5": "twinkle",
"1.0": ["twinkle", "chime"]
},
"travel_distance_events": {
"4.0": "dust"
},
"looping_travel_distance_events": [
{ "distance": 1.0, "effects": ["dust"] }
]
}| Field | Fires |
|---|---|
creation_event | When the emitter starts |
expiration_event | When the emitter ends. It does not wait for its particles to disappear |
timeline | At these times, in seconds. It runs again on every loop |
travel_distance_events | Once, when the emitter has moved this many blocks in total |
looping_travel_distance_events | Again and again, every time it moves this many blocks. Perfect for footprints or a trail behind a projectile |
Shape
The shape decides where each particle starts and which way it points. That direction is what particle_initial_speed pushes it along. Pick one.
| Component | Particles start | Key fields |
|---|---|---|
minecraft:emitter_shape_point | All at one point | offset, direction |
minecraft:emitter_shape_sphere | Inside a ball, or on its surface | radius (default 1), offset, surface_only, direction |
minecraft:emitter_shape_box | Inside a box, or on its surface | half_dimensions, offset, surface_only, direction |
minecraft:emitter_shape_disc | On a flat circle, or on its edge | radius (default 1), plane_normal, offset, surface_only, direction |
minecraft:emitter_shape_custom | Wherever your Molang says | offset, direction |
minecraft:emitter_shape_entity_aabb | Inside the box around the mob it is attached to | surface_only, direction |
Fields shared by the shapes
| Field | What it does |
|---|---|
offset | Moves the starting spot away from the emitter, as [x, y, z] in blocks. Worked out per particle, so Molang here can scatter them |
direction | Which way new particles point. "outwards" (away from the centre, the default), "inwards" (towards it), or your own [x, y, z] |
surface_only | true spawns only on the outside of the shape, not inside it. Default false |
The point and custom shapes only take an [x, y, z] direction, because they have no centre to point away from.
Point
"minecraft:emitter_shape_point": {
"offset": [0, 0.5, 0],
"direction": [0, 1, 0]
}Every particle starts half a block above the emitter and points straight up.
Sphere
"minecraft:emitter_shape_sphere": {
"radius": 0.5,
"surface_only": true,
"direction": "outwards"
}A hollow ball of sparkles that flies apart. Try "inwards" with a short lifetime for a "gathering power" effect.
Box
"minecraft:emitter_shape_box": {
"offset": [0, 0.5, 0],
"half_dimensions": [0.5, 0.5, 0.5],
"direction": [0, 1, 0]
}half_dimensions is measured from the centre, so 0.5 on every side fills exactly one block. Good for an effect that covers a whole block, like a glowing ore.
Disc
"minecraft:emitter_shape_disc": {
"radius": 1.5,
"plane_normal": "y",
"surface_only": true,
"direction": "outwards"
}plane_normal is the axis the disc faces. "y" (the default) makes it lie flat like a rug, "x" and "z" stand it up like a wall. You can also give your own [x, y, z]. This example makes a ring on the ground that spreads outwards: a nice landing effect.
Custom
"minecraft:emitter_shape_custom": {
"offset": [
"math.random(-0.1, 0.1)",
"math.random(0, 2)",
"math.random(-0.1, 0.1)"
],
"direction": [0, 1, 0]
}With a custom shape, you work out the spot yourself, as [x, y, z]. This places each particle at a random height up to 2 blocks, but keeps it close to the middle sideways: a thin pillar of sparkles, like a beam of light. Each value is worked out again for every particle.
Entity box
"minecraft:emitter_shape_entity_aabb": {
"surface_only": false,
"direction": [0, 0.2, 0]
}This uses the mob's own hitbox (its collision box), so the same effect fits a chicken and a ruby golem without changes. If the effect is not attached to a mob, the particles come out of the emitter's point instead.
A full emitter
Putting one of each group together. This aura loops while a mob is around and sticks to it:
"minecraft:emitter_local_space": {
"position": true,
"rotation": false
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_rate_steady": {
"spawn_rate": 8,
"max_particles": 20
},
"minecraft:emitter_shape_entity_aabb": {
"surface_only": true,
"direction": [0, 1, 0]
}Add the particle side (lifetime, look and motion) from Particle components and play it from a mob's animation, as shown in Your first particle.