Team Fortress 2/Creating a Payload Map

This tutorial will walk you through setting up the basic elements of a payload map. The standard convention is that the blue team attacks and the red team defends. This tutorial offers no advice as to how the layout of a payload map should be designed. For that information, see Payload Design Theory. In this tutorial you will create the train for the payload and all the necessary entities to work the map with 2 capture points on the first round. To create a single stage payload map, certain entities are unnecessary and you will be alerted to what can be omitted.
== Setting up the round ==
=== Game Rules and Logic ===
For this tutorial there is only 1 round but has been made with other rounds in mind.
*Create a and name it GameRules.
*Create a entity and select the outputs tab.
::
	My Output 	Target Entity	Target Input 	Parameter 	Delay	Only Once
	OnMapSpawn 	GameRules 	SetRedTeamRole 	1 	0.00 	No
	OnMapSpawn 	GameRules 	SetBlueTeamRole 	2 	0.00 	No
	OnMultiNewMap	GameRules 	SetRedTeamRespawnWaveTime 	4 	0.00 	No
	OnMultiNewMap	GameRules 	SetBlueTeamRespawnWaveTime	8 	0.00 	No
	OnMapSpawn 	GameRules 	SetBlueTeamGoalString 	#Goldrush_blue_final_goal	0.00 	No
	OnMapSpawn 	GameRules 	SetRedTeamGoalString 	#Goldrush_red_final_goal 	0.00 	No
*Place a and name it CP_master, and adjust the properties (not all are displayed).
::
Property Name 	Description 	Value
Name 	Name of the entity 	CP_Master
Start Disabled 	Self-explanatory 	No
Cap Layout 	Self-explanatory 	
Restrict team from winning 	Self-explanatory 	Red
Switch teams on map win? 	Self-explanatory 	Yes
Scoring Style 	Self-explanatory 	Add team score for each captured point
Play all rounds before changelevel	Self-explanatory 	Only changelevel after all mini-rounds have been played to completion
Partial cap rate 	Rate at which to give partial cap points for area captures	0.1
=== Round Entities ===
Next, an entity must be set up for each round in a round-based payload map. 
*Create a entity, and name it Round_A.
Set the properties as follows:
::
Property Name 	Description 	Value
Name 	Name of the entity 	Round_A
Start Disabled 	Self-explanatory 	No
Print Name 	Self-explanatory 	
Priority 	Higher rounds are played first	#TotalRounds
Control points in this round	Self-explanatory 	CP_A_1 CP_A_2
Restrict team from winning 	Self-explanatory 	Red
=== Round Timer ===
Now we will create entities that will ensure that if the round time runs out, that Red team will win.
*Create a entity and name it Round_Win Set Team to Red. 
*Create a entity and set the following properties:
::
Property Name 	Description 	Value
Name 	Name of the entity	Round_Timer
Timer length (in seconds) 	Self-explanatory 	270
Max timer length (in seconds) 	Self-explanatory 	600
Start paused 	Self-explanatory 	No
Setup timer length (in seconds)	Self-explanatory 	70
Reset time on round restart 	Self-explanatory 	Yes
Go to outputs and enter the following new outputs: 
::
	My Output 	Target Entity	Target Input	Parameter	Delay	Only Once
	OnFinished 	Round_Win 	RoundWin 	 	0.00 	No
	OnSetupFinished	SetupGate 	Open 	 	0.00 	No
