From 33bc5a8d7321388af4f95678e894e5dd82eb037c Mon Sep 17 00:00:00 2001 From: lStewieAl Date: Sun, 5 Jan 2025 19:41:28 +0000 Subject: [PATCH] Show navmesh merge warnings when creating triangles and quads --- GECKUtility.h | 1 + GeckUtility.cpp | 17 +++++++++++++++++ Main.cpp | 7 +++++++ Main.h | 38 +++++++++++++++++++++++++------------- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/GECKUtility.h b/GECKUtility.h index 4c543e6..5ff98ca 100644 --- a/GECKUtility.h +++ b/GECKUtility.h @@ -413,6 +413,7 @@ struct NavMeshManager static NavMeshManager* GetSingleton(); static bool IsActive(); + bool HasMultipleNavmeshesSelected(); }; enum WindowMessages diff --git a/GeckUtility.cpp b/GeckUtility.cpp index 053d202..497ced3 100644 --- a/GeckUtility.cpp +++ b/GeckUtility.cpp @@ -210,6 +210,23 @@ NavMeshManager* NavMeshManager::GetSingleton() { return (NavMeshManager*)0xECEFF bool NavMeshManager::IsActive() { return *(bool**)0xED1412; } void NavMeshManager::Undo() { ThisCall(0x4249F0, this); } +bool NavMeshManager::HasMultipleNavmeshesSelected() +{ + NavMesh* UNSET_MESH = (NavMesh*)-1; + NavMesh* navMesh = UNSET_MESH; + for (int i = 0, n = arrayData.vertices.size; i < n; ++i) + { + if (auto vertex = arrayData.vertices.data[i]) + { + if (navMesh == UNSET_MESH) navMesh = vertex->navMesh; + else if (navMesh != vertex->navMesh) + { + return true; + } + } + } + return false; +} tList* OpenWindows::GetWindowList() { return (tList*)0xED033C; } diff --git a/Main.cpp b/Main.cpp index af2ed85..19e7973 100644 --- a/Main.cpp +++ b/Main.cpp @@ -1001,6 +1001,13 @@ bool NVSEPlugin_Load(const NVSEInterface* nvse) // show a warning when merging vertices from different navmeshes WriteRelCall(0x40AAA7, UInt32(NavMeshManager__OnMergeVertices)); WriteRelCall(0x457E23, UInt32(NavMeshManager__OnMergeVertices)); + WriteRelCall(0x40A9FF, UInt32(NavMeshManager__OnCreateTriangle)); + WriteRelCall(0x4288AC, UInt32(NavMeshManager__OnCreateTriangle)); + WriteRelCall(0x4298CE, UInt32(NavMeshManager__OnCreateTriangle)); + WriteRelCall(0x456FBF, UInt32(NavMeshManager__OnCreateTriangle)); + WriteRelCall(0x4288BF, UInt32(NavMeshManager__OnCreateQuad)); + WriteRelCall(0x40AA20, UInt32(NavMeshManager__OnCreateQuad)); + WriteRelCall(0x456FD9, UInt32(NavMeshManager__OnCreateQuad)); // clear the 'Creating Editor NavMeshes' print when it's done WriteRelJump(0x42216C, UInt32(NavMeshManager__PostRenderCellClearPrintHook)); diff --git a/Main.h b/Main.h index 4803d6c..c4927ca 100644 --- a/Main.h +++ b/Main.h @@ -3893,31 +3893,43 @@ bool OnMoveRefCheckXYZHeld() void __fastcall NavMeshManager__OnMergeVertices(NavMeshManager* navMeshManager) { - bool isMergingDifferentRecords = false; - NavMesh* UNSET_MESH = (NavMesh*)-1; - NavMesh* navMesh = UNSET_MESH; - for (int i = 0, n = navMeshManager->arrayData.vertices.size; i < n; ++i) + if (navMeshManager->HasMultipleNavmeshesSelected()) { - if (auto vertex = navMeshManager->arrayData.vertices.data[i]) + if (MessageBoxA(g_MainHwnd, "You are about to merge Navmesh records which will cause one to be deleted, do you wish to proceed?", "Geck Extender", MB_YESNOCANCEL) != IDYES) { - if (navMesh == UNSET_MESH) navMesh = vertex->navMesh; - else if (navMesh != vertex->navMesh) - { - isMergingDifferentRecords = true; - break; - } + return; } } - if (isMergingDifferentRecords) + ThisCall(0x4267B0, navMeshManager); +} + +void __fastcall NavMeshManager__OnCreateTriangle(NavMeshManager* navMeshManager) +{ + if (navMeshManager->HasMultipleNavmeshesSelected()) { if (MessageBoxA(g_MainHwnd, "You are about to merge Navmesh records which will cause one to be deleted, do you wish to proceed?", "Geck Extender", MB_YESNOCANCEL) != IDYES) { return; } } - ThisCall(0x4267B0, navMeshManager); + + ThisCall(0x427650, navMeshManager); } + +void __fastcall NavMeshManager__OnCreateQuad(NavMeshManager* navMeshManager, void* edx, char a2) +{ + if (navMeshManager->HasMultipleNavmeshesSelected()) + { + if (MessageBoxA(g_MainHwnd, "You are about to merge Navmesh records which will cause one to be deleted, do you wish to proceed?", "Geck Extender", MB_YESNOCANCEL) != IDYES) + { + return; + } + } + + ThisCall(0x427770, navMeshManager, a2); +} + __HOOK NavMeshManager__PostRenderCellClearPrintHook() { static const char* EmptyString = "";