ItemEmitters.xml
Attaches ongoing visual emitters to an item worn by a player: a flare that sits on a wing bone, sparks that drip from a sword tip, lightning that arcs between two bones. Each <Emitter> row is one spawner anchored to one bone of the item's model. An item can have any number of rows.
This complements CustomItemVisual.xml (which controls the model itself — tint, glow color, additive pages) and ItemPageEffects.xml (which animates the model's own mesh pages). ItemEmitters adds new visuals around the model.
The file is optional. If it is absent or malformed, nothing is emitted and the server keeps running. The server sends the whole table to the client at login; the client does the rendering.
File Location#
Data/Plugins/Items/ItemEmitters.xml
Loaded once at GameServer startup.
Dependencies#
Type/Indexidentify the item, matching Item.xml.- Delivered to the client at login. A player who is already online needs to re-login to receive changes.
- Emitters render wherever the item's 3D model renders — worn on a character, dropped on the ground, and in inventory/shop 3D previews (the same behavior as vanilla wing effects, whose icons twinkle in the inventory).
- Emitters respect the wing particle distance limit (
ChromeLOD_MediumDistancein the client config): distant characters skip them, same as vanilla wing effects.
Configuration#
<ItemEmitters>
<!-- Soft violet flare on the cape anchor bone -->
<Emitter Type="12" Index="418" Bone="19" Kind="sprite" Bitmap="BITMAP_FLARE_BLUE"
R="153" G="76" B="204" Scale="1.2" />
<!-- Gold sparkles from a wing tip, one every 200ms -->
<Emitter Type="12" Index="418" Bone="30" Kind="particle" Bitmap="BITMAP_SHINY+4"
R="255" G="200" B="60" Scale="0.8" Rate="200" Offset="0,0,10" />
<!-- Lightning arc between two bones -->
<Emitter Type="12" Index="420" Bone="9" BoneTo="20" Kind="joint" Bitmap="BITMAP_JOINT_THUNDER"
R="150" G="150" B="230" Scale="1.0" />
<!-- Thunder strike effect model, roughly twice per second -->
<Emitter Type="12" Index="420" Bone="11" Kind="effect" Effect="MODEL_FENRIR_THUNDER"
R="153" G="153" B="230" SubType="1" Rate="500" />
</ItemEmitters>
Attributes#
| Attribute | Required | Default | Description |
|---|---|---|---|
Type / Index | yes | — | Item identity (same as Item.xml) |
Bone | yes | 0 | Bone index of the item's BMD the emitter is anchored to |
BoneTo | joints only | unused | Second bone — the other end of a joint beam |
Kind | yes | — | sprite, particle, effect, or joint (see below) |
Bitmap | kind ≠ effect | — | Texture asset name from the catalog below |
Effect | kind = effect | — | Effect model name from the catalog below |
R G B | no | 255,255,255 | Color tint, 0–255. Most effect textures are white/grayscale, so this IS the effect's color |
Scale | no | 1.0 | Size. Sprites: world size multiplier. Particles/effects: spawn scale. Joints: beam width multiplier |
Rate | no | 0 | Milliseconds between spawns. 0 = once per game tick (25/sec). Ignored by sprites (they are cheap per-frame draws) |
Offset | no | 0,0,0 | "x,y,z" offset from the bone, in the bone's local space |
Speed | no | 0 | Sprites only: continuous rotation speed |
SubType | no | 0 | Behavior variant of the asset (see catalog notes) |
Worked example: Wings of Satan#
The shipped ItemEmitters.xml includes a complete example on Wings of Satan (Type 12, Index 2): steady demonic glows at the wing tips, flame licks on the membranes, and embers off the spine.
Step 1 — find the bones. Wear the item and use the $bones chat command, or open the BMD in the MU Online BMD Viewer. For Wing03.bmd: bones 2/3 carry the right wing, 6/7 the left wing, 0 the spine.
Step 2 — place emitters on those bones:
<!-- Steady demonic glow at each upper wing tip -->
<Emitter Type="12" Index="2" Bone="3" Kind="sprite" Bitmap="BITMAP_LIGHT"
R="255" G="60" B="20" Scale="0.9" />
<Emitter Type="12" Index="2" Bone="7" Kind="sprite" Bitmap="BITMAP_LIGHT"
R="255" G="60" B="20" Scale="0.9" />
<!-- Flame licks: particles use the BASE name; the variant comes from SubType -->
<Emitter Type="12" Index="2" Bone="2" Kind="particle" Bitmap="BITMAP_FLAME"
SubType="0" R="255" G="120" B="30" Scale="0.5" Rate="180" />
<Emitter Type="12" Index="2" Bone="6" Kind="particle" Bitmap="BITMAP_FLAME"
SubType="6" R="255" G="100" B="25" Scale="0.5" Rate="230" />
<!-- Occasional ember off the spine (SPARK+1 is a standalone particle type) -->
<Emitter Type="12" Index="2" Bone="0" Kind="particle" Bitmap="BITMAP_SPARK+1"
R="255" G="170" B="50" Scale="0.8" Rate="350" />
Design notes worth copying:
- One
spriteper anchor carries the "always on" identity (cheap, steady, never flickers);particlerows add motion on top. - The two flames use different
Ratevalues (180/230) and differentSubTypes so they never spawn in lockstep — synchronized emitters read as mechanical. - Total budget: two per-frame sprites + ~14 particles/second. Safe even with a dozen players wearing it on screen.
Step 3 — tune in game. Wear the item, edit numbers, restart GS, re-login. Scale on sprites is world size; on particles it feeds each type's own size roll, so expect to iterate.
The four kinds#
| Kind | What it is | Cost guidance |
|---|---|---|
sprite | A camera-facing glow quad redrawn every frame at the bone. The standard "shining point" on vanilla wings. Steady, never flickers | Cheapest. Use freely |
particle | A spawned puff that lives its own life after spawning (drifts, fades). Smoke, sparkles, embers | Use Rate of 100+ ms. Each spawn takes a pool slot |
effect | A full 3D effect model instance (thunder bolt, shockwave). Heaviest visual | Use Rate of 300+ ms |
joint | A textured beam/trail between Bone and BoneTo (or a flicker at one bone if BoneTo is omitted) | One per row is maintained continuously |
Asset catalog#
These are the asset names the client accepts. A row with any other name is dropped at login and logged to the client console ([ItemEmitters] Unknown asset name), so a typo never crashes anything — the emitter just doesn't appear.
Family textures accept a +N frame suffix (e.g. BITMAP_SHINY+4) — different frames are genuinely different pictures, worth previewing in game.
Textures for sprite and particle#
| Name | Variants | What it looks like |
|---|---|---|
BITMAP_LIGHT | — | Soft round glow ball. The workhorse — 90% of vanilla wing shine is this with a color tint |
BITMAP_PIN_LIGHT | — | Star-shaped glint with rays. Use Speed to rotate it |
BITMAP_SHINY | +0…+6 | Sparkle/glint family. +1 small twinkle, +4 four-point star, +6 big soft glow |
BITMAP_SPARK | +0…+4 | Small hard sparks. +1 is the classic drifting spark used by weapon effects |
BITMAP_FLARE | +0…+1 | Lens-flare style burst |
BITMAP_FLARE_BLUE | — | Cold blue flare (tintable) |
BITMAP_FLARE_RED | — | Warm red flare |
BITMAP_FLARE_FORCE | — | Dense energy flare |
BITMAP_CLUD64 | — | Wispy cloud puff. The dark-smoke aura on high-tier vanilla wings |
BITMAP_SMOKE | +0…+4 | Smoke puffs (particle only — they drift upward) |
BITMAP_EVENT_CLOUD | — | Larger rolling cloud |
BITMAP_FLAME | +0…+4 (sprite only) | Fire. As a particle use the base name: SubType 0 = rising flame lick, 6 = faster short flame, 7/8 = ember shower |
BITMAP_TRUE_FIRE | — | Animated fire (particle; SubType 8/9 are the vanilla halloween torch behaviors) |
BITMAP_ENERGY | +0…+9 | Energy wisp frames |
BITMAP_LIGHTNING | +0…+4 | Lightning flash frames (sprite: use Speed for crackle rotation) |
BITMAP_MAGIC | +0…+2 | Magic circle/rune glyphs |
BITMAP_MAGIC_CIRCLE | — | Full magic circle (looks best as a slow-rotating sprite with Speed) |
Textures for joint#
| Name | What it looks like |
|---|---|
BITMAP_JOINT_SPARK | Spark trail beam |
BITMAP_JOINT_ENERGY | Energy ribbon |
BITMAP_JOINT_THUNDER | Lightning arc (the vanilla Wings of Storm crackle) |
Effect models for effect#
| Name | What it does | Useful SubType |
|---|---|---|
MODEL_FENRIR_THUNDER | Vertical lightning strike at the bone | 1 = the small wing-crackle variant |
MODEL_STAR_SHINE | Twinkling star burst | 0 |
MODEL_SHOCKWAVE01 | Expanding ground shockwave ring | 0 |
MODEL_WINDFOCE | Swirling wind vortex | 2 = the buff-cast swirl |
Important Behavior#
- Rate and smoothness.
Rate="0"spawns once per 25Hz game tick — that is the vanilla effect density and frame-rate independent. Millisecond rates are also frame-rate independent. There is no way to spawn faster than once per frame, and no need to. - Multiple rows stack. Ten rows on one item = ten emitters running at once. The client's particle pool is shared with everything else on screen (3000 slots) — a crowded event square full of players wearing 20-emitter items will visibly eat the pool. Prefer a few well-placed emitters over bone-spam.
- Joints self-maintain. A
jointrow keeps exactly one beam alive (it is re-created each tick internally). You do not needRateon joints. - Color is multiplicative.
R/G/Btints the texture. White textures take any color; colored textures (e.g.BITMAP_FLARE_RED) mix with the tint. - No emitters on RF sword-form glove hands? They work — the client maps the left/right hand models back to the owning glove item automatically.
- Changes need a re-login, like every login-synced table.
/reloadalone does not refresh what already-online clients render.
Common Issues#
| Symptom | Cause |
|---|---|
| Emitter never appears | Check the client console for [ItemEmitters] Unknown asset name (typo or non-catalog asset), or Bone is past the model's last bone (use $bones) |
particle row accepted but invisible | Used a +N frame name (e.g. BITMAP_FLAME+1). Particles need the base name + SubType; +N is sprite-only |
| Inventory icon twinkles and I don't want that | Emitters follow the model everywhere, like vanilla wing effects. Prefer subtle Scale/Rate values for items that sit in shops |
| Vanishes when I walk away from another player wearing it | The wing particle distance limit — same behavior as vanilla wing effects |
| Whole row list missing after editing the XML | Malformed XML: the file failed to parse and the server synced nothing. Validate the XML |
| Effect spam / FPS drop in crowds | Too many particle/effect rows with Rate="0". Raise Rate, or convert steady glows to sprite |