From 1666190c51bab66a3b4fc81d090b299b5fa275dc Mon Sep 17 00:00:00 2001 From: g-cont Date: Fri, 10 Feb 2012 00:00:00 +0400 Subject: [PATCH] 10 Feb 2012 --- change.log | 20 +++ engine/client/cl_game.c | 4 +- engine/client/cl_parse.c | 45 ++++++ engine/common/con_utils.c | 21 +-- engine/common/net_chan.c | 2 + engine/common/netchan.h | 4 +- engine/common/network.c | 75 +++++++++- engine/common/protocol.h | 5 + engine/engine.plg | 282 ------------------------------------- engine/server/sv_client.c | 41 ++++++ engine/server/sv_game.c | 39 +++++ mainui/menu_creategame.cpp | 2 +- 12 files changed, 242 insertions(+), 298 deletions(-) delete mode 100644 engine/engine.plg diff --git a/change.log b/change.log index fbdb5a86..b8c4f6e5 100644 --- a/change.log +++ b/change.log @@ -3,6 +3,26 @@ build ???? Physic: add check for liquid brushes that has only hull0 Render: draw decals without culling on the transparent surfaces Engine: fix decal transition bug on global entities +Client: fix "r_drawentities 5" debug code in client.dll +Render: rewrited detail texture code for using detail scale for each diffuse texture instead of each detail texture +Render: custom render interface is changed to version 26 +Engine: added custom studio decals serializtaion +Server: fixed check for russian letters in the commands "say" and "say_team" +Server: physics interface is changed to version 6 +Client: allow console in multiplayer even while dev-mode is disabled +Engine: added new message SVC_STUDIODECAL that passed through engine and call function in extended rendered interface +Engine: hook PrintScreen and manually writing screenshot into clipboard +Render: fix decals drawing when rendermode is TransColor +Render: add support for cubemaps, 1D and 3D textures +Render: added some new internal textures that using by Xash-Mod 0.5 +Render: fix reflection for Glow-Sprites and follow beams +Studio: fix poly-counter for studio models +Engine: add support for userconfig +Engine: allow letter '¸' in console and chat-mode +Engine: fix REG_USER_MSG for messages that registering in-game +Server: clear savedir when new game is started +GameUI: loading maps.lst from basedir while mod doesn't contain multiplayer maps +Network: implemented QueryCvarValue and QueryCvarValue2 build 1770 diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index 847c4311..201a856b 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -2949,11 +2949,11 @@ void NetAPI_Status( net_status_t *status ) ASSERT( status != NULL ); status->connected = NET_IsLocalAddress( cls.netchan.remote_address ) ? false : true; - status->local_address = cls.netchan.remote_address; // FIXME: get local address + status->connection_time = host.realtime - cls.netchan.connect_time; status->remote_address = cls.netchan.remote_address; status->packet_loss = cls.packet_loss / 100; // percent status->latency = cl.frame.latency; - status->connection_time = cl.time; // FIXME: replace with cl.time - netchan.first_received + status->local_address = net_local; status->rate = cls.netchan.rate; } diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 509a6936..7a6d5b0a 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -1130,6 +1130,45 @@ void CL_ParseScreenFade( sizebuf_t *msg ) } } +/* +============== +CL_ParseCvarValue + +Find the client cvar value +and sent it back to the server +============== +*/ +void CL_ParseCvarValue( sizebuf_t *msg ) +{ + const char *cvarName = BF_ReadString( msg ); + convar_t *cvar = Cvar_FindVar( cvarName ); + + // build the answer + BF_WriteByte( &cls.netchan.message, clc_requestcvarvalue ); + BF_WriteString( &cls.netchan.message, cvar ? cvar->string : "Not Found" ); +} + +/* +============== +CL_ParseCvarValue2 + +Find the client cvar value +and sent it back to the server +============== +*/ +void CL_ParseCvarValue2( sizebuf_t *msg ) +{ + int requestID = BF_ReadLong( msg ); + const char *cvarName = BF_ReadString( msg ); + convar_t *cvar = Cvar_FindVar( cvarName ); + + // build the answer + BF_WriteByte( &cls.netchan.message, clc_requestcvarvalue2 ); + BF_WriteLong( &cls.netchan.message, requestID ); + BF_WriteString( &cls.netchan.message, cvarName ); + BF_WriteString( &cls.netchan.message, cvar ? cvar->string : "Not Found" ); +} + /* ============== CL_DispatchUserMessage @@ -1460,6 +1499,12 @@ void CL_ParseServerMessage( sizebuf_t *msg ) case svc_studiodecal: CL_ParseStudioDecal( msg ); break; + case svc_querycvarvalue: + CL_ParseCvarValue( msg ); + break; + case svc_querycvarvalue2: + CL_ParseCvarValue2( msg ); + break; default: CL_ParseUserMessage( msg, cmd ); break; diff --git a/engine/common/con_utils.c b/engine/common/con_utils.c index 03978bce..ffbe3d69 100644 --- a/engine/common/con_utils.c +++ b/engine/common/con_utils.c @@ -648,10 +648,17 @@ qboolean Cmd_CheckMapsList_R( qboolean fRefresh, qboolean onlyingamedir ) file_t *f; if( FS_FileSize( "maps.lst", onlyingamedir ) > 0 && !fRefresh ) + { + Msg( "maps.lst is exist: %s\n", onlyingamedir ? "basedir" : "gamedir" ); return true; // exist + } t = FS_Search( "maps/*.bsp", false, onlyingamedir ); - if( !t ) return false; + if( !t && onlyingamedir ) + { + // mod doesn't contain any maps (probably this is a bot) + return Cmd_CheckMapsList_R( fRefresh, false ); + } buffer = Mem_Alloc( host.mempool, t->numfilenames * 2 * sizeof( result )); for( i = 0; i < t->numfilenames; i++ ) @@ -744,19 +751,17 @@ qboolean Cmd_CheckMapsList_R( qboolean fRefresh, qboolean onlyingamedir ) } } } - if( t ) Mem_Free( t ); // free search result + if( t ) Mem_Free( t ); // free search result size = Q_strlen( buffer ); - if( !size && onlyingamedir ) - { - if( buffer ) Mem_Free( buffer ); - return Cmd_CheckMapsList_R( fRefresh, false ); - } if( !size ) { if( buffer ) Mem_Free( buffer ); - return false; + + if( onlyingamedir ) + return Cmd_CheckMapsList_R( fRefresh, false ); + return false; } // write generated maps.lst diff --git a/engine/common/net_chan.c b/engine/common/net_chan.c index d44fb428..0b16de35 100644 --- a/engine/common/net_chan.c +++ b/engine/common/net_chan.c @@ -94,6 +94,7 @@ convar_t *net_qport; int net_drop; netadr_t net_from; +netadr_t net_local; sizebuf_t net_message; byte *net_mempool; byte net_message_buffer[NET_MAX_PAYLOAD]; @@ -158,6 +159,7 @@ void Netchan_Setup( netsrc_t sock, netchan_t *chan, netadr_t adr, int qport ) chan->sock = sock; chan->remote_address = adr; chan->last_received = host.realtime; + chan->connect_time = host.realtime; chan->incoming_sequence = 0; chan->outgoing_sequence = 1; chan->rate = DEFAULT_RATE; diff --git a/engine/common/netchan.h b/engine/common/netchan.h index 75439a0f..f2b588a8 100644 --- a/engine/common/netchan.h +++ b/engine/common/netchan.h @@ -137,7 +137,8 @@ typedef struct netchan_s double last_sent; // for retransmits double rate; // bandwidth choke. bytes per second - long cleartime; // if realtime > cleartime, free to send next packet + double cleartime; // if realtime > cleartime, free to send next packet + double connect_time; // Usage: host.realtime - netchan.connect_time int drop_count; // dropped packets, cleared each level int good_count; // cleared each level @@ -191,6 +192,7 @@ typedef struct netchan_s } netchan_t; extern netadr_t net_from; +extern netadr_t net_local; extern sizebuf_t net_message; extern byte net_message_buffer[NET_MAX_PAYLOAD]; extern convar_t *net_speeds; diff --git a/engine/common/network.c b/engine/common/network.c index b770e7d7..cb553359 100644 --- a/engine/common/network.c +++ b/engine/common/network.c @@ -40,6 +40,7 @@ static int (_stdcall *pRecvFrom)( SOCKET s, char* buf, int len, int flags, struc static int (_stdcall *pSendTo)( SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen ); static int (_stdcall *pSelect)( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout ); static int (_stdcall *pConnect)( SOCKET s, const struct sockaddr *name, int namelen ); +static int (_stdcall *pGetSockName)( SOCKET s, struct sockaddr *name, int *namelen ); static int (_stdcall *pSend)( SOCKET s, const char *buf, int len, int flags ); static int (_stdcall *pRecv)( SOCKET s, char *buf, int len, int flags ); static int (_stdcall *pGetHostName)( char *name, int namelen ); @@ -66,6 +67,7 @@ static dllfunc_t winsock_funcs[] = { "ioctlsocket", (void **) &pIoctlSocket }, { "closesocket", (void **) &pCloseSocket }, { "gethostname", (void **) &pGetHostName }, +{ "getsockname", (void **) &pGetSockName }, { "gethostbyname", (void **) &pGetHostByName }, { "WSAGetLastError", (void **) &pWSAGetLastError }, { NULL, NULL } @@ -92,6 +94,8 @@ static int ipx_sockets[2]; static WSADATA winsockdata; static qboolean winsockInitialized = false; static const char *net_src[2] = { "client", "server" }; +static qboolean noip = false; +static qboolean noipx = false; static convar_t *net_ip; static convar_t *net_hostport; static convar_t *net_clientport; @@ -758,6 +762,57 @@ void NET_OpenIPX( void ) } } +/* +================ +NET_GetLocalAddress + +Returns the servers' ip address as a string. +================ +*/ +void NET_GetLocalAddress( void ) +{ + char buff[512]; + struct sockaddr_in address; + int namelen; + int net_error = 0; + + Q_memset( &net_local, 0, sizeof( netadr_t )); + + if( noip ) + { + MsgDev( D_INFO, "TCP/IP Disabled.\n" ); + } + else + { + // If we have changed the ip var from the command line, use that instead. + if( Q_strcmp( net_ip->string, "localhost" )) + { + Q_strcpy( buff, net_ip->string ); + } + else + { + pGetHostName( buff, 512 ); + } + + // ensure that it doesn't overrun the buffer + buff[512-1] = 0; + + NET_StringToAdr( buff, &net_local ); + namelen = sizeof( address ); + + if( pGetSockName( ip_sockets[NS_SERVER], (struct sockaddr *)&address, &namelen ) != 0 ) + { + MsgDev( D_ERROR, "Could not get TCP/IP address, TCP/IP disabled\nReason: %s\n", NET_ErrorString( )); + noip = true; + } + else + { + net_local.port = address.sin_port; + Msg( "Server IP address %s\n", NET_AdrToString( net_local )); + } + } +} + /* ==================== NET_Config @@ -767,8 +822,8 @@ A single player game will only use the loopback code */ void NET_Config( qboolean multiplayer ) { - int i; - static qboolean old_config; + static qboolean old_config; + static qboolean bFirst = true; if( old_config == multiplayer ) return; @@ -777,6 +832,8 @@ void NET_Config( qboolean multiplayer ) if( !multiplayer ) { + int i; + // shut down any existing sockets for( i = 0; i < 2; i++ ) { @@ -796,8 +853,15 @@ void NET_Config( qboolean multiplayer ) else { // open sockets - if( !Sys_CheckParm( "-noip" )) NET_OpenIP(); - if( !Sys_CheckParm( "-noipx" )) NET_OpenIPX(); + if( !noip ) NET_OpenIP(); + if( !noipx ) NET_OpenIPX(); + + // Get our local address, if possible + if( bFirst ) + { + bFirst = false; + NET_GetLocalAddress(); + } } NET_ClearLoopback (); @@ -886,6 +950,9 @@ void NET_Init( void ) Cmd_AddCommand( "net_showip", NET_ShowIP_f, "show hostname and ip's" ); Cmd_AddCommand( "net_restart", NET_Restart_f, "restart the network subsystem" ); + if( Sys_CheckParm( "-noip" )) noip = true; + if( Sys_CheckParm( "-noipx" )) noipx = true; + winsockInitialized = true; MsgDev( D_NOTE, "NET_Init()\n" ); } diff --git a/engine/common/protocol.h b/engine/common/protocol.h index fdf3c5d2..34d56b9b 100644 --- a/engine/common/protocol.h +++ b/engine/common/protocol.h @@ -70,6 +70,9 @@ GNU General Public License for more details. #define svc_director 51 // #define svc_studiodecal 52 // [float*3][float*3][short][short][byte] + +#define svc_querycvarvalue 57 // [string] +#define svc_querycvarvalue2 58 // [string][long] (context) #define svc_lastmsg 64 // start user messages at this point // client to server @@ -82,6 +85,8 @@ GNU General Public License for more details. #define clc_userinfo 6 // [[userinfo string] #define clc_fileconsistency 7 #define clc_voicedata 8 +#define clc_requestcvarvalue 9 +#define clc_requestcvarvalue2 10 #define MAX_VISIBLE_PACKET 512 // 512 visible entities per frame (hl1 has 256) diff --git a/engine/engine.plg b/engine/engine.plg deleted file mode 100644 index ca33a011..00000000 --- a/engine/engine.plg +++ /dev/null @@ -1,282 +0,0 @@ - - -
-

