Siege des Capitales : rayon de prise a partie du dirigeant decouple

La priorite de cible sur le dirigeant utilisait searchRange * 2, donc la portee
d engagement courante. Abaisser siege_engage_range pour reduire l attrition
retrecissait du meme coup le rayon a partir duquel le dirigeant devient la
cible prioritaire, exactement quand on cherchait a le rendre atteignable. Les
deux valeurs sont desormais independantes, nouvelle cle
siege_boss_engage_range (40 yards par defaut, borne a 10 - 60).

Portee d engagement abaissee a 10 yards dans le fichier de configuration
distribue : mesures a 50 bots sur la route relevee en jeu, avec
siege_boss_engage_range a 40.

  engage 18                 waypoint 29/30, bot le plus proche a 94 yards
  engage 10, boss couple    waypoint 29/30, bot le plus proche a 47 yards
  engage 10, boss a 40      waypoint 30/30, bot le plus proche a 3 yards

La horde franchit donc desormais la totalite de la route et atteint le
dirigeant au contact.

Reste ouvert : Anduin ne perd toujours pas un point de vie, y compris avec un
bot mort a 3 yards de lui. L hypothese d une protection par la faction est
ecartee par deux essais avec sa faction forcee a 12, dont un ou la horde a
franchi les 30 waypoints. Rien dans creature_template ne l explique non plus :
ni masque d immunite, ni aura, ni script, et son unit_flags 0x8000 ne figure
pas parmi les drapeaux bloquants de Unit::_IsValidAttackTarget. Le diagnostic
suivant demande d instrumenter la selection de cible cote bot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-15 17:34:52 +02:00
parent 82e2d497ed
commit 9d0f0c16de
4 changed files with 24 additions and 3 deletions
+1 -1
View File
@@ -1769,7 +1769,7 @@ void BotBGAI::UpdateBotAI(uint32 diff)
if (Unit* siegeBoss = ObjectAccessor::GetUnit(*me, m_SiegeTarget))
{
if (siegeBoss->IsAlive() && me->IsValidAttackTarget(siegeBoss)
&& me->GetDistance(siegeBoss) < searchRange * 2.0f)
&& me->GetDistance(siegeBoss) < sCapitalSiegeMgr->GetBossEngageRange())
me->SetSelection(m_SiegeTarget);
}
}
@@ -52,7 +52,7 @@ namespace
CapitalSiegeMgr::CapitalSiegeMgr() :
m_enabled(false), m_hourMin(18), m_hourMax(24), m_botCount(50), m_botLevel(110),
m_duration(HOUR), m_spawnRate(5), m_pvpMode(1), m_engageRange(18.0f), m_stallTimeout(20), m_advanceWindow(12),
m_duration(HOUR), m_spawnRate(5), m_pvpMode(1), m_engageRange(18.0f), m_bossEngageRange(40.0f), m_stallTimeout(20), m_advanceWindow(12),
m_maxDiff(400), m_announce(true),
m_lastEventDay(0), m_lastAttackerTeam(TEAM_NEUTRAL), m_scheduledDay(0),
m_scheduledTime(0), m_scheduledTeam(TEAM_NEUTRAL),
@@ -117,6 +117,7 @@ void CapitalSiegeMgr::LoadConfig()
m_spawnRate = sConfigMgr->GetIntDefault("siege_spawn_rate", 5);
m_pvpMode = sConfigMgr->GetIntDefault("siege_pvp", 1);
m_engageRange = sConfigMgr->GetFloatDefault("siege_engage_range", 18.0f);
m_bossEngageRange = sConfigMgr->GetFloatDefault("siege_boss_engage_range", 40.0f);
m_stallTimeout = sConfigMgr->GetIntDefault("siege_stall_timeout", 20);
m_advanceWindow = sConfigMgr->GetIntDefault("siege_advance_window", 12);
m_maxDiff = sConfigMgr->GetIntDefault("siege_maxdiff", 400);
@@ -150,6 +151,12 @@ void CapitalSiegeMgr::LoadConfig()
// toute la ville au lieu de suivre leur route.
if (m_engageRange < 5.0f || m_engageRange > 32.0f)
m_engageRange = 18.0f;
// Le rayon de prise a partie du dirigeant est independant de la portee
// d engagement courante : les deux n ont rien a voir, et les coupler
// faisait qu abaisser siege_engage_range retrecissait aussi le rayon
// du boss, exactement quand on cherchait a le rendre atteignable.
if (m_bossEngageRange < 10.0f || m_bossEngageRange > 60.0f)
m_bossEngageRange = 40.0f;
// Une fenetre de marche nulle rendrait le garde-fou anti-enlisement inutile.
if (!m_advanceWindow)
m_advanceWindow = 12;
@@ -120,6 +120,7 @@ public:
uint32 GetPvpMode() const { return m_pvpMode; }
float GetEngageRange() const { return m_engageRange; }
uint32 GetStallTimeout() const { return m_stallTimeout; }
float GetBossEngageRange() const { return m_bossEngageRange; }
uint32 GetAdvanceWindow() const { return m_advanceWindow; }
static char const* GetTeamName(TeamId team);
@@ -172,6 +173,7 @@ private:
uint32 m_spawnRate; // bots par seconde
uint32 m_pvpMode; // 0 = PNJ seuls, 1 = joueurs flagges PvP, 2 = tous
float m_engageRange; // yards, portee d engagement en mode siege
float m_bossEngageRange; // yards, rayon de prise a partie du dirigeant
uint32 m_stallTimeout; // secondes sans progresser avant de lacher la cible
uint32 m_advanceWindow; // secondes de marche forcee apres un enlisement
uint32 m_maxDiff; // ms, seuil d arret d urgence (0 = desactive)
+13 -1
View File
@@ -4739,7 +4739,19 @@ siege_pvp = 1
# Default: 18
#
siege_engage_range = 18
siege_engage_range = 10
#
# siege_boss_engage_range
# Description: Rayon en yards a partir duquel un bot prend le dirigeant
# pour cible prioritaire. Independant de siege_engage_range :
# coupler les deux faisait qu abaisser la portee d engagement
# retrecissait aussi ce rayon, exactement quand on cherchait
# a rendre le dirigeant atteignable. Borne a 10 - 60.
# Default: 40
#
siege_boss_engage_range = 40
#
# siege_stall_timeout