aboutsummaryrefslogtreecommitdiff
path: root/src/common/Collision/Models/GameObjectModel.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2018-03-28 22:01:22 +0200
committerShauren <shauren.trinity@gmail.com>2020-06-27 20:23:30 +0200
commit0468c70dfe91794ad272594323dd7feb611d0a93 (patch)
treebb623c775fe215e4c0867fb2efa4bda0b360f7ec /src/common/Collision/Models/GameObjectModel.cpp
parent54c701cf0db81c0062e8c5020e07db18984d0ffa (diff)
Core/Maps: Implemented getting area id from gameobject spawns
Yes, you can now spawn LK platform anywhere and it will treat you as inside Icecrown Citadel (cherry picked from commit 42f9deb21ec68e169f7ed1c8cf14092f144b22da)
Diffstat (limited to 'src/common/Collision/Models/GameObjectModel.cpp')
-rw-r--r--src/common/Collision/Models/GameObjectModel.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/common/Collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp
index 54b48714c90..2c95187fbb2 100644
--- a/src/common/Collision/Models/GameObjectModel.cpp
+++ b/src/common/Collision/Models/GameObjectModel.cpp
@@ -146,6 +146,7 @@ bool GameObjectModel::initialize(std::unique_ptr<GameObjectModelOwnerBase> model
#endif
owner = std::move(modelOwner);
+ isWmo = it->second.isWmo;
return true;
}
@@ -183,6 +184,69 @@ bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool Sto
return hit;
}
+void GameObjectModel::intersectPoint(G3D::Vector3 const& point, VMAP::AreaInfo& info, uint32 ph_mask) const
+{
+ if (!(phasemask & ph_mask) || !owner->IsSpawned() || !isMapObject())
+ return;
+
+ if (!iBound.contains(point))
+ return;
+
+ // child bounds are defined in object space:
+ Vector3 pModel = iInvRot * (point - iPos) * iInvScale;
+ Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f);
+ float zDist;
+ if (iModel->IntersectPoint(pModel, zDirModel, zDist, info))
+ {
+ Vector3 modelGround = pModel + zDist * zDirModel;
+ float world_Z = ((modelGround * iInvRot) * iScale + iPos).z;
+ if (info.ground_Z < world_Z)
+ info.ground_Z = world_Z;
+ }
+}
+
+bool GameObjectModel::GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationInfo& info, uint32 ph_mask) const
+{
+ if (!(phasemask & ph_mask) || !owner->IsSpawned() || !isMapObject())
+ return false;
+
+ if (!iBound.contains(point))
+ return false;
+
+ // child bounds are defined in object space:
+ Vector3 pModel = iInvRot * (point - iPos) * iInvScale;
+ Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f);
+ float zDist;
+ if (iModel->GetLocationInfo(pModel, zDirModel, zDist, info))
+ {
+ Vector3 modelGround = pModel + zDist * zDirModel;
+ float world_Z = ((modelGround * iInvRot) * iScale + iPos).z;
+ if (info.ground_Z < world_Z)
+ {
+ info.ground_Z = world_Z;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool GameObjectModel::GetLiquidLevel(G3D::Vector3 const& point, VMAP::LocationInfo& info, float& liqHeight) const
+{
+ // child bounds are defined in object space:
+ Vector3 pModel = iInvRot * (point - iPos) * iInvScale;
+ //Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f);
+ float zDist;
+ if (info.hitModel->GetLiquidLevel(pModel, zDist))
+ {
+ // calculate world height (zDist in model coords):
+ // assume WMO not tilted (wouldn't make much sense anyway)
+ liqHeight = zDist * iScale + iPos.z;
+ return true;
+ }
+ return false;
+}
+
bool GameObjectModel::UpdatePosition()
{
if (!iModel)