A way to include ingame objective info to players


(Erik-Ftn) #1

Hi

I’ve been thinking about how to help players on pub servers who just run around and frag to get to know the objectives ingame. Also, I’ve been playing some custom maps on pub servers for a while and I’ve noticed that while some of the newer maps, eg FUNbeach2 and Hide2 have really complex and interesting objectives/ tactical dynamics, this is completely lost on a lot of people. I get the feeling that even people who probably reads a readme file and look at the limbo objectives menu don’t have the time (or maybe, would ever consider) to enter an empty map and have a solo runthrough to learn the tactics of it.

This causes these more complex maps to be really disliked by some quite good players (and not only by total noobs). Typical comments I ran across were eg “this map is off our rotation real soon”, “this is a really bad map” etc. Also. it only took one or two rounds of total spawn-annhilation by axis in Hide2 to get a lot of players really hostile to that map. IMO the problem is that the underlying structure/ tactics of the map is never understood and people give up before the quality of a map gets to them (and in Hide, before they realise that they should use the multiple attackroutes and sneak in to blow the gatelock to overcome the problems. Hence the name of the map, I guess…)

One way to address such an initial information/ map characteristics threshold for players new to a map might be to create an ingame newbie/ semi-newbie instruction function which is team, player class and objective status dependant.

As objectives are taken the instructions changes, and since it’s player class dependant it could be eg “Aim for right bunker entrance, help an engineer to blow it by reviving him and giving him medpacks.”, “Hand out ammo”, “Kill all axis trying to get through the passage by the tank.”, “Use your binoculars to look for mines by the wall.” etc etc

Such instructions could also be either really objective specific eg “Satchel the gate lock on the other side of the barred iron gate” or really general “Protect engys anyway necessary” or “Push the front forward”.

As I see it, close to the spawn, there could be a big messageboard and in front of it several trigger_multiples wich are team and player class specific. These triggers point to target_prints and are set to invisible/ default as objectives are taken. The target_prints are all set to “private”.

How to do this:

As several modders apparently already knows the ability to put text on a players screen is in the engine and works nicely. I guess this is the function that puts “You will spawn as a fieldops with a MP40” on your screen. Well, this function can be reached from ingame entities by including the entity target_print in the .def file.

here it is:

/*QUAKED target_print (1 0 0) (-8 -8 -8) (8 8 8) redteam blueteam private 
"message"   text to print 
If "private", only the activator gets the message.  If no checks, all clients get the message. 
*/

this is a template script for what I’m suggesting:



obj_1
{
 spawn
 {
  wait 200
 }

 trigger ok
 {
  wm_announce "WOA objective 1 is taken/ destroyed/ whatever" 
  trigger newbie_info_1 obj_1
  trigger game_manager objective_1
 }
}

newbie_info_1 // no more routines are actually needed
{

 spawn
 {
  wait 200
  setstate newbie_info_2 invisible // etc for any number of objectives
//setstate newbie_info_3 invisible
 }

 trigger obj_1
 {
  setstate newbie_info_1 invisible
  setstate newbie_info_2 default
 }

// -----------etc----------------

// trigger obj_2
// {
//  setstate newbie_info_2 invisible
//  setstate newbie_info_3 default
// }


}


this is some copyeable .map code, The triggers are separated for clarity/ mapping ease only.



