]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/notifications.qh
More work on item messages
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / notifications.qh
index 7de7f279e80d2c25567fd30a966d2a803eff3dee..8a2695159260fb2327af9977b26963a6de3cef24 100644 (file)
@@ -6,8 +6,9 @@
 // main types/groups of notifications
 #define MSG_INFO 1 // "Global" information messages (sent to console, and notify panel if it has an icon)
 #define MSG_CENTER 2 // "Personal" centerprint messages
-#define MSG_WEAPON 3 // "Personal" weapon messages (like "You got the Nex", sent to weapon notify panel)
-#define MSG_DEATH 4 // "Personal" AND "Global" death messages 
+#define MSG_CENTER_KILL 3 // Kill centerprint message
+#define MSG_WEAPON 4 // "Global" weapon messages 
+#define MSG_DEATH 5 // "Personal" AND "Global" death messages 
 
 #define NO_MSG -12345 
 
@@ -56,10 +57,15 @@ void Read_Notification(float is_new);
 #define IFSTR(num) ((num < notif.nent_stringcount) ? ...(num, string) : "")
 #define IFFL(num) ((((notif.nent_stringcount-1) + num) < count) ? ...(((notif.nent_stringcount-1) + num), float) : 0)
 
+void Kill_Notification(float broadcast, entity client, float net_type, float net_name);
 void Send_Notification(float broadcast, entity client, float net_type, float net_name, ...count);
 void Send_Notification_WOVA(float broadcast, entity client, float net_type, float net_name, string s1, string s2, string s3, string s4, float f1, float f2, float f3, float f4);
+
+// legacy stuff
 void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num);
 #define Send_CSQC_Centerprint_Generic_Expire(e,id) Send_CSQC_Centerprint_Generic(e, id, "", 1, 0)
+float CPID_MOTD = 9;
+float CPID_KH_MSG = 10;
 #endif
 
 
@@ -159,71 +165,70 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MULTITEAM_INFO(1, INFO_CTF_CAPTURE_TIME_, 2,                    1, 1, "s1 f1p2dec", "s1",                               "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds\n"), "") \
        MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 2,                  2, 2, "s1 f1p2dec s2 f2p2dec", "s1",    "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds\n"), "") \
        MULTITEAM_INFO(1, INFO_CTF_CAPTURE_UNBROKEN_, 2,                2, 2, "s1 f1p2dec s2 f2p2dec", "s1",    "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%s^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%s^BG seconds\n"), "") \
