]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud.qc
just draw the fps into full panel size on the engineinfo panel until we might get...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud.qc
index 16f9baea985e484e73539cdf92c7aa64e494bcc4..f561aef47894d020e3e8419d2b587d4accee4a0a 100644 (file)
@@ -570,7 +570,7 @@ void HUD_Panel_ExportCfg(string cfgname)
                fputs(fh, strcat("seta hud_bg_alpha \"", cvar_string("hud_bg_alpha"), "\"", "\n"));
                fputs(fh, strcat("seta hud_bg_border \"", cvar_string("hud_bg_border"), "\"", "\n"));
                fputs(fh, strcat("seta hud_bg_padding \"", cvar_string("hud_bg_padding"), "\"", "\n"));
-               fputs(fh, strcat("seta hud_fg_alpha) \"", cvar_string("hud_fg_alpha"), "\"", "\n"));
+               fputs(fh, strcat("seta hud_fg_alpha \"", cvar_string("hud_fg_alpha"), "\"", "\n"));
                fputs(fh, "\n");
 
                fputs(fh, strcat("seta hud_dock \"", cvar_string("hud_dock"), "\"", "\n"));
@@ -618,6 +618,7 @@ void HUD_Panel_ExportCfg(string cfgname)
                                        break;
                                case 4:
                                        fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_flip ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_flip"))), "\n"));
+                                       fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_info_top ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_info_top"))), "\n"));
                                        break;
                                case 6:
                                        fputs(fh, strcat("seta hud_", HUD_Panel_GetName(i), "_foreground_alpha ", ftos(cvar(strcat("hud_", HUD_Panel_GetName(i), "_foreground_alpha"))), "\n"));
@@ -656,8 +657,8 @@ vector HUD_Panel_GetMinSize(float id)
                        }
                        break;
                case 4: 
-                       mySize_x = 1.2; // 12/10 * height, as panel cant support more than 10 entries...
-                       mySize_y = 1/12; // 1/12 * width
+                       mySize_x = 1.1; // 4/5 * height, trial and error...
+                       mySize_y = 1/3; // 1/3 * width, trial and error...
                        break;
                case 5: 
                        mySize_y = 1/4.1; // 1/4.1 * width, trial and error...
@@ -678,11 +679,9 @@ vector HUD_Panel_GetMinSize(float id)
                        mySize_y = 0.5898; // 0.5898 * width, reason: bg has weird dimensions...
                        break;
                case 13: 
-                       mySize_y = 0.25; // 0.25 * width, trial and error...
+                       mySize_y = 0.2; // 0.25 * width, trial and error...
                        break;
        }
-       if(!mySize_x && mySize_y)
-               mySize_x = 1/mySize_y;
        return mySize;
 }
 
@@ -738,11 +737,6 @@ vector HUD_Panel_GetPos(float id)
 
        pos = eX * pos_x * vid_conwidth + eY * pos_y * vid_conheight;
 
-       if (pos_x < 0)
-               pos_x = vid_conwidth + pos_x;
-       if (pos_y < 0)
-               pos_y = vid_conheight + pos_y;
-
        if(disable_menu_alphacheck == 2 && id == highlightedPanel)
        {
                vector mySize, menu_enable_panelpos;
@@ -1022,150 +1016,129 @@ void HUD_Panel_SetPos(float id, vector pos)
 
        if(cvar("hud_configure_grid"))
        {
-               pos_x = floor(pos_x/cvar("hud_configure_grid_x") + 0.5) * cvar("hud_configure_grid_x");
-               pos_y = floor(pos_y/cvar("hud_configure_grid_y") + 0.5) * cvar("hud_configure_grid_y");
+               pos_x = floor((pos_x/vid_conwidth)/bound(0.005, cvar("hud_configure_grid_x"), 0.2) + 0.5) * cvar("hud_configure_grid_x") * vid_conwidth;
+               pos_y = floor((pos_y/vid_conheight)/bound(0.005, cvar("hud_configure_grid_y"), 0.2) + 0.5) * cvar("hud_configure_grid_y") * vid_conheight;
        }
 
-       if (pos_x + 0.5 * mySize_x > 0.5 * vid_conwidth)
-               pos_x = pos_x - vid_conwidth;
-       if (pos_y + 0.5 * mySize_y > 0.5 * vid_conheight)
-               pos_y = pos_y - vid_conheight;
-
        string s;
        s = strcat(ftos(pos_x/vid_conwidth), " ", ftos(pos_y/vid_conheight));
 
        cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_pos"), s);
 }
 
-float HUD_Panel_CheckValidity_of_ResizeSuggestion(float id, vector mySize)
-{
-       vector oldSize;
-       oldSize = mySize;
-
-       // copy pasta from SetPosSize:
-       // minimum panel size cap
-       mySize_x = max(0.025 * vid_conwidth, mySize_x);
-       mySize_y = max(0.025 * vid_conheight, mySize_y);
-
-       if(id == 12) // some panels have their own restrictions, like the chat panel (which actually only moves the engine chat print around). Looks bad if it's too small.
-       {
-               mySize_x = max(17 * cvar("con_chatsize"), mySize_x);
-               mySize_y = max(2 * cvar("con_chatsize") + 2 * HUD_Panel_GetPadding(id), mySize_y);
-       }
-
-       // cap against panel's own limits
-       vector minSize;
-       minSize = HUD_Panel_GetMinSize(id); // mySize_x at least minSize_x * mySize_y, and vice versa
-
-       mySize_x = max(minSize_x * mySize_y, mySize_x);
-       mySize_y = max(minSize_y * mySize_x, mySize_y);
-
-       if(mySize == oldSize)
-               return 1;
-       else
-               return 0;
-}
-
 // check if resize will result in panel being moved into another panel. If so, return snapped vector, otherwise return the given vector
