mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Movement: Add new SplineChainMovementGenerator that allows accurate replication of sniffed waypoints in static sequences, along with DB facilities that allow loading of waypoints from DB.
(cherry picked from commit6d00d3f283) Merge remote-tracking branch 'Treeston/3.3.5-splinechains' into 3.3.5 (PR #17946) (cherry picked from commit20f483967f) Core/Movement: Add a convenience default ctor to SplineChainResumeInfo, and fix PCH build in some configurations (zzz why do we even keep Appveyor and Travis around). (cherry picked from commit4fa646c0b2) PCH build fix. Again. (( Alright, you made me waste 20 minutes of my life on a full nonPCH rebuild of the core now. )) (( I hope you're happy. )) (cherry picked from commit4a1a460241)
This commit is contained in:
@@ -20,8 +20,7 @@
|
||||
#include "ObjectMgr.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "ScriptMgr.h"
|
||||
|
||||
TC_GAME_API ScriptPointVector const SystemMgr::_empty;
|
||||
#include "Creature.h"
|
||||
|
||||
SystemMgr* SystemMgr::instance()
|
||||
{
|
||||
@@ -53,7 +52,6 @@ void SystemMgr::LoadScriptWaypoints()
|
||||
TC_LOG_INFO("server.loading", ">> Loaded 0 Script Waypoints. DB table `script_waypoint` is empty.");
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
do
|
||||
@@ -62,7 +60,7 @@ void SystemMgr::LoadScriptWaypoints()
|
||||
ScriptPointMove temp;
|
||||
|
||||
temp.uiCreatureEntry = pFields[0].GetUInt32();
|
||||
uint32 uiEntry = temp.uiCreatureEntry;
|
||||
uint32 uiEntry = temp.uiCreatureEntry;
|
||||
temp.uiPointId = pFields[1].GetUInt32();
|
||||
temp.fX = pFields[2].GetFloat();
|
||||
temp.fY = pFields[3].GetFloat();
|
||||
@@ -82,8 +80,82 @@ void SystemMgr::LoadScriptWaypoints()
|
||||
|
||||
m_mPointMoveMap[uiEntry].push_back(temp);
|
||||
++count;
|
||||
}
|
||||
while (result->NextRow());
|
||||
} while (result->NextRow());
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u Script Waypoint nodes in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
void SystemMgr::LoadScriptSplineChains()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
m_mSplineChainsMap.clear();
|
||||
|
||||
// 0 1 2 3 4
|
||||
QueryResult resultMeta = WorldDatabase.Query("SELECT entry, chainId, splineId, expectedDuration, msUntilNext FROM script_spline_chain_meta ORDER BY entry asc, chainId asc, splineId asc");
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult resultWP = WorldDatabase.Query("SELECT entry, chainId, splineId, wpId, x, y, z FROM script_spline_chain_waypoints ORDER BY entry asc, chainId asc, splineId asc, wpId asc");
|
||||
if (!resultMeta || !resultWP)
|
||||
{
|
||||
TC_LOG_INFO("server.loading", ">> Loaded spline chain data for 0 chains, consisting of 0 splines with 0 waypoints. DB tables `script_spline_chain_meta` and `script_spline_chain_waypoints` are empty.");
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32 chainCount = 0, splineCount = 0, wpCount = 0;
|
||||
do
|
||||
{
|
||||
Field* fieldsMeta = resultMeta->Fetch();
|
||||
uint32 entry = fieldsMeta[0].GetUInt32();
|
||||
uint8 chainId = fieldsMeta[1].GetUInt8(), splineId = fieldsMeta[2].GetUInt8();
|
||||
SplineChain& chain = m_mSplineChainsMap[{entry,chainId}];
|
||||
|
||||
if (splineId != chain.size())
|
||||
{
|
||||
TC_LOG_WARN("server.loading", "Creature #%u: Chain %u has orphaned spline %u, skipped.", entry, chainId, splineId);
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32 expectedDuration = fieldsMeta[3].GetUInt32(), msUntilNext = fieldsMeta[4].GetUInt32();
|
||||
chain.push_back(SplineChainLink(expectedDuration, msUntilNext));
|
||||
|
||||
if (splineId == 0)
|
||||
++chainCount;
|
||||
++splineCount;
|
||||
} while (resultMeta->NextRow());
|
||||
|
||||
do
|
||||
{
|
||||
Field* fieldsWP = resultWP->Fetch();
|
||||
uint32 entry = fieldsWP[0].GetUInt32();
|
||||
uint8 chainId = fieldsWP[1].GetUInt8(), splineId = fieldsWP[2].GetUInt8(), wpId = fieldsWP[3].GetUInt8();
|
||||
float posX = fieldsWP[4].GetFloat(), posY = fieldsWP[5].GetFloat(), posZ = fieldsWP[6].GetFloat();
|
||||
auto it = m_mSplineChainsMap.find({entry,chainId});
|
||||
if (it == m_mSplineChainsMap.end())
|
||||
{
|
||||
TC_LOG_WARN("server.loading", "Creature #%u has waypoint data for spline chain %u. No such chain exists - entry skipped.", entry, chainId);
|
||||
continue;
|
||||
}
|
||||
SplineChain& chain = it->second;
|
||||
if (splineId >= chain.size())
|
||||
{
|
||||
TC_LOG_WARN("server.loading", "Creature #%u has waypoint data for spline (%u,%u). The specified chain does not have a spline with this index - entry skipped.", entry, chainId, splineId);
|
||||
continue;
|
||||
}
|
||||
SplineChainLink& spline = chain[splineId];
|
||||
if (wpId != spline.Points.size())
|
||||
{
|
||||
TC_LOG_WARN("server.loading", "Creature #%u has orphaned waypoint data in spline (%u,%u) at index %u. Skipped.", entry, chainId, splineId, wpId);
|
||||
continue;
|
||||
}
|
||||
spline.Points.emplace_back(posX, posY, posZ);
|
||||
++wpCount;
|
||||
} while (resultWP->NextRow());
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded spline chain data for %u chains, consisting of %u splines with %u waypoints in %u ms", chainCount, splineCount, wpCount, GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
}
|
||||
|
||||
SplineChain const* SystemMgr::GetSplineChain(Creature const* who, uint8 id) const
|
||||
{
|
||||
return GetSplineChain(who->GetEntry(), id);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user