]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_damage.qc
Make a separate "MSG_DEATH" notification category, cleans up stuff a bit
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_damage.qc
index a8ef09a7c596cc3886a39220218e5bdeb264e067..65b0ebc226b0ec1add31490487f72d9fc26d253c 100644 (file)
@@ -308,16 +308,19 @@ void LogDeath(string mode, float deathtype, entity killer, entity killed)
        GameLogEcho(s);
 }
 
-void Obituary_SpecialDeath(entity notif_target, float deathtype, string s1, string s2, float f1, float f2, float f3)
+void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, string s1, string s2, float f1, float f2, float f3)
 {
        float handled, hits;
        if(DEATH_ISSPECIAL(deathtype))
        {
-               #define DEATHTYPE(name,msg_info,msg_center,position) \
+               #define DEATHTYPE(name,msg_death_by,msg_death,position) \
                        { if(deathtype == max(0, name)) \
                        { \
-                               if(max(0, msg_info)) { Send_Notification(world, MSG_INFO, msg_info, s1, s2, f1, f2, f3); ++handled; } \
-                               if(max(0, msg_center)) { Send_Notification(notif_target, MSG_CENTER, msg_center, s1, s2, f1, f2, f3); ++handled; } \
+                               #if murder \
+                                       if(max(0, msg_death_by)) { Send_Notification(notif_target, MSG_ONE, MSG_DEATH, msg_death_by, s1, s2, f1, f2, f3); ++handled; } \
+                               #else \
+                                       if(max(0, msg_death)) { Send_Notification(notif_target, MSG_ONE, MSG_DEATH, msg_death, s1, s2, f1, f2, f3); ++handled; } \
+                               #endif \
                                ++hits; \
                        } }
 
@@ -325,7 +328,7 @@ void Obituary_SpecialDeath(entity notif_target, float deathtype, string s1, stri
                if not(hits)
                {
                        backtrace("Unhandled deathtype. Please notify Samual!\n");
-                       return;
+                       //return;
                }
                if not(handled)
                {
@@ -335,17 +338,37 @@ void Obituary_SpecialDeath(entity notif_target, float deathtype, string s1, stri
        }
 }
 
-float Form_Score_Pos(entity player)
+void Obituary_WeaponDeath(entity notif_target, float deathtype, string s1, string s2, float f1, float f2, float f3)
 {
-       return 20;
+       float handled, hits;
+       if(DEATH_ISSPECIAL(deathtype))
+       {
+               #define DEATHTYPE(name,msg_death_by,msg_death,position) \
+                       { if(deathtype == max(0, name)) \
+                       { \
+                               ++hits; \
+                       } }
+
+               DEATHTYPES
+               if not(hits)
+               {
+                       backtrace("Unhandled deathtype. Please notify Samual!\n");
+                       //return;
+               }
+               if not(handled)
+               {
+                       print(sprintf("Obituary_SpecialDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification!\n", Deathtype_Name(deathtype), deathtype));
+                       return;
+               }
+       }
 }
 
-#define BOT_PING -489
+.float FRAG_VERBOSE;
 
 void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
 {
        // Sanity check
-       if(targ.classname == "player") { backtrace("Obituary called on non-player?!\n"); return; }
+       if not(targ.classname == "player") { backtrace("Obituary called on non-player?!\n"); return; }
 
        // Declarations
        string  s, a, msg;
@@ -370,29 +393,30 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                        {
                                s1 = targ.netname;
                                f1 = targ.team;
-                               f2 = NO_FL_ARG;
                        }
                        else
                        {
-                               if(deathtype == DEATH_MIRRORDAMAGE)
+                               switch(deathtype)
                                {
-                                       s1 = targ.netname;
-                                       f1 = targ.team;
-                                       f2 = targ.killcount;
-                               }
-                               else
-                               {
-                                       s1 = targ.netname;
-                                       f1 = targ.killcount;
-                                       f2 = NO_FL_ARG;
+                                       case DEATH_MIRRORDAMAGE:
+                                       {
+                                               s1 = targ.netname;
+                                               f1 = targ.team;
+                                               //f2 = targ.killcount;
+                                               break;
+                                       }
+                                       
+                                       default:
+                                       {
+                                               s1 = s2 = NO_STR_ARG;
+                                               f1 = f2 = f3 = NO_FL_ARG;
+                                               break;
+                                       }
                                }
-                               
-                               // Do this manually inside of each if statement where necessary,
-                               // DEATH_TEAMCHANGE and such are not supposed to have this.
                                LogDeath("suicide", deathtype, targ, targ);
                                GiveFrags(attacker, targ, -1, deathtype);
                        }
-                       Obituary_SpecialDeath(targ, deathtype, s1, NO_STR_ARG, f1, f2, NO_FL_ARG);
+                       Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, NO_FL_ARG);
                }
                else if(DEATH_WEAPONOF(deathtype))
                {
@@ -414,7 +438,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                {
                        if(DEATH_ISSPECIAL(deathtype))
                        {
-                               print("hmm death was special?\n");
+                               backtrace("hmm death was special?\n");
                        }
                        else if(DEATH_WEAPONOF(deathtype))
                        {
@@ -433,10 +457,12 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                        s1 = attacker.netname;
                        s2 = targ.netname;
 
+                       attacker.FRAG_VERBOSE = TRUE;
+                       targ.FRAG_VERBOSE = TRUE;
+
                        LogDeath("frag", deathtype, attacker, targ);
                        GiveFrags(attacker, targ, 1, deathtype);
 
-                       float Obituary_Score_Position = Form_Score_Pos(attacker);
                        attacker.taunt_soundtime = time + 1;
                        attacker.killcount = attacker.killcount + 1;
                        if(targ.killcount > 2) { Send_KillNotification(s, ftos(targ.killcount), a, KILL_END_SPREE, MSG_SPREE); }
@@ -455,7 +481,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                                ADD_ACHIEVEMENT_CASE(10, 10)
                                ADD_ACHIEVEMENT_CASE(15, 15)
                                ADD_ACHIEVEMENT_CASE(20, 20)
-                               ADD_ACHIEVEMENT_CASE(20, 20)
+                               ADD_ACHIEVEMENT_CASE(25, 25)
                                ADD_ACHIEVEMENT_CASE(30, 30)
                                default: break;
                        }
@@ -473,17 +499,19 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                        {
                                if(targ.istypefrag)
                                {
-                                       Send_Notification(attacker, MSG_CENTER, (attacker.FRAG_VERBOSE ? CENTER_DEATH_TYPEFRAG_FIRSTBLOOD_VERBOSE : CENTER_DEATH_TYPEFRAG_FIRSTBLOOD),
-                                               s2, NO_STR_ARG, (attacker.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG);
-                                       Send_Notification(targ, MSG_CENTER, (targ.FRAG_VERBOSE ? CENTER_DEATH_TYPEFRAGGED_FIRSTVICTIM_VERBOSE : CENTER_DEATH_TYPEFRAGGED_FIRSTVICTIM),
-                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG));
+                                       Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAG_FIRST),
+                                               s2, NO_STR_ARG, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG);
+                                               
+                                       Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAGGED_FIRST),
+                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
                                else
                                {
-                                       Send_Notification(attacker, MSG_CENTER, (attacker.FRAG_VERBOSE ? CENTER_DEATH_FRAG_FIRSTBLOOD_VERBOSE : CENTER_DEATH_FRAG_FIRSTBLOOD),
-                                               s2, NO_STR_ARG, (attacker.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG);
-                                       Send_Notification(targ, MSG_CENTER, (targ.FRAG_VERBOSE ? CENTER_DEATH_FRAGGED_FIRSTVICTIM_VERBOSE : CENTER_DEATH_FRAGGED_FIRSTVICTIM),
-                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG));
+                                       Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_FIRST_VERBOSE : DEATH_MURDER_FRAG_FIRST),
+                                               s2, NO_STR_ARG, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG);
+                                               
+                                       Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_FRAGGED_FIRST_VERBOSE : DEATH_MURDER_FRAGGED_FIRST),
+                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
                                //Send_Notification(world, MSG_INFO, INFO_DEATH_FRAG_FIRSTBLOOD, s1, s2, attacker.team, NO_FL_ARG, NO_FL_ARG);
                        }
