Lode's All about Movers Tutorial

Loading this page might take a while, so please be patient.  You can also download the zipped version.  This version also contains the example maps.

Table of contents

Part I

Assumptions
Introduction
What is a mover?
A Lift in 6 Steps
Creating a basic lift (more detailed explanation)  
Creating a basic door
Creating a rotating door
Movers with multiple keys
Moving the mover around in the editor
Basic Mover Properties
MoverSounds

Part II

Things you like to know
Rotating movers
Movers & lighting

Triggered movers

Looping Movers

AttachMovers

Attaching movers to another mover

Mover events

The ElevatorMover

The AssertMover

The GradualMover
ReturnGroup
More Mover Properties

Part III

A door that opens by pushing a button
A train with a button

A wiggling boat
A Real "Office Building" Elevator

Other

Download
The Future
Contact

Assumptions

I assume that you can work with basic elements of the editor and you can make a map.  If you don't, please read a beginners tutorial first.

Introduction

It's not difficult to make a basic mover, like a simple door or lift, but you can do so much more with movers.  This tutorial will teach you everything about movers.  Every propertie and every movertype is explained.

This tutorial is optimised for UEd2, but if you have UEd1, you can use it as well, because these two versions don't differ that much.  And I've added remarks for UEd1 when there is a difference.  You can of course apply the official UT 420 or higher patch to get UEd2.  I recommend patch 436, because this one adds even more new features such as realtime preview of skyzones, editing the textures of a mover and a replace textures function.

There are 3 parts in this tutorial:

*Part I is for beginners and describes the basics of creating simple movers.
*Part II is for intermediate and advanced mappers, and contains a description about all mover proporties and classes.
*Part III will use everything you learned in the previous two parts to create some cool stuff.  A door with a button, a train with triggers in it, a boat that wiggles and sails at the same time and an elevator with inner and outer doors, that can go and stop at 4 different floors.

Part I

What is a mover?

A mover is a moving brush.  It can move to different locations and/or rotate around an axis.  Most movers have several keys.  Key0 is the begin position, the mover will wait there until it is triggered.  The other keys are the locations the mover will move to when activated.  It will move through all the other keys until it reaches the last one.

You can recognise movers in the editor because they are purple.  In the 3D view, you can see the movers through the walls.

Movers can be used for doors, lifts, trains, boats, buttons, rotating rocks in the sky, or anything else that moves.

In this tutorial, when I say the mover is "open" then I mean it is at its last key, and when it is "closed" it is at its first key, Key0.  A "closing" mover is one that is moving from the last to the first key, and an "opening" mover is one that is going from the first key to the last one.  So even if the mover is not a door, I will still use "open" and "close" for these situations.

A Lift in 6 Steps

Done.

Creating a basic lift (more detailed explanation)

The most standard mover in the Unreal engine is a mover that starts moving to a new position when you touch it, then waits for a few seconds, and then returns to its original position.

We are now going to make a lift that starts rising when you step on it.  Please make a large room now.

To add a mover at the location where your red brush is, press this button: .  its located in the toolbar on the left, under the add, subtract, intersect and deintersect buttons

In UnrealEd1, you have to press the button that looks like this: .

When you pressed the button, you see a purple brush appear at the red brush.  That's a mover!  However, this mover will not do anything yet when you touch it.  Also, this mover probably doesn't have the textures and shape you want.  In version 436 of the editor, you can view and edit the textures of the mover by right clicking on it, expanding Movers and then clicking Show Polys, but then still the shape isn't correct.  Your mover must be one single brush, so if you want it to have more complex forms than a cube, a sphere or whatever, you can't create it this way.

That's why most people first make a template of the lift with normal brushes, then intersect the whole thing, and then use the red brush to add the mover.

Delete that mover you just made, because now you will make a good one.  First make a template of the lift.  You can make it at any location, the best place to make it is in a large room outside your map, or if your map is a large outdoor map you can make it somewhere in the sky.  Use normal brushes for this template, I mean the blue and the yellow ones.  Give it the textures you want, align it, apply the texture properties you want, vertex edit it if necessary.  When the lift is finished, rebuild geometry and then move the red brush around the lift. Make sure the lift is completely inside the red brush, and there is nothing else inside the red brush.  Also make sure the red brush is not scaled or rotated, so if it is right click on it and use Reset Scaling and Reset Rotation, or use Transform Permanently.  Otherwise the mover will have a weird collision.


Position the red brush around the lift before intersecting

Now intersect by pressing the Intersect button .  The red brush now has the same shape as the lift.


The red brush after intersecting

It is safe to delete the template now, you won't need it anymore, except if you want to intersect the same lift again later.

Move the red brush to the begin position of the lift, this means the position the lift will have when down. Now press the Add Mover button .  The lift looks like purple lines in the editor, if you start the map now in the game it will look like the template you created earlier.


The "down" position of the lift

However it will not yet move.  To make it working you first have to give the lift a second key.  Do this by right clicking on the purple mover brush, then in the menu that appears expand "Movers" and there select Key1.


