diff --git a/src/Ai/Base/Actions/GenericSpellActions.cpp b/src/Ai/Base/Actions/GenericSpellActions.cpp index c81aca214..587862a29 100644 --- a/src/Ai/Base/Actions/GenericSpellActions.cpp +++ b/src/Ai/Base/Actions/GenericSpellActions.cpp @@ -17,7 +17,7 @@ #include "WorldPacket.h" #include "Group.h" #include "Chat.h" -#include "Ai/Base/Util/GenericBuffUtils.h" +#include "GenericBuffUtils.h" #include "PlayerbotAI.h" using ai::buff::MakeAuraQualifierForBuff; @@ -134,7 +134,8 @@ bool CastSpellAction::isPossible() return botAI->CanCastSpell(spell, GetTarget()); } -CastMeleeSpellAction::CastMeleeSpellAction(PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell) +CastMeleeSpellAction::CastMeleeSpellAction( + PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell) { range = ATTACK_DISTANCE; } @@ -182,56 +183,47 @@ bool CastAuraSpellAction::isUseful() return false; } -CastEnchantItemAction::CastEnchantItemAction(PlayerbotAI* botAI, std::string const spell) - : CastSpellAction(botAI, spell) +CastEnchantItemMainHandAction::CastEnchantItemMainHandAction( + PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell) {} + +bool CastEnchantItemMainHandAction::Execute(Event /*event*/) { - range = botAI->GetRange("spell"); + Item* item = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + return item && botAI->CastSpell(spell, bot, item); } -bool CastEnchantItemAction::isPossible() -{ - // if (!CastSpellAction::isPossible()) - // { - // botAI->TellMasterNoFacing("Impossible: " + spell); - // return false; - // } - - uint32 spellId = AI_VALUE2(uint32, "spell id", spell); - - // bool ok = AI_VALUE2(Item*, "item for spell", spellId); - // Item* item = AI_VALUE2(Item*, "item for spell", spellId); - // botAI->TellMasterNoFacing("spell: " + spell + ", spell id: " + std::to_string(spellId) + " item for spell: " + - // std::to_string(ok)); - return spellId && AI_VALUE2(Item*, "item for spell", spellId); -} - -CastEnchantItemMainHandAction::CastEnchantItemMainHandAction(PlayerbotAI* botAI, std::string const spell) - : CastEnchantItemAction(botAI, spell) {} - bool CastEnchantItemMainHandAction::isPossible() { - if (!CastEnchantItemAction::isPossible()) - return false; - Item* item = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); - return item && !item->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) && - item->GetTemplate()->Class == ITEM_CLASS_WEAPON; + if (!item || item->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_MISC || + item->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_FISHING_POLE || + item->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)) + { + return false; + } + + return botAI->CanCastSpell(spell, bot, item); } -CastEnchantItemOffHandAction::CastEnchantItemOffHandAction(PlayerbotAI* botAI, std::string const spell) - : CastEnchantItemAction(botAI, spell) {} +CastEnchantItemOffHandAction::CastEnchantItemOffHandAction( + PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell) {} + +bool CastEnchantItemOffHandAction::Execute(Event /*event*/) +{ + Item* item = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); + return item && botAI->CastSpell(spell, bot, item); +} bool CastEnchantItemOffHandAction::isPossible() { - if (!CastEnchantItemAction::isPossible()) - return false; - Item* item = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); - if (!item || item->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)) + if (!item || item->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_MISC || + item->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)) + { return false; + } - uint32 invType = item->GetTemplate()->InventoryType; - return invType == INVTYPE_WEAPON || invType == INVTYPE_WEAPONOFFHAND; + return botAI->CanCastSpell(spell, bot, item); } CastHealingSpellAction::CastHealingSpellAction(PlayerbotAI* botAI, std::string const spell, uint8 estAmount, @@ -245,7 +237,8 @@ bool CastHealingSpellAction::isUseful() { return CastAuraSpellAction::isUseful() bool CastAoeHealSpellAction::isUseful() { return CastSpellAction::isUseful(); } -CastCureSpellAction::CastCureSpellAction(PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell) +CastCureSpellAction::CastCureSpellAction( + PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell) { range = botAI->GetRange("heal"); } @@ -267,13 +260,15 @@ bool BuffOnPartyAction::Execute(Event /*event*/) std::string castName = spell; // default = mono auto SendGroupRP = ai::chat::MakeGroupAnnouncer(bot); - castName = ai::buff::UpgradeToGroupIfAppropriate(bot, botAI, castName, /*announceOnMissing=*/true, SendGroupRP); + castName = ai::buff::UpgradeToGroupIfAppropriate( + bot, botAI, castName, /*announceOnMissing=*/true, SendGroupRP); return botAI->CastSpell(castName, GetTarget()); } // End greater buff fix -CastShootAction::CastShootAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "shoot"), shootSpellId(0) +CastShootAction::CastShootAction( + PlayerbotAI* botAI) : CastSpellAction(botAI, "shoot"), shootSpellId(0) { if (Item* const pItem = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED)) { @@ -327,7 +322,8 @@ Value* CastDebuffSpellOnMeleeAttackerAction::GetTargetValue() return context->GetValue("melee attacker without aura", spell); } -CastBuffSpellAction::CastBuffSpellAction(PlayerbotAI* botAI, std::string const spell, bool checkIsOwner, uint32 beforeDuration) +CastBuffSpellAction::CastBuffSpellAction( + PlayerbotAI* botAI, std::string const spell, bool checkIsOwner, uint32 beforeDuration) : CastAuraSpellAction(botAI, spell, checkIsOwner, false, beforeDuration) { range = botAI->GetRange("spell"); @@ -448,7 +444,8 @@ bool UseTrinketAction::UseTrinket(Item* item) uint32 spellId = 0; for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) { - if (item->GetTemplate()->Spells[i].SpellId > 0 && item->GetTemplate()->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE) + if (item->GetTemplate()->Spells[i].SpellId > 0 && + item->GetTemplate()->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE) { spellId = item->GetTemplate()->Spells[i].SpellId; const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId); diff --git a/src/Ai/Base/Actions/GenericSpellActions.h b/src/Ai/Base/Actions/GenericSpellActions.h index e9dacb7d2..b87bd0a1f 100644 --- a/src/Ai/Base/Actions/GenericSpellActions.h +++ b/src/Ai/Base/Actions/GenericSpellActions.h @@ -121,26 +121,21 @@ public: std::string const GetTargetName() override { return "self target"; } }; -class CastEnchantItemAction : public CastSpellAction -{ -public: - CastEnchantItemAction(PlayerbotAI* botAI, std::string const spell); - - bool isPossible() override; - std::string const GetTargetName() override { return "self target"; } -}; - -class CastEnchantItemMainHandAction : public CastEnchantItemAction +class CastEnchantItemMainHandAction : public CastSpellAction { public: CastEnchantItemMainHandAction(PlayerbotAI* botAI, std::string const spell); + std::string const GetTargetName() override { return "self target"; } + bool Execute(Event event) override; bool isPossible() override; }; -class CastEnchantItemOffHandAction : public CastEnchantItemAction +class CastEnchantItemOffHandAction : public CastSpellAction { public: CastEnchantItemOffHandAction(PlayerbotAI* botAI, std::string const spell); + std::string const GetTargetName() override { return "self target"; } + bool Execute(Event event) override; bool isPossible() override; };