From ef6706fb7d765fa57ae365cfb150bb7a17402275 Mon Sep 17 00:00:00 2001 From: bo Date: Fri, 20 Mar 2026 00:12:14 -0500 Subject: [PATCH] Bot: face target after random movement, disallow random movement in group --- .../strategy/actions/MovementActions.cpp | 20 ++++++++++++++++++- .../strategy/actions/MovementActions.h | 8 ++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/modules/Bots/playerbot/strategy/actions/MovementActions.cpp b/src/modules/Bots/playerbot/strategy/actions/MovementActions.cpp index 3160ad363..071119421 100644 --- a/src/modules/Bots/playerbot/strategy/actions/MovementActions.cpp +++ b/src/modules/Bots/playerbot/strategy/actions/MovementActions.cpp @@ -273,6 +273,7 @@ bool MovementAction::FollowOnTransport(Unit* target, Player* master) AI_VALUE(LastMovement&, "last movement").Set(target); return true; } + return false; } bool MovementAction::FollowOffTransport(Unit* target, Player* master) @@ -527,6 +528,16 @@ bool RunAwayAction::Execute(Event event) bool MoveRandomAction::Execute(Event event) { + if (m_hasFaceTarget) + { + if (bot->IsStopped()) + { + m_hasFaceTarget = false; + bot->SetFacingTo(bot->GetAngle(m_faceX, m_faceY)); + } + return true; + } + WorldObject* target = NULL; if (!(rand() % 3)) @@ -561,7 +572,14 @@ bool MoveRandomAction::Execute(Event event) if (target) { - return MoveNear(target); + bool moved = MoveNear(target); + if (moved) + { + m_faceX = target->GetPositionX(); + m_faceY = target->GetPositionY(); + m_hasFaceTarget = true; + } + return moved; } for (int i = 0; i < 10; ++i) diff --git a/src/modules/Bots/playerbot/strategy/actions/MovementActions.h b/src/modules/Bots/playerbot/strategy/actions/MovementActions.h index 8f8401ad6..bf11669d5 100644 --- a/src/modules/Bots/playerbot/strategy/actions/MovementActions.h +++ b/src/modules/Bots/playerbot/strategy/actions/MovementActions.h @@ -62,14 +62,18 @@ namespace ai class MoveRandomAction : public MovementAction { public: - MoveRandomAction(PlayerbotAI* ai) : MovementAction(ai, "move random") {} + MoveRandomAction(PlayerbotAI* ai) : MovementAction(ai, "move random"), m_hasFaceTarget(false), m_faceX(0.0f), m_faceY(0.0f) {} virtual bool Execute(Event event); virtual bool isPossible() { - return MovementAction::isPossible() && + return !bot->GetGroup() && + MovementAction::isPossible() && AI_VALUE2(uint8, "health", "self target") > sPlayerbotAIConfig.mediumHealth && (!AI_VALUE2(uint8, "mana", "self target") || AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig.mediumMana); } + private: + bool m_hasFaceTarget; + float m_faceX, m_faceY; }; class MoveToLootAction : public MovementAction