From 7ac6ccb36ba6ffba542f3e9a60bca4d9e6a6b84d Mon Sep 17 00:00:00 2001 From: Treeston Date: Thu, 19 Mar 2020 16:13:01 +0100 Subject: Core/Chat: Add SpellInfo const* handler for command args. Use it to update .cast . --- .../game/Chat/ChatCommands/ChatCommandArgs.cpp | 15 ++++++++++ .../game/Chat/ChatCommands/ChatCommandArgs.h | 7 +++++ src/server/scripts/Commands/cs_cast.cpp | 34 +++++++++------------- 3 files changed, 36 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp index a8b8b6cbf64..62ed5afc6c2 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp @@ -19,6 +19,7 @@ #include "AchievementMgr.h" #include "ChatCommand.h" #include "ObjectMgr.h" +#include "SpellMgr.h" using namespace Trinity::ChatCommands; @@ -50,6 +51,20 @@ char const* Trinity::ChatCommands::ArgInfo::TryConsume(GameTele return args; } +struct SpellInfoVisitor +{ + using value_type = SpellInfo const*; + value_type operator()(Hyperlink spell) const { return *spell; } + value_type operator()(uint32 spellId) const { return sSpellMgr->GetSpellInfo(spellId); } +}; +char const* Trinity::ChatCommands::ArgInfo::TryConsume(SpellInfo const*& data, char const* args) +{ + Variant, uint32> val; + if ((args = CommandArgsConsumerSingle::TryConsumeTo(val, args))) + data = boost::apply_visitor(SpellInfoVisitor(), val); + return args; +} + struct BoolVisitor { using value_type = bool; diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h index a72945ca4b6..db7d852a63d 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h @@ -123,6 +123,13 @@ struct TC_GAME_API ArgInfo static char const* TryConsume(GameTele const*&, char const*); }; +// SpellInfo const* from spell id or link +template <> +struct TC_GAME_API ArgInfo +{ + static char const* TryConsume(SpellInfo const*&, char const*); +}; + // bool from 1/0 or on/off template <> struct TC_GAME_API ArgInfo diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp index 24e4656987c..281d4671432 100644 --- a/src/server/scripts/Commands/cs_cast.cpp +++ b/src/server/scripts/Commands/cs_cast.cpp @@ -31,6 +31,7 @@ EndScriptData */ #include "SpellMgr.h" #include "WorldSession.h" +using namespace Trinity::ChatCommands; class cast_commandscript : public CommandScript { public: @@ -54,30 +55,27 @@ public: return commandTable; } - static bool CheckSpellExistsAndIsValid(ChatHandler* handler, uint32 spellId) + static bool CheckSpellExistsAndIsValid(ChatHandler* handler, SpellInfo const* spell) { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) + if (!spell) { handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); handler->SetSentErrorMessage(true); return false; } - if (!SpellMgr::IsSpellValid(spellInfo, handler->GetSession()->GetPlayer())) + if (!SpellMgr::IsSpellValid(spell, handler->GetSession()->GetPlayer())) { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); + handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spell->Id); handler->SetSentErrorMessage(true); return false; } return true; } + static bool CheckSpellExistsAndIsValid(ChatHandler* handler, uint32 const spellId) { return CheckSpellExistsAndIsValid(handler, sSpellMgr->GetSpellInfo(spellId)); } - static bool HandleCastCommand(ChatHandler* handler, char const* args) + static bool HandleCastCommand(ChatHandler* handler, SpellInfo const* spell, Optional triggeredStr) { - if (!*args) - return false; - Unit* target = handler->getSelectedUnit(); if (!target) { @@ -86,24 +84,20 @@ public: return false; } - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellId = handler->extractSpellIdFromLink((char*)args); - if (!spellId) - return false; - - if (!CheckSpellExistsAndIsValid(handler, spellId)) + if (!CheckSpellExistsAndIsValid(handler, spell)) return false; - char* triggeredStr = strtok(nullptr, " "); + TriggerCastFlags triggerFlags = TRIGGERED_NONE; if (triggeredStr) { - int l = strlen(triggeredStr); - if (strncmp(triggeredStr, "triggered", l) != 0) + if (std::string("triggered").rfind(*triggeredStr, 0) == 0) // check if "triggered" starts with *triggeredStr (e.g. "trig", "trigger", etc.) + triggerFlags = TRIGGERED_FULL_DEBUG_MASK; + else return false; + } - TriggerCastFlags triggered = (triggeredStr != nullptr) ? TRIGGERED_FULL_DEBUG_MASK : TRIGGERED_NONE; - handler->GetSession()->GetPlayer()->CastSpell(target, spellId, triggered); + handler->GetSession()->GetPlayer()->CastSpell(target, spell->Id, triggerFlags); return true; } -- cgit v1.2.3