Net_LinkEntity(e, FALSE, 0.2, Damage_DamageInfo_SendEntity);
}
-#define DAMAGE_CENTERPRINT_SPACER NEWLINES
-
float checkrules_firstblood;
float yoda;
float IsDifferentTeam(entity a, entity b)
{
- if(teams_matter)
+ if(teamplay)
{
if(a.team == b.team)
return 0;
{
// regular frag
PlayerScore_Add(attacker, SP_KILLS, 1);
+ if(targ.playerid)
+ PlayerStats_Event(attacker, sprintf("kills-%d", targ.playerid), 1);
}
PlayerScore_Add(targ, SP_DEATHS, 1);
void Send_KillNotification (string s1, string s2, string s3, float msg, float type)
{
WriteByte(MSG_ALL, SVC_TEMPENTITY);
- WriteByte(MSG_ALL, TE_CSQC_NOTIFY);
- WriteByte(MSG_ALL, CSQC_KILLNOTIFY);
+ WriteByte(MSG_ALL, TE_CSQC_KILLNOTIFY);
WriteString(MSG_ALL, s1);
WriteString(MSG_ALL, s2);
WriteString(MSG_ALL, s3);
}
// Function is used to send a generic centerprint whose content CSQC gets to decide (gentle version or not in the below cases)
-void Send_CSQC_Centerprint(entity e, string s1, string s2, float msg, float type)
+void Send_CSQC_KillCenterprint(entity e, string s1, string s2, float msg, float type)
{
if (clienttype(e) == CLIENTTYPE_REAL)
{
msg_entity = e;
WRITESPECTATABLE_MSG_ONE({
WriteByte(MSG_ONE, SVC_TEMPENTITY);
- WriteByte(MSG_ONE, TE_CSQC_NOTIFY);
- WriteByte(MSG_ONE, CSQC_CENTERPRINT);
+ WriteByte(MSG_ONE, TE_CSQC_KILLCENTERPRINT);
WriteString(MSG_ONE, s1);
WriteString(MSG_ONE, s2);
WriteShort(MSG_ONE, msg);
string s, a, msg;
float w, type;
- if (targ.classname == "player" || targ.classname == "corpse")
+ if (targ.classname == "player")
{
- if (targ.classname == "corpse")
- s = "A corpse";
- else
- s = targ.netname;
-
+ s = targ.netname;
a = attacker.netname;
if (targ == attacker) // suicides
if (deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
msg = ColoredTeamName(targ.team); // TODO: check if needed?
if(!g_cts) // no "killed your own dumb self" message in CTS
- Send_CSQC_Centerprint(targ, msg, "", deathtype, MSG_SUICIDE);
+ Send_CSQC_KillCenterprint(targ, msg, "", deathtype, MSG_SUICIDE);
if(deathtype != DEATH_TEAMCHANGE && deathtype != DEATH_QUIET)
{
if (targ.killcount > 2)
msg = ftos(targ.killcount);
- if(teams_matter && deathtype == DEATH_MIRRORDAMAGE)
+ if(teamplay && deathtype == DEATH_MIRRORDAMAGE)
{
if(attacker.team == COLOR_TEAM1)
deathtype = KILL_TEAM_RED;
Send_KillNotification(s, msg, ftos(w), deathtype, MSG_SUICIDE);
}
- else if (attacker.classname == "player" || attacker.classname == "gib")
+ else if (attacker.classname == "player")
{
- if(teams_matter && attacker.team == targ.team)
+ if(teamplay && attacker.team == targ.team)
{
if(attacker.team == COLOR_TEAM1)
type = KILL_TEAM_RED;
GiveFrags(attacker, targ, -1, deathtype);
- Send_CSQC_Centerprint(attacker, s, "", type, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, s, "", type, MSG_KILL);
if (targ.killcount > 2) {
msg = ftos(targ.killcount);
checkrules_firstblood = TRUE;
Send_KillNotification(a, "", "", KILL_FIRST_BLOOD, MSG_KILL);
// TODO: make these print a newline if they dont
- Send_CSQC_Centerprint(attacker, "", "", KILL_FIRST_BLOOD, MSG_KILL);
- Send_CSQC_Centerprint(targ, "", "", KILL_FIRST_VICTIM, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, "", "", KILL_FIRST_BLOOD, MSG_KILL);
+ Send_CSQC_KillCenterprint(targ, "", "", KILL_FIRST_VICTIM, MSG_KILL);
PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
}
if((autocvar_sv_fragmessage_information_typefrag) && (targ.BUTTON_CHAT)) {
- Send_CSQC_Centerprint(attacker, s, GetAdvancedDeathReports(targ), KILL_TYPEFRAG, MSG_KILL);
- Send_CSQC_Centerprint(targ, a, GetAdvancedDeathReports(attacker), KILL_TYPEFRAGGED, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, s, GetAdvancedDeathReports(targ), KILL_TYPEFRAG, MSG_KILL);
+ Send_CSQC_KillCenterprint(targ, a, GetAdvancedDeathReports(attacker), KILL_TYPEFRAGGED, MSG_KILL);
} else {
- Send_CSQC_Centerprint(attacker, s, GetAdvancedDeathReports(targ), KILL_FRAG, MSG_KILL);
- Send_CSQC_Centerprint(targ, a, GetAdvancedDeathReports(attacker), KILL_FRAGGED, MSG_KILL);
+ Send_CSQC_KillCenterprint(attacker, s, GetAdvancedDeathReports(targ), KILL_FRAG, MSG_KILL);
+ Send_CSQC_KillCenterprint(targ, a, GetAdvancedDeathReports(attacker), KILL_FRAGGED, MSG_KILL);
}
attacker.taunt_soundtime = time + 1;
}
else
{
- Send_CSQC_Centerprint(targ, "", "", deathtype, MSG_KILL_ACTION);
+ Send_CSQC_KillCenterprint(targ, "", "", deathtype, MSG_KILL_ACTION);
if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
msg = inflictor.message;
else if (deathtype == DEATH_CUSTOM)
entity damage_targ;
entity damage_inflictor;
entity damage_attacker;
-.float prevhitsound;
void Damage (entity targ, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
{
damage = 0;
force = '0 0 0';
}
- else if(teams_matter && attacker.team == targ.team)
+ else if(teamplay && attacker.team == targ.team)
{
if(autocvar_teamplay_mode == 1)
damage = 0;
if (targ.armorvalue && (deathtype == WEP_MINSTANEX) && damage)
{
targ.armorvalue -= 1;
- centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(targ.armorvalue)));
+ centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.armorvalue)));
damage = 0;
targ.hitsound += 1;
attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
if (targ != attacker)
{
if ((targ.health >= 1) && (targ.classname == "player"))
- centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "Secondary fire inflicts no damage!"));
+ centerprint(attacker, "Secondary fire inflicts no damage!");
force = '0 0 0';
// keep mirrorforce
attacker = targ;
if(deathtype & HITTYPE_HEADSHOT)
damage *= 1 + damage_headshotbonus;
- if(targ.classname == "player")
+ entity victim;
+ if((targ.vehicle_flags & VHF_ISVEHICLE) && targ.owner)
+ victim = targ.owner;
+ else
+ victim = targ;
+
+ if(victim.classname == "player" || victim.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
{
- if(IsDifferentTeam(targ, attacker))
+ if(IsDifferentTeam(victim, attacker))
{
if(damage > 0)
{
- if(attacker.weapon != WEP_LASER
- && (attacker.weapon != WEP_ELECTRO || !autocvar_g_balance_electro_lightning)
- && attacker.prevhitsound + autocvar_sv_hitsound_antispam_time < time)
+ if(deathtype != DEATH_FIRE)
{
- if(targ.BUTTON_CHAT)
+ if(victim.BUTTON_CHAT)
attacker.typehitsound += 1;
else
attacker.hitsound += 1;
- attacker.prevhitsound = time;
}
damage_goodhits += 1;
if not(DEATH_ISSPECIAL(deathtype))
{
+ if(targ.classname == "player") // don't do this for vehicles
if(!g_minstagib)
- if(IsFlying(targ))
+ if(IsFlying(victim))
yoda = 1;
if(g_minstagib)
- if(targ.items & IT_STRENGTH)
+ if(victim.items & IT_STRENGTH)
yoda = 1;
if(deathtype & HITTYPE_HEADSHOT)
}
else
{
- if(deathtype != DEATH_FIRE
- && attacker.prevhitsound + autocvar_sv_hitsound_antispam_time < time)
+ if(deathtype != DEATH_FIRE)
{
attacker.typehitsound += 1;
- attacker.prevhitsound = time;
}
if(mirrordamage > 0)
if(time > attacker.teamkill_complain)
if (vlen(force))
if (self.classname != "player" || time >= self.spawnshieldtime || g_midair)
{
- self.velocity = self.velocity + self.damageforcescale * force;
+ self.velocity = self.velocity + damage_explosion_calcpush(self.damageforcescale * force, self.velocity, autocvar_g_balance_damagepush_speedfactor);
self.flags &~= FL_ONGROUND;
UpdateCSQCProjectile(self);
}
if(attacker.armorvalue > 0)
{
attacker.armorvalue = attacker.armorvalue - 1;
- centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(attacker.armorvalue)));
+ centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue)));
attacker.hitsound += 1;
}
mirrordamage = 0;