mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-13 09:17:18 +00:00
fix(Core/Creature): prevent crash due to recursive call for help (#23008)
This commit is contained in:
@@ -272,7 +272,7 @@ bool TemporaryThreatModifierEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
|
||||
Creature::Creature(): Unit(), MovableMapObject(), m_groupLootTimer(0), lootingGroupLowGUID(0), m_lootRecipientGroup(0),
|
||||
m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_wanderDistance(0.0f), m_boundaryCheckTime(2500),
|
||||
m_transportCheckTimer(1000), lootPickPocketRestoreTime(0), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE),
|
||||
m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false),
|
||||
m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_alreadyCallForHelp(false), m_AlreadyCallAssistance(false),
|
||||
m_AlreadySearchedAssistance(false), m_regenHealth(true), m_regenPower(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_moveInLineOfSightDisabled(false), m_moveInLineOfSightStrictlyDisabled(false),
|
||||
m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_detectionDistance(20.0f),_sparringPct(0.0f), m_waypointID(0), m_path_id(0), m_formation(nullptr), m_lastLeashExtensionTime(nullptr), m_cannotReachTimer(0),
|
||||
_isMissingSwimmingFlagOutOfCombat(false), m_assistanceTimer(0), _playerDamageReq(0), _damagedByPlayer(false), _isCombatMovementAllowed(true)
|
||||
@@ -2485,6 +2485,9 @@ void Creature::CallForHelp(float radius, Unit* target /*= nullptr*/)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_alreadyCallForHelp) // avoid recursive call for help for any reason
|
||||
return;
|
||||
|
||||
Acore::CallOfHelpCreatureInRangeDo u_do(this, target, radius);
|
||||
Acore::CreatureWorker<Acore::CallOfHelpCreatureInRangeDo> worker(this, u_do);
|
||||
Cell::VisitObjects(this, worker, radius);
|
||||
|
||||
@@ -268,6 +268,7 @@ public:
|
||||
void DoFleeToGetAssistance();
|
||||
void CallForHelp(float fRadius, Unit* target = nullptr);
|
||||
void CallAssistance(Unit* target = nullptr);
|
||||
void SetNoCallForHelp(bool val) { m_alreadyCallForHelp = val; }
|
||||
void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; }
|
||||
void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
|
||||
bool HasSearchedAssistance() { return m_AlreadySearchedAssistance; }
|
||||
@@ -469,6 +470,7 @@ protected:
|
||||
uint8 m_equipmentId;
|
||||
int8 m_originalEquipmentId; // can be -1
|
||||
|
||||
bool m_alreadyCallForHelp;
|
||||
bool m_AlreadyCallAssistance;
|
||||
bool m_AlreadySearchedAssistance;
|
||||
bool m_regenHealth;
|
||||
|
||||
@@ -1157,7 +1157,11 @@ namespace Acore
|
||||
return;
|
||||
|
||||
if (u->AI())
|
||||
{
|
||||
u->SetNoCallForHelp(true); // avoid recursive call for help causing stack overflow
|
||||
u->AI()->AttackStart(i_enemy);
|
||||
u->SetNoCallForHelp(false);
|
||||
}
|
||||
}
|
||||
private:
|
||||
Unit* const i_funit;
|
||||
|
||||
Reference in New Issue
Block a user