]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/cl_client.c
- A message is centerprinted to players who join where to download Team:Nexuiz using...
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / cl_client.c
1 void info_player_start (void)\r
2 {\r
3         if (self.allowteams != "")\r
4         {\r
5                 if (self.allowteams == "blue")\r
6                         self.team_no = 1;\r
7                 if (self.allowteams == "red")\r
8                         self.team_no = 2;\r
9                 if (!self.goal_state)\r
10                         self.goal_state = 1;\r
11                 if (!self.group_no)\r
12                         self.group_no = 1;\r
13                 i_p_t();\r
14                 return;\r
15         }\r
16         else\r
17         {\r
18                 self.classname = "info_player_deathmatch";\r
19         }\r
20 };\r
21 \r
22 void info_player_deathmatch (void)\r
23 {\r
24 }\r
25 /*\r
26 ===============\r
27  Find Team Spawn Point (NexTF!)\r
28                                  ===============\r
29 */\r
30 entity (float team_num) FindTeamSpawnPoint =\r
31 {\r
32         local entity spot;\r
33         local entity at_spot;\r
34         local float spot_found;\r
35         local float attempts;\r
36 \r
37         if ((team_num == 1))\r
38         {\r
39                 spot = lastspawn_team1;\r
40                 attempts = 0;\r
41                 while (1)\r
42                 {\r
43                         attempts = (attempts + 1);\r
44                         spot = find (spot, team_str_home, "ts1");\r
45                         if ((spot == world))\r
46                         {\r
47                                 spot = find (world, team_str_home, "ts1");\r
48                         }\r
49                         if ((spot == world))\r
50                         {\r
51                                 return (world);\r
52                         }\r
53                         at_spot = findradius (spot.origin, 40);\r
54                         spot_found = 1;\r
55                         while ((at_spot != world))\r
56                         {\r
57                                 if (((at_spot.classname == "player") && (at_spot.deadflag == 0)))\r
58                                 {\r
59                                         spot_found = 0;\r
60                                 }\r
61                                 at_spot = at_spot.chain;\r
62                         }\r
63                         if (!Activated (spot, self))\r
64                         {\r
65                                 spot_found = 0;\r
66                         }\r
67                         if ((spot_found || (attempts >= 30)))\r
68                         {\r
69                                 lastspawn_team1 = spot;\r
70                                 return (spot);\r
71                         }\r
72                 }\r
73         }\r
74         else\r
75         {\r
76                 if ((team_num == 2))\r
77                 {\r
78                         spot = lastspawn_team2;\r
79                         attempts = 0;\r
80                         while (1)\r
81                         {\r
82                                 attempts = (attempts + 1);\r
83                                 spot = find (spot, team_str_home, "ts2");\r
84                                 if ((spot == world))\r
85                                 {\r
86                                         spot = find (world, team_str_home, "ts2");\r
87                                 }\r
88                                 if ((spot == world))\r
89                                 {\r
90                                         return (world);\r
91                                 }\r
92                                 at_spot = findradius (spot.origin, 40);\r
93                                 spot_found = 1;\r
94                                 while ((at_spot != world))\r
95                                 {\r
96                                         if (((at_spot.classname == "player") && (at_spot.deadflag == 0)))\r
97                                         {\r
98                                                 spot_found = 0;\r
99                                         }\r
100                                         at_spot = at_spot.chain;\r
101                                 }\r
102                                 if (!Activated (spot, self))\r
103                                 {\r
104                                         spot_found = 0;\r
105                                 }\r
106                                 if ((spot_found || (attempts >= 30)))\r
107                                 {\r
108                                         lastspawn_team2 = spot;\r
109                                         return (spot);\r
110                                 }\r
111                         }\r
112                 }\r
113                 else\r
114                 {\r
115                         if ((team_num == 3))\r
116                         {\r
117                                 spot = lastspawn_team3;\r
118                                 attempts = 0;\r
119                                 while (1)\r
120                                 {\r
121                                         attempts = (attempts + 1);\r
122                                         spot = find (spot, team_str_home, "ts3");\r
123                                         if ((spot == world))\r
124                                         {\r
125                                                 spot = find (world, team_str_home, "ts3");\r
126                                         }\r
127                                         if ((spot == world))\r
128                                         {\r
129                                                 return (world);\r
130                                         }\r
131                                         at_spot = findradius (spot.origin, 40);\r
132                                         spot_found = 1;\r
133                                         while ((at_spot != world))\r
134                                         {\r
135                                                 if (((at_spot.classname == "player") && (at_spot.deadflag == 0)))\r
136                                                 {\r
137                                                         spot_found = 0;\r
138                                                 }\r
139                                                 at_spot = at_spot.chain;\r
140                                         }\r
141                                         if (!Activated (spot, self))\r
142                                         {\r
143                                                 spot_found = 0;\r
144                                         }\r
145                                         if ((spot_found || (attempts >= 30)))\r
146                                         {\r
147                                                 lastspawn_team3 = spot;\r
148                                                 return (spot);\r
149                                         }\r
150                                 }\r
151                         }\r
152                         else\r
153                         {\r
154                                 if ((team_num == 4))\r
155                                 {\r
156                                         spot = lastspawn_team4;\r
157                                         attempts = 0;\r
158                                         while (1)\r
159                                         {\r
160                                                 attempts = (attempts + 1);\r
161                                                 spot = find (spot, team_str_home, "ts4");\r
162                                                 if ((spot == world))\r
163                                                 {\r
164                                                         spot = find (world, team_str_home, "ts4");\r
165                                                 }\r
166                                                 if ((spot == world))\r
167                                                 {\r
168                                                         return (world);\r
169                                                 }\r
170                                                 at_spot = findradius (spot.origin, 40);\r
171                                                 spot_found = 1;\r
172                                                 while ((at_spot != world))\r
173                                                 {\r
174                                                         if (((at_spot.classname == "player") && (at_spot.deadflag == 0)))\r
175                                                         {\r
176                                                                 spot_found = 0;\r
177                                                         }\r
178                                                         at_spot = at_spot.chain;\r
179                                                 }\r
180                                                 if (!Activated (spot, self))\r
181                                                 {\r
182                                                         spot_found = 0;\r
183                                                 }\r
184                                                 if ((spot_found || (attempts >= 30)))\r
185                                                 {\r
186                                                         lastspawn_team4 = spot;\r
187                                                         return (spot);\r
188                                                 }\r
189                                         }\r
190                                 }\r
191                         }\r
192                 }\r
193         }\r
194         return (world);\r
195 };\r
196 \r
197 /*\r
198 =============\r
199 SelectSpawnPoint\r
200 \r
201 Finds a point to respawn\r
202 =============\r
203 */\r
204 entity () SelectSpawnPoint =\r
205 {\r
206         local entity spot;\r
207         local entity at_spot;\r
208         local float spot_found;\r
209         local float attempts;\r
210 \r
211         if (self.team_no < 1)\r
212         {\r
213 //              self.origin_z = self.origin_z + 30;\r
214                 self.current_menu = MENU_NEED_TN;\r
215 \r
216                 stuffcmd(self, "alias menu_showteamselect \"set scmenu_directmenu TeamSelect; togglemenu\"\n");\r
217                 stuffcmd(self, "set scmenu_directmenu TeamSelect; togglemenu\n");\r
218 \r
219                 stuffcmd(self, "alias classmenu \"impulse 73\"\n");\r
220 //              spot = find (world, classname, "item_tfgoal");\r
221 //              return (spot);\r
222         }\r
223         self.is_dead = 0;               //TEMP\r
224 \r
225         if ((self.team_no != 0))\r
226         {\r
227                 spot = FindTeamSpawnPoint (self.team_no);\r
228                 if ((spot != world))\r
229                 {\r
230                         return (spot);\r
231                 }\r
232         }\r
233         if (coop)\r
234         {\r
235                 lastspawn = find (lastspawn, classname, "info_player_coop");\r
236                 if ((lastspawn == world))\r
237                 {\r
238                         lastspawn = find (world, classname, "info_player_coop");\r
239                 }\r
240                 if ((lastspawn != world))\r
241                 {\r
242                         return (lastspawn);\r
243                 }\r
244         }\r
245         else\r
246         {\r
247                 if (deathmatch)\r
248                 {\r
249                         spot = find (lastspawn, classname, "info_player_deathmatch");\r
250                         if ((spot == world))\r
251                         {\r
252                                 spot = find (world, classname, "info_player_deathmatch");\r
253                         }\r
254                         attempts = 0;\r
255                         while (((spot != world) && (attempts < 100)))\r
256                         {\r
257                                 attempts = (attempts + 1);\r
258                                 at_spot = findradius (spot.origin, 40);\r
259                                 spot_found = 1;\r
260                                 while (at_spot)\r
261                                 {\r
262                                         if (((at_spot.classname == "player") && (at_spot.deadflag == 0)))\r
263                                         {\r
264                                                 spot_found = 0;\r
265                                         }\r
266                                         at_spot = at_spot.chain;\r
267                                 }\r
268                                 if ((spot_found || (attempts >= 10)))\r
269                                 {\r
270                                         lastspawn = spot;\r
271                                         return (spot);\r
272                                 }\r
273                                 spot = find (spot, classname, "info_player_deathmatch");\r
274                                 if ((spot == world))\r
275                                 {\r
276                                         spot = find (world, classname, "info_player_deathmatch");\r
277                                 }\r
278                         }\r
279                 }\r
280         }\r
281         if (serverflags)\r
282         {\r
283                 spot = find (world, classname, "info_player_start2");\r
284                 if (spot)\r
285                 {\r
286                         return (spot);\r
287                 }\r
288         }\r
289         spot = find (world, classname, "info_player_start");\r
290         if (!spot)\r
291         {\r
292                 spot = find (world, is_converted_goal, "yes");\r
293         }\r
294         if (!spot)\r
295         {\r
296                 spot = find (world, classname, "info_tfgoal");\r
297         }\r
298         if (!spot)\r
299         {\r
300                 error ("PutClientInServer: no info_player_start on level\n");\r
301         }\r
302         return (spot);\r
303 };\r
304 \r
305 /*entity SelectSpawnPoint (void)                // Old, non-tf code\r
306 {\r
307         local entity spot, thing;\r
308         local float pcount;\r
309 \r
310         spot = find (world, classname, "testplayerstart");\r
311         if (spot)\r
312                 return spot;\r
313 \r
314         spot = lastspawn;\r
315         while (1)\r
316         {\r
317                 spot = find(spot, classname, "info_player_deathmatch");\r
318                 if (spot != world)\r
319                 {\r
320                         if (spot == lastspawn)\r
321                                 return lastspawn;\r
322                         pcount = 0;\r
323                         thing = findradius(spot.origin, 70);\r
324                         while(thing)\r
325                         {\r
326                                 if (thing.classname == "player")\r
327                                         pcount = pcount + 1;\r
328                                 thing = thing.chain;\r
329                         }\r
330                         if (pcount == 0)\r
331                         {\r
332                                 lastspawn = spot;\r
333                                 return spot;\r
334                         }\r
335                 }\r
336         }\r
337 \r
338         spot = find (world, classname, "info_player_start");\r
339         if (!spot)\r
340                 error ("PutClientInServer: no info_player_start on level");\r
341 \r
342         return spot;\r
343 }*/\r
344 \r
345 /*\r
346 =============\r
347 CheckPlayerModel\r
348 \r
349 Checks if the argument string can be a valid playermodel.\r
350 Returns a valid one in doubt.\r
351 =============\r
352 */\r
353 string CheckPlayerModel(string playermodel) {\r
354         if( substring(playermodel,0,13) != "models/class/") playermodel = "models/class/scout.zym";\r
355 \r
356         /* Possible Fixme: Check if server can open the model?\r
357            This would kill custom models, however. */\r
358 \r
359         return playermodel;\r
360 }\r
361 \r
362 \r
363 /*\r
364 =============\r
365 PutClientInServer\r
366 \r
367 Called when a client spawns in the server\r
368 =============\r
369 */\r
370 void PutClientInServer (void)\r
371 {\r
372         entity  spot;\r
373         float oldcl;\r
374         if (self.team_no < 1)\r
375         {\r
376         self.movetype = 0;\r
377         self.solid = 0;\r
378         self.flags = FL_CLIENT;\r
379         self.takedamage = DAMAGE_AIM;\r
380         self.effects = 0;\r
381         self.health = cvar("g_balance_health_start");\r
382         self.max_health = cvar("g_balance_health_stable");\r
383         self.armorvalue = cvar("g_balance_armor_start");\r
384         self.max_armor = self.armorvalue;\r
385         self.damageforcescale = 2;\r
386         self.death_time = 0;\r
387         self.dead_time = 0;\r
388         self.dead_frame = 0;\r
389         self.die_frame = 0;\r
390         self.alpha = 0;\r
391         self.scale = 0;\r
392         self.fade_time = 0;\r
393         self.pain_frame = 0;\r
394         self.pain_finished = 0;\r
395         self.strength_finished = 0;\r
396         self.invincible_finished = 0;\r
397         //self.speed_finished = 0;\r
398         //self.slowmo_finished = 0;\r
399         // players have no think function\r
400         self.think = SUB_Null;\r
401         self.nextthink = 0;\r
402         self.speed = -1;\r
403         self.jump_pad = 0;\r
404         spot = SelectSpawnPoint();\r
405 //      setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z + 24));\r
406         setorigin (self, spot.origin + '-2 0 4' * (1 - self.mins_z + 24));\r
407         self.angles_y = self.angles_y + 180;\r
408         return;\r
409         }\r
410         if (self.playerclass < 1)\r
411         {\r
412                 stuffcmd(self, "set scmenu_directmenu ClassSelect; togglemenu\n");\r
413                 return;\r
414         }\r
415 \r
416         // fixme: are these the right teams & colors?\r
417         /*if(self.team == 5)            // Wazat -- I'm using TeamFortress_TeamSet for this now\r
418         {\r
419                 self.team_no = 1;\r
420         }\r
421         if(self.team == 14)\r
422         {\r
423                 self.team_no = 2;\r
424         }\r
425         if(self.team == 4)\r
426         {\r
427                 self.team_no = 3;\r
428         }\r
429         if(self.team == 13)\r
430         {\r
431                 self.team_no = 4;\r
432         }*/\r
433 \r
434         DoTFAliases ();\r
435 \r
436 //      spot = SelectSpawnPoint ();             // moved down\r
437         self.classname = "player";\r
438         self.movetype = MOVETYPE_WALK;\r
439         self.solid = SOLID_SLIDEBOX;\r
440         self.flags = FL_CLIENT;\r
441         self.takedamage = DAMAGE_AIM;\r
442         self.effects = 0;\r
443         self.health = cvar("g_balance_health_start");\r
444         self.max_health = cvar("g_balance_health_stable");\r
445         self.armorvalue = cvar("g_balance_armor_start");\r
446         self.max_armor = self.armorvalue;\r
447         self.damageforcescale = 2;\r
448         self.death_time = 0;\r
449         self.dead_time = 0;\r
450         self.dead_frame = 0;\r
451         self.die_frame = 0;\r
452         self.alpha = 0;\r
453         self.scale = 0;\r
454         self.fade_time = 0;\r
455         self.pain_frame = 0;\r
456         self.pain_finished = 0;\r
457         self.strength_finished = 0;\r
458         self.invincible_finished = 0;\r
459         //self.speed_finished = 0;\r
460         //self.slowmo_finished = 0;\r
461         // players have no think function\r
462         self.think = SUB_Null;\r
463         self.nextthink = 0;\r
464         self.speed = -1;\r
465         self.jump_pad = 0;\r
466         //self.wpn5 = 0; // not carrying an extra weapon\r
467         ResetExtraWeapon(); // not carrying an extra weapon\r
468 \r
469         DelayHealthRegen(self);\r
470         DelayArmorRegen(self);\r
471         DelayHealthRot(self);\r
472         DelayArmorRot(self);\r
473 \r
474 \r
475         self.special_active = 0;\r
476         self.special_time = 0;\r
477 \r
478         self.grenade_time = 0;\r
479 \r
480         if(self.onfire != world)\r
481                 remove(self.onfire);\r
482         self.onfire = world;\r
483         self.flame_heat = 0;\r
484         self.flame_heat_time = 0;\r
485 \r
486         self.poison_damage = 0;\r
487         self.poison_rate = 0;\r
488 \r
489         self.is_feigning = 0;\r
490         self.current_menu = 0;\r
491 \r
492         // if the player is supposed to change model (and hence class) on respawn, do it.\r
493         if(self.change_mdl_on_respawn != "")\r
494         {\r
495                 self.playermodel = self.change_mdl_on_respawn;\r
496                 //strunzone(self.change_mdl_on_respawn); // can't unzone or it'll crash later\r
497         }\r
498         // set the class.  If he changed classes while dead it will take effect now.\r
499         oldcl = self.class;\r
500         self.class = GetPlayerClass();\r
501         Do_TFClass_Conversion();\r
502         ChangeClass((oldcl != self.class), FALSE);\r
503 \r
504 \r
505 \r
506         self.deadflag = DEAD_NO;\r
507 \r
508         spot = SelectSpawnPoint ();             // maybe temp\r
509         self.angles = spot.angles;\r
510         self.fixangle = TRUE; // turn this way immediately\r
511         self.velocity = '0 0 0';\r
512         self.avelocity = '0 0 0';\r
513         self.punchangle = '0 0 0';\r
514         self.punchvector = '0 0 0';\r
515 \r
516         self.viewzoom = 0.6;\r
517 \r
518 \r
519         self.playermodel = CheckPlayerModel(self.playermodel);\r
520 \r
521         precache_model (self.playermodel);\r
522         setmodel (self, self.playermodel);\r
523         self.skin = stof(self.playerskin);\r
524         self.mdl = strzone(self.playermodel);\r
525 \r
526         self.crouch = FALSE;\r
527         self.view_ofs = PL_VIEW_OFS;\r
528         setsize (self, PL_MIN, PL_MAX);\r
529         setorigin (self, spot.origin + '0 0 1' * (1 - self.mins_z - 24));\r
530         // don't reset back to last position, even if new position is stuck in solid\r
531         self.oldorigin = self.origin;\r
532 \r
533 //      self.items = IT_LASER | IT_UZI| IT_SHOTGUN | IT_GRENADE_LAUNCHER | IT_ELECTRO | IT_CRYLINK | IT_NEX | IT_HAGAR | IT_ROCKET_LAUNCHER;\r
534 //      self.weapon = IT_UZI;\r
535 \r
536 \r
537         // fixme: move this to Become<Class> code\r
538 /*      self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;\r
539         //self.weapon = 1;\r
540         self.switchweapon = IT_WEP2;\r
541         self.ammo_shells = 50;\r
542         self.ammo_nails = 0;\r
543         self.ammo_rockets = 0;\r
544         self.ammo_cells = 0;*/\r
545 \r
546         if (cvar("g_fullbrightplayers") == 1)\r
547                 self.effects = EF_FULLBRIGHT;\r
548 \r
549         self.event_damage = PlayerDamage;\r
550 \r
551         self.statdraintime = time + 5;\r
552         self.button0 = self.button1 = self.button2 = self.button3 = 0;\r
553 \r
554         /*\r
555         W_UpdateWeapon();\r
556         W_UpdateAmmo();\r
557         */\r
558         CL_SpawnWeaponentity();\r
559         self.weaponentity.alpha = self.exteriorweaponentity.alpha = 0;\r
560         self.weaponentity.colormod = '0 0 0';\r
561         self.weaponentity.scale = 0;\r
562 \r
563         //stuffcmd(self, "chase_active 0");\r
564 }\r
565 \r
566 /*\r
567 =============\r
568 SetNewParms\r
569 =============\r
570 */\r
571 void SetNewParms (void)\r
572 {\r
573 \r
574 }\r
575 \r
576 /*\r
577 =============\r
578 SetChangeParms\r
579 =============\r
580 */\r
581 void SetChangeParms (void)\r
582 {\r
583 \r
584 }\r
585 \r
586 /*\r
587 =============\r
588 ClientKill\r
589 \r
590 Called when a client types 'kill' in the console\r
591 =============\r
592 */\r
593 void ClientKill (void)\r
594 {\r
595         Damage(self, self, self, 100000, DEATH_KILL, self.origin, '0 0 0');\r
596 }\r
597 \r
598 /*\r
599 =============\r
600 ClientConnect\r
601 \r
602 Called when a client connects to the server\r
603 =============\r
604 */\r
605 void ClientConnect (void)\r
606 {\r
607         //ClientInRankings();\r
608         bprint ("^4",self.netname);\r
609         bprint (" connected\n");\r
610         stuffcmd(self, strcat("exec maps/", mapname, ".cfg\n"));\r
611         // send prediction settings to the client\r
612         stuffcmd(self, strcat("cl_movement_maxspeed ", ftos(cvar("sv_maxspeed")), "\n"));\r
613         stuffcmd(self, strcat("cl_movement_maxairspeed ", ftos(cvar("sv_maxairspeed")), "\n"));\r
614         stuffcmd(self, strcat("cl_movement_accelerate ", ftos(cvar("sv_accelerate")), "\n"));\r
615         stuffcmd(self, strcat("cl_movement_friction ", ftos(cvar("sv_friction")), "\n"));\r
616         stuffcmd(self, strcat("cl_movement_stopspeed ", ftos(cvar("sv_stopspeed")), "\n"));\r
617         stuffcmd(self, strcat("cl_movement_jumpvelocity ", ftos(cvar("g_balance_jumpheight")), "\n"));\r
618         stuffcmd(self, strcat("cl_movement_stepheight ", ftos(cvar("sv_stepheight")), "\n"));\r
619         stuffcmd(self, strcat("cl_movement_edgefriction 0\n"));\r
620                         // TEMP FOR TESTING PURPOSES!\r
621         //teamplay = 21?TeamFortress;\r
622         DecodeLevelParms ();\r
623         //cvar_set ("teamplay", "21?TeamFortress");\r
624         //      teamplay = cvar ("teamplay");\r
625 \r
626 /*      joinorder = joinorder + 1;                      // old temp autoteam, but now we have a menu instead :P\r
627         if (joinorder == 1 || joinorder == 3 || joinorder == 5 || joinorder == 7)\r
628                 TeamFortress_TeamSet (1);\r
629         else {\r
630                 TeamFortress_TeamSet (2);\r
631         }*/\r
632 }\r
633 \r
634 /*\r
635 =============\r
636 ClientDisconnect\r
637 \r
638 Called when a client disconnects from the server\r
639 =============\r
640 */\r
641 .entity chatbubbleentity;\r
642 void ClientDisconnect (void)\r
643 {\r
644         //ClientDisconnected();\r
645         self.has_disconnected = 1;\r
646         bprint ("^4",self.netname);\r
647         bprint (" disconnected\n");\r
648 \r
649         if (self.chatbubbleentity)\r
650         {\r
651                 remove (self.chatbubbleentity);\r
652                 self.chatbubbleentity = world;\r
653         }\r
654         \r
655         if (self.teambubble_friendly)\r
656         {\r
657                 remove (self.teambubble_friendly);\r
658                 self.teambubble_friendly = world;\r
659         }\r
660         if (self.teambubble_needhealth)\r
661         {\r
662                 remove (self.teambubble_needhealth);\r
663                 self.teambubble_needhealth = world;\r
664         }\r
665 }\r
666 \r
667 .entity chatbubbleentity;\r
668 .float buttonchat;\r
669 void() ChatBubbleThink =\r
670 {\r
671         self.nextthink = time;\r
672         if (!self.owner.modelindex || self.owner.chatbubbleentity != self)\r
673         {\r
674                 remove(self);\r
675                 return;\r
676         }\r
677         setorigin(self, self.owner.origin + '0 0 15' + self.owner.maxs_z * '0 0 1');\r
678         if (self.owner.buttonchat)\r
679                 self.effects = 0;\r
680         else\r
681                 self.effects = EF_NODRAW;\r
682 };\r
683 \r
684 void() UpdateChatBubble =\r
685 {\r
686         if (!self.modelindex)\r
687                 return;\r
688         // spawn a chatbubble entity if needed\r
689         if (!self.chatbubbleentity)\r
690         {\r
691                 self.chatbubbleentity = spawn();\r
692                 self.chatbubbleentity.owner = self;\r
693                 self.chatbubbleentity.think = ChatBubbleThink;\r
694                 self.chatbubbleentity.nextthink = time;\r
695                 setmodel(self.chatbubbleentity, "models/misc/chatbubble.spr");\r
696                 setorigin(self.chatbubbleentity, self.origin + '0 0 15' + self.maxs_z * '0 0 1');\r
697                 self.chatbubbleentity.effects = EF_NODRAW;\r
698         }\r
699 }\r
700 \r
701 // LordHavoc: this hack will be removed when proper _pants/_shirt layers are\r
702 // added to the model skins\r
703 void() UpdateColorModHack =\r
704 {\r
705         local float c;\r
706         c = self.clientcolors & 15;\r
707         // LordHavoc: only bothering to support white, green, red, yellow, blue\r
708              if (teamplay == 0) self.colormod = '0 0 0';\r
709         else if (c ==  0) self.colormod = '1.00 1.00 1.00';\r
710         else if (c ==  3) self.colormod = '0.10 1.73 0.10';\r
711         else if (c ==  4) self.colormod = '1.73 0.10 0.10';\r
712         else if (c == 12) self.colormod = '1.22 1.22 0.10';\r
713         else if (c == 13) self.colormod = '0.10 0.10 1.73';\r
714         else self.colormod = '1 1 1';\r
715 };\r
716 \r
717 /*\r
718 =============\r
719 PlayerJump\r
720 \r
721 When you press the jump key\r
722 =============\r
723 */\r
724 void PlayerJump (void)\r
725 {\r
726         if (self.waterlevel >= 2)\r
727         {\r
728                 if (self.watertype == CONTENT_WATER)\r
729                         self.velocity_z = 200;\r
730                 else if (self.watertype == CONTENT_SLIME)\r
731                         self.velocity_z = 80;\r
732                 else\r
733                         self.velocity_z = 50;\r
734 \r
735                 return;\r
736         }\r
737         if(self.jump_pad)\r
738                 return;\r
739 \r
740 //      self.jump_pad = 0;\r
741         CapPlayerVelocity(self, self.speed);\r
742 \r
743 \r
744         if (!(self.flags & FL_ONGROUND))\r
745                 return;\r
746 \r
747         if (!(self.flags & FL_JUMPRELEASED))\r
748                 return;\r
749 \r
750         self.velocity_z = self.velocity_z + cvar("g_balance_jumpheight");\r
751 \r
752         self.flags = self.flags - FL_ONGROUND;\r
753         self.flags = self.flags - FL_JUMPRELEASED;\r
754 }\r
755 \r
756 .float watersound_finished;\r
757 void() WaterMove =\r
758 {\r
759         if (self.movetype == MOVETYPE_NOCLIP)\r
760                 return;\r
761         if (self.health < 0)\r
762                 return;\r
763 \r
764         if (self.waterlevel != 3)\r
765         {\r
766                 self.air_finished = time + 12;\r
767                 self.dmg = 2;\r
768         }\r
769         else if (self.air_finished < time)\r
770         {       // drown!\r
771                 if (self.pain_finished < time)\r
772                 {\r
773                         Damage (self, world, world, 5, DEATH_DROWN, self.origin, '0 0 0');\r
774                         self.pain_finished = time + 0.5;\r
775                 }\r
776         }\r
777 \r
778         if (!self.waterlevel)\r
779         {\r
780                 if (self.flags & FL_INWATER)\r
781                 {\r
782                         // play leave water sound\r
783                         self.flags = self.flags - FL_INWATER;\r
784                 }\r
785                 return;\r
786         }\r
787 \r
788         if (self.watersound_finished < time)\r
789         {\r
790                 self.watersound_finished = time + 0.5;\r
791                 if (self.watertype == CONTENT_LAVA)\r
792                         sound (self, CHAN_BODY, "player/lava.wav", 1, ATTN_NORM);\r
793                 if (self.watertype == CONTENT_SLIME)\r
794                         sound (self, CHAN_BODY, "player/slime.wav", 1, ATTN_NORM);\r
795                 //if (self.watertype == CONTENT_WATER)\r
796                 //      sound (self, CHAN_BODY, "player/water.wav", 1, ATTN_NORM);\r
797         }\r
798 \r
799         if (self.watertype == CONTENT_LAVA)\r
800         {       // do damage\r
801 \r
802                 // lava sets me to the maximum heat level, so I'll catch fire easily\r
803                 self.flame_heat = cvar("g_balance_maxheat");\r
804 \r
805                 if (self.dmgtime < time)\r
806                 {\r
807                         self.dmgtime = time + 0.1;\r
808                         Damage (self, world, world, 3 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');\r
809                 }\r
810         }\r
811         else if (self.watertype == CONTENT_SLIME)\r
812         {       // do damage\r
813 \r
814                 // cool me off\r
815                 self.flame_heat = 0;\r
816 \r
817                 if (self.dmgtime < time)\r
818                 {\r
819                         self.dmgtime = time + 0.1;\r
820                         Damage (self, world, world, 1 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');\r
821                 }\r
822         }\r
823         else if (self.watertype == CONTENT_WATER)\r
824         {\r
825                 // cool me off\r
826                 self.flame_heat = 0;\r
827         }\r
828 \r
829         if ( !(self.flags & FL_INWATER) )\r
830         {\r
831 \r
832                 //if (self.watertype == CONTENT_LAVA)\r
833                 //      sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM);\r
834                 //if (self.watertype == CONTENT_WATER)\r
835                 //      sound (self, CHAN_BODY, "player/inh2o.wav", 1, ATTN_NORM);\r
836                 //if (self.watertype == CONTENT_SLIME)\r
837                 //      sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM);\r
838 \r
839                 self.flags = self.flags + FL_INWATER;\r
840                 self.dmgtime = 0;\r
841         }\r
842 };\r
843 \r
844 void() CheckWaterJump =\r
845 {\r
846         local vector start, end;\r
847 \r
848 // check for a jump-out-of-water\r
849         makevectors (self.angles);\r
850         start = self.origin;\r
851         start_z = start_z + 8;\r
852         v_forward_z = 0;\r
853         normalize(v_forward);\r
854         end = start + v_forward*24;\r
855         traceline (start, end, TRUE, self);\r
856         if (trace_fraction < 1)\r
857         {       // solid at waist\r
858                 start_z = start_z + self.maxs_z - 8;\r
859                 end = start + v_forward*24;\r
860                 self.movedir = trace_plane_normal * -50;\r
861                 traceline (start, end, TRUE, self);\r
862                 if (trace_fraction == 1)\r
863                 {       // open at eye level\r
864                         self.flags = self.flags | FL_WATERJUMP;\r
865                         self.velocity_z = 225;\r
866                         self.flags = self.flags - (self.flags & FL_JUMPRELEASED);\r
867                         self.teleport_time = time + 2;  // safety net\r
868                         return;\r
869                 }\r
870         }\r
871 };\r
872 \r
873 \r
874 void respawn(void)\r
875 {\r
876         CopyBody(1);\r
877         PutClientInServer();\r
878 }\r
879 \r
880 void player_powerups (void)\r
881 {\r
882         self.effects = self.effects - (self.effects & (EF_RED | EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT));\r
883         if (self.items & IT_STRENGTH)\r
884         {\r
885                 self.effects = self.effects | (EF_BLUE | EF_ADDITIVE | EF_FULLBRIGHT);\r
886                 if (time > self.strength_finished)\r
887                 {\r
888                         self.items = self.items - (self.items & IT_STRENGTH);\r
889                         sprint(self, "^3Strength has worn off\n");\r
890                 }\r
891         }\r
892         else\r
893         {\r
894                 if (time < self.strength_finished)\r
895                 {\r
896                         self.items = self.items | IT_STRENGTH;\r
897                         sprint(self, "^3Strength infuses your weapons with devestating power\n");\r
898                 }\r
899         }\r
900         if (self.items & IT_INVINCIBLE)\r
901         {\r
902                 self.effects = self.effects | (EF_RED | EF_ADDITIVE | EF_FULLBRIGHT);\r
903                 if (time > self.invincible_finished)\r
904                 {\r
905                         self.items = self.items - (self.items & IT_INVINCIBLE);\r
906                         sprint(self, "^3Shield has worn off\n");\r
907                 }\r
908         }\r
909         else\r
910         {\r
911                 if (time < self.invincible_finished)\r
912                 {\r
913                         self.items = self.items | IT_INVINCIBLE;\r
914                         sprint(self, "^3Shield surrounds you\n");\r
915                 }\r
916         }\r
917 }\r
918 \r
919 void player_regen_health (float maxh, float regen_rate_mod)\r
920 {\r
921         if (self.health < maxh && time > self.health_regen_delay)\r
922                 self.health = bound(0, self.health + regen_rate_mod*(maxh- self.health) * cvar("g_balance_health_regen") * frametime, 1000);\r
923 }\r
924 void player_rot_health (float maxh, float rot_rate_mod)\r
925 {\r
926         if (self.health > maxh && time > self.health_rot_delay)\r
927                 self.health = bound(0, self.health + rot_rate_mod*(maxh - self.health) * cvar("g_balance_health_rot") * frametime, 1000);\r
928 }\r
929 void player_regen_armor (float maxa, float regen_rate_mod)\r
930 {\r
931         if (self.armorvalue < maxa && time > self.armor_regen_delay)\r
932                 self.armorvalue = bound(0, self.armorvalue + regen_rate_mod*(maxa - self.armorvalue) * cvar("g_balance_armor_regen") * frametime, 1000);\r
933 }\r
934 void player_rot_armor (float maxa, float regen_rot_mod)\r
935 {\r
936         if (self.armorvalue > maxa && time > self.armor_rot_delay)\r
937                 self.armorvalue = bound(0, self.armorvalue + regen_rot_mod*(maxa - self.armorvalue) * cvar("g_balance_armor_rot") * frametime, 1000);\r
938 }\r
939 \r
940 void player_clearpoison(entity targ)\r
941 {\r
942         targ.poison_damage = targ.poison_rate = 0;\r
943 }\r
944 \r
945 void DelayHealthRegen(entity e) {       e.health_regen_delay = time + cvar("g_balance_regen_wait");}\r
946 void DelayHealthRot(entity e)   {       e.health_rot_delay = time + cvar("g_balance_rot_wait");}\r
947 void DelayArmorRegen(entity e)  {       e.armor_regen_delay = time + cvar("g_balance_regen_wait");}\r
948 void DelayArmorRot(entity e)    {       e.armor_rot_delay = time + cvar("g_balance_rot_wait");}\r
949 \r
950 \r
951 void player_takepoison()\r
952 {\r
953         float oldhealth, take;\r
954         if(self.health <= 5)\r
955         {\r
956                 player_clearpoison(self);\r
957                 return;\r
958         }\r
959         oldhealth = self.health;\r
960 \r
961         take = bound(0, self.poison_rate * frametime, self.health - 5);\r
962         if(take <= 0)\r
963         {\r
964                 player_clearpoison(self);\r
965                 return;\r
966         }\r
967 \r
968         DelayHealthRegen(self);\r
969         self.health = self.health - take;\r
970         self.poison_damage = self.poison_damage - take;\r
971 \r
972         if(self.health <= 5 || self.poison_damage <= 0)\r
973         {\r
974                 player_clearpoison(self);\r
975                 return;\r
976         }\r
977 }\r
978 \r
979 // cool off so you're not so vulnerable to fire\r
980 void player_cooloff ()\r
981 {\r
982         if(self.flame_heat_time > time)//heat up\r
983                 self.flame_heat = bound(0, self.flame_heat + self.flame_heat * cvar("g_balance_heatup_rate")  * frametime, cvar("g_balance_maxheat"));\r
984         else//cool off\r
985                 self.flame_heat = bound(0, self.flame_heat - self.flame_heat * cvar("g_balance_cooloff_rate") * frametime, cvar("g_balance_maxheat"));\r
986 }\r
987 \r
988 void player_regen (void)\r
989 {\r
990         local float maxh;\r
991         local float maxa;\r
992         maxh = self.max_health;//cvar("g_balance_health_stable");\r
993         maxa = self.max_armor;//cvar("g_balance_armor_stable");\r
994 \r
995         if(self.poison_damage)\r
996         {\r
997                 player_takepoison();\r
998                 return;\r
999         }\r
1000 \r
1001         if(self.class == CLASS_SPY)\r
1002         {// don't let spy regenerate if cloaked, but do allow rot if above max\r
1003                 if(self.special_active)\r
1004                 {\r
1005                         //if(self.health > maxh)\r
1006                                 player_rot_health(maxh, 1.0);\r
1007                         //if(self.armorvalue > maxa)\r
1008                                 player_rot_armor(maxa, 1.0);\r
1009                 }\r
1010                 else\r
1011                 {\r
1012                         player_regen_health(maxh, 0.1); // spies regenerate slowly, and mostly rely on health packs\r
1013                         player_regen_armor(maxa, 1.0);\r
1014                         player_rot_health(maxh, 1.0);\r
1015                         player_rot_armor(maxa, 1.0);\r
1016                 }\r
1017         }\r
1018         else\r
1019         {\r
1020                 player_regen_health(maxh, 1.0);\r
1021                 player_regen_armor(maxa, 1.0);\r
1022                 player_rot_health(maxh, 1.0);\r
1023                 player_rot_armor(maxa, 1.0);\r
1024         }\r
1025 \r
1026         player_cooloff();\r
1027 }\r
1028 \r
1029 /*\r
1030 =============\r
1031 PlayerPreThink\r
1032 \r
1033 Called every frame for each client before the physics are run\r
1034 =============\r
1035 */\r
1036 .float attack_finished;\r
1037 void PlayerPreThink (void)\r
1038 {\r
1039         local vector m1, m2;\r
1040 \r
1041         CheckRules_Player();\r
1042 \r
1043         if (intermission_running)\r
1044         {\r
1045                 IntermissionThink ();   // otherwise a button could be missed between\r
1046                 return;                                 // the think tics\r
1047         }\r
1048 \r
1049         if (self.deadflag != DEAD_NO)\r
1050         {\r
1051                 player_anim();\r
1052                 weapon_freeze();\r
1053                 if (self.deadflag == DEAD_DYING)\r
1054                 {\r
1055                         if (time > self.dead_time)\r
1056                                 self.deadflag = DEAD_DEAD;\r
1057                 }\r
1058                 else if (self.deadflag == DEAD_DEAD)\r
1059                 {\r
1060                         if (!self.button0 && !self.button2 && !self.button3)\r
1061                                 self.deadflag = DEAD_RESPAWNABLE;\r
1062                 }\r
1063                 else if (self.deadflag == DEAD_RESPAWNABLE)\r
1064                 {\r
1065                         if (self.button0 || self.button2 || self.button3  || self.button4)\r
1066                                 respawn();\r
1067                 }\r
1068                 return;\r
1069         }\r
1070 \r
1071         if (self.button5)\r
1072         {\r
1073                 if (!self.crouch)\r
1074                 {\r
1075                         self.crouch = TRUE;\r
1076                         self.view_ofs = PL_CROUCH_VIEW_OFS;\r
1077                         setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX);\r
1078                 }\r
1079         }\r
1080         else\r
1081         {\r
1082                 if (self.crouch)\r
1083                 {\r
1084                         tracebox(self.origin, PL_MIN, PL_MAX, self.origin, FALSE, self);\r
1085                         if (!trace_startsolid)\r
1086                         {\r
1087                                 self.crouch = FALSE;\r
1088                                 self.view_ofs = PL_VIEW_OFS;\r
1089                                 setsize (self, PL_MIN, PL_MAX);\r
1090                         }\r
1091                 }\r
1092         }\r
1093 \r
1094         if (self.playermodel != self.mdl)\r
1095         {\r
1096                 //bprint("playermodel changed\n");\r
1097                 self.playermodel = CheckPlayerModel(self.playermodel);\r
1098                 if(CheckForClassChange()) // check if we'll allow it\r
1099                         return; // if there's a return value, drop what you're doing and let the player respawn\r
1100 \r
1101                 if(self.playermodel != self.mdl) // if change has been allowed\r
1102                 {\r
1103                         m1 = self.mins;\r
1104                         m2 = self.maxs;\r
1105                         precache_model (self.playermodel);\r
1106                         if(self.model != "")\r
1107                         {\r
1108                                 setmodel (self, self.playermodel);\r
1109                                 setsize (self, m1, m2);\r
1110                         }\r
1111                         self.mdl = strzone(self.playermodel);\r
1112                 }\r
1113         }\r
1114 \r
1115         ClassPreThink();\r
1116 \r
1117         if (self.skin != stof(self.playerskin))\r
1118                 self.skin = stof(self.playerskin);\r
1119 \r
1120         if(self.class == CLASS_SCOUT)\r
1121                 GrapplingHookFrame();\r
1122 \r
1123         W_WeaponFrame();\r
1124 \r
1125         if (self.button4 || (self.weapon == WEP_NEX && self.button3))\r
1126         {\r
1127                 if (self.viewzoom > 0.4)\r
1128                         self.viewzoom = max (0.4, self.viewzoom - frametime * 2);\r
1129         }\r
1130         else if (self.viewzoom < 1.0)\r
1131                 self.viewzoom = min (1.0, self.viewzoom + frametime);\r
1132 \r
1133 \r
1134         if (self.button2)\r
1135                 PlayerJump ();\r
1136         else\r
1137                 self.flags = self.flags | FL_JUMPRELEASED;\r
1138 \r
1139 \r
1140         player_powerups();\r
1141         player_regen();\r
1142         player_anim();\r
1143 \r
1144         //self.angles_y=self.v_angle_y + 90;   // temp\r
1145 \r
1146         WaterMove ();\r
1147         if (self.waterlevel == 2)\r
1148                 CheckWaterJump ();\r
1149 \r
1150         //if (TetrisPreFrame()) return;\r
1151 \r
1152         PlayerLasergatePreThink();\r
1153 }\r
1154 \r
1155 /*\r
1156 =============\r
1157 PlayerPostThink\r
1158 \r
1159 Called every frame for each client after the physics are run\r
1160 =============\r
1161 */\r
1162 void PlayerPostThink (void)\r
1163 {\r
1164         float soundrandom;\r
1165         CheckRules_Player();\r
1166         UpdateChatBubble();\r
1167         UpdateColorModHack();\r
1168         UpdateTeamBubble();\r
1169         if (self.deadflag == DEAD_NO)\r
1170         if (self.impulse)\r
1171                 ImpulseCommands ();\r
1172         if (intermission_running)\r
1173                 return;         // intermission or finale\r
1174 \r
1175         // VorteX: landing on floor, landing damage etc.\r
1176         // LordHavoc: removed 'big fall' death code that VorteX added\r
1177         if (self.flags & FL_ONGROUND || (self.waterlevel >= 2 && self.velocity_z <= 0))\r
1178                         self.jump_pad = 0;\r
1179 \r
1180         if (self.flags & FL_ONGROUND)\r
1181         {\r
1182                 CapPlayerVelocity(self, self.speed);\r
1183 \r
1184                 if (self.jump_flag < -100 && !self.watertype == CONTENT_WATER) // HitGround\r
1185                 {\r
1186                         soundrandom = random() * 4;\r
1187 \r
1188                         self.air_time = time;           //temp BH var\r
1189 \r
1190                         if (soundrandom < 1)\r
1191                                 sound (self, CHAN_BODY, "misc/hitground1.wav", 1, ATTN_NORM);\r
1192                         else if (soundrandom < 2)\r
1193                                 sound (self, CHAN_BODY, "misc/hitground2.wav", 1, ATTN_NORM);\r
1194                         else if (soundrandom < 3)\r
1195                                 sound (self, CHAN_BODY, "misc/hitground3.wav", 1, ATTN_NORM);\r
1196                         else if (soundrandom < 4)\r
1197                                 sound (self, CHAN_BODY, "misc/hitground4.wav", 1, ATTN_NORM);\r
1198                         if (self.jump_flag < -650) // landing damage\r
1199                         {\r
1200                                 local float dm;\r
1201                                 dm = bound(0, 0.1*(fabs(self.jump_flag) - 600), 5);\r
1202                                 Damage (self, world, world, dm, DEATH_FALL, self.origin, '0 0 0');\r
1203                         }\r
1204                         self.jump_flag = 0;\r
1205                 }\r
1206         }\r
1207         else\r
1208                 self.jump_flag = self.velocity_z;\r
1209 \r
1210         ClassPostThink();\r
1211 \r
1212         //if (TetrisPostFrame()) return;\r
1213         PlayerLasergatePostThink();\r
1214 }\r
1215 \r
1216 // Parse team join, class etc.\r
1217 void SV_ParseClientCommand (string s)\r
1218 {\r
1219         local float args;\r
1220 //      local float h;\r
1221         local string c;\r
1222         local string d;\r
1223         local string f;\r
1224         local string g;\r
1225         local string i;\r
1226         args = tokenize(s);\r
1227         c = argv(0);\r
1228         d = argv(1);\r
1229         f = argv(2);\r
1230         g = argv(3);\r
1231         i = argv(4);\r
1232 \r
1233         if (c == "join")\r
1234     {\r
1235                 return;\r
1236         }\r
1237         if (c == "changeclass")\r
1238         {\r
1239                 stuffcmd(self, "set scmenu_directmenu ClassSelect; togglemenu\n");\r
1240                 return;\r
1241         }\r
1242         if (c == "selectteam")\r
1243     {\r
1244                 if (self.team_no > 0)\r
1245                 {\r
1246                         sprint(self, "You are already on a team!\n");\r
1247                         return;\r
1248                 }\r
1249                 if (d == "auto" || d == "5")\r
1250                 {\r
1251                         TeamFortress_TeamPutPlayerInTeam();\r
1252                         PutClientInServer ();\r
1253                 }\r
1254                 if (d == "blue" || d == "1")\r
1255                 {\r
1256                         TeamFortress_TeamSet (1);\r
1257                         PutClientInServer ();\r
1258                 }\r
1259                 if (d == "red" || d == "2")\r
1260                 {\r
1261                         TeamFortress_TeamSet (2);\r
1262                         PutClientInServer ();\r
1263                 }\r
1264                 if (d == "yellow" || d == "3")\r
1265                 {\r
1266                         TeamFortress_TeamSet (3);\r
1267                         PutClientInServer ();\r
1268                 }\r
1269                 if (d == "green" || d == "pink" || d == "4")            // Morphed set it to Pink in the menus. I think\r
1270                 {                                                                                                       // we should make it white instead.\r
1271                         TeamFortress_TeamSet (4);\r
1272                         PutClientInServer ();\r
1273                 }\r
1274                 return;\r
1275         }\r
1276         if (c == "selectclass")\r
1277     {\r
1278                 if (self.team_no < 1)\r
1279                 {\r
1280                         sprint(self, "You must select a team to join first!\n");\r
1281                         return;\r
1282                 }\r
1283                 CenterPrint(self, "");          // clear any centerprint messages\r
1284                 if (self.playerclass > 0)               // if a class is already chosen\r
1285                 {\r
1286                         self.tfstate = self.tfstate - (self.tfstate & 8);\r
1287                         local string cname;\r
1288                         if (d == ftos(TF_CLASS_SCOUT))\r
1289                         {\r
1290                                 cname = "scout";\r
1291                         }\r
1292                         if (d == ftos(TF_CLASS_SOLDIER))\r
1293                         {\r
1294                                 cname = "soldier";\r
1295                         }\r
1296                         if (d == ftos(TF_CLASS_MEDIC))\r
1297                         {\r
1298                                 cname = "medic";\r
1299                         }\r
1300                         if (d == ftos(TF_CLASS_PYRO))\r
1301                         {\r
1302                                 cname = "pyro";\r
1303                         }\r
1304                         if (d == ftos(TF_CLASS_ENGINEER))\r
1305                         {\r
1306                                 cname = "engineer";\r
1307                         }\r
1308                         if (d == ftos(TF_CLASS_SPY))\r
1309                         {\r
1310                                 cname = "spy";\r
1311                         }\r
1312                         if (d == ftos(TF_CLASS_RANDOM))\r
1313                         {\r
1314                                 self.tfstate = self.tfstate | 8;\r
1315                                 sprint(self, "You will respawn as a random class.\n");\r
1316                         }\r
1317                         if (cname != "")\r
1318                         {\r
1319 //                              stuffcmd(self, "_cl_playermodel \"models/class/");\r
1320 //                              stuffcmd(self, cname);\r
1321 //                              stuffcmd(self, "_mechanical.zym\"\n");\r
1322                                 if (cname == "engineer")\r
1323                                 {\r
1324                                         self.playermodel = strcat("models/class/",cname,"_other.zym");\r
1325                                 }\r
1326                                 else\r
1327                                 {\r
1328                                         self.playermodel = strcat("models/class/",cname,"_mechanical.zym");\r
1329                                 }\r
1330                                 if (self.is_dead == 1)          // if player is dead, can change class\r
1331                                         CheckForClassChange();\r
1332                         }\r
1333                 }\r
1334                 else                    // if no class is chosen\r
1335                 {\r
1336                         if (d == ftos(TF_CLASS_SCOUT))\r
1337                         {\r
1338                                 self.impulse = TF_CLASS_SCOUT;\r
1339                         }\r
1340                         if (d == ftos(TF_CLASS_SOLDIER))\r
1341                         {\r
1342                                 self.impulse = TF_CLASS_SOLDIER;\r
1343                         }\r
1344                         if (d == ftos(TF_CLASS_MEDIC))\r
1345                         {\r
1346                                 self.impulse = TF_CLASS_MEDIC;\r
1347                         }\r
1348                         if (d == ftos(TF_CLASS_PYRO))\r
1349                         {\r
1350                                 self.impulse = TF_CLASS_PYRO;\r
1351                         }\r
1352                         if (d == ftos(TF_CLASS_ENGINEER))\r
1353                         {\r
1354                                 self.impulse = TF_CLASS_ENGINEER;\r
1355                         }\r
1356                         if (d == ftos(TF_CLASS_SPY))\r
1357                         {\r
1358                                 self.impulse = TF_CLASS_SPY;\r
1359                         }\r
1360                         if (d == ftos(TF_CLASS_RANDOM))\r
1361                         {\r
1362                                 self.impulse = TF_CLASS_RANDOM;\r
1363                         }\r
1364                         TeamFortress_ChangeClass();\r
1365                 }\r
1366                 return;\r
1367         }\r
1368         else if (c == "check_val")\r
1369         {\r
1370                 if (d == "r_bloom")\r
1371                 {\r
1372                         if (f == "1")\r
1373                                 self.uses_bloom = 1;\r
1374                         else\r
1375                                 self.uses_bloom = 0;\r
1376                 }\r
1377         }\r
1378         else\r
1379         {\r
1380                 clientcommand(self, s);\r
1381         }\r
1382 };