summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-03-25 15:54:55 +0300
committerAndrei Karas <akaras@inbox.ru>2015-03-25 15:54:55 +0300
commit44db10623278632b890b0e2cea4fe7add7d4cc74 (patch)
treee4166d8d595aeb4baf3bde1f201bebf42287a4be
parent731cbd052d5d684686a7edff54f0653c3378f067 (diff)
downloadplus-44db10623278632b890b0e2cea4fe7add7d4cc74.tar.gz
plus-44db10623278632b890b0e2cea4fe7add7d4cc74.tar.bz2
plus-44db10623278632b890b0e2cea4fe7add7d4cc74.tar.xz
plus-44db10623278632b890b0e2cea4fe7add7d4cc74.zip
eathena: impliment packet SMSG_PLAYER_DELETE_SKILL.
-rw-r--r--src/gui/windows/skilldialog.cpp18
-rw-r--r--src/gui/windows/skilldialog.h2
-rw-r--r--src/net/eathena/skillhandler.cpp16
3 files changed, 33 insertions, 3 deletions
diff --git a/src/gui/windows/skilldialog.cpp b/src/gui/windows/skilldialog.cpp
index 65134aac1..bbefbd5a7 100644
--- a/src/gui/windows/skilldialog.cpp
+++ b/src/gui/windows/skilldialog.cpp
@@ -389,6 +389,24 @@ void SkillDialog::loadXmlFile(const std::string &fileName)
}
}
+void SkillDialog::removeSkill(const int id)
+{
+ const SkillMap::const_iterator it = mSkills.find(id);
+
+ if (it != mSkills.end())
+ {
+ SkillInfo *const info = it->second;
+ if (info)
+ {
+ info->level = 0;
+ info->update();
+ PlayerInfo::setSkillLevel(id, 0);
+ if (!info->alwaysVisible)
+ info->visible = false;
+ }
+ }
+}
+
bool SkillDialog::updateSkill(const int id,
const int range,
const bool modifiable,
diff --git a/src/gui/windows/skilldialog.h b/src/gui/windows/skilldialog.h
index 6c3ab71a3..2628a3d80 100644
--- a/src/gui/windows/skilldialog.h
+++ b/src/gui/windows/skilldialog.h
@@ -118,6 +118,8 @@ class SkillDialog final : public Window,
void slowLogic();
+ void removeSkill(const int id);
+
static void useSkill(const SkillInfo *const info);
private:
diff --git a/src/net/eathena/skillhandler.cpp b/src/net/eathena/skillhandler.cpp
index 374952014..742b3f0f6 100644
--- a/src/net/eathena/skillhandler.cpp
+++ b/src/net/eathena/skillhandler.cpp
@@ -292,9 +292,19 @@ void SkillHandler::processSkillUpdate(Net::MessageIn &msg)
void SkillHandler::processSkillDelete(Net::MessageIn &msg)
{
- UNIMPLIMENTEDPACKET;
- // ignored, because after this packet server will send all skills.
- msg.readInt32("skill id");
+ int updateSkill = 0;
+ const int skillId = msg.readInt16("skill id");
+ const int oldLevel = PlayerInfo::getSkillLevel(skillId);
+ if (oldLevel && oldLevel != 0)
+ updateSkill = skillId;
+ PlayerInfo::setSkillLevel(skillId, 0);
+ if (skillDialog)
+ {
+ skillDialog->removeSkill(skillId);
+ skillDialog->update();
+ if (updateSkill)
+ skillDialog->playUpdateEffect(updateSkill);
+ }
}
void SkillHandler::processSkillCoolDown(Net::MessageIn &msg)