summaryrefslogtreecommitdiff
path: root/src/net/playerhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/playerhandler.cpp')
-rw-r--r--src/net/playerhandler.cpp197
1 files changed, 97 insertions, 100 deletions
diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp
index 3786cd0b..6eb80d59 100644
--- a/src/net/playerhandler.cpp
+++ b/src/net/playerhandler.cpp
@@ -46,7 +46,9 @@ OkDialog *deathNotice = NULL;
namespace {
struct WeightListener : public gcn::ActionListener
{
- void action(const std::string& eventId, gcn::Widget* widget) { weightNotice = NULL; }
+ void action(const std::string &eventId, gcn::Widget *widget) {
+ weightNotice = NULL;
+ }
} weightListener;
}
@@ -56,7 +58,7 @@ namespace {
// TODO Move somewhere else
namespace {
struct DeathListener : public gcn::ActionListener {
- void action(const std::string& eventId, gcn::Widget* widget) {
+ void action(const std::string &eventId, gcn::Widget *widget) {
player_node->revive();
deathNotice = NULL;
}
@@ -66,61 +68,36 @@ namespace {
PlayerHandler::PlayerHandler()
{
static const Uint16 _messages[] = {
- SMSG_WALK_RESPONSE,
- SMSG_PLAYER_WARP,
- SMSG_PLAYER_STAT_UPDATE_1,
- SMSG_PLAYER_STAT_UPDATE_2,
- SMSG_PLAYER_STAT_UPDATE_3,
- SMSG_PLAYER_STAT_UPDATE_4,
- SMSG_PLAYER_STAT_UPDATE_5,
- SMSG_PLAYER_STAT_UPDATE_6,
- SMSG_PLAYER_ARROW_MESSAGE,
+ //SMSG_PLAYER_STAT_UPDATE_1,
+ //SMSG_PLAYER_STAT_UPDATE_2,
+ //SMSG_PLAYER_STAT_UPDATE_3,
+ //SMSG_PLAYER_STAT_UPDATE_4,
+ //SMSG_PLAYER_STAT_UPDATE_5,
+ //SMSG_PLAYER_STAT_UPDATE_6,
+ //SMSG_PLAYER_ARROW_MESSAGE,
+ GPMSG_PLAYER_MAP_CHANGE,
0
};
handledMessages = _messages;
}
-void PlayerHandler::handleMessage(MessageIn *msg)
+void PlayerHandler::handleMessage(MessageIn &msg)
{
- switch (msg->getId())
+ switch (msg.getId())
{
- case SMSG_WALK_RESPONSE:
- // It is assumed by the client any request to walk actually
- // succeeds on the server. The plan is to have a correction
- // message when the server senses the client has the wrong
- // idea.
- break;
-
- case SMSG_PLAYER_WARP:
- {
- std::string mapPath = msg->readString(16);
- Uint16 x = msg->readInt16();
- Uint16 y = msg->readInt16();
-
- logger->log("Warping to %s (%d, %d)", mapPath.c_str(), x, y);
-
- // Switch the actual map, deleting the previous one
- engine->changeMap(mapPath);
-
- current_npc = 0;
-
- player_node->setAction(Being::STAND);
- player_node->stopAttack();
- player_node->mFrame = 0;
- player_node->mX = x;
- player_node->mY = y;
- }
+ case GPMSG_PLAYER_MAP_CHANGE:
+ handleMapChangeMessage(msg);
break;
case SMSG_PLAYER_STAT_UPDATE_1:
{
- Sint16 type = msg->readInt16();
- Uint32 value = msg->readInt32();
+ Sint16 type = msg.readShort();
+ Uint32 value = msg.readLong();
switch (type)
{
//case 0x0000:
- // player_node->setWalkSpeed(msg->readInt32());
+ // player_node->setWalkSpeed(msg.readLong());
// break;
case 0x0005: player_node->mHp = value; break;
case 0x0006: player_node->mMaxHp = value; break;
@@ -169,30 +146,30 @@ void PlayerHandler::handleMessage(MessageIn *msg)
break;
case SMSG_PLAYER_STAT_UPDATE_2:
- switch (msg->readInt16()) {
+ switch (msg.readShort()) {
case 0x0001:
- player_node->mXp = msg->readInt32();
+ player_node->mXp = msg.readLong();
break;
case 0x0002:
- player_node->mJobXp = msg->readInt32();
+ player_node->mJobXp = msg.readLong();
break;
case 0x0014:
- player_node->mGp = msg->readInt32();
+ player_node->mMoney = msg.readLong();
break;
case 0x0016:
- player_node->mXpForNextLevel = msg->readInt32();
+ player_node->mXpForNextLevel = msg.readLong();
break;
case 0x0017:
- player_node->mJobXpForNextLevel = msg->readInt32();
+ player_node->mJobXpForNextLevel = msg.readLong();
break;
}
break;
case SMSG_PLAYER_STAT_UPDATE_3:
{
- Sint32 type = msg->readInt32();
- Sint32 base = msg->readInt32();
- Sint32 bonus = msg->readInt32();
+ Sint32 type = msg.readLong();
+ Sint32 base = msg.readLong();
+ Sint32 bonus = msg.readLong();
Sint32 total = base + bonus;
switch (type) {
@@ -214,9 +191,9 @@ void PlayerHandler::handleMessage(MessageIn *msg)
case SMSG_PLAYER_STAT_UPDATE_4:
{
- Sint16 type = msg->readInt16();
- Sint8 fail = msg->readInt8();
- Sint8 value = msg->readInt8();
+ Sint16 type = msg.readShort();
+ Sint8 fail = msg.readByte();
+ Sint8 value = msg.readByte();
if (fail != 1)
break;
@@ -240,60 +217,60 @@ void PlayerHandler::handleMessage(MessageIn *msg)
// Updates stats and status points
case SMSG_PLAYER_STAT_UPDATE_5:
- player_node->mStatsPointsToAttribute = msg->readInt16();
- player_node->mAttr[LocalPlayer::STR] = msg->readInt8();
- player_node->mAttrUp[LocalPlayer::STR] = msg->readInt8();
- player_node->mAttr[LocalPlayer::AGI] = msg->readInt8();
- player_node->mAttrUp[LocalPlayer::AGI] = msg->readInt8();
- player_node->mAttr[LocalPlayer::VIT] = msg->readInt8();
- player_node->mAttrUp[LocalPlayer::VIT] = msg->readInt8();
- player_node->mAttr[LocalPlayer::INT] = msg->readInt8();
- player_node->mAttrUp[LocalPlayer::INT] = msg->readInt8();
- player_node->mAttr[LocalPlayer::DEX] = msg->readInt8();
- player_node->mAttrUp[LocalPlayer::DEX] = msg->readInt8();
- player_node->mAttr[LocalPlayer::LUK] = msg->readInt8();
- player_node->mAttrUp[LocalPlayer::LUK] = msg->readInt8();
- player_node->ATK = msg->readInt16(); // ATK
- player_node->ATK_BONUS = msg->readInt16(); // ATK bonus
- player_node->MATK = msg->readInt16(); // MATK max
- player_node->MATK_BONUS = msg->readInt16(); // MATK min
- player_node->DEF = msg->readInt16(); // DEF
- player_node->DEF_BONUS = msg->readInt16(); // DEF bonus
- player_node->MDEF = msg->readInt16(); // MDEF
- player_node->MDEF_BONUS = msg->readInt16(); // MDEF bonus
- player_node->HIT = msg->readInt16(); // HIT
- player_node->FLEE = msg->readInt16(); // FLEE
- player_node->FLEE_BONUS = msg->readInt16(); // FLEE bonus
- msg->readInt16(); // critical
- msg->readInt16(); // unknown
+ player_node->mStatsPointsToAttribute = msg.readShort();
+ player_node->mAttr[LocalPlayer::STR] = msg.readByte();
+ player_node->mAttrUp[LocalPlayer::STR] = msg.readByte();
+ player_node->mAttr[LocalPlayer::AGI] = msg.readByte();
+ player_node->mAttrUp[LocalPlayer::AGI] = msg.readByte();
+ player_node->mAttr[LocalPlayer::VIT] = msg.readByte();
+ player_node->mAttrUp[LocalPlayer::VIT] = msg.readByte();
+ player_node->mAttr[LocalPlayer::INT] = msg.readByte();
+ player_node->mAttrUp[LocalPlayer::INT] = msg.readByte();
+ player_node->mAttr[LocalPlayer::DEX] = msg.readByte();
+ player_node->mAttrUp[LocalPlayer::DEX] = msg.readByte();
+ player_node->mAttr[LocalPlayer::LUK] = msg.readByte();
+ player_node->mAttrUp[LocalPlayer::LUK] = msg.readByte();
+ player_node->ATK = msg.readShort(); // ATK
+ player_node->ATK_BONUS = msg.readShort(); // ATK bonus
+ player_node->MATK = msg.readShort(); // MATK max
+ player_node->MATK_BONUS = msg.readShort(); // MATK min
+ player_node->DEF = msg.readShort(); // DEF
+ player_node->DEF_BONUS = msg.readShort(); // DEF bonus
+ player_node->MDEF = msg.readShort(); // MDEF
+ player_node->MDEF_BONUS = msg.readShort(); // MDEF bonus
+ player_node->HIT = msg.readShort(); // HIT
+ player_node->FLEE = msg.readShort(); // FLEE
+ player_node->FLEE_BONUS = msg.readShort(); // FLEE bonus
+ msg.readShort(); // critical
+ msg.readShort(); // unknown
break;
case SMSG_PLAYER_STAT_UPDATE_6:
- switch (msg->readInt16()) {
+ switch (msg.readShort()) {
case 0x0020:
- player_node->mAttrUp[LocalPlayer::STR] = msg->readInt8();
+ player_node->mAttrUp[LocalPlayer::STR] = msg.readByte();
break;
case 0x0021:
- player_node->mAttrUp[LocalPlayer::AGI] = msg->readInt8();
+ player_node->mAttrUp[LocalPlayer::AGI] = msg.readByte();
break;
case 0x0022:
- player_node->mAttrUp[LocalPlayer::VIT] = msg->readInt8();
+ player_node->mAttrUp[LocalPlayer::VIT] = msg.readByte();
break;
case 0x0023:
- player_node->mAttrUp[LocalPlayer::INT] = msg->readInt8();
+ player_node->mAttrUp[LocalPlayer::INT] = msg.readByte();
break;
case 0x0024:
- player_node->mAttrUp[LocalPlayer::DEX] = msg->readInt8();
+ player_node->mAttrUp[LocalPlayer::DEX] = msg.readByte();
break;
case 0x0025:
- player_node->mAttrUp[LocalPlayer::LUK] = msg->readInt8();
+ player_node->mAttrUp[LocalPlayer::LUK] = msg.readByte();
break;
}
break;
case SMSG_PLAYER_ARROW_MESSAGE:
{
- Sint16 type = msg->readInt16();
+ Sint16 type = msg.readShort();
switch (type) {
case 0:
@@ -306,18 +283,38 @@ void PlayerHandler::handleMessage(MessageIn *msg)
}
}
break;
+ }
+}
+
+void
+PlayerHandler::handleMapChangeMessage(MessageIn &msg)
+{
+ // { "mapname", x, y, B new server [, token, "gameserver", W port] }
+
+ std::string mapName = msg.readString();
+ unsigned short x = msg.readShort();
+ unsigned short y = msg.readShort();
+ unsigned char newServer = msg.readByte();
+
+ logger->log("Changing map to %s (%d, %d) on %s server",
+ mapName.c_str(), x, y, (newServer) ? "another" : "same");
- //Stop walking
- //case 0x0088: // Disabled because giving some problems
- //if (being = beingManager->findBeing(readInt32(2))) {
- // if (being->getId() != player_node->getId()) {
- // being->action = STAND;
- // being->mFrame = 0;
- // set_coordinates(being->coordinates,
- // readWord(6), readWord(8),
- // get_direction(being->coordinates));
- // }
- //}
- //break;
+ // Switch the actual map, deleting the previous one
+ engine->changeMap(mapName);
+
+ current_npc = 0;
+
+ player_node->setAction(Being::STAND);
+ player_node->stopAttack();
+
+ player_node->mX = x;
+ player_node->mY = y;
+
+ if (newServer)
+ {
+ // TODO: Implement reconnecting to another game server
+ //std::string token = msg.readString(32);
+ //std::string gameServer = msg.readString();
+ //unsigned short gameServerPort = msg.readShort();
}
}