self.enemy = oldself;
self.lip = oldself.lip;
self.colormap = oldself.colormap;
+ self.glowmod = oldself.glowmod;
self.iscreature = oldself.iscreature;
self.angles = oldself.angles;
self.avelocity = oldself.avelocity;
self.movetype = oldself.movetype;
self.nextthink = oldself.nextthink;
self.solid = oldself.solid;
+ self.ballistics_density = oldself.ballistics_density;
self.takedamage = oldself.takedamage;
self.think = oldself.think;
self.customizeentityforclient = oldself.customizeentityforclient;
float player_getspecies()
{
+ float s;
get_model_parameters(self.playermodel, self.skinindex);
- if(get_model_parameters_species >= 0)
- {
- get_model_parameters(string_null, 0);
- return get_model_parameters_species;
- }
+ s = get_model_parameters_species;
get_model_parameters(string_null, 0);
- return SPECIES_HUMAN;
+ if(s < 0)
+ return SPECIES_HUMAN;
+ return s;
}
void player_setupanimsformodel()
}
void ClientKill_Now_TeamChange();
+void freezetag_CheckWinner();
+void freezetag_Unfreeze();
void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
else
Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
- if((g_arena && numspawned < 2) || (g_ca && player_cnt < 2) && !inWarmupStage)
+ if((g_arena && numspawned < 2) || (g_ca && ca_players < required_ca_players) && !inWarmupStage)
return;
if (!g_minstagib)
take = damage;
}
+ frag_inflictor = inflictor;
+ frag_attacker = attacker;
+ frag_target = self;
+ damage_take = take;
+ damage_save = save;
+ damage_force = force;
+ MUTATOR_CALLHOOK(PlayerDamage);
+ take = bound(0, damage_take, self.health);
+ save = bound(0, damage_save, self.armorvalue);
+
if(sound_allowed(MSG_BROADCAST, attacker))
{
if (save > 10)
if(sound_allowed(MSG_BROADCAST, attacker))
if(!DEATH_ISWEAPON(deathtype, WEP_LASER) || attacker != self || self.health < 2 * cvar("g_balance_laser_primary_damage") * cvar("g_balance_selfdamagepercent") + 1)
+ if(self.health > 1)
// exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two
{
- if(self.health > 75) // TODO make a "gentle" version?
+ if(deathtype == DEATH_FALL)
+ PlayerSound(playersound_fall, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+ else if(self.health > 75) // TODO make a "gentle" version?
PlayerSound(playersound_pain100, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
else if(self.health > 50)
PlayerSound(playersound_pain75, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
else if(self.health > 25)
PlayerSound(playersound_pain50, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
- else if(self.health > 1)
+ else
PlayerSound(playersound_pain25, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
}
}
float defer_ClientKill_Now_TeamChange;
defer_ClientKill_Now_TeamChange = FALSE;
+ if(self.alivetime)
+ {
+ PlayerStats_Event(self, PLAYERSTATS_ALIVETIME, time - self.alivetime);
+ self.alivetime = 0;
+ }
+
if(valid_damage_for_weaponstats)
WeaponStats_LogKill(DEATH_WEAPONOF(deathtype), self.weapon);
}
}
- // become fully visible
- self.alpha = 1;
- // clear selected player display
- ClearSelectedPlayer();
- // throw a weapon
- SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
+ if(!g_freezetag)
+ {
+ // become fully visible
+ self.alpha = 1;
+ // clear selected player display
+ ClearSelectedPlayer();
+ // throw a weapon
+ SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
+ }
+
// print an obituary message
Obituary (attacker, inflictor, self, deathtype);
race_PreDie();
DropAllRunes(self);
+ if(deathtype == DEATH_HURTTRIGGER && g_freezetag)
+ {
+ PutClientInServer();
+ count_alive_players(); // re-count players
+ freezetag_CheckWinner();
+ return;
+ }
+
frag_attacker = attacker;
frag_inflictor = inflictor;
frag_target = self;
MUTATOR_CALLHOOK(PlayerDies);
+ if(g_freezetag)
+ return;
+
if(self.flagcarried)
{
if(attacker.classname != "player" && attacker.classname != "gib")
self.movetype = MOVETYPE_TOSS;
// shootable corpse
self.solid = SOLID_CORPSE;
+ self.ballistics_density = cvar("g_ballistics_density_corpse");
// don't stick to the floor
self.flags &~= FL_ONGROUND;
// dying animation
// call the corpse damage function just in case it wants to gib
self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force);
// set up to fade out later
- SUB_SetFade (self, time + 12 + random () * 4, 1);
-
- // remove laserdot
- if(self.weaponentity)
- if(self.weaponentity.lasertarget)
- remove(self.weaponentity.lasertarget);
+ SUB_SetFade (self, time + 6 + random (), 1);
if(clienttype(self) == CLIENTTYPE_REAL)
{
{
string msgstr, colorstr, cmsgstr, namestr, fullmsgstr, sourcemsgstr, fullcmsgstr, sourcecmsgstr, privatemsgprefix;
float flood, privatemsgprefixlen;
+ var .float flood_field;
entity head;
float ret;
float flood_spl;
float flood_burst;
float flood_lmax;
- var .float flood_field;
float lines;
if(privatesay)
{
else
flood = 1;
}
- }
- if (timeoutStatus == 2) //when game is paused, no flood protection
- source.flood_field = flood = 0;
+ if (timeoutStatus == 2) //when game is paused, no flood protection
+ source.flood_field = flood = 0;
+ }
if(flood == 2) // cannot happen for empty msgstr
{