// 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 4 #define MAX_SERVERSTEXT 8192 #define MAX_SERVERMAPS 64 #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 void UI_BuildGroupTable(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 quadfactor; menufield_s bot_minplayers; // Second column menulist_s adaptitemrespawn; menulist_s holodeckintro; menufield_s forceplayerrespawn; menufield_s respawninvulnerability; menufield_s dowarmup; menulist_s blueteam; menulist_s redteam; 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; 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 int gametype_remap[] = {GT_FFA, GT_TEAM, GT_CTF}; static int gametype_remap2[] = {0, 0, 0, 1, 2}; static void UI_ServerOptionsMenu( qboolean multiplayer ); static int UI_SearchGroupTable(char *current_race); /* ================= 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; continue; } if( Q_stricmp( token, "tourney" ) == 0 ) { bits |= 1 << GT_TOURNAMENT; continue; } if( Q_stricmp( token, "single" ) == 0 ) { bits |= 1 << GT_SINGLE_PLAYER; 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= 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=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(); } /* ================= 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_Update(); } /* ================= StartServer_MenuEvent ================= */ static void StartServer_MenuEvent( void* ptr, int event ) { if( event != QM_ACTIVATED ) { return; } switch( ((menucommon_s*)ptr)->id ) { 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: 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; } UI_DrawProportionalString( x + 2, y +2, va("%s:%d",menu_normal_text[MNT_RECOMMENDEDPLAYERS],s_startserver.maprecommended[n]), UI_TINYFONT, colorTable[CT_LTGOLD1] ); y += b->height; // UI_FillRect( x, y, b->width, 28, colorBlack ); //blank the text box x += b->width / 2; y += 4; UI_DrawProportionalString( x, y, s_startserver.maplongname[n], UI_CENTER|UI_SMALLFONT, colorTable[color] ); 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 ); } } /* ================= StartServer_Graphics ================= */ void StartServer_Graphics (void) { UI_MenuFrame2(&s_startserver.menu); trap_R_SetColor( colorTable[CT_DKBROWN1]); UI_DrawHandlePic(30,203, 47, 106, uis.whiteShader); // Left side of frame UI_DrawHandlePic(30,312, 47, 106, uis.whiteShader); // Left side of frame // Level pics frame trap_R_SetColor( colorTable[CT_DKBROWN1]); UI_DrawHandlePic(191, 320, 32, 32,s_startserver.corner_ll); UI_DrawHandlePic(479, 320, 32, 32,s_startserver.corner_lr); UI_DrawHandlePic(191, 64, 18, 252, uis.whiteShader); // Left side line UI_DrawHandlePic(483, 64, 18, 252, uis.whiteShader); // Right side line UI_DrawHandlePic(191, 56, 310, 8, uis.whiteShader); // Top UI_DrawHandlePic(204, 324, 15, 18, uis.whiteShader); // Bottom UI_DrawHandlePic(222, 324, 22, 18, uis.whiteShader); // Bottom UI_DrawHandlePic(247, 324, 198, 18, uis.whiteShader); // Bottom UI_DrawHandlePic(448, 324, 22, 18, uis.whiteShader); // Bottom UI_DrawHandlePic(474, 324, 21, 18, uis.whiteShader); // Bottom UI_DrawProportionalString( 74, 30, "6801",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString( 74, 153, "676",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString( 74, 209, "655",UI_RIGHT|UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString( 74, 317, "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); } 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; 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; picWidth = 128; // 128 picHeight = 96; // 96 y = 66; x = 212; for (i=0; i= GT_TEAM) && (s_serveroptions.playerTeam[n].curvalue != s_serveroptions.playerTeam[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]; 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_friendlt", friendlyfire ); break; case GT_CTF: trap_Cvar_SetValue( "ui_ctf_fraglimit", fraglimit ); trap_Cvar_SetValue( "ui_ctf_timelimit", timelimit ); trap_Cvar_SetValue( "ui_ctf_friendlt", 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_SetValue( "sv_pure", pure ); trap_Cvar_Set("sv_hostname", s_serveroptions.hostname.field.buffer ); // 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\n", s_serveroptions.playerNameBuffers[n], skill, menu_normal_text[playerTeam_list[s_serveroptions.playerTeam[n].curvalue]] ); } else { Com_sprintf( buf, sizeof(buf), "addbot %s %i\n", s_serveroptions.playerNameBuffers[n], skill ); } trap_Cmd_ExecuteText( EXEC_APPEND, buf ); } // set player's team if( dedicated == 0 && s_serveroptions.gametype >= GT_TEAM ) { trap_Cmd_ExecuteText( EXEC_APPEND, va( "wait 5; team %s\n", menu_normal_text[playerTeam_list[s_serveroptions.playerTeam[0].curvalue]] ) ); } } /* ================= 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); } } } /* ================= 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; } // 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_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), 164, 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, 40, colorBlack ); x += b->width / 2; y += 4; UI_DrawProportionalString( x, y, s_startserver.maplongname[s_startserver.currentmap], UI_CENTER|UI_SMALLFONT, colorTable[CT_LTGOLD1] ); y += SMALLCHAR_HEIGHT; UI_DrawProportionalString( x, y, menu_normal_text[gametype_items[gametype_remap2[s_serveroptions.gametype]]], UI_CENTER|UI_SMALLFONT, colorTable[CT_LTGOLD1] ); } 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 ); if( s_serveroptions.gametype == GT_TEAM ) { Q_strncpyz( s_serveroptions.playerNameBuffers[3], "Chakotay", 16 ); } else { s_serveroptions.playerType[3].curvalue = 2; } s_serveroptions.playerType[4].curvalue = 2; s_serveroptions.playerType[5].curvalue = 2; Q_strncpyz( s_serveroptions.playerNameBuffers[6], "Gowron", 16 ); Q_strncpyz( s_serveroptions.playerNameBuffers[7], "1_of_12", 16 ); Q_strncpyz( s_serveroptions.playerNameBuffers[8], "2_of_3 ", 16 ); if( s_serveroptions.gametype == GT_TEAM ) { Q_strncpyz( s_serveroptions.playerNameBuffers[9], "3_of_6", 16 ); } else { s_serveroptions.playerType[9].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 ); UI_DrawString( x + SMALLCHAR_WIDTH, y, s->string, style|UI_LEFT, color ); } /* ================= 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_MenuInit ================= */ //#define OPTIONS_X 456 #define OPTIONS_X 488 static void ServerOptions_MenuInit( qboolean multiplayer ) { int x,y,yInc; int n; memset( &s_serveroptions, 0 ,sizeof(serveroptions_t) ); s_serveroptions.multiplayer = multiplayer; s_serveroptions.gametype = (int)Com_Clamp( 0, 5, trap_Cvar_VariableValue( "g_gameType" ) ); 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 = 83; 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; yInc = BIGCHAR_HEIGHT + 4; 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_SMALLFONT; s_serveroptions.playerTeam[n].generic.callback = ServerOptions_Event; s_serveroptions.playerTeam[n].generic.id = ID_PLAYER_TEAM; s_serveroptions.playerTeam[n].generic.x = 312; s_serveroptions.playerTeam[n].generic.y = y; s_serveroptions.playerTeam[n].listnames = playerTeam_list; s_serveroptions.playerTeam[n].listX = 1; s_serveroptions.playerTeam[n].listY = 1; s_serveroptions.playerTeam[n].focusWidth = 40; s_serveroptions.playerTeam[n].focusHeight = 18; s_serveroptions.playerTeam[n].color = CT_DKPURPLE1; s_serveroptions.playerTeam[n].color2 = CT_LTPURPLE1; 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.gametype != GT_CTF ) { Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.fraglimit ); } else { Menu_AddItem( &s_serveroptions.menu, &s_serveroptions.flaglimit ); } 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_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"); } /* ================= 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; 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] ); 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; 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|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 ); } #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_QUADFACTOR 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 ERR_RESPAWNTIME 1 #define ERR_MAXCLIENTS 2 #define ERR_RUNSPEED 3 #define ERR_GRAVITY 4 #define ERR_KNOCKBACK 5 #define ERR_QUADFACTOR 6 #define ERR_BOT_MINPLAYERS 7 #define ERR_FORCEPLAYERRESPAWN 8 #define ERR_RESPAWNINVULNERABILITY 9 #define ERR_DOWARMUP 10 /* ================= 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.quadfactor.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; 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.quadfactor.field.buffer ); if ((holdFloat < 1.0) || (holdFloat > 10.0)) { s_advancedserver.errorFlag = ERR_QUADFACTOR; s_advancedserver.quadfactor.field.titlecolor = CT_LTRED1; Menu_SetCursorToItem(&s_advancedserver.menu,&s_advancedserver.quadfactor); return; } trap_Cvar_SetValue( "g_quadfactor", 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; } /* ================= AdvancedServer_Event ================= */ static void AdvancedServer_Event( void* ptr, int notification ) { int dmflags; if( notification != QM_ACTIVATED ) { return; } switch( ((menucommon_s*)ptr)->id ) { case ID_BLUETEAM: if (s_advancedserver.blueteam.curvalue) { trap_Cvar_Set( "g_team_group_blue", s_skinsForRace[s_advancedserver.blueteam.curvalue] ); } else { trap_Cvar_Set( "g_team_group_blue", "" ); } break; case ID_REDTEAM: if (s_advancedserver.redteam.curvalue) { trap_Cvar_Set( "g_team_group_red", s_skinsForRace[s_advancedserver.redteam.curvalue] ); } else { trap_Cvar_Set( "g_team_group_red", "" ); } 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 { UI_MainMenu(); } break; case ID_BACK: AdvancedServer_Update(); if (!s_advancedserver.errorFlag) // No error with data { 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_QUADFACTOR : s_advancedserver.errorText.generic.flags &= ~QMF_HIDDEN; s_advancedserver.errorText.generic.y = s_advancedserver.quadfactor.generic.y; s_advancedserver.errorText.generic.x = s_advancedserver.quadfactor.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; } // 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_QUADFACTOR: UI_DrawProportionalString( x, y, menu_normal_text[MNT_ADV_STATUS1_QUADFACTOR], UI_SMALLFONT, colorTable[CT_WHITE]); UI_DrawProportionalString( x, (y+ PROP_HEIGHT + 2), menu_normal_text[MNT_ADV_STATUS2_QUADFACTOR], 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; } } /* ================= 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 += 170; 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.quadfactor.generic.type = MTYPE_FIELD; s_advancedserver.quadfactor.generic.flags = QMF_NUMBERSONLY|QMF_SMALLFONT; s_advancedserver.quadfactor.generic.x = x; s_advancedserver.quadfactor.generic.y = y; s_advancedserver.quadfactor.generic.id = ID_QUADFACTOR; s_advancedserver.quadfactor.generic.callback = AdvancedServer_Event; s_advancedserver.quadfactor.generic.statusbar = ServerAdvanced_StatusBar; s_advancedserver.quadfactor.field.widthInChars = 5; s_advancedserver.quadfactor.field.maxchars = 5; s_advancedserver.quadfactor.field.style = UI_SMALLFONT; s_advancedserver.quadfactor.field.titleEnum = MBT_QUADFACTOR; s_advancedserver.quadfactor.field.titlecolor = CT_LTGOLD1; s_advancedserver.quadfactor.field.textcolor = CT_DKGOLD1; s_advancedserver.quadfactor.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; // Second column x = 350; 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 += 170; 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 * 3); x = 350; 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; if (s_serveroptions.gametype < GT_TEAM ) { s_advancedserver.blueteam.generic.flags |= QMF_GRAYED; s_advancedserver.redteam.generic.flags |= QMF_GRAYED; } else { char holdRace[256]; // Build group table UI_BuildGroupTable(); trap_Cvar_VariableStringBuffer( "g_team_group_blue", holdRace, sizeof(holdRace) ); if (!holdRace[0]) { Q_strncpyz(holdRace, "", 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, "", sizeof(holdRace)); } s_advancedserver.redteam.curvalue = UI_SearchGroupTable(holdRace); } 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.gravity ); Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.knockback ); Menu_AddItem( &s_advancedserver.menu, &s_advancedserver.quadfactor); 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); } 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.quadfactor.field.buffer, 10, "%f", (float)Com_Clamp( 1.0, 10.0, trap_Cvar_VariableValue( "g_quadfactor" ) ) ); 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" ) ) ); 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 ); } } /* ================= 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[2048]; 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/players2", "/", dirlist, 2048 ); dirptr = dirlist; for (i=0; i