From 9d0f0c16de2b0df24c308c117c3f3996da6b30d3 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Sat, 15 Aug 2026 17:34:52 +0200 Subject: [PATCH] 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 --- src/server/game/AI/PlayerAI/BotAI.cpp | 2 +- src/server/game/CapitalSiege/CapitalSiegeMgr.cpp | 9 ++++++++- src/server/game/CapitalSiege/CapitalSiegeMgr.h | 2 ++ src/server/worldserver/worldserver.conf.dist | 14 +++++++++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/server/game/AI/PlayerAI/BotAI.cpp b/src/server/game/AI/PlayerAI/BotAI.cpp index 17f4c44..2617cc4 100644 --- a/src/server/game/AI/PlayerAI/BotAI.cpp +++ b/src/server/game/AI/PlayerAI/BotAI.cpp @@ -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); } } diff --git a/src/server/game/CapitalSiege/CapitalSiegeMgr.cpp b/src/server/game/CapitalSiege/CapitalSiegeMgr.cpp index 1e062dc..ecfd5cf 100644 --- a/src/server/game/CapitalSiege/CapitalSiegeMgr.cpp +++ b/src/server/game/CapitalSiege/CapitalSiegeMgr.cpp @@ -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; diff --git a/src/server/game/CapitalSiege/CapitalSiegeMgr.h b/src/server/game/CapitalSiege/CapitalSiegeMgr.h index 1e5243c..f3c6397 100644 --- a/src/server/game/CapitalSiege/CapitalSiegeMgr.h +++ b/src/server/game/CapitalSiege/CapitalSiegeMgr.h @@ -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) diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index cb89dfa..cb607bd 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -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