summaryrefslogtreecommitdiff
path: root/src/net/beinghandler.cpp
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2006-11-05 14:57:35 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2006-11-05 14:57:35 +0000
commitde61b658590630cfc59960c012c8e533b361a8b0 (patch)
treeb89a6f23a385ea4a7d32e3abc6ce4a82114c5d67 /src/net/beinghandler.cpp
parentdbca3013575b766a681d1cea946e249a386e2144 (diff)
parent482f0ddb85487bd5a4beaf2706cca9f690aa9304 (diff)
downloadmana-client-de61b658590630cfc59960c012c8e533b361a8b0.tar.gz
mana-client-de61b658590630cfc59960c012c8e533b361a8b0.tar.bz2
mana-client-de61b658590630cfc59960c012c8e533b361a8b0.tar.xz
mana-client-de61b658590630cfc59960c012c8e533b361a8b0.zip
Moved 0.1.0 branch to trunk. A new beginning.
Diffstat (limited to 'src/net/beinghandler.cpp')
-rw-r--r--src/net/beinghandler.cpp352
1 files changed, 233 insertions, 119 deletions
diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp
index cd5653fc..2d68dd28 100644
--- a/src/net/beinghandler.cpp
+++ b/src/net/beinghandler.cpp
@@ -41,42 +41,60 @@ const int EMOTION_TIME = 150; /**< Duration of emotion icon */
BeingHandler::BeingHandler()
{
static const Uint16 _messages[] = {
- SMSG_BEING_VISIBLE,
- SMSG_BEING_MOVE,
- SMSG_BEING_REMOVE,
- SMSG_BEING_ACTION,
- SMSG_BEING_LEVELUP,
- SMSG_BEING_EMOTION,
- SMSG_BEING_CHANGE_LOOKS,
- SMSG_BEING_NAME_RESPONSE,
- SMSG_PLAYER_UPDATE_1,
- SMSG_PLAYER_UPDATE_2,
- SMSG_PLAYER_MOVE,
- 0x0119,
+ //SMSG_BEING_VISIBLE,
+ //SMSG_BEING_MOVE,
+ //SMSG_BEING_REMOVE,
+ //SMSG_BEING_ACTION,
+ //SMSG_BEING_LEVELUP,
+ //SMSG_BEING_EMOTION,
+ //SMSG_BEING_CHANGE_LOOKS,
+ //SMSG_BEING_NAME_RESPONSE,
+ //SMSG_PLAYER_UPDATE_1,
+ //SMSG_PLAYER_UPDATE_2,
+ //SMSG_PLAYER_MOVE,
+ //0x0119,
+ GPMSG_BEING_ENTER,
+ GPMSG_BEING_LEAVE,
+ GPMSG_BEINGS_MOVE,
0
};
handledMessages = _messages;
}
-void BeingHandler::handleMessage(MessageIn *msg)
+void BeingHandler::handleMessage(MessageIn &msg)
{
+ /*
Uint32 id;
Uint16 job, speed;
Sint16 param1;
Sint8 type;
Being *srcBeing, *dstBeing;
+ */
- switch (msg->getId())
+ switch (msg.getId())
{
+ case GPMSG_BEING_ENTER:
+ handleBeingEnterMessage(msg);
+ break;
+
+ case GPMSG_BEING_LEAVE:
+ handleBeingLeaveMessage(msg);
+ break;
+
+ case GPMSG_BEINGS_MOVE:
+ handleBeingsMoveMessage(msg);
+ break;
+
+ /*
case SMSG_BEING_VISIBLE:
case SMSG_BEING_MOVE:
// Information about a being in range
- id = msg->readInt32();
- speed = msg->readInt16();
- msg->readInt16(); // unknown
- msg->readInt16(); // unknown
- msg->readInt16(); // option
- job = msg->readInt16(); // class
+ id = msg.readLong();
+ speed = msg.readShort();
+ msg.readShort(); // unknown
+ msg.readShort(); // unknown
+ msg.readShort(); // option
+ job = msg.readShort(); // class
dstBeing = beingManager->findBeing(id);
@@ -91,7 +109,7 @@ void BeingHandler::handleMessage(MessageIn *msg)
dstBeing = beingManager->createBeing(id, job);
}
- else if (msg->getId() == 0x0078)
+ else if (msg.getId() == 0x0078)
{
dstBeing->clearPath();
dstBeing->mFrame = 0;
@@ -104,57 +122,56 @@ void BeingHandler::handleMessage(MessageIn *msg)
dstBeing->setWalkSpeed(speed);
dstBeing->mJob = job;
- dstBeing->setHairStyle(msg->readInt16());
- dstBeing->setWeapon(msg->readInt16());
- dstBeing->setVisibleEquipment(3, msg->readInt16()); // head bottom
+ dstBeing->setHairStyle(msg.readShort());
+ dstBeing->setWeapon(msg.readShort());
+ dstBeing->setVisibleEquipment(3, msg.readShort()); // head bottom
- if (msg->getId() == SMSG_BEING_MOVE)
+ if (msg.getId() == SMSG_BEING_MOVE)
{
- msg->readInt32(); // server tick
+ msg.readLong(); // server tick
}
- msg->readInt16(); // shield
- dstBeing->setVisibleEquipment(4, msg->readInt16()); // head top
- dstBeing->setVisibleEquipment(5, msg->readInt16()); // head mid
- dstBeing->setHairColor(msg->readInt16());
- msg->readInt16(); // unknown
- msg->readInt16(); // head dir
- msg->readInt16(); // guild
- msg->readInt16(); // unknown
- msg->readInt16(); // unknown
- msg->readInt16(); // manner
- msg->readInt16(); // karma
- msg->readInt8(); // unknown
- dstBeing->setSex(1 - msg->readInt8()); // sex
-
- if (msg->getId() == SMSG_BEING_MOVE)
+ msg.readShort(); // shield
+ dstBeing->setVisibleEquipment(4, msg.readShort()); // head top
+ dstBeing->setVisibleEquipment(5, msg.readShort()); // head mid
+ dstBeing->setHairColor(msg.readShort());
+ msg.readShort(); // unknown
+ msg.readShort(); // head dir
+ msg.readShort(); // guild
+ msg.readShort(); // unknown
+ msg.readShort(); // unknown
+ msg.readShort(); // manner
+ msg.readShort(); // karma
+ msg.readByte(); // unknown
+ dstBeing->setSex(1 - msg.readByte()); // sex
+
+ if (msg.getId() == SMSG_BEING_MOVE)
{
- Uint16 srcX, srcY, dstX, dstY;
- msg->readCoordinatePair(srcX, srcY, dstX, dstY);
- dstBeing->setAction(Being::STAND);
- dstBeing->mX = srcX;
- dstBeing->mY = srcY;
- dstBeing->setDestination(dstX, dstY);
+ //Uint16 srcX, srcY, dstX, dstY;
+ //msg.readCoordinatePair(srcX, srcY, dstX, dstY);
+ //dstBeing->setAction(Being::STAND);
+ //dstBeing->mX = srcX;
+ //dstBeing->mY = srcY;
+ //dstBeing->setDestination(dstX, dstY);
}
else
{
- msg->readCoordinates(dstBeing->mX, dstBeing->mY,
- dstBeing->mDirection);
+ //msg.readCoordinates(dstBeing->mX, dstBeing->mY, dstBeing->mDirection);
}
- msg->readInt8(); // unknown
- msg->readInt8(); // unknown
- msg->readInt8(); // unknown / sit
+ msg.readByte(); // unknown
+ msg.readByte(); // unknown
+ msg.readByte(); // unknown / sit
break;
case SMSG_BEING_REMOVE:
// A being should be removed or has died
- dstBeing = beingManager->findBeing(msg->readInt32());
+ dstBeing = beingManager->findBeing(msg.readLong());
if (!dstBeing)
break;
- if (msg->readInt8() == 1)
+ if (msg.readByte() == 1)
{
// Death
switch (dstBeing->getType())
@@ -182,15 +199,15 @@ void BeingHandler::handleMessage(MessageIn *msg)
break;
case SMSG_BEING_ACTION:
- srcBeing = beingManager->findBeing(msg->readInt32());
- dstBeing = beingManager->findBeing(msg->readInt32());
- msg->readInt32(); // server tick
- msg->readInt32(); // src speed
- msg->readInt32(); // dst speed
- param1 = msg->readInt16();
- msg->readInt16(); // param 2
- type = msg->readInt8();
- msg->readInt16(); // param 3
+ srcBeing = beingManager->findBeing(msg.readLong());
+ dstBeing = beingManager->findBeing(msg.readLong());
+ msg.readLong(); // server tick
+ msg.readLong(); // src speed
+ msg.readLong(); // dst speed
+ param1 = msg.readShort();
+ msg.readShort(); // param 2
+ type = msg.readByte();
+ msg.readShort(); // param 3
switch (type)
{
@@ -231,63 +248,63 @@ void BeingHandler::handleMessage(MessageIn *msg)
break;
case SMSG_BEING_LEVELUP:
- if ((Uint32)msg->readInt32() == player_node->getId()) {
+ if ((Uint32) msg.readLong() == player_node->getId()) {
logger->log("Level up");
sound.playSfx("sfx/levelup.ogg");
} else {
logger->log("Someone else went level up");
}
- msg->readInt32(); // type
+ msg.readLong(); // type
break;
case SMSG_BEING_EMOTION:
- if (!(dstBeing = beingManager->findBeing(msg->readInt32())))
+ if (!(dstBeing = beingManager->findBeing(msg.readLong())))
{
break;
}
- dstBeing->mEmotion = msg->readInt8();
+ dstBeing->mEmotion = msg.readByte();
dstBeing->mEmotionTime = EMOTION_TIME;
break;
case SMSG_BEING_CHANGE_LOOKS:
{
- if (!(dstBeing = beingManager->findBeing(msg->readInt32())))
+ if (!(dstBeing = beingManager->findBeing(msg.readLong())))
{
break;
}
-
- int type = msg->readInt8();
+
+ int type = msg.readByte();
switch (type) {
case 1:
- dstBeing->setHairStyle(msg->readInt8());
+ dstBeing->setHairStyle(msg.readByte());
break;
case 2:
- dstBeing->setWeapon(msg->readInt8());
+ dstBeing->setWeapon(msg.readByte());
break;
case 3:
case 4:
case 5:
// Equip/unequip head 3. Bottom 4. Top 5. Middle
- dstBeing->setVisibleEquipment(type, msg->readInt8());
+ dstBeing->setVisibleEquipment(type, msg.readByte());
// First 3 slots of mVisibleEquipments are reserved for
// later use, probably accessories.
break;
case 6:
- dstBeing->setHairColor(msg->readInt8());
+ dstBeing->setHairColor(msg.readByte());
break;
default:
- printf("c3: %i\n", msg->readInt8()); // unsupported
+ printf("c3: %i\n", msg.readByte()); // unsupported
break;
}
}
break;
case SMSG_BEING_NAME_RESPONSE:
- if ((dstBeing = beingManager->findBeing(msg->readInt32())))
+ if ((dstBeing = beingManager->findBeing(msg.readLong())))
{
- dstBeing->setName(msg->readString(24));
+ dstBeing->setName(msg.readString(24));
}
break;
@@ -295,12 +312,12 @@ void BeingHandler::handleMessage(MessageIn *msg)
case SMSG_PLAYER_UPDATE_2:
case SMSG_PLAYER_MOVE:
// An update about a player, potentially including movement.
- id = msg->readInt32();
- speed = msg->readInt16();
- msg->readInt16(); // option 1
- msg->readInt16(); // option 2
- msg->readInt16(); // option
- job = msg->readInt16();
+ id = msg.readLong();
+ speed = msg.readShort();
+ msg.readShort(); // option 1
+ msg.readShort(); // option 2
+ msg.readShort(); // option
+ job = msg.readShort();
dstBeing = beingManager->findBeing(id);
@@ -311,58 +328,57 @@ void BeingHandler::handleMessage(MessageIn *msg)
dstBeing->setWalkSpeed(speed);
dstBeing->mJob = job;
- dstBeing->setHairStyle(msg->readInt16());
- dstBeing->setWeaponById(msg->readInt16()); // item id 1
- msg->readInt16(); // item id 2
- dstBeing->setVisibleEquipment(3, msg->readInt16()); // head bottom
+ dstBeing->setHairStyle(msg.readShort());
+ dstBeing->setWeaponById(msg.readShort()); // item id 1
+ msg.readShort(); // item id 2
+ dstBeing->setVisibleEquipment(3, msg.readShort()); // head bottom
- if (msg->getId() == SMSG_PLAYER_MOVE)
+ if (msg.getId() == SMSG_PLAYER_MOVE)
{
- msg->readInt32(); // server tick
+ msg.readLong(); // server tick
}
- dstBeing->setVisibleEquipment(4, msg->readInt16()); // head top
- dstBeing->setVisibleEquipment(5, msg->readInt16()); // head mid
- dstBeing->setHairColor(msg->readInt16());
- msg->readInt16(); // unknown
- msg->readInt16(); // head dir
- msg->readInt32(); // guild
- msg->readInt32(); // emblem
- msg->readInt16(); // manner
- msg->readInt8(); // karma
- dstBeing->setSex(1 - msg->readInt8()); // sex
-
- if (msg->getId() == SMSG_PLAYER_MOVE)
+ dstBeing->setVisibleEquipment(4, msg.readShort()); // head top
+ dstBeing->setVisibleEquipment(5, msg.readShort()); // head mid
+ dstBeing->setHairColor(msg.readShort());
+ msg.readShort(); // unknown
+ msg.readShort(); // head dir
+ msg.readLong(); // guild
+ msg.readLong(); // emblem
+ msg.readShort(); // manner
+ msg.readByte(); // karma
+ dstBeing->setSex(1 - msg.readByte()); // sex
+
+ if (msg.getId() == SMSG_PLAYER_MOVE)
{
- Uint16 srcX, srcY, dstX, dstY;
- msg->readCoordinatePair(srcX, srcY, dstX, dstY);
- dstBeing->mX = srcX;
- dstBeing->mY = srcY;
- dstBeing->setDestination(dstX, dstY);
+ //Uint16 srcX, srcY, dstX, dstY;
+ //msg.readCoordinatePair(srcX, srcY, dstX, dstY);
+ //dstBeing->mX = srcX;
+ //dstBeing->mY = srcY;
+ //dstBeing->setDestination(dstX, dstY);
}
else
{
- msg->readCoordinates(dstBeing->mX, dstBeing->mY,
- dstBeing->mDirection);
+ //msg.readCoordinates(dstBeing->mX, dstBeing->mY, dstBeing->mDirection);
}
- msg->readInt8(); // unknown
- msg->readInt8(); // unknown
+ msg.readByte(); // unknown
+ msg.readByte(); // unknown
- if (msg->getId() == SMSG_PLAYER_UPDATE_1)
+ if (msg.getId() == SMSG_PLAYER_UPDATE_1)
{
- if (msg->readInt8() == 2)
+ if (msg.readByte() == 2)
{
dstBeing->setAction(Being::SIT);
}
}
- else if (msg->getId() == SMSG_PLAYER_MOVE)
+ else if (msg.getId() == SMSG_PLAYER_MOVE)
{
- msg->readInt8(); // unknown
+ msg.readByte(); // unknown
}
- msg->readInt8(); // Lv
- msg->readInt8(); // unknown
+ msg.readByte(); // Lv
+ msg.readByte(); // unknown
dstBeing->mWalkTime = tick_time;
dstBeing->mFrame = 0;
@@ -370,9 +386,107 @@ void BeingHandler::handleMessage(MessageIn *msg)
case 0x0119:
// Change in players look
- printf("0x0119 %i %i %i %x %i\n", msg->readInt32(),
- msg->readInt16(), msg->readInt16(), msg->readInt16(),
- msg->readInt8());
+ printf("0x0119 %li %i %i %x %i\n", msg.readLong(),
+ msg.readShort(), msg.readShort(), msg.readShort(),
+ msg.readByte());
break;
+ */
+ }
+}
+
+void
+BeingHandler::handleBeingEnterMessage(MessageIn &msg)
+{
+ int type = msg.readByte(); // type
+ int id = msg.readShort();
+
+ switch (type) {
+ case OBJECT_PLAYER:
+ {
+ std::string name = msg.readString();
+ Being *being;
+ if (player_node->getName() == name)
+ {
+ being = player_node;
+ being->setId(id);
+ }
+ else
+ {
+ being = beingManager->createBeing(id, 0);
+ being->setName(name);
+ }
+ being->setHairStyle(msg.readByte());
+ being->setHairColor(msg.readByte());
+ being->setSex(msg.readByte());
+ } break;
+ case OBJECT_MONSTER:
+ {
+ int monsterId = msg.readShort();
+ Being *being;
+ being = beingManager->createBeing(id, 1002 + monsterId);
+ being->setWalkSpeed(150); // TODO
+ } break;
+ }
+}
+
+void BeingHandler::handleBeingLeaveMessage(MessageIn &msg)
+{
+ Being *being = beingManager->findBeing(msg.readShort());
+ if (!being) return;
+ if (being == player_node->getTarget())
+ {
+ player_node->stopAttack();
+ }
+ beingManager->destroyBeing(being);
+}
+
+void BeingHandler::handleBeingsMoveMessage(MessageIn &msg)
+{
+ while (msg.getUnreadLength())
+ {
+ Uint16 id = msg.readShort();
+ Uint8 flags = msg.readByte();
+ Being *being = beingManager->findBeing(id);
+ 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;
+ }
+ if (abs(being->mX - sx) + abs(being->mY - sy) > 4 * 32)
+ {
+ // Too large a desynchronization.
+ being->mX = sx;
+ being->mY = sy;
+ being->setDestination(dx, dy);
+ }
+ else if (!(flags & MOVING_POSITION))
+ {
+ being->setDestination(dx, dy);
+ }
+ else if (!(flags & MOVING_DESTINATION))
+ {
+ being->adjustCourse(sx, sy);
+ }
+ else
+ {
+ being->adjustCourse(sx, sy, dx, dy);
+ }
}
}