Merge remote-tracking branch 'origin/master' into samual/combined_updates
authorSamual Lenks <samual@xonotic.org>
Sun, 24 Nov 2013 03:50:18 +0000 (22:50 -0500)
committerSamual Lenks <samual@xonotic.org>
Sun, 24 Nov 2013 03:50:18 +0000 (22:50 -0500)
Conflicts:
qcsrc/client/View.qc
qcsrc/menu/xonotic/dialog_multiplayer_create.c
qcsrc/menu/xonotic/dialog_multiplayer_media_demo.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup_crosshair.c
qcsrc/menu/xonotic/dialog_multiplayer_profile.c
qcsrc/menu/xonotic/dialog_settings_audio.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/menu/xonotic/dialog_settings_game_view.c
qcsrc/menu/xonotic/dialog_settings_input.c
qcsrc/menu/xonotic/dialog_settings_user.c
qcsrc/menu/xonotic/dialog_settings_video.c
qcsrc/menu/xonotic/mainwindow.c
qcsrc/menu/xonotic/serverlist.c
qcsrc/menu/xonotic/util.qc

22 files changed:
1  2 
defaultXonotic.cfg
qcsrc/client/View.qc
qcsrc/common/util.qc
qcsrc/dpdefs/menudefs.qc
qcsrc/menu/menu.qc
qcsrc/menu/xonotic/dialog_multiplayer_create.c
qcsrc/menu/xonotic/dialog_multiplayer_media_demo.c
qcsrc/menu/xonotic/dialog_multiplayer_profile.c
qcsrc/menu/xonotic/dialog_settings_audio.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/menu/xonotic/dialog_settings_game_hud.c
qcsrc/menu/xonotic/dialog_settings_game_hudconfirm.c
qcsrc/menu/xonotic/dialog_settings_game_model.c
qcsrc/menu/xonotic/dialog_settings_game_view.c
qcsrc/menu/xonotic/dialog_settings_game_weapons.c
qcsrc/menu/xonotic/dialog_settings_input.c
qcsrc/menu/xonotic/dialog_settings_user.c
qcsrc/menu/xonotic/dialog_settings_video.c
qcsrc/menu/xonotic/mainwindow.c
qcsrc/menu/xonotic/serverlist.c
qcsrc/menu/xonotic/util.qc
qcsrc/server/cl_client.qc

Simple merge
@@@ -161,10 -161,10 +161,10 @@@ vector GetCurrentFov(float fov
                setsensitivityscale(pow(current_viewzoom, 1 - zoomsensitivity));
        else
                setsensitivityscale(1);
-               
        makevectors(view_angles);
  
 -      if(autocvar_cl_velocityzoom && autocvar_cl_velocityzoom_type) // _type = 0 disables velocity zoom too
 +      if(autocvar_cl_velocityzoom && autocvar_cl_velocityzoom_type && autocvar_cl_velocityzoom_factor) // _type = 0 disables velocity zoom too
        {
                if(intermission) { curspeed = 0; }
                else
                                case 1: default: curspeed = vlen(v); break;
                        }
                }
-               
                velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoom_time), 1); // speed at which the zoom adapts to player velocity
                avgspeed = avgspeed * (1 - velocityzoom) + (curspeed / autocvar_cl_velocityzoom_speed) * velocityzoom;
 -              velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
 +              velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom_factor / 1) * 1);
-               
                //print(ftos(avgspeed), " avgspeed, ", ftos(curspeed), " curspeed, ", ftos(velocityzoom), " return\n"); // for debugging
        }
        else
Simple merge
Simple merge
Simple merge
@@@ -4,8 -4,8 +4,8 @@@ CLASS(XonoticServerCreateTab) EXTENDS(X
        METHOD(XonoticServerCreateTab, gameTypeChangeNotify, void(entity))
        ATTRIB(XonoticServerCreateTab, title, string, _("Create"))
        ATTRIB(XonoticServerCreateTab, intendedWidth, float, 0.9)
 -      ATTRIB(XonoticServerCreateTab, rows, float, 22)
 +      ATTRIB(XonoticServerCreateTab, rows, float, 23)
-       ATTRIB(XonoticServerCreateTab, columns, float, 6.2) // added extra .2 for center space 
+       ATTRIB(XonoticServerCreateTab, columns, float, 6.2) // added extra .2 for center space
  
        ATTRIB(XonoticServerCreateTab, mapListBox, entity, NULL)
        ATTRIB(XonoticServerCreateTab, sliderFraglimit, entity, NULL)
index 0004ce4,0000000..edd15c6
mode 100644,000000..100644
--- /dev/null
@@@ -1,62 -1,0 +1,62 @@@
-       ATTRIB(XonoticDemoBrowserTab, name, string, "DemoBrowser")      
 +#ifdef INTERFACE
 +CLASS(XonoticDemoBrowserTab) EXTENDS(XonoticTab)
 +      METHOD(XonoticDemoBrowserTab, fill, void(entity))
 +      ATTRIB(XonoticDemoBrowserTab, title, string, _("Demo"))
 +      ATTRIB(XonoticDemoBrowserTab, intendedWidth, float, 0.9)
 +      ATTRIB(XonoticDemoBrowserTab, rows, float, 21)
 +      ATTRIB(XonoticDemoBrowserTab, columns, float, 6.5)
-                       
++      ATTRIB(XonoticDemoBrowserTab, name, string, "DemoBrowser")
 +ENDCLASS(XonoticDemoBrowserTab)
 +entity makeXonoticDemoBrowserTab();
 +void Demo_Confirm(entity me, entity btn);
 +#endif
 +
 +#ifdef IMPLEMENTATION
 +void DemoConfirm_Check_Gamestatus(entity me, entity btn)
 +{
 +      if not(gamestatus & (GAME_CONNECTED | GAME_ISSERVER)) // we're not in a match, lets watch the demo
 +      {
 +              //TimeDemo_Click;
 +              //StartDemo_Click;
 +              return;
 +      }
 +      else // already in a match, player has to confirm
 +      {
 +              Demo_Confirm(me, btn);
 +      }
 +}
 +
 +entity makeXonoticDemoBrowserTab()
 +{
 +      entity me;
 +      me = spawnXonoticDemoBrowserTab();
 +      me.configureDialog(me);
 +      return me;
 +}
 +void XonoticDemoBrowserTab_fill(entity me)
 +{
 +      entity e, dlist;
 +
 +      me.TR(me);
 +              me.TD(me, 1, 4, e = makeXonoticCheckBox(0, "cl_autodemo", _("Automatically record demos while playing")));
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, _("Filter:")));
 +              me.TD(me, 1, 6, e = makeXonoticInputBox(0, string_null));
 +                      dlist = makeXonoticDemoList();
 +                      e.onChange = DemoList_Filter_Change;
 +                      e.onChangeEntity = dlist;
 +                      dlist.controlledTextbox = e;
