2 void PlayerKilled (float unnatural_death, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
\r
10 Translates class number to a string for printing
\r
13 string NameOfClass(float cl)
\r
15 if(cl == CLASS_SCOUT)
\r
19 if(cl == CLASS_SOLDIER)
\r
21 if(cl == CLASS_PYRO)
\r
23 if(cl == CLASS_MEDIC)
\r
25 if(cl == CLASS_ENGINEER)
\r
27 if(cl == CLASS_CIVILIAN)
\r
29 return "Invalid Class";
\r
36 Returns the player's class by checking his model name
\r
39 float GetPlayerClass()
\r
42 //s = substring(self.playermodel,13,3);
\r
44 //bprint("Class Prefix: ");
\r
48 // only the prefix matters;
\r
49 // thus, you could have multiple medic models, such as a male and female.
\r
50 if(substring(self.playermodel,13,5)
\r
53 if(substring(self.playermodel,13,3)
\r
56 if(substring(self.playermodel,13,7)
\r
58 return CLASS_SOLDIER;
\r
59 if(substring(self.playermodel,13,4)
\r
62 if(substring(self.playermodel,13,5)
\r
65 if(substring(self.playermodel,13,8)
\r
67 return CLASS_ENGINEER;
\r
76 Changes the player's class
\r
80 void ChangeClass(float announce_change, float instant_change)
\r
82 float portion, aportion;
\r
84 bprint(self.netname, " becomes a ", NameOfClass(self.class), "\n");
\r
91 if(self.health < self.max_health)
\r
92 aportion = self.health / self.max_health;
\r
96 if(aportion < portion)
\r
100 if(self.armorvalue < self.max_armor)
\r
101 aportion = self.armorvalue / self.max_armor;
\r
105 if(aportion < portion)
\r
106 portion = aportion;
\r
109 if(self.class == CLASS_SCOUT)
\r
110 BecomeScout(portion);
\r
112 if(self.class == CLASS_SPY)
\r
113 BecomeSpy(portion);
\r
115 if(self.class == CLASS_SOLDIER)
\r
116 BecomeSoldier(portion);
\r
118 if(self.class == CLASS_PYRO)
\r
119 BecomePyro(portion);
\r
121 if(self.class == CLASS_MEDIC)
\r
122 BecomeMedic(portion);
\r
124 if(self.class == CLASS_ENGINEER)
\r
125 BecomeEngineer(portion);
\r
127 if(self.class == CLASS_CIVILIAN)
\r
128 BecomeCivilian(portion);
\r
131 // set starting health
\r
132 if(!instant_change)//portion == 1.0)
\r
133 self.health = ceil(self.max_health * 1.2);
\r
135 self.health = self.max_health;
\r
136 // set starting armor
\r
137 if(!instant_change)//portion == 1.0)
\r
138 self.armorvalue = ceil(self.max_armor * 1.2);
\r
140 self.armorvalue = self.max_armor;
\r
143 //if(instant_change)
\r
144 // self.health = 2 + self.health * 0.8;
\r
147 float SetPlayerMass(entity pl)
\r
149 float m, extra_mass;
\r
150 if(self.class == CLASS_SCOUT)
\r
152 m = cvar("g_balance_class_scout_mass");
\r
154 else if(self.class == CLASS_SPY)
\r
156 m = cvar("g_balance_class_spy_mass");
\r
158 else if(self.class == CLASS_SOLDIER)
\r
160 m = cvar("g_balance_class_soldier_mass");
\r
162 else if(self.class == CLASS_PYRO)
\r
164 m = cvar("g_balance_class_pyro_mass");
\r
166 else if(self.class == CLASS_MEDIC)
\r
168 m = cvar("g_balance_class_medic_mass");
\r
170 else if(self.class == CLASS_ENGINEER)
\r
172 m = cvar("g_balance_class_engineer_mass");
\r
175 m = cvar("sv_maxspeed");
\r
177 // fixme: if I'm carrying a flag or extra weapon, add that mass
\r
181 extra_mass = extra_mass + self.wpn5.mass;
\r
184 self.mass = m + extra_mass;
\r
186 return m; // return what my natural mass is
\r
189 void SetPlayerSpeed(entity pl)
\r
191 local float s, m, plmass;
\r
193 if(self.class == CLASS_SCOUT)
\r
195 s = cvar("g_balance_class_scout_speed");
\r
196 //m = cvar("g_balance_class_scout_mass");
\r
198 else if(self.class == CLASS_SPY)
\r
200 s = cvar("g_balance_class_spy_speed");
\r
201 //m = cvar("g_balance_class_spy_mass");
\r
203 else if(self.class == CLASS_SOLDIER)
\r
205 s = cvar("g_balance_class_soldier_speed");
\r
206 //m = cvar("g_balance_class_soldier_mass");
\r
208 else if(self.class == CLASS_PYRO)
\r
210 s = cvar("g_balance_class_pyro_speed");
\r
211 //m = cvar("g_balance_class_pyro_mass");
\r
213 else if(self.class == CLASS_MEDIC)
\r
215 s = cvar("g_balance_class_medic_speed");
\r
216 //m = cvar("g_balance_class_medic_mass");
\r
218 else if(self.class == CLASS_ENGINEER)
\r
220 s = cvar("g_balance_class_engineer_speed");
\r
221 //m = cvar("g_balance_class_engineer_mass");
\r
223 else if(self.class == CLASS_CIVILIAN)
\r
225 s = cvar("g_balance_class_civilian_speed");
\r
230 // fixme: if I'm in a manned turret, set my speed to 0
\r
231 // fixme: if I'm piloting a vehicle, what to do?
\r
234 // if my mass is different because of what I'm carrying,
\r
237 m = SetPlayerMass(pl);
\r
243 s = ceil( s * (m / plmass ) );
\r
247 //bprint("debug: adjusting speed\n");
\r
250 //stuffcmd( pl, strcat("cl_movement_maxspeed ", temp , "\n"));
\r
251 //stuffcmd( pl, strcat("cl_movement_maxairspeed ", temp , "\n"));
\r
253 //stuffcmd( pl, strcat("cl_forwardspeed ", temp , "\n"));
\r
254 //stuffcmd( pl, strcat("cl_backspeed ", temp , "\n"));
\r
255 //stuffcmd( pl, strcat("cl_sidespeed ", temp , "\n"));
\r
256 //stuffcmd( pl, strcat("cl_upspeed ", temp , "\n"));
\r
268 Resets the player's model to what it should be when returning from invisibility,
\r
269 or trying to change class but not being allowed.
\r
273 void ResetPlayerModel(entity pl)
\r
275 local vector m1, m2;
\r
278 //precache_model (self.playermodel); needed?
\r
279 setmodel (pl, pl.playermodel);
\r
280 setsize (pl, m1, m2);
\r
285 CheckForClassChange
\r
287 Returns the player's class by checking his model.
\r
288 Called from PlayerPreThink whenever the player changes his model, before change is made.
\r
293 float CheckForClassChange()
\r
298 // FIXME: need an option to not allow class changes at all once the player has changed once
\r
300 //bprint("check if allow change\n");
\r
302 // don't monitor the player's model when he's dead.
\r
303 // this means he can change class when dead and respawn as the new class.
\r
304 //if(self.health <= 0) // fixme: or if player is an observer
\r
307 // bprint("healthy\n");
\r
309 if(self.playermodel == self.mdl)
\r
310 return 0; // haven't changed models since last legitimate change
\r
312 //bprint("model has changed\n");
\r
314 cl = GetPlayerClass();
\r
315 if(self.class == cl) // changed models, but it didn't affect my class
\r
317 if(self.change_mdl_on_respawn) // if was going to change class, but I just switched models of the same class I'm in now, undo the future class change
\r
318 self.change_mdl_on_respawn = "";
\r
322 //bprint("class changed\n");
\r
325 // it's changed; now figure out what to do about it
\r
327 // don't allow player class
\r
328 if(cvar("g_classchange_not_allowed"))
\r
330 self.playermodel = self.mdl; // return to old model
\r
331 ResetPlayerModel(self);
\r
333 /*local vector m1, m2;
\r
334 self.playermodel = self.model; // return to old model
\r
337 //precache_model (self.playermodel); needed?
\r
338 setmodel (self, self.playermodel);
\r
339 setsize (self, m1, m2);*/
\r
343 if (cl == CLASS_SCOUT)
\r
345 tfcl = TF_CLASS_SCOUT;
\r
347 else if (cl == CLASS_SOLDIER)
\r
349 tfcl = TF_CLASS_SOLDIER;
\r
351 else if (cl == CLASS_MEDIC)
\r
353 tfcl = TF_CLASS_MEDIC;
\r
355 else if (cl == CLASS_PYRO)
\r
357 tfcl = TF_CLASS_PYRO;
\r
359 else if (cl == CLASS_ENGINEER)
\r
361 tfcl = TF_CLASS_ENGINEER;
\r
363 else if (cl == CLASS_SPY)
\r
365 tfcl = TF_CLASS_SPY;
\r
368 if (self.lives == 0)
\r
370 self.playermodel = self.mdl; // return to old model
\r
371 ResetPlayerModel(self);
\r
372 sprint(self, "You have no lives left.\n");
\r
375 if (!IsLegalClass(tfcl)) // Checks if class is legal for the map
\r
377 self.playermodel = self.mdl; // return to old model
\r
378 ResetPlayerModel(self);
\r
379 sprint(self, "You cannot play that playerclass on this map. \n");
\r
380 TeamFortress_DisplayLegalClasses();
\r
383 self.respawn_as_new_class = tfcl; // makes sure conversion from TF .playerclass goes through
\r
385 // allow change, but don't take effect until death
\r
386 if(cvar("g_classchange_delay_until_death"))
\r
388 self.change_mdl_on_respawn = self.playermodel;
\r
389 self.change_mdl_on_respawn = strzone(self.change_mdl_on_respawn);
\r
390 self.playermodel = self.model;
\r
391 if (self.team_no > 0)
\r
393 sprint (self, "After dying, you will return as a ");
\r
394 TeamFortress_PrintClassName (self, cl, (self.tfstate & 8));
\r
396 // sprint(self, "You will change class after you die\n");
\r
400 // allow change, possibly with stipulations (like force respawn)
\r
402 //bprint("allowing change\n");
\r
404 if(self.class == CLASS_SPY)
\r
408 //self.mdl = strzone(self.playermodel);
\r
411 // allow change, but instant kill & respawn
\r
412 if(cvar("g_classchange_force_respawn"))
\r
414 PlayerKilled(TRUE, world, world, 1, DEATH_CLASSCHANGE, '0 0 0', '0 0 0');
\r
419 // allow class change without a hitch
\r
420 ChangeClass(TRUE, TRUE);
\r
424 void ClassSpecial()
\r
426 if(self.class == CLASS_SCOUT)
\r
428 if(self.class == CLASS_SPY)
\r
430 if(self.class == CLASS_SOLDIER)
\r
432 if(self.class == CLASS_PYRO)
\r
434 if(self.class == CLASS_MEDIC)
\r
436 if(self.class == CLASS_ENGINEER)
\r
440 void ClassGrenade(float req)
\r
442 if(self.grenade_time > time)
\r
445 if(self.class == CLASS_SCOUT)
\r
447 if(self.class == CLASS_SPY)
\r
449 if(self.class == CLASS_SOLDIER)
\r
450 SoldierGrenade(req);
\r
451 if(self.class == CLASS_PYRO)
\r
453 if(self.class == CLASS_MEDIC)
\r
455 if(self.class == CLASS_ENGINEER)
\r
456 EngineerGrenade(req);
\r
459 void ClassPreThink()
\r
461 if(self.class == CLASS_SCOUT)
\r
463 if(self.class == CLASS_SPY)
\r
465 if(self.class == CLASS_SOLDIER)
\r
467 if(self.class == CLASS_PYRO)
\r
469 if(self.class == CLASS_MEDIC)
\r
471 if(self.class == CLASS_ENGINEER)
\r
472 EngineerPreThink();
\r
473 if(self.class == CLASS_CIVILIAN)
\r
474 EngineerPreThink();
\r
477 void ClassPostThink()
\r
479 if(self.class == CLASS_SCOUT)
\r
481 if(self.class == CLASS_SPY)
\r
483 if(self.class == CLASS_SOLDIER)
\r
484 SoldierPostThink();
\r
485 if(self.class == CLASS_PYRO)
\r
487 if(self.class == CLASS_MEDIC)
\r
489 if(self.class == CLASS_ENGINEER)
\r
490 EngineerPostThink();
\r
491 if(self.class == CLASS_CIVILIAN)
\r
492 CivilianPostThink();
\r
496 =========================
\r
497 Set MaxAmmo for classes
\r
498 Wazat - edit these values to whatever
\r
499 =========================
\r
501 void (float classnum) SetMaxAmmoFor =
\r
503 self.is_feigning = 0;
\r
504 self.leg_damage = 0; //temp here //so leg damage doesnt stay on player respawn
\r
505 // if no class is found, it will just default to these
\r
506 self.maxammo_shells = 200;
\r
507 self.maxammo_nails = 200;
\r
508 self.maxammo_cells = 40;
\r
509 self.maxammo_rockets = 40;
\r
510 self.maxammo_metal = 0;
\r
511 self.no_grenades_1 = 4;
\r
512 self.clip_rockets = CLIP_MAX_ROCKETS;
\r
513 self.clip_pistol = CLIP_MAX_PISTOL;
\r
514 self.tp_grenades_1 = 1;
\r
515 self.tp_grenades_2 = 0;
\r
517 if (classnum == CLASS_SCOUT) // Scout Supplies
\r
519 self.maxammo_shells = 200;
\r
520 self.maxammo_nails = 200;
\r
521 self.maxammo_cells = 40;
\r
522 self.maxammo_rockets = 45;
\r
523 self.clip_crylink = CLIP_MAX_CRYLINK;
\r
524 self.tp_grenades_1 = 9;
\r
526 else if (classnum == CLASS_SPY) { // Spy supplies
\r
527 self.maxammo_shells = 150;
\r
528 self.maxammo_nails = 200; // MAC10 uses nails
\r
529 self.maxammo_cells = 70;
\r
530 self.maxammo_rockets = 15;
\r
531 self.ammo_nails = 100;
\r
532 self.tp_grenades_1 = 9;
\r
533 self.no_grenades_2 = 1;
\r
535 else if (classnum == CLASS_SOLDIER) {
\r
536 self.ammo_rockets = 62; //translates to 20
\r
537 self.maxammo_rockets = 40;
\r
538 self.tp_grenades_2 = 3;
\r
539 self.no_grenades_2 = 1;
\r
541 else if (classnum == CLASS_PYRO) {
\r
542 self.clip_pipegrenades = 6;
\r
544 else if (classnum == CLASS_ENGINEER) {
\r
545 self.maxammo_cells = 200;
\r
546 self.ammo_cells = 100;
\r
547 self.ammo_metal = 0;
\r
548 self.maxammo_metal = 200;
\r