diff --git a/src/server/scripts/Commands/PlayerCommand.cpp b/src/server/scripts/Commands/PlayerCommand.cpp index 3cf4aa2c4..d842f9281 100644 --- a/src/server/scripts/Commands/PlayerCommand.cpp +++ b/src/server/scripts/Commands/PlayerCommand.cpp @@ -15,46 +15,22 @@ * with this program. If not, see . */ +#include "SpellInfo.h" #include "PlayerCommand.h" #include "Language.h" -bool Acore::PlayerCommand::HandleLearnSpellCommand(ChatHandler* handler, Player* targetPlayer, uint32 spell, char const* all) +bool Acore::PlayerCommand::HandleLearnSpellCommand(ChatHandler* handler, Player* targetPlayer, SpellInfo const* spell, Optional allRanks) { - if (!spell) - return false; - - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell); - if (!spellInfo) + if (!SpellMgr::IsSpellValid(spell)) { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); + handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spell->Id); handler->SetSentErrorMessage(true); return false; } - if (!SpellMgr::IsSpellValid(spellInfo)) + if (!allRanks && targetPlayer->HasSpell(spell->Id)) { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spell); - handler->SetSentErrorMessage(true); - return false; - } - - if (handler->GetSession()) - { - SpellScriptsBounds bounds = sObjectMgr->GetSpellScriptsBounds(spell); - uint32 spellDifficultyId = sSpellMgr->GetSpellDifficultyId(spell); - if (handler->GetSession() && handler->GetSession()->GetSecurity() < SEC_ADMINISTRATOR && (bounds.first != bounds.second || spellDifficultyId)) - { - handler->PSendSysMessage("Spell %u cannot be learnt using a command!", spell); - handler->SetSentErrorMessage(true); - return false; - } - } - - bool allRanks = all ? (strncmp(all, "all", 3) == 0) : false; - - if (!allRanks && targetPlayer->HasSpell(spell)) - { - if (handler->GetSession() && targetPlayer == handler->GetSession()->GetPlayer()) + if (targetPlayer == handler->GetPlayer()) handler->SendSysMessage(LANG_YOU_KNOWN_SPELL); else handler->PSendSysMessage(LANG_TARGET_KNOWN_SPELL, handler->GetNameLink(targetPlayer).c_str()); @@ -62,25 +38,23 @@ bool Acore::PlayerCommand::HandleLearnSpellCommand(ChatHandler* handler, Player* return false; } + targetPlayer->learnSpell(spell->Id, false); if (allRanks) - targetPlayer->learnSpellHighRank(spell); - else - targetPlayer->learnSpell(spell); + { + uint32 spellId = spell->Id; + while ((spellId = sSpellMgr->GetNextSpellInChain(spellId))) + targetPlayer->learnSpell(spellId, false); + } - uint32 firstSpell = sSpellMgr->GetFirstSpellInChain(spell); - if (GetTalentSpellCost(firstSpell)) + if (GetTalentSpellCost(spell->GetFirstRankSpell()->Id)) targetPlayer->SendTalentsInfoData(false); return true; } -bool Acore::PlayerCommand::HandleUnlearnSpellCommand(ChatHandler* handler, Player* target, uint32 spellId, char const* allStr) +bool Acore::PlayerCommand::HandleUnlearnSpellCommand(ChatHandler* handler, Player* target, SpellInfo const* spell, Optional allRanks) { - if (!spellId) - return false; - - bool allRanks = allStr ? (strncmp(allStr, "all", 3) == 0) : false; - + uint32 spellId = spell->Id; if (allRanks) spellId = sSpellMgr->GetFirstSpellInChain (spellId); diff --git a/src/server/scripts/Commands/PlayerCommand.h b/src/server/scripts/Commands/PlayerCommand.h index 7b361a426..0d8807bbd 100644 --- a/src/server/scripts/Commands/PlayerCommand.h +++ b/src/server/scripts/Commands/PlayerCommand.h @@ -25,9 +25,9 @@ namespace Acore // Used in player/character commands namespace PlayerCommand { - bool HandleLearnSpellCommand(ChatHandler* handler, Player* targetPlayer, uint32 spell, char const* all); - bool HandleUnlearnSpellCommand(ChatHandler* handler, Player* targetPlayer, uint32 spell, char const* all); + bool HandleLearnSpellCommand(ChatHandler* handler, Player* targetPlayer, SpellInfo const* spell, Optional allRanks); + bool HandleUnlearnSpellCommand(ChatHandler* handler, Player* targetPlayer, SpellInfo const* spell, Optional allRanks); }; }; -#endif // _PLAYER_COMMAND_H \ No newline at end of file +#endif // _PLAYER_COMMAND_H diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index ff770b455..10cb2da9a 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -30,10 +30,6 @@ EndScriptData */ #include "SpellInfo.h" #include "SpellMgr.h" -#if AC_COMPILER == AC_COMPILER_GNU -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - using namespace Acore::ChatCommands; class learn_commandscript : public CommandScript @@ -45,41 +41,38 @@ public: { static ChatCommandTable learnAllMyCommandTable = { - { "class", SEC_GAMEMASTER, false, &HandleLearnAllMyClassCommand, "" }, - { "pettalents", SEC_GAMEMASTER, false, &HandleLearnAllMyPetTalentsCommand, "" }, - { "spells", SEC_GAMEMASTER, false, &HandleLearnAllMySpellsCommand, "" }, - { "talents", SEC_GAMEMASTER, false, &HandleLearnAllMyTalentsCommand, "" } + { "class", HandleLearnAllMyClassCommand, SEC_GAMEMASTER, Console::No }, + { "pettalents", HandleLearnAllMyPetTalentsCommand, SEC_GAMEMASTER, Console::No }, + { "spells", HandleLearnAllMySpellsCommand, SEC_GAMEMASTER, Console::No }, + { "talents", HandleLearnAllMyTalentsCommand, SEC_GAMEMASTER, Console::No } }; static ChatCommandTable learnAllCommandTable = { - { "my", SEC_GAMEMASTER, false, nullptr, "", learnAllMyCommandTable }, - { "gm", SEC_GAMEMASTER, false, &HandleLearnAllGMCommand, "" }, - { "crafts", SEC_GAMEMASTER, false, &HandleLearnAllCraftsCommand, "" }, - { "default", SEC_GAMEMASTER, false, &HandleLearnAllDefaultCommand, "" }, - { "lang", SEC_GAMEMASTER, false, &HandleLearnAllLangCommand, "" }, - { "recipes", SEC_GAMEMASTER, false, &HandleLearnAllRecipesCommand, "" } + { "my", learnAllMyCommandTable }, + { "gm", HandleLearnAllGMCommand, SEC_GAMEMASTER, Console::No }, + { "crafts", HandleLearnAllCraftsCommand, SEC_GAMEMASTER, Console::No }, + { "default", HandleLearnAllDefaultCommand, SEC_GAMEMASTER, Console::No }, + { "lang", HandleLearnAllLangCommand, SEC_GAMEMASTER, Console::No }, + { "recipes", HandleLearnAllRecipesCommand, SEC_GAMEMASTER, Console::No }, }; static ChatCommandTable learnCommandTable = { - { "all", SEC_GAMEMASTER, false, nullptr, "", learnAllCommandTable }, - { "", SEC_GAMEMASTER, false, &HandleLearnCommand, "" } + { "all", learnAllCommandTable }, + { "", HandleLearnCommand, SEC_GAMEMASTER, Console::No } }; static ChatCommandTable commandTable = { - { "learn", SEC_GAMEMASTER, false, nullptr, "", learnCommandTable }, - { "unlearn", SEC_GAMEMASTER, false, &HandleUnLearnCommand, "" } + { "learn", learnCommandTable }, + { "unlearn", HandleUnLearnCommand, SEC_GAMEMASTER, Console::No } }; return commandTable; } - static bool HandleLearnCommand(ChatHandler* handler, char const* args) + static bool HandleLearnCommand(ChatHandler* handler, SpellInfo const* spell, Optional allRanks) { - if (!*args) - return false; - Player* targetPlayer = handler->getSelectedPlayer(); if (!targetPlayer) @@ -89,13 +82,10 @@ public: return false; } - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell = handler->extractSpellIdFromLink((char*)args); - char const* all = strtok(nullptr, " "); - return Acore::PlayerCommand::HandleLearnSpellCommand(handler, targetPlayer, spell, all); + return Acore::PlayerCommand::HandleLearnSpellCommand(handler, targetPlayer, spell, allRanks); } - static bool HandleLearnAllGMCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllGMCommand(ChatHandler* handler) { for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i) { @@ -113,14 +103,14 @@ public: return true; } - static bool HandleLearnAllMyClassCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllMyClassCommand(ChatHandler* handler) { - HandleLearnAllMySpellsCommand(handler, ""); - HandleLearnAllMyTalentsCommand(handler, ""); + HandleLearnAllMySpellsCommand(handler); + HandleLearnAllMyTalentsCommand(handler); return true; } - static bool HandleLearnAllMySpellsCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllMySpellsCommand(ChatHandler* handler) { ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(handler->GetSession()->GetPlayer()->getClass()); if (!classEntry) @@ -165,7 +155,7 @@ public: return true; } - static bool HandleLearnAllMyTalentsCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllMyTalentsCommand(ChatHandler* handler) { Player* player = handler->GetSession()->GetPlayer(); uint32 classMask = player->getClassMask(); @@ -211,7 +201,7 @@ public: return true; } - static bool HandleLearnAllMyPetTalentsCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllMyPetTalentsCommand(ChatHandler* handler) { Player* player = handler->GetSession()->GetPlayer(); @@ -289,7 +279,7 @@ public: return true; } - static bool HandleLearnAllLangCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllLangCommand(ChatHandler* handler) { // skipping UNIVERSAL language (0) for (uint8 i = 1; i < LANGUAGES_COUNT; ++i) @@ -299,12 +289,14 @@ public: return true; } - static bool HandleLearnAllDefaultCommand(ChatHandler* handler, char const* args) + static bool HandleLearnAllDefaultCommand(ChatHandler* handler, Optional player) { - Player* target; - if (!handler->extractPlayerTarget((char*)args, &target)) + if (!player) + player = PlayerIdentifier::FromTargetOrSelf(handler); + if (!player || !player->IsConnected()) return false; + Player* target = player->GetConnectedPlayer(); target->LearnDefaultSkills(); target->LearnCustomSpells(); target->learnQuestRewardedSpells(); @@ -313,7 +305,7 @@ public: return true; } - static bool HandleLearnAllCraftsCommand(ChatHandler* handler, char const* /*args*/) + static bool HandleLearnAllCraftsCommand(ChatHandler* handler) { for (uint32 i = 0; i < sSkillLineStore.GetNumRows(); ++i) { @@ -332,7 +324,7 @@ public: return true; } - static bool HandleLearnAllRecipesCommand(ChatHandler* handler, char const* args) + static bool HandleLearnAllRecipesCommand(ChatHandler* handler, WTail namePart) { // Learns all recipes of specified profession and sets skill to max // Example: .learn all_recipes enchanting @@ -344,20 +336,14 @@ public: return false; } - if (!*args) - return false; - - std::wstring namePart; - - if (!Utf8toWStr(args, namePart)) + if (namePart.empty()) return false; // converting string that we try to find to lower case wstrToLower(namePart); - std::string name; - SkillLineEntry const* targetSkillInfo = nullptr; + char const* name = nullptr; for (uint32 i = 1; i < sSkillLineStore.GetNumRows(); ++i) { SkillLineEntry const* skillInfo = sSkillLineStore.LookupEntry(i); @@ -365,30 +351,19 @@ public: continue; if ((skillInfo->categoryId != SKILL_CATEGORY_PROFESSION && - skillInfo->categoryId != SKILL_CATEGORY_SECONDARY) || - !skillInfo->canLink) // only prof with recipes have set + skillInfo->categoryId != SKILL_CATEGORY_SECONDARY) || + !skillInfo->canLink) // only prof with recipes have set continue; - int locale = handler->GetSessionDbcLocale(); - name = skillInfo->name[locale]; - if (name.empty()) - continue; - - if (!Utf8FitTo(name, namePart)) + uint8 locale = 0; + for (; locale < TOTAL_LOCALES; ++locale) { - locale = 0; - for (; locale < TOTAL_LOCALES; ++locale) - { - if (locale == handler->GetSessionDbcLocale()) - continue; + name = skillInfo->name[locale]; + if (!name || !*name) + continue; - name = skillInfo->name[locale]; - if (name.empty()) - continue; - - if (Utf8FitTo(name, namePart)) - break; - } + if (Utf8FitTo(name, namePart)) + break; } if (locale < TOTAL_LOCALES) @@ -398,14 +373,14 @@ public: } } - if (!targetSkillInfo) + if (!(name && targetSkillInfo)) return false; HandleLearnSkillRecipesHelper(target, targetSkillInfo->id); uint16 maxLevel = target->GetPureMaxSkillValue(targetSkillInfo->id); target->SetSkill(targetSkillInfo->id, target->GetSkillStep(targetSkillInfo->id), maxLevel, maxLevel); - handler->PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, name.c_str()); + handler->PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, name); return true; } @@ -443,11 +418,8 @@ public: } } - static bool HandleUnLearnCommand(ChatHandler* handler, char const* args) + static bool HandleUnLearnCommand(ChatHandler* handler, SpellInfo const* spell, Optional allRanks) { - if (!*args) - return false; - Player* target = handler->getSelectedPlayer(); if (!target) { @@ -456,10 +428,7 @@ public: return false; } - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r - uint32 spellId = handler->extractSpellIdFromLink((char*)args); - char const* allStr = strtok(nullptr, " "); - return Acore::PlayerCommand::HandleUnlearnSpellCommand(handler, target, spellId, allStr); + return Acore::PlayerCommand::HandleUnlearnSpellCommand(handler, target, spell, allRanks); } }; diff --git a/src/server/scripts/Commands/cs_player.cpp b/src/server/scripts/Commands/cs_player.cpp index a6c6ad614..5fbab32d4 100644 --- a/src/server/scripts/Commands/cs_player.cpp +++ b/src/server/scripts/Commands/cs_player.cpp @@ -16,13 +16,8 @@ */ #include "ScriptMgr.h" -#include "Language.h" #include "PlayerCommand.h" -#if AC_COMPILER == AC_COMPILER_GNU -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - using namespace Acore::ChatCommands; class player_commandscript : public CommandScript @@ -34,84 +29,37 @@ public: { static ChatCommandTable playerCommandTable = { - { "learn", SEC_GAMEMASTER, true, &HandlePlayerLearnCommand, "" }, - { "unlearn", SEC_GAMEMASTER, true, &HandlePlayerUnLearnCommand, "" } + { "learn", HandlePlayerLearnCommand, SEC_GAMEMASTER, Console::Yes }, + { "unlearn", HandlePlayerUnLearnCommand, SEC_GAMEMASTER, Console::Yes } }; static ChatCommandTable commandTable = { - { "player", SEC_GAMEMASTER, true, nullptr, "", playerCommandTable } + { "player", playerCommandTable } }; return commandTable; } - static bool HandlePlayerLearnCommand(ChatHandler* handler, char const* args) + static bool HandlePlayerLearnCommand(ChatHandler* handler, Optional player, SpellInfo const* spell, Optional allRanks) { - if (!*args) + if (!player) + player = PlayerIdentifier::FromTargetOrSelf(handler); + if (!player || !player->IsConnected()) return false; - char* playerName = strtok((char*)args, " "); - char* spellId = strtok(nullptr, " "); - char const* all = strtok(nullptr, " "); - Player* targetPlayer = FindPlayer(handler, playerName); - if (!spellId || !targetPlayer) - { - return false; - } - - uint32 spell = handler->extractSpellIdFromLink(spellId); - - if (!spell) - { - return false; - } - - return Acore::PlayerCommand::HandleLearnSpellCommand(handler, targetPlayer, spell, all); + Player* targetPlayer = player->GetConnectedPlayer(); + return Acore::PlayerCommand::HandleLearnSpellCommand(handler, targetPlayer, spell, allRanks); } - static bool HandlePlayerUnLearnCommand(ChatHandler* handler, char const* args) + static bool HandlePlayerUnLearnCommand(ChatHandler* handler, Optional player, SpellInfo const* spell, Optional allRanks) { - if (!*args) + if (!player) + player = PlayerIdentifier::FromTargetOrSelf(handler); + if (!player || !player->IsConnected()) return false; - char* playerName = strtok((char*)args, " "); - char* spellId = strtok(nullptr, " "); - char const* all = strtok(nullptr, " "); - Player* targetPlayer = FindPlayer(handler, playerName); - - if (!spellId || !targetPlayer) - { - return false; - } - - uint32 spell = handler->extractSpellIdFromLink(spellId); - - if (!spell) - { - return false; - } - - return Acore::PlayerCommand::HandleUnlearnSpellCommand(handler, targetPlayer, spell, all); - } - -private: - static Player* FindPlayer(ChatHandler* handler, char* playerName) - { - if (!playerName) - return nullptr; - - Player* targetPlayer; - if (!handler->extractPlayerTarget(playerName, &targetPlayer)) - return nullptr; - - if (!targetPlayer) - { - handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); - handler->SetSentErrorMessage(true); - return nullptr; - } - - return targetPlayer; + Player* targetPlayer = player->GetConnectedPlayer(); + return Acore::PlayerCommand::HandleUnlearnSpellCommand(handler, targetPlayer, spell, allRanks); } };