@@ -491,17 +519,19 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                        {
                                if(targ.istypefrag)
                                {
-                                       Send_Notification(attacker, MSG_CENTER, (attacker.FRAG_VERBOSE ? CENTER_DEATH_TYPEFRAG_VERBOSE : CENTER_DEATH_TYPEFRAG),
-                                               s2, NO_STR_ARG, attacker.killcount, Obituary_Score_Position, (attacker.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG));
-                                       Send_Notification(targ, MSG_CENTER, (targ.FRAG_VERBOSE ? CENTER_DEATH_TYPEFRAGGED_VERBOSE : CENTER_DEATH_TYPEFRAGGED),
-                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG));
+                                       Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_VERBOSE : DEATH_MURDER_TYPEFRAG),
+                                               s2, NO_STR_ARG, attacker.killcount, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG);
+                                               
+                                       Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAGGED_VERBOSE : DEATH_MURDER_TYPEFRAGGED),
+                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
                                else
                                {
-                                       Send_Notification(attacker, MSG_CENTER, (attacker.FRAG_VERBOSE ? CENTER_DEATH_FRAG_VERBOSE : CENTER_DEATH_FRAG),
-                                               s2, NO_STR_ARG, attacker.killcount, Obituary_Score_Position, (attacker.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG));
-                                       Send_Notification(targ, MSG_CENTER, (targ.FRAG_VERBOSE ? CENTER_DEATH_FRAGGED_VERBOSE : CENTER_DEATH_FRAGGED),
-                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(player) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG));
+                                       Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_VERBOSE : DEATH_MURDER_FRAG),
+                                               s2, NO_STR_ARG, attacker.killcount, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG);
+                                               
+                                       Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_FRAGGED_VERBOSE : DEATH_MURDER_FRAGGED),
+                                               s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
                                //if(DEATH_WEAPONOF(deathtype)) { Send_Notification(world, MSG_WEAPON, 50, s1, s2, attacker.killcount, targ.killcount, Obituary_Score_Position); }
                                //else { Obituary_SpecialDeath(world, deathtype, s1, s2, attacker.killcount, targ.killcount, Obituary_Score_Position); }
