]> 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>
Sun, 6 Jan 2013 19:26:48 +0000 (14:26 -0500)
committerSamual Lenks <samual@xonotic.org>
Sun, 6 Jan 2013 19:26:48 +0000 (14:26 -0500)
1  2 
defaultXonotic.cfg
qcsrc/client/Main.qc
qcsrc/client/hud.qc
qcsrc/common/command/generic.qc
qcsrc/server/bot/bot.qc
qcsrc/server/cl_client.qc
qcsrc/server/domination.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/race.qc

diff --combined defaultXonotic.cfg
index 60582e21aae06bdfd25181e2d0205027cf65eeae,1ad85c8bd01da28797e5aaa8cf42a8a97fd3b321..cc0f7816e8b79c6768b5d245b3921f681454ee79
@@@ -482,7 -482,7 +482,7 @@@ seta g_teamdamage_resetspeed 20    "for te
  
  seta g_balance_teams 1        "automatically balance out players entering instead of asking them for their preferred team"
  seta g_balance_teams_prevent_imbalance        1       "prevent players from changing to larger teams"
- set g_balance_teams_scorefactor 0.34 "at the end of the game, take score into account instead of team size by this amount (beware: values over 0.5 mean that a x:0 score imbalance will cause ALL new players to prefer the losing team at the end, despite numbers)"
+ set g_balance_teams_scorefactor 0.25 "at the end of the game, take score into account instead of team size by this amount (beware: values over 0.5 mean that a x:0 score imbalance will cause ALL new players to prefer the losing team at the end, despite numbers)"
  set g_changeteam_banned 0     "not allowed to change team"
  set g_changeteam_fragtransfer 0       "% of frags you get to keep when you change teams (rounded down)"
  
@@@ -813,7 -813,6 +813,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"
diff --combined qcsrc/client/Main.qc
index 9abcea202bdb3840597d6bb75847e7ad994e0023,d6fd09e6daf5f910f183ac7cbdb8376389b7563d..29ff3d52c9e2e62756abfa0f89eda970f4dc8e8d
@@@ -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
@@@ -262,16 -260,16 +262,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;
                }
@@@ -1223,10 -1221,6 +1223,10 @@@ float CSQC_Parse_TempEntity(
                case TE_CSQC_SVNOTICE:
                        cl_notice_read();
                        bHandled = true;
 +                      break;
 +              case TE_CSQC_NOTIFICATION:
 +                      Read_Notification();
 +                      bHandled = true;
                        break;
                default:
                        // No special logic for this temporary entity; return 0 so the engine can handle it
@@@ -1246,7 -1240,7 +1246,7 @@@ string getcommandkey(string text, strin
                return text;
  
        keys = db_get(binddb, command);
-       if (!keys)
+       if (keys == "")
        {
                n = tokenize(findkeysforcommand(command, 0)); // uses '...' strings
                for(j = 0; j < n; ++j)
                        }
  
                }
+               if (keys == "")
+                       keys = "NO_KEY";
                db_put(binddb, command, keys);
        }
  