-               
++
 +      me.TR(me);
 +              me.TD(me, me.rows - 4, me.columns, dlist);
++
 +      me.gotoRC(me, me.rows - 1, 0);
 +              me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Timedemo"), '0 0 0'));
 +                      e.onClick = DemoConfirm_Check_Gamestatus;
 +                      e.onClickEntity = dlist;
 +              me.TD(me, 1, me.columns / 2, e = makeXonoticButton(ZCTX(_("DEMO^Play")), '0 0 0'));
 +                      e.onClick = DemoConfirm_Check_Gamestatus;
 +                      e.onClickEntity = dlist;
 +}
 +#endif
index 668d808,0000000..b50cb99
mode 100644,000000..100644
--- /dev/null
@@@ -1,214 -1,0 +1,214 @@@
-       ATTRIB(XonoticProfileTab, columns, float, 6.2) // added extra .2 for center space 
 +#ifdef INTERFACE
 +CLASS(XonoticProfileTab) EXTENDS(XonoticTab)
 +      METHOD(XonoticProfileTab, fill, void(entity))
 +      METHOD(XonoticProfileTab, draw, void(entity))
 +      ATTRIB(XonoticProfileTab, title, string, _("Profile"))
 +      ATTRIB(XonoticProfileTab, intendedWidth, float, 0.9)
 +      ATTRIB(XonoticProfileTab, rows, float, 23)