This sets the winner of the round to Red when time runs out, and opens the SetupGate after the setup timer expires. 
=== Filters ===
Now we will create important filters for this gametype.
*Create a entity with the following properties:
::
Property Name	Description 	Value
Name 	Name of the entity	Filter_Cart
Filter mode 	Self-explanatory 	Allow entities that match criteria
Filter Name 	Self-explanatory 	Bomb_Model
	
	
This entity is used so only the cart prop will activate the final capture and explosion.
*Create a entity with the following properties:
::
Property Name 	Description 	Value
Name 	Name of the entity	Filter_Players
Filter mode 	Self-explanatory 	Disallow entities that match criteria
Filter Classname	Self-explanatory 	player
			
			
This entity is used to prevent players from being hurt by the cart.
*Create a entity with the following properties:
::
Property Name 	Description 	Value
Name 	Name of the entity	filter_A_2
Filter mode 	Self-explanatory 	Allow entities that match criteria
Associated Control Point	Self-explanatory 	CP_A_2
	
							
This filter is used for any entity that should be usable by the owner of the Second Capture Point of the First Round. This could apply to Spawn Door Triggers, Resupply/Regeneration Triggers, etc.
*Create another entity with the following properties:
::
Property Name 	Description 	Value
Name 	Name of the entity	filter_B_2
Filter mode 	Self-explanatory 	Allow entities that match criteria
Associated Control Point	Self-explanatory 	CP_B_2
	
