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