]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/notifications.qh
More work on entity notifications
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / notifications.qh
index b0d75fa8f4d88e9c0bc95b38e73ecb4efef9b815..a67f9af151535479f5be8d6cfc5b1aaa2a5dfbf9 100644 (file)
@@ -1,6 +1,6 @@
 // ================================================
 //  Unified notification system, written by Samual
-//  Last updated: December, 2012
+//  Last updated: February, 2013
 // ================================================
 
 // main types/groups of notifications
@@ -9,17 +9,7 @@
 #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 
 
-string TCR(string input, string teamcolor, string teamtext); // team code replace
-string CCR(string input); // color code replace, place inside of sprintf and parse the string
-
-void Dump_Notifications(float fh, float alsoprint);
-
 #ifndef MENUQC // SERVER AND CLIENT ONLY
-// Since this code uses macro processors to list notifications,
-// the normal compiler sees these checks as "constant" and throws
-// a warning. We have to get around this by using another function.
-#define NOTIF_MATCH(a,b) if(min(NOTIF_MAX, a) == b)
-
 // notification system nullified arguments
 #define NO_STR_ARG ""
 #define NO_FL_ARG -12345
@@ -27,8 +17,12 @@ void Dump_Notifications(float fh, float alsoprint);
 
 // field identifiers for Get_Field_Value()
 #define F_NAME 1
-#define F_STRNUM 2
-#define F_FLNUM 3
+#define F_INFNAME 2
+#define F_CENNAME 3
+#define F_INFVAL 4
+#define F_CENVAL 5
+#define F_STRNUM 6
+#define F_FLNUM 7
 
 // ping of bots defined for extra frag message notification information
 #define BOT_PING -1
@@ -85,7 +79,7 @@ string got_commandkey;
 #define SPREE_INF (((f1 == 3) || (f1 == 5) || (f1 == 10) || (f1 == 15) || (f1 == 20) || (f1 == 25) || (f1 == 30)) ? sprintf(normal_or_gentle(_("%d frag spree! "), _("%d score spree! ")), f1) : "")
 #define SPREE_END ((f1 >= 3) ? sprintf(normal_or_gentle(_(", ending their %d frag spree"), _(", ending their %d score spree")), f1) : "")
 #define SPREE_LOST ((f1 >= 3) ? sprintf(normal_or_gentle(_(", losing their %d frag spree"), _(", losing their %d score spree")), f1) : "")
-#define DEATH_TEAM Team_ColoredFullName(TEAM_SV_TO_CL(f1))
+#define DEATH_TEAM Team_ColoredFullName(f1 - 1)
 #define WEAPON_NAME f1 // weaponorder[f1].netname
 
 #else // SVQC replacements
@@ -96,11 +90,13 @@ string got_commandkey;
 #define WEAPON_NAME f1 // weaponorder[f1].netname
 #endif
 
-#define ADD_AUTOCVAR(name) var float autocvar_notification_##name = TRUE;
-#define CHECK_AUTOCVAR(name) if(autocvar_notification_##name)
+#define NOTIF_SWITCH_LIST(net_type,net_name,returnv) \
+       switch(net_name) \
+       { \
+               ##net_type##_NOTIFICATIONS \
+               default: { backtrace(strcat("^1NOTIFICATION HAD NO MATCH: ^7net_type = ", VAR_TO_TEXT(net_type), ", net_name = ", ftos(net_name), ".\n")); returnv; } \
+       }
 
-string normal_or_gentle(string normal, string gentle); // select between the normal or the gentle message string based on client (or server) settings
-float notif_checkstring(string input);
 string Get_Field_Value(float field, float net_type, float net_name); // get the actual name of a notification and return it as a string
 void Local_Notification(float net_type, float net_name, ...count);
 void Local_Notification_Without_VarArgs(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);
@@ -117,7 +113,6 @@ string killnotify_icon[KN_MAX_ENTRIES];
 string killnotify_attackers[KN_MAX_ENTRIES];
 string killnotify_victims[KN_MAX_ENTRIES];
 void HUD_Notify_Push(string icon, string attacker, string victim);
-void backtrace(string msg);
 void Read_Notification(float is_new);
 #endif // ifdef CSQC
 
@@ -129,21 +124,7 @@ void Read_Notification(float is_new);
 #define NOTIF_ANY 5
 #define NOTIF_ANY_EXCEPT 6
 
-.float nent_broadcast;
-.entity nent_client;
-.float nent_net_type;
-.float nent_net_name;
-.float nent_stringcount;
-.float nent_floatcount; 
-.string nent_strings[4];
-.float nent_floats[4];
-
-// allow sending of notifications to also pass through to spectators (specifically for centerprints)
-#define WRITESPECTATABLE_MSG_ONE_VARNAME(varname,statement) entity varname; varname = msg_entity; FOR_EACH_REALCLIENT(msg_entity) if(msg_entity == varname || (msg_entity.classname == STR_SPECTATOR && msg_entity.enemy == varname)) statement msg_entity = varname
-#define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement)
-#define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0
-
-#define IFSTR(num) ((num <= (stringcount-1)) ? ...(num, string) : NO_STR_ARG)
+#define IFSTR(num) ((num < stringcount) ? ...(num, string) : NO_STR_ARG)
 #define IFFL(num) ((((stringcount-1) + num) < count) ? ...(((stringcount-1) + num), float) : NO_FL_ARG)
 
 void Send_Notification(float broadcast, entity client, float net_type, float net_name, ...count);
@@ -155,6 +136,9 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
 #endif // ifdef SVQC
 #endif // ifndef MENUQC
 
+// MENU, SERVER, AND CLIENT
+void Dump_Notifications(float fh, float alsoprint);
+
 
 // ====================================
 //  Notifications List and Information
@@ -192,27 +176,31 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
  users to create unique color profiles for their HUD, giving more customization
  options to HUD designers and end users who want such a feature.
 
- Check out the function calls for string CCR(...) and
- string TCR(...) to better understand how these codes work.
+ Check out the definitions in util.qc/util.qh/teams.qh for string CCR(...) and
+ string TCR(...) to better understand how these code replacements work.
 
  Guidlines for notification declaration (please try and follow these):
+  Specific rules:
     -ALWAYS start the string with a color, preferably background.
     -ALWAYS reset a color after a name (this way they don't set it for the whole string).
     -NEVER re-declare an event twice.
     -NEVER add or remove tokens from the format, it SHOULD already work.
     -MSG_INFO messages must ALWAYS end with a new line: \n
+    -MSG_INFO hudargs must always be ATTACKER -> VICTIM
     -MSG_CENTER should NOT end with a new line
+
+ General rules:
     -Be clean and simple with your notification naming,
      nothing too long for the name field... Abbreviations are your friend. :D
     -Keep the spacing as clean as possible... if the arguments are abnormally long,
       it's okay to go out of line a bit... but try and keep it clean still.
     -Sort the notifications in the most appropriate order for their tasks.
-      TODO: ? centerprint IDs are given priority based on their order (first being highest priority going downwards)
     -ARIRE unir frk jvgu lbhe bja zbgure. (gvc sbe zvxrrhfn) -- Don't pay attention to this ^_^
 
  Final note: DO NOT PROVIDE MORE ARGUMENTS THAN NECESSARY FOR THE NOTIFICATION YOU'RE CALLING!
       The system is designed to save as much networking bandwidth as possible,
       so please dynamically control your argument sending to fit *exactly* what is required.
+      If you send a notification with mismatching arguments, Send_Notification() will error.
 */
 
 #define MULTITEAM_INFO(prefix,teams,strnum,flnum,args,hudargs,icon,normal,gentle) \
@@ -225,7 +213,7 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
                MSG_INFO_NOTIF(prefix##PINK, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_4)), TCR(normal, COL_TEAM_4, strtoupper(STR_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(STR_TEAM_4))) \
        #endif
 #define MSG_INFO_NOTIFICATIONS \
-       MSG_INFO_NOTIF(INFO_EMPTY,                                                      0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             "", "") \
+       /*MSG_INFO_NOTIF(INFO_EMPTY,                                            0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             "", "")*/ \
        MULTITEAM_INFO(INFO_CTF_FLAGRETURN_DROPPED_, 2,         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself\n"), "") \
        MULTITEAM_INFO(INFO_CTF_FLAGRETURN_DAMAGED_, 2,         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^BGThe ^TC^TT^BG flag was destroyed and returned to base\n"), "") \
        MULTITEAM_INFO(INFO_CTF_FLAGRETURN_SPEEDRUN_, 2,        0, 1, f1/100, XPD("", ""),                                                      "",                                             _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself\n"), "") \
@@ -239,7 +227,7 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MULTITEAM_INFO(INFO_CTF_CAPTURE_TIME_, 2,                       1, 1, XPD(s1, f1/100), XPD(s1, ""),                                     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%.2f^BG seconds\n"), "") \
        MULTITEAM_INFO(INFO_CTF_CAPTURE_BROKEN_, 2,                     2, 2, XPD(s1, f1/100, s2, f2/100), XPD(s1, ""),         "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%.2f^BG seconds, breaking ^BG%s^BG's previous record of ^F2%.2f^BG seconds\n"), "") \
        MULTITEAM_INFO(INFO_CTF_CAPTURE_UNBROKEN_, 2,           2, 2, XPD(s1, f1/100, s2, f2/100), XPD(s1, ""),         "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%.2f^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%.2f^BG seconds\n"), "") \
