]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Allow deaths and such to be tagged with locations (disabled by default)
authorSamual Lenks <samual@xonotic.org>
Mon, 25 Feb 2013 00:20:48 +0000 (19:20 -0500)
committerSamual Lenks <samual@xonotic.org>
Mon, 25 Feb 2013 00:20:48 +0000 (19:20 -0500)
qcsrc/common/notifications.qc
qcsrc/common/notifications.qh
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/server/command/common.qc
qcsrc/server/g_damage.qc

index 4482df616e4a648ae26a54ca82a8f1c9b8a7c287..b25dde7bd54d27537938a4485651e957bdf5667a 100644 (file)
@@ -98,6 +98,8 @@ void Dump_Notifications(float fh, float alsoprint)
        // edit these to match whichever cvars are used for specific notification options
        NOTIF_WRITE("\n// HARD CODED notification variables:\n");
        NOTIF_WRITE("seta notification_allow_chatboxprint 1 \"Allow notifications to be printed to chat box by setting notification cvar to 2 (You can also set this cvar to 2 to force ALL notifications to be printed to the chatbox)\"\n");
+       NOTIF_WRITE("seta notification_show_location 0 \"Append location information to MSG_INFO death/kill messages\"\n");
+       NOTIF_WRITE("seta notification_show_location_string \"\" \"Replacement string piped into sprintf, so you can do different messages like this: ' at the %s' or ' (near %s)'\"\n");
        NOTIF_WRITE("seta notification_show_sprees 1 \"Print information about sprees in death/kill messages\"\n");
        NOTIF_WRITE("seta notification_show_sprees_center 1 \"Show spree information in MSG_CENTER messages... 0 = off, 1 = target (but only for first victim) and attacker\"\n");
        NOTIF_WRITE("seta notification_show_sprees_center_specialonly 1 \"Don't show spree information in MSG_CENTER messages if it isn't an achievement\"\n");
@@ -145,9 +147,7 @@ string Local_Notification_sprintf(string input, string args,
        float sel_num;
        for(sel_num = 0; sel_num < NOTIF_MAX_ARGS; ++sel_num) { arg_slot[sel_num] = ""; }
 
-       #ifdef CSQC
        string tmp_s;
-       #endif
 
        for(sel_num = 0;(args != "");)
        {
index 706bc0bf1ac85a5f265569db64c206844f008805..ad0a55918266c71981f70270faf1b453f6bea806 100644 (file)
@@ -159,71 +159,71 @@ 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 loc 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 loc 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_FRAGMENT,   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"), "") \
@@ -255,55 +255,55 @@ 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(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))) \
@@ -536,6 +536,8 @@ 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;
@@ -605,6 +607,8 @@ string arg_slot[NOTIF_MAX_ARGS];
        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 : _(" at the %s") ), s2) : "")) \