-vector HUD_Panel_CheckResize(float id, vector myPos, vector mySize, vector resizeorigin)
-{
+vector HUD_Panel_CheckResize(float id, vector mySize, vector resizeorigin, float ratio) {
        float i;
 
+       float targBorder;
        vector targPos;
        vector targSize;
-       vector myCenter;
-       vector targCenter;
-       myCenter = '0 0 0'; // shut up fteqcc, there IS a reference
-       targCenter = '0 0 0'; // shut up fteqcc, there IS a reference
+       vector targEndPos;
+       vector dist;
 
        for (i = 0; i < HUD_PANEL_NUM; ++i) {
                if(i == id || !HUD_Panel_CheckActive(i))
                        continue;
 
-               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetBorder(id);
-               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetBorder(id);
+               targBorder = HUD_Panel_GetBorder(i);
+               targPos = HUD_Panel_GetPos(i) - '1 1 0' * targBorder;
+               targSize = HUD_Panel_GetSize(i) + '2 2 0' * targBorder;
+               targEndPos = targPos + targSize;
 
-               if(myPos_y + mySize_y < targPos_y)
-                       continue;
-               if(myPos_y > targPos_y + targSize_y)
-                       continue;
-
-               if(myPos_x + mySize_x < targPos_x)
-                       continue;
-               if(myPos_x > targPos_x + targSize_x)
+               // resizeorigin is WITHIN target panel, just abort any collision testing against that particular panel to produce expected behaviour!
+               if(resizeorigin_x > targPos_x && resizeorigin_x < targPos_x + targSize_x && resizeorigin_y > targPos_y && resizeorigin_y < targPos_y + targSize_y)
                        continue;
 
-               // OK, there IS a collision.
-               //
-
-               // Now check some special cases
-               // If the resizeorigin is too close to the target panel on either axis, we do not want to perform any collision avoidance on that axis
-               float Check_X, Check_Y;
-               Check_X = Check_Y = 1;
-               // check upper/left edges of targ panel
-               if(fabs(targPos_x - resizeorigin_x) < 0.025 * vid_conwidth)
-                       Check_X = 0;
-               if(fabs(targPos_y - resizeorigin_y) < 0.025 * vid_conheight)
-                       Check_Y = 0;
-               // check lower/right edges of targ panel
-               if(fabs(resizeorigin_x - (targPos_x + targSize_x)) < 0.025 * vid_conwidth)
-                       Check_X = 0;
-               if(fabs(resizeorigin_y - (targPos_y + targSize_y)) < 0.025 * vid_conheight)
-                       Check_Y = 0;
-
-               myCenter_x = myPos_x + 0.5 * mySize_x;
-               myCenter_y = myPos_y + 0.5 * mySize_y;
-
-               targCenter_x = targPos_x + 0.5 * targSize_x;
-               targCenter_y = targPos_y + 0.5 * targSize_y;
-
-               if(myCenter_x < targCenter_x && myCenter_y < targCenter_y) // top left (of target panel)
+               if (resizeCorner == 1)
                {
-                       //if(!HUD_Panel_CheckValidity_of_ResizeSuggestion(id, eX * (targPos_x - myPos_x) + eY * (targPos_y - resizeorigin_y)))
-                       //      continue;
+                       // check if this panel is on our way
+                       if (resizeorigin_x <= targPos_x)
+                               continue;
+                       if (resizeorigin_y <= targPos_y)
+                               continue;
+                       if (targEndPos_x <= resizeorigin_x - mySize_x)
+                               continue;
+                       if (targEndPos_y <= resizeorigin_y - mySize_y)
+                               continue;
 
-                       if(myPos_x + mySize_x - targPos_x < myPos_y + mySize_y - targPos_y && Check_X) // push it to the side
-                               mySize_x = targPos_x - myPos_x;
-                       else if(Check_Y) // push it upwards
-                               mySize_y = targPos_y - resizeorigin_y;
+                       // there is a collision:
+                       // detect which side of the panel we are facing is actually limiting the resizing
+                       // (which side the resize direction finds for first) and reduce the size up to there
+                       //
+                       // dist is the distance between resizeorigin and the "analogous" point of the panel
+                       // in this case resizeorigin (bottom-right point) and the bottom-right point of the panel
+                       dist_x = resizeorigin_x - targEndPos_x;
+                       dist_y = resizeorigin_y - targEndPos_y;
+                       if (dist_y < 0 || dist_x / dist_y > ratio)
+                               mySize_x = min(mySize_x, dist_x);
+                       else
+                               mySize_y = min(mySize_y, dist_y);
                }
-               else if(myCenter_x > targCenter_x && myCenter_y < targCenter_y) // top right
+               else if (resizeCorner == 2)
                {
-                       //if(!HUD_Panel_CheckValidity_of_ResizeSuggestion(id, eX * (resizeorigin_x - (targPos_x + targSize_x)) + eY * (targPos_y - resizeorigin_y)))
-                       //      continue;
+                       if (resizeorigin_x >= targEndPos_x)
+                               continue;
+                       if (resizeorigin_y <= targPos_y)
+                               continue;
+                       if (targPos_x >= resizeorigin_x + mySize_x)
+                               continue;
+                       if (targEndPos_y <= resizeorigin_y - mySize_y)
+                               continue;
 
-                       if(targPos_x + targSize_x - myPos_x < myPos_y + mySize_y - targPos_y && Check_X) // push it to the side
-                               mySize_x = resizeorigin_x - (targPos_x + targSize_x);
-                       else if(Check_Y) // push it upwards
-                               mySize_y = targPos_y - resizeorigin_y;
+                       dist_x = targPos_x - resizeorigin_x;
+                       dist_y = resizeorigin_y - targEndPos_y;
+                       if (dist_y < 0 || dist_x / dist_y > ratio)
+                               mySize_x = min(mySize_x, dist_x);
+                       else
+                               mySize_y = min(mySize_y, dist_y);
                }
-               else if(myCenter_x < targCenter_x && myCenter_y > targCenter_y) // bottom left
+               else if (resizeCorner == 3)
                {
-                       //if(!HUD_Panel_CheckValidity_of_ResizeSuggestion(id, eX * (targPos_x - resizeorigin_x) + eY * (resizeorigin_y - (targPos_y + targSize_y))))
-                       //      continue;
+                       if (resizeorigin_x <= targPos_x)
+                               continue;
+                       if (resizeorigin_y >= targEndPos_y)
+                               continue;
+                       if (targEndPos_x <= resizeorigin_x - mySize_x)
+                               continue;
+                       if (targPos_y >= resizeorigin_y + mySize_y)
+                               continue;
 
-                       if(myPos_x + mySize_x - targPos_x < targPos_y + targSize_y - myPos_y && Check_X) // push it to the side
-                               mySize_x = targPos_x - resizeorigin_x;
-                       else if(Check_Y) // push it upwards
-                               mySize_y = resizeorigin_y - (targPos_y + targSize_y);
+                       dist_x = resizeorigin_x - targEndPos_x;
+                       dist_y = targPos_y - resizeorigin_y;
+                       if (dist_y < 0 || dist_x / dist_y > ratio)
+                               mySize_x = min(mySize_x, dist_x);
+                       else
+                               mySize_y = min(mySize_y, dist_y);
                }
-               else if(myCenter_x > targCenter_x && myCenter_y > targCenter_y) // bottom right
+               else if (resizeCorner == 4)
                {
-                       //if(!HUD_Panel_CheckValidity_of_ResizeSuggestion(id, eX * (resizeorigin_x - (targPos_x + targSize_x)) + eY * (resizeorigin_y - (targPos_y + targSize_y))))
-                       //      continue;
+                       if (resizeorigin_x >= targEndPos_x)
+                               continue;
+                       if (resizeorigin_y >= targEndPos_y)
+                               continue;
+                       if (targPos_x >= resizeorigin_x + mySize_x)
+                               continue;
+                       if (targPos_y >= resizeorigin_y + mySize_y)
+                               continue;
 
-                       if(targPos_x + targSize_x - myPos_x < targPos_y + targSize_y - myPos_y && Check_X) // push it to the side
-                               mySize_x = resizeorigin_x - (targPos_x + targSize_x);
-                       else if(Check_Y) // push it upwards
-                               mySize_y = resizeorigin_y - (targPos_y + targSize_y);
+                       dist_x = targPos_x - resizeorigin_x;
+                       dist_y = targPos_y - resizeorigin_y;
+                       if (dist_y < 0 || dist_x / dist_y > ratio)
+                               mySize_x = min(mySize_x, dist_x);
+                       else
+                               mySize_y = min(mySize_y, dist_y);
                }
+               if(cvar("hud_configure_checkcollisions_debug"))
+                       drawfill(targPos + '1 1 0' * targBorder, targSize - '2 2 0' * targBorder, '1 1 0', .3, DRAWFLAG_NORMAL);
        }
 
        return mySize;
 }
 
-void HUD_Panel_SetPosSize(float id, vector resizeorigin)
+void HUD_Panel_SetPosSize(float id)
 {
+       vector resizeorigin;
+       resizeorigin = panel_click_resizeorigin;
        vector mySize, myPos;
 
        if(resizeCorner == 1) {
@@ -1195,9 +1168,26 @@ void HUD_Panel_SetPosSize(float id, vector resizeorigin)
        // cap against panel's own limits
        vector minSize;
        minSize = HUD_Panel_GetMinSize(id); // mySize_x at least minSize_x * mySize_y, and vice versa
-
-       mySize_x = max(minSize_x * mySize_y, mySize_x);
-       mySize_y = max(minSize_y * mySize_x, mySize_y);
+       float fixedRatio;
+       if(!minSize_x && minSize_y) // forced aspect ratio
+       {
+               minSize_x = 1/minSize_y;
+               fixedRatio = minSize_x;
+               mySize_x = max(minSize_x * mySize_y, mySize_x);
+               mySize_y = max(minSize_y * mySize_x, mySize_y);
+       }
+       else if(minSize_x && !minSize_y) // hybrid aspect ratio, currently supported only in one dimension
+       {
+               if (mySize_x/mySize_y < minSize_x) // resizing in x direction allows free aspect ratio
+               {
+                       fixedRatio = minSize_x;
+                       minSize_y = 1/minSize_x;
+                       mySize_y = max(minSize_y * mySize_x, mySize_y);
+                       mySize_x = max(minSize_x * mySize_y, mySize_x);
+               }
+               else
+                       fixedRatio = -minSize_x; //negative so that it will be used ONLY after checkResize
+       }
 
        // collision testing|
        // -----------------+
@@ -1218,22 +1208,78 @@ void HUD_Panel_SetPosSize(float id, vector resizeorigin)
        }
 
        // left/top screen edges
-       mySize_x = min(myPos_x + mySize_x, mySize_x);
-       mySize_y = min(myPos_y + mySize_y, mySize_y);
+       if(myPos_x < 0)
+               mySize_x = mySize_x + myPos_x;
+       if(myPos_y < 0)
+               mySize_y = mySize_y + myPos_y;
 
        // bottom/right screen edges
-       mySize_x = min(vid_conwidth - myPos_x, mySize_x); 
-       mySize_y = min(vid_conheight - myPos_y, mySize_y); 
+       if(myPos_x + mySize_x > vid_conwidth)
+               mySize_x = vid_conwidth - myPos_x;
+       if(myPos_y + mySize_y > vid_conheight)
+               mySize_y = vid_conheight - myPos_y;
 
-       if(cvar("hud_configure_checkcollisions"))
-               mySize = HUD_Panel_CheckResize(id, myPos, mySize, resizeorigin);
+       if(cvar("hud_configure_checkcollisions_debug"))
+               drawfill(myPos, mySize, '1 1 1', .2, DRAWFLAG_NORMAL);
 
+       // before checkresize, otherwise panel can be snapped partially inside another panel or panel aspect ratio can be broken
        if(cvar("hud_configure_grid"))
        {
-               mySize_x = floor(mySize_x/cvar("hud_configure_grid_x") + 0.5) * cvar("hud_configure_grid_x");
-               mySize_y = floor(mySize_y/cvar("hud_configure_grid_y") + 0.5) * cvar("hud_configure_grid_y");
+               mySize_x = floor((mySize_x/vid_conwidth)/bound(0.005, cvar("hud_configure_grid_x"), 0.2) + 0.5) * cvar("hud_configure_grid_x") * vid_conwidth;
+               mySize_y = floor((mySize_y/vid_conheight)/bound(0.005, cvar("hud_configure_grid_y"), 0.2) + 0.5) * cvar("hud_configure_grid_y") * vid_conheight;
        }
 
+       if (fixedRatio > 0)
+       {
+               // keep aspect ratio _MAXIMIZING_ the size
+               if (mySize_x / mySize_y > fixedRatio)
+                       mySize_y = mySize_x / fixedRatio;
+               else
+                       mySize_x = mySize_y * fixedRatio;
+       }
+
+       if(cvar("hud_configure_checkcollisions"))
+       {
+               if (fixedRatio > 0)
+               {
+                       mySize = HUD_Panel_CheckResize(id, mySize, resizeorigin, fixedRatio);
+
+                       // Make sure once more that we DON'T cross the screen edges
+                       // left/top screen edges
+                       if(myPos_x < 0)
+                               mySize_x = mySize_x + myPos_x;
+                       if(myPos_y < 0)
+                               mySize_y = mySize_y + myPos_y;
+
+                       // bottom/right screen edges
+                       if(myPos_x + mySize_x > vid_conwidth)
+                               mySize_x = vid_conwidth - myPos_x;
+                       if(myPos_y + mySize_y > vid_conheight)
+                               mySize_y = vid_conheight - myPos_y;
+
+                       // restore again aspect ratio, _minimizing_ the size
+                       if (mySize_x / mySize_y < fixedRatio)
+                               mySize_y = mySize_x / fixedRatio;
+                       else
+                               mySize_x = mySize_y * fixedRatio;
+               }
+               else
+               {
+                       mySize = HUD_Panel_CheckResize(id, mySize, resizeorigin, mySize_x / mySize_y);
+                       if (fixedRatio < 0)
+                       {
+                               fixedRatio = -fixedRatio;
+                               // restore again aspect ratio, _minimizing_ the size
+                               if (mySize_x / mySize_y < fixedRatio)
+                                       mySize_y = mySize_x / fixedRatio;
+                       }
+               }
+       }
+
+       // minimum panel size cap, do this once more so we NEVER EVER EVER have a panel smaller than this, JUST IN CASE above code still makes the panel eg negative (impossible to resize back without changing cvars manually then)
+       mySize_x = max(0.025 * vid_conwidth, mySize_x);
+       mySize_y = max(0.025 * vid_conheight, mySize_y);
+
        // do another pos check, as size might have changed by now
        if(resizeCorner == 1) {
                myPos_x = resizeorigin_x - mySize_x;
@@ -1249,6 +1295,10 @@ void HUD_Panel_SetPosSize(float id, vector resizeorigin)
                myPos_y = resizeorigin_y;
        }
 
+       if(cvar("hud_configure_checkcollisions_debug"))
+       if(cvar("hud_configure_checkcollisions"))
+               drawfill(myPos, mySize, '0 1 0', .3, DRAWFLAG_NORMAL);
+
        string s;
        s = strcat(ftos(mySize_x/vid_conwidth), " ", ftos(mySize_y/vid_conheight));
        cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_size"), s);
@@ -1407,10 +1457,13 @@ void HUD_Panel_Mouse()
                                        }       
                                }
 