-               //me.TD(me, 1, 1, e0 = makeXonoticTextLabel(0, string_null)); 
++      ATTRIB(XonoticProfileTab, columns, float, 6.2) // added extra .2 for center space
 +      ATTRIB(XonoticProfileTab, playerNameLabel, entity, NULL)
 +      ATTRIB(XonoticProfileTab, playerNameLabelAlpha, float, 0)
 +ENDCLASS(XonoticProfileTab)
 +entity makeXonoticProfileTab();
 +#endif
 +
 +#ifdef IMPLEMENTATION
 +entity makeXonoticProfileTab()
 +{
 +      entity me;
 +      me = spawnXonoticProfileTab();
 +      me.configureDialog(me);
 +      return me;
 +}
 +void XonoticProfileTab_draw(entity me)
 +{
 +      if(cvar_string("_cl_name") == "Player")
 +              me.playerNameLabel.alpha = ((mod(time * 2, 2) < 1) ? 1 : 0);
 +      else
 +              me.playerNameLabel.alpha = me.playerNameLabelAlpha;
 +      SUPER(XonoticProfileTab).draw(me);
 +}
 +void XonoticProfileTab_fill(entity me)
 +{
 +      entity e, pms, label, box;
 +      float i;
 +
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 0.5, me.playerNameLabel = makeXonoticTextLabel(0, _("Name:")));
 +                      me.playerNameLabelAlpha = me.playerNameLabel.alpha;
 +              me.TD(me, 1, 2.5, label = makeXonoticTextLabel(0, string_null));
 +                      label.allowCut = 1;
 +                      label.allowColors = 1;
 +                      label.alpha = 1;
 +      me.TR(me);
 +              me.TD(me, 1, 3.0, box = makeXonoticInputBox(1, "_cl_name"));
 +                      box.forbiddenCharacters = "\r\n\\\"$"; // don't care, isn't getting saved
 +                      box.maxLength = -127; // negative means encoded length in bytes
 +                      box.saveImmediately = 1;
 +                      box.enableClearButton = 0;
 +                      label.textEntity = box;
 +      me.TR(me);
 +              me.TD(me, 5, 1, e = makeXonoticColorpicker(box));
 +              me.TD(me, 5, 2, e = makeXonoticCharmap(box));
 +      me.TR(me);
 +      me.TR(me);
 +      me.TR(me);
 +      me.TR(me);
 +      me.TR(me);
 +      
 +      // Statistic Stuff -Debugger
 +      me.TR(me);
 +      me.TDempty(me, 0.5);
 +      me.TD(me, 1, 2, e = makeXonoticTextLabel(0.5, _("Player Statistics:")));
 +      me.TR(me);
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Join time:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Total playing time:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Last played:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Games played:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Win / Losses:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Kills / Deaths:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("CTF elo:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("DM elo:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("TDM elo:")));
 +      me.TR(me);
 +      me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("DUEL elo:")));
 +      me.TR(me);
 +      
 +
 +      me.gotoRC(me, 1, 3.2); me.setFirstColumn(me, me.currentColumn);
 +              me.TDempty(me, 1);
 +              me.TD(me, 1, 3, e = makeXonoticTextLabel(0.5, _("Model:")));
 +      me.TR(me);
 +              pms = makeXonoticPlayerModelSelector();
 +              me.TD(me, 1, 0.3, e = makeXonoticButton("<<", '0 0 0'));
 +                      e.onClick = PlayerModelSelector_Prev_Click;
 +                      e.onClickEntity = pms;
 +              me.TD(me, 13, 2.4, pms);
 +              me.TD(me, 1, 0.3, e = makeXonoticButton(">>", '0 0 0'));
 +                      e.onClick = PlayerModelSelector_Next_Click;
 +                      e.onClickEntity = pms;
 +
 +      me.gotoRC(me, 15, 3.533); me.setFirstColumn(me, me.currentColumn);
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0.5, _("Glowing color:")));
 +              for(i = 0; i < 15; ++i)
 +              {
 +                      if(mod(i, 5) == 0)
 +                              me.TR(me);
 +                      me.TDNoMargin(me, 1, 0.2, e = makeXonoticColorButton(1, 0, i), '0 1 0');
 +              }
 +      me.gotoRC(me, 15, 4.866); me.setFirstColumn(me, me.currentColumn);
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0.5, _("Detail color:")));
 +              for(i = 0; i < 15; ++i)
 +              {
 +                      if(mod(i, 5) == 0)
 +                              me.TR(me);
 +                      me.TDNoMargin(me, 1, 0.2, e = makeXonoticColorButton(2, 1, i), '0 1 0');
 +              }
 +
 +      /*
 +      // crosshair_enabled: 0 = no crosshair options, 1 = no crosshair selection, but everything else enabled, 2 = all crosshair options enabled
 +      // FIXME: In the future, perhaps make one global crosshair_type cvar which has 0 for disabled, 1 for custom, 2 for per weapon, etc?
 +      me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
 +              me.TD(me, 1, 3, e = makeXonoticRadioButton(3, "crosshair_enabled", "0", _("No crosshair")));
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticRadioButton(3, "crosshair_per_weapon", string_null, _("Per weapon crosshair")));
 +              makeMulti(e, "crosshair_enabled");
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticRadioButton(3, "crosshair_enabled", "2", _("Custom crosshair")));
 +      me.TR(me);
 +              me.TDempty(me, 0.1);
 +              for(i = 1; i <= 14; ++i) {
 +                      me.TDNoMargin(me, 1, 2 / 14, e = makeXonoticCrosshairButton(4, i), '1 1 0');
 +                              setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2);
 +              }
 +              // show a larger preview of the selected crosshair
 +              me.TDempty(me, 0.1);
 +              me.TDNoMargin(me, 3, 0.8, e = makeXonoticCrosshairButton(7, -1), '1 1 0'); // crosshair -1 makes this a preview
 +                      setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2);
 +      me.TR(me);
 +              me.TDempty(me, 0.1);
 +              for(i = 15; i <= 28; ++i) {
 +                      me.TDNoMargin(me, 1, 2 / 14, e = makeXonoticCrosshairButton(4, i), '1 1 0');
 +                              setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2);
 +              }
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair size:")));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0.1, 1.0, 0.01, "crosshair_size"));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair alpha:")));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0, 1, 0.1, "crosshair_alpha"));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair color:")));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +              me.TD(me, 1, 1, e = makeXonoticRadioButton(5, "crosshair_color_special", "1", _("Per weapon")));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +              me.TD(me, 1, 1, e = makeXonoticRadioButton(5, "crosshair_color_special", "2", _("By health")));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +      me.TR(me);
 +              me.TDempty(me, 0.1);
 +              me.TD(me, 1, 0.9, e = makeXonoticRadioButton(5, "crosshair_color_special", "0", _("Custom")));
 +                      setDependent(e, "crosshair_enabled", 1, 2);
 +              me.TD(me, 2, 2, e = makeXonoticColorpickerString("crosshair_color", "crosshair_color"));
 +                      setDependentAND(e, "crosshair_color_special", 0, 0, "crosshair_enabled", 1, 2);
 +      me.TR(me);
 +      me.TR(me);
 +      me.TR(me);
 +              me.TDempty(me, 0.5);
 +              me.TD(me, 1, 2, e = makeXonoticButton(_("Other crosshair settings"), '0 0 0'));
 +                      e.onClick = DialogOpenButton_Click;
 +                      e.onClickEntity = main.crosshairDialog;
 +              setDependent(e, "crosshair_enabled", 1, 2);
 +              // TODO: show status of crosshair dot and hittest and pickups and such here with text
 +      me.TR(me);
 +      me.TR(me);
 +              me.TDempty(me, 0.5);
 +              me.TD(me, 1, 2, e = makeXonoticButton(_("Model settings"), '0 0 0'));
 +                      e.onClick = DialogOpenButton_Click;
 +                      e.onClickEntity = main.modelDialog;
 +              // TODO: show csqc model settings like forcemyplayer and deglowing/ghosting bodies with text here
 +      me.TR(me);
 +              me.TDempty(me, 0.5);
 +              me.TD(me, 1, 2, e = makeXonoticButton(_("View settings"), '0 0 0'));
 +                      e.onClick = DialogOpenButton_Click;
 +                      e.onClickEntity = main.viewDialog;
 +              // TODO: show fov and other settings with text here
 +      me.TR(me);
 +              me.TDempty(me, 0.5);
 +              me.TD(me, 1, 2, e = makeXonoticButton(_("Weapon settings"), '0 0 0'));
 +                      e.onClick = DialogOpenButton_Click;
 +                      e.onClickEntity = main.weaponsDialog;
 +              // I don't really think this is useful as is, and especially it doesn't look very clean...
 +              // In the future, if ALL of these buttons had some information, then it would be justified/clean
-               // TODO: show hud config name with text here 
++              //me.TD(me, 1, 1, e0 = makeXonoticTextLabel(0, string_null));
 +              //      e0.textEntity = main.weaponsDialog;
 +              //      e0.allowCut = 1;
 +      me.TR(me);
 +              me.TDempty(me, 0.5);
 +              me.TD(me, 1, 2, e = makeXonoticButton(_("HUD settings"), '0 0 0'));
 +                      e.onClick = DialogOpenButton_Click;
 +                      e.onClickEntity = main.hudDialog;
++              // TODO: show hud config name with text here
 +
 +      */
 +      me.gotoRC(me, me.rows - 1, 0);
 +              me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "color -1 -1;name \"$_cl_name\";sendcvar cl_weaponpriority;sendcvar cl_autoswitch;sendcvar cl_forceplayermodels;sendcvar cl_forceplayermodelsfromxonotic;playermodel $_cl_playermodel;playerskin $_cl_playerskin", COMMANDBUTTON_APPLY));
 +}
 +#endif
