Particles¶
Quick Start: Spice it up with twists.
Draw particle shapes with one tag per shape. Every group takes its
geometry first and a settings list last, emits once, and leaves
nothing behind. The one-line forms live in the
cheatsheet.
Use particles sparingly
Every point spawns per viewer in range, so long lines at tight spacing on fast intervals add up quickly. Keep shapes short, spacing wide, and intervals slow; prefer one system over many.
Groups¶
| Tag | Meaning |
|---|---|
<particles.line:p1,p2,settings> |
Line from p1 to p2, empty. |
<particles.l:p1,p2,settings> |
Alias of particles.line. |
<particles.line2d:p1,p2,settings> |
Flat line over [x, z] pairs, empty. |
<particles.point:p,settings> paid |
One particle at p, empty. |
<particles.players:a,b,settings> paid |
Line between two players, empty. |
<particles.sphere:point,radius,settings> paid |
Ball surface, empty. |
<particles.circle:p1,p2,settings> paid |
Ring with p1 and p2 as diameter ends, empty. |
<particles.circle2d:point,radius,settings> paid |
Flat ring, empty. |
<particles.rectangle:pos1,pos2,settings> paid |
Flat wireframe (2D only), empty. |
<particles.box:pos1,pos2,settings> paid |
Wireframe box, empty. |
<particles.cube:pos,scale,anchor,settings> paid |
Anchored cube (3D only), empty. |
<particles.block:pos,settings> paid |
One block outline, empty. |
<particles.fountain:origin,height,spread,settings> paid |
Jet fountain, empty. |
<particles.cancel:id> paid |
Cancel the system with that id, empty. |
parts. aliases the whole namespace, so <parts.line:...> works
everywhere <particles.line:...> does. .l aliases .line only;
the 2D line keeps its explicit .line2d head.
<particles.line:[0,64,0],[8,64,0],dust> draws a dust line and
<parts.sphere:[0,64,0],3,[flame, 0.3]> draws a flame ball with
wider spacing. Points are strict 3D [x, y, z] triples; located
6-lists [x, y, z, world, pitch, yaw] additionally pin the world
(see below). Malformed geometry warns and draws nothing.
Settings¶
Settings are positional [style, spacing, mode, id, spawner]; pass
leading items only and the rest take defaults. A bare value reads
as the style, so dust equals [dust]. Blank items take defaults
silently; malformed items warn once per match and take defaults.
| Index | Name | Shape | Default |
|---|---|---|---|
| 0 | style | dust, or [dust, 6b4c33] with a hex color |
DUST |
| 1 | spacing | Blocks between particles, floors at 0.05 | 0.2 |
| 2 | mode | interval, wave, fountain, or [wave/fountain, velocity, t] |
interval |
| 3 | id | String, scoped to the calling modifier | none |
| 4 | spawner | [duration, interval, use-random], or null |
none (one shot) |
Style names are case-blind (dust, DUST, minecraft:dust) and
colors take hex with or without # (6b4c33, #6b4c33, short
fff). Dust takes the color as dust data (red when omitted) and
effect / instant_effect tint through the count-0 protocol
(white when omitted); other dataless particles ignore the color
silently. <random-color> draws a uniform six-digit hex for those
color slots ([dust, <random-color>]). Unknown particle names warn
and draw nothing.
Particles whose data the settings cannot express (such as block
or item particles) warn and draw nothing. Scalar-data particles
(dragon_breath, sculk_charge, shriek) emit with neutral
defaults (power 1.0, delay 0).
[[dust, 6b4c33], 0.1, [wave, 10, 0], ray, [-1, 0.25, true]] reads
as brown dust every 0.1 blocks, a wave at 10 blocks per second from
pos1, id ray, respawning every 0.25 seconds with random spread
until cancelled. Wave velocity defaults to 20 blocks per second
and start t (0 is pos1, 1 is pos2) defaults to 0. Spawner
duration is seconds, -1 runs until <particles.cancel:id>
cancels it; the interval floors at 0.05 seconds.
Spawners¶
Without a spawner the tag emits once and finishes. With
[duration, interval, use-random] the system re-emits every
interval: duration is seconds, -1 runs until
<particles.cancel:id> cancels it, the interval floors at 0.05
seconds, and use-random re-spreads the shape per trigger (see
below). Registering paints immediately; re-registering the same
id re-arms the ticker from zero. Finite systems end themselves;
infinite ones need an id, else they warn once and emit once.
Ids live in the calling modifier namespace (engine: ids belong
to engine systems), so two modifiers can reuse ray without
colliding. Cancel is idempotent: unknown or finished ids are a
silent no-op. Match systems die with the match; global engine
systems persist until cancelled.
Waves¶
Mode wave reveals the shape progressively instead of all at
once: progress runs 0 to 1 along the traversal axis at velocity
blocks per second, and start t picks the origin. t 0 starts
at pos1 (line start, sphere top, circle ref), t 1 starts at
the far end, and anything between waves both ways from t.
Waves never bounce: at progress 1 the full shape shows.
Per-shape axes are deterministic:
| Shape | Axis u | Traversal length |
|---|---|---|
| line | pos1 0 to pos2 1 | length |
| sphere | top pole 0 to bottom pole 1 | diameter |
| circle | angle fraction from the ref direction | circumference |
| rectangle, box | min corner 0 to max corner 1 along the diagonal | diagonal |
Point and computed shapes have no axis, so wave mode on them
warns once and emits the full shape. One-shot waves (no
spawner) run a transient ticker and end themselves, cancellable
by id while running. Spawner waves restart every interval:
each trigger re-spreads (when random), resets to t, and
reveals again; a wave that completes early holds its final
frame until the next trigger.
Random spread¶
Spawner use-random applies one rigid transform per trigger, held across the wave reveal until the next trigger. Lines offset up to 1 block and carve points falling off the segment; spheres rotate; circles spin about their normal; rectangles, boxes, and cubes shift whole without carving; points jitter within a half-block cube. Flat (2D) shapes spread on the XZ plane. Spacing between surviving particles is preserved.
Worlds¶
Geometric tags draw in the world of the first located endpoint, else in the dispatch world (the executor world, or the first online participant world for runs without an executor). Requests with no world warn and draw nothing.
<particles.players:alice,bob,settings> draws a feet-to-feet line
if and only if both players are online in the same world;
offline players and cross-world pairs skip silently, since player
presence is runtime state rather than author error.
Flat shapes¶
2D groups accept [x, z] pairs, triples, and located 6-lists.
Triples keep their middle Y as the shape height; pure pairs rest
at y 63 (vanilla sea level). <particles.rectangle:[0,0],[4,4],dust>
frames a 4 by 4 outline at y 63, while
<particles.line2d:[0,70,0],[4,4],dust> slopes from y 70 down to
y 63. Rectangles use the first corner height.
Cube, block, and circle¶
<particles.cube:pos,scale,anchor,settings> anchors a wireframe
cube: cubeMin = pos - anchor * scale, then plus scale. The scale
is a uniform number or a per-axis triple (every axis positive);
the anchor is a unit-cube triple defaulting to [0.5, 0.5, 0.5]
(centered) and clamps to 0..1 with a warning. The anchor is
optional, so arities 3 and 4 both work.
<particles.block:pos,settings> snaps the point to its block
center (floor plus 0.5 per axis) and outlines that strict 1x1x1
cube; use cube for anything bigger or offset.
<particles.circle:p1,p2,settings> treats p1 and p2 as diameter
endpoints: the center is the midpoint, the radius is half the
distance, and the ring plane is perpendicular to p2 minus p1.
Coincident points warn and draw nothing.
Fountain¶
<particles.fountain:origin,height,spread,settings> jets
particles upward from the origin: height sets the jet height in
blocks and spread its width, both positive (other values warn
and draw nothing). The bare fountain settings mode loops any
shape's traversal instead of finishing it, like a wave that
restarts at the top forever; give the system an id and cancel
it, or bound it with a spawner duration. Both the shape and the
mode are premium: free falls back to interval with a warning.
Limits¶
Shapes cap at 4096 points per emission; larger shapes resample
deterministically and warn once per match, so widen spacing when
that warning appears. Each point tests individually against
particles.max-visible-distance,
so standing at the end of a long line still shows the near
points while far shapes skip entirely, which keeps far viewers
free.