+                               if(cvar("hud_configure_checkcollisions_debug"))
+                                       drawfill(panelPos, panelSize, '1 0 0', .3, DRAWFLAG_NORMAL);
+
                                if(highlightedAction == 1)
                                        HUD_Panel_SetPos(i, mousepos - panel_click_distance);
                                else if(highlightedAction == 2)
-                                       HUD_Panel_SetPosSize(i, panel_click_resizeorigin);
+                                       HUD_Panel_SetPosSize(i);
                        }
                }
 
@@ -1453,14 +1506,13 @@ void weaponorder_swap(float i, float j, entity pass)
        weaponorder[j] = h;
 }
 
+string weaponorder_cmp_str;
 float weaponorder_cmp(float i, float j, entity pass)
 {
-       float d;
-       d = mod(weaponorder[i].impulse + 9, 10) - mod(weaponorder[j].impulse + 9, 10);
-       if(d)
-               return d;
-       d = weaponorder[i].weapon - weaponorder[j].weapon;
-       return d;
+       float ai, aj;
+       ai = strstrofs(weaponorder_cmp_str, sprintf(" %d ", weaponorder[i].weapon), 0);
+       aj = strstrofs(weaponorder_cmp_str, sprintf(" %d ", weaponorder[j].weapon), 0);
+       return aj - ai; // the string is in REVERSE order (higher prio at the right is what we want, but higher prio first is the string)
 }
 
 void HUD_WeaponIcons(void)
