feat(Core/SmartScripts): SMART_ACTION_CALL_FOR_HELP should properly call assistance in case of polymorphed creature. (#9231)
Updates #9120
This commit is contained in:
@@ -1271,15 +1271,17 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
|
for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr)
|
||||||
|
{
|
||||||
if (IsCreature(*itr))
|
if (IsCreature(*itr))
|
||||||
{
|
{
|
||||||
(*itr)->ToCreature()->CallForHelp((float)e.action.callHelp.range);
|
(*itr)->ToCreature()->CallForHelp((float)e.action.callHelp.range, e.GetEventType() == SMART_EVENT_AGGRO ? unit : nullptr);
|
||||||
if (e.action.callHelp.withEmote)
|
if (e.action.callHelp.withEmote)
|
||||||
{
|
{
|
||||||
Acore::BroadcastTextBuilder builder(*itr, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_CALL_FOR_HELP, LANG_UNIVERSAL, nullptr);
|
Acore::BroadcastTextBuilder builder(*itr, CHAT_MSG_MONSTER_EMOTE, BROADCAST_TEXT_CALL_FOR_HELP, LANG_UNIVERSAL, nullptr);
|
||||||
sCreatureTextMgr->SendChatPacket(*itr, builder, CHAT_MSG_MONSTER_EMOTE);
|
sCreatureTextMgr->SendChatPacket(*itr, builder, CHAT_MSG_MONSTER_EMOTE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
delete targets;
|
delete targets;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -2237,14 +2237,20 @@ void Creature::CallAssistance(Unit* target /*= nullptr*/)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Creature::CallForHelp(float radius)
|
void Creature::CallForHelp(float radius, Unit* target /*= nullptr*/)
|
||||||
|
{
|
||||||
|
if (radius <= 0.0f || IsPet() || IsCharmed())
|
||||||
{
|
{
|
||||||
if (radius <= 0.0f || !GetVictim() || IsPet() || IsCharmed())
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Acore::CallOfHelpCreatureInRangeDo u_do(this, GetVictim(), radius);
|
if (!target)
|
||||||
|
{
|
||||||
|
target = GetVictim();
|
||||||
|
}
|
||||||
|
|
||||||
|
Acore::CallOfHelpCreatureInRangeDo u_do(this, target, radius);
|
||||||
Acore::CreatureWorker<Acore::CallOfHelpCreatureInRangeDo> worker(this, u_do);
|
Acore::CreatureWorker<Acore::CallOfHelpCreatureInRangeDo> worker(this, u_do);
|
||||||
|
|
||||||
Cell::VisitGridObjects(this, worker, radius);
|
Cell::VisitGridObjects(this, worker, radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ public:
|
|||||||
[[nodiscard]] Unit* SelectNearestTargetInAttackDistance(float dist) const;
|
[[nodiscard]] Unit* SelectNearestTargetInAttackDistance(float dist) const;
|
||||||
|
|
||||||
void DoFleeToGetAssistance();
|
void DoFleeToGetAssistance();
|
||||||
void CallForHelp(float fRadius);
|
void CallForHelp(float fRadius, Unit* target = nullptr);
|
||||||
void CallAssistance(Unit* target = nullptr);
|
void CallAssistance(Unit* target = nullptr);
|
||||||
void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; }
|
void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; }
|
||||||
void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
|
void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
|
||||||
|
|||||||
Reference in New Issue
Block a user