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 / Index identify 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_MediumDistance in 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#

AttributeRequiredDefaultDescription
Type / Indexyes—Item identity (same as Item.xml)
Boneyes0Bone index of the item's BMD the emitter is anchored to
BoneTojoints onlyunusedSecond bone — the other end of a joint beam
Kindyes—sprite, particle, effect, or joint (see below)
Bitmapkind ≠ effect—Texture asset name from the catalog below
Effectkind = effect—Effect model name from the catalog below
R G Bno255,255,255Color tint, 0–255. Most effect textures are white/grayscale, so this IS the effect's color
Scaleno1.0Size. Sprites: world size multiplier. Particles/effects: spawn scale. Joints: beam width multiplier
Rateno0Milliseconds between spawns. 0 = once per game tick (25/sec). Ignored by sprites (they are cheap per-frame draws)
Offsetno0,0,0"x,y,z" offset from the bone, in the bone's local space
Speedno0Sprites only: continuous rotation speed
SubTypeno0Behavior 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 sprite per anchor carries the "always on" identity (cheap, steady, never flickers); particle rows add motion on top.
  • The two flames use different Rate values (180/230) and different SubTypes 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#

KindWhat it isCost guidance
spriteA camera-facing glow quad redrawn every frame at the bone. The standard "shining point" on vanilla wings. Steady, never flickersCheapest. Use freely
particleA spawned puff that lives its own life after spawning (drifts, fades). Smoke, sparkles, embersUse Rate of 100+ ms. Each spawn takes a pool slot
effectA full 3D effect model instance (thunder bolt, shockwave). Heaviest visualUse Rate of 300+ ms
jointA 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#

NameVariantsWhat 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…+6Sparkle/glint family. +1 small twinkle, +4 four-point star, +6 big soft glow
BITMAP_SPARK+0…+4Small hard sparks. +1 is the classic drifting spark used by weapon effects
BITMAP_FLARE+0…+1Lens-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…+4Smoke 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…+9Energy wisp frames
BITMAP_LIGHTNING+0…+4Lightning flash frames (sprite: use Speed for crackle rotation)
BITMAP_MAGIC+0…+2Magic circle/rune glyphs
BITMAP_MAGIC_CIRCLE—Full magic circle (looks best as a slow-rotating sprite with Speed)

Textures for joint#

NameWhat it looks like
BITMAP_JOINT_SPARKSpark trail beam
BITMAP_JOINT_ENERGYEnergy ribbon
BITMAP_JOINT_THUNDERLightning arc (the vanilla Wings of Storm crackle)

Effect models for effect#

NameWhat it doesUseful SubType
MODEL_FENRIR_THUNDERVertical lightning strike at the bone1 = the small wing-crackle variant
MODEL_STAR_SHINETwinkling star burst0
MODEL_SHOCKWAVE01Expanding ground shockwave ring0
MODEL_WINDFOCESwirling wind vortex2 = 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 joint row keeps exactly one beam alive (it is re-created each tick internally). You do not need Rate on joints.
  • Color is multiplicative. R/G/B tints 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. /reload alone does not refresh what already-online clients render.

Common Issues#

SymptomCause
Emitter never appearsCheck 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 invisibleUsed 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 thatEmitters 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 itThe wing particle distance limit — same behavior as vanilla wing effects
Whole row list missing after editing the XMLMalformed XML: the file failed to parse and the server synced nothing. Validate the XML
Effect spam / FPS drop in crowdsToo many particle/effect rows with Rate="0". Raise Rate, or convert steady glows to sprite

Last updated August 2, 2026