+       ARG_CASE(ARG_CS_SV, "s3loc",                    (autocvar_notification_show_location ? sprintf( ( ((tmp_s = autocvar_notification_show_location_string) != "") ? tmp_s : _(" at the %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)) \
index c5a8c6446d64153f7a6200c0c118b325501a8a2f..390321c4e49fefb6971f236408979396f085d4a6 100644 (file)
@@ -2606,16 +2606,52 @@ vector animfixfps(entity e, vector a, vector b)
 }
 #endif
 
-string count_append(float interval, string zeroth, string first, string second, string third, string multi)
+string count_ordinal(float interval)
 {
        // This function is designed primarily for the English language, it's impossible
        // to accomodate all languages unless we do a specific function for each one...
        // and since that's not technically feasible/practical, this is all we've got folks.
 
        // Basically, it just allows you to represent a number or count in different ways
-       // depending on the number... like, with count_ordinal macro in util.qh you can
-       // provide integers and retrieve 1st, 2nd, 3rd, 4th, ... nth ordinal numbers in a
-       // clean and simple way. You can also use count_seconds in the same fashion.
+       // depending on the number... like, with count_ordinal you can provide integers
+       // and retrieve 1st, 2nd, 3rd, nth ordinal numbers in a clean and simple way.
+
+       switch(mod(floor(interval), 100))
+       {
+               // if the first two numbers are 11,12,13, use nth for output
+               case 11:
+               case 12:
+               case 13:
+                       { return sprintf(_("%dth"), interval); }
+               
+               default:
+               {
+                       // otherwise, check normally for 1st,2nd,3rd insertions
+                       switch(mod(interval, 10))
+                       {
+                               case 1: return sprintf(_("%dst"), interval);
+                               case 2: return sprintf(_("%dnd"), interval);
+                               case 3: return sprintf(_("%drd"), interval);
+                       }
+                       return sprintf(_("%dth"), interval);
+               }
+       }
+       return "";
+}
+
+string count_fill(float interval, string zeroth, string first, string second, string third, string multi)
+{
+       // This function is designed primarily for the English language, it's impossible
+       // to accomodate all languages unless we do a specific function for each one...
+       // and since that's not technically feasible/practical, this is all we've got folks.
+
+       // Here you can insert specific strings based on the interval number, so you could do
+       // i.e. count_seconds which outputs like this:
+       //   0 seconds
+       //   1 second
+       //   2 seconds
+       //   3 seconds
+       //   etc... minutes, hours, days, etc. 
 
        switch(floor(interval))
        {
@@ -2634,7 +2670,7 @@ string count_append(float interval, string zeroth, string first, string second,
        return "";
 }
 
-string process_time(float seconds, float output)
+string process_time(string fields, float seconds)
 {
        float tmp_hours = 0, tmp_minutes = 0, tmp_seconds = 0;
        float tmp_years = 0, tmp_weeks = 0, tmp_days = 0;
@@ -2651,8 +2687,6 @@ string process_time(float seconds, float output)
        if(tmp_hours)
                { tmp_minutes -= (tmp_hours * 60); }
 
-       if(output > 1)
-       {
                if(tmp_hours)
                        { tmp_days = floor(tmp_hours / 24); }
                        
@@ -2663,13 +2697,13 @@ string process_time(float seconds, float output)
                if(tmp_weeks)
                        { tmp_days -= (tmp_weeks * 60);
                        tmp_years = floor(tmp_weeks / 52); }
-       }
 
-       switch(output)
+       //fields = strreplace("
+       /*switch(output)
        {
                case 1: return sprintf("%02d:%02d:%02d", tmp_hours, tmp_minutes, tmp_seconds);
                //todo
                default: return "";
-       }
+       }*/
        return "";
 }
index 6511ef3b30e1e1f88787f9a43b7209470821ce24..11b2506d5052db1d6b931fc22fcc04fb1c5ca199 100644 (file)
@@ -422,27 +422,26 @@ vector vec3(float x, float y, float z);
 vector animfixfps(entity e, vector a, vector b);
 #endif
 
-#define count_seconds_decs(time,decs) count_append(time, \
-               _("%.##decs##f seconds"), /* zeroth */ \
-               _("%.##decs##f seconds"),  /* first */ \
-               _("%.##decs##f seconds"), /* second */ \
-               _("%.##decs##f seconds"), /* third */ \
-               _("%.##decs##f seconds")) /* multi */ \
-
-#define count_seconds(time) count_append(time, \
-               _("%d seconds"), /* zeroth */ \
-               _("%d second"),  /* first */ \
-               _("%d seconds"), /* second */ \
-               _("%d seconds"), /* third */ \
-               _("%d seconds")) /* multi */ \
-
-#define count_ordinal(time) count_append(time, \
-               _("0th"), /* zeroth */ \
-               _("1st"),  /* first */ \
-               _("2nd"), /* second */ \
-               _("3rd"), /* third */ \
-               _("%dth")) /* multi */ \
-
-string count_append(float time, string zeroth, string first, string second, string third, string multi);
-
-string process_time(float seconds, float output);
+#define count_minutes_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s minutes")), ftos_decimals(time, decs))
+
+#define count_minutes(time) count_fill(time, \
+               ZCTX(_("CI_ZER^%d minutes")), /* zeroth */ \
+               ZCTX(_("CI_FIR^%d minute")),  /* first */ \
+               ZCTX(_("CI_SEC^%d minutes")), /* minute */ \
+               ZCTX(_("CI_THI^%d minutes")), /* third */ \
+               ZCTX(_("CI_MUL^%d minutes"))) /* multi */
+
+#define count_seconds_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s seconds")), ftos_decimals(time, decs))
+
+#define count_seconds(time) count_fill(time, \
+               ZCTX(_("CI_ZER^%d seconds")), /* zeroth */ \
+               ZCTX(_("CI_FIR^%d second")),  /* first */ \
+               ZCTX(_("CI_SEC^%d seconds")), /* second */ \
+               ZCTX(_("CI_THI^%d seconds")), /* third */ \
+               ZCTX(_("CI_MUL^%d seconds"))) /* multi */
+
+string count_ordinal(float interval);
+
+string count_fill(float interval, string zeroth, string first, string second, string third, string multi);
+
+string process_time(string fields, float seconds);
index f7cd98ad7055b7f91b00b211022468d93892e99b..516c6aa5d8fab4148aee264e7f4d9c63569e77f1 100644 (file)
@@ -644,7 +644,7 @@ void CommonCommand_who(float request, entity caller, float argc)
                                        tmp_player.netname,
                                        tmp_player.ping, 
                                        tmp_player.ping_packetloss, 
-                                       process_time(time - tmp_player.jointime, 1),
+                                       process_time("%02d:%02d:%02d", time - tmp_player.jointime),
                                        tmp_netaddress,
                                        tmp_crypto_idfp));
                                
