Core/Scripts: Extended escort AI

This commit is contained in:
Sawiner
2011-04-16 17:15:21 +02:00
committed by Shauren
parent c1e8eefd74
commit 1be1b1559c
3 changed files with 92 additions and 13 deletions
@@ -383,12 +383,12 @@ void npc_escortAI::AddWaypoint(uint32 id, float x, float y, float z, uint32 wait
void npc_escortAI::FillPointMovementListForCreature()
{
std::vector<ScriptPointMove> const& movePoints = sScriptSystemMgr->GetPointMoveList(me->GetEntry());
ScriptPointVector const& movePoints = sScriptSystemMgr->GetPointMoveList(me->GetEntry());
if (movePoints.empty())
return;
std::vector<ScriptPointMove>::const_iterator itrEnd = movePoints.end();;
for (std::vector<ScriptPointMove>::const_iterator itr = movePoints.begin(); itr != itrEnd; ++itr)
ScriptPointVector::const_iterator itrEnd = movePoints.end();;
for (ScriptPointVector::const_iterator itr = movePoints.begin(); itr != itrEnd; ++itr)
{
Escort_Waypoint point(itr->uiPointId, itr->fX, itr->fY, itr->fZ, itr->uiWaitTime);
WaypointList.push_back(point);
@@ -416,7 +416,7 @@ void npc_escortAI::SetRun(bool on)
}
//TODO: get rid of this many variables passed in function.
void npc_escortAI::Start(bool isActiveAttacker, bool run, uint64 playerGUID, Quest const* quest, bool instantRespawn, bool canLoopPath)
void npc_escortAI::Start(bool isActiveAttacker /* = true*/, bool run /* = false */, uint64 playerGUID /* = 0 */, Quest const* quest /* = NULL */, bool instantRespawn /* = false */, bool canLoopPath /* = false */, bool resetWaypoints /* = true */)
{
if (me->getVictim())
{
@@ -430,7 +430,7 @@ void npc_escortAI::Start(bool isActiveAttacker, bool run, uint64 playerGUID, Que
return;
}
if (!ScriptWP) // sd2 never adds wp in script, but tc does
if (!ScriptWP && resetWaypoints) // sd2 never adds wp in script, but tc does
{
if (!WaypointList.empty())
WaypointList.clear();
@@ -490,3 +490,70 @@ void npc_escortAI::SetEscortPaused(bool on)
else
RemoveEscortState(STATE_ESCORT_PAUSED);
}
bool npc_escortAI::SetNextWaypoint(uint32 pointId, float x, float y, float z, float orientation)
{
me->SetPosition(x, y, z, orientation);
return SetNextWaypoint(pointId, false, true);
}
bool npc_escortAI::SetNextWaypoint(uint32 pointId, bool setPosition, bool resetWaypointsOnFail)
{
if (!WaypointList.empty())
WaypointList.clear();
FillPointMovementListForCreature();
if (WaypointList.empty())
return false;
size_t const size = WaypointList.size();
Escort_Waypoint waypoint(0, 0, 0, 0, 0);
do
{
waypoint = WaypointList.front();
WaypointList.pop_front();
if (waypoint.id == pointId)
{
if (setPosition)
me->SetPosition(waypoint.x, waypoint.y, waypoint.z, me->GetOrientation());
CurrentWP = WaypointList.begin();
return true;
}
}
while (!WaypointList.empty());
// we failed.
// we reset the waypoints in the start; if we pulled any, reset it again
if (resetWaypointsOnFail && size != WaypointList.size())
{
if (!WaypointList.empty())
WaypointList.clear();
FillPointMovementListForCreature();
}
return false;
}
bool npc_escortAI::GetWaypointPosition(uint32 pointId, float& x, float& y, float& z)
{
ScriptPointVector const& waypoints = sScriptSystemMgr->GetPointMoveList(me->GetEntry());
if (waypoints.empty())
return false;
ScriptPointVector::const_iterator itrEnd = waypoints.end();
for (ScriptPointVector::const_iterator itr = waypoints.begin(); itr != waypoints.end(); ++itr)
{
if (itr->uiPointId == pointId)
{
x = itr->fX;
y = itr->fY;
z = itr->fZ;
return true;
}
}
return false;
}
@@ -62,10 +62,19 @@ struct npc_escortAI : public ScriptedAI
// EscortAI functions
void AddWaypoint(uint32 id, float x, float y, float z, uint32 waitTime = 0); // waitTime is in ms
//this will set the current position to x/y/z/o, and the current WP to pointId.
bool SetNextWaypoint(uint32 pointId, float x, float y, float z, float orientation);
//this will set the current position to WP start position (if setPosition == true),
//and the current WP to pointId
bool SetNextWaypoint(uint32 pointId, bool setPosition = true, bool resetWaypointsOnFail = true);
bool GetWaypointPosition(uint32 pointId, float& x, float& y, float& z);
virtual void WaypointReached(uint32 pointId) = 0;
virtual void WaypointStart(uint32 /*pointId*/) {}
void Start(bool isActiveAttacker = true, bool run = false, uint64 playerGUID = 0, Quest const* quest = NULL, bool instantRespawn = false, bool canLoopPath = false);
void Start(bool isActiveAttacker = true, bool run = false, uint64 playerGUID = 0, Quest const* quest = NULL, bool instantRespawn = false, bool canLoopPath = false, bool resetWaypoints = true);
void SetRun(bool on = true);
void SetEscortPaused(bool on);
+10 -7
View File
@@ -42,6 +42,8 @@ struct ScriptPointMove
uint32 uiWaitTime;
};
typedef std::vector<ScriptPointMove> ScriptPointVector;
struct StringTextData
{
uint32 uiSoundId;
@@ -55,10 +57,11 @@ class SystemMgr
friend class ACE_Singleton<SystemMgr, ACE_Null_Mutex>;
SystemMgr() {}
~SystemMgr() {}
public:
//Maps and lists
typedef UNORDERED_MAP<int32, StringTextData> TextDataMap;
typedef UNORDERED_MAP<uint32, std::vector<ScriptPointMove> > PointMoveMap;
typedef UNORDERED_MAP<uint32, ScriptPointVector> PointMoveMap;
//Database
void LoadVersion();
@@ -67,9 +70,9 @@ class SystemMgr
void LoadScriptWaypoints();
//Retrive from storage
StringTextData const* GetTextData(int32 uiTextId) const
StringTextData const* GetTextData(int32 textId) const
{
TextDataMap::const_iterator itr = m_mTextDataMap.find(uiTextId);
TextDataMap::const_iterator itr = m_mTextDataMap.find(textId);
if (itr == m_mTextDataMap.end())
return NULL;
@@ -77,14 +80,14 @@ class SystemMgr
return &itr->second;
}
std::vector<ScriptPointMove> const &GetPointMoveList(uint32 uiCreatureEntry) const
ScriptPointVector const& GetPointMoveList(uint32 creatureEntry) const
{
static std::vector<ScriptPointMove> vEmpty;
static ScriptPointVector empty;
PointMoveMap::const_iterator itr = m_mPointMoveMap.find(uiCreatureEntry);
PointMoveMap::const_iterator itr = m_mPointMoveMap.find(creatureEntry);
if (itr == m_mPointMoveMap.end())
return vEmpty;
return empty;
return itr->second;
}