diff options
author | Machiavelli <none@none> | 2010-06-23 01:59:32 +0200 |
---|---|---|
committer | Machiavelli <none@none> | 2010-06-23 01:59:32 +0200 |
commit | 968c27f55f02551dcc0385e587b848facae10ed7 (patch) | |
tree | 25e11581367ecda0d2b7019f45d0f4ef217487fa /src | |
parent | ffaffe3fd753b0afc75679c9730276871a9d034a (diff) |
Implement taxi/transport event scripts support. Author: Vladimir
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DBCStructure.h | 4 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCfmt.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.h | 11 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h | 2 |
8 files changed, 72 insertions, 28 deletions
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 5d195530021..e6486baab66 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1716,8 +1716,8 @@ struct TaxiPathNodeEntry float z; // 6 m_LocZ uint32 actionFlag; // 7 m_flags uint32 delay; // 8 m_delay - // 9 m_arrivalEventID - // 10 m_departureEventID + uint32 arrivalEventID; // 9 m_arrivalEventID + uint32 departureEventID; // 10 m_departureEventID }; struct TotemCategoryEntry diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index e791e304d8c..c951e9fa3c2 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -110,7 +110,7 @@ const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxxxx"; const char TalentTabEntryfmt[]="nxxxxxxxxxxxxxxxxxxxiiix"; const char TaxiNodesEntryfmt[]="nifffssssssssssssssssxii"; const char TaxiPathEntryfmt[]="niii"; -const char TaxiPathNodeEntryfmt[]="diiifffiixx"; +const char TaxiPathNodeEntryfmt[]="diiifffiiii"; const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii"; const char VehicleEntryfmt[]="niffffiiiiiiiifffffffffffffffssssfifiixx"; const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxx"; diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index db7f74cb412..b95ea0b7788 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -500,6 +500,16 @@ struct GameObjectInfo default: return 0; } } + uint32 GetEventScriptId() const + { + switch(type) + { + case GAMEOBJECT_TYPE_GOOBER: return goober.eventId; + case GAMEOBJECT_TYPE_CHEST: return chest.eventId; + case GAMEOBJECT_TYPE_CAMERA: return camera.eventID; + default: return 0; + } + } }; class OPvPCapturePoint; diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index a8ac5bbb0b8..3956dcda184 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -310,7 +310,8 @@ bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) if (keyFrames[keyFrames.size() - 1].node->mapid != keyFrames[0].node->mapid) teleport = true; - WayPoint pos(keyFrames[0].node->mapid, keyFrames[0].node->x, keyFrames[0].node->y, keyFrames[0].node->z, teleport, 0); + WayPoint pos(keyFrames[0].node->mapid, keyFrames[0].node->x, keyFrames[0].node->y, keyFrames[0].node->z, teleport, 0, + keyFrames[0].node->arrivalEventID, keyFrames[0].node->departureEventID); m_WayPoints[0] = pos; t += keyFrames[0].node->delay * 1000; @@ -390,8 +391,8 @@ bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) cM = keyFrames[i + 1].node->mapid; } - WayPoint pos(keyFrames[i + 1].node->mapid, keyFrames[i + 1].node->x, keyFrames[i + 1].node->y, keyFrames[i + 1].node->z, teleport, 0); - + WayPoint pos(keyFrames[i + 1].node->mapid, keyFrames[i + 1].node->x, keyFrames[i + 1].node->y, keyFrames[i + 1].node->z, teleport, + 0, keyFrames[i + 1].node->arrivalEventID, keyFrames[i + 1].node->departureEventID); // sLog.outString("T: %d, x: %f, y: %f, z: %f, t:%d", t, pos.x, pos.y, pos.z, teleport); /* if (keyFrames[i+1].delay > 5) @@ -494,9 +495,13 @@ void Transport::Update(uint32 /*p_time*/) m_timer = getMSTime() % m_period; while (((m_timer - m_curr->first) % m_pathTime) > ((m_next->first - m_curr->first) % m_pathTime)) { + DoEventIfAny(*m_curr, true); + m_curr = GetNextWayPoint(); m_next = GetNextWayPoint(); + DoEventIfAny(*m_curr,false); + // first check help in case client-server transport coordinates de-synchronization if (m_curr->second.mapid != GetMapId() || m_curr->second.teleport) { @@ -582,3 +587,11 @@ void Transport::UpdateForMap(Map const* targetMap) } } +void Transport::DoEventIfAny(WayPointMap::value_type const& node, bool departure) +{ + if (uint32 eventid = departure ? node.second.departureEventID : node.second.arrivalEventID) + { + sLog.outDebug("Taxi %s event %u of node %u of %s path", departure ? "departure" : "arrival", eventid, node.first, GetName()); + GetMap()->ScriptsStart(sEventScripts, eventid, this, this); + } +} diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index 0bc3322ce35..ba17ead0547 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -46,14 +46,20 @@ class Transport : public GameObject struct WayPoint { WayPoint() : mapid(0), x(0), y(0), z(0), teleport(false), id(0) {} - WayPoint(uint32 _mapid, float _x, float _y, float _z, bool _teleport, uint32 _id) : - mapid(_mapid), x(_x), y(_y), z(_z), teleport(_teleport), id(_id) {} + WayPoint(uint32 _mapid, float _x, float _y, float _z, bool _teleport, uint32 _id = 0, + uint32 _arrivalEventID = 0, uint32 _departureEventID = 0) + : mapid(_mapid), x(_x), y(_y), z(_z), teleport(_teleport), id(_id), + arrivalEventID(_arrivalEventID), departureEventID(_departureEventID) + { + } uint32 mapid; float x; float y; float z; bool teleport; uint32 id; + uint32 arrivalEventID; + uint32 departureEventID; }; typedef std::map<uint32, WayPoint> WayPointMap; @@ -73,6 +79,7 @@ class Transport : public GameObject private: void TeleportTransport(uint32 newMapid, float x, float y, float z); void UpdateForMap(Map const* map); + void DoEventIfAny(WayPointMap::value_type const& node, bool departure); WayPointMap::const_iterator GetNextWayPoint(); }; #endif diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 99b12743237..111de39a194 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -4813,26 +4813,9 @@ void ObjectMgr::LoadEventScripts() // Load all possible script entries from gameobjects for (uint32 i = 1; i < sGOStorage.MaxEntry; ++i) { - GameObjectInfo const * goInfo = sGOStorage.LookupEntry<GameObjectInfo>(i); - if (goInfo) - { - switch(goInfo->type) - { - case GAMEOBJECT_TYPE_GOOBER: - if (goInfo->goober.eventId) - evt_scripts.insert(goInfo->goober.eventId); - break; - case GAMEOBJECT_TYPE_CHEST: - if (goInfo->chest.eventId) - evt_scripts.insert(goInfo->chest.eventId); - break; - case GAMEOBJECT_TYPE_CAMERA: - if (goInfo->camera.eventID) - evt_scripts.insert(goInfo->camera.eventID); - default: - break; - } - } + if (GameObjectInfo const * goInfo = sGOStorage.LookupEntry<GameObjectInfo>(i)) + if (uint32 eventId = goInfo->GetEventScriptId()) + evt_scripts.insert(eventId); } // Load all possible script entries from spells for (uint32 i = 1; i < sSpellStore.GetNumRows(); ++i) @@ -4851,6 +4834,20 @@ void ObjectMgr::LoadEventScripts() } } + for(size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx) + { + for(size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx) + { + TaxiPathNodeEntry const& node = sTaxiPathNodesByPath[path_idx][node_idx]; + + if (node.arrivalEventID) + evt_scripts.insert(node.arrivalEventID); + + if (node.departureEventID) + evt_scripts.insert(node.departureEventID); + } + } + // Then check if all scripts are in above list of possible script entries for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr) { diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 2f9e4ce602e..beb5186a8b2 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -278,10 +278,14 @@ bool FlightPathMovementGenerator::Update(Player &player, const uint32 &diff) i_destinationHolder.ResetUpdate(FLIGHT_TRAVEL_UPDATE); if (i_destinationHolder.HasArrived()) { + DoEventIfAny(player,(*i_path)[i_currentNode], false); + uint32 curMap = (*i_path)[i_currentNode].mapid; ++i_currentNode; if (MovementInProgress()) { + DoEventIfAny(player,(*i_path)[i_currentNode], true); + DEBUG_LOG("loading node %u for player %s", i_currentNode, player.GetName()); if ((*i_path)[i_currentNode].mapid == curMap) { @@ -351,6 +355,17 @@ void FlightPathMovementGenerator::PreloadEndGrid() sLog.outDetail("Unable to determine map to preload flightmaster grid"); } +void FlightPathMovementGenerator::DoEventIfAny(Player& player, TaxiPathNodeEntry const& node, bool departure) +{ + if (uint32 eventid = departure ? node.departureEventID : node.arrivalEventID) + { + sLog.outDebug("Taxi %s event %u of node %u of path %u for player %s", departure ? "departure" : "arrival", eventid, node.index, node.path, player.GetName()); + player.GetMap()->ScriptsStart(sEventScripts, eventid, &player, &player); + } +} + + + // // Unique1's ASTAR Pathfinding Code... For future use & reference... // diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index a03ff223b8e..c6d89ecd9b3 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -115,6 +115,8 @@ public PathMovementBase<Player,TaxiPathNodeList const*> bool HasArrived() const { return (i_currentNode >= i_path->size()); } void SetCurrentNodeAfterTeleport(); void SkipCurrentNode() { ++i_currentNode; } + void DoEventIfAny(Player& player, TaxiPathNodeEntry const& node, bool departure); + bool GetDestination(float& x, float& y, float& z) const { return PathMovementBase<Player,TaxiPathNodeList const*>::GetDestination(x,y,z); } void PreloadEndGrid(); |