Merge pull request #842 from liyunfan1223/lfg_leave_group

Fix LFG leave group and several minor issues
This commit is contained in:
Yunfan Li
2025-01-04 16:12:12 +08:00
committed by GitHub
6 changed files with 32 additions and 30 deletions

View File

@@ -392,7 +392,7 @@ void PlayerbotAI::UpdateAI(uint32 elapsed, bool minimal)
} }
} }
if (!bot->InBattleground() && !bot->inRandomLfgDungeon() && bot->GetGroup()) if (!bot->InBattleground() && !bot->inRandomLfgDungeon() && bot->GetGroup() && !bot->GetGroup()->isLFGGroup())
{ {
Player* leader = bot->GetGroup()->GetLeader(); Player* leader = bot->GetGroup()->GetLeader();
if (leader && leader != bot) // Checks if the leader is valid and is not the bot itself if (leader && leader != bot) // Checks if the leader is valid and is not the bot itself
@@ -1312,11 +1312,9 @@ void PlayerbotAI::DoNextAction(bool min)
// if in combat but stick with old data - clear targets // if in combat but stick with old data - clear targets
if (currentEngine == engines[BOT_STATE_NON_COMBAT] && bot->IsInCombat()) if (currentEngine == engines[BOT_STATE_NON_COMBAT] && bot->IsInCombat())
{ {
if (aiObjectContext->GetValue<Unit*>("current target")->Get() != nullptr || if (aiObjectContext->GetValue<Unit*>("current target")->Get() != nullptr)
aiObjectContext->GetValue<ObjectGuid>("pull target")->Get() != ObjectGuid::Empty ||
aiObjectContext->GetValue<Unit*>("dps target")->Get() != nullptr)
{ {
Reset(); aiObjectContext->GetValue<Unit*>("current target")->Set(nullptr);
} }
} }

View File

@@ -8,6 +8,7 @@
#include "ChooseRpgTargetAction.h" #include "ChooseRpgTargetAction.h"
#include "Event.h" #include "Event.h"
#include "LootObjectStack.h" #include "LootObjectStack.h"
#include "NewRpgStrategy.h"
#include "Playerbots.h" #include "Playerbots.h"
#include "PossibleRpgTargetsValue.h" #include "PossibleRpgTargetsValue.h"
#include "PvpTriggers.h" #include "PvpTriggers.h"
@@ -35,19 +36,26 @@ bool AttackAnythingAction::isUseful()
if (!AI_VALUE(bool, "can move around")) if (!AI_VALUE(bool, "can move around"))
return false; return false;
if (context->GetValue<TravelTarget*>("travel target")->Get()->isTraveling() &&
ChooseRpgTargetAction::isFollowValid( // if (context->GetValue<TravelTarget*>("travel target")->Get()->isTraveling() &&
bot, *context->GetValue<TravelTarget*>("travel target")->Get()->getPosition())) // Bot is traveling // ChooseRpgTargetAction::isFollowValid(
return false; // bot, *context->GetValue<TravelTarget*>("travel target")->Get()->getPosition())) // Bot is traveling
// if (bot->IsInCombat()) {
// return false; // return false;
// }
Unit* target = GetTarget(); Unit* target = GetTarget();
if (!target) if (!target)
return false; return false;
bool inactiveGrindStatus = botAI->rpgInfo.status == NewRpgStatus::GO_GRIND ||
botAI->rpgInfo.status == NewRpgStatus::NEAR_NPC ||
botAI->rpgInfo.status == NewRpgStatus::REST ||
botAI->rpgInfo.status == NewRpgStatus::GO_INNKEEPER;
if (inactiveGrindStatus && bot->GetDistance(target) > 25.0f)
return false;
std::string const name = std::string(target->GetName()); std::string const name = std::string(target->GetName());
// Check for invalid targets: Dummy, Charge Target, Melee Target, Ranged Target // Check for invalid targets: Dummy, Charge Target, Melee Target, Ranged Target
if (!name.empty() && if (!name.empty() &&
@@ -59,10 +67,6 @@ bool AttackAnythingAction::isUseful()
return false; // Target is one of the disallowed types return false; // Target is one of the disallowed types
} }
// if (!ChooseRpgTargetAction::isFollowValid(bot, target)) //Do not grind mobs far
// away from master.
// return false;
return true; return true;
} }

