Core/Scripts: Fixed ENSURE_AI assertion failures when used in Reset()/InitializeAI() hooks with hotswap

Updates #20727

(cherry picked from commit 2fd9dc2edb)
This commit is contained in:
Shauren
2018-02-05 20:52:19 +01:00
parent 4e373426aa
commit 8ed52e9dc3
3 changed files with 17 additions and 3 deletions

View File

@@ -811,7 +811,7 @@ bool Creature::AIM_Destroy()
return true;
}
bool Creature::AIM_Initialize(CreatureAI* ai)
bool Creature::AIM_Create(CreatureAI* ai /*= nullptr*/)
{
// make sure nothing can change the AI during AI update
if (m_AI_locked)
@@ -825,12 +825,23 @@ bool Creature::AIM_Initialize(CreatureAI* ai)
Motion_Initialize();
i_AI = ai ? ai : FactorySelector::selectAI(this);
}
void Creature::AI_InitializeAndEnable()
{
IsAIEnabled = true;
i_AI->InitializeAI();
// Initialize vehicle
if (GetVehicleKit())
GetVehicleKit()->Reset();
}
bool Creature::AIM_Initialize(CreatureAI* ai)
{
if (!AIM_Create(ai))
return false;
AI_InitializeAndEnable();
return true;
}

View File

@@ -131,7 +131,9 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
bool IsEvadingAttacks() const { return IsInEvadeMode() || CanNotReachTarget(); }
bool AIM_Destroy();
bool AIM_Initialize(CreatureAI* ai = NULL);
bool AIM_Create(CreatureAI* ai = nullptr);
void AI_InitializeAndEnable();
bool AIM_Initialize(CreatureAI* ai = nullptr);
void Motion_Initialize();
CreatureAI* AI() const { return reinterpret_cast<CreatureAI*>(i_AI); }

View File

@@ -453,7 +453,7 @@ class CreatureGameObjectAreaTriggerScriptRegistrySwapHooks
if (creature->IsAlive())
creature->ClearUnitState(UNIT_STATE_EVADE);
bool const created = creature->AIM_Initialize();
bool const created = creature->AIM_Create();
ASSERT(created,
"Creating the AI should never fail here!");
(void)created;
@@ -464,6 +464,7 @@ class CreatureGameObjectAreaTriggerScriptRegistrySwapHooks
if (!creature->IsAlive())
return;
creature->AI_InitializeAndEnable();
creature->AI()->EnterEvadeMode();
// Cast a dummy visual spell asynchronously here to signal