Build Log

-

---------------------Configuration: engine - Win32 Release-------------------- -

-

Command Lines

-Creating temporary file "C:\DOCUME~1\ÌÈØÀ\LOCALS~1\Temp\RSP77CA.tmp" with contents -[ -/nologo /MD /W3 /GX /O2 /I "./" /I "common" /I "common/imagelib" /I "common/soundlib" /I "server" /I "client" /I "client/vgui" /I "../common" /I "../game_shared" /I "../pm_shared" /I "../utils/vgui/include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Fo"..\temp\engine\!release/" /Fd"..\temp\engine\!release/" /FD /c -"D:\Xash3D\src_main\engine\common\avikit.c" -"D:\Xash3D\src_main\engine\common\build.c" -"D:\Xash3D\src_main\engine\client\cl_cmds.c" -"D:\Xash3D\src_main\engine\client\cl_demo.c" -"D:\Xash3D\src_main\engine\client\cl_events.c" -"D:\Xash3D\src_main\engine\client\cl_frame.c" -"D:\Xash3D\src_main\engine\client\cl_game.c" -"D:\Xash3D\src_main\engine\client\cl_main.c" -"D:\Xash3D\src_main\engine\client\cl_menu.c" -"D:\Xash3D\src_main\engine\client\cl_parse.c" -"D:\Xash3D\src_main\engine\client\cl_pmove.c" -"D:\Xash3D\src_main\engine\client\cl_remap.c" -"D:\Xash3D\src_main\engine\client\cl_scrn.c" -"D:\Xash3D\src_main\engine\client\cl_tent.c" -"D:\Xash3D\src_main\engine\client\cl_video.c" -"D:\Xash3D\src_main\engine\client\cl_view.c" -"D:\Xash3D\src_main\engine\common\cmd.c" -"D:\Xash3D\src_main\engine\common\common.c" -"D:\Xash3D\src_main\engine\common\con_utils.c" -"D:\Xash3D\src_main\engine\common\console.c" -"D:\Xash3D\src_main\engine\common\crclib.c" -"D:\Xash3D\src_main\engine\common\crtlib.c" -"D:\Xash3D\src_main\engine\common\cvar.c" -"D:\Xash3D\src_main\engine\common\filesystem.c" -"D:\Xash3D\src_main\engine\common\gamma.c" -"D:\Xash3D\src_main\engine\client\gl_backend.c" -"D:\Xash3D\src_main\engine\client\gl_beams.c" -"D:\Xash3D\src_main\engine\client\gl_cull.c" -"D:\Xash3D\src_main\engine\client\gl_decals.c" -"D:\Xash3D\src_main\engine\client\gl_draw.c" -"D:\Xash3D\src_main\engine\client\gl_image.c" -"D:\Xash3D\src_main\engine\client\gl_mirror.c" -"D:\Xash3D\src_main\engine\client\gl_refrag.c" -"D:\Xash3D\src_main\engine\client\gl_rlight.c" -"D:\Xash3D\src_main\engine\client\gl_rmain.c" -"D:\Xash3D\src_main\engine\client\gl_rmath.c" -"D:\Xash3D\src_main\engine\client\gl_rmisc.c" -"D:\Xash3D\src_main\engine\client\gl_rpart.c" -"D:\Xash3D\src_main\engine\client\gl_rsurf.c" -"D:\Xash3D\src_main\engine\client\gl_sprite.c" -"D:\Xash3D\src_main\engine\client\gl_studio.c" -"D:\Xash3D\src_main\engine\client\gl_vidnt.c" -"D:\Xash3D\src_main\engine\client\gl_warp.c" -"D:\Xash3D\src_main\engine\common\host.c" -"D:\Xash3D\src_main\engine\common\hpak.c" -"D:\Xash3D\src_main\engine\common\imagelib\img_bmp.c" -"D:\Xash3D\src_main\engine\common\imagelib\img_jpg.c" -"D:\Xash3D\src_main\engine\common\imagelib\img_main.c" -"D:\Xash3D\src_main\engine\common\imagelib\img_quant.c" -"D:\Xash3D\src_main\engine\common\imagelib\img_tga.c" -"D:\Xash3D\src_main\engine\common\imagelib\img_utils.c" -"D:\Xash3D\src_main\engine\common\imagelib\img_wad.c" -"D:\Xash3D\src_main\engine\common\infostring.c" -"D:\Xash3D\src_main\engine\common\input.c" -"D:\Xash3D\src_main\engine\common\keys.c" -"D:\Xash3D\src_main\engine\common\library.c" -"D:\Xash3D\src_main\engine\common\mathlib.c" -"D:\Xash3D\src_main\engine\common\matrixlib.c" -"D:\Xash3D\src_main\engine\common\model.c" -"D:\Xash3D\src_main\engine\common\net_buffer.c" -"D:\Xash3D\src_main\engine\common\net_chan.c" -"D:\Xash3D\src_main\engine\common\net_encode.c" -"D:\Xash3D\src_main\engine\common\net_huff.c" -"D:\Xash3D\src_main\engine\common\network.c" -"D:\Xash3D\src_main\engine\common\pm_studio.c" -"D:\Xash3D\src_main\engine\common\pm_surface.c" -"D:\Xash3D\src_main\engine\common\pm_trace.c" -"D:\Xash3D\src_main\engine\common\random.c" -"D:\Xash3D\src_main\engine\client\s_backend.c" -"D:\Xash3D\src_main\engine\client\s_dsp.c" -"D:\Xash3D\src_main\engine\client\s_load.c" -"D:\Xash3D\src_main\engine\client\s_main.c" -"D:\Xash3D\src_main\engine\client\s_mix.c" -"D:\Xash3D\src_main\engine\client\s_mouth.c" -"D:\Xash3D\src_main\engine\client\s_stream.c" -"D:\Xash3D\src_main\engine\client\s_utils.c" -"D:\Xash3D\src_main\engine\client\s_vox.c" -"D:\Xash3D\src_main\engine\common\soundlib\snd_main.c" -"D:\Xash3D\src_main\engine\common\soundlib\snd_mp3.c" -"D:\Xash3D\src_main\engine\common\soundlib\snd_utils.c" -"D:\Xash3D\src_main\engine\common\soundlib\snd_wav.c" -"D:\Xash3D\src_main\engine\server\sv_client.c" -"D:\Xash3D\src_main\engine\server\sv_cmds.c" -"D:\Xash3D\src_main\engine\server\sv_custom.c" -"D:\Xash3D\src_main\engine\server\sv_frame.c" -"D:\Xash3D\src_main\engine\server\sv_game.c" -"D:\Xash3D\src_main\engine\server\sv_init.c" -"D:\Xash3D\src_main\engine\server\sv_main.c" -"D:\Xash3D\src_main\engine\server\sv_move.c" -"D:\Xash3D\src_main\engine\server\sv_phys.c" -"D:\Xash3D\src_main\engine\server\sv_pmove.c" -"D:\Xash3D\src_main\engine\server\sv_save.c" -"D:\Xash3D\src_main\engine\server\sv_studio.c" -"D:\Xash3D\src_main\engine\server\sv_world.c" -"D:\Xash3D\src_main\engine\common\sys_con.c" -"D:\Xash3D\src_main\engine\common\sys_win.c" -"D:\Xash3D\src_main\engine\common\titles.c" -"D:\Xash3D\src_main\engine\client\vgui\vgui_clip.cpp" -"D:\Xash3D\src_main\engine\client\vgui\vgui_draw.c" -"D:\Xash3D\src_main\engine\client\vgui\vgui_font.cpp" -"D:\Xash3D\src_main\engine\client\vgui\vgui_input.cpp" -"D:\Xash3D\src_main\engine\client\vgui\vgui_int.cpp" -"D:\Xash3D\src_main\engine\client\vgui\vgui_surf.cpp" -"D:\Xash3D\src_main\engine\common\world.c" -"D:\Xash3D\src_main\engine\common\zone.c" -] -Creating command line "cl.exe @"C:\DOCUME~1\ÌÈØÀ\LOCALS~1\Temp\RSP77CA.tmp"" -Creating temporary file "C:\DOCUME~1\ÌÈØÀ\LOCALS~1\Temp\RSP77CB.tmp" with contents -[ -msvcrt.lib user32.lib gdi32.lib shell32.lib advapi32.lib winmm.lib mpeg.lib ../utils/vgui/lib/win32_vc6/vgui.lib /nologo /subsystem:windows /dll /pdb:none /machine:I386 /nodefaultlib:"libc.lib" /out:"..\temp\engine\!release/xash.dll" /implib:"..\temp\engine\!release/xash.lib" /libpath:"./common/soundlib" /opt:nowin98 -"\Xash3D\src_main\temp\engine\!release\avikit.obj" -"\Xash3D\src_main\temp\engine\!release\build.obj" -"\Xash3D\src_main\temp\engine\!release\cl_cmds.obj" -"\Xash3D\src_main\temp\engine\!release\cl_demo.obj" -"\Xash3D\src_main\temp\engine\!release\cl_events.obj" -"\Xash3D\src_main\temp\engine\!release\cl_frame.obj" -"\Xash3D\src_main\temp\engine\!release\cl_game.obj" -"\Xash3D\src_main\temp\engine\!release\cl_main.obj" -"\Xash3D\src_main\temp\engine\!release\cl_menu.obj" -"\Xash3D\src_main\temp\engine\!release\cl_parse.obj" -"\Xash3D\src_main\temp\engine\!release\cl_pmove.obj" -"\Xash3D\src_main\temp\engine\!release\cl_remap.obj" -"\Xash3D\src_main\temp\engine\!release\cl_scrn.obj" -"\Xash3D\src_main\temp\engine\!release\cl_tent.obj" -"\Xash3D\src_main\temp\engine\!release\cl_video.obj" -"\Xash3D\src_main\temp\engine\!release\cl_view.obj" -"\Xash3D\src_main\temp\engine\!release\cmd.obj" -"\Xash3D\src_main\temp\engine\!release\common.obj" -"\Xash3D\src_main\temp\engine\!release\con_utils.obj" -"\Xash3D\src_main\temp\engine\!release\console.obj" -"\Xash3D\src_main\temp\engine\!release\crclib.obj" -"\Xash3D\src_main\temp\engine\!release\crtlib.obj" -"\Xash3D\src_main\temp\engine\!release\cvar.obj" -"\Xash3D\src_main\temp\engine\!release\filesystem.obj" -"\Xash3D\src_main\temp\engine\!release\gamma.obj" -"\Xash3D\src_main\temp\engine\!release\gl_backend.obj" -"\Xash3D\src_main\temp\engine\!release\gl_beams.obj" -"\Xash3D\src_main\temp\engine\!release\gl_cull.obj" -"\Xash3D\src_main\temp\engine\!release\gl_decals.obj" -"\Xash3D\src_main\temp\engine\!release\gl_draw.obj" -"\Xash3D\src_main\temp\engine\!release\gl_image.obj" -"\Xash3D\src_main\temp\engine\!release\gl_mirror.obj" -"\Xash3D\src_main\temp\engine\!release\gl_refrag.obj" -"\Xash3D\src_main\temp\engine\!release\gl_rlight.obj" -"\Xash3D\src_main\temp\engine\!release\gl_rmain.obj" -"\Xash3D\src_main\temp\engine\!release\gl_rmath.obj" -"\Xash3D\src_main\temp\engine\!release\gl_rmisc.obj" -"\Xash3D\src_main\temp\engine\!release\gl_rpart.obj" -"\Xash3D\src_main\temp\engine\!release\gl_rsurf.obj" -"\Xash3D\src_main\temp\engine\!release\gl_sprite.obj" -"\Xash3D\src_main\temp\engine\!release\gl_studio.obj" -"\Xash3D\src_main\temp\engine\!release\gl_vidnt.obj" -"\Xash3D\src_main\temp\engine\!release\gl_warp.obj" -"\Xash3D\src_main\temp\engine\!release\host.obj" -"\Xash3D\src_main\temp\engine\!release\hpak.obj" -"\Xash3D\src_main\temp\engine\!release\img_bmp.obj" -"\Xash3D\src_main\temp\engine\!release\img_jpg.obj" -"\Xash3D\src_main\temp\engine\!release\img_main.obj" -"\Xash3D\src_main\temp\engine\!release\img_quant.obj" -"\Xash3D\src_main\temp\engine\!release\img_tga.obj" -"\Xash3D\src_main\temp\engine\!release\img_utils.obj" -"\Xash3D\src_main\temp\engine\!release\img_wad.obj" -"\Xash3D\src_main\temp\engine\!release\infostring.obj" -"\Xash3D\src_main\temp\engine\!release\input.obj" -"\Xash3D\src_main\temp\engine\!release\keys.obj" -"\Xash3D\src_main\temp\engine\!release\library.obj" -"\Xash3D\src_main\temp\engine\!release\mathlib.obj" -"\Xash3D\src_main\temp\engine\!release\matrixlib.obj" -"\Xash3D\src_main\temp\engine\!release\model.obj" -"\Xash3D\src_main\temp\engine\!release\net_buffer.obj" -"\Xash3D\src_main\temp\engine\!release\net_chan.obj" -"\Xash3D\src_main\temp\engine\!release\net_encode.obj" -"\Xash3D\src_main\temp\engine\!release\net_huff.obj" -"\Xash3D\src_main\temp\engine\!release\network.obj" -"\Xash3D\src_main\temp\engine\!release\pm_studio.obj" -"\Xash3D\src_main\temp\engine\!release\pm_surface.obj" -"\Xash3D\src_main\temp\engine\!release\pm_trace.obj" -"\Xash3D\src_main\temp\engine\!release\random.obj" -"\Xash3D\src_main\temp\engine\!release\s_backend.obj" -"\Xash3D\src_main\temp\engine\!release\s_dsp.obj" -"\Xash3D\src_main\temp\engine\!release\s_load.obj" -"\Xash3D\src_main\temp\engine\!release\s_main.obj" -"\Xash3D\src_main\temp\engine\!release\s_mix.obj" -"\Xash3D\src_main\temp\engine\!release\s_mouth.obj" -"\Xash3D\src_main\temp\engine\!release\s_stream.obj" -"\Xash3D\src_main\temp\engine\!release\s_utils.obj" -"\Xash3D\src_main\temp\engine\!release\s_vox.obj" -"\Xash3D\src_main\temp\engine\!release\snd_main.obj" -"\Xash3D\src_main\temp\engine\!release\snd_mp3.obj" -"\Xash3D\src_main\temp\engine\!release\snd_utils.obj" -"\Xash3D\src_main\temp\engine\!release\snd_wav.obj" -"\Xash3D\src_main\temp\engine\!release\sv_client.obj" -"\Xash3D\src_main\temp\engine\!release\sv_cmds.obj" -"\Xash3D\src_main\temp\engine\!release\sv_custom.obj" -"\Xash3D\src_main\temp\engine\!release\sv_frame.obj" -"\Xash3D\src_main\temp\engine\!release\sv_game.obj" -"\Xash3D\src_main\temp\engine\!release\sv_init.obj" -"\Xash3D\src_main\temp\engine\!release\sv_main.obj" -"\Xash3D\src_main\temp\engine\!release\sv_move.obj" -"\Xash3D\src_main\temp\engine\!release\sv_phys.obj" -"\Xash3D\src_main\temp\engine\!release\sv_pmove.obj" -"\Xash3D\src_main\temp\engine\!release\sv_save.obj" -"\Xash3D\src_main\temp\engine\!release\sv_studio.obj" -"\Xash3D\src_main\temp\engine\!release\sv_world.obj" -"\Xash3D\src_main\temp\engine\!release\sys_con.obj" -"\Xash3D\src_main\temp\engine\!release\sys_win.obj" -"\Xash3D\src_main\temp\engine\!release\titles.obj" -"\Xash3D\src_main\temp\engine\!release\vgui_clip.obj" -"\Xash3D\src_main\temp\engine\!release\vgui_draw.obj" -"\Xash3D\src_main\temp\engine\!release\vgui_font.obj" -"\Xash3D\src_main\temp\engine\!release\vgui_input.obj" -"\Xash3D\src_main\temp\engine\!release\vgui_int.obj" -"\Xash3D\src_main\temp\engine\!release\vgui_surf.obj" -"\Xash3D\src_main\temp\engine\!release\world.obj" -"\Xash3D\src_main\temp\engine\!release\zone.obj" -] -Creating command line "link.exe @"C:\DOCUME~1\ÌÈØÀ\LOCALS~1\Temp\RSP77CB.tmp"" -Creating temporary file "C:\DOCUME~1\ÌÈØÀ\LOCALS~1\Temp\RSP77CC.bat" with contents -[ -@echo off -copy \Xash3D\src_main\temp\engine\!release\xash.dll "D:\Xash3D\xash.dll" -] -Creating command line ""C:\DOCUME~1\ÌÈØÀ\LOCALS~1\Temp\RSP77CC.bat"" -Compiling... -avikit.c -build.c -cl_cmds.c -cl_demo.c -cl_events.c -cl_frame.c -cl_game.c -cl_main.c -cl_menu.c -cl_parse.c -cl_pmove.c -cl_remap.c -cl_scrn.c -cl_tent.c -cl_video.c -cl_view.c -cmd.c -common.c -con_utils.c -console.c -Generating Code... -Compiling... -crclib.c -crtlib.c -cvar.c -filesystem.c -gamma.c -gl_backend.c -gl_beams.c -gl_cull.c -gl_decals.c -gl_draw.c -gl_image.c -gl_mirror.c -gl_refrag.c -gl_rlight.c -gl_rmain.c -gl_rmath.c -gl_rmisc.c -gl_rpart.c -gl_rsurf.c -gl_sprite.c -Generating Code... -Compiling... -gl_studio.c -gl_vidnt.c -gl_warp. \ No newline at end of file diff --git a/engine/server/sv_client.c b/engine/server/sv_client.c index 8fd18bd0..598dd828 100644 --- a/engine/server/sv_client.c +++ b/engine/server/sv_client.c @@ -2114,6 +2114,41 @@ void SV_ParseResourceList( sv_client_t *cl, sizebuf_t *msg ) Netchan_FragSend( &cl->netchan ); } +/* +=================== +SV_ParseCvarValue + +Parse a requested value from client cvar +=================== +*/ +void SV_ParseCvarValue( sv_client_t *cl, sizebuf_t *msg ) +{ + const char *value = BF_ReadString( msg ); + + if( svgame.dllFuncs2.pfnCvarValue ) + svgame.dllFuncs2.pfnCvarValue( cl->edict, value ); + MsgDev( D_AICONSOLE, "Cvar query response: name:%s, value:%s\n", cl->name, value ); +} + +/* +=================== +SV_ParseCvarValue2 + +Parse a requested value from client cvar +=================== +*/ +void SV_ParseCvarValue2( sv_client_t *cl, sizebuf_t *msg ) +{ + string name, value; + int requestID = BF_ReadLong( msg ); + Q_strcpy( name, BF_ReadString( msg )); + Q_strcpy( value, BF_ReadString( msg )); + + if( svgame.dllFuncs2.pfnCvarValue2 ) + svgame.dllFuncs2.pfnCvarValue2( cl->edict, requestID, name, value ); + MsgDev( D_AICONSOLE, "Cvar query response: name:%s, request ID %d, cvar:%s, value:%s\n", cl->name, requestID, name, value ); +} + /* =================== SV_ExecuteClientMessage @@ -2194,6 +2229,12 @@ void SV_ExecuteClientMessage( sv_client_t *cl, sizebuf_t *msg ) case clc_resourcelist: SV_ParseResourceList( cl, msg ); break; + case clc_requestcvarvalue: + SV_ParseCvarValue( cl, msg ); + break; + case clc_requestcvarvalue2: + SV_ParseCvarValue2( cl, msg ); + break; default: MsgDev( D_ERROR, "SV_ReadClientMessage: clc_bad\n" ); SV_DropClient( cl ); diff --git a/engine/server/sv_game.c b/engine/server/sv_game.c index 7629b629..72ec0b04 100644 --- a/engine/server/sv_game.c +++ b/engine/server/sv_game.c @@ -4183,6 +4183,25 @@ request client cvar value */ void pfnQueryClientCvarValue( const edict_t *player, const char *cvarName ) { + sv_client_t *cl; + + if( !cvarName || !*cvarName ) + { + MsgDev( D_ERROR, "QueryClientCvarValue: NULL cvar name!\n" ); + return; + } + + if(( cl = SV_ClientFromEdict( player, true )) != NULL ) + { + BF_WriteByte( &cl->netchan.message, svc_querycvarvalue ); + BF_WriteString( &cl->netchan.message, cvarName ); + } + else + { + if( svgame.dllFuncs2.pfnCvarValue ) + svgame.dllFuncs2.pfnCvarValue( player, "Bad Player" ); + MsgDev( D_ERROR, "QueryClientCvarValue: tried to send to a non-client!\n" ); + } } /* @@ -4194,6 +4213,26 @@ request client cvar value (bugfixed) */ void pfnQueryClientCvarValue2( const edict_t *player, const char *cvarName, int requestID ) { + sv_client_t *cl; + + if( !cvarName || !*cvarName ) + { + MsgDev( D_ERROR, "QueryClientCvarValue: NULL cvar name!\n" ); + return; + } + + if(( cl = SV_ClientFromEdict( player, true )) != NULL ) + { + BF_WriteByte( &cl->netchan.message, svc_querycvarvalue2 ); + BF_WriteLong( &cl->netchan.message, requestID ); + BF_WriteString( &cl->netchan.message, cvarName ); + } + else + { + if( svgame.dllFuncs2.pfnCvarValue2 ) + svgame.dllFuncs2.pfnCvarValue2( player, requestID, cvarName, "Bad Player" ); + MsgDev( D_ERROR, "QueryClientCvarValue: tried to send to a non-client!\n" ); + } } // engine callbacks diff --git a/mainui/menu_creategame.cpp b/mainui/menu_creategame.cpp index 80bdd0ef..55d17810 100644 --- a/mainui/menu_creategame.cpp +++ b/mainui/menu_creategame.cpp @@ -183,7 +183,7 @@ static void UI_CreateGame_GetMapsList( void ) { char *afile; - if( !CHECK_MAP_LIST( FALSE ) && (afile = (char *)LOAD_FILE( "maps.lst", NULL )) == NULL ) + if( !CHECK_MAP_LIST( FALSE ) || (afile = (char *)LOAD_FILE( "maps.lst", NULL )) == NULL ) { uiCreateGame.done.generic.flags |= QMF_GRAYED; uiCreateGame.mapsList.itemNames = (const char **)uiCreateGame.mapsDescriptionPtr;