index 066fdcf1046c81e7b50b58cbc5b42a6bc973e6c7..ac303dc05ea2bb5c74f4b960713c99aaebd68d41 100644 (file)
@@ -299,7 +299,7 @@ void LogDeath(string mode, float deathtype, entity killer, entity killed)
 
 #define INFO_NO_MSG 0
 
-void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, string s1, string s2, float f1, float f2, float f3)
+void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, string s1, string s2, string s3, float f1, float f2, float f3)
 {
        float handled = 0, hits = 0;
        if(DEATH_ISSPECIAL(deathtype))
@@ -310,16 +310,16 @@ void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, s
                                #if msg_death != NO_MSG \
                                        if not(murder) \
                                        { \
-                                               Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_DEATH, msg_death, s1, s2, "", "", f1, f2, f3, 0); \
-                                               Send_Notification_WOVA(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death, s1, s2, "", "", f1, f2, f3, 0); \
+                                               Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_DEATH, msg_death, s1, s2, s3, "", f1, f2, f3, 0); \
+                                               Send_Notification_WOVA(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death, s1, s2, s3, "", f1, f2, f3, 0); \
                                                ++handled; \
                                        } \
                                #endif \
                                #if msg_death_by != NO_MSG \
                                        if(murder) \
                                        { \
-                                               Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_DEATH, msg_death_by, s1, s2, "", "", f1, f2, f3, 0); \
-                                               Send_Notification_WOVA(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death_by, s1, s2, "", "", f1, f2, f3, 0); \
+                                               Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_DEATH, msg_death_by, s1, s2, s3, "", f1, f2, f3, 0); \
+                                               Send_Notification_WOVA(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death_by, s1, s2, s3, "", f1, f2, f3, 0); \
                                                ++handled; \
                                        } \
                                #endif \
@@ -342,7 +342,7 @@ void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, s
 }
 
 float w_deathtype;
