void SpawnThrownWeapon (vector org, float w)
{
- if(g_minstagib)
- if(self.ammo_cells <= 0)
- return;
-
if(g_pinata)
{
float j;
}
else
{
- if(W_IsWeaponThrowable(self.weapon))
- W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200');
+ if(WEPSET_CONTAINS_EW(self, self.weapon))
+ if(W_IsWeaponThrowable(self.weapon))
+ W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200');
}
}
}
void ClientKill_Now_TeamChange();
-void freezetag_CheckWinner();
void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
float valid_damage_for_weaponstats;
float excess;
- if((g_arena && numspawned < 2) || (g_ca && allowed_to_spawn) && !inWarmupStage)
- return;
-
dh = max(self.health, 0);
da = max(self.armorvalue, 0);
else
Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
- if (!g_minstagib)
- {
- v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
- take = v_x;
- save = v_y;
- }
- else
- {
- save = 0;
- take = damage;
- }
+
+ v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
+ take = v_x;
+ save = v_y;
if(attacker == self)
{
//self.pushltime = 0;
self.istypefrag = 0;
}
- else if(attacker.classname == "player")
+ else if(IS_PLAYER(attacker))
{
self.pusher = attacker;
self.pushltime = time + autocvar_g_maxpushtime;
frag_inflictor = inflictor;
frag_attacker = attacker;
frag_target = self;
+ frag_damage = damage;
damage_take = take;
damage_save = save;
damage_force = force;
self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
self.dmg_inflictor = inflictor;
- if(g_ca && self != attacker && attacker.classname == "player")
- PlayerScore_Add(attacker, SP_SCORE, (damage - excess) * autocvar_g_ca_damage2score_multiplier);
+ if(g_ca && self != attacker && IS_PLAYER(attacker))
+ PlayerTeamScore_Add(attacker, SP_SCORE, ST_SCORE, (damage - excess) * autocvar_g_ca_damage2score_multiplier);
float abot, vbot, awep;
- abot = (clienttype(attacker) == CLIENTTYPE_BOT);
- vbot = (clienttype(self) == CLIENTTYPE_BOT);
+ abot = (IS_BOT_CLIENT(attacker));
+ vbot = (IS_BOT_CLIENT(self));
valid_damage_for_weaponstats = 0;
awep = 0;
- if(vbot || clienttype(self) == CLIENTTYPE_REAL)
- if(abot || clienttype(attacker) == CLIENTTYPE_REAL)
+ if(vbot || IS_REAL_CLIENT(self))
+ if(abot || IS_REAL_CLIENT(attacker))
if(attacker && self != attacker)
if(IsDifferentTeam(self, attacker))
{
}
}
- if(!g_freezetag)
- {
- // become fully visible
- self.alpha = default_player_alpha;
- // 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();
if(accuracy_isgooddamage(attacker, self))
attacker.accuracy.(accuracy_frags[w-1]) += 1;
- 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;
+ frag_deathtype = deathtype;
MUTATOR_CALLHOOK(PlayerDies);
+
weapon_action(self.weapon, WR_PLAYERDEATH);
RemoveGrapplingHook(self);
Portal_ClearAllLater(self);
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
{
self.fixangle = TRUE;
//msg_entity = self;
//WriteAngle (MSG_ONE, 80);
}
- if(defer_ClientKill_Now_TeamChange) // TODO does this work with FreezeTag?
- ClientKill_Now_TeamChange();
-
- if(g_arena)
- Spawnqueue_Unmark(self);
+ if(defer_ClientKill_Now_TeamChange)
+ ClientKill_Now_TeamChange(); // can turn player into spectator
- if(g_freezetag)
+ // player could have been miraculously resuscitated ;)
+ // e.g. players in freezetag get frozen, they don't really die
+ if(self.health >= 1 || !IS_PLAYER(self))
return;
// when we get here, player actually dies
- // clear waypoints (do this AFTER FreezeTag)
+
+ // clear waypoints
WaypointSprite_PlayerDead();
+ // throw a weapon
+ SpawnThrownWeapon (self.origin + (self.mins + self.maxs) * 0.5, self.switchweapon);
+ // become fully visible
+ self.alpha = default_player_alpha;
// make the corpse upright (not tilted)
self.angles_x = 0;
self.angles_z = 0;
self.respawn_countdown = 10; // first number to count down from is 10
else
self.respawn_countdown = -1; // do not count down
+
+ if(g_cts || autocvar_g_forced_respawn)
+ self.respawn_flags = self.respawn_flags | RESPAWN_FORCE;
+
self.death_time = time;
if (random() < 0.5)
animdecide_setstate(self, self.anim_state | ANIMSTATE_DEAD1, TRUE);
msgin = formatmessage(msgin);
- if(source.classname != "player")
+ if not(IS_PLAYER(source))
colorstr = "^0"; // black for spectators
else if(teamplay)
colorstr = Team_ColorCode(source.team);
}
if(!privatesay)
- if(source.classname != "player")
+ if not(IS_PLAYER(source))
{
if not(intermission_running)
if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !(inWarmupStage || gameover)))
{
sprint(source, sourcemsgstr);
dedicated_print(msgstr); // send to server console too
- FOR_EACH_REALCLIENT(head) if(head.classname != "player")
+ FOR_EACH_REALCLIENT(head) if not(IS_PLAYER(head))
if(head != source)
sprint(head, msgstr);
}
if(self.pusher)
{
msg_entity = self;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
}
break;
}
break;
case VOICETYPE_TAUNT:
- if(self.classname == "player")
+ if(IS_PLAYER(self))
if(self.deadflag == DEAD_NO)
animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
if(!sv_taunt)
if(self.pusher)
{
msg_entity = self.pusher;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
{
if(msg_entity.cvar_cl_voice_directional == 1)
soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
if(self.pusher)
{
msg_entity = self.pusher;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
{
if(msg_entity.cvar_cl_voice_directional == 1)
soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
}
msg_entity = self;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
}
break;
}
break;
case VOICETYPE_TAUNT:
- if(self.classname == "player")
+ if(IS_PLAYER(self))
if(self.deadflag == DEAD_NO)
animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
if(!sv_taunt)