From 378df25d4cc15c32270ca3f2ae6176920d02ac7c Mon Sep 17 00:00:00 2001 From: Amos Date: Thu, 24 Mar 2022 16:31:53 +0100 Subject: [PATCH] Fix struct padding for AIN Small fixes --- r5dev/game/server/ai_networkmanager.cpp | 23 +++++++++++++++-------- r5dev/game/server/ai_node.h | 6 ++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/r5dev/game/server/ai_networkmanager.cpp b/r5dev/game/server/ai_networkmanager.cpp index cf0ed299..698ec244 100644 --- a/r5dev/game/server/ai_networkmanager.cpp +++ b/r5dev/game/server/ai_networkmanager.cpp @@ -34,7 +34,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork) std::string svMeshDir = "maps\\navmesh\\"; std::string svGraphDir = "maps\\graphs\\"; - std::filesystem::path fsMeshPath(svMeshDir + g_pHostState->m_levelName + "_" + HULL_SIZE[4] + ".nm"); + std::filesystem::path fsMeshPath(svMeshDir + g_pHostState->m_levelName + "_" + HULL_SIZE[3] + ".nm"); std::filesystem::path fsGraphPath(svGraphDir + g_pHostState->m_levelName + ".ain"); CFastTimer masterTimer; @@ -117,7 +117,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork) memcpy(diskNode.unk6, pNetwork->m_pAInode[i]->unk10, sizeof(diskNode.unk6)); - DevMsg(eDLL_T::SERVER, " |-- Copying node '%d' from '%p' to '0x%llx'\n", pNetwork->m_pAInode[i]->m_nIndex, reinterpret_cast(pNetwork->m_pAInode[i]), static_cast(writeStream.tellp())); + DevMsg(eDLL_T::SERVER, " |-- Copying node '#%d' from '%p' to '0x%llx'\n", pNetwork->m_pAInode[i]->m_nIndex, reinterpret_cast(pNetwork->m_pAInode[i]), static_cast(writeStream.tellp())); writeStream.write(reinterpret_cast(&diskNode), sizeof(CAI_NodeDisk)); nCalculatedLinkcount += pNetwork->m_pAInode[i]->m_nNumLinks; @@ -175,7 +175,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork) // Don't know what this is, it's likely a block from tf1 that got deprecated? should just be 1 int per node. DevMsg(eDLL_T::SERVER, " |-- Writing '%d' bytes for unknown block at '0x%llx'\n", pNetwork->m_iNumNodes * sizeof(uint32_t), static_cast(writeStream.tellp())); - if (pNetwork->m_iNumNodes > 0) + if (static_cast(pNetwork->m_iNumNodes) > 0) { uint32_t* unkNodeBlock = new uint32_t[pNetwork->m_iNumNodes]; memset(&unkNodeBlock, '\0', pNetwork->m_iNumNodes * sizeof(uint32_t)); @@ -205,7 +205,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork) writeStream.write(reinterpret_cast(g_nAiNodeClusters), sizeof(*g_nAiNodeClusters)); for (int i = 0; i < *g_nAiNodeClusters; i++) { - DevMsg(eDLL_T::SERVER, " |-- Writing cluster '%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); + DevMsg(eDLL_T::SERVER, " |-- Writing cluster '#%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); AINodeClusters* nodeClusters = (*g_pppAiNodeClusters)[i]; writeStream.write(reinterpret_cast(&nodeClusters->m_nIndex), sizeof(nodeClusters->m_nIndex)); @@ -242,7 +242,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork) for (int i = 0; i < *g_nAiNodeClusterLinks; i++) { // Disk and memory structs are literally identical here so just directly write. - DevMsg(eDLL_T::SERVER, " |-- Writing cluster link '%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); + DevMsg(eDLL_T::SERVER, " |-- Writing cluster link '#%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); writeStream.write(reinterpret_cast((*g_pppAiNodeClusterLinks)[i]), sizeof(*(*g_pppAiNodeClusterLinks)[i])); } @@ -260,8 +260,15 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork) for (int i = 0; i < pNetwork->m_iNumScriptNodes; i++) { // Disk and memory structs for script nodes are identical. - DevMsg(eDLL_T::SERVER, " |-- Writing script node '%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); - writeStream.write(reinterpret_cast(&pNetwork->m_ScriptNode[i]), sizeof(pNetwork->m_ScriptNode[i])); + DevMsg(eDLL_T::SERVER, " |-- Writing script node '#%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); + if (!IsBadReadPtrV2(reinterpret_cast(&pNetwork->m_ScriptNode[i]))) + { + writeStream.write(reinterpret_cast(&pNetwork->m_ScriptNode[i]), sizeof(CAI_ScriptNode)); + } + else + { + Warning(eDLL_T::SERVER, " |-- Unable to write node '#%d' (invalid pointer)\n", i, pNetwork->m_iNumScriptNodes); + } } timer.End(); @@ -273,7 +280,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork) writeStream.write(reinterpret_cast(&pNetwork->m_iNumHints), sizeof(pNetwork->m_iNumHints)); for (int i = 0; i < pNetwork->m_iNumHints; i++) { - DevMsg(eDLL_T::SERVER, " |-- Writing hint data '%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); + DevMsg(eDLL_T::SERVER, " |-- Writing hint data '#%d' at '0x%llx'\n", i, static_cast(writeStream.tellp())); writeStream.write(reinterpret_cast(&pNetwork->m_Hints[i]), sizeof(pNetwork->m_Hints[i])); } diff --git a/r5dev/game/server/ai_node.h b/r5dev/game/server/ai_node.h index c31389e3..7cba5e52 100644 --- a/r5dev/game/server/ai_node.h +++ b/r5dev/game/server/ai_node.h @@ -7,6 +7,7 @@ #include "mathlib/vector.h" constexpr int MAX_HULLS = 5; +#pragma pack(push, 1) //============================================================================= // >> CAI_NodeLink //============================================================================= @@ -24,7 +25,6 @@ struct CAI_NodeLink //============================================================================= // >> CAI_NodeLinkDisk //============================================================================= -#pragma pack(push, 1) struct CAI_NodeLinkDisk { short m_iSrcID; @@ -32,7 +32,6 @@ struct CAI_NodeLinkDisk char unk0; bool m_bHulls[MAX_HULLS]; }; -#pragma pack(pop) //============================================================================= // >> CAI_Node @@ -67,7 +66,6 @@ struct CAI_Node //============================================================================= // >> CAI_NodeDisk //============================================================================= -#pragma pack(push, 1) struct CAI_NodeDisk // The way CAI_Nodes are represented in on-disk ain files { Vector3 m_vOrigin; @@ -83,7 +81,6 @@ struct CAI_NodeDisk // The way CAI_Nodes are represented in on-disk ain files short unk5; char unk6[8]; }; // Total size of 68 bytes -#pragma pack(pop) //============================================================================= // >> CAI_ScriptNode @@ -126,3 +123,4 @@ struct AINodeClusterLinks char unk4; char unk5; }; +#pragma pack(pop)