summaryrefslogtreecommitdiff
path: root/src/net/tmwa
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/tmwa')
-rw-r--r--src/net/tmwa/playerhandler.cpp217
1 files changed, 213 insertions, 4 deletions
diff --git a/src/net/tmwa/playerhandler.cpp b/src/net/tmwa/playerhandler.cpp
index a4512489a..ed2bc6c9f 100644
--- a/src/net/tmwa/playerhandler.cpp
+++ b/src/net/tmwa/playerhandler.cpp
@@ -22,9 +22,22 @@
#include "net/tmwa/playerhandler.h"
+#include "units.h"
+#include "notifymanager.h"
+#include "party.h"
+
#include "being/localplayer.h"
#include "being/playerinfo.h"
+#include "const/net/nostat.h"
+
+#include "enums/resources/notifytypes.h"
+
+#include "gui/windows/skilldialog.h"
+#include "gui/windows/statuswindow.h"
+
+#include "net/ea/eaprotocol.h"
+
#include "net/tmwa/inventoryhandler.h"
#include "net/tmwa/messageout.h"
#include "net/tmwa/protocolout.h"
@@ -197,18 +210,214 @@ void PlayerHandler::setViewEquipment(const bool allow A_UNUSED) const
{
}
+#define setStatComplex(stat) \
+ PlayerInfo::setStatBase(stat, base, notify); \
+ if (mod != NoStat) \
+ PlayerInfo::setStatMod(stat, mod)
+
void PlayerHandler::setStat(Net::MessageIn &msg,
const int type,
const int base,
const int mod,
const Notify notify) const
{
- if (type == 500)
+ switch (type)
{
- localPlayer->setGMLevel(base);
- return;
+ case Ea::WALK_SPEED:
+ localPlayer->setWalkSpeed(base);
+ PlayerInfo::setStatBase(Attributes::WALK_SPEED, base);
+ PlayerInfo::setStatMod(Attributes::WALK_SPEED, 0);
+ break;
+ case Ea::EXP:
+ PlayerInfo::setAttribute(Attributes::EXP, base);
+ break;
+ case Ea::JOB_EXP:
+ PlayerInfo::setStatExperience(Attributes::JOB, base,
+ PlayerInfo::getStatExperience(Attributes::JOB).second);
+ break;
+ case Ea::KARMA:
+ PlayerInfo::setStatBase(Attributes::KARMA, base);
+ PlayerInfo::setStatMod(Attributes::KARMA, 0);
+ break;
+ case Ea::MANNER:
+ PlayerInfo::setStatBase(Attributes::MANNER, base);
+ PlayerInfo::setStatMod(Attributes::MANNER, 0);
+ break;
+ case Ea::HP:
+ PlayerInfo::setAttribute(Attributes::HP, base);
+ if (localPlayer->isInParty() && Party::getParty(1))
+ {
+ PartyMember *const m = Party::getParty(1)
+ ->getMember(localPlayer->getId());
+ if (m)
+ {
+ m->setHp(base);
+ m->setMaxHp(PlayerInfo::getAttribute(Attributes::MAX_HP));
+ }
+ }
+ break;
+ case Ea::MAX_HP:
+ PlayerInfo::setAttribute(Attributes::MAX_HP, base);
+
+ if (localPlayer->isInParty() && Party::getParty(1))
+ {
+ PartyMember *const m = Party::getParty(1)->getMember(
+ localPlayer->getId());
+ if (m)
+ {
+ m->setHp(PlayerInfo::getAttribute(Attributes::HP));
+ m->setMaxHp(base);
+ }
+ }
+ break;
+ case Ea::MP:
+ PlayerInfo::setAttribute(Attributes::MP, base);
+ break;
+ case Ea::MAX_MP:
+ PlayerInfo::setAttribute(Attributes::MAX_MP, base);
+ break;
+ case Ea::CHAR_POINTS:
+ PlayerInfo::setAttribute(Attributes::CHAR_POINTS, base);
+ break;
+ case Ea::LEVEL:
+ PlayerInfo::setAttribute(Attributes::LEVEL, base);
+ if (localPlayer)
+ {
+ localPlayer->setLevel(base);
+ localPlayer->updateName();
+ }
+ break;
+ case Ea::SKILL_POINTS:
+ PlayerInfo::setAttribute(Attributes::SKILL_POINTS, base);
+ if (skillDialog)
+ skillDialog->update();
+ break;
+ case Ea::STR:
+ setStatComplex(Attributes::STR);
+ break;
+ case Ea::AGI:
+ setStatComplex(Attributes::AGI);
+ break;
+ case Ea::VIT:
+ setStatComplex(Attributes::VIT);
+ break;
+ case Ea::INT:
+ setStatComplex(Attributes::INT);
+ break;
+ case Ea::DEX:
+ setStatComplex(Attributes::DEX);
+ break;
+ case Ea::LUK:
+ setStatComplex(Attributes::LUK);
+ break;
+ case Ea::MONEY:
+ {
+ const int oldMoney = PlayerInfo::getAttribute(Attributes::MONEY);
+ const int newMoney = base;
+ if (newMoney > oldMoney)
+ {
+ NotifyManager::notify(NotifyTypes::MONEY_GET,
+ Units::formatCurrency(newMoney - oldMoney));
+ }
+ else if (newMoney < oldMoney)
+ {
+ NotifyManager::notify(NotifyTypes::MONEY_SPENT,
+ Units::formatCurrency(oldMoney - newMoney).c_str());
+ }
+
+ PlayerInfo::setAttribute(Attributes::MONEY, newMoney);
+ break;
+ }
+ case Ea::EXP_NEEDED:
+ PlayerInfo::setAttribute(Attributes::EXP_NEEDED, base);
+ break;
+ case Ea::JOB_MOD:
+ PlayerInfo::setStatExperience(Attributes::JOB,
+ PlayerInfo::getStatExperience(Attributes::JOB).first, base);
+ break;
+ case Ea::TOTAL_WEIGHT:
+ PlayerInfo::setAttribute(Attributes::TOTAL_WEIGHT, base);
+ break;
+ case Ea::MAX_WEIGHT:
+ PlayerInfo::setAttribute(Attributes::MAX_WEIGHT, base);
+ break;
+ case Ea::STR_NEEDED:
+ statusWindow->setPointsNeeded(Attributes::STR, base);
+ break;
+ case Ea::AGI_NEEDED:
+ statusWindow->setPointsNeeded(Attributes::AGI, base);
+ break;
+ case Ea::VIT_NEEDED:
+ statusWindow->setPointsNeeded(Attributes::VIT, base);
+ break;
+ case Ea::INT_NEEDED:
+ statusWindow->setPointsNeeded(Attributes::INT, base);
+ break;
+ case Ea::DEX_NEEDED:
+ statusWindow->setPointsNeeded(Attributes::DEX, base);
+ break;
+ case Ea::LUK_NEEDED:
+ statusWindow->setPointsNeeded(Attributes::LUK, base);
+ break;
+
+ case Ea::ATK:
+ PlayerInfo::setStatBase(Attributes::ATK, base);
+ PlayerInfo::updateAttrs();
+ break;
+ case Ea::ATK_MOD:
+ PlayerInfo::setStatMod(Attributes::ATK, base);
+ PlayerInfo::updateAttrs();
+ break;
+ case Ea::MATK:
+ PlayerInfo::setStatBase(Attributes::MATK, base);
+ break;
+ case Ea::MATK_MOD:
+ PlayerInfo::setStatMod(Attributes::MATK, base);
+ break;
+ case Ea::DEF:
+ PlayerInfo::setStatBase(Attributes::DEF, base);
+ break;
+ case Ea::DEF_MOD:
+ PlayerInfo::setStatMod(Attributes::DEF, base);
+ break;
+ case Ea::MDEF:
+ PlayerInfo::setStatBase(Attributes::MDEF, base);
+ break;
+ case Ea::MDEF_MOD:
+ PlayerInfo::setStatMod(Attributes::MDEF, base);
+ break;
+ case Ea::HIT:
+ PlayerInfo::setStatBase(Attributes::HIT, base);
+ break;
+ case Ea::FLEE:
+ PlayerInfo::setStatBase(Attributes::FLEE, base);
+ break;
+ case Ea::FLEE_MOD:
+ PlayerInfo::setStatMod(Attributes::FLEE, base);
+ break;
+ case Ea::CRIT:
+ PlayerInfo::setStatBase(Attributes::CRIT, base);
+ break;
+ case Ea::ATTACK_DELAY:
+ localPlayer->setAttackSpeed(base);
+ PlayerInfo::setStatBase(Attributes::ATTACK_DELAY, base);
+ PlayerInfo::setStatMod(Attributes::ATTACK_DELAY, 0);
+ PlayerInfo::updateAttrs();
+ break;
+ case Ea::JOB:
+ PlayerInfo::setStatBase(Attributes::JOB, base);
+ break;
+ case 500:
+ localPlayer->setGMLevel(base);
+ break;
+
+ default:
+ UNIMPLIMENTEDPACKET;
+ break;
}
- Ea::PlayerHandler::setStat(msg, type, base, mod, notify);
+
}
+#undef setStatComplex
+
} // namespace TmwAthena