public static Int32 ParseEntityBits(Int32[] bits) { Int32 b, total; Int32 i; Int32 number; total = MSG.ReadByte(Globals.net_message); if ((total & Defines.U_MOREBITS1) != 0) { b = MSG.ReadByte(Globals.net_message); total |= b << 8; } if ((total & Defines.U_MOREBITS2) != 0) { b = MSG.ReadByte(Globals.net_message); total |= b << 16; } if ((total & Defines.U_MOREBITS3) != 0) { b = MSG.ReadByte(Globals.net_message); total |= b << 24; } for (i = 0; i < 32; i++) { if ((total & (1 << i)) != 0) { bitcounts[i]++; } } if ((total & Defines.U_NUMBER16) != 0) { number = MSG.ReadShort(Globals.net_message); } else { number = MSG.ReadByte(Globals.net_message); } bits[0] = total; return(number); }
public static void ParseServerData( ) { Com.DPrintf("ParseServerData():Serverdata packet received.\\n"); CL.ClearState(); Globals.cls.state = Defines.ca_connected; var i = MSG.ReadLong(Globals.net_message); Globals.cls.serverProtocol = i; if (Globals.server_state != 0 && Defines.PROTOCOL_VERSION == 34) { } else if (i != Defines.PROTOCOL_VERSION) { Com.Error(Defines.ERR_DROP, "Server returned version " + i + ", not " + Defines.PROTOCOL_VERSION); } Globals.cl.servercount = MSG.ReadLong(Globals.net_message); Globals.cl.attractloop = MSG.ReadByte(Globals.net_message) != 0; var str = MSG.ReadString(Globals.net_message); Globals.cl.gamedir = str; Com.Dprintln("gamedir=" + str); if (str.Length > 0 && (FS.fs_gamedirvar.string_renamed == null || FS.fs_gamedirvar.string_renamed.Length == 0 || FS.fs_gamedirvar.string_renamed.Equals(str)) || (str.Length == 0 && (FS.fs_gamedirvar.string_renamed != null || FS.fs_gamedirvar.string_renamed.Length == 0))) { Cvar.Set("game", str); } Globals.cl.playernum = MSG.ReadShort(Globals.net_message); Com.Dprintln("numplayers=" + Globals.cl.playernum); str = MSG.ReadString(Globals.net_message); Com.Dprintln("levelname=" + str); if (Globals.cl.playernum == -1) { SCR.PlayCinematic(str); } else { Com.Printf("Levelname:" + str + "\\n"); Globals.cl.refresh_prepped = false; } }
public static void ParseServerMessage( ) { while (true) { if (Globals.net_message.readcount > Globals.net_message.cursize) { Com.Error(Defines.ERR_FATAL, "CL_ParseServerMessage: Bad server message:"); break; } var cmd = MSG.ReadByte(Globals.net_message); if (cmd == -1) { SHOWNET("END OF MESSAGE"); break; } if (Globals.cl_shownet.value >= 2) { if (null == svc_strings[cmd]) { Com.Printf(Globals.net_message.readcount - 1 + ":BAD CMD " + cmd + "\\n"); } else { SHOWNET(svc_strings[cmd]); } } switch (cmd) { default: Com.Error(Defines.ERR_DROP, "CL_ParseServerMessage: Illegible server message\\n"); break; case Defines.svc_nop: break; case Defines.svc_disconnect: Com.Error(Defines.ERR_DISCONNECT, "Server disconnected\\n"); break; case Defines.svc_reconnect: Com.Printf("Server disconnected, reconnecting\\n"); if (Globals.cls.download != null) { try { Globals.cls.download.Close(); } catch (IOException e) { } Globals.cls.download = null; } Globals.cls.state = Defines.ca_connecting; Globals.cls.connect_time = -99999; break; case Defines.svc_print: var i = MSG.ReadByte(Globals.net_message); if (i == Defines.PRINT_CHAT) { S.StartLocalSound("misc/talk.wav"); Globals.con.ormask = 128; } Com.Printf(MSG.ReadString(Globals.net_message)); Globals.con.ormask = 0; break; case Defines.svc_centerprint: SCR.CenterPrint(MSG.ReadString(Globals.net_message)); break; case Defines.svc_stufftext: var s = MSG.ReadString(Globals.net_message); Com.DPrintf("stufftext: " + s + "\\n"); Cbuf.AddText(s); break; case Defines.svc_serverdata: Cbuf.Execute(); ParseServerData(); break; case Defines.svc_configstring: ParseConfigString(); break; case Defines.svc_sound: ParseStartSoundPacket(); break; case Defines.svc_spawnbaseline: ParseBaseline(); break; case Defines.svc_temp_entity: CL_tent.ParseTEnt(); break; case Defines.svc_muzzleflash: CL_fx.ParseMuzzleFlash(); break; case Defines.svc_muzzleflash2: CL_fx.ParseMuzzleFlash2(); break; case Defines.svc_download: ParseDownload(); break; case Defines.svc_frame: CL_ents.ParseFrame(); break; case Defines.svc_inventory: CL_inv.ParseInventory(); break; case Defines.svc_layout: Globals.cl.layout = MSG.ReadString(Globals.net_message); break; case Defines.svc_playerinfo: case Defines.svc_packetentities: case Defines.svc_deltapacketentities: Com.Error(Defines.ERR_DROP, "Out of place frame data"); break; } } CL_view.AddNetgraph(); if (Globals.cls.demorecording && !Globals.cls.demowaiting) { CL.WriteDemoMessage(); } }
public static void ParseStartSoundPacket( ) { var flags = MSG.ReadByte(Globals.net_message); var sound_num = MSG.ReadByte(Globals.net_message); Single volume; if ((flags & Defines.SND_VOLUME) != 0) { volume = MSG.ReadByte(Globals.net_message) / 255F; } else { volume = Defines.DEFAULT_SOUND_PACKET_VOLUME; } Single attenuation; if ((flags & Defines.SND_ATTENUATION) != 0) { attenuation = MSG.ReadByte(Globals.net_message) / 64F; } else { attenuation = Defines.DEFAULT_SOUND_PACKET_ATTENUATION; } Single ofs; if ((flags & Defines.SND_OFFSET) != 0) { ofs = MSG.ReadByte(Globals.net_message) / 1000F; } else { ofs = 0; } Int32 channel; Int32 ent; if ((flags & Defines.SND_ENT) != 0) { channel = MSG.ReadShort(Globals.net_message); ent = channel >> 3; if (ent > Defines.MAX_EDICTS) { Com.Error(Defines.ERR_DROP, "CL_ParseStartSoundPacket: ent = " + ent); } channel &= 7; } else { ent = 0; channel = 0; } Single[] pos; if ((flags & Defines.SND_POS) != 0) { MSG.ReadPos(Globals.net_message, pos_v); pos = pos_v; } else { pos = null; } if (null == Globals.cl.sound_precache[sound_num]) { return; } S.StartSound(pos, ent, channel, Globals.cl.sound_precache[sound_num], volume, attenuation, ofs); }
public static void ParseDownload( ) { Int32 size = MSG.ReadShort(Globals.net_message); var percent = MSG.ReadByte(Globals.net_message); if (size == -1) { Com.Printf("Server does not have this file.\\n"); if (Globals.cls.download != null) { try { Globals.cls.download.Close(); } catch (IOException e) { } Globals.cls.download = null; } CL.RequestNextDownload(); return; } if (Globals.cls.download == null) { var name = DownloadFileName(Globals.cls.downloadtempname).ToLower(); FS.CreatePath(name); Globals.cls.download = new QuakeFile(name, FileAccess.ReadWrite); if (Globals.cls.download == null) { Globals.net_message.readcount += size; Com.Printf("Failed to open " + Globals.cls.downloadtempname + "\\n"); CL.RequestNextDownload(); return; } } try { Globals.cls.download.Write(Globals.net_message.data, Globals.net_message.readcount, size); } catch (Exception e) { } Globals.net_message.readcount += size; if (percent != 100) { Globals.cls.downloadpercent = percent; MSG.WriteByte(Globals.cls.netchan.message, Defines.clc_stringcmd); SZ.Print(Globals.cls.netchan.message, "nextdl"); } else { try { Globals.cls.download.Close(); } catch (IOException e) { } var oldn = DownloadFileName(Globals.cls.downloadtempname); var newn = DownloadFileName(Globals.cls.downloadname); var r = Lib.Rename(oldn, newn); if (r != 0) { Com.Printf("failed to rename.\\n"); } Globals.cls.download = null; Globals.cls.downloadpercent = 0; CL.RequestNextDownload(); } }
/* * ===================================================================== * * SERVER CONNECTING MESSAGES * * ===================================================================== */ /* * ================== CL_ParseServerData ================== */ //checked once, was ok. public static void ParseServerData() { Com.DPrintf("ParseServerData():Serverdata packet received.\n"); // // wipe the client_state_t struct // Cl.ClearState(); Globals.cls.state = Defines.ca_connected; // parse protocol version number var i = MSG.ReadLong(Globals.net_message); Globals.cls.serverProtocol = i; // BIG HACK to let demos from release work with the 3.0x patch!!! if (Globals.server_state != 0 && Defines.PROTOCOL_VERSION == 34) { } else if (i != Defines.PROTOCOL_VERSION) { Com.Error(Defines.ERR_DROP, "Server returned version " + i + ", not " + Defines.PROTOCOL_VERSION); } Globals.cl.servercount = MSG.ReadLong(Globals.net_message); Globals.cl.attractloop = MSG.ReadByte(Globals.net_message) != 0; // game directory var str = MSG.ReadString(Globals.net_message); Globals.cl.gamedir = str; Com.dprintln("gamedir=" + str); // set gamedir if ((str.Length > 0 && (FS.fs_gamedirvar.@string == null || [email protected] == 0 || [email protected](str))) || (str.Length == 0 && (FS.fs_gamedirvar.@string != null || [email protected] == 0))) { Cvar.Set("game", str); } // parse player entity number Globals.cl.playernum = MSG.ReadShort(Globals.net_message); Com.dprintln("numplayers=" + Globals.cl.playernum); // get the full level name str = MSG.ReadString(Globals.net_message); Com.dprintln("levelname=" + str); if (Globals.cl.playernum == -1) { // playing a cinematic or showing a // pic, not a level SCR.PlayCinematic(str); } else { // seperate the printfs so the server message can have a color // Com.Printf( // "\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); // Com.Printf('\02' + str + "\n"); Com.Printf("Levelname:" + str + "\n"); // need to prep refresh at next oportunity Globals.cl.refresh_prepped = false; } }
/* * ===================== CL_ParseDownload * * A download message has been received from the server * ===================== */ public static void ParseDownload() { // read the data int size = MSG.ReadShort(Globals.net_message); var percent = MSG.ReadByte(Globals.net_message); if (size == -1) { Com.Printf("Server does not have this file.\n"); if (Globals.cls.download != null) { // if here, we tried to resume a file but the server said no try { Globals.cls.download.Close(); } catch (IOException) { } Globals.cls.download = null; } Cl.RequestNextDownload(); return; } // open the file if not opened yet if (Globals.cls.download == null) { var name = CL_parse.DownloadFileName(Globals.cls.downloadtempname).ToLower(); FS.CreatePath(name); Globals.cls.download = File.OpenWrite(name); if (Globals.cls.download == null) { Globals.net_message.readcount += size; Com.Printf("Failed to open " + Globals.cls.downloadtempname + "\n"); Cl.RequestNextDownload(); return; } } try { Globals.cls.download.Write(Globals.net_message.data, Globals.net_message.readcount, size); } catch (Exception) { } Globals.net_message.readcount += size; if (percent != 100) { // request next block // change display routines by zoid Globals.cls.downloadpercent = percent; MSG.WriteByte(Globals.cls.netchan.message, Defines.clc_stringcmd); SZ.Print(Globals.cls.netchan.message, "nextdl"); } else { try { Globals.cls.download.Close(); } catch (IOException) { } // rename the temp file to it's final name var oldn = CL_parse.DownloadFileName(Globals.cls.downloadtempname); var newn = CL_parse.DownloadFileName(Globals.cls.downloadname); File.Move(oldn, newn); Globals.cls.download = null; Globals.cls.downloadpercent = 0; // get another file if needed Cl.RequestNextDownload(); } }
public static void ParseDelta(entity_state_t from, entity_state_t to, Int32 number, Int32 bits) { to.Set(from); Math3D.VectorCopy(from.origin, to.old_origin); to.number = number; if ((bits & Defines.U_MODEL) != 0) { to.modelindex = MSG.ReadByte(Globals.net_message); } if ((bits & Defines.U_MODEL2) != 0) { to.modelindex2 = MSG.ReadByte(Globals.net_message); } if ((bits & Defines.U_MODEL3) != 0) { to.modelindex3 = MSG.ReadByte(Globals.net_message); } if ((bits & Defines.U_MODEL4) != 0) { to.modelindex4 = MSG.ReadByte(Globals.net_message); } if ((bits & Defines.U_FRAME8) != 0) { to.frame = MSG.ReadByte(Globals.net_message); } if ((bits & Defines.U_FRAME16) != 0) { to.frame = MSG.ReadShort(Globals.net_message); } if ((bits & Defines.U_SKIN8) != 0 && (bits & Defines.U_SKIN16) != 0) { to.skinnum = MSG.ReadLong(Globals.net_message); } else if ((bits & Defines.U_SKIN8) != 0) { to.skinnum = MSG.ReadByte(Globals.net_message); } else if ((bits & Defines.U_SKIN16) != 0) { to.skinnum = MSG.ReadShort(Globals.net_message); } if ((bits & (Defines.U_EFFECTS8 | Defines.U_EFFECTS16)) == (Defines.U_EFFECTS8 | Defines.U_EFFECTS16)) { to.effects = MSG.ReadLong(Globals.net_message); } else if ((bits & Defines.U_EFFECTS8) != 0) { to.effects = MSG.ReadByte(Globals.net_message); } else if ((bits & Defines.U_EFFECTS16) != 0) { to.effects = MSG.ReadShort(Globals.net_message); } if ((bits & (Defines.U_RENDERFX8 | Defines.U_RENDERFX16)) == (Defines.U_RENDERFX8 | Defines.U_RENDERFX16)) { to.renderfx = MSG.ReadLong(Globals.net_message); } else if ((bits & Defines.U_RENDERFX8) != 0) { to.renderfx = MSG.ReadByte(Globals.net_message); } else if ((bits & Defines.U_RENDERFX16) != 0) { to.renderfx = MSG.ReadShort(Globals.net_message); } if ((bits & Defines.U_ORIGIN1) != 0) { to.origin[0] = MSG.ReadCoord(Globals.net_message); } if ((bits & Defines.U_ORIGIN2) != 0) { to.origin[1] = MSG.ReadCoord(Globals.net_message); } if ((bits & Defines.U_ORIGIN3) != 0) { to.origin[2] = MSG.ReadCoord(Globals.net_message); } if ((bits & Defines.U_ANGLE1) != 0) { to.angles[0] = MSG.ReadAngle(Globals.net_message); } if ((bits & Defines.U_ANGLE2) != 0) { to.angles[1] = MSG.ReadAngle(Globals.net_message); } if ((bits & Defines.U_ANGLE3) != 0) { to.angles[2] = MSG.ReadAngle(Globals.net_message); } if ((bits & Defines.U_OLDORIGIN) != 0) { MSG.ReadPos(Globals.net_message, to.old_origin); } if ((bits & Defines.U_SOUND) != 0) { to.sound = MSG.ReadByte(Globals.net_message); } if ((bits & Defines.U_EVENT) != 0) { to.event_renamed = MSG.ReadByte(Globals.net_message); } else { to.event_renamed = 0; } if ((bits & Defines.U_SOLID) != 0) { to.solid = MSG.ReadShort(Globals.net_message); } }
public static void ParseFrame( ) { Int32 cmd; Int32 len; frame_t old; Globals.cl.frame.Reset(); Globals.cl.frame.serverframe = MSG.ReadLong(Globals.net_message); Globals.cl.frame.deltaframe = MSG.ReadLong(Globals.net_message); Globals.cl.frame.servertime = Globals.cl.frame.serverframe * 100; if (Globals.cls.serverProtocol != 26) { Globals.cl.surpressCount = MSG.ReadByte(Globals.net_message); } if (Globals.cl_shownet.value == 3) { Com.Printf(" frame:" + Globals.cl.frame.serverframe + " delta:" + Globals.cl.frame.deltaframe + "\\n"); } if (Globals.cl.frame.deltaframe <= 0) { Globals.cl.frame.valid = true; old = null; Globals.cls.demowaiting = false; } else { old = Globals.cl.frames[Globals.cl.frame.deltaframe & Defines.UPDATE_MASK]; if (!old.valid) { Com.Printf("Delta from invalid frame (not supposed to happen!).\\n"); } if (old.serverframe != Globals.cl.frame.deltaframe) { Com.Printf("Delta frame too old.\\n"); } else if (Globals.cl.parse_entities - old.parse_entities > Defines.MAX_PARSE_ENTITIES - 128) { Com.Printf("Delta parse_entities too old.\\n"); } else { Globals.cl.frame.valid = true; } } if (Globals.cl.time > Globals.cl.frame.servertime) { Globals.cl.time = Globals.cl.frame.servertime; } else if (Globals.cl.time < Globals.cl.frame.servertime - 100) { Globals.cl.time = Globals.cl.frame.servertime - 100; } len = MSG.ReadByte(Globals.net_message); MSG.ReadData(Globals.net_message, Globals.cl.frame.areabits, len); cmd = MSG.ReadByte(Globals.net_message); CL_parse.SHOWNET(CL_parse.svc_strings[cmd]); if (cmd != Defines.svc_playerinfo) { Com.Error(Defines.ERR_DROP, "CL_ParseFrame: not playerinfo"); } ParsePlayerstate(old, Globals.cl.frame); cmd = MSG.ReadByte(Globals.net_message); CL_parse.SHOWNET(CL_parse.svc_strings[cmd]); if (cmd != Defines.svc_packetentities) { Com.Error(Defines.ERR_DROP, "CL_ParseFrame: not packetentities"); } ParsePacketEntities(old, Globals.cl.frame); Globals.cl.frames[Globals.cl.frame.serverframe & Defines.UPDATE_MASK].Set(Globals.cl.frame); if (Globals.cl.frame.valid) { if (Globals.cls.state != Defines.ca_active) { Globals.cls.state = Defines.ca_active; Globals.cl.force_refdef = true; Globals.cl.predicted_origin[0] = Globals.cl.frame.playerstate.pmove.origin[0] * 0.125F; Globals.cl.predicted_origin[1] = Globals.cl.frame.playerstate.pmove.origin[1] * 0.125F; Globals.cl.predicted_origin[2] = Globals.cl.frame.playerstate.pmove.origin[2] * 0.125F; Math3D.VectorCopy(Globals.cl.frame.playerstate.viewangles, Globals.cl.predicted_angles); if (Globals.cls.disable_servercount != Globals.cl.servercount && Globals.cl.refresh_prepped) { SCR.EndLoadingPlaque(); } } Globals.cl.sound_prepped = true; FireEntityEvents(Globals.cl.frame); CL_pred.CheckPredictionError(); } }
public static void ParsePlayerstate(frame_t oldframe, frame_t newframe) { Int32 flags; player_state_t state; Int32 i; Int32 statbits; state = newframe.playerstate; if (oldframe != null) { state.Set(oldframe.playerstate); } else { state.Clear(); } flags = MSG.ReadShort(Globals.net_message); if ((flags & Defines.PS_M_TYPE) != 0) { state.pmove.pm_type = MSG.ReadByte(Globals.net_message); } if ((flags & Defines.PS_M_ORIGIN) != 0) { state.pmove.origin[0] = MSG.ReadShort(Globals.net_message); state.pmove.origin[1] = MSG.ReadShort(Globals.net_message); state.pmove.origin[2] = MSG.ReadShort(Globals.net_message); } if ((flags & Defines.PS_M_VELOCITY) != 0) { state.pmove.velocity[0] = MSG.ReadShort(Globals.net_message); state.pmove.velocity[1] = MSG.ReadShort(Globals.net_message); state.pmove.velocity[2] = MSG.ReadShort(Globals.net_message); } if ((flags & Defines.PS_M_TIME) != 0) { state.pmove.pm_time = ( Byte )MSG.ReadByte(Globals.net_message); } if ((flags & Defines.PS_M_FLAGS) != 0) { state.pmove.pm_flags = ( Byte )MSG.ReadByte(Globals.net_message); } if ((flags & Defines.PS_M_GRAVITY) != 0) { state.pmove.gravity = MSG.ReadShort(Globals.net_message); } if ((flags & Defines.PS_M_DELTA_ANGLES) != 0) { state.pmove.delta_angles[0] = MSG.ReadShort(Globals.net_message); state.pmove.delta_angles[1] = MSG.ReadShort(Globals.net_message); state.pmove.delta_angles[2] = MSG.ReadShort(Globals.net_message); } if (Globals.cl.attractloop) { state.pmove.pm_type = Defines.PM_FREEZE; } if ((flags & Defines.PS_VIEWOFFSET) != 0) { state.viewoffset[0] = MSG.ReadChar(Globals.net_message) * 0.25F; state.viewoffset[1] = MSG.ReadChar(Globals.net_message) * 0.25F; state.viewoffset[2] = MSG.ReadChar(Globals.net_message) * 0.25F; } if ((flags & Defines.PS_VIEWANGLES) != 0) { state.viewangles[0] = MSG.ReadAngle16(Globals.net_message); state.viewangles[1] = MSG.ReadAngle16(Globals.net_message); state.viewangles[2] = MSG.ReadAngle16(Globals.net_message); } if ((flags & Defines.PS_KICKANGLES) != 0) { state.kick_angles[0] = MSG.ReadChar(Globals.net_message) * 0.25F; state.kick_angles[1] = MSG.ReadChar(Globals.net_message) * 0.25F; state.kick_angles[2] = MSG.ReadChar(Globals.net_message) * 0.25F; } if ((flags & Defines.PS_WEAPONINDEX) != 0) { state.gunindex = MSG.ReadByte(Globals.net_message); } if ((flags & Defines.PS_WEAPONFRAME) != 0) { state.gunframe = MSG.ReadByte(Globals.net_message); state.gunoffset[0] = MSG.ReadChar(Globals.net_message) * 0.25F; state.gunoffset[1] = MSG.ReadChar(Globals.net_message) * 0.25F; state.gunoffset[2] = MSG.ReadChar(Globals.net_message) * 0.25F; state.gunangles[0] = MSG.ReadChar(Globals.net_message) * 0.25F; state.gunangles[1] = MSG.ReadChar(Globals.net_message) * 0.25F; state.gunangles[2] = MSG.ReadChar(Globals.net_message) * 0.25F; } if ((flags & Defines.PS_BLEND) != 0) { state.blend[0] = MSG.ReadByte(Globals.net_message) / 255F; state.blend[1] = MSG.ReadByte(Globals.net_message) / 255F; state.blend[2] = MSG.ReadByte(Globals.net_message) / 255F; state.blend[3] = MSG.ReadByte(Globals.net_message) / 255F; } if ((flags & Defines.PS_FOV) != 0) { state.fov = MSG.ReadByte(Globals.net_message); } if ((flags & Defines.PS_RDFLAGS) != 0) { state.rdflags = MSG.ReadByte(Globals.net_message); } statbits = MSG.ReadLong(Globals.net_message); for (i = 0; i < Defines.MAX_STATS; i++) { if ((statbits & (1 << i)) != 0) { state.stats[i] = MSG.ReadShort(Globals.net_message); } } }
public static void SV_ExecuteClientMessage(client_t cl) { Int32 c; String s; usercmd_t nullcmd = new usercmd_t(); usercmd_t oldest = new usercmd_t(), oldcmd = new usercmd_t(), newcmd = new usercmd_t(); Int32 net_drop; Int32 stringCmdCount; Int32 checksum, calculatedChecksum; Int32 checksumIndex; Boolean move_issued; Int32 lastframe; SV_MAIN.sv_client = cl; SV_USER.sv_player = SV_MAIN.sv_client.edict; move_issued = false; stringCmdCount = 0; while (true) { if (Globals.net_message.readcount > Globals.net_message.cursize) { Com.Printf("SV_ReadClientMessage: bad read:\\n"); Com.Printf(Lib.HexDump(Globals.net_message.data, 32, false)); SV_MAIN.SV_DropClient(cl); return; } c = MSG.ReadByte(Globals.net_message); if (c == -1) { break; } switch (c) { default: Com.Printf("SV_ReadClientMessage: unknown command char\\n"); SV_MAIN.SV_DropClient(cl); return; case Defines.clc_nop: break; case Defines.clc_userinfo: cl.userinfo = MSG.ReadString(Globals.net_message); SV_MAIN.SV_UserinfoChanged(cl); break; case Defines.clc_move: if (move_issued) { return; } move_issued = true; checksumIndex = Globals.net_message.readcount; checksum = MSG.ReadByte(Globals.net_message); lastframe = MSG.ReadLong(Globals.net_message); if (lastframe != cl.lastframe) { cl.lastframe = lastframe; if (cl.lastframe > 0) { cl.frame_latency[cl.lastframe & (Defines.LATENCY_COUNTS - 1)] = SV_INIT.svs.realtime - cl.frames[cl.lastframe & Defines.UPDATE_MASK].senttime; } } nullcmd = new usercmd_t(); MSG.ReadDeltaUsercmd(Globals.net_message, nullcmd, oldest); MSG.ReadDeltaUsercmd(Globals.net_message, oldest, oldcmd); MSG.ReadDeltaUsercmd(Globals.net_message, oldcmd, newcmd); if (cl.state != Defines.cs_spawned) { cl.lastframe = -1; break; } calculatedChecksum = Com.BlockSequenceCRCByte(Globals.net_message.data, checksumIndex + 1, Globals.net_message.readcount - checksumIndex - 1, cl.netchan.incoming_sequence); if ((calculatedChecksum & 0xff) != checksum) { Com.DPrintf("Failed command checksum for " + cl.name + " (" + calculatedChecksum + " != " + checksum + ")/" + cl.netchan.incoming_sequence + "\\n"); return; } if (0 == SV_MAIN.sv_paused.value) { net_drop = cl.netchan.dropped; if (net_drop < 20) { while (net_drop > 2) { SV_ClientThink(cl, cl.lastcmd); net_drop--; } if (net_drop > 1) { SV_ClientThink(cl, oldest); } if (net_drop > 0) { SV_ClientThink(cl, oldcmd); } } SV_ClientThink(cl, newcmd); } cl.lastcmd.Set(newcmd); break; case Defines.clc_stringcmd: s = MSG.ReadString(Globals.net_message); if (++stringCmdCount < SV_USER.MAX_STRINGCMDS) { SV_ExecuteUserCommand(s); } if (cl.state == Defines.cs_zombie) { return; } break; } } }