cmake_minimum_required(VERSION 3.25) project(AutoPOE2_Core LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Compiler flags for Clang on Windows if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options( -Wall -Wextra -Wno-unused-parameter -mavx2 -mfma -O2 ) endif() # Compiler and Linker flags for MSVC (TASK-OPT-19) if (MSVC) add_compile_options( /W4 /permissive- /Zc:__cplusplus /utf-8 /GS /guard:cf ) add_link_options( /guard:cf /DYNAMICBASE /NXCOMPAT /HIGHENTROPYVA ) endif() # ---------------------------------------------------------- # AddressSanitizer (ASan) configuration (TASK-UPGRADE-TECH-TOOLCHAIN-20260907) # ---------------------------------------------------------- option(ENABLE_ASAN "Enable AddressSanitizer (ASan) for memory error detection" OFF) if (ENABLE_ASAN) message(STATUS "AddressSanitizer (ASan) is ENABLED") if (MSVC) add_compile_options(/fsanitize=address) elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") add_compile_options(-fsanitize=address -fno-omit-frame-pointer) add_link_options(-fsanitize=address) endif() endif() # ---------------------------------------------------------- # AutoPOE2 Core Static Library (TASK-OPT-18) # Dùng chung giữa AutoPOE2_Core, AutoPOE2_Tests và AutoPOE2_MemProbe # ---------------------------------------------------------- set(CORE_LIB_SOURCES src/core/ipc/shared_memory.cpp src/core/input/kmbox_net.cpp src/core/input/human_curve.cpp src/core/input/non_blocking_actuator.cpp src/core/sensor/log_sensor.cpp src/core/memory/rpm_reader.cpp src/core/memory/aob_scanner.cpp src/core/memory/pe_fingerprint.cpp src/core/memory/offset_registry.cpp src/core/memory/registry_live_label.cpp src/core/memory/vitals_fingerprint.cpp src/core/memory/simulated_reader.cpp src/core/memory/pointer_chain_resolver.cpp src/core/memory/entity_manager.cpp src/core/memory/player_finder.cpp src/core/memory/terrain_reader.cpp src/core/combat/reflex_manager.cpp src/core/combat/combo_manager.cpp src/core/combat/kiting_engine.cpp src/core/combat/stutter_step_controller.cpp src/core/combat/boss_phase_controller.cpp src/core/looting/loot_controller.cpp src/core/navigation/movement_controller.cpp src/core/navigation/quest_navigator.cpp src/core/navigation/terrain_grid.cpp src/core/navigation/pathfinder.cpp src/core/navigation/town_quest_engine.cpp src/core/overlay.cpp src/core/game_session.cpp src/core/autologin/auto_login.cpp src/core/brain/bot_brain.cpp src/core/brain/area_events.cpp src/core/brain/inventory_handler.cpp src/core/brain/unstuck_handler.cpp src/core/combat/skills_table.cpp src/core/combat/skill_engine.cpp src/core/brain/map_device_handler.cpp src/core/brain/character_fsm.cpp src/core/brain/npc_interaction_handler.cpp src/core/common/window_utils.cpp src/core/navigation/navmesh_bitset_fusion.cpp src/core/memory/simd_signature_scanner.cpp src/core/looting/loot_density_clusterer.cpp src/core/combat/predictive_aim_controller.cpp src/core/input/quintic_bezier_controller.cpp src/core/input/humanized_input_arbiter.cpp src/core/combat/telegraph_evasion_arbiter.cpp src/core/combat/monster_pack_clusterer.cpp ) add_library(AutoPOE2_Core_Lib STATIC ${CORE_LIB_SOURCES}) target_include_directories(AutoPOE2_Core_Lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/core ) target_link_libraries(AutoPOE2_Core_Lib PUBLIC ws2_32 user32 kernel32 gdi32 winmm psapi ) # ---------------------------------------------------------- # AutoPOE2_Core Executable # ---------------------------------------------------------- add_executable(AutoPOE2_Core src/core/main.cpp) target_link_libraries(AutoPOE2_Core PRIVATE AutoPOE2_Core_Lib) if (MSVC) target_link_options(AutoPOE2_Core PRIVATE "/MANIFEST:EMBED" "/MANIFESTUAC:level='asInvoker' uiAccess='false'") endif() # ---------------------------------------------------------- # Bộ kiểm thử đơn vị (Unit Tests) - chạy bằng ctest # ---------------------------------------------------------- enable_testing() add_executable(AutoPOE2_Tests tests/test_core.cpp tests/test_protocol_ipc.cpp tests/test_memory_engine.cpp tests/test_combat_reflex.cpp tests/test_navigation.cpp tests/test_brain_fsm.cpp tests/test_window_utils.cpp tests/test_perception_upgrades.cpp tests/test_predictive_aim_and_humanized_input.cpp tests/test_telegraph_evasion.cpp tests/test_pack_clearing_and_map_clear.cpp ) target_link_libraries(AutoPOE2_Tests PRIVATE AutoPOE2_Core_Lib) if (MSVC) target_link_options(AutoPOE2_Tests PRIVATE "/MANIFEST:EMBED" "/MANIFESTUAC:level='asInvoker' uiAccess='false'") endif() add_test(NAME CoreUnitTests COMMAND AutoPOE2_Tests) set_tests_properties(CoreUnitTests PROPERTIES WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) # ---------------------------------------------------------- # MemProbe - cong cu do offset tren client that (tu nhac UAC) # ---------------------------------------------------------- add_executable(AutoPOE2_MemProbe tools/memprobe.cpp) target_link_libraries(AutoPOE2_MemProbe PRIVATE AutoPOE2_Core_Lib) # ---------------------------------------------------------- # AutoPOE2 Master Launcher (1-Click Unified Executable) # ---------------------------------------------------------- add_executable(AutoPOE2 src/launcher/main.cpp) target_link_libraries(AutoPOE2 PRIVATE shell32 user32) # ---------------------------------------------------------- # Xuất file thực thi # ---------------------------------------------------------- set_target_properties(AutoPOE2 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR} RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR} ) set_target_properties(AutoPOE2_Core AutoPOE2_MemProbe PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin/Release ) add_custom_command(TARGET AutoPOE2_Core POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${CMAKE_SOURCE_DIR}/bin/AutoPOE2_Core.exe COMMENT "Synchronizing AutoPOE2_Core.exe to bin/..." ) add_custom_command(TARGET AutoPOE2_MemProbe POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${CMAKE_SOURCE_DIR}/bin/AutoPOE2_MemProbe.exe COMMENT "Synchronizing AutoPOE2_MemProbe.exe to bin/..." ) set_target_properties(AutoPOE2_Tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) add_custom_command(TARGET AutoPOE2_Tests POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${CMAKE_SOURCE_DIR}/bin/Release/AutoPOE2_Tests.exe COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${CMAKE_SOURCE_DIR}/bin/AutoPOE2_Tests.exe COMMENT "Synchronizing AutoPOE2_Tests.exe to bin/Release and bin/..." ) # ---------------------------------------------------------- # Pre-Build Self-Defense: Terminate running binaries (Rule 15) # ---------------------------------------------------------- if (WIN32) add_custom_command(TARGET AutoPOE2_Core PRE_BUILD COMMAND cmd /c "taskkill /F /IM AutoPOE2_Core.exe >nul 2>&1 || exit 0" COMMENT "Pre-build: Terminating existing AutoPOE2_Core.exe instances to prevent file lock LNK1104..." ) add_custom_command(TARGET AutoPOE2_Tests PRE_BUILD COMMAND cmd /c "taskkill /F /IM AutoPOE2_Tests.exe >nul 2>&1 || exit 0" COMMENT "Pre-build: Terminating existing AutoPOE2_Tests.exe instances to prevent file lock LNK1104..." ) add_custom_command(TARGET AutoPOE2_MemProbe PRE_BUILD COMMAND cmd /c "taskkill /F /IM AutoPOE2_MemProbe.exe >nul 2>&1 || exit 0" COMMENT "Pre-build: Terminating existing AutoPOE2_MemProbe.exe instances to prevent file lock LNK1104..." ) add_custom_command(TARGET AutoPOE2 PRE_BUILD COMMAND cmd /c "taskkill /F /IM AutoPOE2.exe >nul 2>&1 || exit 0" COMMENT "Pre-build: Terminating existing AutoPOE2.exe instances to prevent file lock LNK1104..." ) endif()