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)) // Checks if class is legal for the map
\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
382 sprint (self, "After dying, you will return as a ");
\r
383 TeamFortress_PrintClassName (self, cl, (self.tfstate & 8));
\r
385 // sprint(self, "You will change class after you die\n");
\r
389 // allow change, possibly with stipulations (like force respawn)
\r
391 //bprint("allowing change\n");
\r
393 if(self.class == CLASS_SPY)
\r
397 //self.mdl = strzone(self.playermodel);
\r
400 // allow change, but instant kill & respawn
\r
401 if(cvar("g_classchange_force_respawn"))
\r
403 PlayerKilled(TRUE, world, world, 1, DEATH_CLASSCHANGE, '0 0 0', '0 0 0');
\r
408 // allow class change without a hitch
\r
409 ChangeClass(TRUE, TRUE);
\r
413 void ClassSpecial()
\r
415 if(self.class == CLASS_SCOUT)
\r
417 if(self.class == CLASS_SPY)
\r
419 if(self.class == CLASS_SOLDIER)
\r
421 if(self.class == CLASS_PYRO)
\r
423 if(self.class == CLASS_MEDIC)
\r
425 if(self.class == CLASS_ENGINEER)
\r
429 void ClassGrenade(float req)
\r
431 if(self.grenade_time > time)
\r
434 if(self.class == CLASS_SCOUT)
\r
436 if(self.class == CLASS_SPY)
\r
438 if(self.class == CLASS_SOLDIER)
\r
439 SoldierGrenade(req);
\r
440 if(self.class == CLASS_PYRO)
\r
442 if(self.class == CLASS_MEDIC)
\r
444 if(self.class == CLASS_ENGINEER)
\r
445 EngineerGrenade(req);
\r
448 void ClassPreThink()
\r
450 if(self.class == CLASS_SCOUT)
\r
452 if(self.class == CLASS_SPY)
\r
454 if(self.class == CLASS_SOLDIER)
\r
456 if(self.class == CLASS_PYRO)
\r
458 if(self.class == CLASS_MEDIC)
\r
460 if(self.class == CLASS_ENGINEER)
\r
461 EngineerPreThink();
\r
464 void ClassPostThink()
\r
466 if(self.class == CLASS_SCOUT)
\r
468 if(self.class == CLASS_SPY)
\r
470 if(self.class == CLASS_SOLDIER)
\r
471 SoldierPostThink();
\r
472 if(self.class == CLASS_PYRO)
\r
474 if(self.class == CLASS_MEDIC)
\r
476 if(self.class == CLASS_ENGINEER)
\r
477 EngineerPostThink();
\r
481 =========================
\r
482 Set MaxAmmo for classes
\r
483 Wazat - edit these values to whatever
\r
484 =========================
\r
486 void (float classnum) SetMaxAmmoFor =
\r
488 self.is_feigning = 0;
\r
489 self.leg_damage = 0; //temp here //so leg damage doesnt stay on player respawn
\r
490 // if no class is found, it will just default to these
\r
491 self.maxammo_shells = 200;
\r
492 self.maxammo_nails = 200;
\r
493 self.maxammo_cells = 40;
\r
494 self.maxammo_rockets = 40;
\r
495 self.maxammo_metal = 0;
\r
496 self.no_grenades_1 = 4;
\r
497 self.clip_rockets = CLIP_MAX_ROCKETS;
\r
498 self.clip_pistol = CLIP_MAX_PISTOL;
\r
499 self.tp_grenades_1 = 1;
\r
500 self.tp_grenades_2 = 0;
\r
502 if (classnum == CLASS_SCOUT) // Scout Supplies
\r
504 self.maxammo_shells = 200;
\r
505 self.maxammo_nails = 200;
\r
506 self.maxammo_cells = 40;
\r
507 self.maxammo_rockets = 40;
\r
508 self.clip_crylink = CLIP_MAX_CRYLINK;
\r
509 self.tp_grenades_1 = 9;
\r
511 else if (classnum == CLASS_SPY) { // Spy supplies
\r
512 self.maxammo_shells = 150;
\r
513 self.maxammo_nails = 200; // MAC10 uses nails
\r
514 self.maxammo_cells = 70;
\r
515 self.maxammo_rockets = 15;
\r
516 self.ammo_nails = 100;
\r
518 else if (classnum == CLASS_SOLDIER) {
\r
519 self.ammo_rockets = 62; //translates to 20
\r
520 self.maxammo_rockets = 40;
\r
521 self.tp_grenades_2 = 3;
\r
522 self.no_grenades_2 = 1;
\r
524 else if (classnum == CLASS_PYRO) {
\r
525 self.clip_pipegrenades = 6;
\r
527 else if (classnum == CLASS_ENGINEER) {
\r
528 self.maxammo_cells = 200;
\r
529 self.ammo_cells = 100;
\r
530 self.ammo_metal = 0;
\r
531 self.maxammo_metal = 200;
\r