diff --git a/engine/client/cl_cg.c b/engine/client/cl_cg.c index 019842abe..78c90882f 100644 --- a/engine/client/cl_cg.c +++ b/engine/client/cl_cg.c @@ -604,7 +604,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long } if (mod) - pc = cl.worldmodel->funcs.NativeContents(mod, 0, 0, VM_POINTER(arg[0]), vec3_origin, vec3_origin); + pc = mod->funcs.NativeContents(mod, 0, 0, VM_POINTER(arg[0]), vec3_origin, vec3_origin); else pc = 1;//FTECONTENTS_SOLID; } @@ -852,6 +852,22 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long case CG_S_UPDATEENTITYPOSITION://void trap_S_UpdateEntityPosition( int entityNum, const vec3_t origin ); break; case CG_S_RESPATIALIZE://void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3], int inwater ); + { + float *org = VM_POINTER(arg[1]); + float *axis = VM_POINTER(arg[2]); +/* +vec3_t listener_origin; +vec3_t listener_forward; +vec3_t listener_right; +vec3_t listener_up; +*/ + VectorCopy(org, listener_origin); + VectorCopy(axis+0, listener_forward); + VectorCopy(axis+3, listener_right); + VectorCopy(axis+6, listener_up); + +// S_Update(origin, axis[0], axis[1], axis[2], false); + } break; case CG_S_ADDREALLOOPINGSOUND: diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index 75be2c0c0..67074c8d6 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -465,6 +465,8 @@ void CL_ParsePacketEntities (qboolean delta) { from = MSG_ReadByte (); +// Con_Printf("%i %i from %i\n", cls.netchan.outgoing_sequence, cls.netchan.incoming_sequence, from); + oldpacket = cl.frames[newpacket].delta_sequence; if (cls.demoplayback == DPB_MVD) from = oldpacket = cls.netchan.incoming_sequence - 1; @@ -483,7 +485,8 @@ void CL_ParsePacketEntities (qboolean delta) // return; } - if (cls.netchan.outgoing_sequence - oldpacket >= UPDATE_BACKUP - 1) { + if (cls.netchan.outgoing_sequence - oldpacket >= UPDATE_BACKUP - 1) + { // we can't use this, it is too old FlushEntityPacket (); // don't clear cl.validsequence, so that frames can still be rendered; @@ -1594,7 +1597,7 @@ packet_entities_t *CL_ProcessPacketEntities(float *servertime, qboolean nolerp) } if (!packold) //can happem at map start, and really laggy games, but really shouldn't in a normal game { - Con_DPrintf("Warning: No lerp-from frame packet\n"); +// Con_DPrintf("Warning: No lerp-from frame packet\n"); packold = packnew; } diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 3e660a1c0..b59f50268 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -1403,6 +1403,7 @@ void CL_SendCmd (float frametime) { cl.frames[cls.netchan.outgoing_sequence&UPDATE_MASK].delta_sequence = cl.validsequence; MSG_WriteByte (&buf, clc_delta); +// Con_Printf("%i\n", cl.validsequence); MSG_WriteByte (&buf, cl.validsequence&255); } else diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 24c9f720b..a778aba21 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -72,6 +72,7 @@ cvar_t cl_predict_players = SCVAR("cl_predict_players", "1"); cvar_t cl_predict_players2 = SCVAR("cl_predict_players2", "1"); cvar_t cl_solid_players = SCVAR("cl_solid_players", "1"); cvar_t cl_noblink = SCVAR("cl_noblink", "0"); +cvar_t cl_servername = SCVAR("cl_servername", "none"); cvar_t cl_demospeed = FCVAR("cl_demospeed", "demo_setspeed", "1", 0); @@ -139,7 +140,7 @@ cvar_t cl_parsewhitetext = SCVAR("cl_parsewhitetext", "1"); cvar_t cl_dlemptyterminate = SCVAR("cl_dlemptyterminate", "1"); -cvar_t host_mapname = FCVAR("host_mapname", "mapname", "", 0); +cvar_t host_mapname = FCVAR("mapname", "host_mapname", "", 0); extern cvar_t cl_hightrack; @@ -538,6 +539,8 @@ void CL_CheckForResend (void) if (!cls.state && sv.state) { Q_strncpyz (cls.servername, "internalserver", sizeof(cls.servername)); + Cvar_ForceSet(&cl_servername, cls.servername); + cls.state = ca_disconnected; switch (svs.gametype) { @@ -611,6 +614,8 @@ void CL_CheckForResend (void) connect_time = realtime+t2-t1; // for retransmit requests + Cvar_ForceSet(&cl_servername, cls.servername); + #ifdef Q3CLIENT //Q3 clients send thier cdkey to the q3 authorize server. //they send this packet with the challenge. @@ -1158,6 +1163,8 @@ void CL_Disconnect (void) #endif cls.qport++; //a hack I picked up from qizmo + + Cvar_ForceSet(&cl_servername, "none"); } #undef serverrunning @@ -1554,6 +1561,27 @@ void CL_FullInfo_f (void) } } +void CL_SetInfo (char *key, char *value) +{ + cvar_t *var; + var = Cvar_FindVar(key); + if (var && (var->flags & CVAR_USERINFO)) + { //get the cvar code to set it. the server might have locked it. + Cvar_Set(var, value); + return; + } + + Info_SetValueForStarKey (cls.userinfo, key, value, MAX_INFO_STRING); + if (cls.state >= ca_connected) + { +#ifdef Q2CLIENT + if (cls.protocol == CP_QUAKE2 || cls.protocol == CP_QUAKE3) + cls.resendinfo = true; + else +#endif + Cmd_ForwardToServer (); + } +} /* ================== CL_SetInfo_f @@ -1591,7 +1619,7 @@ void CL_SetInfo_f (void) break; //no more. else if (*k == '*') i++; //can't remove * keys - else if ((var = Cvar_FindVar(k)) && var->flags&CVAR_SERVERINFO) + else if ((var = Cvar_FindVar(k)) && var->flags&CVAR_USERINFO) i++; //this one is a cvar. else Info_RemoveKey(cls.userinfo, k); //we can remove this one though, so yay. @@ -1603,23 +1631,8 @@ void CL_SetInfo_f (void) return; } - var = Cvar_FindVar(Cmd_Argv(1)); - if (var && (var->flags & CVAR_USERINFO)) - { //get the cvar code to set it. the server might have locked it. - Cvar_Set(var, Cmd_Argv(2)); - return; - } - Info_SetValueForKey (cls.userinfo, Cmd_Argv(1), Cmd_Argv(2), MAX_INFO_STRING); - if (cls.state >= ca_connected) - { -#ifdef Q2CLIENT - if (cls.protocol == CP_QUAKE2 || cls.protocol == CP_QUAKE3) - cls.resendinfo = true; - else -#endif - Cmd_ForwardToServer (); - } + CL_SetInfo(Cmd_Argv(1), Cmd_Argv(2)); } void CL_SaveInfo(vfsfile_t *f) @@ -2447,6 +2460,12 @@ void CL_ReadPackets (void) } else if (!Netchan_Process(&cls.netchan)) continue; // wasn't accepted for some reason + + if (cls.netchan.incoming_sequence >= cls.netchan.outgoing_sequence) + { + Con_Printf("Server is in a timewarp (%i packets)\n", cls.netchan.incoming_sequence - cls.netchan.outgoing_sequence+1); + cls.netchan.outgoing_sequence = cls.netchan.incoming_sequence + 1; + } CL_ParseServerMessage (); break; } @@ -2707,6 +2726,7 @@ void CL_Init (void) Cvar_Register (&cfg_save_name, cl_controlgroup); + Cvar_Register (&cl_servername, cl_controlgroup); Cvar_Register (&cl_demospeed, "Demo playback"); Cvar_Register (&cl_warncmd, "Warnings"); Cvar_Register (&cl_upspeed, cl_inputgroup); @@ -3220,7 +3240,12 @@ void Host_Frame (double time) else #endif if (cls.state == ca_active) - S_Update (r_origin, vpn, vright, vup); + { + if (cls.protocol == CP_QUAKE3) + S_ExtraUpdate(); + else + S_Update (r_origin, vpn, vright, vup); + } else S_Update (vec3_origin, vec3_origin, vec3_origin, vec3_origin); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 3365fa610..964a278c4 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -2876,7 +2876,7 @@ void CL_UpdateUserinfo (void) CL_SetInfo ============== */ -void CL_SetInfo (void) +void CL_ParseSetInfo (void) { int slot; player_info_t *player; @@ -3291,7 +3291,7 @@ char *CL_ParseChat(char *text, player_info_t **player) { if (!cls.demoplayback) Sys_ServerActivity(); //chat always flashes the screen.. - +/* //check f_ stuff if (!strncmp(s, "f_", 2)) { @@ -3322,7 +3322,7 @@ char *CL_ParseChat(char *text, player_info_t **player) } return s; } - +*/ Validation_CheckIfResponse(text); #ifdef PLUGINS @@ -4170,7 +4170,7 @@ void CL_ParseServerMessage (void) break; case svc_setinfo: - CL_SetInfo (); + CL_ParseSetInfo (); break; case svc_serverinfo: diff --git a/engine/client/cl_plugin.inc b/engine/client/cl_plugin.inc index 81338b859..72a402c3c 100644 --- a/engine/client/cl_plugin.inc +++ b/engine/client/cl_plugin.inc @@ -398,6 +398,33 @@ int VARGS Plug_GetPlayerInfo(void *offset, unsigned int mask, const long *arg) return pt == i; } +int VARGS Plug_LocalPlayerNumber(void *offset, unsigned int mask, const long *arg) +{ + return cl.playernum[0]; +} + +int VARGS Plug_GetServerInfo(void *offset, unsigned int mask, const long *arg) +{ + char *outptr = VM_POINTER(arg[0]); + int outlen = VM_LONG(arg[1]); + + if (VM_OOB(arg[0], outlen)) + return false; + + Q_strncpyz(outptr, cl.serverinfo, outlen); + + return true; +} + +int VARGS Plug_SetUserInfo(void *offset, unsigned int mask, const long *arg) +{ + char *key = VM_POINTER(arg[0]); + char *value = VM_POINTER(arg[1]); + + CL_SetInfo(key, value); + + return true; +} int VARGS Plug_Con_SubPrint(void *offset, unsigned int mask, const long *arg) { @@ -519,6 +546,9 @@ void Plug_Client_Init(void) Plug_RegisterBuiltin("Media_ShowFrameRGBA_32", Plug_Media_ShowFrameRGBA_32, PLUG_BIF_NEEDSRENDERER); Plug_RegisterBuiltin("GetPlayerInfo", Plug_GetPlayerInfo, PLUG_BIF_NEEDSRENDERER); + Plug_RegisterBuiltin("LocalPlayerNumber", Plug_LocalPlayerNumber, PLUG_BIF_NEEDSRENDERER); + Plug_RegisterBuiltin("GetServerInfo", Plug_GetServerInfo, PLUG_BIF_NEEDSRENDERER); + Plug_RegisterBuiltin("SetUserInfo", Plug_SetUserInfo, PLUG_BIF_NEEDSRENDERER); } void Plug_Client_Close(plugin_t *plug) diff --git a/engine/client/clq3_parse.c b/engine/client/clq3_parse.c index 7b9f687b9..8d6be1525 100644 --- a/engine/client/clq3_parse.c +++ b/engine/client/clq3_parse.c @@ -84,9 +84,9 @@ void CLQ3_ParseServerCommand(void) ccs.lastServerCommandNum++; - if( number > ccs.lastServerCommandNum ) + if( number > ccs.lastServerCommandNum+TEXTCMD_MASK-1 ) { - Host_EndGame("Lost %i reliable serverCommands\n", + Con_Printf("Warning: Lost %i reliable serverCommands\n", number - ccs.lastServerCommandNum ); } @@ -723,6 +723,7 @@ qboolean CLQ3_Netchan_Process(void) bitmask = sequence ^ cls.challenge; string = ccs.clientCommands[lastClientCommandNum & TEXTCMD_MASK]; +#ifndef Q3_NOENCRYPT // decrypt the packet for(i=msg_readcount+4,j=0 ; iisfree; -} - static void PF_cl_te_gunshot (progfuncs_t *prinst, struct globalvars_s *pr_globals) { float *pos = G_VECTOR(OFS_PARM0); diff --git a/engine/client/renderer.c b/engine/client/renderer.c index eb892c589..80ef6588b 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -883,7 +883,7 @@ rendererinfo_t softwarerendererinfo = { SWVID_ShiftPalette, SWVID_GetRGBInfo, - NULL, + SWVID_SetCaption, SWSCR_UpdateScreen, @@ -980,7 +980,7 @@ rendererinfo_t openglrendererinfo = { GLVID_ShiftPalette, GLVID_GetRGBInfo, - NULL, //setcaption + GLVID_SetCaption, //setcaption GLSCR_UpdateScreen, diff --git a/engine/client/valid.c b/engine/client/valid.c index c0603b4ca..a41e19ee2 100644 --- a/engine/client/valid.c +++ b/engine/client/valid.c @@ -315,6 +315,12 @@ void Validation_CheckIfResponse(char *text) return; //looks like a validation, but it's not from a known client. } + { + char *match = DISTRIBUTION"Quake v"; + if (strncmp(versionstring, match, strlen(match))) + return; //this is not us + } + //now do the validation { f_query_t *query = NULL; diff --git a/engine/client/vid.h b/engine/client/vid.h index f28130c29..9f5557b13 100644 --- a/engine/client/vid.h +++ b/engine/client/vid.h @@ -112,6 +112,7 @@ qboolean GLVID_Is8bit(); void GLD_BeginDirectRect (int x, int y, qbyte *pbitmap, int width, int height); void GLD_EndDirectRect (int x, int y, int width, int height); char *GLVID_GetRGBInfo(int prepadbytes, int *truewidth, int *trueheight); +void GLVID_SetCaption(char *caption); #endif #ifdef SWQUAKE diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 93007a39d..8b55c0e71 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -1020,6 +1020,10 @@ char *VARGS Cmd_Args (void) return cmd_args; } +void Cmd_Args_Set(char *newargs) +{ + cmd_args = newargs; +} /* ============ diff --git a/engine/common/plugin.c b/engine/common/plugin.c index 2406b19a8..30cc50651 100644 --- a/engine/common/plugin.c +++ b/engine/common/plugin.c @@ -927,7 +927,7 @@ int VARGS Plug_Net_SetTLSClient(void *offset, unsigned int mask, const long *arg pluginstream_t *stream; int handle = VM_LONG(arg[0]); - qboolean anon = false; + qboolean anon = true; if (handle < 0 || handle >= pluginstreamarraylen || pluginstreamarray[handle].plugin != currentplug) { Con_Printf("Plug_Net_SetTLSClient: socket does not belong to you (or is invalid)\n"); @@ -940,6 +940,8 @@ int VARGS Plug_Net_SetTLSClient(void *offset, unsigned int mask, const long *arg return -2; } + ioctlsocket (stream->socket, FIONBIO, &_false); + { static qboolean needinit = true; @@ -978,7 +980,6 @@ int VARGS Plug_Net_SetTLSClient(void *offset, unsigned int mask, const long *arg // Perform the TLS handshake - ioctlsocket (stream->socket, FIONBIO, &_false); ret = GNUTLS_E_AGAIN; while ((ret == GNUTLS_E_AGAIN) || (ret == GNUTLS_E_INTERRUPTED)) @@ -988,7 +989,7 @@ int VARGS Plug_Net_SetTLSClient(void *offset, unsigned int mask, const long *arg if (ret < 0) { - Con_Printf (S_ERROR "*** TLS handshake failed\n"); + Con_Printf (S_ERROR "*** TLS handshake failed (%i)\n", ret); gnutls_perror (ret); stream->type = STREAM_SOCKET; //go back to regular socket @@ -1600,14 +1601,19 @@ qboolean Plug_ServerMessage(char *buffer, int messagelevel) { qboolean ret = true; + Cmd_TokenizeString(buffer, false, false); + Cmd_Args_Set(buffer); + for (currentplug = plugs; currentplug; currentplug = currentplug->next) { if (currentplug->svmsgfunction) { - ret &= VM_Call(currentplug->vm, currentplug->svmsgfunction, buffer, messagelevel); + ret &= VM_Call(currentplug->vm, currentplug->svmsgfunction, messagelevel); } } + Cmd_Args_Set(NULL); + return ret; // true to display message, false to supress } @@ -1615,14 +1621,19 @@ qboolean Plug_ChatMessage(char *buffer, int talkernum, int tpflags) { qboolean ret = true; + Cmd_TokenizeString(buffer, false, false); + Cmd_Args_Set(buffer); + for (currentplug = plugs; currentplug; currentplug = currentplug->next) { if (currentplug->chatmsgfunction) { - ret &= VM_Call(currentplug->vm, currentplug->chatmsgfunction, buffer, talkernum, tpflags); + ret &= VM_Call(currentplug->vm, currentplug->chatmsgfunction, talkernum, tpflags); } } + Cmd_Args_Set(NULL); + return ret; // true to display message, false to supress } @@ -1630,14 +1641,19 @@ qboolean Plug_CenterPrintMessage(char *buffer, int clientnum) { qboolean ret = true; + Cmd_TokenizeString(buffer, false, false); + Cmd_Args_Set(buffer); + for (currentplug = plugs; currentplug; currentplug = currentplug->next) { if (currentplug->centerprintfunction) { - ret &= VM_Call(currentplug->vm, currentplug->centerprintfunction, buffer, clientnum); + ret &= VM_Call(currentplug->vm, currentplug->centerprintfunction, clientnum); } } + Cmd_Args_Set(NULL); + return ret; // true to display message, false to supress } @@ -1683,6 +1699,10 @@ void Plug_Close_f(void) Con_Printf("Close which plugin?\n"); return; } + + if (currentplug) + Sys_Error("Plug_CloseAll_f called inside a plugin!\n"); + for (plug = plugs; plug; plug = plug->next) { if (!strcmp(plug->name, name)) diff --git a/engine/common/pr_common.h b/engine/common/pr_common.h index 725dfcc21..ff20a03f6 100644 --- a/engine/common/pr_common.h +++ b/engine/common/pr_common.h @@ -68,6 +68,7 @@ void PF_search_begin (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_search_end (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_search_getsize (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_search_getfilename (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_WasFreed (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PR_fclose_progs (progfuncs_t *prinst); char *PF_VarString (progfuncs_t *prinst, int first, struct globalvars_s *pr_globals); diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index 2faf45bd3..a7c108b46 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -431,6 +431,11 @@ qboolean VID_SetWindowedMode (rendererstate_t *info) return true; } +void GLVID_SetCaption(char *text) +{ + SetWindowText(mainwindow, text); +} + qboolean VID_SetFullDIBMode (rendererstate_t *info) { diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 54e85bcaf..c2c23881c 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -9256,6 +9256,13 @@ void PF_SendPacket(progfuncs_t *prinst, struct globalvars_s *pr_globals) NET_SendPacket(NS_SERVER, strlen(contents), contents, to); } +void PF_WasFreed (progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + edict_t *ent; + ent = (edict_t*)G_EDICT(prinst, OFS_PARM0); + G_FLOAT(OFS_RETURN) = ent->isfree; +} + BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"fixme", PF_Fixme, 0, 0, 0}, {"ignore", PF_Ignore, 0, 0, 0}, @@ -9569,6 +9576,23 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"bulleten", PF_bulleten, 0, 0, 0, 243}, #endif +//EXT_CSQC +// {"setmodelindex", PF_sv_SetModelIndex,0, 0, 0, 333}, // #333 void(entity e, float mdlindex) setmodelindex (EXT_CSQC) +// {"modelnameforindex",PF_sv_ModelnameForIndex,0, 0, 0, 334}, // #334 string(float mdlindex) modelnameforindex (EXT_CSQC) + +// {"particleeffectnum",PF_sv_particlesloaded,0, 0, 0, 335}, // #335 float(string effectname) particleeffectnum (EXT_CSQC) +// {"trailparticles", PF_sv_trailparticles,0, 0, 0, 336}, // #336 void(entity ent, float effectnum, vector start, vector end) trailparticles (EXT_CSQC), +// {"pointparticles", PF_sv_pointparticles,0, 0, 0, 337}, // #337 void(float effectnum, vector origin [, vector dir, float count]) pointparticles (EXT_CSQC) + +// {"cprint", PF_sv_cprint, 0, 0, 0, 338}, // #338 void(string s) cprint (EXT_CSQC) +// {"print", PF_sv_print, 0, 0, 0, 339}, // #339 void(string s) print (EXT_CSQC) + +// {"runningserver", PF_sv_runningserver,0, 0, 0, 350}, // #350 float() isserver (EXT_CSQC) +// {"registercommand", PF_sv_registercommand,0, 0, 0, 352}, // #352 void(string cmdname) registercommand (EXT_CSQC) + {"wasfreed", PF_WasFreed, 0, 0, 0, 353}, // #353 float(entity ent) wasfreed (EXT_CSQC) (should be availabe on server too) +// {"serverkey", PF_sv_serverkey, 0, 0, 0, 354}, // #354 string(string key) serverkey; +//END EXT_CSQC + //end fte extras //DP extras diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c index 8c33e4f1a..8e12ffa6c 100644 --- a/engine/server/sv_ccmds.c +++ b/engine/server/sv_ccmds.c @@ -423,6 +423,11 @@ void SV_MapList_f(void) COM_EnumerateFiles("maps/*.bsp", ShowMapList, NULL); } +void gtcallback(struct cvar_s *var, char *oldvalue) +{ + Con_Printf("g_gametype changed\n"); +} + /* ====================== SV_Map_f @@ -570,7 +575,13 @@ void SV_Map_f (void) #ifdef Q3SERVER { cvar_t *gametype; - gametype = Cvar_Get("g_gametype", "0", CVAR_LATCH, "Q3 compatability"); + + gametype = Cvar_Get("mapname", "0", CVAR_LATCH|CVAR_SERVERINFO, "Q3 compatability"); + gametype->flags |= CVAR_SERVERINFO; + Cvar_ForceSet(gametype, level); + + gametype = Cvar_Get("g_gametype", "0", CVAR_LATCH|CVAR_SERVERINFO, "Q3 compatability"); + gametype->callback = gtcallback; if (wasspmap) Cvar_ForceSet(gametype, "2"); else if (gametype->value == 2) //singleplayer diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index a961bf9e1..a76b09650 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -1837,6 +1837,10 @@ client_t *SVC_DirectConnect(void) } newcl->zquake_extensions = atoi(Info_ValueForKey(newcl->userinfo, "*z_ext")); + if (*Info_ValueForKey(newcl->userinfo, "*fuhquake")) //fuhquake doesn't claim to support z_ext but does look at our z_ext serverinfo key. + { //so switch on the bits that it should be sending. + newcl->zquake_extensions |= Z_EXT_PM_TYPE|Z_EXT_PM_TYPE_NEW; + } //dmw - delayed - Netchan_OutOfBandPrint (adr, "%c", S2C_CONNECTION ); diff --git a/engine/server/svq3_game.c b/engine/server/svq3_game.c index 8e8f2c1a1..7f64aed7f 100644 --- a/engine/server/svq3_game.c +++ b/engine/server/svq3_game.c @@ -1821,7 +1821,10 @@ void SV_InitBotLib() // Z_FreeTags(Z_TAG_BOTLIB); botlibmemoryavailable = 1024*1024*16; - botlib = FTE_GetBotLibAPI(BOTLIB_API_VERSION, &import); + if (bot_enable->value) + botlib = FTE_GetBotLibAPI(BOTLIB_API_VERSION, &import); + else + botlib = NULL; if (!botlib) { bot_enable->flags |= CVAR_LATCH; @@ -2572,6 +2575,7 @@ static qboolean SVQ3_Netchan_Process(client_t *client) bitmask = serverid ^ lastSequence ^ client->challenge; string = client->server_commands[lastServerCommandNum & TEXTCMD_MASK]; +#ifndef Q3_NOENCRYPT // decrypt the packet for( i=msg_readcount+12,j=0 ; inetchan.outgoing_sequence ^ client->challenge; string = client->last_client_command; +#ifndef Q3_NOENCRYPT //first four bytes are not encrypted. for( i=0; i<4 ; i++) buffer[i] = data[i]; @@ -2620,6 +2626,10 @@ void SVQ3_Netchan_Transmit( client_t *client, int length, qbyte *data ) bitmask ^= c << (i & 1); buffer[i] = data[i]^bitmask; } +#else + for( i=0 ; inetchan, length, buffer);