diff options
Diffstat (limited to 'src/net/eathena')
-rw-r--r-- | src/net/eathena/skillhandler.cpp | 144 | ||||
-rw-r--r-- | src/net/eathena/skillhandler.h | 2 |
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); |