@@ -1483,6 +1535,9 @@ void HUD_WeaponIcons(void)
                        ++weapon_cnt;
                }
        }
+
+       // TODO make this configurable
+       weaponorder_cmp_str = strcat(" ", weaponorder_byimpulse, " ");
        heapsort(weapon_cnt, weaponorder_swap, weaponorder_cmp, world);
 
        HUD_Panel_DrawBg(id, pos, mySize, 0);
@@ -2221,14 +2276,16 @@ string Weapon_KillMessage(float deathtype)
 
 float killnotify_times[10];
 float killnotify_deathtype[10];
+float killnotify_actiontype[10]; // 0 = "Y [used by] X", 1 = "X [did action to] Y"
 string killnotify_attackers[10];
 string killnotify_victims[10];
-void HUD_KillNotify_Push(string attacker, string victim, float wpn)
+void HUD_KillNotify_Push(string attacker, string victim, float actiontype, float wpn)
 {
        float i;
        for (i = 9; i > 0; --i) {
                killnotify_times[i] = killnotify_times[i-1];
                killnotify_deathtype[i] = killnotify_deathtype[i-1];
+               killnotify_actiontype[i] = killnotify_actiontype[i-1];
                if(killnotify_attackers[i])
                        strunzone(killnotify_attackers[i]);
                killnotify_attackers[i] = strzone(killnotify_attackers[i-1]);
@@ -2238,6 +2295,7 @@ void HUD_KillNotify_Push(string attacker, string victim, float wpn)
        }
        killnotify_times[0] = time;
        killnotify_deathtype[0] = wpn;
+       killnotify_actiontype[0] = actiontype;
        if(killnotify_attackers[0])
                strunzone(killnotify_attackers[0]);
        killnotify_attackers[0] = strzone(attacker);
@@ -2249,124 +2307,175 @@ void HUD_KillNotify_Push(string attacker, string victim, float wpn)
 void HUD_KillNotify(string s1, string s2, string s3, float type, float msg)
 {
        float w;
+       float alsoprint;
+       alsoprint = (cvar("hud_notify_print") || !HUD_Panel_CheckActive(4)); // print message to console if: notify panel disabled, or cvar to do so enabled
+       
        if(msg == MSG_SUICIDE) {
-               HUD_KillNotify_Push(s1, "", DEATH_KILL);
-
                // TODO: cl_gentle
                w = DEATH_WEAPONOF(type);
                if(WEP_VALID(w)) {
-                       if (!HUD_Panel_CheckActive(4) || cvar("hud_notify_print"))
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if (alsoprint)
                                print("^1", s1, "^1 ", Weapon_SuicideMessage(type), "\n");
-               }
-               else if (type == DEATH_KILL)
-                       print ("^1",s1, "^1 couldn't take it anymore\n");
-               else if (type == DEATH_ROT)
-                       print ("^1",s1, "^1 died\n");
-               else if (type == DEATH_NOAMMO)
-                       print ("^7",s1, "^7 committed suicide. What's the point of living without ammo?\n");
-               else if (type == DEATH_CAMP)
-                       print ("^1",s1, "^1 thought they found a nice camping ground\n");
-               else if (type == DEATH_MIRRORDAMAGE)
-                       print ("^1",s1, "^1 didn't become friends with the Lord of Teamplay\n");
-               else if (type == DEATH_CHEAT)
-                       print ("^1",s1, "^1 unfairly eliminated themself\n");
-               else if (type == DEATH_FIRE)
-                       print ("^1",s1, "^1 burned to death\n");
-               else if (type != DEATH_TEAMCHANGE && type != DEATH_QUIET)
-                       print ("^1",s1, "^1 couldn't resist the urge to self-destruct\n");
+               } else if (type == DEATH_KILL) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_KILL);
+                       if (alsoprint)
+                               print ("^1",s1, "^1 couldn't take it anymore\n");
+               } else if (type == DEATH_ROT) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if (alsoprint)
+                               print ("^1",s1, "^1 died\n");
+               } else if (type == DEATH_NOAMMO) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_NOAMMO);
+                       if (alsoprint)
+                               print ("^7",s1, "^7 committed suicide. What's the point of living without ammo?\n");
+               } else if (type == DEATH_CAMP) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_CAMP);
+                       if (alsoprint)
+                               print ("^1",s1, "^1 thought they found a nice camping ground\n");
+               } else if (type == DEATH_MIRRORDAMAGE) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_MIRRORDAMAGE);
+                       if (alsoprint)
+                               print ("^1",s1, "^1 didn't become friends with the Lord of Teamplay\n");
+               } else if (type == DEATH_CHEAT) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if (alsoprint)
+                               print ("^1",s1, "^1 unfairly eliminated themself\n");
+               } else if (type == DEATH_FIRE) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if (alsoprint)
+                               print ("^1",s1, "^1 burned to death\n");
+               } else if (type != DEATH_TEAMCHANGE && type != DEATH_QUIET) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if (alsoprint)
+                               print ("^1",s1, "^1 couldn't resist the urge to self-destruct\n");
+               } 
+               
                if (stof(s2) > 2) // killcount > 2
                        print ("^1",s1,"^1 ended it all after a ",s2," kill spree\n");
        } else if(msg == MSG_KILL) {
                w = DEATH_WEAPONOF(type);
                if(WEP_VALID(w)) {
-                       HUD_KillNotify_Push(s2, s1, w);
-                       if (!HUD_Panel_CheckActive(4) || cvar("hud_notify_print"))
+                       HUD_KillNotify_Push(s2, s1, 1, w);
+                       if (alsoprint)
                                print("^1", s1, "^1 ", Weapon_KillMessage(type), "\n");
                }
                else if(type == KILL_TEAM || type == KILL_TEAM_SPREE) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_MIRRORDAMAGE);
