mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 18:36:31 +01:00
Core/SAI: Implement a new action type to make a creature (or targets in list) start the closest waypoint available to them
This commit is contained in:
@@ -2217,6 +2217,64 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
||||
sGameEventMgr->StartEvent(eventId, true);
|
||||
break;
|
||||
}
|
||||
case SMART_ACTION_START_CLOSEST_WAYPOINT:
|
||||
{
|
||||
uint32 waypoints[SMART_ACTION_PARAM_COUNT];
|
||||
waypoints[0] = e.action.closestWaypointFromList.wp1;
|
||||
waypoints[1] = e.action.closestWaypointFromList.wp2;
|
||||
waypoints[2] = e.action.closestWaypointFromList.wp3;
|
||||
waypoints[3] = e.action.closestWaypointFromList.wp4;
|
||||
waypoints[4] = e.action.closestWaypointFromList.wp5;
|
||||
waypoints[5] = e.action.closestWaypointFromList.wp6;
|
||||
float distanceToClosest = std::numeric_limits<float>::max();
|
||||
WayPoint* closestWp = NULL;
|
||||
|
||||
ObjectList* targets = GetTargets(e, unit);
|
||||
if (targets)
|
||||
{
|
||||
for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); ++itr)
|
||||
{
|
||||
if (Creature* target = (*itr)->ToCreature())
|
||||
{
|
||||
if (IsSmart(target))
|
||||
{
|
||||
for (uint8 i = 0; i < SMART_ACTION_PARAM_COUNT; i++)
|
||||
{
|
||||
if (!waypoints[i])
|
||||
continue;
|
||||
|
||||
WPPath* path = sSmartWaypointMgr->GetPath(waypoints[i]);
|
||||
|
||||
if (!path || path->empty())
|
||||
continue;
|
||||
|
||||
WPPath::const_iterator itrWp = path->find(0);
|
||||
|
||||
if (itrWp != path->end())
|
||||
{
|
||||
if (WayPoint* wp = itrWp->second)
|
||||
{
|
||||
float distToThisPath = target->GetDistance(wp->x, wp->y, wp->z);
|
||||
|
||||
if (distToThisPath < distanceToClosest)
|
||||
{
|
||||
distanceToClosest = distToThisPath;
|
||||
closestWp = wp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (closestWp)
|
||||
CAST_AI(SmartAI, target->AI())->StartPath(false, closestWp->id, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete targets;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
|
||||
break;
|
||||
|
||||
@@ -1008,6 +1008,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SMART_ACTION_START_CLOSEST_WAYPOINT:
|
||||
case SMART_ACTION_FOLLOW:
|
||||
case SMART_ACTION_SET_ORIENTATION:
|
||||
case SMART_ACTION_STORE_TARGET_LIST:
|
||||
|
||||
@@ -529,8 +529,9 @@ enum SMART_ACTION
|
||||
SMART_ACTION_REMOVE_POWER = 110, // PowerType, newPower
|
||||
SMART_ACTION_GAME_EVENT_STOP = 111, // GameEventId
|
||||
SMART_ACTION_GAME_EVENT_START = 112, // GameEventId
|
||||
SMART_ACTION_START_CLOSEST_WAYPOINT = 113, // wp1, wp2, wp3, wp4, wp5, wp6, wp7
|
||||
|
||||
SMART_ACTION_END = 113
|
||||
SMART_ACTION_END = 114
|
||||
};
|
||||
|
||||
struct SmartAction
|
||||
@@ -987,6 +988,16 @@ struct SmartAction
|
||||
uint32 id;
|
||||
} gameEventStart;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 wp1;
|
||||
uint32 wp2;
|
||||
uint32 wp3;
|
||||
uint32 wp4;
|
||||
uint32 wp5;
|
||||
uint32 wp6;
|
||||
} closestWaypointFromList;
|
||||
|
||||
//! Note for any new future actions
|
||||
//! All parameters must have type uint32
|
||||
|
||||
|
||||
Reference in New Issue
Block a user