-       MULTITEAM_INFO(INFO_DEATH_TEAMKILL_, 4,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s\n"), "") \
+       MULTITEAM_INFO(INFO_DEATH_TEAMKILL_, 4,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s\n"), "") \
        MSG_INFO_NOTIF(INFO_DEATH_FIRSTBLOOD,                           2, 0, s2, XPD("", ""),                                                          "",                                             _("^BG%s^K1 drew first blood\n"), _("^F1%s^K1 got the first score\n")) \
        MSG_INFO_NOTIF(INFO_DEATH_SELF_CUSTOM,                          2, 1, XPD(s1, s2, SPREE_LOST), XPD(s1, ""),                     "notify_void",                  _("^BG%s^K1 %s^K1%s\n"), "") \
        MSG_INFO_NOTIF(INFO_DEATH_SELF_GENERIC,                         1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_selfkill",              _("^BG%s^K1 died%s\n"), "") \
@@ -260,77 +248,131 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MSG_INFO_NOTIF(INFO_DEATH_SELF_SWAMP,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_slime",                 _("^BG%s^K1 is now preserved for centuries to come%s\n"), "") \
        MSG_INFO_NOTIF(INFO_DEATH_SELF_CHEAT,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_selfkill",              _("^BG%s^K1 unfairly eliminated themself%s\n"), "") \
        MSG_INFO_NOTIF(INFO_DEATH_SELF_TOUCHEXPLODE,            1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_death",                 _("^BG%s^K1 died in an accident%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_TELEFRAG,                      2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_telefrag",              _("^BG%s^K1 was telefragged by ^BG%s^K1%s\n"), _("^F1%s^K1 tried to occupy ^BG%s^K1's teleport destination space\n")) \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_FALL,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_fall",                  _("^BG%s^K1 was grounded by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_DROWN,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_water",                 _("^BG%s^K1 was drowned by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_LAVA,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_lava",                  _("^BG%s^K1 was cooked by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_SLIME,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_slime",                 _("^BG%s^K1 was slimed by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_SHOOTING_STAR,         2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_shootingstar",  _("^BG%s^K1 was shot into space by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_SWAMP,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_slime",                 _("^BG%s^K1 was preserved by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VOID,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_void",                  _("^BG%s^K1 was thrown into a world of hurt by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_TOUCHEXPLODE,          2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_death",                 _("^BG%s^K1 died in an accident with ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_CHEAT,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_death",                 _("^BG%s^K1 was unfairly eliminated by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_DEATH_MURDER_FIRE,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s1, s2),                      "notify_death",                 _("^BG%s^K1 was burnt up into a crisp by ^BG%s^K1%s\n"), _("^F1%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s\n")) \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET,                                  1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 ran into a turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_EWHEEL,                   1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was blasted away by an eWheel turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_FLAC,                             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got caught up in the FLAC turret fire%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_MACHINEGUN,               1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was riddled full of holes by a Machinegun turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_WALKER_GUN,               1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got served a lead enrichment by a Walker turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_WALKER_MEELE,             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was impaled by a Walker turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_WALKER_ROCKET,    1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was blasted away by a Walker turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_HELLION,                  1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was blasted away by a Hellion turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_HK,                               1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 could not hide from the Hunter turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_MLRS,                             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_PLASMA,                   1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got served some superheated plasma from a turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_PHASER,                   1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was phased out by a turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_TESLA,                    1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was electrocuted by a Tesla turret%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_TELEFRAG,                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_telefrag",              _("^BG%s^K1 was telefragged by ^BG%s^K1%s\n"), _("^F1%s^K1 tried to occupy ^BG%s^K1's teleport destination space\n")) \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_FALL,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_fall",                  _("^BG%s^K1 was grounded by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_DROWN,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_water",                 _("^BG%s^K1 was drowned by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_LAVA,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_lava",                  _("^BG%s^K1 was cooked by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_SLIME,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_slime",                 _("^BG%s^K1 was slimed by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_SHOOTING_STAR,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_shootingstar",  _("^BG%s^K1 was shot into space by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_SWAMP,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_slime",                 _("^BG%s^K1 was preserved by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VOID,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_void",                  _("^BG%s^K1 was thrown into a world of hurt by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_TOUCHEXPLODE,          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 died in an accident with ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_CHEAT,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was unfairly eliminated by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_FIRE,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was burnt up into a crisp by ^BG%s^K1%s\n"), _("^F1%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s\n")) \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_CRUSH,                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was crushed by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_SPID_MINIGUN,       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got shredded by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_SPID_ROCKET,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was blasted to bits by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_SPID_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_WAKI_GUN,           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was bolted down by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_WAKI_ROCKET,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 couldn't find shelter from ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_WAKI_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_CANNON,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 couldn't resist ^BG%s^K1 purple blobs%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_BOMB,          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was cluster bombed by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_FRAGMENT,      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was cluster bombed by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_GUN,           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_RAY,           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_RAY_HEAL,      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
        MULTITEAM_INFO(INFO_FREEZETAG_ROUND_WIN_, 4,            0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^TC^TT^BG team wins the round, all other teams were frozen\n"), "") \
        MSG_INFO_NOTIF(INFO_FREEZETAG_REVIVE,                           2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("^BG%s^K3 was revived by ^BG%s\n"), "") \
        MSG_INFO_NOTIF(INFO_FREEZETAG_FREEZE,                           2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("^BG%s^K1 was frozen by ^BG%s\n"), "") \
        MSG_INFO_NOTIF(INFO_FREEZETAG_SELF,                                     1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^K1 froze themself\n"), "") \
