summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--src/net/beinghandler.cpp30
-rw-r--r--src/net/messagein.cpp11
-rw-r--r--src/net/messagein.h13
-rw-r--r--src/net/protocol.h11
5 files changed, 62 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 492fc2b8..9f148845 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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