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 return "Invalid Class";
\r
34 Returns the player's class by checking his model name
\r
37 float GetPlayerClass()
\r
40 //s = substring(self.playermodel,13,3);
\r
42 //bprint("Class Prefix: ");
\r
46 // only the prefix matters;
\r
47 // thus, you could have multiple medic models, such as a male and female.
\r
48 if(substring(self.playermodel,13,5)
\r
51 if(substring(self.playermodel,13,3)
\r
54 if(substring(self.playermodel,13,7)
\r
56 return CLASS_SOLDIER;
\r
57 if(substring(self.playermodel,13,4)
\r
60 if(substring(self.playermodel,13,5)
\r
63 if(substring(self.playermodel,13,8)
\r
65 return CLASS_ENGINEER;
\r
74 Changes the player's class
\r
78 void ChangeClass(float announce_change, float instant_change)
\r
80 float portion, aportion;
\r
82 bprint(self.netname, " becomes a ", NameOfClass(self.class), "\n");
\r
89 if(self.health < self.max_health)
\r
90 aportion = self.health / self.max_health;
\r
94 if(aportion < portion)
\r
98 if(self.armorvalue < self.max_armor)
\r
99 aportion = self.armorvalue / self.max_armor;
\r
103 if(aportion < portion)
\r
104 portion = aportion;
\r
107 if(self.class == CLASS_SCOUT)
\r
108 BecomeScout(portion);
\r
110 if(self.class == CLASS_SPY)
\r
111 BecomeSpy(portion);
\r
113 if(self.class == CLASS_SOLDIER)
\r
114 BecomeSoldier(portion);
\r
116 if(self.class == CLASS_PYRO)
\r
117 BecomePyro(portion);
\r
119 if(self.class == CLASS_MEDIC)
\r
120 BecomeMedic(portion);
\r
122 if(self.class == CLASS_ENGINEER)
\r
123 BecomeEngineer(portion);
\r
125 // set starting health
\r
126 if(!instant_change)//portion == 1.0)
\r
127 self.health = ceil(self.max_health * 1.2);
\r
129 self.health = self.max_health;
\r
130 // set starting armor
\r
131 if(!instant_change)//portion == 1.0)
\r
132 self.armorvalue = ceil(self.max_armor * 1.2);
\r
134 self.armorvalue = self.max_armor;
\r
137 //if(instant_change)
\r
138 // self.health = 2 + self.health * 0.8;
\r
141 float SetPlayerMass(entity pl)
\r
143 float m, extra_mass;
\r
144 if(self.class == CLASS_SCOUT)
\r
146 m = cvar("g_balance_class_scout_mass");
\r
148 else if(self.class == CLASS_SPY)
\r
150 m = cvar("g_balance_class_spy_mass");
\r
152 else if(self.class == CLASS_SOLDIER)
\r
154 m = cvar("g_balance_class_soldier_mass");
\r
156 else if(self.class == CLASS_PYRO)
\r
158 m = cvar("g_balance_class_pyro_mass");
\r
160 else if(self.class == CLASS_MEDIC)
\r
162 m = cvar("g_balance_class_medic_mass");
\r
164 else if(self.class == CLASS_ENGINEER)
\r
166 m = cvar("g_balance_class_engineer_mass");
\r
169 m = cvar("sv_maxspeed");
\r
171 // fixme: if I'm carrying a flag or extra weapon, add that mass
\r
175 extra_mass = extra_mass + self.wpn5.mass;
\r
178 self.mass = m + extra_mass;
\r
180 return m; // return what my natural mass is
\r
183 void SetPlayerSpeed(entity pl)
\r
185 local float s, m, plmass;
\r
187 if(self.class == CLASS_SCOUT)
\r
189 s = cvar("g_balance_class_scout_speed");
\r
190 //m = cvar("g_balance_class_scout_mass");
\r
192 else if(self.class == CLASS_SPY)
\r
194 s = cvar("g_balance_class_spy_speed");
\r
195 //m = cvar("g_balance_class_spy_mass");
\r
197 else if(self.class == CLASS_SOLDIER)
\r
199 s = cvar("g_balance_class_soldier_speed");
\r
200 //m = cvar("g_balance_class_soldier_mass");
\r
202 else if(self.class == CLASS_PYRO)
\r
204 s = cvar("g_balance_class_pyro_speed");
\r
205 //m = cvar("g_balance_class_pyro_mass");
\r
207 else if(self.class == CLASS_MEDIC)
\r
209 s = cvar("g_balance_class_medic_speed");
\r
210 //m = cvar("g_balance_class_medic_mass");
\r
212 else if(self.class == CLASS_ENGINEER)
\r
214 s = cvar("g_balance_class_engineer_speed");
\r
215 //m = cvar("g_balance_class_engineer_mass");
\r
219 // fixme: if I'm in a manned turret, set my speed to 0
\r
220 // fixme: if I'm piloting a vehicle, what to do?
\r
223 // if my mass is different because of what I'm carrying,
\r
226 m = SetPlayerMass(pl);
\r
232 s = ceil( s * (m / plmass ) );
\r
236 //bprint("debug: adjusting speed\n");
\r
239 //stuffcmd( pl, strcat("cl_movement_maxspeed ", temp , "\n"));
\r
240 //stuffcmd( pl, strcat("cl_movement_maxairspeed ", temp , "\n"));
\r
242 //stuffcmd( pl, strcat("cl_forwardspeed ", temp , "\n"));
\r
243 //stuffcmd( pl, strcat("cl_backspeed ", temp , "\n"));
\r
244 //stuffcmd( pl, strcat("cl_sidespeed ", temp , "\n"));
\r
245 //stuffcmd( pl, strcat("cl_upspeed ", temp , "\n"));
\r
257 Resets the player's model to what it should be when returning from invisibility,
\r
258 or trying to change class but not being allowed.
\r
262 void ResetPlayerModel(entity pl)
\r
264 local vector m1, m2;
\r
267 //precache_model (self.playermodel); needed?
\r
268 setmodel (pl, pl.playermodel);
\r
269 setsize (pl, m1, m2);
\r
274 CheckForClassChange
\r
276 Returns the player's class by checking his model.
\r
277 Called from PlayerPreThink whenever the player changes his model, before change is made.
\r
282 float CheckForClassChange()
\r
287 // FIXME: need an option to not allow class changes at all once the player has changed once
\r
289 //bprint("check if allow change\n");
\r
291 // don't monitor the player's model when he's dead.
\r
292 // this means he can change class when dead and respawn as the new class.
\r
293 if(self.health <= 0) // fixme: or if player is an observer
\r
296 //bprint("healthy\n");
\r
298 if(self.playermodel == self.mdl)
\r
299 return 0; // haven't changed models since last legitimate change
\r
301 //bprint("model has changed\n");
\r
303 cl = GetPlayerClass();
\r
304 if(self.class == cl) // changed models, but it didn't affect my class
\r
306 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
307 self.change_mdl_on_respawn = "";
\r
311 //bprint("class changed\n");
\r
314 // it's changed; now figure out what to do about it
\r
316 // don't allow player class
\r
317 if(cvar("g_classchange_not_allowed"))
\r
319 self.playermodel = self.mdl; // return to old model
\r
320 ResetPlayerModel(self);
\r
322 /*local vector m1, m2;
\r
323 self.playermodel = self.model; // return to old model
\r
326 //precache_model (self.playermodel); needed?
\r
327 setmodel (self, self.playermodel);
\r
328 setsize (self, m1, m2);*/
\r
332 if (cl == CLASS_SCOUT)
\r
334 tfcl = TF_CLASS_SCOUT;
\r
336 else if (cl == CLASS_SOLDIER)
\r
338 tfcl = TF_CLASS_SOLDIER;
\r
340 else if (cl == CLASS_MEDIC)
\r
342 tfcl = TF_CLASS_MEDIC;
\r
344 else if (cl == CLASS_PYRO)
\r
346 tfcl = TF_CLASS_PYRO;
\r
348 else if (cl == CLASS_ENGINEER)
\r
350 tfcl = TF_CLASS_ENGINEER;
\r
352 else if (cl == CLASS_SPY)
\r
354 tfcl = TF_CLASS_SPY;
\r
357 if (self.lives == 0)
\r
359 self.playermodel = self.mdl; // return to old model
\r
360 ResetPlayerModel(self);
\r
361 sprint(self, "You have no lives left.\n");
\r
364 if (!IsLegalClass(tfcl))
\r
366 self.playermodel = self.mdl; // return to old model
\r
367 ResetPlayerModel(self);
\r
368 sprint(self, "You cannot play that playerclass on this map. \n");
\r
369 TeamFortress_DisplayLegalClasses();
\r
372 self.respawn_as_new_class = tfcl; // makes sure conversion from TF .playerclass goes through
\r
374 // allow change, but don't take effect until death
\r
375 if(cvar("g_classchange_delay_until_death"))
\r
377 self.change_mdl_on_respawn = self.playermodel;
\r
378 self.change_mdl_on_respawn = strzone(self.change_mdl_on_respawn);
\r
379 self.playermodel = self.model;
\r
380 if (self.team_no > 0)
\r
381 sprint(self, "You will change class after you die\n");
\r
385 // allow change, possibly with stipulations (like force respawn)
\r
387 //bprint("allowing change\n");
\r
389 if(self.class == CLASS_SPY)
\r
393 //self.mdl = strzone(self.playermodel);
\r
396 // allow change, but instant kill & respawn
\r
397 if(cvar("g_classchange_force_respawn"))
\r
399 PlayerKilled(TRUE, world, world, 1, DEATH_CLASSCHANGE, '0 0 0', '0 0 0');
\r
404 // allow class change without a hitch
\r
405 ChangeClass(TRUE, TRUE);
\r
409 void ClassSpecial()
\r
411 if(self.class == CLASS_SCOUT)
\r
413 if(self.class == CLASS_SPY)
\r
415 if(self.class == CLASS_SOLDIER)
\r
417 if(self.class == CLASS_PYRO)
\r
419 if(self.class == CLASS_MEDIC)
\r
421 if(self.class == CLASS_ENGINEER)
\r
425 void ClassGrenade(float req)
\r
427 if(self.grenade_time > time)
\r
430 if(self.class == CLASS_SCOUT)
\r
432 if(self.class == CLASS_SPY)
\r
434 if(self.class == CLASS_SOLDIER)
\r
435 SoldierGrenade(req);
\r
436 if(self.class == CLASS_PYRO)
\r
438 if(self.class == CLASS_MEDIC)
\r
440 if(self.class == CLASS_ENGINEER)
\r
441 EngineerGrenade(req);
\r
444 void ClassPreThink()
\r
446 if(self.class == CLASS_SCOUT)
\r
448 if(self.class == CLASS_SPY)
\r
450 if(self.class == CLASS_SOLDIER)
\r
452 if(self.class == CLASS_PYRO)
\r
454 if(self.class == CLASS_MEDIC)
\r
456 if(self.class == CLASS_ENGINEER)
\r
457 EngineerPreThink();
\r
460 void ClassPostThink()
\r
462 if(self.class == CLASS_SCOUT)
\r
464 if(self.class == CLASS_SPY)
\r
466 if(self.class == CLASS_SOLDIER)
\r
467 SoldierPostThink();
\r
468 if(self.class == CLASS_PYRO)
\r
470 if(self.class == CLASS_MEDIC)
\r
472 if(self.class == CLASS_ENGINEER)
\r
473 EngineerPostThink();
\r
477 =========================
\r
478 Set MaxAmmo for classes
\r
479 Wazat - edit these values to whatever
\r
480 =========================
\r
482 void (float classnum) SetMaxAmmoFor =
\r
484 self.leg_damage = 0; //temp here //so leg damage doesnt stay on player respawn
\r
485 // if no class is found, it will just default to these
\r
486 self.maxammo_shells = 200;
\r
487 self.maxammo_nails = 200;
\r
488 self.maxammo_cells = 40;
\r
489 self.maxammo_rockets = 40;
\r
490 self.no_grenades_1 = 4;
\r
491 self.clip_rockets = 4;
\r
492 self.tp_grenades_1 = 1;
\r
493 self.tp_grenades_2 = 0;
\r
495 if (classnum == CLASS_SCOUT) // Scout Supplies
\r
497 self.maxammo_shells = 200;
\r
498 self.maxammo_nails = 200;
\r
499 self.maxammo_cells = 40;
\r
500 self.maxammo_rockets = 40;
\r
501 self.clip_crylink = CLIP_MAX_CRYLINK;
\r
502 self.tp_grenades_1 = 9;
\r
504 else if (classnum == CLASS_SPY) { // Spy supplies
\r
505 self.maxammo_shells = 150;
\r
506 self.maxammo_nails = 80;
\r
507 self.maxammo_cells = 70;
\r
508 self.maxammo_rockets = 15;
\r
510 else if (classnum == CLASS_SOLDIER) {
\r
511 self.maxammo_rockets = 40;
\r
512 self.tp_grenades_2 = 3;
\r
514 else if (classnum == CLASS_PYRO) {
\r
515 self.clip_pipegrenades = 6;
\r
517 else if (classnum == CLASS_ENGINEER) {
\r
518 self.maxammo_cells = 200;
\r
519 self.ammo_cells = 100;
\r