Similar to the entity above, this filter should be used for any entity that should be usable by the owner of the Second Capture Point of the Second Stage.
== Building the payload ==
=== Prepping the payload ===
thumb|right|200px|Basic payload train.
This section will help you build the train section and the entities needed to get it to function.
First we create a simple brush entity that represents the payload train.
*Create a brush the same size of the payload model(64 79 128), but using the tools/toolsclip texture and make it a (with ctrl+t). Name this brush Bomb_Train.
:
*Set the origin of the to be above the train. This will ensure that the spectator camera view of the cart is above the cart, and not in the cart. 
:
Now we add the actual physics prop for the train.
*Create a and set the following properties:
::
Property Name 	Description 	Value
Name 	Name of the entity 	Bomb_Model
Pitch Yaw Roll 	Y Z X 	0 180 0
World Model 	Self-explanatory 	models/props_trainyard/bomb_cart.mdl
Disable Shadows	Self-explanatory 	Yes
Fade Scale 	Forcible fade distance	0
:
Now we need to attach the cart's model to the Bomb_Train.
*Create a phys_constraint with the parameters:
::
Property Name	Value
Name 	Bomb_Const
Entity 1 	Bomb_Train
Entity 2 	Bomb_Model
Now we need to add a volume to keep objects from getting stuck on the cart.
*Create a brush slightly larger than the payload model, but this time use the tools/tooltrigger texture and make it a brush. Set the following properties for this trigger:
::
Property Name	Description 	Value
Parent 	Entity bound to 	Bomb_Train
Filter Name 	Applicable Filter	Filter_Players
Damage 	Self-explanatory 	1000
::Edit the flags: Uncheck Clients, Check Everything (not including physics debris)
Now we need to create the capture or push zone around the payload cart.
*Using the tools/toolstrigger texture create a box around the train to be used as the capture zone. Make this a and set the following properties:
::
Property Name	Description 	Value
Name 	Name of the entity	Bomb_CapArea
Parent 	Entity bound to 	Bomb_Train
:
Now it's time to set up the regeneration zone around the cart.
*Create another box using the tools/toolstrigger texture again around the train. Make this brush the same size as the Bomb_CapArea. This new trigger will be the health and ammo regeneration zone. Make this into a with the following properties:
::
Property Name	Description 	Value
Name 	Name of the entity	Bomb_Dispense
Parent 	Entity bound to 	Bomb_Train
=== Activating the payload ===
In this section you will need to set the values, the inputs and the outputs required to get the train working. First we will set some additional properties in the Bomb_CapArea. Make sure the following properties are set:
::
Property Name 	Description 	Value
Name 	Name of the entity 	Bomb_CapArea
Start Disabled 	Self-explanatory 	No
Parent 	Self-explanatory 	Bomb_Train
Control Point 	The cap assigned to this trigger 	CP_A_1
Can RED cap? 	Self-explanatory 	No
Can BLUE cap? 	Self-explanatory 	Yes
Number of RED players to cap 	Self-explanatory 	1
Number of BLUE players to cap	Self-explanatory 	1
RED spawn adjust 	How much to change the spawn time on cap	0
Blue spawn adjust 	How much to change the spawn time on cap	0
Time to cap 	Prevents capture by standing in the zone	99999
Next, we can work on the Bomb_Train. This tutorial presumes that you want the mine cart sounds from Goldrush. Make sure these variables are set correctly:
::
Property Name 	Description 	Value
Name 	Name of the entity 	Bomb_Train
First Stop Target 	Self-explanatory 	Track_A_01
Max Speed 	Self-explanatory 	90
Change Velocity 	How the acceleration is handled	Linear blend
Distance Between the Wheels	Self-explanatory 	20
Damage on Crush 	Self-explanatory 	99999
Move Sound 	Self-explanatory 	Cart.Roll
Start Sound 	Self-explanatory 	Cart.RollStart
Stop Sound 	Self-explanatory 	Cart.RollStop
Manual Train Speed 	Self-explanatory 	On
Manual Accel Speed 	Self-explanatory 	70
Manual Decel Speed 	Self-explanatory 	150
*Additionally, click on the Flags tab and check No User Control and Is unblockable by player.
== Building the Track ==
You may want to lay track models first until you know what each model is. 
thumb|right|200px|Trains path.
You now have a working train but you will now need to build a line for it to run on.
*Create a entity and place it where you want to start the track, Name this Track_A_01.
*Create another and place it where you next want the line to follow and name this Track_A_02.
*Click back on Track_A_01 and set Next Stop Target to Track_A_02.
*Keep creating new and continue naming and linking them in the line you want the train to follow.
To mimic the track models seen in tf2, use several entities to generate the track segments, and place these on the path underneath the entities. 
*The models required are those named props_mining/track*.mdl with the asterisk in place of the type of track segment required. 
*For the model around the midpoint capture points, use a entity, with the world model as props_trainyard/track_midcap.mdl. Name your first capture point model CP_A_1_Model.
== Adding a Capture Point == 
thumb|right|200px|Middle capture point.
There are generally two capture points per round: midpoint captures and endpoint captures.
=== Mid point cap ===
First, make sure you have your static CP_A_1_Model in place. Next, find the Path_Track that sits directly on top of that model. In this example it's Track_A_24.
*Select the middle and go to the outputs tab. Add the following outputs:
::
	My Output	Target Entity	Target Input 	Parameter	Delay	Only Once
	OnPass 	CP_A_1_Model 	Skin 	1 	0.00 	Yes
	OnPass 	Bomb_CapArea 	CaptureCurrentCP	 	0.00 	Yes
	OnPass 	Round_Timer 	AddTeamTime 	3 240 	0.00 	Yes
	OnPass 	Track_A_23 	DisablePath 	 	0.00 	Yes
	OnPass 	cap_sound 	PlaySound 	 	0.00 	Yes
	OnPass 	Bomb_Sparks 	StopSpark 	 	0.00 	Yes
	OnPass 	CP_A_1 	SetOwner 	3 	0.10 	Yes
This performs several important functions when the payload cart reaches this track point. It changes the skin on the capture point model, it captures the area for blue team, disables rollback to the previous track point, plays a sound and stops sparking effects, as well as adding time to blue team's assault via the Round_Timer.
Now we need to create the entity and position it so that it is floating over the center of the model and track point.
*Set the following properties on your newly created :
::
Property Name 	Description 	Value
Name 	Name of the entity 	CP_A_1
Start Disabled 	Self-explanatory 	No
Print Name 	Name to display on HUD 	#Goldrush_cap_1_A
Group Index 	N/A 	0
Default Owner 	Team 	Red
Index 	#ofCapPoint starting at 0	0
Warning Type 	Announcer 	No Announcements
BLUE Previous Required Point	Self-Explanatory 	CP_A_1
::Set the following output:
::
	My Output 	Target Entity	Target Input 	Parameter	Delay	Only Once
	OnCapTeam2	Bomb_CapArea 	SetControlPoint	CP_A_2 	0.00 	Yes
