/* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. This file is part of Quake III Arena source code. Quake III Arena source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Quake III Arena source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Quake III Arena source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ #include "client.h" #include "../server/server.h" #include "../renderer/tr_public.h" #include "tiki.h" #include #include "cl_ui.h" #if _MSC_VER #include #endif typedef struct { float fadetime; float starttime; float endtime; float alpha_start; float alpha_end; UIReggedMaterial *material; } intro_stage_t; static qboolean ui_hud; static class UIFont *globalFont; static UIFloatingConsole *fakk_console; static UIFloatingDMConsole *dm_console; static UIFloatingConsole *developer_console; static FakkMiniconsole *mini_console; static UIGMBox *gmbox; static UIDMBox *dmbox; static View3D *view3d; static Menu *mainmenu; static Menu *hud_weapons; static Menu *hud_items; static Menu *hud_health; static Menu *hud_ammo; static Menu *hud_compass; static Menu *hud_boss; static Menu *crosshairhud; static Menu *missionLog; qboolean server_loading; static qboolean server_loading_waiting; static str *s_intermediateconsole; static int ui_lastWeapHudState_Owned; static int ui_lastWeapHudState_Equipped = 0xFFFF; static int ui_weapHudTime; static int ui_itemHudTime; Menu *ui_pLoadingMenu; static Menu *ui_pConnectingMenu; static_media_t ui_static_materials; cvar_t *cl_greenfps; cvar_t *ui_GunneryEvaluation; cvar_t *ui_GroinShots; cvar_t *ui_RightArmShots; cvar_t *ui_LeftArmShots; cvar_t *ui_RightLegShots; cvar_t *ui_LeftLegShots; cvar_t *ui_TorsoShots; cvar_t *ui_HeadShots; cvar_t *ui_NumEnemysKilled; cvar_t *ui_NumObjectsDestroyed; cvar_t *ui_NumHitsTaken; cvar_t *ui_PreferredWeapon; cvar_t *ui_Accuracy; cvar_t *ui_NumObjectives; cvar_t *ui_NumComplete; cvar_t *ui_NumHits; cvar_t *ui_NumShotsFired; cvar_t *ui_gotmedal; cvar_t *ui_success; cvar_t *ui_failed; cvar_t *ui_returnmenu; cvar_t *ui_skip_eamovie; cvar_t *ui_skip_titlescreen; cvar_t *ui_skip_legalscreen; cvar_t *ui_titlescreen_fadein; cvar_t *ui_titlescreen_fadeout; cvar_t *ui_titlescreen_stay; cvar_t *ui_legalscreen_fadein; cvar_t *ui_legalscreen_fadeout; cvar_t *ui_legalscreen_stay; cvar_t *ui_drawcoords; cvar_t *ui_minicon; cvar_t *ui_gmbox; cvar_t *ui_consoleposition; cvar_t *ui_inventoryfile; cvar_t *ui_console; cvar_t *ui_newvidmode; cvar_t *ui_crosshair; cvar_t *ui_compass; cvar_t *ui_weaponsbar; cvar_t *ui_weaponsbartime; cvar_t *ui_itemsbar; cvar_t *ui_health_start; cvar_t *ui_health_end; cvar_t *ui_gmboxspam; cvar_t *ui_debugload; cvar_t *sound_overlay; static intro_stage_t intro_stage; static char server_mapname[ 64 ]; static UIListCtrl *scoreboardlist; static Menu *scoreboard_menu; static float scoreboard_x; static float scoreboard_y; static float scoreboard_w; static float scoreboard_h; static qboolean scoreboard_header; cvar_t *cl_playintro; cvar_t *cl_movieaudio; static unsigned int startCountLow; static unsigned int startCountHigh; static unsigned int loadCountLow; static unsigned int loadCountHigh; static unsigned int loadCount; static unsigned int lastTime; static unsigned int loadNumber; static unsigned int totalLoadTime; static unsigned int currentLoadTime; unsigned char UIListCtrlItem[ 8 ]; inventory_t client_inv; bind_t client_bind; static str scoreboard_menuname; static str ui_sCurrentLoadingMenu; static Container hudList; void UI_MultiplayerMenuWidgetsUpdate(void); void UI_MainMenuWidgetsUpdate(void); class ConsoleHider : public Listener { public: CLASS_PROTOTYPE( ConsoleHider ); void HideConsole( Event *ev ); void DeadConsole( Event *ev ); }; CLASS_DECLARATION( Listener, ConsoleHider, NULL ) { { NULL, NULL } }; void ConsoleHider::HideConsole( Event *ev ) { UI_CloseConsole(); } void ConsoleHider::DeadConsole( Event *ev ) { if( fakk_console && !fakk_console->IsDying() ) { delete fakk_console; fakk_console = NULL; } } /* ==================== ConsoleCommandHandler ==================== */ static void ConsoleCommandHandler( const char *txt ) { Cbuf_AddText( txt ); } /* ==================== getDefaultConsoleRectangle ==================== */ static UIRect2D getDefaultConsoleRectangle( void ) { float f[ 4 ]; int i; UIRect2D rect; if( sscanf( ui_consoleposition->string, "%f %f %f %f", &f[ 0 ], &f[ 1 ], &f[ 2 ], &f[ 3 ] ) == 4 ) { for( i = 0; i < 4; i++ ) { f[ i ] = floor( f[ i ] ); } rect.pos.x = f[ 0 ] - cls.glconfig.vidWidth; rect.pos.y = f[ 1 ] - cls.glconfig.vidHeight; rect.size.width = f[ 2 ] + 50.0; rect.size.height = f[ 3 ] + 50.0; } else { rect.pos.x = 25.0; rect.pos.y = 25.0; rect.size.width = ( cls.glconfig.vidWidth - 50 ); rect.size.height = ( cls.glconfig.vidHeight / 2 ); } return rect; } static ConsoleHider s_consolehider; class DMConsoleHider : public Listener { public: CLASS_PROTOTYPE( DMConsoleHider ); void HideDMConsole( Event *ev ); void DeadDMConsole( Event *ev ); }; CLASS_DECLARATION( Listener, DMConsoleHider, NULL ) { { NULL, NULL } }; void DMConsoleHider::HideDMConsole( Event *ev ) { UI_CloseDMConsole(); } void DMConsoleHider::DeadDMConsole( Event *ev ) { if( dm_console && !dm_console->IsDying() ) { delete dm_console; dm_console = NULL; } } static DMConsoleHider s_dmconsolehider; /* ==================== GetClientState ==================== */ static void GetClientState( uiClientState_t *state ) { state->connectPacketCount = clc.connectPacketCount; state->connState = cls.state; Q_strncpyz( state->servername, cls.servername, sizeof( state->servername ) ); Q_strncpyz( state->updateInfoString, cls.updateInfoString, sizeof( state->updateInfoString ) ); Q_strncpyz( state->messageString, clc.serverMessage, sizeof( state->messageString ) ); state->clientNum = cl.snap.ps.clientNum; } /* ==================== LAN_LoadCachedServers ==================== */ void LAN_LoadCachedServers( void ) { int size; fileHandle_t fileIn; cls.numglobalservers = cls.nummplayerservers = cls.numfavoriteservers = 0; cls.numGlobalServerAddresses = 0; if (FS_SV_FOpenFileRead("servercache.dat", &fileIn)) { FS_Read(&cls.numglobalservers, sizeof(int), fileIn); FS_Read(&cls.nummplayerservers, sizeof(int), fileIn); FS_Read(&cls.numfavoriteservers, sizeof(int), fileIn); FS_Read(&size, sizeof(int), fileIn); if (size == sizeof(cls.globalServers) + sizeof(cls.favoriteServers) + sizeof(cls.mplayerServers)) { FS_Read(&cls.globalServers, sizeof(cls.globalServers), fileIn); FS_Read(&cls.mplayerServers, sizeof(cls.mplayerServers), fileIn); FS_Read(&cls.favoriteServers, sizeof(cls.favoriteServers), fileIn); } else { cls.numglobalservers = cls.nummplayerservers = cls.numfavoriteservers = 0; cls.numGlobalServerAddresses = 0; } FS_FCloseFile(fileIn); } } /* ==================== LAN_SaveServersToCache ==================== */ void LAN_SaveServersToCache( void ) { int size; fileHandle_t fileOut = FS_SV_FOpenFileWrite("servercache.dat"); FS_Write(&cls.numglobalservers, sizeof(int), fileOut); FS_Write(&cls.nummplayerservers, sizeof(int), fileOut); FS_Write(&cls.numfavoriteservers, sizeof(int), fileOut); size = sizeof(cls.globalServers) + sizeof(cls.favoriteServers) + sizeof(cls.mplayerServers); FS_Write(&size, sizeof(int), fileOut); FS_Write(&cls.globalServers, sizeof(cls.globalServers), fileOut); FS_Write(&cls.mplayerServers, sizeof(cls.mplayerServers), fileOut); FS_Write(&cls.favoriteServers, sizeof(cls.favoriteServers), fileOut); FS_FCloseFile(fileOut); } /* ==================== LAN_ResetPings ==================== */ static void LAN_ResetPings(int source) { int count,i; serverInfo_t *servers = NULL; count = 0; switch (source) { case AS_LOCAL : servers = &cls.localServers[0]; count = MAX_OTHER_SERVERS; break; case AS_MPLAYER : servers = &cls.mplayerServers[0]; count = MAX_OTHER_SERVERS; break; case AS_GLOBAL : servers = &cls.globalServers[0]; count = MAX_GLOBAL_SERVERS; break; case AS_FAVORITES : servers = &cls.favoriteServers[0]; count = MAX_OTHER_SERVERS; break; } if (servers) { for (i = 0; i < count; i++) { servers[i].ping = -1; } } } /* ==================== LAN_AddServer ==================== */ static int LAN_AddServer(int source, const char *name, const char *address) { int max, *count, i; netadr_t adr; serverInfo_t *servers = NULL; max = MAX_OTHER_SERVERS; count = NULL; switch (source) { case AS_LOCAL : count = &cls.numlocalservers; servers = &cls.localServers[0]; break; case AS_MPLAYER : count = &cls.nummplayerservers; servers = &cls.mplayerServers[0]; break; case AS_GLOBAL : max = MAX_GLOBAL_SERVERS; count = &cls.numglobalservers; servers = &cls.globalServers[0]; break; case AS_FAVORITES : count = &cls.numfavoriteservers; servers = &cls.favoriteServers[0]; break; } if (servers && *count < max) { NET_StringToAdr( address, &adr ); for ( i = 0; i < *count; i++ ) { if (NET_CompareAdr(servers[i].adr, adr)) { break; } } if (i >= *count) { servers[*count].adr = adr; Q_strncpyz(servers[*count].hostName, name, sizeof(servers[*count].hostName)); servers[*count].visible = qtrue; (*count)++; return 1; } return 0; } return -1; } /* ==================== LAN_RemoveServer ==================== */ static void LAN_RemoveServer(int source, const char *addr) { int *count, i; serverInfo_t *servers = NULL; count = NULL; switch (source) { case AS_LOCAL : count = &cls.numlocalservers; servers = &cls.localServers[0]; break; case AS_MPLAYER : count = &cls.nummplayerservers; servers = &cls.mplayerServers[0]; break; case AS_GLOBAL : count = &cls.numglobalservers; servers = &cls.globalServers[0]; break; case AS_FAVORITES : count = &cls.numfavoriteservers; servers = &cls.favoriteServers[0]; break; } if (servers) { netadr_t comp; NET_StringToAdr( addr, &comp ); for (i = 0; i < *count; i++) { if (NET_CompareAdr( comp, servers[i].adr)) { int j = i; while (j < *count - 1) { Com_Memcpy(&servers[j], &servers[j+1], sizeof(servers[j])); j++; } (*count)--; break; } } } } /* ==================== LAN_GetServerCount ==================== */ static int LAN_GetServerCount( int source ) { switch (source) { case AS_LOCAL : return cls.numlocalservers; break; case AS_MPLAYER : return cls.nummplayerservers; break; case AS_GLOBAL : return cls.numglobalservers; break; case AS_FAVORITES : return cls.numfavoriteservers; break; } return 0; } /* ==================== LAN_GetLocalServerAddressString ==================== */ static void LAN_GetServerAddressString( int source, int n, char *buf, int buflen ) { switch (source) { case AS_LOCAL : if (n >= 0 && n < MAX_OTHER_SERVERS) { Q_strncpyz(buf, NET_AdrToString( cls.localServers[n].adr) , buflen ); return; } break; case AS_MPLAYER : if (n >= 0 && n < MAX_OTHER_SERVERS) { Q_strncpyz(buf, NET_AdrToString( cls.mplayerServers[n].adr) , buflen ); return; } break; case AS_GLOBAL : if (n >= 0 && n < MAX_GLOBAL_SERVERS) { Q_strncpyz(buf, NET_AdrToString( cls.globalServers[n].adr) , buflen ); return; } break; case AS_FAVORITES : if (n >= 0 && n < MAX_OTHER_SERVERS) { Q_strncpyz(buf, NET_AdrToString( cls.favoriteServers[n].adr) , buflen ); return; } break; } buf[0] = '\0'; } /* ==================== LAN_GetServerInfo ==================== */ static void LAN_GetServerInfo( int source, int n, char *buf, int buflen ) { char info[MAX_STRING_CHARS]; serverInfo_t *server = NULL; info[0] = '\0'; switch (source) { case AS_LOCAL : if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.localServers[n]; } break; case AS_MPLAYER : if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.mplayerServers[n]; } break; case AS_GLOBAL : if (n >= 0 && n < MAX_GLOBAL_SERVERS) { server = &cls.globalServers[n]; } break; case AS_FAVORITES : if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.favoriteServers[n]; } break; } if (server && buf) { buf[0] = '\0'; Info_SetValueForKey( info, "hostname", server->hostName); Info_SetValueForKey( info, "mapname", server->mapName); Info_SetValueForKey( info, "clients", va("%i",server->clients)); Info_SetValueForKey( info, "sv_maxclients", va("%i",server->maxClients)); Info_SetValueForKey( info, "ping", va("%i",server->ping)); Info_SetValueForKey( info, "minping", va("%i",server->minPing)); Info_SetValueForKey( info, "maxping", va("%i",server->maxPing)); Info_SetValueForKey( info, "game", server->game); Info_SetValueForKey( info, "gametype", va("%i",server->gameType)); Info_SetValueForKey( info, "nettype", va("%i",server->netType)); Info_SetValueForKey( info, "addr", NET_AdrToString(server->adr)); Q_strncpyz(buf, info, buflen); } else { if (buf) { buf[0] = '\0'; } } } /* ==================== LAN_GetServerPing ==================== */ static int LAN_GetServerPing( int source, int n ) { serverInfo_t *server = NULL; switch (source) { case AS_LOCAL : if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.localServers[n]; } break; case AS_MPLAYER : if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.mplayerServers[n]; } break; case AS_GLOBAL : if (n >= 0 && n < MAX_GLOBAL_SERVERS) { server = &cls.globalServers[n]; } break; case AS_FAVORITES : if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.favoriteServers[n]; } break; } if (server) { return server->ping; } return -1; } /* ==================== LAN_GetServerPtr ==================== */ static serverInfo_t *LAN_GetServerPtr( int source, int n ) { switch (source) { case AS_LOCAL : if (n >= 0 && n < MAX_OTHER_SERVERS) { return &cls.localServers[n]; } break; case AS_MPLAYER : if (n >= 0 && n < MAX_OTHER_SERVERS) { return &cls.mplayerServers[n]; } break; case AS_GLOBAL : if (n >= 0 && n < MAX_GLOBAL_SERVERS) { return &cls.globalServers[n]; } break; case AS_FAVORITES : if (n >= 0 && n < MAX_OTHER_SERVERS) { return &cls.favoriteServers[n]; } break; } return NULL; } /* ==================== LAN_CompareServers ==================== */ static int LAN_CompareServers( int source, int sortKey, int sortDir, int s1, int s2 ) { int res; serverInfo_t *server1, *server2; server1 = LAN_GetServerPtr(source, s1); server2 = LAN_GetServerPtr(source, s2); if (!server1 || !server2) { return 0; } res = 0; switch( sortKey ) { case SORT_HOST: res = Q_stricmp( server1->hostName, server2->hostName ); break; case SORT_MAP: res = Q_stricmp( server1->mapName, server2->mapName ); break; case SORT_CLIENTS: if (server1->clients < server2->clients) { res = -1; } else if (server1->clients > server2->clients) { res = 1; } else { res = 0; } break; case SORT_GAME: if (server1->gameType < server2->gameType) { res = -1; } else if (server1->gameType > server2->gameType) { res = 1; } else { res = 0; } break; case SORT_PING: if (server1->ping < server2->ping) { res = -1; } else if (server1->ping > server2->ping) { res = 1; } else { res = 0; } break; } if (sortDir) { if (res < 0) return 1; if (res > 0) return -1; return 0; } return res; } /* ==================== LAN_GetPingQueueCount ==================== */ static int LAN_GetPingQueueCount( void ) { return (CL_GetPingQueueCount()); } /* ==================== LAN_ClearPing ==================== */ static void LAN_ClearPing( int n ) { CL_ClearPing( n ); } /* ==================== LAN_GetPing ==================== */ static void LAN_GetPing( int n, char *buf, int buflen, int *pingtime ) { CL_GetPing( n, buf, buflen, pingtime ); } /* ==================== LAN_GetPingInfo ==================== */ static void LAN_GetPingInfo( int n, char *buf, int buflen ) { CL_GetPingInfo( n, buf, buflen ); } /* ==================== LAN_MarkServerVisible ==================== */ static void LAN_MarkServerVisible(int source, int n, qboolean visible ) { if (n == -1) { int count = MAX_OTHER_SERVERS; serverInfo_t *server = NULL; switch (source) { case AS_LOCAL : server = &cls.localServers[0]; break; case AS_MPLAYER : server = &cls.mplayerServers[0]; break; case AS_GLOBAL : server = &cls.globalServers[0]; count = MAX_GLOBAL_SERVERS; break; case AS_FAVORITES : server = &cls.favoriteServers[0]; break; } if (server) { for (n = 0; n < count; n++) { server[n].visible = visible; } } } else { switch (source) { case AS_LOCAL : if (n >= 0 && n < MAX_OTHER_SERVERS) { cls.localServers[n].visible = visible; } break; case AS_MPLAYER : if (n >= 0 && n < MAX_OTHER_SERVERS) { cls.mplayerServers[n].visible = visible; } break; case AS_GLOBAL : if (n >= 0 && n < MAX_GLOBAL_SERVERS) { cls.globalServers[n].visible = visible; } break; case AS_FAVORITES : if (n >= 0 && n < MAX_OTHER_SERVERS) { cls.favoriteServers[n].visible = visible; } break; } } } /* ======================= LAN_ServerIsVisible ======================= */ static int LAN_ServerIsVisible(int source, int n ) { switch (source) { case AS_LOCAL : if (n >= 0 && n < MAX_OTHER_SERVERS) { return cls.localServers[n].visible; } break; case AS_MPLAYER : if (n >= 0 && n < MAX_OTHER_SERVERS) { return cls.mplayerServers[n].visible; } break; case AS_GLOBAL : if (n >= 0 && n < MAX_GLOBAL_SERVERS) { return cls.globalServers[n].visible; } break; case AS_FAVORITES : if (n >= 0 && n < MAX_OTHER_SERVERS) { return cls.favoriteServers[n].visible; } break; } return qfalse; } /* ======================= LAN_UpdateVisiblePings ======================= */ qboolean LAN_UpdateVisiblePings(int source ) { return CL_UpdateVisiblePings_f(source); } /* ==================== LAN_GetServerStatus ==================== */ int LAN_GetServerStatus( const char *serverAddress, char *serverStatus, int maxLen ) { return CL_ServerStatus( serverAddress, serverStatus, maxLen ); } /* ==================== CL_GetGlConfig ==================== */ static void CL_GetGlconfig( glconfig_t *config ) { *config = cls.glconfig; } /* ==================== CL_GetClipboardData ==================== */ static void CL_GetClipboardData( char *buf, int buflen ) { char *cbd; cbd = Sys_GetClipboardData(); if ( !cbd ) { *buf = 0; return; } Q_strncpyz( buf, cbd, buflen ); Z_Free( cbd ); } /* ==================== Key_KeynumToStringBuf ==================== */ static void Key_KeynumToStringBuf( int keynum, char *buf, int buflen ) { Q_strncpyz( buf, Key_KeynumToString( keynum ), buflen ); } /* ==================== Key_GetBindingBuf ==================== */ static void Key_GetBindingBuf( int keynum, char *buf, int buflen ) { char *value; value = Key_GetBinding( keynum ); if ( value ) { Q_strncpyz( buf, value, buflen ); } else { *buf = 0; } } /* ==================== GetConfigString ==================== */ static int GetConfigString(int index, char *buf, int size) { int offset; if (index < 0 || index >= MAX_CONFIGSTRINGS) return qfalse; offset = cl.gameState.stringOffsets[index]; if (!offset) { if( size ) { buf[0] = 0; } return qfalse; } Q_strncpyz( buf, cl.gameState.stringData+offset, size); return qtrue; } /* ==================== FloatAsInt ==================== */ static int FloatAsInt( float f ) { int temp; *(float *)&temp = f; return temp; } qboolean UI_usesUniqueCDKey( void ) { return qfalse; } /* ==================== getDefaultConsoleRectangle ==================== */ static UIRect2D getDefaultDMConsoleRectangle( void ) { float f[ 4 ]; int i; UIRect2D rect; if( sscanf( ui_consoleposition->string, "%f %f %f %f", &f[ 0 ], &f[ 1 ], &f[ 2 ], &f[ 3 ] ) == 4 ) { for( i = 0; i < 4; i++ ) { f[ i ] = floor( f[ i ] ); } rect.pos.x = f[ 0 ] - cls.glconfig.vidWidth; rect.pos.y = f[ 1 ] - cls.glconfig.vidHeight; rect.size.width = f[ 2 ] + 50.0; rect.size.height = f[ 3 ] + 50.0; } else { rect.pos.x = 0; rect.pos.y = cls.glconfig.vidHeight * 0.58; rect.size.width = cls.glconfig.vidWidth; rect.size.height = cls.glconfig.vidHeight * 0.415; } return rect; } /* ==================== getDefaultConsoleRectangle ==================== */ static UIRect2D getQuickMessageDMConsoleRectangle( void ) { float f[ 4 ]; int i; UIRect2D rect; if( sscanf( ui_consoleposition->string, "%f %f %f %f", &f[ 0 ], &f[ 1 ], &f[ 2 ], &f[ 3 ] ) == 4 ) { for( i = 0; i < 4; i++ ) { f[ i ] = floor( f[ i ] ); } rect.pos.x = f[ 0 ] - cls.glconfig.vidWidth; rect.pos.y = f[ 1 ] - cls.glconfig.vidHeight; rect.size.width = f[ 2 ] + 50.0; rect.size.height = f[ 3 ] + 50.0; } else { rect.pos.x = 0; rect.pos.y = cls.glconfig.vidHeight * 0.65; rect.size.width = cls.glconfig.vidWidth; rect.size.height = 38.0; } return rect; } /* ==================== UI_DMMessageModesMatch ==================== */ static qboolean UI_DMMessageModesMatch( int iMode ) { qboolean bQuickMessage; if( iMode && ( iMode != 300 || dm_console->GetQuickMessageMode() ) ) { if( iMode < 0 ) { bQuickMessage = qtrue; iMode = -iMode; } if( dm_console->GetQuickMessageMode() == bQuickMessage ) { return dm_console->GetMessageMode() == iMode; } else { return qfalse; } } else { return qtrue; } } /* ==================== UI_SetDMConsoleMode ==================== */ static void UI_SetDMConsoleMode( int iMode ) { qboolean bQuickMessage; if( UI_DMMessageModesMatch( iMode ) ) { return; } if( iMode < 0 ) { bQuickMessage = qtrue; iMode = -iMode; } if( iMode == 300 ) { bQuickMessage = dm_console->GetMessageMode(); } if( dm_console->GetQuickMessageMode() ) { if( !bQuickMessage ) { dm_console->setFrame( getDefaultDMConsoleRectangle() ); dm_console->SetQuickMessageMode( qfalse ); } } else { if( bQuickMessage ) { dm_console->setFrame( getDefaultDMConsoleRectangle() ); dm_console->SetQuickMessageMode( qfalse ); } } dm_console->SetMessageMode( iMode ); if( bQuickMessage ) { if( iMode == 100 ) { dm_console->setTitle( Sys_LV_CL_ConvertString( "Quick Chat (Press Enter to send) : Messaging to All" ) ); } else if( iMode == 200 ) { dm_console->setTitle( Sys_LV_CL_ConvertString( "Quick Chat (Press Enter to send) : Messaging to Team" ) ); } else { dm_console->setTitle( va( "%s %i", Sys_LV_CL_ConvertString( "Quick Chat (Press Enter to send) : Messaging to Client" ), iMode ) ); } } else { if( iMode == 100 ) { dm_console->setTitle( Sys_LV_CL_ConvertString( "Chat Window (Enter to send/close) (all|team|private to change mode) : Messaging to All" ) ); } else if( iMode == 100 ) { dm_console->setTitle( Sys_LV_CL_ConvertString( "Chat Window (Enter to send/close) (all|team|private to change mode) : Messaging to Team" ) ); } else { dm_console->setTitle( va( "%s %i", Sys_LV_CL_ConvertString( "Chat Window (Enter to send/close) (all|team|private to change mode) : Messaging to Client" ), iMode ) ); } } } static void DMConsoleCommandHandler( const char *txt ) { int iMode; char szStringOut[ 1024 ]; if( dm_console->GetMessageMode() != 100 ) { if( dm_console->GetMessageMode() == 200 ) { iMode = -1; } else { iMode = dm_console->GetMessageMode(); } } Com_sprintf( szStringOut, sizeof( szStringOut ), "dmmessage %i %s\n", iMode ); CL_AddReliableCommand( szStringOut ); } /* ==================== getNewDMConsole ==================== */ UIFloatingDMConsole *getNewDMConsole() { UIFloatingDMConsole *console = new UIFloatingDMConsole; Event *event; console->Create( NULL, getDefaultDMConsoleRectangle(), "Chat Window (Enter to send/close) (all|team|private to change message mode) : Messaging to All", UWindowColor, UHudColor ); console->setConsoleHandler( DMConsoleCommandHandler ); console->setConsoleBackground( UBlack, 0.8f ); console->setShow( false ); console->Connect( &s_dmconsolehider, UIFloatingWindow::W_ClosePressed, UIFloatingWindow::W_ClosePressed ); console->Connect( &s_dmconsolehider, W_Destroyed, W_Destroyed ); event = new Event( EV_Widget_Disable ); console->PassEventToWidget( "closebutton", event ); event = new Event( EV_Widget_Disable ); console->PassEventToWidget( "minimizebutton", event ); return console; } /* ==================== getDefaultGMBoxRectangle ==================== */ static UIRect2D getDefaultGMBoxRectangle( void ) { return UIRect2D( 20, 0, cls.glconfig.vidWidth - 20, 248 ); } /* ==================== getDefaultDMBoxRectangle ==================== */ static UIRect2D getDefaultDMBoxRectangle( void ) { return UIRect2D( 128, 0, cls.glconfig.vidWidth - 320, 128 ); } /* ==================== UI_ShowHudList ==================== */ void UI_ShowHudList( void ) { for( int i = 1; i <= hudList.NumObjects(); i++ ) { hudList.ObjectAt( i )->ForceShow(); } } /* ==================== UI_HideHudList ==================== */ void UI_HideHudList( void ) { for( int i = 1; i <= hudList.NumObjects(); i++ ) { hudList.ObjectAt( i )->ForceHide(); } } /* ==================== UI_DisplayHudList ==================== */ void UI_DisplayHudList( void ) { for( int i = 1; i <= hudList.NumObjects(); i++ ) { Menu *pMenu = hudList.ObjectAt( i ); UIWidget *pWidget = pMenu->GetContainerWidget(); pMenu->ForceShow(); pWidget->Display( uWinMan.getFrame(), 1.0 ); } } /* ==================== UI_PrintConsole ==================== */ void UI_PrintConsole( const char *msg ) { UColor *pColor = NULL; char szString[ 1024 ]; char szBlah[ 1024 ]; memcpy( szString, msg, sizeof( szString ) ); if( *szString < MESSAGE_MAX ) { qboolean bNormalMessage = qfalse; qboolean bDMMessage = qfalse; qboolean bBold = qfalse; qboolean bDeathMessage = qfalse; switch( *szString ) { case MESSAGE_YELLOW: pColor = &UHudColor; break; case MESSAGE_CHAT_WHITE: pColor = &UGrey; break; case MESSAGE_WHITE: pColor = &UWhite; break; case MESSAGE_CHAT_RED: pColor = &ULightRed; break; } // // print to the deathmatch console // if( dm_console && !bNormalMessage ) { if( bDMMessage ) { dm_console->AddDMMessageText( szString + 1, pColor ); } else { dm_console->AddText( szString + 1, pColor ); } } // // print to the deathmatch message box // if( dmbox ) { if( bDMMessage ) { *szString = MESSAGE_CHAT_WHITE; dmbox->Print( szString ); return; } else if( bDeathMessage ) { dmbox->Print( szString ); *szString = MESSAGE_CHAT_RED; return; } } // // print to the game message box // if( gmbox ) { if( bBold ) { *szString = MESSAGE_WHITE; gmbox->Print( szString ); uii.Snd_PlaySound( "objective_text" ); } else { gmbox->Print( szString + 1 ); } if( !ui_gmboxspam->integer ) { return; } memcpy( szBlah, "Game Message: ", 15 ); strcat( szBlah, szString + 1 ); } } if( *msg == 7 ) { msg++; if( mini_console ) { mini_console->Print( msg + 1 ); return; } } if( fakk_console ) { if( s_intermediateconsole ) { fakk_console->AddText( *s_intermediateconsole, NULL ); delete s_intermediateconsole; s_intermediateconsole = NULL; } fakk_console->AddText( msg, pColor ); if( mini_console ) { mini_console->Print( msg ); } } else { if( !s_intermediateconsole ) { s_intermediateconsole = new str; } *s_intermediateconsole = msg; } } /* ==================== UI_PrintDeveloperConsole ==================== */ void UI_PrintDeveloperConsole( const char *msg ) { if( !developer_console ) { return; } developer_console->AddText( msg, NULL ); } /* ==================== UI_UpdateContinueGame ==================== */ void UI_UpdateContinueGame( void ) { cvar_t *var; const char *name; const char *archive_name; int length; Event *event; var = Cvar_Get( "g_lastsave", "", 0 ); name = var->string; if( *name ) { archive_name = Com_GetArchiveFileName( name, "sav" ); length = FS_ReadFileEx( archive_name, NULL, qtrue ); if( length != -1 ) { event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "continue game", event ); event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "new game", event ); return; } Cvar_Set( "g_lastsave", "" ); } event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "continue game", event ); event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "new game", event ); } /* ==================== UI_MenuActive ==================== */ qboolean UI_MenuActive( void ) { return menuManager.CurrentMenu() != NULL; } /* ==================== UI_FocusMenuIfExists ==================== */ void UI_FocusMenuIfExists( void ) { Menu *currentMenu; int r_mode; currentMenu = menuManager.CurrentMenu(); r_mode = Cvar_VariableValue( "r_mode" ); if( currentMenu ) { IN_MouseOn(); if( view3d->IsActive() ) { uWinMan.DeactivateCurrentControl(); } currentMenu->ActivateMenu(); if( ui_newvidmode->integer == -1 ) { Cvar_Get( "ui_newvidmode", va( "%d", r_mode ), CVAR_SERVER_CREATED ); Cvar_SetValue( "ui_newvidmode", r_mode ); } } else { UI_ActivateView3D(); IN_MouseOff(); Cvar_SetValue( "ui_newvidmode", -1 ); } } /* ==================== UI_OpenConsole ==================== */ void UI_OpenConsole( void ) { if( !fakk_console ) { return; } fakk_console->setShow( true ); uWinMan.ActivateControl( fakk_console ); IN_MouseOn(); } /* ==================== UI_OpenConsole ==================== */ qboolean UI_ConsoleIsVisible( void ) { return fakk_console && fakk_console->IsVisible(); } /* ==================== UI_ConsoleIsOpen ==================== */ qboolean UI_ConsoleIsOpen( void ) { return fakk_console && fakk_console->IsVisible() && fakk_console->IsActive(); } /* ==================== UI_CloseConsole ==================== */ void UI_CloseConsole( void ) { if( fakk_console && fakk_console->getShow() ) { fakk_console->setShow( false ); } UI_FocusMenuIfExists(); } /* ==================== UI_ToggleConsole ==================== */ void UI_ToggleConsole( void ) { if( !fakk_console ) { return; } if( fakk_console->IsVisible() ) { UI_CloseConsole(); } else { UI_OpenConsole(); } } /* ==================== UI_OpenDMConsole ==================== */ void UI_OpenDMConsole( int iMode ) { if( !dm_console ) { return; } UI_SetDMConsoleMode( iMode ); dm_console->setShow( true ); uWinMan.ActivateControl( dm_console ); IN_MouseOff(); } /* ==================== UI_CloseDMConsole ==================== */ void UI_CloseDMConsole( void ) { if( dm_console && dm_console->getShow() ) { dm_console->setShow( false ); } UI_FocusMenuIfExists(); } /* ==================== UI_ToggleDMConsole ==================== */ void UI_ToggleDMConsole( int iMode ) { if( !dm_console ) { return; } if( dm_console->IsVisible() ) { if( UI_DMMessageModesMatch( iMode ) ) { UI_CloseDMConsole(); } else { UI_OpenDMConsole( iMode ); } } else { UI_OpenDMConsole( iMode ); } } /* ==================== UI_OpenDeveloperConsole ==================== */ void UI_OpenDeveloperConsole( void ) { if( !developer_console ) { return; } developer_console->setShow( true ); uWinMan.ActivateControl( developer_console ); IN_MouseOn(); } /* ==================== UI_CloseDeveloperConsole ==================== */ void UI_CloseDeveloperConsole( void ) { if( developer_console && developer_console->getShow() ) { developer_console->setShow( false ); } UI_FocusMenuIfExists(); } /* ==================== UI_ToggleDeveloperConsole_f ==================== */ void UI_ToggleDeveloperConsole_f( void ) { if( !developer_console ) { return; } if( developer_console->IsThisOrChildActive() ) { UI_CloseDeveloperConsole(); } else { UI_OpenDeveloperConsole(); } } /* ==================== UI_KeyEvent ==================== */ void UI_KeyEvent( int key, unsigned int time ) { uWinMan.KeyEvent( key, time ); } /* ==================== UI_CharEvent ==================== */ void UI_CharEvent( int ch ) { uWinMan.CharEvent( ch ); } /* ==================== UI_ClearBackground ==================== */ void UI_ClearBackground( void ) { re.Set2DWindow( 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, 0, -1, -1 ); re.Scissor( 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight ); re.SetColor( g_color_table[ 0 ] ); re.DrawBox( 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight ); re.SetColor( NULL ); } /* ==================== UI_ActivateView3D ==================== */ void UI_ActivateView3D( void ) { if( !view3d ) { return; } view3d->setShow( true ); uWinMan.ActivateControl( view3d ); } /* ==================== UI_DrawIntro ==================== */ void UI_DrawIntro( void ) { if( cls.state == CA_CINEMATIC ) { view3d->setShow( true ); return; } view3d->setShow( false ); UI_ClearBackground(); // FIXME: draw intro } /* ==================== UI_MenuUp ==================== */ qboolean UI_MenuUp() { return menuManager.CurrentMenu() != NULL; } /* ==================== UI_FullscreenMenuUp ==================== */ qboolean UI_FullscreenMenuUp() { Menu *currentMenu = menuManager.CurrentMenu(); if( currentMenu ) { return currentMenu->isFullscreen(); } return qfalse; } /* ==================== UI_Update Updates the UI. ==================== */ void UI_Update(void) { Menu* currentMenu; UIRect2D frame; re.SetRenderTime(cls.realtime); CL_FillUIDef(); uWinMan.ServiceEvents(); // // draw the base HUD when in-game // if (cls.no_menus && cls.state == CA_ACTIVE) { view3d->setShow(true); frame = uWinMan.getFrame(); view3d->Display(frame, 1.0); if (ui_hud && !view3d->LetterboxActive()) { // draw the health hud if (hud_health) { hud_health->ForceShow(); frame = uWinMan.getFrame(); hud_health->GetContainerWidget()->Display(frame, 1.0); } // draw the ammo hud if (hud_ammo) { hud_ammo->ForceShow(); frame = uWinMan.getFrame(); hud_ammo->GetContainerWidget()->Display(frame, 1.0); } // draw the compass hud if (hud_compass) { hud_compass->ForceShow(); frame = uWinMan.getFrame(); hud_compass->GetContainerWidget()->Display(frame, 1.0); } } } if (fakk_console) { if (ui_minicon->integer) { // toggle the mini-console if (mini_console) { mini_console->setRealShow(fakk_console->getShow() ^ 1); } } else if (mini_console) { mini_console->setRealShow(false); } } if (gmbox) { gmbox->setRealShow(true); } if (dmbox) { dmbox->setRealShow(true); } currentMenu = menuManager.CurrentMenu(); if (currentMenu == menuManager.FindMenu("main")) { UI_MainMenuWidgetsUpdate(); } // don't care about the intro /* if( CL_FinishedIntro() ) { } else { UI_DrawIntro(); } */ if (!server_loading && (cls.state == CA_CONNECTING || cls.state == CA_CHALLENGING) && ui_pConnectingMenu) { view3d->setShow(false); UI_ClearBackground(); if (UI_BindActive()) { Menu* bindMenu = menuManager.FindMenu("controls"); if (bindMenu) { Event* event = new Event(EV_UIFakkBindList_StopBind); bindMenu->PassEventToWidget("bindlist", event); } else { uWinMan.SetBindActive(NULL); } } if (clc.connectTime >= cls.realtime - 1000 * cl_connect_timeout->integer) { if (currentMenu != ui_pConnectingMenu) { UI_ForceMenuOff(true); UI_DeactiveFloatingWindows(); UI_ForceMenu("connecting"); uWinMan.showCursor(true); } } else { Com_Printf("\nConnect to server timed out\n"); UI_ForceMenuOff(true); Cbuf_AddText("disconnect;pushmenu servertimeout"); } } else { if (currentMenu && currentMenu->isFullscreen() && (!server_loading || !ui_pLoadingMenu)) { if (com_sv_running->integer && cls.state == CA_ACTIVE) { Com_FakePause(); } view3d->setShow(false); } else if (!server_loading) { if (cls.state <= CA_PRIMED) { view3d->setShow(false); UI_ClearBackground(); } else if (cls.state == CA_PRIMED || cls.state == CA_ACTIVE) { Com_FakeUnpause(); view3d->setShow(true); } else { UI_ClearBackground(); view3d->setShow(false); } } else { view3d->setShow(false); UI_ClearBackground(); if (UI_BindActive()) { Menu* bindMenu = menuManager.FindMenu("controls"); if (bindMenu) { Event* event = new Event(EV_UIFakkBindList_StopBind); bindMenu->PassEventToWidget("bindlist", event); } } else { uWinMan.SetBindActive(NULL); } if (ui_pLoadingMenu) { if (currentMenu != ui_pLoadingMenu) { UI_ForceMenuOff(true); UI_DeactiveFloatingWindows(); UI_ForceMenu(""); uWinMan.showCursor(false); } if (!developer->integer && UI_ConsoleIsVisible()) { UI_CloseConsole(); } } else if (ui_static_materials.loading) { ui_static_materials.loading->ReregisterMaterial(); } } } // Hide the HUD when necessary if (!ui_hud || cls.state != CA_ACTIVE || view3d->LetterboxActive() || (currentMenu && currentMenu->isFullscreen()) || server_loading || ((cl.snap.ps.pm_flags & PMF_NO_HUD) || (cl.snap.ps.pm_flags & PMF_SPECTATE_FOLLOW))) { if (crosshairhud) { crosshairhud->ForceHide(); } if (hud_weapons) { hud_weapons->ForceHide(); ui_weapHudTime = 0; } if (hud_items) { hud_items->ForceHide(); ui_itemHudTime = 0; } if (hud_health) { hud_health->ForceHide(); } if (hud_ammo) { hud_ammo->ForceHide(); } if (hud_compass) { hud_compass->ForceHide(); } if (hud_boss) { hud_boss->ForceHide(); } UI_HideHudList(); } else { if (crosshairhud) { if (ui_crosshair->integer && cl.snap.ps.stats[STAT_CROSSHAIR]) { crosshairhud->ForceShow(); } else { crosshairhud->ForceHide(); } } // // show and highlight all weapons that the player holds // // // try to show the weapons bar // if (hud_weapons) { if (ui_weaponsbar->integer) { int iEquippedDiff = 0; int iOwnedDiff = 0; if (ui_weaponsbar->integer == 2) { ui_weapHudTime = cls.realtime + ui_weaponsbartime->value; } else if (ui_weaponsbar->integer != 3 && ui_itemHudTime && hud_items->isVisible()) { ui_weapHudTime = 0; } if (ui_lastWeapHudState_Owned != cl.snap.ps.stats[STAT_WEAPONS] || ui_lastWeapHudState_Equipped != cl.snap.ps.stats[STAT_EQUIPPED_WEAPON]) { iOwnedDiff = cl.snap.ps.stats[STAT_WEAPONS] ^ ui_lastWeapHudState_Owned & 0x3F; iEquippedDiff = (ui_lastWeapHudState_Equipped ^ cl.snap.ps.stats[STAT_EQUIPPED_WEAPON]) & 0x3F; // if we have different equipment, reset the weapons hud time if (iOwnedDiff || iEquippedDiff) { ui_weapHudTime = cls.realtime + ui_weaponsbartime->integer; } } // // show weapons that the player holds // if (iOwnedDiff) { if (iOwnedDiff & 1) { if (cl.snap.ps.stats[STAT_WEAPONS] & 1) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("pistol_empty", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("pistol_empty", event); } } if (iOwnedDiff & 2) { if (cl.snap.ps.stats[STAT_WEAPONS] & 2) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("rifle_empty", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("rifle_empty", event); } } if (iOwnedDiff & 4) { if (cl.snap.ps.stats[STAT_WEAPONS] & 4) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("smg_empty", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("smg_empty", event); } } if (iOwnedDiff & 8) { if (cl.snap.ps.stats[STAT_WEAPONS] & 8) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("mg_empty", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("mg_empty", event); } } if (iOwnedDiff & 16) { if (cl.snap.ps.stats[STAT_WEAPONS] & 16) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("grenade_empty", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("grenade_empty", event); } } if (iOwnedDiff & 32) { if (cl.snap.ps.stats[STAT_WEAPONS] & 32) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("heavy_empty", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("heavy_empty", event); } } ui_lastWeapHudState_Owned = cl.snap.ps.stats[STAT_WEAPONS] & 0x3F | ui_lastWeapHudState_Owned & ~0x3F; } // // highlight currently equipped weapons // if (iEquippedDiff) { if (iEquippedDiff & 1) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 1) { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("pistol_equipped", event); } else { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("pistol_equipped", event); } } if (iEquippedDiff & 2) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 2) { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("rifle_equipped", event); } else { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("rifle_equipped", event); } } if (iEquippedDiff & 4) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 4) { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("smg_equipped", event); } else { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("smg_equipped", event); } } if (iEquippedDiff & 8) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 8) { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("mg_equipped", event); } else { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("mg_equipped", event); } } if (iEquippedDiff & 16) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 16) { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("grenade_equipped", event); } else { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("grenade_equipped", event); } } if (iEquippedDiff & 32) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 32) { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("heavy_equipped", event); } else { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("heavy_equipped", event); } } ui_lastWeapHudState_Equipped = cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 0x3F | ui_lastWeapHudState_Equipped & ~0x3F; } if (!ui_weapHudTime) { if (hud_weapons->isVisible()) { hud_weapons->ProcessEvent(EV_HideMenu); } } else if (ui_weapHudTime < cls.realtime || ui_itemHudTime > ui_weapHudTime) { ui_weapHudTime = 0; if (hud_weapons->isVisible()) { hud_weapons->ProcessEvent(EV_HideMenu); } } else if (!hud_weapons->isVisible()) { Event* event = new Event(EV_ShowMenu); event->AddInteger(false); hud_weapons->ProcessEvent(event); if (hud_items->isVisible()) { hud_items->ProcessEvent(EV_HideMenu); } } } else { hud_weapons->ForceHide(); ui_weapHudTime = 0; } } // // try to show the item bar // if (hud_items) { if (ui_weaponsbar->integer && ui_itemsbar->integer) { int iEquippedDiff = 0; int iOwnedDiff = 0; if (ui_weaponsbar->integer == 3) { ui_itemHudTime = cls.realtime + ui_weaponsbartime->integer; if (ui_weapHudTime && hud_weapons->isVisible()) { ui_itemHudTime = 0; } } if (ui_lastWeapHudState_Owned != cl.snap.ps.stats[STAT_WEAPONS] || ui_lastWeapHudState_Equipped != cl.snap.ps.stats[STAT_EQUIPPED_WEAPON]) { iOwnedDiff = cl.snap.ps.stats[STAT_WEAPONS] ^ ui_lastWeapHudState_Owned & 0xF00; iEquippedDiff = (ui_lastWeapHudState_Equipped ^ cl.snap.ps.stats[STAT_EQUIPPED_WEAPON]) & 0xF00; // if we have different equipment, reset the weapons hud time if (iOwnedDiff || iEquippedDiff) { ui_weapHudTime = cls.realtime + ui_weaponsbartime->integer; } } // // show items that the player holds // if (iOwnedDiff) { if (iOwnedDiff & 0x100) { if (cl.snap.ps.stats[STAT_WEAPONS] & 1) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot1_icon", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot1_icon", event); } } if (iOwnedDiff & 0x200) { if (cl.snap.ps.stats[STAT_WEAPONS] & 2) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot2_icon", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot2_icon", event); } } if (iOwnedDiff & 0x400) { if (cl.snap.ps.stats[STAT_WEAPONS] & 4) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot3_icon", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot3_icon", event); } } if (iOwnedDiff & 0x800) { if (cl.snap.ps.stats[STAT_WEAPONS] & 8) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot4_icon", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot4_icon", event); } } ui_lastWeapHudState_Owned = cl.snap.ps.stats[STAT_WEAPONS] & 0xF00 | (ui_lastWeapHudState_Owned & 0xF0); } // // highlight currently equipped weapons // else if (iEquippedDiff) { if (iEquippedDiff & 0x100) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 1) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot1_highlight", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot1_highlight", event); } } else if (iEquippedDiff & 0x200) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 2) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot2_highlight", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot2_highlight", event); } } else if (iEquippedDiff & 0x400) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 4) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot3_highlight", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot3_highlight", event); } } else if (iEquippedDiff & 0x800) { if (cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 8) { Event* event = new Event(EV_Widget_Disable); hud_weapons->PassEventToWidget("slot4_highlight", event); } else { Event* event = new Event(EV_Widget_Enable); hud_weapons->PassEventToWidget("slot4_highlight", event); } } else { ui_lastWeapHudState_Equipped = cl.snap.ps.stats[STAT_EQUIPPED_WEAPON] & 0xF00 | (ui_lastWeapHudState_Equipped & 0xF0); } } if (!ui_itemHudTime) { if (hud_items->isVisible()) { hud_items->ProcessEvent(EV_HideMenu); } } else if (ui_itemHudTime < cls.realtime || ui_weapHudTime > ui_itemHudTime) { ui_itemHudTime = 0; if (hud_items->isVisible()) { hud_items->ProcessEvent(EV_HideMenu); } } else if (!hud_items->isVisible()) { Event* event = new Event(EV_ShowMenu); event->AddInteger(false); hud_items->ProcessEvent(event); if (hud_weapons->isVisible()) { hud_weapons->ProcessEvent(EV_HideMenu); } } } else { hud_items->ForceHide(); ui_itemHudTime = 0; } } if (hud_health) { hud_health->ForceShow(); } // // show the ammo hud // str ammo = "hud_ammo_"; ammo += CL_ConfigString(CS_WEAPONS + cl.snap.ps.activeItems[ITEM_WEAPON]); if (!hud_ammo || hud_ammo->m_name.icmp(ammo)) { Menu* ammoMenu = menuManager.FindMenu(ammo); if (ammoMenu) { if (ammoMenu != hud_ammo) { if (hud_ammo) { hud_ammo->ForceHide(); } hud_ammo = ammoMenu; } } else { ammoMenu = menuManager.FindMenu("hud_ammo_"); if (ammoMenu) { if (ammoMenu != hud_ammo) { if (hud_ammo) { hud_ammo->ForceHide(); } hud_ammo = ammoMenu; } } } } if (hud_ammo) { hud_ammo->ForceShow(); } // // show the compass // if (hud_compass) { if (ui_compass->integer) { hud_compass->ForceShow(); } else { hud_compass->ForceHide(); } } // // show the boss health // if (hud_boss) { if (cl.snap.ps.stats[STAT_BOSSHEALTH] > 0 && !hud_boss->isVisible()) { Event* event = new Event(EV_ShowMenu); event->AddInteger(false); hud_boss->ProcessEvent(event); } else if (hud_boss->isVisible()) { hud_boss->ProcessEvent(EV_HideMenu); } } UI_ShowHudList(); } // // show the scoreboard // if (scoreboard_menu) { if (scoreboardlist && scoreboardlist->IsVisible()) { scoreboard_menu->ForceShow(); } else { scoreboard_menu->ForceHide(); } } uWinMan.UpdateViews(); } /* ==================== UI_MultiplayerMenuWidgetsUpdate ==================== */ void UI_MultiplayerMenuWidgetsUpdate( void ) { Event *event; // allow the map change widget when running in-game if( com_sv_running->integer ) { event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "startnew", event ); if( cls.state > CA_PRIMED && !cg_gametype->integer ) { event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "changemap", event ); } else { event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "changemap", event ); } } else { event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "changemap", event ); event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "startnew", event ); } // allow the disconnect widget when in-game if( cls.state > CA_PRIMED ) { event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "disconnect", event ); } else { event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "disconnect", event ); } // allow the join widget when in-game if( com_sv_running->integer || cls.state > CA_PRIMED ) { event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "joinlan", event ); event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "joininternet", event ); } else { event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "joinlan", event ); event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "joininternet", event ); } } /* ==================== UI_MainMenuWidgetsUpdate ==================== */ void UI_MainMenuWidgetsUpdate( void ) { if( cls.state > CA_PRIMED ) { Event *event = new Event( EV_Widget_Enable ); menuManager.PassEventToWidget( "backtogame", event ); } else { Event *event = new Event( EV_Widget_Disable ); menuManager.PassEventToWidget( "backtogame", event ); } UI_UpdateContinueGame(); } /* ==================== UI_ToggleMenu Toggle a menu ==================== */ void UI_ToggleMenu( str name ) { Menu *menu; menu = menuManager.CurrentMenu(); if( menu ) { UI_ForceMenuOff( false ); if( menu->m_name != name ) { UI_PushMenu( name ); } } else { UI_PushMenu( name ); } UI_FocusMenuIfExists(); } /* ==================== UI_ToggleMenu_f ==================== */ void UI_ToggleMenu_f() { if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: togglemenu \n" ); return; } UI_ToggleMenu( Cmd_Argv( 1 ) ); } /* ==================== UI_PopMenu ==================== */ void UI_PopMenu( qboolean restore_cvars ) { Menu *menu; if( uWinMan.DialogExists() ) { uWinMan.RemoveAllDialogBoxes(); return; } if( menuManager.CurrentMenu() ) { menuManager.PopMenu( restore_cvars ); } UI_FocusMenuIfExists(); menu = menuManager.CurrentMenu(); if( menu ) { if( !memcmp( menu->m_name.c_str(), "main", 5 ) ) { UI_MainMenuWidgetsUpdate(); } else if( !memcmp(menu->m_name.c_str(), "multiplayer", 12 ) ) { UI_MultiplayerMenuWidgetsUpdate(); } } } /* ==================== UI_DeactiveFloatingWindows ==================== */ void UI_DeactiveFloatingWindows( void ) { uWinMan.DeactiveFloatingWindows(); } /* ==================== UI_PushMenu ==================== */ void UI_PushMenu( const char *name ) { Menu *menu = menuManager.CurrentMenu(); qboolean bDiff = qfalse; if( menu ) { bDiff = strcmp( menu->m_name, name ) != 0; } if( !bDiff || !ui_pLoadingMenu || menu != ui_pLoadingMenu ) { menuManager.PushMenu( name ); } UI_FocusMenuIfExists(); if( !memcmp( name, "main", 5 ) ) { UI_MainMenuWidgetsUpdate(); } else if( !memcmp( name, "multiplayer", 12 ) ) { UI_MultiplayerMenuWidgetsUpdate(); } } /* ==================== UI_ForceMenu ==================== */ void UI_ForceMenu( const char *name ) { Menu *menu = menuManager.CurrentMenu(); qboolean bDiff = qfalse; if( menu ) { bDiff = strcmp( menu->m_name, name ) != 0; } if( !menu || bDiff ) { menuManager.ForceMenu( name ); } UI_FocusMenuIfExists(); } /* ==================== UI_ShowMenu ==================== */ void UI_ShowMenu( const char *name, qboolean bForce ) { Menu *pMenu; pMenu = menuManager.FindMenu( name ); if( pMenu ) { if( bForce ) { pMenu->ForceShow(); } else if( !pMenu->isVisible() ) { Event *event = new Event( EV_ShowMenu ); event->AddInteger( false ); pMenu->ProcessEvent( event ); } } } /* ==================== UI_HideMenu ==================== */ void UI_HideMenu( const char *name, qboolean bForce ) { Menu *pMenu; pMenu = menuManager.FindMenu( name ); if( pMenu ) { if( bForce ) { pMenu->ForceHide(); } else if( pMenu->isVisible() ) { pMenu->ProcessEvent( EV_HideMenu ); } } } /* ==================== UI_PushMenu_f ==================== */ void UI_PushMenu_f( void ) { if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: pushmenu \n" ); return; } UI_PushMenu( Cmd_Argv( 1 ) ); } /* ==================== UI_PushMenuSP_f ==================== */ void UI_PushMenuSP_f( void ) { if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: pushmenu_sp \n" ); return; } if( ( !com_cl_running || !com_cl_running->integer || cls.state == CA_DISCONNECTED || !cg_gametype->integer ) && ( !com_sv_running || !com_sv_running->integer || !g_gametype->integer ) ) { UI_PushMenu( Cmd_Argv( 1 ) ); } } /* ==================== UI_PushMenuMP_f ==================== */ void UI_PushMenuMP_f( void ) { const char *cmd; if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: pushmenu_mp \n" ); return; } if( com_cl_running && com_cl_running->integer && cls.state != CA_DISCONNECTED && cg_gametype->integer && com_sv_running && com_sv_running->integer && g_gametype->integer ) { cmd = Cmd_Argv( 1 ); // // Push the right menu depending on the gametype // if( !Q_stricmp( cmd, "SelectTeam" ) ) { switch( cg_gametype->integer ) { case GT_FFA: UI_PushMenu( "SelectFFAModel" ); break; case GT_OBJECTIVE: UI_PushMenu( "ObjSelectTeam" ); break; default: UI_PushMenu( "SelectTeam" ); } } else { UI_PushMenu( cmd ); } } } /* ==================== UI_ForceMenu_f ==================== */ void UI_ForceMenu_f( void ) { if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: forcemenu \n" ); return; } UI_ForceMenu( Cmd_Argv( 1 ) ); } /* ==================== UI_PopMenu_f ==================== */ void UI_PopMenu_f( void ) { if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: popmenu " ); return; } UI_PopMenu( atoi( Cmd_Argv( 1 ) ) ); } /* ==================== UI_ShowMenu_f ==================== */ void UI_ShowMenu_f( void ) { qboolean bForce; const char *name; if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: showmenu \n" ); return; } name = Cmd_Argv( 1 ); if( Cmd_Argc() > 2 ) { bForce = atoi( Cmd_Argv( 2 ) ); } else { bForce = qfalse; } UI_ShowMenu( name, bForce ); } /* ==================== UI_HideMenu_f ==================== */ void UI_HideMenu_f( void ) { qboolean bForce; const char *name; if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: hidemenu \n" ); return; } name = Cmd_Argv( 1 ); if( Cmd_Argc() > 2 ) { bForce = atoi( Cmd_Argv( 2 ) ); } else { bForce = qfalse; } UI_HideMenu( name, bForce ); } /* ==================== UI_WidgetCommand_f ==================== */ void UI_WidgetCommand_f( void ) { str name; str commandstring; if( Cmd_Argc() <= 2 ) { Com_Printf( "Usage: widgetcommand \n" ); return; } name = Cmd_Argv( 1 ); commandstring = Cmd_Argv( 2 ); Event *event = new Event( commandstring ); for( int i = 3; i < Cmd_Argc(); i++ ) { event->AddToken( Cmd_Argv( i ) ); } menuManager.PassEventToWidget( name, event ); } /* ==================== UI_GlobalWidgetCommand_f ==================== */ void UI_GlobalWidgetCommand_f( void ) { str name; str commandstring; if( Cmd_Argc() <= 2 ) { Com_Printf( "Usage: globalwidgetcommand \n" ); return; } name = Cmd_Argv( 1 ); commandstring = Cmd_Argv( 2 ); Event *event = new Event( commandstring ); for( int i = 3; i < Cmd_Argc(); i++ ) { event->AddToken( Cmd_Argv( i ) ); } uWinMan.PassEventToWidget( name, event ); } /* ==================== UI_ListMenus_f ==================== */ void UI_ListMenus_f() { menuManager.ListMenus(); } /* ==================== UI_BindActive ==================== */ qboolean UI_BindActive( void ) { return uWinMan.BindActive() != NULL; } /* ==================== UI_SetReturnMenuToCurrent ==================== */ void UI_SetReturnMenuToCurrent( void ) { Menu *currentMenu = menuManager.CurrentMenu(); if( currentMenu ) { Cvar_Set( "ui_returnmenu", currentMenu->m_name ); } else { Cvar_Set( "ui_returnmenu", "" ); } } /* ==================== UI_PushReturnMenu ==================== */ qboolean UI_PushReturnMenu() { str sMenuName; if( !ui_returnmenu->string || !*ui_returnmenu->string ) { return qfalse; } sMenuName = ui_returnmenu->string; UI_PushMenu( sMenuName ); Cvar_Set( "ui_returnmenu", "" ); UI_FocusMenuIfExists(); if( !menuManager.CurrentMenu() ) { return qfalse; } if( !memcmp( sMenuName.c_str(), "main", 5 ) ) { UI_MainMenuWidgetsUpdate(); } else if( !memcmp( sMenuName.c_str(), "multiplayer", 12 ) ) { UI_MultiplayerMenuWidgetsUpdate(); } return qtrue; } /* ==================== UI_PushReturnMenu_f ==================== */ void UI_PushReturnMenu_f( void ) { UI_PushReturnMenu(); } /* ==================== UI_MenuEscape ==================== */ void UI_MenuEscape( const char *name ) { if( server_loading ) { return; } if( uWinMan.BindActive() ) { UI_KeyEvent( K_ESCAPE, qfalse ); } else if( menuManager.CurrentMenu() != mainmenu || cls.state != CA_DISCONNECTED ) { if( uWinMan.DialogExists() ) { uWinMan.RemoveAllDialogBoxes(); } else { if( menuManager.CurrentMenu() ) { menuManager.PopMenu( qtrue ); } else if( !Q_stricmp( name, "main" ) && cls.state > CA_PRIMED && cg_gametype->integer > 0 ) { UI_PushMenu( "dm_main" ); } else { UI_PushMenu( name ); } UI_FocusMenuIfExists(); if( menuManager.CurrentMenu() ) { if( !memcmp( name, "main", 5 ) ) { UI_MainMenuWidgetsUpdate(); } else if( !memcmp( name, "multiplayer", 12 ) ) { UI_MultiplayerMenuWidgetsUpdate(); } } } } else if( developer->integer ) { if( UI_ConsoleIsVisible() ) { UI_CloseConsole(); } else { UI_OpenConsole(); } } } /* ==================== UI_ForceMenuOff ==================== */ void UI_ForceMenuOff( bool force ) { menuManager.ClearMenus( force ); UI_FocusMenuIfExists(); } /* ==================== UI_UpdateConnectionString ==================== */ void UI_UpdateConnectionString( void ) { } /* ==================== UI_ParseServerInfoMessage ==================== */ void UI_ParseServerInfoMessage( msg_t *msg ) { } /* ==================== UI_DrawConnectText ==================== */ void UI_DrawConnectText( void ) { } /* ==================== UI_DrawConnect ==================== */ void UI_DrawConnect( void ) { Com_Printf( "UI_DrawConnect called\n" ); } /* ==================== CL_PingServers_f ==================== */ void CL_PingServers_f( void ) { int i; netadr_t adr; char name[ 32 ]; const char *adrstring; cvar_t *noudp; cvar_t *noipx; Com_Printf( "pinging broadcast...\n" ); noudp = Cvar_Get( "noudp", "0", CVAR_INIT ); if( !noudp->integer ) { adr.type = NA_BROADCAST; adr.port = BigShort( 12203 ); NET_OutOfBandPrint( NS_SERVER, adr, "info %i", 8 ); } noipx = Cvar_Get( "noipx", "0", CVAR_INIT ); if( !noipx->integer ) { adr.type = NA_BROADCAST_IPX; adr.port = BigShort( 12203 ); NET_OutOfBandPrint( NS_SERVER, adr, "info %i", 8 ); } for( i = 0; i < 16; i++ ) { Com_sprintf( name, sizeof( name ), "adr%i", i ); adrstring = Cvar_VariableString( name ); if( adrstring && *adrstring ) { Com_Printf( "pinging %s...\n", adrstring ); if( NET_StringToAdr( adrstring, &adr ) ) { if( !adr.port ) { adr.port = BigShort( 12203 ); } NET_OutOfBandPrint( NS_SERVER, adr, "info %i", 8 ); } else { Com_Printf( "Bad address: %s\n", adrstring ); } } } } /* ==================== UI_MapList_f ==================== */ void UI_MapList_f( void ) { str mappath = "maps"; if( Cmd_Argc() == 2 ) { mappath += "/"; mappath += Cmd_Argv( 1 ); } MapRunnerClass *map = new MapRunnerClass; map->Setup( "maps", mappath, ".bsp" ); CL_SetMousePos( cls.glconfig.vidWidth / 2, cls.glconfig.vidHeight / 2 ); } /* ==================== UI_DMMapSelect_f ==================== */ void UI_DMMapSelect_f( void ) { str basepath = "maps"; str mappath = "maps"; if( Cmd_Argc() > 1 ) { mappath += "/"; mappath += Cmd_Argv( 1 ); } if( Cmd_Argc() > 2 ) { basepath += "/"; basepath += Cmd_Argv( 2 ); } MpMapPickerClass *map = new MpMapPickerClass; map->Setup( basepath, mappath ); CL_SetMousePos( cls.glconfig.vidWidth / 2, cls.glconfig.vidHeight / 2 ); } /* ==================== UI_StartDMMap_f ==================== */ void UI_StartDMMap_f( void ) { int iDedicated; int iMaxClients; int iUseGameSpy; int iGameType = GT_FFA; int iFragLimit; int iTimeLimit; int iTeamDamage; int iInactiveSpectate; int iInactiveKick; const char *pszTemp; const char *pszGameTypeString = "Free-For-All"; const char *pszMapName; const char *pszMapListCvar = "sv_maplist"; const char *pszMapListString; char szHostName[ 32 ]; if( Cmd_Argc() > 1 ) { iGameType = atoi( Cmd_Argv( 1 ) ); if( Cmd_Argc() > 2 ) { pszGameTypeString = Cmd_Argv( 2 ); if( Cmd_Argc() > 3 ) { pszMapListCvar = Cmd_Argv( 3 ); } } } pszMapName = CvarGetForUI( "ui_dmmap", "" ); if( !*pszMapName ) { return; } iDedicated = atoi( CvarGetForUI( "ui_dedicated", "0" ) ); if( iDedicated < 0 ) { iDedicated = 0; } else if( iDedicated > 1 ) { iDedicated = 1; } Cvar_SetValue( "ui_dedicated", iDedicated ); iMaxClients = atoi( CvarGetForUI( "ui_maxclients", "0" ) ); if( iMaxClients < 1 ) { iMaxClients = 1; } else if( iMaxClients > MAX_CLIENTS ) { iMaxClients = MAX_CLIENTS; } Cvar_SetValue( "ui_maxclients", iMaxClients ); iUseGameSpy = atoi( CvarGetForUI( "ui_gamespy", "0" ) ); if( iUseGameSpy < 0 ) { iUseGameSpy = 0; } else if( iUseGameSpy > 1 ) { iUseGameSpy = 1; } Cvar_SetValue( "ui_gamespy", iUseGameSpy ); iFragLimit = atoi( CvarGetForUI( "ui_fraglimit", "0" ) ); if( iFragLimit < 0 ) { iFragLimit = 0; } Cvar_SetValue( "ui_fraglimit", iFragLimit ); iTimeLimit = atoi( CvarGetForUI( "ui_timelimit", "0" ) ); if( iTimeLimit < 0 ) { iTimeLimit = 0; } Cvar_SetValue( "ui_timelimit", iTimeLimit ); iTeamDamage = atoi( CvarGetForUI( "ui_teamdamage", "0" ) ); if( iTeamDamage < 0 ) { iTeamDamage = 0; } else if( iTeamDamage > 1 ) { iTeamDamage = 1; } Cvar_SetValue( "ui_teamdamage", iTeamDamage ); iInactiveSpectate = atoi( CvarGetForUI( "ui_inactivespectate", "0" ) ); if( iInactiveSpectate < 0 ) { iInactiveSpectate = 0; } Cvar_SetValue( "ui_inactivespectate", iInactiveSpectate ); iInactiveKick = atoi( CvarGetForUI( "ui_inactivekick", "0" ) ); if( iInactiveKick < 0 ) { iInactiveKick = 0; } Cvar_SetValue( "ui_inactivekick", iInactiveKick ); pszMapListString = CvarGetForUI( pszMapListCvar, "" ); pszTemp = CvarGetForUI( "ui_hostname", "Nameless Battle" ); Q_strncpyz( szHostName, pszTemp, sizeof( szHostName ) ); for( int i = 0; i < sizeof( szHostName ); i++ ) { if( szHostName[ i ] == ';' || szHostName[ i ] == '"' || szHostName[ i ] == '\\' ) { szHostName[ i ] = '_'; } } Cvar_Set( "ui_hostname", szHostName ); Cbuf_AddText( va( "set dedicated %i;" "set sv_maxclients %i;" "set sv_gamespy %i;" "set g_gametype %i;" "set g_gametypestring \"%s\";" "set fraglimit %i;" "set timelimit %i;" "set g_teamdamage %i;" "set g_inactivespectate %i;" "set g_inactivekick %i;" "set sv_maplist \"%s\";" "set sv_hostname \"%s\";" "set cheats 0;" "wait;" "map \"%s\"\n", iDedicated, iMaxClients, iUseGameSpy, iGameType, pszGameTypeString, iFragLimit, iTimeLimit, iTeamDamage, iInactiveSpectate, iInactiveKick, pszMapListString, szHostName, pszMapName ) ); } /* ==================== UI_PlayerModel_f ==================== */ void UI_PlayerModel_f( void ) { qboolean bGermanModel; str modelpath = "models/player"; bGermanModel = qfalse; if( Cmd_Argc() > 1 ) { bGermanModel = atoi( Cmd_Argv( 1 ) ) ? qtrue : qfalse; if( Cmd_Argc() == 3 ) { modelpath += "/"; modelpath += Cmd_Argv( 2 ); } } PlayerModelPickerClass *picker = new PlayerModelPickerClass; picker->Setup( "models/player", modelpath, bGermanModel ); } /* ==================== UI_ApplyPlayerModel_f ==================== */ void UI_ApplyPlayerModel_f( void ) { const char *pszUIPlayerModel; pszUIPlayerModel = CvarGetForUI( "ui_dm_playermodel", "american_army" ); Cvar_Set( "dm_playermodel", pszUIPlayerModel ); pszUIPlayerModel = CvarGetForUI( "ui_dm_playergermanmodel", "german_wehrmacht_soldier" ); Cvar_Set( "ui_dm_playergermanmodel", pszUIPlayerModel ); Cvar_Set( "name", CvarGetForUI( "ui_name", "*** Blank Name ***" ) ); } /* ==================== UI_GetPlayerModel_f ==================== */ void UI_GetPlayerModel_f( void ) { const char *pszUIPlayerModel; char donotshowssindeorfr[ 64 ]; pszUIPlayerModel = CvarGetForUI( "dm_playermodel", "american_army" ); Cvar_Set( "ui_dm_playermodel", pszUIPlayerModel ); Cvar_Set( "ui_disp_playermodel", va( "models/player/%s.tik", pszUIPlayerModel ) ); pszUIPlayerModel = CvarGetForUI( "dm_playergermanmodel", "german_wehrmacht_soldier" ); Cvar_Set( "ui_dm_playergermanmodel", pszUIPlayerModel ); if( !strncmp( pszUIPlayerModel, "german_waffen_", 14 ) ) { memcpy( donotshowssindeorfr, "german_waffenss_", 17 ); strncat( donotshowssindeorfr, pszUIPlayerModel + 14, 48 ); } else { strncpy( donotshowssindeorfr, pszUIPlayerModel, sizeof( donotshowssindeorfr ) ); } Cvar_Set( "ui_disp_playergermanmodel", va( "models/player/%s.tik", donotshowssindeorfr ) ); Cvar_Set( "ui_name", CvarGetForUI( "name", "*** Blank Name ***" ) ); } /* ==================== UI_SoundPicker_f ==================== */ void UI_SoundPicker_f( void ) { new SoundPickerClass; } /* ==================== UI_ViewSpawnList_f ==================== */ void UI_ViewSpawnList_f( void ) { str modelpath = "models"; ViewSpawnerClass *picker = new ViewSpawnerClass; picker->Setup( "models", modelpath, ".tik" ); } /* ==================== UI_LODSpawnList_f ==================== */ void UI_LODSpawnList_f( void ) { str modelpath = "models"; LODSpawnerClass *picker = new LODSpawnerClass; picker->Setup( "models", modelpath, ".tik" ); } /* ==================== UI_Notepad_f ==================== */ void UI_Notepad_f( void ) { if( Cmd_Argc() > 1 ) { UI_LoadNotepadFile( Cmd_Argv( 1 ) ); } else { UI_LoadNotepadFile( NULL ); } } /* ==================== UI_EditScript_f ==================== */ void UI_EditScript_f( void ) { const char *info; const char *mname; str mapname; str mappath; // editscript only works in-game if( cls.state != CA_ACTIVE ) { Com_Printf( "You need to load a map to edit its script\n" ); return; } mname = Info_ValueForKey( &cl.gameState.stringData[ cl.gameState.stringOffsets[ CS_SERVERINFO ] ], "mapname" ); mapname = mname; // remove the spawnpoint name if( strchr( mname, '$' ) ) { info = strchr( mname, '$' ); mapname[ info - mname ] = 0; } // make sure the map is loaded if( !strcmp( mapname, "" ) ) { Com_Printf( "No map loaded?\n" ); return; } mappath = "maps/" + mapname + ".scr"; if( !UI_LoadNotepadFile( mappath ) ) { Com_Printf( "Couldn't load/find script file for %s\n", mappath.c_str() ); } } /* ==================== UI_EditShader_f ==================== */ void UI_EditShader_f( void ) { str shaderpath; if( Cmd_Argc() != 2 ) { Com_Printf( "Usage: Editshader \n" ); return; } shaderpath = "scripts/" + str( Cmd_Argv( 1 ) ) + ".shader"; if( !UI_LoadNotepadFile( shaderpath ) ) { Com_Printf( "Couldn't open shader named %s\n", shaderpath.c_str() ); } } /* ==================== UI_EditSpecificShader_f ==================== */ void UI_EditSpecificShader_f( void ) { } /* ==================== UI_LoadMenu ==================== */ void UI_LoadMenu( const char *name ) { char buffer[ 256 ]; Com_sprintf( buffer, sizeof( buffer ), "ui/%s", name ); COM_StripExtension( buffer, buffer, sizeof( buffer ) ); Q_strcat( buffer, 256, ".urc" ); new UILayout( buffer ); uWinMan.CreateMenus(); UI_FocusMenuIfExists(); } /* ==================== UI_LoadMenu_f ==================== */ void UI_LoadMenu_f( void ) { UI_LoadMenu( Cmd_Argv( 1 ) ); } /* ==================== CvarGetForUI ==================== */ const char *CvarGetForUI( const char *name, const char *defval ) { cvar_t *cvar = Cvar_FindVar( name ); if( cvar ) { if( cvar->latchedString && *cvar->latchedString ) { return cvar->latchedString; } else { return cvar->string; } } else { return defval; } } /* ==================== ListFilesForUI ==================== */ void ListFilesForUI( const char *filespec ) { int nfiles; char **filenames; filenames = FS_ListFiles( "", filespec, qfalse, &nfiles ); for( int i = 0; i < nfiles; i++ ) { uie.AddFileToList( filenames[ i ] ); } FS_FreeFileList( filenames ); } /* ==================== IsKeyDown ==================== */ int IsKeyDown( int key ) { return keys[ key ].down; } /* ==================== UI_WantsKeyboard ==================== */ void UI_WantsKeyboard() { cls.keyCatchers |= KEYCATCH_UI; } struct widgettrans_s { char *src; char *dst; }; static widgettrans_s s_widgettrans[ 2 ] = { { "Label", "FakkLabel" }, { NULL, NULL } }; /* ==================== TranslateWidgetName ==================== */ const char *TranslateWidgetName( const char *widget ) { widgettrans_s *trans = &s_widgettrans[ 0 ]; for( int i = 0; trans->src != NULL; i++, trans++ ) { if( !strcmp( trans->src, widget ) ) { return trans->dst; } } return NULL; } /* ==================== UI_Cvar_Set ==================== */ void UI_Cvar_Set( const char *var_name, const char *value ) { Cvar_Set2( var_name, value, qfalse ); } /* ==================== CL_FillUIDef ==================== */ void CL_FillUIDef( void ) { CL_GetMouseState( &uid.mouseX, &uid.mouseY, &uid.mouseFlags ); uid.time = cls.realtime; uid.vidHeight = cls.glconfig.vidHeight; uid.vidWidth = cls.glconfig.vidWidth; uid.uiHasMouse = in_guimouse != qfalse; } sfxHandle_t UI_RegisterSound( const char *sample, qboolean streamed ) { return S_RegisterSound( sample, streamed, qfalse ); } void UI_StartLocalSound( const char *sound_name ) { S_StartLocalSoundByName( sound_name, qtrue ); } /* ==================== CL_FillUIImports ==================== */ void CL_FillUIImports( void ) { uii.Rend_DrawBox = re.DrawBox; uii.Rend_DrawPicStretched = re.DrawStretchPic; uii.Rend_DrawPicTiled = re.DrawTilePic; uii.Rend_GetShaderHeight = re.GetShaderHeight; uii.Rend_GetShaderWidth = re.GetShaderWidth; uii.Rend_DrawString = re.DrawString; uii.Rend_LoadFont = re.LoadFont; uii.Rend_RegisterMaterial = re.RegisterShaderNoMip; uii.Rend_RefreshMaterial = re.RefreshShaderNoMip; uii.Rend_Scissor = re.Scissor; uii.Rend_Set2D = re.Set2DWindow; uii.Rend_SetColor = re.SetColor; uii.Cmd_Stuff = Cbuf_AddText; uii.Cvar_GetString = CvarGetForUI; uii.Cvar_Reset = Cvar_Reset; uii.Cvar_Find = Cvar_FindVar; uii.Cvar_Set = Cvar_Set; uii.File_PickFile = PickFile; uii.File_FreeFile = FS_FreeFile; uii.File_ListFiles = ListFilesForUI; uii.File_OpenFile = FS_ReadFile; uii.File_WriteFile = FS_WriteTextFile; uii.Snd_PlaySound = UI_StartLocalSound; uii.Snd_RegisterSound = UI_RegisterSound; uii.Alias_Add = Alias_Add; uii.Alias_FindRandom = Alias_FindRandom; uii.Sys_Error = Com_Error; uii.Sys_IsKeyDown = IsKeyDown; uii.Sys_Milliseconds = Sys_Milliseconds; uii.Sys_Printf = Com_Printf; uii.Sys_DPrintf = Com_DPrintf; uii.Sys_GetClipboard = Sys_GetWholeClipboard; uii.Sys_SetClipboard = Sys_SetClipboard; uii.Cmd_CompleteCommandByNumber = Cmd_CompleteCommandByNumber; uii.Cvar_CompleteCvarByNumber = Cvar_CompleteVariableByNumber; uii.UI_WantsKeyboard = UI_WantsKeyboard; uii.Client_TranslateWidgetName = TranslateWidgetName; uii.Connect = CL_Connect; uii.Key_GetKeynameForCommand = Key_GetKeynameForCommand; uii.Key_GetCommandForKey = Key_GetBinding; uii.Key_SetBinding = Key_SetBinding; uii.Key_GetKeysForCommand = Key_GetKeysForCommand; uii.Key_KeynumToString = Key_KeynumToBindString; uii.GetConfigstring = CL_ConfigString; uii.UI_CloseDMConsole = UI_CloseDMConsole; #if 0 uii.TIKI_RegisterModel = TIKI_RegisterTiki; uii.Cvar_Get = Cvar_Get; uii.Argc = Cmd_Argc; uii.Argv = Cmd_Argv; uii.Cmd_ExecuteText = Cbuf_ExecuteText; uii.FS_FOpenFile = FS_FOpenFileByMode; uii.FS_Read = FS_Read; uii.FS_Write = FS_Write; uii.FS_FCloseFile = FS_FCloseFile; uii.FS_GetFileList = FS_GetFileList; uii.FS_Seek = FS_Seek; uii.R_RegisterModel = re.RegisterModel; uii.R_RegisterSkin = re.RegisterShader; uii.R_RegisterShader = re.RegisterShader; uii.R_RegisterShaderNoMip = re.RegisterShaderNoMip; uii.R_ClearScene = re.ClearScene; uii.R_AddRefEntityToScene = re.AddRefEntityToScene; uii.R_AddPolyToScene = re.AddPolyToScene; uii.R_AddLightToScene = re.AddLightToScene; uii.R_RenderScene = re.RenderScene; uii.R_SetColor = re.SetColor; uii.R_DrawStretchPic = re.DrawStretchPic; uii.UpdateScreen = SCR_UpdateScreen; uii.S_StartLocalSound = S_StartLocalSound; uii.S_RegisterSound = S_RegisterSound; uii.Key_KeynumToStringBuf = Key_KeynumToStringBuf; uii.Key_KeynumToString = Key_KeynumToString; uii.Key_GetBindingBuf = Key_GetBindingBuf; uii.Key_IsDown = Key_IsDown; uii.Key_GetOverstrikeMode = Key_GetOverstrikeMode; uii.Key_SetOverstrikeMode = Key_SetOverstrikeMode; uii.Key_ClearStates = Key_ClearStates; uii.Key_GetCatcher = Key_GetCatcher; uii.Key_SetCatcher = Key_SetCatcher; uii.GetClipboardData = CL_GetClipboardData; uii.GetClientState = GetClientState; uii.GetGlconfig = CL_GetGlconfig; uii.GetConfigString = GetConfigString; uii.LAN_GetServerCount = LAN_GetServerCount; uii.LAN_GetServerAddressString = LAN_GetServerAddressString; uii.LAN_GetServerInfo = LAN_GetServerInfo; uii.LAN_GetPingQueueCount = LAN_GetPingQueueCount; uii.LAN_ServerStatus = LAN_GetServerStatus; uii.LAN_ClearPing = LAN_ClearPing; uii.LAN_GetPing = LAN_GetPing; uii.LAN_GetPingInfo = LAN_GetPingInfo; uii.LAN_GetServerPing = LAN_GetServerPing; uii.LAN_MarkServerVisible = LAN_MarkServerVisible; uii.LAN_UpdateVisiblePings = LAN_UpdateVisiblePings; uii.GetCDKey = CLUI_GetCDKey; uii.SetCDKey = CLUI_SetCDKey; uii.R_RegisterFont = re.RegisterFont; uii.R_Text_Width = re.Text_Width; uii.R_Text_Height = re.Text_Height; uii.R_Text_Paint = re.Text_Paint; uii.R_Text_PaintChar = re.Text_PaintChar; uii.R_GetShaderName = re.GetShaderName; uii.Cmd_Stuff = Cbuf_AddText; uii.Cvar_GetString = CvarGetForUI; uii.Cvar_Reset = Cvar_Reset; uii.Cvar_Find = Cvar_FindVar; uii.Cvar_Set = UI_Cvar_Set; uii.File_PickFile = PickFile; uii.File_FreeFile = FS_FreeFile; uii.File_ListFiles = ListFilesForUI; uii.File_OpenFile = FS_ReadFile; uii.File_WriteFile = FS_WriteTextFile; uii.Rend_SetColor = re.SetColor; uii.Snd_PlaySound = UI_StartLocalSound; uii.Snd_RegisterSound = UI_RegisterSound; uii.Alias_Add = Alias_Add; uii.Alias_FindRandom = Alias_FindRandom; uii.Sys_Error = Com_Error; uii.Sys_IsKeyDown = IsKeyDown; uii.Sys_Milliseconds = Sys_Milliseconds; uii.Sys_Printf = Com_Printf; uii.Sys_DPrintf = Com_DPrintf; uii.Sys_GetClipboard = Sys_GetWholeClipboard; uii.Sys_SetClipboard = Sys_SetClipboard; uii.Cmd_CompleteCommandByNumber = Cmd_CompleteCommandByNumber; uii.Cvar_CompleteCvarByNumber = Cvar_CompleteVariableByNumber; uii.UI_WantsKeyboard = UI_WantsKeyboard; uii.Client_TranslateWidgetName = TranslateWidgetName; uii.Connect = CL_Connect; uii.Key_GetKeynameForCommand = Key_GetKeynameForCommand; uii.Key_GetCommandForKey = Key_GetBinding; uii.Key_SetBinding = Key_SetBinding; uii.Key_GetKeysForCommand = Key_GetKeysForCommand; uii.Key_KeynumToString = Key_KeynumToBindString; uii.GetConfigstring = CL_ConfigString; uii.UI_CloseDMConsole = UI_CloseDMConsole; #endif } /* ==================== CL_BeginRegistration ==================== */ void CL_BeginRegistration( void ) { // init console stuff re.BeginRegistration( &cls.glconfig ); uWinMan.CleanupShadersFromList(); } /* ==================== CL_EndRegistration ==================== */ void CL_EndRegistration( void ) { int start, end; start = Sys_Milliseconds(); S_EndRegistration(); re.EndRegistration(); if( !Sys_LowPhysicalMemory() ) { Com_TouchMemory(); } end = Sys_Milliseconds(); Com_Printf( "CL_EndRegistration: %5.2f seconds\n", ( float )( start - end ) / 1000.0 ); } /* ==================== UI_CreateDialog ==================== */ void UI_CreateDialog( const char *title, char *cvarname, const char *command, const char *cancelCommand, int width, int height, const char *shader, const char *okshader, const char *cancelshader ) { UIDialog *dlg = new UIDialog; UIRect2D rect = UIRect2D( ( cls.glconfig.vidWidth - width ) >> 1, ( cls.glconfig.vidHeight - height ) >> 1, width, height ); UColor bgColor = UWindowColor; dlg->Create( NULL, rect, title, bgColor, UHudColor ); dlg->LinkCvar( cvarname ); dlg->SetOKCommand( command ); dlg->SetCancelCommand( command ); dlg->SetLabelMaterial( uWinMan.RegisterShader( shader ) ); dlg->SetOkMaterial( uWinMan.RegisterShader( okshader ) ); if( cancelshader ) { dlg->SetCancelMaterial( uWinMan.RegisterShader( cancelshader ) ); } uWinMan.ActivateControl( dlg ); } /* ==================== UI_ResolutionChange ==================== */ void UI_ResolutionChange( void ) { UIRect2D frame; CL_FillUIImports(); CL_FillUIDef(); if( !uie.ResolutionChange ) { return; } if( fakk_console ) { frame = getDefaultConsoleRectangle(); fakk_console->setFrame( frame ); } if( dm_console ) { if( dm_console->GetQuickMessageMode() ) { frame = getQuickMessageDMConsoleRectangle(); } else { frame = getDefaultDMConsoleRectangle(); } dm_console->setFrame( frame ); } if( developer_console ) { frame = getDefaultConsoleRectangle(); developer_console->setFrame( frame ); } if( scoreboardlist ) { delete scoreboardlist; scoreboardlist = NULL; UI_CreateScoreboard(); } uie.ResolutionChange(); menuManager.RealignMenus(); if( view3d ) { frame = UIRect2D( 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight ); view3d->setFrame( frame ); } if( gmbox ) { frame = getDefaultGMBoxRectangle(); gmbox->setFrame( frame ); } if( dmbox ) { frame = getDefaultDMBoxRectangle(); dmbox->setFrame( frame ); } } /* ==================== UI_FinishLoadingScreen_f ==================== */ void UI_FinishLoadingScreen_f( void ) { Com_Unpause(); UI_ForceMenuOff( qtrue ); ui_pLoadingMenu = NULL; ui_sCurrentLoadingMenu = ""; server_loading = qfalse; server_loading_waiting = qfalse; UI_ActivateView3D(); } /* ==================== S_ServerLoaded ==================== */ void S_ServerLoaded( void ) { if( !svs.soundsNeedLoad ) { return; } svs.soundsNeedLoad = qfalse; Com_DPrintf( "Loading Previous Sound State.\n" ); S_StopAllSounds( qfalse ); //S_TriggeredMusic_Stop(); //s_bSoundPaused = qtrue; //S_ReLoad( &svs.soundSystem ); // //if( svs.tm_filename[ 0 ] ) { // S_TriggeredMusic_SetupHandle( svs.tm_filename, svs.tm_loopcount, svs.tm_offset, 0 ); //} } /* ==================== UI_ServerLoaded ==================== */ void UI_ServerLoaded( void ) { Menu *pCurrentMenu; cvar_t *pMaxClients; Event *event; CL_UpdateSnapFlags(); SV_ServerLoaded(); S_FadeSound( 0 ); S_ServerLoaded(); if( !server_loading ) { return; } UI_EndLoad(); pMaxClients = Cvar_Get( "sv_maxclients", "1", 0 ); if( com_sv_running->integer && pMaxClients->integer > 1 ) { SV_Heartbeat_f(); } uWinMan.showCursor( true ); if( !ui_pLoadingMenu ) { UI_FinishLoadingScreen_f(); return; } pCurrentMenu = menuManager.CurrentMenu(); if( pCurrentMenu != ui_pLoadingMenu || !pCurrentMenu->GetNamedWidget( "continuebutton" ) || !com_sv_running->integer || pMaxClients->integer > 1 ) { UI_FinishLoadingScreen_f(); return; } server_loading_waiting = qtrue; event = new Event( EV_Widget_Enable ); ui_pLoadingMenu->PassEventToWidget( "continuebutton", event ); event = new Event( EV_Widget_Disable ); ui_pLoadingMenu->PassEventToWidget( "loadingflasher", event ); event = new Event( EV_Widget_Disable ); ui_pLoadingMenu->PassEventToWidget( "loadingbar", event ); event = new Event( EV_Widget_Disable ); ui_pLoadingMenu->PassEventToWidget( "loadingbar_border", event ); event = new Event( EV_Widget_Activate ); ui_pLoadingMenu->PassEventToWidget( "continuebutton", event ); Com_FakePause(); } /* ==================== UI_ClearCenterPrint ==================== */ void UI_ClearCenterPrint( void ) { if( view3d ) { view3d->ClearCenterPrint(); } } /* ==================== UI_UpdateCenterPrint ==================== */ void UI_UpdateCenterPrint( const char *s, float alpha ) { view3d->UpdateCenterPrint( s, alpha ); } /* ==================== UI_UpdateLocationPrint ==================== */ void UI_UpdateLocationPrint( int x, int y, const char *s, float alpha ) { view3d->UpdateLocationPrint( x, y, s, alpha ); } /* ==================== UI_CenterPrint_f ==================== */ void UI_CenterPrint_f( void ) { const char *s; float alpha; if( Cmd_Argc() <= 1 ) { Com_Printf( "Usage: centerprintf string [alpha]\n" ); return; } s = Cmd_Argv( 1 ); if( Cmd_Argc() > 2 ) { alpha = atof( Cmd_Argv( 2 ) ); } else { alpha = 1.0; } UI_UpdateCenterPrint( s, alpha ); } /* ==================== UI_LocationPrint_f ==================== */ void UI_LocationPrint_f( void ) { int x, y; const char *s; float alpha; if( Cmd_Argc() <= 3 ) { Com_Printf( "Usage: locatinprint x y string [alpha]\n" ); return; } x = atoi( Cmd_Argv( 1 ) ); y = atoi( Cmd_Argv( 2 ) ); s = Cmd_Argv( 3 ); if( Cmd_Argc() > 4 ) { alpha = atof( Cmd_Argv( 4 ) ); } else { alpha = 1.0; } UI_UpdateLocationPrint( x, y, s, alpha ); } /* ==================== UI_LoadInventory_f ==================== */ void UI_LoadInventory_f( void ) { UI_CloseInventory(); CL_LoadInventory( ui_inventoryfile->string, &client_inv ); } /* ==================== UI_ClearState ==================== */ void UI_ClearState( void ) { S_FadeSound( 0.0 ); UI_ClearCenterPrint(); if( gmbox ) { gmbox->Clear(); } if( dmbox ) { dmbox->Clear(); } } /* ==================== UI_CheckRestart ==================== */ void UI_CheckRestart( void ) { if( ui_console->integer && !fakk_console ) { UIRect2D frame; UColor bgColor; fakk_console = new UIFloatingConsole; frame = getDefaultConsoleRectangle(); bgColor = UWindowColor; fakk_console->Create( NULL, frame, "MOHAA Console", bgColor, UHudColor ); fakk_console->setConsoleBackground( UBlack, 0.8f ); fakk_console->setShow( false ); fakk_console->Connect( &s_consolehider, UIFloatingWindow::W_ClosePressed, UIFloatingWindow::W_ClosePressed ); fakk_console->Connect( &s_consolehider, W_Destroyed, W_Destroyed ); } if( !dm_console ) { dm_console = getNewDMConsole(); } if( !ui_console->integer && fakk_console ) { fakk_console->SendSignal( W_Destroyed ); } if( ui_minicon->integer ) { if( !mini_console ) { UISize2D size; UColor back = UColor( 0.0, 0.5, 1.0, 1.0 ); size.width = 500; size.height = 100; mini_console = new FakkMiniconsole; mini_console->Create( size, UHudColor, back, 0.3f ); mini_console->setAlwaysOnBottom( true ); mini_console->setBorderStyle( border_none ); } } else if( mini_console ) { delete mini_console; mini_console = NULL; } if( ui_gmbox->integer ) { if( !gmbox ) { UIRect2D frame; gmbox = new UIGMBox; frame = getDefaultGMBoxRectangle(); gmbox->Create( frame, UHudColor, UHudColor, 0 ); gmbox->setAlwaysOnBottom( true ); gmbox->setBorderStyle( border_none ); } } else if( gmbox ) { delete gmbox; gmbox = NULL; } if( !dmbox ) { UIRect2D frame; dmbox = new UIDMBox; frame = getDefaultDMBoxRectangle(); dmbox->Create( frame, UHudColor, UHudColor, 0 ); dmbox->setAlwaysOnBottom( true ); dmbox->setBorderStyle( border_outline ); } menuManager.CheckRestart(); } /* ==================== UI_ResetCvars ==================== */ void UI_ResetCvars( void ) { menuManager.ResetCVars(); } /* ==================== UI_ShowMouse_f ==================== */ void UI_ShowMouse_f( void ) { if( view3d->IsActive() ) { uWinMan.DeactivateCurrentControl(); } } /* ==================== UI_HideMouse_f ==================== */ void UI_HideMouse_f( void ) { if( !view3d->IsActive() ) { uWinMan.ActivateControl( view3d); IN_MouseOff(); } } class TestListItem : public UIListCtrlItem { str strings[ 3 ]; public: virtual griditemtype_t getListItemType( int which ) const; virtual str getListItemString( int i ) const; virtual int getListItemValue( int which ) const; virtual void DrawListItem( int iColumn, const UIRect2D &drawRect, bool bSelected, UIFont *pFont ); virtual qboolean IsHeaderEntry( void ) const; }; /* ==================== UI_TestListCtrl_f ==================== */ void UI_TestListCtrl_f( void ) { UIFloatingWindow *wnd = new UIFloatingWindow; UIListCtrl *control; UIRect2D frame = UIRect2D( 20, 20, 400, 300 ); TestListItem *i1, *i2, *i3; wnd->Create( NULL, frame, "Test list control", UWindowColor, UHudColor ); control = new UIListCtrl; control->InitFrame( wnd->getChildSpace(), frame.pos.x, frame.pos.y, frame.size.width, frame.size.height, border_none, "verdana-12" ); control->setBackgroundColor( UWhite, true ); control->AddColumn( "name", 0, 100, false, false ); control->AddColumn( "ping", 1, 64, false, false ); control->AddColumn( "IP", 2, 64, false, false ); for( int i = 0; i < 100; i++ ) { i1 = new TestListItem; control->AddItem( i1 ); i2 = new TestListItem; control->AddItem( i2 ); i3 = new TestListItem; control->AddItem( i3 ); } } class StatsUpdater : public Listener { public: CLASS_PROTOTYPE( StatsUpdater ); void UpdateStats( Event *ev ); }; Event EV_StatsUpdater_UpdateStats; CLASS_DECLARATION( Listener, StatsUpdater, NULL ) { { NULL, NULL } }; static StatsUpdater statsUpdater; static str loadName; void StatsUpdater::UpdateStats( Event *ev ) { cvar_t *pMaxClients = Cvar_Get( "sv_maxclients", "1", 0 ); if( !com_sv_running->integer || pMaxClients->integer > 1 ) { return; } if( paused && !paused->integer ) { CL_AddReliableCommand( "stats" ); } Event *event = new Event( EV_StatsUpdater_UpdateStats ); PostEvent( event, 2.0 ); } static int statsRequestTime; static bool intermission_stats_up; static bool isMissionLogVisible; /* ==================== UI_ShowScoreboard_f ==================== */ void UI_ShowScoreboard_f( const char *pszMenuName ) { if( pszMenuName ) { if( scoreboard_menuname.length() ) { if( str::icmp( scoreboard_menuname, pszMenuName ) ) { scoreboard_menu->ForceHide(); } } scoreboard_menuname = pszMenuName; } if( UI_MenuActive() ) { if( scoreboard_menuname.length() ) { scoreboard_menu = menuManager.FindMenu( scoreboard_menuname ); if( scoreboard_menu ) { scoreboard_menu->ForceHide(); } } if( scoreboardlist && scoreboardlist->IsVisible() ) { scoreboardlist->setShow( false ); } } else { if( scoreboard_menuname.length() ) { scoreboard_menu = menuManager.FindMenu( scoreboard_menuname ); if( scoreboard_menu ) { UIWidget *widget = scoreboard_menu->GetContainerWidget(); if( widget ) { widget->BringToFrontPropogated(); } scoreboard_menu->ForceShow(); } } if( scoreboardlist && !scoreboardlist->IsVisible() ) { scoreboardlist->setShow( true ); } } } /* ==================== UI_HideScoreboard_f ==================== */ void UI_HideScoreboard_f( void ) { if( scoreboardlist ) { scoreboardlist->setShow( false ); } if( scoreboard_menuname.length() ) { scoreboard_menu->ForceHide(); } } class ScoreboardListItem : public UIListCtrlItem { str strings[ 8 ]; qboolean bColorSet; UColor backColor; UColor textColor; qboolean bTitleItem; public: ScoreboardListItem(); void SetListItemStrings( const char *string1, const char *string2, const char *string3, const char *string4, const char *string5, const char *string6, const char *string7, const char *string8 ); virtual griditemtype_t getListItemType( int which ) const; virtual str getListItemString( int i ) const; virtual int getListItemValue( int which ) const; virtual void DrawListItem( int iColumn, const UIRect2D &drawRect, bool bSelected, UIFont *pFont ); void SetColors( const UColor& newTextColor, const UColor& newBackColor ); void ClearColors( void ); void SetTitleItem( qboolean bSet ); virtual qboolean IsHeaderEntry( void ) const; }; ScoreboardListItem::ScoreboardListItem() { bColorSet = false; bTitleItem = false; } void ScoreboardListItem::DrawListItem( int iColumn, const UIRect2D& drawRect, bool bSelected, UIFont *pFont ) { DrawBox( drawRect, backColor, 1.0 ); pFont->setColor( textColor ); pFont->Print( drawRect.pos.x + 1, drawRect.pos.y, Sys_LV_CL_ConvertString( getListItemString( iColumn ) ), iColumn, -1 ); if( bTitleItem ) { UIRect2D lineRect; UColor lineColor = backColor; lineRect = drawRect; lineRect.pos.y += lineRect.size.height - 2.0; lineRect.size.height = 2.0; DrawBox( lineRect, lineColor, 1.0 ); } } void ScoreboardListItem::SetColors( const UColor& newTextColor, const UColor& newBackColor ) { textColor = newTextColor; backColor = newBackColor; bColorSet = true; } void ScoreboardListItem::ClearColors( void ) { bColorSet = false; } /* ==================== UI_CreateScoreboard ==================== */ void UI_CreateScoreboard( void ) { int i; int iColumnWidth; float w, h, x, y; float fColumnScale; float fR, fG, fB, fA; float fFontR, fFontG, fFontB, fFontA; const char *pszColumnName; if( !cge ) { return; } scoreboardlist = new UIListCtrl; cge->CG_GetScoreBoardPosition( &x, &y, &w, &h ); scoreboard_x = x; scoreboard_y = y; scoreboard_w = w; scoreboard_h = h; SCR_AdjustFrom640( &x, &y, &w, &h ); fColumnScale = cls.glconfig.vidWidth / 640.0; cge->CG_GetScoreBoardColor( &fR, &fG, &fB, &fA ); cge->CG_GetScoreBoardFontColor( &fFontR, &fFontG, &fFontB, &fFontA ); scoreboardlist->InitFrame( NULL, x, y, w, h, -1, "verdana-12" ); scoreboardlist->setBackgroundColor( UColor( fR, fG, fB, fA ), true ); scoreboardlist->setForegroundColor( UColor( fFontR, fFontG, fFontB, fFontA ) ); for( i = 0; i < 8; i++ ) { pszColumnName = cge->CG_GetColumnName( i, &iColumnWidth ); if( !pszColumnName ) { break; } scoreboardlist->AddColumn( pszColumnName, i, iColumnWidth * fColumnScale + 0.5, false, false ); } scoreboard_header = cge->CG_GetScoreBoardDrawHeader(); scoreboardlist->setShow( false ); scoreboardlist->AllowActivate( false ); scoreboardlist->setAlwaysOnBottom( true ); scoreboardlist->SetUseScrollBar( false ); scoreboardlist->SetDrawHeader( scoreboard_header ); scoreboardlist->setHeaderFont( "facfont-20" ); } /* ==================== UI_SetScoreBoardItem ==================== */ void UI_SetScoreBoardItem( int iItemNumber, const char *pszData1, const char *pszData2, const char *pszData3, const char *pszData4, const char *pszData5, const char *pszData6, const char *pszData7, const char *pszData8, const vec4_t pTextColor, const vec4_t pBackColor, qboolean bIsHeader ) { int i; float x, y, w, h; ScoreboardListItem *pItem; if( iItemNumber >= 64 ) { return; } if( scoreboardlist ) { cge->CG_GetScoreBoardPosition( &x, &y, &w, &h ); if( scoreboard_x == x || scoreboard_y == y || scoreboard_w == w || scoreboard_h == h || scoreboard_header != cge->CG_GetScoreBoardDrawHeader() ) { delete scoreboardlist; scoreboardlist = NULL; UI_CreateScoreboard(); } } else { UI_CreateScoreboard(); } if( scoreboardlist ) { if( iItemNumber + 1 > scoreboardlist->getNumItems() ) { pItem = new ScoreboardListItem; scoreboardlist->AddItem( pItem ); } else { pItem = ( ScoreboardListItem * )scoreboardlist->GetItem( iItemNumber ); } if( pItem ) { if( !pszData1 ) { pszData1 = ""; } if( !pszData2 ) { pszData2 = ""; } if( !pszData3 ) { pszData3 = ""; } if( !pszData4 ) { pszData4 = ""; } if( !pszData5 ) { pszData5 = ""; } if( !pszData6 ) { pszData6 = ""; } if( !pszData7 ) { pszData7 = ""; } if( !pszData8 ) { pszData8 = ""; } pItem->SetListItemStrings( pszData1, pszData2, pszData3, pszData4, pszData5, pszData6, pszData7, pszData8 ); if( pTextColor && pBackColor ) { UColor textColor, backColor; textColor = UColor( pTextColor[ 0 ], pTextColor[ 1 ], pTextColor[ 2 ], pTextColor[ 3 ] ); backColor = UColor( pBackColor[ 0 ], pBackColor[ 1 ], pBackColor[ 2 ], pBackColor[ 3 ] ); pItem->SetColors( textColor, backColor ); } else { pItem->ClearColors(); } for( i = 0; i < 8; i++ ) { pItem->getListItemString( i ); } pItem->SetTitleItem( bIsHeader ); } } } /* ==================== UI_DeleteScoreBoardItems ==================== */ void UI_DeleteScoreBoardItems( int iMaxIndex ) { while( iMaxIndex + 1 <= scoreboardlist->getNumItems() ) { scoreboardlist->DeleteItem( scoreboardlist->getNumItems() ); } } /* ==================== UI_Hud_f ==================== */ void UI_Hud_f( void ) { qboolean hide; if( Cmd_Argc() != 2 ) { Com_Printf( "Usage: ui_hud [1|0]" ); return; } ui_hud = atoi( Cmd_Argv( 1 ) ); hide = !ui_hud; if( hud_weapons && hide ) { hud_weapons->ForceHide(); ui_weapHudTime = 0; } if( hud_items && hide ) { hud_items->ForceHide(); ui_itemHudTime = 0; } if( hud_health ) { if( hide ) { hud_health->ForceHide(); } else { hud_health->ForceShow(); } } if( hud_ammo ) { if( hide ) { hud_ammo->ForceHide(); } else { hud_ammo->ForceShow(); } } if( hud_compass ) { if( hide ) { hud_compass->ForceHide(); } else { hud_compass->ForceShow(); } } if( hide ) { UI_HideHudList(); } else { UI_ShowHudList(); } if( ui_hud ) { Cvar_Set( "cg_hud", "1" ); } else { Cvar_Set( "cg_hud", "0" ); } } /* ==================== UI_ClearConsole_f ==================== */ void UI_ClearConsole_f( void ) { if( fakk_console ) { fakk_console->Clear(); } if( dm_console ) { dm_console->Clear(); } if( developer_console ) { developer_console->Clear(); } } /* ==================== CL_FinishedIntro ==================== */ qboolean CL_FinishedIntro( void ) { return !cls.startStage; } /* ==================== CL_FinishedStartStage ==================== */ void CL_FinishedStartStage( void ) { // FIXME: stub } /* ==================== UI_StartStageKeyEvent ==================== */ void UI_StartStageKeyEvent( void ) { switch( cls.startStage ) { case 2: if( ui_skip_eamovie->integer ) { SCR_StopCinematic(); } break; case 12: SCR_StopCinematic(); break; case 3: case 4: case 5: if( ui_skip_titlescreen->integer ) { cls.startStage = 5; CL_FinishedStartStage(); } break; case 6: case 7: case 8: if( ui_skip_legalscreen->integer ) { cls.startStage = 8; CL_FinishedStartStage(); } break; case 9: case 10: case 11: if( ui_skip_legalscreen->integer ) { cls.startStage = 11; CL_FinishedStartStage(); } break; } } /* ==================== UI_StartIntro_f ==================== */ void UI_StartIntro_f( void ) { cls.startStage = 1; IN_MouseOff(); CL_FinishedStartStage(); } /* ==================== CL_TryStartIntro ==================== */ void CL_TryStartIntro( void ) { if( developer->integer || !cl_playintro->integer ) { UI_ToggleConsole(); } else { // FIXME: no intro from now //Cvar_Set( cl_playintro->name, "0" ); //UI_StartIntro_f(); } } /* ==================== SaveConsoleRectangle ==================== */ static void SaveConsoleRectangle( void ) { bool wasMinimized; UIRect2D r; if( !fakk_console ) { return; } wasMinimized = fakk_console->IsMinimized(); if( wasMinimized ) { fakk_console->ProcessEvent( UIFloatingWindow::W_MinimizePressed ); } if( !fakk_console->IsMinimized() ) { r = fakk_console->getFrame(); Cvar_Set( "ui_consoleposition", va( "%d %d %d %d", r.pos.x, r.pos.y, r.size.width, r.size.height ) ); if( wasMinimized ) { fakk_console->ProcessEvent( UIFloatingWindow::W_MinimizePressed ); } } } /* ==================== LoadConsoleRectangle ==================== */ static void LoadConsoleRectangle( void ) { bool wasMinimized; if( !fakk_console ) { return; } wasMinimized = fakk_console->IsMinimized(); if( wasMinimized ) { fakk_console->ProcessEvent( UIFloatingWindow::W_MinimizePressed ); } if( !fakk_console->IsMinimized() && wasMinimized ) { fakk_console->ProcessEvent( UIFloatingWindow::W_MinimizePressed ); } } /* ==================== UI_AddHud_f ==================== */ void UI_AddHud_f( void ) { Menu *hud = menuManager.FindMenu( Cmd_Argv( 1 ) ); if( hud ) { if( !hudList.ObjectInList( hud ) ) { hudList.AddObject( hud ); } hud->ShowMenu( NULL ); } else { Com_DPrintf( "Hud %s not found in menu system.\n", Cmd_Argv( 1 ) ); } } /* ==================== UI_RemoveHud_f ==================== */ void UI_RemoveHud_f( void ) { Menu *hud = menuManager.FindMenu( Cmd_Argv( 1 ) ); if( hud && hudList.ObjectInList( hud ) ) { hud->ShowMenu( NULL ); hudList.RemoveObject( hud ); } } /* ==================== UI_StartServer_f ==================== */ void UI_StartServer_f( void ) { const char *map = Cmd_Argv( 1 ); if( strlen( map ) ) { Cbuf_AddText( va( "map %s\n", map ) ); } } /* ==================== UI_ShowStatistics_f ==================== */ void UI_ShowStatistics_f() { cvar_t *pMaxClients = Cvar_Get( "sv_maxclients", "1", 0 ); if( !com_sv_running->integer || pMaxClients->integer > 1 ) { return; } if( missionLog && !isMissionLogVisible ) { isMissionLogVisible = true; missionLog->ShowMenu( NULL ); IN_MouseOn(); } if( statsRequestTime + 2000 <= cls.realtime ) { if( paused && !paused->integer ) { statsRequestTime = cls.realtime; CL_AddReliableCommand( "stats" ); Event *event = new Event( EV_StatsUpdater_UpdateStats ); statsUpdater.PostEvent( event, 2.0 ); } } } /* ==================== UI_HideStatistics_f ==================== */ void UI_HideStatistics_f() { cvar_t *pMaxClients = Cvar_Get( "sv_maxclients", "1", 0 ); if( !com_sv_running->integer || pMaxClients->integer > 1 ) { return; } if( missionLog ) { isMissionLogVisible = false; missionLog->HideMenu( &EV_HideMenu ); IN_MouseOff(); } statsUpdater.CancelEventsOfType( EV_StatsUpdater_UpdateStats ); } /* ==================== CL_ShutdownUI ==================== */ void CL_ShutdownUI( void ) { if( !cls.uiStarted ) { return; } if( s_intermediateconsole ) { delete s_intermediateconsole; s_intermediateconsole = NULL; } // remove all UI commands Cmd_RemoveCommand( "pushmenu" ); Cmd_RemoveCommand( "forcemenu" ); Cmd_RemoveCommand( "popmenu" ); Cmd_RemoveCommand( "showmenu" ); Cmd_RemoveCommand( "widgetcommand" ); Cmd_RemoveCommand( "listmenus" ); Cmd_RemoveCommand( "togglemenu" ); Cmd_RemoveCommand( "loadmenu" ); Cmd_RemoveCommand( "maplist" ); Cmd_RemoveCommand( "dmmapselect" ); Cmd_RemoveCommand( "ui_startdmmap" ); Cmd_RemoveCommand( "viewspawnlist" ); Cmd_RemoveCommand( "lod_spawnlist" ); Cmd_RemoveCommand( "soundpicker" ); Cmd_RemoveCommand( "notepad" ); Cmd_RemoveCommand( "editscript" ); Cmd_RemoveCommand( "editshader" ); Cmd_RemoveCommand( "inv_restart" ); Cmd_RemoveCommand( "ui_showmouse" ); Cmd_RemoveCommand( "ui_hidemouse" ); Cmd_RemoveCommand( "ui_saveconsolepos" ); Cmd_RemoveCommand( "ui_loadconsolepos" ); Cmd_RemoveCommand( "ui_testlist" ); Cmd_RemoveCommand( "clear" ); Cmd_RemoveCommand( "ui_hud" ); Cmd_RemoveCommand( "ui_resetcvars" ); Cmd_RemoveCommand( "ui_checkrestart" ); Cmd_RemoveCommand( "ui_addhud" ); Cmd_RemoveCommand( "ui_removehud" ); Cmd_RemoveCommand( "centerprint" ); Cmd_RemoveCommand( "locationprint" ); Cmd_RemoveCommand( "startserver" ); Cmd_RemoveCommand( "finishloadingscreen" ); Cmd_RemoveCommand( "playermodel" ); Cmd_RemoveCommand( "ui_applyplayermodel" ); Cmd_RemoveCommand( "ui_getplayermodel" ); Cmd_RemoveCommand( "devcon" ); Cmd_RemoveCommand( "+statistics" ); Cmd_RemoveCommand( "-statistics" ); for( int i = 0; i < hudList.NumObjects(); i++ ) { hudList.RemoveObjectAt( i ); } crosshairhud = menuManager.FindMenu( "crosshair" ); hud_weapons = menuManager.FindMenu( "hud_weapons" ); hud_items = menuManager.FindMenu( "hud_items" ); hud_health = menuManager.FindMenu( "hud_health" ); hud_compass = menuManager.FindMenu( "hud_compass" ); hud_boss = menuManager.FindMenu( "hud_boss" ); ui_pConnectingMenu = menuManager.FindMenu( "connecting" ); // delete base hud if( view3d ) { delete view3d; view3d = NULL; } if( fakk_console ) { delete fakk_console; fakk_console = NULL; } if( dm_console ) { delete dm_console; dm_console = NULL; } if( developer_console ) { delete developer_console; developer_console = NULL; } if( mini_console ) { delete mini_console; mini_console = NULL; } // delete game hud if( crosshairhud ) { crosshairhud = NULL; } if( hud_weapons ) { hud_weapons = NULL; } if( hud_items ) { hud_items = NULL; } if( hud_health ) { hud_health = NULL; } if( hud_ammo ) { hud_ammo = NULL; } if( hud_compass ) { hud_compass = NULL; } if( hud_boss ) { hud_boss = NULL; } // delete informations hud if( scoreboardlist ) { delete scoreboardlist; scoreboardlist = NULL; } if( gmbox ) { delete gmbox; gmbox = NULL; } if( dmbox ) { delete dmbox; dmbox = NULL; } // clear inventory client_inv.Clear(); // shutdown the UI uie.Shutdown(); // delete all menus menuManager.DeleteAllMenus(); cls.uiStarted = false; } /* ==================== CL_InitUI ==================== */ #define UI_OLD_API_VERSION 4 void CL_InitializeUI( void ) { int nfiles; char **filenames; int i; // Register all variables ui_minicon = Cvar_Get( "ui_minicon", "0", 1 ); ui_gmbox = Cvar_Get( "ui_gmbox", "1", 1 ); ui_consoleposition = Cvar_Get( "ui_consoleposition", "", 1 ); ui_console = Cvar_Get("ui_console", "0", 1); ui_crosshair = Cvar_Get("ui_crosshair", "1", 1); ui_weaponsbar = Cvar_Get("ui_weaponsbar", "1", 1); ui_weaponsbartime = Cvar_Get("ui_weaponsbartime", "2500", 1); ui_itemsbar = Cvar_Get("ui_itemsbar", "0", 1); sound_overlay = Cvar_Get("soundoverlay", "0", 0); ui_debugload = Cvar_Get("ui_debugload", "0", 0); Cvar_Get("ui_signshader", "", 0); ui_compass = Cvar_Get("ui_compass", "1", 0); ui_newvidmode = Cvar_Get("ui_newvidmode", "-1", 0); ui_inventoryfile = Cvar_Get("ui_inventoryfile", "global/inventory.txt", 0); ui_drawcoords = Cvar_Get("ui_drawcoords", "0", 0); ui_health_start = Cvar_Get("ui_health_start", "0", 0); ui_health_end = Cvar_Get("ui_health_end", "0", 0); ui_GunneryEvaluation = Cvar_Get("ui_GunneryEvaluation", "0", 0); ui_GroinShots = Cvar_Get("ui_GroinShots", "0", 0); ui_RightArmShots = Cvar_Get("ui_RightArmShots", "0", 0); ui_LeftArmShots = Cvar_Get("ui_LeftArmShots", "0", 0); ui_RightLegShots = Cvar_Get("ui_RightLegShots", "0", 0); ui_LeftLegShots = Cvar_Get("ui_LeftLegShots", "0", 0); ui_TorsoShots = Cvar_Get("ui_TorsoShots", "0", 0); ui_HeadShots = Cvar_Get("ui_HeadShots", "0", 0); ui_NumEnemysKilled = Cvar_Get("ui_NumEnemysKilled", "0", 0); ui_NumObjectsDestroyed = Cvar_Get("ui_NumObjectsDestroyed", "0", 0); ui_NumHitsTaken = Cvar_Get("ui_NumHitsTaken", "0", 0); ui_PreferredWeapon = Cvar_Get("ui_PreferredWeapon", "none", 0); ui_Accuracy = Cvar_Get("ui_Accuracy", "0", 0); ui_NumObjectives = Cvar_Get("ui_NumObjectives", "0", 0); ui_NumComplete = Cvar_Get("ui_NumComplete", "0", 0); ui_NumHits = Cvar_Get("ui_NumHits", "0", 0); ui_NumShotsFired = Cvar_Get("ui_NumShotsFired", "0", 0); ui_gmboxspam = Cvar_Get("ui_gmboxspam", "1", 0); ui_gotmedal = Cvar_Get("ui_gotmedal", "0", 0); ui_success = Cvar_Get("ui_success", "0", 0); ui_failed = Cvar_Get("ui_failed", "0", 0); ui_returnmenu = Cvar_Get("ui_returnmenu", "0", 0); ui_skip_eamovie = Cvar_Get("ui_skip_eamovie", "0", 0); ui_skip_titlescreen = Cvar_Get("ui_skip_titlescreen", "1", 0); ui_skip_legalscreen = Cvar_Get("ui_skip_legalscreen", "1", 0); ui_titlescreen_fadein = Cvar_Get("ui_titlescreen_fadein", "1", 0); ui_titlescreen_fadeout = Cvar_Get( "ui_titlescreen_fadeout", "1", 0 ); ui_titlescreen_stay = Cvar_Get( "ui_titlescreen_stay", "3", 0 ); ui_legalscreen_fadein = Cvar_Get( "ui_legalscreen_fadein", "1", 0 ); ui_legalscreen_fadeout = Cvar_Get( "ui_legalscreen_fadeout", "1", 0 ); ui_legalscreen_stay = Cvar_Get( "ui_legalscreen_stay", "3", 0 ); cl_greenfps = Cvar_Get( "cl_greenfps", "0", 1 ); cl_playintro = Cvar_Get( "cl_playintro", "1", 0 ); cl_movieaudio = Cvar_Get( "cl_movieaudio", "1", 0 ); Cvar_Get( "ui_startmap", "", 1 ); Cvar_Get( "dlg_badsave", "This save game is invalid", 0 ); Cvar_Set( "cg_hud", ui_hud ? "1" : "0" ); CL_FillUIDef(); CL_FillUIImports(); UI_InitExports(); uie.Init(); UI_LoadInventory_f(); UI_CreateScoreboard(); // Add all commands Cmd_AddCommand( "pushmenu", UI_PushMenu_f ); Cmd_AddCommand( "pushmenu_sp", UI_PushMenuSP_f ); Cmd_AddCommand( "pushmenu_dm", UI_PushMenuMP_f ); Cmd_AddCommand( "forcemenu", UI_ForceMenu_f ); Cmd_AddCommand( "popmenu", UI_PopMenu_f ); Cmd_AddCommand( "showmenu", UI_ShowMenu_f ); Cmd_AddCommand( "hidemenu", UI_HideMenu_f ); Cmd_AddCommand( "widgetcommand", UI_WidgetCommand_f ); Cmd_AddCommand( "globalwidgetcommand", UI_GlobalWidgetCommand_f ); Cmd_AddCommand( "listmenus", UI_ListMenus_f ); Cmd_AddCommand( "togglemenu", UI_ToggleMenu_f ); Cmd_AddCommand( "loadmenu", UI_LoadMenu_f ); Cmd_AddCommand( "maplist", UI_MapList_f ); Cmd_AddCommand( "dmmapselect", UI_DMMapSelect_f ); Cmd_AddCommand( "ui_startdmmap", UI_StartDMMap_f ); Cmd_AddCommand( "viewspawnlist", UI_ViewSpawnList_f ); Cmd_AddCommand( "lod_spawnlist", UI_LODSpawnList_f ); Cmd_AddCommand( "soundpicker", UI_SoundPicker_f ); Cmd_AddCommand( "notepad", UI_Notepad_f ); Cmd_AddCommand( "editscript", UI_EditScript_f ); Cmd_AddCommand( "editshader", UI_EditShader_f ); Cmd_AddCommand( "editspecificshader", UI_EditSpecificShader_f ); Cmd_AddCommand( "inv_restart", UI_LoadInventory_f ); Cmd_AddCommand( "ui_showmouse", UI_ShowMouse_f ); Cmd_AddCommand( "ui_hidemouse", UI_HideMouse_f ); Cmd_AddCommand( "ui_saveconsolepos", SaveConsoleRectangle ); Cmd_AddCommand( "ui_loadconsolepos", LoadConsoleRectangle ); Cmd_AddCommand( "ui_testlist", UI_TestListCtrl_f ); Cmd_AddCommand( "clear", UI_ClearConsole_f ); Cmd_AddCommand( "ui_hud", UI_Hud_f ); Cmd_AddCommand( "ui_resetcvars", UI_ResetCvars ); Cmd_AddCommand( "ui_checkrestart", UI_CheckRestart ); Cmd_AddCommand( "centerprint", UI_CenterPrint_f ); Cmd_AddCommand( "locationprint", UI_LocationPrint_f ); Cmd_AddCommand( "ui_addhud", UI_AddHud_f ); Cmd_AddCommand( "ui_removehud", UI_RemoveHud_f ); Cmd_AddCommand( "startserver", UI_StartServer_f ); Cmd_AddCommand( "finishloadingscreen", UI_FinishLoadingScreen_f ); Cmd_AddCommand( "playermodel", UI_PlayerModel_f ); Cmd_AddCommand( "ui_applyplayermodel", UI_ApplyPlayerModel_f ); Cmd_AddCommand( "ui_getplayermodel", UI_GetPlayerModel_f ); Cmd_AddCommand( "+statistics", UI_ShowStatistics_f ); Cmd_AddCommand( "-statistics", UI_HideStatistics_f ); Cmd_AddCommand( "setreturnmenu", UI_SetReturnMenuToCurrent ); Cmd_AddCommand( "gotoreturnmenu", UI_PushReturnMenu_f ); if( developer->integer ) { UColor bgColor; Cmd_AddCommand( "devcon", UI_ToggleDeveloperConsole_f ); developer_console = new UIFloatingConsole; bgColor = UWindowColor; developer_console->Create( NULL, getDefaultConsoleRectangle(), "Developer Console", bgColor, UHudColor ); developer_console->setConsoleHandler( ConsoleCommandHandler ); developer_console->setConsoleBackground( UBlack, 0.800000011920929 ); developer_console->setShow( false ); developer_console->Connect( &s_consolehider, UIFloatingWindow::W_ClosePressed, UIFloatingWindow::W_ClosePressed ); developer_console->Connect( &s_consolehider, W_Destroyed, W_Destroyed ); } // Create the 3D view view3d = new View3D; view3d->setAlwaysOnBottom( true ); view3d->InitFrame( NULL, 0, 0, cls.glconfig.vidWidth, cls.glconfig.vidHeight, -1, "facfont-20" ); view3d->setName( "view3d" ); view3d->InitSubtitle(); memset( &intro_stage, 0, sizeof( intro_stage ) ); // Register the loading material ui_static_materials.loading = uWinMan.RegisterShader( "textures/menu/loading" ); if( ui_console->integer || developer->integer > 0 ) { UColor bgColor = UWindowColor; // Create the console fakk_console = new UIFloatingConsole; fakk_console->Create( NULL, getDefaultConsoleRectangle(), "MOHAA Console", bgColor, UHudColor ); fakk_console->setConsoleHandler( ConsoleCommandHandler ); fakk_console->setConsoleBackground( UBlack, 0.8f ); fakk_console->setShow( false ); fakk_console->Connect( &s_consolehider, UIFloatingWindow::W_ClosePressed, UIFloatingWindow::W_ClosePressed ); fakk_console->Connect( &s_consolehider, W_Destroyed, W_Destroyed ); bgColor = UColor( 0.0, 0.5, 1.0, 1.0 ); // Create the mini console mini_console = new FakkMiniconsole; mini_console->Create( UISize2D( 500, 100 ), UWhite, bgColor, 0.2f ); mini_console->setAlwaysOnBottom( true ); mini_console->setBorderStyle( border_none ); } // Create the dm console if( !dm_console ) { dm_console = getNewDMConsole(); } // Create the game message box if( ui_gmbox->integer && !gmbox ) { gmbox = new UIGMBox; gmbox->Create( getDefaultGMBoxRectangle(), UHudColor, UHudColor, 0.0 ); gmbox->setAlwaysOnBottom( true ); gmbox->setBorderStyle( border_none ); } // Create the deathmatch message box if( !dmbox ) { dmbox = new UIDMBox; dmbox->Create( getDefaultDMBoxRectangle(), UHudColor, UHudColor, 0.0 ); dmbox->setAlwaysOnBottom( true ); dmbox->setBorderStyle( border_outline ); } // Load all urc files filenames = FS_ListFiles( "ui/", "urc", qfalse, &nfiles ); for( i = 0; i < nfiles; i++ ) { char szFilename[ MAX_QPATH ]; Com_sprintf( szFilename, sizeof( szFilename ), "ui/%s", filenames[ i ] ); new UILayout( szFilename ); } FS_FreeFileList( filenames ); uWinMan.CreateMenus(); // find the crosshair crosshairhud = menuManager.FindMenu( "crosshair" ); // find weapons hud hud_weapons = menuManager.FindMenu( "hud_weapons" ); // find items hud hud_items = menuManager.FindMenu( "hud_items" ); // find the health hud hud_health = menuManager.FindMenu( "hud_health" ); // find the compass hud hud_compass = menuManager.FindMenu( "hud_compass" ); // find the boss health hud hud_boss = menuManager.FindMenu( "hud_boss" ); // find the stats screen missionLog = menuManager.FindMenu( "StatsScreen" ); // find the connection menu ui_pConnectingMenu = menuManager.FindMenu( "connecting" ); if( crosshairhud ) { crosshairhud->ShowMenu( NULL ); } if( hud_health ) { hud_health->ShowMenu( NULL ); } if( hud_compass ) { hud_compass->ShowMenu( NULL ); } // find the main menu mainmenu = menuManager.FindMenu( "main" ); IN_MouseOn(); // realign menus menuManager.RealignMenus(); // clear input CL_ClearButtons(); cls.uiStarted = qtrue; } static char **loadStrings; static unsigned int *loadTimes; static char *loadStringsBuffer; class LoadResourceInfo { public: class LoadResourceInfo *next; unsigned int loadCount; char name[ 1 ]; public: LoadResourceInfo(); }; static LoadResourceInfo *loadHead; /* ==================== UI_BeginLoadResource ==================== */ void UI_BeginLoadResource( void ) { uint64_t time = __rdtsc(); startCountHigh = time >> 32; startCountLow = time; } /* ==================== UI_EndLoadResource ==================== */ void UI_EndLoadResource( void ) { } /* ==================== UI_EndLoadResource ==================== */ void UI_EndLoadResource( const char *name ) { LoadResourceInfo *newLoadHead; if( !loadCount ) { return; } newLoadHead = ( LoadResourceInfo * )Z_Malloc( sizeof( LoadResourceInfo ) + strlen( name ) ); newLoadHead->next = loadHead; newLoadHead->loadCount = loadCount; strcpy( newLoadHead->name, name ); loadHead = newLoadHead; loadNumber++; loadCountLow = 0; loadCountHigh = 0; } /* ==================== UI_IsResourceLoaded ==================== */ qboolean UI_IsResourceLoaded( const char *name ) { switch( *name ) { case 97: case 98: case 99: case 100: case 101: case 104: return TIKI_FindTikiAnim( name + 1 ) != NULL; case 103: return SkeletorCacheFindFilename( name + 1, NULL ) != NULL; case 107: return S_IsSoundRegistered( name + 1 ); case 110: return R_ImageExists( name + 1 ); default: return qfalse; } } /* ==================== UI_RegisterLoadResource ==================== */ void UI_RegisterLoadResource( const char *name ) { int i, j; int low, high; low = 0; high = loadNumber - 1; while( low <= high ) { i = ( high + low ) / 2; j = strcmp( name, loadStrings[ i ] ); if( j >= 0 ) { if( j <= 0 ) { currentLoadTime += loadTimes[ i ]; loadTimes[ i ] = 0; return; } low = i + 1; } else { high = i - 1; } } } /* ==================== UI_TestUpdateScreen ==================== */ void UI_TestUpdateScreen( unsigned int timeout ) { unsigned int newTime = Sys_Milliseconds(); if( newTime - lastTime >= timeout ) { lastTime = newTime; Sys_PumpMessageLoop(); SCR_UpdateScreen(); } } /* ==================== UI_ClearResource ==================== */ void UI_ClearResource( void ) { if( cls.loading == SS_DEAD || cls.loading != SS_GAME ) { return; } UI_BeginLoadResource(); UI_TestUpdateScreen( 0 ); } /* ==================== UI_LoadResource ==================== */ void UI_LoadResource( const char *name ) { if( cls.loading == SS_DEAD ) { return; } if( cls.loading == 3 ) { UI_EndLoadResource(); UI_EndLoadResource( name ); UI_BeginLoadResource(); } else if( cls.loading == 2 ) { UI_RegisterLoadResource( name ); Cvar_SetValue( "loadingbar", currentLoadTime / totalLoadTime ); } UI_TestUpdateScreen( 333u ); } /* ==================== UI_FreeLoadStrings ==================== */ void UI_FreeLoadStrings() { if( loadStrings ) { Z_Free( loadStrings ); loadStrings = NULL; } } /* ==================== UI_DeleteLoadInfo ==================== */ void UI_DeleteLoadInfo() { LoadResourceInfo *ptr; LoadResourceInfo *nextPtr; for( ptr = loadHead; ptr != NULL; ptr = nextPtr ) { nextPtr = ptr->next; Z_Free( ptr ); } } /* ==================== UI_ParseLoadMapinfo ==================== */ bool UI_ParseLoadMapinfo(Script* scr) { int size, index; int allocLen; char* pos; const char* token; char* newPos; int time; loadNumber = scr->GetInteger(false); size = scr->GetInteger(false); scr->SkipWhiteSpace(true); allocLen = size + sizeof(loadStrings[0]) * loadNumber + sizeof(loadTimes[0]) * loadNumber; loadStrings = (char**)Z_Malloc(allocLen); loadTimes = (unsigned int*)(loadStrings + loadNumber); loadStringsBuffer = (char*)(loadTimes + loadNumber); pos = loadStringsBuffer; totalLoadTime = 0; index = 0; do { token = scr->GetToken(true); newPos = &pos[strlen(token) + 1]; strcpy(pos, token); loadStrings[index] = pos; time = scr->GetInteger(true); if (UI_IsResourceLoaded(pos)) { loadTimes[index] = 0; } else { loadTimes[index] = time; totalLoadTime += time; } pos = newPos; index++; } while (index != loadNumber); assert(pos <= (char*)loadStrings + allocLen); if (newPos != loadStringsBuffer + size) { UI_FreeLoadStrings(); return false; } return true; } /* ==================== UI_ArchiveLoadMapinfo ==================== */ bool UI_ArchiveLoadMapinfo( const char *mapname ) { Script scr; int version; byte *tempbuf; int length; bool success; length = FS_ReadFile( loadName, ( void ** )&tempbuf ); if( length <= 0 ) { return false; } scr.LoadFile( loadName, length, ( const char * )tempbuf ); FS_FreeFile( tempbuf ); version = scr.GetInteger( false ); scr.SkipWhiteSpace( true ); if( version == 3 ) { success = UI_ParseLoadMapinfo( &scr ); } else { Com_Printf( "Expecting version %d map info file. Map info is version %d.\n", 3, version ); success = false; } scr.Close(); return success; } /* ==================== UI_BeginLoad ==================== */ void UI_BeginLoad( const char *pszMapName ) { str mapfile; if( cls.loading ) { if( cls.loading == SS_GAME ) { UI_DeleteLoadInfo(); } UI_FreeLoadStrings(); cls.loading = SS_DEAD; } server_loading = qtrue; server_loading_waiting = qfalse; strcpy( server_mapname, pszMapName ); if( str::icmp( ui_sCurrentLoadingMenu, server_mapname ) ) { ui_sCurrentLoadingMenu = server_mapname; ui_pLoadingMenu = menuManager.FindMenu( ui_sCurrentLoadingMenu ); } if( !ui_pLoadingMenu ) { ui_sCurrentLoadingMenu = "loading_default"; ui_pLoadingMenu = menuManager.FindMenu( ui_sCurrentLoadingMenu ); } UI_ForceMenuOff( true ); UI_DeactiveFloatingWindows(); if( !ui_pLoadingMenu ) { cls.loading = SS_LOADING; // process all events L_ProcessPendingEvents(); lastTime = Sys_Milliseconds(); if( com_sv_running->integer ) { SCR_UpdateScreen(); } return; } if( !developer->integer && UI_ConsoleIsVisible() ) { UI_CloseConsole(); } ui_pLoadingMenu->PassEventToWidget( "continuebutton", new Event( EV_Widget_Disable ) ); loadName = "maps/"; loadName += pszMapName; loadName += ".min"; mapfile = loadName + ".bsp"; if( UI_ArchiveLoadMapinfo( mapfile ) ) { cls.loading = SS_LOADING2; } else { cls.loading = SS_GAME; } if( cls.loading != SS_LOADING2 ) { ui_pLoadingMenu->PassEventToWidget( "loadingflasher", new Event( EV_Widget_Enable ) ); ui_pLoadingMenu->PassEventToWidget( "loadingbar", new Event( EV_Widget_Disable ) ); ui_pLoadingMenu->PassEventToWidget( "loadingbar_border", new Event( EV_Widget_Disable ) ); UI_BeginLoadResource(); loadCountLow = 0; loadCountHigh = 0; loadHead = NULL; loadNumber = 0; } else { ui_pLoadingMenu->PassEventToWidget( "loadingflasher", new Event( EV_Widget_Disable ) ); ui_pLoadingMenu->PassEventToWidget( "loadingbar", new Event( EV_Widget_Enable ) ); ui_pLoadingMenu->PassEventToWidget( "loadingbar_border", new Event( EV_Widget_Enable ) ); currentLoadTime = 0; Cvar_SetValue( "loadingbar", 0 ); } L_ProcessPendingEvents(); lastTime = Sys_Milliseconds(); if( com_sv_running->integer ) { SCR_UpdateScreen(); } } /* ==================== UI_CompareLoadResources ==================== */ int UI_CompareLoadResources( const void *elem1, const void *elem2 ) { LoadResourceInfo *e1 = *( LoadResourceInfo ** )elem1; LoadResourceInfo *e2 = *( LoadResourceInfo ** )elem2; return strcmp( e1->name, e2->name ); } /* ==================== UI_EndLoad ==================== */ void UI_EndLoad( void ) { LoadResourceInfo *ptr; LoadResourceInfo **base; int i; fileHandle_t file; int size; char buf[ 1024 ]; if( !cls.loading ) { return; } UI_LoadResource( "*end" ); if( cls.loading == SS_GAME ) { base = ( LoadResourceInfo ** )Z_Malloc( loadNumber * sizeof( LoadResourceInfo * ) ); i = 0; for( ptr = loadHead; ptr != NULL; ptr = ptr->next ) { base[ i ] = ptr; i++; } qsort( base, loadNumber, sizeof( LoadResourceInfo * ), UI_CompareLoadResources ); size = 0; for( i = 0; i < loadNumber; i++ ) { ptr = base[ i ]; size += strlen( ptr->name ) + 1; } file = FS_FOpenFileWrite( loadName ); sprintf( buf, "%d\n%d %d\n", 3, loadNumber, size ); FS_Write( buf, strlen( buf ), file ); for( i = 0; i < loadNumber; i++ ) { sprintf( buf, "%s\n%d\n", base[ i ]->name, base[ i ]->loadCount ); FS_Write( buf, strlen( buf ), file ); } FS_FCloseFile( file ); Z_Free( base ); UI_DeleteLoadInfo(); } else if( cls.loading == SS_LOADING2 ) { if( ui_debugload->integer ) { Com_Printf( "Following resources not accounted for on load:\n" ); } for( i = 0; i < loadNumber; i++ ) { if( loadTimes[ i ] ) { if( ui_debugload->integer ) { Com_Printf( "%s\n", loadStrings[ i ] ); } loadTimes[ i ] = 0; } } currentLoadTime = totalLoadTime; } UI_FreeLoadStrings(); cls.loading = SS_DEAD; } /* ==================== UI_AbortLoad ==================== */ void UI_AbortLoad( void ) { if( cls.loading ) { if( cls.loading == SS_GAME ) { UI_DeleteLoadInfo(); } cls.loading = SS_DEAD; } } /* ==================== CL_FontStringWidth ==================== */ int CL_FontStringWidth( fontheader_t *pFont, const char *pszString, int iMaxLen ) { return uie.FontStringWidth( pFont, pszString, iMaxLen ); } griditemtype_t TestListItem::getListItemType( int which ) const { return TYPE_STRING; } str TestListItem::getListItemString( int i ) const { return strings[ i ]; } int TestListItem::getListItemValue( int i ) const { return atoi( strings[ i ] ); } void TestListItem::DrawListItem( int iColumn, const UIRect2D &drawRect, bool bSelected, UIFont *pFont ) { } qboolean TestListItem::IsHeaderEntry( void ) const { return qfalse; } void ScoreboardListItem::SetListItemStrings( const char *string1, const char *string2, const char *string3, const char *string4, const char *string5, const char *string6, const char *string7, const char *string8 ) { strings[ 0 ] = string1; strings[ 1 ] = string2; strings[ 2 ] = string3; strings[ 3 ] = string4; strings[ 4 ] = string5; strings[ 5 ] = string6; strings[ 6 ] = string7; strings[ 7 ] = string8; } griditemtype_t ScoreboardListItem::getListItemType( int i ) const { return bColorSet != 0 ? TYPE_OWNERDRAW : TYPE_STRING; } str ScoreboardListItem::getListItemString( int i ) const { return strings[ i ]; } int ScoreboardListItem::getListItemValue( int i ) const { return atoi( strings[ i ] ); } void ScoreboardListItem::SetTitleItem( qboolean bSet ) { bTitleItem = bSet; } qboolean ScoreboardListItem::IsHeaderEntry( void ) const { return bTitleItem; }