diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index a1fdb5913..8d1836079 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -410,9 +410,10 @@ enum TriggerCastFlags TRIGGERED_IGNORE_CASTER_AURAS = 0x00010000, //! Will ignore caster aura restrictions or requirements TRIGGERED_DISALLOW_PROC_EVENTS = 0x00020000, //! Disallows proc events from triggered spell (default) TRIGGERED_DONT_REPORT_CAST_ERROR = 0x00040000, //! Will return SPELL_FAILED_DONT_REPORT in CheckCast functions + TRIGGERED_FULL_MASK = 0x0007FFFF, //! Used when doing CastSpell with triggered == true TRIGGERED_IGNORE_EQUIPPED_ITEM_REQUIREMENT = 0x00080000, //! Will ignore equipped item requirements TRIGGERED_NO_PERIODIC_RESET = 0x00100000, //! Periodic aura tick wont be reset on override - TRIGGERED_FULL_MASK = 0xFFFFFFFF + TRIGGERED_FULL_DEBUG_MASK = 0xFFFFFFFF }; enum UnitMods diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp index 5c56775b5..337a90b3f 100644 --- a/src/server/scripts/Commands/cs_cast.cpp +++ b/src/server/scripts/Commands/cs_cast.cpp @@ -22,16 +22,14 @@ Comment: All cast related commands Category: commandscripts EndScriptData */ +#include "ScriptMgr.h" #include "Chat.h" #include "Creature.h" #include "Language.h" #include "Player.h" -#include "ScriptMgr.h" #include "SpellInfo.h" - -#if AC_COMPILER == AC_COMPILER_GNU -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif +#include "SpellMgr.h" +#include "WorldSession.h" using namespace Acore::ChatCommands; @@ -44,25 +42,52 @@ public: { static ChatCommandTable castCommandTable = { - { "back", SEC_GAMEMASTER, false, &HandleCastBackCommand, "" }, - { "dist", SEC_GAMEMASTER, false, &HandleCastDistCommand, "" }, - { "self", SEC_GAMEMASTER, false, &HandleCastSelfCommand, "" }, - { "target", SEC_GAMEMASTER, false, &HandleCastTargetCommad, "" }, - { "dest", SEC_GAMEMASTER, false, &HandleCastDestCommand, "" }, - { "", SEC_GAMEMASTER, false, &HandleCastCommand, "" } + { "back", HandleCastBackCommand, SEC_GAMEMASTER, Console::No }, + { "dist", HandleCastDistCommand, SEC_GAMEMASTER, Console::No }, + { "self", HandleCastSelfCommand, SEC_GAMEMASTER, Console::No }, + { "target", HandleCastTargetCommad, SEC_GAMEMASTER, Console::No }, + { "dest", HandleCastDestCommand, SEC_GAMEMASTER, Console::No }, + { "", HandleCastCommand, SEC_GAMEMASTER, Console::No } }; static ChatCommandTable commandTable = { - { "cast", SEC_GAMEMASTER, false, nullptr, "", castCommandTable } + { "cast", castCommandTable } }; return commandTable; } - static bool HandleCastCommand(ChatHandler* handler, char const* args) + static bool CheckSpellExistsAndIsValid(ChatHandler* handler, SpellInfo const* spell) { - if (!*args) + if (!spell) + { + handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); + handler->SetSentErrorMessage(true); return false; + } + if (!SpellMgr::IsSpellValid(spell)) + { + handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spell->Id); + handler->SetSentErrorMessage(true); + return false; + } + return true; + } + + static Optional GetTriggerFlags(Optional triggeredStr) + { + if (triggeredStr) + { + if (StringStartsWith("triggered", *triggeredStr)) // check if "triggered" starts with *triggeredStr (e.g. "trig", "trigger", etc.) + return TRIGGERED_FULL_DEBUG_MASK; + else + return std::nullopt; + } + return TRIGGERED_NONE; + } + + static bool HandleCastCommand(ChatHandler* handler, SpellInfo const* spell, Optional triggeredStr) + { Unit* target = handler->getSelectedUnit(); if (!target) { @@ -71,42 +96,19 @@ 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) + if (!CheckSpellExistsAndIsValid(handler, spell)) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + Optional triggerFlags = GetTriggerFlags(triggeredStr); + if (!triggerFlags) return false; - } - if (!SpellMgr::IsSpellValid(spellInfo)) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } - - char* triggeredStr = strtok(nullptr, " "); - if (triggeredStr) - { - int l = strlen(triggeredStr); - if (strncmp(triggeredStr, "triggered", l) != 0) - return false; - } - - bool triggered = (triggeredStr != nullptr); - - handler->GetSession()->GetPlayer()->CastSpell(target, spellId, triggered); + handler->GetSession()->GetPlayer()->CastSpell(target, spell->Id, *triggerFlags); return true; } - static bool HandleCastBackCommand(ChatHandler* handler, char const* args) + static bool HandleCastBackCommand(ChatHandler* handler, SpellInfo const* spell, Optional triggeredStr) { Creature* caster = handler->getSelectedCreature(); if (!caster) @@ -116,97 +118,36 @@ public: return false; } - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r - // 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) + if (!CheckSpellExistsAndIsValid(handler, spell)) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + Optional triggerFlags = GetTriggerFlags(triggeredStr); + if (!triggerFlags) return false; - } - if (!SpellMgr::IsSpellValid(spellInfo)) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } - - char* triggeredStr = strtok(nullptr, " "); - if (triggeredStr) - { - int l = strlen(triggeredStr); - if (strncmp(triggeredStr, "triggered", l) != 0) - return false; - } - - bool triggered = (triggeredStr != nullptr); - - caster->CastSpell(handler->GetSession()->GetPlayer(), spellId, triggered); + caster->CastSpell(handler->GetSession()->GetPlayer(), spell->Id, *triggerFlags); return true; } - static bool HandleCastDistCommand(ChatHandler* handler, char const* args) + static bool HandleCastDistCommand(ChatHandler* handler, SpellInfo const* spell, float dist, Optional triggeredStr) { - if (!*args) + if (!CheckSpellExistsAndIsValid(handler, spell)) 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) + Optional triggerFlags = GetTriggerFlags(triggeredStr); + if (!triggerFlags) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); - return false; - } - - if (!SpellMgr::IsSpellValid(spellInfo)) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } - - char* distStr = strtok(nullptr, " "); - - float dist = 0; - - if (distStr) - sscanf(distStr, "%f", &dist); - - char* triggeredStr = strtok(nullptr, " "); - if (triggeredStr) - { - int l = strlen(triggeredStr); - if (strncmp(triggeredStr, "triggered", l) != 0) - return false; - } - - bool triggered = (triggeredStr != nullptr); - float x, y, z; handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, dist); - - handler->GetSession()->GetPlayer()->CastSpell(x, y, z, spellId, triggered); + handler->GetSession()->GetPlayer()->CastSpell(x, y, z, spell->Id, *triggerFlags); return true; } - static bool HandleCastSelfCommand(ChatHandler* handler, char const* args) + static bool HandleCastSelfCommand(ChatHandler* handler, SpellInfo const* spell, Optional triggeredStr) { - if (!*args) - return false; - Unit* target = handler->getSelectedUnit(); if (!target) { @@ -215,42 +156,19 @@ 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) + if (!CheckSpellExistsAndIsValid(handler, spell)) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + Optional triggerFlags = GetTriggerFlags(triggeredStr); + if (!triggerFlags) return false; - } - if (!SpellMgr::IsSpellValid(spellInfo)) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } - - char* triggeredStr = strtok(nullptr, " "); - if (triggeredStr) - { - int l = strlen(triggeredStr); - if (strncmp(triggeredStr, "triggered", l) != 0) - return false; - } - - bool triggered = (triggeredStr != nullptr); - - target->CastSpell(target, spellId, triggered); + target->CastSpell(target, spell->Id, *triggerFlags); return true; } - static bool HandleCastTargetCommad(ChatHandler* handler, char const* args) + static bool HandleCastTargetCommad(ChatHandler* handler, SpellInfo const* spell, Optional triggeredStr) { Creature* caster = handler->getSelectedCreature(); if (!caster) @@ -267,42 +185,19 @@ 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) + if (!CheckSpellExistsAndIsValid(handler, spell)) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + Optional triggerFlags = GetTriggerFlags(triggeredStr); + if (!triggerFlags) return false; - } - if (!SpellMgr::IsSpellValid(spellInfo)) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } - - char* triggeredStr = strtok(nullptr, " "); - if (triggeredStr) - { - int l = strlen(triggeredStr); - if (strncmp(triggeredStr, "triggered", l) != 0) - return false; - } - - bool triggered = (triggeredStr != nullptr); - - caster->CastSpell(caster->GetVictim(), spellId, triggered); + caster->CastSpell(caster->GetVictim(), spell->Id, *triggerFlags); return true; } - static bool HandleCastDestCommand(ChatHandler* handler, char const* args) + static bool HandleCastDestCommand(ChatHandler* handler, SpellInfo const* spell, float x, float y, float z, Optional triggeredStr) { Unit* caster = handler->getSelectedUnit(); if (!caster) @@ -312,48 +207,14 @@ 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) + if (!CheckSpellExistsAndIsValid(handler, spell)) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); - return false; - } - - if (!SpellMgr::IsSpellValid(spellInfo)) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } - - char* posX = strtok(nullptr, " "); - char* posY = strtok(nullptr, " "); - char* posZ = strtok(nullptr, " "); - - if (!posX || !posY || !posZ) + Optional triggerFlags = GetTriggerFlags(triggeredStr); + if (!triggerFlags) return false; - float x = float(atof(posX)); - float y = float(atof(posY)); - float z = float(atof(posZ)); - - char* triggeredStr = strtok(nullptr, " "); - if (triggeredStr) - { - int l = strlen(triggeredStr); - if (strncmp(triggeredStr, "triggered", l) != 0) - return false; - } - - bool triggered = (triggeredStr != nullptr); - - caster->CastSpell(x, y, z, spellId, triggered); + caster->CastSpell(x, y, z, spell->Id, *triggerFlags); return true; }