else
{
self = oldself;
- if(g_runematch)
- {
- f = RunematchHandleFrags(attacker, targ, f);
- }
- else if(g_lms)
+ if(g_lms)
{
// remove a life
float tl;
s = strcat(s, "T");
if(player.kh_next)
s = strcat(s, "K");
- if(player.runes)
- s = strcat(s, "|", ftos(player.runes));
return s;
}
GameLogEcho(s);
}
-void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, string s1, string s2, string s3, float f1, float f2, float f3)
+void Obituary_SpecialDeath(
+ entity notif_target,
+ float murder,
+ float deathtype,
+ string s1, string s2, string s3,
+ float f1, float f2, float f3)
{
if(DEATH_ISSPECIAL(deathtype))
{
{
if(deathent.death_msgmurder)
{
- Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_MULTI, deathent.death_msgmurder.nent_id, s1, s2, s3, "", f1, f2, f3, 0);
- Send_Notification_WOVA(NOTIF_ALL_EXCEPT, notif_target, MSG_INFO, deathent.death_msgmurder.nent_msginfo.nent_id, s1, s2, s3, "", f1, f2, f3, 0);
+ Send_Notification_WOVA(
+ NOTIF_ONE,
+ notif_target,
+ MSG_MULTI,
+ deathent.death_msgmurder.nent_id,
+ s1, s2, s3, "",
+ f1, f2, f3, 0
+ );
+ Send_Notification_WOVA(
+ NOTIF_ALL_EXCEPT,
+ notif_target,
+ MSG_INFO,
+ deathent.death_msgmurder.nent_msginfo.nent_id,
+ s1, s2, s3, "",
+ f1, f2, f3, 0
+ );
}
}
else
{
if(deathent.death_msgself)
{
- Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_MULTI, deathent.death_msgself.nent_id, s1, s2, s3, "", f1, f2, f3, 0);
- Send_Notification_WOVA(NOTIF_ALL_EXCEPT, notif_target, MSG_INFO, deathent.death_msgself.nent_msginfo.nent_id, s1, s2, s3, "", f1, f2, f3, 0);
+ Send_Notification_WOVA(
+ NOTIF_ONE,
+ notif_target,
+ MSG_MULTI,
+ deathent.death_msgself.nent_id,
+ s1, s2, s3, "",
+ f1, f2, f3, 0
+ );
+ Send_Notification_WOVA(
+ NOTIF_ALL_EXCEPT,
+ notif_target,
+ MSG_INFO,
+ deathent.death_msgself.nent_msginfo.nent_id,
+ s1, s2, s3, "",
+ f1, f2, f3, 0
+ );
}
}
}
}
float w_deathtype;
-float Obituary_WeaponDeath(entity notif_target, float murder, float deathtype, string s1, string s2, string s3, float f1, float f2)
+float Obituary_WeaponDeath(
+ entity notif_target,
+ float murder,
+ float deathtype,
+ string s1, string s2, string s3,
+ float f1, float f2)
{
float death_weapon = DEATH_WEAPONOF(deathtype);
if(death_weapon)
if(death_message)
{
- Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_MULTI, death_message, s1, s2, s3, "", f1, f2, 0, 0);
- Send_Notification_WOVA(NOTIF_ALL_EXCEPT, notif_target, MSG_INFO, msg_multi_notifs[death_message - 1].nent_msginfo.nent_id, s1, s2, s3, "", f1, f2, 0, 0);
+ Send_Notification_WOVA(
+ NOTIF_ONE,
+ notif_target,
+ MSG_MULTI,
+ death_message,
+ s1, s2, s3, "",
+ f1, f2, 0, 0
+ );
+ Send_Notification_WOVA(
+ NOTIF_ALL_EXCEPT,
+ notif_target,
+ MSG_INFO,
+ msg_multi_notifs[death_message - 1].nent_msginfo.nent_id,
+ s1, s2, s3, "",
+ f1, f2, 0, 0
+ );
}
else
{
dprint(sprintf(
- "Obituary_WeaponDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification for weapon %d!\n",
- Deathtype_Name(deathtype),
+ "Obituary_WeaponDeath(): ^1Deathtype ^7(%d)^1 has no notification for weapon %d!\n",
deathtype,
death_weapon
));
void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
{
// Sanity check
- if not(targ.classname == STR_PLAYER) { backtrace("Obituary called on non-player?!\n"); return; }
+ if not(IS_PLAYER(targ)) { backtrace("Obituary called on non-player?!\n"); return; }
// Declarations
float notif_firstblood = FALSE;
// Set final information for the death
targ.death_origin = targ.origin;
if(targ != attacker) { targ.killer_origin = attacker.origin; }
- string deathlocation = NearestLocation(targ.death_origin);
+ string deathlocation = (autocvar_notification_server_allows_location ? NearestLocation(targ.death_origin) : "");
#ifdef NOTIFICATIONS_DEBUG
dprint(
// ======
// MURDER
// ======
- else if(attacker.classname == "player")
+ else if(IS_PLAYER(attacker))
{
if(!IsDifferentTeam(attacker, targ))
{
kill_count_to_target = 0;
}
+ float verbose_allowed = (autocvar_notification_server_allows_frag_verbose && ((autocvar_notification_server_allows_frag_verbose == 2) || inWarmupStage));
if(targ.istypefrag)
{
- if(attacker.FRAG_VERBOSE)
+ if(attacker.FRAG_VERBOSE && verbose_allowed)
Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE, targ.netname, kill_count_to_attacker, (IS_BOT_CLIENT(targ) ? NO_MSG : targ.ping));
else
Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_DEATH_MURDER_TYPEFRAG, targ.netname, kill_count_to_attacker);
- if(targ.FRAG_VERBOSE)
+ if(targ.FRAG_VERBOSE && verbose_allowed)
Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE, attacker.netname, kill_count_to_target, attacker.health, attacker.armorvalue, (IS_BOT_CLIENT(attacker) ? NO_MSG : attacker.ping));
else
Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_MURDER_TYPEFRAGGED, attacker.netname, kill_count_to_target);
}
else
{
- if(attacker.FRAG_VERBOSE)
+ if(attacker.FRAG_VERBOSE && verbose_allowed)
Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_DEATH_MURDER_FRAG_VERBOSE, targ.netname, kill_count_to_attacker, (IS_BOT_CLIENT(targ) ? NO_MSG : targ.ping));
else
Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_DEATH_MURDER_FRAG, targ.netname, kill_count_to_attacker);
- if(targ.FRAG_VERBOSE)
+ if(targ.FRAG_VERBOSE && verbose_allowed)
Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_MURDER_FRAGGED_VERBOSE, attacker.netname, kill_count_to_target, attacker.health, attacker.armorvalue, (IS_BOT_CLIENT(attacker) ? NO_MSG : attacker.ping));
else
Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_MURDER_FRAGGED, attacker.netname, kill_count_to_target);
if(complainteamdamage > 0 && !g_ca) // FIXME why is g_ca ruled out here? Why not just g_mirrordamage 0 on CA servers?
mirrordamage = autocvar_g_mirrordamage * complainteamdamage;
mirrorforce = autocvar_g_mirrordamage * vlen(force);
- if(g_minstagib)
- {
- if(autocvar_g_friendlyfire == 0)
- damage = 0;
- }
- else if(g_ca)
+ if(g_ca)
damage = 0;
else
damage = autocvar_g_friendlyfire * damage;
attacker.lms_traveled_distance = autocvar_g_lms_campcheck_distance;
}
- if(targ.classname == "player")
- if (g_minstagib)
- {
- if ((deathtype == DEATH_FALL) ||
- (deathtype == DEATH_DROWN) ||
- (deathtype == DEATH_SLIME) ||
- (deathtype == DEATH_LAVA) ||
- (!DEATH_ISWEAPON(deathtype, WEP_LASER) && damage > 0 && damage < 100))
- {
- self = oldself;
- return;
- }
- if(damage > 0)
- damage = 10000;
- if (targ.armorvalue && (deathtype == WEP_MINSTANEX) && damage)
- {
- targ.armorvalue -= 1;
- 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 (DEATH_ISWEAPON(deathtype, WEP_LASER))
- {
- damage = 0;
- mirrordamage = 0;
- complainteamdamage = 0;
- if (targ != attacker)
- {
- if ((targ.health >= 1) && (targ.classname == "player"))
- centerprint(attacker, "Secondary fire inflicts no damage!");
- force = '0 0 0';
- // keep mirrorforce
- attacker = targ;
- }
- }
- }
-
if not(DEATH_ISSPECIAL(deathtype))
{
damage *= g_weapondamagefactor;
frag_damage = damage;
frag_force = force;
frag_deathtype = deathtype;
+ frag_mirrordamage = mirrordamage;
MUTATOR_CALLHOOK(PlayerDamage_Calculate);
damage = frag_damage;
+ mirrordamage = frag_mirrordamage;
force = frag_force;
- // apply strength multiplier
- if ((attacker.items & IT_STRENGTH) && !g_minstagib)
+ if not(g_minstagib)
{
- if(targ == attacker)
- {
- damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
- force = force * autocvar_g_balance_powerup_strength_selfforce;
- }
- else
+ // apply strength multiplier
+ if (attacker.items & IT_STRENGTH)
{
- damage = damage * autocvar_g_balance_powerup_strength_damage;
- force = force * autocvar_g_balance_powerup_strength_force;
+ if(targ == attacker)
+ {
+ damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
+ force = force * autocvar_g_balance_powerup_strength_selfforce;
+ }
+ else
+ {
+ damage = damage * autocvar_g_balance_powerup_strength_damage;
+ force = force * autocvar_g_balance_powerup_strength_force;
+ }
}
- }
- // apply invincibility multiplier
- if (targ.items & IT_INVINCIBLE && !g_minstagib)
- damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
+ // apply invincibility multiplier
+ if (targ.items & IT_INVINCIBLE)
+ damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
+ }
if (targ == attacker)
{
damage = damage * autocvar_g_balance_selfdamagepercent; // Partial damage if the attacker hits himself
}
- if(g_runematch)
- {
- // apply strength rune
- if (attacker.runes & RUNE_STRENGTH)
- {
- if(attacker.runes & CURSE_WEAK) // have both curse & rune
- {
- damage = damage * autocvar_g_balance_rune_strength_combo_damage;
- force = force * autocvar_g_balance_rune_strength_combo_force;
- }
- else
- {
- damage = damage * autocvar_g_balance_rune_strength_damage;
- force = force * autocvar_g_balance_rune_strength_force;
- }
- }
- else if (attacker.runes & CURSE_WEAK)
- {
- damage = damage * autocvar_g_balance_curse_weak_damage;
- force = force * autocvar_g_balance_curse_weak_force;
- }
-
- // apply defense rune
- if (targ.runes & RUNE_DEFENSE)
- {
- if (targ.runes & CURSE_VULNER) // have both curse & rune
- damage = damage * autocvar_g_balance_rune_defense_combo_takedamage;
- else
- damage = damage * autocvar_g_balance_rune_defense_takedamage;
- }
- else if (targ.runes & CURSE_VULNER)
- damage = damage * autocvar_g_balance_curse_vulner_takedamage;
- }
-
// count the damage
if(attacker)
if(!targ.deadflag)
if not(DEATH_ISSPECIAL(deathtype))
{
if(targ.classname == "player") // don't do this for vehicles
- if(!g_minstagib)
if(IsFlying(victim))
yoda = 1;
-
- if(g_minstagib)
- if(victim.items & IT_STRENGTH)
- yoda = 1;
}
}
}
self.event_damage (inflictor, attacker, damage, deathtype, hitloc, force);
self = oldself;
- if(targ.classname == "player" && attacker.classname == "player" && attacker != targ && attacker.health > 2)
- {
- if(g_runematch)
- {
- if (attacker.runes & RUNE_VAMPIRE)
- {
- // apply vampire rune
- if (attacker.runes & CURSE_EMPATHY) // have the curse too
- {
- //attacker.health = attacker.health + damage * autocvar_g_balance_rune_vampire_combo_absorb;
- attacker.health = bound(
- autocvar_g_balance_curse_empathy_minhealth, // LA: was 3, now 40
- attacker.health + damage * autocvar_g_balance_rune_vampire_combo_absorb,
- autocvar_g_balance_rune_vampire_maxhealth); // LA: was 1000, now 500
- }
- else
- {
- //attacker.health = attacker.health + damage * autocvar_g_balance_rune_vampire_absorb;
- attacker.health = bound(
- attacker.health, // LA: was 3, but changed so that you can't lose health
- // empathy won't let you gain health in the same way...
- attacker.health + damage * autocvar_g_balance_rune_vampire_absorb,
- autocvar_g_balance_rune_vampire_maxhealth); // LA: was 1000, now 500
- }
- }
- // apply empathy curse
- else if (attacker.runes & CURSE_EMPATHY)
- {
- attacker.health = bound(
- autocvar_g_balance_curse_empathy_minhealth, // LA: was 3, now 20
- attacker.health + damage * autocvar_g_balance_curse_empathy_takedamage,
- attacker.health);
- }
- }
- }
-
// apply mirror damage if any
if(mirrordamage > 0 || mirrorforce > 0)
{
attacker = attacker_save;
- if(g_minstagib)
- if(mirrordamage > 0)
- {
- // just lose extra LIVES, don't kill the player for mirror damage
- if(attacker.armorvalue > 0)
- {
- attacker.armorvalue = attacker.armorvalue - 1;
- centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue)));
- attacker.hitsound += 1;
- }
- mirrordamage = 0;
- }
force = normalize(attacker.origin + attacker.view_ofs - hitloc) * mirrorforce;
Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE, attacker.origin, force);