From 1e1a7d89574348e73e93a68ffabe85e5d5c632b0 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Tue, 18 Aug 2026 09:59:50 +0200 Subject: [PATCH] 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 --- src/server/game/AI/PlayerAI/BotAI.cpp | 60 +++++++++++++++++++++++++++ src/server/game/AI/PlayerAI/BotAI.h | 4 ++ 2 files changed, 64 insertions(+) diff --git a/src/server/game/AI/PlayerAI/BotAI.cpp b/src/server/game/AI/PlayerAI/BotAI.cpp index 81edd49..5f7e2aa 100644 --- a/src/server/game/AI/PlayerAI/BotAI.cpp +++ b/src/server/game/AI/PlayerAI/BotAI.cpp @@ -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 diff --git a/src/server/game/AI/PlayerAI/BotAI.h b/src/server/game/AI/PlayerAI/BotAI.h index c810a5c..53923ab 100644 --- a/src/server/game/AI/PlayerAI/BotAI.h +++ b/src/server/game/AI/PlayerAI/BotAI.h @@ -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);