Wiki 9Minecraft Wiki 9Minecraft

Disabling Particles in Resource and Behavior Packs

How to suppress vanilla or custom particle effects using blank definitions, entity files, and commands.

6Sections
4Code examples
3Known errors

Minecraft Bedrock does not have a single global switch to turn off individual particle types, because particles are spawned by many different systems: client entity definitions, animations, blocks, and hardcoded engine events. When you need to remove a particle for performance reasons, clean up a custom map's visuals, or hide status effect swirls, you have to intercept the particle either where it is requested or where it is rendered. This guide covers the reliable methods for suppressing particles across resource packs and behavior packs.

How Bedrock Resolves Particle Identifiers

When the game or an add-on tries to spawn a particle, it passes a string identifier—such as "minecraft:villager_happy" or "minecraft:mob_spell_ambient"—to the client particle engine. The resource pack stack is then searched from top to bottom for a particle JSON file whose internal "identifier" matches that string.

Unlike textures, which rely on file paths, particles are matched entirely by the "identifier" field inside the JSON file's "description" block. The actual filename inside the "RP/particles/" folder does not matter to the engine, though keeping the vanilla filename makes your pack much easier to maintain. Because the top resource pack wins whenever two files declare the same identifier, you can disable almost any data-driven vanilla particle by overriding its identifier with an inert definition.

MethodPack TypeWhat it stops
No-op particle overrideResource PackEvery instance of that particle identifier across the entire game
Client entity particle removalResource PackParticles tied to a specific mob's animations or animation controllers
Effect command hideParticles flagBehavior Pack / CommandsStatus effect swirl particles on a specific entity for one effect

Overriding a Vanilla Particle with a Blank Definition

If you simply delete a particle file or leave the "components" object completely empty, the Content Log will throw warnings and the emitter may stay alive in memory doing nothing. The cleanest way to silence a particle globally in a resource pack is to give it a valid, minimal component set that spawns zero particles and expires immediately.

In the example below, "minecraft:heart_particle" is overridden. The "minecraft:emitter_lifetime_once" component sets the active time to zero seconds, "minecraft:emitter_rate_instant" requests zero particles, and "minecraft:particle_appearance_billboard" sets the quad size to zero as a fallback. The texture points to a standard atlas so the engine does not complain about a missing texture resource.

RP/particles/heart.json
{
  "format_version": "1.10.0",
  "particle_effect": {
    "description": {
      "identifier": "minecraft:heart_particle",
      "basic_render_parameters": {
        "material": "particles_alpha",
        "texture": "textures/particle/particles"
      }
    },
    "components": {
      "minecraft:emitter_lifetime_once": {
        "active_time": 0
      },
      "minecraft:emitter_rate_instant": {
        "num_particles": 0
      },
      "minecraft:particle_lifetime_expression": {
        "max_lifetime": 0
      },
      "minecraft:particle_appearance_billboard": {
        "size": [0, 0],
        "facing_camera_mode": "rotate_xyz"
      }
    }
  }
}

Stopping Particles on a Single Entity

Overriding a particle file disables that effect everywhere in the world. If you only want to stop a particle on one specific mob—for example, removing the portal particles from your custom Enderman variant without breaking the actual Nether Portal block—you should edit the entity's client definition instead of the particle file.

In a client entity file ("RP/entity/"), particles are mapped under "description.particle_effects" using a short alias. Animations and animation controllers trigger the particle by referencing that alias, not the full identifier. If you point that alias to a custom blank particle—or remove the "particle_effects" block from the animation itself—only that entity stops emitting the particle.

Be aware that if a vanilla animation controller still tries to call a short alias that you deleted from "description.particle_effects", the Content Log will report a missing particle effect error every time the animation plays. Mapping the existing alias to a silent custom particle avoids those errors without forcing you to rewrite the vanilla animation controller.

RP/entity/custom_enderman.entity.json
{
  "format_version": "1.10.0",
  "minecraft:client_entity": {
    "description": {
      "identifier": "my_pack:silent_enderman",
      "materials": {
        "default": "enderman"
      },
      "textures": {
        "default": "textures/entity/enderman/enderman"
      },
      "geometry": {
        "default": "geometry.enderman.v1.8"
      },
      "particle_effects": {
        "teleport": "my_pack:empty_particle"
      },
      "render_controllers": [
        "controller.render.enderman"
      ]
    }
  }
}

