From ee23d80815486174d93cb6326fe0967036669cc2 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 30 Sep 2026 08:52:52 -0500 Subject: [PATCH 1/3] build: 64-bit targets only CMake refuses to configure when pointers aren't 8 bytes, and dCommonVars.h asserts it, so sent and stored sizes can't silently change width. Co-Authored-By: Claude Opus 5.5 --- CMakeLists.txt | 5 +++++ README.md | 2 ++ dCommon/dEnums/dCommonVars.h | 2 ++ 3 files changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14b7c1eb5..0b1ba6eba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,11 @@ if("${CMAKE_SOURCE_DIR}" MATCHES " ") message(FATAL_ERROR "The server cannot build in the path (" ${CMAKE_SOURCE_DIR} ") because it contains a space. Please move the server to a path without spaces.") endif() +# Only 64-bit builds are supported: sent and stored values assume 64-bit pointers and sizes +if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) + message(FATAL_ERROR "The server only builds for 64-bit targets (this configuration is ${CMAKE_SIZEOF_VOID_P}-byte pointers). Use a 64-bit compiler and generator, e.g. -A x64 with Visual Studio.") +endif() + include(CTest) set(CMAKE_C_STANDARD 99) diff --git a/README.md b/README.md index 23e982680..647bc9a24 100644 --- a/README.md +++ b/README.md @@ -326,6 +326,8 @@ CREATE DATABASE darkflame; ``` ## Build the server +The server only builds for 64-bit targets; CMake refuses to configure a 32-bit build. + You can either run `build.sh` when in the root folder of the repository: ```bash diff --git a/dCommon/dEnums/dCommonVars.h b/dCommon/dEnums/dCommonVars.h index 271669e30..89946de39 100644 --- a/dCommon/dEnums/dCommonVars.h +++ b/dCommon/dEnums/dCommonVars.h @@ -14,6 +14,8 @@ #pragma warning (disable:4251) //Disables SQL warnings +static_assert(sizeof(void*) == 8, "The server only builds for 64-bit targets"); + // These are the same define, but they mean two different things in different contexts // so a different define to distinguish what calculation is happening will help clarity. #define FRAMES_TO_MS(x) (1000 / (x)) From 2a20ec5a94f6b4a91e655c5febcbe3daae7e23b6 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 30 Sep 2026 08:53:02 -0500 Subject: [PATCH 2/3] refactor(dCommon): drop the unused wchar_t SplitString wchar_t is 16-bit on Windows and 32-bit elsewhere; the game's wide strings are UTF-16 and already split through the char16_t overload. Co-Authored-By: Claude Opus 5.5 --- dCommon/GeneralUtils.cpp | 17 ----------------- dCommon/GeneralUtils.h | 2 -- 2 files changed, 19 deletions(-) diff --git a/dCommon/GeneralUtils.cpp b/dCommon/GeneralUtils.cpp index 3185c4430..a11d991a9 100644 --- a/dCommon/GeneralUtils.cpp +++ b/dCommon/GeneralUtils.cpp @@ -237,23 +237,6 @@ bool GeneralUtils::ReplaceInString(std::string& str, const std::string_view from return true; } -std::vector GeneralUtils::SplitString(const std::wstring_view str, const wchar_t delimiter) { - std::vector vector = std::vector(); - std::wstring current; - - for (const wchar_t c : str) { - if (c == delimiter) { - vector.push_back(current); - current = L""; - } else { - current += c; - } - } - - vector.push_back(std::move(current)); - return vector; -} - std::vector GeneralUtils::SplitString(const std::u16string_view str, const char16_t delimiter) { std::vector vector = std::vector(); std::u16string current; diff --git a/dCommon/GeneralUtils.h b/dCommon/GeneralUtils.h index ba5fc913b..3c2a6c950 100644 --- a/dCommon/GeneralUtils.h +++ b/dCommon/GeneralUtils.h @@ -145,8 +145,6 @@ namespace GeneralUtils { std::u16string ReadWString(RakNet::BitStream& inStream); - std::vector SplitString(const std::wstring_view str, const wchar_t delimiter); - std::vector SplitString(const std::u16string_view str, const char16_t delimiter); std::vector SplitString(const std::string_view str, const char delimiter); From 3f7d02dc717c8c5f3f5dae9a509da74b8ff13031 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 30 Sep 2026 08:53:13 -0500 Subject: [PATCH 3/3] refactor(dNavigation): fixed-width ints in the navmesh file headers They are read straight from the .bin files; int32_t is the same layout. Co-Authored-By: Claude Opus 5.5 --- dNavigation/DetourExtensions.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/dNavigation/DetourExtensions.h b/dNavigation/DetourExtensions.h index 55d3e29cb..0610cb82e 100644 --- a/dNavigation/DetourExtensions.h +++ b/dNavigation/DetourExtensions.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "Recast.h" #include "DetourCommon.h" #include "DetourNavMesh.h" @@ -9,17 +11,22 @@ static const int NAVMESHSET_MAGIC = 'M' << 24 | 'S' << 16 | 'E' << 8 | 'T'; // char[4] of 'MSET' static const int NAVMESHSET_VERSION = 1; +// Read straight from the .bin navmesh files struct NavMeshSetHeader { - int magic; - int version; - int numTiles; + int32_t magic; + int32_t version; + int32_t numTiles; dtNavMeshParams params; }; struct NavMeshTileHeader { dtTileRef tileRef; - int dataSize; + int32_t dataSize; }; +// The layout the files were always read with on 64-bit builds +static_assert(sizeof(NavMeshSetHeader) == 12 + sizeof(dtNavMeshParams)); +static_assert(sizeof(NavMeshTileHeader) == (sizeof(dtTileRef) == 8 ? 16 : 8)); + static const int MAX_POLYS = 256; static const int MAX_SMOOTH = 2048;