From 18933366f4b198dc17b6d45d4e360efe1da1e43f Mon Sep 17 00:00:00 2001 From: skyjake Date: Tue, 16 Aug 2011 17:48:31 +0300 Subject: [PATCH] Refactoring network message reading and writing It now uses the reliable Reader and Writer classes. --- doomsday/engine/api/doomsday.h | 2 + doomsday/engine/api/reader.h | 6 + doomsday/engine/api/writer.h | 22 +- doomsday/engine/portable/include/cl_player.h | 6 +- doomsday/engine/portable/include/de_base.h | 2 + doomsday/engine/portable/include/net_buf.h | 6 - doomsday/engine/portable/include/net_main.h | 2 +- doomsday/engine/portable/include/net_msg.h | 41 ++-- doomsday/engine/portable/include/sv_def.h | 4 +- doomsday/engine/portable/include/sv_pool.h | 10 +- doomsday/engine/portable/src/cl_frame.c | 122 +-------- doomsday/engine/portable/src/cl_main.c | 49 +++- doomsday/engine/portable/src/cl_mobj.c | 65 ++--- doomsday/engine/portable/src/cl_player.c | 93 ++++--- doomsday/engine/portable/src/cl_sound.c | 32 +-- doomsday/engine/portable/src/cl_world.c | 124 +++++----- doomsday/engine/portable/src/con_main.c | 18 +- doomsday/engine/portable/src/net_demo.c | 37 +-- doomsday/engine/portable/src/net_main.c | 99 ++------ doomsday/engine/portable/src/net_msg.c | 218 +++-------------- doomsday/engine/portable/src/net_ping.c | 8 +- doomsday/engine/portable/src/reader.c | 6 + doomsday/engine/portable/src/sv_frame.c | 245 +++++++++---------- doomsday/engine/portable/src/sv_main.c | 186 +++++++------- doomsday/engine/portable/src/sv_pool.c | 8 - doomsday/engine/portable/src/writer.c | 19 +- doomsday/plugins/common/include/d_net.h | 3 +- doomsday/plugins/common/src/d_netcl.c | 127 ++-------- doomsday/plugins/jheretic/src/p_mobj.c | 7 +- 29 files changed, 614 insertions(+), 953 deletions(-) diff --git a/doomsday/engine/api/doomsday.h b/doomsday/engine/api/doomsday.h index 7700c073a7..56db237436 100644 --- a/doomsday/engine/api/doomsday.h +++ b/doomsday/engine/api/doomsday.h @@ -68,6 +68,8 @@ extern "C" { #include "dd_share.h" #include "dd_plugin.h" #include "smoother.h" +#include "reader.h" +#include "writer.h" // Base. void DD_AddIWAD(const char* path); diff --git a/doomsday/engine/api/reader.h b/doomsday/engine/api/reader.h index 0102d11052..1df7f9aa1e 100644 --- a/doomsday/engine/api/reader.h +++ b/doomsday/engine/api/reader.h @@ -65,6 +65,12 @@ size_t Reader_Pos(const Reader* reader); */ size_t Reader_Size(const Reader* reader); +/** + * Determines whether the reader is in the end of buffer, i.e., there is nothing + * more to read. + */ +boolean Reader_AtEnd(const Reader* reader); + /** * Sets the position of the reading cursor in the buffer. * diff --git a/doomsday/engine/api/writer.h b/doomsday/engine/api/writer.h index a0244ee4ca..1fee265f59 100644 --- a/doomsday/engine/api/writer.h +++ b/doomsday/engine/api/writer.h @@ -46,19 +46,31 @@ Writer* Writer_New(void); * with Writer_Destruct() after it is not needed any more. * * @param buffer Buffer to use for reading. - * @param len Length of the buffer. + * @param maxLen Maximum length of the buffer. */ -Writer* Writer_NewWithBuffer(byte* buffer, size_t len); +Writer* Writer_NewWithBuffer(byte* buffer, size_t maxLen); /** * Destroys the writer. */ void Writer_Destruct(Writer* writer); -size_t Writer_Pos(const Writer* writer); - +/** + * Returns the current output size of the writer, i.e., how much has been written + * so far. + */ size_t Writer_Size(const Writer* writer); +/** + * Returns the maximum size of the writing buffer. + */ +size_t Writer_TotalBufferSize(const Writer* writer); + +/** + * Returns the number of bytes left for writing. + */ +size_t Writer_BytesLeft(const Writer* writer); + /** * Sets the position of the writing cursor in the buffer. * @@ -72,7 +84,7 @@ void Writer_WriteByte(Writer* writer, byte v); void Writer_WriteInt16(Writer* writer, int16_t v); void Writer_WriteUInt16(Writer* writer, uint16_t v); void Writer_WriteInt32(Writer* writer, int32_t v); -void Writer_WriteUInt16(Writer* writer, uint16_t v); +void Writer_WriteUInt32(Writer* writer, uint32_t v); void Writer_WriteFloat(Writer* writer, float v); /** diff --git a/doomsday/engine/portable/include/cl_player.h b/doomsday/engine/portable/include/cl_player.h index e863c0f3c4..16ab0f1ec3 100644 --- a/doomsday/engine/portable/include/cl_player.h +++ b/doomsday/engine/portable/include/cl_player.h @@ -42,8 +42,8 @@ typedef struct clplayerstate_s { angle_t turnDelta; int friction; int pendingFixes; - int pendingFixTargetClMobjId; - int pendingAngleFix; + thid_t pendingFixTargetClMobjId; + angle_t pendingAngleFix; float pendingLookDirFix; float pendingPosFix[3]; float pendingMomFix[3]; @@ -55,7 +55,7 @@ extern float cplrThrustMul; void Cl_InitPlayers(void); void ClPlayer_MoveLocal(float dx, float dy, float dz, boolean onground); void ClPlayer_UpdatePos(int plrnum); -void ClPlayer_CoordsReceived(void); +//void ClPlayer_CoordsReceived(void); void ClPlayer_HandleFix(void); void ClPlayer_ApplyPendingFixes(int plrNum); void ClPlayer_ReadDelta2(boolean skip); diff --git a/doomsday/engine/portable/include/de_base.h b/doomsday/engine/portable/include/de_base.h index 7986cfb56a..613e9fc608 100644 --- a/doomsday/engine/portable/include/de_base.h +++ b/doomsday/engine/portable/include/de_base.h @@ -42,6 +42,8 @@ #include "dd_loop.h" #include "dd_help.h" #include "dd_zip.h" +#include "reader.h" +#include "writer.h" // System headers needed everywhere. #include diff --git a/doomsday/engine/portable/include/net_buf.h b/doomsday/engine/portable/include/net_buf.h index 7d75c7b0ad..2c3dc3a87a 100644 --- a/doomsday/engine/portable/include/net_buf.h +++ b/doomsday/engine/portable/include/net_buf.h @@ -29,13 +29,9 @@ #ifndef __DOOMSDAY_NETWORK_BUFFER_H__ #define __DOOMSDAY_NETWORK_BUFFER_H__ -#include "con_decl.h" - // Send Packet flags: #define SPF_REBOUND 0x00020000 // Write only to local loopback #define SPF_DONT_SEND 0x00040000 // Don't really send out anything -//#define SPF_CONFIRM 0x40000000 // Make sure it's received -//#define SPF_ORDERED 0x80000000 // Send in order & confirm #define NETBUFFER_MAXDATA (0x7fff - 8) // 32 KB #define NETBUFFER_ACTUALSIZE 0xffff // 64 KB @@ -69,8 +65,6 @@ typedef struct netbuffer_s { size_t length; // Number of bytes in the data buffer. size_t headerLength; // 1 byte at the moment. - byte *cursor; // Points into the data buffer. - netdata_t msg; // The data buffer for sending and // receiving packets. } netbuffer_t; diff --git a/doomsday/engine/portable/include/net_main.h b/doomsday/engine/portable/include/net_main.h index 70c94c90c1..3704a153af 100644 --- a/doomsday/engine/portable/include/net_main.h +++ b/doomsday/engine/portable/include/net_main.h @@ -85,7 +85,7 @@ enum { PCL_ACK_SHAKE = 12, PSV_SYNC = 13, //PSV_FILTER = 14, // unused? - PKT_COMMAND = 15, // obsolete + //PKT_COMMAND = 15, // obsolete PKT_LOGIN = 16, PCL_ACK_SETS = 17, PKT_COORDS = 18, diff --git a/doomsday/engine/portable/include/net_msg.h b/doomsday/engine/portable/include/net_msg.h index 977b389f2e..4d1a2acd56 100644 --- a/doomsday/engine/portable/include/net_msg.h +++ b/doomsday/engine/portable/include/net_msg.h @@ -29,25 +29,26 @@ #ifndef __DOOMSDAY_NETMESSAGE_H__ #define __DOOMSDAY_NETMESSAGE_H__ -void Msg_Begin(int type); -void Msg_WriteByte(byte b); -void Msg_WriteShort(short w); -void Msg_WritePackedShort(short w); -void Msg_WriteLong(int l); -void Msg_WritePackedLong(unsigned int l); -void Msg_WriteFloat(float f); -void Msg_Write(const void *src, size_t len); -byte Msg_ReadByte(void); -short Msg_ReadShort(void); -short Msg_ReadPackedShort(void); -unsigned short Msg_ReadUnsignedShort(void); -int Msg_ReadLong(void); -unsigned int Msg_ReadPackedLong(void); -float Msg_ReadFloat(void); -void Msg_Read(void *dest, size_t len); -size_t Msg_Offset(void); -void Msg_SetOffset(size_t offset); -size_t Msg_MemoryLeft(void); -boolean Msg_End(void); +#include "reader.h" +#include "writer.h" + +extern Writer* msgWriter; +extern Reader* msgReader; + +/** + * Begin writing a message to netBuffer. If a message is currently being + * read, the reading will be ended. + */ +void Msg_Begin(int type); +void Msg_End(void); + +boolean Msg_BeingWritten(void); + +/** + * Begin reading a message from netBuffer. If a message is currently being + * written, the writing will be ended. + */ +void Msg_BeginRead(void); +void Msg_EndRead(void); #endif diff --git a/doomsday/engine/portable/include/sv_def.h b/doomsday/engine/portable/include/sv_def.h index d0efb4b0e4..81e0ed46a4 100644 --- a/doomsday/engine/portable/include/sv_def.h +++ b/doomsday/engine/portable/include/sv_def.h @@ -32,8 +32,8 @@ #include "dd_def.h" #include "m_string.h" -#define SV_VERSION 14 -#define SV_WELCOME_STRING "Doomsday "DOOMSDAY_VERSION_TEXT" Server (R14)" +#define SV_VERSION 15 +#define SV_WELCOME_STRING "Doomsday "DOOMSDAY_VERSION_TEXT" Server (R15)" // Anything closer than this is always taken into consideration when // deltas are being generated. diff --git a/doomsday/engine/portable/include/sv_pool.h b/doomsday/engine/portable/include/sv_pool.h index 343658f888..1b07dddf88 100644 --- a/doomsday/engine/portable/include/sv_pool.h +++ b/doomsday/engine/portable/include/sv_pool.h @@ -38,8 +38,8 @@ typedef enum { DT_MOBJ = 0, DT_PLAYER = 1, - DT_SECTOR_R6 = 2, // 2 bytes for flags. - DT_SIDE_R6 = 3, // 1 byte for flags. + //DT_SECTOR_R6 = 2, // 2 bytes for flags. + //DT_SIDE_R6 = 3, // 1 byte for flags. DT_POLY = 4, DT_LUMP = 5, DT_SOUND = 6, // No emitter @@ -113,8 +113,8 @@ typedef enum { #define PDF_FRICTION 0x0020 #define PDF_EXTRALIGHT 0x0040 // Plus fixedcolormap (same byte). #define PDF_FILTER 0x0080 -#define PDF_CLYAW 0x1000 // Sent in the player num byte. -#define PDF_CLPITCH 0x2000 // Sent in the player num byte. +//#define PDF_CLYAW 0x1000 // Sent in the player num byte. +//#define PDF_CLPITCH 0x2000 // Sent in the player num byte. #define PDF_PSPRITES 0x4000 // Sent in the player num byte. // Written separately, stored in playerdelta flags 2 highest bytes. @@ -138,7 +138,7 @@ typedef enum { #define SDF_CEILING_TARGET 0x00000020 #define SDF_CEILING_SPEED 0x00000040 #define SDF_FLOOR_TEXMOVE 0x00000080 -#define SDF_CEILING_TEXMOVE 0x00000100 +//#define SDF_CEILING_TEXMOVE 0x00000100 // obsolete #define SDF_COLOR_RED 0x00000200 #define SDF_COLOR_GREEN 0x00000400 #define SDF_COLOR_BLUE 0x00000800 diff --git a/doomsday/engine/portable/src/cl_frame.c b/doomsday/engine/portable/src/cl_frame.c index 35ace66c78..e5c5d6a8c5 100644 --- a/doomsday/engine/portable/src/cl_frame.c +++ b/doomsday/engine/portable/src/cl_frame.c @@ -222,7 +222,7 @@ VERBOSE2( Con_Printf("Cl_ConvertSetToOrdinal: Wraparound, now base is %i.\n", */ void Cl_Frame2Received(int packetType) { - byte /*set = Msg_ReadByte(),*/ deltaType; + byte /*set = Reader_ReadByte(msgReader),*/ deltaType; //byte resendAcks[300]; //int i, numResendAcks = 0; boolean skip = false; @@ -233,7 +233,7 @@ void Cl_Frame2Received(int packetType) #endif // The first thing in the frame is the gameTime. - frameGameTime = Msg_ReadFloat(); + frameGameTime = Reader_ReadFloat(msgReader); // All frames that arrive before the first frame are ignored. // They are most likely from the wrong map. @@ -279,82 +279,17 @@ void Cl_Frame2Received(int packetType) } #endif - // Check for duplicates (might happen if ack doesn't get through - // or ack arrives too late). - //if(!Cl_HistoryCheck(set)) { - // It isn't yet in the history, so add it there. - //Cl_HistoryAdd(set); - //VERBOSE2( Con_Printf("Starting to process deltas in set %i.\n", set) ); - /* -#ifdef _NETDEBUG - deltaCount = Msg_ReadLong(); - VERBOSE2( Con_Message("Set contains %i deltas.\n", deltaCount) ); -#endif - */ - // Read and process the message. - while(!Msg_End()) + while(!Reader_AtEnd(msgReader)) { -#ifdef _NETDEBUG - /*Con_Message("Starting to read delta %i of %i...\n", ++readCount, - deltaCount);*/ - - // Check length field. - startOffset = Msg_Offset(); - deltaLength = Msg_ReadLong(); - //Con_Message("Incoming delta length %i bytes.\n", deltaLength); -#endif - - deltaType = Msg_ReadByte(); -#ifdef _NETDEBUG - //Con_Message(" Delta type is %i.\n", deltaType & ~DT_RESENT); -#endif + deltaType = Reader_ReadByte(msgReader); skip = false; VERBOSE2( Con_Printf("Received delta %i.\n", deltaType & ~DT_RESENT) ); - /* - // Is this a resent delta? - if(deltaType & DT_RESENT) - { - VERBOSE2( Con_Printf(" This is a resent delta.\n") ); - - deltaType &= ~DT_RESENT; - - // Read the set number this was originally in. - oldSet = Msg_ReadByte(); - - // Read the resend ID. - resend = Msg_ReadByte(); - - // Did we already receive this delta? - { - boolean historyChecked = Cl_HistoryCheck(oldSet); - boolean resendChecked = Cl_ResendHistoryCheck(resend); - - if(historyChecked || resendChecked) - { - // Yes, we've already got this. Must skip. - skip = true; - - Con_Message("CL_Frame2Received: Skipping delta %i (oldset=%i, rsid=%i), because history=%i resend=%i\n", - deltaType, oldSet, resend, historyChecked, resendChecked); - } - } - - // We must acknowledge that we've received this. - resendAcks[numResendAcks++] = resend; - Cl_ResendHistoryAdd(resend); - } - else - { - VERBOSE2( Con_Printf(" Not resent.\n") ); - } - */ - switch(deltaType) { case DT_CREATE_MOBJ: @@ -376,7 +311,6 @@ void Cl_Frame2Received(int packetType) ClPlayer_ReadDelta2(skip); break; - //case DT_SECTOR_R6: // Old format. case DT_SECTOR: Cl_ReadSectorDelta2(deltaType, skip); break; @@ -401,16 +335,6 @@ void Cl_Frame2Received(int packetType) Con_Error("Cl_Frame2Received: Unknown delta type %i.\n", deltaType); } - -/*#ifdef _NETDEBUG - // Check that we didn't misread. - if(Msg_Offset() - startOffset != deltaLength) - { - Con_Error("Cl_Frame2Received: Misinterpreted delta! Real length was " - "%i bytes, but we read %i bytes.\n", - deltaLength, Msg_Offset() - startOffset); - } -#endif*/ } #ifdef _DEBUG @@ -422,43 +346,5 @@ void Cl_Frame2Received(int packetType) // We have now received a frame. gotFrame = true; - - // Reset the predict counter. - //predicted_tics = 0; - } - - /* - if(numResendAcks == 0) - { - // Acknowledge the set. - Msg_Begin(PCL_ACK_SETS); - Msg_WriteByte(set); - -#ifdef _DEBUG - VERBOSE2( Con_Printf("Cl_Frame2Received: Ack set %i. Nothing was resent.\n", set) ); -#endif } - else - { - // Acknowledge the set and the resent deltas. - Msg_Begin(PCL_ACKS); - Msg_WriteByte(set); -#ifdef _DEBUG - VERBOSE2( Con_Printf("Cl_Frame2Received: Ack set %i. Contained %i resent deltas: \n", - set, numResendAcks) ); -#endif - for(i = 0; i < numResendAcks; ++i) - { - Msg_WriteByte(resendAcks[i]); - -#ifdef _DEBUG - VERBOSE2( Con_Printf("%i ", resendAcks[i]) ); -#endif - } -#ifdef _DEBUG - VERBOSE2( Con_Printf("\n") ); -#endif - } - Net_SendBuffer(0, 0); - */ } diff --git a/doomsday/engine/portable/src/cl_main.c b/doomsday/engine/portable/src/cl_main.c index 45d81ce82b..d04fb9a9f2 100644 --- a/doomsday/engine/portable/src/cl_main.c +++ b/doomsday/engine/portable/src/cl_main.c @@ -130,17 +130,19 @@ void Cl_SendHello(void) char buf[256]; Msg_Begin(PCL_HELLO2); - Msg_WriteLong(clientID); + Writer_WriteUInt32(msgWriter, clientID); // The game mode is included in the hello packet. memset(buf, 0, sizeof(buf)); strncpy(buf, (char *) gx.GetVariable(DD_GAME_MODE), sizeof(buf) - 1); #ifdef _DEBUG -Con_Message("Cl_SendHello: game mode = %s\n", buf); + Con_Message("Cl_SendHello: game mode = %s\n", buf); #endif - Msg_Write(buf, 16); + Writer_Write(msgWriter, buf, 16); + Msg_End(); + Net_SendBuffer(0, 0); } @@ -156,6 +158,7 @@ void Cl_AnswerHandshake(handshake_packet_t* pShake) // Immediately send an acknowledgement. Msg_Begin(PCL_ACK_SHAKE); + Msg_End(); Net_SendBuffer(0, 0); // Check the version number. @@ -258,11 +261,13 @@ void Cl_GetPackets(void) // All messages come from the server. while(Net_GetPacket()) { + Msg_BeginRead(); + // First check for packets that are only valid when // a game is in progress. if(Cl_GameReady()) { - boolean handled = true; + boolean handled = true; switch(netBuffer.msg.type) { @@ -277,9 +282,11 @@ void Cl_GetPackets(void) Cl_Frame2Received(netBuffer.msg.type); break; + /* case PKT_COORDS: ClPlayer_CoordsReceived(); break; + */ case PSV_SOUND: Cl_Sound(); @@ -311,7 +318,7 @@ void Cl_GetPackets(void) case PSV_SYNC: // The server updates our time. Latency has been taken into // account, so... - gameTime = Msg_ReadLong() / 100.0; + gameTime = Reader_ReadFloat(msgReader); Con_Printf("PSV_SYNC: gameTime=%.3f\n", gameTime); DD_ResetTimer(); break; @@ -325,7 +332,7 @@ void Cl_GetPackets(void) break; case PSV_PLAYER_EXIT: - Cl_PlayerLeaves(Msg_ReadByte()); + Cl_PlayerLeaves(Reader_ReadByte(msgReader)); break; case PKT_CHAT: @@ -340,14 +347,21 @@ void Cl_GetPackets(void) break; case PSV_CONSOLE_TEXT: - i = Msg_ReadLong(); - Con_FPrintf(i, "%s", (char*)netBuffer.cursor); + { + uint32_t conFlags = Reader_ReadUInt32(msgReader); + uint16_t textLen = Reader_ReadUInt16(msgReader); + char* text = M_Malloc(textLen + 1); + Reader_Read(msgReader, text, textLen); + text[textLen] = 0; + Con_FPrintf(conFlags, "%s", text); + M_Free(text); break; + } case PKT_LOGIN: // Server responds to our login request. Let's see if we // were successful. - netLoggedIn = Msg_ReadByte(); + netLoggedIn = Reader_ReadByte(msgReader); break; default: @@ -363,6 +377,8 @@ void Cl_GetPackets(void) #endif } } + + Msg_EndRead(); } } @@ -468,9 +484,20 @@ D_CMD(Login) Msg_Begin(PKT_LOGIN); // Write the password. if(argc == 1) - Msg_WriteByte(0); // No password given! + { + Writer_WriteByte(msgWriter, 0); // No password given! + } + else if(strlen(argv[1]) <= 255) + { + Writer_WriteByte(msgWriter, strlen(argv[1])); + Writer_Write(msgWriter, argv[1], strlen(argv[1])); + } else - Msg_Write(argv[1], strlen(argv[1]) + 1); + { + Msg_End(); + return false; + } + Msg_End(); Net_SendBuffer(0, 0); return true; } diff --git a/doomsday/engine/portable/src/cl_mobj.c b/doomsday/engine/portable/src/cl_mobj.c index a67fe384d9..55112e29bf 100644 --- a/doomsday/engine/portable/src/cl_mobj.c +++ b/doomsday/engine/portable/src/cl_mobj.c @@ -738,16 +738,16 @@ void ClMobj_ReadDelta2(boolean skip) int df = 0; byte moreFlags = 0, fastMom = false; short mom; - thid_t id = Msg_ReadUnsignedShort(); // Read the ID. + thid_t id = Reader_ReadUInt16(msgReader); // Read the ID. boolean onFloor = false; // Flags. - df = Msg_ReadUnsignedShort(); + df = Reader_ReadUInt16(msgReader); // More flags? if(df & MDF_MORE_FLAGS) { - moreFlags = Msg_ReadByte(); + moreFlags = Reader_ReadByte(msgReader); // Fast momentum uses 10.6 fixed point instead of the normal 8.8. if(moreFlags & MDFE_FAST_MOM) @@ -815,13 +815,13 @@ void ClMobj_ReadDelta2(boolean skip) // Coordinates with three bytes. if(df & MDF_POS_X) { - d->pos[VX] = FIX2FLT((Msg_ReadShort() << FRACBITS) | (Msg_ReadByte() << 8)); + d->pos[VX] = FIX2FLT((Reader_ReadInt16(msgReader) << FRACBITS) | (Reader_ReadByte(msgReader) << 8)); if(info) info->flags |= CLMF_KNOWN_X; } if(df & MDF_POS_Y) { - d->pos[VY] = FIX2FLT((Msg_ReadShort() << FRACBITS) | (Msg_ReadByte() << 8)); + d->pos[VY] = FIX2FLT((Reader_ReadInt16(msgReader) << FRACBITS) | (Reader_ReadByte(msgReader) << 8)); if(info) info->flags |= CLMF_KNOWN_Y; } @@ -829,7 +829,7 @@ void ClMobj_ReadDelta2(boolean skip) { if(!(moreFlags & MDFE_Z_FLOOR)) { - d->pos[VZ] = FIX2FLT((Msg_ReadShort() << FRACBITS) | (Msg_ReadByte() << 8)); + d->pos[VZ] = FIX2FLT((Reader_ReadInt16(msgReader) << FRACBITS) | (Reader_ReadByte(msgReader) << 8)); if(info) { info->flags |= CLMF_KNOWN_Z; @@ -837,22 +837,22 @@ void ClMobj_ReadDelta2(boolean skip) // The mobj won't stick if an explicit coordinate is supplied. info->flags &= ~(CLMF_STICK_FLOOR | CLMF_STICK_CEILING); } - d->floorZ = Msg_ReadFloat(); + d->floorZ = Reader_ReadFloat(msgReader); } else { onFloor = true; // Ignore these. - Msg_ReadShort(); - Msg_ReadByte(); - Msg_ReadFloat(); + Reader_ReadInt16(msgReader); + Reader_ReadByte(msgReader); + Reader_ReadFloat(msgReader); info->flags |= CLMF_KNOWN_Z; //d->pos[VZ] = d->floorZ; } - d->ceilingZ = Msg_ReadFloat(); + d->ceilingZ = Reader_ReadFloat(msgReader); } /*#if _DEBUG @@ -882,33 +882,33 @@ void ClMobj_ReadDelta2(boolean skip) // Momentum using 8.8 fixed point. if(df & MDF_MOM_X) { - mom = Msg_ReadShort(); + mom = Reader_ReadInt16(msgReader); d->mom[MX] = FIX2FLT(fastMom? UNFIXED10_6(mom) : UNFIXED8_8(mom)); } if(df & MDF_MOM_Y) { - mom = Msg_ReadShort(); + mom = Reader_ReadInt16(msgReader); d->mom[MY] = FIX2FLT(fastMom ? UNFIXED10_6(mom) : UNFIXED8_8(mom)); } if(df & MDF_MOM_Z) { - mom = Msg_ReadShort(); + mom = Reader_ReadInt16(msgReader); d->mom[MZ] = FIX2FLT(fastMom ? UNFIXED10_6(mom) : UNFIXED8_8(mom)); } // Angles with 16-bit accuracy. if(df & MDF_ANGLE) - d->angle = Msg_ReadShort() << 16; + d->angle = Reader_ReadInt16(msgReader) << 16; // MDF_SELSPEC is never used without MDF_SELECTOR. if(df & MDF_SELECTOR) - d->selector = Msg_ReadPackedShort(); + d->selector = Reader_ReadPackedUInt16(msgReader); if(df & MDF_SELSPEC) - d->selector |= Msg_ReadByte() << 24; + d->selector |= Reader_ReadByte(msgReader) << 24; if(df & MDF_STATE) { - int stateIdx = Msg_ReadPackedShort(); + int stateIdx = Reader_ReadPackedUInt16(msgReader); if(!skip) { ClMobj_SetState(d, stateIdx); @@ -920,11 +920,11 @@ void ClMobj_ReadDelta2(boolean skip) { // Only the flags in the pack mask are affected. d->ddFlags &= ~DDMF_PACK_MASK; - d->ddFlags |= DDMF_REMOTE | (Msg_ReadLong() & DDMF_PACK_MASK); + d->ddFlags |= DDMF_REMOTE | (Reader_ReadUInt32(msgReader) & DDMF_PACK_MASK); - d->flags = Msg_ReadLong(); - d->flags2 = Msg_ReadLong(); - d->flags3 = Msg_ReadLong(); + d->flags = Reader_ReadUInt32(msgReader); + d->flags2 = Reader_ReadUInt32(msgReader); + d->flags3 = Reader_ReadUInt32(msgReader); /*#ifdef _DEBUG Con_Message("ClMobj_ReadDelta2: Mobj%i: Flags %x\n", id, d->flags & 0x1c000000); @@ -932,26 +932,31 @@ void ClMobj_ReadDelta2(boolean skip) } if(df & MDF_HEALTH) - d->health = Msg_ReadLong(); + d->health = Reader_ReadInt32(msgReader); if(df & MDF_RADIUS) - d->radius = Msg_ReadFloat(); + d->radius = Reader_ReadFloat(msgReader); if(df & MDF_HEIGHT) - d->height = Msg_ReadFloat(); + d->height = Reader_ReadFloat(msgReader); if(df & MDF_FLOORCLIP) - d->floorClip = Msg_ReadFloat(); + d->floorClip = Reader_ReadFloat(msgReader); if(moreFlags & MDFE_TRANSLUCENCY) - d->translucency = Msg_ReadByte(); + d->translucency = Reader_ReadByte(msgReader); if(moreFlags & MDFE_FADETARGET) - d->visTarget = ((short)Msg_ReadByte()) - 1; + d->visTarget = ((short)Reader_ReadByte(msgReader)) - 1; if(moreFlags & MDFE_TYPE) { - d->type = Msg_ReadLong(); + d->type = Reader_ReadInt32(msgReader); + if(d->type < 0 || d->type >= defs.count.mobjs.num) + { + // The specified type is invalid. + d->type = 0; + } d->info = &mobjInfo[d->type]; /// @todo check validity of d->type assert(d->info); @@ -1028,7 +1033,7 @@ void ClMobj_ReadNullDelta2(boolean skip) thid_t id; // The delta only contains an ID. - id = Msg_ReadUnsignedShort(); + id = Reader_ReadUInt16(msgReader); if(skip) return; diff --git a/doomsday/engine/portable/src/cl_player.c b/doomsday/engine/portable/src/cl_player.c index 850e7d0bb4..226dab5a1b 100644 --- a/doomsday/engine/portable/src/cl_player.c +++ b/doomsday/engine/portable/src/cl_player.c @@ -59,9 +59,9 @@ clplayerstate_t clPlayerStates[DDMAXPLAYERS]; // PRIVATE DATA DEFINITIONS ------------------------------------------------ -static int fixSpeed = 15; -static float fixPos[3]; -static int fixTics; +//static int fixSpeed = 15; +//static float fixPos[3]; +//static int fixTics; static float pspY; // Console player demo momentum (used to smooth out abrupt momentum changes). @@ -74,10 +74,10 @@ static float cpMom[3][LOCALCAM_WRITE_TICS]; */ void Cl_InitPlayers(void) { - fixTics = 0; + //fixTics = 0; pspY = 0; memset(&clPlayerStates, 0, sizeof(clPlayerStates)); - memset(fixPos, 0, sizeof(fixPos)); + //memset(fixPos, 0, sizeof(fixPos)); memset(cpMom, 0, sizeof(cpMom)); } @@ -152,6 +152,7 @@ void ClPlayer_UpdatePos(int plrNum) remoteClientMobj->mom[MZ] = localMobj->mom[MZ]; } +/* void ClPlayer_CoordsReceived(void) { if(playback) @@ -167,6 +168,7 @@ void ClPlayer_CoordsReceived(void) fixPos[VX] /= fixSpeed; fixPos[VY] /= fixSpeed; } +*/ void ClPlayer_ApplyPendingFixes(int plrNum) { @@ -241,9 +243,10 @@ void ClPlayer_ApplyPendingFixes(int plrNum) { // Send an acknowledgement. Msg_Begin(PCL_ACK_PLAYER_FIX); - Msg_WriteLong(ddpl->fixAcked.angles); - Msg_WriteLong(ddpl->fixAcked.pos); - Msg_WriteLong(ddpl->fixAcked.mom); + Writer_WriteUInt32(msgWriter, ddpl->fixAcked.angles); + Writer_WriteUInt32(msgWriter, ddpl->fixAcked.pos); + Writer_WriteUInt32(msgWriter, ddpl->fixAcked.mom); + Msg_End(); Net_SendBuffer(0, 0); } } @@ -257,35 +260,35 @@ void ClPlayer_HandleFix(void) clplayerstate_t* state; // Target player. - plrNum = Msg_ReadByte(); + plrNum = Reader_ReadByte(msgReader); plr = &ddPlayers[plrNum]; ddpl = &plr->shared; state = ClPlayer_State(plrNum); // What to fix? - fixes = Msg_ReadLong(); + fixes = Reader_ReadUInt32(msgReader); - state->pendingFixTargetClMobjId = Msg_ReadLong(); + state->pendingFixTargetClMobjId = Reader_ReadUInt16(msgReader); if(fixes & 1) // fix angles? { - ddpl->fixCounter.angles = Msg_ReadLong(); - state->pendingAngleFix = Msg_ReadLong(); - state->pendingLookDirFix = FIX2FLT(Msg_ReadLong()); + ddpl->fixCounter.angles = Reader_ReadUInt32(msgReader); + state->pendingAngleFix = Reader_ReadUInt32(msgReader); + state->pendingLookDirFix = Reader_ReadFloat(msgReader); state->pendingFixes |= DDPF_FIXANGLES; #ifdef _DEBUG - Con_Message("Cl_HandlePlayerFix: [Plr %i] Fix angles %i. Angle=%f, lookdir=%f\n", plrNum, - ddpl->fixAcked.angles, FIX2FLT(state->pendingAngleFix), state->pendingLookDirFix); + Con_Message("Cl_HandlePlayerFix: [Plr %i] Fix angles %i. Angle=%x, lookdir=%f\n", plrNum, + ddpl->fixAcked.angles, state->pendingAngleFix, state->pendingLookDirFix); #endif } if(fixes & 2) // fix pos? { - ddpl->fixCounter.pos = Msg_ReadLong(); - state->pendingPosFix[VX] = FIX2FLT(Msg_ReadLong()); - state->pendingPosFix[VY] = FIX2FLT(Msg_ReadLong()); - state->pendingPosFix[VZ] = FIX2FLT(Msg_ReadLong()); + ddpl->fixCounter.pos = Reader_ReadUInt32(msgReader); + state->pendingPosFix[VX] = Reader_ReadFloat(msgReader); + state->pendingPosFix[VY] = Reader_ReadFloat(msgReader); + state->pendingPosFix[VZ] = Reader_ReadFloat(msgReader); state->pendingFixes |= DDPF_FIXPOS; #ifdef _DEBUG @@ -296,10 +299,10 @@ void ClPlayer_HandleFix(void) if(fixes & 4) // fix momentum? { - ddpl->fixCounter.mom = Msg_ReadLong(); - state->pendingMomFix[VX] = FIX2FLT(Msg_ReadLong()); - state->pendingMomFix[VY] = FIX2FLT(Msg_ReadLong()); - state->pendingMomFix[VZ] = FIX2FLT(Msg_ReadLong()); + ddpl->fixCounter.mom = Reader_ReadUInt32(msgReader); + state->pendingMomFix[VX] = Reader_ReadFloat(msgReader); + state->pendingMomFix[VY] = Reader_ReadFloat(msgReader); + state->pendingMomFix[VZ] = Reader_ReadFloat(msgReader); state->pendingFixes |= DDPF_FIXMOM; } @@ -386,9 +389,9 @@ void ClPlayer_ReadDelta2(boolean skip) short junk; // The first byte consists of a player number and some flags. - num = Msg_ReadByte(); + num = Reader_ReadByte(msgReader); df = (num & 0xf0) << 8; - df |= Msg_ReadByte(); // Second byte is just flags. + df |= Reader_ReadByte(msgReader); // Second byte is just flags. num &= 0xf; // Clear the upper bits of the number. if(!skip) @@ -407,7 +410,7 @@ void ClPlayer_ReadDelta2(boolean skip) { mobj_t *old = ClMobj_Find(s->clMobjId); - newId = Msg_ReadUnsignedShort(); + newId = Reader_ReadUInt16(msgReader); // Make sure the 'new' mobj is different than the old one; // there will be linking problems otherwise. @@ -495,27 +498,27 @@ void ClPlayer_ReadDelta2(boolean skip) } if(df & PDF_FORWARDMOVE) - s->forwardMove = (char) Msg_ReadByte() * 2048; + s->forwardMove = (char) Reader_ReadByte(msgReader) * 2048; if(df & PDF_SIDEMOVE) - s->sideMove = (char) Msg_ReadByte() * 2048; + s->sideMove = (char) Reader_ReadByte(msgReader) * 2048; if(df & PDF_ANGLE) - //s->angle = Msg_ReadByte() << 24; - junk = Msg_ReadByte(); + //s->angle = Reader_ReadByte(msgReader) << 24; + junk = Reader_ReadByte(msgReader); if(df & PDF_TURNDELTA) { - s->turnDelta = ((char) Msg_ReadByte() << 24) / 16; + s->turnDelta = ((char) Reader_ReadByte(msgReader) << 24) / 16; } if(df & PDF_FRICTION) - s->friction = Msg_ReadByte() << 8; + s->friction = Reader_ReadByte(msgReader) << 8; if(df & PDF_EXTRALIGHT) { - i = Msg_ReadByte(); + i = Reader_ReadByte(msgReader); ddpl->fixedColorMap = i & 7; ddpl->extraLight = i & 0xf8; } if(df & PDF_FILTER) { - unsigned int filter = Msg_ReadLong(); + unsigned int filter = Reader_ReadUInt32(msgReader); ddpl->filterColor[CR] = (filter & 0xff) / 255.f; ddpl->filterColor[CG] = ((filter >> 8) & 0xff) / 255.f; @@ -538,22 +541,16 @@ void ClPlayer_ReadDelta2(boolean skip) ddpl->filterColor[CA]); #endif } - if(df & PDF_CLYAW) // Only sent when Fixangles is used. - //ddpl->clAngle = Msg_ReadShort() << 16; /* $unifiedangles */ - junk = Msg_ReadShort(); - if(df & PDF_CLPITCH) // Only sent when Fixangles is used. - //ddpl->clLookDir = Msg_ReadShort() * 110.0 / DDMAXSHORT; /* $unifiedangles */ - junk = Msg_ReadShort(); if(df & PDF_PSPRITES) { for(i = 0; i < 2; ++i) { // First the flags. - psdf = Msg_ReadByte(); + psdf = Reader_ReadByte(msgReader); psp = ddpl->pSprites + i; if(psdf & PSDF_STATEPTR) { - idx = Msg_ReadPackedShort(); + idx = Reader_ReadPackedUInt16(msgReader); if(!idx) psp->statePtr = 0; else if(idx < countStates.num) @@ -564,15 +561,15 @@ void ClPlayer_ReadDelta2(boolean skip) } /*if(psdf & PSDF_LIGHT) - psp->light = Msg_ReadByte() / 255.0f;*/ + psp->light = Reader_ReadByte(msgReader) / 255.0f;*/ if(psdf & PSDF_ALPHA) - psp->alpha = Msg_ReadByte() / 255.0f; + psp->alpha = Reader_ReadByte(msgReader) / 255.0f; if(psdf & PSDF_STATE) - psp->state = Msg_ReadByte(); + psp->state = Reader_ReadByte(msgReader); if(psdf & PSDF_OFFSET) { - psp->offset[VX] = (char) Msg_ReadByte() * 2; - psp->offset[VY] = (char) Msg_ReadByte() * 2; + psp->offset[VX] = (char) Reader_ReadByte(msgReader) * 2; + psp->offset[VY] = (char) Reader_ReadByte(msgReader) * 2; } } } diff --git a/doomsday/engine/portable/src/cl_sound.c b/doomsday/engine/portable/src/cl_sound.c index d89ea9cdc6..8915053c5b 100644 --- a/doomsday/engine/portable/src/cl_sound.c +++ b/doomsday/engine/portable/src/cl_sound.c @@ -70,11 +70,11 @@ void Cl_ReadSoundDelta2(deltatype_t type, boolean skip) if(type == DT_SOUND) { // Delta ID is the sound ID. - sound = Msg_ReadUnsignedShort(); + sound = Reader_ReadUInt16(msgReader); } else if(type == DT_MOBJ_SOUND) { - if((cmo = ClMobj_Find(mobjId = Msg_ReadUnsignedShort())) != NULL) + if((cmo = ClMobj_Find(mobjId = Reader_ReadUInt16(msgReader))) != NULL) { clmoinfo_t* info = ClMobj_GetInfo(cmo); if(info->flags & CLMF_HIDDEN) @@ -91,7 +91,7 @@ void Cl_ReadSoundDelta2(deltatype_t type, boolean skip) } else if(type == DT_SECTOR_SOUND) { - uint index = Msg_ReadUnsignedShort(); + uint index = Reader_ReadUInt16(msgReader); if(index < numSectors) { @@ -106,7 +106,7 @@ void Cl_ReadSoundDelta2(deltatype_t type, boolean skip) } else /* DT_POLY_SOUND */ { - uint index = Msg_ReadUnsignedShort(); + uint index = Reader_ReadUInt16(msgReader); if(index < numPolyObjs) { @@ -121,12 +121,12 @@ void Cl_ReadSoundDelta2(deltatype_t type, boolean skip) } } - flags = Msg_ReadByte(); + flags = Reader_ReadByte(msgReader); if(type != DT_SOUND) { // The sound ID. - sound = Msg_ReadUnsignedShort(); + sound = Reader_ReadUInt16(msgReader); } if(type == DT_SECTOR_SOUND) @@ -142,7 +142,7 @@ void Cl_ReadSoundDelta2(deltatype_t type, boolean skip) if(flags & SNDDF_VOLUME) { - byte b = Msg_ReadByte(); + byte b = Reader_ReadByte(msgReader); if(b == 255) { @@ -259,16 +259,16 @@ void Cl_Sound(void) uint num; mobj_t *mo = NULL; - flags = Msg_ReadByte(); + flags = Reader_ReadByte(msgReader); // Sound ID. if(flags & SNDF_SHORT_SOUND_ID) { - sound = Msg_ReadUnsignedShort(); + sound = Reader_ReadUInt16(msgReader); } else { - sound = Msg_ReadByte(); + sound = Reader_ReadByte(msgReader); } // Is the ID valid? @@ -283,7 +283,7 @@ void Cl_Sound(void) if(flags & SNDF_VOLUME) { - volume = Msg_ReadByte(); + volume = Reader_ReadByte(msgReader); if(volume > 127) { volume = 127; @@ -292,7 +292,7 @@ void Cl_Sound(void) } if(flags & SNDF_ID) { - thid_t sourceId = Msg_ReadUnsignedShort(); + thid_t sourceId = Reader_ReadUInt16(msgReader); mobj_t *cmo = ClMobj_Find(sourceId); if(cmo) { @@ -301,7 +301,7 @@ void Cl_Sound(void) } else if(flags & SNDF_SECTOR) { - num = (ushort) Msg_ReadPackedShort(); + num = Reader_ReadPackedUInt16(msgReader); if(num >= numSectors) { Con_Message("Cl_Sound: Invalid sector number %i.\n", num); @@ -313,9 +313,9 @@ void Cl_Sound(void) } else if(flags & SNDF_ORIGIN) { - pos[VX] = Msg_ReadShort(); - pos[VY] = Msg_ReadShort(); - pos[VZ] = Msg_ReadShort(); + pos[VX] = Reader_ReadInt16(msgReader); + pos[VY] = Reader_ReadInt16(msgReader); + pos[VZ] = Reader_ReadInt16(msgReader); S_LocalSoundAtVolumeFrom(sound, NULL, pos, volume / 127.0f); } else if(flags & SNDF_PLAYER) diff --git a/doomsday/engine/portable/src/cl_world.c b/doomsday/engine/portable/src/cl_world.c index 7bb1305d11..81cfd479b3 100644 --- a/doomsday/engine/portable/src/cl_world.c +++ b/doomsday/engine/portable/src/cl_world.c @@ -471,7 +471,7 @@ mover_t *Cl_GetActiveMover(uint sectornum, clmovertype_t type) */ int Cl_ReadLumpDelta(void) { - lumpnum_t num = (lumpnum_t) Msg_ReadPackedShort(); + lumpnum_t num = (lumpnum_t) Reader_ReadPackedUInt16(msgReader); char name[9]; if(!num) @@ -479,7 +479,7 @@ int Cl_ReadLumpDelta(void) // Read the name of the lump. memset(name, 0, sizeof(name)); - Msg_Read(name, 8); + Reader_Read(msgReader, name, 8); VERBOSE(Con_Printf("LumpTranslate: %i => %s\n", num, name)); @@ -509,18 +509,18 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) dummy.planes = dummyPlaneArray; // Sector index number. - num = Msg_ReadUnsignedShort(); + num = Reader_ReadUInt16(msgReader); // Flags. - if(deltaType == DT_SECTOR_R6) + /*if(deltaType == DT_SECTOR_R6) { // The R6 protocol reserves two bytes for the flags. - df = Msg_ReadUnsignedShort(); - } - else - { - df = Msg_ReadPackedLong(); + df = Reader_ReadUInt16(msgReader); } + else*/ + //{ + df = Reader_ReadPackedUInt32(msgReader); + //} if(!skip) { @@ -546,7 +546,7 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) * The delta is a server-side materialnum. * \fixme What if client and server materialnums differ? */ - mat = P_ToMaterial(Msg_ReadPackedShort()); + mat = P_ToMaterial(Reader_ReadPackedUInt16(msgReader)); Surface_SetMaterial(&sec->SP_floorsurface, mat); } if(df & SDF_CEILING_MATERIAL) @@ -556,15 +556,15 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) * The delta is a server-side materialnum. * \fixme What if client and server materialnums differ? */ - mat = P_ToMaterial(Msg_ReadPackedShort()); + mat = P_ToMaterial(Reader_ReadPackedUInt16(msgReader)); Surface_SetMaterial(&sec->SP_ceilsurface, mat); } if(df & SDF_LIGHT) - sec->lightLevel = Msg_ReadByte() / 255.0f; + sec->lightLevel = Reader_ReadByte(msgReader) / 255.0f; if(df & SDF_FLOOR_HEIGHT) { - P_SetFloatp(sec, DMU_FLOOR_OF_SECTOR | DMU_HEIGHT, FIX2FLT(Msg_ReadShort() << 16)); + P_SetFloatp(sec, DMU_FLOOR_OF_SECTOR | DMU_HEIGHT, FIX2FLT(Reader_ReadInt16(msgReader) << 16)); wasChanged = true; /* @@ -577,7 +577,7 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) } if(df & SDF_CEILING_HEIGHT) { - fixed_t height = Msg_ReadShort() << 16; + fixed_t height = Reader_ReadInt16(msgReader) << 16; P_SetFloatp(sec, DMU_CEILING_OF_SECTOR | DMU_HEIGHT, FIX2FLT(height)); wasChanged = true; @@ -588,7 +588,7 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) } if(df & SDF_FLOOR_TARGET) { - fixed_t height = Msg_ReadShort() << 16; + fixed_t height = Reader_ReadInt16(msgReader) << 16; P_SetFloatp(sec, DMU_FLOOR_OF_SECTOR | DMU_TARGET_HEIGHT, FIX2FLT(height)); /*if(!skip) @@ -601,7 +601,7 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) } if(df & SDF_FLOOR_SPEED) { - fixed_t speed = Msg_ReadByte(); + fixed_t speed = Reader_ReadByte(msgReader); //if(!skip) { P_SetFloatp(sec, DMU_FLOOR_OF_SECTOR | DMU_SPEED, @@ -620,7 +620,7 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) #endif if(df & SDF_CEILING_TARGET) { - fixed_t target = Msg_ReadShort() << 16; + fixed_t target = Reader_ReadInt16(msgReader) << 16; /*#ifdef _DEBUG Con_Message("Cl_ReadSectorDelta2: Ceiling target %f for sector %i\n", FIX2FLT(target), num); #endif*/ @@ -635,7 +635,7 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) } if(df & SDF_CEILING_SPEED) { - byte speed = Msg_ReadByte(); + byte speed = Reader_ReadByte(msgReader); //if(!skip) { P_SetFloatp(sec, DMU_CEILING_OF_SECTOR | DMU_SPEED, @@ -645,45 +645,47 @@ void Cl_ReadSectorDelta2(int deltaType, boolean skip) num, sec->planes[PLN_CEILING]->speed) );*/ } } +#if 0 if(df & SDF_CEILING_TEXMOVE) { // Old clients might include these. /*fixed_t moveX = */ Msg_ReadShort() /*<< 8*/; /*fixed_t moveY = */ Msg_ReadShort() /*<< 8*/; } +#endif if(df & SDF_COLOR_RED) - sec->rgb[0] = Msg_ReadByte() / 255.f; + sec->rgb[0] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_COLOR_GREEN) - sec->rgb[1] = Msg_ReadByte() / 255.f; + sec->rgb[1] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_COLOR_BLUE) - sec->rgb[2] = Msg_ReadByte() / 255.f; + sec->rgb[2] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_FLOOR_COLOR_RED) - Surface_SetColorR(&sec->SP_floorsurface, Msg_ReadByte() / 255.f); + Surface_SetColorR(&sec->SP_floorsurface, Reader_ReadByte(msgReader) / 255.f); if(df & SDF_FLOOR_COLOR_GREEN) - Surface_SetColorG(&sec->SP_floorsurface, Msg_ReadByte() / 255.f); + Surface_SetColorG(&sec->SP_floorsurface, Reader_ReadByte(msgReader) / 255.f); if(df & SDF_FLOOR_COLOR_BLUE) - Surface_SetColorB(&sec->SP_floorsurface, Msg_ReadByte() / 255.f); + Surface_SetColorB(&sec->SP_floorsurface, Reader_ReadByte(msgReader) / 255.f); if(df & SDF_CEIL_COLOR_RED) - Surface_SetColorR(&sec->SP_ceilsurface, Msg_ReadByte() / 255.f); + Surface_SetColorR(&sec->SP_ceilsurface, Reader_ReadByte(msgReader) / 255.f); if(df & SDF_CEIL_COLOR_GREEN) - Surface_SetColorG(&sec->SP_ceilsurface, Msg_ReadByte() / 255.f); + Surface_SetColorG(&sec->SP_ceilsurface, Reader_ReadByte(msgReader) / 255.f); if(df & SDF_CEIL_COLOR_BLUE) - Surface_SetColorB(&sec->SP_ceilsurface, Msg_ReadByte() / 255.f); + Surface_SetColorB(&sec->SP_ceilsurface, Reader_ReadByte(msgReader) / 255.f); /* if(df & SDF_FLOOR_GLOW_RED) - sec->planes[PLN_FLOOR]->glowRGB[0] = Msg_ReadByte() / 255.f; + sec->planes[PLN_FLOOR]->glowRGB[0] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_FLOOR_GLOW_GREEN) - sec->planes[PLN_FLOOR]->glowRGB[1] = Msg_ReadByte() / 255.f; + sec->planes[PLN_FLOOR]->glowRGB[1] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_FLOOR_GLOW_BLUE) - sec->planes[PLN_FLOOR]->glowRGB[2] = Msg_ReadByte() / 255.f; + sec->planes[PLN_FLOOR]->glowRGB[2] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_CEIL_GLOW_RED) - sec->planes[PLN_CEILING]->glowRGB[0] = Msg_ReadByte() / 255.f; + sec->planes[PLN_CEILING]->glowRGB[0] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_CEIL_GLOW_GREEN) - sec->planes[PLN_CEILING]->glowRGB[1] = Msg_ReadByte() / 255.f; + sec->planes[PLN_CEILING]->glowRGB[1] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_CEIL_GLOW_BLUE) - sec->planes[PLN_CEILING]->glowRGB[2] = Msg_ReadByte() / 255.f; + sec->planes[PLN_CEILING]->glowRGB[2] = Reader_ReadByte(msgReader) / 255.f; if(df & SDF_FLOOR_GLOW) sec->planes[PLN_FLOOR]->glow = (float) Msg_ReadShort() / DDMAXSHORT; @@ -731,56 +733,56 @@ void Cl_ReadSideDelta2(int deltaType, boolean skip) sidedef_t *sid; // First read all the data. - num = Msg_ReadUnsignedShort(); + num = Reader_ReadUInt16(msgReader); // Flags. - if(deltaType == DT_SIDE_R6) + /*if(deltaType == DT_SIDE_R6) { // The R6 protocol reserves a single byte for a side delta. - df = Msg_ReadByte(); + df = Reader_ReadByte(msgReader); } - else + else*/ { - df = Msg_ReadPackedLong(); + df = Reader_ReadPackedUInt32(msgReader); } if(df & SIDF_TOP_MATERIAL) - topMat = Msg_ReadPackedShort(); + topMat = Reader_ReadPackedUInt16(msgReader); if(df & SIDF_MID_MATERIAL) - midMat = Msg_ReadPackedShort(); + midMat = Reader_ReadPackedUInt16(msgReader); if(df & SIDF_BOTTOM_MATERIAL) - botMat = Msg_ReadPackedShort(); + botMat = Reader_ReadPackedUInt16(msgReader); if(df & SIDF_LINE_FLAGS) - lineFlags = Msg_ReadByte(); + lineFlags = Reader_ReadByte(msgReader); if(df & SIDF_TOP_COLOR_RED) - toprgb[CR] = Msg_ReadByte() / 255.f; + toprgb[CR] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_TOP_COLOR_GREEN) - toprgb[CG] = Msg_ReadByte() / 255.f; + toprgb[CG] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_TOP_COLOR_BLUE) - toprgb[CB] = Msg_ReadByte() / 255.f; + toprgb[CB] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_MID_COLOR_RED) - midrgba[CR] = Msg_ReadByte() / 255.f; + midrgba[CR] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_MID_COLOR_GREEN) - midrgba[CG] = Msg_ReadByte() / 255.f; + midrgba[CG] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_MID_COLOR_BLUE) - midrgba[CB] = Msg_ReadByte() / 255.f; + midrgba[CB] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_MID_COLOR_ALPHA) - midrgba[CA] = Msg_ReadByte() / 255.f; + midrgba[CA] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_BOTTOM_COLOR_RED) - bottomrgb[CR] = Msg_ReadByte() / 255.f; + bottomrgb[CR] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_BOTTOM_COLOR_GREEN) - bottomrgb[CG] = Msg_ReadByte() / 255.f; + bottomrgb[CG] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_BOTTOM_COLOR_BLUE) - bottomrgb[CB] = Msg_ReadByte() / 255.f; + bottomrgb[CB] = Reader_ReadByte(msgReader) / 255.f; if(df & SIDF_MID_BLENDMODE) - blendmode = Msg_ReadShort() << 16; + blendmode = Reader_ReadInt32(msgReader); if(df & SIDF_FLAGS) - sideFlags = Msg_ReadByte(); + sideFlags = Reader_ReadByte(msgReader); // Must we skip this? if(skip) @@ -890,21 +892,21 @@ void Cl_ReadPolyDelta2(boolean skip) float speed = 0; int destAngle = 0, angleSpeed = 0; - num = Msg_ReadPackedShort(); + num = Reader_ReadPackedUInt16(msgReader); // Flags. - df = Msg_ReadByte(); + df = Reader_ReadByte(msgReader); if(df & PODF_DEST_X) - destX = FIX2FLT((Msg_ReadShort() << 16) + ((char) Msg_ReadByte() << 8)); + destX = FIX2FLT((Reader_ReadInt16(msgReader) << 16) + ((char) Reader_ReadByte(msgReader) << 8)); if(df & PODF_DEST_Y) - destY = FIX2FLT((Msg_ReadShort() << 16) + ((char) Msg_ReadByte() << 8)); + destY = FIX2FLT((Reader_ReadInt16(msgReader) << 16) + ((char) Reader_ReadByte(msgReader) << 8)); if(df & PODF_SPEED) - speed = FIX2FLT(Msg_ReadShort() << 8); + speed = FIX2FLT(Reader_ReadInt16(msgReader) << 8); if(df & PODF_DEST_ANGLE) - destAngle = Msg_ReadShort() << 16; + destAngle = Reader_ReadInt16(msgReader) << 16; if(df & PODF_ANGSPEED) - angleSpeed = Msg_ReadShort() << 16; + angleSpeed = Reader_ReadInt16(msgReader) << 16; /*#ifdef _DEBUG Con_Message("Cl_ReadPolyDelta2: PO %i, angle %f, speed %f\n", num, FIX2FLT(destAngle), FIX2FLT(angleSpeed)); diff --git a/doomsday/engine/portable/src/con_main.c b/doomsday/engine/portable/src/con_main.c index 4215ba510b..0ba93b3c50 100644 --- a/doomsday/engine/portable/src/con_main.c +++ b/doomsday/engine/portable/src/con_main.c @@ -457,15 +457,21 @@ void Con_SetFont(ddfont_t* cfont) */ static void Con_Send(const char *command, byte src, int silent) { - ushort len = (ushort) (strlen(command) + 1); + ushort len = (ushort) strlen(command); + + if(len >= 0x8000) + { + Con_Message("Con_Send: Command is too long, length=%i.\n", len); + return; + } Msg_Begin(PKT_COMMAND2); // Mark high bit for silent commands. - Msg_WriteShort(len | (silent ? 0x8000 : 0)); - Msg_WriteShort(0); // flags. Unused at present. - Msg_WriteByte(src); - Msg_Write(command, len); - // Send it reliably. + Writer_WriteUInt16(msgWriter, len | (silent ? 0x8000 : 0)); + Writer_WriteUInt16(msgWriter, 0); // flags. Unused at present. + Writer_WriteByte(msgWriter, src); + Writer_Write(msgWriter, command, len); + Msg_End(); Net_SendBuffer(0, 0); } diff --git a/doomsday/engine/portable/src/net_demo.c b/doomsday/engine/portable/src/net_demo.c index 6d8bccd770..88de41adc1 100644 --- a/doomsday/engine/portable/src/net_demo.c +++ b/doomsday/engine/portable/src/net_demo.c @@ -427,7 +427,7 @@ boolean Demo_ReadPacket(void) netBuffer.msg.id = 0; netBuffer.msg.type = lzGetC(playdemo); lzRead(netBuffer.msg.data, (long) netBuffer.length, playdemo); - netBuffer.cursor = netBuffer.msg.data; + //netBuffer.cursor = netBuffer.msg.data; /*#if _DEBUG Con_Printf("RDP: pt=%i ang=%i ld=%i len=%i type=%i\n", ptime, @@ -465,28 +465,29 @@ void Demo_WriteLocalCamera(int plrNum) flags &= ~LCAMF_ONGROUND; flags |= LCAMF_CAMERA; } - Msg_WriteByte(flags); + Writer_WriteByte(msgWriter, flags); // Coordinates. x = FLT2FIX(mo->pos[VX]); y = FLT2FIX(mo->pos[VY]); - Msg_WriteShort(x >> 16); - Msg_WriteByte(x >> 8); - Msg_WriteShort(y >> 16); - Msg_WriteByte(y >> 8); + Writer_WriteInt16(msgWriter, x >> 16); + Writer_WriteByte(msgWriter, x >> 8); + Writer_WriteInt16(msgWriter, y >> 16); + Writer_WriteByte(msgWriter, y >> 8); z = FLT2FIX(mo->pos[VZ] + viewData->current.pos[VZ]); - Msg_WriteShort(z >> 16); - Msg_WriteByte(z >> 8); + Writer_WriteInt16(msgWriter, z >> 16); + Writer_WriteByte(msgWriter, z >> 8); - Msg_WriteShort(mo->angle /*ddpl->clAngle*/ >> 16); /* $unifiedangles */ - Msg_WriteShort(ddpl->lookDir / 110 * DDMAXSHORT /* $unifiedangles */); + Writer_WriteInt16(msgWriter, mo->angle /*ddpl->clAngle*/ >> 16); /* $unifiedangles */ + Writer_WriteInt16(msgWriter, ddpl->lookDir / 110 * DDMAXSHORT /* $unifiedangles */); // Field of view is optional. if(incfov) { - Msg_WriteShort(fieldOfView / 180 * DDMAXSHORT); + Writer_WriteInt16(msgWriter, fieldOfView / 180 * DDMAXSHORT); writeInfo[plrNum].fov = fieldOfView; } + Msg_End(); Net_SendBuffer(plrNum, SPF_DONT_SEND); } @@ -515,7 +516,7 @@ void Demo_ReadLocalCamera(void) // Framez keeps track of the current camera Z. demoFrameZ += demoZ; - flags = Msg_ReadByte(); + flags = Reader_ReadByte(msgReader); demoOnGround = (flags & LCAMF_ONGROUND) != 0; if(flags & LCAMF_CAMERA) pl->flags |= DDPF_CAMERA; @@ -524,22 +525,22 @@ void Demo_ReadLocalCamera(void) // X and Y coordinates are easy. Calculate deltas to the new coords. posDelta[VX] = - (FIX2FLT((Msg_ReadShort() << 16) + (Msg_ReadByte() << 8)) - mo->pos[VX]) / intertics; + (FIX2FLT((Reader_ReadInt16(msgReader) << 16) + (Reader_ReadByte(msgReader) << 8)) - mo->pos[VX]) / intertics; posDelta[VY] = - (FIX2FLT((Msg_ReadShort() << 16) + (Msg_ReadByte() << 8)) - mo->pos[VY]) / intertics; + (FIX2FLT((Reader_ReadInt16(msgReader) << 16) + (Reader_ReadByte(msgReader) << 8)) - mo->pos[VY]) / intertics; // The Z coordinate is a bit trickier. We are tracking the *camera's* // Z coordinate (z+viewheight), not the player mobj's Z. - z = FIX2FLT((Msg_ReadShort() << 16) + (Msg_ReadByte() << 8)); + z = FIX2FLT((Reader_ReadInt16(msgReader) << 16) + (Reader_ReadByte(msgReader) << 8)); posDelta[VZ] = (z - demoFrameZ) / LOCALCAM_WRITE_TICS; // View angles. - dang = Msg_ReadShort() << 16; - dlook = Msg_ReadShort() * 110.0f / DDMAXSHORT; + dang = Reader_ReadInt16(msgReader) << 16; + dlook = Reader_ReadInt16(msgReader) * 110.0f / DDMAXSHORT; // FOV included? if(flags & LCAMF_FOV) - fieldOfView = Msg_ReadShort() * 180.0f / DDMAXSHORT; + fieldOfView = Reader_ReadInt16(msgReader) * 180.0f / DDMAXSHORT; if(intertics == 1 || demoFrameZ == 1) { diff --git a/doomsday/engine/portable/src/net_main.c b/doomsday/engine/portable/src/net_main.c index ba53f064b3..76cdb51644 100644 --- a/doomsday/engine/portable/src/net_main.c +++ b/doomsday/engine/portable/src/net_main.c @@ -222,12 +222,12 @@ ident_t Net_GetPlayerID(int player) */ void Net_SendBuffer(int toPlayer, int spFlags) { + assert(!Msg_BeingWritten()); // Must finish writing before calling this. + // Don't send anything during demo playback. if(playback) return; - // Update the length of the message. - netBuffer.length = netBuffer.cursor - netBuffer.msg.data; netBuffer.player = toPlayer; // A rebound packet? @@ -257,7 +257,7 @@ boolean Net_GetPacket(void) { netBuffer = reboundStore; netBuffer.player = consolePlayer; - netBuffer.cursor = netBuffer.msg.data; + //netBuffer.cursor = netBuffer.msg.data; reboundPacket = false; return true; } @@ -280,7 +280,7 @@ boolean Net_GetPacket(void) Demo_WritePacket(consolePlayer); // Reset the cursor for Msg_* routines. - netBuffer.cursor = netBuffer.msg.data; + //netBuffer.cursor = netBuffer.msg.data; return true; } @@ -301,19 +301,11 @@ Smoother* Net_PlayerSmoother(int player) */ void Net_SendPacket(int to_player, int type, void *data, size_t length) { - int flags = 0; - - /* - // What kind of delivery to use? - if(to_player & DDSP_CONFIRM) - flags |= SPF_CONFIRM; - if(to_player & DDSP_ORDERED) - flags |= SPF_ORDERED; - */ + unsigned int flags = 0; Msg_Begin(type); - if(data) - Msg_Write(data, length); + if(data) Writer_Write(msgWriter, data, length); + Msg_End(); if(isClient) { // As a client we can only send messages to the server. @@ -445,46 +437,6 @@ static void Net_DoUpdate(void) lastTime = nowTime; -#if 0 - // Build new ticcmds for console player. - for(i = 0; i < newtics; ++i) - { - DD_ProcessEvents(); - - /*Con_Printf("mktic:%i gt:%i newtics:%i >> %i\n", - maketic, gametic, newtics, maketic-gametic); */ - - if(playback) - { - numlocal = 0; - if(availableTics < LOCALTICS) - availableTics++; - } - else if(!isDedicated && !ui_active) - { - // Place the new ticcmd in the local ticcmds buffer. - ticcmd_t *cmd = Net_LocalCmd(); - - if(cmd) - { - gx.BuildTicCmd(cmd); - - // Set the time stamp. Only the lowest byte is stored. - //cmd->time = gametic + availableTics; - - // Availabletics counts the tics that have cmds. - availableTics++; - if(isClient) - { - // When not playing a demo, this is the last command. - // It is used in local movement prediction. - memcpy(clients[consolePlayer].lastCmd, cmd, sizeof(*cmd)); - } - } - } - } -#endif - // This is as far as dedicated servers go. if(isDedicated) return; @@ -505,31 +457,29 @@ static void Net_DoUpdate(void) mobj_t *mo = ddPlayers[consolePlayer].shared.mo; coordTimer = 1; //netCoordTime; // 35/2 + Msg_Begin(PKT_COORDS); - Msg_WriteFloat(gameTime); - Msg_WriteFloat(mo->pos[VX]); - Msg_WriteFloat(mo->pos[VY]); + Writer_WriteFloat(msgWriter, gameTime); + Writer_WriteFloat(msgWriter, mo->pos[VX]); + Writer_WriteFloat(msgWriter, mo->pos[VY]); if(mo->pos[VZ] == mo->floorZ) { // This'll keep us on the floor even in fast moving sectors. - Msg_WriteLong(DDMININT); + Writer_WriteInt32(msgWriter, DDMININT); } else { - Msg_WriteLong(FLT2FIX(mo->pos[VZ])); + Writer_WriteInt32(msgWriter, FLT2FIX(mo->pos[VZ])); } - /* - Msg_WriteShort((short) (mo->mom[VX] * 256)); - Msg_WriteShort((short) (mo->mom[VY] * 256)); - Msg_WriteShort((short) (mo->mom[VZ] * 256)); - */ // Also include angles. - Msg_WriteShort(mo->angle >> 16); - Msg_WriteShort(P_LookDirToShort(ddPlayers[consolePlayer].shared.lookDir)); + Writer_WriteInt16(msgWriter, mo->angle >> 16); + Writer_WriteInt16(msgWriter, P_LookDirToShort(ddPlayers[consolePlayer].shared.lookDir)); // Control state. - Msg_WriteByte(FLT2FIX(ddPlayers[consolePlayer].shared.forwardMove) >> 13); - Msg_WriteByte(FLT2FIX(ddPlayers[consolePlayer].shared.sideMove) >> 13); - Net_SendBuffer(0, 0); + Writer_WriteByte(msgWriter, FLT2FIX(ddPlayers[consolePlayer].shared.forwardMove) >> 13); + Writer_WriteByte(msgWriter, FLT2FIX(ddPlayers[consolePlayer].shared.sideMove) >> 13); + Msg_End(); + + Net_SendBuffer(0, 0); } } @@ -1118,10 +1068,13 @@ D_CMD(Chat) Con_Error("CCMD_Chat: Invalid value, mode = %i.", mode); break; } + Msg_Begin(PKT_CHAT); - Msg_WriteByte(consolePlayer); - Msg_WriteShort(mask); - Msg_Write(buffer, strlen(buffer) + 1); + Writer_WriteByte(msgWriter, consolePlayer); + Writer_WriteUInt16(msgWriter, mask); + Writer_WriteUInt16(msgWriter, strlen(buffer)); + Writer_Write(msgWriter, buffer, strlen(buffer)); + Msg_End(); if(!isClient) { diff --git a/doomsday/engine/portable/src/net_msg.c b/doomsday/engine/portable/src/net_msg.c index 7b1ffb4cb0..9429c1bb3a 100644 --- a/doomsday/engine/portable/src/net_msg.c +++ b/doomsday/engine/portable/src/net_msg.c @@ -41,217 +41,63 @@ # include "de_console.h" #endif -// MACROS ------------------------------------------------------------------ - -#ifdef _DEBUG -# define CHECK_OVERFLOW(s) if(Msg_Offset() >= NETBUFFER_ACTUALSIZE - s) Con_Error("net_msg: Buffer about to overflow!\n"); -#else -# define CHECK_OVERFLOW(s) -#endif - -// TYPES ------------------------------------------------------------------- - -// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- - -// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- - -// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- - -// EXTERNAL DATA DECLARATIONS ---------------------------------------------- - -// PUBLIC DATA DEFINITIONS ------------------------------------------------- - -// PRIVATE DATA DEFINITIONS ------------------------------------------------ - -// CODE -------------------------------------------------------------------- +Writer* msgWriter; +Reader* msgReader; void Msg_Begin(int type) { - netBuffer.cursor = netBuffer.msg.data; - netBuffer.length = 0; - netBuffer.msg.type = type; -} - -void Msg_WriteByte(byte b) -{ - CHECK_OVERFLOW(1); - *netBuffer.cursor++ = b; -} - -byte Msg_ReadByte(void) -{ -#ifdef _DEBUG - if(Msg_Offset() >= netBuffer.length) - Con_Error("Msg_ReadByte: Packet read overflow!\n"); -#endif - return *netBuffer.cursor++; -} + if(msgReader) + { + // End reading the netbuffer automatically. + Msg_EndRead(); + } -void Msg_WriteShort(short w) -{ - CHECK_OVERFLOW(2); - *(short *) netBuffer.cursor = SHORT(w); - netBuffer.cursor += 2; -} + // The previous write must have been ended by now. + assert(msgWriter == NULL); -short Msg_ReadShort(void) -{ -#ifdef _DEBUG - if(Msg_Offset() >= netBuffer.length) - Con_Error("Msg_ReadShort: Packet read overflow!\n"); -#endif - netBuffer.cursor += 2; - return SHORT( *(short *) (netBuffer.cursor - 2) ); + // Allocate a new writer. + msgWriter = Writer_New(); + netBuffer.msg.type = type; } -unsigned short Msg_ReadUnsignedShort(void) +boolean Msg_BeingWritten(void) { - return (unsigned short) Msg_ReadShort(); + return msgWriter != NULL; } -/** - * Only 15 bits can be used for the number because the high bit of the - * lower byte is used to determine whether the upper byte follows or not. - */ -void Msg_WritePackedShort(short w) +void Msg_End(void) { - CHECK_OVERFLOW(2); - - if(w < 0) + if(msgWriter) { - Con_Error("Msg_WritePackedShort: Cannot write %i.\n", w); - } - - // Can the number be represented with 7 bits? - if(w < 0x80) - { - Msg_WriteByte(w); + // Finalize the netbuffer. + netBuffer.length = Writer_Size(msgWriter); + Writer_Destruct(msgWriter); + msgWriter = 0; } else { - Msg_WriteByte(0x80 | (w & 0x7f)); - Msg_WriteByte(w >> 7); // Highest bit is lost. + Con_Error("Msg_End: No message being written.\n"); } } -/** - * Only 15 bits can be used for the number because the high bit of the - * lower byte is used to determine whether the upper byte follows or not. - */ -short Msg_ReadPackedShort(void) +void Msg_Read(void) { - ushort pack = *netBuffer.cursor++; - - if(pack & 0x80) + if(msgWriter) { - pack &= ~0x80; - pack |= (*netBuffer.cursor++) << 7; + // End writing the netbuffer automatically. + Msg_End(); } - return pack; -} - -void Msg_WriteLong(int l) -{ - CHECK_OVERFLOW(4); - *(int*) netBuffer.cursor = LONG(l); - netBuffer.cursor += 4; -} -int Msg_ReadLong(void) -{ -#ifdef _DEBUG - if(Msg_Offset() >= netBuffer.length) - Con_Error("Msg_ReadLong: Packet read overflow!\n"); -#endif - netBuffer.cursor += 4; - return LONG( *(int *) (netBuffer.cursor - 4) ); -} - -void Msg_WriteFloat(float f) -{ - Msg_WriteLong(*(int*)&f); + // Start reading from the netbuffer. + assert(msgReader == NULL); + msgReader = Reader_New(); } -float Msg_ReadFloat(void) +void Msg_EndRead(void) { - int v = Msg_ReadLong(); - return *(float*) &v; -} - -void Msg_WritePackedLong(uint l) -{ - CHECK_OVERFLOW(5); - - while(l >= 0x80) + if(msgReader) { - // Write the lowest 7 bits, and set the high bit to indicate that - // at least one more byte will follow. - Msg_WriteByte(0x80 | (l & 0x7f)); - - l >>= 7; + Reader_Destruct(msgReader); + msgReader = 0; } - // Write the last byte, with the high bit clear. - Msg_WriteByte(l); -} - -uint Msg_ReadPackedLong(void) -{ - byte pack = 0; - int pos = 0; - uint value = 0; - - do - { -#ifdef _DEBUG - if(Msg_Offset() >= netBuffer.length) - Con_Error("Msg_ReadPackedLong: Packet read overflow!\n"); -#endif - - pack = *netBuffer.cursor++; - value |= ((pack & 0x7f) << pos); - pos += 7; - } while(pack & 0x80); - - return value; -} - -void Msg_Write(const void *src, size_t len) -{ - CHECK_OVERFLOW(len); - - memcpy(netBuffer.cursor, src, len); - netBuffer.cursor += len; -} - -void Msg_Read(void *dest, size_t len) -{ -#ifdef _DEBUG - if(Msg_Offset() >= netBuffer.length) - Con_Error("Msg_Read: Packet read overflow!\n"); -#endif - memcpy(dest, netBuffer.cursor, len); - netBuffer.cursor += len; -} - -size_t Msg_Offset(void) -{ - return netBuffer.cursor - netBuffer.msg.data; -} - -void Msg_SetOffset(size_t offset) -{ - netBuffer.cursor = netBuffer.msg.data + offset; -} - -size_t Msg_MemoryLeft(void) -{ - return NETBUFFER_MAXDATA - (netBuffer.cursor - netBuffer.msg.data); -} - -boolean Msg_End(void) -{ - if((size_t) (netBuffer.cursor - netBuffer.msg.data) >= netBuffer.length) - return true; - - return false; } diff --git a/doomsday/engine/portable/src/net_ping.c b/doomsday/engine/portable/src/net_ping.c index 2c48ca6c2e..f443fa0e73 100644 --- a/doomsday/engine/portable/src/net_ping.c +++ b/doomsday/engine/portable/src/net_ping.c @@ -115,10 +115,10 @@ void Net_SendPing(int player, int count) // Send a new ping. Msg_Begin(PKT_PING); cl->ping.sent = Sys_GetRealTime(); - Msg_WriteLong(cl->ping.sent); + Writer_WriteUInt32(msgWriter, cl->ping.sent); + Msg_End(); // Update the length of the message. - netBuffer.length = netBuffer.cursor - netBuffer.msg.data; netBuffer.player = player; N_SendPacket(10000); } @@ -126,8 +126,8 @@ void Net_SendPing(int player, int count) // Called when a ping packet comes in. void Net_PingResponse(void) { - client_t *cl = &clients[netBuffer.player]; - int time = Msg_ReadLong(); + client_t* cl = &clients[netBuffer.player]; + unsigned int time = Reader_ReadUInt32(msgReader); // Is this a response to our ping? if(time == cl->ping.sent) diff --git a/doomsday/engine/portable/src/reader.c b/doomsday/engine/portable/src/reader.c index 2b07c6d0ea..dbc10340df 100644 --- a/doomsday/engine/portable/src/reader.c +++ b/doomsday/engine/portable/src/reader.c @@ -86,6 +86,12 @@ void Reader_SetPos(Reader* reader, size_t newPos) Reader_Check(reader, 0); } +boolean Reader_AtEnd(const Reader* reader) +{ + Reader_Check(reader, 0); + return reader->pos == reader->size; +} + int8_t Reader_ReadChar(Reader* reader) { if(!Reader_Check(reader, 1)) return 0; diff --git a/doomsday/engine/portable/src/sv_frame.c b/doomsday/engine/portable/src/sv_frame.c index 3eb5bd5e79..14cc5cf659 100644 --- a/doomsday/engine/portable/src/sv_frame.c +++ b/doomsday/engine/portable/src/sv_frame.c @@ -274,13 +274,13 @@ void Sv_WriteMobjDelta(const void* deltaPtr) #endif // First the mobj ID number and flags. - Msg_WriteShort(delta->delta.id); - Msg_WriteShort(df & 0xffff); + Writer_WriteUInt16(msgWriter, delta->delta.id); + Writer_WriteUInt16(msgWriter, df & 0xffff); // More flags? if(df & MDF_MORE_FLAGS) { - Msg_WriteByte(moreFlags); + Writer_WriteByte(msgWriter, moreFlags); } // Coordinates with three bytes. @@ -288,88 +288,88 @@ void Sv_WriteMobjDelta(const void* deltaPtr) { fixed_t vx = FLT2FIX(d->pos[VX]); - Msg_WriteShort(vx >> FRACBITS); - Msg_WriteByte(vx >> 8); + Writer_WriteInt16(msgWriter, vx >> FRACBITS); + Writer_WriteByte(msgWriter, vx >> 8); } if(df & MDF_POS_Y) { fixed_t vy = FLT2FIX(d->pos[VY]); - Msg_WriteShort(vy >> FRACBITS); - Msg_WriteByte(vy >> 8); + Writer_WriteInt16(msgWriter, vy >> FRACBITS); + Writer_WriteByte(msgWriter, vy >> 8); } if(df & MDF_POS_Z) { fixed_t vz = FLT2FIX(d->pos[VZ]); - Msg_WriteShort(vz >> FRACBITS); - Msg_WriteByte(vz >> 8); + Writer_WriteInt16(msgWriter, vz >> FRACBITS); + Writer_WriteByte(msgWriter, vz >> 8); - Msg_WriteFloat(d->floorZ); - Msg_WriteFloat(d->ceilingZ); + Writer_WriteFloat(msgWriter, d->floorZ); + Writer_WriteFloat(msgWriter, d->ceilingZ); } // Momentum using 8.8 fixed point. if(df & MDF_MOM_X) { fixed_t mx = FLT2FIX(d->mom[MX]); - Msg_WriteShort(moreFlags & MDFE_FAST_MOM ? FIXED10_6(mx) : FIXED8_8(mx)); + Writer_WriteInt16(msgWriter, moreFlags & MDFE_FAST_MOM ? FIXED10_6(mx) : FIXED8_8(mx)); } if(df & MDF_MOM_Y) { fixed_t my = FLT2FIX(d->mom[MY]); - Msg_WriteShort(moreFlags & MDFE_FAST_MOM ? FIXED10_6(my) : FIXED8_8(my)); + Writer_WriteInt16(msgWriter, moreFlags & MDFE_FAST_MOM ? FIXED10_6(my) : FIXED8_8(my)); } if(df & MDF_MOM_Z) { fixed_t mz = FLT2FIX(d->mom[MZ]); - Msg_WriteShort(moreFlags & MDFE_FAST_MOM ? FIXED10_6(mz) : FIXED8_8(mz)); + Writer_WriteInt16(msgWriter, moreFlags & MDFE_FAST_MOM ? FIXED10_6(mz) : FIXED8_8(mz)); } // Angles with 16-bit accuracy. if(df & MDF_ANGLE) - Msg_WriteShort(d->angle >> 16); + Writer_WriteInt16(msgWriter, d->angle >> 16); if(df & MDF_SELECTOR) - Msg_WritePackedShort(d->selector); + Writer_WritePackedUInt16(msgWriter, d->selector); if(df & MDF_SELSPEC) - Msg_WriteByte(d->selector >> 24); + Writer_WriteByte(msgWriter, d->selector >> 24); if((df & MDF_STATE) && d->state) { - Msg_WritePackedShort(d->state - states); + Writer_WritePackedUInt16(msgWriter, d->state - states); } if(df & MDF_FLAGS) { - Msg_WriteLong(d->ddFlags & DDMF_PACK_MASK); - Msg_WriteLong(d->flags); - Msg_WriteLong(d->flags2); - Msg_WriteLong(d->flags3); + Writer_WriteUInt32(msgWriter, d->ddFlags & DDMF_PACK_MASK); + Writer_WriteUInt32(msgWriter, d->flags); + Writer_WriteUInt32(msgWriter, d->flags2); + Writer_WriteUInt32(msgWriter, d->flags3); } if(df & MDF_HEALTH) - Msg_WriteLong(d->health); + Writer_WriteUInt32(msgWriter, d->health); if(df & MDF_RADIUS) - Msg_WriteFloat(d->radius); + Writer_WriteFloat(msgWriter, d->radius); if(df & MDF_HEIGHT) - Msg_WriteFloat(d->height); + Writer_WriteFloat(msgWriter, d->height); if(df & MDF_FLOORCLIP) - Msg_WriteFloat(d->floorClip); + Writer_WriteFloat(msgWriter, d->floorClip); if(df & MDFC_TRANSLUCENCY) - Msg_WriteByte(d->translucency); + Writer_WriteByte(msgWriter, d->translucency); if(df & MDFC_FADETARGET) - Msg_WriteByte((byte)(d->visTarget +1)); + Writer_WriteByte(msgWriter, (byte)(d->visTarget +1)); if(df & MDFC_TYPE) - Msg_WriteLong(d->type); + Writer_WriteInt32(msgWriter, d->type); } /** @@ -384,23 +384,23 @@ void Sv_WritePlayerDelta(const void* deltaPtr) int psdf, i, k; // First the player number. Upper three bits contain flags. - Msg_WriteByte(delta->delta.id | (df >> 8)); + Writer_WriteByte(msgWriter, delta->delta.id | (df >> 8)); // Flags. What elements are included in the delta? - Msg_WriteByte(df & 0xff); + Writer_WriteByte(msgWriter, df & 0xff); if(df & PDF_MOBJ) - Msg_WriteShort(d->mobj); + Writer_WriteInt16(msgWriter, d->mobj); if(df & PDF_FORWARDMOVE) - Msg_WriteByte(d->forwardMove); + Writer_WriteByte(msgWriter, d->forwardMove); if(df & PDF_SIDEMOVE) - Msg_WriteByte(d->sideMove); + Writer_WriteByte(msgWriter, d->sideMove); /*if(df & PDF_ANGLE) - Msg_WriteByte(d->angle >> 24);*/ + Writer_WriteByte(msgWriter, d->angle >> 24);*/ if(df & PDF_TURNDELTA) - Msg_WriteByte((d->turnDelta * 16) >> 24); + Writer_WriteByte(msgWriter, (d->turnDelta * 16) >> 24); if(df & PDF_FRICTION) - Msg_WriteByte(FLT2FIX(d->friction) >> 8); + Writer_WriteByte(msgWriter, FLT2FIX(d->friction) >> 8); if(df & PDF_EXTRALIGHT) { // Three bits is enough for fixedcolormap. @@ -410,14 +410,10 @@ void Sv_WritePlayerDelta(const void* deltaPtr) if(i > 7) i = 7; // Write the five upper bytes of extraLight. - Msg_WriteByte(i | (d->extraLight & 0xf8)); + Writer_WriteByte(msgWriter, i | (d->extraLight & 0xf8)); } if(df & PDF_FILTER) - Msg_WriteLong(d->filter); -/* if(df & PDF_CLYAW) - Msg_WriteShort(d->clYaw >> 16); - if(df & PDF_CLPITCH) - Msg_WriteShort(d->clPitch / 110 * DDMAXSHORT);*/ /* $unifiedangles */ + Writer_WriteUInt32(msgWriter, d->filter); if(df & PDF_PSPRITES) // Only set if there's something to write. { for(i = 0; i < 2; ++i) @@ -425,13 +421,10 @@ void Sv_WritePlayerDelta(const void* deltaPtr) psdf = df >> (16 + i * 8); psp = d->psp + i; // First the flags. - Msg_WriteByte(psdf); + Writer_WriteByte(msgWriter, psdf); if(psdf & PSDF_STATEPTR) { - if(psp->statePtr) - Msg_WritePackedShort(psp->statePtr - states + 1); - else - Msg_WritePackedShort(0); + Writer_WritePackedUInt16(msgWriter, psp->statePtr? (psp->statePtr - states + 1) : 0); } /*if(psdf & PSDF_LIGHT) { @@ -440,7 +433,7 @@ void Sv_WritePlayerDelta(const void* deltaPtr) k = 0; if(k > 255) k = 255; - Msg_WriteByte(k); + Writer_WriteByte(msgWriter, k); }*/ if(psdf & PSDF_ALPHA) { @@ -449,16 +442,16 @@ void Sv_WritePlayerDelta(const void* deltaPtr) k = 0; if(k > 255) k = 255; - Msg_WriteByte(k); + Writer_WriteByte(msgWriter, k); } if(psdf & PSDF_STATE) { - Msg_WriteByte(psp->state); + Writer_WriteByte(msgWriter, psp->state); } if(psdf & PSDF_OFFSET) { - Msg_WriteByte(CLAMPED_CHAR(psp->offset[VX] / 2)); - Msg_WriteByte(CLAMPED_CHAR(psp->offset[VY] / 2)); + Writer_WriteByte(msgWriter, CLAMPED_CHAR(psp->offset[VX] / 2)); + Writer_WriteByte(msgWriter, CLAMPED_CHAR(psp->offset[VY] / 2)); } } } @@ -498,81 +491,79 @@ void Sv_WriteSectorDelta(const void* deltaPtr) } // Sector number first. - Msg_WriteShort(delta->delta.id); + Writer_WriteUInt16(msgWriter, delta->delta.id); // Flags. - Msg_WritePackedLong(df); + Writer_WritePackedUInt32(msgWriter, df); if(df & SDF_FLOOR_MATERIAL) - Msg_WritePackedShort(P_ToMaterialNum(d->planes[PLN_FLOOR].surface.material)); + Writer_WritePackedUInt16(msgWriter, P_ToMaterialNum(d->planes[PLN_FLOOR].surface.material)); if(df & SDF_CEILING_MATERIAL) - Msg_WritePackedShort(P_ToMaterialNum(d->planes[PLN_CEILING].surface.material)); + Writer_WritePackedUInt16(msgWriter, P_ToMaterialNum(d->planes[PLN_CEILING].surface.material)); if(df & SDF_LIGHT) { // Must fit into a byte. - int lightlevel = (int) (255.0f * d->lightLevel); + int lightlevel = (int) (255.0f * d->lightLevel); + lightlevel = (lightlevel < 0 ? 0 : lightlevel > 255 ? 255 : lightlevel); - lightlevel = (lightlevel < 0 ? 0 : lightlevel > - 255 ? 255 : lightlevel); - - Msg_WriteByte((byte) lightlevel); + Writer_WriteByte(msgWriter, (byte) lightlevel); } if(df & SDF_FLOOR_HEIGHT) { - Msg_WriteShort(FLT2FIX(d->planes[PLN_FLOOR].height) >> 16); + Writer_WriteInt16(msgWriter, FLT2FIX(d->planes[PLN_FLOOR].height) >> 16); } if(df & SDF_CEILING_HEIGHT) { #ifdef _DEBUG -VERBOSE( Con_Printf("Sv_WriteSectorDelta: (%i) Absolute ceiling height=%f\n", + VERBOSE( Con_Printf("Sv_WriteSectorDelta: (%i) Absolute ceiling height=%f\n", delta->delta.id, d->planes[PLN_CEILING].height) ); #endif - Msg_WriteShort(FLT2FIX(d->planes[PLN_CEILING].height) >> 16); + Writer_WriteInt16(msgWriter, FLT2FIX(d->planes[PLN_CEILING].height) >> 16); } if(df & SDF_FLOOR_TARGET) - Msg_WriteShort(FLT2FIX(d->planes[PLN_FLOOR].target) >> 16); + Writer_WriteInt16(msgWriter, FLT2FIX(d->planes[PLN_FLOOR].target) >> 16); if(df & SDF_FLOOR_SPEED) // 7.1/4.4 fixed-point - Msg_WriteByte(floorspd); + Writer_WriteByte(msgWriter, floorspd); if(df & SDF_CEILING_TARGET) - Msg_WriteShort(FLT2FIX(d->planes[PLN_CEILING].target) >> 16); + Writer_WriteInt16(msgWriter, FLT2FIX(d->planes[PLN_CEILING].target) >> 16); if(df & SDF_CEILING_SPEED) // 7.1/4.4 fixed-point - Msg_WriteByte(ceilspd); + Writer_WriteByte(msgWriter, ceilspd); if(df & SDF_COLOR_RED) - Msg_WriteByte((byte) (255 * d->rgb[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->rgb[0])); if(df & SDF_COLOR_GREEN) - Msg_WriteByte((byte) (255 * d->rgb[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->rgb[1])); if(df & SDF_COLOR_BLUE) - Msg_WriteByte((byte) (255 * d->rgb[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->rgb[2])); if(df & SDF_FLOOR_COLOR_RED) - Msg_WriteByte((byte) (255 * d->planes[PLN_FLOOR].surface.rgba[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_FLOOR].surface.rgba[0])); if(df & SDF_FLOOR_COLOR_GREEN) - Msg_WriteByte((byte) (255 * d->planes[PLN_FLOOR].surface.rgba[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_FLOOR].surface.rgba[1])); if(df & SDF_FLOOR_COLOR_BLUE) - Msg_WriteByte((byte) (255 * d->planes[PLN_FLOOR].surface.rgba[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_FLOOR].surface.rgba[2])); if(df & SDF_CEIL_COLOR_RED) - Msg_WriteByte((byte) (255 * d->planes[PLN_CEILING].surface.rgba[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_CEILING].surface.rgba[0])); if(df & SDF_CEIL_COLOR_GREEN) - Msg_WriteByte((byte) (255 * d->planes[PLN_CEILING].surface.rgba[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_CEILING].surface.rgba[1])); if(df & SDF_CEIL_COLOR_BLUE) - Msg_WriteByte((byte) (255 * d->planes[PLN_CEILING].surface.rgba[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_CEILING].surface.rgba[2])); /* if(df & SDF_FLOOR_GLOW_RED) - Msg_WriteByte((byte) (255 * d->planes[PLN_FLOOR].glowRGB[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_FLOOR].glowRGB[0])); if(df & SDF_FLOOR_GLOW_GREEN) - Msg_WriteByte((byte) (255 * d->planes[PLN_FLOOR].glowRGB[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_FLOOR].glowRGB[1])); if(df & SDF_FLOOR_GLOW_BLUE) - Msg_WriteByte((byte) (255 * d->planes[PLN_FLOOR].glowRGB[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_FLOOR].glowRGB[2])); if(df & SDF_CEIL_GLOW_RED) - Msg_WriteByte((byte) (255 * d->planes[PLN_CEILING].glowRGB[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_CEILING].glowRGB[0])); if(df & SDF_CEIL_GLOW_GREEN) - Msg_WriteByte((byte) (255 * d->planes[PLN_CEILING].glowRGB[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_CEILING].glowRGB[1])); if(df & SDF_CEIL_GLOW_BLUE) - Msg_WriteByte((byte) (255 * d->planes[PLN_CEILING].glowRGB[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->planes[PLN_CEILING].glowRGB[2])); if(df & SDF_FLOOR_GLOW) Msg_WriteShort(d->planes[PLN_FLOOR].glow < 0 ? 0 : @@ -595,49 +586,49 @@ void Sv_WriteSideDelta(const void* deltaPtr) int df = delta->delta.flags; // Side number first. - Msg_WriteShort(delta->delta.id); + Writer_WriteUInt16(msgWriter, delta->delta.id); // Flags. - Msg_WritePackedLong(df); + Writer_WritePackedUInt32(msgWriter, df); if(df & SIDF_TOP_MATERIAL) - Msg_WritePackedShort(P_ToMaterialNum(d->top.material)); + Writer_WritePackedUInt16(msgWriter, P_ToMaterialNum(d->top.material)); if(df & SIDF_MID_MATERIAL) - Msg_WritePackedShort(P_ToMaterialNum(d->middle.material)); + Writer_WritePackedUInt16(msgWriter, P_ToMaterialNum(d->middle.material)); if(df & SIDF_BOTTOM_MATERIAL) - Msg_WritePackedShort(P_ToMaterialNum(d->bottom.material)); + Writer_WritePackedUInt16(msgWriter, P_ToMaterialNum(d->bottom.material)); if(df & SIDF_LINE_FLAGS) - Msg_WriteByte(d->lineFlags); + Writer_WriteByte(msgWriter, d->lineFlags); if(df & SIDF_TOP_COLOR_RED) - Msg_WriteByte((byte) (255 * d->top.rgba[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->top.rgba[0])); if(df & SIDF_TOP_COLOR_GREEN) - Msg_WriteByte((byte) (255 * d->top.rgba[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->top.rgba[1])); if(df & SIDF_TOP_COLOR_BLUE) - Msg_WriteByte((byte) (255 * d->top.rgba[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->top.rgba[2])); if(df & SIDF_MID_COLOR_RED) - Msg_WriteByte((byte) (255 * d->middle.rgba[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->middle.rgba[0])); if(df & SIDF_MID_COLOR_GREEN) - Msg_WriteByte((byte) (255 * d->middle.rgba[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->middle.rgba[1])); if(df & SIDF_MID_COLOR_BLUE) - Msg_WriteByte((byte) (255 * d->middle.rgba[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->middle.rgba[2])); if(df & SIDF_MID_COLOR_ALPHA) - Msg_WriteByte((byte) (255 * d->middle.rgba[3])); + Writer_WriteByte(msgWriter, (byte) (255 * d->middle.rgba[3])); if(df & SIDF_BOTTOM_COLOR_RED) - Msg_WriteByte((byte) (255 * d->bottom.rgba[0])); + Writer_WriteByte(msgWriter, (byte) (255 * d->bottom.rgba[0])); if(df & SIDF_BOTTOM_COLOR_GREEN) - Msg_WriteByte((byte) (255 * d->bottom.rgba[1])); + Writer_WriteByte(msgWriter, (byte) (255 * d->bottom.rgba[1])); if(df & SIDF_BOTTOM_COLOR_BLUE) - Msg_WriteByte((byte) (255 * d->bottom.rgba[2])); + Writer_WriteByte(msgWriter, (byte) (255 * d->bottom.rgba[2])); if(df & SIDF_MID_BLENDMODE) - Msg_WriteShort(d->middle.blendMode >> 16); + Writer_WriteInt32(msgWriter, d->middle.blendMode); if(df & SIDF_FLAGS) - Msg_WriteByte(d->flags); + Writer_WriteByte(msgWriter, d->flags); } /** @@ -657,27 +648,27 @@ void Sv_WritePolyDelta(const void* deltaPtr) } // Poly number first. - Msg_WritePackedShort(delta->delta.id); + Writer_WritePackedUInt16(msgWriter, delta->delta.id); // Flags. - Msg_WriteByte(df & 0xff); + Writer_WriteByte(msgWriter, df & 0xff); if(df & PODF_DEST_X) { - Msg_WriteShort(FLT2FIX(d->dest.pos[VX]) >> 16); - Msg_WriteByte(FLT2FIX(d->dest.pos[VX]) >> 8); + Writer_WriteInt16(msgWriter, FLT2FIX(d->dest.pos[VX]) >> 16); + Writer_WriteByte(msgWriter, FLT2FIX(d->dest.pos[VX]) >> 8); } if(df & PODF_DEST_Y) { - Msg_WriteShort(FLT2FIX(d->dest.pos[VY]) >> 16); - Msg_WriteByte(FLT2FIX(d->dest.pos[VY]) >> 8); + Writer_WriteInt16(msgWriter, FLT2FIX(d->dest.pos[VY]) >> 16); + Writer_WriteByte(msgWriter, FLT2FIX(d->dest.pos[VY]) >> 8); } if(df & PODF_SPEED) - Msg_WriteShort(FLT2FIX(d->speed) >> 8); + Writer_WriteInt16(msgWriter, FLT2FIX(d->speed) >> 8); if(df & PODF_DEST_ANGLE) - Msg_WriteShort(d->destAngle >> 16); + Writer_WriteInt16(msgWriter, d->destAngle >> 16); if(df & PODF_ANGSPEED) - Msg_WriteShort(d->angleSpeed >> 16); + Writer_WriteInt16(msgWriter, d->angleSpeed >> 16); } /** @@ -689,10 +680,10 @@ void Sv_WriteSoundDelta(const void* deltaPtr) int df = delta->delta.flags; // This is either the sound ID, emitter ID or sector index. - Msg_WriteShort(delta->delta.id); + Writer_WriteUInt16(msgWriter, delta->delta.id); // First the flags byte. - Msg_WriteByte(df & 0xff); + Writer_WriteByte(msgWriter, df & 0xff); switch(delta->delta.type) { @@ -700,7 +691,7 @@ void Sv_WriteSoundDelta(const void* deltaPtr) case DT_SECTOR_SOUND: case DT_POLY_SOUND: // The sound ID. - Msg_WriteShort(delta->sound); + Writer_WriteUInt16(msgWriter, delta->sound); break; default: @@ -713,16 +704,16 @@ void Sv_WriteSoundDelta(const void* deltaPtr) if(delta->volume > 1) { // Very loud indeed. - Msg_WriteByte(255); + Writer_WriteByte(msgWriter, 255); } else if(delta->volume <= 0) { // Silence. - Msg_WriteByte(0); + Writer_WriteByte(msgWriter, 0); } else { - Msg_WriteByte(delta->volume * 127 + 0.5f); + Writer_WriteByte(msgWriter, delta->volume * 127 + 0.5f); } } } @@ -750,7 +741,7 @@ if(type >= NUM_DELTA_TYPES) type |= DT_RESENT; } - Msg_WriteByte(type); + Writer_WriteByte(msgWriter, type); // Include the set number? if(type & DT_RESENT) @@ -759,12 +750,12 @@ if(type >= NUM_DELTA_TYPES) // received the set this delta belongs to, it means the delta has // already been received. This is needed in the situation where the // ack is lost or delayed. - Msg_WriteByte(delta->set); + Writer_WriteByte(msgWriter, delta->set); // Also send the unique ID of this delta. If the client has already // received a delta with this ID, the delta is discarded. This is // needed in the situation where the set is lost. - Msg_WriteByte(delta->resend); + Writer_WriteByte(msgWriter, delta->resend); } } @@ -792,7 +783,7 @@ void Sv_WriteDelta(const delta_t* delta) { // This'll be the entire delta. No more data is needed. Sv_WriteDeltaHeader(DT_NULL_MOBJ, delta); - Msg_WriteShort(delta->id); + Writer_WriteUInt16(msgWriter, delta->id); #ifdef _NETDEBUG goto writeDeltaLength; #else @@ -923,13 +914,13 @@ void Sv_SendFrame(int plrNum) Msg_Begin(pool->isFirst ? PSV_FIRST_FRAME2 : PSV_FRAME2); // First send the gameTime of this frame. - Msg_WriteFloat(gameTime); + Writer_WriteFloat(msgWriter, gameTime); /* // The first byte contains the set number, which identifies this // frame. The client will keep track of the numbers to detect // duplicates. - Msg_WriteByte(pool->setDealer); + Writer_WriteByte(msgWriter, pool->setDealer); */ // The number of deltas in the packet will be here. @@ -947,7 +938,7 @@ Con_Printf("set%i\n", pool->setDealer); */ // Keep writing until the maximum size is reached. while((delta = Sv_PoolQueueExtract(pool)) != NULL && - (lastStart = Msg_Offset()) < maxFrameSize) + (lastStart = Writer_Size(msgWriter)) < maxFrameSize) { oldResend = pool->resendDealer; @@ -962,7 +953,7 @@ Con_Printf("set%i\n", pool->setDealer); Sv_WriteDelta(delta); // Did we go over the limit? - if(Msg_Offset() > maxFrameSize) + if(Writer_Size(msgWriter) > maxFrameSize) { /* // Time to see if BWR needs to be adjusted. @@ -973,7 +964,7 @@ Con_Printf("set%i\n", pool->setDealer); */ // Cancel the last delta. - Msg_SetOffset(lastStart); + Writer_SetPos(msgWriter, lastStart); // Restore the resend dealer. if(oldResend) @@ -1014,6 +1005,8 @@ if(delta->state == DELTA_UNACKED) #endif */ + Msg_End(); + Net_SendBuffer(plrNum, 0); // Once sent, the delta set can be discarded. diff --git a/doomsday/engine/portable/src/sv_main.c b/doomsday/engine/portable/src/sv_main.c index c37b8015fd..e6a2c1d410 100644 --- a/doomsday/engine/portable/src/sv_main.c +++ b/doomsday/engine/portable/src/sv_main.c @@ -345,18 +345,21 @@ void Sv_HandlePacket(void) int msgfrom; char *msg; char buf[17]; + size_t len; #ifdef _DEBUG Con_Message("Sv_HandlePacket: type=%i\n", netBuffer.msg.type); Con_Message("Sv_HandlePacket: length=%li\n", netBuffer.length); #endif + Msg_BeginRead(); + switch(netBuffer.msg.type) { case PCL_HELLO: case PCL_HELLO2: // Get the ID of the client. - id = Msg_ReadLong(); + id = Reader_ReadUInt32(msgReader); Con_Printf("Sv_HandlePacket: Hello from client %i (%08X).\n", from, id); @@ -386,7 +389,7 @@ void Sv_HandlePacket(void) if(netBuffer.msg.type == PCL_HELLO2) { // Check the game mode (max 16 chars). - Msg_Read(buf, 16); + Reader_Read(msgReader, buf, 16); if(strnicmp(buf, gx.GetVariable(DD_GAME_MODE), 16)) { Con_Printf(" Bad Game ID: %-.16s (expected %s)\n", buf, (char*)gx.GetVariable(DD_GAME_MODE)); @@ -437,10 +440,8 @@ Con_Printf("Sv_HandlePacket: OK (\"ready!\") from client %i " sender->handshake = false; // Send a clock sync message. Msg_Begin(PSV_SYNC); - Msg_WriteLong(SECONDS_TO_TICKS(gameTime) + - (sender->shakePing * 35) / 2000); - // Send reliably, although if it has to be resent, the tics - // will already be way off... + Writer_WriteFloat(msgWriter, gameTime); + Msg_End(); Net_SendBuffer(from, 0); // Send welcome string. Sv_SendText(from, SV_CONSOLE_FLAGS, SV_WELCOME_STRING "\n"); @@ -449,20 +450,14 @@ Con_Printf("Sv_HandlePacket: OK (\"ready!\") from client %i " case PKT_CHAT: // The first byte contains the sender. - msgfrom = Msg_ReadByte(); + msgfrom = Reader_ReadByte(msgReader); // Is the message for us? - mask = Msg_ReadUnsignedShort(); + mask = Reader_ReadUInt16(msgReader); // Copy the message into a buffer. - - // integer overflow in PKT_CHAT attacks us with an incomplete PKT_CHAT packet - // with a size less then 3. As we will replace the entire netcode, lets bandaid this - // by breaking out. Yagisan - if(netBuffer.length <=3) - break; - - // end of bandaid - msg = M_Malloc(netBuffer.length - 3); - strcpy(msg, (char *) netBuffer.cursor); + len = Reader_ReadUInt16(msgReader); + msg = M_Malloc(len + 1); + Reader_Read(msgReader, msg, len); + msg[len] = 0; // Message for us? Show it locally. if(mask & 1) { @@ -472,9 +467,11 @@ Con_Printf("Sv_HandlePacket: OK (\"ready!\") from client %i " // Servers relay chat messages to all the recipients. Msg_Begin(PKT_CHAT); - Msg_WriteByte(msgfrom); - Msg_WriteShort(mask); - Msg_Write(msg, strlen(msg) + 1); + Writer_WriteByte(msgWriter, msgfrom); + Writer_WriteUInt16(msgWriter, mask); + Writer_WriteUInt16(msgWriter, strlen(msg)); + Writer_Write(msgWriter, msg, strlen(msg)); + Msg_End(); for(i = 1; i < DDMAXPLAYERS; ++i) if(ddPlayers[i].shared.inGame && (mask & (1 << i)) && i != from) { @@ -484,9 +481,8 @@ Con_Printf("Sv_HandlePacket: OK (\"ready!\") from client %i " break; case PKT_PLAYER_INFO: - Msg_Read(&info, sizeof(info)); - Con_FPrintf(CBLF_TRANSMIT | SV_CONSOLE_FLAGS, "%s renamed to %s.\n", - sender->name, info.name); + Reader_Read(msgReader, &info, sizeof(info)); + Con_FPrintf(CBLF_TRANSMIT | SV_CONSOLE_FLAGS, "%s renamed to %s.\n", sender->name, info.name); strcpy(sender->name, info.name); Net_SendPacket(DDSP_CONFIRM | DDSP_ALL_PLAYERS, PKT_PLAYER_INFO, &info, sizeof(info)); @@ -497,6 +493,8 @@ Con_Printf("Sv_HandlePacket: OK (\"ready!\") from client %i " (int) netBuffer.msg.type); break; } + + Msg_EndRead(); } /** @@ -505,6 +503,9 @@ Con_Printf("Sv_HandlePacket: OK (\"ready!\") from client %i " */ void Sv_Login(void) { + char password[300]; + byte passLen = 0; + if(netRemoteUser) { Sv_SendText(netBuffer.player, SV_CONSOLE_FLAGS, @@ -512,19 +513,23 @@ void Sv_Login(void) return; } // Check the password. - if(strcmp((char *) netBuffer.cursor, netPassword)) + passLen = Reader_ReadByte(msgReader); + memset(password, 0, sizeof(password)); + Reader_Read(msgReader, password, passLen); + if(strcmp(password, netPassword)) { - Sv_SendText(netBuffer.player, SV_CONSOLE_FLAGS, - "Sv_Login: Invalid password.\n"); + Sv_SendText(netBuffer.player, SV_CONSOLE_FLAGS, "Sv_Login: Invalid password.\n"); return; } + // OK! netRemoteUser = netBuffer.player; - Con_Printf("Sv_Login: %s (client %i) logged in.\n", - clients[netRemoteUser].name, netRemoteUser); + Con_Message("Sv_Login: %s (client %i) logged in.\n", + clients[netRemoteUser].name, netRemoteUser); // Send a confirmation packet to the client. Msg_Begin(PKT_LOGIN); - Msg_WriteByte(true); // Yes, you're logged in. + Writer_WriteByte(msgWriter, true); // Yes, you're logged in. + Msg_End(); Net_SendBuffer(netRemoteUser, 0); } @@ -534,46 +539,47 @@ void Sv_Login(void) */ void Sv_ExecuteCommand(void) { - int flags; - byte cmdSource; + int flags; + byte cmdSource; unsigned short len; - boolean silent; + boolean silent; + char *cmd = 0; if(!netRemoteUser) { - Con_Printf - ("Sv_ExecuteCommand: Cmd received but no one's logged in!\n"); + Con_Message("Sv_ExecuteCommand: Cmd received but no one's logged in!\n"); return; } // The command packet is very simple. - len = Msg_ReadUnsignedShort(); + len = Reader_ReadUInt16(msgReader); silent = (len & 0x8000) != 0; len &= 0x7fff; switch(netBuffer.msg.type) { - case PKT_COMMAND: + /*case PKT_COMMAND: cmdSource = CMDS_UNKNOWN; // unknown command source. - break; + break;*/ case PKT_COMMAND2: // New format includes flags and command source. // Flags are currently unused but added for future expansion. - flags = Msg_ReadUnsignedShort(); - cmdSource = Msg_ReadByte(); + flags = Reader_ReadUInt16(msgReader); + cmdSource = Reader_ReadByte(msgReader); break; default: Con_Error("Sv_ExecuteCommand: Not a command packet!\n"); - return; // shutup compiler - } - - // Verify using string length. - if(strlen((char *) netBuffer.cursor) != (unsigned) len - 1) - { - Con_Printf("Sv_ExecuteCommand: Damaged packet?\n"); return; } - Con_Execute(cmdSource, (char *) netBuffer.cursor, silent, true); + + // Make a copy of the command. + cmd = M_Malloc(len + 1); + Reader_Read(msgReader, cmd, len); + cmd[len] = 0; + + Con_Execute(cmdSource, cmd, silent, true); + + M_Free(cmd); } /** @@ -620,9 +626,9 @@ void Sv_GetPackets(void) ddplayer_t *ddpl = &plr->shared; fixcounters_t *acked = &ddpl->fixAcked; - acked->angles = Msg_ReadLong(); - acked->pos = Msg_ReadLong(); - acked->mom = Msg_ReadLong(); + acked->angles = Reader_ReadUInt32(msgReader); + acked->pos = Reader_ReadUInt32(msgReader); + acked->mom = Reader_ReadUInt32(msgReader); #ifdef _DEBUG Con_Message("PCL_ACK_PLAYER_FIX: (%i) Angles %i (%i), pos %i (%i), mom %i (%i).\n", netBuffer.player, @@ -652,7 +658,7 @@ void Sv_GetPackets(void) Sv_Login(); break; - case PKT_COMMAND: + //case PKT_COMMAND: case PKT_COMMAND2: Sv_ExecuteCommand(); break; @@ -773,7 +779,7 @@ void Sv_PlayerLeaves(unsigned int nodeID) // Inform other clients about this. Msg_Begin(PSV_PLAYER_EXIT); - Msg_WriteByte(plrNum); + Writer_WriteByte(msgWriter, plrNum); Net_SendBuffer(NSP_BROADCAST, 0); } @@ -907,9 +913,13 @@ void Sv_StartNetGame(void) void Sv_SendText(int to, int con_flags, char *text) { + uint32_t len = MIN_OF(0xffff, strlen(text)); + Msg_Begin(PSV_CONSOLE_TEXT); - Msg_WriteLong(con_flags & ~CBLF_TRANSMIT); - Msg_Write(text, strlen(text) + 1); + Writer_WriteUInt32(msgWriter, con_flags & ~CBLF_TRANSMIT); + Writer_WriteUInt16(msgWriter, len); + Writer_Write(msgWriter, text, len); + Msg_End(); Net_SendBuffer(to, 0); } @@ -924,8 +934,8 @@ void Sv_Kick(int who) Sv_SendText(who, SV_CONSOLE_FLAGS, "You were kicked out!\n"); Msg_Begin(PSV_SERVER_CLOSE); + Msg_End(); Net_SendBuffer(who, 0); - //ddPlayers[who].shared.inGame = false; } /** @@ -948,25 +958,22 @@ void Sv_SendPlayerFixes(int plrNum) Msg_Begin(PSV_PLAYER_FIX); // Which player is being fixed? - Msg_WriteByte(plrNum); + Writer_WriteByte(msgWriter, plrNum); // Indicate what is included in the message. - if(ddpl->flags & DDPF_FIXANGLES) - fixes |= 1; - if(ddpl->flags & DDPF_FIXPOS) - fixes |= 2; - if(ddpl->flags & DDPF_FIXMOM) - fixes |= 4; + if(ddpl->flags & DDPF_FIXANGLES) fixes |= 1; + if(ddpl->flags & DDPF_FIXPOS) fixes |= 2; + if(ddpl->flags & DDPF_FIXMOM) fixes |= 4; - Msg_WriteLong(fixes); - Msg_WriteLong(ddpl->mo->thinker.id); + Writer_WriteUInt32(msgWriter, fixes); + Writer_WriteUInt16(msgWriter, ddpl->mo->thinker.id); // Increment counters. if(ddpl->flags & DDPF_FIXANGLES) { - Msg_WriteLong(++ddpl->fixCounter.angles); - Msg_WriteLong(ddpl->mo->angle); - Msg_WriteLong(FLT2FIX(ddpl->lookDir)); + Writer_WriteUInt32(msgWriter, ++ddpl->fixCounter.angles); + Writer_WriteUInt32(msgWriter, ddpl->mo->angle); + Writer_WriteFloat(msgWriter, ddpl->lookDir); #ifdef _DEBUG Con_Message("Sv_SendPlayerFixes: Sent angles (%i): angle=%f lookdir=%f\n", @@ -977,10 +984,10 @@ Con_Message("Sv_SendPlayerFixes: Sent angles (%i): angle=%f lookdir=%f\n", if(ddpl->flags & DDPF_FIXPOS) { - Msg_WriteLong(++ddpl->fixCounter.pos); - Msg_WriteLong(FLT2FIX(ddpl->mo->pos[VX])); - Msg_WriteLong(FLT2FIX(ddpl->mo->pos[VY])); - Msg_WriteLong(FLT2FIX(ddpl->mo->pos[VZ])); + Writer_WriteUInt32(msgWriter, ++ddpl->fixCounter.pos); + Writer_WriteFloat(msgWriter, ddpl->mo->pos[VX]); + Writer_WriteFloat(msgWriter, ddpl->mo->pos[VY]); + Writer_WriteFloat(msgWriter, ddpl->mo->pos[VZ]); #ifdef _DEBUG Con_Message("Sv_SendPlayerFixes: Sent position (%i): %f, %f, %f\n", @@ -991,10 +998,10 @@ Con_Message("Sv_SendPlayerFixes: Sent position (%i): %f, %f, %f\n", if(ddpl->flags & DDPF_FIXMOM) { - Msg_WriteLong(++ddpl->fixCounter.mom); - Msg_WriteLong(FLT2FIX(ddpl->mo->mom[MX])); - Msg_WriteLong(FLT2FIX(ddpl->mo->mom[MY])); - Msg_WriteLong(FLT2FIX(ddpl->mo->mom[MZ])); + Writer_WriteUInt32(msgWriter, ++ddpl->fixCounter.mom); + Writer_WriteFloat(msgWriter, ddpl->mo->mom[MX]); + Writer_WriteFloat(msgWriter, ddpl->mo->mom[MY]); + Writer_WriteFloat(msgWriter, ddpl->mo->mom[MZ]); #ifdef _DEBUG Con_Message("Sv_SendPlayerFixes: Sent momentum (%i): %f, %f, %f\n", @@ -1003,6 +1010,8 @@ Con_Message("Sv_SendPlayerFixes: Sent momentum (%i): %f, %f, %f\n", #endif } + Msg_End(); + // Send the fix message to everyone. Net_SendBuffer(DDSP_ALL_PLAYERS, 0); @@ -1156,12 +1165,12 @@ void Sv_ClientCoords(int plrNum) if(!mo || !ddpl->inGame || (ddpl->flags & DDPF_DEAD)) return; - clientGameTime = Msg_ReadFloat(); + clientGameTime = Reader_ReadFloat(msgReader); - clientPos[VX] = Msg_ReadFloat(); - clientPos[VY] = Msg_ReadFloat(); + clientPos[VX] = Reader_ReadFloat(msgReader); + clientPos[VY] = Reader_ReadFloat(msgReader); - clz = Msg_ReadLong(); + clz = Reader_ReadInt32(msgReader); if(clz == DDMININT) { clientPos[VZ] = mo->floorZ; @@ -1172,20 +1181,13 @@ void Sv_ClientCoords(int plrNum) clientPos[VZ] = FIX2FLT(clz); } - /* - // The momentum. - clientMom[VX] = ((float) Msg_ReadShort()) / 256; - clientMom[VY] = ((float) Msg_ReadShort()) / 256; - clientMom[VZ] = ((float) Msg_ReadShort()) / 256; - */ - // The angles. - clientAngle = ((angle_t) Msg_ReadShort()) << 16; - clientLookDir = P_ShortToLookDir(Msg_ReadShort()); + clientAngle = ((angle_t) Reader_ReadInt16(msgReader)) << 16; + clientLookDir = P_ShortToLookDir(Reader_ReadInt16(msgReader)); // Movement intent. - ddpl->forwardMove = FIX2FLT(((char) Msg_ReadByte()) << 13); - ddpl->sideMove = FIX2FLT(((char) Msg_ReadByte()) << 13); + ddpl->forwardMove = FIX2FLT(((char) Reader_ReadByte(msgReader)) << 13); + ddpl->sideMove = FIX2FLT(((char) Reader_ReadByte(msgReader)) << 13); if(ddpl->fixCounter.angles == ddpl->fixAcked.angles && !(ddpl->flags & DDPF_FIXANGLES)) { @@ -1256,7 +1258,7 @@ D_CMD(Logout) Sv_SendText(netRemoteUser, SV_CONSOLE_FLAGS, "Goodbye...\n"); // Send a logout packet. Msg_Begin(PKT_LOGIN); - Msg_WriteByte(false); // You're outta here. + Writer_WriteByte(msgWriter, false); // You're outta here. Net_SendBuffer(netRemoteUser, 0); netRemoteUser = 0; return true; diff --git a/doomsday/engine/portable/src/sv_pool.c b/doomsday/engine/portable/src/sv_pool.c index 9ab70ed51d..d9580689ed 100644 --- a/doomsday/engine/portable/src/sv_pool.c +++ b/doomsday/engine/portable/src/sv_pool.c @@ -682,10 +682,6 @@ boolean Sv_RegisterComparePlayer(cregister_t* reg, uint number, } if(r->filter != s->filter) df |= PDF_FILTER; -/* if(r->clYaw != s->clYaw) - df |= PDF_CLYAW; - if(r->clPitch != s->clPitch) - df |= PDF_CLPITCH;*/ /* // The player sprites are a bit more complicated to check. @@ -1356,10 +1352,6 @@ void Sv_ApplyDeltaData(void* destDelta, const void* srcDelta) } if(sf & PDF_FILTER) d->filter = s->filter; -/* if(sf & PDF_CLYAW) - d->clYaw = s->clYaw; - if(sf & PDF_CLPITCH) - d->clPitch = s->clPitch; */ /* $unifiedangles */ if(sf & PDF_PSPRITES) { uint i; diff --git a/doomsday/engine/portable/src/writer.c b/doomsday/engine/portable/src/writer.c index ac43cf9bf0..851202e53d 100644 --- a/doomsday/engine/portable/src/writer.c +++ b/doomsday/engine/portable/src/writer.c @@ -35,7 +35,11 @@ struct writer_s static boolean Writer_Check(const Writer* writer, size_t len) { - if(!writer || !writer->data) return false; + if(!writer || !writer->data) + { + Con_Message("Writer_Check: Invalid Writer!\n"); + return false; + } if(writer->pos > writer->size - len) { Con_Error("Writer_Check: Position %lu[+%lu] out of bounds, size=%lu.\n", @@ -54,10 +58,10 @@ Writer* Writer_New(void) return w; } -Writer* Writer_NewWithBuffer(byte* buffer, size_t len) +Writer* Writer_NewWithBuffer(byte* buffer, size_t maxLen) { Writer* w = M_Calloc(sizeof(Writer)); - w->size = len; + w->size = maxLen; w->data = buffer; return w; } @@ -67,18 +71,23 @@ void Writer_Destruct(Writer* writer) M_Free(writer); } -size_t Writer_Pos(const Writer* writer) +size_t Writer_Size(const Writer* writer) { if(!writer) return 0; return writer->pos; } -size_t Writer_Size(const Writer* writer) +size_t Writer_TotalBufferSize(const Writer* writer) { if(!writer) return 0; return writer->size; } +size_t Writer_BytesLeft(const Writer* writer) +{ + return Writer_TotalBufferSize(writer) - Writer_Size(writer); +} + void Writer_SetPos(Writer* writer, size_t newPos) { if(!writer) return; diff --git a/doomsday/plugins/common/include/d_net.h b/doomsday/plugins/common/include/d_net.h index 5cce421019..eff8385324 100644 --- a/doomsday/plugins/common/include/d_net.h +++ b/doomsday/plugins/common/include/d_net.h @@ -74,7 +74,8 @@ enum { GPT_ACTION_REQUEST, GPT_PLAYER_SPAWN_POSITION, GPT_DAMAGE, // Client requests damage on a target. - GPT_MOBJ_IMPULSE // Momenum to apply on a mobj. + GPT_MOBJ_IMPULSE, // Momenum to apply on a mobj. + GPT_FLOOR_HIT_REQUEST }; #if 0 diff --git a/doomsday/plugins/common/src/d_netcl.c b/doomsday/plugins/common/src/d_netcl.c index 4ef373ade2..afb427dece 100644 --- a/doomsday/plugins/common/src/d_netcl.c +++ b/doomsday/plugins/common/src/d_netcl.c @@ -392,9 +392,11 @@ void NetCl_UpdatePlayerState(byte *data, int plrNum) NetCl_SetReadBuffer(data); flags = NetCl_ReadUShort(); + /* #ifdef _DEBUG - Con_Message("NetCl_UpdatePlayerState: fl=%x\n", flags); + VERBOSE( Con_Message("NetCl_UpdatePlayerState: fl=%x\n", flags) ); #endif + */ if(flags & PSF_STATE) // and armor type (the same bit) { @@ -878,112 +880,6 @@ void NetCl_Paused(boolean setPause) DD_SetInteger(DD_CLIENT_PAUSED, paused); } -#if 0 -/** - * \kludge Write a DDPT_COMMANDS (32) packet. Returns a pointer to a static - * buffer that contains the data (kludge to work around the parameter - * passing from the engine). - */ -void *NetCl_WriteCommands(ticcmd_t *cmd, int count) -{ - static byte msg[1024]; // A shared buffer. - - int i; - ushort *size = (ushort *) msg; - byte *out = msg + 2, *flags, *start = out; - ticcmd_t prev; - - // Always compare against the previous command. - memset(&prev, 0, sizeof(prev)); - - for(i = 0; i < count; ++i, cmd++) - { - flags = out++; - *flags = 0; - - // What has changed? - if(cmd->forwardMove != prev.forwardMove) - { - *flags |= CMDF_FORWARDMOVE; - *out++ = cmd->forwardMove; - } - - if(cmd->sideMove != prev.sideMove) - { - *flags |= CMDF_SIDEMOVE; - *out++ = cmd->sideMove; - } - - if(cmd->angle != prev.angle) - { - *flags |= CMDF_ANGLE; - *(unsigned short *) out = SHORT(cmd->angle); - out += 2; - } - - if(cmd->pitch != prev.pitch) - { - *flags |= CMDF_LOOKDIR; - *(short *) out = SHORT(cmd->pitch); - out += 2; - } - - if(cmd->actions != prev.actions) - { - *flags |= CMDF_BUTTONS; - *out++ = cmd->actions; - } -/* - // Compile the button flags. - buttons = 0; - // Client sends player action requests sent instead. - if(!IS_CLIENT) - { - if(cmd->attack) - buttons |= CMDF_BTN_ATTACK; - if(cmd->use) - buttons |= CMDF_BTN_USE; - } - if(cmd->jump) - buttons |= CMDF_BTN_JUMP; - if(cmd->pause) - buttons |= CMDF_BTN_PAUSE; - - // Always include nonzero buttons. - if(buttons != 0) - { - *flags |= CMDF_BUTTONS; - *out++ = buttons; - } - - if(cmd->fly != prev.fly) - { - *flags |= CMDF_LOOKFLY; - *out++ = cmd->fly; - } - if(cmd->arti != prev.arti) - { - *flags |= CMDF_ARTI; - *out++ = cmd->arti; - } - if(cmd->changeWeapon != prev.changeWeapon) - { - *flags |= CMDF_CHANGE_WEAPON; - *(short *) out = SHORT(cmd->changeWeapon); - out += 2; - } -*/ - memcpy(&prev, cmd, sizeof(*cmd)); - } - - // First two bytes contain the size of the buffer (not included in - // the actual packet). - *size = out - start; - - return msg; -} -#endif - /** * Send a GPT_CHEAT_REQUEST packet to the server. If the server is allowing * netgame cheating, the cheat will be executed on the server. @@ -1013,6 +909,23 @@ void NetCl_UpdateJumpPower(void *data) #endif } +void NetCl_FloorHitRequest(player_t* player) +{ + char msg[40]; + char *ptr = msg; + + if(!IS_CLIENT) + return; + +#ifdef _DEBUG + Con_Message("NetCl_FloorHitRequest: Player %i.\n", player - players); +#endif + + // Include the position of the hit. + + Net_SendPacket(0, GPT_FLOOR_HIT_REQUEST, msg, size); +} + /** * Sends a player action request. The server will execute the action. * This is more reliable than sending via the ticcmds, as the client will diff --git a/doomsday/plugins/jheretic/src/p_mobj.c b/doomsday/plugins/jheretic/src/p_mobj.c index f5bfa911f5..ae10716426 100644 --- a/doomsday/plugins/jheretic/src/p_mobj.c +++ b/doomsday/plugins/jheretic/src/p_mobj.c @@ -1262,7 +1262,12 @@ boolean P_HitFloor(mobj_t* thing) mobj_t* mo; const terraintype_t* tt; - if(IS_CLIENT) return false; + if(IS_CLIENT && thing->player) + { + // The client notifies the server, which will handle the splash. + NetCl_FloorHitRequest(); + return false; + } if(thing->floorZ != P_GetFloatp(thing->subsector, DMU_FLOOR_HEIGHT)) {