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