pausable 0
seta g_spawnshieldtime 1.000000 "number of seconds you are invincible after you spawned, this shield is lost after you fire"
seta g_antilag 2 "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2 = server side hit scan in the past, 3 = unverified client side hit scan)"
+set g_trueaim_minrange 44 "TrueAim minimum range (TrueAim adjusts shots so they hit the crosshair point even though the gun is not at the screen center)"
set g_antilag_nudge 0 "don't touch"
set g_antilag_bullets 1 "Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - DO NOT TOUCH (severely changes weapon balance)"
set g_shootfromclient 1 "let client decide if it has the gun left or right; if set to 2, center handedness is allowed, and defaulted to, too; see also cl_gunalign"
seta hud_fontsize 11
seta scr_centersize 12
seta hud_width 560
-// alias hud_font "loadfont user1 ${1},gfx/fallback ${2-}; loadfont user2 ${1}-big ${2-}; scoreboard_columns_set"
-alias sbar_font "set _requested_sbar_font \"${*}\""
-sbar_font gfx/vera-sans 8 12 16 24 32
// these entities are not referenced by anything directly, they just represent
// teams and are found by find() when needed
scr_loadingscreen_barheight 20
scr_loadingscreen_count 1
scr_conforcewhiledisconnected 0
+scr_infobar_height 20
// DP cannot properly detect this, so rather turn off the detection
r_texture_dds_load_dxt1_noalpha 1
exec effects-normal.cfg
exec physicsX0.cfg
exec turrets.cfg
-exec font-nimbussansl.cfg
+exec font-xolonium.cfg
// hud cvar descriptions
exec _hud_descriptions.cfg
cr_maxbullets = ReadByte();
+ g_trueaim_minrange = ReadCoord();
+
if(!postinit)
PostInit();
}
traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, mv, ta);
trueaimpoint = trace_endpos;
+ if(vlen(trueaimpoint - view_origin) < g_trueaim_minrange)
+ trueaimpoint = view_origin + view_forward * g_trueaim_minrange;
+
if(vecs_x > 0)
vecs_y = -vecs_y;
else
float g_balance_grenadelauncher_bouncestop;
float g_balance_electro_secondary_bouncefactor;
float g_balance_electro_secondary_bouncestop;
+float g_trueaim_minrange;
#include "xonotic/dialog_multiplayer_create_mutators.c"
#include "xonotic/dialog_multiplayer_create_advanced.c"
#include "xonotic/dialog_multiplayer_create_mapinfo.c"
-#include "xonotic/gametypebutton.c"
+#include "xonotic/gametypelist.c"
#include "xonotic/maplist.c"
#include "xonotic/skinlist.c"
#include "xonotic/image.c"
float n;
me.TR(me);
- n = 6;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_dm", "DM"));
- e0 = e;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_lms", "LMS"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_arena", "Arena"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_keepaway", "Keepaway"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_race", "Race"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_cts", "Race CTS"));
- if(e.checked) e0 = NULL;
- me.TR(me);
- n = 9;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_tdm", "TDM"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_ctf", "CTF"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_ca", "CA"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_freezetag", "Freeze Tag"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_domination", "Domination"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_keyhunt", "Key Hunt"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_assault", "Assault"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_onslaught", "Onslaught"));
- if(e.checked) e0 = NULL;
- me.TD(me, 1, me.columns / n, e = makeXonoticGametypeButton(1, "g_nexball", "Nexball"));
- if(e.checked) e0 = NULL;
- if(e0)
- {
- //print("NO CHECK\n");
- e0.setChecked(e0, 1);
- }
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Game type:"));
+ me.TR(me);
+ me.TD(me, 9, 3, e = makeXonoticGametypeList());
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
+ me.TR(me);
me.TR(me);
me.TR(me);
- me.mapListBox = makeXonoticMapList();
- me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Map list:"));
- makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
me.TR(me);
- me.TD(me, me.rows - 7, 3, me.mapListBox);
- me.gotoRC(me, me.rows - 3, 0);
- me.TDempty(me, 0.5);
- me.TD(me, 1, 1, e = makeXonoticButton("All", '0 0 0'));
- e.onClick = MapList_All;
- e.onClickEntity = me.mapListBox;
- me.TD(me, 1, 1, e = makeXonoticButton("None", '0 0 0'));
- e.onClick = MapList_None;
- e.onClickEntity = me.mapListBox;
- me.TDempty(me, 0.5);
-
- me.gotoRC(me, 3, 3.5); me.setFirstColumn(me, me.currentColumn);
me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Match settings:"));
me.TR(me);
me.sliderTimelimit = makeXonoticSlider(1.0, 60.0, 0.5, "timelimit_override");
me.TDempty(me, 0.2);
me.TD(me, 1, 2.8, e = makeXonoticSliderCheckBox(-1, 0, me.sliderFraglimit, "Use map specified default"));
me.checkboxFraglimitMapinfo = e;
- me.TR(me);
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Player slots:"));
me.TD(me, 1, 2, makeXonoticSlider(1, 32, 1, "menu_maxplayers"));
e.configureXonoticTextSliderValues(e);
setDependent(e, "bot_number", 0, -1);
me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, "Bot names:"));
- me.TD(me, 1, 0.7, e = makeXonoticInputBox(1, "bot_prefix"));
- setDependent(e, "bot_number", 0, -1);
- me.TD(me, 1, 0.6, e = makeXonoticTextLabel(0.5, "Shadow"));
- setDependent(e, "bot_number", 0, -1);
- me.TD(me, 1, 0.7, e = makeXonoticInputBox(1, "bot_suffix"));
- setDependent(e, "bot_number", 0, -1);
- me.TR(me);
- me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Map voting:"));
- me.TD(me, 1, 2, e = makeXonoticTextSlider("g_maplist_votable"));
- e.addValue(e, "No voting", "0");
- e.addValue(e, "2 choices", "2");
- e.addValue(e, "3 choices", "3");
- e.addValue(e, "4 choices", "4");
- e.addValue(e, "5 choices", "5");
- e.addValue(e, "6 choices", "6");
- e.addValue(e, "7 choices", "7");
- e.addValue(e, "8 choices", "8");
- e.addValue(e, "9 choices", "9");
- e.configureXonoticTextSliderValues(e);
- me.TR(me);
- me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(0.5, 0, "sv_vote_simple_majority_factor", "Simple majority wins vcall"));
- me.TR(me);
- me.TR(me);
- me.TDempty(me, 0.5);
- me.TD(me, 1, 2, e = makeXonoticButton("Advanced settings...", '0 0 0'));
- e.onClick = DialogOpenButton_Click;
- e.onClickEntity = main.advancedDialog;
- main.advancedDialog.refilterEntity = me.mapListBox;
- me.TR(me);
- me.TR(me);
me.TD(me, 1, 1, e = makeXonoticButton("Mutators...", '0 0 0'));
e.onClick = DialogOpenButton_Click;
e.onClickEntity = main.mutatorsDialog;
me.TD(me, 1, 2, e0 = makeXonoticTextLabel(0, string_null));
e0.textEntity = main.mutatorsDialog;
e0.allowCut = 1;
+ me.TR(me);
+ me.TDempty(me, 0.5);
+ me.TD(me, 1, 2, e = makeXonoticButton("Advanced settings...", '0 0 0'));
+ e.onClick = DialogOpenButton_Click;
+ e.onClickEntity = main.advancedDialog;
+ main.advancedDialog.refilterEntity = me.mapListBox;
+
+ me.gotoRC(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
+ me.mapListBox = makeXonoticMapList();
+ me.TD(me, 1, 3, e = makeXonoticTextLabel(0, "Map list:"));
+ makeCallback(e, me.mapListBox, me.mapListBox.refilterCallback);
+ me.TR(me);
+ me.TD(me, me.rows - 4, 3, me.mapListBox);
+ me.gotoRC(me, me.rows - 3, 3.5);
+ me.TDempty(me, 0.25);
+ me.TD(me, 1, 1.125, e = makeXonoticButton("Select all", '0 0 0'));
+ e.onClick = MapList_All;
+ e.onClickEntity = me.mapListBox;
+ me.TD(me, 1, 1.125, e = makeXonoticButton("Select none", '0 0 0'));
+ e.onClick = MapList_None;
+ e.onClickEntity = me.mapListBox;
+ me.TDempty(me, 0.25);
me.gotoRC(me, me.rows - 1, 0);
me.TD(me, 1, me.columns, e = makeXonoticButton("Start Multiplayer!", '0 0 0'));
ATTRIB(XonoticAdvancedDialog, title, string, "Advanced server settings")
ATTRIB(XonoticAdvancedDialog, color, vector, SKINCOLOR_DIALOG_ADVANCED)
ATTRIB(XonoticAdvancedDialog, intendedWidth, float, 0.5)
- ATTRIB(XonoticAdvancedDialog, rows, float, 14)
+ ATTRIB(XonoticAdvancedDialog, rows, float, 17)
ATTRIB(XonoticAdvancedDialog, columns, float, 3)
ATTRIB(XonoticAdvancedDialog, refilterEntity, entity, NULL)
ENDCLASS(XonoticAdvancedDialog)
e.addValue(e, "3 teams", "3");
e.addValue(e, "4 teams", "4");
e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TR(me);
+ me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Map voting:"));
+ me.TD(me, 1, 2, e = makeXonoticTextSlider("g_maplist_votable"));
+ e.addValue(e, "No voting", "0");
+ e.addValue(e, "2 choices", "2");
+ e.addValue(e, "3 choices", "3");
+ e.addValue(e, "4 choices", "4");
+ e.addValue(e, "5 choices", "5");
+ e.addValue(e, "6 choices", "6");
+ e.addValue(e, "7 choices", "7");
+ e.addValue(e, "8 choices", "8");
+ e.addValue(e, "9 choices", "9");
+ e.configureXonoticTextSliderValues(e);
+ me.TR(me);
+ me.TD(me, 1, 3, e = makeXonoticCheckBoxEx(0.5, 0, "sv_vote_simple_majority_factor", "Simple majority wins vcall"));
me.gotoRC(me, me.rows - 1, 0);
me.TD(me, 1, me.columns, e = makeXonoticButton("OK", '0 0 0'));
METHOD(XonoticMapInfoDialog, loadMapInfo, void(entity, float, entity))
ATTRIB(XonoticMapInfoDialog, title, string, "Map Information")
ATTRIB(XonoticMapInfoDialog, color, vector, SKINCOLOR_DIALOG_MAPINFO)
- ATTRIB(XonoticMapInfoDialog, intendedWidth, float, 0.85)
- ATTRIB(XonoticMapInfoDialog, rows, float, 9)
+ ATTRIB(XonoticMapInfoDialog, intendedWidth, float, 1.0)
+ ATTRIB(XonoticMapInfoDialog, rows, float, 12)
ATTRIB(XonoticMapInfoDialog, columns, float, 10)
ATTRIB(XonoticMapInfoDialog, previewImage, entity, NULL)
ATTRIB(XonoticMapInfoDialog, descriptionLabel, entity, NULL)
ATTRIB(XonoticMapInfoDialog, featuresLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeDeathmatchLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeTDMLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeLMSLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeArenaLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeRuneLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeDominationLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeKeyHuntLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeCTFLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeCALabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeAssaultLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeOnslaughtLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeRaceLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeCTSLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeNexballLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeFreezetagLabel, entity, NULL)
- ATTRIB(XonoticMapInfoDialog, typeKeepawayLabel, entity, NULL)
+ ATTRIBARRAY(XonoticMapInfoDialog, typeLabels, entity, 24)
ATTRIB(XonoticMapInfoDialog, currentMapIndex, float, 0)
ATTRIB(XonoticMapInfoDialog, currentMapBSPName, string, string_null)
me.featuresLabel.setText(me.featuresLabel, me.currentMapFeaturesText);
me.previewImage.src = me.currentMapPreviewImage;
- me.typeDeathmatchLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DEATHMATCH);
- me.typeTDMLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_TEAM_DEATHMATCH);
- me.typeLMSLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_LMS);
- me.typeArenaLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ARENA);
- me.typeDominationLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_DOMINATION);
- me.typeRuneLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RUNEMATCH);
- me.typeKeyHuntLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEYHUNT);
- me.typeCTFLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTF);
- me.typeCALabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CA);
- me.typeAssaultLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ASSAULT);
- me.typeOnslaughtLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_ONSLAUGHT);
- me.typeRaceLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_RACE);
- me.typeCTSLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_CTS);
- me.typeNexballLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_NEXBALL);
- me.typeFreezetagLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_FREEZETAG);
- me.typeKeepawayLabel.disabled = !(MapInfo_Map_supportedGametypes & MAPINFO_TYPE_KEEPAWAY);
+ for(i = 0; i < GameType_GetCount(); ++i)
+ {
+ entity e;
+ e = me.(typeLabels[i]);
+ e.disabled = !(MapInfo_Map_supportedGametypes & GameType_GetID(i));
+ }
MapInfo_ClearTemps();
}
void XonoticMapInfoDialog_fill(entity me)
{
entity e;
- float w, wgt;
+ float w, wgt, i, n;
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, me.rows - 2, 3, e = makeXonoticImage(string_null, 4.0/3.0));
me.featuresLabel = e;
me.TR(me);
me.TD(me, 1, w, e = makeXonoticTextLabel(0, "Game types:"));
- me.TR(me); wgt = (w-0.2)/5;
- me.TDempty(me, 0.2);
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "DM"));
- me.typeDeathmatchLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "TDM"));
- me.typeTDMLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "LMS"));
- me.typeLMSLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Arena"));
- me.typeArenaLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Domination"));
- me.typeDominationLabel = e;
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Key Hunt"));
- me.typeKeyHuntLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "CTF"));
- me.typeCTFLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "CA"));
- me.typeCALabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Assault"));
- me.typeAssaultLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Onslaught"));
- me.typeOnslaughtLabel = e;
- me.TR(me);
- me.TDempty(me, 0.2);
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Race"));
- me.typeRaceLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "CTS"));
- me.typeCTSLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Nexball"));
- me.typeNexballLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Freezetag"));
- me.typeFreezetagLabel = e;
- me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, "Keepaway"));
- me.typeKeepawayLabel = e;
+
+
+ n = ceil(GameType_GetCount() / (me.rows - 6));
+ wgt = (w - 0.2) / n;
+ for(i = 0; i < GameType_GetCount(); ++i)
+ {
+ if(mod(i, n) == 0)
+ {
+ me.TR(me);
+ me.TDempty(me, 0.2);
+ }
+ me.TD(me, 1, wgt, e = makeXonoticTextLabel(0, GameType_GetName(i)));
+ me.(typeLabels[i]) = e;
+ }
me.gotoRC(me, me.rows - 2, 0);
me.TD(me, 1, me.columns, e = makeXonoticTextLabel(0.5, ""));
--- /dev/null
+#ifdef INTERFACE
+CLASS(XonoticGametypeList) EXTENDS(XonoticListBox)
+ METHOD(XonoticGametypeList, configureXonoticGametypeList, void(entity))
+ ATTRIB(XonoticGametypeList, rowsPerItem, float, 1)
+ METHOD(XonoticGametypeList, drawListBoxItem, void(entity, float, vector, float))
+ METHOD(XonoticGametypeList, resizeNotify, void(entity, vector, vector, vector, vector))
+ METHOD(XonoticGametypeList, setSelected, void(entity, float))
+ METHOD(XonoticGametypeList, loadCvars, void(entity))
+ METHOD(XonoticGametypeList, saveCvars, void(entity))
+
+ ATTRIB(XonoticGametypeList, realFontSize, vector, '0 0 0')
+ ATTRIB(XonoticGametypeList, realUpperMargin, float, 0)
+ ATTRIB(XonoticGametypeList, columnNameOrigin, float, 0)
+ ATTRIB(XonoticGametypeList, columnNameSize, float, 0)
+ENDCLASS(XonoticGametypeList)
+entity makeXonoticGametypeList();
+#endif
+
+#ifdef IMPLEMENTATION
+
+entity makeXonoticGametypeList(void)
+{
+ entity me;
+ me = spawnXonoticGametypeList();
+ me.configureXonoticGametypeList(me);
+ return me;
+}
+void XonoticGametypeList_configureXonoticGametypeList(entity me)
+{
+ me.loadCvars(me);
+ me.configureXonoticListBox(me);
+ me.nItems = GameType_GetCount();
+}
+void XonoticGametypeList_setSelected(entity me, float i)
+{
+ SUPER(XonoticGametypeList).setSelected(me, i);
+ me.saveCvars(me);
+}
+
+void XonoticGametypeList_loadCvars(entity me)
+{
+ float t;
+ t = MapInfo_CurrentGametype();
+ float i;
+ for(i = 0; i < GameType_GetCount(); ++i)
+ if(t == GameType_GetID(i))
+ break;
+ if(i >= GameType_GetCount())
+ {
+ for(i = 0; i < GameType_GetCount(); ++i)
+ if(t == MAPINFO_TYPE_DEATHMATCH)
+ break;
+ if(i >= GameType_GetCount())
+ i = 0;
+ }
+ me.setSelected(me, i);
+ // do we need this: me.parent.gameTypeChangeNotify(me.parent); // to make sure
+}
+void XonoticGametypeList_saveCvars(entity me)
+{
+ float t;
+ t = GameType_GetID(me.selectedItem);
+ if(t == MapInfo_CurrentGametype())
+ return;
+ MapInfo_SwitchGameType(t);
+ me.parent.gameTypeChangeNotify(me.parent);
+}
+void XonoticGametypeList_drawListBoxItem(entity me, float i, vector absSize, float isSelected)
+{
+ string s;
+ if(isSelected)
+ draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+ s = GameType_GetName(i);
+ draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+}
+void XonoticGametypeList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+ SUPER(XonoticServerList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
+ me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
+ me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
+ me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+ me.columnNameOrigin = 0;
+ me.columnNameSize = 1;
+}
+#endif
if(r == r0)
continue;
r0 = r;
- if(r_x < 640 || r_y < 400)
+ if(r_x < 640 || r_y < 480)
continue;
me.addResolution(me, r_x, r_y, r_z);
}
}
}
}
+
+// note: include only those that should be in the menu!
+#define GAMETYPES \
+ GAMETYPE(MAPINFO_TYPE_ARENA, "Arena") \
+ GAMETYPE(MAPINFO_TYPE_ASSAULT, "Assault") \
+ GAMETYPE(MAPINFO_TYPE_CTF, "Capture The Flag") \
+ GAMETYPE(MAPINFO_TYPE_CA, "Clan Arena") \
+ GAMETYPE(MAPINFO_TYPE_DEATHMATCH, "Deathmatch") \
+ GAMETYPE(MAPINFO_TYPE_DOMINATION, "Domination") \
+ GAMETYPE(MAPINFO_TYPE_FREEZETAG, "Freeze Tag") \
+ GAMETYPE(MAPINFO_TYPE_KEEPAWAY, "Keepaway") \
+ GAMETYPE(MAPINFO_TYPE_KEYHUNT, "Key Hunt") \
+ GAMETYPE(MAPINFO_TYPE_LMS, "Last Man Standing") \
+ GAMETYPE(MAPINFO_TYPE_NEXBALL, "Nexball") \
+ GAMETYPE(MAPINFO_TYPE_ONSLAUGHT, "Onslaught") \
+ GAMETYPE(MAPINFO_TYPE_RACE, "Race") \
+ GAMETYPE(MAPINFO_TYPE_CTS, "Race CTS") \
+ GAMETYPE(MAPINFO_TYPE_RUNEMATCH, "Runematch") \
+ GAMETYPE(MAPINFO_TYPE_TEAM_DEATHMATCH, "Team Deathmatch") \
+ /* nothing */
+
+float GameType_GetID(float cnt)
+{
+ float i;
+ i = 0;
+#define GAMETYPE(id,name) if(i++ == cnt) return id;
+ GAMETYPES
+#undef GAMETYPE
+ return 0;
+}
+string GameType_GetName(float cnt)
+{
+ float i;
+ i = 0;
+#define GAMETYPE(id,name) if(i++ == cnt) return name;
+ GAMETYPES
+#undef GAMETYPE
+ return "@!#%'n Tuba Throwing";
+}
+float GameType_GetCount()
+{
+ float i;
+ i = 0;
+#define GAMETYPE(id,name) ++i;
+ GAMETYPES
+#undef GAMETYPE
+ return i;
+}
+
void Curl_URI_Get_Callback(float id, float status, string data);
void URI_Get_Callback(float id, float status, string data);
+
+// game type list box stuff (does not NEED to contain all game types, other
+// types stay available via console)
+float GameType_GetID(float cnt);
+string GameType_GetName(float cnt);
+float GameType_GetCount();
float autocvar_waypoint_benchmark;
float autocvar_welcome_message_time;
float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
+float autocvar_g_trueaim_minrange;
WriteByte(MSG_ENTITY, autocvar_g_balance_sniperrifle_secondary); // client has to know if it should zoom or not
WriteByte(MSG_ENTITY, serverflags); // client has to know if it should zoom or not
WriteByte(MSG_ENTITY, autocvar_g_balance_sniperrifle_magazinecapacity); // rifle max bullets
+ WriteCoord(MSG_ENTITY, autocvar_g_trueaim_minrange);
return TRUE;
}
v_right = vr;
v_up = vu;
+ // un-adjust trueaim if shotend is too close
+ if(vlen(w_shotend - (ent.origin + ent.view_ofs)) < autocvar_g_trueaim_minrange)
+ w_shotend = ent.origin + ent.view_ofs + s_forward * autocvar_g_trueaim_minrange;
+
// track max damage
if(accuracy_canbegooddamage(ent))
accuracy_add(ent, ent.weapon, maxdamage, 0);
BADCVAR("g_forced_team_pink");
// mapinfo
- BADCVAR("timelimit");
BADCVAR("fraglimit");
- BADCVAR("leadlimit");
- BADCVAR("g_tdm_teams");
- BADCVAR("g_keyhunt_teams");
- BADCVAR("g_domination_default_teams");
- BADCVAR("g_race_qualifying_timelimit");
- BADCVAR("g_lms");
BADCVAR("g_arena");
- BADCVAR("g_ca");
BADCVAR("g_assault");
+ BADCVAR("g_ca");
BADCVAR("g_ctf");
+ BADCVAR("g_cts");
BADCVAR("g_dm");
BADCVAR("g_domination");
+ BADCVAR("g_domination_default_teams");
BADCVAR("g_freezetag");
+ BADCVAR("g_keepaway");
BADCVAR("g_keyhunt");
BADCVAR("g_keyhunt_teams");
+ BADCVAR("g_keyhunt_teams");
+ BADCVAR("g_lms");
+ BADCVAR("g_nexball");
BADCVAR("g_onslaught");
BADCVAR("g_race");
- BADCVAR("g_cts");
+ BADCVAR("g_race_qualifying_timelimit");
BADCVAR("g_runematch");
BADCVAR("g_tdm");
- BADCVAR("g_nexball");
- BADCVAR("g_keepaway");
+ BADCVAR("g_tdm_teams");
+ BADCVAR("leadlimit");
+ BADCVAR("nextmap");
BADCVAR("teamplay");
+ BADCVAR("timelimit");
// long
BADCVAR("hostname");