-       MULTITEAM_INFO(1, INFO_DEATH_TEAMKILL_, 4,                              2, 1, "s1 s2 spree_end", "s2 s1",               "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CUSTOM,                               2, 1, "s1 s2 spree_lost", "s1",                 "notify_void",                  _("^BG%s^K1 %s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_GENERIC,                              1, 1, "s1 spree_lost", "s1",                    "notify_selfkill",              _("^BG%s^K1 died%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VOID,                                 1, 1, "s1 spree_lost", "s1",                    "notify_void",                  _("^BG%s^K1 was in the wrong place%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SUICIDE,                              1, 1, "s1 spree_lost", "s1",                    "notify_selfkill",              _("^BG%s^K1 couldn't take it anymore%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO,                               1, 1, "s1 spree_lost", "s1",                    "notify_outofammo",             _("^BG%s^K1 died%s. What's the point of living without ammo?\n"), _("^BG%s^K1 ran out of ammo%s\n")) \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT,                                  1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 rotted away%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CAMP,                                 1, 1, "s1 spree_lost", "s1",                    "notify_camping",               _("^BG%s^K1 thought they found a nice camping ground%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_BETRAYAL,                             1, 1, "s1 spree_lost", "s1",                    "notify_teamkill_red",  _("^BG%s^K1 became enemies with the Lord of Teamplay%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TEAMCHANGE,                   1, 1, "s1 death_team", "",                              "",                                             _("^BG%s^K1 switched to the %s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_AUTOTEAMCHANGE,               1, 1, "s1 death_team", "",                              "",                                             _("^BG%s^K1 was moved into the %s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FALL,                                 1, 1, "s1 spree_lost", "s1",                    "notify_fall",                  _("^BG%s^K1 hit the ground with a crunch%s\n"), _("^BG%s^K1 hit the ground with a bit too much force%s\n")) \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_DROWN,                                1, 1, "s1 spree_lost", "s1",                    "notify_water",                 _("^BG%s^K1 couldn't catch their breath%s\n"), _("^BG%s^K1 was in the water for too long%s\n")) \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FIRE,                                 1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 became a bit too crispy%s\n"), _("^BG%s^K1 felt a little hot%s\n")) \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA,                                 1, 1, "s1 spree_lost", "s1",                    "notify_lava",                  _("^BG%s^K1 turned into hot slag%s\n"), _("^BG%s^K1 found a hot place%s\n")) \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SLIME,                                1, 1, "s1 spree_lost", "s1",                    "notify_slime",                 _("^BG%s^K1 was slimed%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR,                1, 1, "s1 spree_lost", "s1",                    "notify_shootingstar",  _("^BG%s^K1 became a shooting star%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SWAMP,                                1, 1, "s1 spree_lost", "s1",                    "notify_slime",                 _("^BG%s^K1 is now preserved for centuries to come%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CHEAT,                                1, 1, "s1 spree_lost", "s1",                    "notify_selfkill",              _("^BG%s^K1 unfairly eliminated themself%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TOUCHEXPLODE,                 1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 died in an accident%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET,                               1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 ran into a turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_EWHEEL,                1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was blasted away by an eWheel turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_FLAC,                  1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got caught up in the FLAC turret fire%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_MACHINEGUN,    1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was riddled full of holes by a Machinegun turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_GUN,              1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got served a lead enrichment by a Walker turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_MEELE,    1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was impaled by a Walker turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_ROCKET,   1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was blasted away by a Walker turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_HELLION,               1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was blasted away by a Hellion turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_HK,                    1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 could not hide from the Hunter turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_MLRS,                  1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_PLASMA,                1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got served some superheated plasma from a turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_PHASER,                1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was phased out by a turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_TESLA,                 1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was electrocuted by a Tesla turret%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_CRUSH,                             1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was crushed by a vehicle%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_SPID_ROCKET,               1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was blasted to bits by a Spiderbot rocket%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_SPID_DEATH,                1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got caught in the blast of a Spiderbot explosion%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_WAKI_ROCKET,               1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 couldn't find shelter from a Racer rocket%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_WAKI_DEATH,                1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got caught in the blast of a Racer explosion%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_RAPT_BOMB,                 1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 was caught in a Raptor cluster bomb%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_RAPT_DEATH,                1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got caught in the blast of a Raptor explosion%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_BUMB_DEATH,                1, 1, "s1 spree_lost", "s1",                    "notify_death",                 _("^BG%s^K1 got caught in the blast of a Bumblebee explosion%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_TELEFRAG,                   2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_telefrag",              _("^BG%s%s^K1 was telefragged by ^BG%s^K1%s\n"), _("^BG%s^K1 tried to occupy ^BG%s^K1's teleport destination space\n")) \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FALL,                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_fall",                  _("^BG%s%s^K1 was grounded by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_DROWN,                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_water",                 _("^BG%s%s^K1 was drowned by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA,                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_lava",                  _("^BG%s%s^K1 was cooked by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME,                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_slime",                 _("^BG%s%s^K1 was slimed by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR,              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_shootingstar",  _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SWAMP,                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_slime",                 _("^BG%s%s^K1 was preserved by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VOID,                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "notify_void",                  _("^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_TOUCHEXPLODE,               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "notify_death",                 _("^BG%s%s^K1 died in an accident with ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_CHEAT,                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE,                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "notify_death",                 _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s\n"), _("^BG%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s\n")) \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_CRUSH,                   2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 was crushed by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_MINIGUN,    2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 got shredded by ^BG%s^K1's Spiderbot%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_ROCKET,             2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 was blasted to bits by ^BG%s^K1's Spiderbot%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_DEATH,              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Spiderbot exploded%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_GUN,                2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_ROCKET,             2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_DEATH,              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_CANNON,             2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 couldn't resist ^BG%s^K1's purple blobs%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_BOMB,               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_FRAGMENT,   2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_DEATH,              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Raptor exploded%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_GUN,                2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 saw the pretty lights of ^BG%s^K1's Bumblebee gun%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_DEATH,              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Bumblebee exploded%s\n"), "") \
+       MULTITEAM_INFO(1, INFO_DEATH_TEAMKILL_, 4,                              3, 1, "s1 s2 s3loc spree_end", "s2 s1", "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CUSTOM,                               3, 1, "s1 s2 s3loc spree_lost", "s1",   "notify_void",                  _("^BG%s^K1 %s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_GENERIC,                              2, 1, "s1 s2loc spree_lost", "s1",              "notify_selfkill",              _("^BG%s^K1 died%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VOID,                                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_void",                  _("^BG%s^K1 was in the wrong place%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SUICIDE,                              2, 1, "s1 s2loc spree_lost", "s1",              "notify_selfkill",              _("^BG%s^K1 couldn't take it anymore%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO,                               2, 1, "s1 s2loc spree_lost", "s1",              "notify_outofammo",             _("^BG%s^K1 died%s%s. What's the point of living without ammo?\n"), _("^BG%s^K1 ran out of ammo%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT,                                  2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 rotted away%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CAMP,                                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_camping",               _("^BG%s^K1 thought they found a nice camping ground%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_BETRAYAL,                             2, 1, "s1 s2loc spree_lost", "s1",              "notify_teamkill_red",  _("^BG%s^K1 became enemies with the Lord of Teamplay%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TEAMCHANGE,                   2, 1, "s1 s2loc death_team", "",                "",                                             _("^BG%s^K1 switched to the %s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_AUTOTEAMCHANGE,               2, 1, "s1 s2loc death_team", "",                "",                                             _("^BG%s^K1 was moved into the %s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FALL,                                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_fall",                  _("^BG%s^K1 hit the ground with a crunch%s%s\n"), _("^BG%s^K1 hit the ground with a bit too much force%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_DROWN,                                2, 1, "s1 s2loc spree_lost", "s1",              "notify_water",                 _("^BG%s^K1 couldn't catch their breath%s%s\n"), _("^BG%s^K1 was in the water for too long%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FIRE,                                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 became a bit too crispy%s%s\n"), _("^BG%s^K1 felt a little hot%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA,                                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_lava",                  _("^BG%s^K1 turned into hot slag%s%s\n"), _("^BG%s^K1 found a hot place%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SLIME,                                2, 1, "s1 s2loc spree_lost", "s1",              "notify_slime",                 _("^BG%s^K1 was slimed%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_shootingstar",  _("^BG%s^K1 became a shooting star%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SWAMP,                                2, 1, "s1 s2loc spree_lost", "s1",              "notify_slime",                 _("^BG%s^K1 is now preserved for centuries to come%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_CHEAT,                                2, 1, "s1 s2loc spree_lost", "s1",              "notify_selfkill",              _("^BG%s^K1 unfairly eliminated themself%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TOUCHEXPLODE,                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 died in an accident%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET,                               2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 ran into a turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_EWHEEL,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was blasted away by an eWheel turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_FLAC,                  2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got caught up in the FLAC turret fire%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_MACHINEGUN,    2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was riddled full of holes by a Machinegun turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_GUN,              2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got served a lead enrichment by a Walker turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_MEELE,    2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was impaled by a Walker turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_WALK_ROCKET,   2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was blasted away by a Walker turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_HELLION,               2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was blasted away by a Hellion turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_HK,                    2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 could not hide from the Hunter turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_MLRS,                  2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_PLASMA,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got served some superheated plasma from a turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_PHASER,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was phased out by a turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_TURRET_TESLA,                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was electrocuted by a Tesla turret%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_CRUSH,                             2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was crushed by a vehicle%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_SPID_ROCKET,               2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was blasted to bits by a Spiderbot rocket%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_SPID_DEATH,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got caught in the blast of a Spiderbot explosion%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_WAKI_ROCKET,               2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 couldn't find shelter from a Racer rocket%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_WAKI_DEATH,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got caught in the blast of a Racer explosion%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_RAPT_BOMB,                 2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 was caught in a Raptor cluster bomb%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_RAPT_DEATH,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got caught in the blast of a Raptor explosion%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_BUMB_DEATH,                2, 1, "s1 s2loc spree_lost", "s1",              "notify_death",                 _("^BG%s^K1 got caught in the blast of a Bumblebee explosion%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_TELEFRAG,                   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_telefrag",              _("^BG%s%s^K1 was telefragged by ^BG%s^K1%s%s\n"), _("^BG%s^K1 tried to occupy ^BG%s^K1's teleport destination space%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FALL,                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_fall",                  _("^BG%s%s^K1 was grounded by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_DROWN,                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_water",                 _("^BG%s%s^K1 was drowned by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA,                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_lava",                  _("^BG%s%s^K1 was cooked by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME,                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_slime",                 _("^BG%s%s^K1 was slimed by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_shootingstar",  _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SWAMP,                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_slime",                 _("^BG%s%s^K1 was preserved by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VOID,                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_void",                  _("^BG%s%s^K1 was thrown into a world of hurt by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_TOUCHEXPLODE,               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 died in an accident with ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_CHEAT,                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 was unfairly eliminated by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE,                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s\n"), _("^BG%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_CRUSH,                   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 was crushed by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_MINIGUN,    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 got shredded by ^BG%s^K1's Spiderbot%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_ROCKET,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 was blasted to bits by ^BG%s^K1's Spiderbot%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_SPID_DEATH,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Spiderbot exploded%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_GUN,                3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 was bolted down by ^BG%s^K1's Racer%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_ROCKET,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 couldn't find shelter from ^BG%s^K1's Racer%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_WAKI_DEATH,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Racer exploded%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_CANNON,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 couldn't resist ^BG%s^K1's purple blobs%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_BOMB,               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 was cluster bombed by ^BG%s^K1's Raptor%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_RAPT_DEATH,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Raptor exploded%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_GUN,                3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 saw the pretty lights of ^BG%s^K1's Bumblebee gun%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_VH_BUMB_DEATH,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",               "notify_death",                 _("^BG%s%s^K1 got caught in the blast when ^BG%s^K1's Bumblebee exploded%s%s\n"), "") \
        MULTITEAM_INFO(1, INFO_FREEZETAG_ROUND_WIN_, 4,                 0, 0, "", "",                                                   "",                                             _("^TC^TT^BG team wins the round, all other teams were frozen\n"), "") \
        MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVE,                                2, 0, "s1 s2", "",                                              "",                                             _("^BG%s^K3 was revived by ^BG%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE,                                2, 0, "s1 s2", "",                                              "",                                             _("^BG%s^K1 was frozen by ^BG%s\n"), "") \
@@ -234,17 +239,18 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MSG_INFO_NOTIF(2, INFO_JOIN_PLAY,                                               1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 is now playing\n"), "") \
        MSG_INFO_NOTIF(1, INFO_KEEPAWAY_DROPPED,                                1, 0, "s1", "s1",                                               "notify_balldropped",   _("^BG%s^BG has dropped the ball!\n"), "") \
        MSG_INFO_NOTIF(1, INFO_KEEPAWAY_PICKUP,                                 1, 0, "s1", "s1",                                               "notify_ballpickedup",  _("^BG%s^BG has picked up the ball!\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_LMS_NOLIVES,                                             1, 0, "s1", "s1",                                               "",                                             _("^BG%s^F3 has no more lives left\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_LMS_FORFEIT,                                             1, 0, "s1", "s1",                                               "",                                             _("^BG%s^F3 forfeited\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_POWERUP_INVISIBILITY,                    1, 0, "s1", "s1",                                               "strength",                             _("^BG%s^K1 picked up the Invisibility powerup\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_POWERUP_SHIELD,                                  1, 0, "s1", "s1",                                               "shield",                               _("^BG%s^K1 picked up the Shield powerup\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_POWERUP_SPEED,                                   1, 0, "s1", "s1",                                               "shield",                               _("^BG%s^K1 picked up the Speed powerup\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_POWERUP_STRENGTH,                                1, 0, "s1", "s1",                                               "strength",                             _("^BG%s^K1 picked up the Strength powerup\n"), "") \
-       MSG_INFO_NOTIF(2, INFO_QUIT_DISCONNECT,                                 1, 0, "s1", "s1",                                               "",                                             _("^BG%s^F3 disconnected\n"), "") \
-       MSG_INFO_NOTIF(2, INFO_QUIT_KICK_IDLING,                                1, 0, "s1", "s1",                                               "",                                             _("^BG%s^F3 was kicked for idling\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_LMS_NOLIVES,                                             1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 has no more lives left\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_LMS_FORFEIT,                                             1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 forfeited\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_POWERUP_INVISIBILITY,                    1, 0, "s1", "s1",                                               "strength",                             _("^BG%s^K1 picked up Invisibility\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_POWERUP_SHIELD,                                  1, 0, "s1", "s1",                                               "shield",                               _("^BG%s^K1 picked up Shield\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_POWERUP_SPEED,                                   1, 0, "s1", "s1",                                               "shield",                               _("^BG%s^K1 picked up Speed\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_POWERUP_STRENGTH,                                1, 0, "s1", "s1",                                               "strength",                             _("^BG%s^K1 picked up Strength\n"), "") \
+       MSG_INFO_NOTIF(2, INFO_QUIT_DISCONNECT,                                 1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 disconnected\n"), "") \
+       MSG_INFO_NOTIF(2, INFO_QUIT_KICK_IDLING,                                1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 was kicked for idling\n"), "") \
        MSG_INFO_NOTIF(1, INFO_QUIT_KICK_SPECTATING,                    0, 0, "", "",                                                   "",                                             _("^F2You were kicked from the server because you are a spectator and spectators aren't allowed at the moment.\n"), "") \
-       MSG_INFO_NOTIF(2, INFO_QUIT_SPECTATE,                                   1, 0, "s1", "s1",                                               "",                                             _("^BG%s^F3 is now spectating\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_RACE_FAIL,                                               2, 0, "s1 s2", "s1",                                    "race_newfail",                 "TODO\n", "") \
+       MSG_INFO_NOTIF(2, INFO_QUIT_SPECTATE,                                   1, 0, "s1", "",                                                 "",                                             _("^BG%s^F3 is now spectating\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_FAIL_RANKED,                                1, 3, "s1 f1ord race_time race_diff", "s1",             "race_newfail", _("^BG%s^BG couldn't break their %s place record of %s %s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_RACE_FAIL_UNRANKED,                              1, 3, "s1 f1ord race_time race_diff", "s1",             "race_newfail", _("^BG%s^BG couldn't break the %s place record of %s %s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_RACE_NEW_RECORD,                                 2, 0, "s1 s2", "s1",                                    "race_newrecordserver", "TODO\n", "") \
        MSG_INFO_NOTIF(1, INFO_RACE_NEW_TIME,                                   2, 0, "s1 s2", "s1",                                    "race_newtime",                 "TODO\n", "") \
        MSG_INFO_NOTIF(1, INFO_RACE_NEW_RANK,                                   2, 0, "s1 s2", "s1",                                    "race_newrankyellow",   "TODO\n", "") \
@@ -255,55 +261,57 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MSG_INFO_NOTIF(2, INFO_VERSION_OLD,                                             2, 0, "s1 s2", "",                                              "",                                             _("^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s\n"), "") \
        MSG_INFO_NOTIF(2, INFO_VERSION_OUTDATED,                                2, 0, "s1 s2", "",                                              "",                                             _("^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(1, INFO_WATERMARK,                                               1, 0, "s1", "",                                                 "",                                             _("^F3SVQC Build information: ^F4%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_THINKING_WITH_PORTALS,                    1, 1, "s1 spree_lost", "s1",                                    "notify_selfkill",                      _("^BG%s^K1 is now thinking with portals%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_CRYLINK_SUICIDE,                                  1, 1, "s1 spree_lost", "s1",                                    "weaponcrylink",                        _("^BG%s^K1 felt the strong pull of their Crylink%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_CRYLINK_MURDER,                                   2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponcrylink",                        _("^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                     1, 1, "s1 spree_lost", "s1",                                    "weaponelectro",                        _("^BG%s^K1 could not remember where they put their Electro plasma%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                     1, 1, "s1 spree_lost", "s1",                                    "weaponelectro",                        _("^BG%s^K1 played with Electro plasma%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_BOLT,                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponelectro",                        _("^BG%s%s^K1 was blasted by ^BG%s^K1's Electro bolt%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_ORBS,                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponelectro",                        _("^BG%s%s^K1 got too close to ^BG%s^K1's Electro plasma%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_COMBO,                     2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponelectro",                        _("^BG%s%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,                1, 1, "s1 spree_lost", "s1",                                    "weaponfireball",                       _("^BG%s^K1 forgot about their firemine%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_SUICIDE_BLAST,                   1, 1, "s1 spree_lost", "s1",                                    "weaponfireball",                       _("^BG%s^K1 should have used a smaller gun%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_MURDER_FIREMINE,                 2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponfireball",                       _("^BG%s%s^K1 got burnt by ^BG%s^K1's firemine%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_MURDER_BLAST,                    2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponfireball",                       _("^BG%s%s^K1 got too close to ^BG%s^K1's fireball%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,                   1, 1, "s1 spree_lost", "s1",                                    "weapongrenadelauncher",        _("^BG%s^K1 blew themself up with their own Mortar%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                    1, 1, "s1 spree_lost", "s1",                                    "weapongrenadelauncher",        _("^BG%s^K1 didn't see their own Mortar grenade%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_EXPLODE,                    2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weapongrenadelauncher",        _("^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_BOUNCE,                     2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weapongrenadelauncher",        _("^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_SUICIDE,                                    1, 1, "s1 spree_lost", "s1",                                    "weaponhagar",                          _("^BG%s^K1 played with tiny Hagar rockets%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_MURDER_BURST,                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponhagar",                          _("^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_MURDER_SPRAY,                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponhagar",                          _("^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_SUICIDE,                                     1, 1, "s1 spree_lost", "s1",                                    "weaponhlac",                           _("^BG%s^K1 got a little jumpy with their HLAC%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_MURDER,                                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponhlac",                           _("^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_HOOK_MURDER,                                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",             "weaponhook",                           _("^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_LASER_SUICIDE,                                    1, 1, "s1 spree_lost", "s1",                                    "weaponlaser",                          _("^BG%s^K1 shot themself to hell with their Laser%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_LASER_MURDER,                                     2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponlaser",                          _("^BG%s%s^K1 was shot to death by ^BG%s^K1's Laser%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_SUICIDE,                                1, 1, "s1 spree_lost", "s1",                                    "weaponminelayer",                      _("^BG%s^K1 forgot about their mine%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_MURDER,                                 2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponminelayer",                      _("^BG%s%s^K1 got too close to ^BG%s^K1's mine%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_MINSTANEX_MURDER,                                 2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponminstanex",                      _("^BG%s%s^K1 has been vaporized by ^BG%s^K1's Minstanex%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_NEX_MURDER,                                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponnex",                            _("^BG%s%s^K1 has been vaporized by ^BG%s^K1's Nex%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponrifle",                          _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL,                                2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponrifle",                          _("^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_PIERCING,                    2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponrifle",                          _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER,                                     2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponrifle",                          _("^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                    2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "notify_headshot",                      _("^BG%s%s^K1 was shot in the head with a Rifle by ^BG%s^K1%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,                   1, 1, "s1 spree_lost", "s1",                                    "weaponrocketlauncher",         _("^BG%s^K1 blew themself up with their Rocketlauncher%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,     2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponrocketlauncher",         _("^BG%s%s^K1 ate ^BG%s^K1's rocket%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,     2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponrocketlauncher",         _("^BG%s%s^K1 got too close ^BG%s^K1's rocket%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_SUICIDE,                                   1, 1, "s1 spree_lost", "s1",                                    "weaponseeker",                         _("^BG%s^K1 played with tiny Seeker rockets%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_TAG,                                2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponseeker",                         _("^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_SPRAY,                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponseeker",                         _("^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_SHOTGUN_MURDER_SLAP,                              2, 2, "spree_inf s2 s1 spree_end", "s2 s1",     "notify_melee_shotgun",         _("^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_SHOTGUN_MURDER,                                   2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponshotgun",                        _("^BG%s%s^K1 was gunned down by ^BG%s^K1's Shotgun%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_SUICIDE,                                     1, 1, "s1 spree_lost", "s1",                                    "weapontuba",                           _("^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_MURDER,                                              2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weapontuba",                           _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_SUICIDE,                                1, 1, "s1 spree_lost", "s1",                                    "weapontuba",                           _("^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_MURDER,                                 2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weapontuba",                           _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_SUICIDE,                              1, 1, "s1 spree_lost", "s1",                                    "weapontuba",                           _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_MURDER,                               2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weapontuba",                           _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SNIPE,                                 2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponuzi",                            _("^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SPRAY,                                 2, 2, "spree_inf s1 s2 spree_end", "s2 s1",     "weaponuzi",                            _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s\n"), "") 
+       MSG_INFO_NOTIF(0, INFO_WEAPON_GOTWEP,                                   0, 1, "item_wepname", "",                               "",                                     _("^BGYou got the ^F1%s\n"), "") \
+       MSG_INFO_NOTIF(0, INFO_WEAPON_DROPPED,                                  1, 1, "item_wepname item_wepammo", "",  "",                                     _("^BGYou dropped the ^F1%s^BG%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_THINKING_WITH_PORTALS,                    2, 1, "s1 s2loc spree_lost", "s1",                                      "notify_selfkill",                      _("^BG%s^K1 is now thinking with portals%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_CRYLINK_SUICIDE,                                  2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponcrylink",                        _("^BG%s^K1 felt the strong pull of their Crylink%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_CRYLINK_MURDER,                                   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponcrylink",                        _("^BG%s%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                     2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponelectro",                        _("^BG%s^K1 could not remember where they put their Electro plasma%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                     2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponelectro",                        _("^BG%s^K1 played with Electro plasma%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_BOLT,                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponelectro",                        _("^BG%s%s^K1 was blasted by ^BG%s^K1's Electro bolt%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_ORBS,                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponelectro",                        _("^BG%s%s^K1 got too close to ^BG%s^K1's Electro plasma%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ELECTRO_MURDER_COMBO,                     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponelectro",                        _("^BG%s%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,                2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponfireball",                       _("^BG%s^K1 forgot about their firemine%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_SUICIDE_BLAST,                   2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponfireball",                       _("^BG%s^K1 should have used a smaller gun%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_MURDER_FIREMINE,                 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponfireball",                       _("^BG%s%s^K1 got burnt by ^BG%s^K1's firemine%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_FIREBALL_MURDER_BLAST,                    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponfireball",                       _("^BG%s%s^K1 got too close to ^BG%s^K1's fireball%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,                   2, 1, "s1 s2loc spree_lost", "s1",                                      "weapongrenadelauncher",        _("^BG%s^K1 blew themself up with their own Mortar%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                    2, 1, "s1 s2loc spree_lost", "s1",                                      "weapongrenadelauncher",        _("^BG%s^K1 didn't see their own Mortar grenade%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_EXPLODE,                    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weapongrenadelauncher",        _("^BG%s%s^K1 ate ^BG%s^K1's Mortar grenade%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_BOUNCE,                     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weapongrenadelauncher",        _("^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_SUICIDE,                                    2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponhagar",                          _("^BG%s^K1 played with tiny Hagar rockets%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_MURDER_BURST,                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponhagar",                          _("^BG%s%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_HAGAR_MURDER_SPRAY,                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponhagar",                          _("^BG%s%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_SUICIDE,                                     2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponhlac",                           _("^BG%s^K1 got a little jumpy with their HLAC%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_HLAC_MURDER,                                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponhlac",                           _("^BG%s%s^K1 was cut down with ^BG%s^K1's HLAC%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_HOOK_MURDER,                                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponhook",                           _("^BG%s%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_LASER_SUICIDE,                                    2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponlaser",                          _("^BG%s^K1 shot themself to hell with their Laser%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_LASER_MURDER,                                     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponlaser",                          _("^BG%s%s^K1 was shot to death by ^BG%s^K1's Laser%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_SUICIDE,                                2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponminelayer",                      _("^BG%s^K1 forgot about their mine%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_MURDER,                                 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponminelayer",                      _("^BG%s%s^K1 got too close to ^BG%s^K1's mine%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_MINSTANEX_MURDER,                                 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponminstanex",                      _("^BG%s%s^K1 has been vaporized by ^BG%s^K1's Minstanex%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_NEX_MURDER,                                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponnex",                            _("^BG%s%s^K1 has been vaporized by ^BG%s^K1's Nex%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponrifle",                          _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HAIL,                                3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponrifle",                          _("^BG%s%s^K1 died in ^BG%s^K1's Rifle bullet hail%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_PIERCING,                    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponrifle",                          _("^BG%s%s^K1 failed to hide from ^BG%s^K1's Rifle%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER,                                     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponrifle",                          _("^BG%s%s^K1 was sniped with a Rifle by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                    3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "notify_headshot",                      _("^BG%s%s^K1 was shot in the head with a Rifle by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,                   2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponrocketlauncher",         _("^BG%s^K1 blew themself up with their Rocketlauncher%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponrocketlauncher",         _("^BG%s%s^K1 ate ^BG%s^K1's rocket%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponrocketlauncher",         _("^BG%s%s^K1 got too close ^BG%s^K1's rocket%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_SUICIDE,                                   2, 1, "s1 s2loc spree_lost", "s1",                                      "weaponseeker",                         _("^BG%s^K1 played with tiny Seeker rockets%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_TAG,                                3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponseeker",                         _("^BG%s%s^K1 was tagged by ^BG%s^K1's Seeker%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_SEEKER_MURDER_SPRAY,                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponseeker",                         _("^BG%s%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_SHOTGUN_MURDER_SLAP,                              3, 2, "spree_inf s2 s1 s3loc spree_end", "s2 s1",       "notify_melee_shotgun",         _("^BG%s%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_SHOTGUN_MURDER,                                   3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponshotgun",                        _("^BG%s%s^K1 was gunned down by ^BG%s^K1's Shotgun%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_SUICIDE,                                     2, 1, "s1 s2loc spree_lost", "s1",                                      "weapontuba",                           _("^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_TUBA_MURDER,                                              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weapontuba",                           _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_SUICIDE,                                2, 1, "s1 s2loc spree_lost", "s1",                                      "weapontuba",                           _("^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_ACCORDEON_MURDER,                                 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weapontuba",                           _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_SUICIDE,                              2, 1, "s1 s2loc spree_lost", "s1",                                      "weapontuba",                           _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_MURDER,                               3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weapontuba",                           _("^BG%s%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SNIPE,                                 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponuzi",                            _("^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SPRAY,                                 3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",       "weaponuzi",                            _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s\n"), "") 
 
 #define MULTITEAM_CENTER(default,prefix,teams,strnum,flnum,args,cpid,durcnt,normal,gentle) \
        MSG_CENTER_NOTIF(default, 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))) \
@@ -318,6 +326,11 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        /*MSG_CENTER_NOTIF(1, CENTER_EMPTY,                                                     0, 0, "",                               NO_CPID,                                "0 0", "null", "")*/ \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_ATTACKING,                           0, 0, "",                               CPID_ASSAULT_ROLE,              "0 0", _("^BGYou are attacking!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_DEFENDING,                           0, 0, "",                               CPID_ASSAULT_ROLE,              "0 0", _("^BGYou are defending!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ARENA_BEGIN,                                         0, 0, "",                               CPID_ARENA,                             "2 0", _("^F4Begin!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ARENA_NEEDPLAYER,                            0, 0, "",                               CPID_ARENA,                             "2 0", _("^BGNeed at least 1 player in each team to play Clan Arena!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_ARENA_ROUNDSTART,                            0, 1, "",                               CPID_ARENA,                     "1 f1", _("^F4Round will start in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_BEGIN,                                     0, 0, "",                               CPID_GAMESTART,                 "2 0", _("^F4Begin!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_GAMESTART,                         0, 1, "",                               CPID_GAMESTART,                 "1 f1", _("^F4Game starts in ^COUNT"), "") \
        MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED,          0, 0, "",                               CPID_CTF_CAPSHIELD,             "0 0", _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \
        MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE,                      0, 0, "",                               CPID_CTF_CAPSHIELD,             "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \
        MULTITEAM_CENTER(1, CENTER_CTF_PASS_OTHER_, 2,                          2, 0, "s1 s2",                  CPID_CTF_PASS,                  "0 0", _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \
@@ -334,7 +347,7 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MSG_CENTER_NOTIF(1, CENTER_CTF_PICKUP_ENEMY_VERBOSE,            2, 0, "s1 s2 s1",               CPID_CTF_LOWPRIO,               "0 0", _("^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_CARRIER,                       0, 0, "",                               CPID_STALEMATE,                 "0 0", _("^BGStalemate! Enemies can now see you on radar!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_CTF_STALEMATE_OTHER,                         0, 0, "",                               CPID_STALEMATE,                 "0 0", _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_CTF_FLAG_THROW_PUNISH,                       0, 1, "f1",                             CPID_CTF_LOWPRIO,               "0 0", _("^BGToo many flag throws! Throwing disabled for %s seconds."), "") \
+       MSG_CENTER_NOTIF(1, CENTER_CTF_FLAG_THROW_PUNISH,                       0, 1, "f1secs",                 CPID_CTF_LOWPRIO,               "0 0", _("^BGToo many flag throws! Throwing disabled for %s."), "") \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_CUSTOM,                           2, 0, "s2",                             NO_CPID,                                "0 0", _("^K1You were %s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_GENERIC,                          0, 0, "",                               NO_CPID,                                "0 0", _("^K1You killed your own dumb self!"), _("^K1You need to be more careful!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_VOID,                                     0, 0, "",                               NO_CPID,                                "0 0", _("^K1Watch your step!"), "") \
@@ -365,51 +378,61 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_VH_RAPT_BOMB,                     0, 0, "",                               NO_CPID,                                "0 0", _("^K1You were caught in a Raptor cluster bomb!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_VH_RAPT_DEATH,            0, 0, "",                               NO_CPID,                                "0 0", _("^K1You got caught in the blast of a Raptor explosion!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_VH_BUMB_DEATH,            0, 0, "",                               NO_CPID,                                "0 0", _("^K1You got caught in the blast of a Bumblebee explosion!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG,                                           1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED,                                        1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K1%sYou were fragged by ^BG%s"), _("^K1%sYou were scored against by ^BG%s")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG,                                       1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K1%sYou typefragged ^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED,                            1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K1%sYou were typefragged by ^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing!")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG_VERBOSE,                           1, 2, "spree_cen s1 frag_ping",         NO_CPID, "0 0", _("^K3%sYou fragged ^BG%s^BG%s"), _("^K3%sYou scored against ^BG%s^BG%s")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED_VERBOSE,                        1, 4, "spree_cen s1 frag_stats",        NO_CPID, "0 0", _("^K1%sYou were fragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^BG%s")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE,                       1, 2, "spree_cen s1 frag_ping",         NO_CPID, "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(1, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE,            1, 4, "spree_cen s1 frag_stats",        NO_CPID, "0 0", _("^K1%sYou were typefragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing^BG%s")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAG,                                         1, 0, "s1",                                                     NO_CPID, "0 0", _("^K1Moron! You fragged ^BG%s^K1, a team mate!"), _("^K1Moron! You went against ^BG%s^K1, a team mate!")) \
-       MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAGGED,                                      1, 0, "s1",                                                     NO_CPID, "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(1, CENTER_DEATH_MURDER_FRAG,                                   1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED,                                1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K1%sYou were fragged by ^BG%s"), _("^K1%sYou were scored against by ^BG%s")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG,                               1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K1%sYou typefragged ^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED,                    1, 1, "spree_cen s1",                           NO_CPID, "0 0", _("^K1%sYou were typefragged by ^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing!")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAG_VERBOSE,                   1, 2, "spree_cen s1 frag_ping",         NO_CPID, "0 0", _("^K3%sYou fragged ^BG%s^BG%s"), _("^K3%sYou scored against ^BG%s^BG%s")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_FRAGGED_VERBOSE,                1, 4, "spree_cen s1 frag_stats",        NO_CPID, "0 0", _("^K1%sYou were fragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^BG%s")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE,               1, 2, "spree_cen s1 frag_ping",         NO_CPID, "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(1, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE,    1, 4, "spree_cen s1 frag_stats",        NO_CPID, "0 0", _("^K1%sYou were typefragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing^BG%s")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAG,                                 1, 0, "s1",                                                     NO_CPID, "0 0", _("^K1Moron! You fragged ^BG%s^K1, a team mate!"), _("^K1Moron! You went against ^BG%s^K1, a team mate!")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_TEAMKILL_FRAGGED,                              1, 0, "s1",                                                     NO_CPID, "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(1, CENTER_DISCONNECT_IDLING,                           0, 1, "",                               CPID_IDLING,                    "1 f1", _("^K1Stop idling!\n^BGDisconnecting in ^COUNT..."), "") \
-       MULTITEAM_CENTER(1, CENTER_FREEZETAG_ROUND_WIN_, 4,                     0, 0, "",                                       NO_CPID,                                "0 0", _("^TC^TT^BG team wins the round, all other teams were frozen"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SPAWN_LATE,                        0, 0, "",                                       NO_CPID,                                "0 0", _("^K1You spawned after the round started, you'll spawn as frozen"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE,                            1, 0, "s1",                                     NO_CPID,                                "0 0", _("^K3You revived ^BG%s"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVED,                           1, 0, "s1",                                     NO_CPID,                                "0 0", _("^K3You were revived by ^BG%s"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SELF,                                      0, 0, "",                                       NO_CPID,                                "0 0", _("^K1You froze yourself"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FREEZE,                            1, 0, "s1",                                     NO_CPID,                                "0 0", _("^K3You froze ^BG%s"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FROZEN,                            1, 0, "s1",                                     NO_CPID,                                "0 0", _("^K1You were frozen by ^BG%s"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_DROPPED,                            1, 0, "s1",                             CPID_KEEPAWAY,                  "0 0", _("^BG%s^BG has dropped the ball!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_PICKUP,                                     1, 0, "s1",                             CPID_KEEPAWAY,                  "0 0", _("^BG%s^BG has picked up the ball!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_WARN,                                       0, 0, "",                                       CPID_KA_WARN,                   "0 0", _("^BGKilling people while you don't have the ball gives no points!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK,                                       0, 0, "",                                       CPID_LMS_CAMP,                  "0 0", _("^K1Don't camp!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_JOIN_NOSPAWNS,                                       0, 0, "",                                       CPID_PREVENT_JOIN,              "0 0", _("^K1No spawnpoints available!\nHope your team can fix it..."), "") \
-       MSG_CENTER_NOTIF(1, CENTER_JOIN_PREVENT,                                        0, 0, "",                                       CPID_PREVENT_JOIN,              "0 0", _("^K1You may not join the game at this time.\nThe player limit reached maximum capacity."), "") \
-       MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME,                                       0, 1, "f1",                                     CPID_OVERTIME,                  "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nAdded ^F4%s ^F2minute(s) to the game!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG,                                       0, 0, "",                                       CPID_OVERTIME,                  "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \
-       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY,                      0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Invisibility has worn off"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SHIELD,                            0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Shield has worn off"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SPEED,                                     0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Speed has worn off"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_STRENGTH,                          0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Strength has worn off"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_POWERUP_INVISIBILITY,                        0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2You are invisible"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_POWERUP_SHIELD,                                      0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Shield surrounds you"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_POWERUP_SPEED,                                       0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2You are on speed"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_POWERUP_STRENGTH,                            0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Strength infuses your weapons with devastating power"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_RACE_FINISHLAP,                                      0, 0, "",                                       CPID_RACE_FINISHLAP,    "0 0", _("^F2The race is over, finish your lap!"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_SUPERWEAPON_BROKEN,                          0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Superweapons have broken down"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_SUPERWEAPON_PICKUP,                          0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2You now have a superweapon"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_SUPERWEAPON_LOST,                            0, 0, "",                                       CPID_POWERUP,                   "0 0", _("^F2Superweapons have been lost"), "") \
+       MULTITEAM_CENTER(1, CENTER_FREEZETAG_ROUND_WIN_, 4,                     0, 0, "",                               NO_CPID,                                "0 0", _("^TC^TT^BG team wins the round, all other teams were frozen"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SPAWN_LATE,                        0, 0, "",                               NO_CPID,                                "0 0", _("^K1You spawned after the round started, you'll spawn as frozen"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE,                            1, 0, "s1",                             NO_CPID,                                "0 0", _("^K3You revived ^BG%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVED,                           1, 0, "s1",                             NO_CPID,                                "0 0", _("^K3You were revived by ^BG%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_SELF,                                      0, 0, "",                               NO_CPID,                                "0 0", _("^K1You froze yourself"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FREEZE,                            1, 0, "s1",                             NO_CPID,                                "0 0", _("^K3You froze ^BG%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FROZEN,                            1, 0, "s1",                             NO_CPID,                                "0 0", _("^K1You were frozen by ^BG%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_DROPPED,                            1, 0, "s1",                     CPID_KEEPAWAY,                  "0 0", _("^BG%s^BG has dropped the ball!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_PICKUP,                                     1, 0, "s1",                     CPID_KEEPAWAY,                  "0 0", _("^BG%s^BG has picked up the ball!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_KEEPAWAY_WARN,                                       0, 0, "",                               CPID_KA_WARN,                   "0 0", _("^BGKilling people while you don't have the ball gives no points!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK,                                       0, 0, "",                               CPID_LMS_CAMP,                  "0 0", _("^F2Don't camp!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO,                                     0, 0, "",                               CPID_MINSTA_FINDAMMO,   "1 9", _("^F4^COUNT^BG left to find some ammo!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO_FIRST,                       0, 0, "",                               CPID_MINSTA_FINDAMMO,   "1 10", _("^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"), _("Get some ammo! ^F4^COUNT^BG left!")) \
+       MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN,                                       0, 2, "weapon",                 CPID_NIX,                               "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON,                                       0, 1, "weapon",                 CPID_NIX,                               "0 0", _("^F2Active weapon: ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_JOIN_NOSPAWNS,                                       0, 0, "",                               CPID_PREVENT_JOIN,              "0 0", _("^K1No spawnpoints available!\nHope your team can fix it..."), "") \
+       MSG_CENTER_NOTIF(1, CENTER_JOIN_PREVENT,                                        0, 0, "",                               CPID_PREVENT_JOIN,              "0 0", _("^K1You may not join the game at this time.\nThe player limit reached maximum capacity."), "") \
+       MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME,                                       0, 1, "f1time",                 CPID_OVERTIME,                  "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nAdded ^F4%s ^F2minute(s) to the game!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG,                                       0, 0, "",                               CPID_OVERTIME,                  "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \
+       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY,                      0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Invisibility has worn off"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SHIELD,                            0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Shield has worn off"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SPEED,                                     0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Speed has worn off"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_STRENGTH,                          0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Strength has worn off"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_POWERUP_INVISIBILITY,                        0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2You are invisible"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_POWERUP_SHIELD,                                      0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Shield surrounds you"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_POWERUP_SPEED,                                       0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2You are on speed"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_POWERUP_STRENGTH,                            0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Strength infuses your weapons with devastating power"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_RACE_FINISHLAP,                                      0, 0, "",                               CPID_RACE_FINISHLAP,    "0 0", _("^F2The race is over, finish your lap!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_SUPERWEAPON_BROKEN,                          0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Superweapons have broken down"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_SUPERWEAPON_PICKUP,                          0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2You now have a superweapon"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_SUPERWEAPON_LOST,                            0, 0, "",                               CPID_POWERUP,                   "0 0", _("^F2Superweapons have been lost"), "") \
        MULTITEAM_CENTER(1, CENTER_TEAMCHANGE_, 4,                                      0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^BGChanging to ^TC^TT^BG in ^COUNT"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SPECTATE,                         0, 1, "",                       CPID_TEAMCHANGE,                "1 f1", _("^BGSpectating in ^COUNT"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_AUTO,                                     0, 1, "",                       CPID_TEAMCHANGE,                "1 f1", _("^BGChanging team in ^COUNT"), "") \
-       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE,                          0, 1, "",                       CPID_TEAMCHANGE,                "1 f1", _("^K1Suicide in ^COUNT"), "")
+       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SPECTATE,                         0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^BGSpectating in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_AUTO,                                     0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^BGChanging team in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE,                          0, 1, "",                               CPID_TEAMCHANGE,                "1 f1", _("^K1Suicide in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_BEGINNING,                           0, 1, "",                               CPID_TIMEOUT,                   "1 f1", _("^F4Timeout begins in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING,                                      0, 1, "",                               CPID_TIMEOUT,                   "1 f1", _("^F4Timeout ends in ^COUNT"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_WEAPON_GOTWEP,                                       0, 1, "item_wepname",                           CPID_ITEM,      "item_centime 0", _("^BGYou got the ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_WEAPON_DROPPED,                                      1, 1, "item_wepname item_wepammo",      CPID_ITEM,      "item_centime 0", _("^BGYou dropped the ^F1%s^BG%s"), "")
 
 #define MSG_WEAPON_NOTIFICATIONS \
        /*MSG_WEAPON_NOTIF(1, WEAPON_EMPTY,                                                     NO_MSG,                                                                         NO_MSG)*/ \
+       MSG_WEAPON_NOTIF(1, WEAPON_GOTWEP,                                                      INFO_WEAPON_GOTWEP,                                                     CENTER_WEAPON_GOTWEP) \
+       MSG_WEAPON_NOTIF(1, WEAPON_DROPPED,                                                     INFO_WEAPON_DROPPED,                                            CENTER_WEAPON_DROPPED) \
        MSG_WEAPON_NOTIF(1, WEAPON_THINKING_WITH_PORTALS,                       INFO_WEAPON_THINKING_WITH_PORTALS,                      CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(1, WEAPON_CRYLINK_SUICIDE,                             INFO_WEAPON_CRYLINK_SUICIDE,                            CENTER_DEATH_SELF_GENERIC) \
        MSG_WEAPON_NOTIF(1, WEAPON_CRYLINK_MURDER,                                      INFO_WEAPON_CRYLINK_MURDER,                             NO_MSG) \
@@ -536,11 +559,16 @@ void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration,
 
 #define NOTIF_ADD_AUTOCVAR(name,default) var float autocvar_notification_##name = default;
 
+var float autocvar_notification_show_location = FALSE;
+var string autocvar_notification_show_location_string = ""; //_(" at the %s");
 var float autocvar_notification_show_sprees = TRUE;
 var float autocvar_notification_show_sprees_info = 3; // 0 = off, 1 = target only, 2 = attacker only, 3 = target and attacker
 var float autocvar_notification_show_sprees_info_newline = FALSE;
 var float autocvar_notification_show_sprees_info_specialonly = TRUE;
+var float autocvar_notification_item_centerprinttime = 1.5;
 var float autocvar_notification_errors_are_fatal = TRUE;
+var float autocvar_notification_lifetime_runtime = 0.5;
+var float autocvar_notification_lifetime_mapload = 10;
 
 #ifdef SVQC
 .float FRAG_VERBOSE;
@@ -555,7 +583,7 @@ var float autocvar_notification_frag_verbose = TRUE;
 
 // ============================
 //  Notification Argument List
-// ============================
+// ============================ TODO UPDATE THIS
 /*
  These arguments get replaced with the Local_Notification_sprintf
  and Local_Notification_HUD_Notify_Push functions to supply data
@@ -590,16 +618,54 @@ var float autocvar_notification_frag_verbose = TRUE;
 
 #define NOTIF_MAX_ARGS 7
 #define NOTIF_MAX_HUDARGS 2
+#define NOTIF_MAX_DURCNT 2
 
 string arg_slot[NOTIF_MAX_ARGS];
 
-#define ARG_DOUBLE 1 // enabled on CSQC and SVQC
-#define ARG_TRIPLE 2 // same as double, but also included with hudargs
-#define ARG_CSQC 3 // unique result to CSQC
-#define ARG_SVQC 4 // unique result to SVQC
+#define ARG_CS_SV_HA 1 // enabled on CSQC, SVQC, and Hudargs
+#define ARG_CS_SV_DC 2 // enabled on CSQC, SVQC, and durcnt centerprint
+#define ARG_CS_SV 3 // enabled on CSQC and SVQC
+#define ARG_CS 4 // unique result to CSQC
+#define ARG_SV 5 // unique result to SVQC
+#define ARG_DC 6 // unique result to durcnt/centerprint
+
+// todo possible idea.... declare how many floats/strings each arg needs, and then dynamically increment the input
+// this way, we don't need to have duplicates like i.e. s2loc and s3loc
+
+#define NOTIF_ARGUMENT_LIST \
+       ARG_CASE(ARG_CS_SV_HA,          "s1",                           s1) \
+       ARG_CASE(ARG_CS_SV_HA,          "s2",                           s2) \
+       ARG_CASE(ARG_CS_SV_HA,          "s3",                           s3) \
+       ARG_CASE(ARG_CS_SV_HA,          "s4",                           s4) \
+       ARG_CASE(ARG_CS_SV,             "s2loc",                        (autocvar_notification_show_location ? sprintf(( ((tmp_s = autocvar_notification_show_location_string) != "") ? tmp_s : _(" (near %s)") ), s2) : "")) \
+       ARG_CASE(ARG_CS_SV,             "s3loc",                        (autocvar_notification_show_location ? sprintf(( ((tmp_s = autocvar_notification_show_location_string) != "") ? tmp_s : _(" (near %s)") ), s3) : "")) \
+       ARG_CASE(ARG_CS_SV_DC,          "f1",                           ftos(f1)) \
+       ARG_CASE(ARG_CS_SV_DC,          "f2",                           ftos(f2)) \
+       ARG_CASE(ARG_CS_SV,             "f3",                           ftos(f3)) \
+       ARG_CASE(ARG_CS_SV,             "f4",                           ftos(f4)) \
+       ARG_CASE(ARG_CS_SV,             "f1p2dec",                      ftos_decimals(f1/100, 2)) \
+       ARG_CASE(ARG_CS_SV,             "f2p2dec",                      ftos_decimals(f2/100, 2)) \
+       ARG_CASE(ARG_CS,                        "f1secs",                       count_seconds(f1)) \
+       ARG_CASE(ARG_CS_SV,                     "f1ord",                        count_ordinal(f1)) \
+       ARG_CASE(ARG_CS,                        "f1time",                       process_time("foobar", f1)) \
+       ARG_CASE(ARG_CS,                        "pass_key",             ((((tmp_s = getcommandkey("pass", "+use")) != "pass") && !(strstrofs(tmp_s, "not bound", 0) >= 0)) ? sprintf(CCR(_(" ^F1(Press %s)")), tmp_s) : "")) \
+       ARG_CASE(ARG_CS,                        "frag_ping",            ((f2 != NO_MSG) ? sprintf(CCR(_("\n(Ping ^2%d^BG)")), f2) : "")) \
+       ARG_CASE(ARG_CS,                        "frag_stats",           sprintf(CCR(_("\n(Health ^1%d^BG / Armor ^2%d^BG)%s")), f2, f3, ((f4 != NO_MSG) ? sprintf(CCR(_(" (Ping ^2%d^BG)")), f4) : ""))) \
+       /*ARG_CASE(ARG_CS,                      "frag_pos",                     ((Should_Print_Score_Pos(f1)) ? sprintf("\n^BG%s", Read_Score_Pos(f1)) : ""))*/ \
+       ARG_CASE(ARG_CS,                        "spree_cen",            (autocvar_notification_show_sprees ? notif_arg_spree_cen(f1) : "")) \
+       ARG_CASE(ARG_CS_SV,             "spree_inf",            (autocvar_notification_show_sprees ? notif_arg_spree_inf(1, input, s2, f2) : "")) \
+       ARG_CASE(ARG_CS_SV,             "spree_end",            (autocvar_notification_show_sprees ? notif_arg_spree_inf(-1, "", "", f1) : "")) \
+       ARG_CASE(ARG_CS_SV,             "spree_lost",           (autocvar_notification_show_sprees ? notif_arg_spree_inf(-2, "", "", f1) : "")) \
+       ARG_CASE(ARG_CS_SV,             "item_wepname",         W_Name(f1)) \
+       ARG_CASE(ARG_CS_SV,                     "item_wepammo",         (s1 != "" ? s1 : "")) \
+       ARG_CASE(ARG_DC,                "item_centime",         ftos(autocvar_notification_item_centerprinttime)) \
+       ARG_CASE(ARG_SV,                        "death_team",           Team_ColoredFullName(f1)) \
+       ARG_CASE(ARG_CS,                        "death_team",           Team_ColoredFullName(f1 - 1)) \
+       ARG_CASE(ARG_CS_SV,                     "race_time",            mmssss(f2)) \
+       ARG_CASE(ARG_CS_SV,             "race_diff",            ((f2 > f3) ? sprintf(CCR("^1[+%s]"), mmssss(f2 - f3)) : sprintf(CCR("^2[-%s]"), mmssss(f3 - f2))))
 
 #define NOTIF_HIT_MAX(count,funcname) if(sel_num == count) { backtrace(sprintf("%s: Hit maximum arguments!\n", funcname)); break; }
-#define NOTIF_HIT_UNKNOWN(token,funcname) default: { backtrace(sprintf("%s: Hit unknown token in selected string! '%s'\n", funcname, selected)); break; }
+#define NOTIF_HIT_UNKNOWN(token,funcname) { backtrace(sprintf("%s: Hit unknown token in selected string! '%s'\n", funcname, selected)); break; }
 
 #define KILL_SPREE_LIST \
        SPREE_ITEM(3, 03, _("TRIPLE FRAG! "), _("%s^K1 made a TRIPLE FRAG! %s^BG"), _("%s^K1 made a TRIPLE SCORE! %s^BG")) \
@@ -752,34 +818,6 @@ string notif_arg_spree_inf(float type, string input, string player, float spree)
        return "";
 }
 
-#define NOTIF_ARGUMENT_LIST \
-       ARG_CASE(ARG_TRIPLE, "s1",                              s1) \
-       ARG_CASE(ARG_TRIPLE, "s2",                              s2) \
-       ARG_CASE(ARG_TRIPLE, "s3",                              s3) \
-       ARG_CASE(ARG_TRIPLE, "s4",                              s4) \
-       ARG_CASE(ARG_DOUBLE, "f1",                              ftos(f1)) \
-       ARG_CASE(ARG_DOUBLE, "f2",                              ftos(f2)) \
-       ARG_CASE(ARG_DOUBLE, "f3",                              ftos(f3)) \
-       ARG_CASE(ARG_DOUBLE, "f4",                              ftos(f4)) \
-       ARG_CASE(ARG_DOUBLE, "f1p2dec",                 ftos_decimals(f1/100, 2)) \
-       ARG_CASE(ARG_DOUBLE, "f2p2dec",                 ftos_decimals(f2/100, 2)) \
-       ARG_CASE(ARG_CSQC, "f1secs",                    count_seconds(f1)) \
-       ARG_CASE(ARG_CSQC, "pass_key",                  ((((tmp_s = getcommandkey("pass", "+use")) != "pass") && !(strstrofs(tmp_s, "not bound", 0) >= 0)) ? sprintf(CCR(_(" ^F1(Press %s)")), tmp_s) : "")) \
-       ARG_CASE(ARG_CSQC, "frag_ping",                 ((f2 != NO_MSG) ? sprintf(CCR(_("\n(Ping ^2%d^BG)")), f2) : "")) \
-       ARG_CASE(ARG_CSQC, "frag_stats",                sprintf(CCR(_("\n(Health ^1%d^BG / Armor ^2%d^BG)%s")), f2, f3, ((f4 != NO_MSG) ? sprintf(CCR(_(" (Ping ^2%d^BG)")), f4) : ""))) \
-       /*ARG_CASE(ARG_CSQC, "frag_pos",                ((Should_Print_Score_Pos(f1)) ? sprintf("\n^BG%s", Read_Score_Pos(f1)) : ""))*/ \
-       ARG_CASE(ARG_CSQC, "spree_cen",                 (autocvar_notification_show_sprees ? notif_arg_spree_cen(f1) : "")) \
-       ARG_CASE(ARG_CSQC, "spree_inf",                 (autocvar_notification_show_sprees ? notif_arg_spree_inf(1, input, s2, f2) : "")) \
-       ARG_CASE(ARG_CSQC, "spree_end",                 (autocvar_notification_show_sprees ? notif_arg_spree_inf(-1, "", "", f1) : "")) \
-       ARG_CASE(ARG_CSQC, "spree_lost",                (autocvar_notification_show_sprees ? notif_arg_spree_inf(-2, "", "", f1) : "")) \
-       ARG_CASE(ARG_CSQC, "death_team",                Team_ColoredFullName(f1 - 1)) \
-       ARG_CASE(ARG_CSQC, "weapon_name",               ftos(f1)) \
-       ARG_CASE(ARG_SVQC, "spree_inf",                 (autocvar_notification_show_sprees ? notif_arg_spree_inf(1, input, s2, f2) : "")) \
-       ARG_CASE(ARG_SVQC, "spree_end",                 (autocvar_notification_show_sprees ? notif_arg_spree_inf(-1, "", "", f1) : "")) \
-       ARG_CASE(ARG_SVQC, "spree_lost",                (autocvar_notification_show_sprees ? notif_arg_spree_inf(-2, "", "", f1) : "")) \
-       ARG_CASE(ARG_SVQC, "death_team",                Team_ColoredFullName(f1)) \
-       ARG_CASE(ARG_SVQC, "weapon_name",               ftos(f1))
-       
 
 // ====================================
 //  Initialization/Create Declarations
@@ -818,7 +856,7 @@ float NOTIF_CPID_COUNT;
 .string nent_hudargs;
 .string nent_icon;
 .float nent_cpid;
-.string nent_durcnt; // if(durcnt != "") { notif.nent_durcnt = durcnt; }
+.string nent_durcnt;
 .string nent_string;
 
 // networked notification values
@@ -837,13 +875,13 @@ string Process_Notif_Line(float check_newline, float chat, string input, string
                if((chat && autocvar_notification_allow_chatboxprint)
                        || (autocvar_notification_allow_chatboxprint == 2))
                {
-                       // pass 1: add STX char at beginning of line
+                       // pass 1: add ETX char at beginning of line
                        input = strcat("\{3}", input);
 
-                       // pass 2: add STX char at end of each new line (so that messages with multiple lines are put through chatbox too)
+                       // pass 2: add ETX char at end of each new line (so that messages with multiple lines are put through chatbox too)
                        input = strreplace("\n", "\n\{3}", input);
 
-                       // pass 3: strip trailing STX char
+                       // pass 3: strip trailing ETX char
                        if(substring(input, (strlen(input) - 1), 1) == "\{3}")
                                { input = substring(input, 0, (strlen(input) - 1)); }
                }
@@ -858,39 +896,100 @@ string Process_Notif_Line(float check_newline, float chat, string input, string
        return input;
 }
 
-string Process_Notif_Args(float is_hudargs, string args, string notiftype, string notifname)
+string Process_Notif_Args(float arg_type, string args, string notiftype, string notifname)
 {
        string selected, remaining = args;
        float sel_num = 0;
-       float maxargs = (is_hudargs ? NOTIF_MAX_HUDARGS : NOTIF_MAX_ARGS);
 
        for(;(remaining != "");)
        {
                selected = car(remaining); remaining = cdr(remaining);
 
-               if(sel_num == maxargs)
+               switch(arg_type)
                {
-                       print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max %s = %d.\n",
-                               notiftype, notifname, (is_hudargs ? "hudargs" : "args"), maxargs));
-                       notif_error = TRUE;
-                       break;
-               }
+                       case 1: // normal args
+                       {
+                               if(sel_num == NOTIF_MAX_ARGS)
+                               {
+                                       print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max args = %d.\n",
+                                               notiftype, notifname, NOTIF_MAX_ARGS));
+                                       notif_error = TRUE;
+                                       break;
+                               }
 
-               switch(strtolower(selected))
-               {
-                       #define ARG_CASE(prog,selected,result) \
-                               #if (prog == ARG_TRIPLE) \
-                                       case selected: { ++sel_num; break; } \
-                               #else \
-                                       case selected: { if(!is_hudargs) { ++sel_num; break; } } \
-                               #endif
-                       NOTIF_ARGUMENT_LIST
-                       #undef ARG_CASE
-                       default:
+                               switch(strtolower(selected))
+                               {
+                                       #define ARG_CASE(prog,selected,result) case selected: { ++sel_num; break; }
+                                       NOTIF_ARGUMENT_LIST
+                                       #undef ARG_CASE
+                                       default:
+                                       {
+                                               print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, args arg = '%s'.\n",
+                                                       notiftype, notifname, selected));
+                                               notif_error = TRUE;
+                                               break;
+                                       }
+                               }
+                               break;
+                       }
+                       case 2: // hudargs
+                       {
+                               if(sel_num == NOTIF_MAX_HUDARGS)
+                               {
+                                       print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max hudargs = %d.\n",
+                                               notiftype, notifname, NOTIF_MAX_HUDARGS));
+                                       notif_error = TRUE;
+                                       break;
+                               }
+
+                               switch(strtolower(selected))
+                               {
+                                       #define ARG_CASE(prog,selected,result) \
+                                               #if (prog == ARG_CS_SV_HA) \
+                                                       case selected: { ++sel_num; break; } \
+                                               #endif
+                                       NOTIF_ARGUMENT_LIST
+                                       #undef ARG_CASE
+                                       default:
+                                       {
+                                               print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, hudargs arg = '%s'.\n",
+                                                       notiftype, notifname, selected));
+                                               notif_error = TRUE;
+                                               break;
+                                       }
+                               }
+                               break;
+                       }
+                       case 3: // durcnt 
                        {
-                               print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, %s = '%s'.\n",
-                                       notiftype, notifname, (is_hudargs ? "hudargs" : "args"), selected));
-                               notif_error = TRUE;
+                               if(sel_num == NOTIF_MAX_DURCNT)
+                               {
+                                       print(sprintf("^1NOTIFICATION HAS TOO MANY ARGUMENTS: ^7net_type = MSG_%s, net_name = %s, max durcnt = %d.\n",
+                                               notiftype, notifname, NOTIF_MAX_DURCNT));
+                                       notif_error = TRUE;
+                                       break;
+                               }
+
+                               switch(strtolower(selected))
+                               {
+                                       #define ARG_CASE(prog,selected,result) \
+                                               #if (prog == ARG_CS_SV_DC) || (prog == ARG_DC) \
+                                                       case selected: { ++sel_num; break; } \
+                                               #endif
+                                       NOTIF_ARGUMENT_LIST
+                                       #undef ARG_CASE
+                                       default:
+                                       {
+                                               if(ftos(stof(selected)) != "") { ++sel_num; }
+                                               else
+                                               {
+                                                       print(sprintf("^1NOTIFICATION WITH UNKNOWN TOKEN IN ARGUMENT STRING: ^7net_type = MSG_%s, net_name = %s, durcnt arg = '%s'.\n",
+                                                               notiftype, notifname, selected));
+                                                       notif_error = TRUE;
+                                               }
+                                               break;
+                                       }
+                               }
                                break;
                        }
                }
@@ -899,7 +998,10 @@ string Process_Notif_Args(float is_hudargs, string args, string notiftype, strin
 }
 
 #define CREATE_NOTIF_ENTITY(default,type,name,infoname,centername,strnum,flnum,args,hudargs,icon,cpid,durcnt,normal,gentle,check_newline,subcalls) \
+{ \
        notif_error = FALSE; \
+       \
+       /* global entity setup */ \
        entity notif = spawn(); \
        msg_##type##_notifs[name - 1] = notif; \
        notif.classname = "msg_#type#_notification"; \
@@ -907,7 +1009,9 @@ string Process_Notif_Args(float is_hudargs, string args, string notiftype, strin
        notif.nent_name = strzone(#name); \
        notif.nent_id = name; \
        notif.nent_enabled = (1 <= autocvar_notification_##name); \
-       #if subcalls \
+       \
+       /* notification specific settings */ \
+       #if subcalls /* MSG_DEATH and MSG_WEAPON */ \
                #if (infoname == NO_MSG) && (centername == NO_MSG) \
                        print(sprintf("^1NOTIFICATION WITH NO SUBCALLS: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); \
                        notif_error = TRUE; \
@@ -923,31 +1027,66 @@ string Process_Notif_Args(float is_hudargs, string args, string notiftype, strin
                                centername_stringcount = notif.nent_msgcenter.nent_stringcount; \
                                centername_floatcount = notif.nent_msgcenter.nent_floatcount; \
                        #endif \
+                       /* set the requirements of THIS notification to the total requirements of its subcalls */ \
                        notif.nent_stringcount = max(infoname_stringcount, centername_stringcount); \
                        notif.nent_floatcount = max(infoname_floatcount, centername_floatcount); \
                #endif \
-       #else \
-               float nent_chat = (autocvar_notification_##name > 1); \
+       #else /* MSG_INFO and MSG_CENTER */ \
                notif.nent_stringcount = strnum; \
                notif.nent_floatcount = flnum; \
-               if(args != "") { notif.nent_args = strzone(Process_Notif_Args(FALSE, args, strtoupper(#type), #name)); } \
-               if(hudargs != "") { notif.nent_hudargs = strzone(Process_Notif_Args(TRUE, hudargs, strtoupper(#type), #name)); } \
-               if(icon != "") { notif.nent_icon = strzone(icon); } \
-               if(cpid != NO_MSG) { notif.nent_cpid = cpid; } \
-               if(durcnt != "") { notif.nent_durcnt = strzone(durcnt); } \
-               if(GENTLE) \
-               { \
-                       if(gentle != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, gentle, strtoupper(#type), #name, "GENTLE"))); } \
+               \
+               /* only initialize this information if we're on a client or a dedicated server */ \
+               #ifdef SVQC \
+               if(server_is_dedicated) { \
+               #endif \
+               \
+                       if(strnum + flnum) \
+                       { \
+                               if(args != "") { notif.nent_args = strzone(Process_Notif_Args(1, args, strtoupper(#type), #name)); } \
+                               else if((hudargs == "") && (durcnt =="")) { print(sprintf("^1NOTIFICATION HAS ARG COUNTS BUT NO ARGS OR HUDARGS OR DURCNT: ^7net_type = MSG_%s, net_name = %s, strnum = %d, flnum = %d\n", strtoupper(#type), #name, strnum, flnum)); notif_error = TRUE; } \
+                       } \
+                       else if(args != "") { notif.nent_args = strzone(Process_Notif_Args(1, args, strtoupper(#type), #name)); } \
+                       \
+                       /* MSG_INFO only */ \
+                       if(hudargs != "") \
+                       { \
+                               notif.nent_hudargs = strzone(Process_Notif_Args(2, hudargs, strtoupper(#type), #name)); \
+                               if(icon != "") { notif.nent_icon = strzone(icon); } \
+                               else { print(sprintf("^1NOTIFICATION HAS HUDARGS BUT NO ICON: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
+                       } \
+                       else if(icon != "") { print(sprintf("^1NOTIFICATION HAS ICON BUT NO HUDARGS: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
+                       \
+                       /* MSG_CENTER only */ \
+                       if(durcnt != "") \
+                       { \
+                               notif.nent_durcnt = strzone(Process_Notif_Args(3, durcnt, strtoupper(#type), #name)); \
+                               if(cpid != NO_MSG) { notif.nent_cpid = cpid; } \
+                               else { print(sprintf("^1NOTIFICATION HAS DURCNT BUT NO CPID: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
+                       } \
+                       else if(cpid != NO_MSG) { notif.nent_cpid = cpid; } \
+                       \
+                       /* string setup */ \
+                       /* select gentle/normal string and bake color codes in on init, this way it does not need to be re-processed at run time */ \
+                       float nent_chat = (autocvar_notification_##name > 1); \
+                       if(GENTLE) \
+                       { \
+                               if(gentle != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, gentle, strtoupper(#type), #name, "GENTLE"))); } \
+                               else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, normal, strtoupper(#type), #name, "NORMAL"))); } \
+                       } \
                        else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, normal, strtoupper(#type), #name, "NORMAL"))); } \
+                       if(notif.nent_string == "") { print(sprintf("^1EMPTY NOTIFICATION: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
+               #ifdef SVQC \
                } \
-               else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, nent_chat, normal, strtoupper(#type), #name, "NORMAL"))); } \
-               if(notif.nent_string == "") { print(sprintf("^1EMPTY NOTIFICATION: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); notif_error = TRUE; } \
+               #endif \
        #endif \
+       \
+       /* now check to see if any errors happened */ \
        if(notif_error) \
        { \
-               notif.nent_enabled = FALSE; \
-               notif_global_error = TRUE; \
-       }
+               notif.nent_enabled = FALSE; /* disable the notification so it can't cause trouble */ \
+               notif_global_error = TRUE; /* throw the red flag that an error happened on init */ \
+       } \
+}
 
 #define MSG_INFO_NOTIF(default,name,strnum,flnum,args,hudargs,icon,normal,gentle) \
        NOTIF_ADD_AUTOCVAR(name, default) \
@@ -968,7 +1107,7 @@ string Process_Notif_Args(float is_hudargs, string args, string notiftype, strin
                        hudargs,        /* hudargs */ \
                        icon,           /* icon */ \
                        NO_MSG,         /* cpid */ \
-                       "",     /* durcnt */ \
+                       "",             /* durcnt */ \
                        normal,         /* normal */ \
                        gentle,         /* gentle */ \
                        1,                      /* check_newline */ \
@@ -1024,7 +1163,7 @@ string Process_Notif_Args(float is_hudargs, string args, string notiftype, strin
                        "",             /* hudargs */ \
                        "",             /* icon */ \
                        NO_MSG,         /* cpid */ \
-                       "",     /* durcnt */ \
+                       "",             /* durcnt */ \
                        "",             /* normal */ \
                        "",             /* gentle */ \
                        0,                      /* check_newline */ \
@@ -1051,7 +1190,7 @@ string Process_Notif_Args(float is_hudargs, string args, string notiftype, strin
                        "",             /* hudargs */ \
                        "",             /* icon */ \
                        NO_MSG,         /* cpid */ \
-                       "",     /* durcnt */ \
+                       "",             /* durcnt */ \
                        "",             /* normal */ \
                        "",             /* gentle */ \
                        0,                      /* check_newline */ \
@@ -1062,6 +1201,14 @@ string Process_Notif_Args(float is_hudargs, string args, string notiftype, strin
 void RegisterNotifications_First()
 {
        notif_global_error = FALSE;
+
+       #ifdef SVQC
+       #define dedi (server_is_dedicated ? "a dedicated " : "")
+       #else
+       #define dedi ""
+       #endif
+       
+       print(sprintf("Beginning notification initialization on %s%s program...\n", dedi, PROGNAME));
        
        // maybe do another implementation of this with checksums? for now, we don't need versioning
        /*if(autocvar_notification_version != NOTIF_VERSION)
@@ -1074,17 +1221,21 @@ void RegisterNotifications_First()
                        notif_global_error = TRUE;
 
                print(sprintf("^1NOTIFICATION VERSION MISMATCH: ^7program = %s, config = %d, code = %d.\n",
-                       "foobar", autocvar_notification_version, NOTIF_VERSION));
+                       PROGNAME, autocvar_notification_version, NOTIF_VERSION));
        }*/
 }
 
 void RegisterNotifications_Done()
 {
-       if(notif_global_error && autocvar_notification_errors_are_fatal)
+       if(notif_global_error)
        {
-               // shit happened... stop the loading of the program now
-               error("Notification initialization failed!");
+               // shit happened... stop the loading of the program now if this is unacceptable
+               if(autocvar_notification_errors_are_fatal)
+                       error("Notification initialization failed! Read above and fix the errors!\n");
+               else
+                       print("Notification initialization failed! Read above and fix the errors!\n");
        }
+       else { print("Notification initialization successful!\n"); }
 }
 
 // NOW we actually activate the declarations