summaryrefslogtreecommitdiff
path: root/src/net/eathena
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/eathena')
-rw-r--r--src/net/eathena/skillhandler.cpp34
-rw-r--r--src/net/eathena/skillhandler.h3
2 files changed, 37 insertions, 0 deletions
diff --git a/src/net/eathena/skillhandler.cpp b/src/net/eathena/skillhandler.cpp
index 34b44e9f1..673bcd136 100644
--- a/src/net/eathena/skillhandler.cpp
+++ b/src/net/eathena/skillhandler.cpp
@@ -22,6 +22,10 @@
#include "net/eathena/skillhandler.h"
+#include "being/playerinfo.h"
+
+#include "gui/windows/skilldialog.h"
+
#include "net/eathena/messageout.h"
#include "net/eathena/protocol.h"
@@ -94,4 +98,34 @@ void SkillHandler::useMap(const int id, const std::string &map) const
outMsg.writeString(map, 16);
}
+void SkillHandler::processPlayerSkills(Net::MessageIn &msg)
+{
+ msg.readInt16(); // length
+ const int skillCount = (msg.getLength() - 4) / 37;
+ int updateSkill = 0;
+
+ for (int k = 0; k < skillCount; k++)
+ {
+ const int skillId = msg.readInt16();
+ msg.readInt16(); // target type
+ msg.skip(2); // skill pool flags
+ const int level = msg.readInt16();
+ msg.readInt16(); // sp
+ const int range = msg.readInt16();
+ msg.skip(24); // 0 unused
+ const int up = msg.readUInt8();
+ const int oldLevel = PlayerInfo::getSkillLevel(skillId);
+ if (oldLevel && oldLevel != level)
+ updateSkill = skillId;
+ PlayerInfo::setSkillLevel(skillId, level);
+ if (skillDialog)
+ {
+ if (!skillDialog->updateSkill(skillId, range, up))
+ skillDialog->addSkill(skillId, level, range, up);
+ }
+ }
+ if (updateSkill && skillDialog)
+ skillDialog->playUpdateEffect(updateSkill);
+}
+
} // namespace EAthena
diff --git a/src/net/eathena/skillhandler.h b/src/net/eathena/skillhandler.h
index 3b63bcfc5..c33971245 100644
--- a/src/net/eathena/skillhandler.h
+++ b/src/net/eathena/skillhandler.h
@@ -46,6 +46,9 @@ class SkillHandler final : public MessageHandler, public Ea::SkillHandler
const int x, const int y) const override final;
void useMap(const int id, const std::string &map) const override final;
+
+ protected:
+ void processPlayerSkills(Net::MessageIn &msg);
};
} // namespace EAthena