Skip to content

Commit

Permalink
-Travel improvement: When bots see a quest they can hand in nearby th…
Browse files Browse the repository at this point in the history
…ey will now sometimes stop mid-travel so they can hand in the quest.
  • Loading branch information
mostlikely4r committed Oct 11, 2024
1 parent 37e42fc commit fc832a8
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 4 deletions.
2 changes: 1 addition & 1 deletion playerbot/strategy/actions/ChooseTravelTargetAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1172,7 +1172,7 @@ bool ChooseTravelTargetAction::isUseful()
return false;
}

return !context->GetValue<TravelTarget *>("travel target")->Get()->isActive();
return true;
}


Expand Down
5 changes: 4 additions & 1 deletion playerbot/strategy/generic/TravelStrategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ NextAction** TravelStrategy::GetDefaultNonCombatActions()
void TravelStrategy::InitNonCombatTriggers(std::list<TriggerNode*> &triggers)
{
triggers.push_back(new TriggerNode(
//"random",
"no travel target",
NextAction::array(0, new NextAction("choose travel target", 6.0f), NULL)));

triggers.push_back(new TriggerNode(
"has nearby quest taker",
NextAction::array(0, new NextAction("choose travel target", 6.0f), NULL)));

triggers.push_back(new TriggerNode(
"far from travel target",
NextAction::array(0, new NextAction("check mount state", 1), new NextAction("move to travel target", 1), NULL)));
Expand Down
17 changes: 15 additions & 2 deletions playerbot/strategy/triggers/TravelTriggers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,25 @@ using namespace ai;

bool NoTravelTargetTrigger::IsActive()
{
return !context->GetValue<TravelTarget *>("travel target")->Get()->isActive();
return !AI_VALUE(TravelTarget *,"travel target")->isActive();
}

bool FarFromTravelTargetTrigger::IsActive()
{
return context->GetValue<TravelTarget*>("travel target")->Get()->isTraveling();
return AI_VALUE(TravelTarget*, "travel target")->isTraveling();
}


bool HasNearbyQuestTakerTrigger::IsActive()
{
TravelTarget* target = AI_VALUE(TravelTarget*, "travel target");
if (target->isWorking()) //We are not currently working on a target.
return false;

if (target->getExpiredTime() < 2 * MINUTE) //The target was set more than 2 minutes ago.
return false;

return AI_VALUE(bool, "has nearby quest taker");
}

bool NearDarkPortalTrigger::IsActive()
Expand Down
8 changes: 8 additions & 0 deletions playerbot/strategy/triggers/TravelTriggers.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ namespace ai
virtual bool IsActive();
};

class HasNearbyQuestTakerTrigger : public Trigger
{
public:
HasNearbyQuestTakerTrigger(PlayerbotAI* ai) : Trigger(ai, "has nearby quest taker", 30) {}

virtual bool IsActive();
};

class NearDarkPortalTrigger : public Trigger
{
public:
Expand Down
37 changes: 37 additions & 0 deletions playerbot/strategy/values/QuestValues.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "playerbot/playerbot.h"
#include "QuestValues.h"
#include "SharedValueContext.h"
#include "playerbot/TravelMgr.h"

using namespace ai;

Expand Down Expand Up @@ -48,6 +49,13 @@ entryQuestRelationMap EntryQuestRelationMapValue::Calculate()
for (auto& entry : GAI_VALUE2(std::list<int32>, "item drop list", quest->ReqItemId[objective]))
rMap[entry][questId] |= relationFlag;
}

//Buy from vendor objective
if (quest->ReqItemId[objective])
{
for (auto& entry : GAI_VALUE2(std::list<int32>, "item vendor list", quest->ReqItemId[objective]))
rMap[entry][questId] |= relationFlag;
}
}

//Target entry of source item of quest.
Expand Down Expand Up @@ -556,5 +564,34 @@ bool CanUseItemOn::Calculate()
}
}

return false;
};

bool HasNearbyQuestTakerValue::Calculate()
{
std::list<ObjectGuid> possibleTargets = AI_VALUE(std::list<ObjectGuid>, "possible rpg targets");

int32 travelEntry = AI_VALUE(TravelTarget*, "travel target")->getEntry();

for (auto& target : possibleTargets)
{
if (target.GetEntry() == travelEntry)
continue;

if(AI_VALUE2(bool, "can turn in quest npc", target.GetEntry()))
return true;
}

std::list<ObjectGuid> possibleObjects = bot->GetMap()->IsDungeon() ? AI_VALUE(std::list<ObjectGuid>, "nearest game objects") : AI_VALUE(std::list<ObjectGuid>, "nearest game objects no los");

for (auto& target : possibleObjects)
{
if (target.GetEntry() == (travelEntry * -1))
continue;

if (AI_VALUE2(bool, "can turn in quest npc", target.GetEntry()))
return true;
}

return false;
};
8 changes: 8 additions & 0 deletions playerbot/strategy/values/QuestValues.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,4 +233,12 @@ namespace ai
ManualSetValue<uint8>(ai, static_cast<uint8>(QuestRewardOptionType::QUEST_REWARD_CONFIG_DRIVEN), "quest reward"),
Qualified() {}
};

class HasNearbyQuestTakerValue : public BoolCalculatedValue
{
public:
HasNearbyQuestTakerValue(PlayerbotAI* ai) : BoolCalculatedValue(ai, "has nearby quest taker", 30) {}

virtual bool Calculate() override;
};
}
1 change: 1 addition & 0 deletions playerbot/strategy/values/ValueContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ namespace ai
creators["need quest objective"] = [](PlayerbotAI* ai) { return new NeedQuestObjectiveValue(ai); };
creators["can use item on"] = [](PlayerbotAI* ai) { return new CanUseItemOn(ai); };
creators["quest reward"] = [](PlayerbotAI* ai) { return new QuestRewardValue(ai); };
creators["has nearby quest taker"] = [](PlayerbotAI* ai) { return new HasNearbyQuestTakerValue(ai); };

creators["money needed for"] = [](PlayerbotAI* ai) { return new MoneyNeededForValue(ai); };
creators["total money needed for"] = [](PlayerbotAI* ai) { return new TotalMoneyNeededForValue(ai); };
Expand Down

0 comments on commit fc832a8

Please sign in to comment.