diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2021-04-08 15:34:09 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-07 22:46:00 +0100 |
commit | 8d7e152d2805053a9808f6b05605c61a1554339c (patch) | |
tree | 549e30b869c785a2ee9a0cf809aa5dcfdebffa5f /src | |
parent | 1039f166de782d4c22cb12ab9d8a4496bfc0306f (diff) |
Scripts/Commands: Add ".list auras id <aura id>" and ".list auras name <name part>" subcommands (#26346)
Add ".list auras id <aura id>" and ".list auras name <name part>" subcommands to allow filtering the auras
(cherry picked from commit 9aff21b3d520cdd580f065f2965442af1bebc81c)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Commands/cs_list.cpp | 65 |
1 files changed, 59 insertions, 6 deletions
diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index 1c6e2786d5a..61668b98973 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -50,15 +50,22 @@ public: ChatCommandTable GetCommands() const override { + static ChatCommandTable listAurasCommandTable = + { + { "", HandleListAllAurasCommand, rbac::RBAC_PERM_COMMAND_LIST_AURAS, Console::No }, + { "id", HandleListAurasByIdCommand, rbac::RBAC_PERM_COMMAND_LIST_AURAS, Console::No }, + { "name", HandleListAurasByNameCommand, rbac::RBAC_PERM_COMMAND_LIST_AURAS, Console::No }, + }; + static ChatCommandTable listCommandTable = { { "creature", HandleListCreatureCommand, rbac::RBAC_PERM_COMMAND_LIST_CREATURE, Console::Yes }, { "item", HandleListItemCommand, rbac::RBAC_PERM_COMMAND_LIST_ITEM, Console::Yes }, { "object", HandleListObjectCommand, rbac::RBAC_PERM_COMMAND_LIST_OBJECT, Console::Yes }, - { "auras", HandleListAurasCommand, rbac::RBAC_PERM_COMMAND_LIST_AURAS, Console::No }, + { "auras", listAurasCommandTable }, { "mail", HandleListMailCommand, rbac::RBAC_PERM_COMMAND_LIST_MAIL, Console::Yes }, - { "spawnpoints", HandleListSpawnPointsCommand, rbac::RBAC_PERM_COMMAND_LIST_SPAWNPOINTS, Console::No }, - { "respawns", HandleListRespawnsCommand, rbac::RBAC_PERM_COMMAND_LIST_RESPAWNS, Console::No }, + { "spawnpoints", HandleListSpawnPointsCommand, rbac::RBAC_PERM_COMMAND_LIST_SPAWNPOINTS, Console::No }, + { "respawns", HandleListRespawnsCommand, rbac::RBAC_PERM_COMMAND_LIST_RESPAWNS, Console::No }, { "scenes", HandleListScenesCommand, rbac::RBAC_PERM_COMMAND_LIST_SCENES, Console::No }, }; static ChatCommandTable commandTable = @@ -434,7 +441,22 @@ public: return true; } - static bool HandleListAurasCommand(ChatHandler* handler) + static bool HandleListAllAurasCommand(ChatHandler* handler) + { + return ListAurasCommand(handler, {}, {}); + } + + static bool HandleListAurasByIdCommand(ChatHandler* handler, uint32 spellId) + { + return ListAurasCommand(handler, spellId, {}); + } + + static bool HandleListAurasByNameCommand(ChatHandler* handler, WTail namePart) + { + return ListAurasCommand(handler, {}, namePart); + } + + static bool ListAurasCommand(ChatHandler* handler, Optional<uint32> spellId, std::wstring namePart) { Unit* unit = handler->getSelectedUnit(); if (!unit) @@ -444,18 +466,23 @@ public: return false; } + wstrToLower(namePart); + char const* talentStr = handler->GetTrinityString(LANG_TALENT); char const* passiveStr = handler->GetTrinityString(LANG_PASSIVE); Unit::AuraApplicationMap const& auras = unit->GetAppliedAuras(); handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURAS, std::to_string(auras.size()).c_str()); - for (auto const& [spellId, aurApp] : auras) + for (auto const& [aurId, aurApp] : auras) { Aura const* aura = aurApp->GetBase(); char const* name = aura->GetSpellInfo()->SpellName->Str[handler->GetSessionDbcLocale()]; bool talent = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_CU_IS_TALENT); + if (!ShouldListAura(aura->GetSpellInfo(), spellId, namePart, handler->GetSessionDbcLocale())) + continue; + std::ostringstream ss_name; ss_name << "|cffffffff|Hspell:" << aura->GetId() << "|h[" << name << "]|h|r"; @@ -472,14 +499,40 @@ public: if (auraList.empty()) continue; - handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURATYPE, std::to_string(auraList.size()).c_str(), i); + bool sizeLogged = false; for (AuraEffect const* effect : auraList) + { + if (!ShouldListAura(effect->GetSpellInfo(), spellId, namePart, handler->GetSessionDbcLocale())) + continue; + + if (!sizeLogged) + { + sizeLogged = true; + handler->PSendSysMessage(LANG_COMMAND_TARGET_LISTAURATYPE, std::to_string(auraList.size()).c_str(), i); + } + handler->PSendSysMessage(LANG_COMMAND_TARGET_AURASIMPLE, effect->GetId(), effect->GetEffIndex(), effect->GetAmount()); + } } return true; } + + static bool ShouldListAura(SpellInfo const* spellInfo, Optional<uint32> spellId, std::wstring namePart, LocaleConstant locale) + { + if (spellId) + return spellInfo->Id == spellId; + + if (!namePart.empty()) + { + std::string name = (*spellInfo->SpellName)[locale]; + return Utf8FitTo(name, namePart); + } + + return true; + } + // handle list mail command static bool HandleListMailCommand(ChatHandler* handler, Optional<PlayerIdentifier> player) { |