I had fun writing out this article about making your own Quake 3 Fortress communications script, back
when I was in Clan Valhalla. Now that The Enemy Territory Fortress Mod is being released for the
FREE Enemy Territory game, maybe I will dust it off and update it!


01-16-2005




Hi! These are some of my favorite scripts that I use, everyone is welcome to copy what they like, for their own use, just like I did, with most of the idea's here.

This is my current Flexcomms script, I'm always tinkering with it and making small changes, but I'm generaly pretty happy with it.
I didn't like many of the of the "Everything" comms scripts, there was just WAY to much stuff to remember, I mean KP_END could be any of 5 or 6 different messages, depending on what "mode" you were in.... Bah !

What's different about this script is that the key assignments are temporary, they occur when I hold down a key. As soon as I release the key, all the original assignments are re-mapped. The keys are always at the default, most important communications unless I am holding down one of the "group" keys. I happen to be using the keypad for the messages and the arrow keys for my "groups". The bottom row of arrow keys gives me three conveniently selected groups that I can hit with my thumb. Since the keypad is always at the default settings when I am not holding a key down, that's really four groups available! That should be more than enough for ANY communications scenario.

So I sat down and figured out what were the things I would MOST want to communicate to my team on a regular basis, and assigned default single messages to the keypad and "grey keys". I always know what ANY key is bound to, so I don't need to pause and think about it.

You should note that the "Compliment-o-Matic" and "Taunt-o-Matic" (Thanks Elhana!) are both message mode 1 so everyone hears them.

If you want a copy of the Flexcomms to tinker with or use, Just click on the link HERE, or, go to the files page and download the Zipped copy, both of which also have a "Blank" version of the comm config that is ready to be customized. The example you see here on the page is chock full of HTML tags that will play a bit of hob with the configs text layout, so I recommend the File !

// {VH}Ragnarok's FlexComm Configs For Q3F


// Comments
// I use two of the arrow keys, to briefly select groups of Comms, so I am only using
// one hand. That is, while I hold down an arrow key with my thumb, the keypad is mapped
// to a new group, when I release the arrow key, the original, or default group is re-mapped
// to the keys. This way, you always KNOW what the keys are mapped too, you don't have to wonder
// " Am I in the Offensive orders set, or the Defensive orders set ??"
// For my use, I have set my comms up so that similar orders/responses,
// tend to be grouped together along the same line of keys, eg: (123),(456),(789).
// I find that this makes it easier for me to remember the individual keys as I need them.
// You of course, are free to set things up any way you like!


// Set And Bind The B Group Key
set flexb_keydown "vstr flexb"
set flexb_keyup "vstr flexa"
bind downarrow "+alias flexb_key"


// Set And Bind The C Group Key
set flexc_keydown "vstr flexc"
set flexc_keyup "vstr flexa"
bind rightarrow "+alias flexc_key"


// The A, B, and C Group, Vstr's
set flexa "bind kp_end vstr flxa1; bind kp_downarrow vstr flxa2; bind kp_pgdn vstr flxa3; bind kp_leftarrow vstr flxa4; bind kp_5 vstr flxa5; bind kp_rightarrow vstr flxa6; bind kp_home vstr flxa7; bind kp_uparrow vstr flxa8; bind kp_pgup vstr flxa9"
set flexb "bind kp_end vstr flxb1; bind kp_downarrow vstr flxb2; bind kp_pgdn vstr flxb3; bind kp_leftarrow vstr flxb4; bind kp_5 vstr flxb5; bind kp_rightarrow vstr flxb6; bind kp_home vstr flxb7; bind kp_uparrow vstr flxb8; bind kp_pgup vstr flxb9"
set flexc "bind kp_end vstr flxc1; bind kp_downarrow vstr flxc2; bind kp_pgdn vstr flxc3; bind kp_leftarrow vstr flxc4; bind kp_5 vstr flxc5; bind kp_rightarrow vstr flxc6; bind kp_home vstr flxc7; bind kp_uparrow vstr flxc8; bind kp_pgup vstr flxc9"



