Skip to content

Commit

Permalink
Show navmesh merge warnings when creating triangles and quads
Browse files Browse the repository at this point in the history
  • Loading branch information
lStewieAl committed Jan 5, 2025
1 parent e8e2281 commit 33bc5a8
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 13 deletions.
1 change: 1 addition & 0 deletions GECKUtility.h
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,7 @@ struct NavMeshManager

static NavMeshManager* GetSingleton();
static bool IsActive();
bool HasMultipleNavmeshesSelected();
};

enum WindowMessages
Expand Down
17 changes: 17 additions & 0 deletions GeckUtility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<HWND>* OpenWindows::GetWindowList() { return (tList<HWND>*)0xED033C; }

Expand Down
7 changes: 7 additions & 0 deletions Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
38 changes: 25 additions & 13 deletions Main.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "";
Expand Down

0 comments on commit 33bc5a8

Please sign in to comment.