]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/tffunctions.c
- Added new backpack/tfitem property -- item_backpack gives metal ammo when var...
[divverent/nexuiz.git] / 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 string (float pc) TeamFortress_GetClassName =\r
895 {\r
896         if ((pc == 1))                  // Scout is class 1 (normal)\r
897         {\r
898                 return ("Scout");\r
899         }\r
900         else\r
901         {\r
902                 if ((pc == 2.1))\r
903                 {\r
904                         return ("Sniper");              // Player Class 2 is Spy in NexTF -- no Snipers\r
905                 }\r
906                 else\r
907                 {\r
908                         if ((pc == 4))                          // Player Class 4 is soldier in NexTF\r
909                         {\r
910                                 return ("Soldier");\r
911                         }\r
912                         else\r
913                         {\r
914                                 if ((pc == 4.1))                        // No DemoMan in NexTF\r
915                                 {\r
916                                         return ("Demolitions Man");\r
917                                 }\r
918                                 else\r
919                                 {\r
920                                         if ((pc == 16))\r
921                                         {\r
922                                                 return ("Combat Medic");                // Medic is Class 16 in NexTF\r
923                                         }\r
924                                         else\r
925                                         {\r
926                                                 if ((pc == 6.1))\r
927                                                 {\r
928                                                         return ("Heavy Weapons Guy");           // No HWGuy in NexTF\r
929                                                 }\r
930                                                 else\r
931                                                 {\r
932                                                         if ((pc == 8))\r
933                                                         {\r
934                                                                 return ("Pyro");                // Pyro is class 8 in NexTF\r
935                                                         }\r
936                                                         else\r
937                                                         {\r
938                                                                 if ((pc == 2))\r
939                                                                 {\r
940                                                                         return ("Spy");                 // Spy is class 2 in NexTF\r
941                                                                 }\r
942                                                                 else\r
943                                                                 {\r
944                                                                         if ((pc == 32))\r
945                                                                         {\r
946                                                                                 return ("Engineer");            // Engineer is class 32 in nextf\r
947                                                                         }\r
948                                                                         else\r
949                                                                         {\r
950                                                                                 if ((pc == 11))                 // Wazat- we need to make civ class\r
951                                                                                 {\r
952                                                                                         return ("Civilian");\r
953                                                                                 }\r
954                                                                                 else\r
955                                                                                 {\r
956                                                                                         if ((pc == 0))\r
957                                                                                         {\r
958                                                                                                 return ("Observer");\r
959                                                                                         }\r
960                                                                                         else\r
961                                                                                         {\r
962                                                                                                 if ((pc == 10))                 // Wazat- we need to add "random class" feature\r
963                                                                                                 {\r
964                                                                                                         return ("Random Playerclass");\r
965                                                                                                 }\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 // Prints the classname using TeamFortress_GetClassName function\r
980 void (entity Viewer, float pc, float rpc) TeamFortress_PrintClassName =\r
981 {\r
982         local string st;\r
983 \r
984         st = TeamFortress_GetClassName (pc);\r
985         sprint (Viewer, st);\r
986         if ((rpc != 0))\r
987         {\r
988                 sprint (Viewer, " (Random)");\r
989         }\r
990         sprint (Viewer, "\n");\r
991 };\r
992 \r
993 // Returns Team Color Value\r
994 //                      note: this value is actually incorrect, the actual color values are the ones listed here\r
995 //                                minus one.\r
996 float (float tno) TeamFortress_TeamGetColor =\r
997 {\r
998         if ((tno == 1))\r
999         {\r
1000                 return (14);\r
1001         }\r
1002         if ((tno == 2))\r
1003         {\r
1004                 return (5);\r
1005         }\r
1006         if ((tno == 3))\r
1007         {\r
1008                 return (13);\r
1009         }\r
1010         if ((tno == 4))\r
1011         {\r
1012                 return (12);\r
1013         }\r
1014         return (0);\r
1015 };\r
1016 \r
1017 // Returns Team Score Value\r
1018 float (float tno) TeamFortress_TeamGetScore =\r
1019 {\r
1020         if ((tno == 1))\r
1021         {\r
1022                 return (team1score);\r
1023         }\r
1024         if ((tno == 2))\r
1025         {\r
1026                 return (team2score);\r
1027         }\r
1028         if ((tno == 3))\r
1029         {\r
1030                 return (team3score);\r
1031         }\r
1032         if ((tno == 4))\r
1033         {\r
1034                 return (team4score);\r
1035         }\r
1036         return (0);\r
1037 };\r
1038 \r
1039 // Get Team Lives\r
1040 float (float tno) TeamFortress_TeamGetLives =\r
1041 {\r
1042         if ((tno == 1))\r
1043         {\r
1044                 return (team1lives);\r
1045         }\r
1046         if ((tno == 2))\r
1047         {\r
1048                 return (team2lives);\r
1049         }\r
1050         if ((tno == 3))\r
1051         {\r
1052                 return (team3lives);\r
1053         }\r
1054         if ((tno == 4))\r
1055         {\r
1056                 return (team4lives);\r
1057         }\r
1058         return (0);\r
1059 };\r
1060 \r
1061 // Show Team Scores\r
1062 void (float all) TeamFortress_TeamShowScores =\r
1063 {\r
1064         local string st;\r
1065         local float i;\r
1066         local float j;\r
1067 \r
1068         i = 1;\r
1069         if ((all == 2))\r
1070         {\r
1071                 while ((i <= number_of_teams))\r
1072                 {\r
1073                         if ((TeamFortress_TeamGetColor (i) > 0))\r
1074                         {\r
1075                                 j = TeamFortress_TeamGetScore (i);\r
1076                                 st = TeamFortress_TeamGetColorString (i);\r
1077 //                              bprint (st);\r
1078 //                              bprint (": ");\r
1079                                 bprint (st);\r
1080                                 bprint (": ");\r
1081                                 st = ftos (j);\r
1082                                 //bprint (st);\r
1083                                 //bprint (" ");\r
1084                                 bprint (st);\r
1085                                 bprint (" ");\r
1086                         }\r
1087                         i = (i + 1);\r
1088                 }\r
1089 //              bprint ("\n");\r
1090                 bprint ("\n");\r
1091                 return;\r
1092         }\r
1093         while ((i <= number_of_teams))\r
1094         {\r
1095                 if ((TeamFortress_TeamGetColor (i) > 0))\r
1096                 {\r
1097                         if (all)\r
1098                         {\r
1099                                 bprint ("Team ");\r
1100                         }\r
1101                         else\r
1102                         {\r
1103                                 sprint (self, "Team ");\r
1104                         }\r
1105                         st = ftos (i);\r
1106                         if (all)\r
1107                         {\r
1108                                 bprint (st);\r
1109                         }\r
1110                         else\r
1111                         {\r
1112                                 sprint (self, st);\r
1113                         }\r
1114                         if (all)\r
1115                         {\r
1116                                 bprint (" (");\r
1117                         }\r
1118                         else\r
1119                         {\r
1120                                 sprint (self, " (");\r
1121                         }\r
1122                         st = TeamFortress_TeamGetColorString (i);\r
1123                         if (all)\r
1124                         {\r
1125                                 bprint (st);\r
1126                         }\r
1127                         else\r
1128                         {\r
1129                                 sprint (self, st);\r
1130                         }\r
1131                         if (all)\r
1132                         {\r
1133                                 bprint (") : ");\r
1134                         }\r
1135                         else\r
1136                         {\r
1137                                 sprint (self, ") : ");\r
1138                         }\r
1139                         j = TeamFortress_TeamGetScore (i);\r
1140                         st = ftos (j);\r
1141                         if (all)\r
1142                         {\r
1143                                 bprint (st);\r
1144                         }\r
1145                         else\r
1146                         {\r
1147                                 sprint (self, st);\r
1148                         }\r
1149                         if (all)\r
1150                         {\r
1151                                 bprint ("\n");\r
1152                         }\r
1153                         else\r
1154                         {\r
1155                                 sprint (self, "\n");\r
1156                         }\r
1157                 }\r
1158                 i = (i + 1);\r
1159         }\r
1160 };\r
1161 \r
1162 // Get Number Of Players On Team\r
1163 float (float tno) TeamFortress_TeamGetNoPlayers =\r
1164 {\r
1165         local float size_team;\r
1166         local entity search;\r
1167 \r
1168         search = find (world, classname, "player");\r
1169         while ((search != world))\r
1170         {\r
1171                 if ((search.team_no == tno))\r
1172                 {\r
1173                         size_team = (size_team + 1);\r
1174                 }\r
1175                 search = find (search, classname, "player");\r
1176         }\r
1177         return (size_team);\r
1178 };\r
1179 \r
1180 // Get general number of players\r
1181 float () TeamFortress_GetNoPlayers =\r
1182 {\r
1183         local float nump;\r
1184         local entity search;\r
1185 \r
1186         search = find (world, classname, "player");\r
1187         while ((search != world))\r
1188         {\r
1189                 if ((search.netname != string_null))\r
1190                 {\r
1191                         nump = (nump + 1);\r
1192                 }\r
1193                 search = find (search, classname, "player");\r
1194         }\r
1195         return (nump);\r
1196 };\r
1197 \r
1198 // Get max players for a team\r
1199 float (float tno) TeamFortress_TeamGetMaxPlayers =\r
1200 {\r
1201         if ((tno == 1))\r
1202         {\r
1203                 return (team1maxplayers);\r
1204         }\r
1205         if ((tno == 2))\r
1206         {\r
1207                 return (team2maxplayers);\r
1208         }\r
1209         if ((tno == 3))\r
1210         {\r
1211                 return (team3maxplayers);\r
1212         }\r
1213         if ((tno == 4))\r
1214         {\r
1215                 return (team4maxplayers);\r
1216         }\r
1217         return (0);\r
1218 };\r
1219 \r
1220 // Set The Team Color\r
1221 void (float tno) TeamFortress_TeamSetColor =\r
1222 {\r
1223         if ((tno == 1))\r
1224         {\r
1225                 team1col = 14;\r
1226                 return;\r
1227         }\r
1228         if ((tno == 2))\r
1229         {\r
1230                 team2col = 5;\r
1231                 return;\r
1232         }\r
1233         if ((tno == 3))\r
1234         {\r
1235                 team3col = 13;\r
1236                 return;\r
1237         }\r
1238         if ((tno == 4))\r
1239         {\r
1240                 team4col = 12;\r
1241                 return;\r
1242         }\r
1243 };\r
1244 \r
1245 // Set The Team Number\r
1246 float (float tno) TeamFortress_TeamSet =\r
1247 {\r
1248         local string st;\r
1249         local float tc;\r
1250 \r
1251         if ((teamplay < 1))\r
1252         {\r
1253                 sprint (self, "Teamplay is not On, so FortressTeams are inactive.\n");\r
1254                 return (0);\r
1255         }\r
1256         if (((tno > number_of_teams) && (number_of_teams != 0)))\r
1257         {\r
1258                 sprint (self, "There can be only ");\r
1259                 st = ftos (number_of_teams);\r
1260                 sprint (self, st);\r
1261                 sprint (self, " teams on this map.\nTry again\n");\r
1262                 return (0);\r
1263         }\r
1264         if ((self.team_no > 0))\r
1265         {\r
1266                 sprint (self, "You're already in Team No ");\r
1267                 st = ftos (self.team_no);\r
1268                 sprint (self, st);\r
1269                 sprint (self, ".\n");\r
1270                 return (0);\r
1271         }\r
1272         tc = TeamFortress_TeamGetNoPlayers (tno);\r
1273         if ((tc >= TeamFortress_TeamGetMaxPlayers (tno)))\r
1274         {\r
1275                 sprint (self, "That team is full. Pick another.\n");\r
1276                 return (0);\r
1277         }\r
1278         if ((TeamFortress_TeamGetColor (tno) == 0))\r
1279         {\r
1280                 TeamFortress_TeamSetColor (tno);\r
1281                 if ((TeamFortress_TeamGetColor (tno) == 0))\r
1282                 {\r
1283                         sprint (self, "You can't start a new team with your color, since another ");\r
1284                         sprint (self, "already using that color. Change your pants color, then try again.\n");\r
1285                         return (0);\r
1286                 }\r
1287                 bprint (self.netname);\r
1288                 bprint (" has started Team No ");\r
1289                 st = ftos (tno);\r
1290                 bprint (st);\r
1291                 bprint (".\n");\r
1292                 self.immune_to_check = (time + 10);\r
1293                 if (((toggleflags & 128) || (toggleflags & 2048)))\r
1294                 {\r
1295                         self.frags = TeamFortress_TeamGetScore (tno);\r
1296                 }\r
1297                 stuffcmd (self, "color ");\r
1298                 tc = (TeamFortress_TeamGetColor (tno) - 1);\r
1299                 st = ftos (tc);\r
1300                 stuffcmd (self, st);\r
1301                 stuffcmd (self, "\n");\r
1302                 self.team_no = tno;\r
1303                 self.lives = TeamFortress_TeamGetLives (tno);\r
1304                 //if ((self.playerclass == 0))\r
1305                 if ((self.class == 0))\r
1306                 {\r
1307                         if (TeamFortress_TeamIsCivilian (self.team_no))\r
1308                         {\r
1309                                 self.impulse = 1;\r
1310                                 TeamFortress_ChangeClass ();\r
1311                         }\r
1312                 }\r
1313                 return (1);\r
1314         }\r
1315         bprint (self.netname);\r
1316         bprint (" has joined Team No ");\r
1317         st = ftos (tno);\r
1318         bprint (st);\r
1319         bprint (".\n");\r
1320         stuffcmd (self, "color ");\r
1321         tc = (TeamFortress_TeamGetColor (tno) - 1);\r
1322         st = ftos (tc);\r
1323         stuffcmd (self, st);\r
1324         stuffcmd (self, "\n");\r
1325         self.team_no = tno;\r
1326         self.immune_to_check = (time + 10);\r
1327         self.lives = TeamFortress_TeamGetLives (tno);\r
1328         if (((toggleflags & 128) || (toggleflags & 2048)))\r
1329         {\r
1330                 self.frags = TeamFortress_TeamGetScore (tno);\r
1331         }\r
1332         TeamFortress_TeamShowMemberClasses (self);\r
1333         //if ((self.playerclass == 0))\r
1334         if ((self.class == 0))\r
1335         {\r
1336                 if (TeamFortress_TeamIsCivilian (self.team_no))\r
1337                 {\r
1338                         self.impulse = 1;\r
1339                         TeamFortress_ChangeClass ();\r
1340                 }\r
1341         }\r
1342         return (1);\r
1343 };\r
1344 \r
1345 // Get team score (used in conjunction with autoteam..)\r
1346 float (float tno) TeamFortress_GetRealScore =\r
1347 {\r
1348         local entity te;\r
1349         local float total;\r
1350 \r
1351         te = find (world, classname, "player");\r
1352         while (te)\r
1353         {\r
1354                 if (te.team_no == tno)\r
1355                 {                       \r
1356                         total = total + te.real_frags;\r
1357                 }\r
1358                 te = find (te, classname, "player");\r
1359         }\r
1360         return total;\r
1361 }\r
1362 \r
1363 // Find best team for player (autoteam?)\r
1364 float() TeamFortress_TeamPutPlayerInTeam = \r
1365 {\r
1366         local float i;\r
1367         local float j;\r
1368         local float score1;\r
1369         local float score2;\r
1370 \r
1371         local float lowest;\r
1372         local float likely_team;\r
1373 \r
1374         i = 1;\r
1375         likely_team = random() * number_of_teams;\r
1376         likely_team = ceil(likely_team);\r
1377         if (likely_team == 0)\r
1378         {\r
1379                 likely_team = number_of_teams;\r
1380         }\r
1381 \r
1382         lowest = 33;\r
1383         while (i < number_of_teams + 1)\r
1384         {\r
1385                 j = TeamFortress_TeamGetNoPlayers(i);\r
1386                 \r
1387                 if (j < lowest)\r
1388                 {\r
1389                         if (TeamFortress_TeamGetMaxPlayers(i) > j)\r
1390                         {\r
1391                                 lowest = j;\r
1392                                 likely_team = i;\r
1393                         }\r
1394                 }\r
1395                 // pablo. fancier autoteam for even teams.\r
1396                 else if (j == lowest)\r
1397                 {\r
1398                         \r
1399                         if (TeamFortress_TeamGetMaxPlayers(i) > j)\r
1400                         {\r
1401                                 score1 = TeamFortress_GetRealScore(i);\r
1402                                 score2 = TeamFortress_GetRealScore(likely_team);\r
1403 \r
1404                                 if ( score1 < score2 )\r
1405                                 {\r
1406                                         likely_team = i;\r
1407                                 }\r
1408                                 else if (score1 == score2)\r
1409                                 {\r
1410                                         if (random() > 0.5)\r
1411                                         {\r
1412                                                 likely_team = i;\r
1413                                         }\r
1414                                 }\r
1415                         }\r
1416                 }\r
1417                 //\r
1418                 i = i + 1;\r
1419         }\r
1420         return TeamFortress_TeamSet(likely_team);\r
1421 };\r
1422 \r
1423 // Remove item_tfgoal timers\r
1424 void() TeamFortress_RemoveTimers = \r
1425 {\r
1426         local entity te;\r
1427 //      self.leg_damage = 0;            // No Snipers\r
1428 //      self.is_undercover = 0;         // I think this function is called in PlayerKill\r
1429 //      self.is_building = 0;           // To Be Added ?\r
1430 //      self.building = world;          // To Be Added ?\r
1431         if (self.tfstate & 2048)\r
1432         {\r
1433                 self.tfstate = self.tfstate - 2048;\r
1434                 TeamFortress_SetSpeed(self);\r
1435                 self.heat = 0;\r
1436         }\r
1437         te = find(world, classname, "timer");\r
1438         while (te != world)\r
1439         {\r
1440                 if (te.owner == self)\r
1441                 {\r
1442                         dremove(te);\r
1443                         te = find(world, classname, "timer");\r
1444                 }\r
1445                 else\r
1446                 {\r
1447                         te = find(te, classname, "timer");\r
1448                 }\r
1449         }\r
1450         te = find(world, classname, "item_tfgoal");\r
1451         while (te)\r
1452         {\r
1453                 if (te.owner == self)\r
1454                 {\r
1455                         if (!(te.goal_activation & 256))\r
1456                         {\r
1457                                 tfgoalitem_RemoveFromPlayer(te, self, 0);\r
1458                         }\r
1459                         if (CTF_Map == 1 && te.goal_no == 1)\r
1460                         {\r
1461                                 bprint(self.netname);\r
1462                                 bprint(" ÌÏÓÔ the ÂÌÕÅ flag!\n");\r
1463                         }\r
1464                         else\r
1465                         {\r
1466                                 if (CTF_Map == 1 && te.goal_no == 2)\r
1467                                 {\r
1468                                         bprint(self.netname);\r
1469                                         bprint(" ÌÏÓÔ the ÒÅÄ flag!\n");\r
1470                                 }\r
1471                         }\r
1472                 }\r
1473                 te = find(te, classname, "item_tfgoal");\r
1474         }\r
1475         te = find(world, classname, "detpack");\r
1476         while (te)\r
1477         {\r
1478                 if (te.weaponmode == 1 && te.enemy == self)\r
1479                 {\r
1480                         te.weaponmode = 0;\r
1481                 }\r
1482                 te = find(te, classname, "detpack");\r
1483         }\r
1484 //      TeamFortress_DetonatePipebombs(); gold. this is the old code for removing pipebombs on quitting.  new one written by pablo is below.\r
1485         // NO PIPEBOMBS IN NEXTF\r
1486 /*      te = find(world, classname, "pipebomb");\r
1487         while (te != world)\r
1488         {\r
1489                 if(te.owner == self)\r
1490                 {\r
1491                         decrement_team_pipebombs(self.team_no);\r
1492                         deathmsg = te.weapon;\r
1493                         te.weapon = 10;\r
1494                         T_RadiusDamage(te, self, 120, world);\r
1495                         WriteByte(4, 23);\r
1496                         WriteByte(4, 3);\r
1497                         WriteCoord(4, te.origin_x);\r
1498                         WriteCoord(4, te.origin_y);\r
1499                         WriteCoord(4, te.origin_z);\r
1500                         multicast(te.origin, TF_FLARE_OFF);\r
1501                         dremove(te);\r
1502                 }\r
1503         te = find(te, classname, "pipebomb");\r
1504         }*/\r
1505 //      stuffcmd(self, "v_idlescale 0\n");\r
1506 //      stuffcmd(self, "v_cshift 0 0 0 0\n");\r
1507 //      self.item_list = 0;                     // To Be Added?\r
1508 //      self.FlashTime = 0;\r
1509         CenterPrint(self, "\n");\r
1510         self.menu_count = 25;           // Menu Stuff - important\r
1511         self.current_menu = 1;          ////\r
1512         self.impulse = 0;\r
1513 };\r
1514 \r
1515 // TF's Become Explosion\r
1516 void() BecomeExplosion = \r
1517 {\r
1518         dremove(self);\r
1519 };\r
1520 \r
1521 // TF Alias Maker\r
1522 void(string halias, float himpulse1, float himpulse2) TeamFortress_Alias = \r
1523 {\r
1524         local string imp;\r
1525         stuffcmd(self, "alias ");\r
1526         stuffcmd(self, halias);\r
1527         stuffcmd(self, " \"impulse ");\r
1528         imp = ftos(himpulse1);\r
1529         stuffcmd(self, imp);\r
1530         if (himpulse2 != 0)\r
1531         {\r
1532                 stuffcmd(self, ";wait; impulse ");\r
1533                 imp = ftos(himpulse2);\r
1534                 stuffcmd(self, imp);\r
1535         }\r
1536         stuffcmd(self, "\"\n");\r
1537 };\r
1538 \r
1539 float (float tno) TeamFortress_TeamGetIllegalClasses =\r
1540 {\r
1541         if ((tno == 1))\r
1542         {\r
1543                 return (illegalclasses1);\r
1544         }\r
1545         if ((tno == 2))\r
1546         {\r
1547                 return (illegalclasses2);\r
1548         }\r
1549         if ((tno == 3))\r
1550         {\r
1551                 return (illegalclasses3);\r
1552         }\r
1553         if ((tno == 4))\r
1554         {\r
1555                 return (illegalclasses4);\r
1556         }\r
1557         return (0);\r
1558 };\r
1559 \r
1560 // Check if legal class\r
1561 float (float pc, float tno, entity chkr) Check_Class_Scout =\r
1562 {\r
1563         if (tno == 1 )\r
1564         {\r
1565         }\r
1566 \r
1567 };\r
1568 \r
1569 float (float pc, float tno, entity chkr) Check_Class_Soldier =\r
1570 {\r
1571 };\r
1572 \r
1573 float (float pc) IsLegalClass =\r
1574 {\r
1575         local float bit;\r
1576 \r
1577 // Team:Nexuiz class check\r
1578         local entity findme;\r
1579         local float yesorno;\r
1580 \r
1581         findme = find (world,classname,"class_restrictions");\r
1582         if (pc == TF_CLASS_SCOUT)\r
1583                 yesorno = Check_Class_Scout(pc, self.team_no, findme);\r
1584         else if (pc == TF_CLASS_SOLDIER)\r
1585                 yesorno = Check_Class_Soldier(pc, self.team_no, findme);\r
1586 \r
1587 \r
1588 /*      if (((spy_off == 1) && (pc == 8)))\r
1589         {\r
1590                 return (0);\r
1591         }*/\r
1592         if ((pc == 1))\r
1593         {\r
1594                 bit = 1;\r
1595         }\r
1596         else\r
1597         {\r
1598                 if ((pc == 2))\r
1599                 {\r
1600                         bit = 2;\r
1601                 }\r
1602                 else\r
1603                 {\r
1604                         if ((pc == 3))\r
1605                         {\r
1606                                 bit = 4;\r
1607                         }\r
1608                         else\r
1609                         {\r
1610                                 if ((pc == 4))\r
1611                                 {\r
1612                                         bit = 8;\r
1613                                 }\r
1614                                 else\r
1615                                 {\r
1616                                         if ((pc == 5))\r
1617                                         {\r
1618                                                 bit = 16;\r
1619                                         }\r
1620                                         else\r
1621                                         {\r
1622                                                 if ((pc == 6))\r
1623                                                 {\r
1624                                                         bit = 32;\r
1625                                                 }\r
1626                                                 else\r
1627                                                 {\r
1628                                                         if ((pc == 7))\r
1629                                                         {\r
1630                                                                 bit = 64;\r
1631                                                         }\r
1632                                                         else\r
1633                                                         {\r
1634                                                                 if ((pc == 8))\r
1635                                                                 {\r
1636                                                                         bit = 256;\r
1637                                                                 }\r
1638                                                                 else\r
1639                                                                 {\r
1640                                                                         if ((pc == 9))\r
1641                                                                         {\r
1642                                                                                 bit = 512;\r
1643                                                                         }\r
1644                                                                         else\r
1645                                                                         {\r
1646                                                                                 if ((pc == 10))\r
1647                                                                                 {\r
1648                                                                                         bit = 128;\r
1649                                                                                 }\r
1650                                                                         }\r
1651                                                                 }\r
1652                                                         }\r
1653                                                 }\r
1654                                         }\r
1655                                 }\r
1656                         }\r
1657                 }\r
1658         }\r
1659         if (((illegalclasses & bit) || (TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)))\r
1660         {\r
1661                 return (0);\r
1662         }\r
1663         return (1);\r
1664 };\r
1665 \r
1666 // Display legal classes for map\r
1667 void () TeamFortress_DisplayLegalClasses =\r
1668 {\r
1669         local float gotone;\r
1670         local float ill;\r
1671 \r
1672         sprint (self, "Legal Classes for your team are:\n");\r
1673         gotone = 0;\r
1674         ill = TeamFortress_TeamGetIllegalClasses (self.team_no);\r
1675         if ((!(illegalclasses & 1) && !(ill & 1)))\r
1676         {\r
1677                 if (gotone)\r
1678                 {\r
1679                         sprint (self, ", ");\r
1680                 }\r
1681                 gotone = 1;\r
1682                 sprint (self, "Scout");\r
1683         }\r
1684         if ((!(illegalclasses & 2) && !(ill & 2)))\r
1685         {\r
1686                 if (gotone)\r
1687                 {\r
1688                         sprint (self, ", ");\r
1689                 }\r
1690                 gotone = 1;\r
1691                 sprint (self, "Sniper");\r
1692         }\r
1693         if ((!(illegalclasses & 4) && !(ill & 4)))\r
1694         {\r
1695                 if (gotone)\r
1696                 {\r
1697                         sprint (self, ", ");\r
1698                 }\r
1699                 gotone = 1;\r
1700                 sprint (self, "Soldier");\r
1701         }\r
1702         if ((!(illegalclasses & 8) && !(ill & 8)))\r
1703         {\r
1704                 if (gotone)\r
1705                 {\r
1706                         sprint (self, ", ");\r
1707                 }\r
1708                 gotone = 1;\r
1709                 sprint (self, "Demolitions Man");\r
1710         }\r
1711         if ((!(illegalclasses & 16) && !(ill & 16)))\r
1712         {\r
1713                 if (gotone)\r
1714                 {\r
1715                         sprint (self, ", ");\r
1716                 }\r
1717                 gotone = 1;\r
1718                 sprint (self, "Combat Medic");\r
1719         }\r
1720         if ((!(illegalclasses & 32) && !(ill & 32)))\r
1721         {\r
1722                 if (gotone)\r
1723                 {\r
1724                         sprint (self, ", ");\r
1725                 }\r
1726                 gotone = 1;\r
1727                 sprint (self, "Heavy Weapons Guy");\r
1728         }\r
1729         if ((!(illegalclasses & 64) && !(ill & 64)))\r
1730         {\r
1731                 if (gotone)\r
1732                 {\r
1733                         sprint (self, ", ");\r
1734                 }\r
1735                 gotone = 1;\r
1736                 sprint (self, "Pyro");\r
1737         }\r
1738         if ((!(illegalclasses & 256) && !(ill & 256)))\r
1739         {\r
1740                 if (gotone)\r
1741                 {\r
1742                         sprint (self, ", ");\r
1743                 }\r
1744                 gotone = 1;\r
1745                 sprint (self, "Spy");\r
1746         }\r
1747         if ((!(illegalclasses & 512) && !(ill & 512)))\r
1748         {\r
1749                 if (gotone)\r
1750                 {\r
1751                         sprint (self, ", ");\r
1752                 }\r
1753                 gotone = 1;\r
1754                 sprint (self, "Engineer");\r
1755         }\r
1756         if ((!(illegalclasses & 128) && !(ill & 128)))\r
1757         {\r
1758                 if (gotone)\r
1759                 {\r
1760                         sprint (self, ", ");\r
1761                 }\r
1762                 gotone = 1;\r
1763                 sprint (self, "RandomPC");\r
1764         }\r
1765         sprint (self, "\n");\r
1766 };\r
1767 \r
1768 // TF class change/select function\r
1769 void() TeamFortress_ChangeClass = \r
1770 {\r
1771 //      local float tc;\r
1772 //      local string st;\r
1773 \r
1774         self.impulse += 100;            //temp\r
1775 \r
1776         if (self.playerclass != 0)\r
1777         {\r
1778 //              if (deathmatch != 3)\r
1779 //              {\r
1780 //                      return;\r
1781 //              }\r
1782                 if (TeamFortress_TeamIsCivilian(self.team_no))\r
1783                 {\r
1784                         sprint(self, "You cannot change class.\n");\r
1785                         return;\r
1786                 }\r
1787                 if (!IsLegalClass(self.impulse - 100))\r
1788                 {\r
1789                         sprint(self, "Your team cannot play that class.\n");\r
1790                         TeamFortress_DisplayLegalClasses();\r
1791                         return;\r
1792                 }\r
1793 /*              tc = IsRestrictedClass(self.impulse - 100);                     // TBA ADD THIS FUNCTION\r
1794                 if (tc != 0)                                                                            // it's actually a megatf function\r
1795                 {                                                                                                       // -- gonna need cvars for it\r
1796                         if (tc > 0)\r
1797                         {\r
1798                                 sprint(self, "That class is restricted to ");\r
1799                                 st = ftos(tc);\r
1800                                 sprint(self, st);\r
1801                                 sprint(self, " per team.\n");\r
1802                         }\r
1803                         else\r
1804                         {\r
1805                                 sprint(self, "That class is disabled.\n");\r
1806                         }\r
1807                         return;\r
1808                 }*/\r
1809                 self.nextpc = self.impulse - 100;\r
1810                 sprint(self, "After dying, you will return as a ");\r
1811                 TeamFortress_PrintClassName(self, self.nextpc, self.tfstate & 8);\r
1812                 self.immune_to_check = time + 10;\r
1813                 return;\r
1814         }\r
1815 /*if (teamplay && self.team_no == 0)            //handled in cmd function\r
1816         {\r
1817                 if (toggleflags & 64)\r
1818                 {\r
1819                         if (TeamFortress_TeamPutPlayerInTeam() == 0)\r
1820                         {\r
1821                                 return;\r
1822                         }\r
1823                 }\r
1824                 else\r
1825                 {\r
1826                         sprint(self, "You must join a team first. \n");\r
1827                         sprint(self, "use imin1, imin2, imin3, or imin4\n");\r
1828                         return;\r
1829                 }\r
1830         }*/\r
1831         if (self.lives == 0)\r
1832         {\r
1833                 sprint(self, "You have no lives left.\n");\r
1834                 return;\r
1835         }\r
1836         if (!IsLegalClass(self.impulse - 100) && self.impulse != 1)\r
1837         {\r
1838                 sprint(self, "You cannot play that playerclass on this map. \n");\r
1839                 TeamFortress_DisplayLegalClasses();\r
1840                 return;\r
1841         }\r
1842 \r
1843 /*      tc = IsRestrictedClass(self.impulse - 100);                     // TBA\r
1844         if (tc != 0)\r
1845         {\r
1846                 if (tc > 0)\r
1847                 {\r
1848                         sprint(self, "That class is restricted to ");\r
1849                         st = ftos(tc);\r
1850                         sprint(self, st);\r
1851                         sprint(self, " per team.\n");\r
1852                 }\r
1853                 else\r
1854                 {\r
1855                         sprint(self, "That class is disabled.\n");\r
1856                 }\r
1857                 return;\r
1858         }*/\r
1859         if (self.impulse != 1)\r
1860         {\r
1861                 self.playerclass = self.impulse - 100;\r
1862         }\r
1863         else\r
1864         {\r
1865                 self.playerclass = 11;\r
1866         }\r
1867         if (self.playerclass == 10)\r
1868         {               \r
1869                 sprint(self, "Random Playerclass.\n");\r
1870                 self.tfstate = self.tfstate | 8;\r
1871 /*              tc = 1 + floor(random() * (10 - 1));\r
1872                 while (IsRestrictedClass(tc) != 0)\r
1873                 {\r
1874                         tc = 1 + floor(random() * (10 - 1));\r
1875                 }*/\r
1876 //              self.playerclass = tc;\r
1877                 self.playerclass = 10;\r
1878                 ChooseRandomClass();\r
1879         }\r
1880         //ftos(TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)\r
1881 \r
1882         PutClientInServer ();           //temp\r
1883 };\r
1884 \r
1885 // XavioR's new TF reload function\r
1886 void (float o, float m, void () g) weapon_thinkf;\r
1887 void () Reload_Restore_Weapon =\r
1888 {\r
1889         if (self.owner.weaponentity.pos1 != '0 0 0')\r
1890         {\r
1891                 self.owner.weaponentity.pos1 = '0 0 0';\r
1892                 self.owner.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
1893         }\r
1894 };\r
1895 \r
1896 void (float rweapon, float amount) DoReload =\r
1897 {\r
1898         local float rtime;\r
1899 \r
1900         if (self.reload_time > time)\r
1901                 return;\r
1902         if (amount == 0)\r
1903                 return;\r
1904 \r
1905         weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now\r
1906         if (rweapon != 5)\r
1907                 sprint(self, "Reloading...\n");\r
1908 \r
1909         if (rweapon == 1)               // Pistol\r
1910         {\r
1911                 rtime = (amount * .35);\r
1912                 self.clip_pistol = CLIP_MAX_PISTOL;\r
1913         }\r
1914         if (rweapon == 2)               // CryLink (flak cannon)\r
1915         {\r
1916                 rtime = (amount * .80);\r
1917                 self.clip_crylink = CLIP_MAX_CRYLINK;\r
1918         }\r
1919         if (rweapon == 3)               // Rocket launcher\r
1920         {\r
1921                 rtime = (amount * 1.30);\r
1922                 self.clip_rockets = 4;\r
1923         }\r
1924         if (rweapon == 4)               // Pipe Grenade Launcher\r
1925         {\r
1926                 rtime = (amount * 1.05);\r
1927                 self.clip_pipegrenades = 6;\r
1928         }\r
1929         if (rweapon == 5)               // Building something... (senrtry gun, tesla, etc.)\r
1930         {\r
1931                 rtime = amount;\r
1932         }\r
1933 \r
1934         self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE;\r
1935         self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
1936         newmis = spawn();\r
1937         newmis.owner = self;\r
1938         newmis.think = Reload_Restore_Weapon;\r
1939         newmis.nextthink = time + rtime;\r
1940 \r
1941         self.reload_time = time + rtime;\r
1942 };\r
1943 \r
1944 // Xavior's self.playerclass to self.class conversion\r
1945 string(string s1, ...) strcat;\r
1946 void () Do_TFClass_Conversion =\r
1947 {\r
1948         local float cl;\r
1949         local string cst;\r
1950 \r
1951         if (self.respawn_as_new_class > 0)\r
1952         {\r
1953                 self.playerclass = self.respawn_as_new_class;\r
1954                 self.respawn_as_new_class = 0;\r
1955                 return;\r
1956         }\r
1957 \r
1958         if (self.playerclass == TF_CLASS_SCOUT) {\r
1959                 self.class = CLASS_SCOUT;\r
1960                 cst = "scout"; }\r
1961         if (self.playerclass == TF_CLASS_SOLDIER) {\r
1962                 self.class = CLASS_SOLDIER;\r
1963                 cst = "soldier"; }\r
1964         if (self.playerclass == TF_CLASS_MEDIC) {\r
1965                 self.class = CLASS_MEDIC;\r
1966                 cst = "medic"; }\r
1967         if (self.playerclass == TF_CLASS_PYRO) {\r
1968                 self.class = CLASS_PYRO;\r
1969                 cst = "pyro"; }\r
1970         if (self.playerclass == TF_CLASS_SPY) {\r
1971                 self.class = CLASS_SPY;\r
1972                 cst = "spy"; }\r
1973         if (self.playerclass == TF_CLASS_ENGINEER) {\r
1974                 self.class = CLASS_ENGINEER;\r
1975                 cst = "engineer"; }\r
1976         if (self.playerclass == TF_CLASS_RANDOM || self.tfstate == self.tfstate | 8) {\r
1977                 cst = ChooseRandomClass(); }\r
1978         // Note to self: add Random and Civilian\r
1979 \r
1980         cl = GetPlayerClass();\r
1981 \r
1982         if (!self.class == cl)\r
1983         {\r
1984                 if (cst == "engineer")\r
1985                 {\r
1986                         self.playermodel = strcat("models/class/",cst,"_other.zym");\r
1987                 }\r
1988                 else\r
1989                 {\r
1990                         self.playermodel = strcat("models/class/",cst,"_mechanical.zym");\r
1991                 }\r
1992         }\r
1993         SetPlayerSpeed(self);\r
1994 };\r
1995 \r
1996 // XavioR's Random Class select\r
1997 string () ChooseRandomClass =\r
1998 {\r
1999         local float choose;\r
2000         local float good;\r
2001 \r
2002         while (good < 1)\r
2003         {\r
2004                 choose = (1 + floor ((random () * (10 - 1))));\r
2005                 if (IsLegalClass(choose) && choose != TF_CLASS_SNIPER && choose != TF_CLASS_DEMOMAN && choose != TF_CLASS_HWGUY)\r
2006                 {\r
2007                         good = 1;\r
2008 //                      sprint (self, ftos(choose));\r
2009 //                      sprint (self, "\n");\r
2010                         if (choose == TF_CLASS_SCOUT) {\r
2011                                 self.class = CLASS_SCOUT;\r
2012                                 return ("scout"); }\r
2013                         if (choose == TF_CLASS_SOLDIER) {\r
2014                                 self.class = CLASS_SOLDIER;\r
2015                                 return ("soldier"); }\r
2016                         if (choose == TF_CLASS_PYRO) {\r
2017                                 self.class = CLASS_PYRO;\r
2018                                 return ("pyro"); }\r
2019                         if (choose == TF_CLASS_ENGINEER) {\r
2020                                 self.class = CLASS_ENGINEER;\r
2021                                 return ("engineer"); }\r
2022                         if (choose == TF_CLASS_MEDIC) {\r
2023                                 self.class = CLASS_MEDIC;\r
2024                                 return ("medic"); }\r
2025                         if (choose == TF_CLASS_SPY) {\r
2026                                 self.class = CLASS_SPY;\r
2027                                 return ("spy"); }\r
2028                 }\r
2029         }\r
2030 };\r
2031 \r
2032 // Nail projectile and blood\r
2033 float current_yaw;\r
2034 float (float fl) anglemod =\r
2035 {\r
2036         while (fl >= 360)\r
2037         {\r
2038                 fl = fl - 360;\r
2039         }\r
2040         while (fl < 0)\r
2041         {\r
2042                 fl = fl + 360;\r
2043         }\r
2044         return (fl);\r
2045 };\r
2046 \r
2047 vector () wall_velocity =\r
2048 {\r
2049         local vector vel;\r
2050 \r
2051         vel = normalize (self.velocity);\r
2052         vel = normalize (((vel + (v_up * (random () - 0.5))) + (v_right * (random () - 0.5))));\r
2053         vel = (vel + (2 * trace_plane_normal));\r
2054         vel = (vel * 200);\r
2055         return (vel);\r
2056 };\r
2057 \r
2058 void (vector org, float damage) SpawnBlood =\r
2059 {\r
2060         particle (org, '0 0 0', 73, (damage * 2));\r
2061 };\r
2062 \r
2063 void (float damage) spawn_touchblood =\r
2064 {\r
2065         local vector vel;\r
2066 \r
2067         vel = (wall_velocity () * 0.2);\r
2068         SpawnBlood ((self.origin + (vel * 0.01)), damage);\r
2069 };\r
2070 \r
2071 void () superspike_touch =\r
2072 {\r
2073         local float ndmg;\r
2074 \r
2075 /*      if (self.voided)                                // temp?\r
2076         {\r
2077                 return;\r
2078         }\r
2079         self.voided = 1;*/\r
2080         if (other == self.owner)\r
2081         {\r
2082                 return;\r
2083         }\r
2084         if (other.solid == 1)\r
2085         {\r
2086                 return;\r
2087         }\r
2088         if (pointcontents (self.origin) == -6)\r
2089         {\r
2090                 dremove (self);\r
2091                 return;\r
2092         }\r
2093         if (other.takedamage)\r
2094         {\r
2095                 spawn_touchblood (18);\r
2096                 deathmsg = self.weapon;\r
2097                 if ((deathmsg == 9))\r
2098                 {\r
2099                         ndmg = 13;\r
2100                 }\r
2101                 else\r
2102                 {\r
2103                         ndmg = 26;\r
2104                 }\r
2105                 if (self.owner.classname == "grenade")\r
2106                 {\r
2107                         TF_T_Damage (other, self, self.owner.owner, ndmg, 2, 2);\r
2108                 }\r
2109                 else\r
2110                 {\r
2111                         TF_T_Damage (other, self, self.owner, ndmg, 2, 2);\r
2112                 }\r
2113         }\r
2114         else\r
2115         {\r
2116                 WriteByte (0, 23);\r
2117                 WriteByte (0, 1);\r
2118                 WriteCoord (0, self.origin_x);\r
2119                 WriteCoord (0, self.origin_y);\r
2120                 WriteCoord (0, self.origin_z);\r
2121         }\r
2122         dremove (self);\r
2123 };\r
2124 \r
2125 void () spike_touch =\r
2126 {\r
2127         if (other.solid == 1)\r
2128         {\r
2129                 return;\r
2130         }\r
2131         if (pointcontents (self.origin) == -6)\r
2132         {\r
2133                 dremove (self);\r
2134                 return;\r
2135         }\r
2136         if (other.takedamage)\r
2137         {\r
2138                 spawn_touchblood (9);\r
2139                 deathmsg = self.weapon;\r
2140                 if (self.owner.classname == "grenade")\r
2141                 {\r
2142                         TF_T_Damage (other, self, self.owner.owner, 9, 2, 2);\r
2143                 }\r
2144                 else\r
2145                 {\r
2146                         TF_T_Damage (other, self, self.owner, 9, 2, 2);\r
2147                 }\r
2148         }\r
2149         else\r
2150         {\r
2151                 WriteByte (4, 23);\r
2152                 if ((self.classname == "wizspike"))\r
2153                 {\r
2154                         WriteByte (4, 7);\r
2155                 }\r
2156                 else\r
2157                 {\r
2158                         if ((self.classname == "knightspike"))\r
2159                         {\r
2160                                 WriteByte (4, 8);\r
2161                         }\r
2162                         else\r
2163                         {\r
2164                                 WriteByte (4, 0);\r
2165                         }\r
2166                 }\r
2167                 WriteCoord (4, self.origin_x);\r
2168                 WriteCoord (4, self.origin_y);\r
2169                 WriteCoord (4, self.origin_z);\r
2170         }\r
2171         dremove (self);\r
2172 };\r
2173 \r
2174 void(vector org) te_gunshot;\r
2175 float   EF_ADDITIVE/*     = 32*/;\r
2176 void () ChangeModelTime =\r
2177 {\r
2178         if (self.owner)\r
2179                 setmodel (self.owner, self.classname);\r
2180         dremove(self);\r
2181 };\r
2182 \r
2183 void (entity ent, string st, float wait_time) soonmodel =\r
2184 {\r
2185         local entity x;\r
2186         x = spawn ();\r
2187         x.classname = st;\r
2188         x.owner = ent;\r
2189         x.nextthink = time + wait_time;\r
2190         x.think = ChangeModelTime;\r
2191 };\r
2192 \r
2193 .float scale;\r
2194 \r
2195 void (vector vect_a, vector vect_b) launch_spike =\r
2196 {\r
2197         local entity e;                 // bullet trail\r
2198 \r
2199         newmis = spawn ();\r
2200         newmis.owner = self;\r
2201         newmis.movetype = 9;\r
2202         newmis.solid = 2;\r
2203         newmis.angles = vectoangles (vect_b);\r
2204         newmis.touch = spike_touch;\r
2205         newmis.weapon = 3;\r
2206         newmis.classname = "spike";\r
2207         newmis.think = SUB_Remove;\r
2208         newmis.nextthink = (time + 3);\r
2209         if (deathmsg != 9)\r
2210         {\r
2211                 setmodel (newmis, "models/plasmatrail.mdl");\r
2212         }\r
2213         setsize (newmis, '0 0 0', '0 0 0');\r
2214         setorigin (newmis, vect_a);\r
2215         newmis.velocity = (vect_b * 2000);\r
2216 \r
2217                 e = spawn();\r
2218                 e.owner = self;\r
2219                 e.movetype = MOVETYPE_FLY;\r
2220                 e.solid = SOLID_NOT;\r
2221                 e.think = SUB_Remove;\r
2222                 e.nextthink = time + vlen(trace_endpos - self.origin) / 6000;\r
2223                 e.velocity = vect_b * 4000;\r
2224                 e.angles = vectoangles (vect_b);\r
2225                 e.scale = .3;\r
2226 //              soonmodel (e, "models/tracer.mdl", .1);\r
2227                 setmodel (e, "models/tracer.mdl");\r
2228                 setsize (e, '0 0 0', '0 0 0');\r
2229                 setorigin (e, vect_a);\r
2230                 e.effects = e.effects | EF_ADDITIVE;\r
2231 };\r
2232 \r
2233 // TF's Ammo-Updater\r
2234 void () W_SetCurrentAmmo =\r
2235 {\r
2236         weapon_action(self.weapon, WR_UPDATECOUNTS);\r
2237 };\r
2238 \r
2239 // TF Team Sprint\r
2240 void (float tno, entity ignore, string st) teamsprint =\r
2241 {\r
2242         local entity te;\r
2243 \r
2244         if ((tno == 0))\r
2245         {\r
2246                 return;\r
2247         }\r
2248         te = find (world, classname, "player");\r
2249         while (te)\r
2250         {\r
2251                 if (((te.team_no == tno) && (te != ignore)))\r
2252                 {\r
2253                         sprint (te, st);\r
2254                 }\r
2255                 te = find (te, classname, "player");\r
2256         }\r
2257 };\r
2258 \r
2259 // CENTERPRINT\r
2260 void (entity pl, string s1, string s2) CenterPrint2 =\r
2261 {\r
2262         centerprint (pl, s1, s2);\r
2263         pl.StatusRefreshTime = (time + 1.5);\r
2264 };\r
2265 \r
2266 // another ammo check caleld by the menu system. I dont know exactly what function this is for. - XavioR\r
2267 void(entity p) bound_other_ammo = \r
2268 {\r
2269         if (p.ammo_shells > TeamFortress_GetMaxAmmo(p, 256))\r
2270         {\r
2271                 p.ammo_shells = TeamFortress_GetMaxAmmo(p, 256);\r
2272         }\r
2273         if (p.ammo_nails > TeamFortress_GetMaxAmmo(p, 512))\r
2274         {\r
2275                 p.ammo_nails = TeamFortress_GetMaxAmmo(p, 512);\r
2276         }\r
2277         if (p.ammo_rockets > TeamFortress_GetMaxAmmo(p, 1024))\r
2278         {\r
2279                 p.ammo_rockets = TeamFortress_GetMaxAmmo(p, 1024);\r
2280         }\r
2281         if (p.ammo_cells > TeamFortress_GetMaxAmmo(p, 2048))\r
2282         {\r
2283                 p.ammo_cells = TeamFortress_GetMaxAmmo(p, 2048);\r
2284         }\r
2285 /*      if (p.ammo_medikit > p.maxammo_medikit)                         // addme\r
2286         {\r
2287                 p.ammo_medikit = p.maxammo_medikit;\r
2288         }*/\r
2289         if (p.armorvalue > p.maxarmor)\r
2290         {\r
2291                 p.armorvalue = p.max_armor;\r
2292         }\r
2293         if (p.no_grenades_1 > 4)\r
2294         {\r
2295                 p.no_grenades_1 = 4;\r
2296         }\r
2297         if (p.no_grenades_2 > 4)\r
2298         {\r
2299                 p.no_grenades_2 = 4;\r
2300         }\r
2301 };\r
2302 \r
2303 // TF Drop Flag Function\r
2304 void () tfgoalitem_dropthink;\r
2305 void () item_tfgoal_touch;\r
2306 void () DropFlag =\r
2307 {\r
2308         local entity Item;\r
2309         local entity te;\r
2310         local float f;\r
2311         local string st;\r
2312 \r
2313         te = find (world, classname, "item_tfgoal");\r
2314         while (te)\r
2315         {\r
2316                 if (te.owner == self)\r
2317                 {\r
2318                         Item = te;\r
2319                 }\r
2320                 te = find (te, classname, "item_tfgoal");\r
2321         }\r
2322 \r
2323         if (Item == world)\r
2324         {\r
2325                 sprint (self, "You don't have the flag.\n");    \r
2326                 return;\r
2327         }\r
2328 \r
2329         // Delay\r
2330         if (self.DropFlagDelay > time)\r
2331         {\r
2332                 sprint (self, "Can't drop again for another "); \r
2333                 f = ceil(self.DropFlagDelay - time);\r
2334                 st = ftos(f);\r
2335                 sprint (self, st);\r
2336                 sprint (self, " seconds.\n");   \r
2337                 return;\r
2338         }\r
2339         self.DropFlagDelay = time + 10;\r
2340         //\r
2341 \r
2342         // Flash of particles\r
2343         WriteByte(4, 23);\r
2344         WriteByte(4, 11);\r
2345         WriteCoord(4, self.origin_x);\r
2346         WriteCoord(4, self.origin_y);\r
2347         WriteCoord(4, self.origin_z);\r
2348 \r
2349         tfgoalitem_RemoveFromPlayer(Item, self, 2);\r
2350 \r
2351         setorigin (Item, self.origin - '0 0 -24');      // - vf*(16));// - '0 0 15');   //Item.origin = self.origin + v_forward*56 + '0 0 8';\r
2352         Item.velocity = '0 0 1';                //((vf * 150) + '0 0 150';\r
2353                                                         //gold.  i didn't even have to change the origin, just the velocity. used to be '0 0 150'\r
2354         Item.goal_state = 2;\r
2355         Item.movetype = 6;\r
2356         Item.solid = TF_FLARE_OFF;\r
2357         setsize(Item, '-16 -16 0', '16 16 56');\r
2358         if (Item.mdl != string_null)\r
2359         {\r
2360                 setmodel(Item, Item.mdl);\r
2361         }\r
2362         Item.option5 = time + 2;\r
2363         Item.tent = self;\r
2364         \r
2365         Item.nextthink = time + 5;\r
2366         Item.think = tfgoalitem_dropthink;\r
2367         Item.touch = item_tfgoal_touch;\r
2368 }\r
2369 \r
2370 void () TeamNexuiz_GunDown =            //brings first-person gun model down\r
2371 {\r
2372         self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE;\r
2373         self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
2374 };\r
2375 void () TeamNexuiz_GunUp =                      //brings first-person gun model up\r
2376 {\r
2377         if (self.weaponentity.pos1 != '0 0 0')\r
2378         {\r
2379                 self.weaponentity.pos1 = '0 0 0';\r
2380                 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
2381         }\r
2382 };\r
2383 \r
2384 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
2385 {\r
2386         local string tmsg;\r
2387 \r
2388         tmsg = strcat(str1, str2);\r
2389         tmsg = strcat(tmsg, str3);\r
2390         tmsg = strcat(tmsg, str4);\r
2391         tmsg = strcat(tmsg, str5);\r
2392         tmsg = strcat(tmsg, str6);\r
2393         tmsg = strcat(tmsg, str7);\r
2394         tmsg = strcat(tmsg, str8);\r
2395         tmsg = strcat(tmsg, str9);\r
2396         CenterPrint(print_to, tmsg);\r
2397 };