Bot should be more consistent at doing quest +several fixes

This commit is contained in:
Atidot3
2024-07-30 14:45:52 +02:00
parent 30a25ba13f
commit 0008d84f71
34 changed files with 986 additions and 609 deletions

View File

@@ -11,6 +11,9 @@
#include "GuildCreateActions.h"
#include "PossibleRpgTargetsValue.h"
#include "Playerbots.h"
#include "RpgSubActions.h"
#include "Util.h"
#include "ServerFacade.h"
#include <random>
@@ -50,42 +53,77 @@ float ChooseRpgTargetAction::getMaxRelevance(GuidPosition guidP)
GuidPosition currentRpgTarget = AI_VALUE(GuidPosition, "rpg target");
SET_AI_VALUE(GuidPosition, "rpg target", guidP);
Strategy* rpgStrategy = botAI->GetAiObjectContext()->GetStrategy("rpg");
Strategy* rpgStrategy;
std::vector<TriggerNode*> triggerNodes;
rpgStrategy->InitTriggers(triggerNodes);
float maxRelevance = 0.0f;
for (auto& triggerNode : triggerNodes)
for (auto& strategy : botAI->GetAiObjectContext()->GetSupportedStrategies())
{
Trigger* trigger = context->GetTrigger(triggerNode->getName());
if (trigger)
if (strategy.find("rpg") == std::string::npos)
continue;
if (!botAI->HasStrategy(strategy, BotState::BOT_STATE_NON_COMBAT))
continue;
rpgStrategy = botAI->GetAiObjectContext()->GetStrategy(strategy);
rpgStrategy->InitTriggers(triggerNodes);
for (auto triggerNode : triggerNodes)
{
triggerNode->setTrigger(trigger);
Trigger* trigger = context->GetTrigger(triggerNode->getName());
if (triggerNode->getFirstRelevance() < maxRelevance || triggerNode->getFirstRelevance() > 2.0f)
continue;
if (trigger)
{
triggerNode->setTrigger(trigger);
trigger = triggerNode->getTrigger();
if (!trigger->IsActive())
continue;
if (triggerNode->getFirstRelevance() < maxRelevance || triggerNode->getFirstRelevance() > 2.0f)
continue;
maxRelevance = triggerNode->getFirstRelevance();
Trigger* trigger = triggerNode->getTrigger();
if (!trigger->IsActive())
continue;
NextAction** nextActions = triggerNode->getHandlers();
bool isRpg = false;
for (int32 i = 0; i < NextAction::size(nextActions); i++)
{
NextAction* nextAction = nextActions[i];
Action* action = botAI->GetAiObjectContext()->GetAction(nextAction->getName());
if (dynamic_cast<RpgEnabled*>(action))
isRpg = true;
}
NextAction::destroy(nextActions);
if (isRpg)
{
maxRelevance = triggerNode->getFirstRelevance();
rgpActionReason[guidP] = triggerNode->getName();
}
}
}
for (auto trigger : triggerNodes)
{
delete trigger;
}
triggerNodes.clear();
}
SET_AI_VALUE(GuidPosition, "rpg target", currentRpgTarget);
for (std::vector<TriggerNode*>::iterator i = triggerNodes.begin(); i != triggerNodes.end(); i++)
{
TriggerNode* trigger = *i;
delete trigger;
}
if (!maxRelevance)
return 0.0;
triggerNodes.clear();
return (maxRelevance - 1.0) * 1000.0f;
return floor((maxRelevance - 1.0) * 1000.0f);
}
bool ChooseRpgTargetAction::Execute(Event event)
@@ -117,7 +155,7 @@ bool ChooseRpgTargetAction::Execute(Event event)
if (urand(0, 9))
{
for (auto target : ignoreList)
for (auto target : ignoreList)
targets.erase(target);
}
@@ -188,7 +226,7 @@ bool ChooseRpgTargetAction::Execute(Event event)
if (targets.empty())
{
LOG_DEBUG("playerbots", "{} can't choose RPG target: all {} are not available", bot->GetName().c_str(), possibleTargets.size());
LOG_DEBUG("playerbots", "{} can't choose RPG target: all {} targets are not available", bot->GetName().c_str(), possibleTargets.size());
RESET_AI_VALUE(GuidSet&, "ignore rpg target");
RESET_AI_VALUE(GuidPosition, "rpg target");
return false;
@@ -241,17 +279,20 @@ bool ChooseRpgTargetAction::isUseful()
if (!botAI->AllowActivity(RPG_ACTIVITY))
return false;
if (AI_VALUE(GuidPosition, "rpg target"))
GuidPosition guidP = AI_VALUE(GuidPosition, "rpg target");
if (guidP && guidP.distance(bot) < sPlayerbotAIConfig->reactDistance * 2)
return false;
TravelTarget* travelTarget = AI_VALUE(TravelTarget*, "travel target");
if (travelTarget->isTraveling() && isFollowValid(bot, *travelTarget->getPosition()))
return false;
//if (travelTarget->isTraveling() && AI_VALUE2(bool, "can free move to", *travelTarget->getPosition()))
//return false;
if (AI_VALUE(GuidVector, "possible rpg targets").empty())
return false;
//Not stay, not guard, not combat, not trading and group ready.
if (!AI_VALUE(bool, "can move around"))
return false;
@@ -310,7 +351,7 @@ bool ChooseRpgTargetAction::isFollowValid(Player* bot, WorldPosition pos)
return true;
if (distance < formation->GetMaxDistance())
return true;
return true;
return false;
}