// Default, or, Group A Keypad Keys
set flxa1 "say_team &sound/voice/taunt/q3f_thanks.wav; tell_teamtarget THANKS MAN!"
set flxa2 "say_team ^1[$HH $AA] Medic^* needed at $L ! ;saveme"
set flxa3 "say_team ^1[$HH $AA] Engineer^* needed at $L ! ;armorme"
set flxa4 "say_team &sound/voice/comms/q3f_sentryspot.wav ^1Enemy^3 Sentry Gun spotted at ^1$D^* !!"
set flxa5 "say_team &sound/voice/comms/q3f_enemydown.wav ^1ENEMY SENTRY GUN DOWN AT $L^* !!!"
set flxa6 "say_team &sound/voice/comms/q3f_spotted.wav ^1Enemy^3 spotted at ^1$L^*"
set flxa7 "say_team [$S - $HH $AA] Attacking at Enemy main entrance"
set flxa8 "say_team [$S - $HH $AA] ATTACKING AT $L!"
set flxa9 "say_team &sound/voice/comms/q3f_inpos.wav [$S - $HH $AA] Hiding in/near the Enemy flag room !"


// Group B Keys
set flxb1 "say_team &sound/voice/comms/q3f_regroup.wav ^1REGROUP! AT MY LOCATION - $L!^*"
set flxb2 "say_team &sound/voice/comms/q3f_regroup.wav ^1REGROUP IMMEDIATELY!!^*"
set flxb3 "say_team &sound/voice/comms/q3f_regroup.wav ^!REGROUP AT DESIGNATED LOCATION!^*"
set flxb4 "say_team &sound/voice/comms/q3f_attacknow.wav ^1ATTACK!^*"
set flxb5 "say_team &sound/voice/comms/q3f_attacknow.wav ^1ATTACK CONTINUOUSLY!!^*"
set flxb6 "say_team ^1BREAK OFF ATTACK!!^*"
set flxb7 "say_team ^1TEAM! STAY TOGETHER!^*"
set flxb8 "say_team ^1TEAM! SPLIT UP! USE ALTERNATE ENTRANCES!^*"
set flxb9 "say_team &sound/voice/comms/q3f_reportin.wav ^3OFFENSE TEAM!, REPORT IN!^*"


// Group C Keys
set flxc1 "say_team ^1GOING FOR AMMO/REPAIRS $L!^*"
set flxc2 "say_team ^1TAKE YOUR POSITIONS DEFENSE !^*"
set flxc3 "say_team unassigned"
set flxc4 "say_team &sound/voice/comms/q3f_spotted.wav ^1AGENT SPOTTED AT $L!^*"
set flxc5 "say_team unassigned"
set flxc6 "say_team unassigned"
set flxc7 "say_team unassigned"
set flxc8 "say_team unassigned"
set flxc9 "say_team &sound/voice/comms/q3f_reportin.wav ^3DEFENSE TEAM!, REPORT IN!^*"



// Initial Default Keypad keys
bind kp_end "say_team &sound/voice/taunt/q3f_thanks.wav; tell_teamtarget THANKS MAN!"
bind kp_downarrow "say_team ^1[$HH $AA] Medic^* needed at $L ! ;saveme"
bind kp_pgdn "say_team ^1[$HH $AA] Engineer^* needed at $L ! ;armorme"
bind kp_leftarrow "say_team &sound/voice/comms/q3f_sentryspot.wav ^1Enemy^3 Sentry Gun spotted at ^1$D^* !!"
bind kp_5 "say_team &sound/voice/comms/q3f_enemydown.wav ^1ENEMY SENTRY GUN DOWN AT $L^* !!!"
bind kp_rightarrow "say_team &sound/voice/comms/q3f_spotted.wav ^1Enemy^3 spotted at ^1$L^*"
bind kp_home "say_team [$S - $HH $AA] Attacking at Enemy main entrance"
bind kp_uparrow "say_team [$S - $HH $AA] ATTACKING AT $L!"
bind kp_pgup "say_team &sound/voice/comms/q3f_inpos.wav [$S - $HH $AA] Hiding in/near the Enemy flag room !"
bind kp_ins "say_team ^1ENEMY FLAG DROPPED AT $D^* !!"
bind kp_del "say_team [$S - $L] ^1WHERE IS THE ENEMY FLAG^* ?"
bind kp_enter "say_team &sound/voice/taunt/q3f_my_flag.wav [$S - $HH $AA] ^1I HAVE THE ENEMY FLAG at $L, NEED BACKUP !! ^*"
bind kp_plus vstr acknow1
bind kp_minus "say_team &sound/voice/comms/q3f_negative.wav Ignore last message"
bind kp_slash "say_team ^2Agent X^* is Disguised as a $G at $L"
bind * "say_team &sound/voice/comms/q3f_inpos.wav ^2Ragnarok^*, in position as $S at $L"

