diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-11-06 19:42:17 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-11-06 19:42:17 +0100 |
| commit | 6a767c3bd65fa552f6f39b88f7515ebe3f19641f (patch) | |
| tree | 063791c96c7f6802c3c6dd2f290b9010612c0d8b /src/server/game/Entities/GameObject | |
| parent | 556505d59acb2d0badd3f4524f45bf16489c2dd5 (diff) | |
Core/MMaps: Implemented dynamic mmap tile rebuilding for destructible objects
Diffstat (limited to 'src/server/game/Entities/GameObject')
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index e09930d9fd1..3102dac861e 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -4014,7 +4014,7 @@ void GameObject::UpdateModel() modelCollisionEnabled = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState() == GO_READY : (GetGoState() == GO_STATE_READY || IsTransport()); RemoveFlag(GO_FLAG_MAP_OBJECT); - m_model = nullptr; + std::unique_ptr<GameObjectModel> oldModel = std::exchange(m_model, nullptr); CreateModel(); if (m_model) @@ -4023,6 +4023,23 @@ void GameObject::UpdateModel() if (modelCollisionEnabled) m_model->EnableCollision(modelCollisionEnabled); } + + switch (GetGoType()) + { + // Only update navmesh when display id changes and not on spawn + // default state of destructible buildings is intended to be baked in the mesh produced by mmaps_generator + case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING: + case GAMEOBJECT_TYPE_TRAPDOOR: + case GAMEOBJECT_TYPE_PHASEABLE_MO: + case GAMEOBJECT_TYPE_SIEGEABLE_MO: + if (m_model) + GetMap()->RequestRebuildNavMeshOnGameObjectModelChange(*m_model, GetPhaseShift()); + else if (oldModel) + GetMap()->RequestRebuildNavMeshOnGameObjectModelChange(*oldModel, GetPhaseShift()); + break; + default: + break; + } } bool GameObject::IsLootAllowedFor(Player const* player) const @@ -4499,6 +4516,7 @@ public: bool IsInPhase(PhaseShift const& phaseShift) const override { return _owner->GetPhaseShift().CanSee(phaseShift); } G3D::Vector3 GetPosition() const override { return G3D::Vector3(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); } G3D::Quat GetRotation() const override { return G3D::Quat(_owner->GetLocalRotation().x, _owner->GetLocalRotation().y, _owner->GetLocalRotation().z, _owner->GetLocalRotation().w); } + int64 GetPackedRotation() const override { return _owner->GetPackedLocalRotation(); } float GetScale() const override { return _owner->GetObjectScale(); } void DebugVisualizeCorner(G3D::Vector3 const& corner) const override { _owner->SummonCreature(1, corner.x, corner.y, corner.z, 0, TEMPSUMMON_MANUAL_DESPAWN); } @@ -4538,8 +4556,20 @@ void GameObject::CreateModel() if (m_model->IsMapObject()) SetFlag(GO_FLAG_MAP_OBJECT); - if (GetGoType() == GAMEOBJECT_TYPE_DOOR) - m_model->DisableLosBlocking(GetGOInfo()->door.NotLOSBlocking); + switch (GetGoType()) + { + case GAMEOBJECT_TYPE_DOOR: + m_model->DisableLosBlocking(GetGOInfo()->door.NotLOSBlocking); + break; + case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING: + case GAMEOBJECT_TYPE_TRAPDOOR: + case GAMEOBJECT_TYPE_PHASEABLE_MO: + case GAMEOBJECT_TYPE_SIEGEABLE_MO: + m_model->IncludeInNavMesh(true); + break; + default: + break; + } } } |