@@@ -3,8 -3,8 +3,8 @@@ CLASS(XonoticAudioSettingsTab) EXTENDS(
        METHOD(XonoticAudioSettingsTab, fill, void(entity))
        ATTRIB(XonoticAudioSettingsTab, title, string, _("Audio"))
        ATTRIB(XonoticAudioSettingsTab, intendedWidth, float, 0.9)
 -      ATTRIB(XonoticAudioSettingsTab, rows, float, 17)
 +      ATTRIB(XonoticAudioSettingsTab, rows, float, 15.5)
-       ATTRIB(XonoticAudioSettingsTab, columns, float, 6.2) // added extra .2 for center space 
+       ATTRIB(XonoticAudioSettingsTab, columns, float, 6.2) // added extra .2 for center space
  ENDCLASS(XonoticAudioSettingsTab)
  entity makeXonoticAudioSettingsTab();
  #endif
@@@ -3,8 -3,8 +3,8 @@@ CLASS(XonoticEffectsSettingsTab) EXTEND
        METHOD(XonoticEffectsSettingsTab, fill, void(entity))
        ATTRIB(XonoticEffectsSettingsTab, title, string, _("Effects"))
        ATTRIB(XonoticEffectsSettingsTab, intendedWidth, float, 0.9)
 -      ATTRIB(XonoticEffectsSettingsTab, rows, float, 17)
 +      ATTRIB(XonoticEffectsSettingsTab, rows, float, 15.5)
-       ATTRIB(XonoticEffectsSettingsTab, columns, float, 6.2) // added extra .2 for center space 
+       ATTRIB(XonoticEffectsSettingsTab, columns, float, 6.2) // added extra .2 for center space
  ENDCLASS(XonoticEffectsSettingsTab)
  entity makeXonoticEffectsSettingsTab();
  float updateCompression();
index e53f99b,0000000..8d969fd
mode 100644,000000..100644
--- /dev/null
@@@ -1,103 -1,0 +1,103 @@@
-       if not(gamestatus & (GAME_CONNECTED | GAME_ISSERVER)) // we're not in a match, ask the player if they want to start one anyway
 +#ifdef INTERFACE
 +CLASS(XonoticHUDDialog) EXTENDS(XonoticDialog)
 +      METHOD(XonoticHUDDialog, toString, string(entity))
 +      METHOD(XonoticHUDDialog, fill, void(entity))
 +      METHOD(XonoticHUDDialog, showNotify, void(entity))
 +      ATTRIB(XonoticHUDDialog, title, string, _("HUD settings"))
 +      ATTRIB(XonoticHUDDialog, color, vector, SKINCOLOR_DIALOG_HUD)
 +      ATTRIB(XonoticHUDDialog, intendedWidth, float, 0.5)
 +      ATTRIB(XonoticHUDDialog, rows, float, 18)
 +      ATTRIB(XonoticHUDDialog, columns, float, 3)
 +ENDCLASS(XonoticHUDDialog)
 +void HUDSetup_Start(entity me, entity btn);
 +#endif
 +
 +#ifdef IMPLEMENTATION
 +void HUDSetup_Check_Gamestatus(entity me, entity btn)
 +{
-       return "hi"; // TODO: show hud config name with text here 
++      if(!(gamestatus & (GAME_CONNECTED | GAME_ISSERVER))) // we're not in a match, ask the player if they want to start one anyway
 +      {
 +              DialogOpenButton_Click(me, main.hudconfirmDialog);
 +      }
 +      else // already in a match, lets just cut to the point and open up the hud editor directly
 +      {
 +              HUDSetup_Start(me, btn);
 +      }
 +}
 +void XonoticHUDDialog_showNotify(entity me)
 +{
 +      loadAllCvars(me);
 +}
 +string XonoticHUDDialog_toString(entity me)
 +{
-       
++      return "hi"; // TODO: show hud config name with text here
 +}
 +void XonoticHUDDialog_fill(entity me)
 +{
 +      entity e;
-       
++
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Damage:")));
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Overlay:")));
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0, 1, 0.05, "hud_damage"));
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Factor:")));
 +              setDependent(e, "hud_damage", 0.001, 100);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0.025, 0.1, 0.025, "hud_damage_factor"));
 +              setDependent(e, "hud_damage", 0.001, 100);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Fade rate:")));
 +              setDependent(e, "hud_damage", 0.001, 100);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0.25, 1, 0.05, "hud_damage_fade_rate"));
 +              setDependent(e, "hud_damage", 0.001, 100);
 +      me.TR(me);
-       
++
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_hidewaypoints", _("Waypoints")));
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Scale:")));
 +              setDependent(e, "cl_hidewaypoints", 0, 0);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0.5, 1.5, 0.05, "g_waypointsprite_scale"));
 +              setDependent(e, "cl_hidewaypoints", 0, 0);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Alpha:")));
 +              setDependent(e, "cl_hidewaypoints", 0, 0);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0.1, 1, 0.05, "g_waypointsprite_alpha"));
 +              setDependent(e, "cl_hidewaypoints", 0, 0);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Edge offset:")));
 +              setDependent(e, "cl_hidewaypoints", 0, 0);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0, 0.3, 0.01, "g_waypointsprite_edgeoffset_bottom"));
 +              makeMulti(e, "g_waypointsprite_edgeoffset_top g_waypointsprite_edgeoffset_left g_waypointsprite_edgeoffset_right");
 +              setDependent(e, "cl_hidewaypoints", 0, 0);
 +      me.TR(me);
-               // TODO: show hud config name with text here 
-               
++
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "hud_shownames", _("Show names above players")));
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBoxEx(25, 0, "hud_shownames_crosshairdistance", _("Only when near crosshair")));
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "hud_shownames_status", _("Display health and armor")));
 +      me.TR(me);
 +      me.TR(me);
 +              me.TDempty(me, 0.5);
 +              me.TD(me, 1, 2, e = makeXonoticButton(_("Enter HUD editor"), '0 0 0'));
 +                      e.onClick = HUDSetup_Check_Gamestatus;
 +                      e.onClickEntity = me;
- #endif
++              // TODO: show hud config name with text here
++
 +      me.gotoRC(me, me.rows - 1, 0);
 +              me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
 +                      e.onClick = Dialog_Close;
 +                      e.onClickEntity = me;
 +}
