ETF Mapping

From Wikibooks, open books for an open world
Jump to: navigation, search

ETF is a direct port of a Quake III mod called Q3F (which has ceased in development) to Enemy Territory. This wiki covers the use of entities in ETF map making. It is apparently adapted from the Q3F Map Entity Documentation.

Overview[edit]

What it's all about[edit]

The ETF entities are intended to be an extension to existing entities rather than replacing the current entities (at least, as far as possible). Currently, they're both incomplete and potentially bug-ridden. Many features we'd like to add haven't yet been added, and some entity types will not coexist happily with the extensions.

Initially the entities info_notnull, func_goalitem, func_commandpoint and func_goalinfo defaulted to a 30 second wait when there was NO wait field given. This default wait has been removed since Beta1f to stop some serious issues and make the entities more logical. If your map was based around this default wait, a recompile is needed.

Some of the worldspawn fields have changed, to make them shorter. Q3 couldn't parse the long keys and gave errors on compile. Finally, the ammo_bullets is now called ammo_nails, which is more logical, too.

You can now use the mapinfo files to set atmosphere and class names, names, team names, allied teams, etc. throughout the whole map or for a specified gameindex.

Basic Principles[edit]

Essentially, each entity has a 'state', as follows:

Invisible This entity is not triggerable, nor is it visible (although this has some odd side effects, e.g. invisible doors still stop people from walking through them).
Disabled This entity is not triggerable.
Inactive This entity is idle (and can be thought of as 'touchable'). For goalitems, this means 'back at base'.
Active This entity is active, and (depending on its settings), will go back to inactive after a set time. For goalitems, this means 'lying on the ground'.
Carried This state only applies to goalitems.

When successfully touched by a player, an entity will attempt to go to carried/active state. After a set time, active entities will automatically go back to inactive.

Entities can also trigger other entities in a 'cascade' of triggers, by using <state>target keys, e.g. on a flag entity you might have "carriedtarget" "alarms" - that would activate all 'alarms' entities when a flag became carried.

There are a set of criteria checked before an entity can be triggered (although triggers can also be 'forced' to ignore criteria, more on this later).

In addition to this, players can be 'given' bonuses, and teams can be given scores, as well as having messages and sounds played.

What it can do[edit]

  • It can be used to create complex map effects and the like (think of Team Fortress), as well as some degree of 'scripting'.

What it can't do[edit]

  • It can't be used as a language in its own right - it will maintain no variables, parse no scripts. This may become available in a future release, but not right now (also, there would be performance questions in a scripting language).

Examples[edit]

Trigger Types[edit]

There are six main sorts of triggers you'll use:

Brush triggers This is something like a trigger_multiple - an area brush that triggers when you walk over it.
Point triggers These are used as func_goalinfo entities, and can have mins and maxs set to define their actual size. They trigger when you walk into the defined area surrounding the entity - they can also do other effects, such as showing a model that becomes invisible while active, etc.
Untouchable triggers These are usually set as info_notnull, and act as relays or simply alternative triggers (i.e. two entities with the same name, one only triggerable by blue and one only triggerable by red).
Flags These are used as func_goalitem entities (or func_flag, same thing), and are 'carried' by the player when successfully touched.
Standard entities These are things like func_door, or info_player_start entities - they act in more or less the usual fashion, but the criteria and cascading triggers still operate.
Special entities These are things like the func_commandpoint - new entities that have special behaviour defined by the entity. (More on these later).

Sample Flag[edit]

A 'flag' is a carryable entity that can only be carried by one team, and does various effects when carried.

{
    // The red flag 

    "classname" "func_goalitem"
    // this one is set by the editor when you position the entity:
    "origin" "1248 1984 -328"

    // What it looks like    
    "model" "models/flags/r_flag.md3"    // Model to use    
    "light" "200"                        // Dynamic light
    "color" "1 0 0"                      // Pure red
    "sparkle" "1 0 0"                    // Generate smoke puffs around carrier

    // What it's called
    "groupname" "redflag"

    // Criteria
    "allowteams" "blue"    // Only blue players can trigger (i.e. carry)

    // Messages on trigger
    // Centerprint message to activator:
    "carried_message" "~You have taken the ^1RED^* flag!"
    // Tell everyone activator has done it:
    "carried_all_message" "~%N has TAKEN the ^1RED^* flag!"
    // Tell everyone activator dropped the flag:
    "active_all_message" "~%N has DROPPED the ^1RED^* flag!"
    "inactive_all_message" "The ^1RED^* flag has returned."
    // Play Sound to team:
    "carried_team_sound" "~sound/teamplay/voc_team_flag.wav"
    // Play Sound to non-team players:
    "carried_nonteam_sound" "~sound/teamplay/voc_enemy_flag.wav"
    // Play Sound to activator:
    "carried_sound" "~sound/teamplay/voc_you_flag.wav"

    // Flaginfo (shown on \flaginfo command)
    "carried_flaginfo" "%N has the ^1RED^* flag."
    "active_flaginfo" "The ^1RED^* flag has been dropped at $l."                    
    // Flags must use $l for active_flaginfo and active_all_message
    "inactive_flaginfo" "The ^1RED^* flag is at the red base."

    // Misc
    // Reveal spies on trigger, show flag above player when carried:
    "flags" "revealagent,showcarry"
    // Wait 45 seconds before going inactive (i.e. back to base):
    "wait" "45"
}

Sample Capture Point[edit]

Now we have a flag, we need somewhere to capture it.

{
    // The capture point in the blue base

    "classname" "trigger_multiple"
    // Origin/size defined by brush (never set)
    "model" "*10"

    // Criteria
    // Only trigger if activator holds redflag:
    "holding" "redflag"

    // Messages
    // Centerprint message to everyone:
    "active_all_message" "~%N has CAPTURED the ^1RED^* flag!"
    "active_message" "You have scored 2 frags for capturing the flag."
    // Play sound to activator:
    "active_sound" "~sound/teamplay/voc_blue_scores.wav"
    // Play sound to activator's team (apart from activator):
    "active_team_sound" "sound/teamplay/flagcap_blu.wav"

    // 'Give' bonuses
    "give" "score=+2,health=+100,armor=+200,ammo_shells=+200,ammo_nails=+200,ammo_cells=+200,ammo_rockets=+200,ammo_medikit=+50,gren1=+4,gren2=+2"    
    // Give activator's team 10 points (the teamscore, not the players on the team):
    "teamscore" "10"

    // When activated, force redflag to inactive (back to base),
    // trigger scorer (optional extra 10 points entity):
    "activetarget" "redflag=~inactive,scorer"
}

Sample Command Point[edit]

To make things a little more interesting, why don't we have a 'scorer' command point that gives players an extra 10 points when they capture the flag?

{
    // A button to press to claim the command point

    "classname" "func_button"
    "model" "*1"
    "angle" "-2"
    "wait" "5"
    // Trigger the scorer command point when activated:
    "activetarget" "scorer_cp"
}

{
    // The scorer command point (no model, so must be triggered by another entity)

    "classname" "func_commandpoint"
    "origin" "448 832 -128"

    // Misc
    "groupname" "scorer_cp"

    // Messages
    "active_all_message" "~%N has claimed the\ncapture bonus for the %T!"

    // On activation (i.e. touch if we have a model, or trigger by a button
    // or something otherwise)
    // All entities named 'scorer' are locked to activators team:
    "teamset" "scorer"
    // Set scorer to inactive (i.e. ready to be activated):
    "activetarget" "scorer=inactive"
}

{
    // An untouchable 'scorer' entity
    "classname" "info_notnull"    
    "origin" "444 828 -84"         // Hardly 'essential' in this case...

    // Misc
    "groupname" "scorer"           // So other entities can reference
    // Prevent scorer from being triggered initially
    // (i.e. until command point is claimed):
    "initialstate" "disabled"

    // On activation
    "teamscore" "10"               // Give the activator's team 10 points
    // Go inactive after 1 second (the chances of someone capturing twice
    // in under a second are pretty slim...):
    "wait" "1"
}

Sample Hud[edit]

We've forgotten something - we need to show a player if he's carrying the flag or not, or he's liable to get confused (and upset if he finds he's had it for the last 5 minutes without capturing). We need a HUD entity.

{
    // A HUD entity shown to the red flag carrier
    "classname" "func_hud"
    "origin" "1252 1980 -292"

    // Entity never actually activates, just show this model:
    "inactive_model" "models/flags/r_flag.md3"
    "slot" "1"            // Display it in slot 1 (top left)
    "holding" "redflag"   // Only player holding redflag can see this entity
}

Reference[edit]

Entity States[edit]

Essentially, each entity has a 'state', as follows:

Invisible This entity is not triggerable, nor is it visible (although this has some odd side effects, e.g. invisible doors still stop people walking through them).
Disabled This entity is not triggerable.
Inactive This entity is idle (and can be thought of as 'touchable'). For goalitems, this means 'back at base'.
Active This entity is active, and (depending on its settings), will go back to inactive after a set time. For goalitems, this means 'lying on the ground'.
Carried This state only applies to goalitems.