// entity 0
{
"classname" "worldspawn"
}
// entity 1
{
"scriptname" "newbie_info_1"
"classname" "trigger_multiple"
"target" "t1"
"spawnflags" "18"
"targetname" "newbie_info_1"
// brush 0
{
( -8 -352 24 ) ( -8 -440 24 ) ( -8 -440 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 184 -336 24 ) ( -32 -336 24 ) ( -32 -336 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 168 -424 24 ) ( 168 -336 24 ) ( 168 -336 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( -32 -432 24 ) ( 184 -432 24 ) ( 184 -432 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( -32 -432 24 ) ( -32 -344 24 ) ( 184 -344 24 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 192 -344 -64 ) ( -24 -344 -64 ) ( -24 -432 -64 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
}
}
// entity 2
{
"classname" "target_print"
"origin" "232 -384 -16"
"targetname" "t1"
"spawnflags" "4"
"message" "soldier objective 1"
}
// entity 3
{
"scriptname" "newbie_info_1"
"target" "t2"
"classname" "trigger_multiple"
"spawnflags" "66"
"targetname" "newbie_info_1"
// brush 0
{
( 192 -232 -64 ) ( -24 -232 -64 ) ( -24 -320 -64 ) common/trigger 0 -32 0 0.500000 0.500000 0 7 0
( -32 -320 24 ) ( -32 -232 24 ) ( 184 -232 24 ) common/trigger 0 -32 0 0.500000 0.500000 0 7 0
( -32 -320 24 ) ( 184 -320 24 ) ( 184 -320 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 168 -312 24 ) ( 168 -224 24 ) ( 168 -224 -40 ) common/trigger 32 0 0 0.500000 0.500000 0 7 0
( 184 -224 24 ) ( -32 -224 24 ) ( -32 -224 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( -8 -240 24 ) ( -8 -328 24 ) ( -8 -328 -40 ) common/trigger 32 0 0 0.500000 0.500000 0 7 0
}
}
// entity 4
{
"message" "medic objective 1"
"spawnflags" "4"
"targetname" "t2"
"origin" "232 -272 -16"
"classname" "target_print"
}
// entity 5
{
"scriptname" "newbie_info_1"
"classname" "trigger_multiple"
"target" "t3"
"spawnflags" "130"
"targetname" "newbie_info_1"
// brush 0
{
( -8 -120 24 ) ( -8 -208 24 ) ( -8 -208 -40 ) common/trigger -16 0 0 0.500000 0.500000 0 7 0
( 184 -104 24 ) ( -32 -104 24 ) ( -32 -104 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 168 -192 24 ) ( 168 -104 24 ) ( 168 -104 -40 ) common/trigger -16 0 0 0.500000 0.500000 0 7 0
( -32 -200 24 ) ( 184 -200 24 ) ( 184 -200 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( -32 -200 24 ) ( -32 -112 24 ) ( 184 -112 24 ) common/trigger 0 16 0 0.500000 0.500000 0 7 0
( 192 -112 -64 ) ( -24 -112 -64 ) ( -24 -200 -64 ) common/trigger 0 16 0 0.500000 0.500000 0 7 0
}
}
// entity 6
{
"classname" "target_print"
"origin" "232 -152 -16"
"targetname" "t3"
"spawnflags" "4"
"message" "engineer objective 1 fj ieojfi owejfi wejfio jeiof jiowe jfew iof jweif jjewfje jiowe jfiow jfio juihhyrhe jrhui uh weuifh wuiefh iuwe hfuiwehf uiw heuifh uifhwiufh uiwefhiowejfiojweiofjiowejfio oijiojwefiojweoijf iowe jfiowejfio jweiofjweiofjweiojfioew "
}
// entity 7
{
"scriptname" "newbie_info_1"
"target" "t4"
"classname" "trigger_multiple"
"spawnflags" "34"
"targetname" "newbie_info_1"
// brush 0
{
( 192 0 -64 ) ( -24 0 -64 ) ( -24 -88 -64 ) common/trigger 0 -16 0 0.500000 0.500000 0 7 0
( -32 -88 24 ) ( -32 0 24 ) ( 184 0 24 ) common/trigger 0 -16 0 0.500000 0.500000 0 7 0
( -32 -88 24 ) ( 184 -88 24 ) ( 184 -88 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 168 -80 24 ) ( 168 8 24 ) ( 168 8 -40 ) common/trigger 16 0 0 0.500000 0.500000 0 7 0
( 184 8 24 ) ( -32 8 24 ) ( -32 8 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( -8 -8 24 ) ( -8 -96 24 ) ( -8 -96 -40 ) common/trigger 16 0 0 0.500000 0.500000 0 7 0
}
}
// entity 8
{
"message" "fieldops objective 1"
"spawnflags" "4"
"targetname" "t4"
"origin" "232 -40 -16"
"classname" "target_print"
}
// entity 9
{
"scriptname" "newbie_info_1"
"classname" "trigger_multiple"
"target" "t5"
"spawnflags" "258"
"targetname" "newbie_info_1"
// brush 0
{
( -8 104 24 ) ( -8 16 24 ) ( -8 16 -40 ) common/trigger 48 0 0 0.500000 0.500000 0 7 0
( 184 120 24 ) ( -32 120 24 ) ( -32 120 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 168 32 24 ) ( 168 120 24 ) ( 168 120 -40 ) common/trigger 48 0 0 0.500000 0.500000 0 7 0
( -32 24 24 ) ( 184 24 24 ) ( 184 24 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( -32 24 24 ) ( -32 112 24 ) ( 184 112 24 ) common/trigger 0 -48 0 0.500000 0.500000 0 7 0
( 192 112 -64 ) ( -24 112 -64 ) ( -24 24 -64 ) common/trigger 0 -48 0 0.500000 0.500000 0 7 0
}
}
// entity 10
{
"classname" "target_print"
"origin" "232 72 -16"
"targetname" "t5"
"spawnflags" "4"
"message" "covop objective 1"
}
// entity 11
{
"scriptname" "newbie_info_2"
"targetname" "newbie_info_2"
"spawnflags" "18"
"target" "t6"
"classname" "trigger_multiple"
// brush 0
{
( 480 -352 -64 ) ( 264 -352 -64 ) ( 264 -440 -64 ) common/trigger 0 -16 0 0.500000 0.500000 0 7 0
( 256 -440 24 ) ( 256 -352 24 ) ( 472 -352 24 ) common/trigger 0 -16 0 0.500000 0.500000 0 7 0
( 256 -440 24 ) ( 472 -440 24 ) ( 472 -440 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 456 -432 24 ) ( 456 -344 24 ) ( 456 -344 -40 ) common/trigger 16 0 0 0.500000 0.500000 0 7 0
( 472 -344 24 ) ( 256 -344 24 ) ( 256 -344 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 280 -360 24 ) ( 280 -448 24 ) ( 280 -448 -40 ) common/trigger 16 0 0 0.500000 0.500000 0 7 0
}
}
// entity 12
{
"message" "soldier objective 2"
"spawnflags" "4"
"targetname" "t6"
"origin" "520 -392 -16"
"classname" "target_print"
}
// entity 13
{
"scriptname" "newbie_info_2"
"targetname" "newbie_info_2"
"spawnflags" "66"
"classname" "trigger_multiple"
"target" "t7"
// brush 0
{
( 280 -248 24 ) ( 280 -336 24 ) ( 280 -336 -40 ) common/trigger -16 0 0 0.500000 0.500000 0 7 0
( 472 -232 24 ) ( 256 -232 24 ) ( 256 -232 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 456 -320 24 ) ( 456 -232 24 ) ( 456 -232 -40 ) common/trigger -16 0 0 0.500000 0.500000 0 7 0
( 256 -328 24 ) ( 472 -328 24 ) ( 472 -328 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 256 -328 24 ) ( 256 -240 24 ) ( 472 -240 24 ) common/trigger 0 16 0 0.500000 0.500000 0 7 0
( 480 -240 -64 ) ( 264 -240 -64 ) ( 264 -328 -64 ) common/trigger 0 16 0 0.500000 0.500000 0 7 0
}
}
// entity 14
{
"classname" "target_print"
"origin" "520 -280 -16"
"targetname" "t7"
"spawnflags" "4"
"message" "medic objective 2"
}
// entity 15
{
"scriptname" "newbie_info_2"
"targetname" "newbie_info_2"
"spawnflags" "130"
"target" "t8"
"classname" "trigger_multiple"
// brush 0
{
( 480 -120 -64 ) ( 264 -120 -64 ) ( 264 -208 -64 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 256 -208 24 ) ( 256 -120 24 ) ( 472 -120 24 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 256 -208 24 ) ( 472 -208 24 ) ( 472 -208 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 456 -200 24 ) ( 456 -112 24 ) ( 456 -112 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 472 -112 24 ) ( 256 -112 24 ) ( 256 -112 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 280 -128 24 ) ( 280 -216 24 ) ( 280 -216 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
}
}
// entity 16
{
"message" "engineer objective 2"
"spawnflags" "4"
"targetname" "t8"
"origin" "520 -160 -16"
"classname" "target_print"
}
// entity 17
{
"scriptname" "newbie_info_2"
"targetname" "newbie_info_2"
"spawnflags" "34"
"classname" "trigger_multiple"
"target" "t9"
// brush 0
{
( 280 -16 24 ) ( 280 -104 24 ) ( 280 -104 -40 ) common/trigger 32 0 0 0.500000 0.500000 0 7 0
( 472 0 24 ) ( 256 0 24 ) ( 256 0 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 456 -88 24 ) ( 456 0 24 ) ( 456 0 -40 ) common/trigger 32 0 0 0.500000 0.500000 0 7 0
( 256 -96 24 ) ( 472 -96 24 ) ( 472 -96 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 256 -96 24 ) ( 256 -8 24 ) ( 472 -8 24 ) common/trigger 0 -32 0 0.500000 0.500000 0 7 0
( 480 -8 -64 ) ( 264 -8 -64 ) ( 264 -96 -64 ) common/trigger 0 -32 0 0.500000 0.500000 0 7 0
}
}
// entity 18
{
"classname" "target_print"
"origin" "520 -48 -16"
"targetname" "t9"
"spawnflags" "4"
"message" "fieldops objective 2"
}
// entity 19
{
"scriptname" "newbie_info_2"
"targetname" "newbie_info_2"
"spawnflags" "258"
"target" "t10"
"classname" "trigger_multiple"
// brush 0
{
( 480 104 -64 ) ( 264 104 -64 ) ( 264 16 -64 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 256 16 24 ) ( 256 104 24 ) ( 472 104 24 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 256 16 24 ) ( 472 16 24 ) ( 472 16 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 456 24 24 ) ( 456 112 24 ) ( 456 112 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 472 112 24 ) ( 256 112 24 ) ( 256 112 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
( 280 96 24 ) ( 280 8 24 ) ( 280 8 -40 ) common/trigger 0 0 0 0.500000 0.500000 0 7 0
}
}
// entity 20
{
"message" "covop objective 2"
"spawnflags" "4"
"targetname" "t10"
"origin" "520 64 -16"
"classname" "target_print"
}
// entity 21
{
"targetname" "newbie_info_1"
"scriptname" "newbie_info_1"
"spawnflags" "2"
"classname" "script_mover"
// brush 0
{
( 188 -448 -64 ) ( 124 -448 -64 ) ( 124 -456 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 124 -456 -40 ) ( 124 -448 -40 ) ( 188 -448 -40 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 124 -456 -56 ) ( 188 -456 -56 ) ( 188 -456 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 132 -464 -56 ) ( 132 -456 -56 ) ( 132 -456 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 188 -448 -56 ) ( 124 -448 -56 ) ( 124 -448 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 124 -448 -80 ) ( 124 -456 -80 ) ( 124 -456 -88 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
}
// brush 1
{
( 64 -448 -40 ) ( 0 -448 -40 ) ( 0 -456 -40 ) castle_wood/cwood_c10 0 128 0 0.500000 0.500000 0 0 0
( 0 -456 24 ) ( 0 -448 24 ) ( 64 -448 24 ) castle_wood/cwood_c10 0 128 0 0.500000 0.500000 0 0 0
( 0 -456 -32 ) ( 64 -456 -32 ) ( 64 -456 -40 ) castle_wood/cwood_c10 0 80 0 0.500000 0.500000 0 0 0
( 160 -456 -48 ) ( 160 -448 -48 ) ( 160 -448 -56 ) castle_wood/cwood_c10 0 80 0 0.500000 0.500000 0 0 0
( 64 -448 -32 ) ( 0 -448 -32 ) ( 0 -448 -40 ) castle_wood/cwood_c10 0 80 0 0.500000 0.500000 0 0 0
( 0 -448 -32 ) ( 0 -456 -32 ) ( 0 -456 -40 ) castle_wood/cwood_c10 0 80 0 0.500000 0.500000 0 0 0
}
// brush 2
{
( 28 -448 -80 ) ( 28 -456 -80 ) ( 28 -456 -88 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 92 -448 -56 ) ( 28 -448 -56 ) ( 28 -448 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 36 -464 -56 ) ( 36 -456 -56 ) ( 36 -456 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 28 -456 -56 ) ( 92 -456 -56 ) ( 92 -456 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 28 -456 -40 ) ( 28 -448 -40 ) ( 92 -448 -40 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
( 92 -448 -64 ) ( 28 -448 -64 ) ( 28 -456 -64 ) zzz_pool/tile16 0 0 0 0.500000 0.500000 0 0 0
}
}
// entity 22
{
"scriptname" "newbie_info_2"
"targetname" "newbie_info_2"
"classname" "script_mover"
// brush 0
{
( 404 -464 -80 ) ( 404 -472 -80 ) ( 404 -472 -88 ) zzz_pool/tile16 32 0 0 0.500000 0.500000 0 0 0
( 468 -464 -56 ) ( 404 -464 -56 ) ( 404 -464 -64 ) zzz_pool/tile16 16 0 0 0.500000 0.500000 0 0 0
( 412 -480 -56 ) ( 412 -472 -56 ) ( 412 -472 -64 ) zzz_pool/tile16 32 0 0 0.500000 0.500000 0 0 0
( 404 -472 -56 ) ( 468 -472 -56 ) ( 468 -472 -64 ) zzz_pool/tile16 16 0 0 0.500000 0.500000 0 0 0
( 404 -472 -40 ) ( 404 -464 -40 ) ( 468 -464 -40 ) zzz_pool/tile16 16 -32 0 0.500000 0.500000 0 0 0
( 468 -464 -64 ) ( 404 -464 -64 ) ( 404 -472 -64 ) zzz_pool/tile16 16 -32 0 0.500000 0.500000 0 0 0
}
// brush 1
{
( 372 -464 -64 ) ( 308 -464 -64 ) ( 308 -472 -64 ) zzz_pool/tile16 16 -32 0 0.500000 0.500000 0 0 0
( 308 -472 -40 ) ( 308 -464 -40 ) ( 372 -464 -40 ) zzz_pool/tile16 16 -32 0 0.500000 0.500000 0 0 0
( 308 -472 -56 ) ( 372 -472 -56 ) ( 372 -472 -64 ) zzz_pool/tile16 16 0 0 0.500000 0.500000 0 0 0
( 316 -480 -56 ) ( 316 -472 -56 ) ( 316 -472 -64 ) zzz_pool/tile16 32 0 0 0.500000 0.500000 0 0 0
( 372 -464 -56 ) ( 308 -464 -56 ) ( 308 -464 -64 ) zzz_pool/tile16 16 0 0 0.500000 0.500000 0 0 0
( 308 -464 -80 ) ( 308 -472 -80 ) ( 308 -472 -88 ) zzz_pool/tile16 32 0 0 0.500000 0.500000 0 0 0
}
// brush 2
{
( 280 -464 -32 ) ( 280 -472 -32 ) ( 280 -472 -40 ) castle_wood/cwood_c10 32 80 0 0.500000 0.500000 0 0 0
( 344 -464 -32 ) ( 280 -464 -32 ) ( 280 -464 -40 ) castle_wood/cwood_c10 -48 80 0 0.500000 0.500000 0 0 0
( 440 -472 -48 ) ( 440 -464 -48 ) ( 440 -464 -56 ) castle_wood/cwood_c10 32 80 0 0.500000 0.500000 0 0 0
( 280 -472 -32 ) ( 344 -472 -32 ) ( 344 -472 -40 ) castle_wood/cwood_c10 -48 80 0 0.500000 0.500000 0 0 0
( 280 -472 24 ) ( 280 -464 24 ) ( 344 -464 24 ) castle_wood/cwood_c10 -48 96 0 0.500000 0.500000 0 0 0
( 344 -464 -40 ) ( 280 -464 -40 ) ( 280 -472 -40 ) castle_wood/cwood_c10 -48 96 0 0.500000 0.500000 0 0 0
}
}



(Ifurita) #2

Can you put that into a map of yours and post a screenshot. I’ve love to see what that entity does/shows in-game


(Erik-Ftn) #3

eh… if someone seriously objects to me using the blurb of the book I just read …
well I guess I’ll redo the pic… or have your lawyer call mine :slight_smile:


(Drakir) #4

Had no idea this entity existed. I was looking for a way to do this as i loved the “player only” messages in Team Fortress!

So if i understand this right, the target_print entity only gives a message to the one that triggers it?

“You have the flag, take it to the Cap Point at map pos, G 4”

Gotta test this…why havent any1 mentioned this before…!


(Erik-Ftn) #5

You will have to test if the private part works with a lot of ppl. Please post your findings if you do test it.

I assume the private part works because the team part works.

flags are like this:

noflags - to all
redteam - axis
blueteam - allied
private - to the player triggering, regardless of team and red/blueflags

Ie, to get a teamspecific and private message you have to use conditioned trigger_multiples.