++#endif
index b06dc92,0000000..7749a14
mode 100644,000000..100644
--- /dev/null
@@@ -1,40 -1,0 +1,40 @@@
-       if not(gamestatus & (GAME_CONNECTED | GAME_ISSERVER))
 +#ifdef INTERFACE
 +CLASS(XonoticHUDConfirmDialog) EXTENDS(XonoticDialog)
 +      METHOD(XonoticHUDConfirmDialog, fill, void(entity))
 +      ATTRIB(XonoticHUDConfirmDialog, title, string, _("Enter HUD editor"))
 +      ATTRIB(XonoticHUDConfirmDialog, color, vector, SKINCOLOR_DIALOG_HUDCONFIRM)
 +      ATTRIB(XonoticHUDConfirmDialog, intendedWidth, float, 0.5)
 +      ATTRIB(XonoticHUDConfirmDialog, rows, float, 4)
 +      ATTRIB(XonoticHUDConfirmDialog, columns, float, 2)
 +ENDCLASS(XonoticHUDConfirmDialog)
 +#endif
 +
 +#ifdef IMPLEMENTATION
 +void HUDSetup_Start(entity me, entity btn)
 +{
-               
++      if (!(gamestatus & (GAME_CONNECTED | GAME_ISSERVER)))
 +              localcmd("map hudsetup/hudsetup", "\n");
 +      else
 +              localcmd("togglemenu 0\n");
++
 +      localcmd("_hud_configure 1", "\n");
 +}
 +
 +void XonoticHUDConfirmDialog_fill(entity me)
 +{
 +      entity e;
 +
 +      me.TR(me);
 +              me.TD(me, 1, 2, e = makeXonoticTextLabel(0.5, _("In order for the HUD editor to show, you must first be in game.")));
 +      me.TR(me);
 +              me.TD(me, 1, 2, e = makeXonoticTextLabel(0.5, _("Do you wish to start a local game to set up the HUD?")));
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticButton(ZCTX(_("HDCNFRM^Yes")), '1 0 0'));
 +                      e.onClick = HUDSetup_Start;
 +                      e.onClickEntity = me;
 +              me.TD(me, 1, 1, e = makeXonoticButton(ZCTX(_("HDCNFRM^No")), '0 1 0'));
 +                      e.onClick = Dialog_Close;
 +                      e.onClickEntity = me;
 +}
 +#endif
index c55d4d4,0000000..d1cdade
mode 100644,000000..100644
--- /dev/null
@@@ -1,51 -1,0 +1,51 @@@
-       
 +#ifdef INTERFACE
 +CLASS(XonoticModelDialog) EXTENDS(XonoticDialog)
 +      METHOD(XonoticModelDialog, toString, string(entity))
 +      METHOD(XonoticModelDialog, fill, void(entity))
 +      METHOD(XonoticModelDialog, showNotify, void(entity))
 +      ATTRIB(XonoticModelDialog, title, string, _("Model settings"))
 +      ATTRIB(XonoticModelDialog, color, vector, SKINCOLOR_DIALOG_MODEL)
 +      ATTRIB(XonoticModelDialog, intendedWidth, float, 0.5)
 +      ATTRIB(XonoticModelDialog, rows, float, 7)
 +      ATTRIB(XonoticModelDialog, columns, float, 3)
 +ENDCLASS(XonoticModelDialog)
 +#endif
 +
 +#ifdef IMPLEMENTATION
 +void XonoticModelDialog_showNotify(entity me)
 +{
 +      loadAllCvars(me);
 +}
 +string XonoticModelDialog_toString(entity me)
 +{
 +      return "hi"; // TODO: show csqc model settings like forcemyplayer and deglowing/ghosting bodies with text here
 +}
 +void XonoticModelDialog_fill(entity me)
 +{
 +      entity e;
-               
++
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Body fading:")));
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0, 2, 0.2, "cl_deathglow"));
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Gibs:")));
 +              me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_nogibs"));
 +                      e.addValue(e, ZCTX(_("GIBS^None")), "1");
 +                      e.addValue(e, ZCTX(_("GIBS^Few")), "0.75");
 +                      e.addValue(e, ZCTX(_("GIBS^Many")), "0.5");
 +                      e.addValue(e, ZCTX(_("GIBS^Lots")), "0");
 +                      e.configureXonoticTextSliderValues(e);
 +                      setDependent(e, "cl_gentle", 0, 0);
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_forceplayermodels", _("Force player models to mine")));
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_forceplayercolors", _("Force player colors to mine")));
 +      me.TR(me);
++
 +      me.gotoRC(me, me.rows - 1, 0);
 +              me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
 +                      e.onClick = Dialog_Close;
 +                      e.onClickEntity = me;
 +}
 +#endif