+                       if(alsoprint)
+                       {
                                if(cvar("cl_gentle")) {
                                        print ("^1", s1, "^1 took action against a team mate\n");
                                } else {
                                        print ("^1", s1, "^1 mows down a team mate\n");
                                }
-                               if (stof(s2) > 2 && type == KILL_TEAM_SPREE) {
-                                       if(cvar("cl_gentle"))
-                                               print ("^1",s1,"^1 ended a ",s2," scoring spree by going against a team mate\n");
-                                       else
-                                               print ("^1",s1,"^1 ended a ",s2," kill spree by killing a team mate\n");
-                               }
-                               else if (stof(s2) > 2) {
-                                       if(cvar("cl_gentle"))
-                                               print ("^1",s1,"'s ^1",s2," scoring spree was ended by a team mate!\n");
-                                       else
-                                               print ("^1",s1,"'s ^1",s2," kill spree was ended by a team mate!\n");
-                               }
+                       }
+                       if (stof(s2) > 2 && type == KILL_TEAM_SPREE) {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1,"^1 ended a ",s2," scoring spree by going against a team mate\n");
+                               else
+                                       print ("^1",s1,"^1 ended a ",s2," kill spree by killing a team mate\n");
+                       }
+                       else if (stof(s2) > 2) {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1,"'s ^1",s2," scoring spree was ended by a team mate!\n");
+                               else
+                                       print ("^1",s1,"'s ^1",s2," kill spree was ended by a team mate!\n");
+                       }
                }
                else if(type == KILL_FIRST_BLOOD)
                        print("^1",s1, "^1 drew first blood", "\n");
+               // TODO: icon!
                else if (type == DEATH_TELEFRAG)
                        print ("^1",s1, "^1 was telefragged by ", s2, "\n");
                else if (type == DEATH_DROWN) {
-                       HUD_KillNotify_Push(s2, s1, DEATH_FALL);
-                       print ("^1",s1, "^1 was drowned by ", s2, "\n");
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_DROWN);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was drowned by ", s2, "\n");
                }
                else if (type == DEATH_SLIME) {
-                       HUD_KillNotify_Push(s2, s1, DEATH_FALL);
-                       print ("^1",s1, "^1 was slimed by ", s2, "\n");
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_SLIME);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was slimed by ", s2, "\n");
                }
                else if (type == DEATH_LAVA) {
-                       HUD_KillNotify_Push(s2, s1, DEATH_FALL);
-                       print ("^1",s1, "^1 was cooked by ", s2, "\n");
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_LAVA);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was cooked by ", s2, "\n");
                }
                else if (type == DEATH_FALL) {
-                       HUD_KillNotify_Push(s2, s1, DEATH_FALL);
-                       print ("^1",s1, "^1 was grounded by ", s2, "\n");
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_FALL);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was grounded by ", s2, "\n");
                }
                else if (type == DEATH_SHOOTING_STAR) {
-                       HUD_KillNotify_Push(s2, s1, DEATH_FALL);
-                       print ("^1",s1, "^1 was shot into space by ", s2, "\n");
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_SHOOTING_STAR);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was shot into space by ", s2, "\n");
                }
                else if (type == DEATH_SWAMP) {
-                       HUD_KillNotify_Push(s2, s1, DEATH_FALL);
-                       print ("^1",s1, "^1 was conserved by ", s2, "\n");
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was conserved by ", s2, "\n");
                }
