]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_damage.qc
Merge remote-tracking branch 'origin/master' into samual/notification_rewrite
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_damage.qc
index 8b8e441647e14b6f9e749116903ecf7abffdc786..428c6fe0ee8864bbbdfd1f0a5a6e3b07712a0406 100644 (file)
@@ -227,7 +227,7 @@ void GiveFrags (entity attacker, entity targ, float f, float deathtype)
                UpdateFrags(attacker, f);
 }
 
-string Obituary_ExtraFragInfo(entity player) // Extra fragmessage information
+/*string Obituary_ExtraFragInfo(entity player) // Extra fragmessage information
 {
        string health_output = string_null;
        string ping_output = string_null;
@@ -263,7 +263,7 @@ string Obituary_ExtraFragInfo(entity player) // Extra fragmessage information
        }
        
        return output;
-}
+}*/
 
 string AppendItemcodes(string s, entity player)
 {
@@ -308,9 +308,11 @@ void LogDeath(string mode, float deathtype, entity killer, entity killed)
        GameLogEcho(s);
 }
 
+#define INFO_NO_MSG 0
+
 void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, string s1, string s2, float f1, float f2, float f3)
 {
-       float handled, hits;
+       float handled = 0, hits = 0;
        if(DEATH_ISSPECIAL(deathtype))
        {
                #define DEATHTYPE(name,msg_death,msg_death_by,position) \
@@ -319,16 +321,16 @@ void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, s
                                #if msg_death != NO_MSG \
                                        if not(murder) \
                                        { \
-                                               Send_Notification(notif_target, MSG_ONE, MSG_DEATH, msg_death, s1, s2, f1, f2, f3); \
-                                               Send_Notification_ToAll(notif_target, TRUE, MSG_INFO, INFO_##msg_death, s1, s2, f1, f2, f3); \
+                                               Send_Notification_Legacy_Wrapper(NOTIF_ONE, notif_target, MSG_DEATH, msg_death, s1, s2, f1, f2, f3); \
+                                               Send_Notification_Legacy_Wrapper(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death, s1, s2, f1, f2, f3); \
                                                ++handled; \
                                        } \
                                #endif \
                                #if msg_death_by != NO_MSG \
                                        if(murder) \
                                        { \
-                                               Send_Notification(notif_target, MSG_ONE, MSG_DEATH, msg_death_by, s1, s2, f1, f2, f3); \
-                                               Send_Notification_ToAll(notif_target, TRUE, MSG_INFO, INFO_##msg_death_by, s1, s2, f1, f2, f3); \
+                                               Send_Notification_Legacy_Wrapper(NOTIF_ONE, notif_target, MSG_DEATH, msg_death_by, s1, s2, f1, f2, f3); \
+                                               Send_Notification_Legacy_Wrapper(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death_by, s1, s2, f1, f2, f3); \
                                                ++handled; \
                                        } \
                                #endif \
@@ -340,62 +342,47 @@ void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, s
                
                if not(hits)
                {
-                       backtrace("Unhandled deathtype. Please notify Samual!\n");
-                       //return;
+                       backtrace("Obituary_SpecialDeath(): Unhandled deathtype- Please notify Samual!\n");
                }
                if not(handled)
                {
-                       print(sprintf("Obituary_SpecialDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification!\n", Deathtype_Name(deathtype), deathtype));
+                       dprint(sprintf("Obituary_SpecialDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification!\n", Deathtype_Name(deathtype), deathtype));
                        return;
                }
        }
 }
 
-void Obituary_WeaponDeath(entity notif_target, float deathtype, string s1, string s2, float f1, float f2, float f3)
+float w_deathtype;
+float Obituary_WeaponDeath(float murder, float deathtype, string s1, string s2)
 {
-       float handled, hits;
-       if(DEATH_ISSPECIAL(deathtype))
+       float death_weapon = DEATH_WEAPONOF(deathtype);
+
+       if(death_weapon)
        {
-               #define DEATHTYPE(name,msg_death,msg_death_by,position) \
-                       { if(deathtype == max(0, name)) \
-                       { \
-                               ++hits; \
-                       } }
+               w_deathtype = deathtype;
+               float death_message = weapon_action(death_weapon, ((murder) ? WR_KILLMESSAGE : WR_SUICIDEMESSAGE));
+               w_deathtype = FALSE;
 
-               DEATHTYPES
-               #undef DEATHTYPE
-               
-               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;
-               }
+               if(death_message) { Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_WEAPON, death_message, s1, s2, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG); }
+               else { dprint(sprintf("Obituary_WeaponDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification for weapon %d!\n", Deathtype_Name(deathtype), deathtype, death_weapon)); }
+
+               return TRUE;
        }
+       return FALSE;
 }
 
 .float FRAG_VERBOSE;
-
 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; }
 
        // Declarations
-       string  s, a, msg;
-       float w, type;
-
        string s1 = NO_STR_ARG, s2 = NO_STR_ARG;
        float f1 = NO_FL_ARG, f2 = NO_FL_ARG, f3 = NO_FL_ARG;
-       float notif_firstblood;
-
-
-       dprint(sprintf("Obituary(): Deathtype = %s (%d), Attacker = %s, Inflictor = %s, Target = %s...\n", Deathtype_Name(deathtype), deathtype, attacker.netname, inflictor.netname, targ.netname));
+       float notif_firstblood = FALSE;
 
+       //dprint(sprintf("Obituary(): Deathtype = %s (%d), Attacker = %s, Inflictor = %s, Target = %s...\n", Deathtype_Name(deathtype), deathtype, attacker.netname, inflictor.netname, targ.netname));
 
        // =======
        // SUICIDE