Additional - Grey Keys
bind ins "say_team ^1[$HH $AA] HELP^3 needed to Defend our ^1FLAG at $L!!!^*"
bind home "say_team ^1OUR FLAG IS OUTGOING AT $D^* !!"
bind pgup "say_team ^1SPY CHECKING!^3 If you approach the flag WITHOUT firing a weapon,^1 YOU WILL BE ATTACKED!^*"
bind del "say_team Excellent!"
bind end "say_team Good Teamwork!!"
bind pgdn vstr death1





// Alternating Acknowledge - This alternates back and forth between two different sounds and
// and acknowledgements
set acknow1 "say_team &sound/voice/comms/q3f_acknowledged.wav [$S] Acknowledged ! [$L] ; bind kp_plus vstr acknow2"
set acknow2 "say_team &sound/voice/comms/q3f_roger.wav [$S] Roger that [$L] ; bind kp_plus vstr acknow1"


// Alternating Death Taunt - Similar to the Alternating Acknowledge
set death1 "say &sound/voice/taunt/q3f_death.wav ^1ARRRRGH!^*; bind pgdn vstr death2"
set death2 "say &sound/voice/taunt/q3f_death2.wav ^1GRRRRRR!^*; bind pgdn vstr death1"





// The Compliment-o-Matic

bind k "vstr message_1"

set "message_1" "vstr message_a"
set "message_a" "set message_1 vstr message_b ; say Your compliment here"
set "message_b" "set message_1 vstr message_c ; say Your compliment here"
set "message_c" "set message_1 vstr message_d ; say Your compliment here"
set "message_d" "set message_1 vstr message_e ; say Your compliment here"
set "message_e" "set message_1 vstr message_a ; say Your compliment here"


// The Taunt-o-Matic

bind l "vstr message_2"

set "message_2" "vstr message_f"
set "message_f" "set message_2 vstr message_g ; say Your insult here"
set "message_g" "set message_2 vstr message_h ; say Your insult here"
set "message_h" "set message_2 vstr message_i ; say Your insult here"
set "message_i" "set message_2 vstr message_j ; say Your insult here"
set "message_j" "set message_2 vstr message_k ; say Your insult here"
set "message_k" "set message_2 vstr message_f ; say Your insult here"



//-----------------------------------------------------------------------------------------------------------


// All The Sound Bindings That I Can Think Of

// General

// saveme
// armorme

// Comms Group