-               else if (type == DEATH_HURTTRIGGER && s3 != "")
+               else if (type == DEATH_HURTTRIGGER)
                {
-                       HUD_KillNotify_Push(s2, s1, DEATH_FALL);
-                       // p ?!?! :o
-                       //if(p < 0)
-                               print("^1", s1, "^1 ", s3, " ", s2, "\n");
-                       //else
-                       //      bprint("^1", s1, "^1 ", substring(s3, 0, p), s2, "^1", substring(s3, p+1, strlen(s3) - (p+1)), "\n");
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_HURTTRIGGER);
+                       if(alsoprint)
+                               print("^1",s1, "^1 was thrown into a world of hurt by ", s2, "\n");
+               } else if(type == DEATH_SBCRUSH) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was crushed by ^1", s2, "\n");
+               } else if(type == DEATH_SBMINIGUN) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 got shredded by ^1", s2, "\n");
+               } else if(type == DEATH_SBROCKET) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was blased to bits by ^1", s2, "\n");
+               } else if(type == DEATH_SBBLOWUP) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 got caught in the destruction of ^1", s2, "'s vehicle\n");
+               } else if(type == DEATH_WAKIGUN) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was bolted down by ^1", s2, "\n");
+               } else if(type == DEATH_WAKIROCKET) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 could find no shelter from ^1", s2, "'s rockets\n");
+               } else if(type == DEATH_WAKIBLOWUP) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 dies when ^1", s2, "'s wakizashi dies.\n");
+               } else if(type == DEATH_TURRET) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was pushed into the line of fire by ^1", s2, "\n");
+               } else if(type == DEATH_TOUCHEXPLODE) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was pushed into an accident by ^1", s2, "\n");
+               } else if(type == DEATH_CHEAT) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was unfairly eliminated by ^1", s2, "\n");
+               } else if (type == DEATH_FIRE) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was burnt to death by ^1", s2, "\n");
+               } else if (type == DEATH_CUSTOM) {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_CUSTOM);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 ", s2, "\n");
+               } else {
+                       HUD_KillNotify_Push(s2, s1, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was fragged by ", s2, "\n");
                }
-               else if(type == DEATH_SBCRUSH)
-                       print ("^1",s1, "^1 was crushed by ^1", s2, "\n");
-               else if(type == DEATH_SBMINIGUN)
-                       print ("^1",s1, "^1 got shredded by ^1", s2, "\n");
-               else if(type == DEATH_SBROCKET)
-                       print ("^1",s1, "^1 was blased to bits by ^1", s2, "\n");
-               else if(type == DEATH_SBBLOWUP)
-                       print ("^1",s1, "^1 got cought in the destruction of ^1", s2, "'s vehicle\n");
-
-               else if(type == DEATH_WAKIGUN)
-                       print ("^1",s1, "^1 was bolted down by ^1", s2, "\n");
-               else if(type == DEATH_WAKIROCKET)
-                       print ("^1",s1, "^1 could find no shelter from ^1", s2, "'s rockets\n");
-               else if(type == DEATH_WAKIBLOWUP)
-                       print ("^1",s1, "^1 dies when ^1", s2, "'s wakizashi dies.\n");
-
-               else if(type == DEATH_TURRET)
-                       print ("^1",s1, "^1 was pushed into the line of fire by ^1", s2, "\n");
-               else if(type == DEATH_TOUCHEXPLODE)
-                       print ("^1",s1, "^1 was pushed into an accident by ^1", s2, "\n");
-               else if(type == DEATH_CHEAT)
-                       print ("^1",s1, "^1 was unfairly eliminated by ^1", s2, "\n");
-               else if (type == DEATH_FIRE)
-                       print ("^1",s1, "^1 was burnt to death by ^1", s2, "\n");
-               else if (type == DEATH_CUSTOM)
-                       print ("^1",s1, "^1 ", s2, "\n");
-               else
-                       print ("^1",s1, "^1 was fragged by ", s2, "\n");
        } else if(msg == MSG_SPREE) {
                if(type == KILL_END_SPREE) {
                        if(cvar("cl_gentle"))
@@ -2415,82 +2524,114 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg)
                                print (s1,"^7 unleashes ^1ARMAGEDDON!\n");
                }
        } else if(msg == MSG_KILL_ACTION) { // wtf is this? isnt it basically the same as MSG_SUICIDE?
-               HUD_KillNotify_Push(s1, "", DEATH_KILL);
                if (type == DEATH_DROWN) {
-                       if(cvar("cl_gentle"))
-                               print ("^1",s1, "^1 was in the water for too long\n");
-                       else
-                               print ("^1",s1, "^1 drowned\n");
-               }
-               else if (type == DEATH_SLIME)
-                       print ("^1",s1, "^1 was slimed\n");
-               else if (type == DEATH_LAVA) {
-                       if(cvar("cl_gentle"))
-                               print ("^1",s1, "^1 found a hot place\n");
-                       else
-                               print ("^1",s1, "^1 turned into hot slag\n");
-               }
-               else if (type == DEATH_FALL) {
-                       if(cvar("cl_gentle"))
-                               print ("^1",s1, "^1 tested gravity (and it worked)\n");
-                       else
-                               print ("^1",s1, "^1 hit the ground with a crunch\n");
-               }
-               else if (type == DEATH_SHOOTING_STAR)
-                       print ("^1",s1, "^1 became a shooting star\n");
-               else if (type == DEATH_SWAMP) {
-                       if(cvar("cl_gentle"))
-                               print ("^1",s1, "^1 discovered a swamp\n");
-                       else
-                               print ("^1",s1, "^1 is now conserved for centuries to come\n");
-               }
-               else if(type == DEATH_TURRET)
-                       print ("^1",s1, "^1 was mowed down by a turret \n");
-               else if (type == DEATH_CUSTOM)
-                       print ("^1",s1, "^1 ", s2, "\n");
-               else if(type == DEATH_TOUCHEXPLODE)
-                       print ("^1",s1, "^1 died in an accident\n");
-               else if(type == DEATH_CHEAT)
-                       print ("^1",s1, "^1 was unfairly eliminated\n");
-               else if(type == DEATH_FIRE) {
-                       if(cvar("cl_gentle"))
-                               print ("^1",s1, "^1 felt a little hot\n");
-                       else
-                               print ("^1",s1, "^1 burnt to death\n");
-               }
-               else {
-                       if(cvar("cl_gentle"))
-                               print ("^1",s1, "^1 needs a restart\n");
-                       else
-                               print ("^1",s1, "^1 died\n");
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_DROWN);
+                       if(alsoprint)
+                       {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1, "^1 was in the water for too long\n");
+                               else
+                                       print ("^1",s1, "^1 drowned\n");
+                       }
+               } else if (type == DEATH_SLIME) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_SLIME);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was slimed\n");
+               } else if (type == DEATH_LAVA) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_LAVA);
+                       if(alsoprint)
+                       {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1, "^1 found a hot place\n");
+                               else
+                                       print ("^1",s1, "^1 turned into hot slag\n");
+                       }
+               } else if (type == DEATH_FALL) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if(alsoprint)
+                       {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1, "^1 tested gravity (and it worked)\n");
+                               else
+                                       print ("^1",s1, "^1 hit the ground with a crunch\n");
+                       }
+               } else if (type == DEATH_SHOOTING_STAR) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_SHOOTING_STAR);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 became a shooting star\n");
+               } else if (type == DEATH_SWAMP) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if(alsoprint)
+                       {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1, "^1 discovered a swamp\n");
+                               else
+                                       print ("^1",s1, "^1 is now conserved for centuries to come\n");
+                       }
+               } else if(type == DEATH_TURRET) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was mowed down by a turret \n");
+               } else if (type == DEATH_CUSTOM) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_CUSTOM);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 ", s2, "\n");
+               } else if (type == DEATH_HURTTRIGGER) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_HURTTRIGGER);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was in the wrong place\n");
+               } else if(type == DEATH_TOUCHEXPLODE) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 died in an accident\n");
+               } else if(type == DEATH_CHEAT) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if(alsoprint)
+                               print ("^1",s1, "^1 was unfairly eliminated\n");
+               } else if(type == DEATH_FIRE) {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if(alsoprint)
+                       {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1, "^1 felt a little hot\n");
+                               else
+                                       print ("^1",s1, "^1 burnt to death\n");
+                               }
+               } else {
+                       HUD_KillNotify_Push(s1, "", 0, DEATH_GENERIC);
+                       if(alsoprint)
+                       {
+                               if(cvar("cl_gentle"))
+                                       print ("^1",s1, "^1 needs a restart\n");
+                               else
+                                       print ("^1",s1, "^1 died\n");
+                       }
                }
        } else if(msg == MSG_KILL_ACTION_SPREE) {
-               HUD_KillNotify_Push(s1, "", DEATH_KILL);
                if(cvar("cl_gentle"))
                        print ("^1",s1,"^1 needs a restart after a ",s2," scoring spree\n");
                else
                        print ("^1",s1,"^1 died with a ",s2," kill spree\n");
        } else if(msg == MSG_INFO) {
-               if(type == INFO_GOTFLAG) {
-                       HUD_KillNotify_Push(s1, s2, INFO_GOTFLAG);
+               if(type == INFO_GOTFLAG) { // here, s2 is the flag name
+                       HUD_KillNotify_Push(s1, s2, 0, INFO_GOTFLAG);
                        print(s1, "^7 got the ", s2, "\n");
                } else if(type == INFO_LOSTFLAG) {
-                       HUD_KillNotify_Push(s1, s2, INFO_LOSTFLAG);
+                       HUD_KillNotify_Push(s1, s2, 0, INFO_LOSTFLAG);
                        print(s1, "^7 lost the ", s2, "\n");
                } else if(type == INFO_PICKUPFLAG) {
-                       HUD_KillNotify_Push(s1, s2, INFO_GOTFLAG);
+                       HUD_KillNotify_Push(s1, s2, 0, INFO_GOTFLAG);
                        print(s1, "^7 picked up the ", s2, "\n");
                } else if(type == INFO_RETURNFLAG) {
-                       HUD_KillNotify_Push(s1, s2, INFO_RETURNFLAG);
+                       HUD_KillNotify_Push(s1, s2, 0, INFO_RETURNFLAG);
                        print(s1, "^7 returned the ", s2, "\n");
                }
        }
-
 }
 
 #define DAMAGE_CENTERPRINT_SPACER NEWLINES
 
-void HUD_Centerprint(string s1, float type, float msg)
+void HUD_Centerprint(string s1, string s2, float type, float msg)
 {
        if(msg == MSG_SUICIDE) {
                if (type == DEATH_TEAMCHANGE) {
@@ -2544,29 +2685,29 @@ void HUD_Centerprint(string s1, float type, float msg)
                        } else {
                                centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1First victim"));
                        }
-               } else if (type == KILL_TYPEFRAG) {
+               } else if (type == KILL_TYPEFRAG) { // s2 contains "advanced kill messages" such as ping, handicap...
                        if(cvar("cl_gentle")) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You scored against ^7", s1, "^7 who was typing!"));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You scored against ^7", s1, "^7 who was typing!", s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You typefragged ^7", s1));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You typefragged ^7", s1, s2));
                        }
                } else if (type == KILL_TYPEFRAGGED) {
                        if(cvar("cl_gentle")) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were scored against by ^7", s1, "^7 while you were typing!"));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were scored against by ^7", s1, "^7 while you were typing!", s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were typefragged by ^7", s1));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^1You were typefragged by ^7", s1, s2));
                        }
                } else if (type == KILL_FRAG) {
                        if(cvar("cl_gentle")) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You scored against ^7", s1));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You scored against ^7", s1, s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You fragged ^7", s1));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You fragged ^7", s1, s2));
                        }
                } else if (type == KILL_FRAGGED) {
                        if(cvar("cl_gentle")) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You were scored against by ^7", s1));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You were scored against by ^7", s1, s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You were fragged by ^7", s1));
+                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, "^4You were fragged by ^7", s1, s2));
                        }
                }
        } else if(msg == MSG_KILL_ACTION) {
@@ -2592,7 +2733,7 @@ void HUD_Notify (void)
        }
 
        float entries, height;