Conditionally Disabling Particles with Molang

Sometimes you want a custom particle to turn off dynamically based on game state rather than disappearing permanently. Particle emitters support Molang expressions inside their lifetime and rate components, allowing the emitter to check variables or entity queries before spawning anything.

The "minecraft:emitter_lifetime_expression" component takes an "activation_expression" and an "expiration_expression". When "activation_expression" evaluates to 0 (false), the emitter remains dormant and spawns no particles. When "expiration_expression" evaluates to non-zero (true), an active emitter immediately shuts down. Note that entity queries inside a particle file only work when the particle is attached to an entity, such as when it is spawned from an entity animation; world-positioned particles spawned via the "/particle" command do not have an owning entity context.

RP/particles/conditional_smoke.json
{
  "format_version": "1.10.0",
  "particle_effect": {
    "description": {
      "identifier": "my_pack:conditional_smoke",
      "basic_render_parameters": {
        "material": "particles_alpha",
        "texture": "textures/particle/particles"
      }
    },
    "components": {
      "minecraft:emitter_lifetime_expression": {
        "activation_expression": "!query.is_in_water",
        "expiration_expression": "query.is_in_water"
      },
      "minecraft:emitter_rate_steady": {
        "spawn_rate": 10,
        "max_particles": 50
      },
      "minecraft:particle_lifetime_expression": {
        "max_lifetime": 1.5
      },
      "minecraft:particle_appearance_billboard": {
        "size": [0.2, 0.2],
        "facing_camera_mode": "rotate_xyz"
      }
    }
  }
}

Hiding Status Effect Particles in Behavior Packs

One of the most common reasons creators look up particle removal is to get rid of the colored swirl particles produced by potion effects like Invisibility, Speed, or Strength. You do not need a resource pack override for this if you are applying the effect yourself through commands, functions, or scripts.

The "/effect" command accepts an optional boolean parameter at the end called "hideParticles". Setting this to "true" suppresses the ambient mob spell swirls for the duration of that effect application. In the Script API, the "addEffect" method on an Entity takes an "EntityEffectOptions" object, which includes a "showParticles" boolean property that you can set to "false".

BP/functions/grant_stealth.mcfunction
effect @s invisibility 60 0 true
effect @s speed 60 1 true

Limitations and Legacy Particles

Not every visual effect that looks like a particle in Bedrock is controlled by a JSON file in "RP/particles/". A handful of older effects—most notably block breaking fragments, sprint dust at an entity's feet, and certain weather splashes—are generated directly by the C++ engine or pulled straight from "textures/particle/particles.png" using hardcoded UV coordinates.

If a particle does not have a corresponding JSON definition in the vanilla resource pack's "particles" directory, you cannot disable it with a JSON override. Trying to erase those pixels inside "textures/particle/particles.png" will hide the hardcoded effect, but it will also break every other vanilla particle that shares that same sprite sheet.

Which versions this applies to

Applies to Minecraft Bedrock 1.10.0 and all later versions, including 1.20 and 1.21. No experimental toggles are required for particle overrides, client entity particle mappings, or the /effect command.

When it does not work

What you seeWhyThe fix
The vanilla particle still appears in-game even though the file is in RP/particles/.You matched the vanilla filename, but the "identifier" inside "description" does not exactly match the vanilla particle's identifier string, or you omitted the "minecraft:" namespace.Open the vanilla resource pack template, find the target particle file, and copy the exact string from "particle_effect.description.identifier" into your override file.
Content Log shows: [Particle][error]-particle_effect | 'components' must have at least a rate, lifetime and appearance component.You tried to disable the particle by setting "components": {} as an empty object.Include "minecraft:emitter_lifetime_once", "minecraft:emitter_rate_instant", and "minecraft:particle_appearance_billboard" with their values set to 0, as shown in the blank definition example.
Content Log shows warnings about a missing particle effect short name on an entity.You deleted an entry from "particle_effects" in the client entity JSON, but the entity's animation or animation controller is still trying to play that short name.Keep the short name key inside "description.particle_effects" on the client entity, and point its value to a blank custom particle identifier instead of deleting the key.

Reference, straight from the game files

Read out of the game itself, so the ids match the version you are building for.