]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/TeamNexuiz/game/gamec/tffunctions.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / attic / TeamNexuiz / game / gamec / tffunctions.c
1 // TF fucntions\r
2 .float goal_no;         // goal number - pair with defs file\r
3 .float goal_result; // pair with defs\r
4 .float else_goal;       // not sure\r
5 .float goal_result;\r
6 .float is_removed;      // entity is removed?\r
7 float (entity _p_10934, entity _p_10935) Activated;\r
8 float (float tno) TeamFortress_TeamGetScore;\r
9 float (float tno) TeamFortress_TeamGetColor;\r
10 void (entity _p_10980, entity _p_10981, float _p_10982) DoResults; //< - score increase thing\r
11 void (entity Item, entity AP, float method) tfgoalitem_RemoveFromPlayer;\r
12 void(entity client, string s) CenterPrint = #73;\r
13 \r
14 // misc stuff (move to TFDefs file)\r
15 entity newmis;          // This is what tf uses for spawning entities\r
16 .float has_disconnected;        //has the player disconnected?\r
17 .float no_grenades_1;\r
18 .float no_grenades_2;\r
19 //.float no_grenades_3;         //player has no gren3? Thought we should use this for the impulse 30/31 class specials\r
20 .float pausetime;       // not sure\r
21 float team1lives;\r
22 float team2lives;\r
23 float team3lives;\r
24 float team4lives;\r
25 float team1maxplayers;\r
26 float team2maxplayers;\r
27 float team3maxplayers;\r
28 float team4maxplayers;\r
29 /*float team1advantage;                 // might implement this later -- this is used in the function that\r
30 float team2advantage;                   //// displays messages like: "Team blah has an advantage of X players"\r
31 float team3advantage;\r
32 float team4advantage;*/\r
33 \r
34 // stuff that still needs a function\r
35 float number_of_teams; // Number of teams == IMPORTANT\r
36 \r
37 // Color/Teamchange cheat detection (using DP functions instead of tf)\r
38 void (entity ent, float colors) setcolor;\r
39 \r
40 // The following controls the team color of the player in-game, since DP can control color change\r
41 // Note: If anyone ever wants to add a spy color disguise fucntion, here's the places\r
42 void SV_ChangeTeam(float color)\r
43 {\r
44         local float team_color;\r
45 \r
46         if (self.team_no == 1 && color != 13)\r
47         {\r
48 //              setcolor(self, 13);             // used to use this for teams, ignore.\r
49                 team_color = TeamFortress_TeamGetColor(1) - 1;\r
50         }\r
51         if (self.team_no == 2 && color != 4)\r
52         {\r
53 //              setcolor(self, 4,4);\r
54                 team_color = TeamFortress_TeamGetColor(2) - 1;\r
55         }\r
56         if (self.team_no == 3 && color != 12)\r
57         {\r
58 //              setcolor(self, 12,12);\r
59                 team_color = TeamFortress_TeamGetColor(3) - 1;\r
60         }\r
61         if (self.team_no == 4 && color != 11)\r
62         {\r
63 //              setcolor(self, 11,11);\r
64                 team_color = TeamFortress_TeamGetColor(4) - 1;\r
65         }\r
66         setcolor(self, 16*team_color + team_color);\r
67 };\r
68 \r
69 \r
70 void(entity targ, entity attacker) ClientObituary =\r
71 {\r
72         ClientObituary(targ,attacker);          // TEMP -- SOON I WILL ADD REAL DEATH MESSAGES\r
73 };\r
74 \r
75 void () DoTFAliases =\r
76 {\r
77                 TeamFortress_Alias("primeone", 150, TF_FLARE_LIT);\r
78                 TeamFortress_Alias("primetwo", 151, TF_FLARE_LIT);\r
79                 TeamFortress_Alias("throwgren", 152, TF_FLARE_LIT);\r
80                 TeamFortress_Alias("+gren1", 150, TF_FLARE_LIT);\r
81                 TeamFortress_Alias("+gren2", 151, TF_FLARE_LIT);\r
82                 TeamFortress_Alias("-gren1", 152, TF_FLARE_LIT);\r
83                 TeamFortress_Alias("-gren2", 152, TF_FLARE_LIT);\r
84                 TeamFortress_Alias("dropflag", DROP_FLAG_IMPULSE, TF_FLARE_LIT);\r
85                 TeamFortress_Alias("reload", RELOAD_IMPULSE, TF_FLARE_LIT);\r
86 };\r
87 \r
88 void (entity tempent) dremove =\r
89 {\r
90         if ((tempent == world))\r
91         {\r
92                 dprint ("***BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG***\n");\r
93                 dprint ("WORLD has nearly been removed. Don't worry\n");\r
94                 dprint ("***BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG***\n");\r
95                 return;\r
96         }\r
97         if ((tempent.is_removed == 1.000000))\r
98         {\r
99                 return;\r
100         }\r
101         tempent.is_removed = 1.000000;\r
102         remove (tempent);\r
103 };\r
104 \r
105 entity (float gno) Findgoal =\r
106 {\r
107         local entity tg;\r
108         local string st;\r
109 \r
110         tg = find (world, classname, "info_tfgoal");\r
111         while (tg)\r
112         {\r
113                 if ((tg.goal_no == gno))\r
114                 {\r
115                         return (tg);\r
116                 }\r
117                 tg = find (tg, classname, "info_tfgoal");\r
118         }\r
119         dprint ("Could not find a goal with a goal_no of ");\r
120         st = ftos (gno);\r
121         dprint (st);\r
122         dprint (".\n");\r
123         //return (tg);\r
124 };\r
125 \r
126 void(entity Goal, entity AP, entity ActivatingGoal) AttemptToActivate = \r
127 {\r
128         local entity te;\r
129         if (Activated(Goal, AP))\r
130         {\r
131                 if (ActivatingGoal == Goal)\r
132                 {\r
133                         DoResults(Goal, AP, TF_FLARE_OFF);\r
134                 }\r
135                 else\r
136                 {\r
137                         if (ActivatingGoal != world)\r
138                         {\r
139                                 DoResults(Goal, AP, ActivatingGoal.goal_result & 2);\r
140                         }\r
141                         else\r
142                         {\r
143                                 DoResults(Goal, AP, TF_FLARE_LIT);\r
144                         }\r
145                 }\r
146         }\r
147         else\r
148         {\r
149                 if (Goal.else_goal != TF_FLARE_LIT)\r
150                 {\r
151                         te = Findgoal(Goal.else_goal);\r
152                         if (te)\r
153                         {\r
154                                 AttemptToActivate(te, AP, ActivatingGoal);\r
155                         }\r
156                 }\r
157         }\r
158 };\r
159 \r
160 void (entity p) TeamFortress_SetSpeed =\r
161 {\r
162         local string sp;\r
163         local float tf;\r
164         local entity te;\r
165 \r
166         stuffcmd (p, "cl_movespeedkey 1\n");\r
167         if ((p.tfstate & 65536))\r
168         {\r
169                 if ((0 == 1))\r
170                 {\r
171                         stuffcmd (p, "m_forward 0\n");\r
172                         stuffcmd (p, "m_side 0\n");\r
173                 }\r
174                 p.velocity = '0 0 0';\r
175                 stuffcmd (p, "cl_backspeed 0\n");\r
176                 stuffcmd (p, "cl_forwardspeed 0\n");\r
177                 stuffcmd (p, "cl_sidespeed 0\n");\r
178                 return;\r
179         }\r
180         else\r
181         {\r
182                 if ((0 == 1))\r
183                 {\r
184                         stuffcmd (p, "m_forward 1\n");\r
185                         stuffcmd (p, "m_side 0.8\n");\r
186                 }\r
187         }\r
188         if ((p.class == 1))             //scout speed\r
189         {\r
190                 p.maxfbspeed = 450;\r
191                 p.maxstrafespeed = 450;\r
192         }\r
193         else\r
194         {\r
195                 if ((p.class == 2.1))                   // No sniper in nextf\r
196                 {\r
197                         p.maxfbspeed = 300;\r
198                         p.maxstrafespeed = 300;\r
199                 }\r
200                 else\r
201                 {\r
202                         if ((p.class == 4))             //soldier speed\r
203                         {\r
204                                 p.maxfbspeed = 240;\r
205                                 p.maxstrafespeed = 240;\r
206                         }\r
207                         else\r
208                         {\r
209                                 if ((p.class == 4.1))           // No demoman in nextf\r
210                                 {\r
211                                         p.maxfbspeed = 280;\r
212                                         p.maxstrafespeed = 280;\r
213                                 }\r
214                                 else\r
215                                 {\r
216                                         if ((p.class == 16))            // Medic Speed\r
217                                         {\r
218                                                 p.maxfbspeed = 320;\r
219                                                 p.maxstrafespeed = 320;\r
220                                         }\r
221                                         else\r
222                                         {\r
223                                                 if ((p.class == 6.1))           // No HWGuy in nextf\r
224                                                 {\r
225                                                         p.maxfbspeed = 230;\r
226                                                         p.maxstrafespeed = 230;\r
227                                                 }\r
228                                                 else\r
229                                                 {\r
230                                                         if ((p.class == 8))             // Pyro Speed\r
231                                                         {\r
232                                                                 p.maxfbspeed = 300;\r
233                                                                 p.maxstrafespeed = 300;\r
234                                                         }\r
235                                                         else\r
236                                                         {\r
237                                                                 if ((p.class == 11))            // Wazat -- We need a Civ class\r
238                                                                 {\r
239                                                                         p.maxfbspeed = 240;\r
240                                                                         p.maxstrafespeed = 240;\r
241                                                                 }\r
242                                                                 else\r
243                                                                 {\r
244                                                                         if ((p.class == 2))             // Spy Speed\r
245                                                                         {\r
246                                                                                 p.maxfbspeed = 300;\r
247                                                                                 p.maxstrafespeed = 300;\r
248                                                                         }\r
249                                                                         else\r
250                                                                         {\r
251                                                                                 if ((p.class == 32))            // Engineer Speed\r
252                                                                                 {\r
253                                                                                         p.maxfbspeed = 300;\r
254                                                                                         p.maxstrafespeed = 300;\r
255                                                                                 }\r
256                                                                                 else\r
257                                                                                 {\r
258                                                                                         if ((p.class == 0))             // No class\r
259                                                                                         {\r
260                                                                                                 p.maxfbspeed = 320;\r
261                                                                                                 p.maxstrafespeed = 320;\r
262                                                                                                 return;\r
263                                                                                         }\r
264                                                                                 }\r
265                                                                         }\r
266                                                                 }\r
267                                                         }\r
268                                                 }\r
269                                         }\r
270                                 }\r
271                         }\r
272                 }\r
273         }\r
274         tf = 0;\r
275         te = find (world, classname, "item_tfgoal");\r
276         while (((te != world) && (tf == 0)))\r
277         {\r
278                 if ((te.owner == p))\r
279                 {\r
280                         if ((te.goal_activation & 2))\r
281                         {\r
282                                 tf = 1;\r
283                                 p.maxfbspeed = (p.maxfbspeed / 2);\r
284                                 p.maxstrafespeed = (p.maxstrafespeed / 2);\r
285                         }\r
286                 }\r
287                 te = find (te, classname, "item_tfgoal");\r
288         }\r
289         if ((p.tfstate & 32768))\r
290         {\r
291                 p.maxfbspeed = (p.maxfbspeed / 2);\r
292                 p.maxstrafespeed = (p.maxstrafespeed / 2);\r
293         }\r
294 /*      if (p.leg_damage)                       // Railgun does leg damage :D -- check cl_physics.c\r
295         {\r
296                 if ((p.leg_damage > 6))\r
297                 {\r
298                         p.leg_damage = 6;\r
299                 }\r
300                 p.maxfbspeed = (p.maxfbspeed * ((10 - p.leg_damage) / 10));\r
301                 p.maxstrafespeed = ((p.maxstrafespeed * (10 - p.leg_damage)) / 10);\r
302         }*/\r
303         if ((p.tfstate & 2048))\r
304         {\r
305                 if ((p.maxfbspeed > 80))\r
306                 {\r
307                         p.maxfbspeed = 80;\r
308                 }\r
309                 if ((p.maxstrafespeed > 80))\r
310                 {\r
311                         p.maxstrafespeed = 80;\r
312                 }\r
313         }\r
314         sp = ftos (p.maxfbspeed);\r
315         stuffcmd (p, "cl_backspeed ");\r
316         stuffcmd (p, sp);\r
317         stuffcmd (p, "\n");\r
318         stuffcmd (p, "cl_forwardspeed ");\r
319         stuffcmd (p, sp);\r
320         stuffcmd (p, "\n");\r
321         sp = ftos (p.maxstrafespeed);\r
322         stuffcmd (p, "cl_sidespeed ");\r
323         stuffcmd (p, sp);\r
324         stuffcmd (p, "\n");\r
325 };\r
326 \r
327 float (entity Retriever, float AmmoType) TeamFortress_GetMaxAmmo =\r
328 {\r
329         if ((AmmoType == 256))\r
330         {\r
331                 return (Retriever.maxammo_shells);\r
332         }\r
333         else\r
334         {\r
335                 if ((AmmoType == 512))\r
336                 {\r
337                         return (Retriever.maxammo_nails);\r
338                 }\r
339                 else\r
340                 {\r
341                         if ((AmmoType == 2048))\r
342                         {\r
343                                 return (Retriever.maxammo_cells);\r
344                         }\r
345                         else\r
346                         {\r
347                                 if ((AmmoType == 1024))\r
348                                 {\r
349                                         return (Retriever.maxammo_rockets);\r
350                                 }\r
351                                 else\r
352                                 {\r
353                                         if ((AmmoType == 4))\r
354                                         {\r
355                                                 return (Retriever.maxammo_medikit);\r
356                                         }\r
357                                         else\r
358                                         {\r
359                                                 if ((AmmoType == 131072))\r
360                                                 {\r
361                                                         return (Retriever.maxammo_detpack);\r
362                                                 }\r
363                                         }\r
364                                 }\r
365                         }\r
366                 }\r
367         }\r
368         dprint ("Error in TeamFortress_GetMaxAmmo()\n");\r
369         dprint ("Invalid ammo type passed.\n");\r
370         return (0);\r
371 };\r
372 \r
373 void () TeamFortress_CheckClassStats =\r
374 {\r
375 //              Wazat - Implement your armor system here, eh?\r
376 /*      if ((self.armortype > self.armor_allowed))\r
377         {\r
378                 self.armortype = self.armor_allowed;\r
379         }*/\r
380         if ((self.armorvalue > self.max_armor))\r
381         {\r
382                 self.armorvalue = self.max_armor;\r
383         }\r
384         if ((self.armortype < 0))\r
385         {\r
386                 self.armortype = 0;\r
387         }\r
388         if ((self.armorvalue < 0))\r
389         {\r
390                 self.armorvalue = 0;\r
391         }\r
392         if ((self.ammo_shells > TeamFortress_GetMaxAmmo (self, 256)))\r
393         {\r
394                 self.ammo_shells = TeamFortress_GetMaxAmmo (self, 256);\r
395         }\r
396         if ((self.ammo_shells < 0))\r
397         {\r
398                 self.ammo_shells = 0;\r
399         }\r
400         if ((self.ammo_nails > TeamFortress_GetMaxAmmo (self, 512)))\r
401         {\r
402                 self.ammo_nails = TeamFortress_GetMaxAmmo (self, 512);\r
403         }\r
404         if ((self.ammo_nails < 0))\r
405         {\r
406                 self.ammo_nails = 0;\r
407         }\r
408         if ((self.ammo_rockets > (TeamFortress_GetMaxAmmo (self, 1024) * 3)))\r
409         {\r
410                 self.ammo_rockets = (TeamFortress_GetMaxAmmo (self, 1024) * 3);\r
411         }\r
412         if ((self.ammo_rockets < 0))\r
413         {\r
414                 self.ammo_rockets = 0;\r
415         }\r
416         if ((self.ammo_cells > TeamFortress_GetMaxAmmo (self, 2048)))\r
417         {\r
418                 self.ammo_cells = TeamFortress_GetMaxAmmo (self, 2048);\r
419         }\r
420         if ((self.ammo_cells < 0))\r
421         {\r
422                 self.ammo_cells = 0;\r
423         }\r
424         if ((self.ammo_medikit > TeamFortress_GetMaxAmmo (self, 4)))\r
425         {\r
426                 self.ammo_medikit = TeamFortress_GetMaxAmmo (self, 4);\r
427         }\r
428         if ((self.ammo_medikit < 0))\r
429         {\r
430                 self.ammo_medikit = 0;\r
431         }\r
432         if ((self.ammo_detpack > TeamFortress_GetMaxAmmo (self, 131072)))\r
433         {\r
434                 self.ammo_detpack = TeamFortress_GetMaxAmmo (self, 131072);\r
435         }\r
436         if ((self.ammo_detpack < 0))\r
437         {\r
438                 self.ammo_detpack = 0;\r
439         }\r
440         if ((self.no_grenades_1 < 0))\r
441         {\r
442                 self.no_grenades_1 = 0;\r
443         }\r
444         if ((self.no_grenades_2 < 0))\r
445         {\r
446                 self.no_grenades_2 = 0;\r
447         }\r
448 //              NexTF uses auto-rot, so there's no need for this function.\r
449 //      if (((self.health > self.max_health) && !(self.items & 65536)))\r
450 //      {\r
451 //              TF_T_Damage (self, world, world, (self.max_health - self.health), 0, 256);\r
452 //      }\r
453         if ((self.health < 0))\r
454         {\r
455                 T_Heal (self, (self.health - self.health), 0);\r
456         }\r
457         self.items = (self.items - (self.items & ((8192 | 16384) | 32768)));\r
458         if ((self.armortype >= 0.8))\r
459         {\r
460                 self.items = (self.items | 32768);\r
461         }\r
462         else\r
463         {\r
464                 if ((self.armortype >= 0.6))\r
465                 {\r
466                         self.items = (self.items | 16384);\r
467                 }\r
468                 else\r
469                 {\r
470                         if ((self.armortype >= 0.3))\r
471                         {\r
472                                 self.items = (self.items | 8192);\r
473                         }\r
474                 }\r
475         }\r
476         weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now\r
477 };\r
478 \r
479 // TF Get Score Frags\r
480 float (float tno) TeamFortress_TeamGetScoreFrags =\r
481 {\r
482         if (((toggleflags & 128) || (toggleflags & 2048)))\r
483         {\r
484                 if ((tno == 1))\r
485                 {\r
486                         return (team1score);\r
487                 }\r
488                 if ((tno == 2))\r
489                 {\r
490                         return (team2score);\r
491                 }\r
492                 if ((tno == 3))\r
493                 {\r
494                         return (team3score);\r
495                 }\r
496                 if ((tno == 4))\r
497                 {\r
498                         return (team4score);\r
499                 }\r
500         }\r
501         else\r
502         {\r
503                 if ((tno == 1))\r
504                 {\r
505                         return (team1frags);\r
506                 }\r
507                 if ((tno == 2))\r
508                 {\r
509                         return (team2frags);\r
510                 }\r
511                 if ((tno == 3))\r
512                 {\r
513                         return (team3frags);\r
514                 }\r
515                 if ((tno == 4))\r
516                 {\r
517                         return (team4frags);\r
518                 }\r
519         }\r
520         return (0);\r
521 };\r
522 \r
523 // TF Get Team Winner\r
524 float () TeamFortress_TeamGetWinner =\r
525 {\r
526         local float i;\r
527         local float j;\r
528         local float highest;\r
529         local float highestteam;\r
530 \r
531         i = 1;\r
532         highest = 0;\r
533         highestteam = 0;\r
534         while ((i < (number_of_teams + 1)))\r
535         {\r
536                 j = TeamFortress_TeamGetScoreFrags (i);\r
537                 if ((j > highest))\r
538                 {\r
539                         highest = j;\r
540                         highestteam = i;\r
541                 }\r
542                 i = (i + 1);\r
543         }\r
544         return (highestteam);\r
545 };\r
546 \r
547 // TF Score Increaser\r
548 void (float tno, float scoretoadd) TeamFortress_TeamIncreaseScore =\r
549 {\r
550         local entity e;\r
551 \r
552         if (((tno == 0) || (scoretoadd == 0)))\r
553         {\r
554                 return;\r
555         }\r
556         if ((tno == 1))\r
557         {\r
558                 team1score = (team1score + scoretoadd);\r
559         }\r
560         if ((tno == 2))\r
561         {\r
562                 team2score = (team2score + scoretoadd);\r
563         }\r
564         if ((tno == 3))\r
565         {\r
566                 team3score = (team3score + scoretoadd);\r
567         }\r
568         if ((tno == 4))\r
569         {\r
570                 team4score = (team4score + scoretoadd);\r
571         }\r
572         if (((toggleflags & 128) || (toggleflags & 2048)))\r
573         {\r
574                 e = find (world, classname, "player");\r
575                 while (e)\r
576                 {\r
577                         if ((e.team_no == tno))\r
578                         {\r
579                                 e.frags = TeamFortress_TeamGetScore (tno);\r
580                         }\r
581                         e = find (e, classname, "player");\r
582                 }\r
583         }\r
584 };\r
585 \r
586 // Returns Team Color Name (String)\r
587 string (float tno) TeamFortress_TeamGetColorString =\r
588 {\r
589         local float col;\r
590 \r
591         col = TeamFortress_TeamGetColor (tno);\r
592         if ((col == 1))\r
593         {\r
594                 return ("White");\r
595         }\r
596         if ((col == 2))\r
597         {\r
598                 return ("Brown");\r
599         }\r
600         if ((col == 3))\r
601         {\r
602                 return ("Blue");\r
603         }\r
604         if ((col == 4))\r
605         {\r
606                 return ("Green");\r
607         }\r
608         if ((col == 5))\r
609         {\r
610                 return ("Red");\r
611         }\r
612         if ((col == 6))\r
613         {\r
614                 return ("Tan");\r
615         }\r
616         if ((col == 7))\r
617         {\r
618                 return ("Pink");\r
619         }\r
620         if ((col == 8))\r
621         {\r
622                 return ("Orange");\r
623         }\r
624         if ((col == 9))\r
625         {\r
626                 return ("Purple");\r
627         }\r
628         if ((col == 10))\r
629         {\r
630                 return ("DarkPurple");\r
631         }\r
632         if ((col == 11))\r
633         {\r
634                 return ("Grey");\r
635         }\r
636         if ((col == 12))\r
637         {\r
638                 return ("DarkGreen");\r
639         }\r
640         if ((col == 13))\r
641         {\r
642                 return ("Yellow");\r
643         }\r
644         return ("DarkBlue");\r
645 };\r
646 \r
647 // Is civilian?\r
648 float (float tno) TeamFortress_TeamIsCivilian =\r
649 {\r
650         if ((tno == 1))\r
651         {\r
652                 if ((civilianteams & 1))\r
653                 {\r
654                         return (1);\r
655                 }\r
656         }\r
657         else\r
658         {\r
659                 if ((tno == 2))\r
660                 {\r
661                         if ((civilianteams & 2))\r
662                         {\r
663                                 return (1);\r
664                         }\r
665                 }\r
666                 else\r
667                 {\r
668                         if ((tno == 3))\r
669                         {\r
670                                 if ((civilianteams & 4))\r
671                                 {\r
672                                         return (1);\r
673                                 }\r
674                         }\r
675                         else\r
676                         {\r
677                                 if ((civilianteams & 8))\r
678                                 {\r
679                                         return (1);\r
680                                 }\r
681                         }\r
682                 }\r
683         }\r
684         return (0);\r
685 };\r
686 \r
687 // Change Class\r
688 //              You use a different method of handling this tho Wazat?\r
689 void () TeamFortress_ChangeClass;\r
690 /*void () TeamFortress_ChangeClass =\r
691 {\r
692         local entity spot;\r
693         local entity te;\r
694         local float tc;\r
695         local string st;\r
696 \r
697         if ((self.playerclass != 0))\r
698         {\r
699                 if (((deathmatch != 3) && (cb_prematch_time < time)))\r
700                 {\r
701                         return;\r
702                 }\r
703                 if (TeamFortress_TeamIsCivilian (self.team_no))\r
704                 {\r
705                         sprint (self, "You cannot change class.\n");\r
706                         return;\r
707                 }\r
708                 if (!IsLegalClass ((self.impulse - 100)))\r
709                 {\r
710                         sprint (self, "Your team cannot play that class.\n");\r
711                         TeamFortress_DisplayLegalClasses ();\r
712                         return;\r
713                 }\r
714                 if (((spy_off == 1) && ((self.impulse - 100) == 8)))\r
715                 {\r
716                         sprint (self, "The spy class has been disabled on the server by the administrator.\n");\r
717                         return;\r
718                 }\r
719                 self.nextpc = (self.impulse - 100);\r
720                 sprint (self, "After dying, you will return as a ");\r
721                 TeamFortress_PrintClassName (self, self.nextpc, (self.tfstate & 8));\r
722                 self.immune_to_check = (time + 10);\r
723                 return;\r
724         }\r
725         if ((teamplay && (self.team_no == 0)))\r
726         {\r
727                 if ((toggleflags & 64))\r
728                 {\r
729                         if ((TeamFortress_TeamPutPlayerInTeam () == 0))\r
730                         {\r
731                                 return;\r
732                         }\r
733                 }\r
734                 else\r
735                 {\r
736                         sprint (self, "You must join a team first. \n");\r
737                         sprint (self, "use imin1, imin2, imin3, or imin4\n");\r
738                         return;\r
739                 }\r
740         }\r
741         if ((self.lives == 0))\r
742         {\r
743                 sprint (self, "You have no lives left.\n");\r
744                 return;\r
745         }\r
746         if ((!IsLegalClass ((self.impulse - 100)) && (self.impulse != 1)))\r
747         {\r
748                 sprint (self, "You cannot play that playerclass on this map. \n");\r
749                 TeamFortress_DisplayLegalClasses ();\r
750                 return;\r
751         }\r
752         if (((spy_off == 1) && ((self.impulse - 100) == 8)))\r
753         {\r
754                 sprint (self, "The spy class has been disabled on the server by the administrator.\n");\r
755                 return;\r
756         }\r
757         if ((self.impulse != 1))\r
758         {\r
759                 self.playerclass = (self.impulse - 100);\r
760         }\r
761         else\r
762         {\r
763                 self.playerclass = 11;\r
764         }\r
765         self.nextpc = 0;\r
766         self.takedamage = 2;\r
767         self.movetype = 3;\r
768         self.flags = (8 | 512);\r
769         self.waterlevel = 0;\r
770         self.air_finished = (time + 12);\r
771         self.solid = 3;\r
772         self.pausetime = 0;\r
773         spot = SelectSpawnPoint ();\r
774         self.origin = (spot.origin + '0 0 1');\r
775         self.angles = spot.angles;\r
776         self.fixangle = 1;\r
777         setmodel (self, string_null);\r
778         modelindex_null = self.modelindex;\r
779         setmodel (self, "progs/eyes.mdl");\r
780         modelindex_eyes = self.modelindex;\r
781         setmodel (self, "progs/player.mdl");\r
782         modelindex_player = self.modelindex;\r
783         setsize (self, '-16 -16 -24', '16 16 32');\r
784         self.view_ofs = '0 0 22';\r
785         player_stand1 ();\r
786         if ((deathmatch || coop))\r
787         {\r
788                 makevectors (self.angles);\r
789                 spawn_tfog ((self.origin + (v_forward * 20)));\r
790         }\r
791         if ((self.playerclass == 10))\r
792         {\r
793                 sprint (self, "Random Playerclass.\n");\r
794                 self.tfstate = (self.tfstate | 8);\r
795                 self.playerclass = (1 + floor ((random () * (10 - 1))));\r
796         }\r
797         if (((spot.classname == "info_player_teamspawn") && (cb_prematch_time < time)))\r
798         {\r
799                 if ((spot.items != 0))\r
800                 {\r
801                         te = Finditem (spot.items);\r
802                         if (te)\r
803                         {\r
804                                 tfgoalitem_GiveToPlayer (te, self, self);\r
805                         }\r
806                         if (!(spot.goal_activation & 1))\r
807                         {\r
808                                 spot.items = 0;\r
809                         }\r
810                 }\r
811                 if (spot.message)\r
812                 {\r
813                         CenterPrint (self, spot.message);\r
814                         if (!(spot.goal_activation & 2))\r
815                         {\r
816                                 spot.message = string_null;\r
817                         }\r
818                 }\r
819                 if ((spot.activate_goal_no != 0))\r
820                 {\r
821                         te = Findgoal (spot.activate_goal_no);\r
822                         if (te)\r
823                         {\r
824                                 AttemptToActivate (te, self, spot);\r
825                         }\r
826                 }\r
827                 if ((spot.goal_effects == 1))\r
828                 {\r
829                         spot.classname = "deadpoint";\r
830                         spot.team_str_home = string_null;\r
831                         spot.nextthink = (time + 1);\r
832                         spot.think = SUB_Remove;\r
833                 }\r
834         }\r
835         spot = find (world, classname, "player");\r
836         while (spot)\r
837         {\r
838                 if (((spot.team_no == self.team_no) && (spot != self)))\r
839                 {\r
840                         sprint (spot, 2, self.netname);\r
841                         sprint (spot, 2, " is playing as a ");\r
842                         TeamFortress_PrintClassName (spot, self.playerclass, (self.tfstate & 8));\r
843                 }\r
844                 spot = find (spot, classname, "player");\r
845         }\r
846         TeamFortress_PrintClassName (self, self.playerclass, (self.tfstate & 8));\r
847         TeamFortress_SetEquipment ();\r
848         TeamFortress_SetHealth ();\r
849         TeamFortress_SetSpeed (self);\r
850         TeamFortress_SetSkin (self);\r
851         if (cease_fire)\r
852         {\r
853                 sprint (self, "\n\nCEASE FIRE MODE\n");\r
854                 self.immune_to_check = (time + 10);\r
855                 self.tfstate = (self.tfstate | 65536);\r
856                 TeamFortress_SetSpeed (self);\r
857         }\r
858 };*/\r
859 \r
860 // Show what class each member of the team is -- NEEDS AN IMPULSE CALL FUNCTION\r
861 void (entity Player) TeamFortress_TeamShowMemberClasses =\r
862 {\r
863         local entity e;\r
864         local float found;\r
865 \r
866         found = 0;\r
867         e = find (world, classname, "player");\r
868         while (e)\r
869         {\r
870                 if ((((e.team_no == Player.team_no) || (e.team_no == 0)) && (e != Player)))\r
871                 {\r
872                         if ((e.model != string_null))\r
873                         {\r
874                                 if (!found)\r
875                                 {\r
876                                         found = 1;\r
877                                         sprint (self, "The other members of your team are:\n");\r
878                                 }\r
879                                 sprint (Player, e.netname);\r
880                                 sprint (Player, " : ");\r
881 //                              TeamFortress_PrintClassName (Player, e.playerclass, (e.tfstate & 8));\r
882                                 TeamFortress_PrintClassName (Player, e.class, (e.tfstate & 8));\r
883                         }\r
884                 }\r
885                 e = find (e, classname, "player");\r
886         }\r
887         if (!found)\r
888         {\r
889                 sprint (Player, "There are no other players on your team.\n");\r
890         }\r
891 };\r
892 \r
893 // Returns class name value\r
894 // We use another function for the TN classnames though..\r
895 string (float pc) TeamFortress_GetClassName =\r
896 {\r
897         if ((pc == 1))                  // Scout is class 1 (normal)\r
898         {\r
899                 return ("Scout");\r
900         }\r
901         else\r
902         {\r
903                 if ((pc == 2.1))\r
904                 {\r
905                         return ("Sniper");              // Player Class 2 is Spy in NexTF -- no Snipers\r
906                 }\r
907                 else\r
908                 {\r
909                         if ((pc == 4))                          // Player Class 4 is soldier in NexTF\r
910                         {\r
911                                 return ("Soldier");\r
912                         }\r
913                         else\r
914                         {\r
915                                 if ((pc == 4.1))                        // No DemoMan in NexTF\r
916                                 {\r
917                                         return ("Demolitions Man");\r
918                                 }\r
919                                 else\r
920                                 {\r
921                                         if ((pc == 16))\r
922                                         {\r
923                                                 return ("Combat Medic");                // Medic is Class 16 in NexTF\r
924                                         }\r
925                                         else\r
926                                         {\r
927                                                 if ((pc == 6.1))\r
928                                                 {\r
929                                                         return ("Heavy Weapons Guy");           // No HWGuy in NexTF\r
930                                                 }\r
931                                                 else\r
932                                                 {\r
933                                                         if ((pc == 8))\r
934                                                         {\r
935                                                                 return ("Pyro");                // Pyro is class 8 in NexTF\r
936                                                         }\r
937                                                         else\r
938                                                         {\r
939                                                                 if ((pc == 2))\r
940                                                                 {\r
941                                                                         return ("Spy");                 // Spy is class 2 in NexTF\r
942                                                                 }\r
943                                                                 else\r
944                                                                 {\r
945                                                                         if ((pc == 32))\r
946                                                                         {\r
947                                                                                 return ("Engineer");            // Engineer is class 32 in nextf\r
948                                                                         }\r
949                                                                         else\r
950                                                                         {\r
951                                                                                 if ((pc == 11))                 // Wazat- we need to make civ class\r
952                                                                                 {\r
953                                                                                         return ("Civilian");\r
954                                                                                 }\r
955                                                                                 else\r
956                                                                                 {\r
957                                                                                         if ((pc == 0))\r
958                                                                                         {\r
959                                                                                                 return ("Observer");\r
960                                                                                         }\r
961                                                                                         else\r
962                                                                                         {\r
963                                                                                                 if ((pc == 10))                 // Wazat- we need to add "random class" feature\r
964                                                                                                 {\r
965                                                                                                         return ("Random Playerclass");\r
966                                                                                                 }\r
967                                                                                         }\r
968                                                                                 }\r
969                                                                         }\r
970                                                                 }\r
971                                                         }\r
972                                                 }\r
973                                         }\r
974                                 }\r
975                         }\r
976                 }\r
977         }\r
978 };\r
979 \r
980 // Prints the classname using TeamFortress_GetClassName function\r
981 void (entity Viewer, float pc, float rpc) TeamFortress_PrintClassName =\r
982 {\r
983         local string st;\r
984 \r
985         st = TeamFortress_GetClassName (pc);\r
986         sprint (Viewer, st);\r
987         if ((rpc != 0))\r
988         {\r
989                 sprint (Viewer, " (Random)");\r
990         }\r
991         sprint (Viewer, "\n");\r
992 };\r
993 \r
994 // Returns Team Color Value\r
995 //                      note: this value is actually incorrect, the actual color values are the ones listed here\r
996 //                                minus one.\r
997 float (float tno) TeamFortress_TeamGetColor =\r
998 {\r
999         if ((tno == 1))\r
1000         {\r
1001                 return (14);\r
1002         }\r
1003         if ((tno == 2))\r
1004         {\r
1005                 return (5);\r
1006         }\r
1007         if ((tno == 3))\r
1008         {\r
1009                 return (13);\r
1010         }\r
1011         if ((tno == 4))\r
1012         {\r
1013                 return (12);\r
1014         }\r
1015         return (0);\r
1016 };\r
1017 \r
1018 // Returns Team Score Value\r
1019 float (float tno) TeamFortress_TeamGetScore =\r
1020 {\r
1021         if ((tno == 1))\r
1022         {\r
1023                 return (team1score);\r
1024         }\r
1025         if ((tno == 2))\r
1026         {\r
1027                 return (team2score);\r
1028         }\r
1029         if ((tno == 3))\r
1030         {\r
1031                 return (team3score);\r
1032         }\r
1033         if ((tno == 4))\r
1034         {\r
1035                 return (team4score);\r
1036         }\r
1037         return (0);\r
1038 };\r
1039 \r
1040 // Get Team Lives\r
1041 float (float tno) TeamFortress_TeamGetLives =\r
1042 {\r
1043         if ((tno == 1))\r
1044         {\r
1045                 return (team1lives);\r
1046         }\r
1047         if ((tno == 2))\r
1048         {\r
1049                 return (team2lives);\r
1050         }\r
1051         if ((tno == 3))\r
1052         {\r
1053                 return (team3lives);\r
1054         }\r
1055         if ((tno == 4))\r
1056         {\r
1057                 return (team4lives);\r
1058         }\r
1059         return (0);\r
1060 };\r
1061 \r
1062 // Show Team Scores\r
1063 void (float all) TeamFortress_TeamShowScores =\r
1064 {\r
1065         local string st;\r
1066         local float i;\r
1067         local float j;\r
1068 \r
1069         i = 1;\r
1070         if ((all == 2))\r
1071         {\r
1072                 while ((i <= number_of_teams))\r
1073                 {\r
1074                         if ((TeamFortress_TeamGetColor (i) > 0))\r
1075                         {\r
1076                                 j = TeamFortress_TeamGetScore (i);\r
1077                                 st = TeamFortress_TeamGetColorString (i);\r
1078 //                              bprint (st);\r
1079 //                              bprint (": ");\r
1080                                 bprint (st);\r
1081                                 bprint (": ");\r
1082                                 st = ftos (j);\r
1083                                 //bprint (st);\r
1084                                 //bprint (" ");\r
1085                                 bprint (st);\r
1086                                 bprint (" ");\r
1087                         }\r
1088                         i = (i + 1);\r
1089                 }\r
1090 //              bprint ("\n");\r
1091                 bprint ("\n");\r
1092                 return;\r
1093         }\r
1094         while ((i <= number_of_teams))\r
1095         {\r
1096                 if ((TeamFortress_TeamGetColor (i) > 0))\r
1097                 {\r
1098                         if (all)\r
1099                         {\r
1100                                 bprint ("Team ");\r
1101                         }\r
1102                         else\r
1103                         {\r
1104                                 sprint (self, "Team ");\r
1105                         }\r
1106                         st = ftos (i);\r
1107                         if (all)\r
1108                         {\r
1109                                 bprint (st);\r
1110                         }\r
1111                         else\r
1112                         {\r
1113                                 sprint (self, st);\r
1114                         }\r
1115                         if (all)\r
1116                         {\r
1117                                 bprint (" (");\r
1118                         }\r
1119                         else\r
1120                         {\r
1121                                 sprint (self, " (");\r
1122                         }\r
1123                         st = TeamFortress_TeamGetColorString (i);\r
1124                         if (all)\r
1125                         {\r
1126                                 bprint (st);\r
1127                         }\r
1128                         else\r
1129                         {\r
1130                                 sprint (self, st);\r
1131                         }\r
1132                         if (all)\r
1133                         {\r
1134                                 bprint (") : ");\r
1135                         }\r
1136                         else\r
1137                         {\r
1138                                 sprint (self, ") : ");\r
1139                         }\r
1140                         j = TeamFortress_TeamGetScore (i);\r
1141                         st = ftos (j);\r
1142                         if (all)\r
1143                         {\r
1144                                 bprint (st);\r
1145                         }\r
1146                         else\r
1147                         {\r
1148                                 sprint (self, st);\r
1149                         }\r
1150                         if (all)\r
1151                         {\r
1152                                 bprint ("\n");\r
1153                         }\r
1154                         else\r
1155                         {\r
1156                                 sprint (self, "\n");\r
1157                         }\r
1158                 }\r
1159                 i = (i + 1);\r
1160         }\r
1161 };\r
1162 \r
1163 // Get Number Of Players On Team\r
1164 float (float tno) TeamFortress_TeamGetNoPlayers =\r
1165 {\r
1166         local float size_team;\r
1167         local entity search;\r
1168 \r
1169         search = find (world, classname, "player");\r
1170         while ((search != world))\r
1171         {\r
1172                 if ((search.team_no == tno))\r
1173                 {\r
1174                         size_team = (size_team + 1);\r
1175                 }\r
1176                 search = find (search, classname, "player");\r
1177         }\r
1178         return (size_team);\r
1179 };\r
1180 \r
1181 // Get general number of players\r
1182 float () TeamFortress_GetNoPlayers =\r
1183 {\r
1184         local float nump;\r
1185         local entity search;\r
1186 \r
1187         search = find (world, classname, "player");\r
1188         while ((search != world))\r
1189         {\r
1190                 if ((search.netname != string_null))\r
1191                 {\r
1192                         nump = (nump + 1);\r
1193                 }\r
1194                 search = find (search, classname, "player");\r
1195         }\r
1196         return (nump);\r
1197 };\r
1198 \r
1199 // Get max players for a team\r
1200 float (float tno) TeamFortress_TeamGetMaxPlayers =\r
1201 {\r
1202         if ((tno == 1))\r
1203         {\r
1204                 return (team1maxplayers);\r
1205         }\r
1206         if ((tno == 2))\r
1207         {\r
1208                 return (team2maxplayers);\r
1209         }\r
1210         if ((tno == 3))\r
1211         {\r
1212                 return (team3maxplayers);\r
1213         }\r
1214         if ((tno == 4))\r
1215         {\r
1216                 return (team4maxplayers);\r
1217         }\r
1218         return (0);\r
1219 };\r
1220 \r
1221 // Set The Team Color\r
1222 void (float tno) TeamFortress_TeamSetColor =\r
1223 {\r
1224         if ((tno == 1))\r
1225         {\r
1226                 team1col = 14;\r
1227                 return;\r
1228         }\r
1229         if ((tno == 2))\r
1230         {\r
1231                 team2col = 5;\r
1232                 return;\r
1233         }\r
1234         if ((tno == 3))\r
1235         {\r
1236                 team3col = 13;\r
1237                 return;\r
1238         }\r
1239         if ((tno == 4))\r
1240         {\r
1241                 team4col = 12;\r
1242                 return;\r
1243         }\r
1244 };\r
1245 \r
1246 // Set The Team Number\r
1247 float (float tno) TeamFortress_TeamSet =\r
1248 {\r
1249         local string st;\r
1250         local float tc;\r
1251 \r
1252         if ((teamplay < 1))\r
1253         {\r
1254                 sprint (self, "Teamplay is not On, so FortressTeams are inactive.\n");\r
1255                 return (0);\r
1256         }\r
1257         if (((tno > number_of_teams) && (number_of_teams != 0)))\r
1258         {\r
1259                 sprint (self, "There can be only ");\r
1260                 st = ftos (number_of_teams);\r
1261                 sprint (self, st);\r
1262                 sprint (self, " teams on this map.\nTry again\n");\r
1263                 return (0);\r
1264         }\r
1265         if ((self.team_no > 0))\r
1266         {\r
1267                 sprint (self, "You're already in Team No ");\r
1268                 st = ftos (self.team_no);\r
1269                 sprint (self, st);\r
1270                 sprint (self, ".\n");\r
1271                 return (0);\r
1272         }\r
1273         tc = TeamFortress_TeamGetNoPlayers (tno);\r
1274         if ((tc >= TeamFortress_TeamGetMaxPlayers (tno)))\r
1275         {\r
1276                 sprint (self, "That team is full. Pick another.\n");\r
1277                 return (0);\r
1278         }\r
1279         if ((TeamFortress_TeamGetColor (tno) == 0))\r
1280         {\r
1281                 TeamFortress_TeamSetColor (tno);\r
1282                 if ((TeamFortress_TeamGetColor (tno) == 0))\r
1283                 {\r
1284                         sprint (self, "You can't start a new team with your color, since another ");\r
1285                         sprint (self, "already using that color. Change your pants color, then try again.\n");\r
1286                         return (0);\r
1287                 }\r
1288                 bprint (self.netname);\r
1289                 bprint (" has started Team No ");\r
1290                 st = ftos (tno);\r
1291                 bprint (st);\r
1292                 bprint (".\n");\r
1293                 self.immune_to_check = (time + 10);\r
1294                 if (((toggleflags & 128) || (toggleflags & 2048)))\r
1295                 {\r
1296                         self.frags = TeamFortress_TeamGetScore (tno);\r
1297                 }\r
1298                 stuffcmd (self, "color ");\r
1299                 tc = (TeamFortress_TeamGetColor (tno) - 1);\r
1300                 st = ftos (tc);\r
1301                 stuffcmd (self, st);\r
1302                 stuffcmd (self, "\n");\r
1303                 self.team_no = tno;\r
1304                 self.lives = TeamFortress_TeamGetLives (tno);\r
1305                 //if ((self.class == 0))\r
1306                 if (self.playerclass == 0)\r
1307                 {\r
1308                         if (TeamFortress_TeamIsCivilian (self.team_no))\r
1309                         {\r
1310                                 self.impulse = 1;\r
1311                                 TeamFortress_ChangeClass ();\r
1312                         }\r
1313                 }\r
1314                 return (1);\r
1315         }\r
1316         bprint (self.netname);\r
1317         bprint (" has joined Team No ");\r
1318         st = ftos (tno);\r
1319         bprint (st);\r
1320         bprint (".\n");\r
1321         stuffcmd (self, "color ");\r
1322         tc = (TeamFortress_TeamGetColor (tno) - 1);\r
1323         st = ftos (tc);\r
1324         stuffcmd (self, st);\r
1325         stuffcmd (self, "\n");\r
1326         self.team_no = tno;\r
1327         self.immune_to_check = (time + 10);\r
1328         self.lives = TeamFortress_TeamGetLives (tno);\r
1329         if (((toggleflags & 128) || (toggleflags & 2048)))\r
1330         {\r
1331                 self.frags = TeamFortress_TeamGetScore (tno);\r
1332         }\r
1333         TeamFortress_TeamShowMemberClasses (self);\r
1334         //if ((self.playerclass == 0))\r
1335         if ((self.class == 0))\r
1336         {\r
1337                 if (TeamFortress_TeamIsCivilian (self.team_no))\r
1338                 {\r
1339                         self.impulse = 1;\r
1340                         TeamFortress_ChangeClass ();\r
1341                 }\r
1342         }\r
1343         return (1);\r
1344 };\r
1345 \r
1346 // Get team score (used in conjunction with autoteam..)\r
1347 float (float tno) TeamFortress_GetRealScore =\r
1348 {\r
1349         local entity te;\r
1350         local float total;\r
1351 \r
1352         te = find (world, classname, "player");\r
1353         while (te)\r
1354         {\r
1355                 if (te.team_no == tno)\r
1356                 {                       \r
1357                         total = total + te.real_frags;\r
1358                 }\r
1359                 te = find (te, classname, "player");\r
1360         }\r
1361         return total;\r
1362 }\r
1363 \r
1364 // Find best team for player (autoteam?)\r
1365 float() TeamFortress_TeamPutPlayerInTeam = \r
1366 {\r
1367         local float i;\r
1368         local float j;\r
1369         local float score1;\r
1370         local float score2;\r
1371 \r
1372         local float lowest;\r
1373         local float likely_team;\r
1374 \r
1375         i = 1;\r
1376         likely_team = random() * number_of_teams;\r
1377         likely_team = ceil(likely_team);\r
1378         if (likely_team == 0)\r
1379         {\r
1380                 likely_team = number_of_teams;\r
1381         }\r
1382 \r
1383         lowest = 33;\r
1384         while (i < number_of_teams + 1)\r
1385         {\r
1386                 j = TeamFortress_TeamGetNoPlayers(i);\r
1387                 \r
1388                 if (j < lowest)\r
1389                 {\r
1390                         if (TeamFortress_TeamGetMaxPlayers(i) > j)\r
1391                         {\r
1392                                 lowest = j;\r
1393                                 likely_team = i;\r
1394                         }\r
1395                 }\r
1396                 // pablo. fancier autoteam for even teams.\r
1397                 else if (j == lowest)\r
1398                 {\r
1399                         \r
1400                         if (TeamFortress_TeamGetMaxPlayers(i) > j)\r
1401                         {\r
1402                                 score1 = TeamFortress_GetRealScore(i);\r
1403                                 score2 = TeamFortress_GetRealScore(likely_team);\r
1404 \r
1405                                 if ( score1 < score2 )\r
1406                                 {\r
1407                                         likely_team = i;\r
1408                                 }\r
1409                                 else if (score1 == score2)\r
1410                                 {\r
1411                                         if (random() > 0.5)\r
1412                                         {\r
1413                                                 likely_team = i;\r
1414                                         }\r
1415                                 }\r
1416                         }\r
1417                 }\r
1418                 //\r
1419                 i = i + 1;\r
1420         }\r
1421         return TeamFortress_TeamSet(likely_team);\r
1422 };\r
1423 \r
1424 // Remove item_tfgoal timers\r
1425 void() TeamFortress_RemoveTimers = \r
1426 {\r
1427         local entity te;\r
1428 //      self.leg_damage = 0;            // No Snipers\r
1429 //      self.is_undercover = 0;         // I think this function is called in PlayerKill\r
1430 //      self.is_building = 0;           // To Be Added ?\r
1431 //      self.building = world;          // To Be Added ?\r
1432         if (self.tfstate & 2048)\r
1433         {\r
1434                 self.tfstate = self.tfstate - 2048;\r
1435                 TeamFortress_SetSpeed(self);\r
1436                 self.heat = 0;\r
1437         }\r
1438         te = find(world, classname, "timer");\r
1439         while (te != world)\r
1440         {\r
1441                 if (te.owner == self)\r
1442                 {\r
1443                         dremove(te);\r
1444                         te = find(world, classname, "timer");\r
1445                 }\r
1446                 else\r
1447                 {\r
1448                         te = find(te, classname, "timer");\r
1449                 }\r
1450         }\r
1451         te = find(world, classname, "item_tfgoal");\r
1452         while (te)\r
1453         {\r
1454                 if (te.owner == self)\r
1455                 {\r
1456                         if (!(te.goal_activation & 256))\r
1457                         {\r
1458                                 tfgoalitem_RemoveFromPlayer(te, self, 0);\r
1459                         }\r
1460                         if (CTF_Map == 1 && te.goal_no == 1)\r
1461                         {\r
1462                                 bprint(self.netname);\r
1463                                 bprint(" ÌÏÓÔ the ÂÌÕÅ flag!\n");\r
1464                         }\r
1465                         else\r
1466                         {\r
1467                                 if (CTF_Map == 1 && te.goal_no == 2)\r
1468                                 {\r
1469                                         bprint(self.netname);\r
1470                                         bprint(" ÌÏÓÔ the ÒÅÄ flag!\n");\r
1471                                 }\r
1472                         }\r
1473                 }\r
1474                 te = find(te, classname, "item_tfgoal");\r
1475         }\r
1476         te = find(world, classname, "detpack");\r
1477         while (te)\r
1478         {\r
1479                 if (te.weaponmode == 1 && te.enemy == self)\r
1480                 {\r
1481                         te.weaponmode = 0;\r
1482                 }\r
1483                 te = find(te, classname, "detpack");\r
1484         }\r
1485 //      TeamFortress_DetonatePipebombs(); gold. this is the old code for removing pipebombs on quitting.  new one written by pablo is below.\r
1486         // NO PIPEBOMBS IN NEXTF\r
1487 /*      te = find(world, classname, "pipebomb");\r
1488         while (te != world)\r
1489         {\r
1490                 if(te.owner == self)\r
1491                 {\r
1492                         decrement_team_pipebombs(self.team_no);\r
1493                         deathmsg = te.weapon;\r
1494                         te.weapon = 10;\r
1495                         T_RadiusDamage(te, self, 120, world);\r
1496                         WriteByte(4, 23);\r
1497                         WriteByte(4, 3);\r
1498                         WriteCoord(4, te.origin_x);\r
1499                         WriteCoord(4, te.origin_y);\r
1500                         WriteCoord(4, te.origin_z);\r
1501                         multicast(te.origin, TF_FLARE_OFF);\r
1502                         dremove(te);\r
1503                 }\r
1504         te = find(te, classname, "pipebomb");\r
1505         }*/\r
1506 //      stuffcmd(self, "v_idlescale 0\n");\r
1507 //      stuffcmd(self, "v_cshift 0 0 0 0\n");\r
1508 //      self.item_list = 0;                     // To Be Added?\r
1509 //      self.FlashTime = 0;\r
1510         CenterPrint(self, "\n");\r
1511         self.menu_count = 25;           // Menu Stuff - important\r
1512         self.current_menu = 1;          ////\r
1513         self.impulse = 0;\r
1514 };\r
1515 \r
1516 // TF's Become Explosion\r
1517 void() BecomeExplosion = \r
1518 {\r
1519         dremove(self);\r
1520 };\r
1521 \r
1522 // TF Alias Maker\r
1523 void(string halias, float himpulse1, float himpulse2) TeamFortress_Alias = \r
1524 {\r
1525         local string imp;\r
1526         stuffcmd(self, "alias ");\r
1527         stuffcmd(self, halias);\r
1528         stuffcmd(self, " \"impulse ");\r
1529         imp = ftos(himpulse1);\r
1530         stuffcmd(self, imp);\r
1531         if (himpulse2 != 0)\r
1532         {\r
1533                 stuffcmd(self, ";wait; impulse ");\r
1534                 imp = ftos(himpulse2);\r
1535                 stuffcmd(self, imp);\r
1536         }\r
1537         stuffcmd(self, "\"\n");\r
1538 };\r
1539 \r
1540 float (float tno) TeamFortress_TeamGetIllegalClasses =\r
1541 {\r
1542         if ((tno == 1))\r
1543         {\r
1544                 return (illegalclasses1);\r
1545         }\r
1546         if ((tno == 2))\r
1547         {\r
1548                 return (illegalclasses2);\r
1549         }\r
1550         if ((tno == 3))\r
1551         {\r
1552                 return (illegalclasses3);\r
1553         }\r
1554         if ((tno == 4))\r
1555         {\r
1556                 return (illegalclasses4);\r
1557         }\r
1558         return (0);\r
1559 };\r
1560 \r
1561 // Check if legal class\r
1562 float (float tno, entity chkr, float NumOnTeam) Check_Class_Scout =\r
1563 {\r
1564         if (tno == 1)\r
1565         {\r
1566                 if (chkr.team1_scout == -1)\r
1567                         return (0);\r
1568                 if (chkr.team1_scout != 0 && chkr.team1_scout == NumOnTeam)\r
1569                         return (0);\r
1570                 else\r
1571                         return (1);\r
1572         }\r
1573         if (tno == 2)\r
1574         {\r
1575                 if (chkr.team2_scout == -1)\r
1576                         return (0);\r
1577                 if (chkr.team2_scout != 0 && chkr.team2_scout == NumOnTeam)\r
1578                         return (0);\r
1579                 else\r
1580                         return (1);\r
1581         }\r
1582         if (tno == 3)\r
1583         {\r
1584                 if (chkr.team3_scout == -1)\r
1585                         return (0);\r
1586                 if (chkr.team3_scout != 0 && chkr.team3_scout == NumOnTeam)\r
1587                         return (0);\r
1588                 else\r
1589                         return (1);\r
1590         }\r
1591         if (tno == 4)\r
1592         {\r
1593                 if (chkr.team4_scout == -1)\r
1594                         return (0);\r
1595                 if (chkr.team4_scout != 0 && chkr.team4_scout == NumOnTeam)\r
1596                         return (0);\r
1597                 else\r
1598                         return (1);\r
1599         }\r
1600 };\r
1601 \r
1602 float (float tno, entity chkr, float NumOnTeam) Check_Class_Soldier =\r
1603 {\r
1604         if (tno == 1)\r
1605         {\r
1606                 if (chkr.team1_soldier == -1)\r
1607                         return (0);\r
1608                 if (chkr.team1_soldier != 0 && chkr.team1_soldier == NumOnTeam)\r
1609                         return (0);\r
1610                 else\r
1611                         return (1);\r
1612         }\r
1613         if (tno == 2)\r
1614         {\r
1615                 if (chkr.team2_soldier == -1)\r
1616                         return (0);\r
1617                 if (chkr.team2_soldier != 0 && chkr.team2_soldier == NumOnTeam)\r
1618                         return (0);\r
1619                 else\r
1620                         return (1);\r
1621         }\r
1622         if (tno == 3)\r
1623         {\r
1624                 if (chkr.team3_soldier == -1)\r
1625                         return (0);\r
1626                 if (chkr.team3_soldier != 0 && chkr.team3_soldier == NumOnTeam)\r
1627                         return (0);\r
1628                 else\r
1629                         return (1);\r
1630         }\r
1631         if (tno == 4)\r
1632         {\r
1633                 if (chkr.team4_soldier == -1)\r
1634                         return (0);\r
1635                 if (chkr.team4_soldier != 0 && chkr.team4_soldier == NumOnTeam)\r
1636                         return (0);\r
1637                 else\r
1638                         return (1);\r
1639         }\r
1640 };\r
1641 \r
1642 float (float tno, entity chkr, float NumOnTeam) Check_Class_Medic =\r
1643 {\r
1644         if (tno == 1)\r
1645         {\r
1646                 if (chkr.team1_medic == -1)\r
1647                         return (0);\r
1648                 if (chkr.team1_medic != 0 && chkr.team1_medic == NumOnTeam)\r
1649                         return (0);\r
1650                 else\r
1651                         return (1);\r
1652         }\r
1653         if (tno == 2)\r
1654         {\r
1655                 if (chkr.team2_medic == -1)\r
1656                         return (0);\r
1657                 if (chkr.team2_medic != 0 && chkr.team2_medic == NumOnTeam)\r
1658                         return (0);\r
1659                 else\r
1660                         return (1);\r
1661         }\r
1662         if (tno == 3)\r
1663         {\r
1664                 if (chkr.team3_medic == -1)\r
1665                         return (0);\r
1666                 if (chkr.team3_medic != 0 && chkr.team3_medic == NumOnTeam)\r
1667                         return (0);\r
1668                 else\r
1669                         return (1);\r
1670         }\r
1671         if (tno == 4)\r
1672         {\r
1673                 if (chkr.team4_medic == -1)\r
1674                         return (0);\r
1675                 if (chkr.team4_medic != 0 && chkr.team4_medic == NumOnTeam)\r
1676                         return (0);\r
1677                 else\r
1678                         return (1);\r
1679         }\r
1680 };\r
1681 \r
1682 float (float tno, entity chkr, float NumOnTeam) Check_Class_Pyro =\r
1683 {\r
1684         if (tno == 1)\r
1685         {\r
1686                 if (chkr.team1_pyro == -1)\r
1687                         return (0);\r
1688                 if (chkr.team1_pyro != 0 && chkr.team1_pyro == NumOnTeam)\r
1689                         return (0);\r
1690                 else\r
1691                         return (1);\r
1692         }\r
1693         if (tno == 2)\r
1694         {\r
1695                 if (chkr.team2_pyro == -1)\r
1696                         return (0);\r
1697                 if (chkr.team2_pyro != 0 && chkr.team2_pyro == NumOnTeam)\r
1698                         return (0);\r
1699                 else\r
1700                         return (1);\r
1701         }\r
1702         if (tno == 3)\r
1703         {\r
1704                 if (chkr.team3_pyro == -1)\r
1705                         return (0);\r
1706                 if (chkr.team3_pyro != 0 && chkr.team3_pyro == NumOnTeam)\r
1707                         return (0);\r
1708                 else\r
1709                         return (1);\r
1710         }\r
1711         if (tno == 4)\r
1712         {\r
1713                 if (chkr.team4_pyro == -1)\r
1714                         return (0);\r
1715                 if (chkr.team4_pyro != 0 && chkr.team4_pyro == NumOnTeam)\r
1716                         return (0);\r
1717                 else\r
1718                         return (1);\r
1719         }\r
1720 };\r
1721 \r
1722 float (float tno, entity chkr, float NumOnTeam) Check_Class_Engineer =\r
1723 {\r
1724         if (tno == 1)\r
1725         {\r
1726                 if (chkr.team1_engineer == -1)\r
1727                         return (0);\r
1728                 if (chkr.team1_engineer != 0 && chkr.team1_engineer == NumOnTeam)\r
1729                         return (0);\r
1730                 else\r
1731                         return (1);\r
1732         }\r
1733         if (tno == 2)\r
1734         {\r
1735                 if (chkr.team2_engineer == -1)\r
1736                         return (0);\r
1737                 if (chkr.team2_engineer != 0 && chkr.team2_engineer == NumOnTeam)\r
1738                         return (0);\r
1739                 else\r
1740                         return (1);\r
1741         }\r
1742         if (tno == 3)\r
1743         {\r
1744                 if (chkr.team3_engineer == -1)\r
1745                         return (0);\r
1746                 if (chkr.team3_engineer != 0 && chkr.team3_engineer == NumOnTeam)\r
1747                         return (0);\r
1748                 else\r
1749                         return (1);\r
1750         }\r
1751         if (tno == 4)\r
1752         {\r
1753                 if (chkr.team4_engineer == -1)\r
1754                         return (0);\r
1755                 if (chkr.team4_engineer != 0 && chkr.team4_engineer == NumOnTeam)\r
1756                         return (0);\r
1757                 else\r
1758                         return (1);\r
1759         }\r
1760 };\r
1761 \r
1762 float (float tno, entity chkr, float NumOnTeam) Check_Class_Spy =\r
1763 {\r
1764         if (tno == 1)\r
1765         {\r
1766                 if (chkr.team1_spy == -1)\r
1767                         return (0);\r
1768                 if (chkr.team1_spy != 0 && chkr.team1_spy == NumOnTeam)\r
1769                         return (0);\r
1770                 else\r
1771                         return (1);\r
1772         }\r
1773         if (tno == 2)\r
1774         {\r
1775                 if (chkr.team2_spy == -1)\r
1776                         return (0);\r
1777                 if (chkr.team2_spy != 0 && chkr.team2_spy == NumOnTeam)\r
1778                         return (0);\r
1779                 else\r
1780                         return (1);\r
1781         }\r
1782         if (tno == 3)\r
1783         {\r
1784                 if (chkr.team3_spy == -1)\r
1785                         return (0);\r
1786                 if (chkr.team3_spy != 0 && chkr.team3_spy == NumOnTeam)\r
1787                         return (0);\r
1788                 else\r
1789                         return (1);\r
1790         }\r
1791         if (tno == 4)\r
1792         {\r
1793                 if (chkr.team4_spy == -1)\r
1794                         return (0);\r
1795                 if (chkr.team4_spy != 0 && chkr.team4_spy == NumOnTeam)\r
1796                         return (0);\r
1797                 else\r
1798                         return (1);\r
1799         }\r
1800 };\r
1801 \r
1802 float (float pc) IsLegalClass =\r
1803 {\r
1804         local float bit;\r
1805         local float NumOnTeam;\r
1806         local entity te;\r
1807 \r
1808 // Team:Nexuiz class check\r
1809         local entity findme;\r
1810         local float yesorno;\r
1811 \r
1812         findme = find (world,classname,"class_restrictions");\r
1813 //      findme = find (world, classname, "info_tfdetect");\r
1814         if (findme)\r
1815         {\r
1816                 // first, find the number of players of that class on a team\r
1817                 te = find (world, classname, "player");\r
1818                 while (te)\r
1819                 {\r
1820                         if (te.playerclass == pc)\r
1821                         {\r
1822                                 if (te.team_no == self.team_no)\r
1823                                 {\r
1824                                         NumOnTeam = NumOnTeam + 1;\r
1825                                 }\r
1826                         }\r
1827                         te = find (te, classname, "player");\r
1828                 }\r
1829 \r
1830                 // next we check to see if the team is allowed to have that player class and the amount per team allowed for that class\r
1831                 if (pc == TF_CLASS_SCOUT)\r
1832                         yesorno = Check_Class_Scout(self.team_no, findme, NumOnTeam);\r
1833                 else if (pc == TF_CLASS_SOLDIER)\r
1834                         yesorno = Check_Class_Soldier(self.team_no, findme, NumOnTeam);\r
1835                 else if (pc == TF_CLASS_MEDIC)\r
1836                         yesorno = Check_Class_Medic(self.team_no, findme, NumOnTeam);\r
1837                 else if (pc == TF_CLASS_PYRO)\r
1838                         yesorno = Check_Class_Pyro(self.team_no, findme, NumOnTeam);\r
1839                 else if (pc == TF_CLASS_ENGINEER)\r
1840                         yesorno = Check_Class_Engineer(self.team_no, findme, NumOnTeam);\r
1841                 else if (pc == TF_CLASS_SPY)\r
1842                         yesorno = Check_Class_Spy(self.team_no, findme, NumOnTeam);\r
1843 \r
1844                 return (yesorno);\r
1845         }\r
1846 \r
1847 /*      if (((spy_off == 1) && (pc == 8)))\r
1848         {\r
1849                 return (0);\r
1850         }*/\r
1851         if ((pc == 1))\r
1852         {\r
1853                 bit = 1;\r
1854         }\r
1855         else\r
1856         {\r
1857                 if ((pc == 2))\r
1858                 {\r
1859                         bit = 2;\r
1860                 }\r
1861                 else\r
1862                 {\r
1863                         if ((pc == 3))\r
1864                         {\r
1865                                 bit = 4;\r
1866                         }\r
1867                         else\r
1868                         {\r
1869                                 if ((pc == 4))\r
1870                                 {\r
1871                                         bit = 8;\r
1872                                 }\r
1873                                 else\r
1874                                 {\r
1875                                         if ((pc == 5))\r
1876                                         {\r
1877                                                 bit = 16;\r
1878                                         }\r
1879                                         else\r
1880                                         {\r
1881                                                 if ((pc == 6))\r
1882                                                 {\r
1883                                                         bit = 32;\r
1884                                                 }\r
1885                                                 else\r
1886                                                 {\r
1887                                                         if ((pc == 7))\r
1888                                                         {\r
1889                                                                 bit = 64;\r
1890                                                         }\r
1891                                                         else\r
1892                                                         {\r
1893                                                                 if ((pc == 8))\r
1894                                                                 {\r
1895                                                                         bit = 256;\r
1896                                                                 }\r
1897                                                                 else\r
1898                                                                 {\r
1899                                                                         if ((pc == 9))\r
1900                                                                         {\r
1901                                                                                 bit = 512;\r
1902                                                                         }\r
1903                                                                         else\r
1904                                                                         {\r
1905                                                                                 if ((pc == 10))\r
1906                                                                                 {\r
1907                                                                                         bit = 128;\r
1908                                                                                 }\r
1909                                                                         }\r
1910                                                                 }\r
1911                                                         }\r
1912                                                 }\r
1913                                         }\r
1914                                 }\r
1915                         }\r
1916                 }\r
1917         }\r
1918         if (((illegalclasses & bit) || (TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)))\r
1919         {\r
1920                 return (0);\r
1921         }\r
1922         return (1);\r
1923 };\r
1924 \r
1925 // Display legal classes for map\r
1926 void () TeamFortress_DisplayLegalClasses =\r
1927 {\r
1928         local float gotone;\r
1929         local float ill;\r
1930 \r
1931         sprint (self, "Legal Classes for your team are:\n");\r
1932         gotone = 0;\r
1933         ill = TeamFortress_TeamGetIllegalClasses (self.team_no);\r
1934         if ((!(illegalclasses & 1) && !(ill & 1)))\r
1935         {\r
1936                 if (gotone)\r
1937                 {\r
1938                         sprint (self, ", ");\r
1939                 }\r
1940                 gotone = 1;\r
1941                 sprint (self, "Scout");\r
1942         }\r
1943 /*      if ((!(illegalclasses & 2) && !(ill & 2)))\r
1944         {\r
1945                 if (gotone)\r
1946                 {\r
1947                         sprint (self, ", ");\r
1948                 }\r
1949                 gotone = 1;\r
1950                 sprint (self, "Sniper");\r
1951         }*/\r
1952         if ((!(illegalclasses & 4) && !(ill & 4)))\r
1953         {\r
1954                 if (gotone)\r
1955                 {\r
1956                         sprint (self, ", ");\r
1957                 }\r
1958                 gotone = 1;\r
1959                 sprint (self, "Soldier");\r
1960         }\r
1961         if ((!(illegalclasses & 8) && !(ill & 8)))\r
1962         {\r
1963                 if (gotone)\r
1964                 {\r
1965                         sprint (self, ", ");\r
1966                 }\r
1967                 gotone = 1;\r
1968                 sprint (self, "Demolitions Man");\r
1969         }\r
1970         if ((!(illegalclasses & 16) && !(ill & 16)))\r
1971         {\r
1972                 if (gotone)\r
1973                 {\r
1974                         sprint (self, ", ");\r
1975                 }\r
1976                 gotone = 1;\r
1977                 sprint (self, "Combat Medic");\r
1978         }\r
1979         if ((!(illegalclasses & 32) && !(ill & 32)))\r
1980         {\r
1981                 if (gotone)\r
1982                 {\r
1983                         sprint (self, ", ");\r
1984                 }\r
1985                 gotone = 1;\r
1986                 sprint (self, "Heavy Weapons Guy");\r
1987         }\r
1988         if ((!(illegalclasses & 64) && !(ill & 64)))\r
1989         {\r
1990                 if (gotone)\r
1991                 {\r
1992                         sprint (self, ", ");\r
1993                 }\r
1994                 gotone = 1;\r
1995                 sprint (self, "Pyro");\r
1996         }\r
1997         if ((!(illegalclasses & 256) && !(ill & 256)))\r
1998         {\r
1999                 if (gotone)\r
2000                 {\r
2001                         sprint (self, ", ");\r
2002                 }\r
2003                 gotone = 1;\r
2004                 sprint (self, "Spy");\r
2005         }\r
2006         if ((!(illegalclasses & 512) && !(ill & 512)))\r
2007         {\r
2008                 if (gotone)\r
2009                 {\r
2010                         sprint (self, ", ");\r
2011                 }\r
2012                 gotone = 1;\r
2013                 sprint (self, "Engineer");\r
2014         }\r
2015         if ((!(illegalclasses & 128) && !(ill & 128)))\r
2016         {\r
2017                 if (gotone)\r
2018                 {\r
2019                         sprint (self, ", ");\r
2020                 }\r
2021                 gotone = 1;\r
2022                 sprint (self, "RandomPC");\r
2023         }\r
2024         sprint (self, "\n");\r
2025 };\r
2026 \r
2027 // TF class change/select function\r
2028 void() TeamFortress_ChangeClass = \r
2029 {\r
2030 //      local float tc;\r
2031 //      local string st;\r
2032 \r
2033         self.impulse += 100;            //temp\r
2034 \r
2035         if (self.playerclass != 0)\r
2036         {\r
2037 //              if (deathmatch != 3)\r
2038 //              {\r
2039 //                      return;\r
2040 //              }\r
2041                 if (TeamFortress_TeamIsCivilian(self.team_no))\r
2042                 {\r
2043                         sprint(self, "You cannot change class.\n");\r
2044                         return;\r
2045                 }\r
2046                 if (!IsLegalClass(self.impulse - 100))\r
2047                 {\r
2048                         sprint(self, "Your team cannot play that class.\n");\r
2049                         TeamFortress_DisplayLegalClasses();\r
2050                         return;\r
2051                 }\r
2052 /*              tc = IsRestrictedClass(self.impulse - 100);                     // TBA ADD THIS FUNCTION\r
2053                 if (tc != 0)                                                                            // it's actually a megatf function\r
2054                 {                                                                                                       // -- gonna need cvars for it\r
2055                         if (tc > 0)\r
2056                         {\r
2057                                 sprint(self, "That class is restricted to ");\r
2058                                 st = ftos(tc);\r
2059                                 sprint(self, st);\r
2060                                 sprint(self, " per team.\n");\r
2061                         }\r
2062                         else\r
2063                         {\r
2064                                 sprint(self, "That class is disabled.\n");\r
2065                         }\r
2066                         return;\r
2067                 }*/\r
2068                 self.nextpc = self.impulse - 100;\r
2069                 sprint(self, "After dying, you will return as a ");\r
2070                 TeamFortress_PrintClassName(self, self.nextpc, self.tfstate & 8);\r
2071                 self.immune_to_check = time + 10;\r
2072                 return;\r
2073         }\r
2074 /*if (teamplay && self.team_no == 0)            //handled in cmd function\r
2075         {\r
2076                 if (toggleflags & 64)\r
2077                 {\r
2078                         if (TeamFortress_TeamPutPlayerInTeam() == 0)\r
2079                         {\r
2080                                 return;\r
2081                         }\r
2082                 }\r
2083                 else\r
2084                 {\r
2085                         sprint(self, "You must join a team first. \n");\r
2086                         sprint(self, "use imin1, imin2, imin3, or imin4\n");\r
2087                         return;\r
2088                 }\r
2089         }*/\r
2090         if (self.lives == 0)\r
2091         {\r
2092                 sprint(self, "You have no lives left.\n");\r
2093                 return;\r
2094         }\r
2095         if (!IsLegalClass(self.impulse - 100) && self.impulse != 1)\r
2096         {\r
2097                 sprint(self, "You cannot play that playerclass on this map. \n");\r
2098                 TeamFortress_DisplayLegalClasses();\r
2099                 return;\r
2100         }\r
2101 \r
2102 /*      tc = IsRestrictedClass(self.impulse - 100);                     // TBA\r
2103         if (tc != 0)\r
2104         {\r
2105                 if (tc > 0)\r
2106                 {\r
2107                         sprint(self, "That class is restricted to ");\r
2108                         st = ftos(tc);\r
2109                         sprint(self, st);\r
2110                         sprint(self, " per team.\n");\r
2111                 }\r
2112                 else\r
2113                 {\r
2114                         sprint(self, "That class is disabled.\n");\r
2115                 }\r
2116                 return;\r
2117         }*/\r
2118         if (self.impulse != 1 && !TeamFortress_TeamIsCivilian(self.team_no))\r
2119         {\r
2120                 self.playerclass = self.impulse - 100;\r
2121         }\r
2122         else\r
2123         {\r
2124                 self.playerclass = TF_CLASS_CIVILIAN;\r
2125         }\r
2126         if (self.playerclass == TF_CLASS_RANDOM)\r
2127         {               \r
2128                 sprint(self, "Random Playerclass.\n");\r
2129                 self.tfstate = self.tfstate | 8;\r
2130 /*              tc = 1 + floor(random() * (10 - 1));\r
2131                 while (IsRestrictedClass(tc) != 0)\r
2132                 {\r
2133                         tc = 1 + floor(random() * (10 - 1));\r
2134                 }*/\r
2135 //              self.playerclass = tc;\r
2136                 self.playerclass = 10;\r
2137                 ChooseRandomClass();\r
2138         }\r
2139         //ftos(TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)\r
2140 \r
2141         PutClientInServer ();           //temp\r
2142 };\r
2143 \r
2144 // XavioR's new TF reload function\r
2145 void (float o, float m, void () g) weapon_thinkf;\r
2146 void () Reload_Restore_Weapon =\r
2147 {\r
2148         if (self.owner.weaponentity.pos1 != '0 0 0')\r
2149         {\r
2150                 self.owner.weaponentity.pos1 = '0 0 0';\r
2151                 self.owner.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
2152         }\r
2153 };\r
2154 \r
2155 void (float rweapon, float amount) DoReload =\r
2156 {\r
2157         local float rtime;\r
2158 \r
2159         if (self.reload_time > time)\r
2160                 return;\r
2161         if (amount == 0)\r
2162                 return;\r
2163 \r
2164         weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now\r
2165         if (rweapon != 5)\r
2166                 sprint(self, "Reloading...\n");\r
2167 \r
2168         if (rweapon == 1)               // Pistol\r
2169         {\r
2170                 rtime = (amount * .35);\r
2171                 self.clip_pistol = CLIP_MAX_PISTOL;\r
2172         }\r
2173         if (rweapon == 2)               // CryLink (flak cannon)\r
2174         {\r
2175                 rtime = (amount * .80);\r
2176                 self.clip_crylink = CLIP_MAX_CRYLINK;\r
2177         }\r
2178         if (rweapon == 3)               // Rocket launcher\r
2179         {\r
2180                 rtime = (amount * 1.30);\r
2181                 self.clip_rockets = 4;\r
2182         }\r
2183         if (rweapon == 4)               // Pipe Grenade Launcher\r
2184         {\r
2185                 rtime = (amount * 1.05);\r
2186                 self.clip_pipegrenades = 6;\r
2187         }\r
2188         if (rweapon == 5)               // Building something... (senrtry gun, tesla, etc.)\r
2189         {\r
2190                 rtime = amount;\r
2191         }\r
2192 \r
2193         self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE;\r
2194         self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
2195         newmis = spawn();\r
2196         newmis.owner = self;\r
2197         newmis.think = Reload_Restore_Weapon;\r
2198         newmis.nextthink = time + rtime;\r
2199 \r
2200         self.reload_time = time + rtime;\r
2201 };\r
2202 \r
2203 // Xavior's self.playerclass to self.class conversion\r
2204 string(string s1, ...) strcat;\r
2205 void () Do_TFClass_Conversion =\r
2206 {\r
2207         local float cl;\r
2208         local string cst;\r
2209 \r
2210         if (self.respawn_as_new_class > 0)\r
2211         {\r
2212                 self.playerclass = self.respawn_as_new_class;\r
2213                 self.respawn_as_new_class = 0;\r
2214                 return;\r
2215         }\r
2216 \r
2217         if (self.playerclass == TF_CLASS_CIVILIAN) {\r
2218                 self.class = CLASS_CIVILIAN;\r
2219                 cst = "civilian"; }\r
2220         if (self.playerclass == TF_CLASS_SCOUT) {\r
2221                 self.class = CLASS_SCOUT;\r
2222                 cst = "scout"; }\r
2223         if (self.playerclass == TF_CLASS_SOLDIER) {\r
2224                 self.class = CLASS_SOLDIER;\r
2225                 cst = "soldier"; }\r
2226         if (self.playerclass == TF_CLASS_MEDIC) {\r
2227                 self.class = CLASS_MEDIC;\r
2228                 cst = "medic"; }\r
2229         if (self.playerclass == TF_CLASS_PYRO) {\r
2230                 self.class = CLASS_PYRO;\r
2231                 cst = "pyro"; }\r
2232         if (self.playerclass == TF_CLASS_SPY) {\r
2233                 self.class = CLASS_SPY;\r
2234                 cst = "spy"; }\r
2235         if (self.playerclass == TF_CLASS_ENGINEER) {\r
2236                 self.class = CLASS_ENGINEER;\r
2237                 cst = "engineer"; }\r
2238         if (self.playerclass == TF_CLASS_RANDOM || self.tfstate == self.tfstate | 8) {\r
2239                 cst = ChooseRandomClass(); }\r
2240         // Note to self: add Random and Civilian\r
2241 \r
2242         cl = GetPlayerClass();\r
2243 \r
2244         if (!self.class == cl)\r
2245         {\r
2246                 if (cst == "civilian")\r
2247                 {\r
2248                         self.playermodel = strcat("models/class/",cst,".zym");\r
2249                 }\r
2250                 else if (cst == "engineer")\r
2251                 {\r
2252                         self.playermodel = strcat("models/class/",cst,"_other.zym");\r
2253                 }\r
2254                 else\r
2255                 {\r
2256                         self.playermodel = strcat("models/class/",cst,"_mechanical.zym");\r
2257                 }\r
2258         }\r
2259         SetPlayerSpeed(self);\r
2260 };\r
2261 \r
2262 // XavioR's Random Class select\r
2263 string () ChooseRandomClass =\r
2264 {\r
2265         local float choose;\r
2266         local float good;\r
2267 \r
2268         while (good < 1)\r
2269         {\r
2270                 choose = (1 + floor ((random () * (10 - 1))));\r
2271                 if (IsLegalClass(choose) && choose != TF_CLASS_SNIPER && choose != TF_CLASS_DEMOMAN && choose != TF_CLASS_HWGUY)\r
2272                 {\r
2273                         good = 1;\r
2274 //                      sprint (self, ftos(choose));\r
2275 //                      sprint (self, "\n");\r
2276                         if (choose == TF_CLASS_SCOUT) {\r
2277                                 self.class = CLASS_SCOUT;\r
2278                                 return ("scout"); }\r
2279                         if (choose == TF_CLASS_SOLDIER) {\r
2280                                 self.class = CLASS_SOLDIER;\r
2281                                 return ("soldier"); }\r
2282                         if (choose == TF_CLASS_PYRO) {\r
2283                                 self.class = CLASS_PYRO;\r
2284                                 return ("pyro"); }\r
2285                         if (choose == TF_CLASS_ENGINEER) {\r
2286                                 self.class = CLASS_ENGINEER;\r
2287                                 return ("engineer"); }\r
2288                         if (choose == TF_CLASS_MEDIC) {\r
2289                                 self.class = CLASS_MEDIC;\r
2290                                 return ("medic"); }\r
2291                         if (choose == TF_CLASS_SPY) {\r
2292                                 self.class = CLASS_SPY;\r
2293                                 return ("spy"); }\r
2294                 }\r
2295         }\r
2296 };\r
2297 \r
2298 // Nail projectile and blood\r
2299 float current_yaw;\r
2300 float (float fl) anglemod =\r
2301 {\r
2302         while (fl >= 360)\r
2303         {\r
2304                 fl = fl - 360;\r
2305         }\r
2306         while (fl < 0)\r
2307         {\r
2308                 fl = fl + 360;\r
2309         }\r
2310         return (fl);\r
2311 };\r
2312 \r
2313 vector () wall_velocity =\r
2314 {\r
2315         local vector vel;\r
2316 \r
2317         vel = normalize (self.velocity);\r
2318         vel = normalize (((vel + (v_up * (random () - 0.5))) + (v_right * (random () - 0.5))));\r
2319         vel = (vel + (2 * trace_plane_normal));\r
2320         vel = (vel * 200);\r
2321         return (vel);\r
2322 };\r
2323 \r
2324 void (vector org, float damage) SpawnBlood =\r
2325 {\r
2326         particle (org, '0 0 0', 73, (damage * 2));\r
2327 };\r
2328 \r
2329 void (float damage) spawn_touchblood =\r
2330 {\r
2331         local vector vel;\r
2332 \r
2333         vel = (wall_velocity () * 0.2);\r
2334         SpawnBlood ((self.origin + (vel * 0.01)), damage);\r
2335 };\r
2336 \r
2337 void () superspike_touch =\r
2338 {\r
2339         local float ndmg;\r
2340 \r
2341 /*      if (self.voided)                                // temp?\r
2342         {\r
2343                 return;\r
2344         }\r
2345         self.voided = 1;*/\r
2346         if (other == self.owner)\r
2347         {\r
2348                 return;\r
2349         }\r
2350         if (other.solid == 1)\r
2351         {\r
2352                 return;\r
2353         }\r
2354         if (pointcontents (self.origin) == -6)\r
2355         {\r
2356                 dremove (self);\r
2357                 return;\r
2358         }\r
2359         if (other.takedamage)\r
2360         {\r
2361                 spawn_touchblood (18);\r
2362                 deathmsg = self.weapon;\r
2363                 if ((deathmsg == 9))\r
2364                 {\r
2365                         ndmg = 13;\r
2366                 }\r
2367                 else\r
2368                 {\r
2369                         ndmg = 26;\r
2370                 }\r
2371                 if (self.owner.classname == "grenade")\r
2372                 {\r
2373                         TF_T_Damage (other, self, self.owner.owner, ndmg, 2, 2);\r
2374                 }\r
2375                 else\r
2376                 {\r
2377                         TF_T_Damage (other, self, self.owner, ndmg, 2, 2);\r
2378                 }\r
2379         }\r
2380         else\r
2381         {\r
2382                 WriteByte (0, 23);\r
2383                 WriteByte (0, 1);\r
2384                 WriteCoord (0, self.origin_x);\r
2385                 WriteCoord (0, self.origin_y);\r
2386                 WriteCoord (0, self.origin_z);\r
2387         }\r
2388         dremove (self);\r
2389 };\r
2390 \r
2391 void () spike_touch =\r
2392 {\r
2393         if (other.solid == 1)\r
2394         {\r
2395                 return;\r
2396         }\r
2397         if (pointcontents (self.origin) == -6)\r
2398         {\r
2399                 dremove (self);\r
2400                 return;\r
2401         }\r
2402         if (other.takedamage)\r
2403         {\r
2404                 spawn_touchblood (9);\r
2405                 deathmsg = self.weapon;\r
2406                 if (self.owner.classname == "grenade")\r
2407                 {\r
2408                         TF_T_Damage (other, self, self.owner.owner, 9, 2, 2);\r
2409                 }\r
2410                 else\r
2411                 {\r
2412                         TF_T_Damage (other, self, self.owner, 9, 2, 2);\r
2413                 }\r
2414         }\r
2415         else\r
2416         {\r
2417                 WriteByte (4, 23);\r
2418                 if ((self.classname == "wizspike"))\r
2419                 {\r
2420                         WriteByte (4, 7);\r
2421                 }\r
2422                 else\r
2423                 {\r
2424                         if ((self.classname == "knightspike"))\r
2425                         {\r
2426                                 WriteByte (4, 8);\r
2427                         }\r
2428                         else\r
2429                         {\r
2430                                 WriteByte (4, 0);\r
2431                         }\r
2432                 }\r
2433                 WriteCoord (4, self.origin_x);\r
2434                 WriteCoord (4, self.origin_y);\r
2435                 WriteCoord (4, self.origin_z);\r
2436         }\r
2437         dremove (self);\r
2438 };\r
2439 \r
2440 void(vector org) te_gunshot;\r
2441 float   EF_ADDITIVE/*     = 32*/;\r
2442 void () ChangeModelTime =\r
2443 {\r
2444         if (self.owner)\r
2445                 setmodel (self.owner, self.classname);\r
2446         dremove(self);\r
2447 };\r
2448 \r
2449 void (entity ent, string st, float wait_time) soonmodel =\r
2450 {\r
2451         local entity x;\r
2452         x = spawn ();\r
2453         x.classname = st;\r
2454         x.owner = ent;\r
2455         x.nextthink = time + wait_time;\r
2456         x.think = ChangeModelTime;\r
2457 };\r
2458 \r
2459 .float scale;\r
2460 \r
2461 void (vector vect_a, vector vect_b) launch_spike =\r
2462 {\r
2463         local entity e;                 // bullet trail\r
2464 \r
2465         newmis = spawn ();\r
2466         newmis.owner = self;\r
2467         newmis.movetype = 9;\r
2468         newmis.solid = 2;\r
2469         newmis.angles = vectoangles (vect_b);\r
2470         newmis.touch = spike_touch;\r
2471         newmis.weapon = 3;\r
2472         newmis.classname = "spike";\r
2473         newmis.think = SUB_Remove;\r
2474         newmis.nextthink = (time + 3);\r
2475         if (deathmsg != 9)\r
2476         {\r
2477                 setmodel (newmis, "models/plasmatrail.mdl");\r
2478         }\r
2479         setsize (newmis, '0 0 0', '0 0 0');\r
2480         setorigin (newmis, vect_a);\r
2481         newmis.velocity = (vect_b * 2000);\r
2482 \r
2483                 e = spawn();\r
2484                 e.owner = self;\r
2485                 e.movetype = MOVETYPE_FLY;\r
2486                 e.solid = SOLID_NOT;\r
2487                 e.think = SUB_Remove;\r
2488                 e.nextthink = time + vlen(trace_endpos - self.origin) / 6000;\r
2489                 e.velocity = vect_b * 4000;\r
2490                 e.angles = vectoangles (vect_b);\r
2491                 e.scale = .3;\r
2492 //              soonmodel (e, "models/tracer.mdl", .1);\r
2493                 setmodel (e, "models/tracer.mdl");\r
2494                 setsize (e, '0 0 0', '0 0 0');\r
2495                 setorigin (e, vect_a);\r
2496                 e.effects = e.effects | EF_ADDITIVE;\r
2497 };\r
2498 \r
2499 // TF's Ammo-Updater\r
2500 void () W_SetCurrentAmmo =\r
2501 {\r
2502         weapon_action(self.weapon, WR_UPDATECOUNTS);\r
2503 };\r
2504 \r
2505 // TF Team Sprint\r
2506 void (float tno, entity ignore, string st) teamsprint =\r
2507 {\r
2508         local entity te;\r
2509 \r
2510         if ((tno == 0))\r
2511         {\r
2512                 return;\r
2513         }\r
2514         te = find (world, classname, "player");\r
2515         while (te)\r
2516         {\r
2517                 if (((te.team_no == tno) && (te != ignore)))\r
2518                 {\r
2519                         sprint (te, st);\r
2520                 }\r
2521                 te = find (te, classname, "player");\r
2522         }\r
2523 };\r
2524 \r
2525 // CENTERPRINT\r
2526 void (entity pl, string s1, string s2) CenterPrint2 =\r
2527 {\r
2528         centerprint (pl, s1, s2);\r
2529         pl.StatusRefreshTime = (time + 1.5);\r
2530 };\r
2531 \r
2532 // another ammo check caleld by the menu system. I dont know exactly what function this is for. - XavioR\r
2533 void(entity p) bound_other_ammo = \r
2534 {\r
2535         if (p.ammo_shells > TeamFortress_GetMaxAmmo(p, 256))\r
2536         {\r
2537                 p.ammo_shells = TeamFortress_GetMaxAmmo(p, 256);\r
2538         }\r
2539         if (p.ammo_nails > TeamFortress_GetMaxAmmo(p, 512))\r
2540         {\r
2541                 p.ammo_nails = TeamFortress_GetMaxAmmo(p, 512);\r
2542         }\r
2543         if (p.ammo_rockets > TeamFortress_GetMaxAmmo(p, 1024))\r
2544         {\r
2545                 p.ammo_rockets = TeamFortress_GetMaxAmmo(p, 1024);\r
2546         }\r
2547         if (p.ammo_cells > TeamFortress_GetMaxAmmo(p, 2048))\r
2548         {\r
2549                 p.ammo_cells = TeamFortress_GetMaxAmmo(p, 2048);\r
2550         }\r
2551 /*      if (p.ammo_medikit > p.maxammo_medikit)                         // addme\r
2552         {\r
2553                 p.ammo_medikit = p.maxammo_medikit;\r
2554         }*/\r
2555         if (p.armorvalue > p.maxarmor)\r
2556         {\r
2557                 p.armorvalue = p.max_armor;\r
2558         }\r
2559         if (p.no_grenades_1 > 4)\r
2560         {\r
2561                 p.no_grenades_1 = 4;\r
2562         }\r
2563         if (p.no_grenades_2 > 4)\r
2564         {\r
2565                 p.no_grenades_2 = 4;\r
2566         }\r
2567 };\r
2568 \r
2569 // TF Drop Flag Function\r
2570 void () tfgoalitem_dropthink;\r
2571 void () item_tfgoal_touch;\r
2572 void () DropFlag =\r
2573 {\r
2574         local entity Item;\r
2575         local entity te;\r
2576         local float f;\r
2577         local string st;\r
2578 \r
2579         te = find (world, classname, "item_tfgoal");\r
2580         while (te)\r
2581         {\r
2582                 if (te.owner == self)\r
2583                 {\r
2584                         Item = te;\r
2585                 }\r
2586                 te = find (te, classname, "item_tfgoal");\r
2587         }\r
2588 \r
2589         if (Item == world)\r
2590         {\r
2591                 sprint (self, "You don't have the flag.\n");    \r
2592                 return;\r
2593         }\r
2594 \r
2595         // Delay\r
2596         if (self.DropFlagDelay > time)\r
2597         {\r
2598                 sprint (self, "Can't drop again for another "); \r
2599                 f = ceil(self.DropFlagDelay - time);\r
2600                 st = ftos(f);\r
2601                 sprint (self, st);\r
2602                 sprint (self, " seconds.\n");   \r
2603                 return;\r
2604         }\r
2605         self.DropFlagDelay = time + 10;\r
2606         //\r
2607 \r
2608         // Flash of particles\r
2609         WriteByte(4, 23);\r
2610         WriteByte(4, 11);\r
2611         WriteCoord(4, self.origin_x);\r
2612         WriteCoord(4, self.origin_y);\r
2613         WriteCoord(4, self.origin_z);\r
2614 \r
2615         tfgoalitem_RemoveFromPlayer(Item, self, 2);\r
2616 \r
2617         setorigin (Item, self.origin - '0 0 -24');      // - vf*(16));// - '0 0 15');   //Item.origin = self.origin + v_forward*56 + '0 0 8';\r
2618         Item.velocity = '0 0 1';                //((vf * 150) + '0 0 150';\r
2619                                                         //gold.  i didn't even have to change the origin, just the velocity. used to be '0 0 150'\r
2620         Item.goal_state = 2;\r
2621         Item.movetype = 6;\r
2622         Item.solid = TF_FLARE_OFF;\r
2623         setsize(Item, '-16 -16 0', '16 16 56');\r
2624         if (Item.mdl != string_null)\r
2625         {\r
2626                 setmodel(Item, Item.mdl);\r
2627         }\r
2628         Item.option5 = time + 2;\r
2629         Item.tent = self;\r
2630         \r
2631         Item.nextthink = time + 5;\r
2632         Item.think = tfgoalitem_dropthink;\r
2633         Item.touch = item_tfgoal_touch;\r
2634 }\r
2635 \r
2636 void () TeamNexuiz_GunDown =            //brings first-person gun model down\r
2637 {\r
2638         self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE;\r
2639         self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
2640 };\r
2641 void () TeamNexuiz_GunUp =                      //brings first-person gun model up\r
2642 {\r
2643         if (self.weaponentity.pos1 != '0 0 0')\r
2644         {\r
2645                 self.weaponentity.pos1 = '0 0 0';\r
2646                 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
2647         }\r
2648 };\r
2649 \r
2650 void centerprint_multi_9 (entity print_to, string str1, string str2, string str3, string str4, string str5, string str6, string str7, string str8, string str9)\r
2651 {\r
2652         local string tmsg;\r
2653 \r
2654         tmsg = strcat(str1, str2);\r
2655         tmsg = strcat(tmsg, str3);\r
2656         tmsg = strcat(tmsg, str4);\r
2657         tmsg = strcat(tmsg, str5);\r
2658         tmsg = strcat(tmsg, str6);\r
2659         tmsg = strcat(tmsg, str7);\r
2660         tmsg = strcat(tmsg, str8);\r
2661         tmsg = strcat(tmsg, str9);\r
2662         CenterPrint(print_to, tmsg);\r
2663 };\r
2664 \r