aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-25 22:14:32 +0200
committerShauren <shauren.trinity@gmail.com>2022-05-25 22:14:32 +0200
commit630b60eb0dcd3d9ce41582664ab822b049365431 (patch)
treeb5d60fe41ca49846524ddbc7f9409194b76e7849 /src/server/game/Maps
parent3031fbb63bfb2df2aa041bd9c04c5c42b0c07c05 (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.cpp12
-rw-r--r--src/server/game/Maps/TransportMgr.cpp47
-rw-r--r--src/server/game/Maps/TransportMgr.h12
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;