When a player touches an entity and the criteria are passed, it will be triggered to carried (if it's a carryable entity), or active.

Unless forced (see targets), only certain state changes are permitted (note that you cannot change state to the current state (nothing at all will happen):

  invisible disabled inactive active carried
invisible   * *    
disabled *   *    
inactive * *   * *
active     *   *
carried     * *  

When an entity changes state, it will trigger any messages or sounds for that state, as well as executing give (only when in carried/active state, depending on whether it can be carried), teamscore (again, only in carried/active) and <state>target (see targets).

An entity can have its state changed a maximum of 5 times (currently) per-frame single frame - this is to prevent infinite loops from hanging the server - but you would be wiser to avoid any situations where this kicks in (since you cannot always be sure what state the entity will end up in, particularly if the limit changes).

Messages[edit]

When an entity changes state, messages and sounds can be sent out to various players, optionally with the 'force' flag (prefixing the string with a ~ symbol). The force flag causes messages to be centerprinted and sounds to be global (i.e. no attenuation). Messages can be sent to four different groups: The activator, the activator's team (excluding activator), all players not on the activator's team, or all players.

<state>_message Send a message to the activator.
<state>_team_message Send a message to the activator's teammates.
<state>_nonteam_message Send a message to all players not on the activator's team.
<state>_all_message Send a message to all players.
<state>_sound Play a sound to the activator (currently, plays globally as though ~ was specified).
<state>_team_sound Play a sound to the activator's teammates (currently, plays globally as though ~ was specified).
<state>_nonteam_sound Play a sound to all players not on the activator's team (currently, plays globally as though ~ was specified).
<state>_all_sound Play a sound to all players.

<state> in the above strings means the state to play on, e.g. active_message. For sounds, currently only sounds everyone can hear (<state>_all_sound) can be played 'unforced' (i.e. fades with distance from the entity).

Additionally, there is another prefix that is not a state. This is the kill prefix. It is used just as the other messages, but useful for o.a. trigger_hurt entities. Example: "kill_all_message" "%n shouldn't have been here." as a keypair on a trigger_hurt will display "Dummy shouldn't have been here." as a deathmessage when the player called Dummy gets killed by the trigger_hurt.

Messages can also contain tokens that are expanded as required. Tokens in UPPERCASE represent the activator (if present). Tokens in lowercase represent the entity itself:

%H Health
%A Armor
%L Location (returns 'unknown location' if unable to work it out)
%D Location of last death.
%R Last reported location (i.e. identical to last %L)
%T Team name (e.g. "Red Team", "Blue Team" etc.)
%C Team colour (e.g. red, blue etc.)
%G Disguise (returns 'not disguised' if not wearing a disguise)
%N Name (player name / entity groupname (or one of them)
%E State (e.g. "active", "carried" etc.)
%S Class (e.g. "soldier", "medic" etc.)

For example, you could say:

"active_flaginfo" "The ^1RED^* flag has been dropped at $l."
// $l is used for locations of the goalitem entity dunno why but it is.

Incidentally, you can use these tokens in communications as well (case does not matter), save that you require $ instead of %. If you want to annoy everyone on the server, just say "Hello $r, I'm $n of the $t." (I wouldn't really recommend it, though). $r is readers name now instead of $n.

Flaginfo[edit]

Flaginfo is sent to players who execute a \flaginfo command. All entities that have a <state>_flaginfo will have that info sent to the client. Normally, it's flags and the like that keep flaginfo, hence the command name. For flags, you'd expect a carried, active, and inactive flaginfo string, e.g.

carried_flaginfo "%N has the red flag at %L (and only %H health left)"
active_flaginfo "The red flag is lying in the field at $l" (note the lowercase and $, there's no carrier!)
inactive_flaginfo "The red flag is safe at base"

Give[edit]

Entities can 'give' bonuses to affected players when set to carried (if a carryable entity) or active (if not). The give string is of the form "give" "stat=value,stat=value,stat=value". The following stats are available:

health Health
armor Armor
damage Deal damage to the target
ammo_shells Shells
ammo_nails Nails
ammo_rockets Rockets
ammo_cells Cells
ammo_medikit Medikit ammo
ammo_charge HE Charge
score Player score (not teamscore)
gren1 Grenade type 1
gren2 Grenade type 2
quad Seconds of quad damage
regen Seconds of regen
flight Seconds of flight
battlesuit Seconds of battlesuit
invis Seconds of invisibility (shimmer invis, not agent invis)
haste Seconds of haste
invuln Seconds of invulnerability
aqualung Seconds of aqualung
ceasefire Seconds a player is unable to shoot
gas Seconds of gas
stun Seconds of stun
flash Seconds of flash
tranq Seconds of tranq
fire Amount of fire counters, every counter does a certain amount of burn damage every few seconds
armortype Armour type (as a number from 0-100). This is the amount of damage the armour saves you from*
aclass_shell If true, give 15% extra protection against shells (otherwise remove)
aclass_bullet If true, give 15% extra protection against nailgun / sniper rifle (otherwise remove)
aclass_explosive If true, give 15% extra protection against explosions (otherwise remove)
aclass_shock If true, give 15% extra protection against emp/electrical attacks (otherwise remove)
aclass_fire If true, give 15% extra protection against fire and prevent burning (otherwise remove)
aclass_all If true, set all armour classes (otherwise, remove all armour classes)

If not forced (with a ~ prefix), these values are limited to player maximums. If + or - is prefixed, they're added or removed from existing values rather than set, e.g.

"give" "health=~500,armor=+50,score=+3,quad=10,haste=10,aclass_fire=1" 

Would give a player 500 health (no matter their class max), 50 more armour (up to class max), 3 points, ten seconds of quad and haste (no matter what they had before), and fire-resistant armour.

If armortype is not specified and armour is given (i.e. the player gets more armour than they had before the command), it is automatically assumed that their armour type should be set to the maximum. If you want their armour type to remain unchanged, put in a key like "armortype=+0".

There are also a set of entity keys that affect the command:

affectteams Affect the named teams, (e.g. "red,blue") regardless of which team activated this entity
effectradius Affect only those players within the specified radius
holding Affect only those players holding these goalitems
notholding Affect only those players not holding these goalitems
clientstats Affect only those matching these clientstats

Note that the way the criteria work, it first checks affectteams and the affectteam/affectnonteam flags for players to affect, and them limits this based on the lineofsight/environment flags.

Flags[edit]

An entity's key "flags" can be used to specify a comma-separated list of boolean flags that affect the entity's behavior in multiple areas, as follows. These can be categorised as criteria/effect/command flags:

hideactive (cmd) Cause the entity to be invisible while active (e.g. for refill goalinfos).
affectteam (eff) Cause the 'give' command to affect everyone on the activator's team.
affectnonteam (eff) Cause the 'give' command to affect everyone not on the activator's team.
dropoff (eff) 'give' values 'drop off' with distance (requires a 'range' key in the entity).
lineofsight (eff) Only entities in line of sight will be affected.
environment (eff) Only entities in the same environment will be affected.
shootable (cmd) Allow shooting the entity to be equivalent to touching it (only for func_doors).
reversecriteria (cri) Causes the entity to only be triggered if the criteria are NOT met.
orclientstats (cri) Causes the clientstats criteria to be OR instead of AND.
revealagent (cmd) If triggered, the activator will lose his disguise.
showcarry (cmd) On carryable entities, cause it to be shown above the player, as with CTF flags.
chargeable (cmd) Allow HE charging the entity to be equivalent to touching it.
rotating (cmd) Cause the model to rotate and bob like an item (only for goalinfo/goalitems).
noshrink (cmd) Goal does not grow or shrink when appearing/disappearing.
nodrop (cmd) On carryable entities, stop the 'dropflag' command affecting it.
keepondeath (cmd) On carryable entities, don't drop on death.
usegauntlet (cmd) Entity must be axed instead of touched.
allowdead (cmd) Allow dead players to be selected in target_cycle use.
allowsame (cmd) Allow same player to be selected in target_cycle use.
faildirection (cmd) Forcefield direction field applies to those failing the criteria.
allowsentrylock (cmd) Sentry is allowed to lock on through forcefields (bad idea :).
disguisecriteria (cri) Criteria work on agent's apparent team/class rather than real.

Targets[edit]

The targeting system is what binds all the entities together into something more. When an entity changes state, it checks for <state>target and then attempts to set each named target to the specified state (default state if not specified is always 'active'). If forced by prefixing the state with a ~ character, criteria (and 'give'/'teamscore') are ignored, e.g.

"carriedtarget" "redalarms,escapedoors=~disabled"

Will cause the alarms to go to active (default if not specified), and forces all escape doors to be disabled, even if they're currently active (i.e. open).

To be targetable, entities must have either a targetname or a groupname key, the differences are as follows:

targetname Can only hold a single name, affects some entities - e.g. targetname will stop doors opening when players touch them, and teleporters will only look at targetnames for a destination, etc.
groupname Can hold any number of names, separated by commas, and will respond to triggers on any of them - this allows much more complex entity interactions. It will not affect entities as having a targetname will.

Wherever possible, please use groupname instead of targetname - it's much more flexible and less prone to side-effects.

Please note that unforced triggers (i.e. without a ~) will pass the same activator on to the triggered entity (i.e. the player rather than the entity passing the trigger on). Also, the criteria are still check against the activator).

If you find yourself having problems with this, try setting g_mapentDebug to 1 at the console - be warned that you'll get a lot of junk out of this, and it may not help much.

See the Entity States section for more information.

Criteria[edit]

Criteria are checks on whether or not the activator can actually trigger this entity. The following fields apply, as well as some flags:

allowteams Only the specified teams (e.g. "red,blue") are allowed
allowclasses Only the specified classes (e.g. "recon,grenadier,agent") are allowed
holding Only players holding all the specified entities (e.g. "redkey1,redkey2") are allowed.
notholding Only players not holding all the specified entities (e.g. "redkey1,redkey2") are allowed.
clientstats Only players matching the specified clientstats (e.g. "health<50,gren1=0,armour<!") are allowed (see below).
checkstate The trigger is only valid if at least one of each named entity is in the specified state, e.g. "redalarms=inactive,redflag=carried"). If you want want to ensure all named entities are in a certain state, simply give each entity a unique group and check those.
disguisecriteria Criteria work on agent's apparent team/class rather than real.

The clientstats value is a list of evaluators build up like this: [keyword][evaluator][value], with the evaluator being '=', '<', '>', '<=' or '>='. The value is an integer or '!' (indicates activators' class maximum) and the keys can be the following: health, armor, ammo_shells, ammo_nails, ammo_rockets, ammo_cells, score, gren1, gren2, quad, regen, flight, battlesuit, invis, haste, ammo_medikit, ammo_charge, invuln, aqualung, gas, stun, flash, tranq, fire, skill.

If the criteria fail (after the reversecriteria flag is applied), the 'failtarget' key will be executed - note that there's no 'wait' on failures, so don't do anything processor intensive.

Map Info[edit]

Each map should be accompanied by a "mapinfo" file, which lives in the maps directory with its map, e.g. maps/etf_map.bsp should be accompanied by a maps/etf_map.mapinfo file.

The mapinfo defines assorted properties describing the map, as well as overriding world-spawn attributes. The file format is something like:

mapinfo {
        map             "etf_map";                                    // BSP name
        longname        "Mapname";                                    // Long name for map, general description of it
        type            "etf";                                                // Game it is for (all etf maps are marked with "etf")
        gameindices     "1,2,3";                                      // Available gameindices
        atmosphere      "T=RAIN,B=5 10,C=0.5,G=0.5 2,BV=0,GV=0 100,W=1 2,D=300";      // Atmospheric effects

        gameindexDef 1 {                                                // Gameindex Definition
                longname        "Mapname CTF";        // Long name for this gameindex

                // Map info (former .mpi)
                mapinfo         "Blablabladebladebla";

                // Class limits etc
                green_limit             "0";
                yellow_limit            "0";
                sniper_limit            "2";
                grenadier_limit         "3";
                red_soldier_limit       "5";
                blue_soldier_limit      "6";

                atmosphere      "T=SNOW";
        }

        gameindexDef 2 {
                longname        "Mapname 1-flag CTF";
                mapinfo         "Blablabladebladebla";
                green_limit     "0";
                yellow_limit    "0";
        }
}

Entries in gameIndexDef blocks override the default entries (which are not associated with any particular gameindex, and apply to all). Note that the gameindices field is required, and will default to "1" if not specified (however many gameIndexDef blocks there are).

map The name of the map it is associated with (not used, merely for completeness).
longname The "human" name of the map.
mapinfo A brief description of the map and how it is played.
type Should always be "etf".
gameindices Should indicate all valid indices.
minplayers The minimum number of players recommended on the map.
maxplayers The maximum number of players recommended on the map.

Each map+gameindex combination is treated as a completely separate map in voting lists. gameindexes should be a single digit from 1 to 9.

Any fields not mentioned here will override worldspawn keys instead (for example atmosphere).

Gameindices[edit]

Gameindices make it possible to have multiple scenarios in one map. Basically, all entities with a 'gameindex' key spawn only when the server has g_gameindex set to the same value.

For example, when an entity has "gameindex" "1,2", it will only spawn when g_gameindex (which defaults to 1) is 1 or 2 on the server.

Also, for the server to know which gameindices are allowed for this map, there is a new key for the .arena file. This key is called 'gameindices' and has as value an array of the allowed gameindices. For example "1,2,3", which results in g_gameindex 1, 2 and 3 being valid for this map. If it has a different value during the loading of the map, it defaults to 1.

Custom Infoparms[edit]

Q3F uses the -custinfoparms parameter of q3map 1.1-TA-beta and newer being distributed with GtkRadiant to extend Quake3's shader language.

Current custom infoparms:

particleclip Particles collide with this surface. forcefield Used in combination with the func_forcefield entity to create forcefields. footprints If a client walks over a shader with the footprints parameter set, he leaves a trail of footprints. stone Stone footstep and ricochet sounds. wood Wood footstep and ricochet sounds. seethrough Translucent surface a sentry can track through even if it's solid.

To use these parameters, you need to add a 'custinfoparms.txt' file to your scripts directory (where your shaders live) and execute the bsp stage of the compile process with the additional -custinfoparms command line parameter.

The contents of the textfile used with Q3F:

// Custom Surfaceparms file

// Custom Contentsflags
{
        particleclip 0x2000
        forcefield 0x4000
}
// Custom Surfaceflags
{
        footprints 0x80000
        stone 0x100000
        wood 0x200000
        seethrough 0x400000
}

Entity Definition File[edit]

This is the ETF entity definition file for GTKRadiant. It overrides et_entities.def in etmain\scripts and can also be used here as a reference. This version includes a small bugfix on target_accumulator.

// ETF entity definition file for GTKRadiant
// based on Quake3 Arena entity definition file for Q3Radiant
// Based on draft by Suicide 20 7.30.99 and inolen 9-3-99
// Upgraded by Eutectic: eutectic@ritualistic.com
// (visible models added by raYGunn - paths provided by Suicide 20)
// (terrain information added to func_group entity by Paul Jaquays)

// Updated for Q3F by BirdDawg (jhefty@attbi.com)
// Version: 2.3
// Last updated: 1/14/2002

// Updated for ETF by ildon (ildon@clan-dfa.com) on 2004-07-16
// Updated target_accumulator on 09/12/2009
// Added misc_mapsentry on 09/14/2009
// Version 1.2

/*QUAKED _decal (0 1.0 0) ?
-------- KEYS --------
"target" : the name of the entity targetted at for projection
-------- SPAWNFLAGS --------
(none)
-------- NOTES --------
Compiler-only entity that specifies a decal to be projected. Should contain 1 or more patch meshes (curves) and target an info_null entity. The distance between the center of the _decal entity and the target is the axis and distance of projection.
*/

//=============================================================================

AMMO_* ENTITIES

//=============================================================================

//=============================================================================

/*QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED
Machine Gun ammo. Gives the player 50 by default.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 40, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of ammo given to the player when picked up (default 50).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/ammo/machinegunam.md3"
*/

//=============================================================================

/*QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED
Plasma Gun ammo. Gives the player 30 by default.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 40, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of ammo given to the player when picked up (default 30).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/ammo/plasmaam.md3"
*/

//=============================================================================

//=============================================================================

/*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED
Rocket Launcher ammo. Gives the player 5 by default.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 40, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of ammo given to the player when picked up (default 5).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/ammo/rocketam.md3"
*/

//=============================================================================

/*QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED
Shotgun ammo. Gives the player 10 by default.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 40, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of ammo given to the player when picked up (default 10).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/ammo/shotgunam.md3"
*/

//=============================================================================

//=============================================================================

FUNC_* ENTITIES

//=============================================================================

/*QUAKED func_bobbing (0 .5 .8) ? X_AXIS Y_AXIS
Solid entity that oscillates back and forth in a linear motion. By default, it will have an amount of displacement in either direction equal to the dimension of the brush in the axis in which it's bobbing. Entity bobs on the Z axis (up-down) by default. It can also emit sound if the "noise" key is set. Will crush the player when blocked.
-------- KEYS --------
speed : amount of time in seconds for one complete oscillation cycle (default 4).
height : sets the amount of travel of the oscillation movement (default 32). 
phase : sets the start offset of the oscillation cycle. Values must be 0 < phase < 1. Any integer phase value is the same as no offset (default 0).
noise : path/name of .wav file to play. Use looping sounds only (eg. sound/world/drone6.wav - See Notes).
model2 : path/name of model to include (eg: models/mapobjects/jets/jets01.md3).
origin : alternate method of setting XYZ origin of sound and .md3 model included with entity (See Notes).
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
X_AXIS : entity will bob along the X axis.
Y_AXIS : entity will bob along the Y axis.
-------- NOTES --------
In order for the sound to be emitted from the entity, it is recommended to include a brush with an origin shader at its center, otherwise the sound will not follow the entity as it moves. Setting the origin key is simply an alternate method to using an origin brush. When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value.
*/

//=============================================================================

/*QUAKED func_button (0 .5 .8) ?
When a button is touched by a player, it moves in the direction set by the "angle" key, triggers all its targets, stays pressed by an amount of time set by the "wait" key, then returns to it's original position where it can be operated again.
-------- KEYS --------
angle : determines the direction in which the button will move (up = -1, down = -2).
target : all entities with a matching targetname will be triggered.
speed : speed of button's displacement (default 40).
wait : number of seconds button stays pressed (default 1, -1 = return immediately).
lip : lip remaining at end of move (default 4 units).
health : (default 0) if set to any non-zero value, the button must take damage (any amount) to activate.
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
model2 : path/name of model to include (eg: models/mapobjects/pipe/pipe02.md3).
origin : alternate method of setting XYZ origin of .md3 model included with entity (See Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
Setting the origin key is simply an alternate method to using an origin brush. When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value.
*/

//=============================================================================

/*QUAKED func_group (0 .5 .8) ?
This is not an entity as such. It is strictly an editor utility to group world brushes and patches together for convenience (selecting, moving, copying, etc). You cannot group entities with this.
-------- KEYS --------
alphamap : this is the path/name for the art file used to guide the mapping of textures on the terrain surface.
layers : this integer value is the number unique root shaders that will be use on the terrain.
shader : this is the path to the metashader used to assign textures to the terrain entity.
terrain : this is an on/off flag. When set to 1, the entity becomes a terrain entity.
-------- NOTES --------
The TAB key can be used to flip through the component pieces of a selected func_group entity, isolating individual components. To make a func_group into a terrain entity, refer to the Terrain Construction documentation.
*/

//=============================================================================

/*QUAKED func_pendulum (0 .5 .8) ?
Solid entity that describes a pendulum back and forth rotation movement. Rotates on the X axis by default. Pendulum frequency is a physical constant based on the length of the beam and gravity. Blocking the pendulum instantly kills a player.
-------- KEYS --------
angle : angle offset of axis of rotation from default X axis (default 0).
speed : angle of swing arc in either direction from initial position (default 30).
phase : sets the start offset of the swinging cycle. Values must be 0 < phase < 1. Any integer phase value is the same as no offset (default 0).
noise : path/name of .wav file to play. Use looping sounds only (eg. sound/world/drone6.wav).
model2 : path/name of model to include (eg: models/mapobjects/jets/jets01.md3).
origin : alternate method of setting XYZ origin of entity's rotation axis and .md3 model included with entity (default "0 0 0" - See Notes).
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
You need to have an origin brush as part of this entity. The center of that brush will be the point through which the rotation axis passes. Setting the origin key is simply an alternate method to using an origin brush. Pendulum will rotate along the X axis by default. Very crude operation: pendulum cannot rotate along Z axis, the speed of swing (frequency) is not adjustable. When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value.*/

//=============================================================================

/*QUAKED func_plat (0 .5 .8) ?
Rising platform the player can ride to reach higher places. Plats must always be drawn in the raised position, so they will operate and be lighted correctly but they spawn in the lowered position. The plat will stay in the raised position until the player steps off. There are no proper sounds for this entity, only beep noises. It will spawn in the game and work properly but it sounds silly (see Notes).
-------- KEYS --------
speed : determines how fast the plat moves (default 150).
lip : lip remaining at end of move (default 16). Has no effect if "height" is set.
height : if set, this will determine the total amount of vertical travel of the plat.
dmg : damage to inflict on player when he blocks operation of plat (default 4). Plat will reverse direction when blocked.
targetname : if set, the trigger that points to this will raise the plat each time it fires. The plat raises and comes back down a second later if no player is on it.
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
model2 : path/name of model to include (eg: models/mapobjects/pipe/pipe02.md3).
origin : alternate method of setting XYZ origin of .md3 model included with entity (See Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
By default, the total amount of vertical travel of a platform is implicitly determined by the overall vertical size of the brushes of which it's made minus the lip value. But if the "height" key is used, then the total amount of vertical travel of the plat will be exactly that value regardless of the shape and size of the plat and regardless of the value of the "lip" key. Using the "height" key is the best method for any kind of platforms and the only possible one for thin plats which need to travel vertical distances many times their own thickness. Setting the origin key is simply an alternate method to using an origin brush. When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value.

There is a way to make plats play proper sounds. Just create a sound\movers\plats folder under baseq3 and put 2 sounds named pt1_strt.wav and pt1_end.wav in it. Those can be the renamed sounds from the Q2 plats or renamed copies of the sound\movers\doors sounds you can extract from your pak0.pk3 file or new custom sounds if you're up to it. Thanks to Fragzilla for the tip.*/

//=============================================================================

/*QUAKED func_rotating (0 .5 .8) ? - - X_AXIS Y_AXIS
Solid entity that rotates continuously. Rotates on the Z axis by default and requires an origin brush. It will always start on in the game and is not targetable.
-------- KEYS --------
speed : determines how fast entity rotates (default 100).
noise : path/name of .wav file to play. Use looping sounds only (eg. sound/world/drone6.wav).
model2 : path/name of model to include (eg: models/mapobjects/bitch/fembotbig.md3).
origin : alternate method of setting XYZ origin of entity's rotation axis and .md3 model included with entity (default "0 0 0" - See Notes).
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
X_AXIS : entity will rotate along the X axis.
Y_AXIS : entity will rotate along the Y axis.
-------- NOTES --------
You need to have an origin brush as part of this entity. The center of that brush will be the point through which the rotation axis passes. Setting the origin key is simply an alternate method to using an origin brush. It will rotate along the Z axis by default. You can check either the X_AXIS or Y_AXIS box to change that. When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value.*/

//=============================================================================

/*QUAKED func_static (0 .5 .8) ?
Static non-solid bspmodel. Can be used for conditional walls and models.
-------- KEYS --------
model2 : path/name of model to include (eg: models/mapobjects/bitch/fembotbig.md3).
origin : alternate method of setting XYZ origin of .md3 model included with entity (See Notes).
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
targetname : NOT SUPPORTED BY RENDERER - if set, a func_button or trigger can make entity disappear from the game (See Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value. If a model is included with a targeted func_static, the brush(es) of the entity will be removed from the game but the .md3 model won't: it will automatically be moved to the (0 0 0) world origin so you should NOT include an .md3 model to a targeted func_static.

Because the map has only a single bot navigation file, func_static's cannot be used to make significant changes in game play flow between differing game types.*/

//=============================================================================

/*QUAKED func_timer (0 .5 .8) (-8 -8 -8) (8 8 8) START_ON
Time delay trigger that will continuously fire its targets after a preset time delay. The time delay can also be randomized. When triggered, the timer will toggle on/off.
-------- KEYS --------
wait : delay in seconds between each triggering of its targets (default 1).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
target : this points to the entities to trigger.
targetname : a func_button or trigger that points to this will toggle the timer on/off when activated.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
START_ON : timer will start on in the game and continuously fire its targets.
-------- NOTES --------
When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).*/


//=============================================================================

INFO_* ENTITIES

//=============================================================================


/*QUAKED info_null (0 .5 0) (-8 -8 -8) (8 8 8)
Used as a positional target for light entities to create a spotlight effect. A target_position can be used instead of this but was kept in Q3A for legacy purposes.
-------- KEYS --------
targetname : must match the target key of entity that uses this for pointing.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/

//=============================================================================

/*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 32) INITIAL
Normal player spawning location for Q3A levels.
-------- KEYS --------
angle : direction in which player will look when spawning in the game. Does not apply to bots.
target : this can point at a target_give entity for respawn freebies.
nobots : when set to 1, bots will never use this spawn point to respawn in the game.
nohumans : when set to 1, human players will never use this spawn point to respawn in the game.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
INITIAL : makes the spawnpoint the initial place for the player to spawn at the beginning of the game.*/

//=============================================================================

/*QUAKED info_player_intermission (1 0 1) (-16 -16 -16) (16 16 16)
Camera for intermission screen between matches. This also automatically generates the podium for bot arena matches (see Notes). Can be aimed by setting the "angles" key or targeting an pointing to an aiming entity. Use only one per level.
-------- KEYS --------
angles: alternate "pitch, yaw, roll" angles method of aiming intermission camera (default 0 0 0).
target : point this to an info_notnull or target_position entity to set the camera's pointing angles.
-------- NOTES --------
In genuine bot arena matches, the podium for the 1st, 2nd and 3rd place players at the end of the match is generated by this entity. The podium's origin will automatically be located 128 units in the direction of the camera's view and 84 units down from the y height of the view line at that point. It will also always be generated on a level plane regardless of the pointing angle of the camera so if that angle is too steep, part of the podium model might not be visible. Make sure you leave at least 106 units of free space in front of where the camera points to otherwise the podium model won't be visible at all.*/

//=============================================================================

ITEM_* ENTITIES

//=============================================================================

/*QUAKED item_armor_body (.6 0 0) (-16 -16 -16) (16 16 16) SUSPENDED
Red Armor - 100 points. All armor can be cumulated up to a maximum of 200 points and slowly wears out to 100 points.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 25, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/armor/armor_red.md3"*/

//=============================================================================

/*QUAKED item_armor_combat (1 .75 .3) (-16 -16 -16) (16 16 16) SUSPENDED
Yellow Armor - 50 points. All armor can be cumulated up to a maximum of 200 points and slowly wears out to 100 points.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 25, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/armor/armor_yel.md3"*/

//=============================================================================

/*QUAKED item_armor_shard (0 .7 0) (-16 -16 -16) (16 16 16) SUSPENDED
Green Armor Shard - 5 points. All armor can be cumulated up to a maximum of 200 points and slowly wears out to 100 points.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 25, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/armor/shard.md3"*/

//=============================================================================

/*QUAKED item_enviro (.5 0 1) (-16 -16 -16) (16 16 16) SUSPENDED
Battle Suit power-up - Gives protection against slime, lava and weapon splash damage. Lasts 30 seconds.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 120, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count : time in seconds power-up will last when picked up (default 30).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/instant/enviro.md3"*/

//=============================================================================

/*QUAKED item_flight (.5 0 1) (-16 -16 -16) (16 16 16) SUSPENDED
Flight power-up. Lasts 60 seconds.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 120, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count : time in seconds power-up will last when picked up (default 60).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/instant/flight.md3"*/

//=============================================================================

/*QUAKED item_haste (.5 0 1) (-16 -16 -16) (16 16 16) SUSPENDED
Speed power-up. Makes player run at double speed for 30 seconds.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 120, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count : time in seconds power-up will last when picked up (default 30).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/instant/haste.md3"*/

//=============================================================================

/*QUAKED item_health (.8 .8 0) (-16 -16 -16) (16 16 16) SUSPENDED
25 Health. Cannot be picked up over 100 health.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 35, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of health points given to the player when item is picked up (default 25).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/health/medium_sphere.md3"*/

//=============================================================================

/*QUAKED item_health_large (1 0 0) (-16 -16 -16) (16 16 16) SUSPENDED
50 Health. Cannot be picked up over 100 health.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 35, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of health points given to the player when item is picked up (default 50).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/health/medium_sphere_1.md3"*/

//=============================================================================

/*QUAKED item_health_mega (0 0 1) (-16 -16 -16) (16 16 16) SUSPENDED
Blue M bubble - 100 Health. Adds 100 health points to current health up to a maximum of 200.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 40, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of health points given to the player when item is picked up (default 100).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/health/mega_sphere.md3"*/

//=============================================================================

/*QUAKED item_health_small (0 1 0) (-16 -16 -16) (16 16 16) SUSPENDED
Green cross bubble - 5 Health. Can be picked up over 100 health but slowly wears out to 100 afterwards.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 35, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count: sets the amount of health points given to the player when item is picked up (default 5).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/health/medium_sphere_2.md3"*/

//=============================================================================

/*QUAKED item_invis (.5 0 1) (-16 -16 -16) (16 16 16) SUSPENDED
Invisibility power-up. Lasts 30 seconds.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 120, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count : time in seconds power-up will last when picked up (default 30).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/instant/invis.md3"*/

//=============================================================================

/*QUAKED item_quad (.4 .6 1) (-16 -16 -16) (16 16 16) SUSPENDED
Quad Damage power-up. Lasts 30 seconds.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 120, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count : time in seconds power-up will last when picked up (default 30).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
model="models/powerups/instant/quad.md3"*/

//=============================================================================

/*QUAKED item_regen (.5 0 1) (-16 -16 -16) (16 16 16) SUSPENDED
Health Regeneration power-up. This will boost your current health by 5 points every second for a period of up to 30 seconds or up to 200 points whichever comes first. Afterwards, any health points over 100 slowly wears out to 100.
-------- KEYS --------
wait : time in seconds before item respawns after being picked up (default 120, -1 = never respawn).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
count : time in seconds power-up will last when picked up (default 30).
team : set this to team items. Teamed items will respawn randomly after team master is picked up (see Notes).
target : picking up the item will trigger the entity this points to.
targetname : a target_give entity can point to this for respawn freebies.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
notbot : used to make an item invisible for bot attraction.
-------- SPAWNFLAGS --------
SUSPENDED : item will spawn where it was placed in map and won't drop to the floor.
-------- NOTES --------
The amount of time it takes for an item in the team to respawn is determined by the "wait" value of the item that was picked up previously. So if one of the items in the team has it's "wait" key set to -1 (never respawn), the random respawning cycle of the teamed items will stop after that item is picked up.

When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).
-------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
model="models/powerups/instant/regen.md3"*/

//=============================================================================

LIGHT ENTITY

//=============================================================================


/*QUAKED light (.65 .65 1) (-8 -8 -8) (8 8 8) LDAT_LINEAR LDAT_NOSCALE LAAT_QUADRATIC LAAT_DOUBLE_QUADRATIC
Non-displayed point light source.
-------- KEYS --------
light: overrides the default 300 intensity.
_color : weighted RGB value of light color (default white - 1.0 1.0 1.0).
Linear checkbox gives linear falloff instead of inverse square
Lights pointed at a target will be spotlights.
radius: overrides the default 64 unit radius of a spotlight at the target point.
-------- VLIGHT KEYS --------
atten_distscale:  falloff for light ents.  .25 will give you 4x the falloff distance, .5 will give twice the distance, etc.
atten_anglescale: angle falloff
-------- SPAWNFLAGS --------
LDAT_LINEAR, LDAT_NOSCALE, LAAT_QUADRATIC, LAAT_DOUBLE_QUADRATIC: Falloff settings. Note: Last three supported only with q3map -vlight. Also, q3map -light does not support linear falloff on spotlights.*/
//=============================================================================

MISC_* ENTITIES

//=============================================================================

/*QUAKED misc_model (1 .5 .25) (-16 -16 -16) (16 16 16)
Generic placeholder for inserting .md3 models in game. Requires compilation of map geometry to be added to level.
-------- KEYS --------
angle: direction in which model will be oriented.
model : path/name of model to use (eg: models/mapobjects/teleporter/teleporter.md3).*/

//=============================================================================

/*QUAKED misc_portal_camera (1 .5 .25) (-8 -8 -8) (8 8 8) SLOWROTATE FASTROTATE
Portal camera. This camera is used to project its view onto a portal surface in the level through the intermediary of a misc_portal_surface entity. Use the "angles" key or target a target_position or info_notnull entity to set the camera's pointing direction.
-------- KEYS --------
angles: this sets the pitch and yaw aiming angles of the portal camera (default 0 0). Use "roll" key to set roll angle.
target : point this to a target_position entity to set the camera's pointing direction.
targetname : a misc_portal_surface portal surface indicator must point to this.
roll: roll angle of camera. A value of 0 is upside down and 180 is the same as the player's view.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
SLOWROTATE : makes the portal camera rotate slowly along the roll axis.
FASTROTATE : makes the portal camera rotate faster along the roll axis.
-------- NOTES --------
Both the setting "angles" key or "targeting a target_position" methods can be used to aim the camera. However, the target_position method is simpler. In both cases, the "roll" key must be used to set the roll angle. If either the SLOWROTATE or FASTROTATE spawnflag is set, then the "roll" value is irrelevant.*/

//=============================================================================

/*QUAKED misc_portal_surface (1 .5 .25) (-8 -8 -8) (8 8 8)
Portal surface indicator. This will "lock on" the brush face closest to it and identify as a portal. The view displayed on the portal surface is the view of the misc_portal_camera that this entity targets. Also used for mirrors (see Notes).
-------- KEYS --------
target : point this to a misc_portal_camera that "sees" the view you want to display on the portal.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
The entity must be no farther than 64 units away from the portal surface to lock onto it. To make a mirror, apply the common/mirror shader to the surface, place this entity near it but don't target a misc_portal_camera.*/

//=============================================================================

/*QUAKED misc_teleporter_dest (1 .5 .25) (-32 -32 -24) (32 32 -16)
Teleport destination location point for trigger_teleporter entities.
-------- KEYS --------
angle : direction in which player will look when teleported.
targetname : make the trigger_teleporter point to this.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/

//=============================================================================

PATH_* ENTITIES

//=============================================================================

SHOOTER_* ENTITIES

//=============================================================================

/*QUAKED shooter_grenade (1 0 .5) (-8 -8 -8) (8 8 8)
This will shoot a grenade each time it's triggered. Aiming is done by setting the "angles" key or by targeting an info_notnull or target_position entity.
-------- KEYS --------
angles: this sets the pitch and yaw aiming angles of shooter (default 0 0). The roll angle does not apply.
targetname : activating trigger points to this.
target : this points to a target_position entity for aiming the grenades.
random : random aiming variance in degrees from the straight line to the targeted entity (default 0 - see Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
When the random key is set, its value is used to calculate a maximum angle deviation from the normal trajectory formed by a straight line between the shooter and the aiming entity it targets. The final trajectory will be a random value anywhere between no deviation at all (0) to maximum deviation (value of the random key).

Both the setting "angles" key or "targeting a target_position" methods can be used to aim the shooter. However, the target_position method is simpler.*/

//=============================================================================

/*QUAKED shooter_plasma (1 0 .5) (-8 -8 -8) (8 8 8)
This will shoot a plasma ball each time it's triggered. Aiming is done by setting the "angles" key or by targeting an info_notnull or target_position entity.
-------- KEYS --------
angles: this sets the pitch and yaw aiming angles of shooter (default 0 0). The roll angle does not apply.
targetname : activating trigger points to this.
target : this points to a target_position entity for aiming the plasma balls.
random : random aiming variance in degrees from the straight line to the targeted entity (default 0 - see Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
When the random key is set, its value is used to calculate a maximum angle deviation from the normal trajectory formed by a straight line between the shooter and the aiming entity it targets. The final trajectory will be a random value anywhere between no deviation at all (0) to maximum deviation (value of the random key).

Both the setting "angles" key or "targeting a target_position" methods can be used to aim the shooter. However, the target_position method is simpler.*/

//=============================================================================

/*QUAKED shooter_rocket (1 0 .5) (-8 -8 -8) (8 8 8)
This will shoot a rocket each time it's triggered. Aiming is done by setting the "angles" key or by targeting an info_notnull or target_position entity.
-------- KEYS --------
angles: this sets the pitch and yaw aiming angles of shooter (default 0 0). The roll angle does not apply.
targetname : activating trigger points to this.
target : this points to a target_position entity for aiming the rockets.
random : random aiming variance in degrees from the straight line to the targeted entity (default 0 - see Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
When the random key is set, its value is used to calculate a maximum angle deviation from the normal trajectory formed by a straight line between the shooter and the aiming entity it targets. The final trajectory will be a random value anywhere between no deviation at all (0) to maximum deviation (value of the random key).

Both the setting "angles" key or "targeting a target_position" methods can be used to aim the shooter. However, the target_position method is simpler.*/

//=============================================================================

TARGET_* ENTITIES

//=============================================================================

/*QUAKED target_delay (0 .7 .7) (-8 -8 -8) (8 8 8)
Time delay trigger intermediary. Like a target_relay, this can only be fired by other triggers which will cause it in turn to fire its own targets.
-------- KEYS --------
targetname : activating trigger points to this.
target : this points to entities to activate when this entity is triggered.
wait : delay in seconds from when this gets triggered to when it fires its own targets (default approx. 1).
delay : same as wait? replaces it? WTF?...I'm confused now.
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).*/

//=============================================================================

/*QUAKED target_give (0 .5 0) (-8 -8 -8) (8 8 8)
This is used to give ammo, weapons, health or items to the player who activates it.

-------- KEYS --------
target : this points to the item(s) to give when activated.
targetname : activating trigger or spawn entity points to this.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
There are 2 ways to use this entity.
a) automatically give items to players when they spawn in the game: make a spawn location entity like info_player_deathmatch or CTF respawn points target this entity, then make it target the item(s) to give to the player upon respawn.
b) give items to players during the game: make a trigger_multiple target this entity, then make it target the item(s) to give to the player when the trigger is touched.*/

//=============================================================================

/*QUAKED target_kill (0 .5 0) (-8 -8 -8) (8 8 8)
This will kill the player who activates the trigger that fires this target.
-------- KEYS --------
targetname : the activating trigger points to this.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/

//=============================================================================

//QUAKED target_laser (0 .5 0) (-8 -8 -8) (8 8 8) START_ON
//Generates a red laser beam. I think this can somehow spawn in the game, I saw it once but it's too inconsistent to be usable. Commented out.
//-------- KEYS --------
//angles: alternate "pitch, yaw, roll" angles method of aiming laser (default 0 0 0).
//target : point this to a target_position entity to set the laser's aiming direction.
//targetname : the activating trigger points to this.
//notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
//notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
//notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
//-------- SPAWNFLAGS --------
//START_ON : when set, the laser will start on in the game.

/*QUAKED target_position (0 .5 0) (-8 -8 -8) (8 8 8)
Aiming target for entities like light, misc_portal_camera and trigger_push (jump pads) in particular.
-------- KEYS --------
targetname : the entity that requires an aiming direction points to this.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
To make a jump pad, place this entity at the highest point of the jump and target it with a trigger_push entity.*/

//=============================================================================

/*QUAKED target_print (0 .5 0) (-8 -8 -8) (8 8 8) REDTEAM BLUETEAM PRIVATE
This will print a message on the center of the screen when triggered. By default, all the clients will see the message.
-------- KEYS --------
message : text string to print on screen.
targetname : the activating trigger points to this.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
REDTEAM : only the red team players will see the message.
BLUETEAM : only the blue team players will see the message.
PRIVATE : only the player that activates the target will see the message.*/

//=============================================================================

/*QUAKED target_push (.5 .5 .5) (-8 -8 -8) (8 8 8) BOUNCEPAD
This can be used to create jump pads and launch ramps. The direction of push can be set by the "angles" key or pointing to a target_position or info_notnull entity. Unlike trigger_push, this is NOT client side predicted and must be activated by a trigger.
-------- KEYS --------
angles: this sets the pitch and yaw aiming angles of push entity (default 0 0). The roll angle does not apply.
speed : speed of push (default 1000). Has no effect if entity targets an aiming entity.
targetname : the activating trigger points to this. Push originates from the location of the trigger.
target : this points to the aiming entity to which the player will jump.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
BOUNCEPAD : if set, trigger will play bounce noise instead of beep noise when activated (recommended).
-------- NOTES --------
To make a jump pad or launch ramp, create a trigger_multiple where the jump must originate. Place the target_push directly above the trigger_multiple and place the target_position entity at the highest point of the jump. Target the trigger_multiple to the target_push and target the target_push to the target_position/info_notnull (or set the target_push's "angles" key). Note that the "angle" key also works.*/

//=============================================================================

/*QUAKED target_relay (0 .7 .7) (-8 -8 -8) (8 8 8) RED_ONLY BLUE_ONLY RANDOM
This can only be activated by other triggers which will cause it in turn to activate its own targets.
-------- KEYS --------
targetname : activating trigger points to this.
target : this points to entities to activate when this entity is triggered.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
RED_ONLY : only red team players can activate trigger.
BLUE_ONLY : only red team players can activate trigger.
RANDOM : one one of the targeted entities will be triggered at random.*/

//=============================================================================

/*QUAKED target_remove_powerups (0 .7 .7) (-8 -8 -8) (8 8 8)
This takes away any and all item_* type powerups from player except health and armor (holdable_* items are not taken away either). Must be activated by a button or trigger_multiple entity. The player that activates the trigger will lose any powerup(s) currently in his possession.
-------- KEYS --------
targetname : activating trigger points to this.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/

//=============================================================================

/*QUAKED target_score (0 .5 0) (-8 -8 -8) (8 8 8)
This is used to automatically give frag points to the player who activates this. A spawn location entity like info_player_* or CTF respawn points can target this entity to give points to the player when he spawns in the game. Or a trigger can also be used to activate this. The activator of the trigger will get the points.
-------- KEYS --------
targetname : ativating entity points to this.
count: number of frag points to give to player (default 1).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/

//=============================================================================

/*QUAKED target_speaker (0 .7 .7) (-8 -8 -8) (8 8 8) LOOPED_ON LOOPED_OFF GLOBAL ACTIVATOR
Sound generating entity that plays .wav files. Normal non-looping sounds play each time the target_speaker is triggered. Looping sounds can be set to play by themselves (no activating trigger) or be toggled on/off by a trigger.
-------- KEYS --------
noise : path/name of .wav file to play (eg. sound/world/growl1.wav - see Notes).
wait : delay in seconds between each time the sound is played ("random" key must be set - see Notes).
random : random time variance in seconds added or subtracted from "wait" delay ("wait" key must be set - see Notes).
targetname : the activating button or trigger points to this.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
LOOPED_ON : sound will loop and initially start on in level (will toggle on/off when triggered).
LOOPED_OFF : sound will loop and initially start off in level (will toggle on/off when triggered).
GLOBAL : sound will play full volume throughout the level.
ACTIVATOR : sound will play only for the player that activated the target.
-------- NOTES --------
The path portion value of the "noise" key can be replaced by the implicit folder character "*" for triggered sounds that belong to a particular player model. For example, if you want to create a "bottomless pit" in which the player screams and dies when he falls into, you would place a trigger_multiple over the floor of the pit and target a target_speaker with it. Then, you would set the "noise" key to "*falling1.wav". The * character means the current player model's sound folder. So if your current player model is Visor, * = sound/player/visor, if your current player model is Sarge, * = sound/player/sarge, etc. This cool feature provides an excellent way to create "player-specific" triggered sounds in your levels.

The combination of the "wait" and "random" keys can be used to play non-looping sounds without requiring an activating trigger but both keys must be used together. The value of the "random" key is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).*/

//=============================================================================

/*QUAKED target_teleporter (0 .5 0) (-8 -8 -8) (8 8 8)
Activating this will teleport players to the location of the targeted misc_teleporter_dest entity. Unlike trigger_teleport, this entity must be activated by a trigger and does NOT allow client prediction of events.
-------- KEYS --------
targetname : activating trigger points to this.
target : this must point to a misc_teleporter_dest entity.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/


//=============================================================================

TRIGGER_* ENTITIES

//=============================================================================

/*QUAKED trigger_always (.5 .5 .5) (-8 -8 -8) (8 8 8)
Automatic trigger. It will fire the entities it targets as soon as it spawns in the game.
-------- KEYS --------
target : this points to the entity to activate.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/

//=============================================================================

/*QUAKED trigger_hurt (.5 .5 .5) ? - - SILENT NO_PROTECTION SLOW
Any player that touches this will be hurt by "dmg" points of damage once per server frame (very fast). A sizzling sound is also played while the player is being hurt.
-------- KEYS --------
dmg : number of points of damage inflicted to player per server frame (default 5 - integer values only).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
SILENT : supresses the sizzling sound while player is being hurt.
NO_PROTECTION : player will be hurt regardless of protection (see Notes).
SLOW : changes the damage rate to once per second.
-------- NOTES --------
The invulnerability power-up (item_enviro) does not protect the player from damage caused by this entity regardless of whether the NO_PROTECTION spawnflag is set or not. Triggering a trigger_hurt will have no effect if the TOGGLE spawnflag is not set. A trigger_hurt always starts on in the game.*/

//=============================================================================

/*QUAKED trigger_push (.5 .5 .5) ?
This is used to create jump pads and launch ramps. It MUST point to a target_position or info_notnull entity to work. Unlike target_push, this is client side predicted.
-------- KEYS --------
target : this points to the target_position to which the player will jump.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
To make a jump pad or launch ramp, place the target_position/info_notnull entity at the highest point of the jump and target it with this entity.*/

//=============================================================================

/*QUAKED trigger_teleport (.5 .5 .5) ?
Touching this will teleport players to the location of the targeted misc_teleporter_dest entity. This entity allows client prediction of events.
-------- KEYS --------
target : this must point to a misc_teleporter_dest entity.
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).*/

//=============================================================================

WORLDSPAWN ENTITY

//=============================================================================

/*QUAKED worldspawn (0 0 0) ?
Only used for the world.
-------- KEYS --------
message : text to print at user logon. Used for name of level.
music : path/name of looping .wav file used for level's music (eg. music/sonic5.wav).
ambient : Adds a constant value to overall lighting. Use is not recommended. Ambient light will have a tendency to flatten out variations in light and shade.
_color : RGB value for ambient light color (default is 0 0 0).
gravity : gravity of level (default is normal gravity: 800).
gridsize : granularity of the lightgrid created by q3map. Value is three integers separated by spaces, representing number of units between grid points in X Y Z. Default gridsize value is 128 128 256. Use larger powers of 2 to reduce BSP size and compile time on very large maps.
_blocksize : q3map always splits the BSP tree along the planes X=_blocksize*n and Y=_blocksize*n. Default _blocksize value is 1024. Increase the blocksize using larger powers of 2 to reduce compile times on very large maps with a low structural brush density.*/


//=============================================================================
//=============================================================================
//ETF Additions and modifications
//=============================================================================
//=============================================================================


/*QUAKED func_commandpoint (.5 .5 0) (-8 -8 -8) (8 8 8)
ETF-only
A command point is a point you touch (or otherwise activate) and then attempt to keep (i.e. kill any enemies attempting to touch it). 

-------- KEYS --------
"model": if given a model key it is touchable, otherwise can only be triggred by another entity (e.g. a func_button or a trigger_multiple).
"teamset": all named entities will have their "allowteams" criteria key set to the activator's team.
"nonteamset": all named entities will have their "allowteams" criteria key set to all teams but the activator's team.
"overrideteams": all named entities will have their "allowteams" criteria key set to the teams listed here once the command point is activated.
"wait": controls how often the pulse* keys are activated.
"pulsegive": acts like the normal "give" parameter activated every "wait" seconds.
"pulseteamscore": acts like the normal "teamscore" parameter activated every "wait" seconds.
"pulsetarget": acts like the normal "activetarget" parameter activated every "wait" seconds.
"pulsecount": will pulse this many times, then execute "expiretarget" and become free for anyone to take again. All teamset/nonteamset entities will have their "allowteams" field cleared.
"expiretarget": executed after a commandpoint has pulsed "pulsecount" times.
"give": See entity docs for a complete documentation of give
"flags": See entity docs for a complete documentation of flags

-------- NOTES --------
func_commandpoint will return to inactive immediately on activation (so enemies can get back at it without waiting).
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.

*/
//=============================================================================

/*QUAKED func_damage (.5 .5 0) ?
ETF-only
This entity reacts to damage by triggering a series of targets based on its health, finally disappearing from the world when its health reaches 0.

-------- KEYS --------
"damage_<team>_message": this message is played to <team> when the entity is destroyed.
"damage_<team>_sound": this sound is played to <team> when the entity is destroyed.
"damagetarget": executed when the entity is destroyed.
"health_<team>_message": this message is played to <team> when the entity has regenerated to its full health.
"health_<team>_sound": this sound is played to <team> when the entity has regenerated to its full health.
"healthtarget": executed when the entity reaches full health.
"restore_<team>_message": this message is played to <team> when the entity is restored after taking damage.
"restore_<team>_sound": this sound is played to <team> when the entity is restored after taking damage.
"restoretarget": executed when the entity is restored after taking damage.
"regen": health regenerated per second (default 1).
"restore": seconds until ent is restored (default 30 seconds).
"health_<relation>_<value>_target": exectuted when the entity's health is in <relation> to the <value> of health.
"give": See entity docs for a complete documentation of give
"flags": See entity docs for a complete documentation of flags

-------- NOTES --------
- All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
- <relation> can be "over" or "under".
- Flags of interest: usegauntlet, lineofsight, chargeable.
*/

/*QUAKED misc_particlesystem (0.5 0.9 0) (-4 -4 -4) (4 4 4)
ETF-only
spawns a Spirit system, used to create a particle system without using models

-------- KEYS --------
script:         points to a .f2r script
dir:            directional vector at which to emit particles (equivalent to
                        the normal vector of a tag when spawning a Spirit system
                        through F2R)
rotation:       rotation of the axis
*/

//=============================================================================

/*QUAKED func_door_rotating (.5 .5 0) ?
ETF-only
Just like a func_door, except you need an origin brush (a seperate brush as part of the door model, with all surfaces common/origin) to indicate the pivot point.

-------- KEYS --------
"speed": speed of door movement measued in degrees per second.
"angles": three numbers, pitch, yaw, and roll (default "0 90 0", a normal door that rotates 90 degrees).
"wait": number of seconds before door returns. -1 means "never return".

-------- NOTES --------
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
*/
//=============================================================================

/*QUAKED func_explosion (.5 .5 0) (-8 -8 -8) (8 8 8)
ETF-only
Generates an exposion effect when activated.

-------- KEYS --------
"wait": amount of time before it can be triggered again (default 1).
"radius": radius of the explosion (default 24). 
"impact": used for the impact vibration level (default 50). 
"light": amount of light the entity emits (default 100). 
"color": lightcolor the entity emits (requires dynamic light to be enabled) (default 1 1 1).
"model": model to display when exploding. 
"shader": shader to display when exploding. 
"give": See entity docs for a complete documentation of give
"flags": See entity docs for a complete documentation of flags

-------- NOTES --------
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
If you want the explosion to do _real_ damage, just specify something like:
"give" "health=-100"
"flags" "lineofsight,dropoff"
"effectradius" "100"
*/
//=============================================================================

/*QUAKED func_forcefield (.5 .5 0) ?
ETF-only
Forcefields are conditional walls, which are only solid to players/weapons failing criteria. The criteria can be anything that would apply to a trigger (team/class/entity states/holding/notholding/clientstats, etc.), as well as directional barriers. 

The forcefield should be created as a func_forcefield entity, with all faces of brush marked with: 

        surfaceparm nonsolid
        surfaceparm forcefield

(Where forcefield is specified as forcefield 0x4000 in the custinfoparms.txt file.) 

-------- KEYS --------
"angles": Specified as pitch yaw, fields with this key will only allow players through in the specified direction.
"wait": number of seconds before the forcefield can activate again (default 2).
"give": See entity docs for a complete documentation of give
"flags": See entity docs for a complete documentation of flags

The forcefield is not suited for normal state setting - states should always be forced to ensure they go into the desired state, although it's not required. 

Invisible: Forcefields have no effect, all players can pass through.
Disabled: Forcefields act as normal, but fail to trigger.
Inactive: Forcefields act as normal, and trigger when someone passing the criteria passes through.
Active: See above, drops back to inactive after a default of 2 seconds). 

-------- NOTES --------
- All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
- Flags of interest: faildirection,allowstentrylock
- Weapons can travel through forcefields if their owners can, and in the same directions.
- Only team/class/direction prediction is possible client-side, any other criteria will cause the client to mispredict (and a 'jitter' effect will occur) - clients cannot finesse this to pass through the field.
- Pulse and Flash grenades are still effective through forcefields.
- Players within a forcefield who fail the criteria will be trapped as long as the forcefield is present.
- Players travelling through an 'upward' forcefield will rise up until they're standing on the surface, or cannot rise any further.
- Forcefields can be used to support player's weight, and form, e.g. one-team bridges. 
- You must compile the bsp stage of your map with the -custinfoparms option.
- custinfoparms.txt must exist in /scripts.
*/
//=============================================================================

/*QUAKED func_goalinfo (.5 .5 0) (-8 -8 -8) (8 8 8)
ETF-only
The func_goalinfo is the basic 'point entity' of ETF.
It will activate when a player enters its bounding box The bounding box defaults to "-15 -15 -15" "15 15 15". 

-------- KEYS --------
"angle": rotate the model around the Y-axis by the number of degrees specified (default 0).
"mins": the lower corner of a cube specifying the lower extents of the activation bounding box (default "-15 -15 -15").
"maxs": the upper corner of a cube specifying the lower extents of the activation bounding box (default "15 15 15").
"model": path of a model to display. If a model is specified the "mins" and "maxs" default to the bounding box of the model.
"wait": the entity will stay in an active state for the number of seconds specified here, then return to inactive.
"give": See entity docs for a complete documentation of give
"flags": See entity docs for a complete documentation of flags

-------- NOTES --------
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
Flags of interest include: hideactive, orclientstats,rotating,noshrink,disguisecriteria,rotating.
*/
//=============================================================================

/*QUAKED func_goalitem (.25 .25 .75) (-8 -8 -8) (8 8 8)
ETF-only
Similar to the func_goalinfo, this entity has the ability to be carried.
It will become carried when a player enters its bounding box The bounding box defaults to "-15 -15 -15" "15 15 15". 

It exists in the following states:
Carried: a player has picked it up and has possession of it.
Active:  a player has dropped it, and it is lying in the field.
Inactive: it's back "home" in its original position.

-------- KEYS --------
"angle": rotate the model around the Y-axis by the number of degrees specified (default 0).
"bouncefactor": The amount of 'bounce' the goalitem has, as a value between 0 and 1.
"sparkle": Generate smoke around the holder of the goalitem, in the specified colour (format is "Red Green Blue", each color from 0 to 1).
"sparkleshader": The shader for the sparkles. Defaults to 'hasteSmokePuff'. 
"speedscale": Alter the speed of the holder of the goalitem, as a value between 0 and 1 (or higher, if you want to make them faster). 
"usegive": If useitem is pressed when the goalitem is carried, apply this give-string to the carrier. 
"usetarget": If useitem is pressed when the goalitem is carried, this target key is executed. 
"use_<team>_<broadcast>": If useitem is pressed when the goalitem is carried, this message string is executed.
"mins": the lower corner of a cube specifying the lower extents of the activation bounding box (default "-15 -15 -15").
"maxs": the upper corner of a cube specifying the lower extents of the activation bounding box (default "15 15 15").
"model": path of a model to display. If a model is specified the "mins" and "maxs" default to the bounding box of the model.
"wait": the entity will stay in an active state for the number of seconds specified here, then return to inactive.
"give": See entity docs for a complete documentation of give
"flags": See entity docs for a complete documentation of flags

-------- NOTES --------
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
Flags of interest include: revealagent, showcarry, keepondeath.
*/

/*QUAKED func_hud (0 0 .75) (-8 -8 -8) (8 8 8)
ETF-only
HUD entities can be display in an on-screen slot (in two side-by-side columns of five, with 1/6 at the top and 5/10 at the bottom). 
They will only be displayed to players who match the 'holding' criteria (note that the usual criteria will not be honoured, although they may make it difficult to change the HUD status unless you force them). 

-------- KEYS --------
"<state>_model": Model to display when hud is in <state>.
"<state>_shader": Shader to display when hud is in <state>.

-------- NOTES --------
- If a func_hud is in the teamset/nonteamset fields in a func_commandpoint the entity will only be visible to members of those team(s). 
- Shaders using "rgbgen entity" in their definition should get team colours (or light grey). 
- If the 'color' key is specified, the entity will set that instead, allowing you to have multiple entities with the same model but a different colour. 
- If both <state>_model and <state>_shader keys exist, <state>_model will be used.
- Example for CTF
        func_hud:
                inactive_shader hud/redflagbase 
                active_shader hud/redflagdropped 
                carried_shader hud/redflagcarried 
        
        func_goalitem:
                inactivetarget redflaghud=~inactive 
                activetarget redflaghud=~active 
                carriedtarget redflaghud=~carried 

*/

/*QUAKED func_nobuild (.5 0 0) ?
ETF-only
This entity prevents players from building objects within the volume specified by the nobuild. It cannot be targeted or disabled.

-------- KEYS --------
"type": "autosentry","charge","supplystation" (default does not prevent the building of anything).

-------- NOTES --------
*/
/*QUAKED func_wall (.5 0 .5) ?
ETF-only
Basically this is the most stupid brush entity you can imagine. 
When it's in state inactive or active it is visible and solid.
When it's in invisible or disabled it's invisible and nonsolid. 

The entity works properly with all state triggers (like an info_notnull) and makes proper use of areaportals.s
*/

/*QUAKED target_cycle (.5 .5 0) (-8 -8 -8) (8 8 8)
When activated, this entity will cycle through the player list looking for players which match it's criteria. 

-------- KEYS --------
"cycletarget": If a player is found matching the criteria, it activates cycletarget as the player found.
"cyclefailtarget": If no players matching the criteria are found it calls cyclefailtarget as the original activator. s
"cycleallowteams": Only teams in this list are allowed. 
"cycleallowclasses": Only classes in this list are allowed. 
"cycleholding": Only players holding these goalitems are allowed. 
"cyclenotholding": Only players not holding these goalitems are allowed. 
"cycleclientstats": Only players matching these clientstats are allowed. 
"flags": "allowdead","allowsame"

-------- NOTES --------
Flags of interest: allowdead,allowsame.
It is always possible for this ent to fail to find a target - even if you have criteria that would match the original activator, they might have disconnected (e.g. imagine a goalitem that activates a target_cycle when dropped).

*/

//=============================================================================

/*QUAKED target_location (.5 .5 .5) (-8 -8 -8) (8 8 8)
Modified for ETF
Location marker used by players for team orders and team chat in the course of Teamplay games. The closest target_location in sight is used for the location. If none is in sight, the closest in distance is used.

-------- KEYS --------
"message": name of the location, which can include embedded color codes listed below.

-------- NOTES --------
- An easy way to setup locations in your maps is to use the /dumploc <areaname> command. This will create a file that contains all dumped locations in the format <mapname>.loc.  This file can be loaded into radiant.

Color Codes:
   ^0 : white (default)
   ^1 : red
   ^2 : green
   ^3 : yellow
   ^4 : blue
   ^5 : cyan
   ^6 : magenta
   ^7 : white
   ^* : return to previous color formatting
*/

//=============================================================================

/*QUAKED target_multiport (0 .5 .5) (-8 -8 -8) (8 8 8)
ETF-only
When triggered all players matching the normal activation criteria are teleported to respawns or teleporter destinations specified by the target key.
Attemps to avoid telefragging players.

-------- KEYS --------
"target": name of respawns or teleporter destinations to send players to.

-------- NOTES --------
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
*/

//=============================================================================

/*QUAKED target_respawn (0 .5 .5) (-8 -8 -8) (8 8 8)
ETF-only
When triggered all players matching the normal activation criteria will be respawned.
No points are deducted and no backpacks are dropped.  Player weapons are fully reloaded.

-------- KEYS --------
"affectteams": list of teams that this entity should affect.
-------- NOTES --------
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
*/

//=============================================================================

/*QUAKED target_semitrigger (0 .5 .5) (-8 -8 -8) (8 8 8)
ETF-only
Triggers a random number of entities that are specified.

-------- KEYS --------
"count": how many entities to trigger when the semitrigger is activated.  See "count2" for more details.
"count2": if specified, a random number between "count" and "count2" of the ents will be triggerd.
"activetarget": a list of entities to trigger.

-------- NOTES --------
- It will continue triggering until it has activated the proper number of entities, it runs out of entities, or an entity that it triggered fails because of failed criteria or trying to change to an identical state.
- It will trigger itself back to inactive immediately. 
*/

//=============================================================================

/*QUAKED misc_beam (0 0 .5) (-8 -8 -8) (8 8 8) BEAM_STRAIGHT BEAM_WAVE BEAM_WAVE_3D BEAM_TILESHADER
ETF-only
This entity draws a beam, straight or waving depending on settings, between 'target' and target2'.

-------- KEYS --------
"target": Start entity of beam. If this key is not used, there will be a beam going out from target2 into random directions. 
"target2": End entity of beam. If this key is not used, the misc_beam entity itself will be used. 
"dmg": When set, lets the beam damage any hurtable objects that touch it. This also sets the state of the beam to active. 
"shader": Points to a shader to be used for the beam. Defaults to 'lightningBolt'. 
"color": Color of the beam, if the shader is colourable by code. 
"segments": Number of segments the beam exists off (0 is a beam like the shaft). 
"scale": Width of the beam (works with segments >= 1). 
"maxamp": Maximum amplitude of the beam (works with segments >= 1). 
"wavescale": Sets the speed at which the beam waves, > 1 is faster, < 1 is slower (works with segments >= 1). 

Spawnflags:
1 (BEAM_STRAIGHT) Straight beam, shaft style. 
2 (BEAM_WAVE) Beam in a 2d wave along the beams direction. 
4 (BEAM_WAVE_3D) Beam in a 3d wave along the beams direction. 
8 (BEAM_TILESHADER) Tile the shader along the beam. 

-------- NOTES --------
- It can draw between all kind of entities, such as simple info_notnull ents but also func_train or func_bobbing ents (Use an origin brush in those, else the beam will target to (0,0,0)).
*/

//=============================================================================

/*QUAKED misc_flare (.5 .5 0) (-4 -4 -4) (4 4 4) LENSFLARE LENSBLIND LENSFLAREBLIND
ETF-only
This entity draws a light- or lensflare, optionally blinding the screen of the person who looks at it. 

-------- KEYS --------
"light": Flare intensity, equiv to light (defaults to 300). 
"_color": Flare colo/r, equiv to light  (defaults to "1.0 1.0 1.0"). 
"shader": Path to shader  (defaults to "flareshader"). 
"radius": Flare radius (defaults to 1.0, about 64x64 pixels @ 640x480). 
"rotation": Initial rotation of light flare (defaults to 0).

Spawnflags:
1 (LENSFLARE) Makes it a lensflare. 
2 (LENSBLIND) Makes it blinds the screen. 
4 (LENSFLAREBLIND) Makes it a lensflare that blinds the screen. 

*/

//=============================================================================

/*QUAKED misc_sunflare (.5 .5 0) (-4 -4 -4) (4 4 4) LENSFLARE LENSBLIND LENSFLAREBLIND
ETF-only
This entity draws a light- or lensflare, optionally blinding the screen of the person who looks at it. 
It has a special feature over the 'misc_flare' entity, namely that it can be put in a skyportal and still render properly. 

-------- KEYS --------
"light": Flare intensity, equiv to light (defaults to 300). 
"_color": Flare colo/r, equiv to light  (defaults to "1.0 1.0 1.0"). 
"shader": Path to shader  (defaults to "flareshader"). 
"radius": Flare radius (defaults to 1.0, about 64x64 pixels @ 640x480). 
"rotation": Initial rotation of light flare (defaults to 0).

Spawnflags:
1 (LENSFLARE) Makes it a lensflare. 
2 (LENSBLIND) Makes it blinds the screen. 
4 (LENSFLAREBLIND) Makes it a lensflare that blinds the screen. 

*/

//=============================================================================


/*QUAKED misc_onkill (.5 0 0) (-8 -8 -8) (8 8 8) CANSEEVICTIM CANSEEATTACKER WATCHRANGEFROMVICTIM
ETF-only
Whenever a player is killed, all misc_onkill ents are triggered.
The activator is the attacker and the person he/she kills is the victim.
In the case of suicide or world kills, the attacker and victim are the same.

If the criteria pass, the following are activated:
attacker_<team>_message/sound
victim_<team>_message/sound
"attackertarget" and "victimtarget" are executed, using the two respective players involved.

-------- KEYS --------
"allowteams": Checked against the attacker.
"allowclasses": Checked against the attacker.
"holding": Checked against the attacker.
"notholding": Checked against the attacker.
"clientstats": Checked against the attacker.
"checkstate":Checked against the attacker.

"victimallowteams": Checked against the victim.
"victimallowclasses": Checked against the victim.
"victimholding": Checked against the victim.
"victimnotholding": Checked against the victim.
"victimclientstats": Checked against the victim.
"victimcheckstate":Checked against the victim.

"watch": specifies the targetname of an entity to center the watch radius around.
"watchradius": radius in world units that specifies the zone around the watch item that the attacker must be in for the attacker to activate.

The watch behaviour can be modified by the spawnflags.

Spawnflags:
1 (CANSEEVICTIM) Only trigger if watch has the victim in line of sight. 
2 (CANSEEATTACKER) Only trigger if watch has the attacker in line of sight. 
4 (WATCHRANGEFROMVICTIM) Check watchrange against victim instead of attacker. 

-------- NOTES --------
Flags: "allowsame" allows the entity to trigger in the case of a player suicide (victim=attacker)
*/

//=============================================================================

/*QUAKED misc_onprotect (.5 0 0) (-8 -8 -8) (8 8 8)
ETF-only
Whenever a player is killed, all misc_onprotect ents are triggered for any nearby players in line of sight. 
This entity relates 3 players together: the attacker, the defender, and the victim.  
The defender is the activator, ie the person who would receive the bonus.
The attacker is the person that the defender killed.
The victim is the last person that the attacker damaged.

-------- KEYS --------
"attacker_<team>_message:" Send a message to all players on the attacker's team. 
"attacker_<team>_sound:" Play a sound to all players on the attacker's team.
"attackertarget:" activate the target with the attacker as the activator
"attackerallowclasses:" Only the specified classes (e.g. "scout,demo,spy") are allowed
"attackerallowteams:" Only attackers from the specified (e.g. "red,blue") teams are allowed.
"attackerholding:" Only those attackers holding these goalitems
"attackernotholding:" Only those attackers not holding these goalitems
"attackerclientstats":" Only activate if the attacker's client stats match.

"victim_<team>_message:" Send a message to all players on the victim's team
"victim_<team>_sound:" play a sound to all players on the victim's team
"victimtarget:" activate the target with the victim as the activator
"victimallowclasses:" Only the specified classes (e.g. "scout,demo,spy") are allowed
"victimallowteams:" Only victims from the specified (e.g. "red,blue") teams are allowed.
"victimholding:" Only those victims holding these goalitems
"victimnotholding:" Only those victims not holding these goalitems
"victimclientstats":" Only activate if the victim's client stats match.

"active_<team>_message":" Send a message to all players on the defender's team. 
"active_<team>_sound":" Play a sound to all players on the defender's team.
"activetarget":" activate the target with the defender as the activator
"allowclasses":" Only the specified classes (e.g. "scout,demo,spy") are allowed
"allowteams":" Only defenders from the specified teams (e.g. "red,blue") are allowed
"holding":" Only those defenders holding these goalitems
"notholding":" Only those defenders not holding these goalitems
"clientstats":" Only activate if the defender's client stats match.

-------- NOTES --------
- Flags of interest: orclientstats
*/

//=============================================================================

/*QUAKED panel_location (0 .5 1) (-4 -4 -4) (4 4 4)
ETF-only
A virtual 640x480 screen that is mapped onto a surface and displays the contents of the nearest target_location.
Put it within 64 units of a wall and it will automatically be mapped onto it.

-------- KEYS --------
"backshader": the shader drawn behind the panel itself.
"frontshader": the shader drawn on top of the panel.
"transition": the 'transition' between shown and notshown (currently, only 'fade' or 'none'). Back and frontshaders are always drawn.
"width": the width of the panel in world units (default 100). 
"height": the height of the panel in world units (default 75). 
"distance": the distance the transition kicks in (default is automatically calculated). 
"angle": the angle at which the panel is rotated on the surface.

"xborder": horizontal border offsets in panel coords (640x480) 
"yborder": vertical border offsets in panel coords (640x480) 
"color": the color of the text drawn on the panel 
*/


//=============================================================================

/*QUAKED panel_message (0 .5 1) (-4 -4 -4) (4 4 4)
ETF-only
A virtual 640x480 screen that is mapped onto a surface and displays a message based on the current state.
Put it within 64 units of a wall and it will automatically be mapped onto it.

-------- KEYS --------
"backshader": the shader drawn behind the panel itself.
"frontshader": the shader drawn on top of the panel.
"transition": the 'transition' between shown and notshown (currently, only 'fade' or 'none'). Back and frontshaders are always drawn.
"width": the width of the panel in world units (default 100). 
"height": the height of the panel in world units (default 75). 
"distance": the distance the transition kicks in (default is automatically calculated). 
"angle": the angle at which the panel is rotated on the surface.

"<state>message": the (centered, coloured) message to display for the current state.
"<state>colour": the colour for the message (overrides internal colour codes).

-------- NOTES --------
- All states except invisible can be used, since invisible hides the panel.
- If no message is specified for a state, the back and fore shaders will be shown without any text. 
*/

//=============================================================================

/*QUAKED panel_name (0 .5 1) (-4 -4 -4) (4 4 4)
ETF-only
A virtual 640x480 screen that is mapped onto a surface and displays player's name, though currently it displays a test string.
Put it within 64 units of a wall and it will automatically be mapped onto it.

-------- KEYS --------
"backshader": the shader drawn behind the panel itself.
"frontshader": the shader drawn on top of the panel.
"transition": the 'transition' between shown and notshown (currently, only 'fade' or 'none'). Back and frontshaders are always drawn.
"width": the width of the panel in world units (default 100). 
"height": the height of the panel in world units (default 75). 
"distance": the distance the transition kicks in (default is automatically calculated). 
"angle": the angle at which the panel is rotated on the surface.
*/

//=============================================================================

/*QUAKED panel_radar (0 .5 1) (-4 -4 -4) (4 4 4)
ETF-only
A virtual 640x480 screen that is mapped onto a surface and all players matching the normal criteria.
Put it within 64 units of a wall and it will automatically be mapped onto it.

-------- KEYS --------
"backshader": the shader drawn behind the panel itself.
"frontshader": the shader drawn on top of the panel.
"transition": the 'transition' between shown and notshown (currently, only 'fade' or 'none'). Back and frontshaders are always drawn.
"width": the width of the panel in world units (default 100). 
"height": the height of the panel in world units (default 75). 
"distance": the distance the transition kicks in (default is automatically calculated). 
"angle": the angle at which the panel is rotated on the surface.
"speed": Number of sweeps per second (default 0.5) .
"colour": The colour of the dots, or team colour if not specified.
"range": The range the sweep is effective to.
"attenuation": A float ranging from 0 to 1 indicating how strong the signal is, also affecting detection of non-moving entities (the default 1 means perfect detection, 0 means no detection of non-moving entities). A negative value indicates that walls increase attenuation.

-------- NOTES --------
- Flags of interest: "showheight".
- The sweep graphic should be displayed on the foreshader, with a time base of zero (to ensure that the sweep is in sync with the dots appearing).
*/

//=============================================================================

/*QUAKED panel_scoresummary (0 .5 1) (-4 -4 -4) (4 4 4)
ETF-only
A virtual 640x480 screen that is mapped onto a surface and displays current teams scores and frag leaders for each team.
Put it within 64 units of a wall and it will automatically be mapped onto it.

-------- KEYS --------
"backshader": the shader drawn behind the panel itself.
"frontshader": the shader drawn on top of the panel.
"transition": the 'transition' between shown and notshown (currently, only 'fade' or 'none'). Back and frontshaders are always drawn.
"width": the width of the panel in world units (default 100). 
"height": the height of the panel in world units (default 75). 
"distance": the distance the transition kicks in (default is automatically calculated). 
"angle": the angle at which the panel is rotated on the surface.
*/

//=============================================================================


/*QUAKED panel_timer (0 .5 1) (-4 -4 -4) (4 4 4)
ETF-only
A virtual 640x480 screen that is mapped onto a surface and displays a digital animated timer.
Put it within 64 units of a wall and it will automatically be mapped onto it.

-------- KEYS --------
"backshader": the shader drawn behind the panel itself.
"frontshader": the shader drawn on top of the panel.
"transition": the 'transition' between shown and notshown (currently, only 'fade' or 'none'). Back and frontshaders are always drawn.
"width": the width of the panel in world units (default 100). 
"height": the height of the panel in world units (default 75). 
"distance": the distance the transition kicks in (default is automatically calculated). 
"angle": the angle at which the panel is rotated on the surface.
"color": color of the timer text.
"type": numerical type of the timer.

Types:
  1 - Elapsed time, as "MM:SS".
  2 - Elapsed time, as "MM:SS.mmm".
  3 - Remaining time, as "MM:SS".
  4 - Remaining time, as "MM:SS.mmmm".
  5 - 12 hour clock, as "HH:MM:SS"
  6 - 24 hour clock, as "HH:MM:SS"
  7 - 12 hour clock, as "HH:MM:SS AM"
*/

//=============================================================================

/*QUAKED target_blackhole (1 0 0) ?
ETF-only
When activated removes all entities of the type specified by the "type" key

-------- KEYS --------
"type": "autosentry","supplystation","charge","grenades","projectiles","backpacks"
        "grenades" removes all undetonated grenades, and any effects generated by them (eg gas clouds, napalm patches, explosions)
        "projectiles" includes rockets, nails, pipes, and any other projectile
"allowteams": remove only those types belonging to a particular team
*/

//=============================================================================

/*QUAKED misc_matchtimer (0 .5 0) (-8 -8 -8) (8 8 8)
ETF-only
A general-purpose counter that can execute targets based on time.

-------- KEYS --------
"initialvalue": seconds to start counting down from (default 30).
"endvalue": stopping point (default 0).
"pulse": integer: delay in seconds between counter ticks (default 1).
"color": standard RGB coloring for the text (default "0.0 0.0 0.0").
"slot": hud slot to display the timer in (1-10);
"stepsize": how much to decrement the count by (default -1)
"steptime": how long each step takes in milliseconds (default 1000)

"target_<value>": target list of ents to trigger when <value> is reached on the timer.
"target_<value>_<team>_message": message to play when <value> is reached.
"target_<value>_<team>_sound": sound to play to <team> when <value> is reached.

"activetarget": trigger list that is executed every time the counter pulses.

States:
Disabled - Stop counting.
Inactive - Counting down, jumping to active whenever a target_<value> is reached.
Active - A target value has been reached.
Invisible - Reset the counter to initialvalue.

-------- NOTES --------
- All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
*/

//=============================================================================

/*QUAKED target_accumulator (0 .5 0) (-8 -8 -8) (8 8 8)
ETF-only
An entity that keeps count of the number of times that it is triggered.

-------- KEYS --------
"increment": value to add to internal accumulation when activator criteria pass.
"failincrement": value to add to internal accumulation when activator criteria fail.

"initialvalue":the initial value for the accumulator.
"target_<value>": target list triggered when <value> is reached.
"<value>_<team>_message": message played to <team> when <value> is reached.
"<value>_<team>_sound": sound played to <team> when <value> is reached.

"activetarget":  this is triggered every time it is successfully triggered.

States:
inactive: entity is ready to be triggered.
active: entity has been successfully triggered.
invisible: reset the counter to initialvalue.
disabled: entity will not count when it is triggered.

-------- NOTES --------
- All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.

*/

//=============================================================================

/*QUAKED target_command (0 .5 0) (-8 -8 -8) (8 8 8)
ETF-only
When activated, carries out system commands.

-------- KEYS --------
"message": the command to carry out, currently "intermission", "ceasefire on" and "ceasefire off".

"intermission": ends the current map and brings up the final scoreboard and vote screen.
"ceasefire on": activates ceasefire. Note, you will need an admin to disable ceasefire, since enabling this will disable all further entity processing.
*/

//=============================================================================

/*QUAKED target_reset (0 .5 0) (-8 -8 -8) (8 8 8)
ETF-only
When activated, destroys and recreates entities that have the flag "resetable" marked.

-------- KEYS --------
"target": target list of entities to be killed and recreated.  All of these entities must have "flags" "resetable" as a key.

-------- NOTES --------
- Each target reset can only handle a total of 32 entities.  If you need to reset more, use multiple target_resets.
*/

//=============================================================================

/*QUAKED misc_skyportal_surface (1 .5 .5) (-4 -4 -4) (4 4 4)
Skyportal surface indicator. You need to have at least one in the PVS of the player at all times if you wish to have a skyportal rendered.

-------- KEYS --------
"target": point this to an info_notnull  that "sees" the view you want to display in the sky.

-------- NOTES --------
The surfaces that it locks onto must have the "nodraw" surfaceparm for the skyportal to properly display.

*/
//=============================================================================


//=============================================================================
//=============================================================================
//Modified for ETF
//=============================================================================
//=============================================================================

/*QUAKED info_notnull (0 .5 0) (-8 -8 -8) (8 8 8)
Modified for ETF
This entity is being used for extended trigger relaying and similar (which it really shouldn't be, we should be using a new entity class for the job). 

-------- KEYS --------
"light": amount of dynamic light to emit.  (ETF-only).
"color": color of the dynamic light.  (ETF-only).
"<state>target": activated when the notnull enters <state>. (ETF-only).

-------- NOTES --------
- All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.  (ETF-only).
*/

//=============================================================================

/*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32)
Modified for ETF

This entity (and its variants) is used much as before, except that that players can only spawn on it if they pass the 'allowteams' and 'allowclasses' critera. 
When a player spawns on it, it will trigger active as normal. 

The spawn points are checked to see what teams are valid - if there are no "team locked" spawnpoints, then all four teams will be playable. 


-------- KEYS --------
"angle" : direction in which player will look when spawning in the game.
"target" : this can point at a target_give entity for respawn freebies.
"give": give players the usual give items (ETF-only).

-------- NOTES --------
- All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.  (ETF-only).
*/

//=============================================================================

/*QUAKED func_door (0 .5 .8) ? START_OPEN - CRUSHER
Modified for ETF

Normal sliding door entity. By default, the door will activate when player walks close to it or when damage is inflicted to it.
-------- KEYS --------
angle : determines the opening direction of door (up = -1, down = -2).
speed : determines how fast the door moves (default 100).
wait : number of seconds before door returns (default 2, -1 = "never return" (in ETF) or "return immediately" in quake3) (ETF-modified)
lip : lip remaining at end of move (default 8)
targetname : if set, a func_button or trigger is required to activate the door.
health : (default 0) if set to any non-zero value, the button must take damage (any amount) to activate.
dmg : damage to inflict on player when he blocks operation of door (default 4). Door will reverse direction when blocked unless CRUSHER spawnflag is set.
team: assign the same team name to multiple doors that should operate together (see Notes).
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
model2 : path/name of model to include (eg: models/mapobjects/pipe/pipe02.md3).
origin : alternate method of setting XYZ origin of .md3 model included with entity (See Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- SPAWNFLAGS --------
START_OPEN : the door will spawn in the open state and operate in reverse.
CRUSHER : door will not reverse direction when blocked and will keep damaging player until he dies or gets out of the way.
-------- NOTES --------
Unlike in Quake 2, doors that touch are NOT automatically teamed. If you want doors to operate together, you have to team them manually by assigning the same team name to all of them. Setting the origin key is simply an alternate method to using an origin brush. When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value.
*/

//=============================================================================

/*QUAKED trigger_multiple (.5 .5 .5) ?
Modified for ETF
Variable size repeatable trigger. It will fire the entities it targets when touched by player. Can be made to operate like a trigger_once entity by setting the "wait" key to -1. It can also be activated by another trigger that targets it.
-------- KEYS --------
<state>target: activates when the entity enters <state> (ETF-only).
target : this points to the entity to activate.
targetname : activating trigger points to this.
wait : time in seconds until trigger becomes re-triggerable after it's been touched (default 0.2, -1 = trigger once).
random : random time variance in seconds added or subtracted from "wait" delay (default 0 - see Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
When the random key is set, its value is used to calculate a minimum and a maximum delay. The final time delay will be a random value anywhere between the minimum and maximum values: (min delay = wait - random) (max delay = wait + random).*/
All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
*/

//=============================================================================

/*QUAKED func_train (0 .5 .8) ?
Modified for ETF
Trains are moving solids that follow a string of path_corner entities. Trains in Q3A are very basic, they also require an origin brush (see Notes).

ETF Additions
When a func_train reaches a path_corner, it first checks if there is a next path_corner is available. 
This means that the next path_corner exists, and is in state active or inactive. 
Also, when it finds multiple valid targets, it randomly chooses between then. 
With this you can, say, let a train switch between track A and B using a switch.
Next to that, opposed to the standard Q3 implementation of the func_train, the ETF version has proper collision with entities, and will push them forward till they are crushed. Goalitems will return to their spawn position, in other words, go back to their inactive state.

-------- KEYS --------
dmg : amount of damage to do to players who block it (ETF-only).
speed : speed of displacement of train (default 100 or overridden by speed value of path).
target : this points to the first path_corner of the path which is also the spawn location of the train's origin.
model2 : path/name of model to include (eg: models/mapobjects/pipe/pipe02.md3).
origin : alternate method of setting XYZ origin of the train's brush(es) and .md3 model included with entity (See Notes).
light : constantLight radius of .md3 model included with entity. Has no effect on the entity's brushes (default 0).
color : constantLight color of .md3 model included with entity. Has no effect on the entity's brushes (default 1 1 1).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
1. Trains always start on in the game.
2. Trains do not damage the played when blocked.
3. Trains cannot emit sound.
4. Trains are not triggerable or toggle-able.
5. Trains cannot be block-stopped just by getting in their way, the player must be wedged between the train and another obstacle to block it.

Setting the origin key is simply an alternate method to using an origin brush. When using the model2 key, the origin point of the model will correspond to the origin point defined by either the origin brush or the origin coordinate value.
*/
//=============================================================================

/*QUAKED path_corner (.5 .3 0) (-8 -8 -8) (8 8 8)
Modified for ETF
Path corner entity that func_trains can be made to follow.
-------- KEYS --------
angles: "pitch yaw roll" (ETF-only).
target : point to next path_corner in the path.
targetname : the train following the path or the previous path_corner in the path points to this.
speed : speed of func_train while moving to the next path corner. This will override the speed value of the train.
wait : number of seconds func_train will pause on path corner before moving to next path corner (default 0 - see Notes).
notfree : when set to 1, entity will not spawn in "Free for all" and "Tournament" modes.
notteam : when set to 1, entity will not spawn in "Teamplay" and "CTF" modes.
notsingle : when set to 1, entity will not spawn in Single Player mode (bot play mode).
-------- NOTES --------
Setting the wait key to -1 will not make the train stop on the path corner, it will simply default to 0.
*/

//=============================================================================

//=============================================================================

/*QUAKED misc_parallax (.5 .9 .5) (-8 -8 -8) (8 8 8)
ETF only
Simulates a multi-layered shader that is affected by parallax as the player moves around.

-------- KEYS --------
xscale: amount to scale the surface by in the x dimension (default 100)
yscale: amount to scale the surface by in the y dimension (default 100)
angle : direction that the entity will face (default 0)
vertex1-16  : "x y z" - location of the each vertex, defined in a totally-clockwise or totally-counterclockwise direction
depth<value> : name of the shader to be drawn at the simulated depth of <value>.
-------- NOTES --------
You need at least 3 vertexes defined for the this entity to work properly.
Up to 10 layers are supported
//=============================================================================
*/

//=============================================================================

//=============================================================================

/*QUAKED misc_mapsentry (0 .5 0) (-8 -8 -8) (8 8 8)
ETF only
Fixed sentry gun to be placed in the map.

-------- KEYS --------
angle: degrees e.g. 90
angles: "x y z" e.g. 180 0 0
kill_<team>_message : Message to the <team> on player kill.
-------- NOTES --------
- Uunsure about angle and angles
- All normal activation criteria apply: allowclasses, allowteams, checkstate, clientstats, holding, and notholding.
- Use normal criteria to specify who to shoot at. e.g. "allowteams" "red"

//=============================================================================
*/


More to explore[edit]

This section discusses additional noteworthy features of ETF mapping (not just related to entities) and provides links to further online resources.

Compiling with q3map2[edit]

Here is the complete manual to q3map2: Q3Map2

Make sure you use -fs_game etf , -game et and -custinfoparms switches on each phase of the compile (bsp, vis, light)

Example of a .bat used to compile etf_2stoned:

"C:\Program Files\GtkRadiant-1.4\q3map_2.5.16\q3map2.exe" -v -game et -fs_basepath "D:\Games\Wolf-ET" -meta -custinfoparms -fs_game etf "D:\Games\Wolf-ET\etmain\maps\etf_2stoned.map" > compile-recent-bsp.log

"C:\Program Files\GtkRadiant-1.4\q3map_2.5.16\q3map2.exe" -fs_basepath "D:\Games\Wolf-ET" -fs_game etf -game et -vis -saveprt "D:\Games\Wolf-ET\etmain\maps\etf_2stoned.map" > compile-recent-vis.log

"C:\Program Files\GtkRadiant-1.4\q3map_2.5.16\q3map2.exe" -fs_basepath "D:\Games\Wolf-ET" -fs_game etf -game et -light -fast -q3 -samples 2 -bounce 8 -dirty -patchshadows -shade -v "D:\Games\Wolf-ET\etmain\maps\etf_2stoned.map" > compile-recent-light.log

Decompiling BSPs into map files[edit]

A good way to learn is to examine how specific map features are implemented in an existing map. With the q3map2 tool included with GtkRadiant, you can take a .pk3 archive with the map, extract it and decompile the contained BSP file into a .map file:

q3map2.x86 -convert -format map -game et -fs_basepath /path/to/enemy-territory/etf /path/to/etf_map.bsp

The created etf_map_converted.map file is suitable for viewing with GtkRadiant or a text editor.

Particle system[edit]

ETF includes a particle engine for making light effects, sparks, etc. To add a source of particles to your map, create an entity like the one in the example below:

{
    "classname" "misc_particlesystem"
    "origin" "8 0 80"
    "script" "spirit/maps/muon_blue_sparks.spirit"
    "dir" "90"
}

The "script" attribute refers to a script file in one of the *.pk3 archives available to the game engine. To see examples, extract the *.spirit files contained in the pk3s shipped with ETF.