X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=common.c;h=4d9c9d556f8bc4f11eaa976eb6e2e9010e562bc2;hp=c3ae64b09e787a1d55726b1a494bfb6787885422;hb=b1d01581aaa6e22fef1d66f8e4526b2125a00343;hpb=57252d1b300d96b2353bf9d564b0de281552d2c5 diff --git a/common.c b/common.c index c3ae64b0..4d9c9d55 100644 --- a/common.c +++ b/common.c @@ -123,6 +123,30 @@ float FloatNoSwap (float f) } #endif + +// Extract integers from buffers + +unsigned int BuffBigLong (const qbyte *buffer) +{ + return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; +} + +unsigned short BuffBigShort (const qbyte *buffer) +{ + return (buffer[0] << 8) | buffer[1]; +} + +unsigned int BuffLittleLong (const qbyte *buffer) +{ + return (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; +} + +unsigned short BuffLittleShort (const qbyte *buffer) +{ + return (buffer[1] << 8) | buffer[0]; +} + + /* ============================================================================== @@ -139,7 +163,7 @@ Handles byte ordering and avoids alignment errors void MSG_WriteChar (sizebuf_t *sb, int c) { qbyte *buf; - + buf = SZ_GetSpace (sb, 1); buf[0] = c; } @@ -147,7 +171,7 @@ void MSG_WriteChar (sizebuf_t *sb, int c) void MSG_WriteByte (sizebuf_t *sb, int c) { qbyte *buf; - + buf = SZ_GetSpace (sb, 1); buf[0] = c; } @@ -233,61 +257,81 @@ void MSG_BeginReading (void) msg_badread = false; } -int MSG_ReadShort (void) +int MSG_ReadLittleShort (void) { - int c; - if (msg_readcount+2 > net_message.cursize) { msg_badread = true; return -1; } - - c = (short)(net_message.data[msg_readcount] - + (net_message.data[msg_readcount+1]<<8)); - msg_readcount += 2; - - return c; + return (short)(net_message.data[msg_readcount-2] | (net_message.data[msg_readcount-1]<<8)); } -int MSG_ReadLong (void) +int MSG_ReadBigShort (void) { - int c; + if (msg_readcount+2 > net_message.cursize) + { + msg_badread = true; + return -1; + } + msg_readcount += 2; + return (short)((net_message.data[msg_readcount-2]<<8) + net_message.data[msg_readcount-1]); +} +int MSG_ReadLittleLong (void) +{ if (msg_readcount+4 > net_message.cursize) { msg_badread = true; return -1; } - - c = net_message.data[msg_readcount] - + (net_message.data[msg_readcount+1]<<8) - + (net_message.data[msg_readcount+2]<<16) - + (net_message.data[msg_readcount+3]<<24); - msg_readcount += 4; + return net_message.data[msg_readcount-4] | (net_message.data[msg_readcount-3]<<8) | (net_message.data[msg_readcount-2]<<16) | (net_message.data[msg_readcount-1]<<24); +} - return c; +int MSG_ReadBigLong (void) +{ + if (msg_readcount+4 > net_message.cursize) + { + msg_badread = true; + return -1; + } + msg_readcount += 4; + return (net_message.data[msg_readcount-4]<<24) + (net_message.data[msg_readcount-3]<<16) + (net_message.data[msg_readcount-2]<<8) + net_message.data[msg_readcount-1]; } -float MSG_ReadFloat (void) +float MSG_ReadLittleFloat (void) { union { - qbyte b[4]; float f; int l; } dat; - - dat.b[0] = net_message.data[msg_readcount]; - dat.b[1] = net_message.data[msg_readcount+1]; - dat.b[2] = net_message.data[msg_readcount+2]; - dat.b[3] = net_message.data[msg_readcount+3]; + if (msg_readcount+4 > net_message.cursize) + { + msg_badread = true; + return -1; + } msg_readcount += 4; + dat.l = net_message.data[msg_readcount-4] | (net_message.data[msg_readcount-3]<<8) | (net_message.data[msg_readcount-2]<<16) | (net_message.data[msg_readcount-1]<<24); + return dat.f; +} - dat.l = LittleLong (dat.l); - +float MSG_ReadBigFloat (void) +{ + union + { + float f; + int l; + } dat; + if (msg_readcount+4 > net_message.cursize) + { + msg_badread = true; + return -1; + } + msg_readcount += 4; + dat.l = (net_message.data[msg_readcount-4]<<24) | (net_message.data[msg_readcount-3]<<16) | (net_message.data[msg_readcount-2]<<8) | net_message.data[msg_readcount-1]; return dat.f; } @@ -295,37 +339,35 @@ char *MSG_ReadString (void) { static char string[2048]; int l,c; - - l = 0; - do - { - c = MSG_ReadChar (); - if (c == -1 || c == 0) - break; + for (l = 0;l < sizeof(string) - 1 && (c = MSG_ReadChar()) != -1 && c != 0;l++) string[l] = c; - l++; - } while (l < (int)sizeof(string)-1); - string[l] = 0; - return string; } +int MSG_ReadBytes (int numbytes, unsigned char *out) +{ + int l, c; + for (l = 0;l < numbytes && (c = MSG_ReadChar()) != -1;l++) + out[l] = c; + return l; +} + // used by server (always latest dpprotocol) float MSG_ReadDPCoord (void) { - return (signed short) MSG_ReadShort(); + return (signed short) MSG_ReadLittleShort(); } // used by client float MSG_ReadCoord (void) { if (dpprotocol == DPPROTOCOL_VERSION2 || dpprotocol == DPPROTOCOL_VERSION3) - return (signed short) MSG_ReadShort(); + return (signed short) MSG_ReadLittleShort(); else if (dpprotocol == DPPROTOCOL_VERSION1) - return MSG_ReadFloat(); + return MSG_ReadLittleFloat(); else - return MSG_ReadShort() * (1.0f/8.0f); + return MSG_ReadLittleShort() * (1.0f/8.0f); } @@ -628,8 +670,8 @@ void COM_InitGameType (void) if (strstr(name, "transfusion")) gamemode = GAME_TRANSFUSION; - else if (strstr(name, "nexiuz")) - gamemode = GAME_NEXIUZ; + else if (strstr(name, "nexuiz")) + gamemode = GAME_NEXUIZ; else if (strstr(name, "nehahra")) gamemode = GAME_NEHAHRA; else if (strstr(name, "hipnotic")) @@ -641,8 +683,8 @@ void COM_InitGameType (void) if (COM_CheckParm ("-transfusion")) gamemode = GAME_TRANSFUSION; - else if (COM_CheckParm ("-nexiuz")) - gamemode = GAME_NEXIUZ; + else if (COM_CheckParm ("-nexuiz")) + gamemode = GAME_NEXUIZ; else if (COM_CheckParm ("-nehahra")) gamemode = GAME_NEHAHRA; else if (COM_CheckParm ("-hipnotic")) @@ -670,8 +712,8 @@ void COM_InitGameType (void) gamename = "DarkPlaces-Nehahra"; gamedirname = "nehahra"; break; - case GAME_NEXIUZ: - gamename = "Nexiuz"; + case GAME_NEXUIZ: + gamename = "Nexuiz"; gamedirname = "data"; break; case GAME_TRANSFUSION: