]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
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

diff --combined defaultXonotic.cfg
index 65cd7e31c981728c6b03c48620021e5d71bf2700,e3252bea58d04c6c72bee7108bde84d79a3f9a8b..40e583920edc0d5356635e26dd7ccf8019f24a91
@@@ -244,7 -244,6 +244,6 @@@ set sv_friction_on_land 
  set sv_player_viewoffset "0 0 35" "view offset of the player model"
  set sv_player_mins "-16 -16 -24" "playermodel mins"
  set sv_player_maxs "16 16 45" "playermodel maxs"
- set sv_player_headsize "24 24 12" "playermodel headshot bbox size (centered at top of player bbox, preview with r_showbboxes)" // actually SHOULD be 19.2 19.2 10 according to docs
  set sv_player_crouch_viewoffset "0 0 20" "view offset of the player model when crouched"
  set sv_player_crouch_mins "-16 -16 -24" "mins of a crouched playermodel"
  set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel"
@@@ -818,7 -817,6 +817,7 @@@ set g_chat_flood_lmax_tell 2       "private c
  set g_chat_flood_burst_tell 2 "private chat: allow bursts of so many chat lines"
  set g_chat_flood_notify_flooder 1     "when 0, the flooder still can see his own message"
  set g_chat_teamcolors 0       "colorize nicknames in team color for chat"
 +set g_chat_tellprivacy 1 "when disabled, tell messages are also sent to the server console log... otherwise they're kept private between players."
  set g_nick_flood_timeout 120 "time after which nick flood protection resets (set to 0 to disable nick flood checking)"
  set g_nick_flood_penalty 0.5 "duration of the nick flood penalty"
  set g_nick_flood_penalty_yellow 3 "number of changes to allow before warning and movement blocking"
@@@ -1319,14 -1317,13 +1318,13 @@@ set developer_csqcentities 0 "csqc enti
  set waypoint_benchmark 0 "quit after waypoint loading to benchmark bot navigation code"
  set g_debug_bot_commands 0 "print scripted bot commands before executing"
  set g_debug_defaultsounds 0 "always use default sounds"
- set sv_use_csqc_players 1 "set to 0 to disable CSQC players for better Xonotic 0.5 compat"
  set cl_precacheplayermodels 0 "TODO please check if this needs to be 1 or if precaching a model the server already requested is fast enough to do it at runtime"
- seta cl_forceplayermodels 0 "make everyone look like your own model (requires server to have sv_use_csqc_players 1 and sv_defaultcharacter 0)"
- seta cl_forceplayercolors 0 "make everyone look like your own color (requires server to have sv_use_csqc_players 1 and sv_defaultcharacter 0, and is ignored in teamplay with more than two teams)"
- seta cl_forcemyplayermodel "" "set to the model file name you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
- seta cl_forcemyplayerskin 0 "set to the skin number you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
- seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (requires server to have sv_use_csqc_players 1, and is ignored in teamplay; does not affect how enemies look with cl_forceplayermodels)"
- seta cl_movement_errorcompensation 1 "try to compensate for prediction errors and reduce preceived lag (requires server to have sv_use_csqc_players 1)"
+ seta cl_forceplayermodels 0 "make everyone look like your own model (requires server to have sv_defaultcharacter 0)"
+ seta cl_forceplayercolors 0 "make everyone look like your own color (requires server to have sv_defaultcharacter 0, and is ignored in teamplay with more than two teams)"
+ seta cl_forcemyplayermodel "" "set to the model file name you want to show yourself as (does not affect how enemies look with cl_forceplayermodels)"
+ seta cl_forcemyplayerskin 0 "set to the skin number you want to show yourself as (does not affect how enemies look with cl_forceplayermodels)"
+ seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (ignored in teamplay; does not affect how enemies look with cl_forceplayermodels)"
+ seta cl_movement_errorcompensation 1 "try to compensate for prediction errors and reduce preceived lag"
  
  // debug cvars for keyhunt attaching
  set _angles "0 0 0"
diff --combined qcsrc/client/Main.qc
index 9bc8c3cd59e6898096781f8b4817929f69db1bed,d7f65c6ecdc4369988dbca5f08c08618362f0859..c24778b95a3db4be2270b705a20c66bcad860d01
@@@ -149,14 -149,12 +149,14 @@@ void CSQC_Init(void
        teams = Sort_Spawn();
        players = Sort_Spawn();
  
 -      GetTeam(COLOR_SPECTATOR, true); // add specs first
 +      GetTeam(FL_SPECTATOR, true); // add specs first
  
        // needs to be done so early because of the constants they create
        CALL_ACCUMULATED_FUNCTION(RegisterWeapons);
        CALL_ACCUMULATED_FUNCTION(RegisterGametypes);
 -
 +      CALL_ACCUMULATED_FUNCTION(RegisterNotifications);
 +      CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes);
 +      
        WaypointSprite_Load();
  
        // precaches
@@@ -263,16 -261,16 +263,16 @@@ float SetTeam(entity o, float Team
                switch(Team)
                {
                        case -1:
 -                      case COLOR_TEAM1:
 -                      case COLOR_TEAM2:
 -                      case COLOR_TEAM3:
 -                      case COLOR_TEAM4:
 +                      case FL_TEAM_1:
 +                      case FL_TEAM_2:
 +                      case FL_TEAM_3:
 +                      case FL_TEAM_4:
                                break;
                        default:
                                if(GetTeam(Team, false) == world)
                                {
                                        print(sprintf(_("trying to switch to unsupported team %d\n"), Team));
 -                                      Team = COLOR_SPECTATOR;
 +                                      Team = FL_SPECTATOR;
                                }
                                break;
                }
                                if(GetTeam(Team, false) == world)
                                {
                                        print(sprintf(_("trying to switch to unsupported team %d\n"), Team));
 -                                      Team = COLOR_SPECTATOR;
 +                                      Team = FL_SPECTATOR;
                                }
                                break;
                }
@@@ -447,6 -445,7 +447,7 @@@ void Ent_ReadEntCS(
  
        entcs_receiver[self.sv_entnum] = self;
        self.entremove = Ent_RemoveEntCS;
+       self.iflags |= IFLAG_ORIGIN;
  
        InterpolateOrigin_Note();
  }
