BG BotFill : capture des bannieres d Arathi reparee

- GetNearGameObjectFlag reecrit : l ancienne detection par objet d aura
  (indices approximatifs, rayon 6 m) faisait cliquer les bots sur une
  banniere a 30 m -> sort d ouverture hors portee, zero capture.
  Renvoie desormais la banniere cliquable la plus proche (etat reel du
  noeud) dans un rayon de 30 m.
- TryOccupiedABNode : le bot marche jusqu a la banniere (< 8 m) avant de
  lancer le sort, et s arrete pour canaliser l ouverture.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-12 12:26:01 +02:00
parent 4792617e3e
commit a7b1fa7843
2 changed files with 36 additions and 36 deletions
@@ -314,11 +314,22 @@ void CommandAB::TryOccupiedABNode(ObjectGuid guid)
GameObject const* pFlag = pBattlegroundAB->GetNearGameObjectFlag(player); GameObject const* pFlag = pBattlegroundAB->GetNearGameObjectFlag(player);
if (!pFlag) if (!pFlag)
return; return;
// SylvaniaCore (module BG BotFill): hors de portee d interaction -> on marche vers la
// banniere (ordre prioritaire type drapeau) au lieu de lancer un sort qui echouera
float flagDist = player->GetDistance(pFlag);
if (flagDist > 8.0f)
{
pBotAI->GetAIMovement()->AcceptCommand(pFlag->GetGUID(), true);
return;
}
TC_LOG_ERROR("server.worldserver", "BGF-DBG: TryOccupiedABNode %s clique la banniere %u (dist %.1f)",
player->GetName().c_str(), pFlag->GetEntry(), flagDist);
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(21651); SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(21651);
if (!spellInfo) if (!spellInfo)
return; return;
pBotAI->Dismount(); pBotAI->Dismount();
player->StopMoving();
SpellCastTargets targets; SpellCastTargets targets;
targets.SetTargetMask(TARGET_FLAG_GAMEOBJECT); targets.SetTargetMask(TARGET_FLAG_GAMEOBJECT);
targets.SetGOTarget((GameObject*)pFlag); targets.SetGOTarget((GameObject*)pFlag);
@@ -715,49 +715,38 @@ Creature const* BattlegroundAB::GetClosestGraveCreature(const Player* player)
GameObject const* BattlegroundAB::GetNearGameObjectFlag(const Player* player) GameObject const* BattlegroundAB::GetNearGameObjectFlag(const Player* player)
{ {
// SylvaniaCore (module BG BotFill): reecriture. L ancienne version reperait le noeud via
// un objet d aura avec des indices approximatifs et un rayon de 6 m : les bots cliquaient
// une banniere a 30 m (sort d ouverture hors portee, aucune capture possible).
// On renvoie la banniere cliquable (etat courant du noeud) la plus proche dans 30 m ;
// l IA rapproche le bot avant de lancer le sort.
if (!player) if (!player)
return NULL; return NULL;
uint8 node = BG_AB_NODE_STABLES;
GameObject* nearObject = GetBgMap()->GetGameObject(BgObjects[node * 8 + 7]);
while ((node < BG_AB_DYNAMIC_NODES_COUNT) && ((!nearObject) || (!player->IsWithinDistInMap(nearObject, 6))))
{
++node;
nearObject = GetBgMap()->GetGameObject(BgObjects[node * 8 + BG_AB_OBJECT_SPEEDBUFF_STABLES]);
}
if (node == BG_AB_DYNAMIC_NODES_COUNT)
return NULL;
TeamId teamIndex = GetTeamIndexByTeamId(player->GetTeam()); TeamId teamIndex = GetTeamIndexByTeamId(player->GetTeam());
if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node] % 2)) GameObject* best = NULL;
return NULL; float bestDist = 30.0f;
if (m_Nodes[node] == BG_AB_NODE_TYPE_NEUTRAL) for (uint8 node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node)
{ {
ObjectGuid nearFlagGuid = BgObjects[node * 8 + BG_AB_NODE_TYPE_NEUTRAL]; uint8 status = m_Nodes[node];
GameObject* nearFlag = GetBgMap()->GetGameObject(nearFlagGuid); // cliquable si neutre, ou tenu/conteste par l equipe adverse
if (nearFlag && nearFlag->isSpawned()) if (!(status == 0 || teamIndex == status % 2))
return nearFlag; continue;
return NULL; // BgObjects[node*8 + status] = banniere affichee pour cet etat (0=neutre,
// 1/2=contestee A/H, 3/4=occupee A/H)
GameObject* flag = GetBgMap()->GetGameObject(BgObjects[node * 8 + status]);
if (!flag || !flag->isSpawned())
continue;
float dist = player->GetDistance(flag);
if (dist < bestDist)
{
bestDist = dist;
best = flag;
}
} }
else if ((m_Nodes[node] == BG_AB_NODE_STATUS_ALLY_CONTESTED) || return best;
(m_Nodes[node] == BG_AB_NODE_STATUS_HORDE_CONTESTED))
{
ObjectGuid nearFlagGuid = BgObjects[node * 8 + BG_AB_NODE_TYPE_CONTESTED + !teamIndex];
GameObject* nearFlag = GetBgMap()->GetGameObject(nearFlagGuid);
if (nearFlag && nearFlag->isSpawned())
return nearFlag;
return NULL;
}
else
{
ObjectGuid nearFlagGuid = BgObjects[node * 8 + BG_AB_NODE_TYPE_OCCUPIED + !teamIndex];
GameObject* nearFlag = GetBgMap()->GetGameObject(nearFlagGuid);
if (nearFlag && nearFlag->isSpawned())
return nearFlag;
return NULL;
}
return NULL;
} }
uint8 BattlegroundAB::GetABNodeState(uint32 abNode) uint8 BattlegroundAB::GetABNodeState(uint32 abNode)
{ {
if (abNode >= BG_AB_BattlegroundNodes::BG_AB_DYNAMIC_NODES_COUNT) if (abNode >= BG_AB_BattlegroundNodes::BG_AB_DYNAMIC_NODES_COUNT)