@@ -514,27 +544,27 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
        // =============
        else
        {
-               Send_CSQC_KillCenterprint(targ, "", "", deathtype, MSG_KILL_ACTION);
                if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
                        msg = inflictor.message;
                else if (deathtype == DEATH_CUSTOM)
                        msg = deathmessage;
                else
                        msg = "";
-               if(strstrofs(msg, "%", 0) < 0)
-                       msg = strcat("%s ", msg);
+                       
+               if(strstrofs(msg, "%", 0) < 0) { msg = strcat("%s ", msg); }
 
+               LogDeath("accident", deathtype, targ, targ);
                GiveFrags(targ, targ, -1, deathtype);
                if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) {
                        AnnounceTo(targ, "botlike");
                        PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
                }
-               Send_KillNotification(s, msg, "", deathtype, MSG_KILL_ACTION);
+               //Send_KillNotification(s, msg, "", deathtype, MSG_KILL_ACTION);
 
-               if (targ.killcount > 2)
-                       Send_KillNotification(s, ftos(targ.killcount), "", 0, MSG_KILL_ACTION_SPREE);
+               //if (targ.killcount > 2)
+               //      Send_KillNotification(s, ftos(targ.killcount), "", 0, MSG_KILL_ACTION_SPREE);
 
-               LogDeath("accident", deathtype, targ, targ);
+               Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, NO_FL_ARG);
        }
 
        targ.death_origin = targ.origin;