summaryrefslogtreecommitdiff
path: root/src/net/eathena
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/eathena')
-rw-r--r--src/net/eathena/skillhandler.cpp144
-rw-r--r--src/net/eathena/skillhandler.h2
2 files changed, 146 insertions, 0 deletions
diff --git a/src/net/eathena/skillhandler.cpp b/src/net/eathena/skillhandler.cpp
index a23700df4..663e95876 100644
--- a/src/net/eathena/skillhandler.cpp
+++ b/src/net/eathena/skillhandler.cpp
@@ -22,6 +22,9 @@
#include "net/eathena/skillhandler.h"
+#include "notifymanager.h"
+
+#include "being/localplayer.h"
#include "being/playerinfo.h"
#include "gui/windows/skilldialog.h"
@@ -29,6 +32,11 @@
#include "net/eathena/messageout.h"
#include "net/eathena/protocol.h"
+#include "resources/notifytypes.h"
+
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
#include "debug.h"
extern Net::SkillHandler *skillHandler;
@@ -183,4 +191,140 @@ void SkillHandler::processSkillCoolDownList(Net::MessageIn &msg)
}
}
+void SkillHandler::processSkillFailed(Net::MessageIn &msg)
+{
+ // Action failed (ex. sit because you have not reached the
+ // right level)
+ const int skillId = msg.readInt16();
+ const int16_t bskill = msg.readInt16();
+ msg.readInt16(); // btype
+ const signed char success = msg.readUInt8();
+ const signed char reason = msg.readUInt8();
+ if (success != static_cast<int>(SKILL_FAILED)
+ && bskill == static_cast<int>(BSKILL_EMOTE))
+ {
+ logger->log("Action: %d/%d", bskill, success);
+ }
+
+ std::string txt;
+ if (success == static_cast<int>(SKILL_FAILED)
+ && skillId == static_cast<int>(SKILL_BASIC))
+ {
+ if (localPlayer && bskill == static_cast<int>(BSKILL_EMOTE)
+ && reason == static_cast<int>(RFAIL_SKILLDEP))
+ {
+ localPlayer->stopAdvert();
+ }
+
+ switch (bskill)
+ {
+ case BSKILL_TRADE:
+ // TRANSLATORS: error message
+ txt = _("Trade failed!");
+ break;
+ case BSKILL_EMOTE:
+ // TRANSLATORS: error message
+ txt = _("Emote failed!");
+ break;
+ case BSKILL_SIT:
+ // TRANSLATORS: error message
+ txt = _("Sit failed!");
+ break;
+ case BSKILL_CREATECHAT:
+ // TRANSLATORS: error message
+ txt = _("Chat creating failed!");
+ break;
+ case BSKILL_JOINPARTY:
+ // TRANSLATORS: error message
+ txt = _("Could not join party!");
+ break;
+ case BSKILL_SHOUT:
+ // TRANSLATORS: error message
+ txt = _("Cannot shout!");
+ break;
+ default:
+ logger->log("QQQ SMSG_SKILL_FAILED: bskill "
+ + toString(bskill));
+ break;
+ }
+
+ txt.append(" ");
+
+ switch (reason)
+ {
+ case RFAIL_SKILLDEP:
+ // TRANSLATORS: error message
+ txt.append(_("You have not yet reached a high enough lvl!"));
+ break;
+ case RFAIL_INSUFHP:
+ // TRANSLATORS: error message
+ txt.append(_("Insufficient HP!"));
+ break;
+ case RFAIL_INSUFSP:
+ // TRANSLATORS: error message
+ txt.append(_("Insufficient SP!"));
+ break;
+ case RFAIL_NOMEMO:
+ // TRANSLATORS: error message
+ txt.append(_("You have no memos!"));
+ break;
+ case RFAIL_SKILLDELAY:
+ // TRANSLATORS: error message
+ txt.append(_("You cannot do that right now!"));
+ break;
+ case RFAIL_ZENY:
+ // TRANSLATORS: error message
+ txt.append(_("Seems you need more money... ;-)"));
+ break;
+ case RFAIL_WEAPON:
+ // TRANSLATORS: error message
+ txt.append(_("You cannot use this skill with that "
+ "kind of weapon!"));
+ break;
+ case RFAIL_REDGEM:
+ // TRANSLATORS: error message
+ txt.append(_("You need another red gem!"));
+ break;
+ case RFAIL_BLUEGEM:
+ // TRANSLATORS: error message
+ txt.append(_("You need another blue gem!"));
+ break;
+ case RFAIL_OVERWEIGHT:
+ // TRANSLATORS: error message
+ txt.append(_("You're carrying to much to do this!"));
+ break;
+ default:
+ // TRANSLATORS: error message
+ txt.append(_("Huh? What's that?"));
+ logger->log("QQQ SMSG_SKILL_FAILED: reason "
+ + toString(reason));
+ break;
+ }
+ }
+ else
+ {
+ switch (skillId)
+ {
+ case SKILL_WARP :
+ // TRANSLATORS: error message
+ txt = _("Warp failed...");
+ break;
+ case SKILL_STEAL :
+ // TRANSLATORS: error message
+ txt = _("Could not steal anything...");
+ break;
+ case SKILL_ENVENOM :
+ // TRANSLATORS: error message
+ txt = _("Poison had no effect...");
+ break;
+ default:
+ logger->log("QQQ SMSG_SKILL_FAILED: skillId "
+ + toString(skillId));
+ break;
+ }
+ }
+
+ NotifyManager::notify(NotifyTypes::SKILL_FAIL_MESSAGE, txt);
+}
+
} // namespace EAthena
diff --git a/src/net/eathena/skillhandler.h b/src/net/eathena/skillhandler.h
index 66f96f3eb..1622ec98b 100644
--- a/src/net/eathena/skillhandler.h
+++ b/src/net/eathena/skillhandler.h
@@ -52,6 +52,8 @@ class SkillHandler final : public MessageHandler, public Ea::SkillHandler
void useMap(const int id, const std::string &map) const override final;
protected:
+ static void processSkillFailed(Net::MessageIn &msg);
+
void processPlayerSkills(Net::MessageIn &msg);
void processSkillCoolDown(Net::MessageIn &msg);