X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=cl_main.c;h=744ef854f7daf62c0deaafa34c37abb91e59e10e;hp=2a2b9976d204dd82cc6e41bf67c9c3e1b1e6cf50;hb=2f5dfa4708db4112f682b31146a8db1d456a0482;hpb=ab101cc2288c382f7480a78f4f849cc65bd5f2e6 diff --git a/cl_main.c b/cl_main.c index 2a2b9976..744ef854 100644 --- a/cl_main.c +++ b/cl_main.c @@ -360,11 +360,26 @@ Sends a disconnect message to the server This is also called on Host_Error, so it shouldn't cause any errors ===================== */ -void CL_Disconnect(void) + +void CL_DisconnectEx(qbool kicked, const char *fmt, ... ) { + va_list argptr; + char reason[512]; + if (cls.state == ca_dedicated) return; + if(fmt) + { + va_start(argptr,fmt); + dpvsnprintf(reason,sizeof(reason),fmt,argptr); + va_end(argptr); + } + else + { + dpsnprintf(reason, sizeof(reason), "Disconnect by user"); + } + if (Sys_CheckParm("-profilegameonly")) Sys_AllowProfiling(false); @@ -395,32 +410,41 @@ void CL_Disconnect(void) else if (cls.netcon) { sizebuf_t buf; - unsigned char bufdata[8]; + unsigned char bufdata[520]; if (cls.demorecording) - CL_Stop_f(&cmd_client); + CL_Stop_f(cmd_local); - // send disconnect message 3 times to improve chances of server - // receiving it (but it still fails sometimes) - memset(&buf, 0, sizeof(buf)); - buf.data = bufdata; - buf.maxsize = sizeof(bufdata); - if (cls.protocol == PROTOCOL_QUAKEWORLD) - { - Con_DPrint("Sending drop command\n"); - MSG_WriteByte(&buf, qw_clc_stringcmd); - MSG_WriteString(&buf, "drop"); - } - else + if(!kicked) { - Con_DPrint("Sending clc_disconnect\n"); - MSG_WriteByte(&buf, clc_disconnect); + // send disconnect message 3 times to improve chances of server + // receiving it (but it still fails sometimes) + memset(&buf, 0, sizeof(buf)); + buf.data = bufdata; + buf.maxsize = sizeof(bufdata); + if (cls.protocol == PROTOCOL_QUAKEWORLD) + { + Con_DPrint("Sending drop command\n"); + MSG_WriteByte(&buf, qw_clc_stringcmd); + MSG_WriteString(&buf, "drop"); + } + else + { + Con_DPrint("Sending clc_disconnect\n"); + MSG_WriteByte(&buf, clc_disconnect); + if(cls.protocol == PROTOCOL_DARKPLACES8) + MSG_WriteString(&buf, reason); + } + NetConn_SendUnreliableMessage(cls.netcon, &buf, cls.protocol, 10000, 0, false); + NetConn_SendUnreliableMessage(cls.netcon, &buf, cls.protocol, 10000, 0, false); + NetConn_SendUnreliableMessage(cls.netcon, &buf, cls.protocol, 10000, 0, false); } - NetConn_SendUnreliableMessage(cls.netcon, &buf, cls.protocol, 10000, 0, false); - NetConn_SendUnreliableMessage(cls.netcon, &buf, cls.protocol, 10000, 0, false); - NetConn_SendUnreliableMessage(cls.netcon, &buf, cls.protocol, 10000, 0, false); + NetConn_Close(cls.netcon); cls.netcon = NULL; - Con_Printf("Disconnected\n"); + if(fmt) + Con_Printf("Disconnect: %s\n", reason); + else + Con_Printf("Disconnected\n"); } cls.state = ca_disconnected; cl.islocalgame = false; @@ -428,8 +452,18 @@ void CL_Disconnect(void) cls.demoplayback = cls.timedemo = host.restless = false; cls.signon = 0; + Cvar_Callback(&cl_netport); + // If we're dropped mid-connection attempt, it won't clear otherwise. SCR_ClearLoadingScreen(false); + + if(host.hook.SV_Shutdown) + host.hook.SV_Shutdown(); +} + +void CL_Disconnect(void) +{ + CL_DisconnectEx(false, NULL); } /* @@ -510,9 +544,7 @@ static void CL_Connect_f(cmd_state_t *cmd) void CL_Disconnect_f(cmd_state_t *cmd) { - CL_Disconnect (); - if (sv.active) - SV_Shutdown (); + Cmd_Argc(cmd) < 1 ? CL_Disconnect() : CL_DisconnectEx(false, Cmd_Argv(cmd, 1)); } @@ -553,8 +585,8 @@ void CL_EstablishConnection(const char *address, int firstarg) { int i; *cls.connect_userinfo = 0; - for(i = firstarg; i+2 <= Cmd_Argc(&cmd_client); i += 2) - InfoString_SetValue(cls.connect_userinfo, sizeof(cls.connect_userinfo), Cmd_Argv(&cmd_client, i), Cmd_Argv(&cmd_client, i+1)); + for(i = firstarg; i+2 <= Cmd_Argc(cmd_local); i += 2) + InfoString_SetValue(cls.connect_userinfo, sizeof(cls.connect_userinfo), Cmd_Argv(cmd_local, i), Cmd_Argv(cmd_local, i+1)); } else if(firstarg < -1) { @@ -2488,12 +2520,35 @@ static void CL_MeshEntities_Restart(void) int i; entity_t *ent; for (i = 0; i < NUM_MESHENTITIES; i++) + { + ent = cl_meshentities + i; + Mod_Mesh_Destroy(ent->render.model); + Mod_Mesh_Create(ent->render.model, cl_meshentitynames[i]); + } +} + +static void CL_MeshEntities_Start(void) +{ + int i; + entity_t *ent; + for(i = 0; i < NUM_MESHENTITIES; i++) { ent = cl_meshentities + i; Mod_Mesh_Create(ent->render.model, cl_meshentitynames[i]); } } +static void CL_MeshEntities_Shutdown(void) +{ + int i; + entity_t *ent; + for(i = 0; i < NUM_MESHENTITIES; i++) + { + ent = cl_meshentities + i; + Mod_Mesh_Destroy(ent->render.model); + } +} + static void CL_MeshEntities_Init(void) { int i; @@ -2530,7 +2585,7 @@ static void CL_MeshEntities_Init(void) CL_UpdateRenderEntity(&ent->render); } cl_meshentities[MESH_UI].render.flags = RENDER_NOSELFSHADOW; - R_RegisterModule("cl_meshentities", CL_MeshEntities_Restart, CL_MeshEntities_Restart, CL_MeshEntities_Restart, CL_MeshEntities_Restart, CL_MeshEntities_Restart); + R_RegisterModule("cl_meshentities", CL_MeshEntities_Start, CL_MeshEntities_Shutdown, CL_MeshEntities_Restart, CL_MeshEntities_Restart, CL_MeshEntities_Restart); } void CL_MeshEntities_Scene_Clear(void) @@ -2552,10 +2607,6 @@ void CL_MeshEntities_Scene_FinalizeRenderEntity(void) VectorCopy(ent->render.model->normalmaxs, ent->render.maxs); } -static void CL_MeshEntities_Shutdown(void) -{ -} - extern cvar_t r_overheadsprites_pushback; extern cvar_t r_fullbright_directed_pitch_relative; extern cvar_t r_fullbright_directed_pitch; @@ -2751,7 +2802,6 @@ double CL_Frame (double time) static double clframetime; static double cl_timer = 0; static double time1 = 0, time2 = 0, time3 = 0; - static double wait; int pass1, pass2, pass3; CL_VM_PreventInformationLeaks(); @@ -2794,9 +2844,8 @@ double CL_Frame (double time) { clframetime = cl.realframetime = max(cl_timer, 1.0 / cl_maxfps.value); // when running slow, we need to sleep to keep input responsive - wait = bound(0, cl_maxfps_alwayssleep.value * 1000, 100000); - if (wait > 0) - Sys_Sleep((int)wait); + if (cl_maxfps_alwayssleep.value > 0) + Sys_Sleep((int)bound(0, cl_maxfps_alwayssleep.value * 1000, 100000)); } else if (!vid_activewindow && cl_maxidlefps.value >= 1 && !cls.timedemo) clframetime = cl.realframetime = max(cl_timer, 1.0 / cl_maxidlefps.value); @@ -3084,8 +3133,10 @@ void CL_Init (void) CL_Video_Init(); + NetConn_UpdateSockets_Client(); + host.hook.ConnectLocal = CL_EstablishConnection_Local; - host.hook.Disconnect = CL_Disconnect; + host.hook.Disconnect = CL_DisconnectEx; host.hook.CL_Intermission = CL_Intermission; host.hook.ToggleMenu = CL_ToggleMenu_Hook; }