diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/net/beinghandler.cpp | 30 | ||||
-rw-r--r-- | src/net/messagein.cpp | 11 | ||||
-rw-r--r-- | src/net/messagein.h | 13 | ||||
-rw-r--r-- | src/net/protocol.h | 11 |
5 files changed, 62 insertions, 6 deletions
@@ -5,6 +5,9 @@ src/monster.cpp, src/player.h, src/net/beinghandler.cpp, src/being.h, src/net/charserverhandler.cpp, src/net/protocol.h, src/localplayer.h, src/net/chathandler.cpp: Switched to short IDs for beings. + * src/net/messagein.h, src/net/beinghandler.cpp, src/net/protocol.h, + src/net/messagein.cpp: Removed pixel-based synchronisation. Added + variable length move messages. 2006-09-01 Eugenio Favalli <elvenprogrammer@gmail.com> diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index 8ccd3dd6..eb5ccb57 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -442,13 +442,33 @@ void BeingHandler::handleBeingLeaveMessage(MessageIn &msg) void BeingHandler::handleBeingsMoveMessage(MessageIn &msg) { - for (int nb = (msg.getLength() - 2) / (2 + 4 * 2); nb > 0; --nb) + while (msg.getUnreadLength()) { Uint16 id = msg.readShort(); + Uint8 flags = msg.readByte(); Being *being = beingManager->findBeing(id); - if (!being) continue; - int sx = msg.readShort(), sy = msg.readShort(), - dx = msg.readShort(), dy = msg.readShort(); + int sx = 0, sy = 0, dx = 0, dy = 0; + if (flags & MOVING_POSITION) + { + Uint16 sx2, sy2; + msg.readCoordinates(sx2, sy2); + sx = sx2 * 32 + 16; + sy = sy2 * 32 + 16; + } + if (flags & MOVING_DESTINATION) + { + dx = msg.readShort(); + dy = msg.readShort(); + if (!(flags & MOVING_POSITION)) + { + sx = dx; + sy = dy; + } + } + if (!being || !(flags & (MOVING_POSITION | MOVING_DESTINATION))) + { + continue; + } bool update = being != player_node; // the local player already knows where he wants to go if (abs(being->mX - sx) + abs(being->mY - sy) > 4 * 32) { @@ -457,7 +477,7 @@ void BeingHandler::handleBeingsMoveMessage(MessageIn &msg) being->mY = sy; update = true; } - if (update) + if (update && (flags & MOVING_DESTINATION)) { being->setDestination(dx, dy); } diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp index 2c452a4d..a1707e06 100644 --- a/src/net/messagein.cpp +++ b/src/net/messagein.cpp @@ -77,6 +77,17 @@ long MessageIn::readLong() return value; } +void MessageIn::readCoordinates(Uint16 &x, Uint16 &y) +{ + if (mPos + 3 <= mLength) + { + unsigned char const *p = reinterpret_cast< unsigned char const * >(mData + mPos); + x = p[0] | ((p[1] & 0x07) << 8); + y = (p[1] >> 3) | ((p[2] & 0x3F) << 5); + } + mPos += 3; +} + std::string MessageIn::readString(int length) { // Get string length diff --git a/src/net/messagein.h b/src/net/messagein.h index d5a7593f..68bbb933 100644 --- a/src/net/messagein.h +++ b/src/net/messagein.h @@ -26,6 +26,8 @@ #include <string> +#include <SDL_types.h> + /** * Used for parsing an incoming message. */ @@ -49,6 +51,11 @@ class MessageIn long readLong(); /**< Reads a long. */ /** + * Reads a 3-byte block containing tile-based coordinates. + */ + void readCoordinates(Uint16 &x, Uint16 &y); + + /** * Reads a string. If a length is not given (-1), it is assumed * that the length of the string is stored in a short at the * start of the string. @@ -61,6 +68,12 @@ class MessageIn unsigned int getLength() { return mLength; } + /** + * Returns the length of unread data. + */ + unsigned int + getUnreadLength() { return mLength - mPos; } + private: const char* mData; /**< The message data. */ unsigned int mLength; /**< The length of the data. */ diff --git a/src/net/protocol.h b/src/net/protocol.h index f056f003..07b5c926 100644 --- a/src/net/protocol.h +++ b/src/net/protocol.h @@ -113,6 +113,7 @@ * - PGMSG_*: from client to game server * - GPMSG_*: from game server to client * Components: B byte, W word, D double word, S variable-size string + * C tile-based coordinates (B*3) */ enum { // Login/Register @@ -157,7 +158,7 @@ enum { // monster: W type id GPMSG_BEING_LEAVE = 0x0201, // W being id PGMSG_WALK = 0x0260, // W*2 destination - GPMSG_BEINGS_MOVE = 0x0280, // { W being id, W*2 position, W*2 destination }* + GPMSG_BEINGS_MOVE = 0x0280, // { W being id, B flags [, C position] [, W*2 destination] }* PGMSG_SAY = 0x02A0, // S text GPMSG_SAY = 0x02A1, // W being id, S text PGMSG_USE_ITEM = 0x0300, // L item id @@ -238,4 +239,12 @@ enum { OBJECT_PLAYER }; +// Moving object flags +enum { + // Payload contains the current position. + MOVING_POSITION = 1, + // Payload contains the destination. + MOVING_DESTINATION = 2 +}; + #endif |