]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/notifications.qh
Update that other shit too
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / notifications.qh
index 73921cea1d2a98ce64ef285b83a2cf554136029d..95b022820df4fa6d5df8d7d55a9a8d594e7ab15b 100644 (file)
@@ -6,8 +6,8 @@
 // main types/groups of notifications
 #define MSG_INFO 1 // "Global" information messages (sent to console, and notify panel if it has an icon)
 #define MSG_CENTER 2 // "Personal" centerprint messages
-#define MSG_WEAPON 3 // "Personal" weapon messages (like "You got the Nex", sent to weapon notify panel)
-#define MSG_DEATH 4 // "Personal" AND "Global" death messages 
+#define MSG_CENTER_CPID 3 // Kill centerprint message
+#define MSG_MULTI 4 // Subcall MSG_INFO and/or MSG_CENTER notifications
 
 #define NO_MSG -12345 
 
        VARITEM(3, 4, XPD(s1, s2, s3, f1, f2, f3, f4)) \
        VARITEM(4, 4, XPD(s1, s2, s3, s4, f1, f2, f3, f4))
 
+void Destroy_All_Notifications(void);
+void Create_Notification_Entity(
+       float var_default,
+       float var_cvar,
+       float typeid,
+       float nameid,
+       string namestring,
+       float infoname,
+       float centername,
+       float strnum,
+       float flnum,
+       string args,
+       string hudargs,
+       string icon,
+       float cpid,
+       string durcnt,
+       string normal,
+       string gentle,
+       float msg_is_info,
+       float msg_is_multi);
+
 void Dump_Notifications(float fh, float alsoprint);
+
 void Local_Notification(float net_type, float net_name, ...count);
-void Local_Notification_WOVA(float net_type, float net_name, float stringcount, float floatcount, string s1, string s2, string s3, string s4, float f1, float f2, float f3, float f4);
+void Local_Notification_WOVA(
+       float net_type, float net_name,
+       float stringcount, float floatcount,
+       string s1, string s2, string s3, string s4,
+       float f1, float f2, float f3, float f4);
 
 #ifdef CSQC // CLIENT ONLY
 void Read_Notification(float is_new);
@@ -50,16 +76,24 @@ void Read_Notification(float is_new);
 #define NOTIF_ONE_ONLY 2
 #define NOTIF_TEAM 3
 #define NOTIF_TEAM_EXCEPT 4
-#define NOTIF_ANY 5
-#define NOTIF_ANY_EXCEPT 6
+#define NOTIF_ALL 5
+#define NOTIF_ALL_EXCEPT 6
 
 #define IFSTR(num) ((num < notif.nent_stringcount) ? ...(num, string) : "")
 #define IFFL(num) ((((notif.nent_stringcount-1) + num) < count) ? ...(((notif.nent_stringcount-1) + num), float) : 0)
 
-void Send_Notification(float broadcast, entity client, float net_type, float net_name, ...count);
-void Send_Notification_WOVA(float broadcast, entity client, float net_type, float net_name, string s1, string s2, string s3, string s4, float f1, float f2, float f3, float f4);
-void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num);
-#define Send_CSQC_Centerprint_Generic_Expire(e,id) Send_CSQC_Centerprint_Generic(e, id, "", 1, 0)
+void Kill_Notification(
+       float broadcast, entity client,
+       float net_type, float net_name);
+void Send_Notification(
+       float broadcast, entity client,
+       float net_type, float net_name,
+       ...count);
+void Send_Notification_WOVA(
+       float broadcast, entity client,
+       float net_type, float net_name,
+       string s1, string s2, string s3, string s4,
+       float f1, float f2, float f3, float f4);
 #endif
 
 
@@ -92,8 +126,7 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
       durcnt: XPD(FLOAT, FLOAT): Duration/Countdown: extra arguments for centerprint messages
       normal: STRING: Normal message (string for sprintf when gentle messages are NOT enabled)
       gentle: STRING: Gentle message (string for sprintf when gentle messages ARE enabled)
-    MSG_WEAPON:
-    MSG_DEATH:
+    MSG_MULTI:
       default: FLOAT: Default setting for whether the notification is enabled or not
          ^-> 0 = disabled, 1 = enabled
       name: VAR: Name of chaining notification