index 8ff33da,0000000..51ec3f4
mode 100644,000000..100644
--- /dev/null
@@@ -1,134 -1,0 +1,134 @@@
-       
 +#ifdef INTERFACE
 +CLASS(XonoticGameViewSettingsTab) EXTENDS(XonoticTab)
 +      //METHOD(XonoticGameCrosshairSettingsTab, toString, string(entity))
 +      METHOD(XonoticGameViewSettingsTab, fill, void(entity))
 +      METHOD(XonoticGameViewSettingsTab, showNotify, void(entity))
 +      ATTRIB(XonoticGameViewSettingsTab, title, string, _("View"))
 +      ATTRIB(XonoticGameViewSettingsTab, intendedWidth, float, 0.9)
 +      ATTRIB(XonoticGameViewSettingsTab, rows, float, 14)
 +      ATTRIB(XonoticGameViewSettingsTab, columns, float, 6.2)
 +ENDCLASS(XonoticGameViewSettingsTab)
 +entity makeXonoticGameViewSettingsTab();
 +#endif
 +
 +#ifdef IMPLEMENTATION
 +void XonoticGameViewSettingsTab_showNotify(entity me)
 +{
 +      loadAllCvars(me);
 +}
 +entity makeXonoticGameViewSettingsTab()
 +{
 +      entity me;
 +      me = spawnXonoticGameViewSettingsTab();
 +      me.configureDialog(me);
 +      return me;
 +}
 +
 +void clippedspectatingclick(entity me, entity checkbox)
 +{
 +      if(gamestatus & (GAME_CONNECTED | GAME_ISSERVER))
 +              localcmd("sendcvar cl_clippedspectating\n");
 +      
 +      CheckBox_Click(me, checkbox);
 +}
 +
 +void XonoticGameViewSettingsTab_fill(entity me)
 +{
 +      entity e;
++
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticRadioButton(1, "chase_active", "0", _("1st person perspective")));
 +              makeMulti(e, "crosshair_hittest_showimpact");
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBoxEx(0.05, 0, "cl_bobfall", _("Smooth the view when landing from a jump")));
 +              setDependent(e, "chase_active", -1, 0);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBoxEx(0.05, 0, "cl_smoothviewheight", _("Smooth the view while crouching")));
 +              setDependent(e, "chase_active", -1, 0);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBoxEx(1, 0, "v_idlescale", _("View waving while idle")));
 +              setDependent(e, "chase_active", -1, 0);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBoxEx(0.01, 0, "cl_bob", _("View bobbing while walking around")));
 +              makeMulti(e, "cl_bob2");
 +              setDependent(e, "chase_active", -1, 0);
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticRadioButton(1, "chase_active", "1", _("3rd person perspective")));
 +              makeMulti(e, "crosshair_hittest_showimpact");
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Back distance")));
 +              setDependent(e, "chase_active", 1, 1);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(10, 100, 1, "chase_back"));
 +              setDependent(e, "chase_active", 1, 1);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Up distance")));
 +              setDependent(e, "chase_active", 1, 1);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(10, 50, 1, "chase_up"));
 +              setDependent(e, "chase_active", 1, 1);
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_eventchase_death", _("Slide to third person perspective upon death")));
 +              setDependent(e, "chase_active", -1, 0);
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(1, "cl_clippedspectating", _("Allow passing through walls while spectating")));
 +                      e.onClick = clippedspectatingclick;
 +                      e.onClickEntity = e;
 +              // todo: onclick, do sendcvar if connected
 +      
 +      me.gotoRC(me, 0, 3.2); me.setFirstColumn(me, me.currentColumn);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Field of view:")));
 +              me.TD(me, 1, 2, e = makeXonoticSlider(60, 130, 5, "fov"));
 +      me.TR(me);
 +      me.TR(me);
 +              //me.TDempty(me, 0.2);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, ZCTX(_("ZOOM^Zoom factor:"))));
 +              me.TD(me, 1, 2, e = makeXonoticSlider(2, 16, 0.5, "cl_zoomfactor"));
 +      me.TR(me);
 +              //me.TDempty(me, 0.2);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, ZCTX(_("ZOOM^Zoom speed:"))));
 +              me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_zoomspeed"));
 +                      e.addValue(e, "1", "1"); // Samual: for() loop doesn't work here, even though it would make sense.
 +                      e.addValue(e, "2", "2");
 +                      e.addValue(e, "3", "3");
 +                      e.addValue(e, "4", "4");
 +                      e.addValue(e, "5", "5");
 +                      e.addValue(e, "6", "6");
 +                      e.addValue(e, "7", "7");
 +                      e.addValue(e, "8", "8");
 +                      e.addValue(e, ZCTX(_("ZOOM^Instant")), "-1");
 +                      e.configureXonoticTextSliderValues(e);
 +      me.TR(me);
 +              //me.TDempty(me, 0.2);
 +              me.TD(me, 1, 1, e = makeXonoticTextLabel(0, ZCTX(_("ZOOM^Zoom sensitivity:"))));
 +              me.TD(me, 1, 2, e = makeXonoticSlider(0, 1, 0.1, "cl_zoomsensitivity"));
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_velocityzoom", _("Velocity zoom")));
 +              me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(3, 1, "cl_velocityzoom_type", _("Forward movement only")));
 +                      setDependent(e, "cl_velocityzoom", 1, 1);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, ZCTX(_("VZOOM^Factor"))));
 +                      setDependentAND(e, "cl_velocityzoom", 1, 1, "cl_velocityzoom_type", 1, 3);
 +              me.TD(me, 1, 2, e = makeXonoticSlider(-1, 1, 0.1, "cl_velocityzoom_factor"));
 +                      setDependentAND(e, "cl_velocityzoom", 1, 1, "cl_velocityzoom_type", 1, 3);
 +      me.TR(me);
 +      me.TR(me);
 +              //me.TDempty(me, 0.2);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_reticle", _("Display reticle 2D overlay while zooming")));
 +      me.TR(me);
 +              //me.TDempty(me, 0.2);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_unpress_zoom_on_death", _("Release zoom when you die or respawn")));
 +                      makeMulti(e, "cl_unpress_zoom_on_spawn");
 +      me.TR(me);
 +              //me.TDempty(me, 0.2);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_unpress_zoom_on_weapon_switch", _("Release zoom when you switch weapons")));
 +}
 +#endif
