Blockbullets



ToolsBlockBullets is a tool texture that should tell the compiler (VBSP) to cause all bullets to be blocked when this texture is used.
However, for all intents and purposes, it is nothing but an invisible wall, solid to everything which also cuts visleafes, just like any regular wall. As a matter of fact, if the brush is too thin, the bullets will simply pass. So it would block everything but bullets in that case.
In some games, it is the exact same as ToolsInvisible
, but without the %compilepassbullets parameter.
ToolsBlockBullets consists of %CompileNoDraw, $translucent and $nodecal. No special Compile Flag exists to block bullets.
Counter-Strike: Global Offensive has its own blockbullets_cs
variant that actually does what it is supposed to do, even with a one unit thick wall. However, this branch is no longer actively developed and not used for any other game nowadays. So this tool texture and its code is unusable.
Actually blocking bullets
But no despair, there are ways to block bullets, just without tool textures.
As it turns out, physical debris objects possess the ability to "eat" bullets and not let them pass.
Using Func_physbox
Create a simple brush that you would want your bullet blocker to be, and turn it into a func_physbox entity using any material using the "default_silent" surfaceprop.
A good contender would be Tools/toolsskybox2D
, simply because every game has it, and you're unlikely to ever actually use it. So it stands out from the regular skybox texture.
Do not worry, it won't work as skybox texture, as it will loose all functionality as tool texture when used on an entity. We only want the surfaceprop.

Not sure what other thrown objects it may block in other games.
This Func_physbox entity must have the following flags set:
- Start Asleep.
- Ignore +USE for Pickup.
- Debris - Don't collide with the player or other debris.
- Motion Disabled.
- Not affected by rotor wash.
- Physgun is NOT allowed to pick this up.
- Physgun is NOT allowed to punt this object.
- Prevent motion enable on player bump.
- Only Break on Trigger.
- Don't allow bullet penetration.
Depending on game, some of these flags may not exist. Left 4 Dead series for example does not have the rotorwash flag.
You merely need to set all flags to stop it from ever moving. As we're abusing the "Don't allow bullet penetration" flag for our purposes.
To make it easier for you you can use the following spawnflag value if you turn "Smart Edit" mode off:
For
15005697
.
For
9750529
.
Next, the following keyvalues need to be set:
Rendermode : "Do not render"
Disable Shadows : "Yes"
Disable Receiving Shadows : "Yes"

Probably because the "Don't allow bullet penetration" flag does not work in L4D2. But simply overlapping two Func_physboxes at once fixes this somehow.
Using Prop_physics
If for whatever reason, func_physbox is not an option for you, you can do the exact same thing with a physics prop. Even prop_physics_override works if you have no physics prop that fits, but a dynamic prop happens to work.
Find or create a model that has the size you need. If your branch allows it, you can upscale any prop to be fitting. Perhaps a Door model, or a garage gate would fit nicely.
This prop_dynamic or prop_dynamic_override entity must have the following flags set:
- Start Asleep.
- Don't take physics damage
- Debris - Don't collide with the player or other debris.
- Motion Disabled.
- Not affected by rotor wash.
- Prevent pickup.
- Prevent motion enable on player bump.
Next, the following keyvalues need to be set:
Rendermode : "Do not render"
Disable Shadows : "Yes"
Disable Receiving Shadows : "Yes"
Breakable by : "Only Tanks" (only in )
Blocking Projectiles
Making a projectile deflecting brush is not possible, but you can make a trigger that deletes the projectile, using filters and the OnStartTouch - !Activator - Kill
outputs.
- Place a filter_activator_class or filter_activator_model entity for every projectile you want to delete.
- Place a filter_multi that lists every filter you had just created, with the "Logic Type" set to "OR (any filter must pass)".
- Build a trigger_multiple using whatever filter entity you wish.
- Set the Trigger's outputs to
OnStartTouch - !Activator - Kill
- Set the Trigger's flags to "Everything (not including physics debris)"