@@ -228,11 +261,21 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE,                                2, 0, "s1 s2", "",                                              "",                                             _("^BG%s^K1 was frozen by ^BG%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_FREEZETAG_SELF,                                  1, 0, "s1", "",                                                 "",                                             _("^BG%s^K1 froze themself\n"), "") \
        MSG_INFO_NOTIF(1, INFO_GODMODE_OFF,                                             0, 1, "f1", "",                                                 "",                                             _("^BGGodmode saved you %s units of damage, cheater!\n"), "") \
+       MSG_INFO_NOTIF(0, INFO_ITEM_WEAPON_DONTHAVE,                    0, 1, "item_wepname", "",                                               "",                             _("^BGYou do not have the ^F1%s\n"), "") \
+       MSG_INFO_NOTIF(0, INFO_ITEM_WEAPON_DROP,                                1, 1, "item_wepname item_wepammo", "",                  "",                             _("^BGYou dropped the ^F1%s^BG%s\n"), "") \
+       MSG_INFO_NOTIF(0, INFO_ITEM_WEAPON_GOT,                                 0, 1, "item_wepname", "",                                               "",                             _("^BGYou got the ^F1%s\n"), "") \
+       MSG_INFO_NOTIF(0, INFO_ITEM_WEAPON_NOAMMO,                              0, 1, "item_wepname", "",                                               "",                             _("^BGYou don't have enough ammo for the ^F1%s\n"), "") \
+       MSG_INFO_NOTIF(0, INFO_ITEM_WEAPON_PRIMORSEC,                   0, 3, "item_wepname f2primsec f3primsec", "",   "",                     _("^F1%s %s^BG is unable to fire, but its ^F1%s^BG can\n"), "") \
+       MSG_INFO_NOTIF(0, INFO_ITEM_WEAPON_UNAVAILABLE,                 0, 1, "item_wepname", "",                                               "",                             _("^F1%s^BG is ^F4not available^BG on this map\n"), "") \
        MSG_INFO_NOTIF(2, INFO_JOIN_CONNECT,                                    1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 connected%s\n"), "") \
        MULTITEAM_INFO(2, INFO_JOIN_CONNECT_TEAM_, 4,                   1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 connected and joined the ^TC^TT\n"), "") \
        MSG_INFO_NOTIF(2, INFO_JOIN_PLAY,                                               1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 is now playing\n"), "") \
        MSG_INFO_NOTIF(1, INFO_KEEPAWAY_DROPPED,                                1, 0, "s1", "s1",                                               "notify_balldropped",   _("^BG%s^BG has dropped the ball!\n"), "") \
        MSG_INFO_NOTIF(1, INFO_KEEPAWAY_PICKUP,                                 1, 0, "s1", "s1",                                               "notify_ballpickedup",  _("^BG%s^BG has picked up the ball!\n"), "") \
+       MULTITEAM_INFO(1, INFO_KEYHUNT_CAPTURE_, 4,                             1, 0, "s1", "",                                                 "",                                             _("^BG%s^BG captured the keys for the ^TC^TT team\n"), "") \
+       MULTITEAM_INFO(1, INFO_KEYHUNT_DROP_, 4,                                1, 0, "s1", "",                                                 "",                                             _("^BG%s^BG dropped the ^TC^TT Key\n"), "") \
+       MULTITEAM_INFO(1, INFO_KEYHUNT_LOST_, 4,                                1, 0, "s1", "",                                                 "",                                             _("^BG%s^BG lost the ^TC^TT Key\n"), "") \
+       MULTITEAM_INFO(1, INFO_KEYHUNT_PICKUP_, 4,                              1, 0, "s1", "",                                                 "",                                             _("^BG%s^BG picked up the ^TC^TT Key\n"), "") \
        MSG_INFO_NOTIF(1, INFO_LMS_NOLIVES,                                             1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 has no more lives left\n"), "") \
        MSG_INFO_NOTIF(1, INFO_LMS_FORFEIT,                                             1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 forfeited\n"), "") \
        MSG_INFO_NOTIF(1, INFO_POWERUP_INVISIBILITY,                    1, 0, "s1", "s1",                                               "strength",                             _("^BG%s^K1 picked up Invisibility\n"), "") \
@@ -243,13 +286,16 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MSG_INFO_NOTIF(2, INFO_QUIT_KICK_IDLING,                                1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 was kicked for idling\n"), "") \
        MSG_INFO_NOTIF(1, INFO_QUIT_KICK_SPECTATING,                    0, 0, "", "",                                                   "",                                             _("^F2You were kicked from the server because you are a spectator and spectators aren't allowed at the moment.\n"), "") \
        MSG_INFO_NOTIF(2, INFO_QUIT_SPECTATE,                                   1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 is now spectating\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_RACE_FAIL_RANKED,                                1, 3, "s1 f1ord race_time race_diff", "s1",             "race_newfail", _("^BG%s^BG couldn't break their %s place record of %s %s\n", "") \
-       MSG_INFO_NOTIF(1, INFO_RACE_FAIL_UNRANKED,                              1, 3, "s1 f1ord race_time race_diff", "s1",             "race_newfail", _("^BG%s^BG couldn't break the %s place record of %s %s\n", "") \
-       MSG_INFO_NOTIF(1, INFO_RACE_NEW_RECORD,                                 2, 0, "s1 s2", "s1",                                    "race_newrecordserver", "TODO\n", "") \
-       MSG_INFO_NOTIF(1, INFO_RACE_NEW_TIME,                                   2, 0, "s1 s2", "s1",                                    "race_newtime",                 "TODO\n", "") \
-       MSG_INFO_NOTIF(1, INFO_RACE_NEW_RANK,                                   2, 0, "s1 s2", "s1",                                    "race_newrankyellow",   "TODO\n", "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_ABANDONED,                                  1, 0, "s1", "",                                                                                                                         "",                                             _("^BG%s^BG has abandoned the race\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_FINISHED,                                   1, 0, "s1", "",                                                                                                                         "",                                             _("^BG%s^BG has finished the race\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_FAIL_RANKED,                                1, 3, "s1 race_col f1ord race_col f2race_time race_diff", "s1",                         "race_newfail",                         _("^BG%s^BG couldn't break their %s%s^BG place record of %s%s %s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_FAIL_UNRANKED,                              1, 3, "s1 race_col f1ord race_col f2race_time race_diff", "s1",                         "race_newfail",                         _("^BG%s^BG couldn't break the %s%s^BG place record of %s%s %s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_NEW_MISSING_UID,                    1, 1, "s1 f1race_time", "s1",                                                                                           "race_newfail",                         _("^BG%s^BG scored a new record with ^F2%s^BG, but unfortunately lacks a UID and will be lost.\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_NEW_IMPROVED,                               1, 3, "s1 race_col f1ord race_col f2race_time race_diff", "s1",                         "race_newtime",                         _("^BG%s^BG improved their %s%s^BG place record with %s%s %s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_NEW_SET,                                    1, 2, "s1 race_col f1ord race_col f2race_time", "s1",                                           "race_newrecordserver",         _("^BG%s^BG set the %s%s^BG place record with %s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_NEW_BROKEN,                                 2, 3, "s1 s2 race_col f1ord race_col f2race_time race_diff", "s1 s2",           "race_newrankyellow",           _("^BG%s^BG broke %s^BG's %s%s^BG place record with %s%s %s\n"), "") \
        MULTITEAM_INFO(1, INFO_SCORES_, 4,                                              0, 0, "", "",                                                   "",                                             _("^TC^TT ^BGteam scores!\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_SPECTATE_WARNING,                                0, 1, "f1", "",                                                 "",                                             _("^F2You have to become a player within the next %s seconds, otherwise you will be kicked, because spectating isn't allowed at this time!\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_SPECTATE_WARNING,                                0, 1, "f1secs", "",                                             "",                                             _("^F2You have to become a player within the next %s, otherwise you will be kicked, because spectating isn't allowed at this time!\n"), "") \
        MSG_INFO_NOTIF(1, INFO_SUPERWEAPON_PICKUP,                              0, 0, "s1", "s1",                                               "strength",                             _("^BG%s^K1 picked up a Superweapon\n"), "") \
        MSG_INFO_NOTIF(2, INFO_VERSION_BETA,                                    2, 0, "s1 s2", "",                                              "",                                             _("^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have ^F2Xonotic %s\n"), "") \
        MSG_INFO_NOTIF(2, INFO_VERSION_OLD,                                             2, 0, "s1 s2", "",                                              "",                                             _("^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s\n"), "") \
@@ -318,6 +364,11 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        /*MSG_CENTER_NOTIF(1, CENTER_EMPTY,                                                     0, 0, "",                               NO_CPID,                                "0 0", "null", "")*/ \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_ATTACKING,                           0, 0, "",                               CPID_ASSAULT_ROLE,              "0 0", _("^BGYou are attacking!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_DEFENDING,                           0, 0, "",                               CPID_ASSAULT_ROLE,              "0 0", _("^BGYou are defending!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ARENA_BEGIN,                                         0, 0, "",                               CPID_ARENA,                             "2 0", _("^F4Begin!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ARENA_NEEDPLAYER,                            0, 0, "",                               CPID_ARENA,                             "2 0", _("^BGNeed at least 1 player in each team to play Clan Arena!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ARENA_ROUNDSTART,                            0, 1, "",                               CPID_ARENA,                     "1 f1", _("^F4Round will start in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_BEGIN,                                     0, 0, "",                               CPID_GAMESTART,                 "2 0", _("^F4Begin!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_GAMESTART,                         0, 1, "",                               CPID_GAMESTART,                 "1 f1", _("^F4Game starts in ^COUNT"), "") \
        MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED,          0, 0, "",                               CPID_CTF_CAPSHIELD,             "0 0", _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \
        MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE,                      0, 0, "",                               CPID_CTF_CAPSHIELD,             "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \
        MULTITEAM_CENTER(1, CENTER_CTF_PASS_OTHER_, 2,                          2, 0, "s1 s2",                  CPID_CTF_PASS,                  "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \
@@ -383,13 +434,30 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SELF,                                      0, 0, "",                               NO_CPID,                                "0 0", _("^K1You froze yourself"), "") \
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FREEZE,                            1, 0, "s1",                             NO_CPID,                                "0 0", _("^K3You froze ^BG%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FROZEN,                            1, 0, "s1",                             NO_CPID,                                "0 0", _("^K1You were frozen by ^BG%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_DONTHAVE,                        0, 1, "item_wepname",                                           CPID_ITEM, "item_centime 0", _("^BGYou do not have the ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_DROP,                            1, 1, "item_wepname item_wepammo",                      CPID_ITEM, "item_centime 0", _("^BGYou dropped the ^F1%s^BG%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_GOT,                             0, 1, "item_wepname",                                           CPID_ITEM, "item_centime 0", _("^BGYou got the ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_NOAMMO,                          0, 1, "item_wepname",                                           CPID_ITEM, "item_centime 0", _("^BGYou don't have enough ammo for the ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_PRIMORSEC,                       0, 3, "item_wepname f2primsec f3primsec",       CPID_ITEM, "item_centime 0", _("^F1%s %s^BG is unable to fire, but its ^F1%s^BG can"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ITEM_WEAPON_UNAVAILABLE,                     0, 1, "item_wepname",                                           CPID_ITEM, "item_centime 0", _("^F1%s^BG is ^F4not available^BG on this map"), "") \
        MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_DROPPED,                            1, 0, "s1",                     CPID_KEEPAWAY,                  "0 0", _("^BG%s^BG has dropped the ball!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_PICKUP,                                     1, 0, "s1",                     CPID_KEEPAWAY,                  "0 0", _("^BG%s^BG has picked up the ball!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_WARN,                                       0, 0, "",                               CPID_KA_WARN,                   "0 0", _("^BGKilling people while you don't have the ball gives no points!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK,                                       0, 0, "",                               CPID_LMS_CAMP,                  "0 0", _("^K1Don't camp!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_WARN,                                       0, 0, "",                               CPID_KEEPAWAY_WARN,             "0 0", _("^BGKilling people while you don't have the ball gives no points!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_HELP,                                        0, 0, "",                               CPID_KEYHUNT,                   "0 0", _("^BGAll keys are in your team's hands!\nHelp the key carriers to meet!"), "") \
+       MULTITEAM_CENTER(1, CENTER_KEYHUNT_INTERFERE_, 4,                       0, 0, "",                               CPID_KEYHUNT,                   "0 0", _("^BGAll keys are in ^TC^TT team^BG's hands!\nInterfere ^F4NOW^BG!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_MEET,                                        0, 0, "",                               CPID_KEYHUNT,                   "0 0", _("^BGAll keys are in your team's hands!\nMeet the other key carriers ^F4NOW^BG!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_SCAN,                                        0, 1, "",                               CPID_KEYHUNT_OTHER,             "f1 0", _("^BGScanning frequency range..."), "") \
+       MULTITEAM_CENTER(1, CENTER_KEYHUNT_START_, 4,                           0, 0, "",                               CPID_KEYHUNT,                   "0 0", _("^BGYou are starting with the ^TC^TT Key"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_WAIT,                                        0, 4, "kh_teams",               CPID_KEYHUNT_OTHER,             "0 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK,                                       0, 0, "",                               CPID_LMS_CAMP,                  "0 0", _("^F2Don't camp!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MOTD,                                                        1, 0, "s1",                             CPID_MOTD,                              "-1 0", _("^BG%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO,                                     0, 0, "",                               CPID_MINSTA_FINDAMMO,   "1 9", _("^F4^COUNT^BG left to find some ammo!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO_FIRST,                       0, 0, "",                               CPID_MINSTA_FINDAMMO,   "1 10", _("^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"), _("^BGGet some ammo! ^F4^COUNT^BG left!")) \
+       MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN,                                       0, 2, "item_wepname",   CPID_NIX,                               "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON,                                       0, 1, "item_wepname",   CPID_NIX,                               "0 0", _("^F2Active weapon: ^F1%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_JOIN_NOSPAWNS,                                       0, 0, "",                               CPID_PREVENT_JOIN,              "0 0", _("^K1No spawnpoints available!\nHope your team can fix it..."), "") \
        MSG_CENTER_NOTIF(1, CENTER_JOIN_PREVENT,                                        0, 0, "",                               CPID_PREVENT_JOIN,              "0 0", _("^K1You may not join the game at this time.\nThe player limit reached maximum capacity."), "") \
-       MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME,                                       0, 1, "f1time",                 CPID_OVERTIME,                  "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nAdded ^F4%s ^F2minute(s) to the game!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME,                                       0, 1, "f1time",                 CPID_OVERTIME,                  "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nAdded ^F4%s^F2 to the game!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG,                                       0, 0, "",                               CPID_OVERTIME,                  "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \
        MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY,                      0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Invisibility has worn off"), "") \
        MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SHIELD,                            0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Shield has worn off"), "") \
@@ -406,125 +474,130 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MULTITEAM_CENTER(1, CENTER_TEAMCHANGE_, 4,                                      0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^BGChanging to ^TC^TT^BG in ^COUNT"), "") \
        MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SPECTATE,                         0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^BGSpectating in ^COUNT"), "") \
        MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_AUTO,                                     0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^BGChanging team in ^COUNT"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE,                          0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^K1Suicide in ^COUNT"), "")
-
-#define MSG_WEAPON_NOTIFICATIONS \
-       /*MSG_WEAPON_NOTIF(1, WEAPON_EMPTY,                                                     NO_MSG,                                                                         NO_MSG)*/ \
-       MSG_WEAPON_NOTIF(1, WEAPON_THINKING_WITH_PORTALS,                       INFO_WEAPON_THINKING_WITH_PORTALS,                      CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_CRYLINK_SUICIDE,                             INFO_WEAPON_CRYLINK_SUICIDE,                            CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_CRYLINK_MURDER,                                      INFO_WEAPON_CRYLINK_MURDER,                             NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_SUICIDE_ORBS,                        INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                       CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_SUICIDE_BOLT,                        INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                       CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_MURDER_BOLT,                         INFO_WEAPON_ELECTRO_MURDER_BOLT,                        NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_MURDER_ORBS,                         INFO_WEAPON_ELECTRO_MURDER_ORBS,                        NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ELECTRO_MURDER_COMBO,                        INFO_WEAPON_ELECTRO_MURDER_COMBO,                       NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_SUICIDE_FIREMINE,           INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,          CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_SUICIDE_BLAST,                      INFO_WEAPON_FIREBALL_SUICIDE_BLAST,             CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_MURDER_FIREMINE,            INFO_WEAPON_FIREBALL_MURDER_FIREMINE,           NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_FIREBALL_MURDER_BLAST,                       INFO_WEAPON_FIREBALL_MURDER_BLAST,                      NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_SUICIDE_EXPLODE,                      INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,             CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_SUICIDE_BOUNCE,                       INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                      CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_MURDER_EXPLODE,                       INFO_WEAPON_MORTAR_MURDER_EXPLODE,                      NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_MORTAR_MURDER_BOUNCE,                        INFO_WEAPON_MORTAR_MURDER_BOUNCE,                       NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_HAGAR_SUICIDE,                                       INFO_WEAPON_HAGAR_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_HAGAR_MURDER_BURST,                          INFO_WEAPON_HAGAR_MURDER_BURST,                         NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_HAGAR_MURDER_SPRAY,                          INFO_WEAPON_HAGAR_MURDER_SPRAY,                         NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_HLAC_SUICIDE,                                        INFO_WEAPON_HLAC_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_HLAC_MURDER,                                         INFO_WEAPON_HLAC_MURDER,                                        NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_HOOK_MURDER,                                         INFO_WEAPON_HOOK_MURDER,                                        NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_LASER_SUICIDE,                                       INFO_WEAPON_LASER_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_LASER_MURDER,                                        INFO_WEAPON_LASER_MURDER,                                       NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_MINELAYER_SUICIDE,                           INFO_WEAPON_MINELAYER_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_MINELAYER_MURDER,                            INFO_WEAPON_MINELAYER_MURDER,                           NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_MINSTANEX_MURDER,                            INFO_WEAPON_MINSTANEX_MURDER,                           NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_NEX_MURDER,                                          INFO_WEAPON_NEX_MURDER,                                         NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL_PIERCING,          INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,         NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL,                           INFO_WEAPON_RIFLE_MURDER_HAIL,                          NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_PIERCING,                       INFO_WEAPON_RIFLE_MURDER_PIERCING,                      NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER,                                        INFO_WEAPON_RIFLE_MURDER,                                       NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_RIFLE_MURDER_HEADSHOT,                       INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                      NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ROCKETLAUNCHER_SUICIDE,                      INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,             CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,        INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,       NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,        INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,       NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_SEEKER_SUICIDE,                                      INFO_WEAPON_SEEKER_SUICIDE,                             CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_SEEKER_MURDER_TAG,                           INFO_WEAPON_SEEKER_MURDER_TAG,                          NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_SEEKER_MURDER_SPRAY,                         INFO_WEAPON_SEEKER_MURDER_SPRAY,                        NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_SHOTGUN_MURDER_SLAP,                         INFO_WEAPON_SHOTGUN_MURDER_SLAP,                        NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_SHOTGUN_MURDER,                                      INFO_WEAPON_SHOTGUN_MURDER,                             NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_TUBA_SUICIDE,                                        INFO_WEAPON_TUBA_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_TUBA_MURDER,                                         INFO_WEAPON_TUBA_MURDER,                                        NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ACCORDEON_SUICIDE,                           INFO_WEAPON_ACCORDEON_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_ACCORDEON_MURDER,                            INFO_WEAPON_ACCORDEON_MURDER,                           NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_KLEINBOTTLE_SUICIDE,                         INFO_WEAPON_KLEINBOTTLE_SUICIDE,                        CENTER_DEATH_SELF_GENERIC) \
-       MSG_WEAPON_NOTIF(1, WEAPON_KLEINBOTTLE_MURDER,                          INFO_WEAPON_KLEINBOTTLE_MURDER,                         NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_UZI_MURDER_SNIPE,                            INFO_WEAPON_UZI_MURDER_SNIPE,                           NO_MSG) \
-       MSG_WEAPON_NOTIF(1, WEAPON_UZI_MURDER_SPRAY,                            INFO_WEAPON_UZI_MURDER_SPRAY,                           NO_MSG) 
-
-#define MSG_DEATH_NOTIFICATIONS \
-       /*MSG_DEATH_NOTIF(1, DEATH_EMPTY,                                               NO_MSG,                                                                 NO_MSG)*/ \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_CUSTOM,                                   INFO_DEATH_SELF_GENERIC,                                CENTER_DEATH_SELF_CUSTOM) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_GENERIC,                                  INFO_DEATH_SELF_GENERIC,                                CENTER_DEATH_SELF_GENERIC) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VOID,                                             INFO_DEATH_SELF_VOID,                                   CENTER_DEATH_SELF_VOID) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_SUICIDE,                                  INFO_DEATH_SELF_SUICIDE,                                CENTER_DEATH_SELF_SUICIDE) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_NOAMMO,                                   INFO_DEATH_SELF_NOAMMO,                                 CENTER_DEATH_SELF_NOAMMO) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_ROT,                                              INFO_DEATH_SELF_ROT,                                    CENTER_DEATH_SELF_ROT) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_CAMP,                                             INFO_DEATH_SELF_CAMP,                                   CENTER_DEATH_SELF_CAMP) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_BETRAYAL,                                 INFO_DEATH_SELF_BETRAYAL,                               CENTER_DEATH_SELF_BETRAYAL) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TEAMCHANGE,                               INFO_DEATH_SELF_TEAMCHANGE,                             CENTER_DEATH_SELF_TEAMCHANGE) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_AUTOTEAMCHANGE,                   INFO_DEATH_SELF_AUTOTEAMCHANGE,                 CENTER_DEATH_SELF_AUTOTEAMCHANGE) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_FALL,                                             INFO_DEATH_SELF_FALL,                                   CENTER_DEATH_SELF_FALL) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_DROWN,                                    INFO_DEATH_SELF_DROWN,                                  CENTER_DEATH_SELF_DROWN) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_FIRE,                                             INFO_DEATH_SELF_FIRE,                                   CENTER_DEATH_SELF_FIRE) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_LAVA,                                             INFO_DEATH_SELF_LAVA,                                   CENTER_DEATH_SELF_LAVA) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_SLIME,                                    INFO_DEATH_SELF_SLIME,                                  CENTER_DEATH_SELF_SLIME) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_SHOOTING_STAR,                    INFO_DEATH_SELF_SHOOTING_STAR,                  CENTER_DEATH_SELF_SHOOTING_STAR) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_SWAMP,                                    INFO_DEATH_SELF_SWAMP,                                  CENTER_DEATH_SELF_SWAMP) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_CHEAT,                                    INFO_DEATH_SELF_CHEAT,                                  CENTER_DEATH_SELF_CHEAT) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TOUCHEXPLODE,                             INFO_DEATH_SELF_TOUCHEXPLODE,                   CENTER_DEATH_SELF_TOUCHEXPLODE) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET,                                   INFO_DEATH_SELF_TURRET,                                 CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_EWHEEL,                    INFO_DEATH_SELF_TURRET_EWHEEL,                  CENTER_DEATH_SELF_TURRET_EWHEEL) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_FLAC,                              INFO_DEATH_SELF_TURRET_FLAC,                    CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_MACHINEGUN,                INFO_DEATH_SELF_TURRET_MACHINEGUN,              CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_WALK_GUN,                  INFO_DEATH_SELF_TURRET_WALK_GUN,                CENTER_DEATH_SELF_TURRET_WALK) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_WALK_MEELE,                INFO_DEATH_SELF_TURRET_WALK_MEELE,              CENTER_DEATH_SELF_TURRET_WALK) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_WALK_ROCKET,               INFO_DEATH_SELF_TURRET_WALK_ROCKET,             CENTER_DEATH_SELF_TURRET_WALK) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_HELLION,                   INFO_DEATH_SELF_TURRET_HELLION,                 CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_HK,                                INFO_DEATH_SELF_TURRET_HK,                              CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_MLRS,                              INFO_DEATH_SELF_TURRET_MLRS,                    CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_PLASMA,                    INFO_DEATH_SELF_TURRET_PLASMA,                  CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_PHASER,                    INFO_DEATH_SELF_TURRET_PHASER,                  CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_TURRET_TESLA,                             INFO_DEATH_SELF_TURRET_TESLA,                   CENTER_DEATH_SELF_TURRET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_CRUSH,                                 INFO_DEATH_SELF_VH_CRUSH,                               CENTER_DEATH_SELF_VH_CRUSH) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_SPID_ROCKET,                   INFO_DEATH_SELF_VH_SPID_ROCKET,                 CENTER_DEATH_SELF_VH_SPID_ROCKET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_SPID_DEATH,                    INFO_DEATH_SELF_VH_SPID_DEATH,                  CENTER_DEATH_SELF_VH_SPID_DEATH) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_WAKI_ROCKET,                   INFO_DEATH_SELF_VH_WAKI_ROCKET,                 CENTER_DEATH_SELF_VH_WAKI_ROCKET) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_WAKI_DEATH,                    INFO_DEATH_SELF_VH_WAKI_DEATH,                  CENTER_DEATH_SELF_VH_WAKI_DEATH) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_RAPT_BOMB,                             INFO_DEATH_SELF_VH_RAPT_BOMB,                   CENTER_DEATH_SELF_VH_RAPT_BOMB) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_RAPT_DEATH,                    INFO_DEATH_SELF_VH_RAPT_DEATH,                  CENTER_DEATH_SELF_VH_RAPT_DEATH) \
-       MSG_DEATH_NOTIF(1, DEATH_SELF_VH_BUMB_DEATH,                    INFO_DEATH_SELF_VH_BUMB_DEATH,                  CENTER_DEATH_SELF_VH_BUMB_DEATH) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_TELEFRAG,                               INFO_DEATH_MURDER_TELEFRAG,                             NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_FALL,                                   INFO_DEATH_MURDER_FALL,                                 NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_DROWN,                                  INFO_DEATH_MURDER_DROWN,                                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_LAVA,                                   INFO_DEATH_MURDER_LAVA,                                 NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_SLIME,                                  INFO_DEATH_MURDER_SLIME,                                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_SHOOTING_STAR,                  INFO_DEATH_MURDER_SHOOTING_STAR,                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_SWAMP,                                  INFO_DEATH_MURDER_SWAMP,                                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VOID,                                   INFO_DEATH_MURDER_VOID,                                 NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_TOUCHEXPLODE,                   INFO_DEATH_MURDER_TOUCHEXPLODE,                 NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_CHEAT,                                  INFO_DEATH_MURDER_CHEAT,                                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_FIRE,                                   INFO_DEATH_MURDER_FIRE,                                 NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_CRUSH,                               INFO_DEATH_MURDER_VH_CRUSH,                             NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_SPID_MINIGUN,                INFO_DEATH_MURDER_VH_SPID_MINIGUN,              NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_SPID_ROCKET,                 INFO_DEATH_MURDER_VH_SPID_ROCKET,               NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_SPID_DEATH,                  INFO_DEATH_MURDER_VH_SPID_DEATH,                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_WAKI_GUN,                    INFO_DEATH_MURDER_VH_WAKI_GUN,                  NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_WAKI_ROCKET,                 INFO_DEATH_MURDER_VH_WAKI_ROCKET,               NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_WAKI_DEATH,                  INFO_DEATH_MURDER_VH_WAKI_DEATH,                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_RAPT_CANNON,                 INFO_DEATH_MURDER_VH_RAPT_CANNON,               NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_RAPT_BOMB,                   INFO_DEATH_MURDER_VH_RAPT_BOMB,                 NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_RAPT_DEATH,                  INFO_DEATH_MURDER_VH_RAPT_DEATH,                NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_BUMB_GUN,                    INFO_DEATH_MURDER_VH_BUMB_GUN,                  NO_MSG) \
-       MSG_DEATH_NOTIF(1, DEATH_MURDER_VH_BUMB_DEATH,                  INFO_DEATH_MURDER_VH_BUMB_DEATH,                NO_MSG) 
+       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE,                          0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^K1Suicide in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_BEGINNING,                           0, 1, "",                               CPID_TIMEOUT,                   "1 f1", _("^F4Timeout begins in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING,                                      0, 1, "",                               CPID_TIMEOUT,                   "1 f1", _("^F4Timeout ends in ^COUNT"), "")
+
+#define MSG_MULTI_NOTIFICATIONS \
+       /*MSG_MULTI_NOTIF(1, MULTI_EMPTY,                                                       NO_MSG,                                                                         NO_MSG)*/ \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_CUSTOM,                                           INFO_DEATH_SELF_GENERIC,                                        CENTER_DEATH_SELF_CUSTOM) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_GENERIC,                                          INFO_DEATH_SELF_GENERIC,                                        CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VOID,                                                     INFO_DEATH_SELF_VOID,                                           CENTER_DEATH_SELF_VOID) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_SUICIDE,                                          INFO_DEATH_SELF_SUICIDE,                                        CENTER_DEATH_SELF_SUICIDE) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_NOAMMO,                                           INFO_DEATH_SELF_NOAMMO,                                         CENTER_DEATH_SELF_NOAMMO) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_ROT,                                                      INFO_DEATH_SELF_ROT,                                            CENTER_DEATH_SELF_ROT) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_CAMP,                                                     INFO_DEATH_SELF_CAMP,                                           CENTER_DEATH_SELF_CAMP) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_BETRAYAL,                                         INFO_DEATH_SELF_BETRAYAL,                                       CENTER_DEATH_SELF_BETRAYAL) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TEAMCHANGE,                                       INFO_DEATH_SELF_TEAMCHANGE,                                     CENTER_DEATH_SELF_TEAMCHANGE) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_AUTOTEAMCHANGE,                           INFO_DEATH_SELF_AUTOTEAMCHANGE,                         CENTER_DEATH_SELF_AUTOTEAMCHANGE) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_FALL,                                                     INFO_DEATH_SELF_FALL,                                           CENTER_DEATH_SELF_FALL) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_DROWN,                                            INFO_DEATH_SELF_DROWN,                                          CENTER_DEATH_SELF_DROWN) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_FIRE,                                                     INFO_DEATH_SELF_FIRE,                                           CENTER_DEATH_SELF_FIRE) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_LAVA,                                                     INFO_DEATH_SELF_LAVA,                                           CENTER_DEATH_SELF_LAVA) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_SLIME,                                            INFO_DEATH_SELF_SLIME,                                          CENTER_DEATH_SELF_SLIME) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_SHOOTING_STAR,                            INFO_DEATH_SELF_SHOOTING_STAR,                          CENTER_DEATH_SELF_SHOOTING_STAR) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_SWAMP,                                            INFO_DEATH_SELF_SWAMP,                                          CENTER_DEATH_SELF_SWAMP) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_CHEAT,                                            INFO_DEATH_SELF_CHEAT,                                          CENTER_DEATH_SELF_CHEAT) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TOUCHEXPLODE,                                     INFO_DEATH_SELF_TOUCHEXPLODE,                           CENTER_DEATH_SELF_TOUCHEXPLODE) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET,                                           INFO_DEATH_SELF_TURRET,                                         CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_EWHEEL,                            INFO_DEATH_SELF_TURRET_EWHEEL,                          CENTER_DEATH_SELF_TURRET_EWHEEL) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_FLAC,                                      INFO_DEATH_SELF_TURRET_FLAC,                            CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_MACHINEGUN,                        INFO_DEATH_SELF_TURRET_MACHINEGUN,                      CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_WALK_GUN,                          INFO_DEATH_SELF_TURRET_WALK_GUN,                        CENTER_DEATH_SELF_TURRET_WALK) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_WALK_MEELE,                        INFO_DEATH_SELF_TURRET_WALK_MEELE,                      CENTER_DEATH_SELF_TURRET_WALK) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_WALK_ROCKET,                       INFO_DEATH_SELF_TURRET_WALK_ROCKET,                     CENTER_DEATH_SELF_TURRET_WALK) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_HELLION,                           INFO_DEATH_SELF_TURRET_HELLION,                         CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_HK,                                        INFO_DEATH_SELF_TURRET_HK,                                      CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_MLRS,                                      INFO_DEATH_SELF_TURRET_MLRS,                            CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_PLASMA,                            INFO_DEATH_SELF_TURRET_PLASMA,                          CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_PHASER,                            INFO_DEATH_SELF_TURRET_PHASER,                          CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_TURRET_TESLA,                                     INFO_DEATH_SELF_TURRET_TESLA,                           CENTER_DEATH_SELF_TURRET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_CRUSH,                                         INFO_DEATH_SELF_VH_CRUSH,                                       CENTER_DEATH_SELF_VH_CRUSH) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_SPID_ROCKET,                           INFO_DEATH_SELF_VH_SPID_ROCKET,                         CENTER_DEATH_SELF_VH_SPID_ROCKET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_SPID_DEATH,                            INFO_DEATH_SELF_VH_SPID_DEATH,                          CENTER_DEATH_SELF_VH_SPID_DEATH) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_WAKI_ROCKET,                           INFO_DEATH_SELF_VH_WAKI_ROCKET,                         CENTER_DEATH_SELF_VH_WAKI_ROCKET) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_WAKI_DEATH,                            INFO_DEATH_SELF_VH_WAKI_DEATH,                          CENTER_DEATH_SELF_VH_WAKI_DEATH) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_RAPT_BOMB,                                     INFO_DEATH_SELF_VH_RAPT_BOMB,                           CENTER_DEATH_SELF_VH_RAPT_BOMB) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_RAPT_DEATH,                            INFO_DEATH_SELF_VH_RAPT_DEATH,                          CENTER_DEATH_SELF_VH_RAPT_DEATH) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_VH_BUMB_DEATH,                            INFO_DEATH_SELF_VH_BUMB_DEATH,                          CENTER_DEATH_SELF_VH_BUMB_DEATH) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_TELEFRAG,                                       INFO_DEATH_MURDER_TELEFRAG,                                     NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_FALL,                                           INFO_DEATH_MURDER_FALL,                                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_DROWN,                                          INFO_DEATH_MURDER_DROWN,                                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_LAVA,                                           INFO_DEATH_MURDER_LAVA,                                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_SLIME,                                          INFO_DEATH_MURDER_SLIME,                                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_SHOOTING_STAR,                          INFO_DEATH_MURDER_SHOOTING_STAR,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_SWAMP,                                          INFO_DEATH_MURDER_SWAMP,                                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VOID,                                           INFO_DEATH_MURDER_VOID,                                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_TOUCHEXPLODE,                           INFO_DEATH_MURDER_TOUCHEXPLODE,                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_CHEAT,                                          INFO_DEATH_MURDER_CHEAT,                                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_FIRE,                                           INFO_DEATH_MURDER_FIRE,                                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_CRUSH,                                       INFO_DEATH_MURDER_VH_CRUSH,                                     NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_SPID_MINIGUN,                        INFO_DEATH_MURDER_VH_SPID_MINIGUN,                      NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_SPID_ROCKET,                         INFO_DEATH_MURDER_VH_SPID_ROCKET,                       NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_SPID_DEATH,                          INFO_DEATH_MURDER_VH_SPID_DEATH,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_GUN,                            INFO_DEATH_MURDER_VH_WAKI_GUN,                          NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_ROCKET,                         INFO_DEATH_MURDER_VH_WAKI_ROCKET,                       NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_WAKI_DEATH,                          INFO_DEATH_MURDER_VH_WAKI_DEATH,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_RAPT_CANNON,                         INFO_DEATH_MURDER_VH_RAPT_CANNON,                       NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_RAPT_BOMB,                           INFO_DEATH_MURDER_VH_RAPT_BOMB,                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_RAPT_DEATH,                          INFO_DEATH_MURDER_VH_RAPT_DEATH,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_BUMB_GUN,                            INFO_DEATH_MURDER_VH_BUMB_GUN,                          NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_VH_BUMB_DEATH,                          INFO_DEATH_MURDER_VH_BUMB_DEATH,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, ITEM_WEAPON_DONTHAVE,                                        INFO_ITEM_WEAPON_DONTHAVE,                                      CENTER_ITEM_WEAPON_DONTHAVE) \
+       MSG_MULTI_NOTIF(1, ITEM_WEAPON_DROP,                                            INFO_ITEM_WEAPON_DROP,                                          CENTER_ITEM_WEAPON_DROP) \
+       MSG_MULTI_NOTIF(1, ITEM_WEAPON_GOT,                                                     INFO_ITEM_WEAPON_GOT,                                           CENTER_ITEM_WEAPON_GOT) \
+       MSG_MULTI_NOTIF(1, ITEM_WEAPON_NOAMMO,                                          INFO_ITEM_WEAPON_NOAMMO,                                        CENTER_ITEM_WEAPON_NOAMMO) \
+       MSG_MULTI_NOTIF(1, ITEM_WEAPON_PRIMORSEC,                                       INFO_ITEM_WEAPON_PRIMORSEC,                                     CENTER_ITEM_WEAPON_PRIMORSEC) \
+       MSG_MULTI_NOTIF(1, ITEM_WEAPON_UNAVAILABLE,                                     INFO_ITEM_WEAPON_UNAVAILABLE,                           CENTER_ITEM_WEAPON_UNAVAILABLE) \
+       MSG_MULTI_NOTIF(1, WEAPON_THINKING_WITH_PORTALS,                        INFO_WEAPON_THINKING_WITH_PORTALS,                      CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_CRYLINK_SUICIDE,                                      INFO_WEAPON_CRYLINK_SUICIDE,                            CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_CRYLINK_MURDER,                                       INFO_WEAPON_CRYLINK_MURDER,                             NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_ELECTRO_SUICIDE_ORBS,                         INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                       CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_ELECTRO_SUICIDE_BOLT,                         INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                       CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_ELECTRO_MURDER_BOLT,                          INFO_WEAPON_ELECTRO_MURDER_BOLT,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_ELECTRO_MURDER_ORBS,                          INFO_WEAPON_ELECTRO_MURDER_ORBS,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_ELECTRO_MURDER_COMBO,                         INFO_WEAPON_ELECTRO_MURDER_COMBO,                       NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_FIREBALL_SUICIDE_FIREMINE,            INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,          CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_FIREBALL_SUICIDE_BLAST,                       INFO_WEAPON_FIREBALL_SUICIDE_BLAST,             CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_FIREBALL_MURDER_FIREMINE,             INFO_WEAPON_FIREBALL_MURDER_FIREMINE,           NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_FIREBALL_MURDER_BLAST,                        INFO_WEAPON_FIREBALL_MURDER_BLAST,                      NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_MORTAR_SUICIDE_EXPLODE,                       INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,             CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_MORTAR_SUICIDE_BOUNCE,                        INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                      CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_MORTAR_MURDER_EXPLODE,                        INFO_WEAPON_MORTAR_MURDER_EXPLODE,                      NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_MORTAR_MURDER_BOUNCE,                         INFO_WEAPON_MORTAR_MURDER_BOUNCE,                       NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_HAGAR_SUICIDE,                                        INFO_WEAPON_HAGAR_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_HAGAR_MURDER_BURST,                           INFO_WEAPON_HAGAR_MURDER_BURST,                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_HAGAR_MURDER_SPRAY,                           INFO_WEAPON_HAGAR_MURDER_SPRAY,                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_HLAC_SUICIDE,                                         INFO_WEAPON_HLAC_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_HLAC_MURDER,                                          INFO_WEAPON_HLAC_MURDER,                                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_HOOK_MURDER,                                          INFO_WEAPON_HOOK_MURDER,                                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_LASER_SUICIDE,                                        INFO_WEAPON_LASER_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_LASER_MURDER,                                         INFO_WEAPON_LASER_MURDER,                                       NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_SUICIDE,                            INFO_WEAPON_MINELAYER_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_MURDER,                             INFO_WEAPON_MINELAYER_MURDER,                           NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_MINSTANEX_MURDER,                             INFO_WEAPON_MINSTANEX_MURDER,                           NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_NEX_MURDER,                                           INFO_WEAPON_NEX_MURDER,                                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL_PIERCING,           INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,         NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER_HAIL,                            INFO_WEAPON_RIFLE_MURDER_HAIL,                          NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER_PIERCING,                        INFO_WEAPON_RIFLE_MURDER_PIERCING,                      NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER,                                         INFO_WEAPON_RIFLE_MURDER,                                       NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_RIFLE_MURDER_HEADSHOT,                        INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                      NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_ROCKETLAUNCHER_SUICIDE,                       INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,             CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,         INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,       NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,         INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,       NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_SEEKER_SUICIDE,                                       INFO_WEAPON_SEEKER_SUICIDE,                             CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_SEEKER_MURDER_TAG,                            INFO_WEAPON_SEEKER_MURDER_TAG,                          NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_SEEKER_MURDER_SPRAY,                          INFO_WEAPON_SEEKER_MURDER_SPRAY,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_SHOTGUN_MURDER_SLAP,                          INFO_WEAPON_SHOTGUN_MURDER_SLAP,                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_SHOTGUN_MURDER,                                       INFO_WEAPON_SHOTGUN_MURDER,                             NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_TUBA_SUICIDE,                                         INFO_WEAPON_TUBA_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_TUBA_MURDER,                                          INFO_WEAPON_TUBA_MURDER,                                        NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_ACCORDEON_SUICIDE,                            INFO_WEAPON_ACCORDEON_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_ACCORDEON_MURDER,                             INFO_WEAPON_ACCORDEON_MURDER,                           NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_KLEINBOTTLE_SUICIDE,                          INFO_WEAPON_KLEINBOTTLE_SUICIDE,                        CENTER_DEATH_SELF_GENERIC) \
+       MSG_MULTI_NOTIF(1, WEAPON_KLEINBOTTLE_MURDER,                           INFO_WEAPON_KLEINBOTTLE_MURDER,                         NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_UZI_MURDER_SNIPE,                             INFO_WEAPON_UZI_MURDER_SNIPE,                           NO_MSG) \
+       MSG_MULTI_NOTIF(1, WEAPON_UZI_MURDER_SPRAY,                             INFO_WEAPON_UZI_MURDER_SPRAY,                           NO_MSG) 
 
 
 // ===========================
@@ -540,27 +613,29 @@ var float autocvar_notification_show_location = FALSE;
 var string autocvar_notification_show_location_string = ""; //_(" at the %s");
 var float autocvar_notification_show_sprees = TRUE;
 var float autocvar_notification_show_sprees_info = 3; // 0 = off, 1 = target only, 2 = attacker only, 3 = target and attacker
-var float autocvar_notification_show_sprees_info_newline = FALSE;
+var float autocvar_notification_show_sprees_info_newline = TRUE;
 var float autocvar_notification_show_sprees_info_specialonly = TRUE;
 var float autocvar_notification_errors_are_fatal = TRUE;
+var float autocvar_notification_lifetime_runtime = 0.5;
+var float autocvar_notification_lifetime_mapload = 10;
 
 #ifdef SVQC
 .float FRAG_VERBOSE;
 void Notification_GetCvars(void);
 #else
-var float autocvar_notification_allow_chatboxprint = 1; // 0 = no, 1 = yes, 2 = forced on for all MSG_INFO notifs
+var float autocvar_notification_item_centerprinttime = 1.5;
+var float autocvar_notification_allow_chatboxprint = 1; // 0 = no, 1 = yes, 2 = forced on for all MSG_INFO notifs // todo set back to 1 after testing
 var float autocvar_notification_show_sprees_center = TRUE;
 var float autocvar_notification_show_sprees_center_specialonly = TRUE;
 var float autocvar_notification_frag_verbose = TRUE;
 #endif
 
