diff --git a/src/modules/Bots/playerbot/strategy/ItemVisitors.h b/src/modules/Bots/playerbot/strategy/ItemVisitors.h index dc704e357..174bfebfe 100644 --- a/src/modules/Bots/playerbot/strategy/ItemVisitors.h +++ b/src/modules/Bots/playerbot/strategy/ItemVisitors.h @@ -59,7 +59,6 @@ namespace ai { return FindItemVisitor::Visit(item); } - return true; } @@ -286,6 +285,7 @@ namespace ai inline bool IsBuffFood(const ItemPrototype* proto) { if (proto->Class != ITEM_CLASS_CONSUMABLE || + proto->SubClass == ITEM_SUBCLASS_BANDAGE || proto->Spells[0].SpellCategory != SPELLCATEGORY_FOOD) return false; SpellEntry const* sp = sSpellStore.LookupEntry(proto->Spells[0].SpellId); @@ -355,4 +355,20 @@ namespace ai private: uint32 spellCategory; }; + + class FindLikeItemVisitor : public FindItemVisitor + { + public: + FindLikeItemVisitor(Item *item) : FindItemVisitor() + { + this->itemId = item->GetProto()->ItemId; + } + + virtual bool Accept(const ItemPrototype* proto) + { + return proto->ItemId == itemId; + } + private: + uint32 itemId; + }; } diff --git a/src/modules/Bots/playerbot/strategy/actions/NonCombatActions.h b/src/modules/Bots/playerbot/strategy/actions/NonCombatActions.h index 6021a8c11..0d2aecc67 100644 --- a/src/modules/Bots/playerbot/strategy/actions/NonCombatActions.h +++ b/src/modules/Bots/playerbot/strategy/actions/NonCombatActions.h @@ -61,7 +61,11 @@ namespace ai if (!buffFoods.empty() && !HasFoodBuff(bot, buffFoods)) result = UseItemAuto(*buffFoods.begin()); if (!result) - result = UseItemAction::Execute(event); + { + list foods = AI_VALUE2(list, "inventory items", "food"); + if (!foods.empty()) + result = UseItemAuto(*foods.begin()); + } if (result) ai->SetEating(); @@ -70,7 +74,11 @@ namespace ai virtual bool isPossible() { - return ai->IsEating() || UseItemAction::isPossible(); + if (ai->IsEating()) + return true; + if(AI_VALUE2(list, "inventory items", "food").empty()) + return false; + return UseItemAction::isPossible(); } virtual bool isUseful() diff --git a/src/modules/Bots/playerbot/strategy/mage/GenericMageNonCombatStrategy.cpp b/src/modules/Bots/playerbot/strategy/mage/GenericMageNonCombatStrategy.cpp index e6f71430d..aa466ff24 100644 --- a/src/modules/Bots/playerbot/strategy/mage/GenericMageNonCombatStrategy.cpp +++ b/src/modules/Bots/playerbot/strategy/mage/GenericMageNonCombatStrategy.cpp @@ -59,11 +59,11 @@ void GenericMageNonCombatStrategy::InitTriggers(std::list &trigger NULL))); triggers.push_back(new TriggerNode( - "no drink", + "no conjured drink", NextAction::array(0, new NextAction("conjure water", 16.0f), NULL))); triggers.push_back(new TriggerNode( - "no food", + "no conjured food", NextAction::array(0, new NextAction("conjure food", 15.0f), NULL))); triggers.push_back(new TriggerNode( diff --git a/src/modules/Bots/playerbot/strategy/mage/MageActions.cpp b/src/modules/Bots/playerbot/strategy/mage/MageActions.cpp index fd917d9de..f46e592c4 100644 --- a/src/modules/Bots/playerbot/strategy/mage/MageActions.cpp +++ b/src/modules/Bots/playerbot/strategy/mage/MageActions.cpp @@ -9,7 +9,7 @@ Value* CastPolymorphAction::GetTargetValue() return context->GetValue("cc target", getName()); } -static Player* FindPartyMemberWithoutSustenance(Player* bot, bool food) +static Player* FindPartyMemberWithoutSustenance(Player* bot, Item *item) { Group* group = bot->GetGroup(); if (!group) @@ -30,21 +30,17 @@ static Player* FindPartyMemberWithoutSustenance(Player* bot, bool food) { continue; } - if (!food && player->GetPowerType() != POWER_MANA) + if (bot->CanUseItem(item->GetProto()) != EQUIP_ERR_OK) { continue; } - bool hasItem; - if (food) + bool isWater = item->GetProto()->Spells[0].SpellCategory == SPELLCATEGORY_DRINK; + if (isWater && player->GetPowerType() != POWER_MANA) { - FindConjuredFoodVisitor foodVisitor(player, SPELLCATEGORY_FOOD); - hasItem = InventoryAction::FindPlayerItem(player, &foodVisitor) != NULL; - } - else - { - FindConjuredFoodVisitor drinkVisitor(player, SPELLCATEGORY_DRINK); - hasItem = InventoryAction::FindPlayerItem(player, &drinkVisitor) != NULL; + continue; } + FindLikeItemVisitor itemVisitor(item); + bool hasItem = InventoryAction::FindPlayerItem(player, &itemVisitor) != NULL; if (!hasItem) return player; } @@ -71,7 +67,7 @@ bool GiveConjuredFoodAction::Execute(Event event) } Item* food = foods.front(); - Player* target = FindPartyMemberWithoutSustenance(bot, true); + Player* target = FindPartyMemberWithoutSustenance(bot, food); if (!target) { return false; @@ -81,7 +77,7 @@ bool GiveConjuredFoodAction::Execute(Event event) uint32 count = food->GetCount(); Item* newItem = target->StoreNewItemInInventorySlot(itemId, count); - if (!newItem) + if (!newItem || target->CanUseItem(newItem->GetProto()) != EQUIP_ERR_OK) return false; bot->DestroyItem(food->GetBagSlot(), food->GetSlot(), true); @@ -117,7 +113,7 @@ bool GiveConjuredWaterAction::Execute(Event event) return false; Item* water = drinks.front(); - Player* target = FindPartyMemberWithoutSustenance(bot, false); + Player* target = FindPartyMemberWithoutSustenance(bot, water); if (!target) return false; @@ -125,7 +121,7 @@ bool GiveConjuredWaterAction::Execute(Event event) uint32 count = water->GetCount(); Item* newItem = target->StoreNewItemInInventorySlot(itemId, count); - if (!newItem) + if (!newItem || target->CanUseItem(newItem->GetProto()) != EQUIP_ERR_OK) return false; bot->DestroyItem(water->GetBagSlot(), water->GetSlot(), true); diff --git a/src/modules/Bots/playerbot/strategy/triggers/GenericTriggers.h b/src/modules/Bots/playerbot/strategy/triggers/GenericTriggers.h index 85e6cd515..793344980 100644 --- a/src/modules/Bots/playerbot/strategy/triggers/GenericTriggers.h +++ b/src/modules/Bots/playerbot/strategy/triggers/GenericTriggers.h @@ -200,12 +200,24 @@ namespace ai virtual bool IsActive() { return AI_VALUE2(list, "inventory items", "food").empty(); } }; + class NoConjuredFoodTrigger : public Trigger { + public: + NoConjuredFoodTrigger(PlayerbotAI* ai) : Trigger(ai, "no conjured food trigger") {} + virtual bool IsActive() { return AI_VALUE2(list, "inventory items", "conjured food").empty(); } + }; + class NoDrinkTrigger : public Trigger { public: NoDrinkTrigger(PlayerbotAI* ai) : Trigger(ai, "no drink trigger") {} virtual bool IsActive() { return AI_VALUE2(list, "inventory items", "drink").empty(); } }; + class NoConjuredDrinkTrigger : public Trigger { + public: + NoConjuredDrinkTrigger(PlayerbotAI* ai) : Trigger(ai, "no conjured drink trigger") {} + virtual bool IsActive() { return AI_VALUE2(list, "inventory items", "conjured drink").empty(); } + }; + class LightAoeTrigger : public AoeTrigger { public: diff --git a/src/modules/Bots/playerbot/strategy/triggers/TriggerContext.h b/src/modules/Bots/playerbot/strategy/triggers/TriggerContext.h index 7da6ba0d6..69e31b3ad 100644 --- a/src/modules/Bots/playerbot/strategy/triggers/TriggerContext.h +++ b/src/modules/Bots/playerbot/strategy/triggers/TriggerContext.h @@ -76,7 +76,9 @@ namespace ai creators["no possible targets"] = &TriggerContext::no_possible_targets; creators["no drink"] = &TriggerContext::no_drink; + creators["no conjured drink"] = &TriggerContext::no_conjured_drink; creators["no food"] = &TriggerContext::no_food; + creators["no conjured food"] = &TriggerContext::no_conjured_food; creators["panic"] = &TriggerContext::panic; creators["behind target"] = &TriggerContext::behind_target; @@ -110,7 +112,9 @@ namespace ai static Trigger* not_facing_target(PlayerbotAI* ai) { return new IsNotFacingTargetTrigger(ai); } static Trigger* panic(PlayerbotAI* ai) { return new PanicTrigger(ai); } static Trigger* no_drink(PlayerbotAI* ai) { return new NoDrinkTrigger(ai); } + static Trigger* no_conjured_drink(PlayerbotAI* ai) { return new NoConjuredDrinkTrigger(ai); } static Trigger* no_food(PlayerbotAI* ai) { return new NoFoodTrigger(ai); } + static Trigger* no_conjured_food(PlayerbotAI* ai) { return new NoConjuredFoodTrigger(ai); } static Trigger* LightAoe(PlayerbotAI* ai) { return new LightAoeTrigger(ai); } static Trigger* MediumAoe(PlayerbotAI* ai) { return new MediumAoeTrigger(ai); } static Trigger* HighAoe(PlayerbotAI* ai) { return new HighAoeTrigger(ai); }