mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2025-11-29 17:38:24 +08:00
feat(Core/SmartAI): Implement SMART_ACTION_FOLLOW_GROUP (#17033)
* Update SmartScript.cpp * INIT * add as coauthor as well :) Co-Authored-By: cyberium <346907+cyberium@users.noreply.github.com> * codestyle * test? --------- Co-authored-by: cyberium <346907+cyberium@users.noreply.github.com>
This commit is contained in:
@@ -2891,6 +2891,101 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SMART_ACTION_FOLLOW_GROUP:
|
||||
{
|
||||
if (!e.action.followGroup.followState)
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
if (IsUnit(target))
|
||||
target->ToCreature()->GetMotionMaster()->MoveIdle();
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
uint8 membCount = targets.size();
|
||||
uint8 itr = 1;
|
||||
float dist = float(e.action.followGroup.dist / 100);
|
||||
switch (e.action.followGroup.followType)
|
||||
{
|
||||
case FOLLOW_TYPE_CIRCLE:
|
||||
{
|
||||
float angle = (membCount > 4 ? (M_PI * 2)/membCount : (M_PI / 2)); // 90 degrees is the maximum angle
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsCreature(target))
|
||||
{
|
||||
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist, angle * itr);
|
||||
itr++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FOLLOW_TYPE_SEMI_CIRCLE_BEHIND:
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsCreature(target))
|
||||
{
|
||||
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist, (M_PI / 2.0f) + (M_PI / membCount) * (itr - 1));
|
||||
itr++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FOLLOW_TYPE_SEMI_CIRCLE_FRONT:
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsCreature(target))
|
||||
{
|
||||
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist, (M_PI + (M_PI / 2.0f) + (M_PI / membCount) * (itr - 1)));
|
||||
itr++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FOLLOW_TYPE_LINE:
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsCreature(target))
|
||||
{
|
||||
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist * (((itr - 1) / 2) + 1), itr % 2 ? 0.f : M_PI);
|
||||
itr++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FOLLOW_TYPE_COLUMN:
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsCreature(target))
|
||||
{
|
||||
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist * (((itr - 1) / 2) + 1), itr % 2 ? (M_PI / 2) : (M_PI * 1.5f));
|
||||
itr++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FOLLOW_TYPE_ANGULAR:
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsCreature(target))
|
||||
{
|
||||
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist * (((itr - 1) / 2) + 1), itr % 2 ? M_PI - (M_PI / 4) : M_PI + (M_PI / 4));
|
||||
itr++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry {} SourceType {}, Event {}, Unhandled Action type {}", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user