Fix street sign interaction text and M2 sign orientation

Add page-text support for sign-like gameobject interactions by handling SMSG_GAMEOBJECT_PAGETEXT and SMSG_PAGE_TEXT_QUERY_RESPONSE, and issuing CMSG_PAGE_TEXT_QUERY when page IDs are available from cached GO template data.

Normalize received page text tokens before chat display and add a fallback for basic signpost GO type clicks to print sign names when no page data is present.

Correct M2 gameobject yaw alignment for signposts/arrows by applying render-space -90deg offset consistently across spawn, position update, and move-callback transforms; keep WMO orientation path unchanged.
This commit is contained in:
Kelsi 2026-02-20 23:31:30 -08:00
parent ace24e8ccc
commit c04e97e375
5 changed files with 118 additions and 5 deletions

View file

@ -1720,7 +1720,7 @@ void Application::setupUICallbacks() {
if (auto* mr = renderer->getM2Renderer()) {
glm::mat4 transform(1.0f);
transform = glm::translate(transform, renderPos);
transform = glm::rotate(transform, orientation, glm::vec3(0, 0, 1));
transform = glm::rotate(transform, orientation - glm::radians(90.0f), glm::vec3(0, 0, 1));
mr->setInstanceTransform(info.instanceId, transform);
}
}
@ -5420,7 +5420,9 @@ void Application::spawnOnlineGameObject(uint64_t guid, uint32_t entry, uint32_t
if (auto* mr = renderer->getM2Renderer()) {
glm::mat4 transform(1.0f);
transform = glm::translate(transform, renderPos);
transform = glm::rotate(transform, orientation, glm::vec3(0, 0, 1));
// M2 gameobjects use model-forward alignment like character M2s.
// Apply -90deg in render space to match world-facing orientation.
transform = glm::rotate(transform, orientation - glm::radians(90.0f), glm::vec3(0, 0, 1));
mr->setInstanceTransform(info.instanceId, transform);
}
}
@ -5474,7 +5476,8 @@ void Application::spawnOnlineGameObject(uint64_t guid, uint32_t entry, uint32_t
bool isWmo = lowerPath.size() >= 4 && lowerPath.substr(lowerPath.size() - 4) == ".wmo";
glm::vec3 renderPos = core::coords::canonicalToRender(glm::vec3(x, y, z));
float renderYaw = orientation;
const float renderYawWmo = orientation;
const float renderYawM2 = orientation - glm::radians(90.0f);
bool loadedAsWmo = false;
if (isWmo) {
@ -5545,7 +5548,7 @@ void Application::spawnOnlineGameObject(uint64_t guid, uint32_t entry, uint32_t
if (loadedAsWmo) {
uint32_t instanceId = wmoRenderer->createInstance(modelId, renderPos,
glm::vec3(0.0f, 0.0f, renderYaw), 1.0f);
glm::vec3(0.0f, 0.0f, renderYawWmo), 1.0f);
if (instanceId == 0) {
LOG_WARNING("Failed to create gameobject WMO instance for guid 0x", std::hex, guid, std::dec);
return;
@ -5640,7 +5643,7 @@ void Application::spawnOnlineGameObject(uint64_t guid, uint32_t entry, uint32_t
}
uint32_t instanceId = m2Renderer->createInstance(modelId, renderPos,
glm::vec3(0.0f, 0.0f, renderYaw), 1.0f);
glm::vec3(0.0f, 0.0f, renderYawM2), 1.0f);
if (instanceId == 0) {
LOG_WARNING("Failed to create gameobject instance for guid 0x", std::hex, guid, std::dec);
return;