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
286 // FIXME: need an option to not allow class changes at all once the player has changed once
\r
288 //bprint("check if allow change\n");
\r
290 // don't monitor the player's model when he's dead.
\r
291 // this means he can change class when dead and respawn as the new class.
\r
292 if(self.health <= 0) // fixme: or if player is an observer
\r
295 //bprint("healthy\n");
\r
297 if(self.playermodel == self.mdl)
\r
298 return 0; // haven't changed models since last legitimate change
\r
300 //bprint("model has changed\n");
\r
302 cl = GetPlayerClass();
\r
303 if(self.class == cl) // changed models, but it didn't affect my class
\r
305 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
306 self.change_mdl_on_respawn = "";
\r
310 //bprint("class changed\n");
\r
313 // it's changed; now figure out what to do about it
\r
315 // don't allow player class
\r
316 if(cvar("g_classchange_not_allowed"))
\r
318 self.playermodel = self.mdl; // return to old model
\r
319 ResetPlayerModel(self);
\r
321 /*local vector m1, m2;
\r
322 self.playermodel = self.model; // return to old model
\r
325 //precache_model (self.playermodel); needed?
\r
326 setmodel (self, self.playermodel);
\r
327 setsize (self, m1, m2);*/
\r
331 // allow change, but don't take effect until death
\r
332 if(cvar("g_classchange_delay_until_death"))
\r
334 self.change_mdl_on_respawn = self.playermodel;
\r
335 self.change_mdl_on_respawn = strzone(self.change_mdl_on_respawn);
\r
336 self.playermodel = self.model;
\r
337 if (self.team_no > 0)
\r
338 sprint(self, "You will change class after you die\n");
\r
342 // allow change, possibly with stipulations (like force respawn)
\r
344 //bprint("allowing change\n");
\r
346 if(self.class == CLASS_SPY)
\r
350 //self.mdl = strzone(self.playermodel);
\r
353 // allow change, but instant kill & respawn
\r
354 if(cvar("g_classchange_force_respawn"))
\r
356 PlayerKilled(TRUE, world, world, 1, DEATH_CLASSCHANGE, '0 0 0', '0 0 0');
\r
361 // allow class change without a hitch
\r
362 ChangeClass(TRUE, TRUE);
\r
366 void ClassSpecial()
\r
368 if(self.class == CLASS_SCOUT)
\r
370 if(self.class == CLASS_SPY)
\r
372 if(self.class == CLASS_SOLDIER)
\r
374 if(self.class == CLASS_PYRO)
\r
376 if(self.class == CLASS_MEDIC)
\r
378 if(self.class == CLASS_ENGINEER)
\r
382 void ClassGrenade(float req)
\r
384 if(self.grenade_time > time)
\r
387 if(self.class == CLASS_SCOUT)
\r
389 if(self.class == CLASS_SPY)
\r
391 if(self.class == CLASS_SOLDIER)
\r
392 SoldierGrenade(req);
\r
393 if(self.class == CLASS_PYRO)
\r
395 if(self.class == CLASS_MEDIC)
\r
397 if(self.class == CLASS_ENGINEER)
\r
398 EngineerGrenade(req);
\r
401 void ClassPreThink()
\r
403 if(self.class == CLASS_SCOUT)
\r
405 if(self.class == CLASS_SPY)
\r
407 if(self.class == CLASS_SOLDIER)
\r
409 if(self.class == CLASS_PYRO)
\r
411 if(self.class == CLASS_MEDIC)
\r
413 if(self.class == CLASS_ENGINEER)
\r
414 EngineerPreThink();
\r
417 void ClassPostThink()
\r
419 if(self.class == CLASS_SCOUT)
\r
421 if(self.class == CLASS_SPY)
\r
423 if(self.class == CLASS_SOLDIER)
\r
424 SoldierPostThink();
\r
425 if(self.class == CLASS_PYRO)
\r
427 if(self.class == CLASS_MEDIC)
\r
429 if(self.class == CLASS_ENGINEER)
\r
430 EngineerPostThink();
\r
434 =========================
\r
435 Set MaxAmmo for classes
\r
436 Wazat - edit these values to whatever
\r
437 =========================
\r
439 void (float classnum) SetMaxAmmoFor =
\r
441 // if no class is found, it will just default to these
\r
442 self.maxammo_shells = 200;
\r
443 self.maxammo_nails = 200;
\r
444 self.maxammo_cells = 40;
\r
445 self.maxammo_rockets = 40;
\r
446 self.no_grenades_1 = 4;
\r
447 self.clip_rockets = 4;
\r
449 if (classnum == CLASS_SCOUT) // Scout Supplies
\r
451 self.maxammo_shells = 200;
\r
452 self.maxammo_nails = 200;
\r
453 self.maxammo_cells = 40;
\r
454 self.maxammo_rockets = 40;
\r
455 self.clip_crylink = CLIP_MAX_CRYLINK;
\r
457 else if (classnum == 2) { // Spy supplies
\r
458 self.maxammo_shells = 150;
\r
459 self.maxammo_nails = 80;
\r
460 self.maxammo_cells = 70;
\r
461 self.maxammo_rockets = 15;
\r
463 else if (classnum == CLASS_SOLDIER) {
\r
464 self.maxammo_rockets = 40;
\r
466 else if (classnum == CLASS_PYRO) {
\r
467 self.clip_pipegrenades = 6;
\r