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
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
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
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
34 // stuff that still needs a function
\r
35 float number_of_teams; // Number of teams == IMPORTANT
\r
37 // Color/Teamchange cheat detection (using DP functions instead of tf)
\r
38 void (entity ent, float colors) setcolor;
\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
44 local float team_color;
\r
46 if (self.team_no == 1 && color != 13)
\r
48 // setcolor(self, 13); // used to use this for teams, ignore.
\r
49 team_color = TeamFortress_TeamGetColor(1) - 1;
\r
51 if (self.team_no == 2 && color != 4)
\r
53 // setcolor(self, 4,4);
\r
54 team_color = TeamFortress_TeamGetColor(2) - 1;
\r
56 if (self.team_no == 3 && color != 12)
\r
58 // setcolor(self, 12,12);
\r
59 team_color = TeamFortress_TeamGetColor(3) - 1;
\r
61 if (self.team_no == 4 && color != 11)
\r
63 // setcolor(self, 11,11);
\r
64 team_color = TeamFortress_TeamGetColor(4) - 1;
\r
66 setcolor(self, 16*team_color + team_color);
\r
70 void(entity targ, entity attacker) ClientObituary =
\r
72 ClientObituary(targ,attacker); // TEMP -- SOON I WILL ADD REAL DEATH MESSAGES
\r
75 void () DoTFAliases =
\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
88 void (entity tempent) dremove =
\r
90 if ((tempent == world))
\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
97 if ((tempent.is_removed == 1.000000))
\r
101 tempent.is_removed = 1.000000;
\r
105 entity (float gno) Findgoal =
\r
110 tg = find (world, classname, "info_tfgoal");
\r
113 if ((tg.goal_no == gno))
\r
117 tg = find (tg, classname, "info_tfgoal");
\r
119 dprint ("Could not find a goal with a goal_no of ");
\r
126 void(entity Goal, entity AP, entity ActivatingGoal) AttemptToActivate =
\r
129 if (Activated(Goal, AP))
\r
131 if (ActivatingGoal == Goal)
\r
133 DoResults(Goal, AP, TF_FLARE_OFF);
\r
137 if (ActivatingGoal != world)
\r
139 DoResults(Goal, AP, ActivatingGoal.goal_result & 2);
\r
143 DoResults(Goal, AP, TF_FLARE_LIT);
\r
149 if (Goal.else_goal != TF_FLARE_LIT)
\r
151 te = Findgoal(Goal.else_goal);
\r
154 AttemptToActivate(te, AP, ActivatingGoal);
\r
160 void (entity p) TeamFortress_SetSpeed =
\r
166 stuffcmd (p, "cl_movespeedkey 1\n");
\r
167 if ((p.tfstate & 65536))
\r
171 stuffcmd (p, "m_forward 0\n");
\r
172 stuffcmd (p, "m_side 0\n");
\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
184 stuffcmd (p, "m_forward 1\n");
\r
185 stuffcmd (p, "m_side 0.8\n");
\r
188 if ((p.class == 1)) //scout speed
\r
190 p.maxfbspeed = 450;
\r
191 p.maxstrafespeed = 450;
\r
195 if ((p.class == 2.1)) // No sniper in nextf
\r
197 p.maxfbspeed = 300;
\r
198 p.maxstrafespeed = 300;
\r
202 if ((p.class == 4)) //soldier speed
\r
204 p.maxfbspeed = 240;
\r
205 p.maxstrafespeed = 240;
\r
209 if ((p.class == 4.1)) // No demoman in nextf
\r
211 p.maxfbspeed = 280;
\r
212 p.maxstrafespeed = 280;
\r
216 if ((p.class == 16)) // Medic Speed
\r
218 p.maxfbspeed = 320;
\r
219 p.maxstrafespeed = 320;
\r
223 if ((p.class == 6.1)) // No HWGuy in nextf
\r
225 p.maxfbspeed = 230;
\r
226 p.maxstrafespeed = 230;
\r
230 if ((p.class == 8)) // Pyro Speed
\r
232 p.maxfbspeed = 300;
\r
233 p.maxstrafespeed = 300;
\r
237 if ((p.class == 11)) // Wazat -- We need a Civ class
\r
239 p.maxfbspeed = 240;
\r
240 p.maxstrafespeed = 240;
\r
244 if ((p.class == 2)) // Spy Speed
\r
246 p.maxfbspeed = 300;
\r
247 p.maxstrafespeed = 300;
\r
251 if ((p.class == 32)) // Engineer Speed
\r
253 p.maxfbspeed = 300;
\r
254 p.maxstrafespeed = 300;
\r
258 if ((p.class == 0)) // No class
\r
260 p.maxfbspeed = 320;
\r
261 p.maxstrafespeed = 320;
\r
275 te = find (world, classname, "item_tfgoal");
\r
276 while (((te != world) && (tf == 0)))
\r
278 if ((te.owner == p))
\r
280 if ((te.goal_activation & 2))
\r
283 p.maxfbspeed = (p.maxfbspeed / 2);
\r
284 p.maxstrafespeed = (p.maxstrafespeed / 2);
\r
287 te = find (te, classname, "item_tfgoal");
\r
289 if ((p.tfstate & 32768))
\r
291 p.maxfbspeed = (p.maxfbspeed / 2);
\r
292 p.maxstrafespeed = (p.maxstrafespeed / 2);
\r
294 /* if (p.leg_damage) // Railgun does leg damage :D -- check cl_physics.c
\r
296 if ((p.leg_damage > 6))
\r
300 p.maxfbspeed = (p.maxfbspeed * ((10 - p.leg_damage) / 10));
\r
301 p.maxstrafespeed = ((p.maxstrafespeed * (10 - p.leg_damage)) / 10);
\r
303 if ((p.tfstate & 2048))
\r
305 if ((p.maxfbspeed > 80))
\r
309 if ((p.maxstrafespeed > 80))
\r
311 p.maxstrafespeed = 80;
\r
314 sp = ftos (p.maxfbspeed);
\r
315 stuffcmd (p, "cl_backspeed ");
\r
317 stuffcmd (p, "\n");
\r
318 stuffcmd (p, "cl_forwardspeed ");
\r
320 stuffcmd (p, "\n");
\r
321 sp = ftos (p.maxstrafespeed);
\r
322 stuffcmd (p, "cl_sidespeed ");
\r
324 stuffcmd (p, "\n");
\r
327 float (entity Retriever, float AmmoType) TeamFortress_GetMaxAmmo =
\r
329 if ((AmmoType == 256))
\r
331 return (Retriever.maxammo_shells);
\r
335 if ((AmmoType == 512))
\r
337 return (Retriever.maxammo_nails);
\r
341 if ((AmmoType == 2048))
\r
343 return (Retriever.maxammo_cells);
\r
347 if ((AmmoType == 1024))
\r
349 return (Retriever.maxammo_rockets);
\r
353 if ((AmmoType == 4))
\r
355 return (Retriever.maxammo_medikit);
\r
359 if ((AmmoType == 131072))
\r
361 return (Retriever.maxammo_detpack);
\r
368 dprint ("Error in TeamFortress_GetMaxAmmo()\n");
\r
369 dprint ("Invalid ammo type passed.\n");
\r
373 void () TeamFortress_CheckClassStats =
\r
375 // Wazat - Implement your armor system here, eh?
\r
376 /* if ((self.armortype > self.armor_allowed))
\r
378 self.armortype = self.armor_allowed;
\r
380 if ((self.armorvalue > self.max_armor))
\r
382 self.armorvalue = self.max_armor;
\r
384 if ((self.armortype < 0))
\r
386 self.armortype = 0;
\r
388 if ((self.armorvalue < 0))
\r
390 self.armorvalue = 0;
\r
392 if ((self.ammo_shells > TeamFortress_GetMaxAmmo (self, 256)))
\r
394 self.ammo_shells = TeamFortress_GetMaxAmmo (self, 256);
\r
396 if ((self.ammo_shells < 0))
\r
398 self.ammo_shells = 0;
\r
400 if ((self.ammo_nails > TeamFortress_GetMaxAmmo (self, 512)))
\r
402 self.ammo_nails = TeamFortress_GetMaxAmmo (self, 512);
\r
404 if ((self.ammo_nails < 0))
\r
406 self.ammo_nails = 0;
\r
408 if ((self.ammo_rockets > (TeamFortress_GetMaxAmmo (self, 1024) * 3)))
\r
410 self.ammo_rockets = (TeamFortress_GetMaxAmmo (self, 1024) * 3);
\r
412 if ((self.ammo_rockets < 0))
\r
414 self.ammo_rockets = 0;
\r
416 if ((self.ammo_cells > TeamFortress_GetMaxAmmo (self, 2048)))
\r
418 self.ammo_cells = TeamFortress_GetMaxAmmo (self, 2048);
\r
420 if ((self.ammo_cells < 0))
\r
422 self.ammo_cells = 0;
\r
424 if ((self.ammo_medikit > TeamFortress_GetMaxAmmo (self, 4)))
\r
426 self.ammo_medikit = TeamFortress_GetMaxAmmo (self, 4);
\r
428 if ((self.ammo_medikit < 0))
\r
430 self.ammo_medikit = 0;
\r
432 if ((self.ammo_detpack > TeamFortress_GetMaxAmmo (self, 131072)))
\r
434 self.ammo_detpack = TeamFortress_GetMaxAmmo (self, 131072);
\r
436 if ((self.ammo_detpack < 0))
\r
438 self.ammo_detpack = 0;
\r
440 if ((self.no_grenades_1 < 0))
\r
442 self.no_grenades_1 = 0;
\r
444 if ((self.no_grenades_2 < 0))
\r
446 self.no_grenades_2 = 0;
\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
451 // TF_T_Damage (self, world, world, (self.max_health - self.health), 0, 256);
\r
453 if ((self.health < 0))
\r
455 T_Heal (self, (self.health - self.health), 0);
\r
457 self.items = (self.items - (self.items & ((8192 | 16384) | 32768)));
\r
458 if ((self.armortype >= 0.8))
\r
460 self.items = (self.items | 32768);
\r
464 if ((self.armortype >= 0.6))
\r
466 self.items = (self.items | 16384);
\r
470 if ((self.armortype >= 0.3))
\r
472 self.items = (self.items | 8192);
\r
476 weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now
\r
479 // TF Get Score Frags
\r
480 float (float tno) TeamFortress_TeamGetScoreFrags =
\r
482 if (((toggleflags & 128) || (toggleflags & 2048)))
\r
486 return (team1score);
\r
490 return (team2score);
\r
494 return (team3score);
\r
498 return (team4score);
\r
505 return (team1frags);
\r
509 return (team2frags);
\r
513 return (team3frags);
\r
517 return (team4frags);
\r
523 // TF Get Team Winner
\r
524 float () TeamFortress_TeamGetWinner =
\r
528 local float highest;
\r
529 local float highestteam;
\r
534 while ((i < (number_of_teams + 1)))
\r
536 j = TeamFortress_TeamGetScoreFrags (i);
\r
544 return (highestteam);
\r
547 // TF Score Increaser
\r
548 void (float tno, float scoretoadd) TeamFortress_TeamIncreaseScore =
\r
552 if (((tno == 0) || (scoretoadd == 0)))
\r
558 team1score = (team1score + scoretoadd);
\r
562 team2score = (team2score + scoretoadd);
\r
566 team3score = (team3score + scoretoadd);
\r
570 team4score = (team4score + scoretoadd);
\r
572 if (((toggleflags & 128) || (toggleflags & 2048)))
\r
574 e = find (world, classname, "player");
\r
577 if ((e.team_no == tno))
\r
579 e.frags = TeamFortress_TeamGetScore (tno);
\r
581 e = find (e, classname, "player");
\r
586 // Returns Team Color Name (String)
\r
587 string (float tno) TeamFortress_TeamGetColorString =
\r
591 col = TeamFortress_TeamGetColor (tno);
\r
630 return ("DarkPurple");
\r
638 return ("DarkGreen");
\r
644 return ("DarkBlue");
\r
648 float (float tno) TeamFortress_TeamIsCivilian =
\r
652 if ((civilianteams & 1))
\r
661 if ((civilianteams & 2))
\r
670 if ((civilianteams & 4))
\r
677 if ((civilianteams & 8))
\r
688 // You use a different method of handling this tho Wazat?
\r
689 void () TeamFortress_ChangeClass;
\r
690 /*void () TeamFortress_ChangeClass =
\r
697 if ((self.playerclass != 0))
\r
699 if (((deathmatch != 3) && (cb_prematch_time < time)))
\r
703 if (TeamFortress_TeamIsCivilian (self.team_no))
\r
705 sprint (self, "You cannot change class.\n");
\r
708 if (!IsLegalClass ((self.impulse - 100)))
\r
710 sprint (self, "Your team cannot play that class.\n");
\r
711 TeamFortress_DisplayLegalClasses ();
\r
714 if (((spy_off == 1) && ((self.impulse - 100) == 8)))
\r
716 sprint (self, "The spy class has been disabled on the server by the administrator.\n");
\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
725 if ((teamplay && (self.team_no == 0)))
\r
727 if ((toggleflags & 64))
\r
729 if ((TeamFortress_TeamPutPlayerInTeam () == 0))
\r
736 sprint (self, "You must join a team first. \n");
\r
737 sprint (self, "use imin1, imin2, imin3, or imin4\n");
\r
741 if ((self.lives == 0))
\r
743 sprint (self, "You have no lives left.\n");
\r
746 if ((!IsLegalClass ((self.impulse - 100)) && (self.impulse != 1)))
\r
748 sprint (self, "You cannot play that playerclass on this map. \n");
\r
749 TeamFortress_DisplayLegalClasses ();
\r
752 if (((spy_off == 1) && ((self.impulse - 100) == 8)))
\r
754 sprint (self, "The spy class has been disabled on the server by the administrator.\n");
\r
757 if ((self.impulse != 1))
\r
759 self.playerclass = (self.impulse - 100);
\r
763 self.playerclass = 11;
\r
766 self.takedamage = 2;
\r
768 self.flags = (8 | 512);
\r
769 self.waterlevel = 0;
\r
770 self.air_finished = (time + 12);
\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
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
786 if ((deathmatch || coop))
\r
788 makevectors (self.angles);
\r
789 spawn_tfog ((self.origin + (v_forward * 20)));
\r
791 if ((self.playerclass == 10))
\r
793 sprint (self, "Random Playerclass.\n");
\r
794 self.tfstate = (self.tfstate | 8);
\r
795 self.playerclass = (1 + floor ((random () * (10 - 1))));
\r
797 if (((spot.classname == "info_player_teamspawn") && (cb_prematch_time < time)))
\r
799 if ((spot.items != 0))
\r
801 te = Finditem (spot.items);
\r
804 tfgoalitem_GiveToPlayer (te, self, self);
\r
806 if (!(spot.goal_activation & 1))
\r
813 CenterPrint (self, spot.message);
\r
814 if (!(spot.goal_activation & 2))
\r
816 spot.message = string_null;
\r
819 if ((spot.activate_goal_no != 0))
\r
821 te = Findgoal (spot.activate_goal_no);
\r
824 AttemptToActivate (te, self, spot);
\r
827 if ((spot.goal_effects == 1))
\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
835 spot = find (world, classname, "player");
\r
838 if (((spot.team_no == self.team_no) && (spot != self)))
\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
844 spot = find (spot, classname, "player");
\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
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
860 // Show what class each member of the team is -- NEEDS AN IMPULSE CALL FUNCTION
\r
861 void (entity Player) TeamFortress_TeamShowMemberClasses =
\r
867 e = find (world, classname, "player");
\r
870 if ((((e.team_no == Player.team_no) || (e.team_no == 0)) && (e != Player)))
\r
872 if ((e.model != string_null))
\r
877 sprint (self, "The other members of your team are:\n");
\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
885 e = find (e, classname, "player");
\r
889 sprint (Player, "There are no other players on your team.\n");
\r
893 // Returns class name value
\r
894 // We use another function for the TN classnames though..
\r
895 string (float pc) TeamFortress_GetClassName =
\r
897 if ((pc == 1)) // Scout is class 1 (normal)
\r
905 return ("Sniper"); // Player Class 2 is Spy in NexTF -- no Snipers
\r
909 if ((pc == 4)) // Player Class 4 is soldier in NexTF
\r
911 return ("Soldier");
\r
915 if ((pc == 4.1)) // No DemoMan in NexTF
\r
917 return ("Demolitions Man");
\r
923 return ("Combat Medic"); // Medic is Class 16 in NexTF
\r
929 return ("Heavy Weapons Guy"); // No HWGuy in NexTF
\r
935 return ("Pyro"); // Pyro is class 8 in NexTF
\r
941 return ("Spy"); // Spy is class 2 in NexTF
\r
947 return ("Engineer"); // Engineer is class 32 in nextf
\r
951 if ((pc == 11)) // Wazat- we need to make civ class
\r
953 return ("Civilian");
\r
959 return ("Observer");
\r
963 if ((pc == 10)) // Wazat- we need to add "random class" feature
\r
965 return ("Random Playerclass");
\r
980 // Prints the classname using TeamFortress_GetClassName function
\r
981 void (entity Viewer, float pc, float rpc) TeamFortress_PrintClassName =
\r
985 st = TeamFortress_GetClassName (pc);
\r
986 sprint (Viewer, st);
\r
989 sprint (Viewer, " (Random)");
\r
991 sprint (Viewer, "\n");
\r
994 // Returns Team Color Value
\r
995 // note: this value is actually incorrect, the actual color values are the ones listed here
\r
997 float (float tno) TeamFortress_TeamGetColor =
\r
1018 // Returns Team Score Value
\r
1019 float (float tno) TeamFortress_TeamGetScore =
\r
1023 return (team1score);
\r
1027 return (team2score);
\r
1031 return (team3score);
\r
1035 return (team4score);
\r
1041 float (float tno) TeamFortress_TeamGetLives =
\r
1045 return (team1lives);
\r
1049 return (team2lives);
\r
1053 return (team3lives);
\r
1057 return (team4lives);
\r
1062 // Show Team Scores
\r
1063 void (float all) TeamFortress_TeamShowScores =
\r
1072 while ((i <= number_of_teams))
\r
1074 if ((TeamFortress_TeamGetColor (i) > 0))
\r
1076 j = TeamFortress_TeamGetScore (i);
\r
1077 st = TeamFortress_TeamGetColorString (i);
\r
1094 while ((i <= number_of_teams))
\r
1096 if ((TeamFortress_TeamGetColor (i) > 0))
\r
1104 sprint (self, "Team ");
\r
1113 sprint (self, st);
\r
1121 sprint (self, " (");
\r
1123 st = TeamFortress_TeamGetColorString (i);
\r
1130 sprint (self, st);
\r
1138 sprint (self, ") : ");
\r
1140 j = TeamFortress_TeamGetScore (i);
\r
1148 sprint (self, st);
\r
1156 sprint (self, "\n");
\r
1163 // Get Number Of Players On Team
\r
1164 float (float tno) TeamFortress_TeamGetNoPlayers =
\r
1166 local float size_team;
\r
1167 local entity search;
\r
1169 search = find (world, classname, "player");
\r
1170 while ((search != world))
\r
1172 if ((search.team_no == tno))
\r
1174 size_team = (size_team + 1);
\r
1176 search = find (search, classname, "player");
\r
1178 return (size_team);
\r
1181 // Get general number of players
\r
1182 float () TeamFortress_GetNoPlayers =
\r
1185 local entity search;
\r
1187 search = find (world, classname, "player");
\r
1188 while ((search != world))
\r
1190 if ((search.netname != string_null))
\r
1192 nump = (nump + 1);
\r
1194 search = find (search, classname, "player");
\r
1199 // Get max players for a team
\r
1200 float (float tno) TeamFortress_TeamGetMaxPlayers =
\r
1204 return (team1maxplayers);
\r
1208 return (team2maxplayers);
\r
1212 return (team3maxplayers);
\r
1216 return (team4maxplayers);
\r
1221 // Set The Team Color
\r
1222 void (float tno) TeamFortress_TeamSetColor =
\r
1246 // Set The Team Number
\r
1247 float (float tno) TeamFortress_TeamSet =
\r
1252 if ((teamplay < 1))
\r
1254 sprint (self, "Teamplay is not On, so FortressTeams are inactive.\n");
\r
1257 if (((tno > number_of_teams) && (number_of_teams != 0)))
\r
1259 sprint (self, "There can be only ");
\r
1260 st = ftos (number_of_teams);
\r
1261 sprint (self, st);
\r
1262 sprint (self, " teams on this map.\nTry again\n");
\r
1265 if ((self.team_no > 0))
\r
1267 sprint (self, "You're already in Team No ");
\r
1268 st = ftos (self.team_no);
\r
1269 sprint (self, st);
\r
1270 sprint (self, ".\n");
\r
1273 tc = TeamFortress_TeamGetNoPlayers (tno);
\r
1274 if ((tc >= TeamFortress_TeamGetMaxPlayers (tno)))
\r
1276 sprint (self, "That team is full. Pick another.\n");
\r
1279 if ((TeamFortress_TeamGetColor (tno) == 0))
\r
1281 TeamFortress_TeamSetColor (tno);
\r
1282 if ((TeamFortress_TeamGetColor (tno) == 0))
\r
1284 sprint (self, "You can't start a new team with your color, since another ");
\r
1285 sprint (self, "already using that color. Change your pants color, then try again.\n");
\r
1288 bprint (self.netname);
\r
1289 bprint (" has started Team No ");
\r
1293 self.immune_to_check = (time + 10);
\r
1294 if (((toggleflags & 128) || (toggleflags & 2048)))
\r
1296 self.frags = TeamFortress_TeamGetScore (tno);
\r
1298 stuffcmd (self, "color ");
\r
1299 tc = (TeamFortress_TeamGetColor (tno) - 1);
\r
1301 stuffcmd (self, st);
\r
1302 stuffcmd (self, "\n");
\r
1303 self.team_no = tno;
\r
1304 self.lives = TeamFortress_TeamGetLives (tno);
\r
1305 //if ((self.class == 0))
\r
1306 if (self.playerclass == 0)
\r
1308 if (TeamFortress_TeamIsCivilian (self.team_no))
\r
1311 TeamFortress_ChangeClass ();
\r
1316 bprint (self.netname);
\r
1317 bprint (" has joined Team No ");
\r
1321 stuffcmd (self, "color ");
\r
1322 tc = (TeamFortress_TeamGetColor (tno) - 1);
\r
1324 stuffcmd (self, st);
\r
1325 stuffcmd (self, "\n");
\r
1326 self.team_no = tno;
\r
1327 self.immune_to_check = (time + 10);
\r
1328 self.lives = TeamFortress_TeamGetLives (tno);
\r
1329 if (((toggleflags & 128) || (toggleflags & 2048)))
\r
1331 self.frags = TeamFortress_TeamGetScore (tno);
\r
1333 TeamFortress_TeamShowMemberClasses (self);
\r
1334 //if ((self.playerclass == 0))
\r
1335 if ((self.class == 0))
\r
1337 if (TeamFortress_TeamIsCivilian (self.team_no))
\r
1340 TeamFortress_ChangeClass ();
\r
1346 // Get team score (used in conjunction with autoteam..)
\r
1347 float (float tno) TeamFortress_GetRealScore =
\r
1350 local float total;
\r
1352 te = find (world, classname, "player");
\r
1355 if (te.team_no == tno)
\r
1357 total = total + te.real_frags;
\r
1359 te = find (te, classname, "player");
\r
1364 // Find best team for player (autoteam?)
\r
1365 float() TeamFortress_TeamPutPlayerInTeam =
\r
1369 local float score1;
\r
1370 local float score2;
\r
1372 local float lowest;
\r
1373 local float likely_team;
\r
1376 likely_team = random() * number_of_teams;
\r
1377 likely_team = ceil(likely_team);
\r
1378 if (likely_team == 0)
\r
1380 likely_team = number_of_teams;
\r
1384 while (i < number_of_teams + 1)
\r
1386 j = TeamFortress_TeamGetNoPlayers(i);
\r
1390 if (TeamFortress_TeamGetMaxPlayers(i) > j)
\r
1396 // pablo. fancier autoteam for even teams.
\r
1397 else if (j == lowest)
\r
1400 if (TeamFortress_TeamGetMaxPlayers(i) > j)
\r
1402 score1 = TeamFortress_GetRealScore(i);
\r
1403 score2 = TeamFortress_GetRealScore(likely_team);
\r
1405 if ( score1 < score2 )
\r
1409 else if (score1 == score2)
\r
1411 if (random() > 0.5)
\r
1421 return TeamFortress_TeamSet(likely_team);
\r
1424 // Remove item_tfgoal timers
\r
1425 void() TeamFortress_RemoveTimers =
\r
1428 // self.leg_damage = 0; // No Snipers
\r
1429 // self.is_undercover = 0; // I think this function is called in PlayerKill
\r
1430 // self.is_building = 0; // To Be Added ?
\r
1431 // self.building = world; // To Be Added ?
\r
1432 if (self.tfstate & 2048)
\r
1434 self.tfstate = self.tfstate - 2048;
\r
1435 TeamFortress_SetSpeed(self);
\r
1438 te = find(world, classname, "timer");
\r
1439 while (te != world)
\r
1441 if (te.owner == self)
\r
1444 te = find(world, classname, "timer");
\r
1448 te = find(te, classname, "timer");
\r
1451 te = find(world, classname, "item_tfgoal");
\r
1454 if (te.owner == self)
\r
1456 if (!(te.goal_activation & 256))
\r
1458 tfgoalitem_RemoveFromPlayer(te, self, 0);
\r
1460 if (CTF_Map == 1 && te.goal_no == 1)
\r
1462 bprint(self.netname);
\r
1463 bprint(" ÌÏÓÔ the ÂÌÕÅ flag!\n");
\r
1467 if (CTF_Map == 1 && te.goal_no == 2)
\r
1469 bprint(self.netname);
\r
1470 bprint(" ÌÏÓÔ the ÒÅÄ flag!\n");
\r
1474 te = find(te, classname, "item_tfgoal");
\r
1476 te = find(world, classname, "detpack");
\r
1479 if (te.weaponmode == 1 && te.enemy == self)
\r
1481 te.weaponmode = 0;
\r
1483 te = find(te, classname, "detpack");
\r
1485 // TeamFortress_DetonatePipebombs(); gold. this is the old code for removing pipebombs on quitting. new one written by pablo is below.
\r
1486 // NO PIPEBOMBS IN NEXTF
\r
1487 /* te = find(world, classname, "pipebomb");
\r
1488 while (te != world)
\r
1490 if(te.owner == self)
\r
1492 decrement_team_pipebombs(self.team_no);
\r
1493 deathmsg = te.weapon;
\r
1495 T_RadiusDamage(te, self, 120, world);
\r
1498 WriteCoord(4, te.origin_x);
\r
1499 WriteCoord(4, te.origin_y);
\r
1500 WriteCoord(4, te.origin_z);
\r
1501 multicast(te.origin, TF_FLARE_OFF);
\r
1504 te = find(te, classname, "pipebomb");
\r
1506 // stuffcmd(self, "v_idlescale 0\n");
\r
1507 // stuffcmd(self, "v_cshift 0 0 0 0\n");
\r
1508 // self.item_list = 0; // To Be Added?
\r
1509 // self.FlashTime = 0;
\r
1510 CenterPrint(self, "\n");
\r
1511 self.menu_count = 25; // Menu Stuff - important
\r
1512 self.current_menu = 1; ////
\r
1516 // TF's Become Explosion
\r
1517 void() BecomeExplosion =
\r
1523 void(string halias, float himpulse1, float himpulse2) TeamFortress_Alias =
\r
1526 stuffcmd(self, "alias ");
\r
1527 stuffcmd(self, halias);
\r
1528 stuffcmd(self, " \"impulse ");
\r
1529 imp = ftos(himpulse1);
\r
1530 stuffcmd(self, imp);
\r
1531 if (himpulse2 != 0)
\r
1533 stuffcmd(self, ";wait; impulse ");
\r
1534 imp = ftos(himpulse2);
\r
1535 stuffcmd(self, imp);
\r
1537 stuffcmd(self, "\"\n");
\r
1540 float (float tno) TeamFortress_TeamGetIllegalClasses =
\r
1544 return (illegalclasses1);
\r
1548 return (illegalclasses2);
\r
1552 return (illegalclasses3);
\r
1556 return (illegalclasses4);
\r
1561 // Check if legal class
\r
1562 float (float tno, entity chkr, float NumOnTeam) Check_Class_Scout =
\r
1566 if (chkr.team1_scout == -1)
\r
1568 if (chkr.team1_scout != 0 && chkr.team1_scout == NumOnTeam)
\r
1575 if (chkr.team2_scout == -1)
\r
1577 if (chkr.team2_scout != 0 && chkr.team2_scout == NumOnTeam)
\r
1584 if (chkr.team3_scout == -1)
\r
1586 if (chkr.team3_scout != 0 && chkr.team3_scout == NumOnTeam)
\r
1593 if (chkr.team4_scout == -1)
\r
1595 if (chkr.team4_scout != 0 && chkr.team4_scout == NumOnTeam)
\r
1602 float (float tno, entity chkr, float NumOnTeam) Check_Class_Soldier =
\r
1606 if (chkr.team1_soldier == -1)
\r
1608 if (chkr.team1_soldier != 0 && chkr.team1_soldier == NumOnTeam)
\r
1615 if (chkr.team2_soldier == -1)
\r
1617 if (chkr.team2_soldier != 0 && chkr.team2_soldier == NumOnTeam)
\r
1624 if (chkr.team3_soldier == -1)
\r
1626 if (chkr.team3_soldier != 0 && chkr.team3_soldier == NumOnTeam)
\r
1633 if (chkr.team4_soldier == -1)
\r
1635 if (chkr.team4_soldier != 0 && chkr.team4_soldier == NumOnTeam)
\r
1642 float (float tno, entity chkr, float NumOnTeam) Check_Class_Medic =
\r
1646 if (chkr.team1_medic == -1)
\r
1648 if (chkr.team1_medic != 0 && chkr.team1_medic == NumOnTeam)
\r
1655 if (chkr.team2_medic == -1)
\r
1657 if (chkr.team2_medic != 0 && chkr.team2_medic == NumOnTeam)
\r
1664 if (chkr.team3_medic == -1)
\r
1666 if (chkr.team3_medic != 0 && chkr.team3_medic == NumOnTeam)
\r
1673 if (chkr.team4_medic == -1)
\r
1675 if (chkr.team4_medic != 0 && chkr.team4_medic == NumOnTeam)
\r
1682 float (float tno, entity chkr, float NumOnTeam) Check_Class_Pyro =
\r
1686 if (chkr.team1_pyro == -1)
\r
1688 if (chkr.team1_pyro != 0 && chkr.team1_pyro == NumOnTeam)
\r
1695 if (chkr.team2_pyro == -1)
\r
1697 if (chkr.team2_pyro != 0 && chkr.team2_pyro == NumOnTeam)
\r
1704 if (chkr.team3_pyro == -1)
\r
1706 if (chkr.team3_pyro != 0 && chkr.team3_pyro == NumOnTeam)
\r
1713 if (chkr.team4_pyro == -1)
\r
1715 if (chkr.team4_pyro != 0 && chkr.team4_pyro == NumOnTeam)
\r
1722 float (float tno, entity chkr, float NumOnTeam) Check_Class_Engineer =
\r
1726 if (chkr.team1_engineer == -1)
\r
1728 if (chkr.team1_engineer != 0 && chkr.team1_engineer == NumOnTeam)
\r
1735 if (chkr.team2_engineer == -1)
\r
1737 if (chkr.team2_engineer != 0 && chkr.team2_engineer == NumOnTeam)
\r
1744 if (chkr.team3_engineer == -1)
\r
1746 if (chkr.team3_engineer != 0 && chkr.team3_engineer == NumOnTeam)
\r
1753 if (chkr.team4_engineer == -1)
\r
1755 if (chkr.team4_engineer != 0 && chkr.team4_engineer == NumOnTeam)
\r
1762 float (float tno, entity chkr, float NumOnTeam) Check_Class_Spy =
\r
1766 if (chkr.team1_spy == -1)
\r
1768 if (chkr.team1_spy != 0 && chkr.team1_spy == NumOnTeam)
\r
1775 if (chkr.team2_spy == -1)
\r
1777 if (chkr.team2_spy != 0 && chkr.team2_spy == NumOnTeam)
\r
1784 if (chkr.team3_spy == -1)
\r
1786 if (chkr.team3_spy != 0 && chkr.team3_spy == NumOnTeam)
\r
1793 if (chkr.team4_spy == -1)
\r
1795 if (chkr.team4_spy != 0 && chkr.team4_spy == NumOnTeam)
\r
1802 float (float pc) IsLegalClass =
\r
1805 local float NumOnTeam;
\r
1808 // Team:Nexuiz class check
\r
1809 local entity findme;
\r
1810 local float yesorno;
\r
1812 findme = find (world,classname,"class_restrictions");
\r
1813 // findme = find (world, classname, "info_tfdetect");
\r
1816 // first, find the number of players of that class on a team
\r
1817 te = find (world, classname, "player");
\r
1820 if (te.playerclass == pc)
\r
1822 if (te.team_no == self.team_no)
\r
1824 NumOnTeam = NumOnTeam + 1;
\r
1827 te = find (te, classname, "player");
\r
1830 // next we check to see if the team is allowed to have that player class and the amount per team allowed for that class
\r
1831 if (pc == TF_CLASS_SCOUT)
\r
1832 yesorno = Check_Class_Scout(self.team_no, findme, NumOnTeam);
\r
1833 else if (pc == TF_CLASS_SOLDIER)
\r
1834 yesorno = Check_Class_Soldier(self.team_no, findme, NumOnTeam);
\r
1835 else if (pc == TF_CLASS_MEDIC)
\r
1836 yesorno = Check_Class_Medic(self.team_no, findme, NumOnTeam);
\r
1837 else if (pc == TF_CLASS_PYRO)
\r
1838 yesorno = Check_Class_Pyro(self.team_no, findme, NumOnTeam);
\r
1839 else if (pc == TF_CLASS_ENGINEER)
\r
1840 yesorno = Check_Class_Engineer(self.team_no, findme, NumOnTeam);
\r
1841 else if (pc == TF_CLASS_SPY)
\r
1842 yesorno = Check_Class_Spy(self.team_no, findme, NumOnTeam);
\r
1847 /* if (((spy_off == 1) && (pc == 8)))
\r
1918 if (((illegalclasses & bit) || (TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)))
\r
1925 // Display legal classes for map
\r
1926 void () TeamFortress_DisplayLegalClasses =
\r
1928 local float gotone;
\r
1931 sprint (self, "Legal Classes for your team are:\n");
\r
1933 ill = TeamFortress_TeamGetIllegalClasses (self.team_no);
\r
1934 if ((!(illegalclasses & 1) && !(ill & 1)))
\r
1938 sprint (self, ", ");
\r
1941 sprint (self, "Scout");
\r
1943 /* if ((!(illegalclasses & 2) && !(ill & 2)))
\r
1947 sprint (self, ", ");
\r
1950 sprint (self, "Sniper");
\r
1952 if ((!(illegalclasses & 4) && !(ill & 4)))
\r
1956 sprint (self, ", ");
\r
1959 sprint (self, "Soldier");
\r
1961 if ((!(illegalclasses & 8) && !(ill & 8)))
\r
1965 sprint (self, ", ");
\r
1968 sprint (self, "Demolitions Man");
\r
1970 if ((!(illegalclasses & 16) && !(ill & 16)))
\r
1974 sprint (self, ", ");
\r
1977 sprint (self, "Combat Medic");
\r
1979 if ((!(illegalclasses & 32) && !(ill & 32)))
\r
1983 sprint (self, ", ");
\r
1986 sprint (self, "Heavy Weapons Guy");
\r
1988 if ((!(illegalclasses & 64) && !(ill & 64)))
\r
1992 sprint (self, ", ");
\r
1995 sprint (self, "Pyro");
\r
1997 if ((!(illegalclasses & 256) && !(ill & 256)))
\r
2001 sprint (self, ", ");
\r
2004 sprint (self, "Spy");
\r
2006 if ((!(illegalclasses & 512) && !(ill & 512)))
\r
2010 sprint (self, ", ");
\r
2013 sprint (self, "Engineer");
\r
2015 if ((!(illegalclasses & 128) && !(ill & 128)))
\r
2019 sprint (self, ", ");
\r
2022 sprint (self, "RandomPC");
\r
2024 sprint (self, "\n");
\r
2027 // TF class change/select function
\r
2028 void() TeamFortress_ChangeClass =
\r
2030 // local float tc;
\r
2031 // local string st;
\r
2033 self.impulse += 100; //temp
\r
2035 if (self.playerclass != 0)
\r
2037 // if (deathmatch != 3)
\r
2041 if (TeamFortress_TeamIsCivilian(self.team_no))
\r
2043 sprint(self, "You cannot change class.\n");
\r
2046 if (!IsLegalClass(self.impulse - 100))
\r
2048 sprint(self, "Your team cannot play that class.\n");
\r
2049 TeamFortress_DisplayLegalClasses();
\r
2052 /* tc = IsRestrictedClass(self.impulse - 100); // TBA ADD THIS FUNCTION
\r
2053 if (tc != 0) // it's actually a megatf function
\r
2054 { // -- gonna need cvars for it
\r
2057 sprint(self, "That class is restricted to ");
\r
2060 sprint(self, " per team.\n");
\r
2064 sprint(self, "That class is disabled.\n");
\r
2068 self.nextpc = self.impulse - 100;
\r
2069 sprint(self, "After dying, you will return as a ");
\r
2070 TeamFortress_PrintClassName(self, self.nextpc, self.tfstate & 8);
\r
2071 self.immune_to_check = time + 10;
\r
2074 /*if (teamplay && self.team_no == 0) //handled in cmd function
\r
2076 if (toggleflags & 64)
\r
2078 if (TeamFortress_TeamPutPlayerInTeam() == 0)
\r
2085 sprint(self, "You must join a team first. \n");
\r
2086 sprint(self, "use imin1, imin2, imin3, or imin4\n");
\r
2090 if (self.lives == 0)
\r
2092 sprint(self, "You have no lives left.\n");
\r
2095 if (!IsLegalClass(self.impulse - 100) && self.impulse != 1)
\r
2097 sprint(self, "You cannot play that playerclass on this map. \n");
\r
2098 TeamFortress_DisplayLegalClasses();
\r
2102 /* tc = IsRestrictedClass(self.impulse - 100); // TBA
\r
2107 sprint(self, "That class is restricted to ");
\r
2110 sprint(self, " per team.\n");
\r
2114 sprint(self, "That class is disabled.\n");
\r
2118 if (self.impulse != 1 && !TeamFortress_TeamIsCivilian(self.team_no))
\r
2120 self.playerclass = self.impulse - 100;
\r
2124 self.playerclass = TF_CLASS_CIVILIAN;
\r
2126 if (self.playerclass == TF_CLASS_RANDOM)
\r
2128 sprint(self, "Random Playerclass.\n");
\r
2129 self.tfstate = self.tfstate | 8;
\r
2130 /* tc = 1 + floor(random() * (10 - 1));
\r
2131 while (IsRestrictedClass(tc) != 0)
\r
2133 tc = 1 + floor(random() * (10 - 1));
\r
2135 // self.playerclass = tc;
\r
2136 self.playerclass = 10;
\r
2137 ChooseRandomClass();
\r
2139 //ftos(TeamFortress_TeamGetIllegalClasses (self.team_no) & bit)
\r
2141 PutClientInServer (); //temp
\r
2144 // XavioR's new TF reload function
\r
2145 void (float o, float m, void () g) weapon_thinkf;
\r
2146 void () Reload_Restore_Weapon =
\r
2148 if (self.owner.weaponentity.pos1 != '0 0 0')
\r
2150 self.owner.weaponentity.pos1 = '0 0 0';
\r
2151 self.owner.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;
\r
2155 void (float rweapon, float amount) DoReload =
\r
2157 local float rtime;
\r
2159 if (self.reload_time > time)
\r
2164 weapon_action(self.weapon, WR_UPDATECOUNTS); // update ammo now
\r
2166 sprint(self, "Reloading...\n");
\r
2168 if (rweapon == 1) // Pistol
\r
2170 rtime = (amount * .35);
\r
2171 self.clip_pistol = CLIP_MAX_PISTOL;
\r
2173 if (rweapon == 2) // CryLink (flak cannon)
\r
2175 rtime = (amount * .80);
\r
2176 self.clip_crylink = CLIP_MAX_CRYLINK;
\r
2178 if (rweapon == 3) // Rocket launcher
\r
2180 rtime = (amount * 1.30);
\r
2181 self.clip_rockets = 4;
\r
2183 if (rweapon == 4) // Pipe Grenade Launcher
\r
2185 rtime = (amount * 1.05);
\r
2186 self.clip_pipegrenades = 6;
\r
2188 if (rweapon == 5) // Building something... (senrtry gun, tesla, etc.)
\r
2193 self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE;
\r
2194 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;
\r
2196 newmis.owner = self;
\r
2197 newmis.think = Reload_Restore_Weapon;
\r
2198 newmis.nextthink = time + rtime;
\r
2200 self.reload_time = time + rtime;
\r
2203 // Xavior's self.playerclass to self.class conversion
\r
2204 string(string s1, ...) strcat;
\r
2205 void () Do_TFClass_Conversion =
\r
2210 if (self.respawn_as_new_class > 0)
\r
2212 self.playerclass = self.respawn_as_new_class;
\r
2213 self.respawn_as_new_class = 0;
\r
2217 if (self.playerclass == TF_CLASS_CIVILIAN) {
\r
2218 self.class = CLASS_CIVILIAN;
\r
2219 cst = "civilian"; }
\r
2220 if (self.playerclass == TF_CLASS_SCOUT) {
\r
2221 self.class = CLASS_SCOUT;
\r
2223 if (self.playerclass == TF_CLASS_SOLDIER) {
\r
2224 self.class = CLASS_SOLDIER;
\r
2225 cst = "soldier"; }
\r
2226 if (self.playerclass == TF_CLASS_MEDIC) {
\r
2227 self.class = CLASS_MEDIC;
\r
2229 if (self.playerclass == TF_CLASS_PYRO) {
\r
2230 self.class = CLASS_PYRO;
\r
2232 if (self.playerclass == TF_CLASS_SPY) {
\r
2233 self.class = CLASS_SPY;
\r
2235 if (self.playerclass == TF_CLASS_ENGINEER) {
\r
2236 self.class = CLASS_ENGINEER;
\r
2237 cst = "engineer"; }
\r
2238 if (self.playerclass == TF_CLASS_RANDOM || self.tfstate == self.tfstate | 8) {
\r
2239 cst = ChooseRandomClass(); }
\r
2240 // Note to self: add Random and Civilian
\r
2242 cl = GetPlayerClass();
\r
2244 if (!self.class == cl)
\r
2246 if (cst == "civilian")
\r
2248 self.playermodel = strcat("models/class/",cst,".zym");
\r
2250 else if (cst == "engineer")
\r
2252 self.playermodel = strcat("models/class/",cst,"_other.zym");
\r
2256 self.playermodel = strcat("models/class/",cst,"_mechanical.zym");
\r
2259 SetPlayerSpeed(self);
\r
2262 // XavioR's Random Class select
\r
2263 string () ChooseRandomClass =
\r
2265 local float choose;
\r
2270 choose = (1 + floor ((random () * (10 - 1))));
\r
2271 if (IsLegalClass(choose) && choose != TF_CLASS_SNIPER && choose != TF_CLASS_DEMOMAN && choose != TF_CLASS_HWGUY)
\r
2274 // sprint (self, ftos(choose));
\r
2275 // sprint (self, "\n");
\r
2276 if (choose == TF_CLASS_SCOUT) {
\r
2277 self.class = CLASS_SCOUT;
\r
2278 return ("scout"); }
\r
2279 if (choose == TF_CLASS_SOLDIER) {
\r
2280 self.class = CLASS_SOLDIER;
\r
2281 return ("soldier"); }
\r
2282 if (choose == TF_CLASS_PYRO) {
\r
2283 self.class = CLASS_PYRO;
\r
2284 return ("pyro"); }
\r
2285 if (choose == TF_CLASS_ENGINEER) {
\r
2286 self.class = CLASS_ENGINEER;
\r
2287 return ("engineer"); }
\r
2288 if (choose == TF_CLASS_MEDIC) {
\r
2289 self.class = CLASS_MEDIC;
\r
2290 return ("medic"); }
\r
2291 if (choose == TF_CLASS_SPY) {
\r
2292 self.class = CLASS_SPY;
\r
2298 // Nail projectile and blood
\r
2299 float current_yaw;
\r
2300 float (float fl) anglemod =
\r
2313 vector () wall_velocity =
\r
2317 vel = normalize (self.velocity);
\r
2318 vel = normalize (((vel + (v_up * (random () - 0.5))) + (v_right * (random () - 0.5))));
\r
2319 vel = (vel + (2 * trace_plane_normal));
\r
2320 vel = (vel * 200);
\r
2324 void (vector org, float damage) SpawnBlood =
\r
2326 particle (org, '0 0 0', 73, (damage * 2));
\r
2329 void (float damage) spawn_touchblood =
\r
2333 vel = (wall_velocity () * 0.2);
\r
2334 SpawnBlood ((self.origin + (vel * 0.01)), damage);
\r
2337 void () superspike_touch =
\r
2341 /* if (self.voided) // temp?
\r
2345 self.voided = 1;*/
\r
2346 if (other == self.owner)
\r
2350 if (other.solid == 1)
\r
2354 if (pointcontents (self.origin) == -6)
\r
2359 if (other.takedamage)
\r
2361 spawn_touchblood (18);
\r
2362 deathmsg = self.weapon;
\r
2363 if ((deathmsg == 9))
\r
2371 if (self.owner.classname == "grenade")
\r
2373 TF_T_Damage (other, self, self.owner.owner, ndmg, 2, 2);
\r
2377 TF_T_Damage (other, self, self.owner, ndmg, 2, 2);
\r
2382 WriteByte (0, 23);
\r
2384 WriteCoord (0, self.origin_x);
\r
2385 WriteCoord (0, self.origin_y);
\r
2386 WriteCoord (0, self.origin_z);
\r
2391 void () spike_touch =
\r
2393 if (other.solid == 1)
\r
2397 if (pointcontents (self.origin) == -6)
\r
2402 if (other.takedamage)
\r
2404 spawn_touchblood (9);
\r
2405 deathmsg = self.weapon;
\r
2406 if (self.owner.classname == "grenade")
\r
2408 TF_T_Damage (other, self, self.owner.owner, 9, 2, 2);
\r
2412 TF_T_Damage (other, self, self.owner, 9, 2, 2);
\r
2417 WriteByte (4, 23);
\r
2418 if ((self.classname == "wizspike"))
\r
2424 if ((self.classname == "knightspike"))
\r
2433 WriteCoord (4, self.origin_x);
\r
2434 WriteCoord (4, self.origin_y);
\r
2435 WriteCoord (4, self.origin_z);
\r
2440 void(vector org) te_gunshot;
\r
2441 float EF_ADDITIVE/* = 32*/;
\r
2442 void () ChangeModelTime =
\r
2445 setmodel (self.owner, self.classname);
\r
2449 void (entity ent, string st, float wait_time) soonmodel =
\r
2455 x.nextthink = time + wait_time;
\r
2456 x.think = ChangeModelTime;
\r
2461 void (vector vect_a, vector vect_b) launch_spike =
\r
2463 local entity e; // bullet trail
\r
2465 newmis = spawn ();
\r
2466 newmis.owner = self;
\r
2467 newmis.movetype = 9;
\r
2469 newmis.angles = vectoangles (vect_b);
\r
2470 newmis.touch = spike_touch;
\r
2471 newmis.weapon = 3;
\r
2472 newmis.classname = "spike";
\r
2473 newmis.think = SUB_Remove;
\r
2474 newmis.nextthink = (time + 3);
\r
2475 if (deathmsg != 9)
\r
2477 setmodel (newmis, "models/plasmatrail.mdl");
\r
2479 setsize (newmis, '0 0 0', '0 0 0');
\r
2480 setorigin (newmis, vect_a);
\r
2481 newmis.velocity = (vect_b * 2000);
\r
2485 e.movetype = MOVETYPE_FLY;
\r
2486 e.solid = SOLID_NOT;
\r
2487 e.think = SUB_Remove;
\r
2488 e.nextthink = time + vlen(trace_endpos - self.origin) / 6000;
\r
2489 e.velocity = vect_b * 4000;
\r
2490 e.angles = vectoangles (vect_b);
\r
2492 // soonmodel (e, "models/tracer.mdl", .1);
\r
2493 setmodel (e, "models/tracer.mdl");
\r
2494 setsize (e, '0 0 0', '0 0 0');
\r
2495 setorigin (e, vect_a);
\r
2496 e.effects = e.effects | EF_ADDITIVE;
\r
2499 // TF's Ammo-Updater
\r
2500 void () W_SetCurrentAmmo =
\r
2502 weapon_action(self.weapon, WR_UPDATECOUNTS);
\r
2506 void (float tno, entity ignore, string st) teamsprint =
\r
2514 te = find (world, classname, "player");
\r
2517 if (((te.team_no == tno) && (te != ignore)))
\r
2521 te = find (te, classname, "player");
\r
2526 void (entity pl, string s1, string s2) CenterPrint2 =
\r
2528 centerprint (pl, s1, s2);
\r
2529 pl.StatusRefreshTime = (time + 1.5);
\r
2532 // another ammo check caleld by the menu system. I dont know exactly what function this is for. - XavioR
\r
2533 void(entity p) bound_other_ammo =
\r
2535 if (p.ammo_shells > TeamFortress_GetMaxAmmo(p, 256))
\r
2537 p.ammo_shells = TeamFortress_GetMaxAmmo(p, 256);
\r
2539 if (p.ammo_nails > TeamFortress_GetMaxAmmo(p, 512))
\r
2541 p.ammo_nails = TeamFortress_GetMaxAmmo(p, 512);
\r
2543 if (p.ammo_rockets > TeamFortress_GetMaxAmmo(p, 1024))
\r
2545 p.ammo_rockets = TeamFortress_GetMaxAmmo(p, 1024);
\r
2547 if (p.ammo_cells > TeamFortress_GetMaxAmmo(p, 2048))
\r
2549 p.ammo_cells = TeamFortress_GetMaxAmmo(p, 2048);
\r
2551 /* if (p.ammo_medikit > p.maxammo_medikit) // addme
\r
2553 p.ammo_medikit = p.maxammo_medikit;
\r
2555 if (p.armorvalue > p.maxarmor)
\r
2557 p.armorvalue = p.max_armor;
\r
2559 if (p.no_grenades_1 > 4)
\r
2561 p.no_grenades_1 = 4;
\r
2563 if (p.no_grenades_2 > 4)
\r
2565 p.no_grenades_2 = 4;
\r
2569 // TF Drop Flag Function
\r
2570 void () tfgoalitem_dropthink;
\r
2571 void () item_tfgoal_touch;
\r
2572 void () DropFlag =
\r
2574 local entity Item;
\r
2579 te = find (world, classname, "item_tfgoal");
\r
2582 if (te.owner == self)
\r
2586 te = find (te, classname, "item_tfgoal");
\r
2589 if (Item == world)
\r
2591 sprint (self, "You don't have the flag.\n");
\r
2596 if (self.DropFlagDelay > time)
\r
2598 sprint (self, "Can't drop again for another ");
\r
2599 f = ceil(self.DropFlagDelay - time);
\r
2601 sprint (self, st);
\r
2602 sprint (self, " seconds.\n");
\r
2605 self.DropFlagDelay = time + 10;
\r
2608 // Flash of particles
\r
2611 WriteCoord(4, self.origin_x);
\r
2612 WriteCoord(4, self.origin_y);
\r
2613 WriteCoord(4, self.origin_z);
\r
2615 tfgoalitem_RemoveFromPlayer(Item, self, 2);
\r
2617 setorigin (Item, self.origin - '0 0 -24'); // - vf*(16));// - '0 0 15'); //Item.origin = self.origin + v_forward*56 + '0 0 8';
\r
2618 Item.velocity = '0 0 1'; //((vf * 150) + '0 0 150';
\r
2619 //gold. i didn't even have to change the origin, just the velocity. used to be '0 0 150'
\r
2620 Item.goal_state = 2;
\r
2621 Item.movetype = 6;
\r
2622 Item.solid = TF_FLARE_OFF;
\r
2623 setsize(Item, '-16 -16 0', '16 16 56');
\r
2624 if (Item.mdl != string_null)
\r
2626 setmodel(Item, Item.mdl);
\r
2628 Item.option5 = time + 2;
\r
2631 Item.nextthink = time + 5;
\r
2632 Item.think = tfgoalitem_dropthink;
\r
2633 Item.touch = item_tfgoal_touch;
\r
2636 void () TeamNexuiz_GunDown = //brings first-person gun model down
\r
2638 self.weaponentity.pos1 = PLAYER_WEAPONSELECTION_RANGE;
\r
2639 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;
\r
2641 void () TeamNexuiz_GunUp = //brings first-person gun model up
\r
2643 if (self.weaponentity.pos1 != '0 0 0')
\r
2645 self.weaponentity.pos1 = '0 0 0';
\r
2646 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;
\r
2650 void centerprint_multi_9 (entity print_to, string str1, string str2, string str3, string str4, string str5, string str6, string str7, string str8, string str9)
\r
2652 local string tmsg;
\r
2654 tmsg = strcat(str1, str2);
\r
2655 tmsg = strcat(tmsg, str3);
\r
2656 tmsg = strcat(tmsg, str4);
\r
2657 tmsg = strcat(tmsg, str5);
\r
2658 tmsg = strcat(tmsg, str6);
\r
2659 tmsg = strcat(tmsg, str7);
\r
2660 tmsg = strcat(tmsg, str8);
\r
2661 tmsg = strcat(tmsg, str9);
\r
2662 CenterPrint(print_to, tmsg);
\r