Skip to content

Particles & Visuals

Titan integrates with Cobblemon’s Snowstorm particle system to reuse existing battle effects, ensuring visual consistency and reducing resource creation overhead.

The particle_effect() MoLang helper supports automatic fallback:

  1. Check Vanilla Registry - Try minecraft: particles first
  2. Fallback to Snowstorm - If not vanilla, send SpawnSnowstormParticlePacket
  3. Radius Inference - Calculates render radius from spread parameter (clamped 16-96 blocks)
// Vanilla particle
q.particle_effect('minecraft:flame', q.position(0), 50, 2.0);
// Cobblemon snowstorm particle (automatic fallback)
q.particle_effect('cobblemon:thunder_actorcloud', q.position(0), 100, 4.0);
// Position offset (x+0, y+1.5, z+0)
q.particle_effect('cobblemon:flame_burst', q.position(0) + [0, 1.5, 0], 80, 3.0);
ParameterTypeDescription
idStringParticle identifier (vanilla or Cobblemon)
posVec3Spawn position (use q.position(0) for entity center)
countNumberNumber of particles to spawn
spreadNumberSpread radius (also determines render distance)

Cobblemon includes a wide variety of particles for different move types and effects.

IdentifierTypeBest ForUsed In
cobblemon:thunder_actorcloudElectricLightning strikes, electric fieldsRaichu (all moves)
cobblemon:flame_burstFireExplosions, fire attacksCharizard, Arcanine
cobblemon:water_pulseWaterWater impacts, aquatic attacksBlastoise, Gyarados
cobblemon:psychic_ringsPsychicMental attacks, teleportationMewtwo, Alakazam
cobblemon:ghost_wispGhostGhost-type movesGengar, Mimikyu
cobblemon:dragon_breathDragonDragon-type attacksRayquaza, Dragonite
cobblemon:ice_shardIceIce attacks, freezingArticuno, Lapras
cobblemon:rock_smashRockImpact, ground attacksAggron
cobblemon:leaf_stormGrassNature attacksSceptile, Venusaur
cobblemon:electric_sparkElectricSmall electric effectsPikachu, Raikou
{
"type": "titan:server_molang",
"startTicks": 32,
"expression": "q.particle_effect('cobblemon:thunder_actorcloud', q.position(0) + [0, 2.5, 0], 200, 5.0)"
}

Effect: Spawns thunder cloud 2.5 blocks above Raichu with 5-block spread.

{
"type": "titan:server_molang",
"startTicks": 18,
"expression": "q.particle_effect('cobblemon:thunder_actorcloud', q.position(0), 180, 3.5)"
}

Effect: Electric field centered on Raichu during powerup.

{
"type": "titan:server_molang",
"startTicks": 10,
"expression": "q.particle_effect('cobblemon:flame_burst', q.position(0) + [0, 1.0, 0], 120, 2.5)"
}

Effect: Flame explosion 1 block above Ceruledge during charge-up.

Titan also supports all vanilla Minecraft particles:

IdentifierBest For
minecraft:flameSmall fires, trails
minecraft:large_smokeExplosions, impact clouds
minecraft:electric_sparkSmall electric zaps
minecraft:explosionLarge explosions
minecraft:fireworkCelebratory effects
minecraft:enchantMagic effects
minecraft:portalTeleportation
minecraft:soul_fire_flameGhost/dark effects
minecraft:dripping_lavaMolten effects
minecraft:end_rodBeams, projectiles
{
"type": "titan:server_molang",
"startTicks": 0,
"expression": "q.particle_effect('minecraft:explosion', q.position(0), 1, 0.0)"
}

Vulnerability windows spawn visual feedback particles:

VulnerabilityParticleColor
RECOVERINGHappy VillagerGreen sparkles
EXHAUSTEDAngry VillagerRed clouds
STUNNEDElectric SparkYellow lightning

Ground markers use colored particles to warn of attack zones:

SeverityColorParticleDuration
WARNINGYellowminecraft:flame0.6-1.0s
DANGEROrangeminecraft:lava0.8-1.2s
CRITICALRedminecraft:soul_fire_flame1.2-1.8s

See Telegraph System for details.

Use MoLang position queries for precise particle placement:

// Entity center
q.position(0)
// Returns: [x, y, z] array
// Individual components
q.position(1) // X coordinate
q.position(2) // Y coordinate
q.position(3) // Z coordinate
// Offset examples
q.position(0) + [0, 2.0, 0] // 2 blocks above
q.position(0) + [1.5, 0, 0] // 1.5 blocks to the side
q.position(0) + [0, -0.5, 0] // 0.5 blocks below

Spawn particles in a circle around the entity:

// Not directly supported - use ActionEffect timeline with multiple keyframes

Alternative: Use multiple server_molang keyframes at staggered ticks:

{
"keyframes": [
{
"type": "titan:server_molang",
"startTicks": 0,
"expression": "q.particle_effect('cobblemon:flame_burst', q.position(0) + [2, 0, 0], 20, 0.5)"
},
{
"type": "titan:server_molang",
"startTicks": 2,
"expression": "q.particle_effect('cobblemon:flame_burst', q.position(0) + [-2, 0, 0], 20, 0.5)"
},
{
"type": "titan:server_molang",
"startTicks": 4,
"expression": "q.particle_effect('cobblemon:flame_burst', q.position(0) + [0, 0, 2], 20, 0.5)"
},
{
"type": "titan:server_molang",
"startTicks": 6,
"expression": "q.particle_effect('cobblemon:flame_burst', q.position(0) + [0, 0, -2], 20, 0.5)"
}
]
}

Particles that ascend over time:

{
"keyframes": [
{
"type": "titan:server_molang",
"startTicks": 0,
"expression": "q.particle_effect('minecraft:flame', q.position(0) + [0, 0.5, 0], 10, 0.3)"
},
{
"type": "titan:server_molang",
"startTicks": 4,
"expression": "q.particle_effect('minecraft:flame', q.position(0) + [0, 1.5, 0], 10, 0.3)"
},
{
"type": "titan:server_molang",
"startTicks": 8,
"expression": "q.particle_effect('minecraft:flame', q.position(0) + [0, 2.5, 0], 10, 0.3)"
}
]
}

Multiple particles at impact:

{
"type": "titan:server_molang",
"startTicks": 25,
"expression": "q.particle_effect('minecraft:explosion', q.position(0), 3, 0.5); q.particle_effect('minecraft:large_smoke', q.position(0), 40, 2.0); q.particle_effect('minecraft:flame', q.position(0), 60, 2.5)"
}

Note: Multiple q.particle_effect() calls in one expression execute sequentially.

Combine particles with sounds for complete effect:

q.particle_effect('cobblemon:thunder_actorcloud', q.position(0), 150, 4.0);
q.play_sound('minecraft:entity.lightning_bolt.thunder', 0.9, 1.2)

Reference: See MoLang Effect Functions.

  1. Count Limits - Keep particle counts reasonable (20-200 per effect)
  2. Spread Radius - Larger spreads affect more clients (16-96 block render distance)
  3. Frequency - Avoid spawning every tick; use keyframe timing (every 4-10 ticks)
  4. Client Performance - Dense particles (>500 in area) can lag low-end clients
{
"keyframes": [
// Initial burst (high count, rare)
{
"type": "titan:server_molang",
"startTicks": 0,
"expression": "q.particle_effect('cobblemon:flame_burst', q.position(0), 200, 5.0)"
},
// Sustained effect (low count, frequent)
{
"type": "titan:server_molang",
"startTicks": 10,
"expression": "q.particle_effect('minecraft:flame', q.position(0) + [0, 1.5, 0], 8, 1.0)"
},
{
"type": "titan:server_molang",
"startTicks": 16,
"expression": "q.particle_effect('minecraft:flame', q.position(0) + [0, 1.5, 0], 8, 1.0)"
},
{
"type": "titan:server_molang",
"startTicks": 22,
"expression": "q.particle_effect('minecraft:flame', q.position(0) + [0, 1.5, 0], 8, 1.0)"
}
]
}

If particles don’t appear:

  1. Check Identifier - Verify the particle ID is correct
  2. Verify Position - Use q.position(0) returns valid coordinates
  3. Check Render Distance - Client may be too far (spread × 2 = max distance)
  4. Server Logs - Look for particle-related errors
MoveParticles Used
Storm Callcobblemon:thunder_actorcloud
Thunderstrikecobblemon:electric_spark
Chain Lightningcobblemon:thunder_actorcloud + minecraft:electric_spark
Discharge Novacobblemon:thunder_actorcloud (large spread)
Lightning Dashminecraft:electric_spark (trail)
Gigavolt Havoccobblemon:thunder_actorcloud (massive)
Overchargecobblemon:thunder_actorcloud (sustained)
Lightning Rodcobblemon:thunder_actorcloud (vertical beam)
MoveParticles Used
Infernal Chargecobblemon:flame_burst
Shadow Clawminecraft:soul_fire_flame
Bitter Blademinecraft:soul_fire_flame + cobblemon:flame_burst
Armor Oblivioncobblemon:flame_burst (multi-stage)
  1. Match Type - Use cobblemon particles matching Pokémon’s type (electric → thunder_actorcloud)
  2. Consistent Style - Stick to either all cobblemon or all vanilla per Titan
  3. Layering - Combine multiple particles for depth (e.g., explosion + smoke + flame)
  4. Timing - Sync particles with keyframe actions (damage, telegraph, vulnerability)
  5. Vertical Offset - Add +1.0 to +2.5 Y offset for visibility above ground

Leverage Cobblemon’s particle library for polished, consistent visual effects!