+       MSG_INFO_NOTIF(INFO_GODMODE_OFF,                                        0, 1, f1, XPD("", ""),                                                          "",                                             _("^BGGodmode saved you %d units of damage, cheater!\n"), "") \
+       MSG_INFO_NOTIF(INFO_JOIN_CONNECT,                                       1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^F3 connected%s\n"), "") \
+       MULTITEAM_INFO(INFO_JOIN_CONNECT_TEAM_, 4,                      1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^F3 connected and joined the ^TC^TT\n"), "") \
+       MSG_INFO_NOTIF(INFO_JOIN_PLAY,                                          1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^F3 is now playing\n"), "") \
        MSG_INFO_NOTIF(INFO_KEEPAWAY_DROPPED,                           1, 0, s1, XPD(s1, ""),                                                          "notify_balldropped",   _("^BG%s^BG has dropped the ball!\n"), "") \
        MSG_INFO_NOTIF(INFO_KEEPAWAY_PICKUP,                            1, 0, s1, XPD(s1, ""),                                                          "notify_ballpickedup",  _("^BG%s^BG has picked up the ball!\n"), "") \
+       MSG_INFO_NOTIF(INFO_LMS_NOLIVES,                                        1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 has no more lives left\n"), "") \
+       MSG_INFO_NOTIF(INFO_LMS_FORFEIT,                                        1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 forfeited\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERDOWN_INVISIBILITY,                     0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Invisibility has worn off\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERDOWN_SHIELD,                           0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Shield has worn off\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERDOWN_SPEED,                            0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Speed has worn off\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERDOWN_STRENGTH,                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Strength has worn off\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERUP_INVISIBILITY,                       0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You are invisible\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERUP_SHIELD,                                     0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Shield surrounds you\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERUP_SPEED,                                      0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You are on speed\n"), "") \
+       MSG_INFO_NOTIF(INFO_POWERUP_STRENGTH,                           0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Strength infuses your weapons with devastating power\n"), "") \
+       MSG_INFO_NOTIF(INFO_QUIT_DISCONNECT,                            1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 disconnected\n"), "") \
+       MSG_INFO_NOTIF(INFO_QUIT_KICK_IDLING,                           1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 was kicked for idling\n"), "") \
+       MSG_INFO_NOTIF(INFO_QUIT_KICK_SPECTATING,                       0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You were kicked from the server because you are a spectator and spectators aren't allowed at the moment.\n"), "") \
+       MSG_INFO_NOTIF(INFO_QUIT_SPECTATE,                                      1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 is now spectating\n"), "") \
        MSG_INFO_NOTIF(INFO_RACE_FAIL,                                          2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newfail",                 "", "") \
        MSG_INFO_NOTIF(INFO_RACE_NEW_RECORD,                            2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newrecordserver", "", "") \
        MSG_INFO_NOTIF(INFO_RACE_NEW_TIME,                                      2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newtime",                 "", "") \
        MSG_INFO_NOTIF(INFO_RACE_NEW_RANK,                                      2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newrankyellow",   "", "") \
        MULTITEAM_INFO(INFO_SCORES_, 4,                                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^TC^TT ^BGteam scores!\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_THINKING_WITH_PORTALS,                       1, 0, s1, XPD(s1, ""),                                          "notify_selfkill", _("^BG%s^K1 is now thinking with portals...\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_CRYLINK_SUICIDE,                             1, 0, s1, XPD(s1, ""),                                          "weaponcrylink", _("^BG%s^K1 felt the strong pull of their Crylink\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_CRYLINK_MURDER,                                      2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponcrylink", _("^BG%s^K1 felt the strong pull of ^BG%s^K1's Crylink\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                        1, 0, s1, XPD(s1, ""),                                          "weaponelectro", _("^BG%s^K1 could not remember where they put their Electro plasma\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                        1, 0, s1, XPD(s1, ""),                                          "weaponelectro", _("^BG%s^K1 played with Electro plasma\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_BOLT,                         2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponelectro", _("^BG%s^K1 was blasted by ^BG%s^K1's Electro bolt\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_ORBS,                         2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponelectro", _("^BG%s^K1 got too close to ^BG%s^K1's Electro plasma\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_COMBO,                        2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponelectro", _("^BG%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,           1, 0, s1, XPD(s1, ""),                                          "weaponfireball", _("^BG%s^K1 forgot about their firemine\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_SUICIDE_BLAST,                      1, 0, s1, XPD(s1, ""),                                          "weaponfireball", _("^BG%s^K1 should have used a smaller gun\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_MURDER_FIREMINE,            2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponfireball", _("^BG%s^K1 got burnt by ^BG%s^K1's firemine\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_MURDER_BLAST,                       2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponfireball", _("^BG%s^K1 got too close to ^BG%s^K1's fireball\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,                      1, 0, s1, XPD(s1, ""),                                          "weapongrenadelauncher", _("^BG%s^K1 blew themself up with their own Mortar\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                       1, 0, s1, XPD(s1, ""),                                          "weapongrenadelauncher", _("^BG%s^K1 didn't see their own Mortar grenade\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_MURDER_EXPLODE,                       2, 0, XPD(s1, s2), XPD(s1, s2),                         "weapongrenadelauncher", _("^BG%s^K1 ate ^BG%s^K1's Mortar grenade\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_MURDER_BOUNCE,                        2, 0, XPD(s1, s2), XPD(s1, s2),                         "weapongrenadelauncher", _("^BG%s^K1 got too close to ^BG%s^K1's Mortar grenade\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_SUICIDE,                                       1, 0, s1, XPD(s1, ""),                                          "weaponhagar", _("^BG%s^K1 played with tiny Hagar rockets\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_MURDER_BURST,                          2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponhagar", _("^BG%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_MURDER_SPRAY,                          2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponhagar", _("^BG%s^K1 was pummeled by ^BG%s^K1's Hagar rockets\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_HLAC_SUICIDE,                                        1, 0, s1, XPD(s1, ""),                                          "weaponhlac", _("^BG%s^K1 got a little jumpy with their HLAC\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_HLAC_MURDER,                                         2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponhlac", _("^BG%s^K1 was cut down with ^BG%s^K1's HLAC\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_HOOK_MURDER,                                         2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponhook", _("^BG%s^K1 was caught in ^BG%s^K1's Hook gravity bomb\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_LASER_SUICIDE,                                       1, 0, s1, XPD(s1, ""),                                          "weaponlaser", _("^BG%s^K1 shot themself to hell with their Laser\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_LASER_MURDER,                                        2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponlaser", _("^BG%s^K1 was shot to death by ^BG%s^K1's Laser\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_MINELAYER_SUICIDE,                           1, 0, s1, XPD(s1, ""),                                          "weaponminelayer", _("^BG%s^K1 forgot about their mine\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_MINELAYER_MURDER,                            2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponminelayer", _("^BG%s^K1 got too close to ^BG%s^K1's mine\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_MINSTANEX_MURDER,                            2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponminstanex", _("^BG%s^K1 has been vaporized by ^BG%s^K1's Minstanex\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_NEX_MURDER,                                          2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponnex", _("^BG%s^K1 has been vaporized by ^BG%s^K1's Nex\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,          2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponrifle", _("^BG%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HAIL,                           2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponrifle", _("^BG%s^K1 died in ^BG%s^K1's Rifle bullet hail\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_PIERCING,                       2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponrifle", _("^BG%s^K1 failed to hide from ^BG%s^K1's Rifle\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER,                                        2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponrifle", _("^BG%s^K1 was sniped with a Rifle by ^BG%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                       2, 0, XPD(s1, s2), XPD(s1, s2),                         "notify_headshot", _("^BG%s^K1 was shot in the head with a Rifle by ^BG%s\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,                      1, 0, s1, XPD(s1, ""),                                          "weaponrocketlauncher", _("^BG%s^K1 blew themself up with their Rocketlauncher\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,        2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponrocketlauncher", _("^BG%s^K1 ate ^BG%s^K1's rocket\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,        2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponrocketlauncher", _("^BG%s^K1 got too close ^BG%s^K1's rocket\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_SUICIDE,                                      1, 0, s1, XPD(s1, ""),                                          "weaponseeker", _("^BG%s^K1 played with tiny Seeker rockets\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_MURDER_TAG,                           2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponseeker", _("^BG%s^K1 was tagged by ^BG%s^K1's Seeker\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_MURDER_SPRAY,                         2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponseeker", _("^BG%s^K1 was pummeled by ^BG%s^K1's Seeker rockets\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_SHOTGUN_MURDER_SLAP,                         2, 0, XPD(s2, s1), XPD(s1, s2),                         "notify_melee_shotgun", _("^BG%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_SHOTGUN_MURDER,                                      2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponshotgun", _("^BG%s^K1 was gunned down by ^BG%s^K1's Shotgun\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_TUBA_SUICIDE,                                        1, 0, s1, XPD(s1, ""),                                          "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Tuba\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_TUBA_MURDER,                                         2, 0, XPD(s1, s2), XPD(s1, s2),                         "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ACCORDEON_SUICIDE,                           1, 0, s1, XPD(s1, ""),                                          "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_ACCORDEON_MURDER,                            2, 0, XPD(s1, s2), XPD(s1, s2),                         "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_KLEINBOTTLE_SUICIDE,                         1, 0, s1, XPD(s1, ""),                                          "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_KLEINBOTTLE_MURDER,                          2, 0, XPD(s1, s2), XPD(s1, s2),                         "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_UZI_MURDER_SNIPE,                            2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponuzi", _("^BG%s^K1 was sniped by ^BG%s^K1's Machine Gun\n"), "") \
-       MSG_INFO_NOTIF(INFO_WEAPON_UZI_MURDER_SPRAY,                            2, 0, XPD(s1, s2), XPD(s1, s2),                         "weaponuzi", _("^BG%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun\n"), "") 
+       MSG_INFO_NOTIF(INFO_SPECTATE_WARNING,                           0, 1, f1, XPD("", ""),                                                          "",                                             _("^F2You have to become a player within the next %d seconds, otherwise you will be kicked, because spectating isn't allowed at this time!\n"), "") \
+       MSG_INFO_NOTIF(INFO_SUPERWEAPON_BROKEN,                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Superweapons have broken down\n"), "") \
+       MSG_INFO_NOTIF(INFO_SUPERWEAPON_PICKUP,                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You now have a superweapon\n"), "") \
+       MSG_INFO_NOTIF(INFO_SUPERWEAPON_LOST,                           0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Superweapons have been lost\n"), "") \
+       MSG_INFO_NOTIF(INFO_VERSION_BETA,                                       2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("\{1}^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have ^F2Xonotic %s\n"), "") \
+       MSG_INFO_NOTIF(INFO_VERSION_OLD,                                        2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("\{1}^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s\n"), "") \
+       MSG_INFO_NOTIF(INFO_VERSION_OUTDATED,                           2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("\{1}^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get the update from ^F3http://www.xonotic.org/^BG!\n"), "") \
+       MSG_INFO_NOTIF(INFO_WATERMARK,                                          1, 0, s1, XPD("", ""),                                                          "",                                             _("^F3SVQC Build information: ^F4%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_THINKING_WITH_PORTALS,                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "notify_selfkill", _("^BG%s^K1 is now thinking with portals%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_CRYLINK_SUICIDE,                             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponcrylink", _("^BG%s^K1 felt the strong pull of their Crylink%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_CRYLINK_MURDER,                                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponcrylink", _("^BG%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponelectro", _("^BG%s^K1 could not remember where they put their Electro plasma%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponelectro", _("^BG%s^K1 played with Electro plasma%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_BOLT,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponelectro", _("^BG%s^K1 was blasted by ^BG%s^K1's Electro bolt%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_ORBS,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponelectro", _("^BG%s^K1 got too close to ^BG%s^K1's Electro plasma%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_COMBO,                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponelectro", _("^BG%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponfireball", _("^BG%s^K1 forgot about their firemine%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_SUICIDE_BLAST,                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponfireball", _("^BG%s^K1 should have used a smaller gun%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_MURDER_FIREMINE,            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponfireball", _("^BG%s^K1 got burnt by ^BG%s^K1's firemine%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_MURDER_BLAST,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponfireball", _("^BG%s^K1 got too close to ^BG%s^K1's fireball%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapongrenadelauncher", _("^BG%s^K1 blew themself up with their own Mortar%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapongrenadelauncher", _("^BG%s^K1 didn't see their own Mortar grenade%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_MURDER_EXPLODE,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapongrenadelauncher", _("^BG%s^K1 ate ^BG%s^K1's Mortar grenade%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_MURDER_BOUNCE,                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapongrenadelauncher", _("^BG%s^K1 got too close to ^BG%s^K1's Mortar grenade%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_SUICIDE,                                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponhagar", _("^BG%s^K1 played with tiny Hagar rockets%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_MURDER_BURST,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhagar", _("^BG%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_MURDER_SPRAY,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhagar", _("^BG%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_HLAC_SUICIDE,                                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponhlac", _("^BG%s^K1 got a little jumpy with their HLAC%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_HLAC_MURDER,                                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhlac", _("^BG%s^K1 was cut down with ^BG%s^K1's HLAC%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_HOOK_MURDER,                                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhook", _("^BG%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_LASER_SUICIDE,                                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponlaser", _("^BG%s^K1 shot themself to hell with their Laser%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_LASER_MURDER,                                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponlaser", _("^BG%s^K1 was shot to death by ^BG%s^K1's Laser%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_MINELAYER_SUICIDE,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponminelayer", _("^BG%s^K1 forgot about their mine%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_MINELAYER_MURDER,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponminelayer", _("^BG%s^K1 got too close to ^BG%s^K1's mine%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_MINSTANEX_MURDER,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponminstanex", _("^BG%s^K1 has been vaporized by ^BG%s^K1's Minstanex%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_NEX_MURDER,                                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponnex", _("^BG%s^K1 has been vaporized by ^BG%s^K1's Nex%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HAIL,                           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 died in ^BG%s^K1's Rifle bullet hail%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_PIERCING,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 failed to hide from ^BG%s^K1's Rifle%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER,                                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 was sniped with a Rifle by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "notify_headshot", _("^BG%s^K1 was shot in the head with a Rifle by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponrocketlauncher", _("^BG%s^K1 blew themself up with their Rocketlauncher%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrocketlauncher", _("^BG%s^K1 ate ^BG%s^K1's rocket%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrocketlauncher", _("^BG%s^K1 got too close ^BG%s^K1's rocket%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_SUICIDE,                                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponseeker", _("^BG%s^K1 played with tiny Seeker rockets%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_MURDER_TAG,                           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponseeker", _("^BG%s^K1 was tagged by ^BG%s^K1's Seeker%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_MURDER_SPRAY,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponseeker", _("^BG%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_SHOTGUN_MURDER_SLAP,                         2, 1, XPD(s2, s1, SPREE_END), XPD(s2, s1),      "notify_melee_shotgun", _("^BG%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_SHOTGUN_MURDER,                                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponshotgun", _("^BG%s^K1 was gunned down by ^BG%s^K1's Shotgun%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_TUBA_SUICIDE,                                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_TUBA_MURDER,                                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ACCORDEON_SUICIDE,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_ACCORDEON_MURDER,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_KLEINBOTTLE_SUICIDE,                         1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_KLEINBOTTLE_MURDER,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_UZI_MURDER_SNIPE,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponuzi", _("^BG%s^K1 was sniped by ^BG%s^K1's Machine Gun%s\n"), "") \
+       MSG_INFO_NOTIF(INFO_WEAPON_UZI_MURDER_SPRAY,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponuzi", _("^BG%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s\n"), "") 
 
 #define MULTITEAM_CENTER(prefix,teams,strnum,flnum,args,cpid,durcnt,normal,gentle) \
        MSG_CENTER_NOTIF(prefix##RED, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_1, strtoupper(STR_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(STR_TEAM_1))) \
@@ -342,7 +384,9 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
                MSG_CENTER_NOTIF(prefix##PINK, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_4, strtoupper(STR_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(STR_TEAM_4))) \
        #endif
 #define MSG_CENTER_NOTIFICATIONS \
-       MSG_CENTER_NOTIF(CENTER_EMPTY,                                                  0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), "", "") \
+       /*MSG_CENTER_NOTIF(CENTER_EMPTY,                                                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), "null", "")*/ \
+       MSG_CENTER_NOTIF(CENTER_ASSAULT_ATTACKING,                              0, 0, NO_STR_ARG,                               CPID_ASSAULT_ROLE,              XPD(0, 0), _("^BGYou are attacking!"), "") \
+       MSG_CENTER_NOTIF(CENTER_ASSAULT_DEFENDING,                              0, 0, NO_STR_ARG,                               CPID_ASSAULT_ROLE,              XPD(0, 0), _("^BGYou are defending!"), "") \
        MSG_CENTER_NOTIF(CENTER_CTF_CAPTURESHIELD_SHIELDED,             0, 0, NO_STR_ARG,                               CPID_CTF_CAPSHIELD,             XPD(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(CENTER_CTF_CAPTURESHIELD_FREE,                 0, 0, NO_STR_ARG,                               CPID_CTF_CAPSHIELD,             XPD(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(CENTER_CTF_PASS_OTHER_, 2,                             2, 0, XPD(s1, s2),                              CPID_CTF_PASS,                  XPD(0, 0), _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \
@@ -379,6 +423,9 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MSG_CENTER_NOTIF(CENTER_DEATH_SELF_SWAMP,                               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You got stuck in a swamp!"), "") \
        MSG_CENTER_NOTIF(CENTER_DEATH_SELF_CHEAT,                               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You unfairly eliminated yourself!"), "") \
        MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TOUCHEXPLODE,                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You died in an accident!"), "") \
+       MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TURRET,                              0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You were fragged by a turret!"), _("^K1You had an unfortunate run in with a turret!")) \
+       MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TURRET_EWHEEL,               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You were fragged by an eWheel turret!"), _("^K1You had an unfortunate run in with an eWheel turret!")) \
+       MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TURRET_WALKER,               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You were fragged by a Walker turret!"), _("^K1You had an unfortunate run in with a Walker turret!")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG,                                              1, 1, XPD(SPREE_CEN, s1),                                                               NO_CPID, XPD(0, 0), _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED,                                   1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s"), _("^K1You were scored against by ^BG%s")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG,                                  1, 1, XPD(SPREE_CEN, s1),                                                               NO_CPID, XPD(0, 0), _("^K1%sYou typefragged ^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing")) \
@@ -387,9 +434,9 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED_FIRST,                             1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were fragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG_FIRST,                    1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First blood! You typefragged ^BG%s"), _("^K1First score! You scored against ^BG%s^K1 while they were typing")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST,                 1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were typefragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s^K1 while typing!")) \
-       MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG_VERBOSE,                              1, 2, XPD(SPREE_CEN, s1, FRAG_PING),                                    NO_CPID, XPD(0, 0), _("^K3You fragged ^BG%s^BG%s"), _("^K3You scored against ^BG%s^BG%s")) \
+       MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG_VERBOSE,                              1, 2, XPD(SPREE_CEN, s1, FRAG_PING),                                    NO_CPID, XPD(0, 0), _("^K3%sYou fragged ^BG%s^BG%s"), _("^K3%sYou scored against ^BG%s^BG%s")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED_VERBOSE,                   1, 3, XPD(s1, FRAG_STATS),                                                              NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s^BG%s"), _("^K1You were scored against by ^BG%s^BG%s")) \
-       MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE,                  1, 2, XPD(SPREE_CEN, s1, FRAG_PING),                                    NO_CPID, XPD(0, 0), _("^K1You typefragged ^BG%s^BG%s"), _("^K1You scored against ^BG%s^K1 while they were typing^BG%s")) \
+       MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE,                  1, 2, XPD(SPREE_CEN, s1, FRAG_PING),                                    NO_CPID, XPD(0, 0), _("^K1%sYou typefragged ^BG%s^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing^BG%s")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE,               1, 3, XPD(s1, FRAG_STATS),                                                              NO_CPID, XPD(0, 0), _("^K1You were typefragged by ^BG%s^BG%s"), _("^K1You were scored against by ^BG%s^K1 while typing^BG%s")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG_FIRST_VERBOSE,                1, 1, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K3First blood! You fragged ^BG%s"), _("^K3First score! You scored against ^BG%s")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED_FIRST_VERBOSE,             1, 3, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were fragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s")) \
@@ -397,6 +444,7 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE, 1, 3, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were typefragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s^K1 while typing!")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_TEAMKILL_FRAG,                                    1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1Moron! You fragged ^BG%s^K1, a team mate!"), _("^K1Moron! You went against ^BG%sK1, a team mate!")) \
        MSG_CENTER_NOTIF(CENTER_DEATH_TEAMKILL_FRAGGED,                                 1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s^K1, a team mate"), _("^K1You were scored against by ^BG%s^K1, a team mate")) \
+       MSG_CENTER_NOTIF(CENTER_DISCONNECT_IDLING,                              0, 1, NO_STR_ARG,                               CPID_IDLING,                    XPD(0, f1), _("^K1Stop idling!\n^BGDisconnecting in ^COUNT..."), "") \
        MULTITEAM_CENTER(CENTER_FREEZETAG_ROUND_WIN_, 4,                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^TC^TT^BG team wins the round, all other teams were frozen"), "") \
        MSG_CENTER_NOTIF(CENTER_FREEZETAG_SPAWN_LATE,                   0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You spawned after the round started, you'll spawn as frozen"), "") \
        MSG_CENTER_NOTIF(CENTER_FREEZETAG_REVIVE,                               1, 0, s1,                                               NO_CPID,                                XPD(0, 0), _("^K3You revived ^BG%s"), "") \
@@ -407,35 +455,42 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MSG_CENTER_NOTIF(CENTER_KEEPAWAY_DROPPED,                               1, 0, s1,                                               CPID_KEEPAWAY,                  XPD(0, 0), _("^BG%s^BG has dropped the ball!"), "") \
        MSG_CENTER_NOTIF(CENTER_KEEPAWAY_PICKUP,                                1, 0, s1,                                               CPID_KEEPAWAY,                  XPD(0, 0), _("^BG%s^BG has picked up the ball!"), "") \
        MSG_CENTER_NOTIF(CENTER_KEEPAWAY_WARN,                                  0, 0, NO_STR_ARG,                               CPID_KA_WARN,                   XPD(0, 0), _("^BGKilling people while you don't have the ball gives no points!"), "") \
+       MSG_CENTER_NOTIF(CENTER_LMS_CAMPCHECK,                                  0, 0, NO_STR_ARG,                               CPID_LMS_CAMP,                  XPD(0, 0), _("^K1Don't camp!"), "") \
+       MSG_CENTER_NOTIF(CENTER_JOIN_NOSPAWNS,                                  0, 0, NO_STR_ARG,                               CPID_PREVENT_JOIN,              XPD(0, 0), _("^K1No spawnpoints available!\nHope your team can fix it..."), "") \
+       MSG_CENTER_NOTIF(CENTER_JOIN_PREVENT,                                   0, 0, NO_STR_ARG,                               CPID_PREVENT_JOIN,              XPD(0, 0), _("^K1You may not join the game at this time.\nThe player limit reached maximum capacity."), "") \
+       MULTITEAM_CENTER(CENTER_TEAMCHANGE_, 4,                                 0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^BGChanging to ^TC^TT^BG in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(CENTER_TEAMCHANGE_SPECTATE,                    0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^BGSpectating in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(CENTER_TEAMCHANGE_AUTO,                                0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^BGChanging team in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(CENTER_TEAMCHANGE_SUICIDE,                             0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^K1Suicide in ^COUNT"), "") \
        MSG_CENTER_NOTIF(CENTER_WEAPON_MARBLES_LOST,                    1, 1, XPD(s1, WEAPON_NAME),             NO_CPID,                                XPD(0, 0), _("^K1You lost your marbles against ^BG%s^K1 using the ^BG%s!"), "")
 
 #define MSG_WEAPON_NOTIFICATIONS \
-       MSG_WEAPON_NOTIF(WEAPON_EMPTY,                                                  NO_MSG,                                                                         NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_THINKING_WITH_PORTALS,                  INFO_WEAPON_THINKING_WITH_PORTALS,                      NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_CRYLINK_SUICIDE,                                INFO_WEAPON_CRYLINK_SUICIDE,                            NO_MSG) \
+       /*MSG_WEAPON_NOTIF(WEAPON_EMPTY,                                                NO_MSG,                                                                         NO_MSG)*/ \
+       MSG_WEAPON_NOTIF(WEAPON_THINKING_WITH_PORTALS,                  INFO_WEAPON_THINKING_WITH_PORTALS,                      CENTER_DEATH_SELF_GENERIC) \
+       MSG_WEAPON_NOTIF(WEAPON_CRYLINK_SUICIDE,                                INFO_WEAPON_CRYLINK_SUICIDE,                            CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_CRYLINK_MURDER,                                 INFO_WEAPON_CRYLINK_MURDER,                             NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_ELECTRO_SUICIDE_ORBS,                   INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                       NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_ELECTRO_SUICIDE_BOLT,                   INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                       NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_ELECTRO_SUICIDE_ORBS,                   INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                       CENTER_DEATH_SELF_GENERIC) \
+       MSG_WEAPON_NOTIF(WEAPON_ELECTRO_SUICIDE_BOLT,                   INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                       CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_ELECTRO_MURDER_BOLT,                    INFO_WEAPON_ELECTRO_MURDER_BOLT,                        NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_ELECTRO_MURDER_ORBS,                    INFO_WEAPON_ELECTRO_MURDER_ORBS,                        NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_ELECTRO_MURDER_COMBO,                   INFO_WEAPON_ELECTRO_MURDER_COMBO,                       NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_FIREBALL_SUICIDE_FIREMINE,              INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,          NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_FIREBALL_SUICIDE_BLAST,                 INFO_WEAPON_FIREBALL_SUICIDE_BLAST,             NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_FIREBALL_SUICIDE_FIREMINE,              INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,          CENTER_DEATH_SELF_GENERIC) \
+       MSG_WEAPON_NOTIF(WEAPON_FIREBALL_SUICIDE_BLAST,                 INFO_WEAPON_FIREBALL_SUICIDE_BLAST,             CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_FIREBALL_MURDER_FIREMINE,               INFO_WEAPON_FIREBALL_MURDER_FIREMINE,           NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_FIREBALL_MURDER_BLAST,                  INFO_WEAPON_FIREBALL_MURDER_BLAST,                      NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_MORTAR_SUICIDE_EXPLODE,                 INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,             NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_MORTAR_SUICIDE_BOUNCE,                  INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                      NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_MORTAR_SUICIDE_EXPLODE,                 INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,             CENTER_DEATH_SELF_GENERIC) \
+       MSG_WEAPON_NOTIF(WEAPON_MORTAR_SUICIDE_BOUNCE,                  INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                      CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_MORTAR_MURDER_EXPLODE,                  INFO_WEAPON_MORTAR_MURDER_EXPLODE,                      NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_MORTAR_MURDER_BOUNCE,                   INFO_WEAPON_MORTAR_MURDER_BOUNCE,                       NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_HAGAR_SUICIDE,                                  INFO_WEAPON_HAGAR_SUICIDE,                                      NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_HAGAR_SUICIDE,                                  INFO_WEAPON_HAGAR_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_HAGAR_MURDER_BURST,                     INFO_WEAPON_HAGAR_MURDER_BURST,                         NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_HAGAR_MURDER_SPRAY,                     INFO_WEAPON_HAGAR_MURDER_SPRAY,                         NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_HLAC_SUICIDE,                                   INFO_WEAPON_HLAC_SUICIDE,                                       NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_HLAC_SUICIDE,                                   INFO_WEAPON_HLAC_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_HLAC_MURDER,                                    INFO_WEAPON_HLAC_MURDER,                                        NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_HOOK_MURDER,                                    INFO_WEAPON_HOOK_MURDER,                                        NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_LASER_SUICIDE,                                  INFO_WEAPON_LASER_SUICIDE,                                      NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_LASER_SUICIDE,                                  INFO_WEAPON_LASER_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_LASER_MURDER,                                   INFO_WEAPON_LASER_MURDER,                                       NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_MINELAYER_SUICIDE,                              INFO_WEAPON_MINELAYER_SUICIDE,                          NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_MINELAYER_SUICIDE,                              INFO_WEAPON_MINELAYER_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_MINELAYER_MURDER,                               INFO_WEAPON_MINELAYER_MURDER,                           NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_MINSTANEX_MURDER,                               INFO_WEAPON_MINSTANEX_MURDER,                           NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_NEX_MURDER,                                     INFO_WEAPON_NEX_MURDER,                                         NO_MSG) \
@@ -444,25 +499,25 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER_PIERCING,                  INFO_WEAPON_RIFLE_MURDER_PIERCING,                      NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER,                                   INFO_WEAPON_RIFLE_MURDER,                                       NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER_HEADSHOT,                  INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                      NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_ROCKETLAUNCHER_SUICIDE,                 INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,             NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_ROCKETLAUNCHER_SUICIDE,                 INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,             CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,   INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,       NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,   INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,       NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_SEEKER_SUICIDE,                                 INFO_WEAPON_SEEKER_SUICIDE,                             NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_SEEKER_SUICIDE,                                 INFO_WEAPON_SEEKER_SUICIDE,                             CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_SEEKER_MURDER_TAG,                              INFO_WEAPON_SEEKER_MURDER_TAG,                          NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_SEEKER_MURDER_SPRAY,                    INFO_WEAPON_SEEKER_MURDER_SPRAY,                        NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_SHOTGUN_MURDER_SLAP,                    INFO_WEAPON_SHOTGUN_MURDER_SLAP,                        NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_SHOTGUN_MURDER,                                 INFO_WEAPON_SHOTGUN_MURDER,                             NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_TUBA_SUICIDE,                                   INFO_WEAPON_TUBA_SUICIDE,                                       NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_TUBA_SUICIDE,                                   INFO_WEAPON_TUBA_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_TUBA_MURDER,                                    INFO_WEAPON_TUBA_MURDER,                                        NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_ACCORDEON_SUICIDE,                              INFO_WEAPON_ACCORDEON_SUICIDE,                          NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_ACCORDEON_SUICIDE,                              INFO_WEAPON_ACCORDEON_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_ACCORDEON_MURDER,                               INFO_WEAPON_ACCORDEON_MURDER,                           NO_MSG) \
-       MSG_WEAPON_NOTIF(WEAPON_KLEINBOTTLE_SUICIDE,                    INFO_WEAPON_KLEINBOTTLE_SUICIDE,                        NO_MSG) \
+       MSG_WEAPON_NOTIF(WEAPON_KLEINBOTTLE_SUICIDE,                    INFO_WEAPON_KLEINBOTTLE_SUICIDE,                        CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(WEAPON_KLEINBOTTLE_MURDER,                     INFO_WEAPON_KLEINBOTTLE_MURDER,                         NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_UZI_MURDER_SNIPE,                               INFO_WEAPON_UZI_MURDER_SNIPE,                           NO_MSG) \
        MSG_WEAPON_NOTIF(WEAPON_UZI_MURDER_SPRAY,                               INFO_WEAPON_UZI_MURDER_SPRAY,                           NO_MSG) 
 
 #define MSG_DEATH_NOTIFICATIONS \
-       MSG_DEATH_NOTIF(DEATH_EMPTY,                                            NO_MSG,                                                                 NO_MSG) \
+       /*MSG_DEATH_NOTIF(DEATH_EMPTY,                                          NO_MSG,                                                                 NO_MSG)*/ \
        MSG_DEATH_NOTIF(DEATH_SELF_CUSTOM,                                      INFO_DEATH_SELF_GENERIC,                                CENTER_DEATH_SELF_CUSTOM) \
        MSG_DEATH_NOTIF(DEATH_SELF_GENERIC,                                     INFO_DEATH_SELF_GENERIC,                                CENTER_DEATH_SELF_GENERIC) \
        MSG_DEATH_NOTIF(DEATH_SELF_VOID,                                        INFO_DEATH_SELF_VOID,                                   CENTER_DEATH_SELF_VOID) \
@@ -482,65 +537,155 @@ void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
        MSG_DEATH_NOTIF(DEATH_SELF_SWAMP,                                       INFO_DEATH_SELF_SWAMP,                                  CENTER_DEATH_SELF_SWAMP) \
        MSG_DEATH_NOTIF(DEATH_SELF_CHEAT,                                       INFO_DEATH_SELF_CHEAT,                                  CENTER_DEATH_SELF_CHEAT) \
        MSG_DEATH_NOTIF(DEATH_SELF_TOUCHEXPLODE,                        INFO_DEATH_SELF_TOUCHEXPLODE,                   CENTER_DEATH_SELF_TOUCHEXPLODE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TELEFRAG,                                  INFO_DEATH_MURDER_TELEFRAG,                                     NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FALL,                                              INFO_DEATH_MURDER_FALL,                                         NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_DROWN,                                             INFO_DEATH_MURDER_DROWN,                                        NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_LAVA,                                              INFO_DEATH_MURDER_LAVA,                                         NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_SLIME,                                             INFO_DEATH_MURDER_SLIME,                                        NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_SHOOTING_STAR,                             INFO_DEATH_MURDER_SHOOTING_STAR,                        NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_SWAMP,                                             INFO_DEATH_MURDER_SWAMP,                                        NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_VOID,                                              INFO_DEATH_MURDER_VOID,                                         NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TOUCHEXPLODE,                              INFO_DEATH_MURDER_TOUCHEXPLODE,                         NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_CHEAT,                                             INFO_DEATH_MURDER_CHEAT,                                        NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FIRE,                                              INFO_DEATH_MURDER_FIRE,                                         NO_MSG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG,                                                      NO_MSG,                                         CENTER_DEATH_MURDER_FRAG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED,                                           NO_MSG,                                         CENTER_DEATH_MURDER_FRAGGED) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG,                                          NO_MSG,                                         CENTER_DEATH_MURDER_TYPEFRAG) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED,                                       NO_MSG,                                         CENTER_DEATH_MURDER_TYPEFRAGGED) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_FIRST,                                        INFO_DEATH_FIRSTBLOOD,          CENTER_DEATH_MURDER_FRAG_FIRST) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_FIRST,                                     NO_MSG,                                         CENTER_DEATH_MURDER_FRAGGED_FIRST) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_FIRST,                            INFO_DEATH_FIRSTBLOOD,          CENTER_DEATH_MURDER_TYPEFRAG_FIRST) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_FIRST,                         NO_MSG,                                         CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_VERBOSE,                                      NO_MSG,                                         CENTER_DEATH_MURDER_FRAG_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_VERBOSE,                           NO_MSG,                                         CENTER_DEATH_MURDER_FRAGGED_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_VERBOSE,                          NO_MSG,                                         CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_VERBOSE,                       NO_MSG,                                         CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_FIRST_VERBOSE,                        INFO_DEATH_FIRSTBLOOD,          CENTER_DEATH_MURDER_FRAG_FIRST_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_FIRST_VERBOSE,                     NO_MSG,                                         CENTER_DEATH_MURDER_FRAGGED_FIRST_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE,            INFO_DEATH_FIRSTBLOOD,          CENTER_DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE,         NO_MSG,                                         CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE) \
-       MSG_DEATH_NOTIF(DEATH_TEAMKILL_FRAG,                                            NO_MSG,                                         CENTER_DEATH_TEAMKILL_FRAG) \
-       MSG_DEATH_NOTIF(DEATH_TEAMKILL_FRAGGED,                                         NO_MSG,                                         CENTER_DEATH_TEAMKILL_FRAGGED)
-
-       
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET,                                      INFO_DEATH_SELF_TURRET,                                 CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_EWHEEL,                       INFO_DEATH_SELF_TURRET_EWHEEL,                  CENTER_DEATH_SELF_TURRET_EWHEEL) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_FLAC,                         INFO_DEATH_SELF_TURRET_FLAC,                    CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_MACHINEGUN,           INFO_DEATH_SELF_TURRET_MACHINEGUN,              CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_WALKER_GUN,           INFO_DEATH_SELF_TURRET_WALKER_GUN,              CENTER_DEATH_SELF_TURRET_WALKER) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_WALKER_MEELE,         INFO_DEATH_SELF_TURRET_WALKER_MEELE,    CENTER_DEATH_SELF_TURRET_WALKER) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_WALKER_ROCKET,        INFO_DEATH_SELF_TURRET_WALKER_ROCKET,   CENTER_DEATH_SELF_TURRET_WALKER) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_HELLION,                      INFO_DEATH_SELF_TURRET_HELLION,                 CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_HK,                           INFO_DEATH_SELF_TURRET_HK,                              CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_MLRS,                         INFO_DEATH_SELF_TURRET_MLRS,                    CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_PLASMA,                       INFO_DEATH_SELF_TURRET_PLASMA,                  CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_PHASER,                       INFO_DEATH_SELF_TURRET_PHASER,                  CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_SELF_TURRET_TESLA,                        INFO_DEATH_SELF_TURRET_TESLA,                   CENTER_DEATH_SELF_TURRET) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TELEFRAG,                          INFO_DEATH_MURDER_TELEFRAG,                             NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FALL,                                      INFO_DEATH_MURDER_FALL,                                 NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_DROWN,                                     INFO_DEATH_MURDER_DROWN,                                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_LAVA,                                      INFO_DEATH_MURDER_LAVA,                                 NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_SLIME,                                     INFO_DEATH_MURDER_SLIME,                                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_SHOOTING_STAR,                     INFO_DEATH_MURDER_SHOOTING_STAR,                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_SWAMP,                                     INFO_DEATH_MURDER_SWAMP,                                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VOID,                                      INFO_DEATH_MURDER_VOID,                                 NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TOUCHEXPLODE,                      INFO_DEATH_MURDER_TOUCHEXPLODE,                 NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_CHEAT,                                     INFO_DEATH_MURDER_CHEAT,                                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FIRE,                                      INFO_DEATH_MURDER_FIRE,                                 NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_CRUSH,                          INFO_DEATH_MURDER_VH_CRUSH,                             NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_SPID_MINIGUN,           INFO_DEATH_MURDER_VH_SPID_MINIGUN,              NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_SPID_ROCKET,            INFO_DEATH_MURDER_VH_SPID_ROCKET,               NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_SPID_DEATH,                     INFO_DEATH_MURDER_VH_SPID_DEATH,                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_WAKI_GUN,                       INFO_DEATH_MURDER_VH_WAKI_GUN,                  NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_WAKI_ROCKET,            INFO_DEATH_MURDER_VH_WAKI_ROCKET,               NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_WAKI_DEATH,                     INFO_DEATH_MURDER_VH_WAKI_DEATH,                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_CANNON,            INFO_DEATH_MURDER_VH_RAPT_CANNON,               NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_BOMB,                      INFO_DEATH_MURDER_VH_RAPT_BOMB,                 NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_FRAGMENT,          INFO_DEATH_MURDER_VH_RAPT_FRAGMENT,             NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_DEATH,                     INFO_DEATH_MURDER_VH_RAPT_DEATH,                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_GUN,                       INFO_DEATH_MURDER_VH_BUMB_GUN,                  NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_RAY,                       INFO_DEATH_MURDER_VH_BUMB_RAY,                  NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_RAY_HEAL,          INFO_DEATH_MURDER_VH_BUMB_RAY_HEAL,             NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_DEATH,                     INFO_DEATH_MURDER_VH_BUMB_DEATH,                NO_MSG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG,                                                      NO_MSG,                                                 CENTER_DEATH_MURDER_FRAG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED,                                           NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG,                                          NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAG) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED,                                       NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_FIRST,                                        INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_FRAG_FIRST) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_FIRST,                                     NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED_FIRST) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_FIRST,                            INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_TYPEFRAG_FIRST) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_FIRST,                         NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_VERBOSE,                                      NO_MSG,                                                 CENTER_DEATH_MURDER_FRAG_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_VERBOSE,                           NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_VERBOSE,                          NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_VERBOSE,                       NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_FIRST_VERBOSE,                        INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_FRAG_FIRST_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_FIRST_VERBOSE,                     NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED_FIRST_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE,            INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE,         NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE) \
+       MSG_DEATH_NOTIF(DEATH_TEAMKILL_FRAG,                                            NO_MSG,                                                 CENTER_DEATH_TEAMKILL_FRAG) \
+       MSG_DEATH_NOTIF(DEATH_TEAMKILL_FRAGGED,                                         NO_MSG,                                                 CENTER_DEATH_TEAMKILL_FRAGGED)
+
+
 // ====================================
 //  Initialization/Create Declarations
 // ====================================
 
+#ifndef MENUQC // Menu doesn't need init
+
 #define NOTIF_FIRST 1
 #define NOTIF_MAX 1024 // limit of recursive functions with ACCUMULATE_FUNCTION
+
+#define ADD_AUTOCVAR(name) var float autocvar_notification_##name = TRUE;
+#define CHECK_AUTOCVAR(name) if(autocvar_notification_##name)
+
 float NOTIF_INFO_COUNT;
 float NOTIF_CENTER_COUNT;
 float NOTIF_WEAPON_COUNT;
 float NOTIF_DEATH_COUNT;
 float NOTIF_CPID_COUNT;
 
+entity msg_info_notifs[NOTIF_MAX];
+entity msg_center_notifs[NOTIF_MAX];
+entity msg_weapon_notifs[NOTIF_MAX];
+entity msg_death_notifs[NOTIF_MAX];
+
+.float nent_broadcast;
+.entity nent_client;
+.float nent_net_type;
+.float nent_net_name;
+.string nent_strings[4];
+.float nent_floats[4];
+
+.string nent_name;
+.float nent_infoname;
+.float nent_centername;
+.float nent_stringcount;
+.float nent_floatcount; 
+.string nent_args;
+.string nent_hudargs;
+.string nent_icon;
+.float nent_cpid;
+.string nent_durcnt;
+.string nent_normal;
+.string nent_gentle;
+
+//     notif.nent_args = strzone(args); \
+//     notif.nent_hudargs = strzone(hudargs); \
+// if(durcnt != "") { notif.nent_durcnt = durcnt; } \
+
+#define CREATE_NOTIF_ENTITY(type,name,infoname,centername,strnum,flnum,args,hudargs,icon,cpid,durcnt,normal,gentle,check_newline,subcalls) \
+       entity notif = spawn(); \
+       msg_##type##_notifs[name - 1] = notif; \
+       notif.classname = "msg_##type##_notification"; \
+       notif.nent_name = strzone(#name); \
+       #if subcalls \
+               #if (infoname == NO_MSG) && (centername == NO_MSG) \
+                       print(sprintf("^1NOTIFICATION WITH NO SUBCALLS: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); \
+               #else \
+                       if(infoname) { notif.nent_infoname = infoname; } \
+                       if(centername) { notif.nent_centername = centername; } \
+               #endif \
+       #else \
+               notif.nent_stringcount = strnum; \
+               notif.nent_floatcount = flnum; \
+               if(icon != "") { notif.nent_icon = strzone(icon); } \
+               if(normal != "") { notif.nent_normal = strzone(normal); } \
+               else { print(sprintf("^1EMPTY NOTIFICATION: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); } \
+               if(gentle != "") { notif.nent_gentle = strzone(gentle); } \
+               #if check_newline \
+                       if(normal != "") { if not(substring(normal, (strlen(normal) - 1), 1) == "\n") { print(sprintf("^1MISSING/BROKEN NEW LINE AT END OF NOTIFICATION: ^7net_type = MSG_%s, net_name = %s, NORMAL string.\n", strtoupper(#type), #name)); } } \
+                       if(gentle != "") { if not(substring(gentle, (strlen(gentle) - 1), 1) == "\n") { print(sprintf("^1MISSING/BROKEN NEW LINE AT END OF NOTIFICATION: ^7net_type = MSG_%s, net_name = %s, GENTLE string.\n", strtoupper(#type), #name)); } } \
+               #else \
+                       if(cpid != NO_MSG) { notif.nent_cpid = cpid; } \
+               #endif \
+       #endif
+
+
 #define MSG_INFO_NOTIF(name,strnum,flnum,args,hudargs,icon,normal,gentle) \
-       #ifndef MENUQC \
-               ADD_AUTOCVAR(name) \
-       #endif \
+       ADD_AUTOCVAR(name) \
        float name; \
        void RegisterNotification_##name() \
        { \
                SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_INFO_COUNT) \
                CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_INFO_COUNT, "notifications") \
+               CREATE_NOTIF_ENTITY(info, name, NO_MSG, NO_MSG, \
+                       strnum, flnum, args, hudargs, icon, NO_MSG, NO_MSG, \
+                       normal, gentle, 1, 0) \
        } \
        ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 
 #define MSG_CENTER_NOTIF(name,strnum,flnum,args,cpid,durcnt,normal,gentle) \
-       #ifndef MENUQC \
-               ADD_AUTOCVAR(name) \
-       #endif \
+       ADD_AUTOCVAR(name) \
        float name; \
        float cpid; \
        void RegisterNotification_##name() \
@@ -548,30 +693,35 @@ float NOTIF_CPID_COUNT;
                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(center, name, NO_MSG, NO_MSG, \
+                       strnum, flnum, args, "", "", cpid, durcnt, \
+                       normal, gentle, 0, 0) \
        } \
        ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 
 #define MSG_WEAPON_NOTIF(name,infoname,centername) \
-       #ifndef MENUQC \
-               ADD_AUTOCVAR(name) \
-       #endif \
+       ADD_AUTOCVAR(name) \
        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(weapon, name, infoname, centername, \
+                       NO_MSG, NO_MSG, "", "", "", NO_MSG, NO_MSG, \
+                       "", "", 0, 1) \
        } \
        ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 
 #define MSG_DEATH_NOTIF(name,infoname,centername) \
-       #ifndef MENUQC \
-               ADD_AUTOCVAR(name) \
-       #endif \
+       ADD_AUTOCVAR(name) \
        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(death, name, infoname, centername, \
+                       NO_MSG, NO_MSG, "", "", "", NO_MSG, NO_MSG, \
+                       "", "", 0, 1) \
        } \
        ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 
@@ -584,3 +734,7 @@ MSG_DEATH_NOTIFICATIONS
 #undef MSG_CENTER_NOTIF
 #undef MSG_WEAPON_NOTIF
 #undef MSG_DEATH_NOTIF
+
+#undef ADD_AUTOCVAR
+
+#endif // ifndef MENUQC