View File

@@ -236,11 +236,11 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
if (bot->IsSitState()) if (bot->IsSitState())
bot->SetStandState(UNIT_STAND_STATE_STAND); bot->SetStandState(UNIT_STAND_STATE_STAND);
if (bot->IsNonMeleeSpellCast(true)) // if (bot->IsNonMeleeSpellCast(true))
{ // {
bot->CastStop(); // bot->CastStop();
botAI->InterruptSpell(); // botAI->InterruptSpell();
} // }
MotionMaster& mm = *bot->GetMotionMaster(); MotionMaster& mm = *bot->GetMotionMaster();
mm.Clear(); mm.Clear();
if (!backwards) if (!backwards)
@@ -277,11 +277,11 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
if (bot->IsSitState()) if (bot->IsSitState())
bot->SetStandState(UNIT_STAND_STATE_STAND); bot->SetStandState(UNIT_STAND_STATE_STAND);
if (bot->IsNonMeleeSpellCast(true)) // if (bot->IsNonMeleeSpellCast(true))
{ // {
bot->CastStop(); // bot->CastStop();
botAI->InterruptSpell(); // botAI->InterruptSpell();
} // }
MotionMaster& mm = *bot->GetMotionMaster(); MotionMaster& mm = *bot->GetMotionMaster();
G3D::Vector3 endP = path.back(); G3D::Vector3 endP = path.back();
mm.Clear(); mm.Clear();

View File

@@ -44,7 +44,7 @@ bool NewRpgStatusUpdateAction::Execute(Event event)
} }
} }
// IDLE -> GO_INNKEEPER // IDLE -> GO_INNKEEPER
else if (bot->GetLevel() >= 6 && roll <= 45) else if (roll <= 45)
{ {
WorldPosition pos = SelectRandomInnKeeperPos(); WorldPosition pos = SelectRandomInnKeeperPos();
if (pos != WorldPosition() && bot->GetExactDist(pos) > 50.0f) if (pos != WorldPosition() && bot->GetExactDist(pos) > 50.0f)
@@ -245,7 +245,7 @@ bool NewRpgGoFarAwayPosAction::MoveFarTo(WorldPosition dest)
while (--attempt) while (--attempt)
{ {
float angle = bot->GetAngle(&dest); float angle = bot->GetAngle(&dest);
float delta = (rand_norm() - 0.5) * M_PI * 2; float delta = urand(1, 100) <= 75 ? (rand_norm() - 0.5) * M_PI * 0.5 : (rand_norm() - 0.5) * M_PI * 2;
angle += delta; angle += delta;
float dis = rand_norm() * pathFinderDis; float dis = rand_norm() * pathFinderDis;
float dx = x + cos(angle) * dis; float dx = x + cos(angle) * dis;

View File

@@ -23,7 +23,7 @@ public:
protected: protected:
// const int32 setGrindInterval = 5 * 60 * 1000; // const int32 setGrindInterval = 5 * 60 * 1000;
// const int32 setNpcInterval = 1 * 60 * 1000; // const int32 setNpcInterval = 1 * 60 * 1000;
const int32 statusNearNpcDuration = 2 * 60 * 1000; const int32 statusNearNpcDuration = 5 * 60 * 1000;
const int32 statusNearRandomDuration = 2 * 60 * 1000; const int32 statusNearRandomDuration = 2 * 60 * 1000;
const int32 statusRestDuration = 30 * 1000; const int32 statusRestDuration = 30 * 1000;
WorldPosition SelectRandomGrindPos(); WorldPosition SelectRandomGrindPos();

View File

@@ -10,7 +10,7 @@
bool CastTotemAction::isUseful() bool CastTotemAction::isUseful()
{ {
if (needLifeTime > 0.1f) if (needLifeTime > 0.1f && AI_VALUE(uint8, "attacker count") < 3)
{ {
Unit* target = AI_VALUE(Unit*, "current target"); Unit* target = AI_VALUE(Unit*, "current target");
if (!target) if (!target)