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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user