-       entries = bound(1, floor(12 * mySize_y/mySize_x), 10);
+       entries = bound(1, floor(14 * mySize_y/mySize_x), 12);
        height = mySize_y/entries;
        entries -= 2; // top/bottom two lines reserved for info messaged, such as spec instructions
        
@@ -2639,9 +2780,102 @@ void HUD_Notify (void)
 
                // TODO: maybe print in team colors?
                // TODO: maybe this could be cleaned up somehow...
+               // TODO: less copypaste code below
                //
+               // Y [used by] X
+               if(killnotify_actiontype[j] == 0 && !hud_configure) 
+               {
+                       attacker = textShortenToWidth(killnotify_attackers[j], mySize_x - 2 * height, fontsize, stringwidth_colors);
+
+                       width_attacker = stringwidth(attacker, TRUE, fontsize);
+                       pos_attacker = pos + eX * 0.5 * (mySize_x - width_attacker + 2 * height) + eY * 0.5 * fontsize_y + eY * i * height;
+
+                       weap_pos = pos + eX * 0.5 * (mySize_x - width_attacker) - eX * height + eY * i * height;
+                       if(killnotify_deathtype[j] == DEATH_GENERIC)
+                       {
+                               drawpic_skin(weap_pos, "notify_death", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_NOAMMO)
+                       {
+                               drawpic_skin(weap_pos, "notify_outofammo", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_KILL)
+                       {
+                               drawpic_skin(weap_pos, "notify_selfkill", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_CAMP)
+                       {
+                               drawpic_skin(weap_pos, "notify_camping", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_MIRRORDAMAGE)
+                       {
+                               drawpic_skin(weap_pos, "notify_teamkill", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_DROWN)
+                       {
+                               drawpic_skin(weap_pos, "notify_water", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_SLIME)
+                       {
+                               drawpic_skin(weap_pos, "notify_slime", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_LAVA)
+                       {
+                               drawpic_skin(weap_pos, "notify_lava", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_FALL)
+                       {
+                               drawpic_skin(weap_pos, "notify_fall", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_SHOOTING_STAR)
+                       {
+                               drawpic_skin(weap_pos, "notify_shootingstar", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_HURTTRIGGER || killnotify_deathtype[j] == DEATH_CUSTOM)
+                       {
+                               drawpic_skin(weap_pos, "notify_void", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == INFO_GOTFLAG)
+                       {
+                               if(killnotify_victims[j] == "^1RED^7 flag")
+                                       s = "red";
+                               else
+                                       s = "blue";
+                               drawpic_skin(weap_pos, strcat("flag_", s, "_carrying"), '1 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == INFO_RETURNFLAG)
+                       {
+                               if(killnotify_victims[j] == "^1RED^7 flag")
+                                       s = "red";
+                               else
+                                       s = "blue";
+                               drawpic_skin(weap_pos, strcat("flag_", s, "_taken"), '1 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == INFO_LOSTFLAG)
+                       {
+                               if(killnotify_victims[j] == "^1RED^7 flag")
+                                       s = "red";
+                               else
+                                       s = "blue";
+                               drawpic_skin(weap_pos, strcat("flag_", s, "_lost"), '1 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+               }
                // X [did action to] Y
-               if(hud_configure || WEP_VALID(killnotify_deathtype[j]) || killnotify_deathtype[j] == DEATH_FALL)
+               else
                {
                        if(hud_configure)
                        {
@@ -2673,61 +2907,62 @@ void HUD_Notify (void)
                                drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                        }
-                       else if(killnotify_deathtype[j] == DEATH_FALL)
+                       else if(killnotify_deathtype[j] == DEATH_MIRRORDAMAGE)
                        {
-                               drawpic_skin(weap_pos, "notify_pushoffedge", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawpic_skin(weap_pos, "notify_teamkill", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                        }
-               }
-
-               // Y [used by] X
-               else
-               {
-                       attacker = textShortenToWidth(killnotify_attackers[j], mySize_x - 2 * height, fontsize, stringwidth_colors);
-
-                       width_attacker = stringwidth(attacker, TRUE, fontsize);
-                       pos_attacker = pos + eX * 0.5 * (mySize_x - width_attacker + 2 * height) + eY * 0.5 * fontsize_y + eY * i * height;
-
-                       weap_pos = pos + eX * 0.5 * (mySize_x - width_attacker) - eX * height + eY * i * height;
-                       if(killnotify_deathtype[j] == DEATH_KILL)
+                       else if(killnotify_deathtype[j] == DEATH_DROWN)
                        {
-                               drawpic_skin(weap_pos, "notify_selfkill", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawpic_skin(weap_pos, "notify_water", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                        }
-                       else if(killnotify_deathtype[j] == INFO_GOTFLAG)
+                       else if(killnotify_deathtype[j] == DEATH_SLIME)
                        {
-                               if(killnotify_victims[j] == "^1RED^7 flag")
-                                       s = "red";
-                               else
-                                       s = "blue";
-                               drawpic_skin(weap_pos, strcat("flag_", s, "_carrying"), '1 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawpic_skin(weap_pos, "notify_slime", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                        }
-                       else if(killnotify_deathtype[j] == INFO_RETURNFLAG)
+                       else if(killnotify_deathtype[j] == DEATH_LAVA)
                        {
-                               if(killnotify_victims[j] == "^1RED^7 flag")
-                                       s = "red";
-                               else
-                                       s = "blue";
-                               drawpic_skin(weap_pos, strcat("flag_", s, "_taken"), '1 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawpic_skin(weap_pos, "notify_lava", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                        }
-                       else if(killnotify_deathtype[j] == INFO_LOSTFLAG)
+                       else if(killnotify_deathtype[j] == DEATH_FALL)
                        {
-                               if(killnotify_victims[j] == "^1RED^7 flag")
-                                       s = "red";
-                               else
-                                       s = "blue";
-                               drawpic_skin(weap_pos, strcat("flag_", s, "_lost"), '1 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawpic_skin(weap_pos, "notify_fall", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                                drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_SHOOTING_STAR)
+                       {
+                               drawpic_skin(weap_pos, "notify_shootingstar", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                       }
+                       else if(killnotify_deathtype[j] == DEATH_HURTTRIGGER || killnotify_deathtype[j] == DEATH_CUSTOM) // DEATH_CUSTOM is also void, right?
+                       {
+                               drawpic_skin(weap_pos, "notify_void", '2 1 0' * height, '1 1 1', HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_attacker, attacker, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos_victim, victim, fontsize, HUD_Panel_GetFgAlpha(id) * a, DRAWFLAG_NORMAL);
                        }
                }
+
        }
 
        // Info messages
        //
        entity tm;
+       vector o;
+       o = pos;
+       if(cvar("hud_notify_info_top"))
+               o = pos + eY;
+       else
+               o = pos + eY * mySize_y - eY * 2 * height;
+       
        if(spectatee_status && !intermission)
        {
                //drawfont = hud_bigfont;
@@ -2745,13 +2980,19 @@ void HUD_Notify (void)
                        s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
                else
                        s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
 
                if(spectatee_status == -1)
                        s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
                else
                        s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
 
                s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
 
                if(gametype == GAME_ARENA)
                        s = "^1Wait for your turn to join";
@@ -2768,6 +3009,8 @@ void HUD_Notify (void)
                }
                else
                        s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
 
                //show restart countdown:
                if (time < getstatf(STAT_GAMESTARTTIME)) {
@@ -2775,15 +3018,17 @@ void HUD_Notify (void)
                        //we need to ceil, otherwise the countdown would be off by .5 when using round()
                        countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
                        s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
+                       drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+                       o += eY * fontsize_y;
                }
        }
        if(warmup_stage && !intermission)
        {
                s = "^2Currently in ^1warmup^2 stage!";
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
        }
 
-       // move more important stuff more to the middle so its more visible
-
        string blinkcolor;
        if(mod(time, 1) >= 0.5)
                blinkcolor = "^1";
@@ -2806,10 +3051,14 @@ void HUD_Notify (void)
                        else
                                s = strcat("^2Waiting for others to ready up...");
                }
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
        }
        else if(warmup_stage && !intermission && !spectatee_status)
        {
                s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
        }
 
        if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
@@ -2836,16 +3085,20 @@ void HUD_Notify (void)
                                if (tm.team_size == ts_max)
                                        s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
 
+                               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+                               o += eY * fontsize_y;
                        }
                }
        }
        if(hud_configure)
-               s = strcat(s, "^7Press ^3ESC ^7to show HUD options.\n^3Doubleclick a panel for panel-specific options.");
-       //s = textShortenToWidth(s, mySize_y, 0.5 * height, stringwidth_colors);
-       if(cvar("hud_notify_info_top"))
-               drawcolorcodedstring(pos + eY * 0.25 * height, s, '1 1 0' * 0.5 * height, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
-       else
-               drawcolorcodedstring(pos + eY * mySize_y - eY * 1.75 * height, s, '1 1 0' * 0.5 * height, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+       {
+               s = "^7Press ^3ESC ^7to show HUD options.";
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
+               s = "^3Doubleclick a panel for panel-specific options.";
+               drawcolorcodedstring(o, s, fontsize, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+               o += eY * fontsize_y;
+       }
 }
 
 // Timer (#5)
@@ -4003,7 +4256,7 @@ void HUD_EngineInfo(void)
 
        vector color;
        color = HUD_Get_Num_Color (prevfps, 100);
-       drawstring(pos, strcat("FPS: ", ftos_decimals(prevfps, cvar("hud_engineinfo_framecounter_decimals"))), '1 1 0' * 0.5 * mySize_y, color, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
+       drawstring(pos, strcat("FPS: ", ftos_decimals(prevfps, cvar("hud_engineinfo_framecounter_decimals"))), '1 1 0' * mySize_y, color, HUD_Panel_GetFgAlpha(id), DRAWFLAG_NORMAL);
 }
 /*
 ==================
@@ -4140,20 +4393,23 @@ void HUD_Main (void)
        {
                float i;
                // x-axis
-               for(i = 0; i < vid_conwidth/max(2, cvar("hud_configure_grid_x")); ++i)
+               for(i = 0; i < 1/bound(0.005, bound(0.005, cvar("hud_configure_grid_x"), 0.2), 0.2); ++i)
                {
-                       drawfill(eX * i * max(2, cvar("hud_configure_grid_x")), eX + eY * vid_conheight, '0.5 0.5 0.5', cvar("hud_configure_grid_alpha"), DRAWFLAG_NORMAL);
+                       drawfill(eX * i * vid_conwidth * bound(0.005, bound(0.005, cvar("hud_configure_grid_x"), 0.2), 0.2), eX + eY * vid_conheight, '0.5 0.5 0.5', cvar("hud_configure_grid_alpha"), DRAWFLAG_NORMAL);
                }
                // y-axis
-               for(i = 0; i < vid_conheight/max(2, cvar("hud_configure_grid_y")); ++i)
+               for(i = 0; i < 1/bound(0.005, bound(0.005, cvar("hud_configure_grid_y"), 0.2), 0.2); ++i)
                {
-                       drawfill(eY * i * max(2, cvar("hud_configure_grid_y")), eY + eX * vid_conwidth, '0.5 0.5 0.5', cvar("hud_configure_grid_alpha"), DRAWFLAG_NORMAL);
+                       drawfill(eY * i * vid_conheight * bound(0.005, bound(0.005, cvar("hud_configure_grid_y"), 0.2), 0.2), eY + eX * vid_conwidth, '0.5 0.5 0.5', cvar("hud_configure_grid_alpha"), DRAWFLAG_NORMAL);
                }
        }
 
        if(cvar_string("hud_dock") != "")
                drawpic_skin('0 0 0', cvar_string("hud_dock"), eX * vid_conwidth + eY * vid_conheight, HUD_Panel_Dock_GetColor(), cvar("hud_dock_alpha") * menu_fade_alpha, DRAWFLAG_NORMAL);
 
+       if(HUD_Panel_CheckActive(HUD_PANEL_RADAR) || hud_configure)
+               if(cvar_string("hud_radar") != "0" && (cvar("hud_radar") == 2 || teamplay))
+                       HUD_Radar();
        if(HUD_Panel_CheckActive(HUD_PANEL_WEAPONICONS) || hud_configure)
                HUD_WeaponIcons();
        if(HUD_Panel_CheckActive(HUD_PANEL_INVENTORY) || hud_configure)
@@ -4166,10 +4422,6 @@ void HUD_Main (void)
                HUD_Notify();
        if(HUD_Panel_CheckActive(HUD_PANEL_TIMER) || hud_configure)
                HUD_Timer();
-       // TODO hud'ify
-       if(HUD_Panel_CheckActive(HUD_PANEL_RADAR) || hud_configure)
-               if(cvar_string("hud_radar") != "0" && (cvar("hud_radar") == 2 || teamplay))
-                       HUD_Radar();
        if(HUD_Panel_CheckActive(HUD_PANEL_SCORE) || hud_configure)
                HUD_Score();
        if(HUD_Panel_CheckActive(HUD_PANEL_RACETIMER) || hud_configure)
@@ -4186,7 +4438,7 @@ void HUD_Main (void)
        if(HUD_Panel_CheckActive(HUD_PANEL_CHAT) || hud_configure)
                HUD_Chat();
        else
-               cvar_set("con_csqcpositioning", "0");
+               cvar_set("con_chatrect", "0");
        if(HUD_Panel_CheckActive(HUD_PANEL_ENGINEINFO) || hud_configure)
                HUD_EngineInfo();