BG BotFill : vague de sortie de cimetiere apres resurrection

Doctrine PvP : repartir seul de son cimetiere revient a nourrir l adversaire
un par un. Les bots ressuscites repartaient isolement et se faisaient cueillir
en chemin. Un bot patiente desormais au cimetiere jusqu a ce que trois allies
soient a portee, au maximum huit secondes. Il repart immediatement s il est
attaque, si un ennemi pousse jusqu au cimetiere, ou s il porte un drapeau.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-18 09:59:50 +02:00
parent 537e6df7cd
commit 1e1a7d8957
2 changed files with 64 additions and 0 deletions
+60
View File
@@ -351,8 +351,66 @@ bool BotBGAI::InBattleground()
return true;
}
// SylvaniaCore (module BG BotFill): apres une resurrection, le bot patiente au cimetiere
// le temps qu une vague se forme (doctrine PvP : repartir en goutte-a-goutte revient a
// nourrir l adversaire). Il repart des que trois allies sont a portee, ou au bout de
// huit secondes, et immediatement si un ennemi vient jusqu au cimetiere.
bool BotBGAI::WaitRegroupAfterRevive()
{
if (!m_DeathTick)
return false;
if (me->InArena())
{
m_DeathTick = 0;
return false;
}
// porteur de drapeau ou bot en peril : aucune attente
if (me->IsInCombat() || (me->IsPlayer() && TargetIsFlagCarrier(me->ToPlayer())))
{
m_DeathTick = 0;
return false;
}
if (!m_ReviveTick)
m_ReviveTick = getMSTime();
if (GetMSTimeDiffToNow(m_ReviveTick) >= 8000)
{
m_DeathTick = 0;
m_ReviveTick = 0;
return false;
}
uint32 nearAllies = 0;
NearPlayerList playersNearby;
QueryNearPlayerList(30.0f, playersNearby);
for (Player* pVisionPlayer : playersNearby)
{
if (!pVisionPlayer || pVisionPlayer == me || !pVisionPlayer->IsAlive())
continue;
if (pVisionPlayer->GetTeamId() == me->GetTeamId())
++nearAllies;
else
{
// un ennemi pousse jusqu au cimetiere : on ne reste pas passif
m_DeathTick = 0;
m_ReviveTick = 0;
return false;
}
}
if (nearAllies >= 3)
{
m_DeathTick = 0;
m_ReviveTick = 0;
return false;
}
m_Movement->ClearMovement();
return true;
}
void BotBGAI::BattlegroundRevive()
{
// SylvaniaCore (module BG BotFill): on note l instant de la mort pour imposer un
// temps de regroupement au cimetiere (cf. WaitRegroupAfterRevive).
if (!m_DeathTick)
m_DeathTick = getMSTime();
if (me->InArena())
return;
if (!me->IsPlayerBot() || !me->InBattleground())
@@ -499,6 +557,8 @@ void BotBGAI::UpdateAI(uint32 diff)
packet.SpellID = BattlegroundSpells::SPELL_WAITING_FOR_RESURRECT;
me->GetSession()->HandleCancelAuraOpcode(packet);
}
if (WaitRegroupAfterRevive())
return;
if (m_Teleporting.CanMovement())
UpdateBotAI(BOTAI_UPDATE_TICK);
else
+4
View File
@@ -117,6 +117,10 @@ protected:
uint32 FindPetMaxRankSpellByExist(uint32 spellID);
bool InBattleground();
void BattlegroundRevive();
// SylvaniaCore (module BG BotFill): vague de sortie de cimetiere
bool WaitRegroupAfterRevive();
uint32 m_DeathTick = 0;
uint32 m_ReviveTick = 0;
void ProcessHealth();
void ProcessCombat(Unit* pTarget);
void ChaseTarget(Unit* pTarget, bool isMelee, float range = 5.0f);