PlayerBot : la monture d un bot de groupe calque celle de son maitre
Le core ne savait que monter, jamais descendre : TryUpMount() sortait des la premiere ligne si l aura de monture etait deja posee, et rien n appelait Dismount() hors lancement de sort. Un mercenaire recrute alors qu il galopait sur le terrain restait donc en selle indefiniment, y compris derriere un maitre a pied. UpdateMountState() remplace TryUpMount() dans le tick et traite les trois cas : maitre a pied, le bot descend (RemoveAurasByType, la monture portee pouvant venir de l IA de terrain et ne pas etre m_UseMountID) ; maitre monte au sol, monture terrestre ; maitre en vol, monture volante. Le vol passe par BotAIFly::UpdateFly, qui etait neutralisee par un return sec en tete de corps. Elle est retablie : c est le seul code qui fasse suivre un bot en trois dimensions, et BotGroupAI est son unique appelant - aucun autre mode d IA n est touche. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2659,7 +2659,9 @@ void BotAIFly::FlyToTarget(Player* player, bool offset)
|
|||||||
|
|
||||||
void BotAIFly::UpdateFly(Player* masterPlayer, uint32 groundMountID, BotBGAIMovement* pMovement)
|
void BotAIFly::UpdateFly(Player* masterPlayer, uint32 groundMountID, BotBGAIMovement* pMovement)
|
||||||
{
|
{
|
||||||
return;
|
// SylvaniaCore : cette fonction etait neutralisee par un return sec en
|
||||||
|
// tete de corps. Elle est le seul endroit qui fait suivre un bot en vol,
|
||||||
|
// et elle n est appelee que par BotGroupAI (NonCombatProcess).
|
||||||
if (m_FlyMountID == 0 || !masterPlayer || !pMovement)
|
if (m_FlyMountID == 0 || !masterPlayer || !pMovement)
|
||||||
return;
|
return;
|
||||||
if (me->GetMap() != masterPlayer->GetMap())
|
if (me->GetMap() != masterPlayer->GetMap())
|
||||||
|
|||||||
@@ -928,7 +928,7 @@ me->SetPower(POWER_MANA, (me->GetMaxPower(POWER_MANA)));
|
|||||||
}
|
}
|
||||||
Position pos = me->GetPosition();
|
Position pos = me->GetPosition();
|
||||||
m_Movement->SyncPosition(pos);
|
m_Movement->SyncPosition(pos);
|
||||||
if (TryUpMount())
|
if (UpdateMountState())
|
||||||
return;
|
return;
|
||||||
if (!me->HasAura(m_UseMountID) && !me->HasUnitState(UNIT_STATE_CASTING))
|
if (!me->HasAura(m_UseMountID) && !me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
m_UsePotion.TryUsePotion();
|
m_UsePotion.TryUsePotion();
|
||||||
@@ -1164,6 +1164,45 @@ bool BotGroupAI::TryUpMount()
|
|||||||
return (TryCastSpell(m_UseMountID, me) == SPELL_CAST_OK);
|
return (TryCastSpell(m_UseMountID, me) == SPELL_CAST_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SylvaniaCore : le core ne savait que monter, jamais descendre. Un bot
|
||||||
|
// recrute alors qu il galopait sur le terrain restait en selle pour toujours,
|
||||||
|
// y compris derriere un maitre a pied. La monture suit desormais le maitre :
|
||||||
|
// a pied il pose pied a terre, monture terrestre au sol, monture volante en vol.
|
||||||
|
bool BotGroupAI::UpdateMountState()
|
||||||
|
{
|
||||||
|
if (!m_MasterPlayer)
|
||||||
|
return false;
|
||||||
|
if (me->IsInCombat() || me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
return false;
|
||||||
|
if (me->GetMap() != m_MasterPlayer->GetMap())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Maitre a pied : le bot descend. Le vol fait exception, c est BotAIFly qui
|
||||||
|
// le ramene au sol - le couper ici le ferait chuter du ciel.
|
||||||
|
if (!m_MasterPlayer->IsMounted())
|
||||||
|
{
|
||||||
|
if (m_Flying.HasFlying())
|
||||||
|
return false;
|
||||||
|
if (!me->IsMounted())
|
||||||
|
return false;
|
||||||
|
// RemoveAurasByType et pas Dismount() : la monture portee peut venir de
|
||||||
|
// l IA de terrain et ne pas etre m_UseMountID.
|
||||||
|
me->RemoveAurasByType(SPELL_AURA_MOUNTED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maitre en vol : BotAIFly::UpdateFly pose la monture volante et assure le
|
||||||
|
// suivi en trois dimensions.
|
||||||
|
if (m_MasterPlayer->IsFlying())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Maitre monte au sol : monture terrestre.
|
||||||
|
if (m_Flying.HasFlying())
|
||||||
|
m_Flying.CancelFly();
|
||||||
|
|
||||||
|
return TryUpMount();
|
||||||
|
}
|
||||||
|
|
||||||
void BotGroupAI::Dismount()
|
void BotGroupAI::Dismount()
|
||||||
{
|
{
|
||||||
if (!me->HasAura(m_UseMountID))
|
if (!me->HasAura(m_UseMountID))
|
||||||
|
|||||||
@@ -93,6 +93,8 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool TryUpMount();
|
bool TryUpMount();
|
||||||
|
// Aligne la monture du bot sur celle du maitre : a pied, au sol ou en vol.
|
||||||
|
bool UpdateMountState();
|
||||||
bool CanReciveCommand(std::string& cmd, std::string& param);
|
bool CanReciveCommand(std::string& cmd, std::string& param);
|
||||||
void ProcessSummonCommand();
|
void ProcessSummonCommand();
|
||||||
void ProcessAttackCommand();
|
void ProcessAttackCommand();
|
||||||
|
|||||||
Reference in New Issue
Block a user