Call of Duty 2 Multiplayer: Adding Animated Shutters and Swaying Wires Using Stock _shutter.gsc

This tutorial explains how to implement dynamic ambient effects (randomly jiggling shutters and swaying wires) in a CoD2 multiplayer map using the original stock script maps/mp/_shutter.gsc. These effects add great life to maps, as seen in classics like mp_toujane. The script is already included in the stock PK3 files and always available—no custom file placement required.

1. Script Setup

The stock script maps/mp/_shutter.gsc is automatically called by maps\mp\_load::main(), which is included in every standard multiplayer map GSC. You do not need to add any extra line to your map’s main GSC file.

Important Warning: Do not manually add thread maps\mp\_shutter::main(); (or similar) to your map GSC. Doing so will run the script twice, causing duplicate rotations, wrong clamping, over-rotation (including full 360° spins), crashes on restart, and blocking other map initialization (e.g. ambient sounds not loading).

Note: The original script includes a commented-out windController() thread that would periodically switch wind direction and fully open shutters in one direction. The developers left it disabled—there may have been a good reason (e.g., performance, visual consistency, or gameplay concerns). The current behavior provides continuous random jiggle without directional resets.

2. Creating Swaying Wires

Wires use a script_brushmodel linked to two script_origin entities at each end.

  1. Create a long thin brush for the wire (texture as cable/metal).
  2. Convert it to script > brushmodel.
  3. Press N, set targetname to wire.
  4. Create two point entities (right-click empty grid > info > any, then in N window change classname to script_origin).
  5. Place one script_origin at each end of the wire.
  6. On the wire entity, add target key with a unique value (e.g., wire1_ends).
  7. On both script_origins, set targetname to the same value (wire1_ends).
  8. Alternative: Select wire first, then both origins, press W to auto-link.

Radiant: Wire brushmodel with two script_origins and auto-link lines

wire in Radiant

3. Creating Animated Shutters (Correct Pivot Method)

Shutters rotate randomly around a custom hinge pivot defined by an origin-textured brush. No script_origins or targets needed.

  1. Create the main shutter brush (rectangular, wood/metal texture).
  2. Position it in its closed/rest pose against the wall or frame.
  3. Create a small helper brush centered exactly on the hinge line (vertical edge for side swing, horizontal top edge for overhead).
  4. Apply the origin texture to all faces of the helper brush (search “origin” in textures > common/tools).
  5. Select both brushes (shutter + origin helper).
  6. Right-click > script > brushmodel (merges into one entity).
  7. Press N, set targetname to one of the supported values below.
Targetname Grouping / Notes
shutter_left Base left-facing (grouped as left)
shutter_right Base right-facing (grouped as right)
shutter_left_open Treated as left group
shutter_right_open Treated as left group (script quirk)
shutter_left_closed Treated as left group
shutter_right_closed Treated as right group

Shutter brush next to origin-textured helper brush (before merging)

Sh utter and origin brush selected in Radiant

Origin texture applied (textures window)

Origin texture applied to helper brush

Entity info window (N key) with targetname set

Entity window showing targetname for shutter

In-game: Animated shutter jiggle

Animated shutter in-game

Important: The origin brush is invisible in-game and only defines the rotation pivot. Test the hinge in Radiant using the R key (rotate mode) after merging—drag in 3D view to confirm perfect swing before compiling.

Final Steps

  • Duplicate and place multiple wires and shutters around your map for variety.
  • Perform a full compile (BSP → VIS → Lighting).
  • Launch with /devmap yourmapname.
  • Enjoy subtle, realistic ambient movement!

If effects don’t appear or behave strangely (e.g. over-rotation, no ambient sound), enable /developer 1 in console and check for script errors. Common issue: the script being called twice (once by _load.gsc and again manually).

Bottom Left BackgroundBottom Right Background
Grimms 3D worlds
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.