-       if ("" == keys) {
+       if (keys == "NO_KEY") {
                if (autocvar_hud_showbinds > 1)
                        return sprintf(_("%s (not bound)"), text);
                else
diff --combined qcsrc/client/hud.qc
index d9f783583cf573f90b097df2f71457fed690210b,cc870794b10653a3dea145058a83693ab5282e3b..27e3665fc2b679b99c7addfa59f26182e1940852
@@@ -244,30 -244,6 +244,30 @@@ float race_CheckName(string net_name) 
        return 0;
  }
  
 +float GetPlayerColorForce(float i)
 +{
 +      if(!teamplay)
 +              return 0;
 +      else
 +              return stof(getplayerkeyvalue(i, "colors")) & 15;
 +}
 +
 +float GetPlayerColor(float i)
 +{
 +      if not(playerslots[i].gotscores) // unconnected
 +              return FL_SPECTATOR;
 +      else if(stof(getplayerkeyvalue(i, "frags")) == FRAGS_SPECTATOR)
 +              return FL_SPECTATOR;
 +      else
 +              return GetPlayerColorForce(i);
 +}
 +
 +string GetPlayerName(float i)
 +{
 +      return ColorTranslateRGB(getplayerkeyvalue(i, "name"));
 +}
 +
 +
  /*
  ==================
  HUD panels
@@@ -1639,10 -1615,31 +1639,10 @@@ string Weapon_KillMessage(float deathty
        return w_deathtypestring;
  }
  
 -#define KN_MAX_ENTRIES 10
 -float kn_index;
 -float killnotify_times[KN_MAX_ENTRIES];
 -float killnotify_deathtype[KN_MAX_ENTRIES];
 -float killnotify_actiontype[KN_MAX_ENTRIES]; // 0 = "Y [used by] X", 1 = "X [did action to] Y"
 -string killnotify_attackers[KN_MAX_ENTRIES];
 -string killnotify_victims[KN_MAX_ENTRIES];
 -void HUD_KillNotify_Push(string attacker, string victim, float actiontype, float wpn)
 -{
 -      --kn_index;
 -      if (kn_index == -1)
 -              kn_index = KN_MAX_ENTRIES-1;
 -      killnotify_times[kn_index] = time;
 -      killnotify_deathtype[kn_index] = wpn;
 -      killnotify_actiontype[kn_index] = actiontype;
 -      if(killnotify_attackers[kn_index])
 -              strunzone(killnotify_attackers[kn_index]);
 -      killnotify_attackers[kn_index] = strzone(attacker);
 -      if(killnotify_victims[kn_index])
 -              strunzone(killnotify_victims[kn_index]);
 -      killnotify_victims[kn_index] = strzone(victim);
 -}
  
  void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s1 = attacker, s2 = victim
  {
 +      /*
        float w;
        float alsoprint, gentle;
        alsoprint = (autocvar_hud_panel_notify_print || !panel_enabled); // print message to console if: notify panel disabled, or cvar to do so enabled
                        if(alsoprint)
                                print(sprintf(_("%s^7 has dropped the ball!\n"), s1));
                }
 -      }
 +      }*/
  }
  
  void HUD_KillCenterprint(string s1, string s2, float type, float msg)
                                centerprint_hud(_("^1Don't go against team mates!"));
                        else
                                centerprint_hud(_("^1Don't shoot your team mates!"));
 -              } else if (type == DEATH_QUIET) {
 -                      // do nothing
                } else { // generic message
                        if(gentle)
                                centerprint_hud(_("^1You need to be more careful!"));
        }
  }
  
 -void HUD_Notify (void)
 +void HUD_Notify(void)
  {
        if(!autocvar__hud_configure)
        {
        float fadetime;
        fadetime = autocvar_hud_panel_notify_fadetime;
  
 -      string s;
 -
 -      vector pos_attacker, pos_victim;
 -      vector weap_pos;
 +      vector pos_attacker, pos_victim, pos_icon;
        float width_attacker;
 -      string attacker, victim;
 +      string attacker, victim, icon;
  
 -      float i, j, w, type, step, limit;
 +      float i, j, step, limit;
        if(autocvar_hud_panel_notify_flip) //order items from the top down
        {
                i = 0;
                                a = entries - 1 - i;
                        attacker = textShortenToWidth(sprintf(_("Player %d"), a+1), 0.48 * mySize_x - height, fontsize, stringwidth_colors);
                        victim = textShortenToWidth(sprintf(_("Player %d"), a+2), 0.48 * mySize_x - height, fontsize, stringwidth_colors);
 -                      s = strcat("weapon", get_weaponinfo(WEP_FIRST + mod(floor(a*2.4), WEP_LAST)).netname);
 +                      icon = strcat("weapon", get_weaponinfo(WEP_FIRST + mod(floor(a*2.4), WEP_LAST)).netname);
                        a = bound(0, (when - a) / 4, 1);
                        goto hud_config_notifyprint;
                }
 -
 -              if (j == KN_MAX_ENTRIES)
 -                      j = 0;
 -
 -              if(killnotify_times[j] + when > time)
 -                      a = 1;
 -              else if(fadetime)
 -              {
 -                      a = bound(0, (killnotify_times[j] + when + fadetime - time) / fadetime, 1);
 -                      if(!a)
 -                      {
 -                              break;
 -                      }
 -              }
                else
                {
 -                      break;
 -              }
 -
 -              s = "";
 -
 -              type = killnotify_deathtype[j];
 -              w = DEATH_WEAPONOF(type);
 +                      if (j == KN_MAX_ENTRIES)
 +                              j = 0;
  
 -              // TODO: maybe print in team colors?
 -              //
 -              // Y [used by] X
 -              if(killnotify_actiontype[j] == 0) 
 -              {
 -                      if(type == DEATH_GENERIC)
 -                      {
 -                              s = "notify_death";
 -                      }
 -                      else if(type == DEATH_NOAMMO)
 -                      {
 -                              s = "notify_outofammo";
 -                      }
 -                      else if(type == DEATH_KILL)
 -                      {
 -                              s = "notify_selfkill";
 -                      }
 -                      else if(type == DEATH_CAMP)
 -                      {
 -                              s = "notify_camping";
 -                      }
 -                      else if(type == KILL_TEAM_RED)
 -                      {
 -                              s = "notify_teamkill_red";
 -                      }
 -                      else if(type == KILL_TEAM_BLUE)
 -                      {
 -                              s = "notify_teamkill_blue";
 -                      }
 -                      else if(type == DEATH_DROWN)
 -                      {
 -                              s = "notify_water";
 -                      }
 -                      else if(type == DEATH_SLIME)
 -                      {
 -                              s = "notify_slime";
 -                      }
 -                      else if(type == DEATH_LAVA)
 -                      {
 -                              s = "notify_lava";
 -                      }
 -                      else if(type == DEATH_FALL)
 -                      {
 -                              s = "notify_fall";
 -                      }
 -                      else if(type == DEATH_SHOOTING_STAR)
 -                      {
 -                              s = "notify_shootingstar";
 -                      }
 -                      else if(type == DEATH_HURTTRIGGER || type == DEATH_CUSTOM)
 -                      {
 -                              s = "notify_death";
 -                      }
 -                      else if(type == INFO_GOTFLAG)
 -                      {
 -                              if(killnotify_victims[j] == "^1RED^7 flag")
 -                              {
 -                                      s = "notify_red_taken";
 -                              }
 -                              else
 -                              {
 -                                      s = "notify_blue_taken";
 -                              }
 -                      }
 -                      else if(type == INFO_RETURNFLAG)
 -                      {
 -                              if(killnotify_victims[j] == "^1RED^7 flag")
 -                              {
 -                                      s = "notify_red_returned";
 -                              }
 -                              else
 -                              {
 -                                      s = "notify_blue_returned";
 -                              }
 -                      }
 -                      else if(type == INFO_LOSTFLAG)
 -                      {
 -                              if(killnotify_victims[j] == "^1RED^7 flag")
 -                              {
 -                                      s = "notify_red_lost";
 -                              }
 -                              else
 -                              {
 -                                      s = "notify_blue_lost";
 -                              }
 -                      }
 -                      else if(type == INFO_CAPTUREFLAG)
 +                      if(killnotify_times[j] + when > time)
 +                              a = 1;
 +                      else if(fadetime)
                        {
 -                              if(killnotify_victims[j] == "^1RED^7 flag")
 -                              {
 -                                      s = "notify_red_captured";
 -                              }
 -                              else
 +                              a = bound(0, (killnotify_times[j] + when + fadetime - time) / fadetime, 1);
 +                              if(!a)
                                {
 -                                      s = "notify_blue_captured";
 +                                      break;
                                }
                        }
 -                      else if(type == KA_DROPBALL)
 -                      {
 -                              s = "notify_balldropped";
 -                      }
 -                      else if(type == KA_PICKUPBALL)
 +                      else
                        {
 -                              s = "notify_ballpickedup";
 +                              break;
                        }
                        
 -                      attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
 -                      pos_attacker = pos + eX * (0.52 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
 -                      weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height;
 -
 -                      if(s != "")
 -                      {
 -                              drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
 -                              drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
 -                      }
 +                      attacker = killnotify_attackers[j];
 +                      victim = killnotify_victims[j];
 +                      icon = killnotify_icon[j];
                }
 -              // X [did action to] Y
 -              else
 +
 +              //type = killnotify_deathtype[j];
 +              //w = DEATH_WEAPONOF(type);
 +
 +              if(icon != "")
                {
 -                      if(type & HITTYPE_SECONDARY && w == WEP_LASER)
 -                      {
 -                              s = "notify_melee_laser";
 -                      }
 -                      else if(type & HITTYPE_SECONDARY && w == WEP_SHOTGUN)
 -                      {
 -                              s = "notify_melee_shotgun";
 -                      }
 -                      else if(type & HITTYPE_HEADSHOT && (w == WEP_RIFLE || w == WEP_MINSTANEX)) // all headshot weapons go here
 -                      {
 -                              s = "notify_headshot";
 -                      }
 -                      else if(WEP_VALID(w))
 -                      {
 -                              self = get_weaponinfo(w);
 -                              s = strcat("weapon", self.netname);
 -                      }
 -                      else if(type == KILL_TEAM_RED)
 -                      {
 -                              s = "notify_teamkill_red";
 -                      }
 -                      else if(type == KILL_TEAM_BLUE)
 -                      {
 -                              s = "notify_teamkill_red";
 -                      }
 -                      else if(type == DEATH_TELEFRAG)
 -                      {
 -                              s = "notify_telefrag";
 -                      }
 -                      else if(type == DEATH_DROWN)
 -                      {
 -                              s = "notify_water";
 -                      }
 -                      else if(type == DEATH_SLIME)
 -                      {
 -                              s = "notify_slime";
 -                      }
 -                      else if(type == DEATH_LAVA)
 -                      {
 -                              s = "notify_lava";
 -                      }
 -                      else if(type == DEATH_FALL)
 -                      {
 -                              s = "notify_fall";
 -                      }
 -                      else if(type == DEATH_SHOOTING_STAR)
 -                      {
 -                              s = "notify_shootingstar";
 -                      }
 -                      else if(type == DEATH_HURTTRIGGER || type == DEATH_CUSTOM) // DEATH_CUSTOM is also void, right?
 -                      {
 -                              s = "notify_void";
 -                      }
 -                      else if(type == RACE_SERVER_RECORD)
 -                      {
 -                              s = "race_newrecordserver";
 -                      }
 -                      else if(type == RACE_NEW_RANK)
 -                      {
 -                              s = "race_newrankyellow";
 -                      }
 -                      else if(type == RACE_NEW_TIME)
 +                      if((attacker != "") && (victim == ""))
                        {
 -                              s = "race_newtime";
 +                              // Y [used by] X
 +                              attacker = textShortenToWidth(attacker, 0.73 * mySize_x - height, fontsize, stringwidth_colors);
 +                              pos_attacker = pos + eX * (0.27 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
 +                              pos_icon = pos + eX * 0.25 * mySize_x - eX * height + eY * i * height;
 +
 +                              drawpic_aspect_skin(pos_icon, icon, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
 +                              drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
                        }
 -                      else if(type == RACE_FAIL)
 +                      else if((attacker != "") && (victim != ""))
                        {
 -                              s = "race_newfail";
 -                      }
 -
 -                      attacker = textShortenToWidth(killnotify_attackers[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
 -                      victim = textShortenToWidth(killnotify_victims[j], 0.48 * mySize_x - height, fontsize, stringwidth_colors);
 +                              // X [did action to] Y
 +                              attacker = textShortenToWidth(attacker, 0.48 * mySize_x - height, fontsize, stringwidth_colors);
 +                              victim = textShortenToWidth(victim, 0.48 * mySize_x - height, fontsize, stringwidth_colors);
  :hud_config_notifyprint
 -                      width_attacker = stringwidth(attacker, TRUE, fontsize);
 -                      pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
 -                      pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
 -                      weap_pos = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height;
 +                              width_attacker = stringwidth(attacker, TRUE, fontsize);
 +                              pos_attacker = pos + eX * (0.48 * mySize_x - height - width_attacker) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
 +                              pos_victim = pos + eX * (0.52 * mySize_x + height) + eY * ((0.5 * fontsize_y + i * height) + (0.5 * (height - fontheight)));
 +                              pos_icon = pos + eX * 0.5 * mySize_x - eX * height + eY * i * height;
  
 -                      if(s != "")
 -                      {
 -                              drawpic_aspect_skin(weap_pos, s, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
 +                              drawpic_aspect_skin(pos_icon, icon, '2 1 0' * height, '1 1 1', panel_fg_alpha * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_attacker, attacker, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_victim, victim, fontsize, panel_fg_alpha * a, DRAWFLAG_NORMAL);
                        }
@@@ -2490,8 -2664,8 +2490,8 @@@ void HUD_Radar(void
        for(tm = world; (tm = find(tm, classname, "entcs_receiver")); )
        {
                color2 = GetPlayerColor(tm.sv_entnum);
 -              //if(color == COLOR_SPECTATOR || color == color2)
 -                      draw_teamradar_player(tm.origin, tm.angles, GetTeamRGB(color2));
 +              //if(color == FL_SPECTATOR || color == color2)
 +                      draw_teamradar_player(tm.origin, tm.angles, Team_ColorRGB(color2));
        }
        draw_teamradar_player(view_origin, view_angles, '1 1 1');
  
@@@ -2530,7 -2704,7 +2530,7 @@@ void HUD_Score_Rankings(vector pos, vec
                        for(i=0; i<team_count; ++i) {
                                if (i == floor((entries - 2) / players_per_team) || (entries == 1 && i == 0))
                                        HUD_Panel_DrawHighlight(pos + eX * score_size * i, eX * score_size + eY * fontsize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              drawstring_aspect(pos + eX * score_size * i, ftos(175 - 23*i), eX * score_size + eY * fontsize_y, GetTeamRGB(ColorByTeam(i)) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawstring_aspect(pos + eX * score_size * i, ftos(175 - 23*i), eX * score_size + eY * fontsize_y, Team_ColorRGB(ColorByTeam(i)) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
                        }
                        first_pl = 1;
                        pos_y += fontsize_y;
                        }
  
                        if (team_count)
 -                              score_color = GetTeamRGB(ColorByTeam(floor((i - first_pl) / players_per_team))) * 0.8;
 +                              score_color = Team_ColorRGB(ColorByTeam(floor((i - first_pl) / players_per_team))) * 0.8;
                        s = textShortenToWidth(s, name_size, fontsize, stringwidth_colors);
                        drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                        drawstring(pos + eX * (name_size + spacing_size), ftos(score), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
                // show team scores in the first line
                float score_size = mySize_x / team_count;
                for(tm = teams.sort_next; tm; tm = tm.sort_next) {
 -                      if(tm.team == COLOR_SPECTATOR)
 +                      if(tm.team == FL_SPECTATOR)
                                continue;
                        if (tm.team == myteam)
                                drawfill(pos + eX * score_size * i, eX * score_size + eY * fontsize_y, '1 1 1', highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
 -                      drawstring_aspect(pos + eX * score_size * i, ftos(tm.(teamscores[ts_primary])), eX * score_size + eY * fontsize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                      drawstring_aspect(pos + eX * score_size * i, ftos(tm.(teamscores[ts_primary])), eX * score_size + eY * fontsize_y, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
                        ++i;
                }
                first_pl = 1;
        do
        for (pl = players.sort_next; pl && i<entries; pl = pl.sort_next)
        {
 -              if ((team_count && pl.team != tm.team) || pl.team == COLOR_SPECTATOR)
 +              if ((team_count && pl.team != tm.team) || pl.team == FL_SPECTATOR)
                        continue;
  
                if (i == entries-1 && !me_printed && pl != me)
                if (autocvar_hud_panel_score_rankings == 1 && spectatee_status != -1)
                {
                        for (pl = me.sort_next; pl; pl = pl.sort_next)
 -                              if (pl.team != COLOR_SPECTATOR)
 +                              if (pl.team != FL_SPECTATOR)
                                        break;
  
                        if (pl)
                        drawfill(pos, eX * mySize_x + eY * fontsize_y, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
                }
                if (team_count)
 -                      score_color = GetTeamRGB(pl.team) * 0.8;
 +                      score_color = Team_ColorRGB(pl.team) * 0.8;
                s = textShortenToWidth(GetPlayerName(pl.sv_entnum), name_size, fontsize, stringwidth_colors);
                drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, TRUE, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                drawstring(pos + eX * (name_size + spacing_size), ftos(pl.(scores[ps_primary])), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
                pos_y += fontsize_y;
                ++i;
        }
 -      while (i<entries && team_count && (tm = tm.sort_next) && (tm.team != COLOR_SPECTATOR || (tm = tm.sort_next)));
 +      while (i<entries && team_count && (tm = tm.sort_next) && (tm.team != FL_SPECTATOR || (tm = tm.sort_next)));
  }
  
  void HUD_Score(void)
                vector score_pos, score_size; //for scores other than myteam
                if (spectatee_status == -1 || autocvar_hud_panel_score_rankings)
                {
 -                      for(tm = teams.sort_next; tm, tm.team != COLOR_SPECTATOR; tm = tm.sort_next)
 +                      for(tm = teams.sort_next; tm, tm.team != FL_SPECTATOR; tm = tm.sort_next)
                                ++scores_count;
                        if (autocvar_hud_panel_score_rankings)
                        {
                draw_beginBoldFont();
                row = column = 0;
                for(tm = teams.sort_next; tm; tm = tm.sort_next) {
 -                      if(tm.team == COLOR_SPECTATOR)
 +                      if(tm.team == FL_SPECTATOR)
                                continue;
                        score = tm.(teamscores[ts_primary]);
                        if(autocvar__hud_configure)
                                score_pos = pos + eX * column * (score_size_x + offset_x) + eY * row * (score_size_y + offset_y);
                                if (max_fragcount == score)
                                        HUD_Panel_DrawHighlight(score_pos, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              drawstring_aspect(score_pos, ftos(score), score_size, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawstring_aspect(score_pos, ftos(score), score_size, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
                                ++row;
                                if(row >= rows)
                                {
                        else if(tm.team == myteam) {
                                if (max_fragcount == score)
                                        HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize_x + eY * mySize_y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize_x + eY * mySize_y, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
                        } else {
                                if (max_fragcount == score)
                                        HUD_Panel_DrawHighlight(pos + eX * 0.75 * mySize_x + eY * (1/3) * rows * mySize_y, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 -                              drawstring_aspect(pos + eX * 0.75 * mySize_x + eY * (1/3) * rows * mySize_y, ftos(score), score_size, GetTeamRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
 +                              drawstring_aspect(pos + eX * 0.75 * mySize_x + eY * (1/3) * rows * mySize_y, ftos(score), score_size, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
                                ++rows;
                        }
                }
@@@ -2938,13 -3112,13 +2938,13 @@@ void HUD_RaceTimer (void
                if(race_mycheckpointtime)
                {
                        a = bound(0, 2 - (time - race_mycheckpointtime), 1);
-                       s = MakeRaceString(race_mycheckpoint, TIME_DECODE(race_mycheckpointdelta), -!race_mycheckpointenemy, race_mycheckpointlapsdelta, race_mycheckpointenemy);
+                       s = MakeRaceString(race_mycheckpoint, TIME_DECODE(race_mycheckpointdelta), -(race_mycheckpointenemy == ""), race_mycheckpointlapsdelta, race_mycheckpointenemy);
                        drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.2 * mySize_y) + eY * 0.6 * mySize_y, s, '1 1 0' * 0.2 * mySize_y, panel_fg_alpha * a, DRAWFLAG_NORMAL);
                }
                if(race_othercheckpointtime && race_othercheckpointenemy != "")
                {
                        a = bound(0, 2 - (time - race_othercheckpointtime), 1);
-                       s = MakeRaceString(race_othercheckpoint, -TIME_DECODE(race_othercheckpointdelta), -!race_othercheckpointenemy, race_othercheckpointlapsdelta, race_othercheckpointenemy);
+                       s = MakeRaceString(race_othercheckpoint, -TIME_DECODE(race_othercheckpointdelta), -(race_othercheckpointenemy == ""), race_othercheckpointlapsdelta, race_othercheckpointenemy);
                        drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.2 * mySize_y) + eY * 0.6 * mySize_y, s, '1 1 0' * 0.2 * mySize_y, panel_fg_alpha * a, DRAWFLAG_NORMAL);
                }
  
@@@ -3222,7 -3396,7 +3222,7 @@@ void HUD_Mod_CTF(vector pos, vector myS
                case 2: red_icon = "flag_red_lost"; break;
                case 3: red_icon = "flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
                default:
 -                      if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM2))
 +                      if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_2))
                                red_icon = "flag_red_shielded";
                        else
                                red_icon = string_null;
                default:
                        if(redflag == 3)
                                red_icon_prevstatus = "flag_red_carrying"; // make it more visible
 -                      else if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM2))
 +                      else if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_2))
                                red_icon_prevstatus = "flag_red_shielded";
                        else
                                red_icon_prevstatus = string_null;
                case 2: blue_icon = "flag_blue_lost"; break;
                case 3: blue_icon = "flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
                default:
 -                      if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM1))
 +                      if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_1))
                                blue_icon = "flag_blue_shielded";
                        else
                                blue_icon = string_null;
                default:
                        if(blueflag == 3)
                                blue_icon_prevstatus = "flag_blue_carrying"; // make it more visible
 -                      else if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM1))
 +                      else if((stat_items & IT_CTF_SHIELDED) && (myteam == FL_TEAM_1))
                                blue_icon_prevstatus = "flag_blue_shielded";
                        else
                                blue_icon_prevstatus = string_null;
        }
  
        if(mySize_x > mySize_y) {
 -              if (myteam == COLOR_TEAM1) { // always draw own flag on left
 +              if (myteam == FL_TEAM_1) { // always draw own flag on left
                        redflag_pos = pos;
                        blueflag_pos = pos + eX * 0.5 * mySize_x;
                } else {
                }
                flag_size = eX * 0.5 * mySize_x + eY * mySize_y;
        } else {
 -              if (myteam == COLOR_TEAM1) { // always draw own flag on left
 +              if (myteam == FL_TEAM_1) { // always draw own flag on left
                        redflag_pos = pos;
                        blueflag_pos = pos + eY * 0.5 * mySize_y;
                } else {
@@@ -3394,16 -3568,16 +3394,16 @@@ void HUD_Mod_KH(vector pos, vector mySi
                {
                        switch(keyteam)
                        {
 -                              case COLOR_TEAM1:
 +                              case FL_TEAM_1:
                                        drawpic_aspect_skin(pa, "kh_redarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% theAlpha key
                                        break;
 -                              case COLOR_TEAM2:
 +                              case FL_TEAM_2:
                                        drawpic_aspect_skin(pa, "kh_bluearrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% theAlpha key
                                        break;
 -                              case COLOR_TEAM3:
 +                              case FL_TEAM_3:
                                        drawpic_aspect_skin(pa, "kh_yellowarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% theAlpha key
                                        break;
 -                              case COLOR_TEAM4:
 +                              case FL_TEAM_4:
                                        drawpic_aspect_skin(pa, "kh_pinkarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% theAlpha key
                                        break;
                                default:
@@@ -3750,7 -3924,7 +3750,7 @@@ void HUD_Mod_Dom(vector myPos, vector m
        entity tm;
        float teams_count = 0;
        for(tm = teams.sort_next; tm; tm = tm.sort_next)
 -              if(tm.team != COLOR_SPECTATOR)
 +              if(tm.team != FL_SPECTATOR)
                        ++teams_count;
  
        float layout = autocvar_hud_panel_modicons_dom_layout;
@@@ -4209,7 -4383,7 +4209,7 @@@ void HUD_InfoMessages(void
                        {
                                for(; tm.sort_next; tm = tm.sort_next)
                                {
 -                                      if(!tm.team_size || tm.team == COLOR_SPECTATOR)
 +                                      if(!tm.team_size || tm.team == FL_SPECTATOR)
                                                continue;
                                        if(!ts_min) ts_min = tm.team_size;
                                        else ts_min = min(ts_min, tm.team_size);
                                        s = strcat(blinkcolor, _("Teamnumbers are unbalanced!"));
                                        tm = GetTeam(myteam, false);
                                        if (tm)
 -                                      if (tm.team != COLOR_SPECTATOR)
 +                                      if (tm.team != FL_SPECTATOR)
                                        if (tm.team_size == ts_max)
                                                s = strcat(s, sprintf(_(" Press ^3%s%s to adjust"), getcommandkey("team menu", "menu_showteamselect"), blinkcolor));
                                        drawInfoMessage(s)
index 0bc5ededea7b18de6d4e2f4c3940bfad022a75ad,fe176e3167da3d8dd916f4cd17afea04db7958de..766639856b6eb5a3520062e1143a594636378e81
@@@ -40,8 -40,9 +40,9 @@@ void Curl_URI_Get_Callback(float id, fl
                cvar_set(do_cvar, data);
                strunzone(do_cvar);
        }
-       if(!do_exec && !do_cvar)
-               print(data);
+       if(!do_exec)
+               if not(do_cvar)
+                       print(data);
  }
  
  
@@@ -92,7 -93,7 +93,7 @@@ void GenericCommand_addtolist(float req
        }
  }
  
 -void GenericCommand_curl(float request, float argc)
 +void GenericCommand_qc_curl(float request, float argc)
  {
        switch(request)
        {
                default:
                case CMD_REQUEST_USAGE:
                {
 -                      print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " curl [--key N] [--cvar] [--exec] URL [postargs...]"));
 +                      print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " qc_curl [--key N] [--cvar] [--exec] URL [postargs...]"));
                        return;
                }
        }
@@@ -226,55 -227,6 +227,55 @@@ void GenericCommand_dumpcommands(float 
        }
  }
  
 +void GenericCommand_dumpnotifs(float request)
 +{
 +      switch(request)
 +      {
 +              case CMD_REQUEST_COMMAND:
 +              {
 +                      float fh, alsoprint = FALSE;
 +                      
 +                      string filename = argv(1);
 +                      
 +                      if(filename == "")
 +                      {
 +                              filename = "notifications_dump.txt";
 +                              alsoprint = FALSE;
 +                      }
 +                      else if(filename == "-")
 +                      {
 +                              filename = "notifications_dump.txt";
 +                              alsoprint = TRUE;
 +                      }
 +                      fh = fopen(filename, FILE_WRITE);
 +                      
 +                      if(fh >= 0)
 +                      {
 +                              fputs(fh, "dump of notifications list:\n");
 +                              if(alsoprint) { print("dump of notifications list:\n"); }
 +                              Dump_Notifications(fh, alsoprint);
 +                              print(sprintf("File located in ^2data/data/%s^7.\n", filename));
 +                              fclose(fh);
 +                      }
 +                      else
 +                      {
 +                              print(sprintf("^1Error: ^7Could not open file '%s'!\n", filename));
 +                      }
 +                      return;
 +              }
 +                      
 +              default:
 +              case CMD_REQUEST_USAGE:
 +              {
 +                      print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpnotifs [filename]"));
 +                      print("  Where 'filename' is the file to write (default is notifications_dump.txt),\n");
 +                      print("  if supplied with '-' output to console as well as default,\n");
 +                      print("  if left blank, it will only write to default.\n");
 +                      return;
 +              }
 +      }
 +}
 +
  void GenericCommand_maplist(float request, float argc)
  {
        switch(request)
@@@ -512,11 -464,10 +513,11 @@@ void GenericCommand_(float request
  // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
  #define GENERIC_COMMANDS(request,arguments,command) \
        GENERIC_COMMAND("addtolist", GenericCommand_addtolist(request, arguments), "Add a string to a cvar") \
 -      GENERIC_COMMAND("curl", GenericCommand_curl(request, arguments), "Queries an URL") \
        GENERIC_COMMAND("dumpcommands", GenericCommand_dumpcommands(request), "Dump all commands on the program to *_cmd_dump.txt") \
 +      GENERIC_COMMAND("dumpnotifs", GenericCommand_dumpnotifs(request), "Dump all notifications into notifications_dump.txt") \
        GENERIC_COMMAND("maplist", GenericCommand_maplist(request, arguments), "Automatic control of maplist") \
        GENERIC_COMMAND("nextframe", GenericCommand_nextframe(request, arguments, command), "Execute the given command next frame of this VM") \
 +      GENERIC_COMMAND("qc_curl", GenericCommand_qc_curl(request, arguments), "Queries a URL") \
        GENERIC_COMMAND("removefromlist", GenericCommand_removefromlist(request, arguments), "Remove a string from a cvar") \
        GENERIC_COMMAND("rpn", GenericCommand_rpn(request, arguments, command), "RPN calculator") \
        GENERIC_COMMAND("settemp", GenericCommand_settemp(request, arguments), "Temporarily set a value to a cvar which is restored later") \
diff --combined qcsrc/server/bot/bot.qc
index 3781077ebc01d7efda4abe15c2c1106d6a7873bc,851a1d9fcf0a1c31aa786cf6c12d97d3daf34894..1030075d38d1468e5d8117c7f29dcb3e9b3e1d31
@@@ -135,11 -135,8 +135,8 @@@ void bot_setnameandstuff(
        else
        {
                RandomSelection_Init();
-               for(;;)
+               while((readfile = fgets(file)))
                {
-                       readfile = fgets(file);
-                       if(!readfile)
-                               break;
                        if(substring(readfile, 0, 2) == "//")
                                continue;
                        if(substring(readfile, 0, 1) == "#")
@@@ -399,13 -396,13 +396,13 @@@ void bot_clientconnect(
                bot_setnameandstuff();
  
        if(self.bot_forced_team==1)
 -              self.team = COLOR_TEAM1;
 +              self.team = FL_TEAM_1;
        else if(self.bot_forced_team==2)
 -              self.team = COLOR_TEAM2;
 +              self.team = FL_TEAM_2;
        else if(self.bot_forced_team==3)
 -              self.team = COLOR_TEAM3;
 +              self.team = FL_TEAM_3;
        else if(self.bot_forced_team==4)
 -              self.team = COLOR_TEAM4;
 +              self.team = FL_TEAM_4;
        else
                JoinBestTeam(self, FALSE, TRUE);
  
@@@ -426,13 -423,13 +423,13 @@@ void bot_removefromlargestteam(
        bestcount = 0;
        while (head)
        {
 -              if(head.team == COLOR_TEAM1)
 +              if(head.team == FL_TEAM_1)
                        thiscount = c1;
 -              else if(head.team == COLOR_TEAM2)
 +              else if(head.team == FL_TEAM_2)
                        thiscount = c2;
 -              else if(head.team == COLOR_TEAM3)
 +              else if(head.team == FL_TEAM_3)
                        thiscount = c3;
 -              else if(head.team == COLOR_TEAM4)
 +              else if(head.team == FL_TEAM_4)
                        thiscount = c4;
                else
                        thiscount = 0;
index 81d218271460b17f1a5951c93f71e0d525dd3c27,165460eeb2ae3ad678729611f873f927c7f65cb9..6fb67b4f084dd36895993faf4ba1c73f0748e014
@@@ -554,7 -554,7 +554,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));
@@@ -1241,10 -1241,10 +1241,10 @@@ void ClientKill_TeamChange (float targe
                }
                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_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, strcat("^7Changing to ", Team_ColoredFullName(targetteam), "^7 in %d seconds"), 1, self.killindicator.cnt);
                }
        }
  
@@@ -1286,7 -1286,7 +1286,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
@@@ -1335,6 -1335,7 +1335,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);
@@@ -1362,16 -1363,6 +1362,16 @@@ void ClientConnect (void
        self.flags = FL_CLIENT;
        self.version_nagtime = time + 10 + random() * 10;
  
 +      if(self.netaddress == "local")
 +      {
 +              print("^3server is local!\n");
 +
 +              if(server_is_local)
 +                      print("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")
        bprint("^4", self.netname, "^4 connected");
  
        if(self.classname != "observer" && (g_domination || g_ctf))
 -              bprint(" and joined the ", ColoredTeamName(self.team));
 +              bprint(" and joined the ", Team_ColoredFullName(self.team));
  
        bprint("\n");
  
@@@ -3084,7 -3075,7 +3084,7 @@@ void PlayerPostThink (void
  
        if((g_cts || g_race) && self.cvar_cl_allow_uidtracking == 1 && self.cvar_cl_allow_uid2name == 1)
        {
-               if(!self.stored_netname)
+               if not(self.stored_netname)
                        self.stored_netname = strzone(uid2name(self.crypto_idfp));
                if(self.stored_netname != self.netname)
                {
index 2599b13518f1863637851440df9bbaacbfdf2aad,6a0dcdf8b4e01679d23dfd1576c581e2c061e3ce..e0bad53d39f3fecb7975a22d7837d8a6e0db8728
@@@ -131,16 -131,16 +131,16 @@@ void dompoint_captured (
  
        switch(self.goalentity.team)
        {
 -              case COLOR_TEAM1:
 +              case FL_TEAM_1:
                        WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");
                        break;
 -              case COLOR_TEAM2:
 +              case FL_TEAM_2:
                        WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");
                        break;
 -              case COLOR_TEAM3:
 +              case FL_TEAM_3:
                        WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");
                        break;
 -              case COLOR_TEAM4:
 +              case FL_TEAM_4:
                        WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
        }
  
                        wait_time = head.wait;
                switch(head.goalentity.team)
                {
 -                      case COLOR_TEAM1:
 +                      case FL_TEAM_1:
                                pps_red += points/wait_time;
                                break;
 -                      case COLOR_TEAM2:
 +                      case FL_TEAM_2:
                                pps_blue += points/wait_time;
                                break;
 -                      case COLOR_TEAM3:
 +                      case FL_TEAM_3:
                                pps_yellow += points/wait_time;
                                break;
 -                      case COLOR_TEAM4:
 +                      case FL_TEAM_4:
                                pps_pink += points/wait_time;
                }
                total_pps += points/wait_time;
@@@ -355,7 -355,7 +355,7 @@@ void dom_controlpoint_setup(
  
        self.cnt = -1;
  
-       if(!self.message)
+       if(self.message == "")
                self.message = " has captured a control point";
  
        if(self.DOMPOINTFRAGS <= 0)
@@@ -469,12 -469,12 +469,12 @@@ void dom_spawnteams(
        else
                numteams = autocvar_g_domination_teams_override;
        // LordHavoc: edit this if you want to change defaults
 -      dom_spawnteam("Red", COLOR_TEAM1-1, "models/domination/dom_red.md3", 0, "domination/claim.wav", "", "Red team has captured a control point");
 -      dom_spawnteam("Blue", COLOR_TEAM2-1, "models/domination/dom_blue.md3", 0, "domination/claim.wav", "", "Blue team has captured a control point");
 +      dom_spawnteam("Red", FL_TEAM_1-1, "models/domination/dom_red.md3", 0, "domination/claim.wav", "", "Red team has captured a control point");
 +      dom_spawnteam("Blue", FL_TEAM_2-1, "models/domination/dom_blue.md3", 0, "domination/claim.wav", "", "Blue team has captured a control point");
        if(numteams > 2)
 -              dom_spawnteam("Yellow", COLOR_TEAM3-1, "models/domination/dom_yellow.md3", 0, "domination/claim.wav", "", "Yellow team has captured a control point");
 +              dom_spawnteam("Yellow", FL_TEAM_3-1, "models/domination/dom_yellow.md3", 0, "domination/claim.wav", "", "Yellow team has captured a control point");
        if(numteams > 3)
 -              dom_spawnteam("Pink", COLOR_TEAM4-1, "models/domination/dom_pink.md3", 0, "domination/claim.wav", "", "Pink team has captured a control point");
 +              dom_spawnteam("Pink", FL_TEAM_4-1, "models/domination/dom_pink.md3", 0, "domination/claim.wav", "", "Pink team has captured a control point");
        dom_spawnteam("", 0, "models/domination/dom_unclaimed.md3", 0, "", "", "");
  }
  
diff --combined qcsrc/server/g_world.qc
index 1862ba8cb92a214e7ff656638d8d5c864865226e,8d8c0328ec6abed9d4e4e7c7d516fb4249faf260..001fbc5bb5d2d5dd718bbd188eddbf1a4dd5c307
@@@ -553,8 -553,6 +553,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 -599,6 +601,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));
  
@@@ -1765,10 -1761,10 +1765,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;
        }
@@@ -1817,13 -1813,13 +1817,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;
@@@ -1949,10 -1945,10 +1949,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();
@@@ -2068,25 -2064,25 +2068,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);
@@@ -2354,7 -2350,7 +2354,7 @@@ string MapVote_Suggest(string m
        if(mapvote_initialized)
                return "Can't suggest - voting is already in progress!";
        m = MapInfo_FixName(m);
-       if(!m)
+       if not(m)
                return "The map you suggested is not available on this server.";
        if(!autocvar_g_maplist_votable_suggestions_override_mostrecent)
                if(Map_IsRecent(m))
index e0f899486a450d3a17125dc57e65c4d03d5ebd73,efb73540672df091703c6649b2aa90e7862ffb2b..7a73b22b076fe7a09f79c8f0bfb1fa0e7b0c5bc8
@@@ -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)
  {
@@@ -427,7 -428,7 +427,7 @@@ string formatmessage(string msg
                        else replacement = "batteries"; // ;)
                } else if (escape == "x") {
                        replacement = cursor_ent.netname;
-                       if (!replacement || !cursor_ent)
+                       if (replacement == "" || !cursor_ent)
                                replacement = "nothing";
                } else if (escape == "s")
                        replacement = ftos(vlen(self.velocity - self.velocity_z * '0 0 1'));
@@@ -610,6 -611,85 +610,6 @@@ void backtrace(string msg
      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)
  {
@@@ -1091,6 -1171,7 +1091,6 @@@ void readlevelcvars(void
  #endif
  
        sv_clones = cvar("sv_clones");
 -      sv_gentle = cvar("sv_gentle");
        sv_foginterval = cvar("sv_foginterval");
        g_cloaked = cvar("g_cloaked");
      if(g_cts)
@@@ -1573,6 -1654,34 +1573,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()
@@@ -2666,8 -2775,3 +2666,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); }
 +}
diff --combined qcsrc/server/race.qc
index 3eda8e30085fa61c1ed39d87a9b8271e69ae7d72,6d764855511131ffa4450a2e2b04b9ffd37f5ba3..2c3f003a237f49103d01a0a04af4503e96d4a56e
@@@ -156,13 -156,13 +156,13 @@@ void race_setTime(string map, float t, 
                recorddifference = strcat(" ^1[+", TIME_ENCODED_TOSTRING(t - oldrec), "]");
                bprint(mynetname, "^7 couldn't break their ", race_placeName(player_prevpos), " place record of ", TIME_ENCODED_TOSTRING(oldrec), recorddifference, "\n");
                race_SendStatus(0, e); // "fail"
 -              Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_FAIL, MSG_RACE);
 +              Send_Notification(world, MSG_BROADCAST, MSG_INFO, INFO_RACE_FAIL, e.netname, TIME_ENCODED_TOSTRING(t), NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                return;
        } else if (!newpos) { // no ranking, time worse than the worst ranked
                recorddifference = strcat(" ^1[+", TIME_ENCODED_TOSTRING(t - race_readTime(GetMapname(), RANKINGS_CNT)), "]");
                bprint(mynetname, "^7 couldn't break the ", race_placeName(RANKINGS_CNT), " place record of ", TIME_ENCODED_TOSTRING(race_readTime(GetMapname(), RANKINGS_CNT)), recorddifference, "\n");
                race_SendStatus(0, e); // "fail"
 -              Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_FAIL, MSG_RACE);
 +              Send_Notification(world, MSG_BROADCAST, MSG_INFO, INFO_RACE_FAIL, e.netname, TIME_ENCODED_TOSTRING(t), NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                return;
        }
  
                        bprint(mynetname, "^1 broke ", oldrec_holder, "^1's 1st place record with ", strcat(TIME_ENCODED_TOSTRING(t), recorddifference, "\n"));
                }
                race_SendStatus(3, e); // "new server record"
 -              Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_SERVER_RECORD, MSG_RACE);
 +              Send_Notification(world, MSG_BROADCAST, MSG_INFO, INFO_RACE_NEW_RECORD, e.netname, TIME_ENCODED_TOSTRING(t), NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
        } else {
                if(newpos == player_prevpos) {
                        recorddifference = strcat(" ^2[-", TIME_ENCODED_TOSTRING(oldrec - t), "]");
                        bprint(mynetname, "^5 improved their ", race_placeName(newpos), " ^5place record with ", TIME_ENCODED_TOSTRING(t), recorddifference, "\n");
                        race_SendStatus(1, e); // "new time"
 -                      Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_NEW_TIME, MSG_RACE);
 +                      Send_Notification(world, MSG_BROADCAST, MSG_INFO, INFO_RACE_NEW_TIME, e.netname, TIME_ENCODED_TOSTRING(t), NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                } else if (oldrec == 0) {
                        bprint(mynetname, "^2 set the ", race_placeName(newpos), " ^2place record with ", TIME_ENCODED_TOSTRING(t), "\n");
                        race_SendStatus(2, e); // "new rank"
 -                      Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_NEW_RANK, MSG_RACE);
 +                      Send_Notification(world, MSG_BROADCAST, MSG_INFO, INFO_RACE_NEW_RANK, e.netname, TIME_ENCODED_TOSTRING(t), NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                } else {
                        recorddifference = strcat(" ^2[-", TIME_ENCODED_TOSTRING(oldrec - t), "]");
                        bprint(mynetname, "^2 broke ", oldrec_holder, "^2's ", race_placeName(newpos), " ^2place record with ", strcat(TIME_ENCODED_TOSTRING(t), recorddifference, "\n"));
                        race_SendStatus(2, e); // "new rank"
 -                      Send_KillNotification(e.netname, TIME_ENCODED_TOSTRING(t), "", RACE_NEW_TIME, MSG_RACE);
 +                      Send_Notification(world, MSG_BROADCAST, MSG_INFO, INFO_RACE_NEW_RANK, e.netname, TIME_ENCODED_TOSTRING(t), NO_FL_ARG, NO_FL_ARG, NO_FL_ARG);
                }
        }
  }
@@@ -817,11 -817,11 +817,11 @@@ void spawnfunc_trigger_race_checkpoint(
        waypoint_spawnforitem_force(self, trace_endpos);
        self.nearestwaypointtimeout = time + 1000000000;
  
-       if(!self.message)
+       if(self.message == "")
                self.message = "went backwards";
-       if (!self.message2)
+       if (self.message2 == "")
                self.message2 = "was pushed backwards by";
-       if (!self.race_penalty_reason)
+       if (self.race_penalty_reason == "")
                self.race_penalty_reason = "missing a checkpoint";
        
        self.race_checkpoint = self.cnt;
@@@ -870,11 -870,11 +870,11 @@@ void spawnfunc_target_checkpoint() // d
        waypoint_spawnforitem_force(self, trace_endpos);
        self.nearestwaypointtimeout = time + 1000000000;
  
-       if(!self.message)
+       if(self.message == "")
                self.message = "went backwards";
-       if (!self.message2)
+       if (self.message2 == "")
                self.message2 = "was pushed backwards by";
-       if (!self.race_penalty_reason)
+       if (self.race_penalty_reason == "")
                self.race_penalty_reason = "missing a checkpoint";
  
        if(self.classname == "target_startTimer")
@@@ -1102,7 -1102,7 +1102,7 @@@ void spawnfunc_trigger_race_penalty(
        if not(self.spawnflags & 1)
                self.touch = penalty_touch;
  
-       if (!self.race_penalty_reason)
+       if (self.race_penalty_reason == "")
                self.race_penalty_reason = "missing a checkpoint";
        if (!self.race_penalty)
                self.race_penalty = 5;