Merge remote-tracking branch 'origin/master' into samual/notification_rewrite
authorSamual Lenks <samual@xonotic.org>
Wed, 13 Feb 2013 17:09:46 +0000 (12:09 -0500)
committerSamual Lenks <samual@xonotic.org>
Wed, 13 Feb 2013 17:09:46 +0000 (12:09 -0500)
Conflicts:
qcsrc/client/hud.qc
qcsrc/common/constants.qh
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/w_fireball.qc
qcsrc/server/w_rifle.qc
qcsrc/server/w_tuba.qc

23 files changed:
1  2 
defaultXonotic.cfg
qcsrc/client/Main.qc
qcsrc/client/csqcmodel_hooks.qc
qcsrc/client/hook.qc
qcsrc/client/miscfunctions.qc
qcsrc/client/waypointsprites.qc
qcsrc/common/deathtypes.qh
qcsrc/common/notifications.qh
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_player.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/w_fireball.qc
qcsrc/server/w_minstanex.qc
qcsrc/server/w_rifle.qc
qcsrc/server/w_seeker.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_tuba.qc
qcsrc/server/w_uzi.qc

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 335b356f06e0e8ca1a82fab81f66b1eda9ab13bb,0000000000000000000000000000000000000000..9ab862eba071cc7f8e06486b8355c2a40bd8f290
mode 100644,000000..100644
--- /dev/null
@@@ -1,101 -1,0 +1,101 @@@
- float HITTYPE_HEADSHOT = 0x800; // automatically set by Damage (if headshotbonus is set)
 +// Deathtypes (weapon deathtypes are the IT_* constants below)
 +// NOTE: when adding death types, please add an explanation to Docs/spamlog.txt too.
 +#define DT_FIRST 10000
 +#define DT_MAX 1024 // limit of recursive functions with ACCUMULATE_FUNCTION
 +float DT_COUNT;
 +
 +#define DT_MATCH(a,b) if(min(DT_MAX, a) == b)
 +
 +#define DEATHTYPE(name,msg_death,msg_death_by,position) \
 +      float name; \
 +      float position; \
 +      void RegisterDeathtype_##name() \
 +      { \
 +              SET_FIRST_OR_LAST(position, DT_FIRST, DT_COUNT) \
 +              SET_FIELD_COUNT(name, DT_FIRST, DT_COUNT) \
 +              CHECK_MAX_COUNT(name, DT_MAX, DT_COUNT, "deathtypes") \
 +      } \
 +      ACCUMULATE_FUNCTION(RegisterDeathtypes, RegisterDeathtype_##name)
 +
 +#define DEATHTYPES \
 +      DEATHTYPE(DEATH_FALL,                                   DEATH_SELF_FALL,                                        DEATH_MURDER_FALL,                              DEATH_SPECIAL_START) \
 +      DEATHTYPE(DEATH_TELEFRAG,                               NO_MSG,                                                         DEATH_MURDER_TELEFRAG,                  NORMAL_POS) \
 +      DEATHTYPE(DEATH_DROWN,                                  DEATH_SELF_DROWN,                                       DEATH_MURDER_DROWN,                     NORMAL_POS) \
 +      DEATHTYPE(DEATH_HURTTRIGGER,                    DEATH_SELF_VOID,                                        DEATH_MURDER_VOID,                              NORMAL_POS) \
 +      DEATHTYPE(DEATH_LAVA,                                   DEATH_SELF_LAVA,                                        DEATH_MURDER_LAVA,                              NORMAL_POS) \
 +      DEATHTYPE(DEATH_SLIME,                                  DEATH_SELF_SLIME,                                       DEATH_MURDER_SLIME,                             NORMAL_POS) \
 +      DEATHTYPE(DEATH_KILL,                                   DEATH_SELF_SUICIDE,                             NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_NOAMMO,                                 DEATH_SELF_NOAMMO,                                      NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_SWAMP,                                  DEATH_SELF_SWAMP,                                       DEATH_MURDER_SWAMP,                     NORMAL_POS) \
 +      DEATHTYPE(DEATH_TEAMCHANGE,                     DEATH_SELF_TEAMCHANGE,                          NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_AUTOTEAMCHANGE,                 DEATH_SELF_AUTOTEAMCHANGE,                      NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_CAMP,                                   DEATH_SELF_CAMP,                                        NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_SHOOTING_STAR,                  DEATH_SELF_SHOOTING_STAR,                       DEATH_MURDER_SHOOTING_STAR,     NORMAL_POS) \
 +      DEATHTYPE(DEATH_ROT,                                    DEATH_SELF_ROT,                                         NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_MIRRORDAMAGE,                   DEATH_SELF_BETRAYAL,                            NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TOUCHEXPLODE,                   DEATH_SELF_TOUCHEXPLODE,                        DEATH_MURDER_TOUCHEXPLODE,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_CHEAT,                                  DEATH_SELF_CHEAT,                                       DEATH_MURDER_CHEAT,                     NORMAL_POS) \
 +      DEATHTYPE(DEATH_FIRE,                                   DEATH_SELF_FIRE,                                        DEATH_MURDER_FIRE,                              NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_CRUSH,                               NO_MSG,                                                         DEATH_MURDER_VH_CRUSH,                  DEATH_VHFIRST) \
 +      DEATHTYPE(DEATH_VH_SPID_MINIGUN,                NO_MSG,                                                         DEATH_MURDER_VH_SPID_MINIGUN,   NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_SPID_ROCKET,                 NO_MSG,                                                         DEATH_MURDER_VH_SPID_ROCKET,    NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_SPID_DEATH,                  NO_MSG,                                                         DEATH_MURDER_VH_SPID_DEATH,             NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_WAKI_GUN,                    NO_MSG,                                                         DEATH_MURDER_VH_WAKI_GUN,               NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_WAKI_ROCKET,                 NO_MSG,                                                         DEATH_MURDER_VH_WAKI_ROCKET,            NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_WAKI_DEATH,                  NO_MSG,                                                         DEATH_MURDER_VH_WAKI_DEATH,             NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_RAPT_CANNON,                 NO_MSG,                                                         DEATH_MURDER_VH_RAPT_CANNON,    NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_RAPT_BOMB,                   NO_MSG,                                                         DEATH_MURDER_VH_RAPT_BOMB,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_RAPT_FRAGMENT,               NO_MSG,                                                         DEATH_MURDER_VH_RAPT_FRAGMENT,  NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_RAPT_DEATH,                  NO_MSG,                                                         DEATH_MURDER_VH_RAPT_DEATH,             NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_BUMB_GUN,                    NO_MSG,                                                         DEATH_MURDER_VH_BUMB_GUN,               NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_BUMB_RAY,                    NO_MSG,                                                         DEATH_MURDER_VH_BUMB_RAY,               NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_BUMB_RAY_HEAL,               NO_MSG,                                                         DEATH_MURDER_VH_BUMB_RAY_HEAL,  NORMAL_POS) \
 +      DEATHTYPE(DEATH_VH_BUMB_DEATH,                  NO_MSG,                                                         DEATH_MURDER_VH_BUMB_DEATH,             DEATH_VHLAST) \
 +      DEATHTYPE(DEATH_TURRET,                                 DEATH_SELF_TURRET,                                      NO_MSG,                                                 DEATH_TURRET_FIRST) \
 +      DEATHTYPE(DEATH_TURRET_EWHEEL,                  DEATH_SELF_TURRET_EWHEEL,                       NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_FLAC,                    DEATH_SELF_TURRET_FLAC,                         NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_MACHINEGUN,              DEATH_SELF_TURRET_MACHINEGUN,           NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_WALKER_GUN,              DEATH_SELF_TURRET_WALKER_GUN,           NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_WALKER_MEELE,    DEATH_SELF_TURRET_WALKER_MEELE,         NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_WALKER_ROCKET,   DEATH_SELF_TURRET_WALKER_ROCKET,        NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_HELLION,                 DEATH_SELF_TURRET_HELLION,                      NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_HK,                              DEATH_SELF_TURRET_HK,                           NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_MLRS,                    DEATH_SELF_TURRET_MLRS,                         NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_PLASMA,                  DEATH_SELF_TURRET_PLASMA,                       NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_PHASER,                  DEATH_SELF_TURRET_PHASER,                       NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_TURRET_TESLA,                   DEATH_SELF_TURRET_TESLA,                        NO_MSG,                                                 DEATH_TURRET_LAST) \
 +      DEATHTYPE(DEATH_GENERIC,                                DEATH_SELF_GENERIC,                             NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_WEAPON,                                 NO_MSG,                                                         NO_MSG,                                                 NORMAL_POS) \
 +      DEATHTYPE(DEATH_CUSTOM,                                 DEATH_SELF_CUSTOM,                                      NO_MSG,                                                 NORMAL_POS)
 +
 +DEATHTYPES
 +#undef DEATHTYPE
 +
 +#define DEATH_ISSPECIAL(t)                            ((t) >= DEATH_SPECIAL_START)
 +#define DEATH_ISVEHICLE(t)                            ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
 +#define DEATH_ISTURRET(t)                             ((t) >= DEATH_TURRET_FIRST && (t) <= DEATH_TURRET_LAST)
 +#define DEATH_WEAPONOFWEAPONDEATH(t)  ((t) & DEATH_WEAPONMASK)
 +#define DEATH_ISWEAPON(t,w)                           (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
 +#define DEATH_WEAPONOF(t)                             (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t))
 +#define WEP_VALID(w)                                  ((w) >= WEP_FIRST && (w) <= WEP_LAST)
 +
 +string Deathtype_Name(float deathtype)
 +{
 +      if(DEATH_ISSPECIAL(deathtype))
 +      {
 +              #define DEATHTYPE(name,msg_death,msg_death_by,position) \
 +                      { if(deathtype == max(0, name)) return VAR_TO_TEXT(name); }
 +
 +              DEATHTYPES
 +              #undef DEATHTYPE
 +      }
 +      return "foobar";
 +}
 +
 +float DEATH_WEAPONMASK = 0xFF;
 +float DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths
 +float HITTYPE_SECONDARY = 0x100;
 +float HITTYPE_SPLASH = 0x200; // automatically set by RadiusDamage
 +float HITTYPE_BOUNCE = 0x400;
++float HITTYPE_RESERVED2 = 0x800;
 +float HITTYPE_RESERVED = 0x1000; // unused yet
index cb115a4bb6715c4aef188f1cb6be4498e4363ae4,0000000000000000000000000000000000000000..4cc6da9c95e725dce161bece97ec997c717f7fa4
mode 100644,000000..100644
--- /dev/null
@@@ -1,720 -1,0 +1,717 @@@
-               #if !check_newline \
-               if(cpid != NO_MSG) { notif.nent_cpid = ((min(NOTIF_MAX, cpid) == NO_CPID) ? FALSE : cpid); } \
-               #endif \
 +// ================================================
 +//  Unified notification system, written by Samual
 +//  Last updated: February, 2013
 +// ================================================
 +
 +// 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 
 +
 +#ifndef MENUQC // SERVER AND CLIENT ONLY
 +// notification system nullified arguments
 +#define NO_STR_ARG ""
 +#define NO_FL_ARG -12345
 +#define NO_MSG -12345
 +
 +// field identifiers for Get_Field_Value()
 +#define F_NAME 1
 +#define F_INFNAME 2
 +#define F_CENNAME 3
 +#define F_INFVAL 4
 +#define F_CENVAL 5
 +#define F_STRNUM 6
 +#define F_FLNUM 7
 +
 +// ping of bots defined for extra frag message notification information
 +#define BOT_PING -1
 +
 +#define EIGHT_VARS_TO_VARARGS_VARLIST \
 +      VARITEM(1, 0, s1) \
 +      VARITEM(2, 0, XPD(s1, s2)) \
 +      VARITEM(3, 0, XPD(s1, s2, s3)) \
 +      VARITEM(4, 0, XPD(s1, s2, s3, s4)) \
 +      VARITEM(0, 1, f1) \
 +      VARITEM(1, 1, XPD(s1, f1)) \
 +      VARITEM(2, 1, XPD(s1, s2, f1)) \
 +      VARITEM(3, 1, XPD(s1, s2, s3, f1)) \
 +      VARITEM(4, 1, XPD(s1, s2, s3, s4, f1)) \
 +      VARITEM(0, 2, XPD(f1, f2)) \
 +      VARITEM(1, 2, XPD(s1, f1, f2)) \
 +      VARITEM(2, 2, XPD(s1, s2, f1, f2)) \
 +      VARITEM(3, 2, XPD(s1, s2, s3, f1, f2)) \
 +      VARITEM(4, 2, XPD(s1, s2, s3, s4, f1, f2)) \
 +      VARITEM(0, 3, XPD(f1, f2, f3)) \
 +      VARITEM(1, 3, XPD(s1, f1, f2, f3)) \
 +      VARITEM(2, 3, XPD(s1, s2, f1, f2, f3)) \
 +      VARITEM(3, 3, XPD(s1, s2, s3, f1, f2, f3)) \
 +      VARITEM(4, 3, XPD(s1, s2, s3, s4, f1, f2, f3)) \
 +      VARITEM(0, 4, XPD(f1, f2, f3, f4)) \
 +      VARITEM(1, 4, XPD(s1, f1, f2, f3, f4)) \
 +      VARITEM(2, 4, XPD(s1, s2, f1, f2, f3, f4)) \
 +      VARITEM(3, 4, XPD(s1, s2, s3, f1, f2, f3, f4)) \
 +      VARITEM(4, 4, XPD(s1, s2, s3, s4, f1, f2, f3, f4))
 +
 +entity Get_Notif_Ent(float net_type, float net_name);
 +string Get_Notif_Name(float net_type, float net_name);
 +float Get_Notif_Infval(float net_type, float net_name);
 +float Get_Notif_Cenval(float net_type, float net_name);
 +float Get_Notif_Strnum(float net_type, float net_name);
 +float Get_Notif_Flnum(float net_type, float net_name);
 +
 +void Local_Notification(float net_type, float net_name, ...count);
 +void Local_Notification_Without_VarArgs(float net_type, float net_name, float stringcount, float floatcount, string s1, string s2, string s3, string s4, float f1, float f2, float f3, float f4);
 +
 +#ifdef CSQC // CLIENT ONLY
 +#define KN_MAX_ENTRIES 10
 +
 +float kn_index;
 +float killnotify_times[KN_MAX_ENTRIES];
 +string killnotify_icon[KN_MAX_ENTRIES];
 +string killnotify_attackers[KN_MAX_ENTRIES];
 +string killnotify_victims[KN_MAX_ENTRIES];
 +void HUD_Notify_Push(string icon, string attacker, string victim);
 +void Read_Notification(float is_new);
 +#endif // ifdef CSQC
 +
 +#ifdef SVQC // SERVER ONLY
 +#define NOTIF_ONE 1
 +#define NOTIF_ONE_ONLY 2
 +#define NOTIF_TEAM 3
 +#define NOTIF_TEAM_EXCEPT 4
 +#define NOTIF_ANY 5
 +#define NOTIF_ANY_EXCEPT 6
 +
 +#define IFSTR(num) ((num < stringcount) ? ...(num, string) : NO_STR_ARG)
 +#define IFFL(num) ((((stringcount-1) + num) < count) ? ...(((stringcount-1) + num), float) : NO_FL_ARG)
 +
 +void Send_Notification(float broadcast, entity client, float net_type, float net_name, ...count);
 +void Send_Notification_Without_VarArgs(float broadcast, entity client, float net_type, float net_name, float stringcount, float floatcount, string s1, string s2, string s3, string s4, float f1, float f2, float f3, float f4);
 +void Send_Notification_Legacy_Wrapper(float broadcast, entity client, float net_type, float net_name, string s1, string s2, float f1, float f2, float f3);
 +
 +void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num);
 +void Send_CSQC_Centerprint_Generic_Expire(entity e, float id);
 +#endif // ifdef SVQC
 +#endif // ifndef MENUQC
 +
 +// MENU, SERVER, AND CLIENT
 +void Dump_Notifications(float fh, float alsoprint);
 +
 +
 +// ====================================
 +//  Notifications List and Information
 +// ====================================
 +/*
 + List of all notifications (including identifiers and display information)
 + Possible Tokens: name, infoname, centername, strnum, flnum, args, hudargs, icon, cpid, durcnt, normal, gentle
 + Format Specifications:
 +    MSG_INFO:
 +      name: VAR: Name of notification
 +      strnum: FLOAT: Number of STRING arguments (so that networking knows how many to send/receive)
 +      flnum: FLOAT: Number of FLOAT arguments (so that networking knows how many to send/receive)
 +      args: MISC: Arguments for sprintf(string, args), if no args needed then use ""
 +      hudargs: XPD(STRING, STRING): arguments for names in notify messages 
 +      icon: STRING: icon string name for the hud notify panel, "" if no icon is used
 +      normal: STRING: Normal message (string for sprintf when gentle messages are NOT enabled)
 +      gentle: STRING: Gentle message (string for sprintf when gentle messages ARE enabled)
 +    MSG_CENTER:
 +      name: VAR: Name of notification
 +      strnum: FLOAT: Number of STRING arguments (so that networking knows how many to send/receive)
 +      flnum: FLOAT: Number of FLOAT arguments (so that networking knows how many to send/receive)
 +      args: MISC: Arguments for sprintf(string, args), if no args needed then use ""
 +      cpid: FLOAT: centerprint ID number (CPID_*), NO_CPID if no CPID is needed
 +      durcnt: XPD(FLOAT, FLOAT): Duration/Countdown: extra arguments for centerprint messages
 +      normal: STRING: Normal message (string for sprintf when gentle messages are NOT enabled)
 +      gentle: STRING: Gentle message (string for sprintf when gentle messages ARE enabled)
 +    MSG_WEAPON:
 +    MSG_DEATH:
 +      name: VAR: Name of chaining notification
 +      infoname: VAR: Name of info notification for reference
 +      centername: VAR: Name of centerprint notification for reference
 +
 + Messages with ^F1, ^BG, ^TC, etc etc in them will replace those strings
 + with colors according to the cvars the user has chosen. This allows for
 + users to create unique color profiles for their HUD, giving more customization
 + options to HUD designers and end users who want such a feature.
 +
 + Check out the definitions in util.qc/util.qh/teams.qh for string CCR(...) and
 + string TCR(...) to better understand how these code replacements work.
 +
 + Guidlines for notification declaration (please try and follow these):
 +  Specific rules:
 +    -ALWAYS start the string with a color, preferably background.
 +    -ALWAYS reset a color after a name (this way they don't set it for the whole string).
 +    -NEVER re-declare an event twice.
 +    -NEVER add or remove tokens from the format, it SHOULD already work.
 +    -MSG_INFO messages must ALWAYS end with a new line: \n
 +    -MSG_INFO hudargs must always be ATTACKER -> VICTIM
 +    -MSG_CENTER should NOT end with a new line
 +
 + General rules:
 +    -Be clean and simple with your notification naming,
 +     nothing too long for the name field... Abbreviations are your friend. :D
 +    -Keep the spacing as clean as possible... if the arguments are abnormally long,
 +      it's okay to go out of line a bit... but try and keep it clean still.
 +    -Sort the notifications in the most appropriate order for their tasks.
 +    -ARIRE unir frk jvgu lbhe bja zbgure. (gvc sbe zvxrrhfn) -- Don't pay attention to this ^_^
 +
 + Final note: DO NOT PROVIDE MORE ARGUMENTS THAN NECESSARY FOR THE NOTIFICATION YOU'RE CALLING!
 +      The system is designed to save as much networking bandwidth as possible,
 +      so please dynamically control your argument sending to fit *exactly* what is required.
 +      If you send a notification with mismatching arguments, Send_Notification() will error.
 +*/
 +
 +#define MULTITEAM_INFO(prefix,teams,strnum,flnum,args,hudargs,icon,normal,gentle) \
 +      MSG_INFO_NOTIF(prefix##RED, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_1)), TCR(normal, COL_TEAM_1, strtoupper(STR_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(STR_TEAM_1))) \
 +      MSG_INFO_NOTIF(prefix##BLUE, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_2)), TCR(normal, COL_TEAM_2, strtoupper(STR_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(STR_TEAM_2))) \
 +      #if teams >= 3 \
 +              MSG_INFO_NOTIF(prefix##YELLOW, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_3)), TCR(normal, COL_TEAM_3, strtoupper(STR_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(STR_TEAM_3))) \
 +      #endif \
 +      #if teams >= 4 \
 +              MSG_INFO_NOTIF(prefix##PINK, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STR_TEAM_4)), TCR(normal, COL_TEAM_4, strtoupper(STR_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(STR_TEAM_4))) \
 +      #endif
 +#define MSG_INFO_NOTIFICATIONS \
 +      /*MSG_INFO_NOTIF(INFO_EMPTY,                                            0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             "", "")*/ \
 +      MULTITEAM_INFO(INFO_CTF_FLAGRETURN_DROPPED_, 2,         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^BGThe ^TC^TT^BG flag was dropped in the base and returned itself\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_FLAGRETURN_DAMAGED_, 2,         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^BGThe ^TC^TT^BG flag was destroyed and returned to base\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_FLAGRETURN_SPEEDRUN_, 2,        0, 1, f1/100, XPD("", ""),                                                      "",                                             _("^BGThe ^TC^TT^BG flag became impatient after ^F1%.2f^BG seconds and returned itself\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_FLAGRETURN_NEEDKILL_, 2,        0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^BGThe ^TC^TT^BG flag fell somewhere it couldn't be reached and returned to base\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_FLAGRETURN_ABORTRUN_, 2,        0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^BGThe ^TC^TT^BG flag was returned to base by its owner\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_FLAGRETURN_TIMEOUT_, 2,         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^BGThe ^TC^TT^BG flag has returned to the base\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_PICKUP_, 2,                                     1, 0, s1, XPD(s1, ""),                                                          "notify_%s_taken",              _("^BG%s^BG got the ^TC^TT^BG flag\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_RETURN_, 2,                                     1, 0, s1, XPD(s1, ""),                                                          "notify_%s_returned",   _("^BG%s^BG returned the ^TC^TT^BG flag\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_LOST_, 2,                                       1, 0, s1, XPD(s1, ""),                                                          "notify_%s_lost",               _("^BG%s^BG lost the ^TC^TT^BG flag\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_CAPTURE_, 2,                            1, 0, s1, XPD(s1, ""),                                                          "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_CAPTURE_TIME_, 2,                       1, 1, XPD(s1, f1/100), XPD(s1, ""),                                     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%.2f^BG seconds\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_CAPTURE_BROKEN_, 2,                     2, 2, XPD(s1, f1/100, s2, f2/100), XPD(s1, ""),         "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%.2f^BG seconds, breaking ^BG%s^BG's previous record of ^F2%.2f^BG seconds\n"), "") \
 +      MULTITEAM_INFO(INFO_CTF_CAPTURE_UNBROKEN_, 2,           2, 2, XPD(s1, f1/100, s2, f2/100), XPD(s1, ""),         "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F2%.2f^BG seconds, failing to break ^BG%s^BG's previous record of ^F1%.2f^BG seconds\n"), "") \
 +      MULTITEAM_INFO(INFO_DEATH_TEAMKILL_, 4,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_FIRSTBLOOD,                           2, 0, s2, XPD("", ""),                                                          "",                                             _("^BG%s^K1 drew first blood\n"), _("^F1%s^K1 got the first score\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_CUSTOM,                          2, 1, XPD(s1, s2, SPREE_LOST), XPD(s1, ""),                     "notify_void",                  _("^BG%s^K1 %s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_GENERIC,                         1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_selfkill",              _("^BG%s^K1 died%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_VOID,                            1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_void",                  _("^BG%s^K1 was in the wrong place%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_SUICIDE,                         1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_selfkill",              _("^BG%s^K1 couldn't take it anymore%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_NOAMMO,                          1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_outofammo",             _("^BG%s^K1 died%s. What's the point of living without ammo?\n"), _("^F1%s^K1 ran out of ammo%s\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_ROT,                                     1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_death",                 _("^BG%s^K1 rotted away%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_CAMP,                            1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_camping",               _("^BG%s^K1 thought they found a nice camping ground%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_BETRAYAL,                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_teamkill_red",  _("^BG%s^K1 became enemies with the Lord of Teamplay%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TEAMCHANGE,                      1, 1, XPD(s1, DEATH_TEAM), XPD("", ""),                         "",                                             _("^BG%s^K1 switched to the %s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_AUTOTEAMCHANGE,          1, 1, XPD(s1, DEATH_TEAM), XPD("", ""),                         "",                                             _("^BG%s^K1 was moved into the %s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_FALL,                            1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_fall",                  _("^BG%s^K1 hit the ground with a crunch%s\n"), _("^F1%s^K1 hit the ground with a bit too much force%s\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_DROWN,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_water",                 _("^BG%s^K1 couldn't catch their breath%s\n"), _("^F1%s^K1 was in the water for too long%s\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_FIRE,                            1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_death",                 _("^BG%s^K1 became a bit too crispy%s\n"), _("^F1%s^K1 felt a little hot%s\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_LAVA,                            1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_lava",                  _("^BG%s^K1 turned into hot slag%s\n"), _("^F1%s^K1 found a hot place%s\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_SLIME,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_slime",                 _("^BG%s^K1 was slimed%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_SHOOTING_STAR,           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_shootingstar",  _("^BG%s^K1 became a shooting star%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_SWAMP,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_slime",                 _("^BG%s^K1 is now preserved for centuries to come%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_CHEAT,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_selfkill",              _("^BG%s^K1 unfairly eliminated themself%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TOUCHEXPLODE,            1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                         "notify_death",                 _("^BG%s^K1 died in an accident%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET,                                  1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 ran into a turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_EWHEEL,                   1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was blasted away by an eWheel turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_FLAC,                             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got caught up in the FLAC turret fire%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_MACHINEGUN,               1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was riddled full of holes by a Machinegun turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_WALKER_GUN,               1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got served a lead enrichment by a Walker turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_WALKER_MEELE,             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was impaled by a Walker turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_WALKER_ROCKET,    1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was blasted away by a Walker turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_HELLION,                  1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was blasted away by a Hellion turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_HK,                               1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 could not hide from the Hunter turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_MLRS,                             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got turned into smoldering gibs by an MLRS turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_PLASMA,                   1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 got served some superheated plasma from a turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_PHASER,                   1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was phased out by a turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_SELF_TURRET_TESLA,                    1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),                 "notify_death",                 _("^BG%s^K1 was electrocuted by a Tesla turret%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_TELEFRAG,                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_telefrag",              _("^BG%s^K1 was telefragged by ^BG%s^K1%s\n"), _("^F1%s^K1 tried to occupy ^BG%s^K1's teleport destination space\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_FALL,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_fall",                  _("^BG%s^K1 was grounded by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_DROWN,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_water",                 _("^BG%s^K1 was drowned by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_LAVA,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_lava",                  _("^BG%s^K1 was cooked by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_SLIME,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_slime",                 _("^BG%s^K1 was slimed by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_SHOOTING_STAR,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_shootingstar",  _("^BG%s^K1 was shot into space by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_SWAMP,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_slime",                 _("^BG%s^K1 was preserved by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VOID,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_void",                  _("^BG%s^K1 was thrown into a world of hurt by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_TOUCHEXPLODE,          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 died in an accident with ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_CHEAT,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was unfairly eliminated by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_FIRE,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was burnt up into a crisp by ^BG%s^K1%s\n"), _("^F1%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s\n")) \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_CRUSH,                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was crushed by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_SPID_MINIGUN,       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got shredded by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_SPID_ROCKET,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was blasted to bits by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_SPID_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_WAKI_GUN,           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was bolted down by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_WAKI_ROCKET,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 couldn't find shelter from ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_WAKI_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_CANNON,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 couldn't resist ^BG%s^K1 purple blobs%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_BOMB,          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was cluster bombed by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_FRAGMENT,      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 was cluster bombed by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_RAPT_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 got caught in the blast when ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_GUN,           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_RAY,           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_RAY_HEAL,      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_DEATH_MURDER_VH_BUMB_DEATH,         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),                      "notify_death",                 _("^BG%s^K1 foobar by ^BG%s^K1%s\n"), "") \
 +      MULTITEAM_INFO(INFO_FREEZETAG_ROUND_WIN_, 4,            0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^TC^TT^BG team wins the round, all other teams were frozen\n"), "") \
 +      MSG_INFO_NOTIF(INFO_FREEZETAG_REVIVE,                           2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("^BG%s^K3 was revived by ^BG%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_FREEZETAG_FREEZE,                           2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("^BG%s^K1 was frozen by ^BG%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_FREEZETAG_SELF,                                     1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^K1 froze themself\n"), "") \
 +      MSG_INFO_NOTIF(INFO_GODMODE_OFF,                                        0, 1, f1, XPD("", ""),                                                          "",                                             _("^BGGodmode saved you %d units of damage, cheater!\n"), "") \
 +      MSG_INFO_NOTIF(INFO_JOIN_CONNECT,                                       1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^F3 connected%s\n"), "") \
 +      MULTITEAM_INFO(INFO_JOIN_CONNECT_TEAM_, 4,                      1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^F3 connected and joined the ^TC^TT\n"), "") \
 +      MSG_INFO_NOTIF(INFO_JOIN_PLAY,                                          1, 0, s1, XPD("", ""),                                                          "",                                             _("^BG%s^F3 is now playing\n"), "") \
 +      MSG_INFO_NOTIF(INFO_KEEPAWAY_DROPPED,                           1, 0, s1, XPD(s1, ""),                                                          "notify_balldropped",   _("^BG%s^BG has dropped the ball!\n"), "") \
 +      MSG_INFO_NOTIF(INFO_KEEPAWAY_PICKUP,                            1, 0, s1, XPD(s1, ""),                                                          "notify_ballpickedup",  _("^BG%s^BG has picked up the ball!\n"), "") \
 +      MSG_INFO_NOTIF(INFO_LMS_NOLIVES,                                        1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 has no more lives left\n"), "") \
 +      MSG_INFO_NOTIF(INFO_LMS_FORFEIT,                                        1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 forfeited\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERDOWN_INVISIBILITY,                     0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Invisibility has worn off\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERDOWN_SHIELD,                           0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Shield has worn off\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERDOWN_SPEED,                            0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Speed has worn off\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERDOWN_STRENGTH,                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Strength has worn off\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERUP_INVISIBILITY,                       0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You are invisible\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERUP_SHIELD,                                     0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Shield surrounds you\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERUP_SPEED,                                      0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You are on speed\n"), "") \
 +      MSG_INFO_NOTIF(INFO_POWERUP_STRENGTH,                           0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Strength infuses your weapons with devastating power\n"), "") \
 +      MSG_INFO_NOTIF(INFO_QUIT_DISCONNECT,                            1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 disconnected\n"), "") \
 +      MSG_INFO_NOTIF(INFO_QUIT_KICK_IDLING,                           1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 was kicked for idling\n"), "") \
 +      MSG_INFO_NOTIF(INFO_QUIT_KICK_SPECTATING,                       0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You were kicked from the server because you are a spectator and spectators aren't allowed at the moment.\n"), "") \
 +      MSG_INFO_NOTIF(INFO_QUIT_SPECTATE,                                      1, 0, s1, XPD(s1, ""),                                                          "",                                             _("^BG%s^F3 is now spectating\n"), "") \
 +      MSG_INFO_NOTIF(INFO_RACE_FAIL,                                          2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newfail",                 "", "") \
 +      MSG_INFO_NOTIF(INFO_RACE_NEW_RECORD,                            2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newrecordserver", "", "") \
 +      MSG_INFO_NOTIF(INFO_RACE_NEW_TIME,                                      2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newtime",                 "", "") \
 +      MSG_INFO_NOTIF(INFO_RACE_NEW_RANK,                                      2, 0, XPD(s1, s2), XPD(s1, ""),                                         "race_newrankyellow",   "", "") \
 +      MULTITEAM_INFO(INFO_SCORES_, 4,                                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^TC^TT ^BGteam scores!\n"), "") \
 +      MSG_INFO_NOTIF(INFO_SPECTATE_WARNING,                           0, 1, f1, XPD("", ""),                                                          "",                                             _("^F2You have to become a player within the next %d seconds, otherwise you will be kicked, because spectating isn't allowed at this time!\n"), "") \
 +      MSG_INFO_NOTIF(INFO_SUPERWEAPON_BROKEN,                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Superweapons have broken down\n"), "") \
 +      MSG_INFO_NOTIF(INFO_SUPERWEAPON_PICKUP,                         0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2You now have a superweapon\n"), "") \
 +      MSG_INFO_NOTIF(INFO_SUPERWEAPON_LOST,                           0, 0, NO_STR_ARG, XPD("", ""),                                          "",                                             _("^F2Superweapons have been lost\n"), "") \
 +      MSG_INFO_NOTIF(INFO_VERSION_BETA,                                       2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("\{1}^F4NOTE: ^BGThe server is running ^F1Xonotic %s (beta)^BG, you have ^F2Xonotic %s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_VERSION_OLD,                                        2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("\{1}^F4NOTE: ^BGThe server is running ^F1Xonotic %s^BG, you have ^F2Xonotic %s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_VERSION_OUTDATED,                           2, 0, XPD(s1, s2), XPD("", ""),                                         "",                                             _("\{1}^F4NOTE: ^F1Xonotic %s^BG is out, and you still have ^F2Xonotic %s^BG - get the update from ^F3http://www.xonotic.org/^BG!\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WATERMARK,                                          1, 0, s1, XPD("", ""),                                                          "",                                             _("^F3SVQC Build information: ^F4%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_THINKING_WITH_PORTALS,                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "notify_selfkill", _("^BG%s^K1 is now thinking with portals%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_CRYLINK_SUICIDE,                             1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponcrylink", _("^BG%s^K1 felt the strong pull of their Crylink%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_CRYLINK_MURDER,                                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponcrylink", _("^BG%s^K1 felt the strong pull of ^BG%s^K1's Crylink%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponelectro", _("^BG%s^K1 could not remember where they put their Electro plasma%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponelectro", _("^BG%s^K1 played with Electro plasma%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_BOLT,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponelectro", _("^BG%s^K1 was blasted by ^BG%s^K1's Electro bolt%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_ORBS,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponelectro", _("^BG%s^K1 got too close to ^BG%s^K1's Electro plasma%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ELECTRO_MURDER_COMBO,                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponelectro", _("^BG%s^K1 felt the electrifying air of ^BG%s^K1's Electro combo%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponfireball", _("^BG%s^K1 forgot about their firemine%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_SUICIDE_BLAST,                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponfireball", _("^BG%s^K1 should have used a smaller gun%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_MURDER_FIREMINE,            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponfireball", _("^BG%s^K1 got burnt by ^BG%s^K1's firemine%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_FIREBALL_MURDER_BLAST,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponfireball", _("^BG%s^K1 got too close to ^BG%s^K1's fireball%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapongrenadelauncher", _("^BG%s^K1 blew themself up with their own Mortar%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapongrenadelauncher", _("^BG%s^K1 didn't see their own Mortar grenade%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_MURDER_EXPLODE,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapongrenadelauncher", _("^BG%s^K1 ate ^BG%s^K1's Mortar grenade%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_MORTAR_MURDER_BOUNCE,                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapongrenadelauncher", _("^BG%s^K1 got too close to ^BG%s^K1's Mortar grenade%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_SUICIDE,                                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponhagar", _("^BG%s^K1 played with tiny Hagar rockets%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_MURDER_BURST,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhagar", _("^BG%s^K1 was pummeled by a burst of ^BG%s^K1's Hagar rockets%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_HAGAR_MURDER_SPRAY,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhagar", _("^BG%s^K1 was pummeled by ^BG%s^K1's Hagar rockets%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_HLAC_SUICIDE,                                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponhlac", _("^BG%s^K1 got a little jumpy with their HLAC%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_HLAC_MURDER,                                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhlac", _("^BG%s^K1 was cut down with ^BG%s^K1's HLAC%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_HOOK_MURDER,                                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponhook", _("^BG%s^K1 was caught in ^BG%s^K1's Hook gravity bomb%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_LASER_SUICIDE,                                       1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponlaser", _("^BG%s^K1 shot themself to hell with their Laser%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_LASER_MURDER,                                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponlaser", _("^BG%s^K1 was shot to death by ^BG%s^K1's Laser%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_MINELAYER_SUICIDE,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponminelayer", _("^BG%s^K1 forgot about their mine%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_MINELAYER_MURDER,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponminelayer", _("^BG%s^K1 got too close to ^BG%s^K1's mine%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_MINSTANEX_MURDER,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponminstanex", _("^BG%s^K1 has been vaporized by ^BG%s^K1's Minstanex%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_NEX_MURDER,                                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponnex", _("^BG%s^K1 has been vaporized by ^BG%s^K1's Nex%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 failed to hide from ^BG%s^K1's Rifle bullet hail%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HAIL,                           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 died in ^BG%s^K1's Rifle bullet hail%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_PIERCING,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 failed to hide from ^BG%s^K1's Rifle%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER,                                        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrifle", _("^BG%s^K1 was sniped with a Rifle by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                       2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "notify_headshot", _("^BG%s^K1 was shot in the head with a Rifle by ^BG%s^K1%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponrocketlauncher", _("^BG%s^K1 blew themself up with their Rocketlauncher%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrocketlauncher", _("^BG%s^K1 ate ^BG%s^K1's rocket%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,        2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponrocketlauncher", _("^BG%s^K1 got too close ^BG%s^K1's rocket%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_SUICIDE,                                      1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weaponseeker", _("^BG%s^K1 played with tiny Seeker rockets%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_MURDER_TAG,                           2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponseeker", _("^BG%s^K1 was tagged by ^BG%s^K1's Seeker%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_SEEKER_MURDER_SPRAY,                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponseeker", _("^BG%s^K1 was pummeled by ^BG%s^K1's Seeker rockets%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_SHOTGUN_MURDER_SLAP,                         2, 1, XPD(s2, s1, SPREE_END), XPD(s2, s1),      "notify_melee_shotgun", _("^BG%s^K1 slapped ^BG%s^K1 around a bit with a large Shotgun%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_SHOTGUN_MURDER,                                      2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponshotgun", _("^BG%s^K1 was gunned down by ^BG%s^K1's Shotgun%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_TUBA_SUICIDE,                                        1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Tuba%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_TUBA_MURDER,                                         2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Tuba%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ACCORDEON_SUICIDE,                           1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Accordeon%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_ACCORDEON_MURDER,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Accordeon%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_KLEINBOTTLE_SUICIDE,                         1, 1, XPD(s1, SPREE_LOST), XPD(s1, ""),         "weapontuba", _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_KLEINBOTTLE_MURDER,                          2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weapontuba", _("^BG%s^K1 died of ^BG%s^K1's great playing on the @!#%%'n Klein Bottle%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_UZI_MURDER_SNIPE,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponuzi", _("^BG%s^K1 was sniped by ^BG%s^K1's Machine Gun%s\n"), "") \
 +      MSG_INFO_NOTIF(INFO_WEAPON_UZI_MURDER_SPRAY,                            2, 1, XPD(s1, s2, SPREE_END), XPD(s2, s1),      "weaponuzi", _("^BG%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s\n"), "") 
 +
 +#define MULTITEAM_CENTER(prefix,teams,strnum,flnum,args,cpid,durcnt,normal,gentle) \
 +      MSG_CENTER_NOTIF(prefix##RED, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_1, strtoupper(STR_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(STR_TEAM_1))) \
 +      MSG_CENTER_NOTIF(prefix##BLUE, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_2, strtoupper(STR_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(STR_TEAM_2))) \
 +      #if teams >= 3 \
 +              MSG_CENTER_NOTIF(prefix##YELLOW, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_3, strtoupper(STR_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(STR_TEAM_3))) \
 +      #endif \
 +      #if teams >= 4 \
 +              MSG_CENTER_NOTIF(prefix##PINK, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_4, strtoupper(STR_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(STR_TEAM_4))) \
 +      #endif
 +#define MSG_CENTER_NOTIFICATIONS \
 +      /*MSG_CENTER_NOTIF(CENTER_EMPTY,                                                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), "null", "")*/ \
 +      MSG_CENTER_NOTIF(CENTER_ASSAULT_ATTACKING,                              0, 0, NO_STR_ARG,                               CPID_ASSAULT_ROLE,              XPD(0, 0), _("^BGYou are attacking!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_ASSAULT_DEFENDING,                              0, 0, NO_STR_ARG,                               CPID_ASSAULT_ROLE,              XPD(0, 0), _("^BGYou are defending!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_CAPTURESHIELD_SHIELDED,             0, 0, NO_STR_ARG,                               CPID_CTF_CAPSHIELD,             XPD(0, 0), _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_CAPTURESHIELD_FREE,                 0, 0, NO_STR_ARG,                               CPID_CTF_CAPSHIELD,             XPD(0, 0), _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \
 +      MULTITEAM_CENTER(CENTER_CTF_PASS_OTHER_, 2,                             2, 0, XPD(s1, s2),                              CPID_CTF_PASS,                  XPD(0, 0), _("^BG%s^BG passed the ^TC^TT^BG flag to %s"), "") \
 +      MULTITEAM_CENTER(CENTER_CTF_PASS_SENT_, 2,                              1, 0, s1,                                               CPID_CTF_PASS,                  XPD(0, 0), _("^BGYou passed the ^TC^TT^BG flag to %s"), "") \
 +      MULTITEAM_CENTER(CENTER_CTF_PASS_RECEIVED_, 2,                  1, 0, s1,                                               CPID_CTF_PASS,                  XPD(0, 0), _("^BGYou received the ^TC^TT^BG flag from %s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_PASS_REQUESTING,                    1, 0, s1,                                               CPID_CTF_PASS,                  XPD(0, 0), _("^BGRequesting %s^BG to pass you the flag"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_PASS_REQUESTED,                     1, 0, XPD(s1, PASS_KEY),                CPID_CTF_PASS,                  XPD(0, 0), _("^BG%s^BG requests you to pass the flag%s"), "") \
 +      MULTITEAM_CENTER(CENTER_CTF_RETURN_, 2,                                 0, 0, NO_STR_ARG,                               CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGYou returned the ^TC^TT^BG flag!"), "") \
 +      MULTITEAM_CENTER(CENTER_CTF_CAPTURE_, 2,                                0, 0, NO_STR_ARG,                               CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGYou captured the ^TC^TT^BG flag!"), "") \
 +      MULTITEAM_CENTER(CENTER_CTF_PICKUP_, 2,                                 0, 0, NO_STR_ARG,                               CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGYou got the ^TC^TT^BG flag!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_PICKUP_TEAM,                                1, 0, s1,                                               CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGYour %steam mate^BG got the flag! Protect them!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_PICKUP_TEAM_VERBOSE,                2, 0, XPD(s1, s2, s1),                  CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGYour %steam mate (^BG%s%s)^BG got the flag! Protect them!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_PICKUP_ENEMY,                               1, 0, s1,                                               CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGThe %senemy^BG got your flag! Retrieve it!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_PICKUP_ENEMY_VERBOSE,               2, 0, XPD(s1, s2, s1),                  CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGThe %senemy (^BG%s%s)^BG got your flag! Retrieve it!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_STALEMATE_CARRIER,                  0, 0, NO_STR_ARG,                               CPID_STALEMATE,                 XPD(0, 0), _("^BGStalemate! Enemies can now see you on radar!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_STALEMATE_OTHER,                    0, 0, NO_STR_ARG,                               CPID_STALEMATE,                 XPD(0, 0), _("^BGStalemate! Flag carriers can now be seen by enemies on radar!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_CTF_FLAG_THROW_PUNISH,                  0, 1, f1,                                               CPID_CTF_LOWPRIO,               XPD(0, 0), _("^BGToo many flag throws! Throwing disabled for %d seconds."), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_CUSTOM,                              2, 0, s2,                                               NO_CPID,                                XPD(0, 0), _("^K1You were %s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_GENERIC,                             0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You killed your own dumb self!"), _("^K1You need to be more careful!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_VOID,                                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1Watch your step!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_SUICIDE,                             0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You committed suicide!"), _("^K1You ended it all!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_NOAMMO,                              0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You were killed for running out of ammo..."), _("^K1You are respawning for running out of ammo...")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_ROT,                                 0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You grew too old without taking your medicine"), _("^K1You need to preserve your health")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_CAMP,                                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1Die camper!"), _("^K1Reconsider your tactics, camper!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_BETRAYAL,                    0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1Don't shoot your team mates!"), _("^K1Don't go against your team mates!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TEAMCHANGE,                  0, 1, DEATH_TEAM,                               NO_CPID,                                XPD(0, 0), _("^BGYou are now on: %s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_AUTOTEAMCHANGE,              0, 1, DEATH_TEAM,                               NO_CPID,                                XPD(0, 0), _("^BGYou have been moved into a different team\nYou are now on: %s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_FALL,                                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You hit the ground with a crunch!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_DROWN,                               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You couldn't catch your breath in time!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_FIRE,                                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You got a little bit too crispy!"), _("^K1You felt a little too hot!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_LAVA,                                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You couldn't stand the heat!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_SLIME,                               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You melted away in slime!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_SHOOTING_STAR,               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You became a shooting star!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_SWAMP,                               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You got stuck in a swamp!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_CHEAT,                               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You unfairly eliminated yourself!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TOUCHEXPLODE,                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You died in an accident!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TURRET,                              0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You were fragged by a turret!"), _("^K1You had an unfortunate run in with a turret!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TURRET_EWHEEL,               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You were fragged by an eWheel turret!"), _("^K1You had an unfortunate run in with an eWheel turret!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_SELF_TURRET_WALKER,               0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You were fragged by a Walker turret!"), _("^K1You had an unfortunate run in with a Walker turret!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG,                                              1, 1, XPD(SPREE_CEN, s1),                                                               NO_CPID, XPD(0, 0), _("^K3%sYou fragged ^BG%s"), _("^K3%sYou scored against ^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED,                                   1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s"), _("^K1You were scored against by ^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG,                                  1, 1, XPD(SPREE_CEN, s1),                                                               NO_CPID, XPD(0, 0), _("^K1%sYou typefragged ^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAGGED,                               1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1You were typefragged by ^BG%s"), _("^K1You were scored against by ^BG%s^K1 while typing!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG_FIRST,                                1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K3First blood! You fragged ^BG%s"), _("^K3First score! You scored against ^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED_FIRST,                             1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were fragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG_FIRST,                    1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First blood! You typefragged ^BG%s"), _("^K1First score! You scored against ^BG%s^K1 while they were typing")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST,                 1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were typefragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s^K1 while typing!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG_VERBOSE,                              1, 2, XPD(SPREE_CEN, s1, FRAG_PING),                                    NO_CPID, XPD(0, 0), _("^K3%sYou fragged ^BG%s^BG%s"), _("^K3%sYou scored against ^BG%s^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED_VERBOSE,                   1, 3, XPD(s1, FRAG_STATS),                                                              NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s^BG%s"), _("^K1You were scored against by ^BG%s^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE,                  1, 2, XPD(SPREE_CEN, s1, FRAG_PING),                                    NO_CPID, XPD(0, 0), _("^K1%sYou typefragged ^BG%s^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE,               1, 3, XPD(s1, FRAG_STATS),                                                              NO_CPID, XPD(0, 0), _("^K1You were typefragged by ^BG%s^BG%s"), _("^K1You were scored against by ^BG%s^K1 while typing^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAG_FIRST_VERBOSE,                1, 1, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K3First blood! You fragged ^BG%s"), _("^K3First score! You scored against ^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_FRAGGED_FIRST_VERBOSE,             1, 3, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were fragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE,    1, 1, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First blood! You typefragged ^BG%s"), _("^K1First score! You scored against ^BG%s^K1 while they were typing")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE, 1, 3, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1First victim! You were typefragged by ^BG%s"), _("^K1First casualty! You were scored against by ^BG%s^K1 while typing!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_TEAMKILL_FRAG,                                    1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1Moron! You fragged ^BG%s^K1, a team mate!"), _("^K1Moron! You went against ^BG%sK1, a team mate!")) \
 +      MSG_CENTER_NOTIF(CENTER_DEATH_TEAMKILL_FRAGGED,                                 1, 0, s1,                                                                                               NO_CPID, XPD(0, 0), _("^K1You were fragged by ^BG%s^K1, a team mate"), _("^K1You were scored against by ^BG%s^K1, a team mate")) \
 +      MSG_CENTER_NOTIF(CENTER_DISCONNECT_IDLING,                              0, 1, NO_STR_ARG,                               CPID_IDLING,                    XPD(0, f1), _("^K1Stop idling!\n^BGDisconnecting in ^COUNT..."), "") \
 +      MULTITEAM_CENTER(CENTER_FREEZETAG_ROUND_WIN_, 4,                0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^TC^TT^BG team wins the round, all other teams were frozen"), "") \
 +      MSG_CENTER_NOTIF(CENTER_FREEZETAG_SPAWN_LATE,                   0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You spawned after the round started, you'll spawn as frozen"), "") \
 +      MSG_CENTER_NOTIF(CENTER_FREEZETAG_REVIVE,                               1, 0, s1,                                               NO_CPID,                                XPD(0, 0), _("^K3You revived ^BG%s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_FREEZETAG_REVIVED,                              1, 0, s1,                                               NO_CPID,                                XPD(0, 0), _("^K3You were revived by ^BG%s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_FREEZETAG_SELF,                                 0, 0, NO_STR_ARG,                               NO_CPID,                                XPD(0, 0), _("^K1You froze yourself"), "") \
 +      MSG_CENTER_NOTIF(CENTER_FREEZETAG_FREEZE,                               1, 0, s1,                                               NO_CPID,                                XPD(0, 0), _("^K3You froze ^BG%s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_FREEZETAG_FROZEN,                               1, 0, s1,                                               NO_CPID,                                XPD(0, 0), _("^K1You were frozen by ^BG%s"), "") \
 +      MSG_CENTER_NOTIF(CENTER_KEEPAWAY_DROPPED,                               1, 0, s1,                                               CPID_KEEPAWAY,                  XPD(0, 0), _("^BG%s^BG has dropped the ball!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_KEEPAWAY_PICKUP,                                1, 0, s1,                                               CPID_KEEPAWAY,                  XPD(0, 0), _("^BG%s^BG has picked up the ball!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_KEEPAWAY_WARN,                                  0, 0, NO_STR_ARG,                               CPID_KA_WARN,                   XPD(0, 0), _("^BGKilling people while you don't have the ball gives no points!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_LMS_CAMPCHECK,                                  0, 0, NO_STR_ARG,                               CPID_LMS_CAMP,                  XPD(0, 0), _("^K1Don't camp!"), "") \
 +      MSG_CENTER_NOTIF(CENTER_JOIN_NOSPAWNS,                                  0, 0, NO_STR_ARG,                               CPID_PREVENT_JOIN,              XPD(0, 0), _("^K1No spawnpoints available!\nHope your team can fix it..."), "") \
 +      MSG_CENTER_NOTIF(CENTER_JOIN_PREVENT,                                   0, 0, NO_STR_ARG,                               CPID_PREVENT_JOIN,              XPD(0, 0), _("^K1You may not join the game at this time.\nThe player limit reached maximum capacity."), "") \
 +      MULTITEAM_CENTER(CENTER_TEAMCHANGE_, 4,                                 0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^BGChanging to ^TC^TT^BG in ^COUNT"), "") \
 +      MSG_CENTER_NOTIF(CENTER_TEAMCHANGE_SPECTATE,                    0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^BGSpectating in ^COUNT"), "") \
 +      MSG_CENTER_NOTIF(CENTER_TEAMCHANGE_AUTO,                                0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^BGChanging team in ^COUNT"), "") \
 +      MSG_CENTER_NOTIF(CENTER_TEAMCHANGE_SUICIDE,                             0, 1, NO_STR_ARG,                               CPID_TEAMCHANGE,                XPD(0, f1), _("^K1Suicide in ^COUNT"), "") \
 +      MSG_CENTER_NOTIF(CENTER_WEAPON_MARBLES_LOST,                    1, 1, XPD(s1, WEAPON_NAME),             NO_CPID,                                XPD(0, 0), _("^K1You lost your marbles against ^BG%s^K1 using the ^BG%s!"), "")
 +
 +#define MSG_WEAPON_NOTIFICATIONS \
 +      /*MSG_WEAPON_NOTIF(WEAPON_EMPTY,                                                NO_MSG,                                                                         NO_MSG)*/ \
 +      MSG_WEAPON_NOTIF(WEAPON_THINKING_WITH_PORTALS,                  INFO_WEAPON_THINKING_WITH_PORTALS,                      CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_CRYLINK_SUICIDE,                                INFO_WEAPON_CRYLINK_SUICIDE,                            CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_CRYLINK_MURDER,                                 INFO_WEAPON_CRYLINK_MURDER,                             NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_ELECTRO_SUICIDE_ORBS,                   INFO_WEAPON_ELECTRO_SUICIDE_ORBS,                       CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_ELECTRO_SUICIDE_BOLT,                   INFO_WEAPON_ELECTRO_SUICIDE_BOLT,                       CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_ELECTRO_MURDER_BOLT,                    INFO_WEAPON_ELECTRO_MURDER_BOLT,                        NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_ELECTRO_MURDER_ORBS,                    INFO_WEAPON_ELECTRO_MURDER_ORBS,                        NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_ELECTRO_MURDER_COMBO,                   INFO_WEAPON_ELECTRO_MURDER_COMBO,                       NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_FIREBALL_SUICIDE_FIREMINE,              INFO_WEAPON_FIREBALL_SUICIDE_FIREMINE,          CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_FIREBALL_SUICIDE_BLAST,                 INFO_WEAPON_FIREBALL_SUICIDE_BLAST,             CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_FIREBALL_MURDER_FIREMINE,               INFO_WEAPON_FIREBALL_MURDER_FIREMINE,           NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_FIREBALL_MURDER_BLAST,                  INFO_WEAPON_FIREBALL_MURDER_BLAST,                      NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_MORTAR_SUICIDE_EXPLODE,                 INFO_WEAPON_MORTAR_SUICIDE_EXPLODE,             CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_MORTAR_SUICIDE_BOUNCE,                  INFO_WEAPON_MORTAR_SUICIDE_BOUNCE,                      CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_MORTAR_MURDER_EXPLODE,                  INFO_WEAPON_MORTAR_MURDER_EXPLODE,                      NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_MORTAR_MURDER_BOUNCE,                   INFO_WEAPON_MORTAR_MURDER_BOUNCE,                       NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_HAGAR_SUICIDE,                                  INFO_WEAPON_HAGAR_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_HAGAR_MURDER_BURST,                     INFO_WEAPON_HAGAR_MURDER_BURST,                         NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_HAGAR_MURDER_SPRAY,                     INFO_WEAPON_HAGAR_MURDER_SPRAY,                         NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_HLAC_SUICIDE,                                   INFO_WEAPON_HLAC_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_HLAC_MURDER,                                    INFO_WEAPON_HLAC_MURDER,                                        NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_HOOK_MURDER,                                    INFO_WEAPON_HOOK_MURDER,                                        NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_LASER_SUICIDE,                                  INFO_WEAPON_LASER_SUICIDE,                                      CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_LASER_MURDER,                                   INFO_WEAPON_LASER_MURDER,                                       NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_MINELAYER_SUICIDE,                              INFO_WEAPON_MINELAYER_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_MINELAYER_MURDER,                               INFO_WEAPON_MINELAYER_MURDER,                           NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_MINSTANEX_MURDER,                               INFO_WEAPON_MINSTANEX_MURDER,                           NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_NEX_MURDER,                                     INFO_WEAPON_NEX_MURDER,                                         NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER_HAIL_PIERCING,             INFO_WEAPON_RIFLE_MURDER_HAIL_PIERCING,         NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER_HAIL,                              INFO_WEAPON_RIFLE_MURDER_HAIL,                          NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER_PIERCING,                  INFO_WEAPON_RIFLE_MURDER_PIERCING,                      NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER,                                   INFO_WEAPON_RIFLE_MURDER,                                       NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_RIFLE_MURDER_HEADSHOT,                  INFO_WEAPON_RIFLE_MURDER_HEADSHOT,                      NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_ROCKETLAUNCHER_SUICIDE,                 INFO_WEAPON_ROCKETLAUNCHER_SUICIDE,             CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,   INFO_WEAPON_ROCKETLAUNCHER_MURDER_DIRECT,       NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,   INFO_WEAPON_ROCKETLAUNCHER_MURDER_SPLASH,       NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_SEEKER_SUICIDE,                                 INFO_WEAPON_SEEKER_SUICIDE,                             CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_SEEKER_MURDER_TAG,                              INFO_WEAPON_SEEKER_MURDER_TAG,                          NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_SEEKER_MURDER_SPRAY,                    INFO_WEAPON_SEEKER_MURDER_SPRAY,                        NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_SHOTGUN_MURDER_SLAP,                    INFO_WEAPON_SHOTGUN_MURDER_SLAP,                        NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_SHOTGUN_MURDER,                                 INFO_WEAPON_SHOTGUN_MURDER,                             NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_TUBA_SUICIDE,                                   INFO_WEAPON_TUBA_SUICIDE,                                       CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_TUBA_MURDER,                                    INFO_WEAPON_TUBA_MURDER,                                        NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_ACCORDEON_SUICIDE,                              INFO_WEAPON_ACCORDEON_SUICIDE,                          CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_ACCORDEON_MURDER,                               INFO_WEAPON_ACCORDEON_MURDER,                           NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_KLEINBOTTLE_SUICIDE,                    INFO_WEAPON_KLEINBOTTLE_SUICIDE,                        CENTER_DEATH_SELF_GENERIC) \
 +      MSG_WEAPON_NOTIF(WEAPON_KLEINBOTTLE_MURDER,                     INFO_WEAPON_KLEINBOTTLE_MURDER,                         NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_UZI_MURDER_SNIPE,                               INFO_WEAPON_UZI_MURDER_SNIPE,                           NO_MSG) \
 +      MSG_WEAPON_NOTIF(WEAPON_UZI_MURDER_SPRAY,                               INFO_WEAPON_UZI_MURDER_SPRAY,                           NO_MSG) 
 +
 +#define MSG_DEATH_NOTIFICATIONS \
 +      /*MSG_DEATH_NOTIF(DEATH_EMPTY,                                          NO_MSG,                                                                 NO_MSG)*/ \
 +      MSG_DEATH_NOTIF(DEATH_SELF_CUSTOM,                                      INFO_DEATH_SELF_GENERIC,                                CENTER_DEATH_SELF_CUSTOM) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_GENERIC,                                     INFO_DEATH_SELF_GENERIC,                                CENTER_DEATH_SELF_GENERIC) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_VOID,                                        INFO_DEATH_SELF_VOID,                                   CENTER_DEATH_SELF_VOID) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_SUICIDE,                                     INFO_DEATH_SELF_SUICIDE,                                CENTER_DEATH_SELF_SUICIDE) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_NOAMMO,                                      INFO_DEATH_SELF_NOAMMO,                                 CENTER_DEATH_SELF_NOAMMO) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_ROT,                                         INFO_DEATH_SELF_ROT,                                    CENTER_DEATH_SELF_ROT) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_CAMP,                                        INFO_DEATH_SELF_CAMP,                                   CENTER_DEATH_SELF_CAMP) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_BETRAYAL,                            INFO_DEATH_SELF_BETRAYAL,                               CENTER_DEATH_SELF_BETRAYAL) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TEAMCHANGE,                          INFO_DEATH_SELF_TEAMCHANGE,                             CENTER_DEATH_SELF_TEAMCHANGE) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_AUTOTEAMCHANGE,                      INFO_DEATH_SELF_AUTOTEAMCHANGE,                 CENTER_DEATH_SELF_AUTOTEAMCHANGE) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_FALL,                                        INFO_DEATH_SELF_FALL,                                   CENTER_DEATH_SELF_FALL) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_DROWN,                                       INFO_DEATH_SELF_DROWN,                                  CENTER_DEATH_SELF_DROWN) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_FIRE,                                        INFO_DEATH_SELF_FIRE,                                   CENTER_DEATH_SELF_FIRE) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_LAVA,                                        INFO_DEATH_SELF_LAVA,                                   CENTER_DEATH_SELF_LAVA) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_SLIME,                                       INFO_DEATH_SELF_SLIME,                                  CENTER_DEATH_SELF_SLIME) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_SHOOTING_STAR,                       INFO_DEATH_SELF_SHOOTING_STAR,                  CENTER_DEATH_SELF_SHOOTING_STAR) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_SWAMP,                                       INFO_DEATH_SELF_SWAMP,                                  CENTER_DEATH_SELF_SWAMP) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_CHEAT,                                       INFO_DEATH_SELF_CHEAT,                                  CENTER_DEATH_SELF_CHEAT) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TOUCHEXPLODE,                        INFO_DEATH_SELF_TOUCHEXPLODE,                   CENTER_DEATH_SELF_TOUCHEXPLODE) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET,                                      INFO_DEATH_SELF_TURRET,                                 CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_EWHEEL,                       INFO_DEATH_SELF_TURRET_EWHEEL,                  CENTER_DEATH_SELF_TURRET_EWHEEL) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_FLAC,                         INFO_DEATH_SELF_TURRET_FLAC,                    CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_MACHINEGUN,           INFO_DEATH_SELF_TURRET_MACHINEGUN,              CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_WALKER_GUN,           INFO_DEATH_SELF_TURRET_WALKER_GUN,              CENTER_DEATH_SELF_TURRET_WALKER) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_WALKER_MEELE,         INFO_DEATH_SELF_TURRET_WALKER_MEELE,    CENTER_DEATH_SELF_TURRET_WALKER) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_WALKER_ROCKET,        INFO_DEATH_SELF_TURRET_WALKER_ROCKET,   CENTER_DEATH_SELF_TURRET_WALKER) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_HELLION,                      INFO_DEATH_SELF_TURRET_HELLION,                 CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_HK,                           INFO_DEATH_SELF_TURRET_HK,                              CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_MLRS,                         INFO_DEATH_SELF_TURRET_MLRS,                    CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_PLASMA,                       INFO_DEATH_SELF_TURRET_PLASMA,                  CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_PHASER,                       INFO_DEATH_SELF_TURRET_PHASER,                  CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_SELF_TURRET_TESLA,                        INFO_DEATH_SELF_TURRET_TESLA,                   CENTER_DEATH_SELF_TURRET) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TELEFRAG,                          INFO_DEATH_MURDER_TELEFRAG,                             NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FALL,                                      INFO_DEATH_MURDER_FALL,                                 NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_DROWN,                                     INFO_DEATH_MURDER_DROWN,                                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_LAVA,                                      INFO_DEATH_MURDER_LAVA,                                 NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_SLIME,                                     INFO_DEATH_MURDER_SLIME,                                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_SHOOTING_STAR,                     INFO_DEATH_MURDER_SHOOTING_STAR,                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_SWAMP,                                     INFO_DEATH_MURDER_SWAMP,                                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VOID,                                      INFO_DEATH_MURDER_VOID,                                 NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TOUCHEXPLODE,                      INFO_DEATH_MURDER_TOUCHEXPLODE,                 NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_CHEAT,                                     INFO_DEATH_MURDER_CHEAT,                                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FIRE,                                      INFO_DEATH_MURDER_FIRE,                                 NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_CRUSH,                          INFO_DEATH_MURDER_VH_CRUSH,                             NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_SPID_MINIGUN,           INFO_DEATH_MURDER_VH_SPID_MINIGUN,              NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_SPID_ROCKET,            INFO_DEATH_MURDER_VH_SPID_ROCKET,               NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_SPID_DEATH,                     INFO_DEATH_MURDER_VH_SPID_DEATH,                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_WAKI_GUN,                       INFO_DEATH_MURDER_VH_WAKI_GUN,                  NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_WAKI_ROCKET,            INFO_DEATH_MURDER_VH_WAKI_ROCKET,               NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_WAKI_DEATH,                     INFO_DEATH_MURDER_VH_WAKI_DEATH,                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_CANNON,            INFO_DEATH_MURDER_VH_RAPT_CANNON,               NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_BOMB,                      INFO_DEATH_MURDER_VH_RAPT_BOMB,                 NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_FRAGMENT,          INFO_DEATH_MURDER_VH_RAPT_FRAGMENT,             NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_RAPT_DEATH,                     INFO_DEATH_MURDER_VH_RAPT_DEATH,                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_GUN,                       INFO_DEATH_MURDER_VH_BUMB_GUN,                  NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_RAY,                       INFO_DEATH_MURDER_VH_BUMB_RAY,                  NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_RAY_HEAL,          INFO_DEATH_MURDER_VH_BUMB_RAY_HEAL,             NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_VH_BUMB_DEATH,                     INFO_DEATH_MURDER_VH_BUMB_DEATH,                NO_MSG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAG,                                                      NO_MSG,                                                 CENTER_DEATH_MURDER_FRAG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED,                                           NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG,                                          NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAG) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED,                                       NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_FIRST,                                        INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_FRAG_FIRST) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_FIRST,                                     NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED_FIRST) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_FIRST,                            INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_TYPEFRAG_FIRST) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_FIRST,                         NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_VERBOSE,                                      NO_MSG,                                                 CENTER_DEATH_MURDER_FRAG_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_VERBOSE,                           NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_VERBOSE,                          NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_VERBOSE,                       NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAG_FIRST_VERBOSE,                        INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_FRAG_FIRST_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_FRAGGED_FIRST_VERBOSE,                     NO_MSG,                                                 CENTER_DEATH_MURDER_FRAGGED_FIRST_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE,            INFO_DEATH_FIRSTBLOOD,                  CENTER_DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE,         NO_MSG,                                                 CENTER_DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE) \
 +      MSG_DEATH_NOTIF(DEATH_TEAMKILL_FRAG,                                            NO_MSG,                                                 CENTER_DEATH_TEAMKILL_FRAG) \
 +      MSG_DEATH_NOTIF(DEATH_TEAMKILL_FRAGGED,                                         NO_MSG,                                                 CENTER_DEATH_TEAMKILL_FRAGGED)
 +
 +
 +// ====================================
 +//  Initialization/Create Declarations
 +// ====================================
 +
 +#ifndef MENUQC // Menu doesn't need init
 +
 +#define NOTIF_FIRST 1
 +#define NOTIF_MAX 1024 // limit of recursive functions with ACCUMULATE_FUNCTION
 +
 +float NOTIF_INFO_COUNT;
 +float NOTIF_CENTER_COUNT;
 +float NOTIF_WEAPON_COUNT;
 +float NOTIF_DEATH_COUNT;
 +float NOTIF_CPID_COUNT;
 +
 +entity msg_info_notifs[NOTIF_MAX];
 +entity msg_center_notifs[NOTIF_MAX];
 +entity msg_weapon_notifs[NOTIF_MAX];
 +entity msg_death_notifs[NOTIF_MAX];
 +
 +.float nent_broadcast;
 +.entity nent_client;
 +.float nent_net_type;
 +.float nent_net_name;
 +.string nent_strings[4];
 +.float nent_floats[4];
 +
 +.string nent_name;
 +.float nent_enabled; 
 +.float nent_infoname;
 +.float nent_centername;
 +.float nent_stringcount;
 +.float nent_floatcount; 
 +.string nent_args;
 +.string nent_hudargs;
 +.string nent_icon;
 +.float nent_cpid;
 +.string nent_durcnt;
 +.string nent_string;
 +
 +//    notif.nent_args = strzone(args); \
 +//    notif.nent_hudargs = strzone(hudargs); \
 +// if(durcnt != "") { notif.nent_durcnt = durcnt; } \
 +
 +string Process_Notif_Line(float check_newline, string input, string notiftype, string notifname, string stringtype)
 +{
 +      if(check_newline) 
 +      if(substring(input, (strlen(input) - 1), 1) != "\n")
 +      {
 +              print(sprintf("^1MISSING/BROKEN NEW LINE AT END OF NOTIFICATION: ^7net_type = MSG_%s, net_name = %s, %s string.\n", notiftype, notifname, stringtype));
 +              return strcat(input, "\n");
 +      }
 +      return input;
 +}
 +#define ADD_AUTOCVAR(name) var float autocvar_notification_##name = TRUE;
 +
 +#define CREATE_NOTIF_ENTITY(type,name,infoname,centername,strnum,flnum,args,hudargs,icon,cpid,durcnt,normal,gentle,check_newline,subcalls) \
 +      entity notif = spawn(); \
 +      msg_##type##_notifs[name - 1] = notif; \
 +      notif.classname = "msg_#type#_notification"; \
 +      notif.nent_name = strzone(#name); \
 +      notif.nent_enabled = autocvar_notification_##name; \
 +      #if subcalls \
 +              #if (infoname == NO_MSG) && (centername == NO_MSG) \
 +                      print(sprintf("^1NOTIFICATION WITH NO SUBCALLS: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); \
 +              #else \
 +                      float infoname_stringcount = 0, infoname_floatcount = 0, centername_stringcount = 0, centername_floatcount = 0; \
 +                      #if (infoname != NO_MSG) \
 +                              notif.nent_infoname = infoname; \
 +                              infoname_stringcount = msg_info_notifs[infoname - 1].nent_stringcount; \
 +                              infoname_floatcount = msg_info_notifs[infoname - 1].nent_floatcount; \
 +                      #endif \
 +                      #if (centername != NO_MSG) \
 +                              notif.nent_centername = centername; \
 +                              centername_stringcount = msg_center_notifs[centername - 1].nent_stringcount; \
 +                              centername_floatcount = msg_center_notifs[centername - 1].nent_floatcount; \
 +                      #endif \
 +                      notif.nent_stringcount = max(infoname_stringcount, centername_stringcount); \
 +                      notif.nent_floatcount = max(infoname_floatcount, centername_floatcount); \
 +              #endif \
 +      #else \
 +              notif.nent_stringcount = strnum; \
 +              notif.nent_floatcount = flnum; \
 +              if(icon != "") { notif.nent_icon = strzone(icon); } \
 +              if(GENTLE) \
 +              { \
 +                      if(gentle != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, gentle, strtoupper(#type), #name, "GENTLE"))); } \
 +                      else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, normal, strtoupper(#type), #name, "NORMAL"))); } \
 +              } \
 +              else if(normal != "") { notif.nent_string = strzone(CCR(Process_Notif_Line(check_newline, normal, strtoupper(#type), #name, "NORMAL"))); } \
 +              if(notif.nent_string == "") { print(sprintf("^1EMPTY NOTIFICATION: ^7net_type = MSG_%s, net_name = %s.\n", strtoupper(#type), #name)); } \
 +      #endif
 +
 +#define MSG_INFO_NOTIF(name,strnum,flnum,args,hudargs,icon,normal,gentle) \
 +      ADD_AUTOCVAR(name) \
 +      float name; \
 +      void RegisterNotification_##name() \
 +      { \
 +              SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_INFO_COUNT) \
 +              CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_INFO_COUNT, "notifications") \
 +              CREATE_NOTIF_ENTITY(info, name, NO_MSG, NO_MSG, \
 +                      strnum, flnum, args, hudargs, icon, NO_MSG, NO_MSG, \
 +                      normal, gentle, 1, 0) \
 +      } \
 +      ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 +
 +#define MSG_CENTER_NOTIF(name,strnum,flnum,args,cpid,durcnt,normal,gentle) \
 +      ADD_AUTOCVAR(name) \
 +      float name; \
 +      float cpid; \
 +      void RegisterNotification_##name() \
 +      { \
 +              SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_CENTER_COUNT) \
 +              SET_FIELD_COUNT(cpid, NOTIF_FIRST, NOTIF_CPID_COUNT) \
 +              CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_CENTER_COUNT, "notifications") \
 +              CREATE_NOTIF_ENTITY(center, name, NO_MSG, NO_MSG, \
 +                      strnum, flnum, args, "", "", cpid, durcnt, \
 +                      normal, gentle, 0, 0) \
 +      } \
 +      ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 +
 +#define MSG_WEAPON_NOTIF(name,infoname,centername) \
 +      ADD_AUTOCVAR(name) \
 +      float name; \
 +      void RegisterNotification_##name() \
 +      { \
 +              SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_WEAPON_COUNT) \
 +              CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_WEAPON_COUNT, "notifications") \
 +              CREATE_NOTIF_ENTITY(weapon, name, infoname, centername, \
 +                      NO_MSG, NO_MSG, "", "", "", NO_MSG, NO_MSG, \
 +                      "", "", 0, 1) \
 +      } \
 +      ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 +
 +#define MSG_DEATH_NOTIF(name,infoname,centername) \
 +      ADD_AUTOCVAR(name) \
 +      float name; \
 +      void RegisterNotification_##name() \
 +      { \
 +              SET_FIELD_COUNT(name, NOTIF_FIRST, NOTIF_DEATH_COUNT) \
 +              CHECK_MAX_COUNT(name, NOTIF_MAX, NOTIF_DEATH_COUNT, "notifications") \
 +              CREATE_NOTIF_ENTITY(death, name, infoname, centername, \
 +                      NO_MSG, NO_MSG, "", "", "", NO_MSG, NO_MSG, \
 +                      "", "", 0, 1) \
 +      } \
 +      ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
 +
 +// NOW we actually activate the declarations
 +MSG_INFO_NOTIFICATIONS
 +MSG_CENTER_NOTIFICATIONS
 +MSG_WEAPON_NOTIFICATIONS
 +MSG_DEATH_NOTIFICATIONS
 +#undef MSG_INFO_NOTIF
 +#undef MSG_CENTER_NOTIF
 +#undef MSG_WEAPON_NOTIF
 +#undef MSG_DEATH_NOTIF
 +
 +#undef ADD_AUTOCVAR
 +
 +#endif // ifndef MENUQC
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 8ad0ba6479525068ed71cf283ac42fc42b48d5fc,e3689cc3d3337d7ced4df19b02ab9c6053b50697..921a2de850bc7b9f1cb7c912651fc9f70a8b0cc3
@@@ -1067,11 -1160,8 +1063,7 @@@ void readlevelcvars(void
      g_touchexplode_edgedamage = cvar("g_touchexplode_edgedamage");
      g_touchexplode_force = cvar("g_touchexplode_force");
  
- #ifdef ALLOW_FORCEMODELS
-       sv_clforceplayermodels = cvar("sv_clforceplayermodels");
- #endif
        sv_clones = cvar("sv_clones");
 -      sv_gentle = cvar("sv_gentle");
        sv_foginterval = cvar("sv_foginterval");
        g_cloaked = cvar("g_cloaked");
      if(g_cts)
index ff6a2ab27e87deaa35515d5e429bbe6a83000a25,de12407f558d9347c561ef77e8339ca3b35536f9..a66b564773635ce4b1a3d0e1b60b239d3a5cf7b5
@@@ -495,10 -495,10 +495,11 @@@ float spiderbot_frame(
              v_forward = normalize(v_forward);
              v += v_forward * 50;
  
- //void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float headshotbonus, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant)
+ //void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant)
  
              fireBallisticBullet(v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_speed,
-                                 5, autocvar_g_vehicle_spiderbot_minigun_damage, 0, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN, 0, 1, autocvar_g_vehicle_spiderbot_minigun_bulletconstant);
 -                                5, autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_SBMINIGUN, 0, 1, autocvar_g_vehicle_spiderbot_minigun_bulletconstant);
++                                5, autocvar_g_vehicle_spiderbot_minigun_damage, autocvar_g_vehicle_spiderbot_minigun_force, DEATH_VH_SPID_MINIGUN, 0, 1, autocvar_g_vehicle_spiderbot_minigun_bulletconstant);
++
              endFireBallisticBullet();
  
  //            fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
index d7cd57e8225000bf1ddadf35529e5900925f51a4,508a8ba1a04123726fcc8b4ce490ed684f1404ef..4d243a513575bb04ab1703521d2c981801cb8c3c
@@@ -417,6 -399,34 +417,7 @@@ float w_fireball(float req
        {
                precache_sound("weapons/fireball_impact2.wav");
        }
 -      else if (req == WR_SUICIDEMESSAGE)
 -      {
 -              if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%s forgot about some firemine");
 -              else
 -                      w_deathtypestring = _("%s should have used a smaller gun");
 -      }
 -      else if (req == WR_KILLMESSAGE)
 -      {
 -              if(w_deathtype & HITTYPE_SECONDARY)
 -              {
 -                      w_deathtypestring = _("%s fatefully ignored %s's firemine");
 -              }
 -              else
 -              {
 -                      if(w_deathtype & HITTYPE_BOUNCE)
 -                      {
 -                              if(w_deathtype & HITTYPE_SPLASH) // BFG effect
 -                                      w_deathtypestring = _("%s could not hide from %s's fireball");
 -                              else // laser
 -                                      w_deathtypestring = _("%s saw the pretty lights of %s's fireball");
 -                      }
 -                      else if(w_deathtype & HITTYPE_SPLASH)
 -                              w_deathtypestring = _("%s got too close to %s's fireball");
 -                      else
 -                              w_deathtypestring = _("%s tasted %s's fireball");
 -              }
 -      }
++
        return TRUE;
  }
  #endif
Simple merge
index 33b2bda5ff2b99361f0e688f55360c6a9ceea9be,f707bbd6525aacfdf2dc239ae7445b27ab257136..749906638bf0e2ab56e782516983ebeda7dcdb01
@@@ -200,34 -200,6 +200,27 @@@ float w_rifle(float req
        {
                W_Reload(min(autocvar_g_balance_rifle_primary_ammo, autocvar_g_balance_rifle_secondary_ammo), autocvar_g_balance_rifle_reload_ammo, autocvar_g_balance_rifle_reload_time, "weapons/reload.wav");
        }
-                       {
 +      else if (req == WR_SUICIDEMESSAGE)
 +      {
 +              return WEAPON_THINKING_WITH_PORTALS;
 +      }
 +      else if (req == WR_KILLMESSAGE)
 +      {
 +              if(w_deathtype & HITTYPE_SECONDARY)
 +              {
 +                      if(w_deathtype & HITTYPE_BOUNCE)
 +                              return WEAPON_RIFLE_MURDER_HAIL_PIERCING;
 +                      else
 +                              return WEAPON_RIFLE_MURDER_HAIL;
 +              }
 +              else
 +              {
 +                      if(w_deathtype & HITTYPE_BOUNCE)
-                       }
 +                              return WEAPON_RIFLE_MURDER_PIERCING;
-                       {
-                               if(w_deathtype & HITTYPE_HEADSHOT)
-                                       return WEAPON_RIFLE_MURDER_HEADSHOT;
-                               else
-                                       return WEAPON_RIFLE_MURDER;
-                       }
 +                      else
++                              return WEAPON_RIFLE_MURDER;
 +              }
 +      }
        return TRUE;
  }
  #endif
@@@ -255,6 -227,27 +248,7 @@@ float w_rifle(float req
                precache_sound("weapons/ric2.wav");
                precache_sound("weapons/ric3.wav");
        }
 -      else if (req == WR_SUICIDEMESSAGE)
 -      {
 -              w_deathtypestring = _("%s is now thinking with portals");
 -      }
 -      else if (req == WR_KILLMESSAGE)
 -      {
 -              if(w_deathtype & HITTYPE_SECONDARY)
 -              {
 -                      if(w_deathtype & HITTYPE_BOUNCE)
 -                              w_deathtypestring = _("%s failed to hide from %s's rifle bullet hail");
 -                      else
 -                              w_deathtypestring = _("%s died in %s's rifle bullet hail");
 -              }
 -              else
 -              {
 -                      if(w_deathtype & HITTYPE_BOUNCE)
 -                              w_deathtypestring = _("%s failed to hide from %s's rifle");
 -                      else
 -                              w_deathtypestring = _("%s was sniped with a rifle by %s");
 -              }
 -      }
++
        return TRUE;
  }
  #endif
Simple merge
Simple merge
index 15d4ef9d7deb44e9d6690fff01c77cbde572735d,d8d53f2bf4927065df81df3f2a750c4296bae899..43397be001093c5253dfce01b679d3dd464c91ee
@@@ -425,24 -423,6 +423,24 @@@ float w_tuba(float req
                return TRUE; // TODO use fuel?
        else if (req == WR_CHECKAMMO2)
                return TRUE; // TODO use fuel?
-               else if(w_deathtype & HITTYPE_HEADSHOT)
 +      else if (req == WR_SUICIDEMESSAGE)
 +      {
 +              if(w_deathtype & HITTYPE_BOUNCE)
 +                      return WEAPON_ACCORDEON_SUICIDE;
-               else if(w_deathtype & HITTYPE_HEADSHOT)
++              else if(w_deathtype & HITTYPE_SECONDARY)
 +                      return WEAPON_KLEINBOTTLE_SUICIDE;
 +              else
 +                      return WEAPON_TUBA_SUICIDE;
 +      }
 +      else if (req == WR_KILLMESSAGE)
 +      {
 +              if(w_deathtype & HITTYPE_BOUNCE)
 +                      return WEAPON_ACCORDEON_MURDER;
++              else if(w_deathtype & HITTYPE_SECONDARY)
 +                      return WEAPON_KLEINBOTTLE_MURDER;
 +              else
 +                      return WEAPON_TUBA_MURDER;
 +      }
        return TRUE;
  }
  #endif
@@@ -457,6 -437,50 +455,53 @@@ float w_tuba(float req
        {
                // nothing to do
        }
++/*<<<<<<< HEAD
++=======
+       else if (req == WR_SUICIDEMESSAGE)
+       {
+               float instr;
+               instr = 0;
+               if(w_deathtype & HITTYPE_SECONDARY)
+                       instr |= 1;
+               if(w_deathtype & HITTYPE_BOUNCE)
+                       instr |= 2;
+               switch(instr)
+               {
+                       default:
+                       case 0: // Tuba
+                               w_deathtypestring = _("%s hurt his own ears with the @!#%%'n Tuba");
+                               break;
+                       case 1: // Accordeon
+                               w_deathtypestring = _("%s hurt his own ears with the @!#%%'n Accordeon");
+                               break;
+                       case 2: // Klein Bottle
+                               w_deathtypestring = _("%s hurt his own ears with the @!#%%'n Klein Bottle");
+                               break;
+               }
+       }
+       else if (req == WR_KILLMESSAGE)
+       {
+               float instr;
+               instr = 0;
+               if(w_deathtype & HITTYPE_SECONDARY)
+                       instr |= 1;
+               if(w_deathtype & HITTYPE_BOUNCE)
+                       instr |= 2;
+               switch(instr)
+               {
+                       default:
+                       case 0: // Tuba
+                               w_deathtypestring = _("%s died of %s's great playing on the @!#%%'n Tuba");
+                               break;
+                       case 1: // Accordeon
+                               w_deathtypestring = _("%s died of %s's great playing on the @!#%%'n Accordeon");
+                               break;
+                       case 2: // Klein Bottle
+                               w_deathtypestring = _("%s died of %s's great playing on the @!#%%'n Klein Bottle");
+                               break;
+               }
+       }
++>>>>>>> origin/master*/
        return TRUE;
  }
  #endif
Simple merge