// &sound/voice/comms/q3f_acknowledged.wav "Acknowledged"
// &sound/voice/comms/q3f_backup.wav "Need Backup"
// &sound/voice/comms/q3f_coverme.wav "Cover me"
// &sound/voice/comms/q3f_enemydown.wav "Enemy down"
// &sound/voice/comms/q3f_fireinthehole.wav "Fire in the hole"
// &sound/voice/comms/q3f_flagbackup.wav "Incoming to flag, need backup now"
// &sound/voice/comms/q3f_flagoutpriexit.wav "Flag outgoing primary exit"
// &sound/voice/comms/q3f_flagoutsecexit.wav "Flag outgoing secondary exit"
// &sound/voice/comms/q3f_incfgprient.wav "Incoming to flag primary entrance"
// &sound/voice/comms/q3f_incflagsecent.wav "Incoming to flag secondary entrance"
// &sound/voice/comms/q3f_incmain.wav "Incoming main entrance"
// &sound/voice/comms/q3f_incsecent.wav "Incoming secondary entrance"
// &sound/voice/comms/q3f_inpos.wav "In position"
// &sound/voice/comms/q3f_moveout.wav "Move out"
// &sound/voice/comms/q3f_point.wav "I'll take point"
// &sound/voice/comms/q3f_reportin.wav "Report in"
// &sound/voice/comms/q3f_roger.wav "Roger that"
// &sound/voice/comms/q3f_spotted.wav "Enemy spotted"
// &sound/voice/comms/q3f_teammatedown.wav "Team mate down"
// &sound/voice/comms/q3f_ammo.wav "Give me some ammo"
// &sound/voice/comms/q3f_attacknow.wav "Attack now"
// &sound/voice/comms/q3f_awaitorders.wav "Awaiting orders"
// &sound/voice/comms/q3f_negative.wav "Negative"
// &sound/voice/comms/q3f_objcomp.wav "Objective complete"
// &sound/voice/comms/q3f_objfailed.wav "Objective failed"
// &sound/voice/comms/q3f_pipespot.wav "Pipe trap spotted"
// &sound/voice/comms/q3f_regroup.wav "Regroup"
// &sound/voice/comms/q3f_sentryspot.wav "Sentry spotted"

Taunts Group

// &sound/voice/taunt/q3f_niceshot.wav "Nice shot"
// &sound/voice/taunt/q3f_noproblem.wav "No problem"
// &sound/voice/taunt/q3f_sneakybast.wav "Sneaky bastard"
// &sound/voice/taunt/q3f_thanks.wav "Thanks"
// &sound/voice/taunt/q3f_ah_comeon.wav "Ah, come on"
// &sound/voice/taunt/q3f_come_ere.wav "Come 'ere"
// &sound/voice/taunt/q3f_death.wav "Death will be short and sweet"
// &sound/voice/taunt/q3f_death2.wav "For you death is only a short time away"
// &sound/voice/taunt/q3f_git_down.wav "Get down"
// &sound/voice/taunt/q3f_my_flag.wav "My flag"
// &sound/voice/taunt/q3f_ucant_havethat.wav "You can't have that"

// EOF

This Grenadier script is fairly typical of my individual class configs, I have a four button Logitech mouse and I like to use the scroll button to select the Single Barrel shotgun, or Grenade launcher, or click the third button to select/reload the Pipe launcher.When I am using my Recon script then the fourth button is used to prime, then throw the selected grenade, while the scroll button is used to select Gren1 or 2.
I have not yet figured out why Quake does not seem to recognize the fourth button being held down, only that the button was pressed. So that is why I am using a two press approach.

// Grenadier config

bind m "charge menu"
bind v "charge 5"
bind MOUSE3 "weapon 7; reload; echo Pipe Launcher Selected"
bind MWHEELUP "weapon 2"
bind MWHEELDOWN "weapon 6"
bind 0x00 "reload"


// EOF

And the Recon Script....


// Recon Config

// Two key press Gren Switcher scrippy for Mouse 4th Button

set grnd "vstr grnd1"

set grnd1 "vstr grnd1a"
set grnd1a "primeone;play sound/misc/q3f_gren_timer1.wav;set grnd1 vstr grnd1b"
set grnd1b "throwgren;throwgren;set grnd1 vstr grnd1a"

set grnd2 "vstr grnd2a"
set grnd2a "primetwo;play sound/misc/q3f_gren_timer1.wav;set grnd2 vstr grnd2b"
set grnd2b "throwgren;throwgren;set grnd2 vstr grnd2a"

bind MWHEELUP "set grnd vstr grnd1; echo Grenade One Selected"
bind MWHEELDOWN "set grnd vstr grnd2; echo Grenade Two Selected"
bind 0x00 "vstr grnd"

//EOF