-float Obituary_WeaponDeath(entity notif_target, float murder, float deathtype, string s1, string s2, float f1, float f2)
+float Obituary_WeaponDeath(entity notif_target, float murder, float deathtype, string s1, string s2, string s3, float f1, float f2)
 {
        float death_weapon = DEATH_WEAPONOF(deathtype);
 
@@ -354,8 +354,8 @@ float Obituary_WeaponDeath(entity notif_target, float murder, float deathtype, s
 
                if(death_message)
                {
-                       Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_WEAPON, death_message, s1, s2, "", "", f1, f2, 0, 0);
-                       Send_Notification_WOVA(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, msg_weapon_notifs[death_message - 1].nent_msginfo.nent_id, s1, s2, "", "", f1, f2, 0, 0);
+                       Send_Notification_WOVA(NOTIF_ONE, notif_target, MSG_WEAPON, death_message, s1, s2, s3, "", f1, f2, 0, 0);
+                       Send_Notification_WOVA(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, msg_weapon_notifs[death_message - 1].nent_msginfo.nent_id, s1, s2, s3, "", f1, f2, 0, 0);
                        //print(Get_Field_Value(F_INFVAL, MSG_WEAPON, death_message), "\n");
                }
                else { dprint(sprintf("Obituary_WeaponDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification for weapon %d!\n", Deathtype_Name(deathtype), deathtype, death_weapon)); }
@@ -372,6 +372,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
 
        // Declarations
        float notif_firstblood = FALSE;
+       string deathlocation = NearestLocation(targ.origin);
 
        //dprint(sprintf("Obituary(): Deathtype = %s (%d), Attacker = %s, Inflictor = %s, Target = %s...\n", Deathtype_Name(deathtype), deathtype, attacker.netname, inflictor.netname, targ.netname));
 
@@ -384,7 +385,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                {
                        if(deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
                        {
-                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, "", targ.team, 0, 0);
+                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, deathlocation, "", targ.team, 0, 0);
                        }
                        else
                        {
@@ -392,13 +393,13 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                                {
                                        case DEATH_MIRRORDAMAGE:
                                        {
-                                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, "", targ.killcount, 0, 0);
+                                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, deathlocation, "", targ.killcount, 0, 0);
                                                break;
                                        }
                                        
                                        default:
                                        {
-                                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, "", targ.killcount, 0, 0);
+                                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, deathlocation, "", targ.killcount, 0, 0);
                                                break;
                                        }
                                }
@@ -406,7 +407,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                                GiveFrags(attacker, targ, -1, deathtype);
                        }
                }
-               else if not(Obituary_WeaponDeath(targ, FALSE, deathtype, targ.netname, "", targ.killcount, 0))
+               else if not(Obituary_WeaponDeath(targ, FALSE, deathtype, targ.netname, deathlocation, "", targ.killcount, 0))
                {
                        backtrace("SUICIDE: what the hell happened here?\n");
                }
@@ -499,8 +500,8 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                                        Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_DEATH_MURDER_FRAGGED, attacker.netname, kill_count_to_target);
                        }
 
-                       if not(Obituary_WeaponDeath(targ, TRUE, deathtype, targ.netname, attacker.netname, targ.killcount, kill_count_to_attacker))
-                               Obituary_SpecialDeath(targ, TRUE, deathtype, targ.netname, attacker.netname, targ.killcount, kill_count_to_attacker, 0);
+                       if not(Obituary_WeaponDeath(targ, TRUE, deathtype, targ.netname, attacker.netname, deathlocation, targ.killcount, kill_count_to_attacker))
+                               Obituary_SpecialDeath(targ, TRUE, deathtype, targ.netname, attacker.netname, deathlocation, targ.killcount, kill_count_to_attacker, 0);
                }
        }
 
@@ -527,6 +528,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                                Obituary_SpecialDeath(targ, FALSE, deathtype,
                                        targ.netname,
                                        ((strstrofs(deathmessage, "%", 0) < 0) ? strcat("%s ", deathmessage) : deathmessage),
+                                       deathlocation,
                                        targ.killcount,
                                        0,
                                        0);
@@ -535,7 +537,7 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
                        
                        default:
                        {
-                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, "", targ.killcount, 0, 0);
+                               Obituary_SpecialDeath(targ, FALSE, deathtype, targ.netname, deathlocation, "", targ.killcount, 0, 0);
                                break;
                        }
                }