diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-05-25 22:14:32 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-05-25 22:14:32 +0200 |
| commit | 630b60eb0dcd3d9ce41582664ab822b049365431 (patch) | |
| tree | b5d60fe41ca49846524ddbc7f9409194b76e7849 /src/server/game/Maps | |
| parent | 3031fbb63bfb2df2aa041bd9c04c5c42b0c07c05 (diff) | |
Core/GameObjects: Transport (type 11) improvements
* Fully synchronize serverside animation progress with client
* Implemented updating passenger positions on elevators
* Removed visibility hack for elevators that always forced CreateObject packet to be sent to client
Diffstat (limited to 'src/server/game/Maps')
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Maps/TransportMgr.cpp | 47 | ||||
| -rw-r--r-- | src/server/game/Maps/TransportMgr.h | 12 |
3 files changed, 53 insertions, 18 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index ac15beaefb6..738d0d296c8 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1265,9 +1265,7 @@ void Map::GameObjectRelocation(GameObject* go, float x, float y, float z, float else { go->Relocate(x, y, z, orientation); - go->UpdateModelPosition(); - go->UpdatePositionData(); - go->UpdateObjectVisibility(false); + go->AfterRelocation(); RemoveGameObjectFromMoveList(go); } @@ -1491,9 +1489,7 @@ void Map::MoveAllGameObjectsInMoveList() { // update pos go->Relocate(go->_newPosition); - go->UpdateModelPosition(); - go->UpdatePositionData(); - go->UpdateObjectVisibility(false); + go->AfterRelocation(); } else { @@ -3028,7 +3024,7 @@ void Map::SendInitSelf(Player* player) UpdateData data(player->GetMapId()); // attach to player data current transport data - if (Transport* transport = player->GetTransport()) + if (Transport* transport = dynamic_cast<Transport*>(player->GetTransport())) { transport->BuildCreateUpdateBlockForPlayer(&data, player); player->m_visibleTransports.insert(transport->GetGUID()); @@ -3038,7 +3034,7 @@ void Map::SendInitSelf(Player* player) player->BuildCreateUpdateBlockForPlayer(&data, player); // build other passengers at transport also (they always visible and marked as visible and will not send at visibility update at add to map - if (Transport* transport = player->GetTransport()) + if (Transport* transport = dynamic_cast<Transport*>(player->GetTransport())) for (WorldObject* passenger : transport->GetPassengers()) if (player != passenger && player->HaveAtClient(passenger)) passenger->BuildCreateUpdateBlockForPlayer(&data, player); diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index 871f43de6c1..5bcd0db73b0 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -447,6 +447,15 @@ void TransportMgr::AddPathNodeToTransport(uint32 transportEntry, uint32 timeSeg, animNode.Path[timeSeg] = node; } +void TransportMgr::AddPathRotationToTransport(uint32 transportEntry, uint32 timeSeg, TransportRotationEntry const* node) +{ + TransportAnimation& animNode = _transportAnimations[transportEntry]; + animNode.Rotations[timeSeg] = node; + + if (animNode.Path.empty() && animNode.TotalTime < timeSeg) + animNode.TotalTime = timeSeg; +} + Transport* TransportMgr::CreateTransport(uint32 entry, ObjectGuid::LowType guid /*= 0*/, Map* map /*= nullptr*/, uint8 phaseUseFlags /*= 0*/, uint32 phaseId /*= 0*/, uint32 phaseGroupId /*= 0*/) { // instance case, execute GetGameObjectEntry hook @@ -551,20 +560,50 @@ TransportSpawn const* TransportMgr::GetTransportSpawn(ObjectGuid::LowType spawnI return Trinity::Containers::MapGetValuePtr(_transportSpawns, spawnId); } -TransportAnimationEntry const* TransportAnimation::GetAnimNode(uint32 time) const +TransportAnimationEntry const* TransportAnimation::GetPrevAnimNode(uint32 time) const +{ + if (Path.empty()) + return nullptr; + + auto itr = Path.lower_bound(time); + if (itr != Path.begin()) + return std::prev(itr)->second; + + return Path.rbegin()->second; +} + +TransportRotationEntry const* TransportAnimation::GetPrevAnimRotation(uint32 time) const +{ + if (Rotations.empty()) + return nullptr; + + auto itr = Rotations.lower_bound(time); + if (itr != Rotations.begin()) + return std::prev(itr)->second; + + return Rotations.rbegin()->second; +} + +TransportAnimationEntry const* TransportAnimation::GetNextAnimNode(uint32 time) const { + if (Path.empty()) + return nullptr; + auto itr = Path.lower_bound(time); if (itr != Path.end()) return itr->second; - return nullptr; + return Path.begin()->second; } -TransportRotationEntry const* TransportAnimation::GetAnimRotation(uint32 time) const +TransportRotationEntry const* TransportAnimation::GetNextAnimRotation(uint32 time) const { + if (Rotations.empty()) + return nullptr; + auto itr = Rotations.lower_bound(time); if (itr != Rotations.end()) return itr->second; - return nullptr; + return Rotations.begin()->second; } diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 58fa2ecc807..92ce809faee 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -91,8 +91,11 @@ struct TC_GAME_API TransportAnimation std::map<uint32, TransportRotationEntry const*> Rotations; uint32 TotalTime; - TransportAnimationEntry const* GetAnimNode(uint32 time) const; - TransportRotationEntry const* GetAnimRotation(uint32 time) const; + TransportAnimationEntry const* GetPrevAnimNode(uint32 time) const; + TransportRotationEntry const* GetPrevAnimRotation(uint32 time) const; + + TransportAnimationEntry const* GetNextAnimNode(uint32 time) const; + TransportRotationEntry const* GetNextAnimRotation(uint32 time) const; }; struct TransportSpawn @@ -143,10 +146,7 @@ class TC_GAME_API TransportMgr void AddPathNodeToTransport(uint32 transportEntry, uint32 timeSeg, TransportAnimationEntry const* node); - void AddPathRotationToTransport(uint32 transportEntry, uint32 timeSeg, TransportRotationEntry const* node) - { - _transportAnimations[transportEntry].Rotations[timeSeg] = node; - } + void AddPathRotationToTransport(uint32 transportEntry, uint32 timeSeg, TransportRotationEntry const* node); // Container storing transport templates std::unordered_map<uint32, TransportTemplate> _transportTemplates; |