This effectively creates a capture point. This will display a red hologram over the point until blue captures the point, thus displaying a blue hologram. Additionally, the output sets the next capture point for the payload. 
=== End point cap ===
Set up this point's entity with the same properties as CP_A_1, but with the following changes:
::
Property Name 	Description 	Value
Name 	Name of the entity 	CP_A_2
Print Name 	Name to display on HUD 	#Goldrush_cap_1_B
Index 	#ofCapPoint starting at 0	1
BLUE Previous Required Point	Self-Explanatory 	CP_A_1
::Don't forget, this entity needs the following output:
::
	My Output 	Target Entity	Target Input 	Parameter	Delay	Only Once
	OnCapTeam2	Bomb_CapArea 	SetControlPoint	CP_B_1 	0.00 	No
This sets up the capture point for the next round.
*Set the following outputs on your second to last . For this tutorial it is Track_A_42.
Set Track_A_42 Outputs:
::
	My Output	Target Entity	Target Input 	Parameter	Delay	Only Once
	OnPass 	Bomb_CapArea 	CaptureCurrentCP	 	0.00 	No
	OnPass 	Bomb_CapArea 	Disable 	 	0.00 	No
	OnPass 	Bomb_Light 	Stop 	 	0.00 	No
	OnPass 	Bomb_Train 	Stop 	 	0.00 	No
	OnPass 	cap_sound 	PlaySound 	 	0.00 	Yes
	OnPass 	CP_A_2 	SetOwner 	3 	0.10 	Yes
	OnPass 	Bomb_Train 	SetSpeedDirAccel	1 	1.00 	No
The last should be underneath this one in order for the cart to ride down the chute like in Goldrush. This final track point, Track_A_43, should have the following Outputs:
::
	My Output	Target Entity	Target Input 	Parameter	Delay	Only Once
	OnPass 	Bomb_Train 	TeleportToPathTrack	Track_B_1	0.00 	No
	OnPass 	Bomb_Train 	Stop 	Track_B_1	0.00 	No
	OnPass 	Bomb_CapArea 	Enable 	 	0.00 	No