index fa35491,0000000..cfdaf8f
mode 100644,000000..100644
--- /dev/null
@@@ -1,78 -1,0 +1,78 @@@
-                       
 +#ifdef INTERFACE
 +CLASS(XonoticWeaponsDialog) EXTENDS(XonoticDialog)
 +      METHOD(XonoticWeaponsDialog, toString, string(entity))
 +      METHOD(XonoticWeaponsDialog, fill, void(entity))
 +      METHOD(XonoticWeaponsDialog, showNotify, void(entity))
 +      ATTRIB(XonoticWeaponsDialog, title, string, _("Weapon settings"))
 +      ATTRIB(XonoticWeaponsDialog, color, vector, SKINCOLOR_DIALOG_WEAPONS)
 +      ATTRIB(XonoticWeaponsDialog, intendedWidth, float, 0.7)
 +      ATTRIB(XonoticWeaponsDialog, rows, float, 12)
 +      ATTRIB(XonoticWeaponsDialog, columns, float, 5.2)
 +      ATTRIB(XonoticWeaponsDialog, weaponsList, entity, NULL)
 +ENDCLASS(XonoticWeaponsDialog)
 +#endif
 +
 +#ifdef IMPLEMENTATION
 +void XonoticWeaponsDialog_showNotify(entity me)
 +{
 +        loadAllCvars(me);
 +}
 +string XonoticWeaponsDialog_toString(entity me)
 +{
 +      return me.weaponsList.toString(me.weaponsList);
 +}
 +void XonoticWeaponsDialog_fill(entity me)
 +{
 +      entity e;
 +
 +      me.TR(me);
 +              me.TD(me, 1, 2, makeXonoticTextLabel(0, _("Weapon priority list:")));
 +      me.TR(me);
 +              me.TD(me, 8, 2, e = me.weaponsList = makeXonoticWeaponsList());
 +      me.gotoRC(me, 9, 0);
 +              me.TD(me, 1, 1, e = makeXonoticButton(_("Up"), '0 0 0'));
 +                      e.onClick = WeaponsList_MoveUp_Click;
 +                      e.onClickEntity = me.weaponsList;
 +              me.TD(me, 1, 1, e = makeXonoticButton(_("Down"), '0 0 0'));
 +                      e.onClick = WeaponsList_MoveDown_Click;
 +                      e.onClickEntity = me.weaponsList;
-                       
++
 +      me.gotoRC(me, 0, 2.2); me.setFirstColumn(me, me.currentColumn);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_weaponpriority_useforcycling", _("Use priority list for weapon cycling")));
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_autoswitch", _("Auto switch weapons on pickup")));
 +      me.TR(me);
 +      me.TR(me);
 +              me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "r_drawviewmodel", _("Draw 1st person weapon model")));
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "cl_gunalign", "4", _("Left align")));
 +                      setDependent(e, "r_drawviewmodel", 1, 1);
 +              me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "cl_gunalign", "1", _("Center")));
 +                      setDependent(e, "r_drawviewmodel", 1, 1);
 +              me.TD(me, 1, 1.0, e = makeXonoticRadioButton(1, "cl_gunalign", "3", _("Right align")));
 +                      setDependent(e, "r_drawviewmodel", 1, 1);
 +      me.TR(me);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "cl_followmodel", _("Gun model swaying")));
 +              makeMulti(e, "cl_leanmodel");
 +              setDependent(e, "r_drawviewmodel", 1, 1);
 +      me.TR(me);
 +              me.TDempty(me, 0.2);
 +              me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "cl_bobmodel", _("Gun model bobbing")));
 +              setDependent(e, "r_drawviewmodel", 1, 1);
 +      //me.TR(me);
 +      //me.TR(me);
 +      //      me.TDempty(me, 0.2);
 +      //      me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, ZCTX(_("VWMDL^Scale"))));
 +      //      setDependent(e, "r_drawviewmodel", 1, 1);
 +      //      me.TD(me, 1, 2, e = makeXonoticSlider(0.1, 2, 0.1, "cl_viewmodel_scale"));
 +      //      setDependent(e, "r_drawviewmodel", 1, 1);
++
 +      me.gotoRC(me, me.rows - 1, 0);
 +              me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
 +                      e.onClick = Dialog_Close;
 +                      e.onClickEntity = me;
 +}
 +#endif
@@@ -3,8 -3,8 +3,8 @@@ CLASS(XonoticInputSettingsTab) EXTENDS(
        METHOD(XonoticInputSettingsTab, fill, void(entity))
        ATTRIB(XonoticInputSettingsTab, title, string, _("Input"))
        ATTRIB(XonoticInputSettingsTab, intendedWidth, float, 0.9)
 -      ATTRIB(XonoticInputSettingsTab, rows, float, 17)
 +      ATTRIB(XonoticInputSettingsTab, rows, float, 15.5)
-       ATTRIB(XonoticInputSettingsTab, columns, float, 6.2) // added extra .2 for center space 
+       ATTRIB(XonoticInputSettingsTab, columns, float, 6.2) // added extra .2 for center space
  ENDCLASS(XonoticInputSettingsTab)
  entity makeXonoticInputSettingsTab();
  #endif
@@@ -84,9 -84,9 +84,9 @@@ void XonoticInputSettingsTab_fill(entit
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "m_accelerate", _("Enable built in mouse acceleration")));
-               
-       
 -      me.gotoRC(me, me.rows - 1, 0);
 +      me.gotoRC(me, me.rows - 1.25, 0);
                me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "sendcvar cl_movement_track_canjump", COMMANDBUTTON_APPLY));
  }
  #endif
@@@ -83,8 -83,8 +83,8 @@@ void XonoticUserSettingsTab_fill(entit
        me.TR(me);
                me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "cl_allow_uid2name", _("Allow player statistics to use your nickname")));
                setDependent(e, "cl_allow_uidtracking", 1, 1);
-               
 -      me.gotoRC(me, me.rows - 3, 2.6);
 +      me.gotoRC(me, me.rows - 2, 2.6);
                me.TD(me, 1, 2, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "sendcvar cl_gentle; sendcvar cl_allow_uidtracking; sendcvar cl_allow_uid2name;", COMMANDBUTTON_APPLY));
  
  }
@@@ -3,8 -3,8 +3,8 @@@ CLASS(XonoticVideoSettingsTab) EXTENDS(
        METHOD(XonoticVideoSettingsTab, fill, void(entity))
        ATTRIB(XonoticVideoSettingsTab, title, string, _("Video"))
        ATTRIB(XonoticVideoSettingsTab, intendedWidth, float, 0.9)
 -      ATTRIB(XonoticVideoSettingsTab, rows, float, 17)
 +      ATTRIB(XonoticVideoSettingsTab, rows, float, 15.5)
-       ATTRIB(XonoticVideoSettingsTab, columns, float, 6.2) // added extra .2 for center space 
+       ATTRIB(XonoticVideoSettingsTab, columns, float, 6.2) // added extra .2 for center space
        ATTRIB(XonoticVideoSettingsTab, name, string, "videosettings")
  ENDCLASS(XonoticVideoSettingsTab)
  entity makeXonoticVideoSettingsTab();
@@@ -47,10 -47,8 +47,10 @@@ void XonoticVideoSettingsTab_fill(entit
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "vid_fullscreen", _("Full screen")));
                me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "vid_vsync", _("Vertical Synchronization")));
-               
        me.TR(me);
 +              if(cvar("developer"))
 +                      { me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "v_flipped", _("Flip view horizontally"))); }
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Anisotropy:")));
                me.TD(me, 1, 2, e = makeXonoticTextSlider("gl_texture_anisotropy"));
