void c_Network::ServerReceiveUserCmd( int ClientNum, void *UserCmdPacket, DWORD dwPacketSize ) { usercmd_t UserCmd[3]; int i, SnapshotNum; BYTE *in,*bfChanged; U8 U8ServerTimeDiff; int ServerTimeDiff; in = (BYTE*)UserCmdPacket; if(dwPacketSize<sizeof(int)+sizeof(usercmd_t)) { Error( ERR_NETWORK, va("Corrupt usercmd packet from client %d",ClientNum) ); return; } //Read in client's last received snapshot (used for delta-compression) SnapshotNum = *(int*)in; in += sizeof(int); memcpy( &UserCmd[0], in, sizeof(usercmd_t) ); in += sizeof(usercmd_t); DQGame.ClientThink( ClientNum, &UserCmd[0], SnapshotNum ); for(i=1; i<3; ++i) { //If there are no more bytes, return if((DWORD)in - (DWORD)UserCmdPacket>=dwPacketSize) { return; } //servertime U8ServerTimeDiff = *(U8*)in; ++in; if(U8ServerTimeDiff == 0xFF) { ServerTimeDiff = *(int*)in; in += sizeof(int); } else { ServerTimeDiff = (int)U8ServerTimeDiff; } UserCmd[i].serverTime = UserCmd[0].serverTime + ServerTimeDiff; //everything else bfChanged = in; ++in; ReadInt( 0x01, angles[0] ); ReadInt( 0x02, angles[1] ); ReadInt( 0x04, angles[2] ); ReadInt( 0x08, buttons ); ReadByte( 0x10, weapon ); ReadSignedChar( 0x20, forwardmove ); ReadSignedChar( 0x40, rightmove ); ReadSignedChar( 0x80, upmove ); DQGame.ClientThink( ClientNum, &UserCmd[i], SnapshotNum ); } }
/* ================= idRestoreGame::ReadUsercmd ================= */ void idRestoreGame::ReadUsercmd( usercmd_t& usercmd ) { ReadByte( usercmd.buttons ); ReadSignedChar( usercmd.forwardmove ); ReadSignedChar( usercmd.rightmove ); ReadShort( usercmd.angles[0] ); ReadShort( usercmd.angles[1] ); ReadShort( usercmd.angles[2] ); ReadShort( usercmd.mx ); ReadShort( usercmd.my ); ReadByte( usercmd.impulse ); ReadByte( usercmd.impulseSequence ); }
/* ================= idRestoreGame::ReadUsercmd ================= */ void idRestoreGame::ReadUsercmd( usercmd_t &usercmd ) { ReadInt( usercmd.gameFrame ); ReadInt( usercmd.gameTime ); ReadInt( usercmd.duplicateCount ); ReadByte( usercmd.buttons ); ReadSignedChar( usercmd.forwardmove ); ReadSignedChar( usercmd.rightmove ); ReadSignedChar( usercmd.upmove ); ReadShort( usercmd.angles[0] ); ReadShort( usercmd.angles[1] ); ReadShort( usercmd.angles[2] ); ReadShort( usercmd.mx ); ReadShort( usercmd.my ); ReadSignedChar( usercmd.impulse ); ReadByte( usercmd.flags ); ReadInt( usercmd.sequence ); }