//This shuts down both the client and server void Host_Error (char *error, ...) { va_list argptr; char string[1024]; static qbool inerror = false; if (inerror) Sys_Error ("Host_Error: recursively entered"); inerror = true; va_start (argptr,error); vsnprintf (string, sizeof(string), error, argptr); va_end (argptr); Com_Printf ("\n===========================\n"); Com_Printf ("Host_Error: %s\n",string); Com_Printf ("===========================\n\n"); SV_Shutdown (va("server crashed: %s\n", string)); CL_Disconnect (); if (!host_initialized) Sys_Error ("Host_Error: %s", string); inerror = false; Host_Abort (); }
/* ================ Host_Error This shuts down both the client and server ================ */ void Host_Error (char *error, ...) { va_list argptr; char string[1024]; static qbool inerror = false; if (inerror) Sys_Error ("Host_Error: recursively entered"); inerror = true; Com_EndRedirect (); SCR_EndLoadingPlaque (); va_start (argptr,error); #ifdef _WIN32 _vsnprintf (string, sizeof(string) - 1, error, argptr); string[sizeof(string) - 1] = '\0'; #else vsnprintf (string, sizeof(string), error, argptr); #endif // _WIN32 va_end (argptr); Com_Printf ("\n===========================\n"); Com_Printf ("Host_Error: %s\n",string); Com_Printf ("===========================\n\n"); SV_Shutdown (va("server crashed: %s\n", string)); CL_Disconnect (); CL_HandleHostError (); // stop demo loop if (dedicated) { NET_Shutdown (); COM_Shutdown (); Sys_Error ("%s", string); } if (!host_initialized) Sys_Error ("Host_Error: %s", string); inerror = false; Host_Abort (); }
void CLNQ_ParseServerMessage (void) { int cmd; int i; qbool message_with_datagram; // hack to fix glitches when receiving a packet // without a datagram nq_player_teleported = false; // OMG, it's a hack! message_with_datagram = false; cl_entframecount++; if (cl_shownet.value == 1) Com_Printf ("%i ", net_message.cursize); else if (cl_shownet.value == 2) Com_Printf ("------------------\n"); cl.onground = false; // unless the server says otherwise // // parse the message // //MSG_BeginReading (); while (1) { if (msg_badread) Host_Error ("CL_ParseServerMessage: Bad server message"); cmd = MSG_ReadByte (); if (cmd == -1) { SHOWNET("END OF MESSAGE"); if (!message_with_datagram) { cl_entframecount--; } else { VectorCopy (nq_mviewangles[0], nq_mviewangles[1]); VectorCopy (nq_mviewangles_temp, nq_mviewangles[0]); } return; // end of message } // if the high bit of the command byte is set, it is a fast update if (cmd & 128) { SHOWNET("fast update"); NQD_ParseUpdate (cmd&127); continue; } if (cmd < num_svc_strings) SHOWNET(svc_strings[cmd]); // other commands switch (cmd) { default: Host_Error ("CL_ParseServerMessage: Illegible server message"); break; case svc_nop: break; case nq_svc_time: nq_mtime[1] = nq_mtime[0]; nq_mtime[0] = MSG_ReadFloat (); cl.servertime = nq_mtime[0]; message_with_datagram = true; break; case nq_svc_clientdata: i = MSG_ReadShort (); NQD_ParseClientdata (i); break; case nq_svc_version: i = MSG_ReadLong (); if (i != NQ_PROTOCOL_VERSION) Host_Error ("CL_ParseServerMessage: Server is protocol %i instead of %i\n", i, NQ_PROTOCOL_VERSION); break; case svc_disconnect: Com_Printf ("\n======== End of demo ========\n\n"); CL_NextDemo (); Host_EndGame (); Host_Abort (); break; case svc_print: NQD_ParsePrint (); break; case svc_centerprint: SCR_CenterPrint (MSG_ReadString ()); break; case svc_stufftext: NQD_ParseStufftext (); break; case svc_damage: V_ParseDamage (); break; case svc_serverdata: NQD_ParseServerData (); break; case svc_setangle: for (i=0 ; i<3 ; i++) nq_last_fixangle[i] = cl.simangles[i] = cl.viewangles[i] = MSG_ReadAngle (); break; case svc_setview: nq_viewentity = MSG_ReadShort (); if (nq_viewentity <= nq_maxclients) cl.playernum = nq_viewentity - 1; else { // just let cl.playernum stay where it was } break; case svc_lightstyle: i = MSG_ReadByte (); if (i >= MAX_LIGHTSTYLES) Sys_Error ("svc_lightstyle > MAX_LIGHTSTYLES"); strlcpy (cl_lightstyle[i].map, MSG_ReadString(), sizeof(cl_lightstyle[0].map)); cl_lightstyle[i].length = strlen(cl_lightstyle[i].map); break; case svc_sound: NQD_ParseStartSoundPacket(); break; case svc_stopsound: i = MSG_ReadShort(); S_StopSound(i>>3, i&7); break; case nq_svc_updatename: Sbar_Changed (); i = MSG_ReadByte (); if (i >= nq_maxclients) Host_Error ("CL_ParseServerMessage: svc_updatename > NQ_MAX_CLIENTS"); strlcpy (cl.players[i].name, MSG_ReadString(), sizeof(cl.players[i].name)); break; case svc_updatefrags: Sbar_Changed (); i = MSG_ReadByte (); if (i >= nq_maxclients) Host_Error ("CL_ParseServerMessage: svc_updatefrags > NQ_MAX_CLIENTS"); cl.players[i].frags = MSG_ReadShort(); break; case nq_svc_updatecolors: NQD_ParseUpdatecolors (); break; case nq_svc_particle: CL_ParseParticleEffect (); break; case svc_spawnbaseline: i = MSG_ReadShort (); if (i >= NQ_MAX_EDICTS) Host_Error ("svc_spawnbaseline: ent > MAX_EDICTS"); NQD_BumpEntityCount (i); CL_ParseBaseline (&cl_entities[i].baseline); break; case svc_spawnstatic: CL_ParseStatic (); break; case svc_temp_entity: CL_ParseTEnt (); break; case svc_setpause: if (MSG_ReadByte() != 0) cl.paused |= PAUSED_SERVER; else cl.paused &= ~PAUSED_SERVER; if (cl.paused) CDAudio_Pause (); else CDAudio_Resume (); break; case nq_svc_signonnum: i = MSG_ReadByte (); if (i <= nq_signon) Host_Error ("Received signon %i when at %i", i, nq_signon); nq_signon = i; CLNQ_SignonReply (); break; case svc_killedmonster: cl.stats[STAT_MONSTERS]++; break; case svc_foundsecret: cl.stats[STAT_SECRETS]++; break; case svc_updatestat: i = MSG_ReadByte (); if (i < 0 || i >= MAX_CL_STATS) Sys_Error ("svc_updatestat: %i is invalid", i); cl.stats[i] = MSG_ReadLong ();; break; case svc_spawnstaticsound: CL_ParseStaticSound (); break; case svc_cdtrack: cl.cdtrack = MSG_ReadByte (); MSG_ReadByte(); // loop track (unused) if (nq_forcecdtrack != -1) CDAudio_Play ((byte)nq_forcecdtrack, true); else CDAudio_Play ((byte)cl.cdtrack, true); break; case svc_intermission: cl.intermission = 1; cl.completed_time = cl.time; VectorCopy (nq_last_fixangle, cl.simangles); break; case svc_finale: cl.intermission = 2; cl.completed_time = cl.time; SCR_CenterPrint (MSG_ReadString ()); VectorCopy (nq_last_fixangle, cl.simangles); break; case nq_svc_cutscene: cl.intermission = 3; cl.completed_time = cl.time; SCR_CenterPrint (MSG_ReadString ()); VectorCopy (nq_last_fixangle, cl.simangles); break; case svc_sellscreen: break; } } }