move random for rpg strategy

This commit is contained in:
Yunfan Li
2023-10-26 21:05:23 +08:00
parent 0a0ad09125
commit 83e62b4cd3
2 changed files with 24 additions and 6 deletions

View File

@@ -9,6 +9,7 @@
#include "ObjectGuid.h" #include "ObjectGuid.h"
#include "PathGenerator.h" #include "PathGenerator.h"
#include "PlayerbotAIConfig.h" #include "PlayerbotAIConfig.h"
#include "Random.h"
#include "SharedDefines.h" #include "SharedDefines.h"
#include "TargetedMovementGenerator.h" #include "TargetedMovementGenerator.h"
#include "Event.h" #include "Event.h"
@@ -1257,11 +1258,27 @@ bool MovementAction::MoveAway(Unit* target)
if (!target) { if (!target) {
return false; return false;
} }
float angle = target->GetAngle(bot); float init_angle = target->GetAngle(bot);
float dx = bot->GetPositionX() + cos(angle) * sPlayerbotAIConfig->fleeDistance; for (float delta = 0; delta <= M_PI / 2; delta += M_PI / 8) {
float dy = bot->GetPositionY() + sin(angle) * sPlayerbotAIConfig->fleeDistance; float angle = init_angle + delta;
float dz = bot->GetPositionZ(); float dx = bot->GetPositionX() + cos(angle) * sPlayerbotAIConfig->fleeDistance;
return MoveTo(target->GetMapId(), dx, dy, dz, false, false, true); float dy = bot->GetPositionY() + sin(angle) * sPlayerbotAIConfig->fleeDistance;
float dz = bot->GetPositionZ();
if (MoveTo(target->GetMapId(), dx, dy, dz, false, false, true)) {
return true;
}
if (delta == 0) {
continue;
}
angle = init_angle - delta;
dx = bot->GetPositionX() + cos(angle) * sPlayerbotAIConfig->fleeDistance;
dy = bot->GetPositionY() + sin(angle) * sPlayerbotAIConfig->fleeDistance;
dz = bot->GetPositionZ();
if (MoveTo(target->GetMapId(), dx, dy, dz, false, false, true)) {
return true;
}
}
return false;
} }
bool MovementAction::MoveInside(uint32 mapId, float x, float y, float z, float distance) bool MovementAction::MoveInside(uint32 mapId, float x, float y, float z, float distance)
@@ -1463,7 +1480,7 @@ bool MoveRandomAction::Execute(Event event)
if (map->IsInWater(bot->GetPhaseMask(), x, y, z, bot->GetCollisionHeight())) if (map->IsInWater(bot->GetPhaseMask(), x, y, z, bot->GetCollisionHeight()))
continue; continue;
bool moved = MoveTo(bot->GetMapId(), x, y, z); bool moved = MoveTo(bot->GetMapId(), x, y, z, false, false, true);
if (moved) if (moved)
return true; return true;
} }

View File

@@ -32,6 +32,7 @@ NextAction** RpgStrategy::getDefaultActions()
void RpgStrategy::InitTriggers(std::vector<TriggerNode*>& triggers) void RpgStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{ {
triggers.push_back(new TriggerNode("no rpg target", NextAction::array(0, new NextAction("choose rpg target", 5.0f), nullptr))); triggers.push_back(new TriggerNode("no rpg target", NextAction::array(0, new NextAction("choose rpg target", 5.0f), nullptr)));
triggers.push_back(new TriggerNode("no rpg target", NextAction::array(0, new NextAction("move random", 1.10f), NULL)));
triggers.push_back(new TriggerNode("far from rpg target", NextAction::array(0, new NextAction("move to rpg target", 5.0f), nullptr))); triggers.push_back(new TriggerNode("far from rpg target", NextAction::array(0, new NextAction("move to rpg target", 5.0f), nullptr)));
//Sub actions //Sub actions