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.cpp192
1 files changed, 20 insertions, 172 deletions
diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp
index 327edea3..335c2eb1 100644
--- a/src/net/playerhandler.cpp
+++ b/src/net/playerhandler.cpp
@@ -96,6 +96,7 @@ PlayerHandler::PlayerHandler()
//SMSG_PLAYER_ARROW_MESSAGE,
GPMSG_PLAYER_MAP_CHANGE,
GPMSG_PLAYER_SERVER_CHANGE,
+ GPMSG_PLAYER_ATTRIBUTE_UPDATE,
0
};
handledMessages = _messages;
@@ -117,187 +118,34 @@ void PlayerHandler::handleMessage(MessageIn &msg)
logger->log("Changing server to %s:%d", address.c_str(), port);
} break;
- /*
- case SMSG_PLAYER_STAT_UPDATE_1:
+ case GPMSG_PLAYER_ATTRIBUTE_UPDATE:
+ {
+ logger->log("ATTRIBUTE UPDATE:");
+ while (msg.getUnreadLength())
{
- Sint16 type = msg.readShort();
- Uint32 value = msg.readLong();
+ int stat = msg.readShort();
+ int value = msg.readShort();
+ logger->log("%d set to %d", stat, value);
- switch (type)
+ if (stat < NB_BASE_ATTRIBUTES)
{
- //case 0x0000:
- // player_node->setWalkSpeed(msg.readLong());
- // break;
- case 0x0005: player_node->mHp = value; break;
- case 0x0006: player_node->mMaxHp = value; break;
- case 0x0007: player_node->mMp = value; break;
- case 0x0008: player_node->mMaxMp = value; break;
- case 0x000b: player_node->mLevel = value; break;
- case 0x000c:
- player_node->mSkillPoint = value;
- skillDialog->update();
- break;
- case 0x0018:
- if (value >= player_node->mMaxWeight / 2 &&
- player_node->mTotalWeight <
- player_node->mMaxWeight / 2)
- {
- weightNotice = new OkDialog("Message",
- "You are carrying more then half "
- "your weight. You are unable to "
- "regain health.");
- weightNotice->addActionListener(
- &weightListener);
- }
- player_node->mTotalWeight = value;
- break;
- case 0x0019: player_node->mMaxWeight = value; break;
- case 0x0037: player_node->mJobLevel = value; break;
- case 0x0009:
- player_node->mStatsPointsToAttribute = value;
- break;
- case 0x0029: player_node->ATK = value; break;
- case 0x002b: player_node->MATK = value; break;
- case 0x002d: player_node->DEF = value; break;
- case 0x002f: player_node->MDEF = value; break;
- case 0x0031: player_node->HIT = value; break;
- case 0x0032: player_node->FLEE = value; break;
- case 0x0035: player_node->mAttackSpeed = value; break;
+ player_node->setAttributeBase(stat, value);
}
-
- if (player_node->mHp == 0 && deathNotice == NULL)
+ else if (stat < NB_EFFECTIVE_ATTRIBUTES)
{
- deathNotice = new OkDialog("Message",
- "You're now dead, press ok to restart");
- deathNotice->addActionListener(&deathListener);
- player_node->setAction(Being::DEAD);
+ player_node->setAttributeEffective(stat - NB_BASE_ATTRIBUTES, value);
}
- }
- break;
-
- case SMSG_PLAYER_STAT_UPDATE_2:
- switch (msg.readShort()) {
- case 0x0001:
- player_node->mXp = msg.readLong();
- break;
- case 0x0002:
- player_node->mJobXp = msg.readLong();
- break;
- case 0x0014:
- player_node->mMoney = msg.readLong();
- break;
- case 0x0016:
- player_node->mXpForNextLevel = msg.readLong();
- break;
- case 0x0017:
- player_node->mJobXpForNextLevel = msg.readLong();
- break;
- }
- break;
-
- case SMSG_PLAYER_STAT_UPDATE_3:
- {
- Sint32 type = msg.readLong();
- Sint32 base = msg.readLong();
- Sint32 bonus = msg.readLong();
- Sint32 total = base + bonus;
-
- switch (type) {
- case 0x000d: player_node->mAttr[LocalPlayer::STR] = total;
- break;
- case 0x000e: player_node->mAttr[LocalPlayer::AGI] = total;
- break;
- case 0x000f: player_node->mAttr[LocalPlayer::VIT] = total;
- break;
- case 0x0010: player_node->mAttr[LocalPlayer::INT] = total;
- break;
- case 0x0011: player_node->mAttr[LocalPlayer::DEX] = total;
- break;
- case 0x0012: player_node->mAttr[LocalPlayer::LUK] = total;
- break;
+ else if (stat == DERIVED_ATTR_HP_MAXIMUM)
+ {
+ player_node->setMaxHP(value);
}
- }
- break;
-
- case SMSG_PLAYER_STAT_UPDATE_4:
- {
- Sint16 type = msg.readShort();
- Sint8 fail = msg.readByte();
- Sint8 value = msg.readByte();
-
- if (fail != 1)
- break;
-
- switch (type) {
- case 0x000d: player_node->mAttr[LocalPlayer::STR] = value;
- break;
- case 0x000e: player_node->mAttr[LocalPlayer::AGI] = value;
- break;
- case 0x000f: player_node->mAttr[LocalPlayer::VIT] = value;
- break;
- case 0x0010: player_node->mAttr[LocalPlayer::INT] = value;
- break;
- case 0x0011: player_node->mAttr[LocalPlayer::DEX] = value;
- break;
- case 0x0012: player_node->mAttr[LocalPlayer::LUK] = value;
- break;
+ else
+ {
+ logger->log("Warning: server wants to update unknown attribute %d to %d", stat, value);
}
}
- break;
-
- // Updates stats and status points
- case SMSG_PLAYER_STAT_UPDATE_5:
- 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.readShort()) {
- case 0x0020:
- player_node->mAttrUp[LocalPlayer::STR] = msg.readByte();
- break;
- case 0x0021:
- player_node->mAttrUp[LocalPlayer::AGI] = msg.readByte();
- break;
- case 0x0022:
- player_node->mAttrUp[LocalPlayer::VIT] = msg.readByte();
- break;
- case 0x0023:
- player_node->mAttrUp[LocalPlayer::INT] = msg.readByte();
- break;
- case 0x0024:
- player_node->mAttrUp[LocalPlayer::DEX] = msg.readByte();
- break;
- case 0x0025:
- player_node->mAttrUp[LocalPlayer::LUK] = msg.readByte();
- break;
- }
- break;
-
+ } break;
+ /*
case SMSG_PLAYER_ARROW_MESSAGE:
{
Sint16 type = msg.readShort();