@@@ -170,9 -160,13 +170,8 @@@ void MainWindow_configureMainWindow(ent
        me.mutatorsDialog = i = spawnXonoticMutatorsDialog();
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
-       
  
 -
 -      // dialogs used by multiplayer/player setup
 -      me.crosshairDialog = i = spawnXonoticCrosshairDialog();
 -      i.configureDialog(i);
 -      me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
 -
 +      // dialogs used by multiplayer/player setup     
        me.hudDialog = i = spawnXonoticHUDDialog();
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
        me.modelDialog = i = spawnXonoticModelDialog();
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
-       
 -      me.viewDialog = i = spawnXonoticViewDialog();
 +      me.weaponsDialog = i = spawnXonoticWeaponsDialog();
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
-       
 -      me.weaponsDialog = i = spawnXonoticWeaponsDialog();
 +      me.notificationDialog = i = spawnXonoticNotificationDialog();
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
  
@@@ -1150,90 -736,76 +1150,90 @@@ void XonoticServerList_drawListBoxItem(
        // 4: AES recommended and will be used
        // 5: AES required
  
 -      {
 -              vector iconSize = '0 0 0';
 -              iconSize_y = me.realFontSize_y * me.iconsSizeFactor;
 -              iconSize_x = me.realFontSize_x * me.iconsSizeFactor;
 -
 -              vector iconPos = '0 0 0';
 -              iconPos_x = (me.columnIconsSize - 3 * iconSize_x) * 0.5;
 -              iconPos_y = (1 - iconSize_y) * 0.5;
 +      // --------------
 +      //  RENDER ICONS
 +      // --------------
 +      vector iconSize = '0 0 0';
 +      iconSize_y = me.realFontSize_y * me.iconsSizeFactor;
 +      iconSize_x = me.realFontSize_x * me.iconsSizeFactor;
  
 -              string n;
 +      vector iconPos = '0 0 0';
 +      iconPos_x = (me.columnIconsSize - 3 * iconSize_x) * 0.5;
 +      iconPos_y = (1 - iconSize_y) * 0.5;
  
 -              if (!(me.seenIPv4 && me.seenIPv6))
 -              {
 -                      iconPos_x += iconSize_x * 0.5;
 -              }
 -              else if(me.seenIPv4 && me.seenIPv6)
 -              {
 -                      n = string_null;
 -                      if(isv6)
 -                              draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_ipv6"), 0); // PRECACHE_PIC_MIPMAP
 -                      else if(isv4)
 -                              draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_ipv4"), 0); // PRECACHE_PIC_MIPMAP
 -                      if(n)
 -                              draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
 -                      iconPos_x += iconSize_x;
 -              }
 +      string n;
  
-       if not(me.seenIPv4 && me.seenIPv6)
 -              if(q > 0)
 -              {
 -                      draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_aeslevel", ftos(q)), 0); // PRECACHE_PIC_MIPMAP
++      if (!(me.seenIPv4 && me.seenIPv6))
 +      {
 +              iconPos_x += iconSize_x * 0.5;
 +      }
 +      else if(me.seenIPv4 && me.seenIPv6)
 +      {
 +              n = string_null;
 +              if(isv6)
 +                      draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_ipv6"), 0); // PRECACHE_PIC_MIPMAP
 +              else if(isv4)
 +                      draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_ipv4"), 0); // PRECACHE_PIC_MIPMAP
 +              if(n)
                        draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
 -              }
                iconPos_x += iconSize_x;
 +      }
  
 -              if(modname == "Xonotic")
 -              {
 -                      if(pure == 0)
 -                      {
 -                              draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_pure1"), PRECACHE_PIC_MIPMAP);
 -                              draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
 -                      }
 -              }
 -              else
 -              {
 -                      draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_mod_", modname), PRECACHE_PIC_MIPMAP);
 -                      if(draw_PictureSize(n) == '0 0 0')
 -                              draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_mod_"), PRECACHE_PIC_MIPMAP);
 -                      if(pure == 0)
 -                              draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
 -                      else
 -                              draw_Picture(iconPos, n, iconSize, '1 1 1', SKINALPHA_SERVERLIST_ICON_NONPURE);
 -              }
 -              iconPos_x += iconSize_x;
 +      if(q > 0)
 +      {
 +              draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_aeslevel", ftos(q)), 0); // PRECACHE_PIC_MIPMAP
 +              draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
 +      }
 +      iconPos_x += iconSize_x;
  
 -              if(sflags >= 0 && (sflags & SERVERFLAG_PLAYERSTATS))
 +      if(modname == "Xonotic")
 +      {
 +              if(pure == 0)
                {
 -                      draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_stats1"), 0); // PRECACHE_PIC_MIPMAP
 +                      draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_pure1"), PRECACHE_PIC_MIPMAP);
                        draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
                }
 -              iconPos_x += iconSize_x;
        }
 +      else
 +      {
 +              draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_mod_", modname), PRECACHE_PIC_MIPMAP);
 +              if(draw_PictureSize(n) == '0 0 0')
 +                      draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_mod_"), PRECACHE_PIC_MIPMAP);
 +              if(pure == 0)
 +                      draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
 +              else
 +                      draw_Picture(iconPos, n, iconSize, '1 1 1', SKINALPHA_SERVERLIST_ICON_NONPURE);
 +      }
 +      iconPos_x += iconSize_x;
  
 +      if(sflags >= 0 && (sflags & SERVERFLAG_PLAYERSTATS))
 +      {
 +              draw_PreloadPictureWithFlags(n = strcat(SKINGFX_SERVERLIST_ICON, "_stats1"), 0); // PRECACHE_PIC_MIPMAP
 +              draw_Picture(iconPos, n, iconSize, '1 1 1', 1);
 +      }
 +      iconPos_x += iconSize_x;
 +      
 +      // --------------
 +      //  RENDER TEXT
 +      // --------------
 +      
 +      // ping
        s = ftos(p);
        draw_Text(me.realUpperMargin * eY + (me.columnPingOrigin + me.columnPingSize - draw_TextWidth(s, 0, me.realFontSize)) * eX, s, me.realFontSize, theColor, theAlpha, 0);
 +
 +      // server name
        s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize, 0, me.realFontSize);
        draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha, 0);
 +
 +      // server map
        s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize, 0, me.realFontSize);
        draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
 +
 +      // server gametype
        s = draw_TextShortenToWidth(typestr, me.columnTypeSize, 0, me.realFontSize);
        draw_Text(me.realUpperMargin * eY + (me.columnTypeOrigin + (me.columnTypeSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
 +
 +      // server playercount
        s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
        draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
  }
Simple merge
Simple merge