This will teleport the cart to the next round's starting track point, and enable it's push area.
== Train Watcher ==
The next stage is to add in the train display, which is also used to tell when the train should start rolling back.
*Create a and name this Watcher_A. If you are creating a multi-round map, create a watcher for each round. Set the properties of the first round team_train_watcher to:
::
Property Name 	Description 	Value
Name 	Name of the entity	Watcher_A
Start Disabled 	Self-explanatory 	No
Train to watch 	Self-explanatory 	Bomb_Train
Allow the train to recede 	Self-explanatory 	Yes
Train recede time (in seconds)	Self-explanatory 	0
Handle Train Movement 	Self-explanatory 	Yes
Default Speed Modifier 	Self-explanatory 	1
Associated env_spark 	Self-explanatory 	Bomb_Sparks
Node that the path starts at 	Self-explanatory 	Track_A_01
Node that the path ends at 	Self-explanatory 	Track_A_43
Linked PathTrack 1 	Self-explanatory 	Track_A_24
Linked CP 1 	Self-explanatory 	CP_A_1
Linked PathTrack 2 	Self-explanatory 	Track_A_42
Linked CP 2 	Self-explanatory 	CP_A_2
Linked PathTrack 3 	Self-explanatory 	
Linked CP 3 	Self-explanatory 	
Min Speed for Speed level 1 	Self-explanatory 	1
Min Speed for Speed level 2 	Self-explanatory 	60
Min Speed for Speed level 3 	Self-explanatory 	80
Subsequent watchers should be created for each round with appropriately modified variables, such as the name, linked control points, and linked path tracks and nodes. The rest of the variables can stay the same.
== Additional Effects ==
On Gold Rush and Badwater, additional effects are added to the cart, such as the dispenser beam, a flashing light, and sparks while the train is moving backwards along the track. Both are simple entities that start and stop depending on certain conditions.
=== Dispenser Beam ===
Now we will add a dispense beam effect to the train.
*Create a entity and place it where you want the healing beam to come from. Set the following properties:
::
Property Name 	Description 	Value
Name 	Name of the entity	Bomb_DispenseBeam
Parent 	Entity bound to 	Bomb_Train
Team 	Selt-explanatory 	Blue
Custom Touch Trigger	Trigger zone 	Bomb_Dispense
=== Flashing Light ===
*Create a and align it with the light on top of the bomb cart, and name it Bomb_Light
::
Property Name 	Description 	Value
Name 	Name of the entity	Bomb_Light
Parent 	Self-explanatory 	Bomb_Train
Particle System Name	Self-explanatory 	cart_flashinglight
Start Active? 	Self-explanatory 	No
=== Sparks ===
*Create a entity at the bottom center of both rear wheels and name it Bomb_Sparks
::
Property Name 	Description 	Value
Name 	Name of the entity	Bomb_Sparks
Parent 	Self-explanatory 	Bomb_Train
Spark Trail Length	Self-explanatory 	Medium
=== Capture Bell ===
On Badwater and Gold Rush, a bell "ding" is used to announce point captures by BLU. Making this sound is simple.
*Create a new and name it cap_sound
::
Property Name	Description 	Value
Name 	Name of the entity	cap_sound
Sound Name 	Self-explanatory 	Hud.EndRoundScored
==Final Terminus==
thumb|right|300px|Place for explode in Hammer
Now we are going to create a basic version of the explosion at the final terminus. KaBOOOOOOM!
===Final Capture Point===
*Make sure your final team_control_point has its properties properly configured, with Index # reflecting the highest number of total capture points. 
*Also, the print name should be increased correctly in sequence, 
*Additionally, BLUE Previous Required Point 1 should reflect the previous point's entity name.
*Finally, set the following Flags as checked:
::
Flag Name 	Description 	Value
Start with model hidden	Self-explanatory	True
Disable Shadow 	Self-explanatory	True
Disable Sounds 	Self-explanatory	True
===Explode Pit===
====Pit Model====
*First you should create a pit for the cart to fall into for the final explosion. After you've created the brushwork, cover the pit with the following models. 
*Create a prop_static with World Model models/hybridphysx/badwater_destruction_before.mdl 
*Make another with World Model models/props_farm/sewer_cap001a.mdl.
====Doors to Pit====
*Create two brush-entities func_door, with the material glass/glasswindow002a on the upper face.
Parameters for two func_door:
::
Property Name 	Description 	Value
Name 	Self-explanatory	cap_door
Speed 	Self-explanatory	700
Move Direction (Pitch Yaw Roll)	Self-explanatory	0 270 0
*In Flags check Touch Opens to false and check Toggle to true.
*On one of two doors create the outputs:
::
	My Output 	Target Entity	Target Input	Parameter	Delay	Only Once
	OnFullyOpen	cap_door 	kill 	 	0.00 	No