@@ -416,72 +403,64 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                                        case DEATH_MIRRORDAMAGE:
                                        {
                                                s1 = targ.netname;
-                                               f1 = targ.team;
-                                               //f2 = targ.killcount;
+                                               f1 = targ.killcount;
                                                break;
                                        }
                                        
                                        default:
                                        {
                                                s1 = targ.netname;
+                                               f1 = targ.killcount;
                                                s2 = NO_STR_ARG;
-                                               f1 = f2 = f3 = NO_FL_ARG;
+                                               f2 = f3 = NO_FL_ARG;
                                                break;
                                        }
                                }
                                LogDeath("suicide", deathtype, targ, targ);
                                GiveFrags(attacker, targ, -1, deathtype);
                        }
+                       
                        Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, NO_FL_ARG);
                }
-               else if(DEATH_WEAPONOF(deathtype))
-               {
-                       print("SUICIDE: death was a weapon!\n");
-               }
-               else
+               else if not(Obituary_WeaponDeath(FALSE, deathtype, targ.netname, NO_STR_ARG))
                {
                        backtrace("SUICIDE: what the hell happened here?\n");
                }
        }
 
-
        // ======
        // MURDER
        // ======
        else if(attacker.classname == "player")
        {
+               s1 = attacker.netname;
+               s2 = targ.netname;
+
+               // TODO: ADD REAL CHECK HERE!
+               attacker.FRAG_VERBOSE = TRUE;
+               targ.FRAG_VERBOSE = TRUE;
+               
                if(!IsDifferentTeam(attacker, targ))
                {
-                       if(DEATH_ISSPECIAL(deathtype))
-                       {
-                               backtrace("MURDER: hmm death was special?\n");
-                       }
-                       else if(DEATH_WEAPONOF(deathtype))
-                       {
-                               print("MURDER: death was a weapon!\n");
-                       }
-                       else
-                       {
-                               backtrace("MURDER: what the hell happened here?\n");
-                       }
-                       
                        LogDeath("tk", deathtype, attacker, targ);
                        GiveFrags(attacker, targ, -1, deathtype);
+
+                       attacker.killcount = 0;
+                       
+                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, DEATH_TEAMKILL_FRAG, s2, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
+                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, MSG_DEATH, DEATH_TEAMKILL_FRAGGED, s1, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
+                       Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, APP_TEAM_NUM_4(targ.team, INFO_DEATH_TEAMKILL_), s2, s1, targ.killcount, NO_FL_ARG, NO_FL_ARG);
+
+                       // In this case, the death message will ALWAYS be "foo was betrayed by bar"
+                       // No need for specific death/weapon messages...
                }
                else
                {
-                       s1 = attacker.netname;
-                       s2 = targ.netname;
-
-                       attacker.FRAG_VERBOSE = TRUE;
-                       targ.FRAG_VERBOSE = TRUE;
-
                        LogDeath("frag", deathtype, attacker, targ);
                        GiveFrags(attacker, targ, 1, deathtype);
 
                        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); }
                        
                        #define ADD_ACHIEVEMENT_CASE(numa,numb) \
                                case numa: \
@@ -515,45 +494,43 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                        {
                                if(targ.istypefrag)
                                {
-                                       Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAG_FIRST),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAG_FIRST),
                                                s2, s1, (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),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, 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_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_FIRST_VERBOSE : DEATH_MURDER_FRAG_FIRST),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_FIRST_VERBOSE : DEATH_MURDER_FRAG_FIRST),
                                                s2, s1, (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),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, 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);
                        }
                        else // normal frags, kill sprees listed
                        {
                                if(targ.istypefrag)
                                {
-                                       Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_VERBOSE : DEATH_MURDER_TYPEFRAG),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, 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),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, 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_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_VERBOSE : DEATH_MURDER_FRAG),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, 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),
+                                       Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, 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));
                                }
-
-                               // Send_Notification(world, MSG_WEAPON, 50, s1, s2, attacker.killcount, targ.killcount, Obituary_Score_Position);
-                               if(DEATH_WEAPONOF(deathtype)) { print("Currently unhandled...\n"); }
-                               else { Obituary_SpecialDeath(targ, TRUE, deathtype, s2, s1, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG); }
                        }
+                       
+                       if not(Obituary_WeaponDeath(TRUE, deathtype, targ.netname, attacker.netname))
+                               Obituary_SpecialDeath(targ, TRUE, deathtype, s2, s1, targ.killcount, NO_FL_ARG, NO_FL_ARG);
                }
        }
 
@@ -579,32 +556,32 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                        {
                                s1 = targ.netname;
                                s2 = deathmessage;
+                               f1 = targ.killcount;
                                if(strstrofs(s2, "%", 0) < 0) { s2 = strcat("%s ", s2); }
+                               f2 = f3 = NO_FL_ARG;
                                break;
                        }
                        
                        default:
                        {
                                s1 = targ.netname;
+                               f1 = targ.killcount;
                                s2 = NO_STR_ARG;
-                               f1 = f2 = f3 = NO_FL_ARG;
+                               f2 = f3 = NO_FL_ARG;
                                break;
                        }
                }
 
-               // log and score the death
                LogDeath("accident", deathtype, targ, targ);
                GiveFrags(targ, targ, -1, deathtype);
-               
-               // achieve failure
+
                if(PlayerScore_Add(targ, SP_SCORE, 0) == -5)
                {
                        AnnounceTo(targ, "botlike");
                        PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
                }
 
-               // tell everyone about it
-               Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, NO_FL_ARG);
+               Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, f3);
        }
 
        // Set final information for the death