Selecting Key1

After you did this, place the purple mover brush to the position you want the lift to have when up.


The "up" position of the lift

The mover brush now has two different positions: Key0 (base) is the "down" position, and Key1 is the "up" position.  If you right click on the mover again and choose Key0 (base), you will be able to see the original position again (down).  Now your lift is ready and works!  Rebuild your map, save it (don't forget to place a PlayerStart in the map), and play it.  When you step on the lift, it will rise, and after a few seconds descend again automatically.

Creating a basic door

To make a sliding door, do exact the same as you did with the lift, only now make a mover that looks like a door and place the second key now on the left or the right of the door, or above the door to make one that opens into the ceiling.

Creating a rotating door

Most people have rotating doors in their houses, and not these futuristic sliding doors.  To make a rotating door, again make a mover that looks like a door.  But now you don't have to move the second key.  Rotate the second key the same way as you would rotate a normal brush with the rotation tool, as you can see on these pictures:


Key0 of the rotating door


Key1 of the rotating door

You now learned how to make lifts, doors and rotating doors.  You can make any other moving object the same way.  The Unreal engine doesn't see any difference between lifts, doors, trains, or whatever.  It just sees movers as things that move between different Keys.

Movers with multiple keys

The lift and doors you just created use only 2 keys: Key0 (base) and Key1. You can also make movers with more than 2 keys, with a maximum of 8 keys.  If you make such a mover with for example 4 keys, it will, when activated, move from Key0 to Key1, then to Key2 and then to Key3.  There it will wait for a few seconds, and then it will return to Key2, then to Key1 and then back to Key0 where it will wait until it is activated again.  To give a mover multiple keys, do the same as you did with Key1 in the lift example, but this time do it for Key2, Key3, etc... as well.  But that's not all, you also have to tell the mover how many keys you want it to use.  Right click on the mover and choose "Mover Properties".  In the window that appears, expand "Mover" and there set  NumKeys to the number of keys you are using.  So if you use Key0, Key1, Key2 and Key3, set NumKeys to 4.


The Mover Properties

The KeyNum propertie does the same as what you have done before to select a key of the mover.  When you right click on the mover, expand Movers and there choose Key1, that is the same as setting KeyNum to 1 in the Mover Properties.

Most of the times you set KeyNum to 0 before saving and playing the map, but if you leave the KeyNum for example to 1, this gives another effect on the mover:  if Key1 is the up position of a lift, and Key0 its down position, and you leave it to Key1 before saving, the lift will be up when you start the map.  It will stay up until you activate it by touching it.  Then in will wait for a few seconds, and then go down.  Now it will stay down forever until you touch it again, but now it will not stay up forever, but go back down after a few seconds.  So once you touched it, it acts like as if you set KeyNum to 0 before saving the map.

Moving the mover around in the editor

You can move almost anything in the editor (brushes, actors, ...), even movers. As you know by now, movers have more than one location, each Key has its own location. To move a certain Key of the mover, you first have to select that key and then move the mover around in the editor. If you move Key1, Key2, Key3, ... , or Key7, only that key will move. However, if you move Key0, all other keys will move as well. So if you made a lift that can rise etc..., and you want to place it somewhere else in the map, you only have to move Key0. Key1 will follow then.

You can move the mover, but you also can rotate it.  If you rotate Key0, the other keys will rotate as well, but the will not move.  This means if you have a door like this (the bright door represents Key0, the dark one Key1):

and you rotate Key0 90°, it will look like this:

and not like this as you might have hoped:

This means, if you have made a sliding door and want to use the same door again, but rotated 90°, and duplicated the first door and then rotated it, you have to reposition the second key before the door works the way you want it.

Basic Mover Properties  

Every mover has a lot of properties, for example to change the speed, the sounds, etc... of the mover.

To open the Mover Properties of a mover, right click on it and select "Mover Properties".  In there, expand "Mover".


The Mover Properties

The most important Mover Properties are:

-bTriggerOnceOnly: If this is true, the mover will work only once, and after that never anymore.
-BumpType: Determinates what will make the mover start (if it is not a triggermover).
    BT_PlayerBump: the mover will be activated when touched by a player
    BT_PawnBump: the mover will be activated by a pawn, like rockets, crates, Nali, etc...
    BT_AnyBump: the mover will be activated by players and by pawns
-KeyNum: the mover key you are editing, also the key the mover will have when you start the map.
-MoverEncroachType: this determinates what the mover does when a player blocks it.
    ME_StopWhenEncroach: the mover will stop when it hits you.  It will almost never move again, not even if you touch it.  However, if you have another mover that is set to ReturnWhenEncroach, and this mover has to return because it has hit a player, all the stopped StopWhenEncroach movers with the same tag will move again.  This has to do with ReturnGroups, as you will see later.
    ME_ReturnWhenEncroach: it will return to where it came from, wait a while and then try again.
    ME_CrushWhenEncroach: it will kill you when it hits you
    ME_IgnoreWhenEncroach: it will go through you and continue its way as if nothing has happened
-MoverGlideType:
    MV_MoveByTime: the mover will move without acceleration (constant speed)
    MV_GlideByTime: the mover will use an acceleration when it starts (positive acceleration) or stops  (negative acceleration) moving.
-MoveTime: the number of seconds the mover uses when moving from one key to another.  This means that if your mover uses 5 keys and MoveTime is 1, the mover will need 4 seconds to open or close, because it has to go 4 times from one key to another.  If you set MoveTime to 0, the mover will "flash" to the new location, however you will not be able to use this as a teleporter, except if there are no walls or objects to obstruct the player on its path.
-NumKeys: the number of keys your mover uses.
-StayOpenTime: how long the mover will wait before returning to its begin position.

MoverSounds  

In the MoverSounds expansion of the Mover Properties, you can determinate all the different sounds the mover can use.  There are 5 different fields, each of them for another situation of the mover:

ClosedSound: the sound the mover will make when it has finished closing
ClosingSound: the sound it will make when it starts closing
MoveAmbientSound: the sound it will make while moving; this is a looping sound
OpenedSound: the sound the mover will make when finished opening
OpeningSound: the sound it will make when it starts opening

To select a sound, first open the Sound Browser by opening the View menu and selecting "Sound Browser...", or press the speaker button in the toolbar.  Then, open the File menu of the Sound Browser and choose "Open...".  Make sure you are in the Sounds folder of your Unreal Tournament.  There are two packages that have good door and elevator sounds: DoorsAnc.uax and DoorsMod.uax.  The DoorAnc.uax has ancient door sounds, like wooden doors etc..., and the DoorsMod.uax has modern sounds.  Select the sound you want, then go to the Mover Properties and press the Use button of the fields to activate the sound. 

Now, to choose sounds for your mover, keep this in mind:
-Use sounds with "start" or "S" in their name for the ClosingSound and OpeningSound.  Use sounds with "end" or "E" in the name for ClosedSound and OpenedSound.  Use sounds with "loop" or "L" in the name for the MoveAmbientSound.  This way you get the best effect, because these sounds are made for this.
-Use sounds that belong together for the same mover.  For example, use md6start, md6loop and md6end together.  It is possible to use md4start, md5loop and md6end for 1 lift, but that sounds really weird.
-Never use looping sounds for the Closed-, Closing-, Opened- or OpeningSound, otherwise they will keep playing forever!


Choosing the sounds for a mover

If you ever have problems with the looping sounds, and there really is no explanation for it, try selecting another looping sound and after that back the original one, or if that doens't help, make the mover again.  Sometimes this helps against mysterious problems.

Part II

Things you like to know

Many people wonder about these things but never tried it:

-Movers can go through walls.  However the players standing on the movers cannot.  Movers also work if you let them start in a wall, and if you place a mover completely away from your map, somewhere in the dark blackness, it will still move, although you can't see it.  That will be useful if you are attaching things to a hidden mover.

-Movers work underwater.  But you need to be aware that when a player stands on the mover, and the mover goes down, the player will stay floating on the water.  The solution is to give the mover a roof and walls.

-When you save your map with movers without rebuilding, and reopen it later, all movers might disappear.  At least, this happened to me once.

Rotating movers

You don't need any special mover class to make a mover that keeps rotating around its own axis forever.  Any object, decoration, weapon, mover, etc... can be made to rotate, they all use the same propertie for it.

Make a mover.  You don't have to give it any keys.  Open its properties and expand "Movement".  In there, expand "RotationRate".  You now see three values: Pitch, Roll and Yaw.  As long as you leave them 0, the mover will not rotate.  Small values, like 1, 10 or 100 make it rotate very slowly, so you can hardly see the rotation.  A value of 1000 makes it rotate quite slowly, and values of around 2000 - 10000 make it rotate faster.  You can also make it rotate as fast as you want, for example if you give it a value of 100000, but at this high speed you might see strange effects when stepping on the mover.


The RotationRate of a mover

Use Pitch to make the mover rotate around its X-axis, Roll to make it rotate around its Y-axis and Yaw to make it rotate around its Z-axis.  This means, if you want to make a rotating platform, you need to use Yaw, and for things like the wheels of a car, use Roll or Pitch.

The mover will rotate around its own axis.  The location of this axis is determinated by that red vertex that every brush has.  For example, the cylinder on the two pictures below will rotate around the red vertex, so the first one will rotate around its center, while the second one will rotate around one of its sides.

   

To place the red vertex, click on any purple vertex of the brush and the red one will go to that location, or right click on any place and select Pivot --> Place Pivot (Snapped) Here.

Important is to set the mover's InitialState to None, otherwise the movement of it will be disturbed when players touch it.  Expand "Object" in the Mover Properties, and there set InitialState to None.  I will talk about InitialState in a minute.

Triggered movers

All movers we made until now were activated by touching it.  You can also make movers that are activated by triggers.  First of all I will tell you how to make a trigger.  Open the Actor Class Browser by selecting "Actor Class Browser..." in the View menu, or by pressing the pawn button in the toolbar.  In there, expand "Triggers" and there select "Trigger".


The Actor Class Browser

The trigger will be activated if a players walks in his radius.  The trigger will then give an out event that will activate the mover, or anything else.  Now place the trigger in your map, at a place where players can walk to activate it.

To make this trigger activate a mover, give the trigger an Event and give the mover the same Tag.  Open the Trigger Properties and expand "Events".  There, type a name under "Event" (Mover1 in my example).  Now, open the properties of the mover that will be triggered, there expand "Events" too, and type the same name under "Tag" (Mover1).

   

The editor will now paint a red line from the trigger to the mover.

You also have to set the mover to be activated by a trigger, and not by a playerbump.  Expand "Object" in the mover properties, and use InitialState for this.


The InitialStates of a mover

-None: the mover will never move through keys, but still can be used as a rotating mover or a mover attached to another one
-StandOpenTimed: Same as BumpOpenTimed
-BumpButton: The same as BumpOpenTimed, but the mover will return immediately
-BumpOpenTimed: the default setting.  When you touch (bump) it it will go open, wait a while and then close again
-TriggerPound: This will be explained later
-TriggerControl: as long as the trigger is activated (as long as you are in its radius), the mover will be open.  When you are not it the trigger's radius, the mover will be closed
-TriggerToggle: every time you enter the trigger's radius, the mover will toggle between open and closed
-TriggerOpenTimed: every time you enter the trigger's radius, the mover will open, wait a while and then close again

To make the mover work with a trigger, you will have to use one of the trigger settings, such as TriggerOpenTimed or TriggerToggle.

To determinate the radius of the trigger, open its properties and expand collision.


Choosing the radius of a trigger

The radius of the trigger is like a cylinder: use CollisionHeight to determinate the height of it, and use CollisionRadius to determinate the radius.  As long as you stand in this cylinder, the mover is activated.  If you want to view this cylinder in the 2D views, right click on top of the views, expand "Actor" and there choose "Radii View".  You will have to do this.


Radii View

There are also some other trigger properties that might be interesting.  In the Trigger Properties expand "Trigger"


The Trigger Proporties

The most important options are:
-bTriggerOnceOnly: If true, the trigger will work only one time, and after that never anymore.
-DamageThreshold: How many damage is at least required when TriggerType is TT_Shoot.  The damage of the UT weapons is: (based on what's in the scripts and properties)
    enforcer: 17
    pulsegun: 72
    shockrifle: projectile 55, shot 40, superexplosion 165
    enhanced shockrifle: 1000
    ripper: razorblade 30, explosive razorblade 34 (?)
    biorifle: small glob 20, large glob 75
    rocketlauncher: rocket 75, grenade 80
    flackcannon: flakshell 70, chunk 16
    redeemer: 1000
So a trigger with DamageThreshold = 999 will be activated by the redeemer, but if DamageThreshold = 1001 it will not
-Message: A message that will appear in the textbox of your HUD when you enter the trigger's radius
-RepeatTriggerTime: If the mover has a message, this determinates after how many seconds the message will be repeated as long as you are in the mover's radius.  0 means the message will be displayed only once without being repeated.
-ReTriggerDelay: If this is larger than 0, you will only be able to activate the trigger again after the TriggerDelay time is expired.
-TriggerType: determinates what will activate the trigger:
    TT_PlayerProximity: the trigger will be activated if a player is in its radius
    TT_PawnProximity: it will be activated when a pawn is in its radius
    TT_ClassProximity: it will be activated if the Class you selected in ClassProximityType is in its radius.  This might not work.
    TT_AnyProximity: it will be activated if a player or a pawn is in its radius
    TT_Shoot: it will be activated it you shoot at it, and the damage is larger than what you entered in DamagaThreshold.

Movers & lighting

Movers have several properties that have to do with lighting: expand "Mover" in the Mover Properties.

-bDynamicLightMover: If True, the lighting will be calculated for every place where the mover will be, so if its first in a dark room and goes to a bright one, the mover will become bright as well.  Don't use these too much if you want your map to work on slower computers.
-BrushRaytraceKey: If the mover isn't a dynamiclightmover, the lighting on the brush will be calculated  for this Mover Keyframe only.
-WorldRaytraceKey: If the mover isn't a dynamiclightmover, the lighting around the mover (for example shadow of it) will be calculated for this Mover Keyframe only.

An example of the effect of WorldRaytraceKey is shown on these screenshots.  The mover is a lift with two keyframes: Key0 is down, and Key1 is up.  Of course this only works when bDynamicLightMover is False


WorldRaytraceKey = 0


WorldRaytraceKey = 1

The second shadow is calculated as if the mover was at its up position.  You can also use this to create fake shadows.

Looping Movers

Looping movers are movers that, once activated, will keep moving forever.  There are a lot of ways to make a looping mover, I will explain three of them.  Every way has it own advantages, disadvantages and results.

The DualDispatcherMethod (Thanks to Wanderer):  This method needs two dispatchers and a trigger.  Once you activate the trigger, one of the dispatchers will start a chain-reaction that makes a normal mover toggle between its keyframes.

In your map, first add a normal mover, give it the Keys you want, and open its properties.  Set its InitialState (under "Object") to TriggerToggle.  Also give it a tag (under "Events"), for example "loopingmover".
Now add two dispatchers (they are in the Actor Class Browser under Triggers).

Open the properties of the first one, and expand Events.  Give it a Tag, for example "Dispatcher1".  Now, expand "Dispatcher" and there expand "OutEvents".  Set [0] to the tag of the mover, in this case "loopingmover", and set [1] to "dispatcher2".  After that, expand "OutDelays" and set [1] to the time the mover needs to move from its first key to open or close (in seconds).  So if the MoveTime of the mover is 2, but it has 4 keys, it will need 6 seconds to move. (not 8 seconds!  4 keys means it has to move from Key0 to Key1, then from Key1 to Key2, and then from Key2 to Key3, which is the last key).

Now do the same for the second dispatcher, but only give this one "dispatcher2" as tag, and set its OutEvent [1] to "dispatcher1".

   

You now have to do only one more thing: add a trigger somewhere in the map.  When you open the map in UT the mover will not yet move, first one of the dispatchers needs to be triggered and after that the mover will keep moving forever.  If you want it to appear that the mover was moving already, place the trigger somewhere nearby a startlocation so the player will activate it without even knowing it.

When you placed the trigger, open its properties and set its Event under Events to "dispatcher1" or "dispatcher2", you may choose which one yourself.

The LoopMover:  There are different kinds of movers.  To get a list of all movers, right click on the Add Mover Brush button instead of left clicking on it.  "Mover" is the one we used until now.  However, now choose "LoopMover" instead.


The Mover Classes

After you added it and made its Keys, open the LoopMover Properties.  Expand "Object" and then "InitialState".  As you can see there is a new propertie there, "LoopMove".  This is the only InitialState that makes the LoopMover work.  Select it.


The LoopMove InitialState of the LoopMover

The LoopMover will not move on its own.  It will need a trigger.  Add a trigger somewhere, give the trigger an Event and the LoopMover the same Tag.  If you now play the map, the LoopMover will start moving as long as you are in the radius of the trigger.  If you step out of the radius, the mover will stop at the next key it will reach.

If you want the mover to keep moving, even if you are not in the radius of the trigger, it's best to use a TimedTrigger (Thank you, 32_Pistoleta, for pointing me out the NaliRabbit wasn't necessary :)
The TimedTrigger in the Actor Class Browser --> Triggers --> Trigger --> TimedTrigger.  Open "TimedTrigger" in its properties and set bRepeating to True.  In DelaySeconds, enter the total time the LoopMover needs for 1 cycle (opening and closing).  If you don't do this, this trigger will not work in Tournament-style maps (where you have to press a button before the map starts).  Of couse don't forget to set the Event of the trigger to the tag of the LoopMover.

If you experience any problems with the TimedTrigger, or you are using Unreal1, you will need the NaliRabbit anyway.  For this, I am making a tutorial: "Activating a trigger with a NaliRabbit"

One final thing you can do is set the LoopMover's MoverEncroachType to ME_IgnoreWhenEncroach, otherwise its movement will stop forever when it hits a player.

If you want to prevent that problem, you can also use the DualDispatcherMethod in combination with a LoopMover.  Set OutDelay [1] to the MoveTime of the mover then, instead of the total time it needs to move.

Now, what is the difference between the DualDispatcherMethod and the method with the LoopMover?  its in the sequence of the Keys the mover will follow, if there are more than two keys:  For example, if the mover has three keys, a normal mover will move from Key0 to Key1 to Key2, then it will go back to Key1 and then back to Key0.

A LoopMover, however, will move from Key0 to Key1 to Key2, and then immidiatly the shortest way back to Key0.

So what method you use depends on how you want your looping mover to move.

TriggerPound:  This method uses a particular InitialState of a normal mover: TriggerPound.  So when you added your mover and gave it some keys, set its InitialState to this.  TriggerPound is somewhat the same as the LoopMove InitialState of the LoopMover, only TriggerPound will use the same key sequence as the DualDispatcherMethod.  So to activate the mover you have to do the same as you did with the LoopMover.

The advantage of TriggerPound is that you control 2 different timers: how long the mover will wait at the last key before closing, and how long it will wait at the first key before opening again.  In the Mover Properties, expand Mover.  To set how long it will wait at the first key, use StayOpenTime.  To set how long it will wait at the last key, use OtherTime.

You can represent it like this:

AttachMovers

There is a special AttachMover class, but actually its easier and more reliable to use normal movers if you want an object to move together with a mover.

Make a working normal mover, and give it a Tag, for example "AttachMover".  Now add some objects, for example weapons, decorations, lights, etc... in the map.  Open the properties of the objects, and expand "Movement".  In there, set the AttachTag to the same Tag you gave the mover, in this case "AttachMover".  Now expand "Advanced" and make sure that bMovable is True, bNoDelete is False and bStatic is False.


The Properties for a moving object

The object will now always make the same movements as the mover, no matter how far it is away from it, and even if the object has to go through walls.

You can also use the AttachMover class.  Right click on the Add Mover button to see it.  After you added one, open its properties and expand "AttachMover".  There give it an AttachTag.  Now, all objects with the same Tag will move together with it.

So, the difference between using normal movers, and using AttachMovers, is that with the normal mover, you need to give the objects an AttachTag, and the mover the same Tag, and with AttachMovers, you have to give the objects a Tag and the AttachMover the same AttachTag.

Attaching movers to another mover

It is possible to attach another mover to a mover, just the same way as you attach an object to it.  This way, you can make movers that have more states than only open or closed.  If you have a mover (A) that is attached to another one (B), mover A will move if it is activated by bumping or a trigger, but it will also move if mover B moves.  If mover B moves in a different way than mover A, mover A is able to move through two different paths: its own one, and the one of mover B.

Of course you need to hide mover B somewhere in your map, players want to see mover A only!

If you want the mover to be attached to more movers, you will have to create a chain: mover A attached to mover B, and at the same time mover B attached to mover C.

There are some problems with this: when a mover is attached to another one, and also has its own keys, the following scenario might happen: Mover A moves to the left.  Then Mover B moves up, and Mover A will follow Mover B and also go up.  Now mover A is up and to the left.  If Mover A now wants to move to the right again, it will move to the Key that represents the right position, so it will automaticly down again, even if Mover B stays up.  If now Mover B moves down, Mover A will also move even more down, so it will disappear in the floor!

One of the main things you can do when attaching a mover to another mover, is make a lift with inner doors.  So the doors will descend and raise together with the lift.

Rotations might not work, however I have seen it working sometimes.

If you start using this, you will see that attaching movers to other movers has great potential, you can do amazing things with it without having to script!

Mover events

There are several events a mover can give when something happens with it.

The first kind of event, is when something or someone bumps it.  Under "Mover" in the Mover Properties are two settings: BumpEvent and PlayerBumpEvent.  BumpEvent will be activated everytime a player or an object bumps the mover, and PlayerBumpEvent will be activated only when a player bumps it.

The second kind of event is the same event you use for triggers: its under "Events" in the Mover Properties.  When you enter the name of an event in Event, that event will be called when the mover has reached its last keypoint.  This way you can for example make a button that is a small mover that moves into the wall, and as soon as its there a door opens.  You don't have to use any trigger for this.

Some types of movers, such as the GradualMover and the AssertMover can give a different event for every Key they reach.  I'll handle this later.

The ElevatorMover

One of my favourite mover classes is the ElevatorMover.  That's because this mover gives you control over each key.  For example if it has 4 keys, you can place 4 ElevatorTriggers in the map: one to go to Key0, one for Key1, one for Key2 and one for Key3.

To add an ElevatorMover, right click on the add mover button and choose ElevatorMover.  Now give it 4 different keys.

Open the properties of the ElevatorMover, expand Object and set InitialState to "ElevatorTriggerGradual".  After this expand Events and set the tag to "ElevatorMover".

The ElevatorMover does not work with normal triggers.  You need to use ElevatorTriggers.  These have some specific properties, that a normal trigger hasn't got.  You can find the ElevatorTrigger in the Actor Class Browser under Triggers.


The ElevatorTrigger

Add four of these triggers in your map (one for each key), and open their properties.  Under "Events", set their Event to "ElevatorMover".  You now should see red lines going from the triggers to the mover.


4 ElevatorTriggers, one for each Key of the mover

After this, select one of the ElevatorTriggers, open its properties and expand "ElevatorTrigger".


The ElevatorTrigger Properties

It has the following properties:

-bTriggerOnceOnly: the trigger will work only once, and then it will never work anymore.
-ClassProximityType: used together with TT_ClassProximity.  Go to the section "Triggered Movers" for this.
-GotoKeyFrame: this is the setting that makes the ElevatorTrigger unique: when you activate an ElevatorTrigger, it will not only give the command to the mover to start moving, but it will also tell the mover to which key it has to move, and that key do you control by using this setting.
-MoveTime: if it is larger that 0, this should determinate the speed of the ElevatorMover, but I have never seen this work.  If you get it to work, please contact me.
-TriggerType: What will activate the trigger.  Go to the section "Triggered Movers" for this.

Set "GotoKeyFrame" for each of the 4 triggers to respectively 0,1,2 and 3.

If you now play this map, and you walk in the radius of one of the triggers, the mover will go to the Key that you selected in GotoKeyFrame of the trigger, and stop there.  It does not matter where the mover starts, it will always reach the correct keyframe!

This kind of mover is called "ElevatorMover", but it can be used for other things as well, of course.  Anything that needs multiple fixed positions will need one.  A good example is a train with a button on each stop position of it to call the train. Also if you want to make a mover with only two Keys, but a separate trigger for each key, you need to use this.  

The sounds of the ElevatorMover don't work as supposed;  never use looping sounds for this mover, or they will stay playing forever.

There is also another bug: when the elevator is encroached, it will stop and never listen to any of the buttons again.  The only solution is to set MoverEncroachType to ME_IgnoreWhenEncroach.

The AssertMover

This mover will keep opening as long as you are in the trigger's radius.  When you step out, it will wait at the first keyframe it reaches on its path,  and then return.  This means the longer you are in the trigger's radius, the more the mover will open, providing it has more than 2 keys.

To add one, right click on the Add Mover button and select AssertMover.  Give it more than 2 keys, for example 4.  Set its InitialState to "AssertTriggerOpenTimed".  Give it a Tag, for example "AssertMover", and add a trigger with the same Event.

Then expand "AssertMover" in its properties, and use the following parameters:


The AssertMover Properties

-bOnceOnlyStopOpen: if this is True, the mover will stay at its last keyframe forever once it has reached it.
-CloseTimes:  The normal mover has only one MoveTime setting, that determinates the movespeed between every two keyframes.  But the AssertMover has a separate setting for each keyframe.  CloseTime[0] is the time the mover needs to close from Key1 to Key0, CloseTime[1] is the time it needs to close from Key2 to Key1, etc...  Never forget to use these instead of the MoveTime setting.  If you leave these at 0, your mover will move unrealistically fast.
-OpenTimes: OpenTime[0] is the time it needs to open from Key0 to Key1, OpenTime[1] is the time it needs to open from Key1 to Key2, etc...
Too bad, Close- and OpenTimes will only work when the InitialState is "AssertTriggerOpenTimed".  If you use any of the other InitialStates, the MoveTime will be used.  If you really want a bumpmover to have different Close- and OpenTimes, you can simulate one by attaching the trigger to the mover (see section AttachMovers for this).
-WaitUnAssertTime: this is the time the mover will wait before returning when you left the trigger's radius.

The GradualMover

The GradualMover changes its Tag at every keyframe.  So it its at Key0 it will listen to another trigger than when its at Key1.  You can also set an Event for each key, so the mover will call another Event everytime it reached one of its keys.  Add one and open its GradualProperties.


The GradualMover Properties

-CloseTimes: this is the same as the CloseTimes of the AssertMover
-Events: the events the mover will call for its first 6 keys.  You can use this for example to open a different door everytime the GradualMover is at another floor.
-OpenTimes: this is the same as the OpenTimes of the AssertMover
-Tags: the tags of the mover for its first 6 keys.  If Tag[0] is "A" and Tag[1] is "B", and the mover is at Key0, the mover will move if it receives an event "A", but not if it receives an event "B".  If its at Key1, it will only by activated by event "B" and not by event "A".

If you go to its InitialState propertie in Object, you will note that there are 3 new InitialStates:

-GradualTriggerToggle: when activated by the trigger for Tag[0] the mover will go to the last keyframe, and return to the first keyframe when triggered again by that same trigger.  The mover does not stop at the middle keyframes, and you can't use the different tags, only Tag[0] will be used.  The different Events work, of course.

-GradualTriggerPound: this makes the mover go a little weird.  When I tested it looked most like this:  when you enter the trigger's radius for the first time, it will open and then close.  When you leave the radius it will open and close again.  But when you enter the trigger again, it will suddenly act like a GradualTriggerOpenTimed mover, which is described below.  The trigger I mentioned was Trigger0 of the example below.

-GradualTriggerOpenTimed: this is the only InitialState that fully uses the different tags.  If the mover is closed, and if Tag[0] is "A", Tag[1] is "B" and Tag[2] is "C", and the corresponding triggers have the same events, Trigger0 will make the mover go to Key1.  It will wait there forever, until you activate Trigger1.  Then the mover will go to Key2.  This is the last key in this example, so now the mover will wait for StayOpenTime and then go back to Key0.  If you use 6 different keys, you will have a mover that will only reach its last key after you activated 5 triggers in the correct order (the last key doesn't need a trigger).  Plus you can use the different Events of the mover to activate other things.

ReturnGroup

Quite important, but not known by a lot of people, is the ReturnGroup setting for movers.  It is used to divide movers with the same Tag into subgroups.  

If you encroach a mover (= block its path), it will stop or return (or crush or ignore you, but that's not important in this section), depending on its MoverEncroachType.  If you have different several movers with the same Tag, and you encroach one of them, the other movers will stop or return as well!  If you don't want this to happen, the only thing you have to do is give each mover a different ReturnGroup.  Now your two movers have still the same Tag (activated by the same trigger etc...), but will not return or stop together when encroached.

Warning: when you add movers, no matter how many, the Tag of all of them will be by default "Mover", this means all movers have the same Tag if you don't give them another one yourself.  If you ever had doors acting strange when encroaching an elevator in your map, and wondered why, this is the reason.  To avoid this give them different Tags or give them different ReturnGroups.

Some mover classes, like the GradualMover will also return or stop together if they have different Tags.  You always have to give them different ReturnGroups if you don't want this.  If you have made a puzzle using gradualmovers, the puzzle can be ruined if you don't give them a different ReturnGroup!

If you have normal movers with different Tags but the same ReturnGroup, they will also stop or return together.

More Mover Properties  

This lists all the mover properties that weren't explained yet in the other sections.

-bDamageTriggered: the mover will be triggered if it gets the damage amount defined by DamageThreshold.  This only works if the InitialState of the mover is TriggerOpenTimed or TriggerToggle.  For a list of the damage of the UT weapons, and more about InitialState, go to the section Triggered Movers.
-bSlave: makes the mover brush a slave of another mover with the same Tag.  This is another way to attach movers to each other, and the effect is the same as if you would use the AttachTag of a mover.
-bUseTriggered: this was supposed to activate the mover when a player pushed a key on the keyboard, like the use key in HalfLife.  This was left away in the final version of Unreal.
-DamageThreshold:  The amount of damage the mover needs to get to be opened when it is bDamageTriggered.

Part III

A door that opens by pushing a button

This will be a regular door, that is opened by a button.  The button itself is also a mover that disappears in the wall when you push it, and returns after a few seconds.  There will not be used any triggers.

First make two rooms and connect them with a door.  Set the InitialState of the door to TriggerToggle or TriggerOpenTime, and set its Tag to "Door".  Now add a mover that looks like a button next to the door.  Make Key0 the position of the button outside the wall, and Key1 the position of the button inside the wall.  Set its Event to "Door".  You can also use BumpEvent instead, then the door will open as soon as you touch the button, instead of after its completely in the wall.  You should see a red line going from the button to the door.

Now make a similar button for the other room (otherwise you will not be able to open the door again when you're in the other room).

That's it, its done!


The door with buttons

A train with a button

This train will have one button in it to toggle between two stations.  In the stations will be placed a button as well to call the train.

Make a large area and make tracks.  Then make a mover that looks like a train with a button in it, and let it be able to go to both stations.


The train mover

Set the train's InitialState to TriggerToggle and Tag to Train.  Add a trigger in the train, set both its AttachTag and Event to Train.  The trigger will now move when the train moves, so it will always follow the train.  Sometimes this might give small problems, especially if you give the trigger a small radius.  So give the trigger a large radius.  If you would have placed two fixed triggers at the begin- and endposition of the train, you would reactivate the triggers everytime you reach the other side, so attaching it is the only solution.

Now also add two buttons with triggers in the stations, and set their Event to Train as well (but not their AttachTag!)


The triggers for the train

The buttons will call the train immediately, even if its moving.  This might be annoying in multiplayer, where players will be pressing the buttons on two sides at the same time while another player is on the train, etc...  To prevent this you can remove the triggers in the stations, or you can use an ElevatorMover for the train instead, and give it two buttons.  ElevatorMovers don't listen to triggers while moving.  The only disadvantage then is that you won't be able to give your train sound.

An example map, dm-train.unr, is included in the zipped version.

A wiggling boat

In reality, boats always wiggle a bit with the waves.  That's a good reason to make your boats or rafts in UT do this as well.

To do it, attach the boat to another mover that does the wave movement.  The keys of the boat itself are the different places it will sail to.

Rotations will not work for attached movers, but you still can make a subtle up and down movement.  Actually, I'm not sure if rotations work or not.  When I tried it, it didn't, but once I attached a mover to a bird, and the mover rotated when the bird did.

Here's a step-by-step guide on making such a boat:

Make a room or outdoor environment with water in it, and place boat or raft on the water.


The raft

Give the raft a Key1: its position on the other side of the water.  Now you have a working normal raft.

Now make a new room outside your map, with a TimedTrigger and a mover inside of it.  Set the movers InitialState to TriggerPound, set StayOpenTime and OtherTime to 0.5 and its MoveTime to 1.  Make its Key1 a little below Key0 (8 or 16 units lower).  Read the section Looping Movers to get this to work.

Give the trigger the Event "Wiggle", give the small mover the same Tag, and give the boat mover the same AttachTag.

If everything went well, it should work now.  If you play the map you will find the raft is moving up and down on the waves. It will only move up and down when it's not moving to the other side of the water.  You can't do much about that (except if you give the raft more keys), its the way the movers are programmed.

An example map, dm-boat.unr, is included in the zipped version.

A Real "Office Building" Elevator

I made a seperate page on this: elevator.html

 


Go to http://www.perilith.com/~lode/tutorials/ for more tutorials

Download

The example maps are included

movers.zip

The Future

I WILL update this tutorial

If you have any ideas, problems, suggestions, questions or have discovered a mistake, don't hesitate to contact me!  Thanks a lot.

Contact

My email adress is lode@planetunreal.com

(c)2000-2001 Lode Vandevenne

Please do not upload this tutorial to any site, only make a link to http://www.perilith.com/~lode/tutorials/movers/movers.html Otherwise older versions keep hanging around on the net.