aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Scripting/ScriptSystem.cpp
diff options
context:
space:
mode:
authortreeston <treeston.mmoc@gmail.com>2016-09-14 23:53:37 +0200
committerjoschiwald <joschiwald.trinity@gmail.com>2017-03-01 22:03:35 +0100
commit59d48ce7e42a7bf68f47254de518780631572545 (patch)
treed1c673ae3c6a98e9d58e3051c257ec350d2bc056 /src/server/game/Scripting/ScriptSystem.cpp
parent9aa4b6d10f638160cf2bd8bad61b62296efdc490 (diff)
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 commit 6d00d3f28380dd0811a18913450b1dc4f07fef48) Merge remote-tracking branch 'Treeston/3.3.5-splinechains' into 3.3.5 (PR #17946) (cherry picked from commit 20f483967fb3a430fbd54148c08b6d8e8937daac) 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 commit 4fa646c0b2ae3261e7fab249f4177900d4c8d013) 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 commit 4a1a460241acf511467decd92d2a30e19927d74d)
Diffstat (limited to 'src/server/game/Scripting/ScriptSystem.cpp')
-rw-r--r--src/server/game/Scripting/ScriptSystem.cpp84
1 files changed, 78 insertions, 6 deletions
diff --git a/src/server/game/Scripting/ScriptSystem.cpp b/src/server/game/Scripting/ScriptSystem.cpp
index a9147dfc6e8..6cae097c8c4 100644
--- a/src/server/game/Scripting/ScriptSystem.cpp
+++ b/src/server/game/Scripting/ScriptSystem.cpp
@@ -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);
+}