mirror of
https://github.com/UberGames/RPG-X2.git
synced 2024-11-28 15:13:11 +00:00
4519 lines
148 KiB
C
4519 lines
148 KiB
C
// Copyright (C) 1999-2000 Raven Software
|
|
//
|
|
/*
|
|
=============================================================================
|
|
|
|
START SERVER MENU *****
|
|
|
|
=============================================================================
|
|
*/
|
|
#include "ui_local.h"
|
|
|
|
#define GAMESERVER_SELECT "menu/art/maps_select"
|
|
#define GAMESERVER_SELECTED "menu/art/maps_selected"
|
|
#define GAMESERVER_UNKNOWNMAP "levelshots/unknownmap"
|
|
|
|
#define MAX_SKINS_FOR_RACE 128
|
|
|
|
#define MAX_MAPROWS 2
|
|
#define MAX_MAPCOLS 2
|
|
#define MAX_MAPSPERPAGE 6
|
|
|
|
#define MAX_SERVERSTEXT 8192
|
|
|
|
#define MAX_SERVERMAPS 1024
|
|
//#define MAX_NAMELENGTH 24
|
|
|
|
#define ID_GAMETYPE 10
|
|
#define ID_PICTURES 11 // 12, 13, 14
|
|
#define ID_PREVPAGE 15
|
|
#define ID_NEXTPAGE 16
|
|
#define ID_STARTSERVERBACK 17
|
|
#define ID_STARTSERVERNEXT 18
|
|
#define ID_MAINMENU 100
|
|
|
|
#define ID_AUTOJOIN 5
|
|
#define ID_AUTOBALANCE 6
|
|
#define ID_FRIENDLYFIRE 7
|
|
#define ID_FALLINGDAMAGE 8
|
|
#define ID_RESPAWNTIME 9
|
|
#define ID_ADVMAXCLIENTS 10
|
|
#define ID_RUNSPEED 11
|
|
#define ID_GRAVITY 12
|
|
#define ID_KNOCKBACK 13
|
|
#define ID_DMGMULT 14
|
|
#define ID_BOT_MINPLAYERS 15
|
|
#define ID_ADAPTITEMRESPAWN 16
|
|
#define ID_HOLODECKINTRO 17
|
|
#define ID_FORCEPLAYERRESPAWN 18
|
|
#define ID_RESPAWNINVULNERABILITY 19
|
|
#define ID_DOWARMUP 20
|
|
#define ID_BLUETEAM 21
|
|
#define ID_REDTEAM 22
|
|
#define ID_PMOD_ASSIMILIATION 23
|
|
#define ID_PMOD_DISINTEGRATION 24
|
|
#define ID_PMOD_ACTIONHERO 25
|
|
#define ID_PMOD_SPECIALTIES 26
|
|
#define ID_PMOD_ELIMINATION 27
|
|
#define ID_PLAYER_TYPE 28
|
|
#define ID_MAXCLIENTS 29
|
|
#define ID_DEDICATED 30
|
|
#define ID_GO 31
|
|
#define ID_BACK 32
|
|
#define ID_PLAYER_TEAM 33
|
|
#define ID_ADVANCED 34
|
|
#define ID_NOJOINTIMEOUT 35
|
|
#define ID_CLASSCHANGETIMEOUT 36
|
|
#define ID_PLAYER_CLASS 37
|
|
|
|
#define ERR_RESPAWNTIME 1
|
|
#define ERR_MAXCLIENTS 2
|
|
#define ERR_RUNSPEED 3
|
|
#define ERR_GRAVITY 4
|
|
#define ERR_KNOCKBACK 5
|
|
#define ERR_DMGMULT 6
|
|
#define ERR_BOT_MINPLAYERS 7
|
|
#define ERR_FORCEPLAYERRESPAWN 8
|
|
#define ERR_RESPAWNINVULNERABILITY 9
|
|
#define ERR_DOWARMUP 10
|
|
#define ERR_NOJOINTIMEOUT 11
|
|
#define ERR_CLASSCHANGETIMEOUT 12
|
|
|
|
void UI_BuildGroupTable(void);
|
|
void SetPlayerMod(void);
|
|
|
|
extern int s_OffOnNone_Names[];
|
|
|
|
static const char *s_skinsForRace[MAX_SKINS_FOR_RACE];
|
|
|
|
static char skinsForRace[MAX_SKINS_FOR_RACE][128];
|
|
|
|
typedef struct
|
|
{
|
|
menuframework_s menu;
|
|
menubitmap_s mainmenu;
|
|
menubitmap_s back;
|
|
|
|
menulist_s autojoin;
|
|
menulist_s autobalance;
|
|
menulist_s friendlyfire;
|
|
menulist_s fallingdamage;
|
|
|
|
menufield_s repawntime;
|
|
menufield_s maxclients;
|
|
menufield_s runspeed;
|
|
menufield_s gravity;
|
|
menufield_s knockback;
|
|
menufield_s dmgmult;
|
|
menufield_s bot_minplayers;
|
|
menufield_s classchangetimeout;
|
|
|
|
// Second column
|
|
menulist_s adaptitemrespawn;
|
|
menulist_s holodeckintro;
|
|
menufield_s forceplayerrespawn;
|
|
menufield_s respawninvulnerability;
|
|
menufield_s dowarmup;
|
|
|
|
menulist_s blueteam;
|
|
menulist_s redteam;
|
|
|
|
|
|
menulist_s assimilation;
|
|
menulist_s specialties;
|
|
menulist_s disintegration;
|
|
|
|
menulist_s actionhero;
|
|
menulist_s elimination;
|
|
|
|
menutext_s errorText;
|
|
|
|
int errorFlag;
|
|
|
|
} advancedserver_t;
|
|
|
|
static advancedserver_t s_advancedserver;
|
|
|
|
typedef struct
|
|
{
|
|
menuframework_s menu;
|
|
|
|
menubitmap_s mainmenu;
|
|
menulist_s gametype;
|
|
menubitmap_s mappics[MAX_MAPSPERPAGE];
|
|
menubitmap_s mapbuttons[MAX_MAPSPERPAGE];
|
|
menubitmap_s arrows;
|
|
menubitmap_s prevpage;
|
|
menubitmap_s nextpage;
|
|
menubitmap_s back;
|
|
menubitmap_s next;
|
|
|
|
menulist_s assimilation;
|
|
menulist_s specialties;
|
|
menulist_s disintegration;
|
|
|
|
menulist_s actionhero;
|
|
menulist_s elimination;
|
|
|
|
menutext_s mapname;
|
|
menubitmap_s item_null;
|
|
|
|
qhandle_t corner_ll;
|
|
qhandle_t corner_lr;
|
|
|
|
qboolean multiplayer;
|
|
int currentmap;
|
|
int nummaps;
|
|
int page;
|
|
int maxpages;
|
|
char maplist[MAX_SERVERMAPS][MAX_NAMELENGTH];
|
|
int mapGamebits[MAX_SERVERMAPS];
|
|
char maplongname[MAX_SERVERMAPS][MAX_NAMELENGTH];
|
|
int maprecommended[MAX_SERVERMAPS];
|
|
} startserver_t;
|
|
|
|
static startserver_t s_startserver;
|
|
/*
|
|
static const char *gametype_items[] = {
|
|
"Free For All",
|
|
"Team Deathmatch",
|
|
"Tournament",
|
|
"Capture the Flag",
|
|
0
|
|
};
|
|
*/
|
|
|
|
static int gametype_items[] =
|
|
{
|
|
MNT_TYPE_FREEFORALL,
|
|
MNT_TYPE_TEAMDEATHMATCH,
|
|
MNT_TYPE_TOURNAMENT,
|
|
MNT_TYPE_CAPTURETHEFLAG,
|
|
0
|
|
};
|
|
|
|
static int gametype_remap[] = {GT_FFA, GT_TEAM, GT_TOURNAMENT, GT_CTF};
|
|
//static int gametype_remap2[] = {0, 2, 0, 1, 3};
|
|
|
|
static void UI_ServerOptionsMenu( qboolean multiplayer );
|
|
static int UI_SearchGroupTable(char *current_race);
|
|
static void UI_BlankGroupTable(void);
|
|
|
|
void StartServerSetModButtons(void);
|
|
|
|
/*
|
|
=================
|
|
GametypeBits
|
|
=================
|
|
*/
|
|
static int GametypeBits( char *string ) {
|
|
int bits;
|
|
char *p;
|
|
char *token;
|
|
|
|
bits = 0;
|
|
p = string;
|
|
while( 1 ) {
|
|
token = COM_ParseExt( &p, qfalse );
|
|
if( token[0] == 0 )
|
|
{
|
|
break;
|
|
}
|
|
|
|
if( Q_stricmp( token, "ffa" ) == 0 )
|
|
{
|
|
bits |= 1 << GT_FFA;
|
|
bits |= 1 << GT_TOURNAMENT;
|
|
continue;
|
|
}
|
|
|
|
if( Q_stricmp( token, "tourney" ) == 0 )
|
|
{
|
|
bits |= 1 << GT_TOURNAMENT;
|
|
continue;
|
|
}
|
|
|
|
if( Q_stricmp( token, "single" ) == 0 )
|
|
{
|
|
bits |= 1 << GT_SINGLE_PLAYER;
|
|
bits |= 1 << GT_TOURNAMENT;
|
|
continue;
|
|
}
|
|
|
|
if( Q_stricmp( token, "team" ) == 0 )
|
|
{
|
|
bits |= 1 << GT_TEAM;
|
|
continue;
|
|
}
|
|
|
|
if( Q_stricmp( token, "ctf" ) == 0 )
|
|
{
|
|
bits |= 1 << GT_CTF;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return bits;
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
StartServer_Update
|
|
=================
|
|
*/
|
|
static void StartServer_Update( void ) {
|
|
int i;
|
|
int top;
|
|
static char picname[MAX_MAPSPERPAGE][64];
|
|
|
|
top = s_startserver.page*MAX_MAPSPERPAGE;
|
|
|
|
for (i=0; i<MAX_MAPSPERPAGE; i++)
|
|
{
|
|
if (top+i >= s_startserver.nummaps)
|
|
break;
|
|
|
|
Com_sprintf( picname[i], sizeof(picname[i]), "levelshots/%s", s_startserver.maplist[top+i] );
|
|
|
|
s_startserver.mappics[i].generic.flags &= ~QMF_HIGHLIGHT;
|
|
s_startserver.mappics[i].generic.name = picname[i];
|
|
s_startserver.mappics[i].shader = 0;
|
|
|
|
// reset
|
|
s_startserver.mapbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
|
|
s_startserver.mapbuttons[i].generic.flags &= ~QMF_INACTIVE;
|
|
}
|
|
|
|
for (; i<MAX_MAPSPERPAGE; i++)
|
|
{
|
|
s_startserver.mappics[i].generic.flags &= ~QMF_HIGHLIGHT;
|
|
s_startserver.mappics[i].generic.name = NULL;
|
|
s_startserver.mappics[i].shader = 0;
|
|
|
|
// disable
|
|
s_startserver.mapbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
|
|
s_startserver.mapbuttons[i].generic.flags |= QMF_INACTIVE;
|
|
}
|
|
|
|
// no servers to start
|
|
if( !s_startserver.nummaps ) {
|
|
s_startserver.next.generic.flags |= QMF_INACTIVE;
|
|
|
|
// set the map name
|
|
strcpy( s_startserver.mapname.string, menu_normal_text[MNT_NOMAPSFOUND] );
|
|
}
|
|
else {
|
|
// set the highlight
|
|
s_startserver.next.generic.flags &= ~QMF_INACTIVE;
|
|
i = s_startserver.currentmap - top;
|
|
if ( i >=0 && i < MAX_MAPSPERPAGE )
|
|
{
|
|
s_startserver.mappics[i].generic.flags |= QMF_HIGHLIGHT;
|
|
s_startserver.mapbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
|
|
}
|
|
|
|
// set the map name
|
|
strcpy( s_startserver.mapname.string, s_startserver.maplist[s_startserver.currentmap] );
|
|
}
|
|
|
|
Q_strupr( s_startserver.mapname.string );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
StartServer_MapEvent
|
|
=================
|
|
*/
|
|
static void StartServer_MapEvent( void* ptr, int event ) {
|
|
if( event != QM_ACTIVATED) {
|
|
return;
|
|
}
|
|
|
|
s_startserver.currentmap = (s_startserver.page*MAX_MAPSPERPAGE) + (((menucommon_s*)ptr)->id - ID_PICTURES);
|
|
StartServer_Update();
|
|
}
|
|
|
|
static void StartServer_Settings(void)
|
|
{
|
|
s_startserver.actionhero.curvalue= 0;
|
|
s_startserver.assimilation.curvalue= 0;
|
|
s_startserver.disintegration.curvalue= 0;
|
|
s_startserver.elimination.curvalue= 0;
|
|
s_startserver.specialties.curvalue= 0;
|
|
|
|
s_startserver.actionhero.generic.flags &= ~QMF_GRAYED;
|
|
s_startserver.assimilation.generic.flags &= ~QMF_GRAYED;
|
|
s_startserver.disintegration.generic.flags &= ~QMF_GRAYED;
|
|
s_startserver.elimination.generic.flags &= ~QMF_GRAYED;
|
|
s_startserver.specialties.generic.flags &= ~QMF_GRAYED;
|
|
|
|
// Set assimilation button
|
|
if (gametype_remap[s_startserver.gametype.curvalue]== GT_TEAM )
|
|
{
|
|
s_startserver.assimilation.generic.flags &= ~QMF_HIDDEN;
|
|
}
|
|
else
|
|
{
|
|
s_startserver.assimilation.generic.flags |= QMF_HIDDEN;
|
|
}
|
|
|
|
|
|
// Set specialties button
|
|
// if (gametype_remap[s_startserver.gametype.curvalue]>= GT_TEAM )
|
|
// {
|
|
// s_startserver.specialties.generic.flags &= ~QMF_HIDDEN;
|
|
// }
|
|
// else
|
|
// {
|
|
// s_startserver.specialties.generic.flags |= QMF_HIDDEN;
|
|
// }
|
|
|
|
// Set assimilation button
|
|
s_startserver.disintegration.generic.flags &= ~QMF_HIDDEN;
|
|
|
|
// Set elimination button
|
|
if (gametype_remap[s_startserver.gametype.curvalue]< GT_CTF )
|
|
{
|
|
s_startserver.elimination.generic.flags &= ~QMF_HIDDEN;
|
|
}
|
|
else
|
|
{
|
|
s_startserver.elimination.generic.flags |= QMF_HIDDEN;
|
|
}
|
|
|
|
// Set action hero button
|
|
if (gametype_remap[s_startserver.gametype.curvalue]< GT_TEAM )
|
|
{
|
|
s_startserver.actionhero.generic.flags &= ~QMF_HIDDEN;
|
|
}
|
|
else
|
|
{
|
|
s_startserver.actionhero.generic.flags |= QMF_HIDDEN;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
StartServer_GametypeEvent
|
|
=================
|
|
*/
|
|
extern vmCvar_t ui_language;
|
|
static void StartServer_GametypeEvent( void* ptr, int event ) {
|
|
int i;
|
|
int count;
|
|
int gamebits;
|
|
int matchbits;
|
|
const char *info;
|
|
|
|
if( event != QM_ACTIVATED) {
|
|
return;
|
|
}
|
|
|
|
|
|
count = UI_GetNumArenas();
|
|
s_startserver.nummaps = 0;
|
|
matchbits = 1 << gametype_remap[s_startserver.gametype.curvalue];
|
|
if( gametype_remap[s_startserver.gametype.curvalue] == GT_FFA ) {
|
|
matchbits |= ( 1 << GT_SINGLE_PLAYER );
|
|
}
|
|
for( i = 0; i < count; i++ ) {
|
|
info = UI_GetArenaInfoByNumber( i );
|
|
|
|
gamebits = GametypeBits( Info_ValueForKey( info, "type") );
|
|
if( !( gamebits & matchbits ) ) {
|
|
continue;
|
|
}
|
|
|
|
Q_strncpyz( s_startserver.maplist[s_startserver.nummaps], Info_ValueForKey( info, "map"), MAX_NAMELENGTH );
|
|
Q_strupr( s_startserver.maplist[s_startserver.nummaps] );
|
|
|
|
if (ui_language.string[0] == 0 || Q_stricmp ("ENGLISH",ui_language.string)==0 ) {
|
|
Q_strncpyz( s_startserver.maplongname[s_startserver.nummaps], Info_ValueForKey( info, "longname"), MAX_NAMELENGTH );
|
|
} else {
|
|
Q_strncpyz( s_startserver.maplongname[s_startserver.nummaps], Info_ValueForKey( info, va("longname_%s",ui_language.string) ), MAX_NAMELENGTH );
|
|
if (!s_startserver.maplongname[s_startserver.nummaps][0]) {
|
|
Q_strncpyz( s_startserver.maplongname[s_startserver.nummaps], Info_ValueForKey( info, "longname"), MAX_NAMELENGTH );
|
|
}
|
|
}
|
|
Q_strupr( s_startserver.maplongname[s_startserver.nummaps] );
|
|
|
|
s_startserver.maprecommended[s_startserver.nummaps] = atoi(Info_ValueForKey( info, "recommended"));
|
|
|
|
s_startserver.mapGamebits[s_startserver.nummaps] = gamebits;
|
|
s_startserver.nummaps++;
|
|
}
|
|
s_startserver.maxpages = (s_startserver.nummaps + MAX_MAPSPERPAGE-1)/MAX_MAPSPERPAGE;
|
|
s_startserver.page = 0;
|
|
s_startserver.currentmap = 0;
|
|
|
|
StartServer_Settings();
|
|
|
|
StartServer_Update();
|
|
|
|
// Zero these bad boys out.
|
|
trap_Cvar_SetValue( "g_pModAssimilation", 0);
|
|
trap_Cvar_SetValue( "g_pModActionHero", 0);
|
|
trap_Cvar_SetValue( "g_pModDisintegration", 0);
|
|
trap_Cvar_SetValue( "g_pModElimination", 0);
|
|
trap_Cvar_SetValue( "g_pModSpecialties", 0);
|
|
|
|
StartServerSetModButtons();
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
GetStartServerMods
|
|
=================
|
|
*/
|
|
void GetStartServerMods(void)
|
|
{
|
|
|
|
s_startserver.assimilation.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModAssimilation"));
|
|
|
|
s_startserver.disintegration.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModDisintegration"));
|
|
|
|
s_startserver.actionhero.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModActionHero"));
|
|
|
|
s_startserver.specialties.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModSpecialties"));
|
|
|
|
s_startserver.elimination.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModElimination"));
|
|
|
|
s_startserver.assimilation.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModAssimilation"));
|
|
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
SetServerButtons - where buttons are turned on/off or activated/grayed
|
|
=================
|
|
*/
|
|
void SetServerButtons(int gameType,menulist_s *assimilation,menulist_s *specialties,menulist_s *disintegration,menulist_s *elimination,menulist_s *actionhero)
|
|
{
|
|
|
|
//Lots of checks because NULL could be sent for one of the buttons
|
|
|
|
if (gameType == GT_TEAM )
|
|
{
|
|
if (assimilation)
|
|
{
|
|
assimilation->generic.flags &= ~QMF_HIDDEN;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (assimilation)
|
|
{
|
|
assimilation->generic.flags |= QMF_HIDDEN;
|
|
}
|
|
}
|
|
|
|
// Set elimination button
|
|
if (gameType < GT_CTF )
|
|
{
|
|
if (elimination)
|
|
{
|
|
elimination->generic.flags &= ~QMF_HIDDEN;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (elimination)
|
|
{
|
|
elimination->generic.flags |= QMF_HIDDEN;
|
|
}
|
|
}
|
|
|
|
// Set action hero button
|
|
if (gameType < GT_TEAM )
|
|
{
|
|
if (actionhero)
|
|
{
|
|
actionhero->generic.flags &= ~QMF_HIDDEN;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (actionhero)
|
|
{
|
|
actionhero->generic.flags |= QMF_HIDDEN;
|
|
}
|
|
}
|
|
|
|
// Ungray everything
|
|
if (actionhero)
|
|
{
|
|
actionhero->generic.flags &= ~QMF_GRAYED;
|
|
}
|
|
if (assimilation)
|
|
{
|
|
assimilation->generic.flags &= ~QMF_GRAYED;
|
|
}
|
|
if (disintegration)
|
|
{
|
|
disintegration->generic.flags &= ~QMF_GRAYED;
|
|
}
|
|
if (elimination)
|
|
{
|
|
elimination->generic.flags &= ~QMF_GRAYED;
|
|
}
|
|
if (specialties)
|
|
{
|
|
specialties->generic.flags &= ~QMF_GRAYED;
|
|
}
|
|
|
|
// If action hero is ON
|
|
if (actionhero)
|
|
{
|
|
if (actionhero->curvalue==1)
|
|
{ // Gray these out
|
|
if (assimilation)
|
|
{
|
|
assimilation->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (disintegration)
|
|
{
|
|
disintegration->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (elimination)
|
|
{
|
|
elimination->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (specialties)
|
|
{
|
|
specialties->generic.flags |= QMF_GRAYED;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If assimilation is ON
|
|
if (assimilation)
|
|
{
|
|
if (assimilation->curvalue==1)
|
|
{
|
|
if (actionhero)
|
|
{
|
|
actionhero->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (disintegration)
|
|
{
|
|
disintegration->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (elimination)
|
|
{
|
|
elimination->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (specialties)
|
|
{
|
|
specialties->generic.flags |= QMF_GRAYED;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If disintegration is ON
|
|
if (disintegration)
|
|
{
|
|
if (disintegration->curvalue==1)
|
|
{
|
|
if (actionhero)
|
|
{
|
|
actionhero->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (assimilation)
|
|
{
|
|
assimilation->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (specialties)
|
|
{
|
|
specialties->generic.flags |= QMF_GRAYED;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If elimination is ON
|
|
if (elimination)
|
|
{
|
|
if (elimination->curvalue==1)
|
|
{
|
|
if (actionhero)
|
|
{
|
|
actionhero->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (assimilation)
|
|
{
|
|
assimilation->generic.flags |= QMF_GRAYED;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If specialties is ON
|
|
if (specialties)
|
|
{
|
|
if (specialties->curvalue==1)
|
|
{
|
|
if (assimilation)
|
|
{
|
|
assimilation->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (actionhero)
|
|
{
|
|
actionhero->generic.flags |= QMF_GRAYED;
|
|
}
|
|
if (disintegration)
|
|
{
|
|
disintegration->generic.flags |= QMF_GRAYED;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//
|
|
// Where all the mods are set up
|
|
//
|
|
/*
|
|
=================
|
|
ServerGameMods - where game mod rules are
|
|
=================
|
|
*/
|
|
void ServerGameMods(int gametype,int *pModAssimilation,int *pModSpecialties,int *pModDisintegration,int *pModElimination,int *pModActionHero)
|
|
{
|
|
//Check gametype first
|
|
// Check assimilation
|
|
if ( gametype != GT_TEAM )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModAssimilation", 0);
|
|
}
|
|
|
|
// Check elimination
|
|
if ( gametype >= GT_CTF )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModElimination", 0);
|
|
}
|
|
|
|
// Check action hero
|
|
if ( gametype >= GT_TEAM )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModActionHero", 0);
|
|
}
|
|
|
|
//now get these game mod values again
|
|
*pModAssimilation = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModAssimilation"));
|
|
*pModDisintegration = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModDisintegration"));
|
|
*pModActionHero = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModActionHero"));
|
|
*pModSpecialties = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModSpecialties"));
|
|
*pModElimination = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_pModElimination"));
|
|
|
|
|
|
//now check gamemods
|
|
|
|
// Check Assimilation
|
|
if ( *pModAssimilation )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModDisintegration", 0);
|
|
trap_Cvar_SetValue( "g_pModElimination", 0);
|
|
trap_Cvar_SetValue( "g_pModActionHero", 0);
|
|
trap_Cvar_SetValue( "g_pModSpecialties", 0);
|
|
}
|
|
|
|
// Check Specialties
|
|
if ( *pModSpecialties )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModDisintegration", 0);
|
|
trap_Cvar_SetValue( "g_pModActionHero", 0);
|
|
trap_Cvar_SetValue( "g_pModAssimilation", 0);
|
|
}
|
|
|
|
// Check Disintegration
|
|
if ( *pModDisintegration )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModAssimilation", 0);
|
|
trap_Cvar_SetValue( "g_pModActionHero", 0);
|
|
trap_Cvar_SetValue( "g_pModSpecialties", 0);
|
|
}
|
|
|
|
// Check Elimination
|
|
if ( *pModElimination )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModAssimilation", 0);
|
|
trap_Cvar_SetValue( "g_pModActionHero", 0);
|
|
}
|
|
|
|
// Check Action Hero
|
|
if ( *pModActionHero )
|
|
{
|
|
trap_Cvar_SetValue( "g_pModAssimilation", 0);
|
|
trap_Cvar_SetValue( "g_pModSpecialties", 0);
|
|
trap_Cvar_SetValue( "g_pModElimination", 0);
|
|
trap_Cvar_SetValue( "g_pModDisintegration", 0);
|
|
}
|
|
|
|
}
|
|
|
|
// Calls for the StartServer screen
|
|
void StartServerSetModButtons(void)
|
|
{
|
|
ServerGameMods(gametype_remap[s_startserver.gametype.curvalue],
|
|
&s_startserver.assimilation.curvalue,
|
|
&s_startserver.specialties.curvalue,
|
|
&s_startserver.disintegration.curvalue,
|
|
&s_startserver.elimination.curvalue,
|
|
&s_startserver.actionhero.curvalue);
|
|
|
|
SetServerButtons(gametype_remap[s_startserver.gametype.curvalue],
|
|
&s_startserver.assimilation,
|
|
&s_startserver.specialties,
|
|
&s_startserver.disintegration,
|
|
&s_startserver.elimination,
|
|
&s_startserver.actionhero);
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
StartServer_MenuEvent
|
|
=================
|
|
*/
|
|
static void StartServer_MenuEvent( void* ptr, int event ) {
|
|
if( event != QM_ACTIVATED ) {
|
|
return;
|
|
}
|
|
|
|
switch( ((menucommon_s*)ptr)->id ) {
|
|
case ID_PMOD_ASSIMILIATION:
|
|
trap_Cvar_SetValue( "g_pModAssimilation", s_startserver.assimilation.curvalue);
|
|
|
|
StartServerSetModButtons();
|
|
|
|
break;
|
|
|
|
case ID_PMOD_DISINTEGRATION:
|
|
trap_Cvar_SetValue( "g_pModDisintegration", s_startserver.disintegration.curvalue);
|
|
|
|
StartServerSetModButtons();
|
|
|
|
break;
|
|
case ID_PMOD_ACTIONHERO:
|
|
|
|
trap_Cvar_SetValue( "g_pModActionHero", s_startserver.actionhero.curvalue);
|
|
|
|
StartServerSetModButtons();
|
|
|
|
break;
|
|
case ID_PMOD_SPECIALTIES:
|
|
trap_Cvar_SetValue( "g_pModSpecialties", s_startserver.specialties.curvalue);
|
|
|
|
StartServerSetModButtons();
|
|
|
|
break;
|
|
case ID_PMOD_ELIMINATION:
|
|
trap_Cvar_SetValue( "g_pModElimination", s_startserver.elimination.curvalue);
|
|
|
|
StartServerSetModButtons();
|
|
break;
|
|
case ID_PREVPAGE:
|
|
if( s_startserver.page > 0 ) {
|
|
s_startserver.page--;
|
|
StartServer_Update();
|
|
}
|
|
break;
|
|
|
|
case ID_NEXTPAGE:
|
|
if( s_startserver.page < s_startserver.maxpages - 1 ) {
|
|
s_startserver.page++;
|
|
StartServer_Update();
|
|
}
|
|
break;
|
|
|
|
case ID_STARTSERVERNEXT:
|
|
SetPlayerMod();
|
|
trap_Cvar_SetValue( "g_gameType", gametype_remap[s_startserver.gametype.curvalue] );
|
|
UI_ServerOptionsMenu( s_startserver.multiplayer );
|
|
break;
|
|
|
|
case ID_STARTSERVERBACK:
|
|
UI_PopMenu();
|
|
break;
|
|
|
|
case ID_MAINMENU:
|
|
UI_PopMenu();
|
|
UI_MainMenu();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
===============
|
|
StartServer_LevelshotDraw
|
|
===============
|
|
*/
|
|
static void StartServer_LevelshotDraw( void *self ) {
|
|
menubitmap_s *b;
|
|
int x;
|
|
int y;
|
|
int n;
|
|
int color = CT_DKGOLD1;
|
|
|
|
b = (menubitmap_s *)self;
|
|
|
|
if( !b->generic.name ) {
|
|
return;
|
|
}
|
|
|
|
if( b->generic.name && !b->shader ) {
|
|
b->shader = trap_R_RegisterShaderNoMip( b->generic.name );
|
|
if( !b->shader && b->errorpic ) {
|
|
b->shader = trap_R_RegisterShaderNoMip( b->errorpic );
|
|
}
|
|
}
|
|
|
|
if( b->focuspic && !b->focusshader ) {
|
|
b->focusshader = trap_R_RegisterShaderNoMip( b->focuspic );
|
|
}
|
|
|
|
x = b->generic.x;
|
|
y = b->generic.y;
|
|
if( b->shader ) {
|
|
UI_DrawHandlePic( x, y, b->width, b->height, b->shader );
|
|
}
|
|
|
|
n = (s_startserver.page * MAX_MAPSPERPAGE) + (b->generic.id - ID_PICTURES);
|
|
if (n == s_startserver.currentmap)
|
|
{
|
|
color = CT_LTGOLD1;
|
|
}
|
|
|
|
|
|
y += b->height;
|
|
|
|
x += b->width / 2;
|
|
y += 4;
|
|
|
|
UI_DrawProportionalString( x, y, s_startserver.maplongname[n], UI_CENTER|UI_TINYFONT, colorTable[CT_WHITE] );
|
|
UI_DrawProportionalString( x, y+12, s_startserver.maplist[n], UI_CENTER|UI_TINYFONT, colorTable[CT_LTGOLD1] );
|
|
|
|
x = b->generic.x;
|
|
y = b->generic.y;
|
|
if( b->generic.flags & QMF_HIGHLIGHT ) {
|
|
UI_DrawHandlePic( x, y, b->width, b->height + 28, b->focusshader );
|
|
}
|
|
}
|
|
|
|
#define START_X_POS 150 //25
|
|
/*
|
|
=================
|
|
StartServer_Graphics
|
|
=================
|
|
*/
|
|
void StartServer_Graphics (void)
|
|
{
|
|
int x;
|
|
|
|
UI_MenuFrame2(&s_startserver.menu);
|
|
|
|
// trap_R_SetColor( colorTable[CT_DKBROWN1]);
|
|
// UI_DrawHandlePic(30,331, 47, 58, uis.whiteShader);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTBROWN1]);
|
|
UI_DrawHandlePic(30,203, 47, 186, uis.whiteShader); // Middle left line
|
|
UI_DrawProportionalString( 74, 150, "5164",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
//trap_R_SetColor( colorTable[CT_BLACK]);
|
|
//UI_DrawHandlePic(30,55, 47, 280, uis.whiteShader);
|
|
|
|
// Level pics frame
|
|
trap_R_SetColor( colorTable[CT_DKBROWN1]);
|
|
|
|
x = START_X_POS;
|
|
|
|
UI_DrawProportionalString( 74, 30, "6801",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 207, "615222",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
// Left rounded ends for buttons
|
|
trap_R_SetColor( colorTable[s_startserver.mainmenu.color]);
|
|
UI_DrawHandlePic(s_startserver.mainmenu.generic.x - 14, s_startserver.mainmenu.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[s_startserver.back.color]);
|
|
UI_DrawHandlePic(s_startserver.back.generic.x - 14, s_startserver.back.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKBROWN1]);
|
|
//UI_DrawHandlePic(s_startserver.assimilation.generic.x - 24, 56, 170, 18, uis.whiteShader); // Top
|
|
//UI_DrawHandlePic(s_startserver.assimilation.generic.x - 34, 46,32, -32,s_startserver.corner_ll);
|
|
//UI_DrawHandlePic(s_startserver.assimilation.generic.x - 34, 64, 18, 278, uis.whiteShader); // Side
|
|
//UI_DrawProportionalString( s_startserver.assimilation.generic.x, 57, menu_normal_text[MNT_PARAMETERS],UI_SMALLFONT, colorTable[CT_BLACK]);
|
|
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
|
|
//left bracket 'round server icons
|
|
UI_DrawHandlePic(129 ,65, 16, 16, uis.graphicBracket1CornerLU);
|
|
UI_DrawHandlePic(129, 81, 8, 276, uis.whiteShader);
|
|
UI_DrawHandlePic(129,357, 16, -16, uis.graphicBracket1CornerLU);
|
|
|
|
//right bracket
|
|
UI_DrawHandlePic(565 ,65, -16, 16, uis.graphicBracket1CornerLU);
|
|
UI_DrawHandlePic(573, 81, 8, 276, uis.whiteShader);
|
|
UI_DrawHandlePic(565,357, -16, -16, uis.graphicBracket1CornerLU);
|
|
}
|
|
|
|
static void MapName_Draw( void *self )
|
|
{
|
|
if (!Q_stricmp(s_startserver.mapname.string,menu_normal_text[MNT_NOMAPSFOUND]))
|
|
{
|
|
UI_DrawProportionalString( s_startserver.mapname.generic.x, s_startserver.mapname.generic.y,
|
|
s_startserver.mapname.string,s_startserver.mapname.style, s_startserver.mapname.color);
|
|
}
|
|
else
|
|
{
|
|
UI_DrawProportionalString( s_startserver.mapname.generic.x, s_startserver.mapname.generic.y,
|
|
s_startserver.maplongname[s_startserver.currentmap],s_startserver.mapname.style, s_startserver.mapname.color);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/*
|
|
=================
|
|
StartServer_MenuDraw
|
|
=================
|
|
*/
|
|
static void StartServer_MenuDraw( void )
|
|
{
|
|
StartServer_Graphics();
|
|
|
|
Menu_Draw( &s_startserver.menu );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
StartServer_MenuInit
|
|
=================
|
|
*/
|
|
static void StartServer_MenuInit(int multiplayer) {
|
|
int i;
|
|
int x;
|
|
int y,pad;
|
|
static char mapnamebuffer[64];
|
|
int picWidth,picHeight;
|
|
|
|
// zero set all our globals
|
|
memset( &s_startserver, 0 ,sizeof(startserver_t) );
|
|
|
|
s_startserver.multiplayer = multiplayer;
|
|
|
|
StartServer_Cache();
|
|
|
|
s_startserver.menu.wrapAround = qtrue;
|
|
s_startserver.menu.fullscreen = qtrue;
|
|
s_startserver.menu.draw = StartServer_MenuDraw;
|
|
s_startserver.menu.descX = MENU_DESC_X;
|
|
s_startserver.menu.descY = MENU_DESC_Y;
|
|
s_startserver.menu.titleX = MENU_TITLE_X;
|
|
s_startserver.menu.titleY = MENU_TITLE_Y;
|
|
|
|
if (s_startserver.multiplayer)
|
|
{
|
|
s_startserver.menu.titleI = MNT_MULTIPLAYER_TITLE;
|
|
}
|
|
else
|
|
{
|
|
s_startserver.menu.titleI = MNT_SINGLEPLAYER_TITLE;
|
|
}
|
|
s_startserver.menu.footNoteEnum = MNT_CREATESERVER;
|
|
|
|
s_startserver.mainmenu.generic.type = MTYPE_BITMAP;
|
|
s_startserver.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.mainmenu.generic.x = 110;
|
|
s_startserver.mainmenu.generic.y = 391;
|
|
s_startserver.mainmenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_startserver.mainmenu.generic.id = ID_MAINMENU;
|
|
s_startserver.mainmenu.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.mainmenu.width = MENU_BUTTON_MED_WIDTH;
|
|
s_startserver.mainmenu.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_startserver.mainmenu.color = CT_DKPURPLE1;
|
|
s_startserver.mainmenu.color2 = CT_LTPURPLE1;
|
|
s_startserver.mainmenu.textX = 5;
|
|
s_startserver.mainmenu.textY = 2;
|
|
s_startserver.mainmenu.textEnum = MBT_MAINMENU;
|
|
s_startserver.mainmenu.textcolor = CT_BLACK;
|
|
s_startserver.mainmenu.textcolor2 = CT_WHITE;
|
|
|
|
s_startserver.back.generic.type = MTYPE_BITMAP;
|
|
s_startserver.back.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.back.generic.x = 110;
|
|
s_startserver.back.generic.y = 415;
|
|
s_startserver.back.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_startserver.back.generic.id = ID_STARTSERVERBACK;
|
|
s_startserver.back.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.back.width = MENU_BUTTON_MED_WIDTH;
|
|
s_startserver.back.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_startserver.back.color = CT_DKPURPLE1;
|
|
s_startserver.back.color2 = CT_LTPURPLE1;
|
|
s_startserver.back.textX = 5;
|
|
s_startserver.back.textY = 2;
|
|
s_startserver.back.textEnum = MBT_BACK;
|
|
s_startserver.back.textcolor = CT_BLACK;
|
|
s_startserver.back.textcolor2 = CT_WHITE;
|
|
|
|
s_startserver.gametype.generic.type = MTYPE_SPINCONTROL;
|
|
s_startserver.gametype.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.gametype.generic.callback = StartServer_GametypeEvent;
|
|
s_startserver.gametype.generic.id = ID_GAMETYPE;
|
|
s_startserver.gametype.generic.x = 249;
|
|
s_startserver.gametype.generic.y = 353;
|
|
s_startserver.gametype.textEnum = MBT_GAMETYPE;
|
|
s_startserver.gametype.textcolor = CT_BLACK;
|
|
s_startserver.gametype.textcolor2 = CT_WHITE;
|
|
s_startserver.gametype.color = CT_DKPURPLE1;
|
|
s_startserver.gametype.color2 = CT_LTPURPLE1;
|
|
s_startserver.gametype.width = 80;
|
|
s_startserver.gametype.textX = 5;
|
|
s_startserver.gametype.textY = 2;
|
|
s_startserver.gametype.listnames = gametype_items;
|
|
|
|
x = 475;
|
|
y = 90;
|
|
pad = 30;
|
|
s_startserver.assimilation.generic.type = MTYPE_SPINCONTROL;
|
|
s_startserver.assimilation.generic.name = "menu/common/bar1.tga";
|
|
s_startserver.assimilation.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.assimilation.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.assimilation.generic.id = ID_PMOD_ASSIMILIATION;
|
|
s_startserver.assimilation.generic.x = x;
|
|
s_startserver.assimilation.generic.y = y;
|
|
s_startserver.assimilation.textEnum = MBT_ASSIMILATION;
|
|
s_startserver.assimilation.textcolor = CT_BLACK;
|
|
s_startserver.assimilation.textcolor2 = CT_WHITE;
|
|
s_startserver.assimilation.color = CT_DKPURPLE1;
|
|
s_startserver.assimilation.color2 = CT_LTPURPLE1;
|
|
s_startserver.assimilation.width = 80;
|
|
s_startserver.assimilation.textX = 5;
|
|
s_startserver.assimilation.textY = 2;
|
|
s_startserver.assimilation.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
s_startserver.specialties.generic.type = MTYPE_SPINCONTROL;
|
|
s_startserver.specialties.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.specialties.generic.x = x;
|
|
s_startserver.specialties.generic.y = y;
|
|
s_startserver.specialties.generic.name = "menu/common/bar1.tga";
|
|
s_startserver.specialties.generic.id = ID_PMOD_SPECIALTIES;
|
|
s_startserver.specialties.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.specialties.color = CT_DKPURPLE1;
|
|
s_startserver.specialties.color2 = CT_LTPURPLE1;
|
|
s_startserver.specialties.textX = MENU_BUTTON_TEXT_X;
|
|
s_startserver.specialties.textY = MENU_BUTTON_TEXT_Y;
|
|
s_startserver.specialties.textEnum = MBT_SPECIALTIES;
|
|
s_startserver.specialties.textcolor = CT_BLACK;
|
|
s_startserver.specialties.textcolor2 = CT_WHITE;
|
|
s_startserver.specialties.listnames = s_OffOnNone_Names;
|
|
s_startserver.specialties.width = 80;
|
|
|
|
y += pad;
|
|
s_startserver.disintegration.generic.type = MTYPE_SPINCONTROL;
|
|
s_startserver.disintegration.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.disintegration.generic.x = x;
|
|
s_startserver.disintegration.generic.y = y;
|
|
s_startserver.disintegration.generic.name = "menu/common/bar1.tga";
|
|
s_startserver.disintegration.generic.id = ID_PMOD_DISINTEGRATION;
|
|
s_startserver.disintegration.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.disintegration.color = CT_DKPURPLE1;
|
|
s_startserver.disintegration.color2 = CT_LTPURPLE1;
|
|
s_startserver.disintegration.textX = MENU_BUTTON_TEXT_X;
|
|
s_startserver.disintegration.textY = MENU_BUTTON_TEXT_Y;
|
|
s_startserver.disintegration.textEnum = MBT_DISINTEGRATION;
|
|
s_startserver.disintegration.textcolor = CT_BLACK;
|
|
s_startserver.disintegration.textcolor2 = CT_WHITE;
|
|
s_startserver.disintegration.listnames = s_OffOnNone_Names;
|
|
s_startserver.disintegration.width = 80;
|
|
|
|
y += pad;
|
|
s_startserver.elimination.generic.type = MTYPE_SPINCONTROL;
|
|
s_startserver.elimination.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.elimination.generic.x = x;
|
|
s_startserver.elimination.generic.y = y;
|
|
s_startserver.elimination.generic.name = "menu/common/bar1.tga";
|
|
s_startserver.elimination.generic.id = ID_PMOD_ELIMINATION;
|
|
s_startserver.elimination.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.elimination.color = CT_DKPURPLE1;
|
|
s_startserver.elimination.color2 = CT_LTPURPLE1;
|
|
s_startserver.elimination.textX = MENU_BUTTON_TEXT_X;
|
|
s_startserver.elimination.textY = MENU_BUTTON_TEXT_Y;
|
|
s_startserver.elimination.textEnum = MBT_ELIMINATION;
|
|
s_startserver.elimination.textcolor = CT_BLACK;
|
|
s_startserver.elimination.textcolor2 = CT_WHITE;
|
|
s_startserver.elimination.listnames = s_OffOnNone_Names;
|
|
s_startserver.elimination.width = 80;
|
|
|
|
y += pad;
|
|
s_startserver.actionhero.generic.type = MTYPE_SPINCONTROL;
|
|
s_startserver.actionhero.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.actionhero.generic.x = x;
|
|
s_startserver.actionhero.generic.y = y;
|
|
s_startserver.actionhero.generic.name = "menu/common/bar1.tga";
|
|
s_startserver.actionhero.generic.id = ID_PMOD_ACTIONHERO;
|
|
s_startserver.actionhero.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.actionhero.color = CT_DKPURPLE1;
|
|
s_startserver.actionhero.color2 = CT_LTPURPLE1;
|
|
s_startserver.actionhero.textX = MENU_BUTTON_TEXT_X;
|
|
s_startserver.actionhero.textY = MENU_BUTTON_TEXT_Y;
|
|
s_startserver.actionhero.textEnum = MBT_ACTIONHERO;
|
|
s_startserver.actionhero.textcolor = CT_BLACK;
|
|
s_startserver.actionhero.textcolor2 = CT_WHITE;
|
|
s_startserver.actionhero.listnames = s_OffOnNone_Names;
|
|
s_startserver.actionhero.width = 80;
|
|
|
|
picWidth = 128;
|
|
picHeight = 96;
|
|
|
|
y = 83;
|
|
x = START_X_POS + 5;
|
|
for (i=0; i<MAX_MAPSPERPAGE; i++)
|
|
{
|
|
s_startserver.mappics[i].generic.type = MTYPE_BITMAP;
|
|
s_startserver.mappics[i].generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
|
|
s_startserver.mappics[i].generic.x = x;
|
|
s_startserver.mappics[i].generic.y = y;
|
|
s_startserver.mappics[i].generic.id = ID_PICTURES+i;
|
|
s_startserver.mappics[i].width = picWidth;
|
|
s_startserver.mappics[i].height = picHeight;
|
|
s_startserver.mappics[i].focuspic = GAMESERVER_SELECTED;
|
|
s_startserver.mappics[i].errorpic = GAMESERVER_UNKNOWNMAP;
|
|
s_startserver.mappics[i].generic.ownerdraw = StartServer_LevelshotDraw;
|
|
|
|
s_startserver.mapbuttons[i].generic.type = MTYPE_BITMAP;
|
|
s_startserver.mapbuttons[i].generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_NODEFAULTINIT;
|
|
s_startserver.mapbuttons[i].generic.id = ID_PICTURES+i;
|
|
s_startserver.mapbuttons[i].generic.callback = StartServer_MapEvent;
|
|
s_startserver.mapbuttons[i].generic.x = x - 30;
|
|
s_startserver.mapbuttons[i].generic.y = y - 32;
|
|
s_startserver.mapbuttons[i].width = 253;
|
|
s_startserver.mapbuttons[i].height = 247;
|
|
s_startserver.mapbuttons[i].generic.left = x;
|
|
s_startserver.mapbuttons[i].generic.top = y;
|
|
s_startserver.mapbuttons[i].generic.right = x + 128;
|
|
s_startserver.mapbuttons[i].generic.bottom = y + 128;
|
|
s_startserver.mapbuttons[i].focuspic = GAMESERVER_SELECT;
|
|
|
|
x += (picWidth+8);
|
|
|
|
if (i==2)
|
|
{
|
|
y += 130;
|
|
x = START_X_POS + 5;
|
|
}
|
|
}
|
|
|
|
s_startserver.prevpage.generic.type = MTYPE_BITMAP;
|
|
s_startserver.prevpage.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.prevpage.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.prevpage.generic.name = "menu/common/arrow_left_16.tga";
|
|
s_startserver.prevpage.generic.id = ID_PREVPAGE;
|
|
s_startserver.prevpage.generic.x = START_X_POS + 82; //114 //94
|
|
s_startserver.prevpage.generic.y = 347;
|
|
s_startserver.prevpage.width = 16;
|
|
s_startserver.prevpage.height = 16;
|
|
s_startserver.prevpage.color = CT_DKGOLD1;
|
|
s_startserver.prevpage.color2 = CT_LTGOLD1;
|
|
s_startserver.prevpage.textX = MENU_BUTTON_TEXT_X;
|
|
s_startserver.prevpage.textY = MENU_BUTTON_TEXT_Y;
|
|
s_startserver.prevpage.textEnum = MBT_PREVMAPS;
|
|
s_startserver.prevpage.textcolor = CT_BLACK;
|
|
s_startserver.prevpage.textcolor2 = CT_WHITE;
|
|
|
|
s_startserver.nextpage.generic.type = MTYPE_BITMAP;
|
|
s_startserver.nextpage.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.nextpage.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.nextpage.generic.name = "menu/common/arrow_right_16.tga";
|
|
s_startserver.nextpage.generic.id = ID_NEXTPAGE;
|
|
s_startserver.nextpage.generic.x = START_X_POS + 310; //342
|
|
s_startserver.nextpage.generic.y = 347;
|
|
s_startserver.nextpage.width = 16;
|
|
s_startserver.nextpage.height = 16;
|
|
s_startserver.nextpage.color = CT_DKGOLD1;
|
|
s_startserver.nextpage.color2 = CT_LTGOLD1;
|
|
s_startserver.nextpage.textX = MENU_BUTTON_TEXT_X;
|
|
s_startserver.nextpage.textY = MENU_BUTTON_TEXT_Y;
|
|
s_startserver.nextpage.textEnum = MBT_NEXTMAPS;
|
|
s_startserver.nextpage.textcolor = CT_BLACK;
|
|
s_startserver.nextpage.textcolor2 = CT_WHITE;
|
|
|
|
s_startserver.mapname.generic.type = MTYPE_PTEXT;
|
|
s_startserver.mapname.generic.flags = QMF_INACTIVE;
|
|
s_startserver.mapname.generic.x = START_X_POS + 205;
|
|
s_startserver.mapname.generic.y = 347;
|
|
s_startserver.mapname.string = mapnamebuffer;
|
|
s_startserver.mapname.style = UI_SMALLFONT | UI_CENTER;
|
|
s_startserver.mapname.color = colorTable[CT_WHITE];
|
|
s_startserver.mapname.generic.ownerdraw = MapName_Draw;
|
|
|
|
s_startserver.next.generic.type = MTYPE_BITMAP;
|
|
s_startserver.next.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_startserver.next.generic.callback = StartServer_MenuEvent;
|
|
s_startserver.next.generic.name = "menu/common/square.tga";
|
|
s_startserver.next.generic.id = ID_STARTSERVERNEXT;
|
|
s_startserver.next.generic.x = 462;
|
|
s_startserver.next.generic.y = 391;
|
|
s_startserver.next.width = 150;
|
|
s_startserver.next.height = 42;
|
|
s_startserver.next.color = CT_DKPURPLE1;
|
|
s_startserver.next.color2 = CT_LTPURPLE1;
|
|
s_startserver.next.textX = MENU_BUTTON_TEXT_X + 5;
|
|
s_startserver.next.textY = MENU_BUTTON_TEXT_Y + 2;
|
|
s_startserver.next.textEnum = MBT_SETPARAMETERS;
|
|
s_startserver.next.textcolor = CT_BLACK;
|
|
s_startserver.next.textcolor2 = CT_WHITE;
|
|
|
|
s_startserver.item_null.generic.type = MTYPE_BITMAP;
|
|
s_startserver.item_null.generic.flags = QMF_LEFT_JUSTIFY|QMF_MOUSEONLY|QMF_SILENT;
|
|
s_startserver.item_null.generic.x = 0;
|
|
s_startserver.item_null.generic.y = 0;
|
|
s_startserver.item_null.width = 640;
|
|
s_startserver.item_null.height = 480;
|
|
|
|
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.mainmenu );
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.back );
|
|
// Menu_AddItem( &s_startserver.menu, &s_startserver.gametype );
|
|
for (i=0; i<MAX_MAPSPERPAGE; i++)
|
|
{
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.mappics[i] );
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.mapbuttons[i] );
|
|
}
|
|
|
|
// if (ui_cdkeychecked2.integer == 1)
|
|
// {
|
|
// Menu_AddItem( &s_startserver.menu, &s_startserver.assimilation );
|
|
// Menu_AddItem( &s_startserver.menu, &s_startserver.specialties );
|
|
// Menu_AddItem( &s_startserver.menu, &s_startserver.disintegration );
|
|
// Menu_AddItem( &s_startserver.menu, &s_startserver.elimination );
|
|
// Menu_AddItem( &s_startserver.menu, &s_startserver.actionhero );
|
|
// }
|
|
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.prevpage );
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.nextpage );
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.next );
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.mapname );
|
|
Menu_AddItem( &s_startserver.menu, &s_startserver.item_null );
|
|
|
|
GetStartServerMods();
|
|
|
|
StartServer_Settings();
|
|
|
|
StartServer_GametypeEvent( NULL, QM_ACTIVATED );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
StartServer_Cache
|
|
=================
|
|
*/
|
|
void StartServer_Cache( void )
|
|
{
|
|
int i;
|
|
const char *info;
|
|
qboolean precache;
|
|
char picname[64];
|
|
|
|
trap_R_RegisterShaderNoMip( GAMESERVER_SELECT );
|
|
trap_R_RegisterShaderNoMip( GAMESERVER_SELECTED );
|
|
trap_R_RegisterShaderNoMip( GAMESERVER_UNKNOWNMAP );
|
|
|
|
s_startserver.corner_ll = trap_R_RegisterShaderNoMip("menu/common/corner_ll_18_18.tga");
|
|
s_startserver.corner_lr = trap_R_RegisterShaderNoMip("menu/common/corner_lr_18_18.tga");
|
|
|
|
precache = trap_Cvar_VariableValue("com_buildscript");
|
|
|
|
s_startserver.nummaps = UI_GetNumArenas();
|
|
|
|
for( i = 0; i < s_startserver.nummaps; i++ ) {
|
|
info = UI_GetArenaInfoByNumber( i );
|
|
|
|
Q_strncpyz( s_startserver.maplist[i], Info_ValueForKey( info, "map"), MAX_NAMELENGTH );
|
|
Q_strupr( s_startserver.maplist[i] );
|
|
|
|
s_startserver.mapGamebits[i] = GametypeBits( Info_ValueForKey( info, "type") );
|
|
|
|
if (ui_language.string[0] == 0 || Q_stricmp ("ENGLISH",ui_language.string)==0 ) {
|
|
Q_strncpyz( s_startserver.maplongname[i], Info_ValueForKey( info, "longname"), MAX_NAMELENGTH );
|
|
} else {
|
|
Q_strncpyz( s_startserver.maplongname[i], Info_ValueForKey( info, va("longname_%s",ui_language.string) ), MAX_NAMELENGTH );
|
|
if (!s_startserver.maplongname[i][0]) {
|
|
Q_strncpyz( s_startserver.maplongname[i], Info_ValueForKey( info, "longname"), MAX_NAMELENGTH );
|
|
}
|
|
}
|
|
Q_strupr( s_startserver.maplongname[i] );
|
|
|
|
s_startserver.maprecommended[i] = atoi(Info_ValueForKey( info, "recommended"));
|
|
if( precache ) {
|
|
Com_sprintf( picname, sizeof(picname), "levelshots/%s", s_startserver.maplist[i] );
|
|
trap_R_RegisterShaderNoMip(picname);
|
|
}
|
|
}
|
|
|
|
s_startserver.maxpages = (s_startserver.nummaps + MAX_MAPSPERPAGE-1)/MAX_MAPSPERPAGE;
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_StartServerMenu
|
|
=================
|
|
*/
|
|
void UI_StartServerMenu( qboolean multiplayer )
|
|
{
|
|
StartServer_MenuInit(multiplayer);
|
|
UI_PushMenu( &s_startserver.menu );
|
|
Menu_SetCursorToItem( &s_startserver.menu, &s_startserver.next);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
=============================================================================
|
|
|
|
SERVER OPTIONS MENU *****
|
|
|
|
=============================================================================
|
|
*/
|
|
|
|
|
|
#define PLAYER_SLOTS 12
|
|
|
|
typedef enum
|
|
{
|
|
SO_TEAM_BLUE,
|
|
SO_TEAM_RED,
|
|
SO_NUM_TEAMS
|
|
} soTeamType_t;
|
|
|
|
typedef enum
|
|
{
|
|
SO_PC_INFILTRATOR,
|
|
SO_PC_SNIPER,
|
|
SO_PC_HEAVY,
|
|
SO_PC_DEMO,
|
|
SO_PC_MEDIC,
|
|
SO_PC_TECH,
|
|
SO_NUM_PLAYER_CLASSES
|
|
} soClassType_t;
|
|
|
|
typedef struct {
|
|
menuframework_s menu;
|
|
|
|
menutext_s banner;
|
|
|
|
menubitmap_s mappic;
|
|
|
|
menulist_s dedicated;
|
|
menufield_s timelimit;
|
|
menufield_s fraglimit;
|
|
menufield_s flaglimit;
|
|
menulist_s friendlyfire;
|
|
menufield_s hostname;
|
|
menubitmap_s hostnamebackground1;
|
|
menubitmap_s hostnamebackground2;
|
|
|
|
menulist_s pure;
|
|
menulist_s botSkill;
|
|
|
|
qhandle_t corner_ur_12_18;
|
|
qhandle_t corner_lr_7_12;
|
|
qhandle_t teamShaders[SO_NUM_TEAMS];
|
|
qhandle_t pClassShaders[SO_NUM_PLAYER_CLASSES];
|
|
|
|
menutext_s player0;
|
|
menulist_s playerType[PLAYER_SLOTS];
|
|
menutext_s playerName[PLAYER_SLOTS];
|
|
menulist_s playerTeam[PLAYER_SLOTS];
|
|
menulist_s playerClass[PLAYER_SLOTS];
|
|
|
|
menubitmap_s go;
|
|
menubitmap_s back;
|
|
menubitmap_s mainmenu;
|
|
menubitmap_s advanced;
|
|
|
|
qboolean multiplayer;
|
|
int gametype;
|
|
qboolean specialties;
|
|
char mapnamebuffer[32];
|
|
char playerNameBuffers[PLAYER_SLOTS][16];
|
|
qboolean updatedPlayer;
|
|
int newUpdatedPlayer;
|
|
|
|
qboolean newBot;
|
|
int newBotIndex;
|
|
char newBotName[16];
|
|
|
|
} serveroptions_t;
|
|
|
|
static serveroptions_t s_serveroptions;
|
|
/*
|
|
static const char *dedicated_list[] = {
|
|
"No",
|
|
"LAN",
|
|
"Internet",
|
|
0
|
|
};
|
|
*/
|
|
|
|
static int dedicated_list[] =
|
|
{
|
|
MNT_DEDICATED_NO,
|
|
MNT_DEDICATED_LAN,
|
|
MNT_DEDICATED_INTERNET,
|
|
0
|
|
};
|
|
|
|
/*
|
|
static const char *playerType_list[] = {
|
|
"Open",
|
|
"Bot",
|
|
"----",
|
|
0
|
|
};*/
|
|
|
|
static int playerType_list[] =
|
|
{
|
|
MNT_OPEN,
|
|
MNT_BOT,
|
|
MNT_CLOSED,
|
|
0
|
|
};
|
|
/*
|
|
static const char *playerTeam_list[] = {
|
|
"Blue",
|
|
"Red",
|
|
0
|
|
};
|
|
*/
|
|
static int playerTeam_list[] =
|
|
{
|
|
MNT_TEAM_BLUE,
|
|
MNT_TEAM_RED,
|
|
0
|
|
};
|
|
|
|
static int playerClass_list[] =
|
|
{
|
|
MNT_PC_INFILTRATOR,
|
|
MNT_PC_SNIPER,
|
|
MNT_PC_HEAVY,
|
|
MNT_PC_DEMO,
|
|
MNT_PC_MEDIC,
|
|
MNT_PC_TECH,
|
|
0
|
|
};
|
|
|
|
/*
|
|
static const char *botSkill_list[] =
|
|
{
|
|
"I Can Win",
|
|
"Bring It On",
|
|
"Hurt Me Plenty",
|
|
"Hardcore",
|
|
"Nightmare!",
|
|
0
|
|
};
|
|
*/
|
|
|
|
static int botSkill_list[] =
|
|
{
|
|
MNT_BABYLEVEL,
|
|
MNT_EASYLEVEL,
|
|
MNT_MEDIUMLEVEL,
|
|
MNT_HARDLEVEL,
|
|
MNT_NIGHTMARELEVEL,
|
|
0
|
|
};
|
|
|
|
|
|
/*
|
|
=================
|
|
BotAlreadySelected
|
|
=================
|
|
*/
|
|
static qboolean BotAlreadySelected( const char *checkName ) {
|
|
int n;
|
|
|
|
for( n = 1; n < PLAYER_SLOTS; n++ ) {
|
|
if( s_serveroptions.playerType[n].curvalue != 1 ) {
|
|
continue;
|
|
}
|
|
if( (s_serveroptions.gametype >= GT_TEAM) &&
|
|
(s_serveroptions.playerTeam[n].curvalue != s_serveroptions.playerTeam[s_serveroptions.newBotIndex].curvalue ) ) {
|
|
continue;
|
|
}
|
|
if( ( s_serveroptions.specialties ) &&
|
|
(s_serveroptions.playerClass[n].curvalue != s_serveroptions.playerClass[s_serveroptions.newBotIndex].curvalue ) ) {
|
|
continue;
|
|
}
|
|
if( Q_stricmp( checkName, s_serveroptions.playerNameBuffers[n] ) == 0 ) {
|
|
return qtrue;
|
|
}
|
|
}
|
|
|
|
return qfalse;
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_Start
|
|
=================
|
|
*/
|
|
static void ServerOptions_Start( void ) {
|
|
int timelimit;
|
|
int fraglimit;
|
|
int maxclients,holdMaxClients;
|
|
int dedicated;
|
|
int friendlyfire;
|
|
int flaglimit;
|
|
int pure;
|
|
int skill;
|
|
int n;
|
|
char buf[64];
|
|
|
|
char pClass[MAX_QPATH];
|
|
char pRank[MAX_QPATH];
|
|
|
|
timelimit = atoi( s_serveroptions.timelimit.field.buffer );
|
|
fraglimit = atoi( s_serveroptions.fraglimit.field.buffer );
|
|
flaglimit = atoi( s_serveroptions.flaglimit.field.buffer );
|
|
dedicated = s_serveroptions.dedicated.curvalue;
|
|
friendlyfire = s_serveroptions.friendlyfire.curvalue;
|
|
pure = s_serveroptions.pure.curvalue;
|
|
skill = s_serveroptions.botSkill.curvalue + 1;
|
|
|
|
holdMaxClients = Com_Clamp( 0, 64, trap_Cvar_VariableValue( "sv_maxclients" ));
|
|
|
|
//set maxclients
|
|
for( n = 0, maxclients = 0; n < PLAYER_SLOTS; n++ ) {
|
|
if( s_serveroptions.playerType[n].curvalue == 2 ) {
|
|
continue;
|
|
}
|
|
if( (s_serveroptions.playerType[n].curvalue == 1) && (s_serveroptions.playerNameBuffers[n][0] == 0) ) {
|
|
continue;
|
|
}
|
|
maxclients++;
|
|
}
|
|
|
|
if (holdMaxClients > maxclients)
|
|
{
|
|
maxclients = holdMaxClients;
|
|
}
|
|
|
|
switch( s_serveroptions.gametype ) {
|
|
case GT_FFA:
|
|
default:
|
|
trap_Cvar_SetValue( "ui_ffa_fraglimit", fraglimit );
|
|
trap_Cvar_SetValue( "ui_ffa_timelimit", timelimit );
|
|
break;
|
|
|
|
case GT_TOURNAMENT:
|
|
trap_Cvar_SetValue( "ui_tourney_fraglimit", fraglimit );
|
|
trap_Cvar_SetValue( "ui_tourney_timelimit", timelimit );
|
|
break;
|
|
|
|
case GT_TEAM:
|
|
trap_Cvar_SetValue( "ui_team_fraglimit", fraglimit );
|
|
trap_Cvar_SetValue( "ui_team_timelimit", timelimit );
|
|
trap_Cvar_SetValue( "ui_team_friendly", friendlyfire );
|
|
break;
|
|
|
|
case GT_CTF:
|
|
trap_Cvar_SetValue( "ui_ctf_fraglimit", fraglimit );
|
|
trap_Cvar_SetValue( "ui_ctf_timelimit", timelimit );
|
|
trap_Cvar_SetValue( "ui_ctf_friendly", friendlyfire );
|
|
break;
|
|
}
|
|
|
|
trap_Cvar_SetValue( "sv_maxclients", Com_Clamp( 0, 64, maxclients ) );
|
|
trap_Cvar_SetValue( "dedicated", Com_Clamp( 0, 2, dedicated ) );
|
|
trap_Cvar_SetValue ("timelimit", Com_Clamp( 0, timelimit, timelimit ) );
|
|
trap_Cvar_SetValue ("fraglimit", Com_Clamp( 0, fraglimit, fraglimit ) );
|
|
trap_Cvar_SetValue ("capturelimit", Com_Clamp( 0, flaglimit, flaglimit ) );
|
|
trap_Cvar_SetValue( "g_friendlyfire", friendlyfire );
|
|
trap_Cvar_Set("sv_hostname", s_serveroptions.hostname.field.buffer );
|
|
|
|
if ( dedicated == 0 )
|
|
{
|
|
trap_Cvar_SetValue( "sv_pure", 0 );
|
|
}
|
|
else
|
|
{
|
|
trap_Cvar_SetValue( "sv_pure", pure );
|
|
}
|
|
|
|
// the wait commands will allow the dedicated to take effect
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait ; wait ; map %s\n", s_startserver.maplist[s_startserver.currentmap] ) );
|
|
|
|
// add bots
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, "wait 3\n" );
|
|
for( n = 1; n < PLAYER_SLOTS; n++ ) {
|
|
if( s_serveroptions.playerType[n].curvalue != 1 ) {
|
|
continue;
|
|
}
|
|
if( s_serveroptions.playerNameBuffers[n][0] == 0 ) {
|
|
continue;
|
|
}
|
|
if( s_serveroptions.playerNameBuffers[n][0] == '-' ) {
|
|
continue;
|
|
}
|
|
if( s_serveroptions.gametype >= GT_TEAM ) {
|
|
Com_sprintf( buf, sizeof(buf), "addbot %s %i %s %s\n", s_serveroptions.playerNameBuffers[n], skill,
|
|
menu_normal_text[playerTeam_list[s_serveroptions.playerTeam[n].curvalue]], menu_normal_text[playerClass_list[s_serveroptions.playerClass[n].curvalue]] );
|
|
}
|
|
else {
|
|
Com_sprintf( buf, sizeof(buf), "addbot %s %i free %s\n", s_serveroptions.playerNameBuffers[n], skill, menu_normal_text[playerClass_list[s_serveroptions.playerClass[n].curvalue]] );
|
|
}
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, buf );
|
|
}
|
|
|
|
trap_Cvar_VariableStringBuffer( "ui_playerClass", pClass, MAX_QPATH );
|
|
trap_Cvar_VariableStringBuffer( "ui_playerRank", pRank, MAX_QPATH );
|
|
|
|
// set player's team
|
|
if( dedicated == 0 )
|
|
{
|
|
if ( s_serveroptions.gametype >= GT_TEAM ) {
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait 5; team %s; class %s; rank %s\n", menu_normal_text[playerTeam_list[s_serveroptions.playerTeam[0].curvalue]], pClass, pRank ) );
|
|
}
|
|
else {
|
|
trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait 5; class %s; rank %s \n", pClass, pRank ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_InitPlayerItems
|
|
=================
|
|
*/
|
|
static void ServerOptions_InitPlayerItems( void ) {
|
|
int n;
|
|
int v;
|
|
|
|
// init types
|
|
if( s_serveroptions.multiplayer ) {
|
|
v = 0; // open
|
|
}
|
|
else {
|
|
v = 1; // bot
|
|
}
|
|
|
|
for( n = 0; n < PLAYER_SLOTS; n++ ) {
|
|
s_serveroptions.playerType[n].curvalue = v;
|
|
}
|
|
|
|
if( s_serveroptions.multiplayer && (s_serveroptions.gametype < GT_TEAM) ) {
|
|
for( n = 8; n < PLAYER_SLOTS; n++ ) {
|
|
s_serveroptions.playerType[n].curvalue = 2;
|
|
}
|
|
}
|
|
|
|
// if not a dedicated server, first slot is reserved for the human on the server
|
|
if( s_serveroptions.dedicated.curvalue == 0 )
|
|
{ // human
|
|
char buffer[32];
|
|
s_serveroptions.playerType[0].generic.flags |= QMF_INACTIVE;
|
|
s_serveroptions.playerType[0].curvalue = 0;
|
|
trap_Cvar_VariableStringBuffer( "name", buffer, sizeof(buffer) );
|
|
Q_CleanStr( buffer );
|
|
Q_strncpyz(s_serveroptions.playerNameBuffers[0], buffer, sizeof(s_serveroptions.playerNameBuffers[0]) );
|
|
}
|
|
|
|
// init teams
|
|
if( s_serveroptions.gametype >= GT_TEAM )
|
|
{
|
|
for( n = 0; n < (PLAYER_SLOTS / 2); n++ )
|
|
{
|
|
s_serveroptions.playerTeam[n].curvalue = 0;
|
|
}
|
|
|
|
for( ; n < PLAYER_SLOTS; n++ )
|
|
{
|
|
s_serveroptions.playerTeam[n].curvalue = 1;
|
|
}
|
|
|
|
|
|
}
|
|
else {
|
|
for( n = 0; n < PLAYER_SLOTS; n++ ) {
|
|
s_serveroptions.playerTeam[n].generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
}
|
|
// init classes
|
|
for( n = 0; n < PLAYER_SLOTS; n++ ) {
|
|
s_serveroptions.playerClass[n].curvalue = 0;
|
|
if ( !s_serveroptions.specialties ) {
|
|
s_serveroptions.playerClass[n].generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_SetPlayerItems
|
|
=================
|
|
*/
|
|
static int ServerOptions_SetPlayerItems( void ) {
|
|
int start;
|
|
int n,maxClients,holdmaxClients;
|
|
|
|
// types
|
|
// for( n = 0; n < PLAYER_SLOTS; n++ ) {
|
|
// if( (!s_serveroptions.multiplayer) && (n > 0) && (s_serveroptions.playerType[n].curvalue == 0) ) {
|
|
// s_serveroptions.playerType[n].curvalue = 1;
|
|
// }
|
|
// }
|
|
holdmaxClients = Com_Clamp( 0, 64, trap_Cvar_VariableValue( "sv_maxclients" ));
|
|
|
|
// names
|
|
if( s_serveroptions.dedicated.curvalue == 0 )
|
|
{
|
|
s_serveroptions.player0.string = (char*)menu_normal_text[MNT_HUMAN];
|
|
s_serveroptions.playerName[0].generic.flags &= ~QMF_HIDDEN;
|
|
start = 1;
|
|
}
|
|
else
|
|
{
|
|
s_serveroptions.player0.string = (char*)menu_normal_text[MNT_OPEN];
|
|
start = 0;
|
|
}
|
|
|
|
maxClients = start;
|
|
for( n = start; n < PLAYER_SLOTS; n++ )
|
|
{
|
|
if (s_serveroptions.playerType[n].curvalue < 2)
|
|
{
|
|
maxClients++;
|
|
}
|
|
|
|
if( s_serveroptions.playerType[n].curvalue == 1 )
|
|
{
|
|
s_serveroptions.playerName[n].generic.flags &= ~(QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
else {
|
|
s_serveroptions.playerName[n].generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
}
|
|
|
|
if (maxClients < holdmaxClients)
|
|
{
|
|
maxClients = holdmaxClients;
|
|
}
|
|
|
|
for( n = start; n < PLAYER_SLOTS; n++ ) {
|
|
if( s_serveroptions.playerType[n].curvalue == 2 || !s_serveroptions.specialties ) {
|
|
//specialties not on or... slot closed
|
|
s_serveroptions.playerClass[n].generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
else {
|
|
s_serveroptions.playerClass[n].generic.flags &= ~(QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
}
|
|
|
|
// teams
|
|
if( s_serveroptions.gametype < GT_TEAM ) {
|
|
return(maxClients);
|
|
}
|
|
|
|
for( n = start; n < PLAYER_SLOTS; n++ ) {
|
|
if( s_serveroptions.playerType[n].curvalue == 2 ) {
|
|
s_serveroptions.playerTeam[n].generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
else {
|
|
s_serveroptions.playerTeam[n].generic.flags &= ~(QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
}
|
|
|
|
return(maxClients);
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_Event
|
|
=================
|
|
*/
|
|
static void ServerOptions_Event( void* ptr, int event )
|
|
{
|
|
int maxClients;
|
|
|
|
switch( ((menucommon_s*)ptr)->id ) {
|
|
|
|
case ID_PLAYER_TEAM:
|
|
break;
|
|
|
|
case ID_PLAYER_CLASS:
|
|
break;
|
|
|
|
case ID_PLAYER_TYPE:
|
|
if( event != QM_ACTIVATED ) {
|
|
break;
|
|
}
|
|
maxClients = ServerOptions_SetPlayerItems();
|
|
trap_Cvar_SetValue( "sv_maxclients", maxClients );
|
|
break;
|
|
|
|
case ID_MAXCLIENTS:
|
|
case ID_DEDICATED:
|
|
ServerOptions_SetPlayerItems();
|
|
break;
|
|
|
|
case ID_GO:
|
|
if( event != QM_ACTIVATED ) {
|
|
break;
|
|
}
|
|
ServerOptions_Start();
|
|
break;
|
|
|
|
case ID_BACK:
|
|
if( event != QM_ACTIVATED ) {
|
|
break;
|
|
}
|
|
|
|
UI_PopMenu();
|
|
break;
|
|
|
|
case ID_ADVANCED:
|
|
if( event != QM_ACTIVATED )
|
|
{
|
|
break;
|
|
}
|
|
UI_ServerAdvancedOptions(0);
|
|
break;
|
|
case ID_MAINMENU:
|
|
if( event != QM_ACTIVATED ) {
|
|
break;
|
|
}
|
|
UI_PopMenu();
|
|
UI_MainMenu();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
static void ServerOptions_PlayerNameEvent( void* ptr, int event ) {
|
|
int n;
|
|
|
|
if( event != QM_ACTIVATED )
|
|
{
|
|
return;
|
|
}
|
|
|
|
n = ((menutext_s*)ptr)->generic.id;
|
|
s_serveroptions.newBotIndex = n;
|
|
|
|
if (((n==0) && ( s_serveroptions.dedicated.curvalue == 0 )) || // Player who started server
|
|
(s_serveroptions.playerType[n].curvalue == MNT_OPEN)) // Human player
|
|
{
|
|
s_serveroptions.updatedPlayer = qtrue;
|
|
s_serveroptions.newUpdatedPlayer = n;
|
|
UI_PlayerSettingsMenu(PS_MENU_SINGLEPLAYER);
|
|
}
|
|
else // Choosing a bot name
|
|
{
|
|
UI_BotSelectMenu( s_serveroptions.playerNameBuffers[n] );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_StatusBar
|
|
=================
|
|
*/
|
|
static void ServerOptions_StatusBar( void* ptr )
|
|
{
|
|
UI_DrawProportionalString( 320, 417, menu_normal_text[MNT_NOLIMIT], UI_CENTER|UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
}
|
|
|
|
|
|
/*
|
|
===============
|
|
ServerOptions_LevelshotDraw
|
|
===============
|
|
*/
|
|
static void ServerOptions_LevelshotDraw( void *self ) {
|
|
menubitmap_s *b;
|
|
int x;
|
|
int y;
|
|
|
|
// Map background
|
|
trap_R_SetColor( colorTable[CT_DKGREY]);
|
|
UI_DrawHandlePic( (s_serveroptions.mappic.generic.x - 2), (s_serveroptions.mappic.generic.y - 2), (s_serveroptions.mappic.width + 4), 148, uis.whiteShader);
|
|
|
|
// strange place for this, but it works
|
|
if( s_serveroptions.newBot ) {
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[s_serveroptions.newBotIndex], s_serveroptions.newBotName, 16 );
|
|
s_serveroptions.newBot = qfalse;
|
|
}
|
|
|
|
if (s_serveroptions.updatedPlayer)
|
|
{
|
|
s_serveroptions.updatedPlayer = qfalse;
|
|
trap_Cvar_VariableStringBuffer( "name", s_serveroptions.playerNameBuffers[s_serveroptions.newUpdatedPlayer], 16 );
|
|
}
|
|
|
|
trap_R_SetColor( colorTable[CT_WHITE]);
|
|
b = (menubitmap_s *)self;
|
|
|
|
Bitmap_Draw( b );
|
|
|
|
x = b->generic.x;
|
|
y = b->generic.y + b->height;
|
|
UI_FillRect( x, y, b->width, 24, colorBlack ); //40
|
|
|
|
x += b->width / 2;
|
|
y += 4;
|
|
|
|
UI_DrawProportionalString( x, y+3, s_startserver.maplongname[s_startserver.currentmap], UI_CENTER|UI_TINYFONT, colorTable[CT_WHITE] );
|
|
|
|
y += SMALLCHAR_HEIGHT;
|
|
//UI_DrawProportionalString( x, y, menu_normal_text[gametype_items[gametype_remap2[s_serveroptions.gametype]]], UI_CENTER|UI_SMALLFONT, colorTable[CT_DKBROWN1] );
|
|
|
|
}
|
|
|
|
|
|
static void ServerOptions_InitBotNames( void )
|
|
{
|
|
int count;
|
|
int n;
|
|
const char *arenaInfo;
|
|
const char *botInfo;
|
|
char *p;
|
|
char *bot;
|
|
char bots[MAX_INFO_STRING];
|
|
int max;
|
|
|
|
if ( s_serveroptions.gametype >= GT_TEAM )
|
|
{
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[1], "Janeway", 16 );
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[2], "Seven", 16 );
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[3], "Chakotay", 16 );
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[6], "Paris", 16 );
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[7], "Kim", 16 );
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[8], "Tuvok", 16 );
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[9], "Doctor", 16 );
|
|
s_serveroptions.playerType[4].curvalue = 2;
|
|
s_serveroptions.playerType[5].curvalue = 2;
|
|
s_serveroptions.playerType[10].curvalue = 2;
|
|
s_serveroptions.playerType[11].curvalue = 2;
|
|
return;
|
|
}
|
|
|
|
count = 1; // skip the first slot, reserved for a human
|
|
|
|
// get info for this map
|
|
arenaInfo = UI_GetArenaInfoByMap( s_serveroptions.mapnamebuffer );
|
|
|
|
// get the bot info - we'll seed with them if any are listed
|
|
Q_strncpyz( bots, Info_ValueForKey( arenaInfo, "bots" ), sizeof(bots) );
|
|
p = &bots[0];
|
|
while( *p && count < PLAYER_SLOTS )
|
|
{
|
|
//skip spaces
|
|
while( *p && *p == ' ' )
|
|
{
|
|
p++;
|
|
}
|
|
if( !p )
|
|
{
|
|
break;
|
|
}
|
|
|
|
// mark start of bot name
|
|
bot = p;
|
|
|
|
// skip until space of null
|
|
while( *p && *p != ' ' )
|
|
{
|
|
p++;
|
|
}
|
|
if( *p )
|
|
{
|
|
*p++ = 0;
|
|
}
|
|
|
|
botInfo = UI_GetBotInfoByName( bot );
|
|
bot = Info_ValueForKey( botInfo, "name" );
|
|
|
|
Q_strncpyz( s_serveroptions.playerNameBuffers[count], bot, sizeof(s_serveroptions.playerNameBuffers[count]) );
|
|
count++;
|
|
}
|
|
|
|
max = Com_Clamp( 0, 64, trap_Cvar_VariableValue( "sv_maxclients" ));
|
|
|
|
if (max > PLAYER_SLOTS)
|
|
{
|
|
max = PLAYER_SLOTS;
|
|
}
|
|
|
|
// set the rest of the bot slots to "---"
|
|
for( n = count; n < max; n++ )
|
|
{
|
|
strcpy( s_serveroptions.playerNameBuffers[n], "--------" );
|
|
}
|
|
|
|
// pad up to #8 as open slots
|
|
for( ;count < max; count++ )
|
|
{
|
|
s_serveroptions.playerType[count].curvalue = 0;
|
|
}
|
|
|
|
// close off the rest by default
|
|
for( ;count < PLAYER_SLOTS; count++ )
|
|
{
|
|
// if( s_serveroptions.playerType[count].curvalue == 1 ) {
|
|
s_serveroptions.playerType[count].curvalue = 2;
|
|
// }
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_SetMenuItems
|
|
=================
|
|
*/
|
|
static void ServerOptions_SetMenuItems( void )
|
|
{
|
|
static char picname[64];
|
|
|
|
switch( s_serveroptions.gametype )
|
|
{
|
|
case GT_FFA:
|
|
default:
|
|
Com_sprintf( s_serveroptions.fraglimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 999, trap_Cvar_VariableValue( "ui_ffa_fraglimit" ) ) );
|
|
Com_sprintf( s_serveroptions.timelimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 999, trap_Cvar_VariableValue( "ui_ffa_timelimit" ) ) );
|
|
break;
|
|
|
|
case GT_TOURNAMENT:
|
|
Com_sprintf( s_serveroptions.fraglimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 999, trap_Cvar_VariableValue( "ui_tourney_fraglimit" ) ) );
|
|
Com_sprintf( s_serveroptions.timelimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 999, trap_Cvar_VariableValue( "ui_tourney_timelimit" ) ) );
|
|
break;
|
|
|
|
case GT_TEAM:
|
|
Com_sprintf( s_serveroptions.fraglimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 999, trap_Cvar_VariableValue( "ui_team_fraglimit" ) ) );
|
|
Com_sprintf( s_serveroptions.timelimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 999, trap_Cvar_VariableValue( "ui_team_timelimit" ) ) );
|
|
s_serveroptions.friendlyfire.curvalue = (int)Com_Clamp( 0, 1, trap_Cvar_VariableValue( "ui_team_friendly" ) );
|
|
break;
|
|
|
|
case GT_CTF:
|
|
Com_sprintf( s_serveroptions.flaglimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 100, trap_Cvar_VariableValue( "ui_ctf_capturelimit" ) ) );
|
|
Com_sprintf( s_serveroptions.timelimit.field.buffer, 4, "%i", (int)Com_Clamp( 0, 999, trap_Cvar_VariableValue( "ui_ctf_timelimit" ) ) );
|
|
s_serveroptions.friendlyfire.curvalue = (int)Com_Clamp( 0, 1, trap_Cvar_VariableValue( "ui_ctf_friendly" ) );
|
|
break;
|
|
}
|
|
|
|
Q_strncpyz( s_serveroptions.hostname.field.buffer, UI_Cvar_VariableString( "sv_hostname" ), sizeof( s_serveroptions.hostname.field.buffer ) );
|
|
s_serveroptions.pure.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "sv_pure" ) );
|
|
|
|
|
|
// set the map pic
|
|
Com_sprintf( picname, 64, "levelshots/%s", s_startserver.maplist[s_startserver.currentmap] );
|
|
s_serveroptions.mappic.generic.name = picname;
|
|
|
|
// set the map name
|
|
strcpy( s_serveroptions.mapnamebuffer, s_startserver.mapname.string );
|
|
Q_strupr( s_serveroptions.mapnamebuffer );
|
|
|
|
// get the player selections initialized
|
|
ServerOptions_InitPlayerItems();
|
|
ServerOptions_SetPlayerItems();
|
|
|
|
// seed bot names
|
|
ServerOptions_InitBotNames();
|
|
ServerOptions_SetPlayerItems();
|
|
}
|
|
|
|
/*
|
|
=================
|
|
PlayerName_Draw
|
|
=================
|
|
*/
|
|
static void PlayerName_Draw( void *item )
|
|
{
|
|
menutext_s *s;
|
|
float *color;
|
|
int x, y;
|
|
int style;
|
|
qboolean focus;
|
|
|
|
s = (menutext_s *)item;
|
|
|
|
x = s->generic.x;
|
|
y = s->generic.y;
|
|
|
|
style = UI_SMALLFONT;
|
|
focus = (s->generic.parent->cursor == s->generic.menuPosition);
|
|
|
|
if ( s->generic.flags & QMF_GRAYED )
|
|
{
|
|
color = text_color_disabled;
|
|
}
|
|
else if ( focus )
|
|
{
|
|
color = colorTable[CT_LTGOLD1];
|
|
style |= UI_PULSE;
|
|
}
|
|
else if ( s->generic.flags & QMF_BLINK )
|
|
{
|
|
color = colorTable[CT_LTGOLD1];
|
|
style |= UI_BLINK;
|
|
}
|
|
else
|
|
{
|
|
color = colorTable[CT_LTGOLD1];
|
|
}
|
|
|
|
if ( focus )
|
|
{
|
|
// draw cursor
|
|
UI_FillRect( s->generic.left, s->generic.top, s->generic.right-s->generic.left+1, s->generic.bottom-s->generic.top+1, listbar_color );
|
|
UI_DrawChar( x, y, 13, UI_CENTER|UI_BLINK|UI_SMALLFONT, color);
|
|
}
|
|
|
|
UI_DrawString( x - SMALLCHAR_WIDTH, y, s->generic.name, style|UI_RIGHT, color, qtrue );
|
|
UI_DrawString( x + SMALLCHAR_WIDTH, y, s->string, style|UI_LEFT, color, qtrue );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
ServerOptionsMenu_Graphics
|
|
=================
|
|
*/
|
|
void ServerOptionsMenu_Graphics (void)
|
|
{
|
|
UI_MenuFrame2(&s_serveroptions.menu);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTORANGE]);
|
|
UI_DrawHandlePic( 30, 203, 47, 69, uis.whiteShader); // Menu Frame
|
|
UI_DrawHandlePic( 30, 275, 47, 66, uis.whiteShader); // Menu Frame
|
|
UI_DrawHandlePic( 30, 344, 47, 45, uis.whiteShader); // Menu Frame
|
|
|
|
// Players frame
|
|
trap_R_SetColor( colorTable[CT_DKORANGE]);
|
|
UI_DrawHandlePic( 354, 100, 16, 32, s_serveroptions.corner_ur_12_18); // Corner at top
|
|
UI_DrawHandlePic( 355, 368, 16, 16, s_serveroptions.corner_lr_7_12); // Corner at bottom
|
|
UI_DrawHandlePic( 80, 100, 280, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 358, 117, 12, 253, uis.whiteShader); // Right side
|
|
UI_DrawHandlePic( 80, 371, 281, 7, uis.whiteShader); // Bottom
|
|
UI_DrawProportionalString( 93, 101, menu_normal_text[MNT_SERVERPLAYERS], UI_SMALLFONT, colorTable[CT_BLACK] );
|
|
|
|
// Server frame
|
|
trap_R_SetColor( colorTable[CT_DKORANGE]);
|
|
UI_DrawHandlePic( 376, 60, -16, 32, s_serveroptions.corner_ur_12_18); // Corner at top
|
|
UI_DrawHandlePic( 375, 367, -16, 16, s_serveroptions.corner_lr_7_12); // Corner at bottom
|
|
UI_DrawHandlePic( 391, 60, 221, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 376, 80, 12, 289, uis.whiteShader); // Left side
|
|
UI_DrawHandlePic( 391, 370, 221, 7, uis.whiteShader); // Bottom
|
|
UI_DrawProportionalString( 396, 61, menu_normal_text[MNT_SERVERINFO], UI_SMALLFONT, colorTable[CT_BLACK] );
|
|
|
|
trap_R_SetColor( colorTable[s_serveroptions.mainmenu.color]);
|
|
UI_DrawHandlePic(s_serveroptions.mainmenu.generic.x - 14, s_serveroptions.mainmenu.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[s_serveroptions.back.color]);
|
|
UI_DrawHandlePic(s_serveroptions.back.generic.x - 14, s_serveroptions.back.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[s_serveroptions.back.color]);
|
|
UI_DrawHandlePic(s_serveroptions.advanced.generic.x - 14, s_serveroptions.advanced.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
UI_DrawProportionalString( 74, 28, "6211",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 150, "6700",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 206, "1523",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 278, "23",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 347, "68311",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 395, "34-5",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
}
|
|
/*
|
|
=================
|
|
ServerOptions_MenuDraw
|
|
=================
|
|
*/
|
|
static void ServerOptions_MenuDraw (void)
|
|
{
|
|
ServerOptionsMenu_Graphics();
|
|
|
|
Menu_Draw( &s_serveroptions.menu );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_MenuInit2
|
|
=================
|
|
*/
|
|
static void ServerOptions_MenuInit2( int specialties)
|
|
{
|
|
int assim,n;
|
|
|
|
assim = trap_Cvar_VariableValue( "g_pModAssimilation");
|
|
|
|
s_serveroptions.specialties = specialties;
|
|
|
|
if (!assim) // No timelimit in assimilation
|
|
{
|
|
s_serveroptions.timelimit.generic.flags &= ~(QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
else
|
|
{
|
|
s_serveroptions.timelimit.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
|
|
|
|
s_serveroptions.fraglimit.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
if ( s_serveroptions.gametype != GT_CTF )
|
|
{
|
|
if (!assim) // No points in assimilation
|
|
{
|
|
s_serveroptions.fraglimit.generic.flags &= ~(QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
}
|
|
|
|
|
|
for( n = 0; n < PLAYER_SLOTS; n++ )
|
|
{
|
|
if ( specialties && s_serveroptions.playerType[n].curvalue != 2 )
|
|
{
|
|
s_serveroptions.playerClass[n].generic.flags &= ~(QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
else
|
|
{
|
|
s_serveroptions.playerClass[n].generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_MenuInit
|
|
=================
|
|
*/
|
|
//#define OPTIONS_X 456
|
|
#define OPTIONS_X 488
|
|
|
|
static void ServerOptions_MenuInit( qboolean multiplayer )
|
|
{
|
|
int x,y,yInc;
|
|
int n,assim;
|
|
|
|
memset( &s_serveroptions, 0 ,sizeof(serveroptions_t) );
|
|
s_serveroptions.multiplayer = multiplayer;
|
|
s_serveroptions.gametype = (int)Com_Clamp( 0, 5, trap_Cvar_VariableValue( "g_gameType" ) );
|
|
s_serveroptions.specialties = (qboolean)trap_Cvar_VariableValue( "g_pModSpecialties" );
|
|
|
|
ServerOptions_Cache();
|
|
|
|
s_serveroptions.menu.wrapAround = qtrue;
|
|
s_serveroptions.menu.fullscreen = qtrue;
|
|
s_serveroptions.menu.wrapAround = qtrue;
|
|
s_serveroptions.menu.draw = ServerOptions_MenuDraw;
|
|
s_serveroptions.menu.descX = MENU_DESC_X;
|
|
s_serveroptions.menu.descY = MENU_DESC_Y;
|
|
s_serveroptions.menu.listX = 230;
|
|
s_serveroptions.menu.listY = 188;
|
|
s_serveroptions.menu.titleX = MENU_TITLE_X;
|
|
s_serveroptions.menu.titleY = MENU_TITLE_Y;
|
|
s_serveroptions.menu.titleI = MNT_CONTROLSMENU_TITLE;
|
|
s_serveroptions.menu.footNoteEnum = MNT_SERVEROPTIONS;
|
|
|
|
s_serveroptions.mappic.generic.type = MTYPE_BITMAP;
|
|
s_serveroptions.mappic.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
|
|
s_serveroptions.mappic.generic.x = 420;
|
|
s_serveroptions.mappic.generic.y = 100;
|
|
s_serveroptions.mappic.width = 160;
|
|
s_serveroptions.mappic.height = 120;
|
|
s_serveroptions.mappic.errorpic = GAMESERVER_UNKNOWNMAP;
|
|
s_serveroptions.mappic.generic.ownerdraw = ServerOptions_LevelshotDraw;
|
|
|
|
y = 248; //248 //254
|
|
yInc = BIGCHAR_HEIGHT + 8; //4 //6
|
|
if( s_serveroptions.gametype != GT_CTF )
|
|
{ // Frag limit (Point limit)
|
|
s_serveroptions.fraglimit.generic.type = MTYPE_FIELD;
|
|
s_serveroptions.fraglimit.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_serveroptions.fraglimit.generic.x = OPTIONS_X;
|
|
s_serveroptions.fraglimit.generic.y = y;
|
|
s_serveroptions.fraglimit.generic.statusbar = ServerOptions_StatusBar;
|
|
s_serveroptions.fraglimit.field.widthInChars = 3;
|
|
s_serveroptions.fraglimit.field.maxchars = 3;
|
|
s_serveroptions.fraglimit.field.style = UI_SMALLFONT;
|
|
s_serveroptions.fraglimit.field.titleEnum = MBT_POINTLIMIT;
|
|
s_serveroptions.fraglimit.field.titlecolor = CT_LTGOLD1;
|
|
s_serveroptions.fraglimit.field.textcolor = CT_DKGOLD1;
|
|
s_serveroptions.fraglimit.field.textcolor2 = CT_LTGOLD1;
|
|
}
|
|
else
|
|
{
|
|
// Capture Limit
|
|
s_serveroptions.flaglimit.generic.type = MTYPE_FIELD;
|
|
s_serveroptions.flaglimit.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_serveroptions.flaglimit.generic.x = OPTIONS_X + 12;
|
|
s_serveroptions.flaglimit.generic.y = y;
|
|
s_serveroptions.flaglimit.generic.statusbar = ServerOptions_StatusBar;
|
|
s_serveroptions.flaglimit.field.widthInChars = 3;
|
|
s_serveroptions.flaglimit.field.maxchars = 3;
|
|
s_serveroptions.flaglimit.field.style = UI_SMALLFONT;
|
|
s_serveroptions.flaglimit.field.titleEnum = MBT_CAPTURELIMIT;
|
|
s_serveroptions.flaglimit.field.titlecolor = CT_LTGOLD1;
|
|
s_serveroptions.flaglimit.field.textcolor = CT_DKGOLD1;
|
|
s_serveroptions.flaglimit.field.textcolor2 = CT_LTGOLD1;
|
|
}
|
|
|
|
//y += yInc;
|
|
// Time Limit
|
|
s_serveroptions.timelimit.generic.type = MTYPE_FIELD;
|
|
s_serveroptions.timelimit.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_serveroptions.timelimit.generic.x = OPTIONS_X;
|
|
s_serveroptions.timelimit.generic.y = y;
|
|
s_serveroptions.timelimit.generic.statusbar = ServerOptions_StatusBar;
|
|
s_serveroptions.timelimit.field.widthInChars = 3;
|
|
s_serveroptions.timelimit.field.maxchars = 3;
|
|
s_serveroptions.timelimit.field.style = UI_SMALLFONT;
|
|
s_serveroptions.timelimit.field.titleEnum = MBT_TIMELIMIT;
|
|
s_serveroptions.timelimit.field.titlecolor = CT_LTGOLD1;
|
|
s_serveroptions.timelimit.field.textcolor = CT_DKGOLD1;
|
|
s_serveroptions.timelimit.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
if( s_serveroptions.gametype >= GT_TEAM )
|
|
{
|
|
y += BIGCHAR_HEIGHT+2;
|
|
// Friendly Fire
|
|
s_serveroptions.friendlyfire.generic.type = MTYPE_SPINCONTROL;
|
|
s_serveroptions.friendlyfire.generic.flags = QMF_HIGHLIGHT_IF_FOCUS|QMF_SMALLFONT;
|
|
s_serveroptions.friendlyfire.generic.x = OPTIONS_X-96;
|
|
s_serveroptions.friendlyfire.generic.y = y;
|
|
s_serveroptions.friendlyfire.textEnum = MBT_FRIENDLYFIRE;
|
|
s_serveroptions.friendlyfire.textcolor = CT_BLACK;
|
|
s_serveroptions.friendlyfire.textcolor2 = CT_WHITE;
|
|
s_serveroptions.friendlyfire.color = CT_DKPURPLE1;
|
|
s_serveroptions.friendlyfire.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.friendlyfire.textX = 5;
|
|
s_serveroptions.friendlyfire.textY = 2;
|
|
s_serveroptions.friendlyfire.listnames = s_OffOnNone_Names;
|
|
}
|
|
|
|
y += yInc;
|
|
// Pure Server
|
|
s_serveroptions.pure.generic.type = MTYPE_SPINCONTROL;
|
|
s_serveroptions.pure.generic.flags = QMF_HIGHLIGHT_IF_FOCUS|QMF_SMALLFONT;
|
|
s_serveroptions.pure.generic.x = OPTIONS_X-96;
|
|
s_serveroptions.pure.generic.y = y;
|
|
s_serveroptions.pure.textEnum = MBT_PURESERVER;
|
|
s_serveroptions.pure.textcolor = CT_BLACK;
|
|
s_serveroptions.pure.textcolor2 = CT_WHITE;
|
|
s_serveroptions.pure.color = CT_DKPURPLE1;
|
|
s_serveroptions.pure.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.pure.textX = 5;
|
|
s_serveroptions.pure.textY = 2;
|
|
s_serveroptions.pure.listnames = s_OffOnNone_Names;
|
|
|
|
|
|
if( s_serveroptions.multiplayer )
|
|
{
|
|
y += yInc;
|
|
s_serveroptions.dedicated.generic.type = MTYPE_SPINCONTROL;
|
|
s_serveroptions.dedicated.generic.id = ID_DEDICATED;
|
|
s_serveroptions.dedicated.generic.flags = QMF_SMALLFONT;
|
|
s_serveroptions.dedicated.generic.callback = ServerOptions_Event;
|
|
s_serveroptions.dedicated.generic.x = OPTIONS_X-96;
|
|
s_serveroptions.dedicated.generic.y = y;
|
|
s_serveroptions.dedicated.listnames = dedicated_list;
|
|
s_serveroptions.dedicated.textEnum = MBT_DEDICATEDSERVER;
|
|
s_serveroptions.dedicated.textcolor = CT_BLACK;
|
|
s_serveroptions.dedicated.textcolor2 = CT_WHITE;
|
|
s_serveroptions.dedicated.color = CT_DKPURPLE1;
|
|
s_serveroptions.dedicated.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.dedicated.textX = 5;
|
|
s_serveroptions.dedicated.textY = 2;
|
|
|
|
}
|
|
|
|
y += yInc;
|
|
s_serveroptions.botSkill.generic.type = MTYPE_SPINCONTROL;
|
|
s_serveroptions.botSkill.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
|
|
s_serveroptions.botSkill.textEnum = MBT_HCSKILL;
|
|
s_serveroptions.botSkill.generic.x = OPTIONS_X-96;
|
|
s_serveroptions.botSkill.generic.y = y;
|
|
s_serveroptions.botSkill.listnames = botSkill_list;
|
|
s_serveroptions.botSkill.curvalue = 1;
|
|
s_serveroptions.botSkill.textcolor = CT_BLACK;
|
|
s_serveroptions.botSkill.textcolor2 = CT_WHITE;
|
|
s_serveroptions.botSkill.color = CT_DKPURPLE1;
|
|
s_serveroptions.botSkill.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.botSkill.textX = 5;
|
|
s_serveroptions.botSkill.textY = 2;
|
|
|
|
|
|
if( s_serveroptions.multiplayer )
|
|
{
|
|
s_serveroptions.hostname.generic.type = MTYPE_FIELD;
|
|
s_serveroptions.hostname.generic.flags = QMF_SMALLFONT;
|
|
s_serveroptions.hostname.generic.x = 180;
|
|
s_serveroptions.hostname.generic.y = 63;
|
|
s_serveroptions.hostname.field.widthInChars = 18;
|
|
s_serveroptions.hostname.field.maxchars = 64;
|
|
s_serveroptions.hostname.field.style = UI_SMALLFONT;
|
|
s_serveroptions.hostname.field.titleEnum = MBT_HOSTNAME;
|
|
s_serveroptions.hostname.field.titlecolor = CT_BLACK;
|
|
s_serveroptions.hostname.field.textcolor = CT_DKGOLD1;
|
|
s_serveroptions.hostname.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
s_serveroptions.hostnamebackground1.generic.type = MTYPE_BITMAP;
|
|
s_serveroptions.hostnamebackground1.generic.flags = QMF_INACTIVE;
|
|
s_serveroptions.hostnamebackground1.generic.x = 80;
|
|
s_serveroptions.hostnamebackground1.generic.y = 60;
|
|
s_serveroptions.hostnamebackground1.generic.name = GRAPHIC_SQUARE;
|
|
s_serveroptions.hostnamebackground1.width = 265;
|
|
s_serveroptions.hostnamebackground1.height = 22;
|
|
s_serveroptions.hostnamebackground1.color = CT_DKPURPLE1;
|
|
s_serveroptions.hostnamebackground1.textEnum = MBT_NONE;
|
|
|
|
s_serveroptions.hostnamebackground2.generic.type = MTYPE_BITMAP;
|
|
s_serveroptions.hostnamebackground2.generic.flags = QMF_INACTIVE;
|
|
s_serveroptions.hostnamebackground2.generic.x = 180;
|
|
s_serveroptions.hostnamebackground2.generic.y = 63;
|
|
s_serveroptions.hostnamebackground2.generic.name = GRAPHIC_SQUARE;
|
|
s_serveroptions.hostnamebackground2.width = 153;
|
|
s_serveroptions.hostnamebackground2.height = 17;
|
|
s_serveroptions.hostnamebackground2.color = CT_BLACK;
|
|
s_serveroptions.hostnamebackground2.textEnum = MBT_NONE;
|
|
|
|
}
|
|
|
|
y = 123;
|
|
x = 90;
|
|
s_serveroptions.player0.generic.type = MTYPE_TEXT;
|
|
s_serveroptions.player0.generic.flags = QMF_SMALLFONT | QMF_INACTIVE;
|
|
s_serveroptions.player0.generic.x = 90;
|
|
s_serveroptions.player0.generic.y = y;
|
|
s_serveroptions.player0.color = colorTable[CT_LTGOLD1];
|
|
s_serveroptions.player0.style = UI_LEFT|UI_SMALLFONT;
|
|
|
|
y = 123;
|
|
for( n = 0; n < PLAYER_SLOTS; n++ )
|
|
{
|
|
s_serveroptions.playerType[n].generic.type = MTYPE_SPINCONTROL;
|
|
s_serveroptions.playerType[n].generic.flags = QMF_SMALLFONT;
|
|
s_serveroptions.playerType[n].generic.id = ID_PLAYER_TYPE;
|
|
s_serveroptions.playerType[n].generic.callback = ServerOptions_Event;
|
|
s_serveroptions.playerType[n].generic.x = x;
|
|
s_serveroptions.playerType[n].generic.y = y;
|
|
s_serveroptions.playerType[n].listnames = playerType_list;
|
|
s_serveroptions.playerType[n].focusWidth = 30;
|
|
s_serveroptions.playerType[n].focusHeight = 18;
|
|
s_serveroptions.playerType[n].color = CT_DKPURPLE1;
|
|
s_serveroptions.playerType[n].color2 = CT_LTPURPLE1;
|
|
s_serveroptions.playerType[n].textEnum = MBT_PLAYER1 + n;
|
|
s_serveroptions.playerType[n].textX = 3;
|
|
s_serveroptions.playerType[n].textY = 2;
|
|
s_serveroptions.playerType[n].textcolor = CT_BLACK;
|
|
s_serveroptions.playerType[n].textcolor2 = CT_WHITE;
|
|
|
|
s_serveroptions.playerName[n].generic.type = MTYPE_TEXT;
|
|
s_serveroptions.playerName[n].generic.flags = QMF_SMALLFONT;
|
|
s_serveroptions.playerName[n].generic.x = x + 46;
|
|
s_serveroptions.playerName[n].generic.y = y;
|
|
s_serveroptions.playerName[n].generic.callback = ServerOptions_PlayerNameEvent;
|
|
s_serveroptions.playerName[n].generic.id = n;
|
|
s_serveroptions.playerName[n].generic.ownerdraw = PlayerName_Draw;
|
|
s_serveroptions.playerName[n].color = colorTable[CT_LTGOLD1];
|
|
s_serveroptions.playerName[n].style = UI_SMALLFONT;
|
|
s_serveroptions.playerName[n].string = s_serveroptions.playerNameBuffers[n];
|
|
s_serveroptions.playerName[n].focusX = s_serveroptions.playerName[n].generic.x;
|
|
s_serveroptions.playerName[n].focusY = s_serveroptions.playerName[n].generic.y;
|
|
s_serveroptions.playerName[n].focusHeight = SMALLCHAR_HEIGHT;
|
|
s_serveroptions.playerName[n].focusWidth = 14 * SMALLCHAR_WIDTH;
|
|
|
|
s_serveroptions.playerTeam[n].generic.type = MTYPE_SPINCONTROL;
|
|
//s_serveroptions.playerTeam[n].generic.flags = QMF_GRAPHICLIST;
|
|
s_serveroptions.playerTeam[n].generic.callback = ServerOptions_Event;
|
|
s_serveroptions.playerTeam[n].generic.id = ID_PLAYER_TEAM;
|
|
s_serveroptions.playerTeam[n].generic.x = 296;
|
|
s_serveroptions.playerTeam[n].generic.y = y;
|
|
s_serveroptions.playerTeam[n].listnames = playerTeam_list;
|
|
s_serveroptions.playerTeam[n].listshaders = s_serveroptions.teamShaders;
|
|
s_serveroptions.playerTeam[n].listX = 1;
|
|
s_serveroptions.playerTeam[n].listY = 1;
|
|
s_serveroptions.playerTeam[n].focusWidth = 20;
|
|
s_serveroptions.playerTeam[n].focusHeight = 18;
|
|
s_serveroptions.playerTeam[n].width = 20;
|
|
s_serveroptions.playerTeam[n].height = 18;
|
|
|
|
//MCG ADD:
|
|
// if ( s_serveroptions.specialties )
|
|
// {
|
|
s_serveroptions.playerClass[n].generic.type = MTYPE_SPINCONTROL;
|
|
//s_serveroptions.playerClass[n].generic.flags = QMF_GRAPHICLIST;
|
|
s_serveroptions.playerClass[n].generic.callback = ServerOptions_Event;
|
|
s_serveroptions.playerClass[n].generic.id = ID_PLAYER_CLASS;
|
|
s_serveroptions.playerClass[n].generic.x = 322;
|
|
s_serveroptions.playerClass[n].generic.y = y;
|
|
s_serveroptions.playerClass[n].listnames = playerClass_list;
|
|
s_serveroptions.playerClass[n].listshaders = s_serveroptions.pClassShaders;
|
|
s_serveroptions.playerClass[n].listX = 1;
|
|
s_serveroptions.playerClass[n].listY = 1;
|
|
s_serveroptions.playerClass[n].focusWidth = 28;
|
|
s_serveroptions.playerClass[n].focusHeight = 18;
|
|
s_serveroptions.playerClass[n].width = 28;
|
|
s_serveroptions.playerClass[n].height = 18;
|
|
// }
|
|
//MCG END
|
|
y += ( SMALLCHAR_HEIGHT + 4 );
|
|
}
|
|
|
|
s_serveroptions.mainmenu.generic.type = MTYPE_BITMAP;
|
|
s_serveroptions.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_serveroptions.mainmenu.generic.x = 110;
|
|
s_serveroptions.mainmenu.generic.y = 391;
|
|
s_serveroptions.mainmenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_serveroptions.mainmenu.generic.id = ID_MAINMENU;
|
|
s_serveroptions.mainmenu.generic.callback = ServerOptions_Event;
|
|
s_serveroptions.mainmenu.width = MENU_BUTTON_MED_WIDTH;
|
|
s_serveroptions.mainmenu.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_serveroptions.mainmenu.color = CT_DKPURPLE1;
|
|
s_serveroptions.mainmenu.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.mainmenu.textX = MENU_BUTTON_TEXT_X;
|
|
s_serveroptions.mainmenu.textY = MENU_BUTTON_TEXT_Y;
|
|
s_serveroptions.mainmenu.textEnum = MBT_MAINMENU;
|
|
s_serveroptions.mainmenu.textcolor = CT_BLACK;
|
|
s_serveroptions.mainmenu.textcolor2 = CT_WHITE;
|
|
|
|
s_serveroptions.back.generic.type = MTYPE_BITMAP;
|
|
s_serveroptions.back.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_serveroptions.back.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_serveroptions.back.generic.callback = ServerOptions_Event;
|
|
s_serveroptions.back.generic.id = ID_BACK;
|
|
s_serveroptions.back.generic.x = 110;
|
|
s_serveroptions.back.generic.y = 415;
|
|
s_serveroptions.back.width = MENU_BUTTON_MED_WIDTH;
|
|
s_serveroptions.back.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_serveroptions.back.color = CT_DKPURPLE1;
|
|
s_serveroptions.back.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.back.textX = 5;
|
|
s_serveroptions.back.textY = 2;
|
|
s_serveroptions.back.textEnum = MBT_BACK;
|
|
s_serveroptions.back.textcolor = CT_BLACK;
|
|
s_serveroptions.back.textcolor2 = CT_WHITE;
|
|
|
|
s_serveroptions.advanced.generic.type = MTYPE_BITMAP;
|
|
s_serveroptions.advanced.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_serveroptions.advanced.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_serveroptions.advanced.generic.callback = ServerOptions_Event;
|
|
s_serveroptions.advanced.generic.id = ID_ADVANCED;
|
|
s_serveroptions.advanced.generic.x = 293;
|
|
s_serveroptions.advanced.generic.y = 391;
|
|
s_serveroptions.advanced.width = MENU_BUTTON_MED_WIDTH;
|
|
s_serveroptions.advanced.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_serveroptions.advanced.color = CT_DKPURPLE1;
|
|
s_serveroptions.advanced.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.advanced.textX = 5;
|
|
s_serveroptions.advanced.textY = 2;
|
|
s_serveroptions.advanced.textEnum = MBT_ADVANCEDSERVER;
|
|
s_serveroptions.advanced.textcolor = CT_BLACK;
|
|
s_serveroptions.advanced.textcolor2 = CT_WHITE;
|
|
|
|
s_serveroptions.go.generic.type = MTYPE_BITMAP;
|
|
s_serveroptions.go.generic.name = GRAPHIC_SQUARE;
|
|
s_serveroptions.go.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_serveroptions.go.generic.callback = ServerOptions_Event;
|
|
s_serveroptions.go.generic.id = ID_GO;
|
|
s_serveroptions.go.generic.x = 462;
|
|
s_serveroptions.go.generic.y = 391;
|
|
s_serveroptions.go.width = 150;
|
|
s_serveroptions.go.height = 42;
|
|
s_serveroptions.go.color = CT_DKPURPLE1;
|
|
s_serveroptions.go.color2 = CT_LTPURPLE1;
|
|
s_serveroptions.go.textX = 5;
|
|
s_serveroptions.go.textY = 2;
|
|
s_serveroptions.go.textEnum = MBT_ENGAGE;
|
|
s_serveroptions.go.textcolor = CT_BLACK;
|
|
s_serveroptions.go.textcolor2 = CT_WHITE;
|
|
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.mappic );
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.botSkill );
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.player0 );
|
|
|
|
for( n = 0; n < PLAYER_SLOTS; n++ )
|
|
{
|
|
if( n != 0 )
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.playerType[n] );
|
|
}
|
|
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.playerName[n] );
|
|
|
|
if( s_serveroptions.gametype >= GT_TEAM )
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.playerTeam[n] );
|
|
}
|
|
|
|
//if( s_serveroptions.specialties )
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.playerClass[n] );
|
|
}
|
|
}
|
|
|
|
assim = trap_Cvar_VariableValue( "g_pModAssimilation");
|
|
|
|
#if 0
|
|
if ( s_serveroptions.gametype != GT_CTF )
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.fraglimit );
|
|
}
|
|
else
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.flaglimit );
|
|
}
|
|
#endif
|
|
|
|
// if (!assim) // No points in assimilation
|
|
// {
|
|
// Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.timelimit );
|
|
// }
|
|
|
|
if ( s_serveroptions.gametype >= GT_TEAM )
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.friendlyfire );
|
|
}
|
|
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.pure );
|
|
|
|
if ( s_serveroptions.multiplayer )
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.dedicated );
|
|
}
|
|
|
|
if ( s_serveroptions.multiplayer )
|
|
{
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.hostnamebackground1 );
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.hostnamebackground2 );
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.hostname );
|
|
}
|
|
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.mainmenu );
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.back );
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.advanced );
|
|
Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.go );
|
|
|
|
ServerOptions_SetMenuItems();
|
|
ServerOptions_MenuInit2(s_serveroptions.specialties);
|
|
}
|
|
|
|
/*
|
|
=================
|
|
ServerOptions_Cache
|
|
=================
|
|
*/
|
|
void ServerOptions_Cache( void )
|
|
{
|
|
trap_R_RegisterShaderNoMip( GAMESERVER_SELECT );
|
|
trap_R_RegisterShaderNoMip( GAMESERVER_UNKNOWNMAP );
|
|
|
|
s_serveroptions.corner_ur_12_18 = trap_R_RegisterShaderNoMip("menu/common/corner_ur_18_12");
|
|
s_serveroptions.corner_lr_7_12 = trap_R_RegisterShaderNoMip("menu/common/corner_lr_7_12");
|
|
|
|
//register the team and pClass shaders
|
|
s_serveroptions.pClassShaders[SO_PC_INFILTRATOR] = trap_R_RegisterShaderNoMip( "menu/art/pc_infiltrator.tga" );//PC_INFILTRATOR,//fast, low attack
|
|
s_serveroptions.pClassShaders[SO_PC_SNIPER] = trap_R_RegisterShaderNoMip( "menu/art/pc_sniper.tga" );//PC_SNIPER,//sneaky, snipe only
|
|
s_serveroptions.pClassShaders[SO_PC_HEAVY] = trap_R_RegisterShaderNoMip( "menu/art/pc_heavy.tga" );//PC_HEAVY,//slow, heavy attack
|
|
s_serveroptions.pClassShaders[SO_PC_DEMO] = trap_R_RegisterShaderNoMip( "menu/art/pc_demo.tga" );//PC_DEMO,//go boom
|
|
s_serveroptions.pClassShaders[SO_PC_MEDIC] = trap_R_RegisterShaderNoMip( "menu/art/pc_medic.tga" );//PC_MEDIC,//heal
|
|
s_serveroptions.pClassShaders[SO_PC_TECH] = trap_R_RegisterShaderNoMip( "menu/art/pc_tech.tga" );//PC_TECH,//operate
|
|
|
|
s_serveroptions.teamShaders[SO_TEAM_BLUE] = trap_R_RegisterShaderNoMip( "sprites/team_blue" );
|
|
s_serveroptions.teamShaders[SO_TEAM_RED] = trap_R_RegisterShaderNoMip( "sprites/team_red" );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_ServerOptionsMenu
|
|
=================
|
|
*/
|
|
static void UI_ServerOptionsMenu( qboolean multiplayer )
|
|
{
|
|
ServerOptions_MenuInit( multiplayer );
|
|
UI_PushMenu( &s_serveroptions.menu );
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
=============================================================================
|
|
|
|
BOT SELECT MENU *****
|
|
|
|
=============================================================================
|
|
*/
|
|
|
|
|
|
#define BOTSELECT_SELECT "menu/art/opponents_select"
|
|
#define BOTSELECT_SELECTED "menu/art/opponents_selected"
|
|
|
|
#define PLAYERGRID_COLS 5
|
|
#define PLAYERGRID_ROWS 3
|
|
#define MAX_MODELSPERPAGE (PLAYERGRID_ROWS * PLAYERGRID_COLS)
|
|
|
|
|
|
typedef struct {
|
|
menuframework_s menu;
|
|
|
|
menutext_s banner;
|
|
|
|
menubitmap_s pics[MAX_MODELSPERPAGE];
|
|
menubitmap_s picbuttons[MAX_MODELSPERPAGE];
|
|
menutext_s picnames[MAX_MODELSPERPAGE];
|
|
|
|
menubitmap_s arrows;
|
|
menubitmap_s left;
|
|
menubitmap_s right;
|
|
menutext_s chosenname;
|
|
|
|
menubitmap_s go;
|
|
menubitmap_s back;
|
|
menubitmap_s mainmenu;
|
|
qhandle_t corner_ll_18_18;
|
|
|
|
int numBots;
|
|
int modelpage;
|
|
int numpages;
|
|
int selectedmodel;
|
|
int sortedBotNums[MAX_BOTS];
|
|
char boticons[MAX_MODELSPERPAGE][MAX_QPATH];
|
|
char botnames[MAX_MODELSPERPAGE][16];
|
|
} botSelectInfo_t;
|
|
|
|
static botSelectInfo_t botSelectInfo;
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_SortCompare
|
|
=================
|
|
*/
|
|
static int QDECL UI_BotSelectMenu_SortCompare( const void *arg1, const void *arg2 ) {
|
|
int num1, num2;
|
|
const char *info1, *info2;
|
|
const char *name1, *name2;
|
|
|
|
num1 = *(int *)arg1;
|
|
num2 = *(int *)arg2;
|
|
|
|
info1 = UI_GetBotInfoByNumber( num1 );
|
|
info2 = UI_GetBotInfoByNumber( num2 );
|
|
|
|
name1 = Info_ValueForKey( info1, "name" );
|
|
name2 = Info_ValueForKey( info2, "name" );
|
|
|
|
return Q_stricmp( name1, name2 );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_BuildList
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_BuildList( void ) {
|
|
int n;
|
|
|
|
botSelectInfo.modelpage = 0;
|
|
botSelectInfo.numBots = UI_GetNumBots();
|
|
botSelectInfo.numpages = botSelectInfo.numBots / MAX_MODELSPERPAGE;
|
|
if( botSelectInfo.numBots % MAX_MODELSPERPAGE ) {
|
|
botSelectInfo.numpages++;
|
|
}
|
|
|
|
// initialize the array
|
|
for( n = 0; n < botSelectInfo.numBots; n++ ) {
|
|
botSelectInfo.sortedBotNums[n] = n;
|
|
}
|
|
|
|
// now sort it
|
|
qsort( botSelectInfo.sortedBotNums, botSelectInfo.numBots, sizeof(botSelectInfo.sortedBotNums[0]), UI_BotSelectMenu_SortCompare );
|
|
}
|
|
|
|
extern void PlayerIcon( const char *modelAndSkin, char *iconName, int iconNameMaxSize ); //from ui_splevel
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_UpdateGrid
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_UpdateGrid( void ) {
|
|
const char *info;
|
|
int i;
|
|
int j,len;
|
|
|
|
j = botSelectInfo.modelpage * MAX_MODELSPERPAGE;
|
|
for( i = 0; i < (PLAYERGRID_ROWS * PLAYERGRID_COLS); i++, j++) {
|
|
if( j < botSelectInfo.numBots ) {
|
|
info = UI_GetBotInfoByNumber( botSelectInfo.sortedBotNums[j] );
|
|
PlayerIcon( Info_ValueForKey( info, "model" ), botSelectInfo.boticons[i], MAX_QPATH );
|
|
Q_strncpyz( botSelectInfo.botnames[i], Info_ValueForKey( info, "name" ), 16 );
|
|
Q_CleanStr( botSelectInfo.botnames[i] );
|
|
|
|
len = UI_ProportionalStringWidth(botSelectInfo.picnames[i].string,UI_SMALLFONT);
|
|
if (len > 1)
|
|
{
|
|
if (botSelectInfo.picnames[i].style & UI_SMALLFONT)
|
|
{
|
|
botSelectInfo.picnames[i].generic.y +=5;
|
|
botSelectInfo.picnames[i].style &= ~UI_SMALLFONT;
|
|
}
|
|
botSelectInfo.picnames[i].style |= UI_TINYFONT;
|
|
}
|
|
else
|
|
{
|
|
if (botSelectInfo.picnames[i].style & UI_TINYFONT)
|
|
{
|
|
botSelectInfo.picnames[i].generic.y -=5;
|
|
botSelectInfo.picnames[i].style &= ~UI_TINYFONT;
|
|
}
|
|
botSelectInfo.picnames[i].style |= UI_SMALLFONT;
|
|
}
|
|
|
|
|
|
botSelectInfo.pics[i].generic.name = botSelectInfo.boticons[i];
|
|
if( BotAlreadySelected( botSelectInfo.botnames[i] ) ) {
|
|
botSelectInfo.picnames[i].color = colorTable[CT_LTGOLD1];
|
|
}
|
|
else {
|
|
botSelectInfo.picnames[i].color = colorTable[CT_DKGOLD1];
|
|
}
|
|
botSelectInfo.picbuttons[i].generic.flags &= ~QMF_INACTIVE;
|
|
}
|
|
else {
|
|
// dead slot
|
|
botSelectInfo.pics[i].generic.name = NULL;
|
|
botSelectInfo.picbuttons[i].generic.flags |= QMF_INACTIVE;
|
|
botSelectInfo.botnames[i][0] = 0;
|
|
}
|
|
|
|
botSelectInfo.pics[i].generic.flags &= ~QMF_HIGHLIGHT;
|
|
botSelectInfo.pics[i].shader = 0;
|
|
botSelectInfo.picbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
|
|
}
|
|
|
|
// set selected model
|
|
i = botSelectInfo.selectedmodel % MAX_MODELSPERPAGE;
|
|
botSelectInfo.pics[i].generic.flags |= QMF_HIGHLIGHT;
|
|
botSelectInfo.picbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
|
|
|
|
if( botSelectInfo.numpages > 1 ) {
|
|
if( botSelectInfo.modelpage > 0 ) {
|
|
botSelectInfo.left.generic.flags &= ~QMF_INACTIVE;
|
|
}
|
|
else {
|
|
botSelectInfo.left.generic.flags |= QMF_INACTIVE;
|
|
}
|
|
|
|
if( botSelectInfo.modelpage < (botSelectInfo.numpages - 1) ) {
|
|
botSelectInfo.right.generic.flags &= ~QMF_INACTIVE;
|
|
}
|
|
else {
|
|
botSelectInfo.right.generic.flags |= QMF_INACTIVE;
|
|
}
|
|
}
|
|
else {
|
|
// hide left/right markers
|
|
botSelectInfo.left.generic.flags |= QMF_INACTIVE;
|
|
botSelectInfo.right.generic.flags |= QMF_INACTIVE;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_Default
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_Default( char *bot ) {
|
|
const char *botInfo;
|
|
const char *test;
|
|
int n;
|
|
int i;
|
|
|
|
for( n = 0; n < botSelectInfo.numBots; n++ ) {
|
|
botInfo = UI_GetBotInfoByNumber( n );
|
|
test = Info_ValueForKey( botInfo, "name" );
|
|
if( Q_stricmp( bot, test ) == 0 ) {
|
|
break;
|
|
}
|
|
}
|
|
if( n == botSelectInfo.numBots ) {
|
|
botSelectInfo.selectedmodel = 0;
|
|
return;
|
|
}
|
|
|
|
for( i = 0; i < botSelectInfo.numBots; i++ ) {
|
|
if( botSelectInfo.sortedBotNums[i] == n ) {
|
|
break;
|
|
}
|
|
}
|
|
if( i == botSelectInfo.numBots ) {
|
|
botSelectInfo.selectedmodel = 0;
|
|
return;
|
|
}
|
|
|
|
botSelectInfo.selectedmodel = i;
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_LeftEvent
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_LeftEvent( void* ptr, int event ) {
|
|
if( event != QM_ACTIVATED ) {
|
|
return;
|
|
}
|
|
if( botSelectInfo.modelpage > 0 ) {
|
|
botSelectInfo.modelpage--;
|
|
botSelectInfo.selectedmodel = botSelectInfo.modelpage * MAX_MODELSPERPAGE;
|
|
UI_BotSelectMenu_UpdateGrid();
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_RightEvent
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_RightEvent( void* ptr, int event ) {
|
|
if( event != QM_ACTIVATED ) {
|
|
return;
|
|
}
|
|
if( botSelectInfo.modelpage < botSelectInfo.numpages - 1 ) {
|
|
botSelectInfo.modelpage++;
|
|
botSelectInfo.selectedmodel = botSelectInfo.modelpage * MAX_MODELSPERPAGE;
|
|
UI_BotSelectMenu_UpdateGrid();
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_BotEvent
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_BotEvent( void* ptr, int event ) {
|
|
int i;
|
|
|
|
if( event != QM_ACTIVATED ) {
|
|
return;
|
|
}
|
|
|
|
for( i = 0; i < (PLAYERGRID_ROWS * PLAYERGRID_COLS); i++ ) {
|
|
botSelectInfo.pics[i].generic.flags &= ~QMF_HIGHLIGHT;
|
|
botSelectInfo.picbuttons[i].generic.flags |= QMF_PULSEIFFOCUS;
|
|
}
|
|
|
|
// set selected
|
|
i = ((menucommon_s*)ptr)->id;
|
|
botSelectInfo.pics[i].generic.flags |= QMF_HIGHLIGHT;
|
|
botSelectInfo.picbuttons[i].generic.flags &= ~QMF_PULSEIFFOCUS;
|
|
botSelectInfo.selectedmodel = botSelectInfo.modelpage * MAX_MODELSPERPAGE + i;
|
|
|
|
strcpy( botSelectInfo.chosenname.string, botSelectInfo.picnames[i].string);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_BackEvent
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_BackEvent( void* ptr, int event ) {
|
|
if( event != QM_ACTIVATED ) {
|
|
return;
|
|
}
|
|
UI_PopMenu();
|
|
}
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_MainMenuEvent
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_MainMenuEvent( void* ptr, int event )
|
|
{
|
|
if( event != QM_ACTIVATED )
|
|
{
|
|
return;
|
|
}
|
|
|
|
UI_MainMenu();
|
|
}
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_SelectEvent
|
|
=================
|
|
*/
|
|
static void UI_BotSelectMenu_SelectEvent( void* ptr, int event )
|
|
{
|
|
if( event != QM_ACTIVATED )
|
|
{
|
|
return;
|
|
}
|
|
UI_PopMenu();
|
|
|
|
s_serveroptions.newBot = qtrue;
|
|
Q_strncpyz( s_serveroptions.newBotName, botSelectInfo.botnames[botSelectInfo.selectedmodel % MAX_MODELSPERPAGE], 16 );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
M_BotSelectMenu_Graphics
|
|
=================
|
|
*/
|
|
void M_BotSelectMenu_Graphics (void)
|
|
{
|
|
UI_MenuFrame2(&botSelectInfo.menu);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTBROWN1]);
|
|
UI_DrawHandlePic(30,203, 47, 186, uis.whiteShader); // Middle left line
|
|
|
|
// Frame
|
|
trap_R_SetColor( colorTable[CT_DKPURPLE2]);
|
|
|
|
UI_DrawHandlePic( 141, 345, 32, 32, botSelectInfo.corner_ll_18_18); // LL
|
|
UI_DrawHandlePic( 530, 345, -32, 32, botSelectInfo.corner_ll_18_18); // LR
|
|
UI_DrawHandlePic( 141, 49, 32, -32, botSelectInfo.corner_ll_18_18); // UL
|
|
UI_DrawHandlePic( 530, 49, -32, -32, botSelectInfo.corner_ll_18_18); // UR
|
|
|
|
UI_DrawHandlePic( 158, 59, 387, 18, uis.whiteShader); // Top
|
|
UI_DrawHandlePic( 141, 78, 18, 273, uis.whiteShader); // Left side
|
|
UI_DrawHandlePic( 544, 78, 18, 273, uis.whiteShader); // Right side
|
|
UI_DrawHandlePic( 163, 349, 8, 18, uis.whiteShader); // Left Bottom
|
|
UI_DrawHandlePic( 174, 349, 24, 18, uis.whiteShader); // Left Bottom Arrow
|
|
UI_DrawHandlePic( 201, 349, 300, 18, uis.whiteShader); // Bottom
|
|
UI_DrawHandlePic( 504, 349, 24, 18, uis.whiteShader); // Right Bottom Arrow
|
|
UI_DrawHandlePic( 531, 349, 13, 18, uis.whiteShader); // Right Bottom
|
|
UI_DrawProportionalString( 177, 60, menu_normal_text[MNT_HOLOGRAPHIC_CHARS],UI_SMALLFONT,colorTable[CT_BLACK]); // Top
|
|
|
|
// Left rounded ends for buttons
|
|
trap_R_SetColor( colorTable[botSelectInfo.mainmenu.color]);
|
|
UI_DrawHandlePic(botSelectInfo.mainmenu.generic.x - 14, botSelectInfo.mainmenu.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[botSelectInfo.back.color]);
|
|
UI_DrawHandlePic(botSelectInfo.back.generic.x - 14, botSelectInfo.back.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
UI_DrawProportionalString( 74, 28, "79088",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 150, "4545",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 206, "3624",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
UI_DrawProportionalString( 74, 395, "34",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
BotSelect_MenuDraw
|
|
=================
|
|
*/
|
|
static void BotSelect_MenuDraw (void)
|
|
{
|
|
M_BotSelectMenu_Graphics();
|
|
|
|
Menu_Draw( &botSelectInfo.menu );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu_Cache
|
|
=================
|
|
*/
|
|
void UI_BotSelectMenu_Cache( void )
|
|
{
|
|
trap_R_RegisterShaderNoMip( BOTSELECT_SELECT );
|
|
trap_R_RegisterShaderNoMip( BOTSELECT_SELECTED );
|
|
|
|
botSelectInfo.corner_ll_18_18 = trap_R_RegisterShaderNoMip("menu/common/corner_ll_18_18.tga");
|
|
}
|
|
|
|
|
|
static void UI_BotSelectMenu_Init( char *bot )
|
|
{
|
|
int i, j, k;
|
|
int x, y,len;
|
|
static char chosennamebuffer[64];
|
|
|
|
memset( &botSelectInfo, 0 ,sizeof(botSelectInfo) );
|
|
botSelectInfo.menu.nitems = 0;
|
|
botSelectInfo.menu.wrapAround = qtrue;
|
|
botSelectInfo.menu.fullscreen = qtrue;
|
|
botSelectInfo.menu.draw = BotSelect_MenuDraw;
|
|
botSelectInfo.menu.fullscreen = qtrue;
|
|
botSelectInfo.menu.descX = MENU_DESC_X;
|
|
botSelectInfo.menu.descY = MENU_DESC_Y;
|
|
botSelectInfo.menu.listX = 230;
|
|
botSelectInfo.menu.listY = 188;
|
|
botSelectInfo.menu.titleX = MENU_TITLE_X;
|
|
botSelectInfo.menu.titleY = MENU_TITLE_Y;
|
|
botSelectInfo.menu.titleI = MNT_CONTROLSMENU_TITLE;
|
|
botSelectInfo.menu.footNoteEnum = MNT_HCSELECT;
|
|
|
|
UI_BotSelectMenu_Cache();
|
|
|
|
y = 84;
|
|
for( i = 0, k = 0; i < PLAYERGRID_ROWS; i++)
|
|
{
|
|
x = 180;
|
|
for( j = 0; j < PLAYERGRID_COLS; j++, k++ )
|
|
{
|
|
botSelectInfo.pics[k].generic.type = MTYPE_BITMAP;
|
|
botSelectInfo.pics[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
|
|
botSelectInfo.pics[k].generic.x = x;
|
|
botSelectInfo.pics[k].generic.y = y;
|
|
botSelectInfo.pics[k].generic.name = botSelectInfo.boticons[k];
|
|
botSelectInfo.pics[k].width = 64;
|
|
botSelectInfo.pics[k].height = 64;
|
|
botSelectInfo.pics[k].focuspic = BOTSELECT_SELECTED;
|
|
botSelectInfo.pics[k].focuscolor = colorTable[CT_WHITE];
|
|
|
|
botSelectInfo.picbuttons[k].generic.type = MTYPE_BITMAP;
|
|
botSelectInfo.picbuttons[k].generic.flags = QMF_LEFT_JUSTIFY|QMF_NODEFAULTINIT|QMF_PULSEIFFOCUS;
|
|
botSelectInfo.picbuttons[k].generic.callback = UI_BotSelectMenu_BotEvent;
|
|
botSelectInfo.picbuttons[k].generic.id = k;
|
|
botSelectInfo.picbuttons[k].generic.x = x - 16;
|
|
botSelectInfo.picbuttons[k].generic.y = y - 16;
|
|
botSelectInfo.picbuttons[k].generic.left = x;
|
|
botSelectInfo.picbuttons[k].generic.top = y;
|
|
botSelectInfo.picbuttons[k].generic.right = x + 64;
|
|
botSelectInfo.picbuttons[k].generic.bottom = y + 64;
|
|
botSelectInfo.picbuttons[k].width = 128;
|
|
botSelectInfo.picbuttons[k].height = 128;
|
|
botSelectInfo.picbuttons[k].focuspic = BOTSELECT_SELECT;
|
|
botSelectInfo.picbuttons[k].focuscolor = colorTable[CT_WHITE];
|
|
|
|
botSelectInfo.picnames[k].generic.type = MTYPE_TEXT;
|
|
botSelectInfo.picnames[k].generic.flags = QMF_SMALLFONT;
|
|
botSelectInfo.picnames[k].generic.x = x + 32;
|
|
botSelectInfo.picnames[k].generic.y = y + 64;
|
|
botSelectInfo.picnames[k].string = botSelectInfo.botnames[k];
|
|
botSelectInfo.picnames[k].color = colorTable[CT_DKGOLD1];
|
|
botSelectInfo.picnames[k].style = UI_CENTER;
|
|
|
|
len = UI_ProportionalStringWidth(botSelectInfo.picnames[k].string,UI_SMALLFONT);
|
|
if (len > 70)
|
|
{
|
|
botSelectInfo.picnames[k].style |= UI_TINYFONT;
|
|
botSelectInfo.picnames[k].generic.y +=5;
|
|
}
|
|
else
|
|
{
|
|
botSelectInfo.picnames[k].style |= UI_SMALLFONT;
|
|
}
|
|
|
|
x += (64 + 6);
|
|
}
|
|
y += (64 + SMALLCHAR_HEIGHT + 6);
|
|
}
|
|
|
|
botSelectInfo.left.generic.type = MTYPE_BITMAP;
|
|
botSelectInfo.left.generic.name = "menu/common/arrow_left_16.tga";
|
|
botSelectInfo.left.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
botSelectInfo.left.generic.callback = UI_BotSelectMenu_LeftEvent;
|
|
botSelectInfo.left.generic.x = 178;
|
|
botSelectInfo.left.generic.y = 350;
|
|
botSelectInfo.left.width = 16;
|
|
botSelectInfo.left.height = 16;
|
|
botSelectInfo.left.color = CT_DKGOLD1;
|
|
botSelectInfo.left.color2 = CT_LTGOLD1;
|
|
botSelectInfo.left.textX = MENU_BUTTON_TEXT_X;
|
|
botSelectInfo.left.textY = MENU_BUTTON_TEXT_Y;
|
|
botSelectInfo.left.textEnum = MBT_PREVHC;
|
|
botSelectInfo.left.textcolor = CT_BLACK;
|
|
botSelectInfo.left.textcolor2 = CT_WHITE;
|
|
|
|
botSelectInfo.right.generic.type = MTYPE_BITMAP;
|
|
botSelectInfo.right.generic.name = "menu/common/arrow_right_16.tga";
|
|
botSelectInfo.right.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
botSelectInfo.right.generic.callback = UI_BotSelectMenu_RightEvent;
|
|
botSelectInfo.right.generic.x = 508;
|
|
botSelectInfo.right.generic.y = 350;
|
|
botSelectInfo.right.width = 16;
|
|
botSelectInfo.right.height = 16;
|
|
botSelectInfo.right.color = CT_DKGOLD1;
|
|
botSelectInfo.right.color2 = CT_LTGOLD1;
|
|
botSelectInfo.right.textX = MENU_BUTTON_TEXT_X;
|
|
botSelectInfo.right.textY = MENU_BUTTON_TEXT_Y;
|
|
botSelectInfo.right.textEnum = MBT_NEXTHC;
|
|
botSelectInfo.right.textcolor = CT_BLACK;
|
|
botSelectInfo.right.textcolor2 = CT_WHITE;
|
|
|
|
botSelectInfo.mainmenu.generic.type = MTYPE_BITMAP;
|
|
botSelectInfo.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
botSelectInfo.mainmenu.generic.x = 110;
|
|
botSelectInfo.mainmenu.generic.y = 391;
|
|
botSelectInfo.mainmenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
botSelectInfo.mainmenu.generic.id = ID_MAINMENU;
|
|
botSelectInfo.mainmenu.generic.callback = UI_BotSelectMenu_MainMenuEvent;
|
|
botSelectInfo.mainmenu.width = MENU_BUTTON_MED_WIDTH;
|
|
botSelectInfo.mainmenu.height = MENU_BUTTON_MED_HEIGHT;
|
|
botSelectInfo.mainmenu.color = CT_DKPURPLE1;
|
|
botSelectInfo.mainmenu.color2 = CT_LTPURPLE1;
|
|
botSelectInfo.mainmenu.textX = 5;
|
|
botSelectInfo.mainmenu.textY = 2;
|
|
botSelectInfo.mainmenu.textEnum = MBT_MAINMENU;
|
|
botSelectInfo.mainmenu.textcolor = CT_BLACK;
|
|
botSelectInfo.mainmenu.textcolor2 = CT_WHITE;
|
|
|
|
botSelectInfo.back.generic.type = MTYPE_BITMAP;
|
|
botSelectInfo.back.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
botSelectInfo.back.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
botSelectInfo.back.generic.callback = UI_BotSelectMenu_BackEvent;
|
|
botSelectInfo.back.generic.x = 110;
|
|
botSelectInfo.back.generic.y = 415;
|
|
botSelectInfo.back.width = MENU_BUTTON_MED_WIDTH;
|
|
botSelectInfo.back.height = MENU_BUTTON_MED_HEIGHT;
|
|
botSelectInfo.back.color = CT_DKPURPLE1;
|
|
botSelectInfo.back.color2 = CT_LTPURPLE1;
|
|
botSelectInfo.back.textX = MENU_BUTTON_TEXT_X;
|
|
botSelectInfo.back.textY = MENU_BUTTON_TEXT_Y;
|
|
botSelectInfo.back.textEnum = MBT_BACK;
|
|
botSelectInfo.back.textcolor = CT_BLACK;
|
|
botSelectInfo.back.textcolor2 = CT_WHITE;
|
|
|
|
|
|
botSelectInfo.go.generic.type = MTYPE_BITMAP;
|
|
botSelectInfo.go.generic.name = "menu/common/square.tga";
|
|
botSelectInfo.go.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
botSelectInfo.go.generic.callback = UI_BotSelectMenu_SelectEvent;
|
|
botSelectInfo.go.generic.x = 462;
|
|
botSelectInfo.go.generic.y = 391;
|
|
botSelectInfo.go.width = 150;
|
|
botSelectInfo.go.height = 42;
|
|
botSelectInfo.go.color = CT_DKPURPLE1;
|
|
botSelectInfo.go.color2 = CT_LTPURPLE1;
|
|
botSelectInfo.go.textX = MENU_BUTTON_TEXT_X;
|
|
botSelectInfo.go.textY = MENU_BUTTON_TEXT_Y;
|
|
botSelectInfo.go.textEnum = MBT_ACCEPT;
|
|
botSelectInfo.go.textcolor = CT_BLACK;
|
|
botSelectInfo.go.textcolor2 = CT_WHITE;
|
|
|
|
botSelectInfo.chosenname.generic.type = MTYPE_PTEXT;
|
|
botSelectInfo.chosenname.generic.flags = QMF_INACTIVE;
|
|
botSelectInfo.chosenname.generic.x = 212;
|
|
botSelectInfo.chosenname.generic.y = 351;
|
|
botSelectInfo.chosenname.string = chosennamebuffer;
|
|
botSelectInfo.chosenname.style = UI_SMALLFONT;
|
|
botSelectInfo.chosenname.color = colorTable[CT_LTBLUE2];
|
|
|
|
for( i = 0; i < MAX_MODELSPERPAGE; i++ )
|
|
{
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.pics[i] );
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.picbuttons[i] );
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.picnames[i] );
|
|
}
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.chosenname );
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.left );
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.right );
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.mainmenu );
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.back );
|
|
Menu_AddItem( &botSelectInfo.menu, &botSelectInfo.go );
|
|
|
|
UI_BotSelectMenu_BuildList();
|
|
UI_BotSelectMenu_Default( bot );
|
|
botSelectInfo.modelpage = botSelectInfo.selectedmodel / MAX_MODELSPERPAGE;
|
|
UI_BotSelectMenu_UpdateGrid();
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
UI_BotSelectMenu
|
|
=================
|
|
*/
|
|
void UI_BotSelectMenu( char *bot )
|
|
{
|
|
UI_BotSelectMenu_Init( bot );
|
|
UI_PushMenu( &botSelectInfo.menu );
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
SetPlayerMod
|
|
=================
|
|
*/
|
|
void SetPlayerMod(void)
|
|
{
|
|
trap_Cvar_SetValue( "g_pModAssimilation", s_startserver.assimilation.curvalue);
|
|
trap_Cvar_SetValue( "g_pModDisintegration", s_startserver.disintegration.curvalue);
|
|
trap_Cvar_SetValue( "g_pModActionHero", s_startserver.actionhero.curvalue);
|
|
trap_Cvar_SetValue( "g_pModSpecialties", s_startserver.specialties.curvalue);
|
|
trap_Cvar_SetValue( "g_pModElimination", s_startserver.elimination.curvalue);
|
|
}
|
|
|
|
/*
|
|
=================
|
|
AdvancedServer_Update
|
|
=================
|
|
*/
|
|
static void AdvancedServer_Update( void)
|
|
{
|
|
int holdInt;
|
|
float holdFloat;
|
|
|
|
// Set colors to normal
|
|
s_advancedserver.repawntime.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.maxclients.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.runspeed.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.gravity.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.knockback.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.dmgmult.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.bot_minplayers.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.forceplayerrespawn.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.respawninvulnerability.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.dowarmup.field.titlecolor = CT_DKGOLD1;
|
|
s_advancedserver.classchangetimeout.field.titlecolor = CT_DKGOLD1;
|
|
|
|
|
|
|
|
holdInt = atoi( s_advancedserver.repawntime.field.buffer );
|
|
if ((holdInt < 1) || (holdInt > 60))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_RESPAWNTIME;
|
|
s_advancedserver.repawntime.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.repawntime);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_weaponrespawn", holdInt );
|
|
|
|
|
|
holdInt = atoi( s_advancedserver.maxclients.field.buffer );
|
|
if ((holdInt < 0) || (holdInt > 64))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_MAXCLIENTS;
|
|
s_advancedserver.maxclients.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.maxclients);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "sv_maxclients", holdInt );
|
|
|
|
|
|
holdInt = atoi( s_advancedserver.runspeed.field.buffer );
|
|
if ((holdInt < 50) || (holdInt > 1000))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_RUNSPEED;
|
|
s_advancedserver.runspeed.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.runspeed);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_speed", holdInt );
|
|
|
|
|
|
holdInt = atoi( s_advancedserver.gravity.field.buffer );
|
|
if ((holdInt < 0) || (holdInt > 5000))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_GRAVITY;
|
|
s_advancedserver.gravity.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.gravity);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_gravity", holdInt );
|
|
|
|
|
|
holdInt = atoi( s_advancedserver.knockback.field.buffer );
|
|
if ((holdInt < 0) || (holdInt > 10000))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_KNOCKBACK;
|
|
s_advancedserver.knockback.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.knockback);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_knockback", holdInt );
|
|
|
|
|
|
holdFloat = atof( s_advancedserver.dmgmult.field.buffer );
|
|
if ((holdFloat < 0) || (holdFloat > 100))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_DMGMULT;
|
|
s_advancedserver.dmgmult.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.dmgmult);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_dmgmult", holdFloat );
|
|
|
|
|
|
holdInt = atoi( s_advancedserver.bot_minplayers.field.buffer );
|
|
if ((holdInt < 0) || (holdInt > 64))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_BOT_MINPLAYERS;
|
|
s_advancedserver.bot_minplayers.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.bot_minplayers);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "bot_minplayers", holdInt );
|
|
|
|
|
|
// Range check on forceplayerrespawn
|
|
holdInt = atoi( s_advancedserver.forceplayerrespawn.field.buffer );
|
|
if ((holdInt < 0) || (holdInt > 120))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_FORCEPLAYERRESPAWN;
|
|
s_advancedserver.forceplayerrespawn.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.forceplayerrespawn);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_forcerespawn", holdInt );
|
|
|
|
|
|
// Range check on respawnGhostTime
|
|
holdInt = atoi( s_advancedserver.respawninvulnerability.field.buffer );
|
|
if ((holdInt < 0) || (holdInt > 30))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_RESPAWNINVULNERABILITY;
|
|
s_advancedserver.respawninvulnerability.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.respawninvulnerability);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_ghostRespawn", holdInt );
|
|
|
|
// Range check on dowarmup
|
|
holdInt = atoi( s_advancedserver.dowarmup.field.buffer );
|
|
if ((holdInt < 0) || (holdInt > 120))
|
|
{
|
|
s_advancedserver.errorFlag = ERR_DOWARMUP;
|
|
s_advancedserver.dowarmup.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.dowarmup);
|
|
return;
|
|
}
|
|
|
|
if (holdInt == 0)
|
|
{
|
|
trap_Cvar_SetValue( "g_dowarmup", holdInt );
|
|
}
|
|
else
|
|
{
|
|
trap_Cvar_SetValue( "g_dowarmup", 1 );
|
|
trap_Cvar_SetValue( "g_warmup", holdInt );
|
|
}
|
|
|
|
s_advancedserver.errorFlag = 0;
|
|
|
|
holdInt = atoi( s_advancedserver.classchangetimeout.field.buffer );
|
|
if (holdInt < 0)
|
|
{
|
|
s_advancedserver.errorFlag = ERR_CLASSCHANGETIMEOUT;
|
|
s_advancedserver.classchangetimeout.field.titlecolor = CT_LTRED1;
|
|
Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.classchangetimeout);
|
|
return;
|
|
}
|
|
trap_Cvar_SetValue( "g_classChangeDebounceTime", holdInt );
|
|
|
|
ServerOptions_MenuInit2(s_advancedserver.specialties.curvalue);
|
|
|
|
}
|
|
|
|
|
|
// Calls for the AdvancedServer screen
|
|
void AdvancedServerSetModButtons(void)
|
|
{
|
|
ServerGameMods(gametype_remap[s_startserver.gametype.curvalue],
|
|
&s_advancedserver.assimilation.curvalue,
|
|
&s_advancedserver.specialties.curvalue,
|
|
&s_advancedserver.disintegration.curvalue,
|
|
&s_advancedserver.elimination.curvalue,
|
|
&s_advancedserver.actionhero.curvalue);
|
|
|
|
SetServerButtons(gametype_remap[s_startserver.gametype.curvalue],
|
|
&s_advancedserver.assimilation,
|
|
&s_advancedserver.specialties,
|
|
&s_advancedserver.disintegration,
|
|
&s_advancedserver.elimination,
|
|
&s_advancedserver.actionhero);
|
|
}
|
|
|
|
/*
|
|
=================
|
|
AdvancedServer_Event
|
|
=================
|
|
*/
|
|
static void AdvancedServer_Event( void* ptr, int notification )
|
|
{
|
|
int dmflags;
|
|
|
|
if( notification != QM_ACTIVATED )
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch( ((menucommon_s*)ptr)->id )
|
|
{
|
|
case ID_PMOD_ASSIMILIATION:
|
|
trap_Cvar_SetValue( "g_pModAssimilation", s_advancedserver.assimilation.curvalue);
|
|
AdvancedServerSetModButtons();
|
|
break;
|
|
case ID_PMOD_DISINTEGRATION:
|
|
trap_Cvar_SetValue( "g_pModDisintegration", s_advancedserver.disintegration.curvalue);
|
|
AdvancedServerSetModButtons();
|
|
break;
|
|
case ID_PMOD_ACTIONHERO:
|
|
trap_Cvar_SetValue( "g_pModActionHero", s_advancedserver.actionhero.curvalue);
|
|
AdvancedServerSetModButtons();
|
|
break;
|
|
case ID_PMOD_SPECIALTIES:
|
|
trap_Cvar_SetValue( "g_pModSpecialties", s_advancedserver.specialties.curvalue);
|
|
AdvancedServerSetModButtons();
|
|
break;
|
|
case ID_PMOD_ELIMINATION:
|
|
trap_Cvar_SetValue( "g_pModElimination", s_advancedserver.elimination.curvalue);
|
|
AdvancedServerSetModButtons();
|
|
break;
|
|
case ID_BLUETEAM:
|
|
if (!Q_stricmp(s_skinsForRace[s_advancedserver.blueteam.curvalue],"NONE"))
|
|
{
|
|
trap_Cvar_Set( "g_team_group_blue", "" );
|
|
}
|
|
else
|
|
{
|
|
trap_Cvar_Set( "g_team_group_blue", s_skinsForRace[s_advancedserver.blueteam.curvalue] );
|
|
}
|
|
break;
|
|
case ID_REDTEAM:
|
|
if (!Q_stricmp(s_skinsForRace[s_advancedserver.redteam.curvalue],"NONE"))
|
|
{
|
|
trap_Cvar_Set( "g_team_group_red", "" );
|
|
}
|
|
else
|
|
{
|
|
trap_Cvar_Set( "g_team_group_red", s_skinsForRace[s_advancedserver.redteam.curvalue] );
|
|
}
|
|
|
|
break;
|
|
case ID_AUTOJOIN:
|
|
trap_Cvar_SetValue( "g_teamAutoJoin", s_advancedserver.autojoin.curvalue );
|
|
break;
|
|
case ID_AUTOBALANCE:
|
|
trap_Cvar_SetValue( "g_teamForceBalance", s_advancedserver.autobalance.curvalue );
|
|
break;
|
|
case ID_FRIENDLYFIRE:
|
|
// trap_Cvar_SetValue( "g_friendlyFire", s_advancedserver.friendlyfire.curvalue );
|
|
break;
|
|
case ID_FALLINGDAMAGE:
|
|
dmflags = trap_Cvar_VariableValue( "g_dmflags" );
|
|
|
|
if (s_advancedserver.fallingdamage.curvalue)
|
|
{
|
|
dmflags &= ~DF_NO_FALLING;
|
|
}
|
|
else
|
|
{
|
|
dmflags |= DF_NO_FALLING;
|
|
}
|
|
|
|
trap_Cvar_SetValue( "g_dmflags", dmflags );
|
|
break;
|
|
|
|
case ID_ADAPTITEMRESPAWN:
|
|
trap_Cvar_SetValue( "g_adaptRespawn", s_advancedserver.adaptitemrespawn.curvalue );
|
|
break;
|
|
|
|
case ID_HOLODECKINTRO:
|
|
trap_Cvar_SetValue( "g_holointro", s_advancedserver.holodeckintro.curvalue );
|
|
break;
|
|
|
|
|
|
case ID_MAINMENU:
|
|
AdvancedServer_Update();
|
|
if (!s_advancedserver.errorFlag) // No error with data
|
|
{
|
|
StartServerSetModButtons();
|
|
UI_MainMenu();
|
|
}
|
|
break;
|
|
|
|
case ID_BACK:
|
|
AdvancedServer_Update();
|
|
if (!s_advancedserver.errorFlag) // No error with data
|
|
{
|
|
StartServerSetModButtons();
|
|
UI_PopMenu();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
#define ERROR_X_OFFSET 80
|
|
/*
|
|
=================
|
|
M_AdvancedServerMenu_Graphics
|
|
=================
|
|
*/
|
|
void M_AdvancedServerMenu_Graphics(void)
|
|
{
|
|
UI_MenuFrame2(&s_advancedserver.menu);
|
|
|
|
trap_R_SetColor( colorTable[CT_LTORANGE]);
|
|
UI_DrawHandlePic( 30, 203, 47, 186, uis.whiteShader);
|
|
|
|
switch(s_advancedserver.errorFlag)
|
|
{
|
|
case ERR_RESPAWNTIME :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.repawntime.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.repawntime.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_MAXCLIENTS :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.maxclients.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.maxclients.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_RUNSPEED :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.runspeed.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.runspeed.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_GRAVITY :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.gravity.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.gravity.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_KNOCKBACK :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.knockback.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.knockback.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_DMGMULT :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.dmgmult.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.dmgmult.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_BOT_MINPLAYERS :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.bot_minplayers.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.bot_minplayers.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_FORCEPLAYERRESPAWN :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.forceplayerrespawn.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.forceplayerrespawn.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_RESPAWNINVULNERABILITY :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.respawninvulnerability.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.respawninvulnerability.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_DOWARMUP :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.dowarmup.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.dowarmup.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
case ERR_CLASSCHANGETIMEOUT :
|
|
s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN;
|
|
s_advancedserver.errorText.generic.y = s_advancedserver.classchangetimeout.generic.y;
|
|
s_advancedserver.errorText.generic.x = s_advancedserver.classchangetimeout.generic.x + ERROR_X_OFFSET;
|
|
break;
|
|
}
|
|
|
|
// Left rounded ends for buttons
|
|
trap_R_SetColor( colorTable[s_advancedserver.mainmenu.color]);
|
|
UI_DrawHandlePic(s_advancedserver.mainmenu.generic.x - 14, s_advancedserver.mainmenu.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
trap_R_SetColor( colorTable[s_advancedserver.back.color]);
|
|
UI_DrawHandlePic(s_advancedserver.back.generic.x - 14, s_advancedserver.back.generic.y,
|
|
MENU_BUTTON_MED_HEIGHT, MENU_BUTTON_MED_HEIGHT, uis.graphicButtonLeftEnd);
|
|
|
|
}
|
|
|
|
/*
|
|
=================
|
|
ServerAdvanced_StatusBar
|
|
=================
|
|
*/
|
|
static void ServerAdvanced_StatusBar( void* ptr )
|
|
{
|
|
int x,y;
|
|
|
|
x = 265;
|
|
y = 400;
|
|
switch( ((menucommon_s*)ptr)->id )
|
|
{
|
|
case ID_RESPAWNTIME:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_RESPAWN], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_RESPAWN], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_ADVMAXCLIENTS:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_MAXCLIENTS], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_MAXCLIENTS], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_RUNSPEED:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_RUNSPEED], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_RUNSPEED], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_GRAVITY:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_GRAVITY], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_GRAVITY], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_KNOCKBACK:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_KNOCKBACK], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_KNOCKBACK], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_DMGMULT:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_DMGMULT], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_DMGMULT], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_BOT_MINPLAYERS:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_BOT_MINPLAYERS], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_BOT_MINPLAYERS], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_FORCEPLAYERRESPAWN :
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_FORCEPLAYERRESPAWN], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_FORCEPLAYERRESPAWN], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_RESPAWNINVULNERABILITY :
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_RESPAWNINVULNERABILITY], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_RESPAWNINVULNERABILITY], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_DOWARMUP :
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_DOWARMUP], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_DOWARMUP], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
case ID_CLASSCHANGETIMEOUT:
|
|
UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_CLASSCHANGETIMEOUT], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_CLASSCHANGETIMEOUT], UI_SMALLFONT, colorTable[CT_WHITE]);
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
AdvanceServer_MenuDraw
|
|
=================
|
|
*/
|
|
static void AdvanceServer_MenuDraw (void)
|
|
{
|
|
M_AdvancedServerMenu_Graphics();
|
|
|
|
Menu_Draw( &s_advancedserver.menu );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
UI_AdvancedServerMenu_Init
|
|
=================
|
|
*/
|
|
static void UI_AdvancedServerMenu_Init(int fromMenu)
|
|
{
|
|
int x,y,pad,dmflags,holdInt;
|
|
|
|
memset( &s_advancedserver, 0 ,sizeof(s_advancedserver) );
|
|
|
|
s_advancedserver.menu.nitems = 0;
|
|
s_advancedserver.menu.wrapAround = qtrue;
|
|
s_advancedserver.menu.fullscreen = qtrue;
|
|
s_advancedserver.menu.draw = AdvanceServer_MenuDraw;
|
|
s_advancedserver.menu.fullscreen = qtrue;
|
|
s_advancedserver.menu.descX = MENU_DESC_X;
|
|
s_advancedserver.menu.descY = MENU_DESC_Y;
|
|
s_advancedserver.menu.titleX = MENU_TITLE_X;
|
|
s_advancedserver.menu.titleY = MENU_TITLE_Y;
|
|
s_advancedserver.menu.titleI = MNT_ANVANCEDMENU_TITLE;
|
|
s_advancedserver.menu.footNoteEnum = MNT_ADVANCEDSERVER;
|
|
|
|
s_advancedserver.mainmenu.generic.type = MTYPE_BITMAP;
|
|
s_advancedserver.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.mainmenu.generic.x = 110;
|
|
s_advancedserver.mainmenu.generic.y = 391;
|
|
s_advancedserver.mainmenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_advancedserver.mainmenu.generic.id = ID_MAINMENU;
|
|
s_advancedserver.mainmenu.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.mainmenu.width = MENU_BUTTON_MED_WIDTH;
|
|
s_advancedserver.mainmenu.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_advancedserver.mainmenu.color = CT_DKPURPLE1;
|
|
s_advancedserver.mainmenu.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.mainmenu.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.mainmenu.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.mainmenu.textEnum = MBT_MAINMENU;
|
|
s_advancedserver.mainmenu.textcolor = CT_BLACK;
|
|
s_advancedserver.mainmenu.textcolor2 = CT_WHITE;
|
|
|
|
s_advancedserver.back.generic.type = MTYPE_BITMAP;
|
|
s_advancedserver.back.generic.name = BUTTON_GRAPHIC_LONGRIGHT;
|
|
s_advancedserver.back.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.back.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.back.generic.id = ID_BACK;
|
|
s_advancedserver.back.generic.x = 110;
|
|
s_advancedserver.back.generic.y = 415;
|
|
s_advancedserver.back.width = MENU_BUTTON_MED_WIDTH;
|
|
s_advancedserver.back.height = MENU_BUTTON_MED_HEIGHT;
|
|
s_advancedserver.back.color = CT_DKPURPLE1;
|
|
s_advancedserver.back.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.back.textX = 5;
|
|
s_advancedserver.back.textY = 2;
|
|
s_advancedserver.back.textEnum = MBT_BACK;
|
|
s_advancedserver.back.textcolor = CT_BLACK;
|
|
s_advancedserver.back.textcolor2 = CT_WHITE;
|
|
|
|
pad = 22;
|
|
x = 100;
|
|
y = 80;
|
|
s_advancedserver.autojoin.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.autojoin.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.autojoin.generic.x = x;
|
|
s_advancedserver.autojoin.generic.y = y;
|
|
s_advancedserver.autojoin.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.autojoin.generic.id = ID_AUTOJOIN;
|
|
s_advancedserver.autojoin.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.autojoin.color = CT_DKPURPLE1;
|
|
s_advancedserver.autojoin.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.autojoin.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.autojoin.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.autojoin.textEnum = MBT_AUTOJOIN;
|
|
s_advancedserver.autojoin.textcolor = CT_BLACK;
|
|
s_advancedserver.autojoin.textcolor2 = CT_WHITE;
|
|
s_advancedserver.autojoin.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
s_advancedserver.autobalance.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.autobalance.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.autobalance.generic.x = x;
|
|
s_advancedserver.autobalance.generic.y = y;
|
|
s_advancedserver.autobalance.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.autobalance.generic.id = ID_AUTOBALANCE;
|
|
s_advancedserver.autobalance.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.autobalance.color = CT_DKPURPLE1;
|
|
s_advancedserver.autobalance.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.autobalance.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.autobalance.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.autobalance.textEnum = MBT_AUTOBALANCE;
|
|
s_advancedserver.autobalance.textcolor = CT_BLACK;
|
|
s_advancedserver.autobalance.textcolor2 = CT_WHITE;
|
|
s_advancedserver.autobalance.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
/*
|
|
s_advancedserver.friendlyfire.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.friendlyfire.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.friendlyfire.generic.x = x;
|
|
s_advancedserver.friendlyfire.generic.y = y;
|
|
s_advancedserver.friendlyfire.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.friendlyfire.generic.id = ID_FRIENDLYFIRE;
|
|
s_advancedserver.friendlyfire.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.friendlyfire.color = CT_DKPURPLE1;
|
|
s_advancedserver.friendlyfire.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.friendlyfire.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.friendlyfire.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.friendlyfire.textEnum = MBT_FRIENDLYFIRE;
|
|
s_advancedserver.friendlyfire.textcolor = CT_BLACK;
|
|
s_advancedserver.friendlyfire.textcolor2 = CT_WHITE;
|
|
s_advancedserver.friendlyfire.listnames = s_OffOnNone_Names;
|
|
*/
|
|
y += pad;
|
|
s_advancedserver.fallingdamage.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.fallingdamage.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.fallingdamage.generic.x = x;
|
|
s_advancedserver.fallingdamage.generic.y = y;
|
|
s_advancedserver.fallingdamage.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.fallingdamage.generic.id = ID_FRIENDLYFIRE;
|
|
s_advancedserver.fallingdamage.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.fallingdamage.color = CT_DKPURPLE1;
|
|
s_advancedserver.fallingdamage.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.fallingdamage.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.fallingdamage.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.fallingdamage.textEnum = MBT_FALLINGDAMAGE;
|
|
s_advancedserver.fallingdamage.textcolor = CT_BLACK;
|
|
s_advancedserver.fallingdamage.textcolor2 = CT_WHITE;
|
|
s_advancedserver.fallingdamage.listnames = s_OffOnNone_Names;
|
|
|
|
|
|
y += pad;
|
|
x += 160;
|
|
s_advancedserver.repawntime.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.repawntime.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.repawntime.generic.x = x;
|
|
s_advancedserver.repawntime.generic.y = y;
|
|
s_advancedserver.repawntime.generic.id = ID_RESPAWNTIME;
|
|
s_advancedserver.repawntime.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.repawntime.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.repawntime.field.widthInChars = 2;
|
|
s_advancedserver.repawntime.field.maxchars = 2;
|
|
s_advancedserver.repawntime.field.style = UI_SMALLFONT;
|
|
s_advancedserver.repawntime.field.titleEnum = MBT_RESPAWNTIME;
|
|
s_advancedserver.repawntime.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.repawntime.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.repawntime.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.maxclients.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.maxclients.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.maxclients.generic.x = x;
|
|
s_advancedserver.maxclients.generic.y = y;
|
|
s_advancedserver.maxclients.generic.id = ID_ADVMAXCLIENTS;
|
|
s_advancedserver.maxclients.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.maxclients.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.maxclients.field.widthInChars = 2;
|
|
s_advancedserver.maxclients.field.maxchars = 2;
|
|
s_advancedserver.maxclients.field.style = UI_SMALLFONT;
|
|
s_advancedserver.maxclients.field.titleEnum = MBT_MAXCLIENTS;
|
|
s_advancedserver.maxclients.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.maxclients.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.maxclients.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.runspeed.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.runspeed.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.runspeed.generic.x = x;
|
|
s_advancedserver.runspeed.generic.y = y;
|
|
s_advancedserver.runspeed.generic.id = ID_RUNSPEED;
|
|
s_advancedserver.runspeed.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.runspeed.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.runspeed.field.widthInChars = 4;
|
|
s_advancedserver.runspeed.field.maxchars = 4;
|
|
s_advancedserver.runspeed.field.style = UI_SMALLFONT;
|
|
s_advancedserver.runspeed.field.titleEnum = MBT_RUNSPEED;
|
|
s_advancedserver.runspeed.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.runspeed.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.runspeed.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.gravity.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.gravity.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.gravity.generic.x = x;
|
|
s_advancedserver.gravity.generic.y = y;
|
|
s_advancedserver.gravity.generic.id = ID_GRAVITY;
|
|
s_advancedserver.gravity.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.gravity.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.gravity.field.widthInChars = 4;
|
|
s_advancedserver.gravity.field.maxchars = 4;
|
|
s_advancedserver.gravity.field.style = UI_SMALLFONT;
|
|
s_advancedserver.gravity.field.titleEnum = MBT_GRAVITY;
|
|
s_advancedserver.gravity.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.gravity.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.gravity.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.knockback.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.knockback.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.knockback.generic.x = x;
|
|
s_advancedserver.knockback.generic.y = y;
|
|
s_advancedserver.knockback.generic.id = ID_KNOCKBACK;
|
|
s_advancedserver.knockback.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.knockback.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.knockback.field.widthInChars = 5;
|
|
s_advancedserver.knockback.field.maxchars = 5;
|
|
s_advancedserver.knockback.field.style = UI_SMALLFONT;
|
|
s_advancedserver.knockback.field.titleEnum = MBT_KNOCKBACK;
|
|
s_advancedserver.knockback.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.knockback.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.knockback.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.dmgmult.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.dmgmult.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.dmgmult.generic.x = x;
|
|
s_advancedserver.dmgmult.generic.y = y;
|
|
s_advancedserver.dmgmult.generic.id = ID_DMGMULT;
|
|
s_advancedserver.dmgmult.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.dmgmult.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.dmgmult.field.widthInChars = 5;
|
|
s_advancedserver.dmgmult.field.maxchars = 5;
|
|
s_advancedserver.dmgmult.field.style = UI_SMALLFONT;
|
|
s_advancedserver.dmgmult.field.titleEnum = MBT_DMGMULT;
|
|
s_advancedserver.dmgmult.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.dmgmult.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.dmgmult.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.bot_minplayers.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.bot_minplayers.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.bot_minplayers.generic.x = x;
|
|
s_advancedserver.bot_minplayers.generic.y = y;
|
|
s_advancedserver.bot_minplayers.generic.id = ID_BOT_MINPLAYERS;
|
|
s_advancedserver.bot_minplayers.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.bot_minplayers.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.bot_minplayers.field.widthInChars = 5;
|
|
s_advancedserver.bot_minplayers.field.maxchars = 5;
|
|
s_advancedserver.bot_minplayers.field.style = UI_SMALLFONT;
|
|
s_advancedserver.bot_minplayers.field.titleEnum = MBT_BOT_MINPLAYERS;
|
|
s_advancedserver.bot_minplayers.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.bot_minplayers.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.bot_minplayers.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.classchangetimeout.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.classchangetimeout.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.classchangetimeout.generic.x = x;
|
|
s_advancedserver.classchangetimeout.generic.y = y;
|
|
s_advancedserver.classchangetimeout.generic.id = ID_CLASSCHANGETIMEOUT;
|
|
s_advancedserver.classchangetimeout.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.classchangetimeout.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.classchangetimeout.field.widthInChars = 7;
|
|
s_advancedserver.classchangetimeout.field.maxchars = 7;
|
|
s_advancedserver.classchangetimeout.field.style = UI_SMALLFONT;
|
|
s_advancedserver.classchangetimeout.field.titleEnum = MBT_CLASSCHANGE;
|
|
s_advancedserver.classchangetimeout.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.classchangetimeout.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.classchangetimeout.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
// Second column
|
|
x = 370;
|
|
y = 80;
|
|
s_advancedserver.adaptitemrespawn.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.adaptitemrespawn.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.adaptitemrespawn.generic.x = x;
|
|
s_advancedserver.adaptitemrespawn.generic.y = y;
|
|
s_advancedserver.adaptitemrespawn.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.adaptitemrespawn.generic.id = ID_ADAPTITEMRESPAWN;
|
|
s_advancedserver.adaptitemrespawn.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.adaptitemrespawn.color = CT_DKPURPLE1;
|
|
s_advancedserver.adaptitemrespawn.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.adaptitemrespawn.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.adaptitemrespawn.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.adaptitemrespawn.textEnum = MBT_ADAPTITEMRESPAWN;
|
|
s_advancedserver.adaptitemrespawn.textcolor = CT_BLACK;
|
|
s_advancedserver.adaptitemrespawn.textcolor2 = CT_WHITE;
|
|
s_advancedserver.adaptitemrespawn.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
s_advancedserver.holodeckintro.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.holodeckintro.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.holodeckintro.generic.x = x;
|
|
s_advancedserver.holodeckintro.generic.y = y;
|
|
s_advancedserver.holodeckintro.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.holodeckintro.generic.id = ID_HOLODECKINTRO;
|
|
s_advancedserver.holodeckintro.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.holodeckintro.color = CT_DKPURPLE1;
|
|
s_advancedserver.holodeckintro.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.holodeckintro.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.holodeckintro.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.holodeckintro.textEnum = MBT_HOLODECKINTRO;
|
|
s_advancedserver.holodeckintro.textcolor = CT_BLACK;
|
|
s_advancedserver.holodeckintro.textcolor2 = CT_WHITE;
|
|
s_advancedserver.holodeckintro.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
x += 160;
|
|
s_advancedserver.forceplayerrespawn.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.forceplayerrespawn.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.forceplayerrespawn.generic.x = x;
|
|
s_advancedserver.forceplayerrespawn.generic.y = y;
|
|
s_advancedserver.forceplayerrespawn.generic.id = ID_FORCEPLAYERRESPAWN;
|
|
s_advancedserver.forceplayerrespawn.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.forceplayerrespawn.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.forceplayerrespawn.field.widthInChars = 5;
|
|
s_advancedserver.forceplayerrespawn.field.maxchars = 5;
|
|
s_advancedserver.forceplayerrespawn.field.style = UI_SMALLFONT;
|
|
s_advancedserver.forceplayerrespawn.field.titleEnum = MBT_FORCEPLAYERRESPAWN;
|
|
s_advancedserver.forceplayerrespawn.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.forceplayerrespawn.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.forceplayerrespawn.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.respawninvulnerability.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.respawninvulnerability.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.respawninvulnerability.generic.x = x;
|
|
s_advancedserver.respawninvulnerability.generic.y = y;
|
|
s_advancedserver.respawninvulnerability.generic.id = ID_RESPAWNINVULNERABILITY;
|
|
s_advancedserver.respawninvulnerability.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.respawninvulnerability.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.respawninvulnerability.field.widthInChars = 5;
|
|
s_advancedserver.respawninvulnerability.field.maxchars = 5;
|
|
s_advancedserver.respawninvulnerability.field.style = UI_SMALLFONT;
|
|
s_advancedserver.respawninvulnerability.field.titleEnum = MBT_RESPAWNINVULNERABILITY;
|
|
s_advancedserver.respawninvulnerability.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.respawninvulnerability.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.respawninvulnerability.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
y += pad;
|
|
s_advancedserver.dowarmup.generic.type = MTYPE_FIELD;
|
|
s_advancedserver.dowarmup.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT;
|
|
s_advancedserver.dowarmup.generic.x = x;
|
|
s_advancedserver.dowarmup.generic.y = y;
|
|
s_advancedserver.dowarmup.generic.id = ID_DOWARMUP;
|
|
s_advancedserver.dowarmup.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.dowarmup.generic.statusbar = ServerAdvanced_StatusBar;
|
|
s_advancedserver.dowarmup.field.widthInChars = 5;
|
|
s_advancedserver.dowarmup.field.maxchars = 5;
|
|
s_advancedserver.dowarmup.field.style = UI_SMALLFONT;
|
|
s_advancedserver.dowarmup.field.titleEnum = MBT_WARMUP;
|
|
s_advancedserver.dowarmup.field.titlecolor = CT_LTGOLD1;
|
|
s_advancedserver.dowarmup.field.textcolor = CT_DKGOLD1;
|
|
s_advancedserver.dowarmup.field.textcolor2 = CT_LTGOLD1;
|
|
|
|
|
|
y += pad;
|
|
x = 370;
|
|
s_advancedserver.blueteam.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.blueteam.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.blueteam.generic.x = x;
|
|
s_advancedserver.blueteam.generic.y = y;
|
|
s_advancedserver.blueteam.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.blueteam.generic.id = ID_BLUETEAM;
|
|
s_advancedserver.blueteam.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.blueteam.color = CT_DKPURPLE1;
|
|
s_advancedserver.blueteam.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.blueteam.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.blueteam.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.blueteam.textEnum = MBT_BLUETEAMGROUP;
|
|
s_advancedserver.blueteam.textcolor = CT_BLACK;
|
|
s_advancedserver.blueteam.textcolor2 = CT_WHITE;
|
|
s_advancedserver.blueteam.itemnames = s_skinsForRace;
|
|
|
|
y += pad;
|
|
s_advancedserver.redteam.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.redteam.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.redteam.generic.x = x;
|
|
s_advancedserver.redteam.generic.y = y;
|
|
s_advancedserver.redteam.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.redteam.generic.id = ID_REDTEAM;
|
|
s_advancedserver.redteam.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.redteam.color = CT_DKPURPLE1;
|
|
s_advancedserver.redteam.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.redteam.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.redteam.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.redteam.textEnum = MBT_REDTEAMGROUP;
|
|
s_advancedserver.redteam.textcolor = CT_BLACK;
|
|
s_advancedserver.redteam.textcolor2 = CT_WHITE;
|
|
s_advancedserver.redteam.itemnames = s_skinsForRace;
|
|
|
|
y += 33;
|
|
s_advancedserver.assimilation.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.assimilation.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.assimilation.generic.x = x;
|
|
s_advancedserver.assimilation.generic.y = y;
|
|
s_advancedserver.assimilation.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.assimilation.generic.id = ID_PMOD_ASSIMILIATION;
|
|
s_advancedserver.assimilation.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.assimilation.color = CT_DKPURPLE1;
|
|
s_advancedserver.assimilation.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.assimilation.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.assimilation.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.assimilation.textEnum = MBT_ASSIMILATION;
|
|
s_advancedserver.assimilation.textcolor = CT_BLACK;
|
|
s_advancedserver.assimilation.textcolor2 = CT_WHITE;
|
|
s_advancedserver.assimilation.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
s_advancedserver.specialties.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.specialties.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.specialties.generic.x = x;
|
|
s_advancedserver.specialties.generic.y = y;
|
|
s_advancedserver.specialties.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.specialties.generic.id = ID_PMOD_SPECIALTIES;
|
|
s_advancedserver.specialties.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.specialties.color = CT_DKPURPLE1;
|
|
s_advancedserver.specialties.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.specialties.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.specialties.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.specialties.textEnum = MBT_SPECIALTIES;
|
|
s_advancedserver.specialties.textcolor = CT_BLACK;
|
|
s_advancedserver.specialties.textcolor2 = CT_WHITE;
|
|
s_advancedserver.specialties.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
s_advancedserver.disintegration.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.disintegration.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.disintegration.generic.x = x;
|
|
s_advancedserver.disintegration.generic.y = y;
|
|
s_advancedserver.disintegration.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.disintegration.generic.id = ID_PMOD_DISINTEGRATION;
|
|
s_advancedserver.disintegration.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.disintegration.color = CT_DKPURPLE1;
|
|
s_advancedserver.disintegration.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.disintegration.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.disintegration.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.disintegration.textEnum = MBT_DISINTEGRATION;
|
|
s_advancedserver.disintegration.textcolor = CT_BLACK;
|
|
s_advancedserver.disintegration.textcolor2 = CT_WHITE;
|
|
s_advancedserver.disintegration.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
s_advancedserver.elimination.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.elimination.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.elimination.generic.x = x;
|
|
s_advancedserver.elimination.generic.y = y;
|
|
s_advancedserver.elimination.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.elimination.generic.id = ID_PMOD_ELIMINATION;
|
|
s_advancedserver.elimination.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.elimination.color = CT_DKPURPLE1;
|
|
s_advancedserver.elimination.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.elimination.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.elimination.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.elimination.textEnum = MBT_ELIMINATION;
|
|
s_advancedserver.elimination.textcolor = CT_BLACK;
|
|
s_advancedserver.elimination.textcolor2 = CT_WHITE;
|
|
s_advancedserver.elimination.listnames = s_OffOnNone_Names;
|
|
|
|
y += pad;
|
|
s_advancedserver.actionhero.generic.type = MTYPE_SPINCONTROL;
|
|
s_advancedserver.actionhero.generic.flags = QMF_HIGHLIGHT_IF_FOCUS;
|
|
s_advancedserver.actionhero.generic.x = x;
|
|
s_advancedserver.actionhero.generic.y = y;
|
|
s_advancedserver.actionhero.generic.name = "menu/common/bar1.tga";
|
|
s_advancedserver.actionhero.generic.id = ID_PMOD_ACTIONHERO;
|
|
s_advancedserver.actionhero.generic.callback = AdvancedServer_Event;
|
|
s_advancedserver.actionhero.color = CT_DKPURPLE1;
|
|
s_advancedserver.actionhero.color2 = CT_LTPURPLE1;
|
|
s_advancedserver.actionhero.textX = MENU_BUTTON_TEXT_X;
|
|
s_advancedserver.actionhero.textY = MENU_BUTTON_TEXT_Y;
|
|
s_advancedserver.actionhero.textEnum = MBT_ACTIONHERO;
|
|
s_advancedserver.actionhero.textcolor = CT_BLACK;
|
|
s_advancedserver.actionhero.textcolor2 = CT_WHITE;
|
|
s_advancedserver.actionhero.listnames = s_OffOnNone_Names;
|
|
|
|
if (s_serveroptions.gametype < GT_TEAM )
|
|
{
|
|
s_advancedserver.blueteam.generic.flags |= QMF_GRAYED;
|
|
s_advancedserver.redteam.generic.flags |= QMF_GRAYED;
|
|
s_advancedserver.assimilation.generic.flags |= QMF_GRAYED;
|
|
s_advancedserver.specialties.generic.flags |= QMF_GRAYED;
|
|
|
|
s_advancedserver.blueteam.curvalue = 0;
|
|
s_advancedserver.redteam.curvalue = 0;
|
|
|
|
UI_BlankGroupTable();
|
|
}
|
|
else // A team game
|
|
{
|
|
char holdRace[256];
|
|
// Build group table
|
|
UI_BuildGroupTable();
|
|
|
|
trap_Cvar_VariableStringBuffer( "g_team_group_blue", holdRace, sizeof(holdRace) );
|
|
if (!holdRace[0])
|
|
{
|
|
Q_strncpyz(holdRace, "NONE", sizeof(holdRace));
|
|
}
|
|
s_advancedserver.blueteam.curvalue = UI_SearchGroupTable(holdRace);
|
|
|
|
trap_Cvar_VariableStringBuffer( "g_team_group_red", holdRace, sizeof(holdRace) );
|
|
if (!holdRace[0])
|
|
{
|
|
Q_strncpyz(holdRace, "NONE", sizeof(holdRace));
|
|
}
|
|
s_advancedserver.redteam.curvalue = UI_SearchGroupTable(holdRace);
|
|
|
|
s_advancedserver.actionhero.generic.flags |= QMF_GRAYED;
|
|
// s_advancedserver.elimination.generic.flags |= QMF_GRAYED;
|
|
|
|
}
|
|
|
|
s_advancedserver.errorText.generic.type = MTYPE_TEXT;
|
|
s_advancedserver.errorText.generic.flags = QMF_HIDDEN | QMF_INACTIVE;
|
|
s_advancedserver.errorText.generic.x = 400;
|
|
s_advancedserver.errorText.generic.y = 380;
|
|
s_advancedserver.errorText.style = UI_SMALLFONT | UI_CENTER;
|
|
s_advancedserver.errorText.color = colorTable[CT_WHITE];
|
|
s_advancedserver.errorText.string = (char *) menu_normal_text[MNT_ADV_ERROR];
|
|
|
|
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.mainmenu );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.back );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.autojoin );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.autobalance );
|
|
// Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.friendlyfire );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.fallingdamage );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.repawntime );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.maxclients );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.runspeed );
|
|
|
|
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.classchangetimeout);
|
|
// Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.gravity );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.knockback );
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.dmgmult );
|
|
if (!fromMenu)
|
|
{
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.bot_minplayers);
|
|
}
|
|
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.adaptitemrespawn);
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.holodeckintro);
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.forceplayerrespawn);
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.respawninvulnerability);
|
|
if (!fromMenu)
|
|
{
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.dowarmup);
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.blueteam);
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.redteam);
|
|
// if (ui_cdkeychecked2.integer == 1)
|
|
// {
|
|
// Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.assimilation);
|
|
// Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.specialties);
|
|
// Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.disintegration);
|
|
// Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.elimination);
|
|
// Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.actionhero);
|
|
// }
|
|
}
|
|
|
|
Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.errorText );
|
|
|
|
// Get values
|
|
s_advancedserver.autojoin.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_teamAutoJoin" ) );
|
|
s_advancedserver.autobalance.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_teamForceBalance" ) );
|
|
// s_advancedserver.friendlyfire.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_friendlyFire" ) );
|
|
dmflags = trap_Cvar_VariableValue( "g_dmflags" );
|
|
if (dmflags & DF_NO_FALLING)
|
|
{
|
|
s_advancedserver.fallingdamage.curvalue = qfalse;
|
|
}
|
|
else
|
|
{
|
|
s_advancedserver.fallingdamage.curvalue = qtrue;
|
|
}
|
|
s_advancedserver.adaptitemrespawn.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_adaptrespawn" ) );
|
|
s_advancedserver.holodeckintro.curvalue = Com_Clamp( 0, 1, trap_Cvar_VariableValue( "g_holointro" ) );
|
|
|
|
Com_sprintf( s_advancedserver.repawntime.field.buffer, 3, "%i", (int)Com_Clamp( 1, 60, trap_Cvar_VariableValue( "g_weaponrespawn" ) ) );
|
|
Com_sprintf( s_advancedserver.maxclients.field.buffer, 3, "%i", (int)Com_Clamp( 0, 64, trap_Cvar_VariableValue( "sv_maxclients" ) ) );
|
|
Com_sprintf( s_advancedserver.runspeed.field.buffer, 5, "%i", (int)Com_Clamp( 150, 1000, trap_Cvar_VariableValue( "g_speed" ) ) );
|
|
Com_sprintf( s_advancedserver.gravity.field.buffer, 5, "%i", (int)Com_Clamp( 0, 5000, trap_Cvar_VariableValue( "g_gravity" ) ) );
|
|
Com_sprintf( s_advancedserver.knockback.field.buffer, 6, "%i", (int)Com_Clamp( 0, 10000, trap_Cvar_VariableValue( "g_knockback" ) ) );
|
|
Com_sprintf( s_advancedserver.dmgmult.field.buffer, 12, "%f", (float)Com_Clamp( 0.0, 100.0, trap_Cvar_VariableValue( "g_dmgmult" ) ) );
|
|
Com_sprintf( s_advancedserver.bot_minplayers.field.buffer, 3, "%i", (int)Com_Clamp( 0, 64, trap_Cvar_VariableValue( "bot_minplayers" ) ) );
|
|
Com_sprintf( s_advancedserver.forceplayerrespawn.field.buffer, 3, "%i", (int)Com_Clamp( 0, 120, trap_Cvar_VariableValue( "g_forcerespawn" ) ) );
|
|
Com_sprintf( s_advancedserver.respawninvulnerability.field.buffer, 3, "%i", (int)Com_Clamp( 0, 30, trap_Cvar_VariableValue( "g_ghostRespawn" ) ) );
|
|
Com_sprintf( s_advancedserver.classchangetimeout.field.buffer, 8, "%i", (int)Com_Clamp( 0, 999999, trap_Cvar_VariableValue( "g_classChangeDebounceTime" ) ) );
|
|
|
|
holdInt = trap_Cvar_VariableValue( "g_dowarmup" );
|
|
if (holdInt == 1)
|
|
{
|
|
Com_sprintf( s_advancedserver.dowarmup.field.buffer, 3, "%i", (int)Com_Clamp( 0, 120, trap_Cvar_VariableValue( "g_warmup" ) ) );
|
|
}
|
|
else
|
|
{
|
|
Com_sprintf( s_advancedserver.dowarmup.field.buffer, 3, "%i", 0 );
|
|
}
|
|
|
|
AdvancedServerSetModButtons();
|
|
|
|
}
|
|
|
|
/*
|
|
=================
|
|
UI_ServerAdvancedOptions
|
|
=================
|
|
*/
|
|
void UI_ServerAdvancedOptions(int fromMenu)
|
|
{
|
|
UI_AdvancedServerMenu_Init(fromMenu);
|
|
UI_PushMenu( &s_advancedserver.menu );
|
|
}
|
|
|
|
|
|
// Giving credit where credit is due - I stole most of this from Jake's code.
|
|
extern char* BG_RegisterRace( const char *name );
|
|
void UI_BuildGroupTable(void)
|
|
{
|
|
int howManySkins = 0;
|
|
char filename[128];
|
|
char dirlist[8192];
|
|
int i;
|
|
char* dirptr;
|
|
char* race_list;
|
|
int numdirs;
|
|
int dirlen;
|
|
char current_race_name[125];
|
|
char *max_place;
|
|
char *s;
|
|
char *marker;
|
|
|
|
memset(skinsForRace,0,sizeof(skinsForRace));
|
|
|
|
Q_strncpyz(skinsForRace[0],"",sizeof(skinsForRace[0]));
|
|
s_skinsForRace[0] = skinsForRace[0];
|
|
|
|
// search through each and every skin we can find
|
|
numdirs = trap_FS_GetFileList("models/players_rpgx", "/", dirlist, sizeof(dirlist) );
|
|
dirptr = dirlist;
|
|
for (i=0; i<numdirs && howManySkins < MAX_SKINS_FOR_RACE; i++,dirptr+=dirlen+1)
|
|
{
|
|
dirlen = strlen(dirptr);
|
|
|
|
if (!dirlen) {
|
|
continue;
|
|
}
|
|
|
|
if (dirptr[dirlen-1]=='/') {
|
|
dirptr[dirlen-1]='\0';
|
|
}
|
|
|
|
if (!strcmp(dirptr,".") || !strcmp(dirptr,"..")) {
|
|
continue;
|
|
}
|
|
|
|
// Get group names for this model
|
|
Com_sprintf(filename, sizeof(filename), "models/players_rpgx/%s/groups.cfg", dirptr);
|
|
race_list = BG_RegisterRace(filename);
|
|
max_place = race_list + strlen(race_list);
|
|
s = race_list;
|
|
|
|
// look through the list till it's empty
|
|
while (s < max_place)
|
|
{
|
|
marker = s;
|
|
// figure out from where we are where the next ',' or 0 is
|
|
while (*s != ',' && *s != 0)
|
|
{
|
|
s++;
|
|
}
|
|
|
|
// copy just that name
|
|
Q_strncpyz(current_race_name, marker, (s-marker)+1);
|
|
|
|
//Search table for a matching entry
|
|
UI_SearchGroupTable(current_race_name);
|
|
|
|
// avoid the comma or increment us past the end of the string so we fail the main while loop
|
|
s++;
|
|
}
|
|
}
|
|
|
|
UI_SearchGroupTable("NONE"); // Add this
|
|
|
|
}
|
|
|
|
static int UI_SearchGroupTable(char *current_race)
|
|
{
|
|
int i;
|
|
|
|
i=0;
|
|
while (skinsForRace[i][0])
|
|
{
|
|
if (!strcmp(current_race,skinsForRace[i]))
|
|
{
|
|
return i;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
Q_strncpyz(skinsForRace[i],current_race,strlen(current_race)+1);
|
|
s_skinsForRace[i] = skinsForRace[i];
|
|
|
|
return i;
|
|
}
|
|
|
|
static void UI_BlankGroupTable(void)
|
|
{
|
|
skinsForRace[0][0] = '\0';
|
|
s_skinsForRace[0] = skinsForRace[0];
|
|
}
|