cmake_minimum_required(VERSION 3.20) project(dayz-memory-cpp CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # ------------------------------------------------------------------------- # Platform guard # ------------------------------------------------------------------------- if(NOT WIN32) message(FATAL_ERROR "dayz-memory-cpp is Windows-only (requires VolkDMA / WinAPI)") endif() # ------------------------------------------------------------------------- # Paths to VolkDMA (sibling checkout) # ------------------------------------------------------------------------- set(VOLKDMA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../dayz-dma/dma-dayz-cpp-master/VolkDMA") # ------------------------------------------------------------------------- # Dependencies — nlohmann/json, spdlog via FetchContent; ImGui from local copy # ------------------------------------------------------------------------- include(FetchContent) FetchContent_Declare(json URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz URL_HASH SHA256=d6c65aca6b1ed68e7a182f4757257b107ae403032760ed6ef121c9d55e81757d ) FetchContent_Declare(spdlog GIT_REPOSITORY https://github.com/gabime/spdlog.git GIT_TAG v1.14.1 GIT_SHALLOW TRUE ) # cpp-httplib — header-only HTTP/1.1 server used by WebRadarServer FetchContent_Declare(httplib URL https://github.com/yhirose/cpp-httplib/archive/refs/tags/v0.18.1.tar.gz DOWNLOAD_EXTRACT_TIMESTAMP TRUE ) # stb — single-file image load/write libraries FetchContent_Declare(stb GIT_REPOSITORY https://github.com/nothings/stb.git GIT_TAG master GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(json spdlog httplib stb) # Vendored Lumin ImGui (1.91.3 + FreeType) and its menu framework. set(LUMIN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/lumin") set(IMGUI_DIR "${LUMIN_DIR}/thirdparty/imgui") set(FREETYPE_DIR "${LUMIN_DIR}/thirdparty/freetype") set(FRAMEWORK_DIR "${LUMIN_DIR}/framework") # ------------------------------------------------------------------------- # ImGui sources (Lumin's bundled ImGui + FreeType atlas builder) # ------------------------------------------------------------------------- set(IMGUI_SOURCES "${IMGUI_DIR}/imgui.cpp" "${IMGUI_DIR}/imgui_draw.cpp" "${IMGUI_DIR}/imgui_tables.cpp" "${IMGUI_DIR}/imgui_widgets.cpp" "${IMGUI_DIR}/imgui_freetype.cpp" "${IMGUI_DIR}/backends/imgui_impl_win32.cpp" "${IMGUI_DIR}/backends/imgui_impl_dx11.cpp" ) # ------------------------------------------------------------------------- # Lumin menu framework sources (the actual menu UI) # ------------------------------------------------------------------------- set(FRAMEWORK_SOURCES "${FRAMEWORK_DIR}/gui.cpp" "${FRAMEWORK_DIR}/helpers/draw.cpp" "${FRAMEWORK_DIR}/helpers/fonts.cpp" "${FRAMEWORK_DIR}/widgets/helpers.cpp" "${FRAMEWORK_DIR}/widgets/notify.cpp" "${FRAMEWORK_DIR}/widgets/text_field.cpp" "${FRAMEWORK_DIR}/widgets/widgets.cpp" "${FRAMEWORK_DIR}/widgets/window.cpp" ) # ------------------------------------------------------------------------- # Sources — project + VolkDMA implementation files # ------------------------------------------------------------------------- file(GLOB_RECURSE PROJECT_SOURCES "src/*.cpp") # Explicit list ensures new files are picked up without a CMake cache reset. list(APPEND PROJECT_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/SigScanner/SigScanner.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/Overlay/BoneInterpolator.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/Overlay/OverlayWindow.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/Overlay/GameOverlay.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/Web/ServerPublisher.cpp" ) list(REMOVE_DUPLICATES PROJECT_SOURCES) set(VOLKDMA_SOURCES "${VOLKDMA_ROOT}/src/dma.cpp" "${VOLKDMA_ROOT}/src/process.cpp" "${VOLKDMA_ROOT}/src/inputstate.cpp" ) # ------------------------------------------------------------------------- # EmbeddedMaps stub — maps are served from the relay server, not baked into the binary. # MapTileService falls back to this when no disk PNG is found; returning # {nullptr, 0} means it will always load from maps/ on disk (or return 404). # ------------------------------------------------------------------------- set(EMBEDDED_MAPS_CPP "${CMAKE_CURRENT_BINARY_DIR}/EmbeddedMaps.cpp") file(WRITE "${EMBEDDED_MAPS_CPP}" "// Auto-generated by CMake — maps served from relay server, no embedded resources. #include \"EmbeddedMaps.h\" std::pair GetEmbeddedMap(const std::string&) { return {nullptr, 0}; } ") add_executable(dayz-memory-cpp ${PROJECT_SOURCES} ${VOLKDMA_SOURCES} ${IMGUI_SOURCES} ${FRAMEWORK_SOURCES} ) target_sources(dayz-memory-cpp PRIVATE "${EMBEDDED_MAPS_CPP}") # ------------------------------------------------------------------------- # Include directories # ------------------------------------------------------------------------- target_include_directories(dayz-memory-cpp PRIVATE # Own source tree "${CMAKE_CURRENT_SOURCE_DIR}/src" # ImGui core + Win32/DX11 backends "${IMGUI_DIR}" "${IMGUI_DIR}/backends" # FreeType headers (atlas builder) "${FREETYPE_DIR}/include" # Lumin framework root — lets sources include "framework/headers/includes.h" "${LUMIN_DIR}" "${FRAMEWORK_DIR}" # VolkDMA repo root — VolkDMA's own source files use paths like # "include/VolkDMA/dma.hh" and "external/vmm/vmmdll.h" that are # relative to this root, so this entry must come first. "${VOLKDMA_ROOT}" # VolkDMA public headers (provides etc.) "${VOLKDMA_ROOT}/include" # VolkLog (required by VolkDMA's dma.cpp / process.cpp) "${VOLKDMA_ROOT}/external/VolkLog/include" # Raw vmmdll / leechcore headers (used in VmmAccessor.cpp + VolkDMA sources) "${VOLKDMA_ROOT}/external/vmm" "${VOLKDMA_ROOT}/external/leechcore" # cpp-httplib (header-only; FetchContent populates httplib_SOURCE_DIR) "${httplib_SOURCE_DIR}" # stb (header-only image library; stb_impl.cpp provides the implementation) "${stb_SOURCE_DIR}" ) # ------------------------------------------------------------------------- # Link directories # ------------------------------------------------------------------------- target_link_directories(dayz-memory-cpp PRIVATE "${VOLKDMA_ROOT}/external/vmm" "${VOLKDMA_ROOT}/external/leechcore" ) # ------------------------------------------------------------------------- # Link libraries # ------------------------------------------------------------------------- target_link_libraries(dayz-memory-cpp PRIVATE nlohmann_json::nlohmann_json spdlog::spdlog vmm leechcore # FreeType (prebuilt x64) — Lumin font atlas builder "${FREETYPE_DIR}/win64/freetype.lib" # DirectX 11 + DXGI (for ImGui DX11 window) d3d11 dxgi # WinSock2 — required by cpp-httplib on Windows Ws2_32 ) # ------------------------------------------------------------------------- # Post-build: copy VolkDMA runtime DLLs next to the executable. # Without these (vmm.dll, leechcore.dll, FTD3XX.dll) the process exits with # 0xC0000135 (STATUS_DLL_NOT_FOUND) immediately on launch. # ------------------------------------------------------------------------- set(VOLKDMA_DLLS_DIR "${VOLKDMA_ROOT}/dlls") foreach(DLL vmm.dll leechcore.dll FTD3XX.dll) add_custom_command(TARGET dayz-memory-cpp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${VOLKDMA_DLLS_DIR}/${DLL}" "$/${DLL}" COMMENT "Copying ${DLL} to output directory" ) endforeach() # Copy webroot/ directory next to the executable so the HTTP server can serve it. add_custom_command(TARGET dayz-memory-cpp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/webroot" "$/webroot" COMMENT "Copying webroot to output directory" ) # Copy the Lumin icon font next to the executable so the menu's tab icons load # (flaticon_uicons_regular_rounded_path is resolved relative to the work dir). add_custom_command(TARGET dayz-memory-cpp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${FRAMEWORK_DIR}/data/uicons" "$/data/uicons" COMMENT "Copying Lumin uicons font to output directory" ) # Copy config/ directory next to the executable (config.cfg, item_filters.json). add_custom_command(TARGET dayz-memory-cpp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/config" "$/config" COMMENT "Copying config to output directory" ) # Copy maps/ directory next to the executable so MapTileService can find PNGs. # maps/ is git-ignored (user-supplied), so only copy when it exists. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/maps") add_custom_command(TARGET dayz-memory-cpp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/maps" "$/maps" COMMENT "Copying maps to output directory" ) endif() # Copy data/processed/ next to the executable so the 3D HTTP routes can serve it. # Only copy when the directory exists (requires running: py -m dayzmap fakedata). if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data/processed") add_custom_command(TARGET dayz-memory-cpp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/data/processed" "$/data/processed" COMMENT "Copying processed map data to output directory" ) endif() # ------------------------------------------------------------------------- # Compiler definitions # ------------------------------------------------------------------------- target_compile_definitions(dayz-memory-cpp PRIVATE _WIN32_WINNT=0x0601 # Build the ImGui font atlas with FreeType (Lumin requirement; also set in # the vendored imconfig.h, kept here so every TU agrees). IMGUI_ENABLE_FREETYPE IMGUI_DEFINE_MATH_OPERATORS # WIN32_LEAN_AND_MEAN is intentionally NOT set globally: vmmdll.h requires # NTSTATUS from , which windows.h omits when LEAN_AND_MEAN is # defined. Our own headers define it locally before including . NOMINMAX ) # ------------------------------------------------------------------------- # MSVC-specific flags # ------------------------------------------------------------------------- if(MSVC) target_compile_options(dayz-memory-cpp PRIVATE /W4 /WX- # vmmdll / VolkDMA headers generate some W4 noise /permissive- /utf-8 ) endif()