-
 // ============================
 //  Notification Argument List
-// ============================ TODO UPDATE THIS
+// ============================
 /*
  These arguments get replaced with the Local_Notification_sprintf
- and Local_Notification_HUD_Notify_Push functions to supply data
+ and other such functions found in notifications.qc to supply data
  from networked notifications to their usage in sprintf... It
  allows for more dynamic data to be inferred by the local
  notification parser, so that the server does not have to network
@@ -575,9 +650,16 @@ var float autocvar_notification_frag_verbose = TRUE;
  
  Argument descriptions:
     s1-s4: string arguments to be literally swapped into sprintf
+    s2loc: s2 string of locations of deaths or other events
+    s3loc: s3 string of locations of deaths or other events
     f1-f4: float arguments expanded into strings to be swapped into sprintf
     f1p2dec: f1 float to string with 2 decimal places
     f2p2dec: f2 float to string with 2 decimal places
+    f2primsec: f2 float primary or secondary selection for weapons
+    f3primsec: f3 float primary or secondary selection for weapons
+    f1secs: count_seconds of f1
+    f1ord: count_ordinal of f1
+    f1time: process_time of f1
     pass_key: find the keybind for "passing" or "dropping" in CTF game mode
     frag_ping: show the ping of a player
     frag_stats: show health/armor/ping of a player
@@ -586,8 +668,13 @@ var float autocvar_notification_frag_verbose = TRUE;
     spree_inf: info notif for kill spree/how many kills they have
     spree_end: placed at the end of murder messages to show ending of sprees
     spree_lost: placed at the end of suicide messages to show losing of sprees
+    item_wepname: return full name of a weapon from weaponid
+    item_wepammo: ammo display for weapon from string
+    item_centime: amount of time to display weapon message in centerprint
     death_team: show the full name of the team a player is switching from
-    weapon_name: return the full name of a weapon from a weaponid
+    kh_teams: show which teams still need players in keyhunt centerprint
+    race_time: mmssss of f2
+    race_diff: show time difference between f2 and f3
 */
 
 #define NOTIF_MAX_ARGS 7