It will destroy the door when it's fully open.
*In the pit create a brush-entity trigger_hurt with the parameters Damage - 1000, Damage Cap - 1000.
*Create a brush-entity func_nobuild on the upper doors with parameter Team - Any.
====Barrels in Pit====
*Create 10-15 entities prop_dynamic_override with WorldModel models/props_badlands/barrel03.mdl and Name - End_Barrels
===Final Explosion===
*Create near pit three .
Parameters of the first:
::
Property Name	Description 	Value
Name 	Self-explanatory	Cart_tip
SoundName 	Self-explanatory	Cart.Falling
Parameters of the second:
::
Property Name	Description 	Value
Name 	Self-explanatory	pre_kaboom
SoundName 	Self-explanatory	Cart.Trigger
Parameters of the Third:
::
Property Name	Description 	Value
Name 	Self-explanatory	kaboom
SoundName 	Self-explanatory	Cart.Explode
Additionally, create an entity with the following properties:
::
Property Name	Description 	Value
Name 	Self-explanatory	kaboom_shake
Amplitude 	Self-explanatory	16
Effect Radius	Self-explanatory	500
Duration 	In seconds 	1
Frequency 	Self-explanatory	150
::Set the following Flags as checked:
::
Flag Name 	Value
Global Shake	True
In Air 	True
*Now create under doors one with parameters:
::
Property Name 	Description 	Value
Name 	Self-explanatory	pit_effect
Particle System Name 	Self-explanatory	cinefx_goldrush
Pitch Yaw Roll (Y Z X)	Self-explanatory	-90 0 0
*Now create with properties:
::
Property Name 	Description 	Value
Name 	Self-explanatory	KaBoomZone
Start Disabled	Self-explanatory	Yes
::Set the following outputs:
::
	My Output 	Target Entity	Target Input	Parameter	Delay	Only Once
	OnStartTouch	!activator 	SetHealth 	-1000 	0.00 	No
Now we are ready to address the outputs for the final . 
*Set the outputs as follows:
::
	My Output	Target Entity	Target Input 	Parameter	Delay	Only Once
	OnPass 	cap_door 	Open 	 	0.00 	No
	OnPass 	Cart.tip 	PlaySound 	 	0.00 	No
	OnPass 	Bomb_Light 	Stop 	 	0.00 	No
	OnPass 	CP_C_2 	SetOwner 	3 	0.10 	No
	OnPass 	Bomb_Train 	kill 	 	0.00 	No
	OnPass 	Bomb_Const 	Break 	 	0.01 	No
	OnPass 	pre_kaboom 	PlaySound 	 	0.50 	No
	OnPass 	Bomb_CapArea 	CaptureCurrentCP	 	2.00 	No
Finally, create a brush at the bottom of the pit where you want the cart to explode. 
*Set the following properties:
::
Property Name 	Description 	Value
Name 	Self-explanatory 	Final_Trigger
Start Disabled	Self-explanatory 	No
Filter Name 	Associated Filter	Filter_Cart
::Add the following outputs:
::
	My Output	Target Entity	Target Input	Parameter	Delay	Only Once
	OnTrigger	kaboom 	PlaySound 	 	0.00 	No
	OnTrigger	kaboom_shake 	StartShake 	 	0.00 	No
	OnTrigger	pit_effect 	Start 	 	0.00 	No
	OnTrigger	end_barrels 	kill 	 	0.00 	No
	OnTrigger	Bomb_CapArea 	kill 	 	0.00 	No
	OnTrigger	Bomb_Model 	kill 	 	0.00 	No
	OnTrigger	KaBoomZone 	Enable 	 	0.00 	No
	OnTrigger	KaBoomZone 	Disable 	 	0.10 	No
::Set the Flags to only Physics debris true, with every other flag false.
====Timeline====
So what happens is:
0.0:
*open doors to pit
*destroy Bomb_Train
*cart tipping sound played
*cart effects disabled
0.01:
*detach and fall cart's model
0.5:
*"beep" sound played
On Contact with Trigger:
*play ka-boom sound
*play ka-boom effect
*ka-boom shakes screen
*destroy barrels
*destroy cart's model
*capture final CP
*destroy Capture Zone
*activate killing zone
After Contact (.1 seconds):
*deactivate killing zone
You should now have at least a fully working 1 stage round of payload style game play, if you have taken in this tutorial fully you should be able to change the number of rounds and capture point to anything you need.
== See also ==
* Creating rollback/rollforward zones for payload maps
* Team Fortress 2 Level Creation
Category:Level Design
Creating