diff --git a/.gitignore b/.gitignore
index fd81b92bc..89dd521c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,6 +27,12 @@ install_manifest.txt
log/
logs/
vcpkg/
+perl/
.idea/*
-*cbp
\ No newline at end of file
+*cbp
+
+submodules/*
+cmake-build-debug/
+
+.nfs.*
\ No newline at end of file
diff --git a/BUILD.md b/BUILD.md
new file mode 100644
index 000000000..1cc3cd99b
--- /dev/null
+++ b/BUILD.md
@@ -0,0 +1,64 @@
+# Guide To Building From Source Without Installer
+
+This guide is far from exhaustive, you should expect to have some experience with building C++ code before considering compiling the code from scratch. You should instead consider using the installer scripts if you don't want to hack on the code directly.
+
+### CMake
+
+EQEmu uses CMake as the build system on all platforms. You will need CMake 3.2 or higher to build from source.
+
+### Dependencies
+
+The following libraries are required to build from source:
+- [boost](https://www.boost.org/ "boost")
+- [zlib](https://www.zlib.net/ "zlib") (If not included the source will build [zlib-ng](https://github.com/zlib-ng/zlib-ng "zlib-ng") instead)
+- [libmysql](https://dev.mysql.com/downloads/connector/c/ "libmysql") or [libmariadb](https://github.com/MariaDB/mariadb-connector-c "libmariadb")
+
+The following libraries are not strictly required but in many cased recommended.
+- [OpenSSL](https://www.openssl.org/ "OpenSSL") or [mbedTLS](https://tls.mbed.org/ "mbedTLS") (Required for the loginserver and headless client)
+- [libsodium](https://github.com/jedisct1/libsodium "libsodium") (Required for strong password hashing on the loginserver)
+- [Lua 5.1](https://www.lua.org/ "Lua 5.1") or [LuaJit](http://luajit.org/ "LuaJit") (Required for Lua Quest Scripting)
+- [Perl](https://www.perl.org/ "Perl") (Required for Perl Quest Scripting)
+
+##### Windows
+For windows it is suggested you make use of [vcpkg](https://github.com/microsoft/vcpkg "vcpkg") if you wish to build your own dependencies.
+
+If you wish to use Perl then you should use whichever version of Perl you have installed on the target system.
+
+You can also download a vcpkg export from our releases section for Visual Studio [x86](https://github.com/EQEmu/Server/releases/download/v1.2/vcpkg-export-x86.zip "x86") or [x64](https://github.com/EQEmu/Server/releases/download/v1.2/vcpkg-export-x64.zip "x64") that includes a toolchain file you can pass to CMake.
+
+##### Linux
+For Linux you simply can install the dependencies from your package manager, below is an example of doing it on Ubuntu using apt-get.
+
+ sudo apt-get install libmysqlclient-dev libperl-dev libboost-dev liblua5.1-0-dev zlib1g-dev uuid-dev libssl-dev
+
+### Running CMake
+
+##### Windows
+The following is a modified command our automated build server uses to run CMake via the release vcpkg export and its toolchain file.
+
+Assuming it is starting in c:/projects/eqemu and the x64 dependencies were extracted to c:/projects/eqemu/vcpkg.
+
+ mkdir build
+ cd build
+ cmake -G "Visual Studio 15 2017 Win64" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_ZLIB=ON -DEQEMU_ENABLE_BOTS=ON -DCMAKE_TOOLCHAIN_FILE="c:/projects/eqemu/vcpkg/vcpkg-export-20180828-145455/scripts/buildsystems/vcpkg.cmake" ..
+
+##### Linux
+Similarly to Windows running CMake on Linux is simple it just omits the toolchain file and uses a different generator.
+
+ mkdir build
+ cd build
+ cmake -G "Unix Makefiles" -DEQEMU_BUILD_TESTS=ON -DEQEMU_ENABLE_BOTS=ON -DEQEMU_BUILD_LOGIN=ON ..
+
+### Building
+
+##### Windows
+Inside the build directory a file EQEmu.sln should be produced by a successful run of the CMake command. You can either open this with Visual Studio or build it directly with MSBuild via the command line.
+
+ msbuild EQEmu.sln /p:Configuration=Release
+
+##### Linux
+From the build directory you can simply call make to build.
+
+For example.
+
+ make -j4
diff --git a/CMakeLists.txt b/CMakeLists.txt
index be92c7d0d..2b12e2ee1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,122 +1,28 @@
-#EQEmu CMake
-#Variables used:
-#EQEMU_DISABLE_CRT_SECURE_WARNINGS
-#EQEMU_FAST_FLOATINGPOINT
-#EQEMU_ENABLE_CRASH_LOGGING
-#EQEMU_DISABLE_SAFESEH
-#EQEMU_BUILD_MSVC_MP
-#EQEMU_DEBUG_LEVEL
-#EQEMU_LOG_LEVEL_STATUS
-#EQEMU_LOG_LEVEL_NORMAL
-#EQEMU_LOG_LEVEL_ERROR
-#EQEMU_LOG_LEVEL_DEBUG
-#EQEMU_LOG_LEVEL_QUEST
-#EQEMU_LOG_LEVEL_COMMANDS
-#EQEMU_LOG_LEVEL_CRASH
-#EQEMU_DEPOP_INVALIDATES_CACHE
-#EQEMU_ENABLE_BOTS
-#EQEMU_DISABLE_LOGSYS
-#EQEMU_COMMANDS_LOGGING
-#EQEMU_BUILD_SERVER
-#EQEMU_BUILD_LOGIN
-#EQEMU_BUILD_TESTS
-#EQEMU_BUILD_PERL
-#EQEMU_BUILD_LUA
-#EQEMU_SANITIZE_LUA_LIBS
-#EQEMU_BUILD_CLIENT_FILES
-#EQEMU_USE_MAP_MMFS
-#EQEMU_MAP_DIR
+CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
-IF(POLICY CMP0074)
- cmake_policy(SET CMP0074 NEW)
-ENDIF()
-
-#FindMySQL is located here so lets make it so CMake can find it
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/" ${CMAKE_MODULE_PATH})
-#Our project name is EQEmu
+IF(POLICY CMP0074)
+ CMAKE_POLICY(SET CMP0074 NEW)
+ENDIF()
+
PROJECT(EQEmu)
-#Default build type is set to RelWithDebInfo for generators that honor that like makefiles
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
-SET(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/dependencies" "${CMAKE_PREFIX_PATH}")
-
-#Add our various windows definitions
-IF(MSVC OR MINGW)
- ADD_DEFINITIONS(-D_WINDOWS)
- IF(CMAKE_CL_64)
- ADD_DEFINITIONS(-DWIN64)
- ELSE(CMAKE_CL_64)
- ADD_DEFINITIONS(-DWIN32)
- ENDIF(CMAKE_CL_64)
-ENDIF(MSVC OR MINGW)
+SET(CMAKE_CXX_STANDARD 11)
+SET(CMAKE_CXX_STANDARD_REQUIRED ON)
+SET(CMAKE_CXX_EXTENSIONS OFF)
IF(MSVC)
- IF(CMAKE_CL_64)
- SET(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib_x64")
- SET(MYSQL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/mysql_x64")
- SET(LUA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/luaj_x64")
- SET(OPENSSL_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/openssl_x64")
- SET(SODIUM_INCLUDE_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/include")
- IF(MSVC_VERSION GREATER 1800)
- SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/x64/Release/v140/dynamic")
- ELSEIF(MSVC_VERSION EQUAL 1800)
- SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/x64/Release/v120/dynamic")
- ELSE()
- SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/x64/Release/v110/dynamic")
- ENDIF()
- ELSE(CMAKE_CL_64)
- SET(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib_x86")
- SET(MYSQL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/mysql_x86")
- SET(LUA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/luaj_x86")
- SET(SODIUM_INCLUDE_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/include")
- SET(OPENSSL_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/openssl_x86")
- IF(MSVC_VERSION GREATER 1800)
- SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/Win32/Release/v140/dynamic")
- ELSEIF(MSVC_VERSION EQUAL 1800)
- SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/Win32/Release/v120/dynamic")
- ELSE()
- SET(SODIUM_LIBRARY_HINTS "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/libsodium/Win32/Release/v110/dynamic")
- ENDIF()
- ENDIF(CMAKE_CL_64)
-
- #disable CRT warnings on windows cause they're annoying as shit and we use C functions everywhere
- OPTION(EQEMU_DISABLE_CRT_SECURE_WARNINGS "Disable Secure CRT Warnings" ON)
- IF(EQEMU_DISABLE_CRT_SECURE_WARNINGS)
- ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
- ENDIF(EQEMU_DISABLE_CRT_SECURE_WARNINGS)
-
- #fast FP if you'd like it
- OPTION(EQEMU_FAST_FLOATINGPOINT "Use MSVC /fp:fast option" ON)
- IF(EQEMU_FAST_FLOATINGPOINT)
- ADD_DEFINITIONS(/fp:fast)
- ENDIF(EQEMU_FAST_FLOATINGPOINT)
-
- #crash logging currently only works on windows x86/x64
- OPTION(EQEMU_ENABLE_CRASH_LOGGING "Enable crash logging" ON)
- IF(EQEMU_ENABLE_CRASH_LOGGING)
- ADD_DEFINITIONS(-DCRASH_LOGGING)
- ENDIF(EQEMU_ENABLE_CRASH_LOGGING)
-
- OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." ON)
- IF(EQEMU_BUILD_MSVC_MP)
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
- ENDIF(EQEMU_BUILD_MSVC_MP)
-
- #We want to compile /MT not /MD so we change that
- FOREACH(flag_var CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
- IF(${flag_var} MATCHES "/MD")
- STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
- ENDIF(${flag_var} MATCHES "/MD")
- ENDFOREACH(flag_var)
-
+ ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
ADD_DEFINITIONS(-DNOMINMAX)
+ ADD_DEFINITIONS(-DCRASH_LOGGING)
+
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
ELSE(MSVC)
- #Normally set by perl but we don't use the perl flags anymore so we set it.
ADD_DEFINITIONS(-DHAS_UNION_SEMUN)
ENDIF(MSVC)
@@ -133,195 +39,284 @@ IF(UNIX)
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
ENDIF(UNIX)
-#debug level, 5 is default. Most people wont ever change this but it's there if you want to
-SET(EQEMU_DEBUG_LEVEL 5 CACHE STRING "EQEmu debug level:
- 0 - Quiet mode Errors to file Status and Normal ignored
- 1 - Status and Normal to console, Errors to logfile
- 2 - Status, Normal, and Error to console and logfile
- 3 - Light debug release errors and status
- 4 - Moderate debug release errors and status
- 5 - Maximum debug release errors and status
- 10 - More errors than you ever wanted to see"
-)
+ADD_DEFINITIONS(-DGLM_FORCE_RADIANS)
+ADD_DEFINITIONS(-DGLM_FORCE_CTOR_INIT)
+ADD_DEFINITIONS(-DGLM_ENABLE_EXPERIMENTAL)
-SET(EQEMU_LOG_LEVEL_STATUS 2 CACHE STRING "EQEmu logging level for [Status]:
- 0 - Disabled
- 1 - Ouput to File Enabled
- 2 - Output to stdout Enabled
- 3 - Output to File and stdout Enabled
- 8 - Output to stderr Enabled
- 9 - Output to File and stderr Enabled
- 11 - Output to File, stdout and stderr Enabled"
-)
+#MSVC can fetch dependencies automatically.
+IF(MSVC)
+ INCLUDE("${CMAKE_SOURCE_DIR}/cmake/DependencyHelperMSVC.cmake")
+ENDIF()
-SET(EQEMU_LOG_LEVEL_NORMAL 3 CACHE STRING "EQEmu logging level for [Normal]:
- 0 - Disabled
- 1 - Ouput to File Enabled
- 2 - Output to stdout Enabled
- 3 - Output to File and stdout Enabled
- 8 - Output to stderr Enabled
- 9 - Output to File and stderr Enabled
- 11 - Output to File, stdout and stderr Enabled"
-)
+#Find everything we need
+FIND_PACKAGE(Boost REQUIRED)
+FIND_PACKAGE(MySQL)
+FIND_PACKAGE(MariaDB)
+FIND_PACKAGE(ZLIB)
+FIND_PACKAGE(OpenSSL)
+FIND_PACKAGE(Lua51)
+FIND_PACKAGE(PerlLibs)
+FIND_PACKAGE(Sodium)
+FIND_PACKAGE(mbedTLS)
-SET(EQEMU_LOG_LEVEL_ERROR 2 CACHE STRING "EQEmu logging level for [Error]:
- 0 - Disabled
- 1 - Ouput to File Enabled
- 2 - Output to stdout Enabled
- 3 - Output to File and stdout Enabled
- 8 - Output to stderr Enabled
- 9 - Output to File and stderr Enabled
- 11 - Output to File, stdout and stderr Enabled"
-)
+MESSAGE(STATUS "**************************************************")
+MESSAGE(STATUS "* Library Detection *")
+MESSAGE(STATUS "**************************************************")
-SET(EQEMU_LOG_LEVEL_DEBUG 3 CACHE STRING "EQEmu logging level for [Debug]:
- 0 - Disabled
- 1 - Ouput to File Enabled
- 2 - Output to stdout Enabled
- 3 - Output to File and stdout Enabled
- 8 - Output to stderr Enabled
- 9 - Output to File and stderr Enabled
- 11 - Output to File, stdout and stderr Enabled"
-)
+IF(MYSQL_FOUND)
+ MESSAGE(STATUS "* MySQL: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* MySQL: MISSING *")
+ENDIF()
-SET(EQEMU_LOG_LEVEL_QUEST 2 CACHE STRING "EQEmu logging level for [Quest]:
- 0 - Disabled
- 1 - Ouput to File Enabled
- 2 - Output to stdout Enabled
- 3 - Output to File and stdout Enabled
- 8 - Output to stderr Enabled
- 9 - Output to File and stderr Enabled
- 11 - Output to File, stdout and stderr Enabled"
-)
+IF(MARIADB_FOUND)
+ MESSAGE(STATUS "* MariaDB: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* MariaDB: MISSING *")
+ENDIF()
-SET(EQEMU_LOG_LEVEL_COMMANDS 1 CACHE STRING "EQEmu logging level for [Commands]:
- 0 - Disabled
- 1 - Ouput to File Enabled
- 2 - Output to stdout Enabled
- 3 - Output to File and stdout Enabled
- 8 - Output to stderr Enabled
- 9 - Output to File and stderr Enabled
- 11 - Output to File, stdout and stderr Enabled"
-)
+IF(ZLIB_FOUND)
+ MESSAGE(STATUS "* ZLIB: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* ZLIB: MISSING *")
+ENDIF()
-SET(EQEMU_LOG_LEVEL_CRASH 3 CACHE STRING "EQEmu logging level for [Crash]:
- 0 - Disabled
- 1 - Ouput to File Enabled
- 2 - Output to stdout Enabled
- 3 - Output to File and stdout Enabled
- 8 - Output to stderr Enabled
- 9 - Output to File and stderr Enabled
- 11 - Output to File, stdout and stderr Enabled"
-)
+IF(Lua51_FOUND)
+ MESSAGE(STATUS "* Lua: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* Lua: MISSING *")
+ENDIF()
-MARK_AS_ADVANCED(EQEMU_LOG_LEVEL_STATUS EQEMU_LOG_LEVEL_NORMAL EQEMU_LOG_LEVEL_ERROR EQEMU_LOG_LEVEL_DEBUG EQEMU_LOG_LEVEL_QUEST EQEMU_LOG_LEVEL_COMMANDS EQEMU_LOG_LEVEL_CRASH)
+IF(PerlLibs_FOUND)
+ MESSAGE(STATUS "* Perl: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* Perl: MISSING *")
+ENDIF()
-#NPC Types Cache Behavior
+IF(SODIUM_FOUND)
+ MESSAGE(STATUS "* libsodium: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* libsodium: MISSING *")
+ENDIF()
+
+IF(OpenSSL_FOUND)
+ MESSAGE(STATUS "* OpenSSL: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* OpenSSL: MISSING *")
+ENDIF()
+
+IF(MBEDTLS_FOUND)
+ MESSAGE(STATUS "* mbedTLS: FOUND *")
+ELSE()
+ MESSAGE(STATUS "* mbedTLS: MISSING *")
+ENDIF()
+
+MESSAGE(STATUS "**************************************************")
+
+#options
OPTION(EQEMU_DEPOP_INVALIDATES_CACHE "#repop invalidates the npc_types cache (will cause a larger database hit on #repop but is more convienent)." ON)
-
-#Bots are a compile time option so on/off
OPTION(EQEMU_ENABLE_BOTS "Enable Bots" OFF)
-
-#Disable entire _mlog system (excludes trade/command logs)
-OPTION(EQEMU_DISABLE_LOGSYS "Disable Logging INI System" ON)
-
-#Enable GM Command log system
OPTION(EQEMU_COMMANDS_LOGGING "Enable GM Command logs" ON)
+OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
+OPTION(EQEMU_BUILD_LOGIN "Build the login server." ON)
+OPTION(EQEMU_BUILD_HC "Build the headless client." OFF)
+OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF)
+OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON)
IF(EQEMU_COMMANDS_LOGGING)
ADD_DEFINITIONS(-DCOMMANDS_LOGGING)
ENDIF(EQEMU_COMMANDS_LOGGING)
-IF(EQEMU_DISABLE_LOGSYS)
- ADD_DEFINITIONS(-DDISABLE_LOGSYS)
-ENDIF(EQEMU_DISABLE_LOGSYS)
-
IF(EQEMU_ENABLE_BOTS)
ADD_DEFINITIONS(-DBOTS)
ENDIF(EQEMU_ENABLE_BOTS)
-#What to build
-OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
-OPTION(EQEMU_BUILD_LOGIN "Build the login server." OFF)
-OPTION(EQEMU_BUILD_HC "Build the headless client." OFF)
-OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF)
-OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON)
-OPTION(EQEMU_BUILD_LUA "Build Lua parser." ON)
-OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON)
-
-#C++11 stuff
-IF(NOT MSVC)
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
- IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reserved-user-defined-literal")
+#database
+IF(MySQL_FOUND AND MariaDB_FOUND)
+ SET(DATABASE_LIBRARY_SELECTION MySQL CACHE STRING "Database library to use:
+ MySQL
+ MariaDB"
+ )
+
+ IF(DATABASE_LIBRARY_SELECTION STREQUAL "MySQL")
+ SET(DATABASE_LIBRARY_TYPE " MySQL")
+ SET(DATABASE_LIBRARY_LIBS ${MySQL_LIBRARIES})
+ SET(DATABASE_LIBRARY_INCLUDE ${MySQL_INCLUDE_DIR})
+ ELSEIF(DATABASE_LIBRARY_SELECTION STREQUAL "MariaDB")
+ SET(DATABASE_LIBRARY_TYPE "MariaDB")
+ SET(DATABASE_LIBRARY_LIBS ${MariaDB_LIBRARIES})
+ SET(DATABASE_LIBRARY_INCLUDE ${MariaDB_INCLUDE_DIR})
+ ELSE()
+ MESSAGE(FATAL_ERROR "Unknown database library set, should be one of: MySQL, MariaDB")
ENDIF()
-ENDIF(NOT MSVC)
+ELSEIF(MariaDB_FOUND)
+ SET(DATABASE_LIBRARY_TYPE "MariaDB")
+ SET(DATABASE_LIBRARY_LIBS ${MariaDB_LIBRARIES})
+ SET(DATABASE_LIBRARY_INCLUDE ${MariaDB_INCLUDE_DIR})
+ELSEIF(MySQL_FOUND)
+ SET(DATABASE_LIBRARY_TYPE " MySQL")
+ SET(DATABASE_LIBRARY_LIBS ${MySQL_LIBRARIES})
+ SET(DATABASE_LIBRARY_INCLUDE ${MySQL_INCLUDE_DIR})
+ELSE()
+ MESSAGE(FATAL_ERROR "One of MySQL or MariaDB is a required dependency.")
+ENDIF()
-#Various definitions
-IF(EQEMU_BUILD_PERL)
- ADD_DEFINITIONS(-DEMBPERL)
- ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
-ENDIF(EQEMU_BUILD_PERL)
-IF(EQEMU_BUILD_LUA)
- ADD_DEFINITIONS(-DLUA_EQEMU)
-ENDIF(EQEMU_BUILD_LUA)
+#security
+#prefer openssl to mbedtls (arbitrary)
+IF(OpenSSL_FOUND AND MBEDTLS_FOUND)
+ SET(TLS_LIBRARY_SELECTION OpenSSL CACHE STRING "TLS library to use:
+ OpenSSL
+ mbedTLS"
+ )
+
+ IF(TLS_LIBRARY_SELECTION STREQUAL "OpenSSL")
+ SET(TLS_LIBRARY_TYPE " OpenSSL")
+ SET(TLS_LIBRARY_ENABLED ON)
+ SET(TLS_LIBRARY_LIBS ${OPENSSL_LIBRARIES})
+ SET(TLS_LIBRARY_INCLUDE ${OPENSSL_INCLUDE_DIR})
+ ADD_DEFINITIONS(-DEQEMU_USE_OPENSSL)
+ ELSEIF(TLS_LIBRARY_SELECTION STREQUAL "mbedTLS")
+ SET(TLS_LIBRARY_TYPE " mbedTLS")
+ SET(TLS_LIBRARY_ENABLED ON)
+ SET(TLS_LIBRARY_LIBS ${MBEDTLS_LIBRARY} ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY})
+ SET(TLS_LIBRARY_INCLUDE ${MBEDTLS_INCLUDE_DIR})
+ ADD_DEFINITIONS(-DEQEMU_USE_MBEDTLS)
+ ELSE()
+ MESSAGE(FATAL_ERROR "Unknown TLS library set, should be one of: OpenSSL, mbedTLS")
+ ENDIF()
+ELSEIF(OpenSSL_FOUND)
+ SET(TLS_LIBRARY_TYPE " OpenSSL")
+ SET(TLS_LIBRARY_ENABLED ON)
+ SET(TLS_LIBRARY_LIBS ${OPENSSL_LIBRARIES})
+ SET(TLS_LIBRARY_INCLUDE ${OPENSSL_INCLUDE_DIR})
+ ADD_DEFINITIONS(-DEQEMU_USE_OPENSSL)
+ELSEIF(MBEDTLS_FOUND)
+ SET(TLS_LIBRARY_TYPE " mbedTLS")
+ SET(TLS_LIBRARY_ENABLED ON)
+ SET(TLS_LIBRARY_LIBS ${MBEDTLS_LIBRARY} ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY})
+ SET(TLS_LIBRARY_INCLUDE ${MBEDTLS_INCLUDE_DIR})
+ ADD_DEFINITIONS(-DEQEMU_USE_MBEDTLS)
+ELSE()
+ SET(TLS_LIBRARY_TYPE "Disabled")
+ SET(TLS_LIBRARY_ENABLED OFF)
+ENDIF()
-#Disabled until reevaluation performed
-#OPTION(EQEMU_USE_MAP_MMFS "Create and use Zone Map MMF files." OFF)
-#IF(EQEMU_USE_MAP_MMFS)
-# ADD_DEFINITIONS(-DUSE_MAP_MMFS)
-#ENDIF(EQEMU_USE_MAP_MMFS)
-
-SET(EQEMU_MAP_DIR "./Maps" CACHE STRING "The dir that maps, water maps, and paths are located in.")
-
-ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL})
-ADD_DEFINITIONS(-DINVERSEXY)
-ADD_DEFINITIONS(-DFIELD_ITEMS)
-ADD_DEFINITIONS(-DMAP_DIR="${EQEMU_MAP_DIR}")
-ADD_DEFINITIONS(-DLOG_LEVEL_STATUS=${EQEMU_LOG_LEVEL_STATUS})
-ADD_DEFINITIONS(-DLOG_LEVEL_NORMAL=${EQEMU_LOG_LEVEL_NORMAL})
-ADD_DEFINITIONS(-DLOG_LEVEL_ERROR=${EQEMU_LOG_LEVEL_ERROR})
-ADD_DEFINITIONS(-DLOG_LEVEL_DEBUG=${EQEMU_LOG_LEVEL_DEBUG})
-ADD_DEFINITIONS(-DLOG_LEVEL_QUEST=${EQEMU_LOG_LEVEL_QUEST})
-ADD_DEFINITIONS(-DLOG_LEVEL_COMMANDS=${EQEMU_LOG_LEVEL_COMMANDS})
-ADD_DEFINITIONS(-DLOG_LEVEL_CRASH=${EQEMU_LOG_LEVEL_CRASH})
-ADD_DEFINITIONS(-DGLM_FORCE_RADIANS)
-ADD_DEFINITIONS(-DGLM_FORCE_CTOR_INIT)
-ADD_DEFINITIONS(-DGLM_ENABLE_EXPERIMENTAL)
-
-#Find everything we need
-FIND_PACKAGE(ZLIB)
-FIND_PACKAGE(MySQL REQUIRED)
-IF(EQEMU_BUILD_PERL)
- FIND_PACKAGE(PerlLibs REQUIRED)
- INCLUDE_DIRECTORIES(SYSTEM "${PERL_INCLUDE_PATH}")
-ENDIF(EQEMU_BUILD_PERL)
-
-SET(SERVER_LIBS common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} uv_a fmt RecastNavigation::Detour)
-
-FIND_PACKAGE(Sodium REQUIRED)
IF(SODIUM_FOUND)
- OPTION(EQEMU_ENABLE_SECURITY "Use Encryption For TCP Connections" ON)
- IF(EQEMU_ENABLE_SECURITY)
- INCLUDE_DIRECTORIES(SYSTEM "${SODIUM_INCLUDE_DIRS}")
- ADD_DEFINITIONS(-DENABLE_SECURITY)
- SET(SERVER_LIBS ${SERVER_LIBS} ${SODIUM_LIBRARIES})
+ SET(SODIUM_LIBRARY_TYPE "Libsodium")
+ SET(SODIUM_LIBRARY_ENABLED ON)
+ SET(SODIUM_LIBRARY_LIBS ${SODIUM_LIBRARIES})
+ SET(SODIUM_LIBRARY_INCLUDE ${SODIUM_INCLUDE_DIRS})
+ ADD_DEFINITIONS(-DENABLE_SECURITY)
+ELSE()
+ SET(SODIUM_LIBRARY_TYPE " Disabled")
+ SET(SODIUM_LIBRARY_ENABLED OFF)
+ENDIF()
+
+IF(Lua51_FOUND)
+ SET(LUA_LIBRARY_TYPE " Lua 5.1")
+ SET(LUA_LIBRARY_ENABLED ON)
+ SET(LUA_LIBRARY_LIBS ${LUA_LIBRARY} luabind)
+ SET(LUA_LIBRARY_INCLUDE ${LUA_INCLUDE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/libs/luabind")
+ELSE()
+ SET(LUA_LIBRARY_TYPE "Disabled")
+ SET(LUA_LIBRARY_ENABLED OFF)
+ENDIF()
+
+IF(PerlLibs_FOUND)
+ SET(PERL_LIBRARY_TYPE " Perl")
+ SET(PERL_LIBRARY_ENABLED ON)
+ SET(PERL_LIBRARY_LIBS ${PERL_LIBRARY})
+ SET(PERL_LIBRARY_INCLUDE ${PERL_INCLUDE_PATH})
+ELSE()
+ SET(PERL_LIBRARY_TYPE "Disabled")
+ SET(PERL_LIBRARY_ENABLED OFF)
+ENDIF()
+
+#use zlib if exists
+IF(ZLIB_FOUND)
+ OPTION(EQEMU_BUILD_ZLIB "Build internal version of zlib." ON)
+ IF(EQEMU_BUILD_ZLIB)
+ SET(ZLIB_LIBRARY_TYPE "zlib-ng")
+ SET(ZLIB_LIBRARY_LIBS "zlibstatic")
+ SET(ZLIB_LIBRARY_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/libs/zlibng")
+ ELSE()
+ SET(ZLIB_LIBRARY_TYPE " zlib")
+ SET(ZLIB_LIBRARY_LIBS ${ZLIB_LIBRARY})
+ SET(ZLIB_LIBRARY_INCLUDE ${ZLIB_INCLUDE_DIRS})
+ ENDIF()
+ELSE()
+ SET(ZLIB_LIBRARY_TYPE "zlib-ng")
+ SET(ZLIB_LIBRARY_LIBS "zlibstatic")
+ SET(ZLIB_LIBRARY_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/libs/zlibng")
+ENDIF()
+
+MESSAGE(STATUS "")
+MESSAGE(STATUS "**************************************************")
+MESSAGE(STATUS "* Library Usage *")
+MESSAGE(STATUS "**************************************************")
+MESSAGE(STATUS "* Database: ${DATABASE_LIBRARY_TYPE} *")
+MESSAGE(STATUS "* TLS: ${TLS_LIBRARY_TYPE} *")
+MESSAGE(STATUS "* Sodium: ${SODIUM_LIBRARY_TYPE} *")
+MESSAGE(STATUS "* Lua: ${LUA_LIBRARY_TYPE} *")
+MESSAGE(STATUS "* Perl: ${PERL_LIBRARY_TYPE} *")
+MESSAGE(STATUS "* zlib: ${ZLIB_LIBRARY_TYPE} *")
+MESSAGE(STATUS "**************************************************")
+
+#setup server libs and headers
+SET(SERVER_LIBS common ${DATABASE_LIBRARY_LIBS} ${ZLIB_LIBRARY_LIBS} ${Boost_LIBRARIES} uv_a fmt RecastNavigation::Detour)
+
+INCLUDE_DIRECTORIES(SYSTEM "${DATABASE_LIBRARY_INCLUDE}")
+INCLUDE_DIRECTORIES(SYSTEM "${ZLIB_LIBRARY_INCLUDE}")
+INCLUDE_DIRECTORIES(SYSTEM "${Boost_INCLUDE_DIRS}")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/glm")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/cereal/include")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/fmt/include")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/libuv/include" )
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DebugUtils/Include")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/Detour/Include")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DetourCrowd/Include")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DetourTileCache/Include")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/Recast/Include")
+INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/websocketpp")
+
+OPTION(EQEMU_BUILD_LOGGING "Build Logging (To speed up compilation)" ON)
+IF(EQEMU_BUILD_LOGGING)
+ ADD_DEFINITIONS(-DBUILD_LOGGING)
+ENDIF()
+
+IF(TLS_LIBRARY_ENABLED)
+ SET(SERVER_LIBS ${SERVER_LIBS} ${TLS_LIBRARY_LIBS})
+ INCLUDE_DIRECTORIES(SYSTEM "${TLS_LIBRARY_INCLUDE}")
+ENDIF()
+
+IF(SODIUM_LIBRARY_ENABLED)
+ SET(SERVER_LIBS ${SERVER_LIBS} ${SODIUM_LIBRARY_LIBS})
+ INCLUDE_DIRECTORIES(SYSTEM "${SODIUM_LIBRARY_INCLUDE}")
+ENDIF()
+
+IF(LUA_LIBRARY_ENABLED)
+ OPTION(EQEMU_BUILD_LUA "Build Lua parser." ON)
+
+ IF(EQEMU_BUILD_LUA)
+ ADD_DEFINITIONS(-DLUA_EQEMU)
+ SET(SERVER_LIBS ${SERVER_LIBS} ${LUA_LIBRARY_LIBS})
+ INCLUDE_DIRECTORIES(SYSTEM "${LUA_LIBRARY_INCLUDE}")
+
+ OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON)
+ IF(EQEMU_SANITIZE_LUA_LIBS)
+ ADD_DEFINITIONS(-DSANITIZE_LUA_LIBS)
+ ENDIF()
ENDIF()
ENDIF()
-IF(ZLIB_FOUND)
- OPTION(EQEMU_BUILD_ZLIB "Build internal version of zlib." OFF)
-
- IF(EQEMU_BUILD_ZLIB)
- INCLUDE_DIRECTORIES(BEFORE SYSTEM "${CMAKE_CURRENT_BINARY_DIR}/libs/zlibng" "${CMAKE_CURRENT_SOURCE_DIR}/libs/zlibng")
- SET(SERVER_LIBS ${SERVER_LIBS} "zlibstatic")
- ELSE()
- INCLUDE_DIRECTORIES(SYSTEM "${ZLIB_INCLUDE_DIRS}")
- SET(SERVER_LIBS ${SERVER_LIBS} ${ZLIB_LIBRARY})
+IF(PERL_LIBRARY_ENABLED)
+ OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON)
+ IF(EQEMU_BUILD_PERL)
+ SET(SERVER_LIBS ${SERVER_LIBS} ${PERL_LIBRARY_LIBS})
+ INCLUDE_DIRECTORIES(SYSTEM "${PERL_LIBRARY_INCLUDE}")
+ ADD_DEFINITIONS(-DEMBPERL)
+ ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
ENDIF()
-ELSE()
- INCLUDE_DIRECTORIES(BEFORE SYSTEM "${CMAKE_CURRENT_BINARY_DIR}/libs/zlibng" "${CMAKE_CURRENT_SOURCE_DIR}/libs/zlibng")
- SET(SERVER_LIBS ${SERVER_LIBS} "zlibstatic")
ENDIF()
IF(WIN32)
@@ -336,52 +331,32 @@ IF(UNIX)
SET(SERVER_LIBS ${SERVER_LIBS} "uuid")
ENDIF()
-IF(EQEMU_BUILD_LUA)
- FIND_PACKAGE(EQLua51 REQUIRED)
- SET(Boost_USE_STATIC_LIBS OFF)
- SET(Boost_USE_MULTITHREADED ON)
- SET(Boost_USE_STATIC_RUNTIME OFF)
- SET(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/boost")
+IF(EQEMU_BUILD_LOGIN AND NOT TLS_LIBRARY_ENABLED)
+ MESSAGE(FATAL_ERROR "Login server requires a TLS Library to build.")
+ENDIF()
- FIND_PACKAGE(Boost REQUIRED)
- INCLUDE_DIRECTORIES(SYSTEM "${LUA_INCLUDE_DIR}" "${Boost_INCLUDE_DIRS}")
- INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/libs/luabind")
-
- OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON)
- IF(EQEMU_SANITIZE_LUA_LIBS)
- ADD_DEFINITIONS(-DSANITIZE_LUA_LIBS)
- ENDIF(EQEMU_SANITIZE_LUA_LIBS)
-ENDIF(EQEMU_BUILD_LUA)
-
-INCLUDE_DIRECTORIES(SYSTEM "${MySQL_INCLUDE_DIR}")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/glm")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/cereal/include")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/fmt/include")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/libuv/include" )
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DebugUtils/Include")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/Detour/Include")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DetourCrowd/Include")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/DetourTileCache/Include")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/recastnavigation/Recast/Include")
-INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/websocketpp")
+IF(EQEMU_BUILD_HC AND NOT TLS_LIBRARY_ENABLED)
+ MESSAGE(FATAL_ERROR "Headless client requires a TLS Library to build.")
+ENDIF()
IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS OR EQEMU_BUILD_HC)
ADD_SUBDIRECTORY(common)
ADD_SUBDIRECTORY(libs)
ADD_SUBDIRECTORY(submodules/fmt)
ADD_SUBDIRECTORY(submodules/libuv)
-
- SET(RECASTNAVIGATION_DEMO OFF CACHE BOOL "Build demo")
- SET(RECASTNAVIGATION_TESTS OFF CACHE BOOL "Build tests")
- SET(RECASTNAVIGATION_EXAMPLES OFF CACHE BOOL "Build examples")
- ADD_SUBDIRECTORY(submodules/recastnavigation)
IF(EQEMU_BUILD_ZLIB)
SET(ZLIB_COMPAT ON CACHE BOOL "Compile with zlib compatible API")
SET(ZLIB_ENABLE_TESTS OFF CACHE BOOL "Build test binaries")
ADD_SUBDIRECTORY(libs/zlibng)
ENDIF()
+
+ SET(RECASTNAVIGATION_DEMO OFF CACHE BOOL "Build demo")
+ SET(RECASTNAVIGATION_TESTS OFF CACHE BOOL "Build tests")
+ SET(RECASTNAVIGATION_EXAMPLES OFF CACHE BOOL "Build examples")
+ ADD_SUBDIRECTORY(submodules/recastnavigation)
ENDIF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS OR EQEMU_BUILD_HC)
+
IF(EQEMU_BUILD_SERVER)
ADD_SUBDIRECTORY(shared_memory)
ADD_SUBDIRECTORY(world)
@@ -390,6 +365,7 @@ IF(EQEMU_BUILD_SERVER)
ADD_SUBDIRECTORY(queryserv)
ADD_SUBDIRECTORY(eqlaunch)
ENDIF(EQEMU_BUILD_SERVER)
+
IF(EQEMU_BUILD_LOGIN)
ADD_SUBDIRECTORY(loginserver)
ENDIF(EQEMU_BUILD_LOGIN)
diff --git a/README.md b/README.md
index e1126241c..5e4f919fe 100644
--- a/README.md
+++ b/README.md
@@ -70,3 +70,9 @@ forum, although pull requests will be much quicker and easier on all parties.
* GPL Perl - GPL / ActiveState (under the assumption that this is a free project)
* CPPUnit - GLP StringUtilities - Apache
* LUA - MIT
+
+## Contributors
+
+
+
+
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..0a653b06f
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,3 @@
+# Security Policy - Reporting Vulnerabilities
+
+When reporting active hacks, exploits and other vulnerabilities, please describe how to reproduce said report and if you can provide context into a possible solution
diff --git a/changelog.txt b/changelog.txt
index dc9d0f16c..955a0a2e8 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,37 @@
+############################################
+# Deprecated
+############################################
+#
+# New changelog can be found here
+# https://eqemu.gitbook.io/changelog/
+#
+############################################
+# Deprecated
+############################################
+
EQEMu Changelog (Started on Sept 24, 2003 15:50)
-------------------------------------------------------
+== 8/16/2019 ==
+Akkadius: Simplified the use of roamboxes and improved the AI for roambox pathing https://i.imgur.com/z33u7y9.gif
+Akkadius: Implemented command #roambox set [move_delay]
+Akkadius: Implemented command #roambox remove
+Akkadius: Implemented LUA NPC:SetSimpleRoamBox(box_size, [move_distance], [move_delay]);
+Akkadius: Implemented Perl $npc->SetSimpleRoamBox(box_size, [move_distance], [move_delay]);
+Akkadius: Spawngroup data now hot reloads on #repop
+Akkadius: Command #npceditmass now lists column options when one isn't properly specified
+Akkadius: Implemented command #spawneditmass