@@ -601,25 +688,33 @@ string arg_slot[NOTIF_MAX_ARGS];
 #define ARG_CS_SV 3 // enabled on CSQC and SVQC
 #define ARG_CS 4 // unique result to CSQC
 #define ARG_SV 5 // unique result to SVQC
+#define ARG_DC 6 // unique result to durcnt/centerprint
 
 // todo possible idea.... declare how many floats/strings each arg needs, and then dynamically increment the input
-// this way, we don't need to have duplicates like i.e. s2loc and s3loc
+// this way, we don't need to have duplicates like i.e. s2loc and s3loc?
 
 #define NOTIF_ARGUMENT_LIST \
        ARG_CASE(ARG_CS_SV_HA,          "s1",                           s1) \
        ARG_CASE(ARG_CS_SV_HA,          "s2",                           s2) \
        ARG_CASE(ARG_CS_SV_HA,          "s3",                           s3) \
        ARG_CASE(ARG_CS_SV_HA,          "s4",                           s4) \
-       ARG_CASE(ARG_CS_SV,             "s2loc",                        (autocvar_notification_show_location ? sprintf( ( ((tmp_s = autocvar_notification_show_location_string) != "") ? tmp_s : _(" (near %s)") ), s2) : "")) \
-       ARG_CASE(ARG_CS_SV,             "s3loc",                        (autocvar_notification_show_location ? sprintf( ( ((tmp_s = autocvar_notification_show_location_string) != "") ? tmp_s : _(" (near %s)") ), s3) : "")) \
+       ARG_CASE(ARG_CS_SV,             "s2loc",                        (autocvar_notification_show_location ? sprintf(( ((tmp_s = autocvar_notification_show_location_string) != "") ? tmp_s : _(" (near %s)") ), s2) : "")) \
+       ARG_CASE(ARG_CS_SV,             "s3loc",                        (autocvar_notification_show_location ? sprintf(( ((tmp_s = autocvar_notification_show_location_string) != "") ? tmp_s : _(" (near %s)") ), s3) : "")) \
        ARG_CASE(ARG_CS_SV_DC,          "f1",                           ftos(f1)) \
        ARG_CASE(ARG_CS_SV_DC,          "f2",                           ftos(f2)) \
        ARG_CASE(ARG_CS_SV,             "f3",                           ftos(f3)) \
        ARG_CASE(ARG_CS_SV,             "f4",                           ftos(f4)) \
        ARG_CASE(ARG_CS_SV,             "f1p2dec",                      ftos_decimals(f1/100, 2)) \
        ARG_CASE(ARG_CS_SV,             "f2p2dec",                      ftos_decimals(f2/100, 2)) \
