Rotating Brushes | Index

These are some of the hardest things to create (properly) and require some abstract thinking. They are fully compatible with Hipnotic's (now Ritual) "Scourge of Armagon" Mission Pack 1. You can get example map files from Ritual's website (grab the "", as most of the other files are missing).

There is a "Quick Start" included at the bottom of this page (originally from the "Paroxysm" mod).

CZG (Quake mapper extraordinaire) has written a "Hiprot Explaination" available online:

The following is Hipnotic's original documentation:

info_rotate (0 0.5 0) (-4 -4 -4) (4 4 4)
Used as the point of rotation for rotatable objects.

func_rotate_entity (0 .5 .8) (-8 -8 -8) (8 8 8) TOGGLE START_ON
Creates an entity that continually rotates. Can be toggled on and off if targeted.

TOGGLE = allows the rotation to be toggled on/off

START_ON = wether the entity is spinning when spawned. If TOGGLE is 0, entity can be turned on, but not off.

If "deathtype" is set with a string, this is the message that will appear when a player is killed by the train.

"rotate" is the rate to rotate.

"target" is the center of rotation.

"speed" is how long the entity takes to go from standing still to full speed and vice-versa.

path_rotate (0.5 0.3 0) (-8 -8 -8) (8 8 8) ROTATION ANGLES STOP NO_ROTATE DAMAGE MOVETIME SET_DAMAGE
Path for rotate_train.

ROTATION tells train to rotate at rate specified by "rotate". Use '0 0 0' to stop rotation.

ANGLES tells train to rotate to the angles specified by "angles" while traveling to this path_rotate. Use values < 0 or > 360 to guarantee that it turns in a certain direction. Having this flag set automatically clears any rotation.

STOP tells the train to stop and wait to be retriggered.

NO_ROTATE tells the train to stop rotating when waiting to be triggered.

DAMAGE tells the train to cause damage based on "dmg".

MOVETIME tells the train to interpret "speed" as the length of time to take moving from one corner to another.

SET_DAMAGE tells the train to set all targets damage to "dmg"

"noise" contains the name of the sound to play when train stops.

"noise1" contains the name of the sound to play when train moves.

"event" is a target to trigger when train arrives at path_rotate.

func_rotate_train (0 .5 .8) (-8 -8 -8) (8 8 8)
In path_rotate, set speed to be the new speed of the train after it reaches the path change. If speed is -1, the train will warp directly to the next path change after the specified wait time. If MOVETIME is set on the path_rotate, the train to interprets "speed" as the length of time to take moving from one corner to another.

"noise" contains the name of the sound to play when train stops.

"noise1" contains the name of the sound to play when train moves.

Both "noise" and "noise1" defaults depend upon "sounds" variable and can be overridden by the "noise" and "noise1" variable in path_rotate.

Also in path_rotate, if STOP is set, the train will wait until it is retriggered before moving on to the next goal.

Trains are moving platforms that players can ride.

"path" specifies the first path_rotate and is the starting position. If the train is the target of a button or trigger, it will not begin moving until activated. The func_rotate_train entity is the center of rotation of all objects targeted by it.

If "deathtype" is set with a string, this is the message that will appear when a player is killed by the train.

speed default 100

dmg default 0

1) ratchet metal

rotate_object (0 .5 .8) ?
This defines an object to be rotated. Used as the target of func_rotate_door.

func_rotate_door (0 .5 .8) (-8 -8 -8) (8 8 8) STAYOPEN
Creates a door that rotates between two positions around a point of rotation each time it's triggered.

STAYOPEN tells the door to reopen after closing. This prevents a trigger-once door from closing again when it's blocked.

"dmg" specifies the damage to cause when blocked. Defaults to 2. Negative numbers indicate no damage.

"speed" specifies how the time it takes to rotate

1) medieval (default)
2) metal
3) base

func_movewall (0 .5 .8) ? VISIBLE TOUCH
Used to emulate collision on rotating objects.

VISIBLE causes brush to be displayed.

TOUCH specifies whether to cause damage when touched by player.

NONBLOCKING makes the brush non-solid. This is useless if VISIBLE is not set.

"dmg" specifies the damage to cause when touched or blocked.

The following is a "Quick Start" originally written for the Paroxysm Mod:

SECTION#1 - Making a rotating entity:

STEP 1. Make a brush or group of brushes to rotate.

STEP 2. Place an info_rotate entity at the centre of rotation. Give it a targetname

STEP 3. Convert the brush(es) from step#1 into a rotate_object, give it a targetname, and set it's target to the info_rotate from step#2

STEP 4. Create a func_rotate_entity - placement doesn't matter, but it's a good idea to put it near the object it's related to (directly above the info_rotate seems like the best spot). Set it's target to the rotate_object from step #3 and fill in the rest of the data. NOTE: the 'rotate rate' must be in this format '0 0 0' each number controls the rate of rotaion in each axis (x y z) - the higher the number, the faster the rotation. Positive numbers are clockwise and negative numbers are counter-clockwise. You can also target this entity from a button to start/stop the rotaion, but you'll also have to set it's 'TOGGLE' (and possibly 'START_ON') spawnflag(s).

STEP 5. Build!

You should now have a continuous rotating object, doors are similar to set up. Rotating platforms are similar but need path_rotate entities to follow They are a pain to setup and are not covered here.

If you require a player to interact with the object, colision detection is the next step.

SECTION#2 - Setting up colision detection on rotating objects:

Quake cannot detect colisions with rotating bsp entities so Hipnotic made an ingenious little hack that allows you to follow the rotating brush with a series of moving, invisible clip walls to emulate colision.

STEP 1. All you have to do is draw brushes that surrond the rotaing brush, covert them to func_movewall entities and target the rotate_object. YOU MUST PRACTICE TO GET THIS RIGHT!

- Use the 'VISIBLE' spawn flag so you can see what is actually going on.
- You must use A LOT of func_movewalls for accurate colisions
- You can get some cool effects by using visible func_movewalls - you may not need a visible rotate_object at all!