Skip to content

Pokemon Particles

Glamour provides two distinct particle systems for Pokemon: manually applied particles and automatic persistent particles.

Sendout particles trigger when a Pokemon is released from its Pokeball.

Characteristics:

  • One-time visual effect
  • Plays at the moment of sendout
  • Great for dramatic entrances
  • Configurable duration and delay

Example Use Cases:

  • Confetti burst for celebration
  • Element-themed effects (fire, water, electric)
  • Shiny reveal sparkles
  • Legendary entrance effects

Ambient particles continuously play while a Pokemon is active in the world.

Characteristics:

  • Repeating effect at set intervals
  • Follows Pokemon as it moves
  • Continuous visual presence
  • Can be stopped by removing the effect

Example Use Cases:

  • Aura effects for powerful Pokemon
  • Type-based passive effects
  • Shiny indicators
  • Status indicators

Players can manually apply particles to their Pokemon using the GUI or commands.

  1. Open the GUI:

    /particles gui
  2. Browse available particles by category or rarity

  3. Select a particle to see its preview and description

  4. Choose a Pokemon to apply the effect

  5. Select effect type (sendout or ambient)

View and remove particles:

/particles manage

This opens a GUI showing:

  • All your Pokemon with active effects
  • Applied sendout and ambient particles
  • Options to remove individual effects

Apply particles directly via command:

/particles apply sendout confetti_burst 1
/particles apply ambient sparkle_aura 1

Remove particles:

/particles remove sendout 1
/particles remove ambient 1

Persistent particles automatically apply based on declarative conditions without player interaction.

Persistent particles:

  1. Check Pokemon against configured conditions every tick
  2. Apply the highest priority matching configuration
  3. Render particles at configured intervals
  4. Clean up when Pokemon is removed or conditions no longer match

Particles can activate based on:

  • Species (e.g., only Pikachu)
  • Shiny status
  • Forms and aspects
  • Types (e.g., all Fire types)
  • Biomes and dimensions
  • Time of day and weather
  • Health percentage
  • Battle status
  • Level ranges

When multiple persistent particle configs match a Pokemon, the highest priority configuration is used.

Example:

{
"id": "shiny_sparkle",
"priority": 100,
"conditions": {
"isShiny": true
}
}
{
"id": "mew_special",
"priority": 200,
"conditions": {
"species": "mew"
}
}

A shiny Mew would use mew_special (priority 200) instead of shiny_sparkle (priority 100).

Persistent particles are optimized for performance:

  • Distance Culling: Only render to nearby players
  • Interval-Based: Particles spawn at intervals, not every tick
  • LOS Checks: Optional line-of-sight validation
  • Visibility Heuristics: View-cone filtering before expensive checks
  • Caching: Condition matches are cached with TTL

You can use both systems together:

  • Persistent particles provide automatic effects (e.g., shiny sparkle)
  • Manual particles let players customize their Pokemon (e.g., confetti sendout)

Both effects can coexist on the same Pokemon without conflicts.

All manually applied particles are saved via Ceremony’s state management system and persist:

  • Across server restarts
  • When Pokemon are stored in PC
  • During trades (effects transfer with the Pokemon)

Persistent particles reapply automatically when conditions match, so no state persistence is needed.

Manually applied particles respect LuckPerms permissions:

glamour.particles.confetti_burst
glamour.particles.category.celebration.*
glamour.particles.rarity.epic.*

Persistent particles apply automatically regardless of permissions - they’re server-wide effects.

For optimal performance:

  1. Use Reasonable Intervals: Higher intervalTicks = better performance
  2. Limit Particle Count: Fewer particles per spawn reduces load
  3. Set Max Distance: Lower maxDistance reduces render checks
  4. Enable Visibility Checks: Use onlyWhenVisible for expensive effects
  5. Avoid Too Many Persistent Configs: Each active Pokemon is checked against all configs
{
"id": "confetti_burst",
"displayName": "Confetti Burst",
"description": "Celebratory confetti explosion",
"type": "SENDOUT",
"particleResourceId": "confetti",
"category": "celebration",
"rarity": "COMMON",
"settings": {
"intervalTicks": 100,
"delayTicks": 60,
"durationTicks": 20
}
}
{
"id": "sparkle_aura",
"displayName": "Sparkle Aura",
"description": "Continuous sparkle effect",
"type": "AMBIENT",
"particleResourceId": "sparkle",
"category": "magical",
"rarity": "UNCOMMON",
"settings": {
"intervalTicks": 40,
"durationTicks": 10
}
}
{
"id": "shiny_sparkle",
"particleResourceId": "sparkle",
"priority": 100,
"settings": {
"intervalTicks": 40,
"durationTicks": 10,
"particleCount": 3,
"radius": 1.0,
"followEntity": true,
"maxDistance": 32
},
"conditions": {
"isShiny": true
}
}