+       ARG_CASE(ARG_CS,                        "f2primsec",            (f2 ? _("secondary") : _("primary"))) \
+       ARG_CASE(ARG_CS,                        "f3primsec",            (f3 ? _("secondary") : _("primary"))) \
        ARG_CASE(ARG_CS,                        "f1secs",                       count_seconds(f1)) \
        ARG_CASE(ARG_CS_SV,                     "f1ord",                        count_ordinal(f1)) \
+       ARG_CASE(ARG_CS,                        "f1time",                       process_time(2, f1)) \
+       ARG_CASE(ARG_CS_SV,                     "f1race_time",          mmssss(f1)) \
+       ARG_CASE(ARG_CS_SV,                     "f2race_time",          mmssss(f2)) \
+       ARG_CASE(ARG_CS_SV,                     "race_col",                     CCR(((f1 == 1) ? "^F1" : "^F2"))) \
+       ARG_CASE(ARG_CS_SV,             "race_diff",            ((f2 > f3) ? sprintf(CCR("^1[+%s]"), mmssss(f2 - f3)) : sprintf(CCR("^2[-%s]"), mmssss(f3 - f2)))) \
        ARG_CASE(ARG_CS,                        "pass_key",             ((((tmp_s = getcommandkey("pass", "+use")) != "pass") && !(strstrofs(tmp_s, "not bound", 0) >= 0)) ? sprintf(CCR(_(" ^F1(Press %s)")), tmp_s) : "")) \
        ARG_CASE(ARG_CS,                        "frag_ping",            ((f2 != NO_MSG) ? sprintf(CCR(_("\n(Ping ^2%d^BG)")), f2) : "")) \
        ARG_CASE(ARG_CS,                        "frag_stats",           sprintf(CCR(_("\n(Health ^1%d^BG / Armor ^2%d^BG)%s")), f2, f3, ((f4 != NO_MSG) ? sprintf(CCR(_(" (Ping ^2%d^BG)")), f4) : ""))) \
@@ -628,11 +723,12 @@ string arg_slot[NOTIF_MAX_ARGS];
        ARG_CASE(ARG_CS_SV,             "spree_inf",            (autocvar_notification_show_sprees ? notif_arg_spree_inf(1, input, s2, f2) : "")) \
        ARG_CASE(ARG_CS_SV,             "spree_end",            (autocvar_notification_show_sprees ? notif_arg_spree_inf(-1, "", "", f1) : "")) \
        ARG_CASE(ARG_CS_SV,             "spree_lost",           (autocvar_notification_show_sprees ? notif_arg_spree_inf(-2, "", "", f1) : "")) \
-       ARG_CASE(ARG_CS_SV,             "weapon_name",          ftos(f1)) \
+       ARG_CASE(ARG_CS_SV,             "item_wepname",         W_Name(f1)) \
+       ARG_CASE(ARG_CS_SV,                     "item_wepammo",         (s1 != "" ? sprintf(_(" with %s"), s1) : "")) \
+       ARG_CASE(ARG_DC,                        "item_centime",         ftos(autocvar_notification_item_centerprinttime)) \
        ARG_CASE(ARG_SV,                        "death_team",           Team_ColoredFullName(f1)) \
        ARG_CASE(ARG_CS,                        "death_team",           Team_ColoredFullName(f1 - 1)) \
-       ARG_CASE(ARG_CS_SV,                     "race_time",            mmssss(f2)) \
-       ARG_CASE(ARG_CS_SV,             "race_diff",            ((f2 > f3) ? sprintf(CCR("^1[+%s]"), mmssss(f2 - f3)) : sprintf(CCR("^2[-%s]"), mmssss(f3 - f2))))
+       ARG_CASE(ARG_CS,                        "kh_teams",             notif_arg_kh_teams(f1, f2, f3, f4))
 
 #define NOTIF_HIT_MAX(count,funcname) if(sel_num == count) { backtrace(sprintf("%s: Hit maximum arguments!\n", funcname)); break; }
 #define NOTIF_HIT_UNKNOWN(token,funcname) { backtrace(sprintf("%s: Hit unknown token in selected string! '%s'\n", funcname, selected)); break; }
@@ -647,6 +743,32 @@ string arg_slot[NOTIF_MAX_ARGS];
        SPREE_ITEM(30, 30, _("ARMAGEDDON! "), _("%s^K1 unleashes ARMAGEDDON! %s^BG"), _("%s^K1 made THIRTY SCORES IN A ROW! %s^BG"))
 
 #ifdef CSQC
