X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_damage.qc;h=3b7251261dc54ea3fbee04ee792908e6bc1b13a3;hp=e177ce46aa3aeeaf9c620468d5158fd55514b91c;hb=76d2850fe55c4815ffad6baba101fcd312c428ea;hpb=5f79dd91c2e1f17b1b1b93882696fd99fdefacc2 diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index e177ce46a..3b7251261 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -186,11 +186,7 @@ void GiveFrags (entity attacker, entity targ, float f, float deathtype) else { self = oldself; - if(g_runematch) - { - f = RunematchHandleFrags(attacker, targ, f); - } - else if(g_lms) + if(g_lms) { // remove a life float tl; @@ -235,8 +231,6 @@ string AppendItemcodes(string s, entity player) s = strcat(s, "T"); if(player.kh_next) s = strcat(s, "K"); - if(player.runes) - s = strcat(s, "|", ftos(player.runes)); return s; } @@ -259,55 +253,73 @@ void LogDeath(string mode, float deathtype, entity killer, entity killed) GameLogEcho(s); } -#define INFO_NO_MSG 0 // so that compilation works with the INFO_##msg_death stuff -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) { - float handled = 0, hits = 0; if(DEATH_ISSPECIAL(deathtype)) { - #define DEATHTYPE(name,msg_death,msg_death_by,position) \ - { if(deathtype == max(0, name)) \ - { \ - #if msg_death != NO_MSG \ - if not(murder) \ - { \ - Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_MULTI, msg_death, s1, s2, s3, "", f1, f2, f3, 0); \ - Send_Notification_WOVA(NOTIF_ALL_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death, s1, s2, s3, "", f1, f2, f3, 0); \ - ++handled; \ - } \ - #endif \ - #if msg_death_by != NO_MSG \ - if(murder) \ - { \ - Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_MULTI, msg_death_by, s1, s2, s3, "", f1, f2, f3, 0); \ - Send_Notification_WOVA(NOTIF_ALL_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death_by, s1, s2, s3, "", f1, f2, f3, 0); \ - ++handled; \ - } \ - #endif \ - ++hits; \ - } } - - DEATHTYPES - #undef DEATHTYPE - - if not(hits) + entity deathent = deathtypes[(deathtype - DT_FIRST) - 1]; + if not(deathent) { backtrace("Obituary_SpecialDeath: Could not find deathtype entity!\n"); return; } + + if(murder) { - backtrace("Obituary_SpecialDeath(): Unhandled deathtype- Please notify Samual!\n"); + 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 + ); + } } - if not(handled) + else { - dprint(sprintf( - "Obituary_SpecialDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification!\n", - Deathtype_Name(deathtype), - deathtype - )); - return; + 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 + ); + } } } + else { backtrace("Obituary_SpecialDeath called without a special deathtype?\n"); return; } } 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) @@ -318,14 +330,27 @@ float Obituary_WeaponDeath(entity notif_target, float murder, float deathtype, s 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 )); @@ -339,7 +364,7 @@ float Obituary_WeaponDeath(entity notif_target, float murder, float deathtype, s 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; @@ -348,7 +373,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype) // 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( @@ -404,7 +429,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype) // ====== // MURDER // ====== - else if(attacker.classname == "player") + else if(IS_PLAYER(attacker)) { if(!IsDifferentTeam(attacker, targ)) { @@ -415,7 +440,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype) Send_Notification(NOTIF_ONE, attacker, MSG_CENTER, CENTER_DEATH_TEAMKILL_FRAG, targ.netname); Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_TEAMKILL_FRAGGED, attacker.netname); - Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_NUM_4(targ.team, INFO_DEATH_TEAMKILL_), targ.netname, attacker.netname, targ.killcount); + Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_NUM_4(targ.team, INFO_DEATH_TEAMKILL_), targ.netname, attacker.netname, deathlocation, targ.killcount); // In this case, the death message will ALWAYS be "foo was betrayed by bar" // No need for specific death/weapon messages... @@ -431,7 +456,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype) #define SPREE_ITEM(counta,countb,center,normal,gentle) \ case counta: \ { \ - AnnounceTo(attacker, strcat(#countb, "kills")); \ + Send_Notification(NOTIF_ONE, attacker, MSG_ANNCE, ANNCE_KILLSTREAK_##countb); \ PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_##counta, 1); \ break; \ } @@ -459,26 +484,27 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype) 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); @@ -531,7 +557,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype) if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) { - AnnounceTo(targ, "botlike"); + Send_Notification(NOTIF_ONE, targ, MSG_ANNCE, ANNCE_ACHIEVEMENT_BOTLIKE); PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1); } } @@ -765,40 +791,6 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float 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) @@ -890,42 +882,6 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float 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) {