diff options
Diffstat (limited to 'code/client/cl_ui.c')
-rwxr-xr-x | code/client/cl_ui.c | 2400 |
1 files changed, 1200 insertions, 1200 deletions
diff --git a/code/client/cl_ui.c b/code/client/cl_ui.c index 80040a8..96cc07e 100755 --- a/code/client/cl_ui.c +++ b/code/client/cl_ui.c @@ -1,1200 +1,1200 @@ -/*
-===========================================================================
-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 Foobar; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-===========================================================================
-*/
-
-#include "client.h"
-
-#include "../game/botlib.h"
-
-extern botlib_export_t *botlib_export;
-
-vm_t *uivm;
-
-/*
-====================
-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( ) {
- 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( ) {
- 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 = 0;
-
- 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 = 0;
- 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));
- Info_SetValueForKey( info, "punkbuster", va("%i", server->punkbuster));
- 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( char *serverAddress, char *serverStatus, int maxLen ) {
- return CL_ServerStatus( serverAddress, serverStatus, maxLen );
-}
-
-/*
-====================
-CL_GetGlConfig
-====================
-*/
-static void CL_GetGlconfig( glconfig_t *config ) {
- *config = cls.glconfig;
-}
-
-/*
-====================
-GetClipboardData
-====================
-*/
-static void 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;
- }
-}
-
-/*
-====================
-Key_GetCatcher
-====================
-*/
-int Key_GetCatcher( void ) {
- return cls.keyCatchers;
-}
-
-/*
-====================
-Ket_SetCatcher
-====================
-*/
-void Key_SetCatcher( int catcher ) {
- cls.keyCatchers = catcher;
-}
-
-
-/*
-====================
-CLUI_GetCDKey
-====================
-*/
-static void CLUI_GetCDKey( char *buf, int buflen ) {
- cvar_t *fs;
- fs = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO );
- if (UI_usesUniqueCDKey() && fs && fs->string[0] != 0) {
- Com_Memcpy( buf, &cl_cdkey[16], 16);
- buf[16] = 0;
- } else {
- Com_Memcpy( buf, cl_cdkey, 16);
- buf[16] = 0;
- }
-}
-
-
-/*
-====================
-CLUI_SetCDKey
-====================
-*/
-static void CLUI_SetCDKey( char *buf ) {
- cvar_t *fs;
- fs = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO );
- if (UI_usesUniqueCDKey() && fs && fs->string[0] != 0) {
- Com_Memcpy( &cl_cdkey[16], buf, 16 );
- cl_cdkey[32] = 0;
- // set the flag so the fle will be written at the next opportunity
- cvar_modifiedFlags |= CVAR_ARCHIVE;
- } else {
- Com_Memcpy( cl_cdkey, buf, 16 );
- // set the flag so the fle will be written at the next opportunity
- cvar_modifiedFlags |= CVAR_ARCHIVE;
- }
-}
-
-/*
-====================
-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;
-}
-
-void *VM_ArgPtr( int intValue );
-#define VMA(x) VM_ArgPtr(args[x])
-#define VMF(x) ((float *)args)[x]
-
-/*
-====================
-CL_UISystemCalls
-
-The ui module is making a system call
-====================
-*/
-int CL_UISystemCalls( int *args ) {
- switch( args[0] ) {
- case UI_ERROR:
- Com_Error( ERR_DROP, "%s", VMA(1) );
- return 0;
-
- case UI_PRINT:
- Com_Printf( "%s", VMA(1) );
- return 0;
-
- case UI_MILLISECONDS:
- return Sys_Milliseconds();
-
- case UI_CVAR_REGISTER:
- Cvar_Register( VMA(1), VMA(2), VMA(3), args[4] );
- return 0;
-
- case UI_CVAR_UPDATE:
- Cvar_Update( VMA(1) );
- return 0;
-
- case UI_CVAR_SET:
- Cvar_Set( VMA(1), VMA(2) );
- return 0;
-
- case UI_CVAR_VARIABLEVALUE:
- return FloatAsInt( Cvar_VariableValue( VMA(1) ) );
-
- case UI_CVAR_VARIABLESTRINGBUFFER:
- Cvar_VariableStringBuffer( VMA(1), VMA(2), args[3] );
- return 0;
-
- case UI_CVAR_SETVALUE:
- Cvar_SetValue( VMA(1), VMF(2) );
- return 0;
-
- case UI_CVAR_RESET:
- Cvar_Reset( VMA(1) );
- return 0;
-
- case UI_CVAR_CREATE:
- Cvar_Get( VMA(1), VMA(2), args[3] );
- return 0;
-
- case UI_CVAR_INFOSTRINGBUFFER:
- Cvar_InfoStringBuffer( args[1], VMA(2), args[3] );
- return 0;
-
- case UI_ARGC:
- return Cmd_Argc();
-
- case UI_ARGV:
- Cmd_ArgvBuffer( args[1], VMA(2), args[3] );
- return 0;
-
- case UI_CMD_EXECUTETEXT:
- Cbuf_ExecuteText( args[1], VMA(2) );
- return 0;
-
- case UI_FS_FOPENFILE:
- return FS_FOpenFileByMode( VMA(1), VMA(2), args[3] );
-
- case UI_FS_READ:
- FS_Read2( VMA(1), args[2], args[3] );
- return 0;
-
- case UI_FS_WRITE:
- FS_Write( VMA(1), args[2], args[3] );
- return 0;
-
- case UI_FS_FCLOSEFILE:
- FS_FCloseFile( args[1] );
- return 0;
-
- case UI_FS_GETFILELIST:
- return FS_GetFileList( VMA(1), VMA(2), VMA(3), args[4] );
-
- case UI_FS_SEEK:
- return FS_Seek( args[1], args[2], args[3] );
-
- case UI_R_REGISTERMODEL:
- return re.RegisterModel( VMA(1) );
-
- case UI_R_REGISTERSKIN:
- return re.RegisterSkin( VMA(1) );
-
- case UI_R_REGISTERSHADERNOMIP:
- return re.RegisterShaderNoMip( VMA(1) );
-
- case UI_R_CLEARSCENE:
- re.ClearScene();
- return 0;
-
- case UI_R_ADDREFENTITYTOSCENE:
- re.AddRefEntityToScene( VMA(1) );
- return 0;
-
- case UI_R_ADDPOLYTOSCENE:
- re.AddPolyToScene( args[1], args[2], VMA(3), 1 );
- return 0;
-
- case UI_R_ADDLIGHTTOSCENE:
- re.AddLightToScene( VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) );
- return 0;
-
- case UI_R_RENDERSCENE:
- re.RenderScene( VMA(1) );
- return 0;
-
- case UI_R_SETCOLOR:
- re.SetColor( VMA(1) );
- return 0;
-
- case UI_R_DRAWSTRETCHPIC:
- re.DrawStretchPic( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), args[9] );
- return 0;
-
- case UI_R_MODELBOUNDS:
- re.ModelBounds( args[1], VMA(2), VMA(3) );
- return 0;
-
- case UI_UPDATESCREEN:
- SCR_UpdateScreen();
- return 0;
-
- case UI_CM_LERPTAG:
- re.LerpTag( VMA(1), args[2], args[3], args[4], VMF(5), VMA(6) );
- return 0;
-
- case UI_S_REGISTERSOUND:
- return S_RegisterSound( VMA(1), args[2] );
-
- case UI_S_STARTLOCALSOUND:
- S_StartLocalSound( args[1], args[2] );
- return 0;
-
- case UI_KEY_KEYNUMTOSTRINGBUF:
- Key_KeynumToStringBuf( args[1], VMA(2), args[3] );
- return 0;
-
- case UI_KEY_GETBINDINGBUF:
- Key_GetBindingBuf( args[1], VMA(2), args[3] );
- return 0;
-
- case UI_KEY_SETBINDING:
- Key_SetBinding( args[1], VMA(2) );
- return 0;
-
- case UI_KEY_ISDOWN:
- return Key_IsDown( args[1] );
-
- case UI_KEY_GETOVERSTRIKEMODE:
- return Key_GetOverstrikeMode();
-
- case UI_KEY_SETOVERSTRIKEMODE:
- Key_SetOverstrikeMode( args[1] );
- return 0;
-
- case UI_KEY_CLEARSTATES:
- Key_ClearStates();
- return 0;
-
- case UI_KEY_GETCATCHER:
- return Key_GetCatcher();
-
- case UI_KEY_SETCATCHER:
- Key_SetCatcher( args[1] );
- return 0;
-
- case UI_GETCLIPBOARDDATA:
- GetClipboardData( VMA(1), args[2] );
- return 0;
-
- case UI_GETCLIENTSTATE:
- GetClientState( VMA(1) );
- return 0;
-
- case UI_GETGLCONFIG:
- CL_GetGlconfig( VMA(1) );
- return 0;
-
- case UI_GETCONFIGSTRING:
- return GetConfigString( args[1], VMA(2), args[3] );
-
- case UI_LAN_LOADCACHEDSERVERS:
- LAN_LoadCachedServers();
- return 0;
-
- case UI_LAN_SAVECACHEDSERVERS:
- LAN_SaveServersToCache();
- return 0;
-
- case UI_LAN_ADDSERVER:
- return LAN_AddServer(args[1], VMA(2), VMA(3));
-
- case UI_LAN_REMOVESERVER:
- LAN_RemoveServer(args[1], VMA(2));
- return 0;
-
- case UI_LAN_GETPINGQUEUECOUNT:
- return LAN_GetPingQueueCount();
-
- case UI_LAN_CLEARPING:
- LAN_ClearPing( args[1] );
- return 0;
-
- case UI_LAN_GETPING:
- LAN_GetPing( args[1], VMA(2), args[3], VMA(4) );
- return 0;
-
- case UI_LAN_GETPINGINFO:
- LAN_GetPingInfo( args[1], VMA(2), args[3] );
- return 0;
-
- case UI_LAN_GETSERVERCOUNT:
- return LAN_GetServerCount(args[1]);
-
- case UI_LAN_GETSERVERADDRESSSTRING:
- LAN_GetServerAddressString( args[1], args[2], VMA(3), args[4] );
- return 0;
-
- case UI_LAN_GETSERVERINFO:
- LAN_GetServerInfo( args[1], args[2], VMA(3), args[4] );
- return 0;
-
- case UI_LAN_GETSERVERPING:
- return LAN_GetServerPing( args[1], args[2] );
-
- case UI_LAN_MARKSERVERVISIBLE:
- LAN_MarkServerVisible( args[1], args[2], args[3] );
- return 0;
-
- case UI_LAN_SERVERISVISIBLE:
- return LAN_ServerIsVisible( args[1], args[2] );
-
- case UI_LAN_UPDATEVISIBLEPINGS:
- return LAN_UpdateVisiblePings( args[1] );
-
- case UI_LAN_RESETPINGS:
- LAN_ResetPings( args[1] );
- return 0;
-
- case UI_LAN_SERVERSTATUS:
- return LAN_GetServerStatus( VMA(1), VMA(2), args[3] );
-
- case UI_LAN_COMPARESERVERS:
- return LAN_CompareServers( args[1], args[2], args[3], args[4], args[5] );
-
- case UI_MEMORY_REMAINING:
- return Hunk_MemoryRemaining();
-
- case UI_GET_CDKEY:
- CLUI_GetCDKey( VMA(1), args[2] );
- return 0;
-
- case UI_SET_CDKEY:
- CLUI_SetCDKey( VMA(1) );
- return 0;
-
- case UI_SET_PBCLSTATUS:
- return 0;
-
- case UI_R_REGISTERFONT:
- re.RegisterFont( VMA(1), args[2], VMA(3));
- return 0;
-
- case UI_MEMSET:
- Com_Memset( VMA(1), args[2], args[3] );
- return 0;
-
- case UI_MEMCPY:
- Com_Memcpy( VMA(1), VMA(2), args[3] );
- return 0;
-
- case UI_STRNCPY:
- return (int)strncpy( VMA(1), VMA(2), args[3] );
-
- case UI_SIN:
- return FloatAsInt( sin( VMF(1) ) );
-
- case UI_COS:
- return FloatAsInt( cos( VMF(1) ) );
-
- case UI_ATAN2:
- return FloatAsInt( atan2( VMF(1), VMF(2) ) );
-
- case UI_SQRT:
- return FloatAsInt( sqrt( VMF(1) ) );
-
- case UI_FLOOR:
- return FloatAsInt( floor( VMF(1) ) );
-
- case UI_CEIL:
- return FloatAsInt( ceil( VMF(1) ) );
-
- case UI_PC_ADD_GLOBAL_DEFINE:
- return botlib_export->PC_AddGlobalDefine( VMA(1) );
- case UI_PC_LOAD_SOURCE:
- return botlib_export->PC_LoadSourceHandle( VMA(1) );
- case UI_PC_FREE_SOURCE:
- return botlib_export->PC_FreeSourceHandle( args[1] );
- case UI_PC_READ_TOKEN:
- return botlib_export->PC_ReadTokenHandle( args[1], VMA(2) );
- case UI_PC_SOURCE_FILE_AND_LINE:
- return botlib_export->PC_SourceFileAndLine( args[1], VMA(2), VMA(3) );
-
- case UI_S_STOPBACKGROUNDTRACK:
- S_StopBackgroundTrack();
- return 0;
- case UI_S_STARTBACKGROUNDTRACK:
- S_StartBackgroundTrack( VMA(1), VMA(2));
- return 0;
-
- case UI_REAL_TIME:
- return Com_RealTime( VMA(1) );
-
- case UI_CIN_PLAYCINEMATIC:
- Com_DPrintf("UI_CIN_PlayCinematic\n");
- return CIN_PlayCinematic(VMA(1), args[2], args[3], args[4], args[5], args[6]);
-
- case UI_CIN_STOPCINEMATIC:
- return CIN_StopCinematic(args[1]);
-
- case UI_CIN_RUNCINEMATIC:
- return CIN_RunCinematic(args[1]);
-
- case UI_CIN_DRAWCINEMATIC:
- CIN_DrawCinematic(args[1]);
- return 0;
-
- case UI_CIN_SETEXTENTS:
- CIN_SetExtents(args[1], args[2], args[3], args[4], args[5]);
- return 0;
-
- case UI_R_REMAP_SHADER:
- re.RemapShader( VMA(1), VMA(2), VMA(3) );
- return 0;
-
- case UI_VERIFY_CDKEY:
- return CL_CDKeyValidate(VMA(1), VMA(2));
-
-
-
- default:
- Com_Error( ERR_DROP, "Bad UI system trap: %i", args[0] );
-
- }
-
- return 0;
-}
-
-/*
-====================
-CL_ShutdownUI
-====================
-*/
-void CL_ShutdownUI( void ) {
- cls.keyCatchers &= ~KEYCATCH_UI;
- cls.uiStarted = qfalse;
- if ( !uivm ) {
- return;
- }
- VM_Call( uivm, UI_SHUTDOWN );
- VM_Free( uivm );
- uivm = NULL;
-}
-
-/*
-====================
-CL_InitUI
-====================
-*/
-#define UI_OLD_API_VERSION 4
-
-void CL_InitUI( void ) {
- int v;
- vmInterpret_t interpret;
-
- // load the dll or bytecode
- if ( cl_connectedToPureServer != 0 ) {
- // if sv_pure is set we only allow qvms to be loaded
- interpret = VMI_COMPILED;
- }
- else {
- interpret = Cvar_VariableValue( "vm_ui" );
- }
- uivm = VM_Create( "ui", CL_UISystemCalls, interpret );
- if ( !uivm ) {
- Com_Error( ERR_FATAL, "VM_Create on UI failed" );
- }
-
- // sanity check
- v = VM_Call( uivm, UI_GETAPIVERSION );
- if (v == UI_OLD_API_VERSION) {
-// Com_Printf(S_COLOR_YELLOW "WARNING: loading old Quake III Arena User Interface version %d\n", v );
- // init for this gamestate
- VM_Call( uivm, UI_INIT, (cls.state >= CA_AUTHORIZING && cls.state < CA_ACTIVE));
- }
- else if (v != UI_API_VERSION) {
- Com_Error( ERR_DROP, "User Interface is version %d, expected %d", v, UI_API_VERSION );
- cls.uiStarted = qfalse;
- }
- else {
- // init for this gamestate
- VM_Call( uivm, UI_INIT, (cls.state >= CA_AUTHORIZING && cls.state < CA_ACTIVE) );
- }
-}
-
-qboolean UI_usesUniqueCDKey() {
- if (uivm) {
- return (VM_Call( uivm, UI_HASUNIQUECDKEY) == qtrue);
- } else {
- return qfalse;
- }
-}
-
-/*
-====================
-UI_GameCommand
-
-See if the current console command is claimed by the ui
-====================
-*/
-qboolean UI_GameCommand( void ) {
- if ( !uivm ) {
- return qfalse;
- }
-
- return VM_Call( uivm, UI_CONSOLE_COMMAND, cls.realtime );
-}
+/* +=========================================================================== +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 Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + +#include "client.h" + +#include "../game/botlib.h" + +extern botlib_export_t *botlib_export; + +vm_t *uivm; + +/* +==================== +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( ) { + 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( ) { + 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 = 0; + + 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 = 0; + 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)); + Info_SetValueForKey( info, "punkbuster", va("%i", server->punkbuster)); + 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( char *serverAddress, char *serverStatus, int maxLen ) { + return CL_ServerStatus( serverAddress, serverStatus, maxLen ); +} + +/* +==================== +CL_GetGlConfig +==================== +*/ +static void CL_GetGlconfig( glconfig_t *config ) { + *config = cls.glconfig; +} + +/* +==================== +GetClipboardData +==================== +*/ +static void 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; + } +} + +/* +==================== +Key_GetCatcher +==================== +*/ +int Key_GetCatcher( void ) { + return cls.keyCatchers; +} + +/* +==================== +Ket_SetCatcher +==================== +*/ +void Key_SetCatcher( int catcher ) { + cls.keyCatchers = catcher; +} + + +/* +==================== +CLUI_GetCDKey +==================== +*/ +static void CLUI_GetCDKey( char *buf, int buflen ) { + cvar_t *fs; + fs = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO ); + if (UI_usesUniqueCDKey() && fs && fs->string[0] != 0) { + Com_Memcpy( buf, &cl_cdkey[16], 16); + buf[16] = 0; + } else { + Com_Memcpy( buf, cl_cdkey, 16); + buf[16] = 0; + } +} + + +/* +==================== +CLUI_SetCDKey +==================== +*/ +static void CLUI_SetCDKey( char *buf ) { + cvar_t *fs; + fs = Cvar_Get ("fs_game", "", CVAR_INIT|CVAR_SYSTEMINFO ); + if (UI_usesUniqueCDKey() && fs && fs->string[0] != 0) { + Com_Memcpy( &cl_cdkey[16], buf, 16 ); + cl_cdkey[32] = 0; + // set the flag so the fle will be written at the next opportunity + cvar_modifiedFlags |= CVAR_ARCHIVE; + } else { + Com_Memcpy( cl_cdkey, buf, 16 ); + // set the flag so the fle will be written at the next opportunity + cvar_modifiedFlags |= CVAR_ARCHIVE; + } +} + +/* +==================== +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; +} + +void *VM_ArgPtr( int intValue ); +#define VMA(x) VM_ArgPtr(args[x]) +#define VMF(x) ((float *)args)[x] + +/* +==================== +CL_UISystemCalls + +The ui module is making a system call +==================== +*/ +int CL_UISystemCalls( int *args ) { + switch( args[0] ) { + case UI_ERROR: + Com_Error( ERR_DROP, "%s", VMA(1) ); + return 0; + + case UI_PRINT: + Com_Printf( "%s", VMA(1) ); + return 0; + + case UI_MILLISECONDS: + return Sys_Milliseconds(); + + case UI_CVAR_REGISTER: + Cvar_Register( VMA(1), VMA(2), VMA(3), args[4] ); + return 0; + + case UI_CVAR_UPDATE: + Cvar_Update( VMA(1) ); + return 0; + + case UI_CVAR_SET: + Cvar_Set( VMA(1), VMA(2) ); + return 0; + + case UI_CVAR_VARIABLEVALUE: + return FloatAsInt( Cvar_VariableValue( VMA(1) ) ); + + case UI_CVAR_VARIABLESTRINGBUFFER: + Cvar_VariableStringBuffer( VMA(1), VMA(2), args[3] ); + return 0; + + case UI_CVAR_SETVALUE: + Cvar_SetValue( VMA(1), VMF(2) ); + return 0; + + case UI_CVAR_RESET: + Cvar_Reset( VMA(1) ); + return 0; + + case UI_CVAR_CREATE: + Cvar_Get( VMA(1), VMA(2), args[3] ); + return 0; + + case UI_CVAR_INFOSTRINGBUFFER: + Cvar_InfoStringBuffer( args[1], VMA(2), args[3] ); + return 0; + + case UI_ARGC: + return Cmd_Argc(); + + case UI_ARGV: + Cmd_ArgvBuffer( args[1], VMA(2), args[3] ); + return 0; + + case UI_CMD_EXECUTETEXT: + Cbuf_ExecuteText( args[1], VMA(2) ); + return 0; + + case UI_FS_FOPENFILE: + return FS_FOpenFileByMode( VMA(1), VMA(2), args[3] ); + + case UI_FS_READ: + FS_Read2( VMA(1), args[2], args[3] ); + return 0; + + case UI_FS_WRITE: + FS_Write( VMA(1), args[2], args[3] ); + return 0; + + case UI_FS_FCLOSEFILE: + FS_FCloseFile( args[1] ); + return 0; + + case UI_FS_GETFILELIST: + return FS_GetFileList( VMA(1), VMA(2), VMA(3), args[4] ); + + case UI_FS_SEEK: + return FS_Seek( args[1], args[2], args[3] ); + + case UI_R_REGISTERMODEL: + return re.RegisterModel( VMA(1) ); + + case UI_R_REGISTERSKIN: + return re.RegisterSkin( VMA(1) ); + + case UI_R_REGISTERSHADERNOMIP: + return re.RegisterShaderNoMip( VMA(1) ); + + case UI_R_CLEARSCENE: + re.ClearScene(); + return 0; + + case UI_R_ADDREFENTITYTOSCENE: + re.AddRefEntityToScene( VMA(1) ); + return 0; + + case UI_R_ADDPOLYTOSCENE: + re.AddPolyToScene( args[1], args[2], VMA(3), 1 ); + return 0; + + case UI_R_ADDLIGHTTOSCENE: + re.AddLightToScene( VMA(1), VMF(2), VMF(3), VMF(4), VMF(5) ); + return 0; + + case UI_R_RENDERSCENE: + re.RenderScene( VMA(1) ); + return 0; + + case UI_R_SETCOLOR: + re.SetColor( VMA(1) ); + return 0; + + case UI_R_DRAWSTRETCHPIC: + re.DrawStretchPic( VMF(1), VMF(2), VMF(3), VMF(4), VMF(5), VMF(6), VMF(7), VMF(8), args[9] ); + return 0; + + case UI_R_MODELBOUNDS: + re.ModelBounds( args[1], VMA(2), VMA(3) ); + return 0; + + case UI_UPDATESCREEN: + SCR_UpdateScreen(); + return 0; + + case UI_CM_LERPTAG: + re.LerpTag( VMA(1), args[2], args[3], args[4], VMF(5), VMA(6) ); + return 0; + + case UI_S_REGISTERSOUND: + return S_RegisterSound( VMA(1), args[2] ); + + case UI_S_STARTLOCALSOUND: + S_StartLocalSound( args[1], args[2] ); + return 0; + + case UI_KEY_KEYNUMTOSTRINGBUF: + Key_KeynumToStringBuf( args[1], VMA(2), args[3] ); + return 0; + + case UI_KEY_GETBINDINGBUF: + Key_GetBindingBuf( args[1], VMA(2), args[3] ); + return 0; + + case UI_KEY_SETBINDING: + Key_SetBinding( args[1], VMA(2) ); + return 0; + + case UI_KEY_ISDOWN: + return Key_IsDown( args[1] ); + + case UI_KEY_GETOVERSTRIKEMODE: + return Key_GetOverstrikeMode(); + + case UI_KEY_SETOVERSTRIKEMODE: + Key_SetOverstrikeMode( args[1] ); + return 0; + + case UI_KEY_CLEARSTATES: + Key_ClearStates(); + return 0; + + case UI_KEY_GETCATCHER: + return Key_GetCatcher(); + + case UI_KEY_SETCATCHER: + Key_SetCatcher( args[1] ); + return 0; + + case UI_GETCLIPBOARDDATA: + GetClipboardData( VMA(1), args[2] ); + return 0; + + case UI_GETCLIENTSTATE: + GetClientState( VMA(1) ); + return 0; + + case UI_GETGLCONFIG: + CL_GetGlconfig( VMA(1) ); + return 0; + + case UI_GETCONFIGSTRING: + return GetConfigString( args[1], VMA(2), args[3] ); + + case UI_LAN_LOADCACHEDSERVERS: + LAN_LoadCachedServers(); + return 0; + + case UI_LAN_SAVECACHEDSERVERS: + LAN_SaveServersToCache(); + return 0; + + case UI_LAN_ADDSERVER: + return LAN_AddServer(args[1], VMA(2), VMA(3)); + + case UI_LAN_REMOVESERVER: + LAN_RemoveServer(args[1], VMA(2)); + return 0; + + case UI_LAN_GETPINGQUEUECOUNT: + return LAN_GetPingQueueCount(); + + case UI_LAN_CLEARPING: + LAN_ClearPing( args[1] ); + return 0; + + case UI_LAN_GETPING: + LAN_GetPing( args[1], VMA(2), args[3], VMA(4) ); + return 0; + + case UI_LAN_GETPINGINFO: + LAN_GetPingInfo( args[1], VMA(2), args[3] ); + return 0; + + case UI_LAN_GETSERVERCOUNT: + return LAN_GetServerCount(args[1]); + + case UI_LAN_GETSERVERADDRESSSTRING: + LAN_GetServerAddressString( args[1], args[2], VMA(3), args[4] ); + return 0; + + case UI_LAN_GETSERVERINFO: + LAN_GetServerInfo( args[1], args[2], VMA(3), args[4] ); + return 0; + + case UI_LAN_GETSERVERPING: + return LAN_GetServerPing( args[1], args[2] ); + + case UI_LAN_MARKSERVERVISIBLE: + LAN_MarkServerVisible( args[1], args[2], args[3] ); + return 0; + + case UI_LAN_SERVERISVISIBLE: + return LAN_ServerIsVisible( args[1], args[2] ); + + case UI_LAN_UPDATEVISIBLEPINGS: + return LAN_UpdateVisiblePings( args[1] ); + + case UI_LAN_RESETPINGS: + LAN_ResetPings( args[1] ); + return 0; + + case UI_LAN_SERVERSTATUS: + return LAN_GetServerStatus( VMA(1), VMA(2), args[3] ); + + case UI_LAN_COMPARESERVERS: + return LAN_CompareServers( args[1], args[2], args[3], args[4], args[5] ); + + case UI_MEMORY_REMAINING: + return Hunk_MemoryRemaining(); + + case UI_GET_CDKEY: + CLUI_GetCDKey( VMA(1), args[2] ); + return 0; + + case UI_SET_CDKEY: + CLUI_SetCDKey( VMA(1) ); + return 0; + + case UI_SET_PBCLSTATUS: + return 0; + + case UI_R_REGISTERFONT: + re.RegisterFont( VMA(1), args[2], VMA(3)); + return 0; + + case UI_MEMSET: + Com_Memset( VMA(1), args[2], args[3] ); + return 0; + + case UI_MEMCPY: + Com_Memcpy( VMA(1), VMA(2), args[3] ); + return 0; + + case UI_STRNCPY: + return (int)strncpy( VMA(1), VMA(2), args[3] ); + + case UI_SIN: + return FloatAsInt( sin( VMF(1) ) ); + + case UI_COS: + return FloatAsInt( cos( VMF(1) ) ); + + case UI_ATAN2: + return FloatAsInt( atan2( VMF(1), VMF(2) ) ); + + case UI_SQRT: + return FloatAsInt( sqrt( VMF(1) ) ); + + case UI_FLOOR: + return FloatAsInt( floor( VMF(1) ) ); + + case UI_CEIL: + return FloatAsInt( ceil( VMF(1) ) ); + + case UI_PC_ADD_GLOBAL_DEFINE: + return botlib_export->PC_AddGlobalDefine( VMA(1) ); + case UI_PC_LOAD_SOURCE: + return botlib_export->PC_LoadSourceHandle( VMA(1) ); + case UI_PC_FREE_SOURCE: + return botlib_export->PC_FreeSourceHandle( args[1] ); + case UI_PC_READ_TOKEN: + return botlib_export->PC_ReadTokenHandle( args[1], VMA(2) ); + case UI_PC_SOURCE_FILE_AND_LINE: + return botlib_export->PC_SourceFileAndLine( args[1], VMA(2), VMA(3) ); + + case UI_S_STOPBACKGROUNDTRACK: + S_StopBackgroundTrack(); + return 0; + case UI_S_STARTBACKGROUNDTRACK: + S_StartBackgroundTrack( VMA(1), VMA(2)); + return 0; + + case UI_REAL_TIME: + return Com_RealTime( VMA(1) ); + + case UI_CIN_PLAYCINEMATIC: + Com_DPrintf("UI_CIN_PlayCinematic\n"); + return CIN_PlayCinematic(VMA(1), args[2], args[3], args[4], args[5], args[6]); + + case UI_CIN_STOPCINEMATIC: + return CIN_StopCinematic(args[1]); + + case UI_CIN_RUNCINEMATIC: + return CIN_RunCinematic(args[1]); + + case UI_CIN_DRAWCINEMATIC: + CIN_DrawCinematic(args[1]); + return 0; + + case UI_CIN_SETEXTENTS: + CIN_SetExtents(args[1], args[2], args[3], args[4], args[5]); + return 0; + + case UI_R_REMAP_SHADER: + re.RemapShader( VMA(1), VMA(2), VMA(3) ); + return 0; + + case UI_VERIFY_CDKEY: + return CL_CDKeyValidate(VMA(1), VMA(2)); + + + + default: + Com_Error( ERR_DROP, "Bad UI system trap: %i", args[0] ); + + } + + return 0; +} + +/* +==================== +CL_ShutdownUI +==================== +*/ +void CL_ShutdownUI( void ) { + cls.keyCatchers &= ~KEYCATCH_UI; + cls.uiStarted = qfalse; + if ( !uivm ) { + return; + } + VM_Call( uivm, UI_SHUTDOWN ); + VM_Free( uivm ); + uivm = NULL; +} + +/* +==================== +CL_InitUI +==================== +*/ +#define UI_OLD_API_VERSION 4 + +void CL_InitUI( void ) { + int v; + vmInterpret_t interpret; + + // load the dll or bytecode + if ( cl_connectedToPureServer != 0 ) { + // if sv_pure is set we only allow qvms to be loaded + interpret = VMI_COMPILED; + } + else { + interpret = Cvar_VariableValue( "vm_ui" ); + } + uivm = VM_Create( "ui", CL_UISystemCalls, interpret ); + if ( !uivm ) { + Com_Error( ERR_FATAL, "VM_Create on UI failed" ); + } + + // sanity check + v = VM_Call( uivm, UI_GETAPIVERSION ); + if (v == UI_OLD_API_VERSION) { +// Com_Printf(S_COLOR_YELLOW "WARNING: loading old Quake III Arena User Interface version %d\n", v ); + // init for this gamestate + VM_Call( uivm, UI_INIT, (cls.state >= CA_AUTHORIZING && cls.state < CA_ACTIVE)); + } + else if (v != UI_API_VERSION) { + Com_Error( ERR_DROP, "User Interface is version %d, expected %d", v, UI_API_VERSION ); + cls.uiStarted = qfalse; + } + else { + // init for this gamestate + VM_Call( uivm, UI_INIT, (cls.state >= CA_AUTHORIZING && cls.state < CA_ACTIVE) ); + } +} + +qboolean UI_usesUniqueCDKey() { + if (uivm) { + return (VM_Call( uivm, UI_HASUNIQUECDKEY) == qtrue); + } else { + return qfalse; + } +} + +/* +==================== +UI_GameCommand + +See if the current console command is claimed by the ui +==================== +*/ +qboolean UI_GameCommand( void ) { + if ( !uivm ) { + return qfalse; + } + + return VM_Call( uivm, UI_CONSOLE_COMMAND, cls.realtime ); +} |