+string notif_arg_kh_teams(float f1, float f2, float f3, float f4)
+{
+       return sprintf("%s%s%s%s",
+               (f1 ?
+                       sprintf("%s%s", Team_ColoredFullName(f1 - 1), ((f2 + f3 + f4) ? ", " : ""))
+                       :
+                       ""
+               ),
+               (f2 ?
+                       sprintf("%s%s", Team_ColoredFullName(f2 - 1), ((f3 + f4) ? ", " : ""))
+                       :
+                       ""
+               ),
+               (f3 ?
+                       sprintf("%s%s", Team_ColoredFullName(f3 - 1), (f4 ? ", " : ""))
+                       :
+                       ""
+               ),
+               (f4 ?
+                       Team_ColoredFullName(f4 - 1)
+                       :
+                       ""
+               )
+       );
+}
+
 string notif_arg_spree_cen(float spree)
 {
        // 0 = off, 1 = target (but only for first victim) and attacker
@@ -803,14 +925,12 @@ float notif_global_error;
 // notification entities
 entity msg_info_notifs[NOTIF_MAX];
 entity msg_center_notifs[NOTIF_MAX];
-entity msg_weapon_notifs[NOTIF_MAX];
-entity msg_death_notifs[NOTIF_MAX];
+entity msg_multi_notifs[NOTIF_MAX];
 
 // notification counts
 float NOTIF_INFO_COUNT;
 float NOTIF_CENTER_COUNT;
-float NOTIF_WEAPON_COUNT;
-float NOTIF_DEATH_COUNT;
+float NOTIF_MULTI_COUNT;
 float NOTIF_CPID_COUNT;
 
 // notification entity values
@@ -837,219 +957,6 @@ float NOTIF_CPID_COUNT;
 .string nent_strings[4];
 .float nent_floats[4];
 
-string Process_Notif_Line(float check_newline, float chat, string input, string notiftype, string notifname, string stringtype)
-{
-       if(check_newline)
-       {
-               #ifdef CSQC
-               if((chat && autocvar_notification_allow_chatboxprint)
-                       || (autocvar_notification_allow_chatboxprint == 2))
-               {
-                       // pass 1: add ETX char at beginning of line
-                       input = strcat("\{3}", input);
-
-                       // pass 2: add ETX char at end of each new line (so that messages with multiple lines are put through chatbox too)
-                       input = strreplace("\n", "\n\{3}", input);
-
-                       // pass 3: strip trailing ETX char
-                       if(substring(input, (strlen(input) - 1), 1) == "\{3}")
-                               { input = substring(input, 0, (strlen(input) - 1)); }
-               }
-               #endif
-               if(substring(input, (strlen(input) - 1), 1) != "\n")
-               {
-                       print(sprintf("^1MISSING/BROKEN NEW LINE AT END OF NOTIFICATION: ^7net_type = MSG_%s, net_name = %s, string = %s.\n", notiftype, notifname, stringtype));
-                       notif_error = TRUE;
-                       return strcat(input, "\n");
-               }
-       }
-       return input;
-}
-
-string Process_Notif_Args(float arg_type, string args, string notiftype, string notifname)
-{
-       string selected, remaining = args;
-       float sel_num = 0;
-
-       for(;(remaining != "");)
-       {
-               selected = car(remaining); remaining = cdr(remaining);
-
-               switch(arg_type)
-               {
-                       case 1: // normal args
-                       {
-                               if(sel_num == NOTIF_MAX_ARGS)
-                               {
-                                       print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max args = %d.\n",
-                                               notiftype, notifname, NOTIF_MAX_ARGS));
-                                       notif_error = TRUE;
-                                       break;
-                               }
-
-                               switch(strtolower(selected))
-                               {
-                                       #define ARG_CASE(prog,selected,result) case selected: { ++sel_num; break; }
-                                       NOTIF_ARGUMENT_LIST
-                                       #undef ARG_CASE
-                                       default:
-                                       {
-                                               print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, args arg = '%s'.\n",
-                                                       notiftype, notifname, selected));
-                                               notif_error = TRUE;
-                                               break;
-                                       }
-                               }
-                               break;
-                       }
-                       case 2: // hudargs
-                       {
-                               if(sel_num == NOTIF_MAX_HUDARGS)
-                               {
-                                       print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max hudargs = %d.\n",
-                                               notiftype, notifname, NOTIF_MAX_HUDARGS));
-                                       notif_error = TRUE;
-                                       break;
-                               }
-
-                               switch(strtolower(selected))
-                               {
-                                       #define ARG_CASE(prog,selected,result) \
-                                               #if (prog == ARG_CS_SV_HA) \
-                                                       case selected: { ++sel_num; break; } \
-                                               #endif
-                                       NOTIF_ARGUMENT_LIST
-                                       #undef ARG_CASE
-                                       default:
-                                       {
-                                               print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, hudargs arg = '%s'.\n",
-                                                       notiftype, notifname, selected));
-                                               notif_error = TRUE;
-                                               break;
-                                       }
-                               }
-                               break;
-                       }
-                       case 3: // durcnt 
-                       {
-                               if(sel_num == NOTIF_MAX_DURCNT)
-                               {
-                                       print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max durcnt = %d.\n",
-                                               notiftype, notifname, NOTIF_MAX_DURCNT));
-                                       notif_error = TRUE;
-                                       break;
-                               }
-
-                               switch(strtolower(selected))
-                               {
-                                       #define ARG_CASE(prog,selected,result) \
-                                               #if (prog == ARG_CS_SV_DC) \
-                                                       case selected: { ++sel_num; break; } \
-                                               #endif
-                                       NOTIF_ARGUMENT_LIST
-                                       #undef ARG_CASE
-                                       default:
-                                       {
-                                               if(ftos(stof(selected)) != "") { ++sel_num; }
-                                               else
-                                               {
-                                                       print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, durcnt arg = '%s'.\n",
-                                                               notiftype, notifname, selected));
-                                                       notif_error = TRUE;
-                                               }
-                                               break;
-                                       }
-                               }
-                               break;
-                       }
-               }
-       }
-       return args;
-}
-
-#define CREATE_NOTIF_ENTITY(default,type,name,infoname,centername,strnum,flnum,args,hudargs,icon,cpid,durcnt,normal,gentle,check_newline,subcalls) \
-{ \
-       notif_error = FALSE; \
-       \
-       /* global entity setup */ \
-       entity notif = spawn(); \
-       msg_##type##_notifs[name - 1] = notif; \
-       notif.classname = "msg_#type#_notification"; \
-       notif.nent_default = default; \
-       notif.nent_name = strzone(#name); \
-       notif.nent_id = name; \
-       notif.nent_enabled = (1 <= autocvar_notification_##name); \
-       \
-       /* notification specific settings */ \
-       #if subcalls /* MSG_DEATH and MSG_WEAPON */ \
-               #if (infoname == NO_MSG) && (centername == NO_MSG) \
-                       print(sprintf("^1NOTIFICATION WITH NO SUBCALLS: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); \
-                       notif_error = TRUE; \
-               #else \
-                       float infoname_stringcount = 0, infoname_floatcount = 0, centername_stringcount = 0, centername_floatcount = 0; \
-                       #if (infoname != NO_MSG) \
-                               notif.nent_msginfo = msg_info_notifs[infoname - 1]; \
-                               infoname_stringcount = notif.nent_msginfo.nent_stringcount; \
-                               infoname_floatcount = notif.nent_msginfo.nent_floatcount; \
-                       #endif \
-                       #if (centername != NO_MSG) \
-                               notif.nent_msgcenter = msg_center_notifs[centername - 1]; \
-                               centername_stringcount = notif.nent_msgcenter.nent_stringcount; \
-                               centername_floatcount = notif.nent_msgcenter.nent_floatcount; \
-                       #endif \
-                       /* set the requirements of THIS notification to the total requirements of its subcalls */ \
-                       notif.nent_stringcount = max(infoname_stringcount, centername_stringcount); \
-                       notif.nent_floatcount = max(infoname_floatcount, centername_floatcount); \
-               #endif \
-       #else /* MSG_INFO and MSG_CENTER */ \
-               float nent_chat = (autocvar_notification_##name > 1); \
-               \
-               notif.nent_stringcount = strnum; \
-               notif.nent_floatcount = flnum; \
-               if(strnum + flnum) \
-               { \
-                       if(args != "") { notif.nent_args = strzone(Process_Notif_Args(1, args, strtoupper(#type), #name)); } \
-                       else if((hudargs == "") && (durcnt =="")) { print(sprintf("^1NOTIFICATION HAS ARG COUNTS BUT NO ARGS OR HUDARGS OR DURCNT: ^7net_type = MSG_%s, net_name = %s, strnum = %d, flnum = %d\n", strtoupper(#type), #name, strnum, flnum)); notif_error = TRUE; } \
-               } \
-               else if(args != "") { notif.nent_args = strzone(Process_Notif_Args(1, args, strtoupper(#type), #name)); } \
-               \
-               /* MSG_INFO only */ \
-               if(hudargs != "") \
-               { \
-                       notif.nent_hudargs = strzone(Process_Notif_Args(2, hudargs, strtoupper(#type), #name)); \
-                       if(icon != "") { notif.nent_icon = strzone(icon); } \
-                       else { print(sprintf("^1NOTIFICATION HAS HUDARGS BUT NO ICON: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
-               } \
-               else if(icon != "") { print(sprintf("^1NOTIFICATION HAS ICON BUT NO HUDARGS: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
-               \
-               /* MSG_CENTER only */ \
-               if(durcnt != "") \
-               { \
-                       notif.nent_durcnt = strzone(Process_Notif_Args(3, durcnt, strtoupper(#type), #name)); \
-                       if(cpid != NO_MSG) { notif.nent_cpid = cpid; } \
-                       else { print(sprintf("^1NOTIFICATION HAS DURCNT BUT NO CPID: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
-               } \
-               else if(cpid != NO_MSG) { notif.nent_cpid = cpid; } \
-               \
-               /* string setup */ \
-               /* select gentle/normal string and bake color codes in on init, this way it does not need to be re-processed at run time */ \
-               if(GENTLE) \
-               { \
-                       if(gentle != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, gentle, strtoupper(#type), #name, "GENTLE"))); } \
-                       else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, normal, strtoupper(#type), #name, "NORMAL"))); } \
-               } \
-               else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, normal, strtoupper(#type), #name, "NORMAL"))); } \
-               if(notif.nent_string == "") { print(sprintf("^1EMPTY NOTIFICATION: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
-       #endif \
-       \
-       /* now check to see if any errors happened */ \
-       if(notif_error) \
-       { \
-               notif.nent_enabled = FALSE; /* disable the notification so it can't cause trouble */ \
-               notif_global_error = TRUE; /* throw the red flag that an error happened on init */ \
-       } \
-}
-
 #define MSG_INFO_NOTIF(default,name,strnum,flnum,args,hudargs,icon,normal,gentle) \
        NOTIF_ADD_AUTOCVAR(name, default) \
        float name; \
@@ -1057,23 +964,25 @@ string Process_Notif_Args(float arg_type, string args, string notiftype, string
        { \
                SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_INFO_COUNT) \
                CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_INFO_COUNT, "notifications") \
-               CREATE_NOTIF_ENTITY( \
-                       default,        /* default */ \
-                       info,           /* type */ \
-                       name,           /* name */ \
-                       NO_MSG,         /* infoname */ \
-                       NO_MSG,         /* centername */ \
-                       strnum,         /* strnum */ \
-                       flnum,          /* flnum */ \
-                       args,           /* args */ \
-                       hudargs,        /* hudargs */ \
-                       icon,           /* icon */ \
-                       NO_MSG,         /* cpid */ \
-                       "",             /* durcnt */ \
-                       normal,         /* normal */ \
-                       gentle,         /* gentle */ \
-                       1,                      /* check_newline */ \
-                       0)                      /* subcalls */ \
+               Create_Notification_Entity( \
+                       default,                                                /* var_default */ \
+                       autocvar_notification_##name,   /* var_cvar */ \
+                       MSG_INFO,                                               /* typeid */ \
+                       name,                                                   /* nameid */ \
+                       strtoupper(#name),                              /* namestring */ \
+                       NO_MSG,                                                 /* infoname */ \
+                       NO_MSG,                                                 /* centername */ \
+                       strnum,                                                 /* strnum */ \
+                       flnum,                                                  /* flnum */ \
+                       args,                                                   /* args */ \
+                       hudargs,                                                /* hudargs */ \
+                       icon,                                                   /* icon */ \
+                       NO_MSG,                                                 /* cpid */ \
+                       "",                                                     /* durcnt */ \
+                       normal,                                                 /* normal */ \
+                       gentle,                                                 /* gentle */ \
+                       TRUE,                                                   /* msg_is_info */ \
+                       FALSE);                                                 /* msg_is_multi */ \
        } \
        ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 
@@ -1086,83 +995,68 @@ string Process_Notif_Args(float arg_type, string args, string notiftype, string
                SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_CENTER_COUNT) \
                SET_FIELD_COUNT(cpid, NOTIF_FIRST, NOTIF_CPID_COUNT) \
                CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_CENTER_COUNT, "notifications") \
-               CREATE_NOTIF_ENTITY( \
-                       default,        /* default */ \
-                       center,         /* type */ \
-                       name,           /* name */ \
-                       NO_MSG,         /* infoname */ \
-                       NO_MSG,         /* centername */ \
-                       strnum,         /* strnum */ \
-                       flnum,          /* flnum */ \
-                       args,           /* args */ \
-                       "",             /* hudargs */ \
-                       "",             /* icon */ \
-                       cpid,           /* cpid */ \
-                       durcnt,         /* durcnt */ \
-                       normal,         /* normal */ \
-                       gentle,         /* gentle */ \
-                       0,                      /* check_newline */ \
-                       0)                      /* subcalls */ \
-       } \
-       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
-
-#define MSG_WEAPON_NOTIF(default,name,infoname,centername) \
-       NOTIF_ADD_AUTOCVAR(name, default) \
-       float name; \
-       void RegisterNotification_##name() \
-       { \
-               SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_WEAPON_COUNT) \
-               CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_WEAPON_COUNT, "notifications") \
-               CREATE_NOTIF_ENTITY( \
-                       default,        /* default */ \
-                       weapon,         /* type */ \
-                       name,           /* name */ \
-                       infoname,       /* infoname */ \
-                       centername, /* centername */ \
-                       NO_MSG,         /* strnum */ \
-                       NO_MSG,         /* flnum */ \
-                       "",             /* args */ \
-                       "",             /* hudargs */ \
-                       "",             /* icon */ \
-                       NO_MSG,         /* cpid */ \
-                       "",             /* durcnt */ \
-                       "",             /* normal */ \
-                       "",             /* gentle */ \
-                       0,                      /* check_newline */ \
-                       1)                      /* subcalls */ \
+               Create_Notification_Entity( \
+                       default,                                                /* var_default */ \
+                       autocvar_notification_##name,   /* var_cvar */ \
+                       MSG_CENTER,                                     /* typeid */ \
+                       name,                                                   /* nameid */ \
+                       strtoupper(#name),                              /* namestring */ \
+                       NO_MSG,                                                 /* infoname */ \
+                       NO_MSG,                                                 /* centername */ \
+                       strnum,                                                 /* strnum */ \
+                       flnum,                                                  /* flnum */ \
+                       args,                                                   /* args */ \
+                       "",                                                     /* hudargs */ \
+                       "",                                                     /* icon */ \
+                       cpid,                                                   /* cpid */ \
+                       durcnt,                                                 /* durcnt */ \
+                       normal,                                                 /* normal */ \
+                       gentle,                                                 /* gentle */ \
+                       FALSE,                                                  /* msg_is_info */ \
+                       FALSE);                                                 /* msg_is_multi */ \
        } \
        ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 
-#define MSG_DEATH_NOTIF(default,name,infoname,centername) \
+#define MSG_MULTI_NOTIF(default,name,infoname,centername) \
        NOTIF_ADD_AUTOCVAR(name, default) \
        float name; \
        void RegisterNotification_##name() \
        { \
-               SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_DEATH_COUNT) \
-               CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_DEATH_COUNT, "notifications") \
-               CREATE_NOTIF_ENTITY( \
-                       default,        /* default */ \
-                       death,          /* type */ \
-                       name,           /* name */ \
-                       infoname,       /* infoname */ \
-                       centername, /* centername */ \
-                       NO_MSG,         /* strnum */ \
-                       NO_MSG,         /* flnum */ \
-                       "",             /* args */ \
-                       "",             /* hudargs */ \
-                       "",             /* icon */ \
-                       NO_MSG,         /* cpid */ \
-                       "",             /* durcnt */ \
-                       "",             /* normal */ \
-                       "",             /* gentle */ \
-                       0,                      /* check_newline */ \
-                       1)                      /* subcalls */ \
+               SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_MULTI_COUNT) \
+               CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_MULTI_COUNT, "notifications") \
+               Create_Notification_Entity( \
+                       default,                                                /* var_default */ \
+                       autocvar_notification_##name,   /* var_cvar */ \
+                       MSG_MULTI,                                              /* typeid */ \
+                       name,                                                   /* nameid */ \
+                       strtoupper(#name),                              /* namestring */ \
+                       infoname,                                               /* infoname */ \
+                       centername,                                     /* centername */ \
+                       NO_MSG,                                                 /* strnum */ \
+                       NO_MSG,                                                 /* flnum */ \
+                       "",                                                     /* args */ \
+                       "",                                                     /* hudargs */ \
+                       "",                                                     /* icon */ \
+                       NO_MSG,                                                 /* cpid */ \
+                       "",                                                     /* durcnt */ \
+                       "",                                                     /* normal */ \
+                       "",                                                     /* gentle */ \
+                       FALSE,                                                  /* msg_is_info */ \
+                       TRUE);                                                  /* msg_is_multi */ \
        } \
        ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 
 void RegisterNotifications_First()
 {
        notif_global_error = FALSE;
+
+       #ifdef SVQC
+       #define dedi (server_is_dedicated ? "a dedicated " : "")
+       #else
+       #define dedi ""
+       #endif
+       
+       print(sprintf("Beginning notification initialization on %s%s program...\n", dedi, PROGNAME));
        
        // maybe do another implementation of this with checksums? for now, we don't need versioning
        /*if(autocvar_notification_version != NOTIF_VERSION)
@@ -1175,29 +1069,31 @@ void RegisterNotifications_First()
                        notif_global_error = TRUE;
 
                print(sprintf("^1NOTIFICATION VERSION MISMATCH: ^7program = %s, config = %d, code = %d.\n",
-                       "foobar", autocvar_notification_version, NOTIF_VERSION));
+                       PROGNAME, autocvar_notification_version, NOTIF_VERSION));
        }*/
 }
 
 void RegisterNotifications_Done()
 {
-       if(notif_global_error && autocvar_notification_errors_are_fatal)
+       if(notif_global_error)
        {
-               // shit happened... stop the loading of the program now
-               error("Notification initialization failed!");
+               // shit happened... stop the loading of the program now if this is unacceptable
+               if(autocvar_notification_errors_are_fatal)
+                       error("Notification initialization failed! Read above and fix the errors!\n");
+               else
+                       print("Notification initialization failed! Read above and fix the errors!\n");
        }
+       else { print("Notification initialization successful!\n"); }
 }
 
 // NOW we actually activate the declarations
 ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_First)
 MSG_INFO_NOTIFICATIONS
 MSG_CENTER_NOTIFICATIONS
-MSG_WEAPON_NOTIFICATIONS
-MSG_DEATH_NOTIFICATIONS
+MSG_MULTI_NOTIFICATIONS
 ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_Done)
 #undef MSG_INFO_NOTIF
 #undef MSG_CENTER_NOTIF
-#undef MSG_WEAPON_NOTIF
-#undef MSG_DEATH_NOTIF
+#undef MSG_MULTI_NOTIF
 
 #undef NOTIF_ADD_AUTOCVAR