@@@ -780,8 -779,7 +781,8 @@@ void CSQC_Ent_Update(float bIsNewEntity
                case ENT_CLIENT_TURRET: ent_turret(); break; 
                case ENT_CLIENT_MODEL: CSQCModel_Read(bIsNewEntity); break;
                case ENT_CLIENT_ITEM: ItemRead(bIsNewEntity); break;  
 -              case ENT_CLIENT_BUMBLE_RAYGUN: bumble_raygun_read(bIsNewEntity); break;  
 +              case ENT_CLIENT_BUMBLE_RAYGUN: bumble_raygun_read(bIsNewEntity); break;
 +              case ENT_CLIENT_NOTIFICATION: Read_Notification(bIsNewEntity); break;
                default:
                        //error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
                        error(sprintf(_("Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: %s)\n"), self.enttype, num_for_edict(self), self.classname));
@@@ -1200,6 -1198,10 +1201,6 @@@ float CSQC_Parse_TempEntity(
                        HUD_KillNotify(ReadString(), ReadString(), ReadString(), ReadShort(), ReadByte());
                        bHandled = true;
                        break;
 -              case TE_CSQC_KILLCENTERPRINT:
 -                      HUD_KillCenterprint(ReadString(), ReadString(), ReadShort(), ReadByte());
 -                      bHandled = true;
 -                      break;
                case TE_CSQC_CENTERPRINT_GENERIC:
                        float id;
                        string s;
index 0f23392cf66edb6206d969e36fc21ad450b452cf,9639ea8ef553475670171069d969b7e648321eab..83693e0a851ddcb92c565c6a9c05f4c893887de5
@@@ -218,7 -218,7 +218,7 @@@ void CSQCPlayer_ForceModel_Apply(float 
                entity tm;
  
                for(tm = teams.sort_next; tm; tm = tm.sort_next)
 -                      if(tm.team != COLOR_SPECTATOR)
 +                      if(tm.team != FL_SPECTATOR)
                                ++teams_count;
  
                if(autocvar_cl_forcemyplayercolors)
@@@ -671,6 -671,8 +671,8 @@@ void CSQCModel_Hook_PreDraw(float ispla
  
  void CSQCModel_Hook_PreUpdate(float isnew, float isplayer, float islocalplayer)
  {
+       // interpolate v_angle
+       self.iflags |= IFLAG_V_ANGLE_X;
        // revert to values from server
        CSQCModel_Effects_PreUpdate();
        if(self.isplayermodel)
diff --combined qcsrc/client/hook.qc
index 609a06bbca46ce9e3c95bb7914a1693e826111f7,1c2894afa2bf1e00bd548260b33f6534729985a8..72b87ca4e411eeb08e6d7de48435c2bd33395e96
@@@ -129,22 -129,22 +129,22 @@@ void Draw_GrapplingHook(
                case ENT_CLIENT_HOOK:
                        intensity = 1;
                        offset = 0;
 -                      if(t == COLOR_TEAM1)
 +                      if(t == FL_TEAM_1)
                        {
                                tex = "particles/hook_red";
                                rgb = '1 .3 .3';
                        }
 -                      else if(t == COLOR_TEAM2)
 +                      else if(t == FL_TEAM_2)
                        {
                                tex = "particles/hook_blue";
                                rgb = '.3 .3 1';
                        }
 -                      else if(t == COLOR_TEAM3)
 +                      else if(t == FL_TEAM_3)
                        {
                                tex = "particles/hook_yellow";
                                rgb = '1 1 .3';
                        }
 -                      else if(t == COLOR_TEAM4)
 +                      else if(t == FL_TEAM_4)
                        {
                                tex = "particles/hook_pink";
                                rgb = '1 .3 1';
@@@ -226,7 -226,7 +226,7 @@@ void Ent_ReadHook(float bIsNew, float t
        sf = ReadByte();
  
        self.HookSilent = (sf & 0x80);
-       self.iflags = IFLAG_VELOCITY;
+       self.iflags = IFLAG_VELOCITY | IFLAG_ORIGIN;
  
        InterpolateOrigin_Undo();
  
index c56ee1d2ff67809a0ba6dc9c077bdbf0648edea6,7edabdfc524bbcc5fecc5636d936e5bac72f0343..8bee032385d1c222a737f3d467cf40c01b9aa12d
@@@ -108,7 -108,7 +108,7 @@@ entity GetTeam(float Team, float add
  {
        float num;
        entity tm;
 -      num = (Team == COLOR_SPECTATOR) ? 16 : Team;
 +      num = (Team == FL_SPECTATOR) ? 16 : Team;
        if(teamslots[num])
                return teamslots[num];
        if not(add)
@@@ -164,6 -164,20 +164,6 @@@ string ColorTranslateRGB(string s
                return s;
  }
  
 -string Team_ColorCode(float teamid)
 -{
 -    if (teamid == COLOR_TEAM1)
 -        return "^1";
 -    else if (teamid == COLOR_TEAM2)
 -        return "^4";
 -    else if (teamid == COLOR_TEAM3)
 -        return "^3";
 -    else if (teamid == COLOR_TEAM4)
 -        return "^6";
 -    else
 -        return "^7";
 -}
 -
  // decolorizes and team colors the player name when needed
  string playername(string thename, float teamid)
  {
@@@ -560,19 -574,12 +560,12 @@@ void DrawCircleClippedPic(vector centre
  const vector GETPLAYERORIGIN_ERROR = '1123581321 2357111317 3141592653'; // way out of bounds for anything on the map
  vector getplayerorigin(float pl)
  {
-       string s;
        entity e;
  
        e = CSQCModel_server2csqc(pl + 1);
        if(e)
                return e.origin;
  
- #ifndef NO_LEGACY_NETWORKING
-       s = getplayerkeyvalue(pl, "TEMPHACK_origin");
-       if(s != "")
-               return stov(s);
- #endif
        e = entcs_receiver[pl];
        if(e)
                return e.origin;
index 8714383896d18163b0da5f25665b36cda85262c8,7e9b91d6b81d65daa657a544410ce25fb87e97f9..9ac90e3c35de2124ed394700372e28d224e2594c
@@@ -423,7 -423,7 +423,7 @@@ void Draw_WaypointSprite(
                                spriteimage = self.netname;
                        break;
                case SPRITERULE_TEAMPLAY:
 -                      if(t == COLOR_SPECTATOR + 1)
 +                      if(t == FL_SPECTATOR + 1)
                                spriteimage = self.netname3;
                        else if(self.team == t)
                                spriteimage = self.netname2;
@@@ -656,6 -656,7 +656,7 @@@ void Ent_WaypointSprite(
        self.draw2d = Draw_WaypointSprite;
  
        InterpolateOrigin_Undo();
+       self.iflags |= IFLAG_ORIGIN;
  
        if(sendflags & 0x80)
        {
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
index ead65cc10354d9dfa329c2489eb3184f6f64b38d,08a6297ad44cf21e793edfc86e4949bb474dd0e4..1ea2615eadc2e846e807fd074b13fc6954e32e61
@@@ -94,7 -94,6 +94,6 @@@ float autocvar_g_balance_rifle_primary_
  float autocvar_g_balance_rifle_primary_burstcost;
  float autocvar_g_balance_rifle_primary_damage;
  float autocvar_g_balance_rifle_primary_force;
- float autocvar_g_balance_rifle_primary_headshotaddeddamage;
  float autocvar_g_balance_rifle_primary_lifetime;
  float autocvar_g_balance_rifle_primary_refire;
  float autocvar_g_balance_rifle_primary_shots;
@@@ -109,7 -108,6 +108,6 @@@ float autocvar_g_balance_rifle_secondar
  float autocvar_g_balance_rifle_secondary_burstcost;
  float autocvar_g_balance_rifle_secondary_damage;
  float autocvar_g_balance_rifle_secondary_force;
- float autocvar_g_balance_rifle_secondary_headshotaddeddamage;
  float autocvar_g_balance_rifle_secondary_lifetime;
  float autocvar_g_balance_rifle_secondary_reload;
  float autocvar_g_balance_rifle_secondary_refire;
@@@ -704,7 -702,6 +702,6 @@@ float autocvar_g_balance_uzi_burst_spre
  float autocvar_g_balance_uzi_first;
  float autocvar_g_balance_uzi_first_ammo;
  float autocvar_g_balance_uzi_first_damage;
- float autocvar_g_balance_uzi_first_headshotaddeddamage;
  float autocvar_g_balance_uzi_first_force;
  float autocvar_g_balance_uzi_first_refire;
  float autocvar_g_balance_uzi_first_spread;
@@@ -715,7 -712,6 +712,6 @@@ float autocvar_g_balance_uzi_spread_max
  float autocvar_g_balance_uzi_spread_min;
  float autocvar_g_balance_uzi_sustained_ammo;
  float autocvar_g_balance_uzi_sustained_damage;
- float autocvar_g_balance_uzi_sustained_headshotaddeddamage;
  float autocvar_g_balance_uzi_sustained_force;
  float autocvar_g_balance_uzi_sustained_refire;
  float autocvar_g_balance_uzi_sustained_spread;
@@@ -761,7 -757,6 +757,7 @@@ float autocvar_g_chat_flood_spl_team
  float autocvar_g_chat_flood_spl_tell;
  float autocvar_g_chat_nospectators;
  float autocvar_g_chat_teamcolors;
 +float autocvar_g_chat_tellprivacy;
  float autocvar_g_ctf_allow_vehicle_carry;
  float autocvar_g_ctf_allow_vehicle_touch;
  float autocvar_g_ctf_throw;
@@@ -787,6 -782,7 +783,6 @@@ float autocvar_g_ctf_pass_request
  float autocvar_g_ctf_pass_turnrate;
  float autocvar_g_ctf_pass_timelimit;
  float autocvar_g_ctf_pass_velocity;
 -float autocvar_g_ctf_captimerecord_always;
  float autocvar_g_ctf_dynamiclights;
  string autocvar_g_ctf_flag_blue_model;
  float autocvar_g_ctf_flag_blue_skin;
@@@ -796,6 -792,7 +792,6 @@@ float autocvar_g_ctf_flag_dropped_waypo
  float autocvar_g_ctf_flag_dropped_floatinwater;
  float autocvar_g_ctf_flag_glowtrails;
  float autocvar_g_ctf_flag_health;
 -float autocvar_g_ctf_flag_pickup_verbosename;
  string autocvar_g_ctf_flag_red_model;
  float autocvar_g_ctf_flag_red_skin;
  float autocvar_g_ctf_flag_return_time;
@@@ -896,6 -893,7 +892,6 @@@ float autocvar_g_keyhunt_teams_override
  float autocvar_g_lms_campcheck_damage;
  float autocvar_g_lms_campcheck_distance;
  float autocvar_g_lms_campcheck_interval;
 -string autocvar_g_lms_campcheck_message;
  float autocvar_g_lms_join_anytime;
  float autocvar_g_lms_last_join;
  #define autocvar_g_lms_lives_override cvar("g_lms_lives_override")
@@@ -1165,10 -1163,13 +1161,10 @@@ float autocvar_sv_eventlog_files_counte
  string autocvar_sv_eventlog_files_nameprefix;
  string autocvar_sv_eventlog_files_namesuffix;
  float autocvar_sv_eventlog_files_timestamps;
 -float autocvar_sv_fraginfo;
 -float autocvar_sv_fraginfo_handicap;
 -float autocvar_sv_fraginfo_ping;
 -float autocvar_sv_fraginfo_stats;
  float autocvar_sv_friction;
  float autocvar_sv_friction_on_land;
  float autocvar_sv_gameplayfix_q2airaccelerate;
 +float autocvar_sv_gentle;
  #define autocvar_sv_gravity cvar("sv_gravity")
  string autocvar_sv_intermission_cdtrack;
  string autocvar_sv_jumpspeedcap_max;
index 23405484e0730ba162ebea5cf19b2426e74b0782,1c4f220e2706ade1e7ee30cb5079cf3f0056698b..35b7128cb38c082524b24e7ac994dd321b15dbda
@@@ -425,11 -425,12 +425,11 @@@ void PutObserverInServer (void
  
        if(self.killcount != -666) {
                if(g_lms) {
 -                      if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0)
 -                              bprint ("^4", self.netname, "^4 has no more lives left\n");
 +                      if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0 && self.lms_spectate_warning != 2)
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, INFO_LMS_NOLIVES, self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        else
 -                              bprint ("^4", self.netname, "^4 is spectating now\n"); // TODO turn this into a proper forfeit?
 -              } else
 -                      bprint ("^4", self.netname, "^4 is spectating now\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, INFO_LMS_FORFEIT, self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
 +              } else { Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, INFO_QUIT_SPECTATE, self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG); }
  
                if(self.just_joined == FALSE) {
                        LogTeamchange(self.playerid, -1, 4);
@@@ -563,7 -564,7 +563,7 @@@ void FixPlayermodel(
                if(teamplay)
                {
                        string s;
 -                      s = Team_ColorNameLowerCase(self.team);
 +                      s = Team_ColorName_Lower(self.team);
                        if(s != "neutral")
                        {
                                defaultmodel = cvar_string(strcat("sv_defaultplayermodel_", s));
@@@ -695,7 -696,7 +695,7 @@@ void PutClientInServer (void
                spot = SelectSpawnPoint (FALSE);
                if(!spot)
                {
 -                      centerprint(self, "Sorry, no spawnpoints available!\nHope your team can fix it...");
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_JOIN_NOSPAWNS, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        return; // spawn failed
                }
  
  
                if(g_assault) {
                        if(self.team == assault_attacker_team)
 -                              centerprint(self, "You are attacking!");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_TEAM, self, MSG_CENTER, CENTER_ASSAULT_ATTACKING, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        else
 -                              centerprint(self, "You are defending!");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_TEAM, self, MSG_CENTER, CENTER_ASSAULT_DEFENDING, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                }
  
                target_voicescript_clear(self);
@@@ -1082,7 -1083,7 +1082,7 @@@ void ClientKill_Now_TeamChange(
                if(g_ca)
                        self.caplayer = 0;
                if(blockSpectators)
 -                      sprint(self, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_SPECTATE_WARNING, NO_STR_ARG, NO_STR_ARG, autocvar_g_maxplayers_spectator_blocktime, NO_FL_ARG, NO_FL_ARG);
                PutObserverInServer();
        }
        else
@@@ -1233,28 -1234,28 +1233,28 @@@ void ClientKill_TeamChange (float targe
                        self.killindicator.colormod = '0 0 0';
                        if(clienttype(self) == CLIENTTYPE_REAL)
                        if(self.killindicator.cnt > 0)
 -                              Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "^1Suicide in %d seconds", 1, self.killindicator.cnt);
 +                              Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_SUICIDE, NO_STR_ARG, NO_STR_ARG, self.killindicator.cnt, NO_FL_ARG, NO_FL_ARG);
                }
                else if(targetteam == -1) // auto
                {
                        self.killindicator.colormod = '0 1 0';
                        if(clienttype(self) == CLIENTTYPE_REAL)
                        if(self.killindicator.cnt > 0)
 -                              Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Changing team in %d seconds", 1, self.killindicator.cnt);
 +                              Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_AUTO, NO_STR_ARG, NO_STR_ARG, self.killindicator.cnt, NO_FL_ARG, NO_FL_ARG);
                }
                else if(targetteam == -2) // spectate
                {
                        self.killindicator.colormod = '0.5 0.5 0.5';
                        if(clienttype(self) == CLIENTTYPE_REAL)
                        if(self.killindicator.cnt > 0)
 -                              Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Spectating in %d seconds", 1, self.killindicator.cnt);
 +                              Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_SPECTATE, NO_STR_ARG, NO_STR_ARG, self.killindicator.cnt, NO_FL_ARG, NO_FL_ARG);
                }
                else
                {
 -                      self.killindicator.colormod = TeamColor(targetteam);
 +                      self.killindicator.colormod = Team_ColorRGB(targetteam);
                        if(clienttype(self) == CLIENTTYPE_REAL)
                        if(self.killindicator.cnt > 0)
 -                              Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, strcat("Changing to ", ColoredTeamName(targetteam), " in %d seconds"), 1, self.killindicator.cnt);
 +                              Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, APP_TEAM_NUM_4(targetteam, CENTER_TEAMCHANGE_), NO_STR_ARG, NO_STR_ARG, self.killindicator.cnt, NO_FL_ARG, NO_FL_ARG);
                }
        }
  
@@@ -1296,7 -1297,7 +1296,7 @@@ void FixClientCvars(entity e
                stuffcmd(e, "cl_cmd settemp cl_movecliptokeyboard 2\n");
        if(autocvar_g_antilag == 3) // client side hitscan
                stuffcmd(e, "cl_cmd settemp cl_prydoncursor_notrace 0\n");
 -      if(sv_gentle)
 +      if(autocvar_sv_gentle)
                stuffcmd(e, "cl_cmd settemp cl_gentle 1\n");
        /*
         * we no longer need to stuff this. Remove this comment block if you feel
@@@ -1345,6 -1346,7 +1345,6 @@@ ClientConnec
  Called when a client connects to the server
  =============
  */
 -string ColoredTeamName(float t);
  void DecodeLevelParms (void);
  //void dom_player_join_team(entity pl);
  void set_dom_state(entity e);
@@@ -1364,7 -1366,7 +1364,7 @@@ void ClientConnect (void
        DecodeLevelParms();
  
  #ifdef WATERMARK
 -      sprint(self, strcat("^4SVQC Build information: ^1", WATERMARK, "\n"));
 +      Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_WATERMARK, WATERMARK, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
  #endif
  
        self.classname = "player_joining";
        self.flags = FL_CLIENT;
        self.version_nagtime = time + 10 + random() * 10;
  
 +      if(self.netaddress == "local")
 +      {
 +              //print("^3server is local!\n");
 +
 +              if(server_is_local)
 +                      error("Multiple local clients???");
 +              else
 +                      server_is_local = TRUE;
 +      }
 +
        if(player_count<0)
        {
                dprint("BUG player count is lower than zero, this cannot happen!\n");
                {
                        switch(autocvar_g_campaign_forceteam)
                        {
 -                              case 1: self.team_forced = COLOR_TEAM1; break;
 -                              case 2: self.team_forced = COLOR_TEAM2; break;
 -                              case 3: self.team_forced = COLOR_TEAM3; break;
 -                              case 4: self.team_forced = COLOR_TEAM4; break;
 +                              case 1: self.team_forced = FL_TEAM_1; break;
 +                              case 2: self.team_forced = FL_TEAM_2; break;
 +                              case 3: self.team_forced = FL_TEAM_3; break;
 +                              case 4: self.team_forced = FL_TEAM_4; break;
                                default: self.team_forced = 0;
                        }
                }
        }
        else if(PlayerInIDList(self, autocvar_g_forced_team_red))
 -              self.team_forced = COLOR_TEAM1;
 +              self.team_forced = FL_TEAM_1;
        else if(PlayerInIDList(self, autocvar_g_forced_team_blue))
 -              self.team_forced = COLOR_TEAM2;
 +              self.team_forced = FL_TEAM_2;
        else if(PlayerInIDList(self, autocvar_g_forced_team_yellow))
 -              self.team_forced = COLOR_TEAM3;
 +              self.team_forced = FL_TEAM_3;
        else if(PlayerInIDList(self, autocvar_g_forced_team_pink))
 -              self.team_forced = COLOR_TEAM4;
 +              self.team_forced = FL_TEAM_4;
        else if(autocvar_g_forced_team_otherwise == "red")
 -              self.team_forced = COLOR_TEAM1;
 +              self.team_forced = FL_TEAM_1;
        else if(autocvar_g_forced_team_otherwise == "blue")
 -              self.team_forced = COLOR_TEAM2;
 +              self.team_forced = FL_TEAM_2;
        else if(autocvar_g_forced_team_otherwise == "yellow")
 -              self.team_forced = COLOR_TEAM3;
 +              self.team_forced = FL_TEAM_3;
        else if(autocvar_g_forced_team_otherwise == "pink")
 -              self.team_forced = COLOR_TEAM4;
 +              self.team_forced = FL_TEAM_4;
        else if(autocvar_g_forced_team_otherwise == "spectate")
                self.team_forced = -1;
        else if(autocvar_g_forced_team_otherwise == "spectator")
  
        self.netname_previous = strzone(self.netname);
  
 -      bprint("^4", self.netname, "^4 connected");
 -
 -      if(self.classname != "observer" && (g_domination || g_ctf))
 -              bprint(" and joined the ", ColoredTeamName(self.team));
 -
 -      bprint("\n");
 +      if((self.classname == STR_PLAYER && teamplay))
 +              Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, APP_TEAM_ENT_4(self, INFO_JOIN_CONNECT_TEAM_), self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
 +      else
 +              Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, INFO_JOIN_CONNECT, self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
  
        stuffcmd(self, strcat(clientstuff, "\n"));
        stuffcmd(self, "cl_particles_reloadeffects\n"); // TODO do we still need this?
        self.spectatortime = time;
        if(blockSpectators)
        {
 -              sprint(self, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n"));
 +              Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_SPECTATE_WARNING, NO_STR_ARG, NO_STR_ARG, autocvar_g_maxplayers_spectator_blocktime, NO_FL_ARG, NO_FL_ARG);
        }
  
        self.jointime = time;
@@@ -1641,8 -1635,8 +1641,8 @@@ void ClientDisconnect (void
  
        if(autocvar_sv_eventlog)
                GameLogEcho(strcat(":part:", ftos(self.playerid)));
 -      bprint ("^4",self.netname);
 -      bprint ("^4 disconnected\n");
 +              
 +      Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, INFO_QUIT_DISCONNECT, self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
  
        DropAllRunes(self);
        MUTATOR_CALLHOOK(ClientDisconnect);
@@@ -1813,7 -1807,7 +1813,7 @@@ void player_powerups (void
                                self.alpha = default_player_alpha;
                                self.exteriorweaponentity.alpha = default_weapon_alpha;
                                self.items &~= IT_STRENGTH;
 -                              sprint(self, "^3Invisibility has worn off\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERDOWN_INVISIBILITY, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
                else
                                self.alpha = g_minstagib_invis_alpha;
                                self.exteriorweaponentity.alpha = g_minstagib_invis_alpha;
                                self.items |= IT_STRENGTH;
 -                              sprint(self, "^3You are invisible\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERUP_INVISIBILITY, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
  
                        if (time > self.invincible_finished)
                        {
                                self.items = self.items - (self.items & IT_INVINCIBLE);
 -                              sprint(self, "^3Speed has worn off\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERDOWN_SPEED, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
                else
                        if (time < self.invincible_finished)
                        {
                                self.items = self.items | IT_INVINCIBLE;
 -                              sprint(self, "^3You are on speed\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERUP_SPEED, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
        }
                        if (time > self.strength_finished)
                        {
                                self.items = self.items - (self.items & IT_STRENGTH);
 -                              sprint(self, "^3Strength has worn off\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERDOWN_STRENGTH, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
                else
                        if (time < self.strength_finished)
                        {
                                self.items = self.items | IT_STRENGTH;
 -                              sprint(self, "^3Strength infuses your weapons with devastating power\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERUP_STRENGTH, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
                if (self.items & IT_INVINCIBLE)
                        if (time > self.invincible_finished)
                        {
                                self.items = self.items - (self.items & IT_INVINCIBLE);
 -                              sprint(self, "^3Shield has worn off\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERDOWN_SHIELD, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
                else
                        if (time < self.invincible_finished)
                        {
                                self.items = self.items | IT_INVINCIBLE;
 -                              sprint(self, "^3Shield surrounds you\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_POWERUP_SHIELD, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                }
                if (self.items & IT_SUPERWEAPON)
                        {
                                self.superweapons_finished = 0;
                                self.items = self.items - (self.items & IT_SUPERWEAPON);
 -                              sprint(self, "^3Superweapons have been lost\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_SUPERWEAPON_LOST, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                        else if (self.items & IT_UNLIMITED_SUPERWEAPONS)
                        {
                                {
                                        self.items = self.items - (self.items & IT_SUPERWEAPON);
                                        WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS);
 -                                      sprint(self, "^3Superweapons have broken down\n");
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_SUPERWEAPON_BROKEN, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                                }
                        }
                }
                        if (time < self.superweapons_finished || (self.items & IT_UNLIMITED_SUPERWEAPONS))
                        {
                                self.items = self.items | IT_SUPERWEAPON;
 -                              sprint(self, "^3You now have a superweapon\n");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_INFO, INFO_SUPERWEAPON_PICKUP, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        }
                        else
                        {
@@@ -2332,8 -2326,8 +2332,8 @@@ void LeaveSpectatorMode(
  
                        PutClientInServer();
  
 -                      if(self.classname == "player")
 -                              bprint ("^4", self.netname, "^4 is playing now\n");
 +                      if(self.classname == STR_PLAYER)
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, INFO_JOIN_PLAY, self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
  
                        if(!autocvar_g_campaign)
                        if (time < self.jointime + autocvar_welcome_message_time)
  
                        if (self.prevent_join_msgtime)
                        {
 -                              Send_CSQC_Centerprint_Generic_Expire(self, CPID_PREVENT_JOIN);
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_JOIN_PREVENT, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                                self.prevent_join_msgtime = 0;
                        }
  
@@@ -2411,7 -2405,7 +2411,7 @@@ float nJoinAllowed(entity ignore) 
  void checkSpectatorBlock() {
        if(self.classname == "spectator" || self.classname == "observer") {
                if( time > (self.spectatortime + autocvar_g_maxplayers_spectator_blocktime) ) {
 -                      sprint(self, "^7You were kicked from the server because you are spectator and spectators aren't allowed at the moment.\n");
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_QUIT_KICK_SPECTATING, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                        dropclient(self);
                }
        }
@@@ -2598,7 -2592,7 +2598,7 @@@ void PlayerPreThink (void
                                        {
                                                // notify release users if connecting to git
                                                dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
 -                                              sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
 +                                              Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_VERSION_BETA, autocvar_g_xonoticversion, self.cvar_g_xonoticversion, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                                        }
                                        else
                                        {
                                                {
                                                        // give users new version
                                                        dprint("^1NOTE^7 to ", self.netname, "^7 - ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.org/^1!\n");
 -                                                      sprint(self, strcat("\{1}^1NOTE: ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.org/^1!\n"));
 +                                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_VERSION_OUTDATED, autocvar_g_xonoticversion, self.cvar_g_xonoticversion, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                                                }
                                                else if(r > 0)
                                                {
                                                        // notify users about old server version
                                                        print("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n");
 -                                                      sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"));
 +                                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_VERSION_OLD, autocvar_g_xonoticversion, self.cvar_g_xonoticversion, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                                                }
                                        }
                                }
        // GOD MODE info
        if(!(self.flags & FL_GODMODE)) if(self.max_armorvalue)
        {
 -              sprint(self, strcat("godmode saved you ", ftos(self.max_armorvalue), " units of damage, cheater!\n"));
 +              Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_GODMODE_OFF, NO_STR_ARG, NO_STR_ARG, self.max_armorvalue, NO_FL_ARG, NO_FL_ARG);
                self.max_armorvalue = 0;
        }
  
  
                if(frametime)
                {
- #ifndef NO_LEGACY_NETWORKING
-                       self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
- #endif
                        if(self.weapon == WEP_NEX && autocvar_g_balance_nex_charge)
                        {
                                self.weaponentity_glowmod_x = autocvar_g_weapon_charge_colormod_hdrmultiplier * autocvar_g_weapon_charge_colormod_red_half * min(1, self.nex_charge / autocvar_g_balance_nex_charge_animlimit);
                                //sprint(self, "distance: ", ftos(self.lms_traveled_distance), "\n");
                                if(self.lms_traveled_distance < autocvar_g_lms_campcheck_distance)
                                {
 -                                      centerprint(self, autocvar_g_lms_campcheck_message);
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, self, MSG_CENTER, CENTER_LMS_CAMPCHECK, NO_STR_ARG, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                                        // FIXME KadaverJack: gibbing player here causes playermodel to bounce around, instead of eye.md3
                                        // I wasn't able to find out WHY that happens, so I put a workaround in place that shall prevent players from being gibbed :(
                                        Damage(self, self, self, bound(0, autocvar_g_lms_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP, self.origin, '0 0 0');
@@@ -2971,18 -2961,6 +2967,6 @@@ Called every frame for each client afte
  =============
  */
  .float idlekick_lasttimeleft;
- .entity showheadshotbbox;
- void showheadshotbbox_think()
- {
-       if(self.owner.showheadshotbbox != self)
-       {
-               remove(self);
-               return;
-       }
-       self.nextthink = time;
-       setorigin(self, self.owner.origin);
-       setsize(self, GetHeadshotMins(self.owner), GetHeadshotMaxs(self.owner));
- }
  void PlayerPostThink (void)
  {
        // Savage: Check for nameless players
        {
                if (time - self.parm_idlesince < 1) // instead of (time == self.parm_idlesince) to support sv_maxidle <= 10
                {
 -                      if(self.idlekick_lasttimeleft)
 -                      {
 -                              Send_CSQC_Centerprint_Generic_Expire(self, CPID_DISCONNECT_IDLING);
 -                              self.idlekick_lasttimeleft = 0;
 -                      }
 +                      if(self.idlekick_lasttimeleft) { self.idlekick_lasttimeleft = 0; }
                }
                else
                {
                        if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10
                        {
                                if(!self.idlekick_lasttimeleft)
 -                                      Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft);
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_DISCONNECT_IDLING, NO_STR_ARG, NO_STR_ARG, timeleft, NO_FL_ARG, NO_FL_ARG);
                        }
                        if(timeleft <= 0)
                        {
 -                              bprint("^3", self.netname, "^3 was kicked for idling.\n");
 -                              AnnounceTo(self, "terminated");
 +                              Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, INFO_QUIT_KICK_IDLING, self.netname, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                                dropclient(self);
                                return;
                        }
        if(self.waypointsprite_attachedforcarrier)
                WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent));
  
-       if(self.classname == "player" && self.deadflag == DEAD_NO && autocvar_r_showbboxes)
-       {
-               if(!self.showheadshotbbox)
-               {
-                       self.showheadshotbbox = spawn();
-                       self.showheadshotbbox.classname = "headshotbbox";
-                       self.showheadshotbbox.owner = self;
-                       self.showheadshotbbox.think = showheadshotbbox_think;
-                       self.showheadshotbbox.nextthink = time;
-                       self = self.showheadshotbbox;
-                       self.think();
-                       self = self.owner;
-               }
-       }
-       else
-       {
-               if(self.showheadshotbbox)
-                       if(self.showheadshotbbox && !wasfreed(self.showheadshotbbox))
-                 remove(self.showheadshotbbox);
-       }
        playerdemo_write();
  
        if((g_cts || g_race) && self.cvar_cl_allow_uidtracking == 1 && self.cvar_cl_allow_uid2name == 1)
index 10ca2ccab33c23c9586f505af261300474b5fd41,e81b08e58e73094a76f7c8c3e0fc1d84b757140a..cb44da03fe794cada0243885dd44b53f0a974860
@@@ -252,11 -252,6 +252,6 @@@ void player_anim (void
        animdecide_setstate(self, animbits, FALSE);
        animdecide_setimplicitstate(self, (self.flags & FL_ONGROUND));
  
- #ifndef NO_LEGACY_NETWORKING
-       if(!self.iscsqcmodel)
-               animdecide_setframes(self, FALSE, frame, frame1time, frame2, frame2time);
- #endif
        if (self.weaponentity)
        {
                updateanim(self.weaponentity);
@@@ -472,7 -467,7 +467,7 @@@ void PlayerDamage (entity inflictor, en
                        {
                                self.pain_finished = time + 0.5;        //Supajoe
  
 -                              if(sv_gentle < 1) {
 +                              if(autocvar_sv_gentle < 1) {
                                        if(self.classname != "body") // pain anim is BORKED on our ZYMs, FIXME remove this once we have good models
                                        {
                                                if (!self.animstate_override)
                if(valid_damage_for_weaponstats)
                        WeaponStats_LogKill(awep, abot, self.weapon, vbot);
  
 -              if(sv_gentle < 1) // TODO make a "gentle" version?
 +              if(autocvar_sv_gentle < 1) // TODO make a "gentle" version?
                if(sound_allowed(MSG_BROADCAST, attacker))
                {
                        if(deathtype == DEATH_DROWN)
                // set up to fade out later
                SUB_SetFade (self, time + 6 + random (), 1);
  
 -              if(sv_gentle > 0 || autocvar_ekg) {
 +              if(autocvar_sv_gentle > 0 || autocvar_ekg) {
                        // remove corpse
                        PlayerCorpseDamage (inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, hitloc, force);
                }
@@@ -938,18 -933,17 +933,18 @@@ float Say(entity source, float teamsay
                        if(sourcecmsgstr != "" && !privatesay)
                                centerprint(source, sourcecmsgstr);
                }
 -              else if(privatesay) // private message, between 2 people only, not sent to server console
 +              else if(privatesay) // private message, between 2 people only
                {
                        sprint(source, sourcemsgstr);
                        sprint(privatesay, msgstr);
 +                      if not(autocvar_g_chat_tellprivacy) { dedicated_print(msgstr); } // send to server console too if "tellprivacy" is disabled
                        if(cmsgstr != "")
                                centerprint(privatesay, cmsgstr);
                }
                else if(teamsay > 0) // team message, only sent to team mates
                {
                        sprint(source, sourcemsgstr);
 -                      //print(msgstr); // send to server console too
 +                      dedicated_print(msgstr); // send to server console too
                        if(sourcecmsgstr != "")
                                centerprint(source, sourcecmsgstr);
                        FOR_EACH_REALPLAYER(head) if(head.team == source.team)
                else if(teamsay < 0) // spectator message, only sent to spectators
                {
                        sprint(source, sourcemsgstr);
 -                      //print(msgstr); // send to server console too
 +                      dedicated_print(msgstr); // send to server console too
                        FOR_EACH_REALCLIENT(head) if(head.classname != "player")
                                if(head != source)
                                        sprint(head, msgstr);
                else if(sourcemsgstr != msgstr) // trimmed/server fixed message, sent to all players
                {
                        sprint(source, sourcemsgstr);
 -                      //print(msgstr); // send to server console too
 +                      dedicated_print(msgstr); // send to server console too
                        FOR_EACH_REALCLIENT(head)
                                if(head != source)
                                        sprint(head, msgstr);
@@@ -1153,7 -1147,7 +1148,7 @@@ void FakeGlobalSound(string sample, flo
                                break;
                        if(!sv_taunt)
                                break;
 -                      if(sv_gentle)
 +                      if(autocvar_sv_gentle)
                                break;
                        tauntrand = random();
                        msg_entity = self;
                                        animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
                        if(!sv_taunt)
                                break;
 -                      if(sv_gentle)
 +                      if(autocvar_sv_gentle)
                                break;
                        msg_entity = self;
                        if (msg_entity.cvar_cl_voice_directional >= 1)
@@@ -1250,7 -1244,7 +1245,7 @@@ void GlobalSound(string sample, float c
                                break;
                        if(!sv_taunt)
                                break;
 -                      if(sv_gentle)
 +                      if(autocvar_sv_gentle)
                                break;
                        tauntrand = random();
                        FOR_EACH_REALCLIENT(msg_entity)
                                        animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
                        if(!sv_taunt)
                                break;
 -                      if(sv_gentle)
 +                      if(autocvar_sv_gentle)
                                break;
                        FOR_EACH_REALCLIENT(msg_entity)
                        {
@@@ -1316,8 -1310,14 +1311,8 @@@ void VoiceMessage(string type, string m
                FakeGlobalSound(self.sample, CH_VOICE, voicetype);
  }
  
 -void MoveToTeam(entity client, float team_colour, float type, float show_message)
 +void MoveToTeam(entity client, float team_colour, float type)
  {
 -//    show_message
 -//    0 (00) automove centerprint, admin message
 -//    1 (01) automove centerprint, no admin message
 -//    2 (10) no centerprint, admin message
 -//    3 (11) no centerprint, no admin message
 -
        float lockteams_backup;
  
        lockteams_backup = lockteams;  // backup any team lock
  
        TeamchangeFrags(client);  // move the players frags
        SetPlayerColors(client, team_colour - 1);  // set the players colour
 -      Damage(client, client, client, 100000, ((show_message & 2) ? DEATH_QUIET : DEATH_AUTOTEAMCHANGE), client.origin, '0 0 0');  // kill the player
 +      Damage(client, client, client, 100000, DEATH_AUTOTEAMCHANGE, client.origin, '0 0 0');  // kill the player
  
        lockteams = lockteams_backup;  // restore the team lock
  
        LogTeamchange(client.playerid, client.team, type);
 -
 -      if not(show_message & 1) // admin message
 -              sprint(client, strcat("\{1}\{13}^3", admin_name(), "^7: You have been moved to the ", Team_ColorNameLowerCase(team_colour), " team\n"));  // send a chat message
 -
 -      bprint(strcat(client.netname, " joined the ", ColoredTeamName(client.team), "\n"));
  }
diff --combined qcsrc/server/defs.qh
index 58fb8a086972201443f5a9c8df68156c771c0d2e,bfea6b2bcb39f681c8d6110d81db1d90b0399f70..266782e3390a77fc5c627ff2a31edd723a86d317
@@@ -39,6 -39,7 +39,6 @@@ float g_pickup_respawntimejitter_poweru
  float g_jetpack;
  
  float sv_clones;
 -float sv_gentle;
  float sv_foginterval;
  
  entity        activator;
@@@ -57,8 -58,6 +57,8 @@@ float team1_score, team2_score, team3_s
  
  float maxclients;
  
 +float server_is_local; // innocent until proven guilty by ClientConnect() in cl_client.qc
 +
  // Fields
  
  .void(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) event_damage;
@@@ -278,11 -277,6 +278,6 @@@ float default_weapon_alpha
  .string cvar_g_xonoticversion;
  .string cvar_cl_weaponpriority;
  .string cvar_cl_weaponpriorities[10];
- #ifdef ALLOW_FORCEMODELS
- .float cvar_cl_forceplayermodels;
- .float cvar_cl_forceplayermodelsfromxonotic;
- float sv_clforceplayermodels;
- #endif
  .float cvar_cl_gunalign;
  .float cvar_cl_noantilag;
  
diff --combined qcsrc/server/g_damage.qc
index f2ba98b51bf20f1de9c7b7d048e71d0b78cc4324,31512fbff0675330ade9ec6cf3a18763989e20df..4cb2eb1be13f0c75c9987c72351a6bec4ff37194
@@@ -47,8 -47,6 +47,6 @@@ float checkrules_firstblood
  float yoda;
  float damage_goodhits;
  float damage_gooddamage;
- float headshot;
- float damage_headshotbonus; // bonus multiplier for head shots, set to 0 after use
  
  .float dmg_team;
  .float teamkill_complain;
@@@ -86,15 -84,6 +84,6 @@@ float IsFlying(entity a
        return 1;
  }
  
- vector GetHeadshotMins(entity targ)
- {
-       return '-0.5 0 0' * PL_HEAD_x + '0 -0.5 0' * PL_HEAD_y + '0 0 1' * (targ.maxs_z - PL_HEAD_z);
- }
- vector GetHeadshotMaxs(entity targ)
- {
-       return '0.5 0 0' * PL_HEAD_x + '0 0.5 0' * PL_HEAD_y + '0 0 1' * targ.maxs_z;
- }
  void UpdateFrags(entity player, float f)
  {
        PlayerTeamScore_AddScore(player, f);
@@@ -227,7 -216,7 +216,7 @@@ void GiveFrags (entity attacker, entit
                UpdateFrags(attacker, f);
  }
  
 -string Obituary_ExtraFragInfo(entity player) // Extra fragmessage information
 +/*string Obituary_ExtraFragInfo(entity player) // Extra fragmessage information
  {
        string health_output = string_null;
        string ping_output = string_null;
        }
        
        return output;
 -}
 +}*/
  
  string AppendItemcodes(string s, entity player)
  {
@@@ -297,7 -286,7 +286,7 @@@ void LogDeath(string mode, float deatht
        s = strcat(":kill:", mode);
        s = strcat(s, ":", ftos(killer.playerid));
        s = strcat(s, ":", ftos(killed.playerid));
 -      s = strcat(s, ":type=", ftos(deathtype));
 +      s = strcat(s, ":type=", Deathtype_Name(deathtype));
        s = strcat(s, ":items=");
        s = AppendItemcodes(s, killer);
        if(killed != killer)
        GameLogEcho(s);
  }
  
 -void Send_KillNotification (string s1, string s2, string s3, float msg, float type)
 -{
 -      WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
 -      WriteByte(MSG_BROADCAST, TE_CSQC_KILLNOTIFY);
 -      WriteString(MSG_BROADCAST, s1);
 -      WriteString(MSG_BROADCAST, s2);
 -      WriteString(MSG_BROADCAST, s3);
 -      WriteShort(MSG_BROADCAST, msg);
 -      WriteByte(MSG_BROADCAST, type);
 -}
 +#define INFO_NO_MSG 0
  
 -// Function is used to send a generic centerprint whose content CSQC gets to decide (gentle version or not in the below cases)
 -void Send_CSQC_KillCenterprint(entity e, string s1, string s2, float msg, float type)
 +void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, string s1, string s2, float f1, float f2, float f3)
  {
 -      if (clienttype(e) == CLIENTTYPE_REAL)
 +      float handled = 0, hits = 0;
 +      if(DEATH_ISSPECIAL(deathtype))
        {
 -              msg_entity = e;
 -              WRITESPECTATABLE_MSG_ONE({
 -                      WriteByte(MSG_ONE, SVC_TEMPENTITY);
 -                      WriteByte(MSG_ONE, TE_CSQC_KILLCENTERPRINT);
 -                      WriteString(MSG_ONE, s1);
 -                      WriteString(MSG_ONE, s2);
 -                      WriteShort(MSG_ONE, msg);
 -                      WriteByte(MSG_ONE, type);
 -              });
 +              #define DEATHTYPE(name,msg_death,msg_death_by,position) \
 +                      { if(deathtype == max(0, name)) \
 +                      { \
 +                              #if msg_death != NO_MSG \
 +                                      if not(murder) \
 +                                      { \
 +                                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, notif_target, MSG_DEATH, msg_death, s1, s2, f1, f2, f3); \
 +                                              Send_Notification_Legacy_Wrapper(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death, s1, s2, f1, f2, f3); \
 +                                              ++handled; \
 +                                      } \
 +                              #endif \
 +                              #if msg_death_by != NO_MSG \
 +                                      if(murder) \
 +                                      { \
 +                                              Send_Notification_Legacy_Wrapper(NOTIF_ONE, notif_target, MSG_DEATH, msg_death_by, s1, s2, f1, f2, f3); \
 +                                              Send_Notification_Legacy_Wrapper(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, INFO_##msg_death_by, s1, s2, f1, f2, f3); \
 +                                              ++handled; \
 +                                      } \
 +                              #endif \
 +                              ++hits; \
 +                      } }
 +
 +              DEATHTYPES
 +              #undef DEATHTYPE
 +              
 +              if not(hits)
 +              {
 +                      backtrace("Obituary_SpecialDeath(): Unhandled deathtype- Please notify Samual!\n");
 +              }
 +              if not(handled)
 +              {
 +                      dprint(sprintf("Obituary_SpecialDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification!\n", Deathtype_Name(deathtype), deathtype));
 +                      return;
 +              }
        }
  }
  
 -void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
 +float w_deathtype;
 +float Obituary_WeaponDeath(entity notif_target, float murder, float deathtype, string s1, string s2, float f1)
  {
 -      string  s, a, msg;
 -      float type;
 +      float death_weapon = DEATH_WEAPONOF(deathtype);
  
 -      if (targ.classname == "player")
 +      if(death_weapon)
        {
 -              s = targ.netname;
 -              a = attacker.netname;
 +              w_deathtype = deathtype;
 +              float death_message = weapon_action(death_weapon, ((murder) ? WR_KILLMESSAGE : WR_SUICIDEMESSAGE));
 +              w_deathtype = FALSE;
  
 -              if (targ == attacker) // suicides
 +              if(death_message)
                {
 -                      if (deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
 -                              msg = ColoredTeamName(targ.team); // TODO: check if needed?
 -                      else
 -                              msg = "";
 -            if(!g_cts) // no "killed your own dumb self" message in CTS
 -                Send_CSQC_KillCenterprint(targ, msg, "", deathtype, MSG_SUICIDE);
 -
 -                      if(deathtype != DEATH_TEAMCHANGE && deathtype != DEATH_QUIET)
 -                      {
 -                              LogDeath("suicide", deathtype, targ, targ);
 -                              GiveFrags(attacker, targ, -1, deathtype);
 -                      }
 -
 -                      if (targ.killcount > 2)
 -                              msg = ftos(targ.killcount);
 -                      else
 -                              msg = "";
 -                      if(teamplay && deathtype == DEATH_MIRRORDAMAGE)
 -                      {
 -                              if(attacker.team == COLOR_TEAM1)
 -                                      deathtype = KILL_TEAM_RED;
 -                              else
 -                                      deathtype = KILL_TEAM_BLUE;
 -                      }
 -
 -                      Send_KillNotification(s, msg, "", deathtype, MSG_SUICIDE);
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, notif_target, MSG_WEAPON, death_message, s1, s2, f1, NO_FL_ARG, NO_FL_ARG);
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ANY_EXCEPT, notif_target, MSG_INFO, Get_Notif_Infval(MSG_WEAPON, death_message), s1, s2, f1, NO_FL_ARG, NO_FL_ARG);
 +                      //print(Get_Field_Value(F_INFVAL, MSG_WEAPON, death_message), "\n");
                }
 -              else if (attacker.classname == "player")
 -              {
 -                      if(!IsDifferentTeam(attacker, targ))
 -                      {
 -                              if(attacker.team == COLOR_TEAM1)
 -                                      type = KILL_TEAM_RED;
 -                              else
 -                                      type = KILL_TEAM_BLUE;
 -
 -                              GiveFrags(attacker, targ, -1, deathtype);
 +              else { dprint(sprintf("Obituary_WeaponDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification for weapon %d!\n", Deathtype_Name(deathtype), deathtype, death_weapon)); }
  
 -                              Send_CSQC_KillCenterprint(attacker, s, "", type, MSG_KILL);
 +              return TRUE;
 +      }
 +      return FALSE;
 +}
  
 -                              if (targ.killcount > 2)
 -                                      msg = ftos(targ.killcount);
 -                              else
 -                                      msg = "";
 +.float FRAG_VERBOSE;
 +void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
 +{
 +      // Sanity check
 +      if not(targ.classname == STR_PLAYER) { backtrace("Obituary called on non-player?!\n"); return; }
  
 -                              if (attacker.killcount > 2) {
 -                                      msg = ftos(attacker.killcount);
 -                                      type = KILL_TEAM_SPREE;
 -                              }
 -                              Send_KillNotification(a, s, msg, type, MSG_KILL);
 +      // Declarations
 +      string s1 = NO_STR_ARG, s2 = NO_STR_ARG;
 +      float f1 = NO_FL_ARG, f2 = NO_FL_ARG, f3 = NO_FL_ARG;
 +      float notif_firstblood = FALSE;
  
 -                              attacker.killcount = 0;
 +      //dprint(sprintf("Obituary(): Deathtype = %s (%d), Attacker = %s, Inflictor = %s, Target = %s...\n", Deathtype_Name(deathtype), deathtype, attacker.netname, inflictor.netname, targ.netname));
  
 -                              LogDeath("tk", deathtype, attacker, targ);
 +      // =======
 +      // SUICIDE
 +      // =======
 +      if(targ == attacker)
 +      {
 +              if(DEATH_ISSPECIAL(deathtype))
 +              {
 +                      if(deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
 +                      {
 +                              s1 = targ.netname;
 +                              f1 = targ.team;
                        }
                        else
                        {
 -                              if (!checkrules_firstblood)
 +                              switch(deathtype)
                                {
 -                                      checkrules_firstblood = TRUE;
 -                                      Send_KillNotification(a, "", "", KILL_FIRST_BLOOD, MSG_KILL);
 -                                      // TODO: make these print a newline if they dont
 -                                      Send_CSQC_KillCenterprint(attacker, "", "", KILL_FIRST_BLOOD, MSG_KILL);
 -                                      Send_CSQC_KillCenterprint(targ, "", "", KILL_FIRST_VICTIM, MSG_KILL);
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
 -                                      PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
 -                              }
 -
 -                              if(targ.istypefrag) {
 -                                      Send_CSQC_KillCenterprint(attacker, s, Obituary_ExtraFragInfo(targ), KILL_TYPEFRAG, MSG_KILL);
 -                                      Send_CSQC_KillCenterprint(targ, a, Obituary_ExtraFragInfo(attacker), KILL_TYPEFRAGGED, MSG_KILL);
 -                              } else {
 -                                      Send_CSQC_KillCenterprint(attacker, s, Obituary_ExtraFragInfo(targ), KILL_FRAG, MSG_KILL);
 -                                      Send_CSQC_KillCenterprint(targ, a, Obituary_ExtraFragInfo(attacker), KILL_FRAGGED, MSG_KILL);
 +                                      case DEATH_MIRRORDAMAGE:
 +                                      {
 +                                              s1 = targ.netname;
 +                                              f1 = targ.killcount;
 +                                              break;
 +                                      }
 +                                      
 +                                      default:
 +                                      {
 +                                              s1 = targ.netname;
 +                                              f1 = targ.killcount;
 +                                              s2 = NO_STR_ARG;
 +                                              f2 = f3 = NO_FL_ARG;
 +                                              break;
 +                                      }
                                }
 +                              LogDeath("suicide", deathtype, targ, targ);
 +                              GiveFrags(attacker, targ, -1, deathtype);
 +                      }
 +                      
 +                      Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, NO_FL_ARG);
 +              }
 +              else if not(Obituary_WeaponDeath(targ, FALSE, deathtype, targ.netname, NO_STR_ARG, targ.killcount))
 +              {
 +                      backtrace("SUICIDE: what the hell happened here?\n");
 +              }
 +      }
  
 -                              attacker.taunt_soundtime = time + 1;
 -
 -                              if (deathtype == DEATH_HURTTRIGGER && inflictor.message2 != "")
 -                                      msg = inflictor.message2;
 -                              else if (deathtype == DEATH_CUSTOM)
 -                                      msg = deathmessage;
 -                              else
 -                                      msg = "";
 +      // ======
 +      // MURDER
 +      // ======
 +      else if(attacker.classname == "player")
 +      {
 +              s1 = attacker.netname;
 +              s2 = targ.netname;
  
 -                              if(strstrofs(msg, "%", 0) < 0)
 -                                      msg = strcat("%s ", msg, " by %s");
 +              // TODO: ADD REAL CHECK HERE!
 +              attacker.FRAG_VERBOSE = TRUE;
 +              targ.FRAG_VERBOSE = TRUE;
 +              
 +              if(!IsDifferentTeam(attacker, targ))
 +              {
 +                      LogDeath("tk", deathtype, attacker, targ);
 +                      GiveFrags(attacker, targ, -1, deathtype);
  
 -                              Send_KillNotification(a, s, msg, deathtype, MSG_KILL);
 +                      attacker.killcount = 0;
 +                      
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, DEATH_TEAMKILL_FRAG, s2, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, MSG_DEATH, DEATH_TEAMKILL_FRAGGED, s1, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
 +                      Send_Notification_Legacy_Wrapper(NOTIF_ANY, world, MSG_INFO, APP_TEAM_NUM_4(targ.team, INFO_DEATH_TEAMKILL_), s2, s1, targ.killcount, NO_FL_ARG, NO_FL_ARG);
  
 -                              GiveFrags(attacker, targ, 1, deathtype);
 +                      // In this case, the death message will ALWAYS be "foo was betrayed by bar"
 +                      // No need for specific death/weapon messages...
 +              }
 +              else
 +              {
 +                      LogDeath("frag", deathtype, attacker, targ);
 +                      GiveFrags(attacker, targ, 1, deathtype);
  
 -                              if (targ.killcount > 2) {
 -                                      Send_KillNotification(s, ftos(targ.killcount), a, KILL_END_SPREE, MSG_SPREE);
 +                      attacker.taunt_soundtime = time + 1;
 +                      attacker.killcount = attacker.killcount + 1;
 +                      
 +                      #define ADD_ACHIEVEMENT_CASE(numa,numb) \
 +                              case numa: \
 +                              { \
 +                                      AnnounceTo(attacker, strcat(#numb, "kills")); \
 +                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_##numa, 1); \
 +                                      break; \
                                }
 +                      switch(attacker.killcount)
 +                      {
 +                              ADD_ACHIEVEMENT_CASE(3, 03)
 +                              ADD_ACHIEVEMENT_CASE(5, 05)
 +                              ADD_ACHIEVEMENT_CASE(10, 10)
 +                              ADD_ACHIEVEMENT_CASE(15, 15)
 +                              ADD_ACHIEVEMENT_CASE(20, 20)
 +                              ADD_ACHIEVEMENT_CASE(25, 25)
 +                              ADD_ACHIEVEMENT_CASE(30, 30)
 +                              default: break;
 +                      }
 +                      #undef ADD_ACHIEVEMENT_CASE
  
 -                              attacker.killcount = attacker.killcount + 1;
 +                      if(!checkrules_firstblood)
 +                      {
 +                              checkrules_firstblood = TRUE;
 +                              notif_firstblood = TRUE; // modify the current messages so that they too show firstblood information
 +                              PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1);
 +                              PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1);
 +                      }
  
 -                              if (attacker.killcount == 3)
 -                              {
 -                                      Send_KillNotification(a, "", "", KILL_SPREE_3, MSG_SPREE);
 -                                      AnnounceTo(attacker, "03kills");
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3, 1);
 -                              }
 -                              else if (attacker.killcount == 5)
 -                              {
 -                                      Send_KillNotification(a, "", "", KILL_SPREE_5, MSG_SPREE);
 -                                      AnnounceTo(attacker, "05kills");
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5, 1);
 -                              }
 -                              else if (attacker.killcount == 10)
 -                              {
 -                                      Send_KillNotification(a, "", "", KILL_SPREE_10, MSG_SPREE);
 -                                      AnnounceTo(attacker, "10kills");
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10, 1);
 -                              }
 -                              else if (attacker.killcount == 15)
 +                      if(notif_firstblood) // first blood, no kill sprees yet
 +                      {
 +                              if(targ.istypefrag)
                                {
 -                                      Send_KillNotification(a, "", "", KILL_SPREE_15, MSG_SPREE);
 -                                      AnnounceTo(attacker, "15kills");
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15, 1);
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAG_FIRST),
 +                                              s2, s1, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG);
 +                                              
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAGGED_FIRST),
 +                                              s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
 -                              else if (attacker.killcount == 20)
 +                              else
                                {
 -                                      Send_KillNotification(a, "", "", KILL_SPREE_20, MSG_SPREE);
 -                                      AnnounceTo(attacker, "20kills");
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20, 1);
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_FIRST_VERBOSE : DEATH_MURDER_FRAG_FIRST),
 +                                              s2, s1, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG);
 +                                              
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_FRAGGED_FIRST_VERBOSE : DEATH_MURDER_FRAGGED_FIRST),
 +                                              s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
 -                              else if (attacker.killcount == 25)
 +                      }
 +                      else // normal frags, kill sprees listed
 +                      {
 +                              if(targ.istypefrag)
                                {
 -                                      Send_KillNotification(a, "", "", KILL_SPREE_25, MSG_SPREE);
 -                                      AnnounceTo(attacker, "25kills");
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25, 1);
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_VERBOSE : DEATH_MURDER_TYPEFRAG),
 +                                              s2, NO_STR_ARG, attacker.killcount, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG);
 +                                              
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAGGED_VERBOSE : DEATH_MURDER_TYPEFRAGGED),
 +                                              s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
 -                              else if (attacker.killcount == 30)
 +                              else
                                {
 -                                      Send_KillNotification(a, "", "", KILL_SPREE_30, MSG_SPREE);
 -                                      AnnounceTo(attacker, "30kills");
 -                                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30, 1);
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, attacker, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_VERBOSE : DEATH_MURDER_FRAG),
 +                                              s2, NO_STR_ARG, attacker.killcount, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG);
 +                                              
 +                                      Send_Notification_Legacy_Wrapper(NOTIF_ONE, targ, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_FRAGGED_VERBOSE : DEATH_MURDER_FRAGGED),
 +                                              s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG));
                                }
 -                              else if (attacker.killcount > 2) {
 -                                      Send_KillNotification(a, ftos(attacker.killcount), "", KILL_SPREE, MSG_SPREE);
 -                              }
 -                              LogDeath("frag", deathtype, attacker, targ);
                        }
 +
 +                      //print("targ_killcount = ", ftos(targ.killcount), ", attacker_killcount = ", ftos(attacker.killcount), ".\n");
 +                      if not(Obituary_WeaponDeath(targ, TRUE, deathtype, targ.netname, attacker.netname, targ.killcount))
 +                              Obituary_SpecialDeath(targ, TRUE, deathtype, s2, s1, targ.killcount, NO_FL_ARG, NO_FL_ARG);
                }
 -              else
 +      }
 +
 +      // =============
 +      // ACCIDENT/TRAP
 +      // =============
 +      else
 +      {
 +              switch(deathtype)
                {
 -                      Send_CSQC_KillCenterprint(targ, "", "", deathtype, MSG_KILL_ACTION);
 -                      if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
 -                              msg = inflictor.message;
 -                      else if (deathtype == DEATH_CUSTOM)
 -                              msg = deathmessage;
 -                      else
 -                              msg = "";
 -                      if(strstrofs(msg, "%", 0) < 0)
 -                              msg = strcat("%s ", msg);
 -
 -                      GiveFrags(targ, targ, -1, deathtype);
 -                      if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) {
 -                              AnnounceTo(targ, "botlike");
 -                              PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
 +                      // For now, we're just forcing HURTTRIGGER to behave as "DEATH_VOID" and giving it no special options...
 +                      // Later on you will only be able to make custom messages using DEATH_CUSTOM,
 +                      // and there will be a REAL DEATH_VOID implementation which mappers will use.
 +                      /*case DEATH_HURTTRIGGER:
 +                      {
 +                              s1 = targ.netname;
 +                              s2 = inflictor.message;
 +                              if(strstrofs(s2, "%", 0) < 0) { s2 = strcat("%s ", s2); }
 +                              break;
 +                      }*/
 +
 +                      case DEATH_CUSTOM:
 +                      {
 +                              s1 = targ.netname;
 +                              s2 = deathmessage;
 +                              f1 = targ.killcount;
 +                              if(strstrofs(s2, "%", 0) < 0) { s2 = strcat("%s ", s2); }
 +                              f2 = f3 = NO_FL_ARG;
 +                              break;
 +                      }
 +                      
 +                      default:
 +                      {
 +                              s1 = targ.netname;
 +                              f1 = targ.killcount;
 +                              s2 = NO_STR_ARG;
 +                              f2 = f3 = NO_FL_ARG;
 +                              break;
                        }
 -                      Send_KillNotification(s, msg, "", deathtype, MSG_KILL_ACTION);
 +              }
  
 -                      if (targ.killcount > 2)
 -                              Send_KillNotification(s, ftos(targ.killcount), "", 0, MSG_KILL_ACTION_SPREE);
 +              LogDeath("accident", deathtype, targ, targ);
 +              GiveFrags(targ, targ, -1, deathtype);
  
 -                      LogDeath("accident", deathtype, targ, targ);
 +              if(PlayerScore_Add(targ, SP_SCORE, 0) == -5)
 +              {
 +                      AnnounceTo(targ, "botlike");
 +                      PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1);
                }
  
 -              targ.death_origin = targ.origin;
 -              if(targ != attacker)
 -                      targ.killer_origin = attacker.origin;
 -
 -              // FIXME: this should go in PutClientInServer
 -              if (targ.killcount)
 -                      targ.killcount = 0;
 +              Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, f3);
        }
 +
 +      // Set final information for the death
 +      targ.death_origin = targ.origin;
 +      if(targ != attacker) { targ.killer_origin = attacker.origin; }
 +      if(targ.killcount) { targ.killcount = 0; }
  }
  
  // these are updated by each Damage call for use in button triggering and such
@@@ -638,7 -560,7 +627,7 @@@ void Damage (entity targ, entity inflic
                        }
        }
  
 -      if(deathtype == DEATH_KILL || deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE || deathtype == DEATH_QUIET)
 +      if(deathtype == DEATH_KILL || deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
        {
                // These are ALWAYS lethal
                // No damage modification here
                if(targ.takedamage == DAMAGE_AIM)
                if(targ != attacker)
                {
-                       if(damage_headshotbonus)
-                       {
-                               if(targ.classname == "player")
-                               {
-                                       // HEAD SHOT:
-                                       // find height of hit on player axis
-                                       // if above view_ofs and below maxs, and also in the middle half of the bbox, it is head shot
-                                       vector headmins, headmaxs, org;
-                                       org = antilag_takebackorigin(targ, time - ANTILAG_LATENCY(attacker));
-                                       headmins = org + GetHeadshotMins(targ);
-                                       headmaxs = org + GetHeadshotMaxs(targ);
-                                       if(trace_hits_box(railgun_start, railgun_end, headmins, headmaxs))
-                                       {
-                                               deathtype |= HITTYPE_HEADSHOT;
-                                       }
-                               }
-                               else if(targ.classname == "turret_head")
-                               {
-                                       deathtype |= HITTYPE_HEADSHOT;
-                               }
-                               if(deathtype & HITTYPE_HEADSHOT)
-                                       if(damage_headshotbonus > 0)
-                                               damage *= 1 + damage_headshotbonus;
-                       }
                        entity victim;
                        if((targ.vehicle_flags & VHF_ISVEHICLE) && targ.owner)
                                victim = targ.owner;
                                                        if(g_minstagib)
                                                        if(victim.items & IT_STRENGTH)
                                                                yoda = 1;
-                                                       if(deathtype & HITTYPE_HEADSHOT)
-                                                               headshot = 1;
                                                }
                                        }
                                }
diff --combined qcsrc/server/g_world.qc
index d924c018e89d795b3789c819a0ca2c3034a2675b,5e5fc4c7d49317c512197682e60c0bc49be8ba37..8dc16352106939122306cf40cdfe957fa8e1bb3b
@@@ -340,9 -340,6 +340,6 @@@ void cvar_changes_init(
                BADCVAR("gameversion");
                BADPREFIX("gameversion_");
                BADCVAR("sv_namechangetimer");
- #ifndef NO_LEGACY_NETWORKING
-               BADCVAR("sv_use_csqc_players"); // transition
- #endif
  
                // allowed changes to server admins (please sync this to server.cfg)
                // vi commands:
@@@ -553,8 -550,6 +550,8 @@@ void spawnfunc___init_dedicated_server(
        // needs to be done so early because of the constants they create
        CALL_ACCUMULATED_FUNCTION(RegisterWeapons);
        CALL_ACCUMULATED_FUNCTION(RegisterGametypes);
 +      CALL_ACCUMULATED_FUNCTION(RegisterNotifications);
 +      CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes);
  
        MapInfo_Enumerate();
        MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
@@@ -601,8 -596,6 +598,8 @@@ void spawnfunc_worldspawn (void
        // needs to be done so early because of the constants they create
        CALL_ACCUMULATED_FUNCTION(RegisterWeapons);
        CALL_ACCUMULATED_FUNCTION(RegisterGametypes);
 +      CALL_ACCUMULATED_FUNCTION(RegisterNotifications);
 +      CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes);
  
        ServerProgsDB = db_load(strcat("server.db", autocvar_sessionid));
  
@@@ -1760,10 -1753,10 +1757,10 @@@ float WinningCondition_Onslaught(
        {
                if (head.health > 0)
                {
 -                      if (head.team == COLOR_TEAM1) t1 = 1;
 -                      if (head.team == COLOR_TEAM2) t2 = 1;
 -                      if (head.team == COLOR_TEAM3) t3 = 1;
 -                      if (head.team == COLOR_TEAM4) t4 = 1;
 +                      if (head.team == FL_TEAM_1) t1 = 1;
 +                      if (head.team == FL_TEAM_2) t2 = 1;
 +                      if (head.team == FL_TEAM_3) t3 = 1;
 +                      if (head.team == FL_TEAM_4) t4 = 1;
                }
                head = find(head, classname, "onslaught_generator");
        }
        {
                // game over, only one team remains (or none)
                ClearWinners();
 -              if (t1) SetWinners(team, COLOR_TEAM1);
 -              if (t2) SetWinners(team, COLOR_TEAM2);
 -              if (t3) SetWinners(team, COLOR_TEAM3);
 -              if (t4) SetWinners(team, COLOR_TEAM4);
 +              if (t1) SetWinners(team, FL_TEAM_1);
 +              if (t2) SetWinners(team, FL_TEAM_2);
 +              if (t3) SetWinners(team, FL_TEAM_3);
 +              if (t4) SetWinners(team, FL_TEAM_4);
                dprint("Have a winner, ending game.\n");
                return WINNING_YES;
        }
@@@ -1812,13 -1805,13 +1809,13 @@@ float WinningCondition_Assault(
  
        status = WINNING_NO;
        // as the timelimit has not yet passed just assume the defending team will win
 -      if(assault_attacker_team == COLOR_TEAM1)
 +      if(assault_attacker_team == FL_TEAM_1)
        {
 -              SetWinners(team, COLOR_TEAM2);
 +              SetWinners(team, FL_TEAM_2);
        }
        else
        {
 -              SetWinners(team, COLOR_TEAM1);
 +              SetWinners(team, FL_TEAM_1);
        }
  
        entity ent;
@@@ -1944,10 -1937,10 +1941,10 @@@ float WinningCondition_Scores(float lim
  
        if(teamplay)
        {
 -              team1_score = TeamScore_GetCompareValue(COLOR_TEAM1);
 -              team2_score = TeamScore_GetCompareValue(COLOR_TEAM2);
 -              team3_score = TeamScore_GetCompareValue(COLOR_TEAM3);
 -              team4_score = TeamScore_GetCompareValue(COLOR_TEAM4);
 +              team1_score = TeamScore_GetCompareValue(FL_TEAM_1);
 +              team2_score = TeamScore_GetCompareValue(FL_TEAM_2);
 +              team3_score = TeamScore_GetCompareValue(FL_TEAM_3);
 +              team4_score = TeamScore_GetCompareValue(FL_TEAM_4);
        }
  
        ClearWinners();
@@@ -2063,25 -2056,25 +2060,25 @@@ float WinningCondition_RanOutOfSpawns(
  
        FOR_EACH_PLAYER(head) if(head.deadflag == DEAD_NO)
        {
 -              if(head.team == COLOR_TEAM1)
 +              if(head.team == FL_TEAM_1)
                        team1_score = 1;
 -              else if(head.team == COLOR_TEAM2)
 +              else if(head.team == FL_TEAM_2)
                        team2_score = 1;
 -              else if(head.team == COLOR_TEAM3)
 +              else if(head.team == FL_TEAM_3)
                        team3_score = 1;
 -              else if(head.team == COLOR_TEAM4)
 +              else if(head.team == FL_TEAM_4)
                        team4_score = 1;
        }
  
        for(head = world; (head = find(head, classname, "info_player_deathmatch")) != world; )
        {
 -              if(head.team == COLOR_TEAM1)
 +              if(head.team == FL_TEAM_1)
                        team1_score = 1;
 -              else if(head.team == COLOR_TEAM2)
 +              else if(head.team == FL_TEAM_2)
                        team2_score = 1;
 -              else if(head.team == COLOR_TEAM3)
 +              else if(head.team == FL_TEAM_3)
                        team3_score = 1;
 -              else if(head.team == COLOR_TEAM4)
 +              else if(head.team == FL_TEAM_4)
                        team4_score = 1;
        }
  
        {
                float t, i;
                if(team1_score)
 -                      t = COLOR_TEAM1;
 +                      t = FL_TEAM_1;
                else if(team2_score)
 -                      t = COLOR_TEAM2;
 +                      t = FL_TEAM_2;
                else if(team3_score)
 -                      t = COLOR_TEAM3;
 +                      t = FL_TEAM_3;
                else // if(team4_score)
 -                      t = COLOR_TEAM4;
 +                      t = FL_TEAM_4;
                CheckAllowedTeams(world);
                for(i = 0; i < MAX_TEAMSCORE; ++i)
                {
 -                      if(t != COLOR_TEAM1) if(c1 >= 0) TeamScore_AddToTeam(COLOR_TEAM1, i, -1000);
 -                      if(t != COLOR_TEAM2) if(c2 >= 0) TeamScore_AddToTeam(COLOR_TEAM2, i, -1000);
 -                      if(t != COLOR_TEAM3) if(c3 >= 0) TeamScore_AddToTeam(COLOR_TEAM3, i, -1000);
 -                      if(t != COLOR_TEAM4) if(c4 >= 0) TeamScore_AddToTeam(COLOR_TEAM4, i, -1000);
 +                      if(t != FL_TEAM_1) if(c1 >= 0) TeamScore_AddToTeam(FL_TEAM_1, i, -1000);
 +                      if(t != FL_TEAM_2) if(c2 >= 0) TeamScore_AddToTeam(FL_TEAM_2, i, -1000);
 +                      if(t != FL_TEAM_3) if(c3 >= 0) TeamScore_AddToTeam(FL_TEAM_3, i, -1000);
 +                      if(t != FL_TEAM_4) if(c4 >= 0) TeamScore_AddToTeam(FL_TEAM_4, i, -1000);
                }
  
                AddWinners(team, t);
index 8ad0ba6479525068ed71cf283ac42fc42b48d5fc,e3689cc3d3337d7ced4df19b02ab9c6053b50697..921a2de850bc7b9f1cb7c912651fc9f70a8b0cc3
@@@ -32,6 -32,7 +32,6 @@@ void WarpZone_crosshair_trace(entity pl
  void() spawnfunc_info_player_deathmatch; // needed for the other spawnpoints
  void() spawnpoint_use;
  string GetMapname();
 -string ColoredTeamName(float t);
  
  string admin_name(void)
  {
@@@ -573,10 -574,6 +573,6 @@@ void GetCvars(float f
        self.cvar_cl_accuracy_data_share = boolean(self.cvar_cl_accuracy_data_share);
        self.cvar_cl_accuracy_data_receive = boolean(self.cvar_cl_accuracy_data_receive);
  
- #ifdef ALLOW_FORCEMODELS
-       GetCvars_handleFloat(s, f, cvar_cl_forceplayermodels, "cl_forceplayermodels");
-       GetCvars_handleFloat(s, f, cvar_cl_forceplayermodelsfromxonotic, "cl_forceplayermodelsfromxonotic");
- #endif
        GetCvars_handleFloatOnce(s, f, cvar_cl_gunalign, "cl_gunalign");
        GetCvars_handleFloat(s, f, cvar_cl_allow_uid2name, "cl_allow_uid2name");
        GetCvars_handleFloat(s, f, cvar_cl_allow_uidtracking, "cl_allow_uidtracking");
        }
  }
  
 -void backtrace(string msg)
 -{
 -    float dev, war;
 -    dev = autocvar_developer;
 -    war = autocvar_prvm_backtraceforwarnings;
 -    cvar_set("developer", "1");
 -    cvar_set("prvm_backtraceforwarnings", "1");
 -    print("\n");
 -    print("--- CUT HERE ---\nWARNING: ");
 -    print(msg);
 -    print("\n");
 -    remove(world); // isn't there any better way to cause a backtrace?
 -    print("\n--- CUT UNTIL HERE ---\n");
 -    cvar_set("developer", ftos(dev));
 -    cvar_set("prvm_backtraceforwarnings", ftos(war));
 -}
 -
 -string Team_ColorCode(float teamid)
 -{
 -    if (teamid == COLOR_TEAM1)
 -        return "^1";
 -    else if (teamid == COLOR_TEAM2)
 -        return "^4";
 -    else if (teamid == COLOR_TEAM3)
 -        return "^3";
 -    else if (teamid == COLOR_TEAM4)
 -        return "^6";
 -    else
 -        return "^7";
 -}
 -
 -string Team_ColorName(float t)
 -{
 -    // fixme: Search for team entities and get their .netname's!
 -    if (t == COLOR_TEAM1)
 -        return "Red";
 -    if (t == COLOR_TEAM2)
 -        return "Blue";
 -    if (t == COLOR_TEAM3)
 -        return "Yellow";
 -    if (t == COLOR_TEAM4)
 -        return "Pink";
 -    return "Neutral";
 -}
 -
 -string Team_ColorNameLowerCase(float t)
 -{
 -    // fixme: Search for team entities and get their .netname's!
 -    if (t == COLOR_TEAM1)
 -        return "red";
 -    if (t == COLOR_TEAM2)
 -        return "blue";
 -    if (t == COLOR_TEAM3)
 -        return "yellow";
 -    if (t == COLOR_TEAM4)
 -        return "pink";
 -    return "neutral";
 -}
 -
 -float ColourToNumber(string team_colour)
 -{
 -      if (team_colour == "red")
 -              return COLOR_TEAM1;
 -
 -      if (team_colour == "blue")
 -              return COLOR_TEAM2;
 -
 -      if (team_colour == "yellow")
 -              return COLOR_TEAM3;
 -
 -      if (team_colour == "pink")
 -              return COLOR_TEAM4;
 -
 -      if (team_colour == "auto")
 -              return 0;
 -
 -      return -1;
 -}
 -
 -float NumberToTeamNumber(float number)
 -{
 -      if (number == 1)
 -              return COLOR_TEAM1;
 -
 -      if (number == 2)
 -              return COLOR_TEAM2;
 -
 -      if (number == 3)
 -              return COLOR_TEAM3;
 -
 -      if (number == 4)
 -              return COLOR_TEAM4;
 -
 -      return -1;
 -}
 -
  // decolorizes and team colors the player name when needed
  string playername(entity p)
  {
@@@ -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)
@@@ -1550,6 -1640,34 +1542,6 @@@ void precache(
  #endif
  }
  
 -// sorry, but using \ in macros breaks line numbers
 -#define WRITESPECTATABLE_MSG_ONE_VARNAME(varname,statement) entity varname; varname = msg_entity; FOR_EACH_REALCLIENT(msg_entity) if(msg_entity == varname || (msg_entity.classname == STR_SPECTATOR && msg_entity.enemy == varname)) statement msg_entity = varname
 -#define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement)
 -#define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0
 -
 -
 -void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num)
 -{
 -      if ((clienttype(e) == CLIENTTYPE_REAL) && (e.flags & FL_CLIENT))
 -      {
 -              msg_entity = e;
 -              WRITESPECTATABLE_MSG_ONE({
 -                      WriteByte(MSG_ONE, SVC_TEMPENTITY);
 -                      WriteByte(MSG_ONE, TE_CSQC_CENTERPRINT_GENERIC);
 -                      WriteByte(MSG_ONE, id);
 -                      WriteString(MSG_ONE, s);
 -                      if (id != 0 && s != "")
 -                      {
 -                              WriteByte(MSG_ONE, duration);
 -                              WriteByte(MSG_ONE, countdown_num);
 -                      }
 -              });
 -      }
 -}
 -void Send_CSQC_Centerprint_Generic_Expire(entity e, float id)
 -{
 -      Send_CSQC_Centerprint_Generic(e, id, "", 1, 0);
 -}
  // WARNING: this kills the trace globals
  #define EXACTTRIGGER_TOUCH if(WarpZoneLib_ExactTrigger_Touch()) return
  #define EXACTTRIGGER_INIT  WarpZoneLib_ExactTrigger_Init()
@@@ -2643,8 -2761,3 +2635,8 @@@ float isPushable(entity e
                return TRUE;
        return FALSE;
  }
 +
 +void dedicated_print(string input) // print(), but only print if the server is not local
 +{
 +      if not(server_is_local) { print(input); }
 +}
index ff6a2ab27e87deaa35515d5e429bbe6a83000a25,de12407f558d9347c561ef77e8339ca3b35536f9..a66b564773635ce4b1a3d0e1b60b239d3a5cf7b5
@@@ -257,7 -257,7 +257,7 @@@ void spiderbot_rocket_do(
              rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
                                     v, normalize(randomvec() * autocvar_g_vehicle_spiderbot_rocket_spread + v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
                                     autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
 -                                   DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE, self.owner);
 +                                   DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE, self.owner);
              crosshair_trace(self.owner);
              float _dist = (random() * autocvar_g_vehicle_spiderbot_rocket_radius) + vlen(v - trace_endpos);
              _dist -= (random() * autocvar_g_vehicle_spiderbot_rocket_radius) ;
              rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
                                     v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
                                     autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
 -                                   DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE, self.owner);
 +                                   DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE, self.owner);
              crosshair_trace(self.owner);
              rocket.pos1       = trace_endpos;
              rocket.nextthink  = time;
              rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
                                     v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
                                     autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
 -                                   DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE, self.owner);
 +                                   DEATH_VH_SPID_ROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE, self.owner);
              
              crosshair_trace(self.owner);
              
@@@ -495,14 -495,14 +495,15 @@@ 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,
 -//                autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
 +//                autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_VH_SPID_MINIGUN, 0);
  
              sound (gun, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
              //trailparticles(self, particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
@@@ -722,7 -722,7 +723,7 @@@ void spiderbot_blowup(
      SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
      SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
  
 -    RadiusDamage (self, self.enemy, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world);
 +    RadiusDamage (self, self.enemy, 250, 15, 250, world, 250, DEATH_VH_SPID_DEATH, world);
  
      self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
      self.movetype   = MOVETYPE_NONE;
index d7cd57e8225000bf1ddadf35529e5900925f51a4,508a8ba1a04123726fcc8b4ce490ed684f1404ef..4d243a513575bb04ab1703521d2c981801cb8c3c
@@@ -234,7 -234,7 +234,7 @@@ void W_Firemine_Touch (void
  {
        PROJECTILE_TOUCH;
        if (other.takedamage == DAMAGE_AIM)
-       if(Fire_AddDamage(other, self.realowner, autocvar_g_balance_fireball_secondary_damage, autocvar_g_balance_fireball_secondary_damagetime, self.projectiledeathtype | HITTYPE_HEADSHOT) >= 0)
+       if(Fire_AddDamage(other, self.realowner, autocvar_g_balance_fireball_secondary_damage, autocvar_g_balance_fireball_secondary_damagetime, self.projectiledeathtype) >= 0)
        {
                remove(self);
                return;
@@@ -374,24 -374,6 +374,24 @@@ float w_fireball(float req
        {
                self.fireball_primarytime = time;
        }
 +      else if (req == WR_SUICIDEMESSAGE)
 +      {
 +              if(w_deathtype & HITTYPE_SECONDARY)
 +                      return WEAPON_FIREBALL_SUICIDE_FIREMINE;
 +              else
 +                      return WEAPON_FIREBALL_SUICIDE_BLAST;
 +      }
 +      else if (req == WR_KILLMESSAGE)
 +      {
 +              if(w_deathtype & HITTYPE_SECONDARY)
 +              {
 +                      return WEAPON_FIREBALL_MURDER_FIREMINE;
 +              }
 +              else
 +              {
 +                      return WEAPON_FIREBALL_MURDER_BLAST;
 +              }
 +      }
        return TRUE;
  }
  #endif
@@@ -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
index 36f4d28ec647cc988f1c1229fb0112ca7c1ebebf,4031ca8a9d14e53a2bf47569a253237b6dc2f319..dae7003be5add2ccbd1ae6b3d43ea37f1a918c00
@@@ -14,10 -14,7 +14,7 @@@ void W_MinstaNex_Attack (void
  
        yoda = 0;
        damage_goodhits = 0;
-       headshot = 0;
-       damage_headshotbonus = -1; // no extra damage, just count
        FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, 10000, 800, 0, 0, 0, 0, WEP_MINSTANEX);
-       damage_headshotbonus = 0;
  
        if(g_minstagib)
        {
        {
                if(yoda && flying)
                        AnnounceTo(self, "yoda");
-               if(headshot)
-               {
-                       AnnounceTo(self, "headshot");
-               }
                if(damage_goodhits && self.minstanex_lasthit)
                {
                        AnnounceTo(self, "impressive");
        {
            switch(self.team)
            {
 -            case COLOR_TEAM1:   // Red
 +            case FL_TEAM_1:   // Red
                  if(damage_goodhits)
                      WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, v);
                  else
                      WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, v);
                  break;
 -            case COLOR_TEAM2:   // Blue
 +            case FL_TEAM_2:   // Blue
                  if(damage_goodhits)
                      WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, v);
                  else
                      WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, v);
                  break;
 -            case COLOR_TEAM3:   // Yellow
 +            case FL_TEAM_3:   // Yellow
                  if(damage_goodhits)
                      WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, v);
                  else
                      WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, v);
                  break;
 -            case COLOR_TEAM4:   // Pink
 +            case FL_TEAM_4:   // Pink
                  if(damage_goodhits)
                      WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, v);
                  else
@@@ -278,14 -271,6 +271,14 @@@ float w_minstanex(float req
  
                W_Reload(used_ammo, autocvar_g_balance_minstanex_reload_ammo, autocvar_g_balance_minstanex_reload_time, "weapons/reload.wav");
        }
 +      else if (req == WR_SUICIDEMESSAGE)
 +      {
 +              return WEAPON_THINKING_WITH_PORTALS;
 +      }
 +      else if (req == WR_KILLMESSAGE)
 +      {
 +              return WEAPON_MINSTANEX_MURDER;
 +      }
        return TRUE;
  }
  #endif
diff --combined qcsrc/server/w_rifle.qc
index 33b2bda5ff2b99361f0e688f55360c6a9ceea9be,f707bbd6525aacfdf2dc239ae7445b27ab257136..749906638bf0e2ab56e782516983ebeda7dcdb01
@@@ -5,13 -5,13 +5,13 @@@ REGISTER_WEAPON(RIFLE, w_rifle, IT_NAIL
  
  .float rifle_accumulator;
  
- void W_Rifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant, float pTracer, float pShots, string pSound)
+ void W_Rifle_FireBullet(float pSpread, float pDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant, float pTracer, float pShots, string pSound)
  {
        float i;
  
        W_DecreaseAmmo(ammo_nails, pAmmo, autocvar_g_balance_rifle_reload_ammo);
  
-       W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CH_WEAPON_A, (pDamage + pHeadshotAddedDamage) * pShots);
+       W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CH_WEAPON_A, pDamage * pShots);
  
        pointparticles(particleeffectnum("rifle_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
  
@@@ -22,7 -22,7 +22,7 @@@
        }
  
        for(i = 0; i < pShots; ++i)
-               fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
+               fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
        endFireBallisticBullet();
  
        if (autocvar_g_casings >= 2)
  
  void W_Rifle_Attack()
  {
-       W_Rifle_FireBullet(autocvar_g_balance_rifle_primary_spread, autocvar_g_balance_rifle_primary_damage, autocvar_g_balance_rifle_primary_headshotaddeddamage, autocvar_g_balance_rifle_primary_force, autocvar_g_balance_rifle_primary_speed, autocvar_g_balance_rifle_primary_lifetime, autocvar_g_balance_rifle_primary_ammo, WEP_RIFLE, autocvar_g_balance_rifle_primary_bulletconstant, autocvar_g_balance_rifle_primary_tracer, autocvar_g_balance_rifle_primary_shots, "weapons/campingrifle_fire.wav");
+       W_Rifle_FireBullet(autocvar_g_balance_rifle_primary_spread, autocvar_g_balance_rifle_primary_damage, autocvar_g_balance_rifle_primary_force, autocvar_g_balance_rifle_primary_speed, autocvar_g_balance_rifle_primary_lifetime, autocvar_g_balance_rifle_primary_ammo, WEP_RIFLE, autocvar_g_balance_rifle_primary_bulletconstant, autocvar_g_balance_rifle_primary_tracer, autocvar_g_balance_rifle_primary_shots, "weapons/campingrifle_fire.wav");
  }
  
  void W_Rifle_Attack2()
  {
-       W_Rifle_FireBullet(autocvar_g_balance_rifle_secondary_spread, autocvar_g_balance_rifle_secondary_damage, autocvar_g_balance_rifle_secondary_headshotaddeddamage, autocvar_g_balance_rifle_secondary_force, autocvar_g_balance_rifle_secondary_speed, autocvar_g_balance_rifle_secondary_lifetime, autocvar_g_balance_rifle_secondary_ammo, WEP_RIFLE | HITTYPE_SECONDARY, autocvar_g_balance_rifle_secondary_bulletconstant, autocvar_g_balance_rifle_secondary_tracer, autocvar_g_balance_rifle_secondary_shots, "weapons/campingrifle_fire2.wav");
+       W_Rifle_FireBullet(autocvar_g_balance_rifle_secondary_spread, autocvar_g_balance_rifle_secondary_damage, autocvar_g_balance_rifle_secondary_force, autocvar_g_balance_rifle_secondary_speed, autocvar_g_balance_rifle_secondary_lifetime, autocvar_g_balance_rifle_secondary_ammo, WEP_RIFLE | HITTYPE_SECONDARY, autocvar_g_balance_rifle_secondary_bulletconstant, autocvar_g_balance_rifle_secondary_tracer, autocvar_g_balance_rifle_secondary_shots, "weapons/campingrifle_fire2.wav");
  }
  
  void spawnfunc_weapon_rifle (void)
@@@ -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
diff --combined qcsrc/server/w_seeker.qc
index 13c010f2a13010937f6d7a2a37fa8e2f426ba107,cd9088e03a54a4d9910f94b4bd074f0b43f71657..837f8644a66e8a9b9ee62f00da0fd52db341c0c8
@@@ -427,7 -427,7 +427,7 @@@ void Seeker_Tag_Touch(
        te_knightspike(org2);
  
        self.event_damage = func_null;
-       Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT, other.species, self);
+       Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE | HITTYPE_SECONDARY, other.species, self);
  
        if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
        {
@@@ -612,17 -612,6 +612,17 @@@ float w_seeker(float req
        {
                W_Reload(min(autocvar_g_balance_seeker_missile_ammo, autocvar_g_balance_seeker_tag_ammo), autocvar_g_balance_seeker_reload_ammo, autocvar_g_balance_seeker_reload_time, "weapons/reload.wav");
        }
 +      else if (req == WR_SUICIDEMESSAGE)
 +      {
 +              return WEAPON_SEEKER_SUICIDE;
 +      }
 +      else if (req == WR_KILLMESSAGE)
 +      {
 +              if(w_deathtype & HITTYPE_SECONDARY)
 +                      return WEAPON_SEEKER_MURDER_TAG;
 +              else
 +                      return WEAPON_SEEKER_MURDER_SPRAY;
 +      }
        return TRUE;
  }
  #endif
@@@ -635,21 -624,24 +635,24 @@@ float w_seeker(float req
                org2 = w_org + w_backoff * 6;
                if(w_deathtype & HITTYPE_BOUNCE)
                {
-                       pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
-                       if(!w_issilent)
+                       if(w_deathtype & HITTYPE_SECONDARY)
                        {
-                               if (w_random<0.15)
-                                       sound(self, CH_SHOTS, "weapons/tagexp1.wav", 1, ATTN_NORM);
-                               else if (w_random<0.7)
-                                       sound(self, CH_SHOTS, "weapons/tagexp2.wav", 1, ATTN_NORM);
-                               else
-                                       sound(self, CH_SHOTS, "weapons/tagexp3.wav", 1, ATTN_NORM);
+                               if(!w_issilent)
+                                       sound(self, CH_SHOTS, "weapons/tag_impact.wav", 1, ATTN_NORM);
+                       }
+                       else
+                       {
+                               pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+                               if(!w_issilent)
+                               {
+                                       if (w_random<0.15)
+                                               sound(self, CH_SHOTS, "weapons/tagexp1.wav", 1, ATTN_NORM);
+                                       else if (w_random<0.7)
+                                               sound(self, CH_SHOTS, "weapons/tagexp2.wav", 1, ATTN_NORM);
+                                       else
+                                               sound(self, CH_SHOTS, "weapons/tagexp3.wav", 1, ATTN_NORM);
+                               }
                        }
-               }
-               else if(w_deathtype & HITTYPE_HEADSHOT)
-               {
-                       if(!w_issilent)
-                               sound(self, CH_SHOTS, "weapons/tag_impact.wav", 1, ATTN_NORM);
                }
                else
                {
                precache_sound("weapons/tagexp3.wav");
                precache_sound("weapons/tag_impact.wav");
        }
 -      else if (req == WR_SUICIDEMESSAGE)
 -              w_deathtypestring = _("%s played with tiny seeker rockets");
 -      else if (req == WR_KILLMESSAGE)
 -      {
 -              if(w_deathtype & HITTYPE_SECONDARY)
 -                      w_deathtypestring = _("%s was tagged with a seeker by %s");
 -              else
 -                      w_deathtypestring = _("%s was pummeled with seeker rockets by %s");
 -      }
        return TRUE;
  }
  #endif
index 350d6e01578fb1f46cf8f43c121e22318ba61a84,a4d4139700d8315d7d0afa53c88095590a0588a1..75f6a087d14256ef0b32ee3525809e847b47cf41
@@@ -27,7 -27,7 +27,7 @@@ void W_Shotgun_Attack (void
  
        W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, d * bullets);
        for (sc = 0;sc < bullets;sc = sc + 1)
-               fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN, 0, 1, bulletconstant);
+               fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, f, WEP_SHOTGUN, 0, 1, bulletconstant);
        endFireBallisticBullet();
  
        pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, autocvar_g_balance_shotgun_primary_ammo);
@@@ -238,17 -238,6 +238,17 @@@ float w_shotgun(float req
        {
                W_Reload(autocvar_g_balance_shotgun_primary_ammo, autocvar_g_balance_shotgun_reload_ammo, autocvar_g_balance_shotgun_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)
 +                      return WEAPON_SHOTGUN_MURDER_SLAP;
 +              else
 +                      return WEAPON_SHOTGUN_MURDER;
 +      }
        return TRUE;
  }
  #endif
@@@ -278,6 -267,15 +278,6 @@@ float w_shotgun(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)
 -                      w_deathtypestring = _("%2$s slapped %1$s around a bit with a large shotgun");
 -              else
 -                      w_deathtypestring = _("%s was gunned down with a shotgun by %s");
 -      }
        return TRUE;
  }
  #endif
diff --combined qcsrc/server/w_tuba.qc
index 15d4ef9d7deb44e9d6690fff01c77cbde572735d,d8d53f2bf4927065df81df3f2a750c4296bae899..43397be001093c5253dfce01b679d3dd464c91ee
@@@ -186,7 -186,7 +186,7 @@@ float Tuba_GetNote(entity pl, float hit
        // that way, holes in the range of notes are "plugged"
        if(teamplay)
        {
 -              if(pl.team == COLOR_TEAM2 || pl.team == COLOR_TEAM4)
 +              if(pl.team == FL_TEAM_2 || pl.team == FL_TEAM_4)
                        note += 3;
        }
        else
@@@ -290,8 -290,6 +290,6 @@@ void W_Tuba_NoteOn(float hittype
                hittype |= HITTYPE_SECONDARY;
        if(self.tuba_instrument & 2)
                hittype |= HITTYPE_BOUNCE;
-       if(self.tuba_instrument & 4)
-               hittype |= HITTYPE_HEADSHOT;
  
        if(self.tuba_note)
        {
@@@ -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
diff --combined qcsrc/server/w_uzi.qc
index 7204437bb6f02fb7b8899f9ec8a74da4f9216e9f,525beeacaafa846b49279d945be8def74aedce61..3645b95db83f12c969e22e37fcdf1be8abb19c4d
@@@ -52,9 -52,9 +52,9 @@@ void W_UZI_Attack (float deathtype
        ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
  
        if (self.misc_bulletcounter == 1)
-               fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_first_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_first_damage, autocvar_g_balance_uzi_first_headshotaddeddamage, autocvar_g_balance_uzi_first_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+               fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_first_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_first_damage, autocvar_g_balance_uzi_first_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
        else
-               fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_sustained_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_headshotaddeddamage, autocvar_g_balance_uzi_sustained_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+               fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_sustained_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
        endFireBallisticBullet();
  
        pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
@@@ -126,7 -126,7 +126,7 @@@ void uzi_mode1_fire_auto(
        }
  
        uzi_spread = bound(autocvar_g_balance_uzi_spread_min, autocvar_g_balance_uzi_spread_min + (autocvar_g_balance_uzi_spread_add * self.misc_bulletcounter), autocvar_g_balance_uzi_spread_max);
-       fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_headshotaddeddamage, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+       fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
        endFireBallisticBullet();
  
        self.misc_bulletcounter = self.misc_bulletcounter + 1;
@@@ -152,7 -152,7 +152,7 @@@ void uzi_mode1_fire_burst(
                self.punchangle_y = random () - 0.5;
        }
  
-       fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_headshotaddeddamage, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+       fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
        endFireBallisticBullet();
  
  
@@@ -289,17 -289,6 +289,17 @@@ float w_uzi(float req
        {
                W_Reload(min(max(autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_first_ammo), autocvar_g_balance_uzi_burst_ammo), autocvar_g_balance_uzi_reload_ammo, autocvar_g_balance_uzi_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)
 +                      return WEAPON_UZI_MURDER_SNIPE;
 +              else
 +                      return WEAPON_UZI_MURDER_SPRAY;
 +      }
        return TRUE;
  }
  #endif
@@@ -325,6 -314,15 +325,6 @@@ float w_uzi(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)
 -                      w_deathtypestring = _("%s was sniped by %s's machine gun");
 -              else
 -                      w_deathtypestring = _("%s was riddled full of holes by %s's machine gun");
 -      }
        return TRUE;
  }
  #endif