From 0abdfbd2790690372f8acb242c877a0b3f40f47f Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 5 Jan 2023 17:17:13 -0500 Subject: [PATCH] Core/Vmaps: Fix inconsistency of hitInstance and hitModel to cause wrong area ids Port From (https://github.com/TrinityCore/TrinityCore/commit/6ce66659929cbd680a91dd5caa1a5957f30b0716) --- Source/Game/Collision/Maps/MapTree.cs | 6 ++++++ Source/Game/Collision/Models/GameObjectModel.cs | 4 +++- Source/Game/Collision/Models/ModelInstance.cs | 6 +++++- Source/Game/Collision/Models/WorldModel.cs | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Source/Game/Collision/Maps/MapTree.cs b/Source/Game/Collision/Maps/MapTree.cs index d57b72373..1d3dbea16 100644 --- a/Source/Game/Collision/Maps/MapTree.cs +++ b/Source/Game/Collision/Maps/MapTree.cs @@ -24,6 +24,12 @@ using System.Numerics; namespace Game.Collision { + public class GroupLocationInfo + { + public GroupModel hitModel; + public int rootId = -1; + } + public class LocationInfo { public LocationInfo() diff --git a/Source/Game/Collision/Models/GameObjectModel.cs b/Source/Game/Collision/Models/GameObjectModel.cs index dfe13f906..51a34f2a1 100644 --- a/Source/Game/Collision/Models/GameObjectModel.cs +++ b/Source/Game/Collision/Models/GameObjectModel.cs @@ -155,7 +155,9 @@ namespace Game.Collision Vector3 pModel = iInvRot.Multiply(point - iPos) * iInvScale; Vector3 zDirModel = iInvRot.Multiply(new Vector3(0.0f, 0.0f, -1.0f)); float zDist; - if (iModel.GetLocationInfo(pModel, zDirModel, out zDist, info)) + + GroupLocationInfo groupInfo = new(); + if (iModel.GetLocationInfo(pModel, zDirModel, out zDist, groupInfo)) { Vector3 modelGround = pModel + zDist * zDirModel; float world_Z = (iInvRot.Multiply(modelGround) * iScale + iPos).Z; diff --git a/Source/Game/Collision/Models/ModelInstance.cs b/Source/Game/Collision/Models/ModelInstance.cs index fc89ee473..f55da801f 100644 --- a/Source/Game/Collision/Models/ModelInstance.cs +++ b/Source/Game/Collision/Models/ModelInstance.cs @@ -194,7 +194,9 @@ namespace Game.Collision Vector3 pModel = iInvRot.Multiply(p - iPos) * iInvScale; Vector3 zDirModel = iInvRot.Multiply(new Vector3(0.0f, 0.0f, -1.0f)); float zDist; - if (iModel.GetLocationInfo(pModel, zDirModel, out zDist, info)) + + GroupLocationInfo groupInfo = new(); + if (iModel.GetLocationInfo(pModel, zDirModel, out zDist, groupInfo)) { Vector3 modelGround = pModel + zDist * zDirModel; // Transform back to world space. Note that: @@ -203,6 +205,8 @@ namespace Game.Collision float world_Z = (iInvRot.Multiply(modelGround * iScale) + iPos).Z; if (info.ground_Z < world_Z) // hm...could it be handled automatically with zDist at intersection? { + info.rootId = groupInfo.rootId; + info.hitModel = groupInfo.hitModel; info.ground_Z = world_Z; info.hitInstance = this; return true; diff --git a/Source/Game/Collision/Models/WorldModel.cs b/Source/Game/Collision/Models/WorldModel.cs index 122a763b7..1e53fabeb 100644 --- a/Source/Game/Collision/Models/WorldModel.cs +++ b/Source/Game/Collision/Models/WorldModel.cs @@ -350,7 +350,7 @@ namespace Game.Collision return false; } - public bool GetLocationInfo(Vector3 p, Vector3 down, out float dist, LocationInfo info) + public bool GetLocationInfo(Vector3 p, Vector3 down, out float dist, GroupLocationInfo info) { dist = 0f; if (groupModels.Empty())