mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-12-16 20:24:39 -06:00
Compare commits
43 Commits
v2.2.0
...
fmtlib-exp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c4ea2ae71 | ||
|
|
cfb0826d22 | ||
|
|
3164bad9af | ||
|
|
ceb1d5d82a | ||
|
|
494c2b5784 | ||
|
|
0bcae8e555 | ||
|
|
7250aa51f6 | ||
|
|
ac6c68ecff | ||
|
|
642c86a449 | ||
|
|
3a6313a3ba | ||
|
|
6e3b5acede | ||
|
|
73312cb948 | ||
|
|
fe4b29f643 | ||
|
|
fcb89b3c7a | ||
|
|
1a0aaf3123 | ||
|
|
9a26ba0a72 | ||
|
|
6c9c826e19 | ||
|
|
554a9a6806 | ||
| c4c1e93dc8 | |||
|
|
15504e693b | ||
|
|
7d626dc31b | ||
|
|
6df6e3e313 | ||
|
|
4ffdf851c6 | ||
| 43707952d2 | |||
|
|
ef3fdba621 | ||
| 398426545c | |||
|
|
366a80ffd2 | ||
|
|
c9a8be4fb9 | ||
|
|
424d54b98c | ||
|
|
b261e63233 | ||
|
|
75544e3eec | ||
|
|
9e0dd05d42 | ||
|
|
27d20dd8fa | ||
|
|
4b0079c817 | ||
|
|
30b9ef8ab2 | ||
|
|
7235423c7b | ||
|
|
94a467b361 | ||
|
|
c3743877df | ||
|
|
ab937055e7 | ||
|
|
5c1ed332c4 | ||
|
|
95d687846a | ||
| 192c8cf974 | |||
|
|
cf706d4974 |
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -17,3 +17,6 @@
|
|||||||
[submodule "thirdparty/magic_enum"]
|
[submodule "thirdparty/magic_enum"]
|
||||||
path = thirdparty/magic_enum
|
path = thirdparty/magic_enum
|
||||||
url = https://github.com/Neargye/magic_enum.git
|
url = https://github.com/Neargye/magic_enum.git
|
||||||
|
[submodule "thirdparty/fmt"]
|
||||||
|
path = thirdparty/fmt
|
||||||
|
url = https://github.com/fmtlib/fmt.git
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ include(CTest)
|
|||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CXX_STANDARD_REQUIRED ON)
|
set(CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) # Set CMAKE visibility policy to NEW on project and subprojects
|
||||||
|
set(CMAKE_CXX_VISIBILITY_PRESET hidden) # Set C++ symbol visibility to default to hidden
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
|
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
# Read variables from file
|
# Read variables from file
|
||||||
@@ -77,6 +79,7 @@ endif()
|
|||||||
|
|
||||||
# Our output dir
|
# Our output dir
|
||||||
set(CMAKE_BINARY_DIR ${PROJECT_BINARY_DIR})
|
set(CMAKE_BINARY_DIR ${PROJECT_BINARY_DIR})
|
||||||
|
#set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) # unfortunately, forces all libraries to be built in series, which will slow down the build process
|
||||||
|
|
||||||
# TODO make this not have to override the build type directories
|
# TODO make this not have to override the build type directories
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR})
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR})
|
||||||
@@ -90,6 +93,8 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
|||||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||||
|
|
||||||
|
find_package(MariaDB)
|
||||||
|
|
||||||
# Create a /resServer directory
|
# Create a /resServer directory
|
||||||
make_directory(${CMAKE_BINARY_DIR}/resServer)
|
make_directory(${CMAKE_BINARY_DIR}/resServer)
|
||||||
|
|
||||||
@@ -179,7 +184,7 @@ file(ARCHIVE_EXTRACT INPUT ${PROJECT_BINARY_DIR}/navmeshes.zip DESTINATION ${PRO
|
|||||||
file(REMOVE ${PROJECT_BINARY_DIR}/navmeshes.zip)
|
file(REMOVE ${PROJECT_BINARY_DIR}/navmeshes.zip)
|
||||||
|
|
||||||
# Copy vanity files on first build
|
# Copy vanity files on first build
|
||||||
set(VANITY_FILES "CREDITS.md" "INFO.md" "TESTAMENT.md" "NPC.xml")
|
set(VANITY_FILES "CREDITS.md" "INFO.md" "TESTAMENT.md" "root.xml" "dev-tribute.xml" "atm.xml" "demo.xml")
|
||||||
|
|
||||||
foreach(file ${VANITY_FILES})
|
foreach(file ${VANITY_FILES})
|
||||||
configure_file("${CMAKE_SOURCE_DIR}/vanity/${file}" "${CMAKE_BINARY_DIR}/vanity/${file}" COPYONLY)
|
configure_file("${CMAKE_SOURCE_DIR}/vanity/${file}" "${CMAKE_BINARY_DIR}/vanity/${file}" COPYONLY)
|
||||||
@@ -202,39 +207,19 @@ foreach(file ${SQL_FILES})
|
|||||||
configure_file(${CMAKE_SOURCE_DIR}/migrations/cdserver/${file} ${PROJECT_BINARY_DIR}/migrations/cdserver/${file})
|
configure_file(${CMAKE_SOURCE_DIR}/migrations/cdserver/${file} ${PROJECT_BINARY_DIR}/migrations/cdserver/${file})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
# Add system specfic includes for Apple, Windows and Other Unix OS' (including Linux)
|
||||||
|
if (APPLE)
|
||||||
|
include_directories("/usr/local/include/")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Load all of our third party directories
|
||||||
|
add_subdirectory(thirdparty)
|
||||||
|
|
||||||
# Create our list of include directories
|
# Create our list of include directories
|
||||||
set(INCLUDED_DIRECTORIES
|
set(INCLUDED_DIRECTORIES
|
||||||
"dCommon"
|
|
||||||
"dCommon/dClient"
|
|
||||||
"dCommon/dEnums"
|
|
||||||
|
|
||||||
"dChatFilter"
|
|
||||||
|
|
||||||
"dGame"
|
|
||||||
"dGame/dBehaviors"
|
|
||||||
"dGame/dComponents"
|
|
||||||
"dGame/dGameMessages"
|
|
||||||
"dGame/dInventory"
|
|
||||||
"dGame/dMission"
|
|
||||||
"dGame/dEntity"
|
|
||||||
"dGame/dPropertyBehaviors"
|
|
||||||
"dGame/dPropertyBehaviors/ControlBehaviorMessages"
|
|
||||||
"dGame/dUtilities"
|
|
||||||
|
|
||||||
"dPhysics"
|
"dPhysics"
|
||||||
|
|
||||||
"dNavigation"
|
"dNavigation"
|
||||||
"dNavigation/dTerrain"
|
|
||||||
|
|
||||||
"dZoneManager"
|
|
||||||
|
|
||||||
"dDatabase"
|
|
||||||
"dDatabase/CDClientDatabase"
|
|
||||||
"dDatabase/CDClientDatabase/CDClientTables"
|
|
||||||
"dDatabase/GameDatabase"
|
|
||||||
"dDatabase/GameDatabase/ITables"
|
|
||||||
"dDatabase/GameDatabase/MySQL"
|
|
||||||
"dDatabase/GameDatabase/MySQL/Tables"
|
|
||||||
|
|
||||||
"dNet"
|
"dNet"
|
||||||
|
|
||||||
@@ -254,6 +239,7 @@ set(INCLUDED_DIRECTORIES
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Add system specfic includes for Apple, Windows and Other Unix OS' (including Linux)
|
# Add system specfic includes for Apple, Windows and Other Unix OS' (including Linux)
|
||||||
|
# TODO: Should probably not do this.
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
include_directories("/usr/local/include/")
|
include_directories("/usr/local/include/")
|
||||||
endif()
|
endif()
|
||||||
@@ -263,30 +249,10 @@ foreach(dir ${INCLUDED_DIRECTORIES})
|
|||||||
include_directories(${PROJECT_SOURCE_DIR}/${dir})
|
include_directories(${PROJECT_SOURCE_DIR}/${dir})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if(NOT WIN32)
|
|
||||||
include_directories("${PROJECT_SOURCE_DIR}/thirdparty/libbcrypt/include/bcrypt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories("${PROJECT_SOURCE_DIR}/thirdparty/libbcrypt/include")
|
|
||||||
|
|
||||||
# Add linking directories:
|
# Add linking directories:
|
||||||
link_directories(${PROJECT_BINARY_DIR})
|
|
||||||
|
|
||||||
# Load all of our third party directories
|
|
||||||
add_subdirectory(thirdparty)
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
||||||
endif()
|
endif()
|
||||||
# Glob together all headers that need to be precompiled
|
|
||||||
file(
|
|
||||||
GLOB HEADERS_DDATABASE
|
|
||||||
LIST_DIRECTORIES false
|
|
||||||
${PROJECT_SOURCE_DIR}/dDatabase/CDClientDatabase/*.h
|
|
||||||
${PROJECT_SOURCE_DIR}/dDatabase/CDClientDatabase/CDClientTables/*.h
|
|
||||||
${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase/ITables/*.h
|
|
||||||
${PROJECT_SOURCE_DIR}/thirdparty/SQLite/*.h
|
|
||||||
)
|
|
||||||
|
|
||||||
file(
|
file(
|
||||||
GLOB HEADERS_DZONEMANAGER
|
GLOB HEADERS_DZONEMANAGER
|
||||||
LIST_DIRECTORIES false
|
LIST_DIRECTORIES false
|
||||||
@@ -321,7 +287,7 @@ add_subdirectory(dPhysics)
|
|||||||
add_subdirectory(dServer)
|
add_subdirectory(dServer)
|
||||||
|
|
||||||
# Create a list of common libraries shared between all binaries
|
# Create a list of common libraries shared between all binaries
|
||||||
set(COMMON_LIBRARIES "dCommon" "dDatabase" "dNet" "raknet" "mariadbConnCpp" "magic_enum" "MD5")
|
set(COMMON_LIBRARIES "dCommon" "dDatabase" "dNet" "fmt" "raknet" "MariaDB::ConnCpp" "magic_enum")
|
||||||
|
|
||||||
# Add platform specific common libraries
|
# Add platform specific common libraries
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
@@ -343,12 +309,6 @@ target_precompile_headers(
|
|||||||
${HEADERS_DZONEMANAGER}
|
${HEADERS_DZONEMANAGER}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Need to specify to use the CXX compiler language here or else we get errors including <string>.
|
|
||||||
target_precompile_headers(
|
|
||||||
dDatabase PRIVATE
|
|
||||||
"$<$<COMPILE_LANGUAGE:CXX>:${HEADERS_DDATABASE}>"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_precompile_headers(
|
target_precompile_headers(
|
||||||
dCommon PRIVATE
|
dCommon PRIVATE
|
||||||
${HEADERS_DCOMMON}
|
${HEADERS_DCOMMON}
|
||||||
|
|||||||
@@ -23,8 +23,7 @@ RUN --mount=type=cache,id=build-apt-cache,target=/var/cache/apt \
|
|||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Grab libraries and load them
|
# Grab libraries and load them
|
||||||
COPY --from=build /app/build/mariadbcpp/src/mariadb_connector_cpp-build/libmariadbcpp.so /usr/local/lib/
|
COPY --from=build /app/build/mariadbcpp/libmariadbcpp.so /usr/local/lib/
|
||||||
COPY --from=build /app/build/mariadbcpp/src/mariadb_connector_cpp-build/libmariadb/libmariadb/libmariadb.so.3 /usr/local/lib
|
|
||||||
RUN ldconfig
|
RUN ldconfig
|
||||||
|
|
||||||
# Server bins
|
# Server bins
|
||||||
|
|||||||
17
cmake/FindGoogleTest.cmake
Normal file
17
cmake/FindGoogleTest.cmake
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
message(STATUS "Fetching gtest...")
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
googletest
|
||||||
|
GIT_REPOSITORY https://github.com/google/googletest.git
|
||||||
|
GIT_TAG release-1.12.1
|
||||||
|
)
|
||||||
|
|
||||||
|
# For Windows: Prevent overriding the parent project's compiler/linker settings
|
||||||
|
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(GoogleTest)
|
||||||
|
|
||||||
|
message(STATUS "gtest fetched and is now ready.")
|
||||||
|
set(GoogleTest_FOUND TRUE)
|
||||||
@@ -23,14 +23,14 @@ if(WIN32 AND NOT MARIADB_BUILD_SOURCE)
|
|||||||
set(MARIADB_CONNECTOR_CPP_MSI "mariadb-connector-cpp-${MARIADB_CONNECTOR_CPP_VERSION}-win64.msi")
|
set(MARIADB_CONNECTOR_CPP_MSI "mariadb-connector-cpp-${MARIADB_CONNECTOR_CPP_VERSION}-win64.msi")
|
||||||
|
|
||||||
if(NOT EXISTS "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_C_MSI}" )
|
if(NOT EXISTS "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_C_MSI}" )
|
||||||
message("Downloading mariadb connector/c")
|
message(STATUS "Downloading mariadb connector/c")
|
||||||
file(DOWNLOAD https://dlm.mariadb.com/${MARIADB_CONNECTOR_C_BUCKET}/Connectors/c/connector-c-${MARIADB_CONNECTOR_C_VERSION}/${MARIADB_CONNECTOR_C_MSI}
|
file(DOWNLOAD https://dlm.mariadb.com/${MARIADB_CONNECTOR_C_BUCKET}/Connectors/c/connector-c-${MARIADB_CONNECTOR_C_VERSION}/${MARIADB_CONNECTOR_C_MSI}
|
||||||
"${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_C_MSI}"
|
"${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_C_MSI}"
|
||||||
EXPECTED_HASH MD5=${MARIADB_CONNECTOR_C_MD5})
|
EXPECTED_HASH MD5=${MARIADB_CONNECTOR_C_MD5})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT EXISTS "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_CPP_MSI}" )
|
if(NOT EXISTS "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_CPP_MSI}" )
|
||||||
message("Downloading mariadb connector/c++")
|
message(STATUS "Downloading mariadb connector/c++")
|
||||||
file(DOWNLOAD https://dlm.mariadb.com/${MARIADB_CONNECTOR_CPP_BUCKET}/Connectors/cpp/connector-cpp-${MARIADB_CONNECTOR_CPP_VERSION}/${MARIADB_CONNECTOR_CPP_MSI}
|
file(DOWNLOAD https://dlm.mariadb.com/${MARIADB_CONNECTOR_CPP_BUCKET}/Connectors/cpp/connector-cpp-${MARIADB_CONNECTOR_CPP_VERSION}/${MARIADB_CONNECTOR_CPP_MSI}
|
||||||
"${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_CPP_MSI}"
|
"${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_CPP_MSI}"
|
||||||
EXPECTED_HASH MD5=${MARIADB_CONNECTOR_CPP_MD5})
|
EXPECTED_HASH MD5=${MARIADB_CONNECTOR_CPP_MD5})
|
||||||
@@ -43,27 +43,28 @@ if(WIN32 AND NOT MARIADB_BUILD_SOURCE)
|
|||||||
file(TO_NATIVE_PATH "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_C_MSI}" MSI_DIR)
|
file(TO_NATIVE_PATH "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_C_MSI}" MSI_DIR)
|
||||||
execute_process(COMMAND msiexec /a ${MSI_DIR} /qn TARGETDIR=${MSIEXEC_TARGETDIR})
|
execute_process(COMMAND msiexec /a ${MSI_DIR} /qn TARGETDIR=${MSIEXEC_TARGETDIR})
|
||||||
endif()
|
endif()
|
||||||
|
set(MARIADBC_SHARED_LIBRARY_LOCATION "${MARIADB_C_CONNECTOR_DIR}/lib/libmariadb.dll")
|
||||||
|
|
||||||
if(NOT EXISTS "${MARIADB_CPP_CONNECTOR_DIR}")
|
if(NOT EXISTS "${MARIADB_CPP_CONNECTOR_DIR}")
|
||||||
file(TO_NATIVE_PATH "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_CPP_MSI}" MSI_DIR)
|
file(TO_NATIVE_PATH "${MARIADB_MSI_DIR}/${MARIADB_CONNECTOR_CPP_MSI}" MSI_DIR)
|
||||||
execute_process(COMMAND msiexec /a ${MSI_DIR} /qn TARGETDIR=${MSIEXEC_TARGETDIR})
|
execute_process(COMMAND msiexec /a ${MSI_DIR} /qn TARGETDIR=${MSIEXEC_TARGETDIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(MARIADB_SHARED_LIBRARY_LOCATION "${MARIADB_CPP_CONNECTOR_DIR}/mariadbcpp.dll")
|
set(MARIADBCPP_SHARED_LIBRARY_LOCATION "${MARIADB_CPP_CONNECTOR_DIR}/mariadbcpp.dll")
|
||||||
set(MARIADB_IMPLIB_LOCATION "${MARIADB_CPP_CONNECTOR_DIR}/mariadbcpp.lib")
|
set(MARIADB_IMPLIB_LOCATION "${MARIADB_CPP_CONNECTOR_DIR}/mariadbcpp.lib")
|
||||||
set(MARIADB_INCLUDE_DIR "${MARIADB_CPP_CONNECTOR_DIR}/include/mariadb")
|
set(MARIADB_INCLUDE_DIR "${MARIADB_CPP_CONNECTOR_DIR}/include/mariadb")
|
||||||
|
|
||||||
add_custom_target(mariadb_connector_cpp)
|
add_custom_target(mariadb_connector_cpp)
|
||||||
add_custom_command(TARGET mariadb_connector_cpp POST_BUILD
|
add_custom_command(TARGET mariadb_connector_cpp POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
"${MARIADB_CPP_CONNECTOR_DIR}/mariadbcpp.dll"
|
"${MARIADBCPP_SHARED_LIBRARY_LOCATION}"
|
||||||
"${MARIADB_C_CONNECTOR_DIR}/lib/libmariadb.dll"
|
"${MARIADBC_SHARED_LIBRARY_LOCATION}"
|
||||||
"${PROJECT_BINARY_DIR}")
|
"${PROJECT_BINARY_DIR}")
|
||||||
|
|
||||||
# MariaDB uses plugins that the database needs to load, the prebuilt binaries by default will try to find the libraries in system directories,
|
# MariaDB uses plugins that the database needs to load, the prebuilt binaries by default will try to find the libraries in system directories,
|
||||||
# so set this define and the servers will set the MARIADB_PLUGIN_DIR environment variable to the appropriate directory.
|
# so set this define and the servers will set the MARIADB_PLUGIN_DIR environment variable to the appropriate directory.
|
||||||
# Plugin directory is determined at dll load time (this will happen before main()) so we need to delay the dll load so that we can set the environment variable
|
# Plugin directory is determined at dll load time (this will happen before main()) so we need to delay the dll load so that we can set the environment variable
|
||||||
add_link_options(/DELAYLOAD:${MARIADB_SHARED_LIBRARY_LOCATION})
|
add_link_options(/DELAYLOAD:${MARIADBCPP_SHARED_LIBRARY_LOCATION})
|
||||||
add_compile_definitions(MARIADB_PLUGIN_DIR_OVERRIDE="${MARIADB_CPP_CONNECTOR_DIR}/plugin")
|
add_compile_definitions(MARIADB_PLUGIN_DIR_OVERRIDE="${MARIADB_CPP_CONNECTOR_DIR}/plugin")
|
||||||
else() # Build from source
|
else() # Build from source
|
||||||
|
|
||||||
@@ -85,77 +86,61 @@ else() # Build from source
|
|||||||
-DCMAKE_CXX_FLAGS=-D_GLIBCXX_USE_CXX11_ABI=0)
|
-DCMAKE_CXX_FLAGS=-D_GLIBCXX_USE_CXX11_ABI=0)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(MARIADBCPP_INSTALL_DIR ${PROJECT_BINARY_DIR}/prefix)
|
||||||
|
set(MARIADBCPP_LIBRARY_DIR ${PROJECT_BINARY_DIR}/mariadbcpp)
|
||||||
|
set(MARIADBCPP_PLUGIN_DIR ${MARIADBCPP_LIBRARY_DIR}/plugin)
|
||||||
|
set(MARIADBCPP_SOURCE_DIR ${PROJECT_SOURCE_DIR}/thirdparty/mariadb-connector-cpp)
|
||||||
|
set(MARIADB_INCLUDE_DIR "${MARIADBCPP_SOURCE_DIR}/include")
|
||||||
ExternalProject_Add(mariadb_connector_cpp
|
ExternalProject_Add(mariadb_connector_cpp
|
||||||
SOURCE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/mariadb-connector-cpp
|
PREFIX "${PROJECT_BINARY_DIR}/thirdparty/mariadb-connector-cpp"
|
||||||
CMAKE_ARGS -Wno-dev
|
SOURCE_DIR ${MARIADBCPP_SOURCE_DIR}
|
||||||
-DCMAKE_BUILD_RPATH_USE_ORIGIN=${CMAKE_BUILD_RPATH_USE_ORIGIN}
|
INSTALL_DIR ${MARIADBCPP_INSTALL_DIR}
|
||||||
-DCMAKE_INSTALL_PREFIX=./mariadbcpp # Points the connector to the correct plugin directory
|
CMAKE_ARGS -Wno-dev
|
||||||
-DINSTALL_PLUGINDIR=plugin
|
-DWITH_UNIT_TESTS=OFF
|
||||||
${MARIADB_EXTRA_CMAKE_ARGS}
|
-DMARIADB_LINK_DYNAMIC=OFF
|
||||||
PREFIX "${PROJECT_BINARY_DIR}/mariadbcpp"
|
-DCMAKE_BUILD_RPATH_USE_ORIGIN=${CMAKE_BUILD_RPATH_USE_ORIGIN}
|
||||||
BUILD_COMMAND cmake --build . --config RelWithDebInfo -j${MARIADB_CONNECTOR_COMPILE_JOBS}
|
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
|
||||||
INSTALL_COMMAND "")
|
-DINSTALL_LIBDIR=${MARIADBCPP_LIBRARY_DIR}
|
||||||
|
-DINSTALL_PLUGINDIR=${MARIADBCPP_PLUGIN_DIR}
|
||||||
ExternalProject_Get_Property(mariadb_connector_cpp BINARY_DIR)
|
${MARIADB_EXTRA_CMAKE_ARGS}
|
||||||
|
BUILD_ALWAYS true
|
||||||
|
)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(MARIADB_SHARED_LIBRARY_NAME mariadbcpp.dll)
|
set(MARIADB_SHARED_LIBRARY_NAME mariadbcpp.dll)
|
||||||
set(MARIADB_PLUGIN_SUFFIX .dll)
|
set(MARIADB_PLUGIN_SUFFIX .dll)
|
||||||
set(MARIADB_IMPLIB_LOCATION "${BINARY_DIR}/RelWithDebInfo/mariadbcpp.lib")
|
set(MARIADB_IMPLIB_LOCATION "${MARIADBCPP_LIBRARY_DIR}/mariadbcpp.lib")
|
||||||
|
|
||||||
# When built from source windows only seems to check same folder as exe instead specified folder, so use
|
# When built from source windows only seems to check same folder as exe instead specified folder, so use
|
||||||
# environment variable to force it
|
# environment variable to force it
|
||||||
add_link_options(/DELAYLOAD:mariadbcpp.dll)
|
add_link_options(/DELAYLOAD:mariadbcpp.dll)
|
||||||
add_compile_definitions(MARIADB_PLUGIN_DIR_OVERRIDE="${PROJECT_BINARY_DIR}/mariadbcpp/plugin")
|
add_compile_definitions(MARIADB_PLUGIN_DIR_OVERRIDE="${MARIADBCPP_PLUGIN_DIR}")
|
||||||
else()
|
else()
|
||||||
set(MARIADB_SHARED_LIBRARY_NAME libmariadbcpp${CMAKE_SHARED_LIBRARY_SUFFIX})
|
set(MARIADB_SHARED_LIBRARY_NAME libmariadbcpp${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||||
set(MARIADB_PLUGIN_SUFFIX .so)
|
set(MARIADB_PLUGIN_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
set(MARIADBCPP_SHARED_LIBRARY_LOCATION "${MARIADBCPP_LIBRARY_DIR}/${MARIADB_SHARED_LIBRARY_NAME}")
|
||||||
if(isMultiConfig)
|
if(WIN32)
|
||||||
set(MARIADB_SHARED_LIBRARY_LOCATION "${BINARY_DIR}/RelWithDebInfo/${MARIADB_SHARED_LIBRARY_NAME}")
|
set(MARIADBC_SHARED_LIBRARY_LOCATION "${MARIADBCPP_LIBRARY_DIR}/libmariadb.lib")
|
||||||
set(MARIADB_SHARED_LIBRARY_COPY_LOCATION "${PROJECT_BINARY_DIR}/$<CONFIG>")
|
|
||||||
set(MARIADB_PLUGINS_LOCATION "${BINARY_DIR}/libmariadb/RelWithDebInfo")
|
|
||||||
else()
|
|
||||||
set(MARIADB_SHARED_LIBRARY_LOCATION "${BINARY_DIR}/${MARIADB_SHARED_LIBRARY_NAME}")
|
|
||||||
set(MARIADB_SHARED_LIBRARY_COPY_LOCATION "${PROJECT_BINARY_DIR}")
|
|
||||||
set(MARIADB_PLUGINS_LOCATION "${BINARY_DIR}/libmariadb")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(MARIADB_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/thirdparty/mariadb-connector-cpp/include/")
|
|
||||||
|
|
||||||
add_custom_command(TARGET mariadb_connector_cpp POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory
|
|
||||||
${BINARY_DIR}/mariadbcpp/plugin
|
|
||||||
${MARIADB_SHARED_LIBRARY_COPY_LOCATION}
|
|
||||||
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
||||||
${MARIADB_SHARED_LIBRARY_LOCATION}
|
|
||||||
${MARIADB_SHARED_LIBRARY_COPY_LOCATION}
|
|
||||||
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
||||||
${MARIADB_PLUGINS_LOCATION}/caching_sha2_password${MARIADB_PLUGIN_SUFFIX}
|
|
||||||
${MARIADB_PLUGINS_LOCATION}/client_ed25519${MARIADB_PLUGIN_SUFFIX}
|
|
||||||
${MARIADB_PLUGINS_LOCATION}/dialog${MARIADB_PLUGIN_SUFFIX}
|
|
||||||
${MARIADB_PLUGINS_LOCATION}/mysql_clear_password${MARIADB_PLUGIN_SUFFIX}
|
|
||||||
${MARIADB_PLUGINS_LOCATION}/sha256_password${MARIADB_PLUGIN_SUFFIX}
|
|
||||||
${BINARY_DIR}/mariadbcpp/plugin)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Remove the CMakeLists.txt file from the tests folder for the maria-db-connector so we dont compile the tests.
|
|
||||||
if(EXISTS "${CMAKE_SOURCE_DIR}/thirdparty/mariadb-connector-cpp/test/CMakeLists.txt")
|
|
||||||
file(REMOVE "${CMAKE_SOURCE_DIR}/thirdparty/mariadb-connector-cpp/test/CMakeLists.txt")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Create mariadb connector library object
|
# Create mariadb connector library object
|
||||||
add_library(mariadbConnCpp SHARED IMPORTED GLOBAL)
|
add_library(MariaDB::ConnCpp SHARED IMPORTED GLOBAL)
|
||||||
set_property(TARGET mariadbConnCpp PROPERTY IMPORTED_LOCATION ${MARIADB_SHARED_LIBRARY_LOCATION})
|
add_dependencies(MariaDB::ConnCpp mariadb_connector_cpp)
|
||||||
|
set_target_properties(MariaDB::ConnCpp PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${MARIADBCPP_SHARED_LIBRARY_LOCATION}")
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set_property(TARGET mariadbConnCpp PROPERTY IMPORTED_IMPLIB ${MARIADB_IMPLIB_LOCATION})
|
set_target_properties(MariaDB::ConnCpp PROPERTIES
|
||||||
|
IMPORTED_IMPLIB "${MARIADB_IMPLIB_LOCATION}")
|
||||||
|
elseif(APPLE)
|
||||||
|
set_target_properties(MariaDB::ConnCpp PROPERTIES
|
||||||
|
IMPORTED_SONAME "libmariadbcpp")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Add directories to include lists
|
# Add directories to include lists
|
||||||
target_include_directories(mariadbConnCpp INTERFACE ${MARIADB_INCLUDE_DIR})
|
target_include_directories(MariaDB::ConnCpp INTERFACE ${MARIADB_INCLUDE_DIR})
|
||||||
add_dependencies(mariadbConnCpp mariadb_connector_cpp)
|
|
||||||
|
set(MariaDB_FOUND TRUE)
|
||||||
@@ -54,14 +54,14 @@ int main(int argc, char** argv) {
|
|||||||
Server::SetupLogger("AuthServer");
|
Server::SetupLogger("AuthServer");
|
||||||
if (!Game::logger) return EXIT_FAILURE;
|
if (!Game::logger) return EXIT_FAILURE;
|
||||||
|
|
||||||
LOG("Starting Auth server...");
|
Log::Info("Starting Auth server...");
|
||||||
LOG("Version: %s", PROJECT_VERSION);
|
Log::Info("Version: {:s}", PROJECT_VERSION);
|
||||||
LOG("Compiled on: %s", __TIMESTAMP__);
|
Log::Info("Compiled on: {:s}", __TIMESTAMP__);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Database::Connect();
|
Database::Connect();
|
||||||
} catch (sql::SQLException& ex) {
|
} catch (sql::SQLException& ex) {
|
||||||
LOG("Got an error while connecting to the database: %s", ex.what());
|
Log::Info("Got an error while connecting to the database: {:s}", ex.what());
|
||||||
Database::Destroy("AuthServer");
|
Database::Destroy("AuthServer");
|
||||||
delete Game::server;
|
delete Game::server;
|
||||||
delete Game::logger;
|
delete Game::logger;
|
||||||
@@ -77,7 +77,7 @@ int main(int argc, char** argv) {
|
|||||||
masterIP = masterInfo->ip;
|
masterIP = masterInfo->ip;
|
||||||
masterPort = masterInfo->port;
|
masterPort = masterInfo->port;
|
||||||
}
|
}
|
||||||
LOG("Master is at %s:%d", masterIP.c_str(), masterPort);
|
Log::Info("Master is at {:s}:{:d}", masterIP, masterPort);
|
||||||
|
|
||||||
Game::randomEngine = std::mt19937(time(0));
|
Game::randomEngine = std::mt19937(time(0));
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ int main(int argc, char** argv) {
|
|||||||
framesSinceMasterDisconnect++;
|
framesSinceMasterDisconnect++;
|
||||||
|
|
||||||
if (framesSinceMasterDisconnect >= authFramerate) {
|
if (framesSinceMasterDisconnect >= authFramerate) {
|
||||||
LOG("No connection to master!");
|
Log::Info("No connection to master!");
|
||||||
break; //Exit our loop, shut down.
|
break; //Exit our loop, shut down.
|
||||||
}
|
}
|
||||||
} else framesSinceMasterDisconnect = 0;
|
} else framesSinceMasterDisconnect = 0;
|
||||||
@@ -151,7 +151,7 @@ int main(int argc, char** argv) {
|
|||||||
std::this_thread::sleep_until(t);
|
std::this_thread::sleep_until(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("Exited Main Loop! (signal %d)", Game::lastSignal);
|
Log::Info("Exited Main Loop! (signal {:d})", Game::lastSignal);
|
||||||
//Delete our objects here:
|
//Delete our objects here:
|
||||||
Database::Destroy("AuthServer");
|
Database::Destroy("AuthServer");
|
||||||
delete Game::server;
|
delete Game::server;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
add_executable(AuthServer "AuthServer.cpp")
|
add_executable(AuthServer "AuthServer.cpp")
|
||||||
|
|
||||||
target_link_libraries(AuthServer ${COMMON_LIBRARIES} dServer)
|
target_link_libraries(AuthServer PRIVATE ${COMMON_LIBRARIES} dServer)
|
||||||
|
|
||||||
target_include_directories(AuthServer PRIVATE ${PROJECT_SOURCE_DIR}/dServer)
|
target_include_directories(AuthServer PRIVATE ${PROJECT_SOURCE_DIR}/dServer)
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,12 @@ set(DCHATSERVER_SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_executable(ChatServer "ChatServer.cpp")
|
add_executable(ChatServer "ChatServer.cpp")
|
||||||
add_library(dChatServer ${DCHATSERVER_SOURCES})
|
target_include_directories(ChatServer PRIVATE "${PROJECT_SOURCE_DIR}/dChatFilter")
|
||||||
target_include_directories(dChatServer PRIVATE ${PROJECT_SOURCE_DIR}/dServer)
|
|
||||||
add_compile_definitions(ChatServer PRIVATE PROJECT_VERSION="\"${PROJECT_VERSION}\"")
|
add_compile_definitions(ChatServer PRIVATE PROJECT_VERSION="\"${PROJECT_VERSION}\"")
|
||||||
|
|
||||||
target_link_libraries(dChatServer ${COMMON_LIBRARIES} dChatFilter)
|
add_library(dChatServer ${DCHATSERVER_SOURCES})
|
||||||
target_link_libraries(ChatServer ${COMMON_LIBRARIES} dChatFilter dChatServer dServer)
|
target_include_directories(dChatServer PRIVATE "${PROJECT_SOURCE_DIR}/dServer")
|
||||||
|
|
||||||
|
target_link_libraries(dChatServer PRIVATE ${COMMON_LIBRARIES} dChatFilter)
|
||||||
|
target_link_libraries(ChatServer PRIVATE ${COMMON_LIBRARIES} dChatFilter dChatServer dServer)
|
||||||
|
|
||||||
|
|||||||
@@ -27,16 +27,16 @@ void ChatIgnoreList::GetIgnoreList(Packet* packet) {
|
|||||||
|
|
||||||
auto& receiver = Game::playerContainer.GetPlayerDataMutable(playerId);
|
auto& receiver = Game::playerContainer.GetPlayerDataMutable(playerId);
|
||||||
if (!receiver) {
|
if (!receiver) {
|
||||||
LOG("Tried to get ignore list, but player %llu not found in container", playerId);
|
Log::Info("Tried to get ignore list, but player {:d} not found in container", playerId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!receiver.ignoredPlayers.empty()) {
|
if (!receiver.ignoredPlayers.empty()) {
|
||||||
LOG_DEBUG("Player %llu already has an ignore list, but is requesting it again.", playerId);
|
Log::Debug("Player {:d} already has an ignore list, but is requesting it again.", playerId);
|
||||||
} else {
|
} else {
|
||||||
auto ignoreList = Database::Get()->GetIgnoreList(static_cast<uint32_t>(playerId));
|
auto ignoreList = Database::Get()->GetIgnoreList(static_cast<uint32_t>(playerId));
|
||||||
if (ignoreList.empty()) {
|
if (ignoreList.empty()) {
|
||||||
LOG_DEBUG("Player %llu has no ignores", playerId);
|
Log::Debug("Player {:d} has no ignores", playerId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ void ChatIgnoreList::GetIgnoreList(Packet* packet) {
|
|||||||
bitStream.Write(LUWString(ignoredPlayer.playerName, 36));
|
bitStream.Write(LUWString(ignoredPlayer.playerName, 36));
|
||||||
}
|
}
|
||||||
|
|
||||||
Game::server->Send(&bitStream, packet->systemAddress, false);
|
Game::server->Send(bitStream, packet->systemAddress, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatIgnoreList::AddIgnore(Packet* packet) {
|
void ChatIgnoreList::AddIgnore(Packet* packet) {
|
||||||
@@ -69,13 +69,13 @@ void ChatIgnoreList::AddIgnore(Packet* packet) {
|
|||||||
|
|
||||||
auto& receiver = Game::playerContainer.GetPlayerDataMutable(playerId);
|
auto& receiver = Game::playerContainer.GetPlayerDataMutable(playerId);
|
||||||
if (!receiver) {
|
if (!receiver) {
|
||||||
LOG("Tried to get ignore list, but player %llu not found in container", playerId);
|
Log::Info("Tried to get ignore list, but player {:d} not found in container", playerId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr int32_t MAX_IGNORES = 32;
|
constexpr int32_t MAX_IGNORES = 32;
|
||||||
if (receiver.ignoredPlayers.size() > MAX_IGNORES) {
|
if (receiver.ignoredPlayers.size() > MAX_IGNORES) {
|
||||||
LOG_DEBUG("Player %llu has too many ignores", playerId);
|
Log::Debug("Player {:d} has too many ignores", playerId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,11 +91,11 @@ void ChatIgnoreList::AddIgnore(Packet* packet) {
|
|||||||
// Check if the player exists
|
// Check if the player exists
|
||||||
LWOOBJID ignoredPlayerId = LWOOBJID_EMPTY;
|
LWOOBJID ignoredPlayerId = LWOOBJID_EMPTY;
|
||||||
if (toIgnoreStr == receiver.playerName || toIgnoreStr.find("[GM]") == 0) {
|
if (toIgnoreStr == receiver.playerName || toIgnoreStr.find("[GM]") == 0) {
|
||||||
LOG_DEBUG("Player %llu tried to ignore themselves", playerId);
|
Log::Debug("Player {:d} tried to ignore themselves", playerId);
|
||||||
|
|
||||||
bitStream.Write(ChatIgnoreList::AddResponse::GENERAL_ERROR);
|
bitStream.Write(ChatIgnoreList::AddResponse::GENERAL_ERROR);
|
||||||
} else if (std::count(receiver.ignoredPlayers.begin(), receiver.ignoredPlayers.end(), toIgnoreStr) > 0) {
|
} else if (std::count(receiver.ignoredPlayers.begin(), receiver.ignoredPlayers.end(), toIgnoreStr) > 0) {
|
||||||
LOG_DEBUG("Player %llu is already ignoring %s", playerId, toIgnoreStr.c_str());
|
Log::Debug("Player {:d} is already ignoring {:s}", playerId, toIgnoreStr);
|
||||||
|
|
||||||
bitStream.Write(ChatIgnoreList::AddResponse::ALREADY_IGNORED);
|
bitStream.Write(ChatIgnoreList::AddResponse::ALREADY_IGNORED);
|
||||||
} else {
|
} else {
|
||||||
@@ -105,7 +105,7 @@ void ChatIgnoreList::AddIgnore(Packet* packet) {
|
|||||||
// Fall back to query
|
// Fall back to query
|
||||||
auto player = Database::Get()->GetCharacterInfo(toIgnoreStr);
|
auto player = Database::Get()->GetCharacterInfo(toIgnoreStr);
|
||||||
if (!player || player->name != toIgnoreStr) {
|
if (!player || player->name != toIgnoreStr) {
|
||||||
LOG_DEBUG("Player %s not found", toIgnoreStr.c_str());
|
Log::Debug("Player {:s} not found", toIgnoreStr);
|
||||||
} else {
|
} else {
|
||||||
ignoredPlayerId = player->id;
|
ignoredPlayerId = player->id;
|
||||||
}
|
}
|
||||||
@@ -119,7 +119,7 @@ void ChatIgnoreList::AddIgnore(Packet* packet) {
|
|||||||
GeneralUtils::SetBit(ignoredPlayerId, eObjectBits::PERSISTENT);
|
GeneralUtils::SetBit(ignoredPlayerId, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
receiver.ignoredPlayers.emplace_back(toIgnoreStr, ignoredPlayerId);
|
receiver.ignoredPlayers.emplace_back(toIgnoreStr, ignoredPlayerId);
|
||||||
LOG_DEBUG("Player %llu is ignoring %s", playerId, toIgnoreStr.c_str());
|
Log::Debug("Player {:d} is ignoring {:s}", playerId, toIgnoreStr);
|
||||||
|
|
||||||
bitStream.Write(ChatIgnoreList::AddResponse::SUCCESS);
|
bitStream.Write(ChatIgnoreList::AddResponse::SUCCESS);
|
||||||
} else {
|
} else {
|
||||||
@@ -131,7 +131,7 @@ void ChatIgnoreList::AddIgnore(Packet* packet) {
|
|||||||
bitStream.Write(playerNameSend);
|
bitStream.Write(playerNameSend);
|
||||||
bitStream.Write(ignoredPlayerId);
|
bitStream.Write(ignoredPlayerId);
|
||||||
|
|
||||||
Game::server->Send(&bitStream, packet->systemAddress, false);
|
Game::server->Send(bitStream, packet->systemAddress, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatIgnoreList::RemoveIgnore(Packet* packet) {
|
void ChatIgnoreList::RemoveIgnore(Packet* packet) {
|
||||||
@@ -141,7 +141,7 @@ void ChatIgnoreList::RemoveIgnore(Packet* packet) {
|
|||||||
|
|
||||||
auto& receiver = Game::playerContainer.GetPlayerDataMutable(playerId);
|
auto& receiver = Game::playerContainer.GetPlayerDataMutable(playerId);
|
||||||
if (!receiver) {
|
if (!receiver) {
|
||||||
LOG("Tried to get ignore list, but player %llu not found in container", playerId);
|
Log::Info("Tried to get ignore list, but player {:d} not found in container", playerId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@ void ChatIgnoreList::RemoveIgnore(Packet* packet) {
|
|||||||
|
|
||||||
auto toRemove = std::remove(receiver.ignoredPlayers.begin(), receiver.ignoredPlayers.end(), removedIgnoreStr);
|
auto toRemove = std::remove(receiver.ignoredPlayers.begin(), receiver.ignoredPlayers.end(), removedIgnoreStr);
|
||||||
if (toRemove == receiver.ignoredPlayers.end()) {
|
if (toRemove == receiver.ignoredPlayers.end()) {
|
||||||
LOG_DEBUG("Player %llu is not ignoring %s", playerId, removedIgnoreStr.c_str());
|
Log::Debug("Player {:d} is not ignoring {:s}", playerId, removedIgnoreStr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,5 +167,5 @@ void ChatIgnoreList::RemoveIgnore(Packet* packet) {
|
|||||||
LUWString playerNameSend(removedIgnoreStr, 33);
|
LUWString playerNameSend(removedIgnoreStr, 33);
|
||||||
bitStream.Write(playerNameSend);
|
bitStream.Write(playerNameSend);
|
||||||
|
|
||||||
Game::server->Send(&bitStream, packet->systemAddress, false);
|
Game::server->Send(bitStream, packet->systemAddress, false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) {
|
|||||||
|
|
||||||
auto& requestor = Game::playerContainer.GetPlayerDataMutable(requestorPlayerID);
|
auto& requestor = Game::playerContainer.GetPlayerDataMutable(requestorPlayerID);
|
||||||
if (!requestor) {
|
if (!requestor) {
|
||||||
LOG("No requestor player %llu sent to %s found.", requestorPlayerID, playerName.c_str());
|
Log::Info("No requestor player {:d} sent to {:s} found.", requestorPlayerID, playerName);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,7 +376,7 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet) {
|
|||||||
LUWString message(size);
|
LUWString message(size);
|
||||||
inStream.Read(message);
|
inStream.Read(message);
|
||||||
|
|
||||||
LOG("Got a message from (%s) via [%s]: %s", sender.playerName.c_str(), StringifiedEnum::ToString(channel).data(), message.GetAsString().c_str());
|
Log::Info("Got a message from ({:s}) via [{:s}]: {:s}", sender.playerName, StringifiedEnum::ToString(channel), message.GetAsString());
|
||||||
|
|
||||||
switch (channel) {
|
switch (channel) {
|
||||||
case eChatChannel::TEAM: {
|
case eChatChannel::TEAM: {
|
||||||
@@ -391,7 +391,7 @@ void ChatPacketHandler::HandleChatMessage(Packet* packet) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
LOG("Unhandled Chat channel [%s]", StringifiedEnum::ToString(channel).data());
|
Log::Info("Unhandled Chat channel [{:s}]", StringifiedEnum::ToString(channel));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -412,7 +412,7 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
|
|||||||
|
|
||||||
inStream.IgnoreBytes(4);
|
inStream.IgnoreBytes(4);
|
||||||
inStream.Read(channel);
|
inStream.Read(channel);
|
||||||
if (channel != eChatChannel::PRIVATE_CHAT) LOG("WARNING: Received Private chat with the wrong channel!");
|
if (channel != eChatChannel::PRIVATE_CHAT) Log::Info("WARNING: Received Private chat with the wrong channel!");
|
||||||
|
|
||||||
inStream.Read(size);
|
inStream.Read(size);
|
||||||
inStream.IgnoreBytes(77);
|
inStream.IgnoreBytes(77);
|
||||||
@@ -424,7 +424,7 @@ void ChatPacketHandler::HandlePrivateChatMessage(Packet* packet) {
|
|||||||
LUWString message(size);
|
LUWString message(size);
|
||||||
inStream.Read(message);
|
inStream.Read(message);
|
||||||
|
|
||||||
LOG("Got a message from (%s) via [%s]: %s to %s", sender.playerName.c_str(), StringifiedEnum::ToString(channel).data(), message.GetAsString().c_str(), receiverName.c_str());
|
Log::Info("Got a message from ({:s}) via [{:s}]: {:s} to {:s}", sender.playerName, StringifiedEnum::ToString(channel), message.GetAsString(), receiverName);
|
||||||
|
|
||||||
const auto& receiver = Game::playerContainer.GetPlayerData(receiverName);
|
const auto& receiver = Game::playerContainer.GetPlayerData(receiverName);
|
||||||
if (!receiver) {
|
if (!receiver) {
|
||||||
@@ -506,13 +506,13 @@ void ChatPacketHandler::HandleTeamInvite(Packet* packet) {
|
|||||||
if (team->memberIDs.size() > 3) {
|
if (team->memberIDs.size() > 3) {
|
||||||
// no more teams greater than 4
|
// no more teams greater than 4
|
||||||
|
|
||||||
LOG("Someone tried to invite a 5th player to a team");
|
Log::Info("Someone tried to invite a 5th player to a team");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SendTeamInvite(other, player);
|
SendTeamInvite(other, player);
|
||||||
|
|
||||||
LOG("Got team invite: %llu -> %s", playerID, invitedPlayer.GetAsString().c_str());
|
Log::Info("Got team invite: {:d} -> {:s}", playerID, invitedPlayer.GetAsString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
|
void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
|
||||||
@@ -526,7 +526,7 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
|
|||||||
LWOOBJID leaderID = LWOOBJID_EMPTY;
|
LWOOBJID leaderID = LWOOBJID_EMPTY;
|
||||||
inStream.Read(leaderID);
|
inStream.Read(leaderID);
|
||||||
|
|
||||||
LOG("Accepted invite: %llu -> %llu (%d)", playerID, leaderID, declined);
|
Log::Info("Accepted invite: {:d} -> {:d} ({:d})", playerID, leaderID, declined);
|
||||||
|
|
||||||
if (declined) {
|
if (declined) {
|
||||||
return;
|
return;
|
||||||
@@ -535,13 +535,13 @@ void ChatPacketHandler::HandleTeamInviteResponse(Packet* packet) {
|
|||||||
auto* team = Game::playerContainer.GetTeam(leaderID);
|
auto* team = Game::playerContainer.GetTeam(leaderID);
|
||||||
|
|
||||||
if (team == nullptr) {
|
if (team == nullptr) {
|
||||||
LOG("Failed to find team for leader (%llu)", leaderID);
|
Log::Info("Failed to find team for leader ({:d})", leaderID);
|
||||||
|
|
||||||
team = Game::playerContainer.GetTeam(playerID);
|
team = Game::playerContainer.GetTeam(playerID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (team == nullptr) {
|
if (team == nullptr) {
|
||||||
LOG("Failed to find team for player (%llu)", playerID);
|
Log::Info("Failed to find team for player ({:d})", playerID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,7 +557,7 @@ void ChatPacketHandler::HandleTeamLeave(Packet* packet) {
|
|||||||
|
|
||||||
auto* team = Game::playerContainer.GetTeam(playerID);
|
auto* team = Game::playerContainer.GetTeam(playerID);
|
||||||
|
|
||||||
LOG("(%llu) leaving team", playerID);
|
Log::Info("({:d}) leaving team", playerID);
|
||||||
|
|
||||||
if (team != nullptr) {
|
if (team != nullptr) {
|
||||||
Game::playerContainer.RemoveMember(team, playerID, false, false, true);
|
Game::playerContainer.RemoveMember(team, playerID, false, false, true);
|
||||||
@@ -575,7 +575,7 @@ void ChatPacketHandler::HandleTeamKick(Packet* packet) {
|
|||||||
inStream.Read(kickedPlayer);
|
inStream.Read(kickedPlayer);
|
||||||
|
|
||||||
|
|
||||||
LOG("(%llu) kicking (%s) from team", playerID, kickedPlayer.GetAsString().c_str());
|
Log::Info("({:d}) kicking ({:s}) from team", playerID, kickedPlayer.GetAsString());
|
||||||
|
|
||||||
const auto& kicked = Game::playerContainer.GetPlayerData(kickedPlayer.GetAsString());
|
const auto& kicked = Game::playerContainer.GetPlayerData(kickedPlayer.GetAsString());
|
||||||
|
|
||||||
@@ -608,7 +608,7 @@ void ChatPacketHandler::HandleTeamPromote(Packet* packet) {
|
|||||||
inStream.IgnoreBytes(4);
|
inStream.IgnoreBytes(4);
|
||||||
inStream.Read(promotedPlayer);
|
inStream.Read(promotedPlayer);
|
||||||
|
|
||||||
LOG("(%llu) promoting (%s) to team leader", playerID, promotedPlayer.GetAsString().c_str());
|
Log::Info("({:d}) promoting ({:s}) to team leader", playerID, promotedPlayer.GetAsString());
|
||||||
|
|
||||||
const auto& promoted = Game::playerContainer.GetPlayerData(promotedPlayer.GetAsString());
|
const auto& promoted = Game::playerContainer.GetPlayerData(promotedPlayer.GetAsString());
|
||||||
|
|
||||||
|
|||||||
@@ -60,9 +60,9 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
//Read our config:
|
//Read our config:
|
||||||
|
|
||||||
LOG("Starting Chat server...");
|
Log::Info("Starting Chat server...");
|
||||||
LOG("Version: %s", PROJECT_VERSION);
|
Log::Info("Version: {:s}", PROJECT_VERSION);
|
||||||
LOG("Compiled on: %s", __TIMESTAMP__);
|
Log::Info("Compiled on: {:s}", __TIMESTAMP__);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
std::string clientPathStr = Game::config->GetValue("client_location");
|
std::string clientPathStr = Game::config->GetValue("client_location");
|
||||||
@@ -74,7 +74,7 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
Game::assetManager = new AssetManager(clientPath);
|
Game::assetManager = new AssetManager(clientPath);
|
||||||
} catch (std::runtime_error& ex) {
|
} catch (std::runtime_error& ex) {
|
||||||
LOG("Got an error while setting up assets: %s", ex.what());
|
Log::Info("Got an error while setting up assets: {:s}", ex.what());
|
||||||
|
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ int main(int argc, char** argv) {
|
|||||||
try {
|
try {
|
||||||
Database::Connect();
|
Database::Connect();
|
||||||
} catch (sql::SQLException& ex) {
|
} catch (sql::SQLException& ex) {
|
||||||
LOG("Got an error while connecting to the database: %s", ex.what());
|
Log::Info("Got an error while connecting to the database: {:s}", ex.what());
|
||||||
Database::Destroy("ChatServer");
|
Database::Destroy("ChatServer");
|
||||||
delete Game::server;
|
delete Game::server;
|
||||||
delete Game::logger;
|
delete Game::logger;
|
||||||
@@ -101,7 +101,7 @@ int main(int argc, char** argv) {
|
|||||||
//It's safe to pass 'localhost' here, as the IP is only used as the external IP.
|
//It's safe to pass 'localhost' here, as the IP is only used as the external IP.
|
||||||
std::string ourIP = "localhost";
|
std::string ourIP = "localhost";
|
||||||
const uint32_t maxClients = GeneralUtils::TryParse<uint32_t>(Game::config->GetValue("max_clients")).value_or(999);
|
const uint32_t maxClients = GeneralUtils::TryParse<uint32_t>(Game::config->GetValue("max_clients")).value_or(999);
|
||||||
const uint32_t ourPort = GeneralUtils::TryParse<uint32_t>(Game::config->GetValue("chat_server_port")).value_or(1501);
|
const uint32_t ourPort = GeneralUtils::TryParse<uint32_t>(Game::config->GetValue("chat_server_port")).value_or(2005);
|
||||||
const auto externalIPString = Game::config->GetValue("external_ip");
|
const auto externalIPString = Game::config->GetValue("external_ip");
|
||||||
if (!externalIPString.empty()) ourIP = externalIPString;
|
if (!externalIPString.empty()) ourIP = externalIPString;
|
||||||
|
|
||||||
@@ -181,11 +181,11 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
void HandlePacket(Packet* packet) {
|
void HandlePacket(Packet* packet) {
|
||||||
if (packet->data[0] == ID_DISCONNECTION_NOTIFICATION || packet->data[0] == ID_CONNECTION_LOST) {
|
if (packet->data[0] == ID_DISCONNECTION_NOTIFICATION || packet->data[0] == ID_CONNECTION_LOST) {
|
||||||
LOG("A server has disconnected, erasing their connected players from the list.");
|
Log::Info("A server has disconnected, erasing their connected players from the list.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet->data[0] == ID_NEW_INCOMING_CONNECTION) {
|
if (packet->data[0] == ID_NEW_INCOMING_CONNECTION) {
|
||||||
LOG("A server is connecting, awaiting user list.");
|
Log::Info("A server is connecting, awaiting user list.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet->length < 4) return; // Nothing left to process. Need 4 bytes to continue.
|
if (packet->length < 4) return; // Nothing left to process. Need 4 bytes to continue.
|
||||||
@@ -211,12 +211,12 @@ void HandlePacket(Packet* packet) {
|
|||||||
case eChatInternalMessageType::ANNOUNCEMENT: {
|
case eChatInternalMessageType::ANNOUNCEMENT: {
|
||||||
//we just forward this packet to every connected server
|
//we just forward this packet to every connected server
|
||||||
CINSTREAM;
|
CINSTREAM;
|
||||||
Game::server->Send(&inStream, packet->systemAddress, true); //send to everyone except origin
|
Game::server->Send(inStream, packet->systemAddress, true); //send to everyone except origin
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG("Unknown CHAT_INTERNAL id: %i", int(packet->data[3]));
|
Log::Info("Unknown CHAT_INTERNAL id: {:d}", static_cast<int>(packet->data[3]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -343,22 +343,22 @@ void HandlePacket(Packet* packet) {
|
|||||||
case eChatMessageType::PRG_CSR_COMMAND:
|
case eChatMessageType::PRG_CSR_COMMAND:
|
||||||
case eChatMessageType::HEARTBEAT_REQUEST_FROM_WORLD:
|
case eChatMessageType::HEARTBEAT_REQUEST_FROM_WORLD:
|
||||||
case eChatMessageType::UPDATE_FREE_TRIAL_STATUS:
|
case eChatMessageType::UPDATE_FREE_TRIAL_STATUS:
|
||||||
LOG("Unhandled CHAT Message id: %s (%i)", StringifiedEnum::ToString(chat_message_type).data(), chat_message_type);
|
Log::Info("Unhandled CHAT Message id: {:s} {:d}", StringifiedEnum::ToString(chat_message_type), GeneralUtils::ToUnderlying(chat_message_type));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG("Unknown CHAT Message id: %i", chat_message_type);
|
Log::Info("Unknown CHAT Message id: {:d}", GeneralUtils::ToUnderlying(chat_message_type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::WORLD) {
|
if (static_cast<eConnectionType>(packet->data[1]) == eConnectionType::WORLD) {
|
||||||
switch (static_cast<eWorldMessageType>(packet->data[3])) {
|
switch (static_cast<eWorldMessageType>(packet->data[3])) {
|
||||||
case eWorldMessageType::ROUTE_PACKET: {
|
case eWorldMessageType::ROUTE_PACKET: {
|
||||||
LOG("Routing packet from world");
|
Log::Info("Routing packet from world");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG("Unknown World id: %i", int(packet->data[3]));
|
Log::Info("Unknown World id: {:d}", static_cast<int>(packet->data[3]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ void PlayerContainer::InsertPlayer(Packet* packet) {
|
|||||||
CINSTREAM_SKIP_HEADER;
|
CINSTREAM_SKIP_HEADER;
|
||||||
LWOOBJID playerId;
|
LWOOBJID playerId;
|
||||||
if (!inStream.Read(playerId)) {
|
if (!inStream.Read(playerId)) {
|
||||||
LOG("Failed to read player ID");
|
Log::Warn("Failed to read player ID");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ void PlayerContainer::InsertPlayer(Packet* packet) {
|
|||||||
|
|
||||||
m_Names[data.playerID] = GeneralUtils::UTF8ToUTF16(data.playerName);
|
m_Names[data.playerID] = GeneralUtils::UTF8ToUTF16(data.playerName);
|
||||||
|
|
||||||
LOG("Added user: %s (%llu), zone: %i", data.playerName.c_str(), data.playerID, data.zoneID.GetMapID());
|
Log::Info("Added user: {:s} ({:d}), zone: {:d}", data.playerName, data.playerID, data.zoneID.GetMapID());
|
||||||
|
|
||||||
Database::Get()->UpdateActivityLog(data.playerID, eActivityType::PlayerLoggedIn, data.zoneID.GetMapID());
|
Database::Get()->UpdateActivityLog(data.playerID, eActivityType::PlayerLoggedIn, data.zoneID.GetMapID());
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ void PlayerContainer::RemovePlayer(Packet* packet) {
|
|||||||
const auto& player = GetPlayerData(playerID);
|
const auto& player = GetPlayerData(playerID);
|
||||||
|
|
||||||
if (!player) {
|
if (!player) {
|
||||||
LOG("Failed to find user: %llu", playerID);
|
Log::Info("Failed to find user: {:d}", playerID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ void PlayerContainer::RemovePlayer(Packet* packet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("Removed user: %llu", playerID);
|
Log::Info("Removed user: {:d}", playerID);
|
||||||
m_Players.erase(playerID);
|
m_Players.erase(playerID);
|
||||||
|
|
||||||
Database::Get()->UpdateActivityLog(playerID, eActivityType::PlayerLoggedOut, player.zoneID.GetMapID());
|
Database::Get()->UpdateActivityLog(playerID, eActivityType::PlayerLoggedOut, player.zoneID.GetMapID());
|
||||||
@@ -103,7 +103,7 @@ void PlayerContainer::MuteUpdate(Packet* packet) {
|
|||||||
auto& player = this->GetPlayerDataMutable(playerID);
|
auto& player = this->GetPlayerDataMutable(playerID);
|
||||||
|
|
||||||
if (!player) {
|
if (!player) {
|
||||||
LOG("Failed to find user: %llu", playerID);
|
Log::Warn("Failed to find user: {:d}", playerID);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,7 @@ void PlayerContainer::BroadcastMuteUpdate(LWOOBJID player, time_t time) {
|
|||||||
bitStream.Write(player);
|
bitStream.Write(player);
|
||||||
bitStream.Write(time);
|
bitStream.Write(time);
|
||||||
|
|
||||||
Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
Game::server->Send(bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
TeamData* PlayerContainer::CreateLocalTeam(std::vector<LWOOBJID> members) {
|
TeamData* PlayerContainer::CreateLocalTeam(std::vector<LWOOBJID> members) {
|
||||||
@@ -207,7 +207,7 @@ TeamData* PlayerContainer::GetTeam(LWOOBJID playerID) {
|
|||||||
|
|
||||||
void PlayerContainer::AddMember(TeamData* team, LWOOBJID playerID) {
|
void PlayerContainer::AddMember(TeamData* team, LWOOBJID playerID) {
|
||||||
if (team->memberIDs.size() >= 4) {
|
if (team->memberIDs.size() >= 4) {
|
||||||
LOG("Tried to add player to team that already had 4 players");
|
Log::Warn("Tried to add player to team that already had 4 players");
|
||||||
const auto& player = GetPlayerData(playerID);
|
const auto& player = GetPlayerData(playerID);
|
||||||
if (!player) return;
|
if (!player) return;
|
||||||
ChatPackets::SendSystemMessage(player.sysAddr, u"The teams is full! You have not been added to a team!");
|
ChatPackets::SendSystemMessage(player.sysAddr, u"The teams is full! You have not been added to a team!");
|
||||||
@@ -365,7 +365,7 @@ void PlayerContainer::UpdateTeamsOnWorld(TeamData* team, bool deleteTeam) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
Game::server->Send(bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::u16string PlayerContainer::GetName(LWOOBJID playerID) {
|
std::u16string PlayerContainer::GetName(LWOOBJID playerID) {
|
||||||
|
|||||||
@@ -9,12 +9,11 @@
|
|||||||
* AMF3 Deserializer written by EmosewaMC
|
* AMF3 Deserializer written by EmosewaMC
|
||||||
*/
|
*/
|
||||||
|
|
||||||
AMFBaseValue* AMFDeserialize::Read(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::Read(RakNet::BitStream& inStream) {
|
||||||
if (!inStream) return nullptr;
|
|
||||||
AMFBaseValue* returnValue = nullptr;
|
AMFBaseValue* returnValue = nullptr;
|
||||||
// Read in the value type from the bitStream
|
// Read in the value type from the bitStream
|
||||||
eAmf marker;
|
eAmf marker;
|
||||||
inStream->Read(marker);
|
inStream.Read(marker);
|
||||||
// Based on the typing, create the value associated with that and return the base value class
|
// Based on the typing, create the value associated with that and return the base value class
|
||||||
switch (marker) {
|
switch (marker) {
|
||||||
case eAmf::Undefined: {
|
case eAmf::Undefined: {
|
||||||
@@ -79,13 +78,13 @@ AMFBaseValue* AMFDeserialize::Read(RakNet::BitStream* inStream) {
|
|||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t AMFDeserialize::ReadU29(RakNet::BitStream* inStream) {
|
uint32_t AMFDeserialize::ReadU29(RakNet::BitStream& inStream) {
|
||||||
bool byteFlag = true;
|
bool byteFlag = true;
|
||||||
uint32_t actualNumber{};
|
uint32_t actualNumber{};
|
||||||
uint8_t numberOfBytesRead{};
|
uint8_t numberOfBytesRead{};
|
||||||
while (byteFlag && numberOfBytesRead < 4) {
|
while (byteFlag && numberOfBytesRead < 4) {
|
||||||
uint8_t byte{};
|
uint8_t byte{};
|
||||||
inStream->Read(byte);
|
inStream.Read(byte);
|
||||||
// Parse the byte
|
// Parse the byte
|
||||||
if (numberOfBytesRead < 3) {
|
if (numberOfBytesRead < 3) {
|
||||||
byteFlag = byte & static_cast<uint8_t>(1 << 7);
|
byteFlag = byte & static_cast<uint8_t>(1 << 7);
|
||||||
@@ -101,7 +100,7 @@ uint32_t AMFDeserialize::ReadU29(RakNet::BitStream* inStream) {
|
|||||||
return actualNumber;
|
return actualNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
|
const std::string AMFDeserialize::ReadString(RakNet::BitStream& inStream) {
|
||||||
auto length = ReadU29(inStream);
|
auto length = ReadU29(inStream);
|
||||||
// Check if this is a reference
|
// Check if this is a reference
|
||||||
bool isReference = length % 2 == 1;
|
bool isReference = length % 2 == 1;
|
||||||
@@ -109,7 +108,7 @@ const std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
|
|||||||
length = length >> 1;
|
length = length >> 1;
|
||||||
if (isReference) {
|
if (isReference) {
|
||||||
std::string value(length, 0);
|
std::string value(length, 0);
|
||||||
inStream->Read(&value[0], length);
|
inStream.Read(&value[0], length);
|
||||||
// Empty strings are never sent by reference
|
// Empty strings are never sent by reference
|
||||||
if (!value.empty()) accessedElements.push_back(value);
|
if (!value.empty()) accessedElements.push_back(value);
|
||||||
return value;
|
return value;
|
||||||
@@ -119,20 +118,20 @@ const std::string AMFDeserialize::ReadString(RakNet::BitStream* inStream) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFBaseValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::ReadAmfDouble(RakNet::BitStream& inStream) {
|
||||||
double value;
|
double value;
|
||||||
inStream->Read<double>(value);
|
inStream.Read<double>(value);
|
||||||
return new AMFDoubleValue(value);
|
return new AMFDoubleValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFBaseValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream& inStream) {
|
||||||
auto arrayValue = new AMFArrayValue();
|
auto arrayValue = new AMFArrayValue();
|
||||||
|
|
||||||
// Read size of dense array
|
// Read size of dense array
|
||||||
auto sizeOfDenseArray = (ReadU29(inStream) >> 1);
|
const auto sizeOfDenseArray = (ReadU29(inStream) >> 1);
|
||||||
// Then read associative portion
|
// Then read associative portion
|
||||||
while (true) {
|
while (true) {
|
||||||
auto key = ReadString(inStream);
|
const auto key = ReadString(inStream);
|
||||||
// No more associative values when we encounter an empty string key
|
// No more associative values when we encounter an empty string key
|
||||||
if (key.size() == 0) break;
|
if (key.size() == 0) break;
|
||||||
arrayValue->Insert(key, Read(inStream));
|
arrayValue->Insert(key, Read(inStream));
|
||||||
@@ -144,10 +143,10 @@ AMFBaseValue* AMFDeserialize::ReadAmfArray(RakNet::BitStream* inStream) {
|
|||||||
return arrayValue;
|
return arrayValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFBaseValue* AMFDeserialize::ReadAmfString(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::ReadAmfString(RakNet::BitStream& inStream) {
|
||||||
return new AMFStringValue(ReadString(inStream));
|
return new AMFStringValue(ReadString(inStream));
|
||||||
}
|
}
|
||||||
|
|
||||||
AMFBaseValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream* inStream) {
|
AMFBaseValue* AMFDeserialize::ReadAmfInteger(RakNet::BitStream& inStream) {
|
||||||
return new AMFIntValue(ReadU29(inStream));
|
return new AMFIntValue(ReadU29(inStream));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public:
|
|||||||
* @param inStream inStream to read value from.
|
* @param inStream inStream to read value from.
|
||||||
* @return Returns an AMFValue with all the information from the bitStream in it.
|
* @return Returns an AMFValue with all the information from the bitStream in it.
|
||||||
*/
|
*/
|
||||||
AMFBaseValue* Read(RakNet::BitStream* inStream);
|
AMFBaseValue* Read(RakNet::BitStream& inStream);
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* @brief Private method to read a U29 integer from a bitstream
|
* @brief Private method to read a U29 integer from a bitstream
|
||||||
@@ -23,7 +23,7 @@ private:
|
|||||||
* @param inStream bitstream to read data from
|
* @param inStream bitstream to read data from
|
||||||
* @return The number as an unsigned 29 bit integer
|
* @return The number as an unsigned 29 bit integer
|
||||||
*/
|
*/
|
||||||
uint32_t ReadU29(RakNet::BitStream* inStream);
|
static uint32_t ReadU29(RakNet::BitStream& inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Reads a string from a bitstream
|
* @brief Reads a string from a bitstream
|
||||||
@@ -31,7 +31,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return The read string
|
* @return The read string
|
||||||
*/
|
*/
|
||||||
const std::string ReadString(RakNet::BitStream* inStream);
|
const std::string ReadString(RakNet::BitStream& inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFDouble value from a bitStream
|
* @brief Read an AMFDouble value from a bitStream
|
||||||
@@ -39,7 +39,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return Double value represented as an AMFValue
|
* @return Double value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFBaseValue* ReadAmfDouble(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfDouble(RakNet::BitStream& inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFArray from a bitStream
|
* @brief Read an AMFArray from a bitStream
|
||||||
@@ -47,7 +47,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return Array value represented as an AMFValue
|
* @return Array value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFBaseValue* ReadAmfArray(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfArray(RakNet::BitStream& inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFString from a bitStream
|
* @brief Read an AMFString from a bitStream
|
||||||
@@ -55,7 +55,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return String value represented as an AMFValue
|
* @return String value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFBaseValue* ReadAmfString(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfString(RakNet::BitStream& inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read an AMFInteger from a bitStream
|
* @brief Read an AMFInteger from a bitStream
|
||||||
@@ -63,7 +63,7 @@ private:
|
|||||||
* @param inStream bitStream to read data from
|
* @param inStream bitStream to read data from
|
||||||
* @return Integer value represented as an AMFValue
|
* @return Integer value represented as an AMFValue
|
||||||
*/
|
*/
|
||||||
AMFBaseValue* ReadAmfInteger(RakNet::BitStream* inStream);
|
AMFBaseValue* ReadAmfInteger(RakNet::BitStream& inStream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of strings read so far saved to be read by reference.
|
* List of strings read so far saved to be read by reference.
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class AMFValue : public AMFBaseValue {
|
|||||||
public:
|
public:
|
||||||
AMFValue() = default;
|
AMFValue() = default;
|
||||||
AMFValue(const ValueType value) : m_Data{ value } {}
|
AMFValue(const ValueType value) : m_Data{ value } {}
|
||||||
|
|
||||||
virtual ~AMFValue() override = default;
|
virtual ~AMFValue() override = default;
|
||||||
|
|
||||||
[[nodiscard]] constexpr eAmf GetValueType() const noexcept override;
|
[[nodiscard]] constexpr eAmf GetValueType() const noexcept override;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ void RakNet::BitStream::Write<AMFBaseValue&>(AMFBaseValue& value) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
LOG("Encountered unwritable AMFType %i!", type);
|
Log::Warn("Encountered unwritable AMFType {:d}!", GeneralUtils::ToUnderlying(type));
|
||||||
}
|
}
|
||||||
case eAmf::Undefined:
|
case eAmf::Undefined:
|
||||||
case eAmf::Null:
|
case eAmf::Null:
|
||||||
@@ -53,7 +53,7 @@ void RakNet::BitStream::Write<AMFBaseValue&>(AMFBaseValue& value) {
|
|||||||
* A private function to write an value to a RakNet::BitStream
|
* A private function to write an value to a RakNet::BitStream
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
*/
|
*/
|
||||||
void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
|
void WriteUInt29(RakNet::BitStream& bs, uint32_t v) {
|
||||||
unsigned char b4 = static_cast<unsigned char>(v);
|
unsigned char b4 = static_cast<unsigned char>(v);
|
||||||
if (v < 0x00200000) {
|
if (v < 0x00200000) {
|
||||||
b4 = b4 & 0x7F;
|
b4 = b4 & 0x7F;
|
||||||
@@ -65,10 +65,10 @@ void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
|
|||||||
unsigned char b2;
|
unsigned char b2;
|
||||||
v = v >> 7;
|
v = v >> 7;
|
||||||
b2 = static_cast<unsigned char>(v) | 0x80;
|
b2 = static_cast<unsigned char>(v) | 0x80;
|
||||||
bs->Write(b2);
|
bs.Write(b2);
|
||||||
}
|
}
|
||||||
|
|
||||||
bs->Write(b3);
|
bs.Write(b3);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned char b1;
|
unsigned char b1;
|
||||||
@@ -82,19 +82,19 @@ void WriteUInt29(RakNet::BitStream* bs, uint32_t v) {
|
|||||||
v = v >> 7;
|
v = v >> 7;
|
||||||
b1 = static_cast<unsigned char>(v) | 0x80;
|
b1 = static_cast<unsigned char>(v) | 0x80;
|
||||||
|
|
||||||
bs->Write(b1);
|
bs.Write(b1);
|
||||||
bs->Write(b2);
|
bs.Write(b2);
|
||||||
bs->Write(b3);
|
bs.Write(b3);
|
||||||
}
|
}
|
||||||
|
|
||||||
bs->Write(b4);
|
bs.Write(b4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a flag number to a RakNet::BitStream
|
* Writes a flag number to a RakNet::BitStream
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
*/
|
*/
|
||||||
void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) {
|
void WriteFlagNumber(RakNet::BitStream& bs, uint32_t v) {
|
||||||
v = (v << 1) | 0x01;
|
v = (v << 1) | 0x01;
|
||||||
WriteUInt29(bs, v);
|
WriteUInt29(bs, v);
|
||||||
}
|
}
|
||||||
@@ -104,9 +104,9 @@ void WriteFlagNumber(RakNet::BitStream* bs, uint32_t v) {
|
|||||||
*
|
*
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
*/
|
*/
|
||||||
void WriteAMFString(RakNet::BitStream* bs, const std::string& str) {
|
void WriteAMFString(RakNet::BitStream& bs, const std::string& str) {
|
||||||
WriteFlagNumber(bs, static_cast<uint32_t>(str.size()));
|
WriteFlagNumber(bs, static_cast<uint32_t>(str.size()));
|
||||||
bs->Write(str.c_str(), static_cast<uint32_t>(str.size()));
|
bs.Write(str.c_str(), static_cast<uint32_t>(str.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -114,8 +114,8 @@ void WriteAMFString(RakNet::BitStream* bs, const std::string& str) {
|
|||||||
*
|
*
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
*/
|
*/
|
||||||
void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) {
|
void WriteAMFU16(RakNet::BitStream& bs, uint16_t value) {
|
||||||
bs->Write(value);
|
bs.Write(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -123,8 +123,8 @@ void WriteAMFU16(RakNet::BitStream* bs, uint16_t value) {
|
|||||||
*
|
*
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
*/
|
*/
|
||||||
void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) {
|
void WriteAMFU32(RakNet::BitStream& bs, uint32_t value) {
|
||||||
bs->Write(value);
|
bs.Write(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -132,40 +132,40 @@ void WriteAMFU32(RakNet::BitStream* bs, uint32_t value) {
|
|||||||
*
|
*
|
||||||
* RakNet writes in the correct byte order - do not reverse this.
|
* RakNet writes in the correct byte order - do not reverse this.
|
||||||
*/
|
*/
|
||||||
void WriteAMFU64(RakNet::BitStream* bs, uint64_t value) {
|
void WriteAMFU64(RakNet::BitStream& bs, uint64_t value) {
|
||||||
bs->Write(value);
|
bs.Write(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Writes an AMFIntegerValue to BitStream
|
// Writes an AMFIntegerValue to BitStream
|
||||||
template<>
|
template<>
|
||||||
void RakNet::BitStream::Write<AMFIntValue&>(AMFIntValue& value) {
|
void RakNet::BitStream::Write<AMFIntValue&>(AMFIntValue& value) {
|
||||||
WriteUInt29(this, value.GetValue());
|
WriteUInt29(*this, value.GetValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Writes an AMFDoubleValue to BitStream
|
// Writes an AMFDoubleValue to BitStream
|
||||||
template<>
|
template<>
|
||||||
void RakNet::BitStream::Write<AMFDoubleValue&>(AMFDoubleValue& value) {
|
void RakNet::BitStream::Write<AMFDoubleValue&>(AMFDoubleValue& value) {
|
||||||
double d = value.GetValue();
|
double d = value.GetValue();
|
||||||
WriteAMFU64(this, *reinterpret_cast<uint64_t*>(&d));
|
WriteAMFU64(*this, *reinterpret_cast<uint64_t*>(&d));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Writes an AMFStringValue to BitStream
|
// Writes an AMFStringValue to BitStream
|
||||||
template<>
|
template<>
|
||||||
void RakNet::BitStream::Write<AMFStringValue&>(AMFStringValue& value) {
|
void RakNet::BitStream::Write<AMFStringValue&>(AMFStringValue& value) {
|
||||||
WriteAMFString(this, value.GetValue());
|
WriteAMFString(*this, value.GetValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Writes an AMFArrayValue to BitStream
|
// Writes an AMFArrayValue to BitStream
|
||||||
template<>
|
template<>
|
||||||
void RakNet::BitStream::Write<AMFArrayValue&>(AMFArrayValue& value) {
|
void RakNet::BitStream::Write<AMFArrayValue&>(AMFArrayValue& value) {
|
||||||
uint32_t denseSize = value.GetDense().size();
|
uint32_t denseSize = value.GetDense().size();
|
||||||
WriteFlagNumber(this, denseSize);
|
WriteFlagNumber(*this, denseSize);
|
||||||
|
|
||||||
auto it = value.GetAssociative().begin();
|
auto it = value.GetAssociative().begin();
|
||||||
auto end = value.GetAssociative().end();
|
auto end = value.GetAssociative().end();
|
||||||
|
|
||||||
while (it != end) {
|
while (it != end) {
|
||||||
WriteAMFString(this, it->first);
|
WriteAMFString(*this, it->first);
|
||||||
this->Write<AMFBaseValue&>(*it->second);
|
this->Write<AMFBaseValue&>(*it->second);
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,14 +54,14 @@ uint32_t BrickByBrickFix::TruncateBrokenBrickByBrickXml() {
|
|||||||
completeUncompressedModel.append(reinterpret_cast<char*>(uncompressedChunk.get()));
|
completeUncompressedModel.append(reinterpret_cast<char*>(uncompressedChunk.get()));
|
||||||
completeUncompressedModel.resize(previousSize + actualUncompressedSize);
|
completeUncompressedModel.resize(previousSize + actualUncompressedSize);
|
||||||
} else {
|
} else {
|
||||||
LOG("Failed to inflate chunk %i for model %llu. Error: %i", chunkCount, model.id, err);
|
Log::Warn("Failed to inflate chunk {} for model %llu. Error: {}", chunkCount, model.id, err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
chunkCount++;
|
chunkCount++;
|
||||||
}
|
}
|
||||||
std::unique_ptr<tinyxml2::XMLDocument> document = std::make_unique<tinyxml2::XMLDocument>();
|
std::unique_ptr<tinyxml2::XMLDocument> document = std::make_unique<tinyxml2::XMLDocument>();
|
||||||
if (!document) {
|
if (!document) {
|
||||||
LOG("Failed to initialize tinyxml document. Aborting.");
|
Log::Warn("Failed to initialize tinyxml document. Aborting.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,13 +70,13 @@ uint32_t BrickByBrickFix::TruncateBrokenBrickByBrickXml() {
|
|||||||
"</LXFML>",
|
"</LXFML>",
|
||||||
completeUncompressedModel.length() >= 15 ? completeUncompressedModel.length() - 15 : 0) == std::string::npos
|
completeUncompressedModel.length() >= 15 ? completeUncompressedModel.length() - 15 : 0) == std::string::npos
|
||||||
) {
|
) {
|
||||||
LOG("Brick-by-brick model %llu will be deleted!", model.id);
|
Log::Info("Brick-by-brick model {} will be deleted!", model.id);
|
||||||
Database::Get()->DeleteUgcModelData(model.id);
|
Database::Get()->DeleteUgcModelData(model.id);
|
||||||
modelsTruncated++;
|
modelsTruncated++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG("Brick-by-brick model %llu will be deleted!", model.id);
|
Log::Info("Brick-by-brick model {} will be deleted!", model.id);
|
||||||
Database::Get()->DeleteUgcModelData(model.id);
|
Database::Get()->DeleteUgcModelData(model.id);
|
||||||
modelsTruncated++;
|
modelsTruncated++;
|
||||||
}
|
}
|
||||||
@@ -121,11 +121,11 @@ uint32_t BrickByBrickFix::UpdateBrickByBrickModelsToSd0() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
Database::Get()->UpdateUgcModelData(model.id, outputStringStream);
|
Database::Get()->UpdateUgcModelData(model.id, outputStringStream);
|
||||||
LOG("Updated model %i to sd0", model.id);
|
Log::Info("Updated model {} to sd0", model.id);
|
||||||
updatedModels++;
|
updatedModels++;
|
||||||
} catch (sql::SQLException exception) {
|
} catch (sql::SQLException exception) {
|
||||||
LOG("Failed to update model %i. This model should be inspected manually to see why."
|
Log::Warn("Failed to update model {}. This model should be inspected manually to see why."
|
||||||
"The database error is %s", model.id, exception.what());
|
"The database error is {}", model.id, exception.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,11 +30,15 @@ foreach(file ${DCOMMON_DCLIENT_SOURCES})
|
|||||||
set(DCOMMON_SOURCES ${DCOMMON_SOURCES} "dClient/${file}")
|
set(DCOMMON_SOURCES ${DCOMMON_SOURCES} "dClient/${file}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/dCommon/)
|
|
||||||
|
|
||||||
add_library(dCommon STATIC ${DCOMMON_SOURCES})
|
add_library(dCommon STATIC ${DCOMMON_SOURCES})
|
||||||
|
target_include_directories(dCommon
|
||||||
target_link_libraries(dCommon bcrypt dDatabase tinyxml2)
|
PUBLIC "." "dClient" "dEnums"
|
||||||
|
PRIVATE
|
||||||
|
"${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase/ITables"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dDatabase/CDClientDatabase"
|
||||||
|
"${PROJECT_SOURCE_DIR}/thirdparty/mariadb-connector-cpp/include"
|
||||||
|
)
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
find_package(ZLIB REQUIRED)
|
find_package(ZLIB REQUIRED)
|
||||||
@@ -65,4 +69,7 @@ else ()
|
|||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_link_libraries(dCommon ZLIB::ZLIB)
|
target_link_libraries(dCommon
|
||||||
|
PUBLIC fmt
|
||||||
|
PRIVATE ZLIB::ZLIB bcrypt tinyxml2
|
||||||
|
INTERFACE dDatabase)
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ void make_minidump(EXCEPTION_POINTERS* e) {
|
|||||||
"_%4d%02d%02d_%02d%02d%02d.dmp",
|
"_%4d%02d%02d_%02d%02d%02d.dmp",
|
||||||
t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
|
t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
|
||||||
}
|
}
|
||||||
LOG("Creating crash dump %s", name);
|
Log::Info("Creating crash dump {:s}", name);
|
||||||
auto hFile = CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
auto hFile = CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
return;
|
return;
|
||||||
@@ -83,7 +83,7 @@ struct bt_ctx {
|
|||||||
|
|
||||||
static inline void Bt(struct backtrace_state* state) {
|
static inline void Bt(struct backtrace_state* state) {
|
||||||
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
|
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
|
||||||
LOG("backtrace is enabled, crash dump located at %s", fileName.c_str());
|
Log::Info("backtrace is enabled, crash dump located at {:s}", fileName);
|
||||||
FILE* file = fopen(fileName.c_str(), "w+");
|
FILE* file = fopen(fileName.c_str(), "w+");
|
||||||
if (file != nullptr) {
|
if (file != nullptr) {
|
||||||
backtrace_print(state, 2, file);
|
backtrace_print(state, 2, file);
|
||||||
@@ -95,13 +95,13 @@ static inline void Bt(struct backtrace_state* state) {
|
|||||||
|
|
||||||
static void ErrorCallback(void* data, const char* msg, int errnum) {
|
static void ErrorCallback(void* data, const char* msg, int errnum) {
|
||||||
auto* ctx = (struct bt_ctx*)data;
|
auto* ctx = (struct bt_ctx*)data;
|
||||||
fprintf(stderr, "ERROR: %s (%d)", msg, errnum);
|
fmt::print(stderr, "ERROR: {:s} ({:d})", msg, errnum);
|
||||||
ctx->error = 1;
|
ctx->error = 1;
|
||||||
|
|
||||||
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
|
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
|
||||||
FILE* file = fopen(fileName.c_str(), "w+");
|
FILE* file = fopen(fileName.c_str(), "w+");
|
||||||
if (file != nullptr) {
|
if (file != nullptr) {
|
||||||
fprintf(file, "ERROR: %s (%d)", msg, errnum);
|
fmt::print(file, "ERROR: {:s} ({:d})", msg, errnum);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,13 +119,13 @@ void CatchUnhandled(int sig) {
|
|||||||
try {
|
try {
|
||||||
if (eptr) std::rethrow_exception(eptr);
|
if (eptr) std::rethrow_exception(eptr);
|
||||||
} catch(const std::exception& e) {
|
} catch(const std::exception& e) {
|
||||||
LOG("Caught exception: '%s'", e.what());
|
Log::Warn("Caught exception: '{:s}'", e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef INCLUDE_BACKTRACE
|
#ifndef INCLUDE_BACKTRACE
|
||||||
|
|
||||||
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
|
std::string fileName = Diagnostics::GetOutDirectory() + "crash_" + Diagnostics::GetProcessName() + "_" + std::to_string(getpid()) + ".log";
|
||||||
LOG("Encountered signal %i, creating crash dump %s", sig, fileName.c_str());
|
Log::Warn("Encountered signal {:d}, creating crash dump {:s}", sig, fileName);
|
||||||
if (Diagnostics::GetProduceMemoryDump()) {
|
if (Diagnostics::GetProduceMemoryDump()) {
|
||||||
GenerateDump();
|
GenerateDump();
|
||||||
}
|
}
|
||||||
@@ -143,7 +143,7 @@ void CatchUnhandled(int sig) {
|
|||||||
|
|
||||||
FILE* file = fopen(fileName.c_str(), "w+");
|
FILE* file = fopen(fileName.c_str(), "w+");
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
fprintf(file, "Error: signal %d:\n", sig);
|
fmt::println(file, "Error: signal {:d}:", sig);
|
||||||
}
|
}
|
||||||
// Print the stack trace
|
// Print the stack trace
|
||||||
for (size_t i = 0; i < size; i++) {
|
for (size_t i = 0; i < size; i++) {
|
||||||
@@ -165,9 +165,9 @@ void CatchUnhandled(int sig) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("[%02zu] %s", i, functionName.c_str());
|
Log::Info("[{:02d}] {:s}", i, functionName);
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
fprintf(file, "[%02zu] %s\n", i, functionName.c_str());
|
fmt::println(file, "[{:02d}] {:s}", i, functionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# else // defined(__GNUG__)
|
# else // defined(__GNUG__)
|
||||||
@@ -208,7 +208,7 @@ void MakeBacktrace() {
|
|||||||
sigaction(SIGFPE, &sigact, nullptr) != 0 ||
|
sigaction(SIGFPE, &sigact, nullptr) != 0 ||
|
||||||
sigaction(SIGABRT, &sigact, nullptr) != 0 ||
|
sigaction(SIGABRT, &sigact, nullptr) != 0 ||
|
||||||
sigaction(SIGILL, &sigact, nullptr) != 0) {
|
sigaction(SIGILL, &sigact, nullptr) != 0) {
|
||||||
fprintf(stderr, "error setting signal handler for %d (%s)\n",
|
fmt::println(stderr, "error setting signal handler for {:d} ({:s})",
|
||||||
SIGSEGV,
|
SIGSEGV,
|
||||||
strsignal(SIGSEGV));
|
strsignal(SIGSEGV));
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ bool FdbToSqlite::Convert::ConvertDatabase(AssetStream& buffer) {
|
|||||||
|
|
||||||
CDClientDatabase::ExecuteQuery("COMMIT;");
|
CDClientDatabase::ExecuteQuery("COMMIT;");
|
||||||
} catch (CppSQLite3Exception& e) {
|
} catch (CppSQLite3Exception& e) {
|
||||||
LOG("Encountered error %s converting FDB to SQLite", e.errorMessage());
|
Log::Warn("Encountered error {:s} converting FDB to SQLite", e.errorMessage());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -278,14 +278,14 @@ std::vector<std::string> GeneralUtils::SplitString(const std::string& str, char
|
|||||||
return vector;
|
return vector;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::u16string GeneralUtils::ReadWString(RakNet::BitStream* inStream) {
|
std::u16string GeneralUtils::ReadWString(RakNet::BitStream& inStream) {
|
||||||
uint32_t length;
|
uint32_t length;
|
||||||
inStream->Read<uint32_t>(length);
|
inStream.Read<uint32_t>(length);
|
||||||
|
|
||||||
std::u16string string;
|
std::u16string string;
|
||||||
for (auto i = 0; i < length; i++) {
|
for (auto i = 0; i < length; i++) {
|
||||||
uint16_t c;
|
uint16_t c;
|
||||||
inStream->Read(c);
|
inStream.Read(c);
|
||||||
string.push_back(c);
|
string.push_back(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ namespace GeneralUtils {
|
|||||||
|
|
||||||
bool ReplaceInString(std::string& str, const std::string& from, const std::string& to);
|
bool ReplaceInString(std::string& str, const std::string& from, const std::string& to);
|
||||||
|
|
||||||
std::u16string ReadWString(RakNet::BitStream* inStream);
|
std::u16string ReadWString(RakNet::BitStream& inStream);
|
||||||
|
|
||||||
std::vector<std::wstring> SplitString(std::wstring& str, wchar_t delimiter);
|
std::vector<std::wstring> SplitString(std::wstring& str, wchar_t delimiter);
|
||||||
|
|
||||||
@@ -264,8 +264,8 @@ namespace GeneralUtils {
|
|||||||
* @returns The enum entry's value in its underlying type
|
* @returns The enum entry's value in its underlying type
|
||||||
*/
|
*/
|
||||||
template <Enum eType>
|
template <Enum eType>
|
||||||
constexpr typename std::underlying_type_t<eType> CastUnderlyingType(const eType entry) noexcept {
|
constexpr std::underlying_type_t<eType> ToUnderlying(const eType entry) noexcept {
|
||||||
return static_cast<typename std::underlying_type_t<eType>>(entry);
|
return static_cast<std::underlying_type_t<eType>>(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
// on Windows we need to undef these or else they conflict with our numeric limits calls
|
// on Windows we need to undef these or else they conflict with our numeric limits calls
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
try {
|
try {
|
||||||
type = static_cast<eLDFType>(strtol(ldfTypeAndValue.first.data(), &storage, 10));
|
type = static_cast<eLDFType>(strtol(ldfTypeAndValue.first.data(), &storage, 10));
|
||||||
} catch (std::exception) {
|
} catch (std::exception) {
|
||||||
LOG("Attempted to process invalid ldf type (%s) from string (%s)", ldfTypeAndValue.first.data(), format.data());
|
Log::Warn("Attempted to process invalid ldf type ({:s}) from string ({:s})", ldfTypeAndValue.first, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
case LDF_TYPE_S32: {
|
case LDF_TYPE_S32: {
|
||||||
const auto data = GeneralUtils::TryParse<int32_t>(ldfTypeAndValue.second);
|
const auto data = GeneralUtils::TryParse<int32_t>(ldfTypeAndValue.second);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
LOG("Warning: Attempted to process invalid int32 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid int32 value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
returnValue = new LDFData<int32_t>(key, data.value());
|
returnValue = new LDFData<int32_t>(key, data.value());
|
||||||
@@ -74,7 +74,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
case LDF_TYPE_FLOAT: {
|
case LDF_TYPE_FLOAT: {
|
||||||
const auto data = GeneralUtils::TryParse<float>(ldfTypeAndValue.second);
|
const auto data = GeneralUtils::TryParse<float>(ldfTypeAndValue.second);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
LOG("Warning: Attempted to process invalid float value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid float value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
returnValue = new LDFData<float>(key, data.value());
|
returnValue = new LDFData<float>(key, data.value());
|
||||||
@@ -84,7 +84,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
case LDF_TYPE_DOUBLE: {
|
case LDF_TYPE_DOUBLE: {
|
||||||
const auto data = GeneralUtils::TryParse<double>(ldfTypeAndValue.second);
|
const auto data = GeneralUtils::TryParse<double>(ldfTypeAndValue.second);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
LOG("Warning: Attempted to process invalid double value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid double value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
returnValue = new LDFData<double>(key, data.value());
|
returnValue = new LDFData<double>(key, data.value());
|
||||||
@@ -102,7 +102,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
} else {
|
} else {
|
||||||
const auto dataOptional = GeneralUtils::TryParse<uint32_t>(ldfTypeAndValue.second);
|
const auto dataOptional = GeneralUtils::TryParse<uint32_t>(ldfTypeAndValue.second);
|
||||||
if (!dataOptional) {
|
if (!dataOptional) {
|
||||||
LOG("Warning: Attempted to process invalid uint32 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid uint32 value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
data = dataOptional.value();
|
data = dataOptional.value();
|
||||||
@@ -122,7 +122,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
} else {
|
} else {
|
||||||
const auto dataOptional = GeneralUtils::TryParse<bool>(ldfTypeAndValue.second);
|
const auto dataOptional = GeneralUtils::TryParse<bool>(ldfTypeAndValue.second);
|
||||||
if (!dataOptional) {
|
if (!dataOptional) {
|
||||||
LOG("Warning: Attempted to process invalid bool value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid bool value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
data = dataOptional.value();
|
data = dataOptional.value();
|
||||||
@@ -135,7 +135,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
case LDF_TYPE_U64: {
|
case LDF_TYPE_U64: {
|
||||||
const auto data = GeneralUtils::TryParse<uint64_t>(ldfTypeAndValue.second);
|
const auto data = GeneralUtils::TryParse<uint64_t>(ldfTypeAndValue.second);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
LOG("Warning: Attempted to process invalid uint64 value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid uint64 value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
returnValue = new LDFData<uint64_t>(key, data.value());
|
returnValue = new LDFData<uint64_t>(key, data.value());
|
||||||
@@ -145,7 +145,7 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
case LDF_TYPE_OBJID: {
|
case LDF_TYPE_OBJID: {
|
||||||
const auto data = GeneralUtils::TryParse<LWOOBJID>(ldfTypeAndValue.second);
|
const auto data = GeneralUtils::TryParse<LWOOBJID>(ldfTypeAndValue.second);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
LOG("Warning: Attempted to process invalid LWOOBJID value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid LWOOBJID value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
returnValue = new LDFData<LWOOBJID>(key, data.value());
|
returnValue = new LDFData<LWOOBJID>(key, data.value());
|
||||||
@@ -159,12 +159,12 @@ LDFBaseData* LDFBaseData::DataFromString(const std::string_view& format) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case LDF_TYPE_UNKNOWN: {
|
case LDF_TYPE_UNKNOWN: {
|
||||||
LOG("Warning: Attempted to process invalid unknown value (%s) from string (%s)", ldfTypeAndValue.second.data(), format.data());
|
Log::Warn("Attempted to process invalid unknown value ({:s}) from string ({:s})", ldfTypeAndValue.second, format);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
LOG("Warning: Attempted to process invalid LDF type (%d) from string (%s)", type, format.data());
|
Log::Warn("Attempted to process invalid LDF type ({:d}) from string ({:s})", GeneralUtils::ToUnderlying(type), format);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public:
|
|||||||
|
|
||||||
virtual ~LDFBaseData() {}
|
virtual ~LDFBaseData() {}
|
||||||
|
|
||||||
virtual void WriteToPacket(RakNet::BitStream* packet) = 0;
|
virtual void WriteToPacket(RakNet::BitStream& packet) = 0;
|
||||||
|
|
||||||
virtual const std::u16string& GetKey() = 0;
|
virtual const std::u16string& GetKey() = 0;
|
||||||
|
|
||||||
@@ -62,17 +62,17 @@ private:
|
|||||||
T value;
|
T value;
|
||||||
|
|
||||||
//! Writes the key to the packet
|
//! Writes the key to the packet
|
||||||
void WriteKey(RakNet::BitStream* packet) {
|
void WriteKey(RakNet::BitStream& packet) {
|
||||||
packet->Write<uint8_t>(this->key.length() * sizeof(uint16_t));
|
packet.Write<uint8_t>(this->key.length() * sizeof(uint16_t));
|
||||||
for (uint32_t i = 0; i < this->key.length(); ++i) {
|
for (uint32_t i = 0; i < this->key.length(); ++i) {
|
||||||
packet->Write<uint16_t>(this->key[i]);
|
packet.Write<uint16_t>(this->key[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Writes the value to the packet
|
//! Writes the value to the packet
|
||||||
void WriteValue(RakNet::BitStream* packet) {
|
void WriteValue(RakNet::BitStream& packet) {
|
||||||
packet->Write<uint8_t>(this->GetValueType());
|
packet.Write<uint8_t>(this->GetValueType());
|
||||||
packet->Write(this->value);
|
packet.Write(this->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -108,7 +108,7 @@ public:
|
|||||||
/*!
|
/*!
|
||||||
\param packet The packet
|
\param packet The packet
|
||||||
*/
|
*/
|
||||||
void WriteToPacket(RakNet::BitStream* packet) override {
|
void WriteToPacket(RakNet::BitStream& packet) override {
|
||||||
this->WriteKey(packet);
|
this->WriteKey(packet);
|
||||||
this->WriteValue(packet);
|
this->WriteValue(packet);
|
||||||
}
|
}
|
||||||
@@ -178,31 +178,31 @@ template<> inline eLDFType LDFData<std::string>::GetValueType(void) { return LDF
|
|||||||
|
|
||||||
// The specialized version for std::u16string (UTF-16)
|
// The specialized version for std::u16string (UTF-16)
|
||||||
template<>
|
template<>
|
||||||
inline void LDFData<std::u16string>::WriteValue(RakNet::BitStream* packet) {
|
inline void LDFData<std::u16string>::WriteValue(RakNet::BitStream& packet) {
|
||||||
packet->Write<uint8_t>(this->GetValueType());
|
packet.Write<uint8_t>(this->GetValueType());
|
||||||
|
|
||||||
packet->Write<uint32_t>(this->value.length());
|
packet.Write<uint32_t>(this->value.length());
|
||||||
for (uint32_t i = 0; i < this->value.length(); ++i) {
|
for (uint32_t i = 0; i < this->value.length(); ++i) {
|
||||||
packet->Write<uint16_t>(this->value[i]);
|
packet.Write<uint16_t>(this->value[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The specialized version for bool
|
// The specialized version for bool
|
||||||
template<>
|
template<>
|
||||||
inline void LDFData<bool>::WriteValue(RakNet::BitStream* packet) {
|
inline void LDFData<bool>::WriteValue(RakNet::BitStream& packet) {
|
||||||
packet->Write<uint8_t>(this->GetValueType());
|
packet.Write<uint8_t>(this->GetValueType());
|
||||||
|
|
||||||
packet->Write<uint8_t>(this->value);
|
packet.Write<uint8_t>(this->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The specialized version for std::string (UTF-8)
|
// The specialized version for std::string (UTF-8)
|
||||||
template<>
|
template<>
|
||||||
inline void LDFData<std::string>::WriteValue(RakNet::BitStream* packet) {
|
inline void LDFData<std::string>::WriteValue(RakNet::BitStream& packet) {
|
||||||
packet->Write<uint8_t>(this->GetValueType());
|
packet.Write<uint8_t>(this->GetValueType());
|
||||||
|
|
||||||
packet->Write<uint32_t>(this->value.length());
|
packet.Write<uint32_t>(this->value.length());
|
||||||
for (uint32_t i = 0; i < this->value.length(); ++i) {
|
for (uint32_t i = 0; i < this->value.length(); ++i) {
|
||||||
packet->Write<uint8_t>(this->value[i]);
|
packet.Write<uint8_t>(this->value[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ void Writer::Flush() {
|
|||||||
|
|
||||||
FileWriter::FileWriter(const char* outpath) {
|
FileWriter::FileWriter(const char* outpath) {
|
||||||
m_Outfile = fopen(outpath, "wt");
|
m_Outfile = fopen(outpath, "wt");
|
||||||
if (!m_Outfile) printf("Couldn't open %s for writing!\n", outpath);
|
if (!m_Outfile) fmt::println("Couldn't open {:s} for writing!", outpath);
|
||||||
m_Outpath = outpath;
|
m_Outpath = outpath;
|
||||||
m_IsConsoleWriter = false;
|
m_IsConsoleWriter = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
// fmt includes:
|
||||||
|
#include <fmt/core.h>
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <fmt/chrono.h>
|
||||||
|
|
||||||
|
// C++ includes:
|
||||||
|
#include <chrono>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <source_location>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -15,22 +23,88 @@
|
|||||||
// Calculate the filename at compile time from the path.
|
// Calculate the filename at compile time from the path.
|
||||||
// We just do this by scanning the path for the last '/' or '\' character and returning the string after it.
|
// We just do this by scanning the path for the last '/' or '\' character and returning the string after it.
|
||||||
constexpr const char* GetFileNameFromAbsolutePath(const char* path) {
|
constexpr const char* GetFileNameFromAbsolutePath(const char* path) {
|
||||||
const char* file = path;
|
const char* file = path;
|
||||||
while (*path) {
|
while (*path) {
|
||||||
char nextChar = *path++;
|
const char nextChar = *path++;
|
||||||
if (nextChar == '/' || nextChar == '\\') {
|
if (nextChar == '/' || nextChar == '\\') {
|
||||||
file = path;
|
file = path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return file;
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Location wrapper class
|
||||||
|
* Used to implicitly forward source location information without adding a function parameter
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
class location_wrapper {
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
template <typename U = T>
|
||||||
|
consteval location_wrapper(const U& val, const std::source_location& loc = std::source_location::current())
|
||||||
|
: m_File(GetFileNameFromAbsolutePath(loc.file_name()))
|
||||||
|
, m_Loc(loc)
|
||||||
|
, m_Obj(val) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
[[nodiscard]] constexpr const char* file() const noexcept { return m_File; }
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr const std::source_location& loc() const noexcept { return m_Loc; }
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr const T& get() const noexcept { return m_Obj; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const char* m_File{};
|
||||||
|
std::source_location m_Loc{};
|
||||||
|
T m_Obj{};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logging functions (EXPERIMENTAL)
|
||||||
|
*/
|
||||||
|
namespace Log {
|
||||||
|
template <typename... Ts>
|
||||||
|
[[nodiscard]] inline tm Time() { // TODO: Move?
|
||||||
|
return fmt::localtime(std::time(nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
using FormatString = location_wrapper<fmt::format_string<Ts...>>;
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
inline void Info(const FormatString<Ts...> fmt_str, Ts&&... args) {
|
||||||
|
fmt::print("[{:%d-%m-%y %H:%M:%S} {}:{}] ", Time(), fmt_str.file(), fmt_str.loc().line());
|
||||||
|
fmt::println(fmt_str.get(), std::forward<Ts>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
inline void Warn(const FormatString<Ts...> fmt_str, Ts&&... args) {
|
||||||
|
fmt::print("[{:%d-%m-%y %H:%M:%S} {}:{}] Warning: ", Time(), fmt_str.file(), fmt_str.loc().line());
|
||||||
|
fmt::println(fmt_str.get(), std::forward<Ts>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... Ts>
|
||||||
|
inline void Debug(const FormatString<Ts...> fmt_str, Ts&&... args) {
|
||||||
|
// if (!m_logDebugStatements) return;
|
||||||
|
Log::Info(fmt_str, std::forward<Ts>(args)...);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// These have to have a constexpr variable to store the filename_and_line result in a local variable otherwise
|
// These have to have a constexpr variable to store the filename_and_line result in a local variable otherwise
|
||||||
// they will not be valid constexpr and will be evaluated at runtime instead of compile time!
|
// they will not be valid constexpr and will be evaluated at runtime instead of compile time!
|
||||||
// The full string is still stored in the binary, however the offset of the filename in the absolute paths
|
// The full string is still stored in the binary, however the offset of the filename in the absolute paths
|
||||||
// is used in the instruction instead of the start of the absolute path.
|
// is used in the instruction instead of the start of the absolute path.
|
||||||
#define LOG(message, ...) do { auto str = FILENAME_AND_LINE; Game::logger->Log(str, message, ##__VA_ARGS__); } while(0)
|
//#define LOG(message, ...) do { auto str = FILENAME_AND_LINE; Game::logger->Log(str, message, ##__VA_ARGS__); } while(0)
|
||||||
#define LOG_DEBUG(message, ...) do { auto str = FILENAME_AND_LINE; Game::logger->LogDebug(str, message, ##__VA_ARGS__); } while(0)
|
//#define LOG(message, ...) do {\
|
||||||
|
const auto now = std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now());\
|
||||||
|
fmt::println("[{:%d-%m-%y %H:%M:%S} {:s}] " message, now, FILENAME_AND_LINE, ##__VA_ARGS__);\
|
||||||
|
} while(0)
|
||||||
|
#define LOG(message, ...) Log::Info(message __VA_OPT__(,) __VA_ARGS__)
|
||||||
|
|
||||||
|
//#define LOG_DEBUG(message, ...) do { auto str = FILENAME_AND_LINE; Game::logger->LogDebug(str, message, ##__VA_ARGS__); } while(0)
|
||||||
|
#define LOG_DEBUG(message, ...) Log::Debug(message __VA_OPT__(,) __VA_ARGS__)
|
||||||
|
|
||||||
// Writer class for writing data to files.
|
// Writer class for writing data to files.
|
||||||
class Writer {
|
class Writer {
|
||||||
|
|||||||
@@ -6,28 +6,14 @@
|
|||||||
|
|
||||||
|
|
||||||
struct RemoteInputInfo {
|
struct RemoteInputInfo {
|
||||||
RemoteInputInfo() {
|
|
||||||
m_RemoteInputX = 0;
|
|
||||||
m_RemoteInputY = 0;
|
|
||||||
m_IsPowersliding = false;
|
|
||||||
m_IsModified = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator=(const RemoteInputInfo& other) {
|
|
||||||
m_RemoteInputX = other.m_RemoteInputX;
|
|
||||||
m_RemoteInputY = other.m_RemoteInputY;
|
|
||||||
m_IsPowersliding = other.m_IsPowersliding;
|
|
||||||
m_IsModified = other.m_IsModified;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const RemoteInputInfo& other) {
|
bool operator==(const RemoteInputInfo& other) {
|
||||||
return m_RemoteInputX == other.m_RemoteInputX && m_RemoteInputY == other.m_RemoteInputY && m_IsPowersliding == other.m_IsPowersliding && m_IsModified == other.m_IsModified;
|
return m_RemoteInputX == other.m_RemoteInputX && m_RemoteInputY == other.m_RemoteInputY && m_IsPowersliding == other.m_IsPowersliding && m_IsModified == other.m_IsModified;
|
||||||
}
|
}
|
||||||
|
|
||||||
float m_RemoteInputX;
|
float m_RemoteInputX = 0;
|
||||||
float m_RemoteInputY;
|
float m_RemoteInputY = 0;
|
||||||
bool m_IsPowersliding;
|
bool m_IsPowersliding = false;
|
||||||
bool m_IsModified;
|
bool m_IsModified = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LocalSpaceInfo {
|
struct LocalSpaceInfo {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ PackIndex::PackIndex(const std::filesystem::path& filePath) {
|
|||||||
m_PackFileIndices.push_back(packFileIndex);
|
m_PackFileIndices.push_back(packFileIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("Loaded pack catalog with %i pack files and %i files", m_PackPaths.size(), m_PackFileIndices.size());
|
Log::Info("Loaded pack catalog with {:d} pack files and {:d} files", m_PackPaths.size(), m_PackFileIndices.size());
|
||||||
|
|
||||||
for (auto& item : m_PackPaths) {
|
for (auto& item : m_PackPaths) {
|
||||||
std::replace(item.begin(), item.end(), '\\', '/');
|
std::replace(item.begin(), item.end(), '\\', '/');
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
|
|
||||||
namespace StringifiedEnum {
|
namespace StringifiedEnum {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
const std::string_view ToString(const T e) {
|
constexpr std::string_view ToString(const T e) {
|
||||||
static_assert(std::is_enum_v<T>, "Not an enum"); // Check type
|
static_assert(std::is_enum_v<T>, "Not an enum"); // Check type
|
||||||
|
|
||||||
constexpr auto& sv = magic_enum::enum_entries<T>();
|
constexpr const auto& sv = magic_enum::enum_entries<T>();
|
||||||
|
|
||||||
const auto it = std::lower_bound(
|
const auto it = std::lower_bound(
|
||||||
sv.begin(), sv.end(), e,
|
sv.begin(), sv.end(), e,
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ constexpr uint32_t lowFrameDelta = FRAMES_TO_MS(lowFramerate);
|
|||||||
#define CINSTREAM RakNet::BitStream inStream(packet->data, packet->length, false);
|
#define CINSTREAM RakNet::BitStream inStream(packet->data, packet->length, false);
|
||||||
#define CINSTREAM_SKIP_HEADER CINSTREAM if (inStream.GetNumberOfUnreadBits() >= BYTES_TO_BITS(HEADER_SIZE)) inStream.IgnoreBytes(HEADER_SIZE); else inStream.IgnoreBits(inStream.GetNumberOfUnreadBits());
|
#define CINSTREAM_SKIP_HEADER CINSTREAM if (inStream.GetNumberOfUnreadBits() >= BYTES_TO_BITS(HEADER_SIZE)) inStream.IgnoreBytes(HEADER_SIZE); else inStream.IgnoreBits(inStream.GetNumberOfUnreadBits());
|
||||||
#define CMSGHEADER BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GAME_MSG);
|
#define CMSGHEADER BitStreamUtils::WriteHeader(bitStream, eConnectionType::CLIENT, eClientMessageType::GAME_MSG);
|
||||||
#define SEND_PACKET Game::server->Send(&bitStream, sysAddr, false);
|
#define SEND_PACKET Game::server->Send(bitStream, sysAddr, false);
|
||||||
#define SEND_PACKET_BROADCAST Game::server->Send(&bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
#define SEND_PACKET_BROADCAST Game::server->Send(bitStream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
||||||
|
|
||||||
//=========== TYPEDEFS ==========
|
//=========== TYPEDEFS ==========
|
||||||
|
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ void CDClientManager::LoadValuesFromDatabase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CDClientManager::LoadValuesFromDefaults() {
|
void CDClientManager::LoadValuesFromDefaults() {
|
||||||
LOG("Loading default CDClient tables!");
|
Log::Info("Loading default CDClient tables!");
|
||||||
|
|
||||||
CDPetComponentTable::Instance().LoadValuesFromDefaults();
|
CDPetComponentTable::Instance().LoadValuesFromDefaults();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ void CDLootTableTable::LoadValuesFromDatabase() {
|
|||||||
CDLootTable entry;
|
CDLootTable entry;
|
||||||
uint32_t lootTableIndex = tableData.getIntField("LootTableIndex", -1);
|
uint32_t lootTableIndex = tableData.getIntField("LootTableIndex", -1);
|
||||||
|
|
||||||
entries[lootTableIndex].push_back(ReadRow(tableData));
|
entries[lootTableIndex].emplace_back(ReadRow(tableData));
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
for (auto& [id, table] : entries) {
|
for (auto& [id, table] : entries) {
|
||||||
@@ -66,7 +66,7 @@ void CDLootTableTable::LoadValuesFromDatabase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const LootTableEntries& CDLootTableTable::GetTable(uint32_t tableId) {
|
const LootTableEntries& CDLootTableTable::GetTable(const uint32_t tableId) {
|
||||||
auto& entries = GetEntriesMutable();
|
auto& entries = GetEntriesMutable();
|
||||||
auto itr = entries.find(tableId);
|
auto itr = entries.find(tableId);
|
||||||
if (itr != entries.end()) {
|
if (itr != entries.end()) {
|
||||||
@@ -79,7 +79,7 @@ const LootTableEntries& CDLootTableTable::GetTable(uint32_t tableId) {
|
|||||||
|
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDLootTable entry;
|
CDLootTable entry;
|
||||||
entries[tableId].push_back(ReadRow(tableData));
|
entries[tableId].emplace_back(ReadRow(tableData));
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
SortTable(entries[tableId]);
|
SortTable(entries[tableId]);
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDLootTable {
|
struct CDLootTable {
|
||||||
uint32_t itemid; //!< The LOT of the item
|
uint32_t itemid; //!< The LOT of the item
|
||||||
uint32_t LootTableIndex; //!< The Loot Table Index
|
uint32_t LootTableIndex; //!< The Loot Table Index
|
||||||
@@ -20,6 +22,5 @@ private:
|
|||||||
public:
|
public:
|
||||||
void LoadValuesFromDatabase();
|
void LoadValuesFromDatabase();
|
||||||
// Queries the table with a custom "where" clause
|
// Queries the table with a custom "where" clause
|
||||||
const LootTableEntries& GetTable(uint32_t tableId);
|
const LootTableEntries& GetTable(const uint32_t tableId);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ void CDMissionEmailTable::LoadValuesFromDatabase() {
|
|||||||
// Now get the data
|
// Now get the data
|
||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionEmail");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionEmail");
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDMissionEmail entry;
|
auto& entry = entries.emplace_back();
|
||||||
entry.ID = tableData.getIntField("ID", -1);
|
entry.ID = tableData.getIntField("ID", -1);
|
||||||
entry.messageType = tableData.getIntField("messageType", -1);
|
entry.messageType = tableData.getIntField("messageType", -1);
|
||||||
entry.notificationGroup = tableData.getIntField("notificationGroup", -1);
|
entry.notificationGroup = tableData.getIntField("notificationGroup", -1);
|
||||||
@@ -30,11 +30,8 @@ void CDMissionEmailTable::LoadValuesFromDatabase() {
|
|||||||
entry.locStatus = tableData.getIntField("locStatus", -1);
|
entry.locStatus = tableData.getIntField("locStatus", -1);
|
||||||
entry.gate_version = tableData.getStringField("gate_version", "");
|
entry.gate_version = tableData.getStringField("gate_version", "");
|
||||||
|
|
||||||
entries.push_back(entry);
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Queries the table with a custom "where" clause
|
//! Queries the table with a custom "where" clause
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDMissionEmail {
|
struct CDMissionEmail {
|
||||||
uint32_t ID;
|
uint32_t ID;
|
||||||
uint32_t messageType;
|
uint32_t messageType;
|
||||||
|
|||||||
@@ -20,18 +20,15 @@ void CDMissionNPCComponentTable::LoadValuesFromDatabase() {
|
|||||||
// Now get the data
|
// Now get the data
|
||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionNPCComponent");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionNPCComponent");
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDMissionNPCComponent entry;
|
auto& entry = entries.emplace_back();
|
||||||
entry.id = tableData.getIntField("id", -1);
|
entry.id = tableData.getIntField("id", -1);
|
||||||
entry.missionID = tableData.getIntField("missionID", -1);
|
entry.missionID = tableData.getIntField("missionID", -1);
|
||||||
entry.offersMission = tableData.getIntField("offersMission", -1) == 1 ? true : false;
|
entry.offersMission = tableData.getIntField("offersMission", -1) == 1 ? true : false;
|
||||||
entry.acceptsMission = tableData.getIntField("acceptsMission", -1) == 1 ? true : false;
|
entry.acceptsMission = tableData.getIntField("acceptsMission", -1) == 1 ? true : false;
|
||||||
entry.gate_version = tableData.getStringField("gate_version", "");
|
entry.gate_version = tableData.getStringField("gate_version", "");
|
||||||
|
|
||||||
entries.push_back(entry);
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Queries the table with a custom "where" clause
|
//! Queries the table with a custom "where" clause
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDMissionNPCComponent {
|
struct CDMissionNPCComponent {
|
||||||
uint32_t id; //!< The ID
|
uint32_t id; //!< The ID
|
||||||
uint32_t missionID; //!< The Mission ID
|
uint32_t missionID; //!< The Mission ID
|
||||||
@@ -17,4 +19,3 @@ public:
|
|||||||
// Queries the table with a custom "where" clause
|
// Queries the table with a custom "where" clause
|
||||||
std::vector<CDMissionNPCComponent> Query(std::function<bool(CDMissionNPCComponent)> predicate);
|
std::vector<CDMissionNPCComponent> Query(std::function<bool(CDMissionNPCComponent)> predicate);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ void CDMissionTasksTable::LoadValuesFromDatabase() {
|
|||||||
// Now get the data
|
// Now get the data
|
||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionTasks");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MissionTasks");
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDMissionTasks entry;
|
auto& entry = entries.emplace_back();
|
||||||
entry.id = tableData.getIntField("id", -1);
|
entry.id = tableData.getIntField("id", -1);
|
||||||
UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1));
|
UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1));
|
||||||
entry.taskType = tableData.getIntField("taskType", -1);
|
entry.taskType = tableData.getIntField("taskType", -1);
|
||||||
@@ -35,11 +35,8 @@ void CDMissionTasksTable::LoadValuesFromDatabase() {
|
|||||||
UNUSED(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false);
|
UNUSED(entry.localize = tableData.getIntField("localize", -1) == 1 ? true : false);
|
||||||
UNUSED(entry.gate_version = tableData.getStringField("gate_version", ""));
|
UNUSED(entry.gate_version = tableData.getStringField("gate_version", ""));
|
||||||
|
|
||||||
entries.push_back(entry);
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CDMissionTasks> CDMissionTasksTable::Query(std::function<bool(CDMissionTasks)> predicate) {
|
std::vector<CDMissionTasks> CDMissionTasksTable::Query(std::function<bool(CDMissionTasks)> predicate) {
|
||||||
@@ -51,7 +48,7 @@ std::vector<CDMissionTasks> CDMissionTasksTable::Query(std::function<bool(CDMiss
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CDMissionTasks*> CDMissionTasksTable::GetByMissionID(uint32_t missionID) {
|
std::vector<CDMissionTasks*> CDMissionTasksTable::GetByMissionID(const uint32_t missionID) {
|
||||||
std::vector<CDMissionTasks*> tasks;
|
std::vector<CDMissionTasks*> tasks;
|
||||||
|
|
||||||
// TODO: this should not be linear(?) and also shouldnt need to be a pointer
|
// TODO: this should not be linear(?) and also shouldnt need to be a pointer
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDMissionTasks {
|
struct CDMissionTasks {
|
||||||
uint32_t id; //!< The Mission ID that the task belongs to
|
uint32_t id; //!< The Mission ID that the task belongs to
|
||||||
UNUSED(uint32_t locStatus); //!< ???
|
UNUSED(uint32_t locStatus); //!< ???
|
||||||
@@ -25,7 +27,7 @@ public:
|
|||||||
// Queries the table with a custom "where" clause
|
// Queries the table with a custom "where" clause
|
||||||
std::vector<CDMissionTasks> Query(std::function<bool(CDMissionTasks)> predicate);
|
std::vector<CDMissionTasks> Query(std::function<bool(CDMissionTasks)> predicate);
|
||||||
|
|
||||||
std::vector<CDMissionTasks*> GetByMissionID(uint32_t missionID);
|
std::vector<CDMissionTasks*> GetByMissionID(const uint32_t missionID);
|
||||||
|
|
||||||
// TODO: Remove this and replace it with a proper lookup function.
|
// TODO: Remove this and replace it with a proper lookup function.
|
||||||
const CDTable::StorageType& GetEntries() const;
|
const CDTable::StorageType& GetEntries() const;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ void CDMissionsTable::LoadValuesFromDatabase() {
|
|||||||
// Now get the data
|
// Now get the data
|
||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Missions");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Missions");
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDMissions entry;
|
auto& entry = entries.emplace_back();
|
||||||
entry.id = tableData.getIntField("id", -1);
|
entry.id = tableData.getIntField("id", -1);
|
||||||
entry.defined_type = tableData.getStringField("defined_type", "");
|
entry.defined_type = tableData.getStringField("defined_type", "");
|
||||||
entry.defined_subtype = tableData.getStringField("defined_subtype", "");
|
entry.defined_subtype = tableData.getStringField("defined_subtype", "");
|
||||||
@@ -76,7 +76,6 @@ void CDMissionsTable::LoadValuesFromDatabase() {
|
|||||||
UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1));
|
UNUSED(entry.locStatus = tableData.getIntField("locStatus", -1));
|
||||||
entry.reward_bankinventory = tableData.getIntField("reward_bankinventory", -1);
|
entry.reward_bankinventory = tableData.getIntField("reward_bankinventory", -1);
|
||||||
|
|
||||||
entries.push_back(entry);
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
tableData.finalize();
|
tableData.finalize();
|
||||||
|
|||||||
@@ -75,4 +75,3 @@ public:
|
|||||||
|
|
||||||
static CDMissions Default;
|
static CDMissions Default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ void CDMovementAIComponentTable::LoadValuesFromDatabase() {
|
|||||||
// Now get the data
|
// Now get the data
|
||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MovementAIComponent");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MovementAIComponent");
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDMovementAIComponent entry;
|
auto& entry = entries.emplace_back();
|
||||||
entry.id = tableData.getIntField("id", -1);
|
entry.id = tableData.getIntField("id", -1);
|
||||||
entry.MovementType = tableData.getStringField("MovementType", "");
|
entry.MovementType = tableData.getStringField("MovementType", "");
|
||||||
entry.WanderChance = tableData.getFloatField("WanderChance", -1.0f);
|
entry.WanderChance = tableData.getFloatField("WanderChance", -1.0f);
|
||||||
@@ -30,11 +30,8 @@ void CDMovementAIComponentTable::LoadValuesFromDatabase() {
|
|||||||
entry.WanderRadius = tableData.getFloatField("WanderRadius", -1.0f);
|
entry.WanderRadius = tableData.getFloatField("WanderRadius", -1.0f);
|
||||||
entry.attachedPath = tableData.getStringField("attachedPath", "");
|
entry.attachedPath = tableData.getStringField("attachedPath", "");
|
||||||
|
|
||||||
entries.push_back(entry);
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CDMovementAIComponent> CDMovementAIComponentTable::Query(std::function<bool(CDMovementAIComponent)> predicate) {
|
std::vector<CDMovementAIComponent> CDMovementAIComponentTable::Query(std::function<bool(CDMovementAIComponent)> predicate) {
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDMovementAIComponent {
|
struct CDMovementAIComponent {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
std::string MovementType;
|
std::string MovementType;
|
||||||
|
|||||||
@@ -20,17 +20,14 @@ void CDObjectSkillsTable::LoadValuesFromDatabase() {
|
|||||||
// Now get the data
|
// Now get the data
|
||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ObjectSkills");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM ObjectSkills");
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDObjectSkills entry;
|
auto &entry = entries.emplace_back();
|
||||||
entry.objectTemplate = tableData.getIntField("objectTemplate", -1);
|
entry.objectTemplate = tableData.getIntField("objectTemplate", -1);
|
||||||
entry.skillID = tableData.getIntField("skillID", -1);
|
entry.skillID = tableData.getIntField("skillID", -1);
|
||||||
entry.castOnType = tableData.getIntField("castOnType", -1);
|
entry.castOnType = tableData.getIntField("castOnType", -1);
|
||||||
entry.AICombatWeight = tableData.getIntField("AICombatWeight", -1);
|
entry.AICombatWeight = tableData.getIntField("AICombatWeight", -1);
|
||||||
|
|
||||||
entries.push_back(entry);
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CDObjectSkills> CDObjectSkillsTable::Query(std::function<bool(CDObjectSkills)> predicate) {
|
std::vector<CDObjectSkills> CDObjectSkillsTable::Query(std::function<bool(CDObjectSkills)> predicate) {
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDObjectSkills {
|
struct CDObjectSkills {
|
||||||
uint32_t objectTemplate; //!< The LOT of the item
|
uint32_t objectTemplate; //!< The LOT of the item
|
||||||
uint32_t skillID; //!< The Skill ID of the object
|
uint32_t skillID; //!< The Skill ID of the object
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "CDObjectsTable.h"
|
#include "CDObjectsTable.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
CDObjects m_default;
|
CDObjects ObjDefault;
|
||||||
};
|
};
|
||||||
|
|
||||||
void CDObjectsTable::LoadValuesFromDatabase() {
|
void CDObjectsTable::LoadValuesFromDatabase() {
|
||||||
@@ -20,8 +20,10 @@ void CDObjectsTable::LoadValuesFromDatabase() {
|
|||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Objects");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM Objects");
|
||||||
auto& entries = GetEntriesMutable();
|
auto& entries = GetEntriesMutable();
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDObjects entry;
|
const uint32_t lot = tableData.getIntField("id", 0);
|
||||||
entry.id = tableData.getIntField("id", -1);
|
|
||||||
|
auto& entry = entries[lot];
|
||||||
|
entry.id = lot;
|
||||||
entry.name = tableData.getStringField("name", "");
|
entry.name = tableData.getStringField("name", "");
|
||||||
UNUSED_COLUMN(entry.placeable = tableData.getIntField("placeable", -1);)
|
UNUSED_COLUMN(entry.placeable = tableData.getIntField("placeable", -1);)
|
||||||
entry.type = tableData.getStringField("type", "");
|
entry.type = tableData.getStringField("type", "");
|
||||||
@@ -36,35 +38,34 @@ void CDObjectsTable::LoadValuesFromDatabase() {
|
|||||||
UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "");)
|
UNUSED_COLUMN(entry.gate_version = tableData.getStringField("gate_version", "");)
|
||||||
UNUSED_COLUMN(entry.HQ_valid = tableData.getIntField("HQ_valid", -1);)
|
UNUSED_COLUMN(entry.HQ_valid = tableData.getIntField("HQ_valid", -1);)
|
||||||
|
|
||||||
entries.insert(std::make_pair(entry.id, entry));
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
ObjDefault.id = 0;
|
||||||
|
|
||||||
m_default.id = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const CDObjects& CDObjectsTable::GetByID(uint32_t LOT) {
|
const CDObjects& CDObjectsTable::GetByID(const uint32_t lot) {
|
||||||
auto& entries = GetEntriesMutable();
|
auto& entries = GetEntriesMutable();
|
||||||
const auto& it = entries.find(LOT);
|
const auto& it = entries.find(lot);
|
||||||
if (it != entries.end()) {
|
if (it != entries.end()) {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM Objects WHERE id = ?;");
|
auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM Objects WHERE id = ?;");
|
||||||
query.bind(1, static_cast<int32_t>(LOT));
|
query.bind(1, static_cast<int32_t>(lot));
|
||||||
|
|
||||||
auto tableData = query.execQuery();
|
auto tableData = query.execQuery();
|
||||||
if (tableData.eof()) {
|
if (tableData.eof()) {
|
||||||
entries.insert(std::make_pair(LOT, m_default));
|
entries.emplace(lot, ObjDefault);
|
||||||
return m_default;
|
return ObjDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now get the data
|
// Now get the data
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDObjects entry;
|
const uint32_t lot = tableData.getIntField("id", 0);
|
||||||
entry.id = tableData.getIntField("id", -1);
|
|
||||||
|
auto& entry = entries[lot];
|
||||||
|
entry.id = lot;
|
||||||
entry.name = tableData.getStringField("name", "");
|
entry.name = tableData.getStringField("name", "");
|
||||||
UNUSED(entry.placeable = tableData.getIntField("placeable", -1));
|
UNUSED(entry.placeable = tableData.getIntField("placeable", -1));
|
||||||
entry.type = tableData.getStringField("type", "");
|
entry.type = tableData.getStringField("type", "");
|
||||||
@@ -79,17 +80,15 @@ const CDObjects& CDObjectsTable::GetByID(uint32_t LOT) {
|
|||||||
UNUSED(entry.gate_version = tableData.getStringField("gate_version", ""));
|
UNUSED(entry.gate_version = tableData.getStringField("gate_version", ""));
|
||||||
UNUSED(entry.HQ_valid = tableData.getIntField("HQ_valid", -1));
|
UNUSED(entry.HQ_valid = tableData.getIntField("HQ_valid", -1));
|
||||||
|
|
||||||
entries.insert(std::make_pair(entry.id, entry));
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
tableData.finalize();
|
||||||
|
|
||||||
const auto& it2 = entries.find(LOT);
|
const auto& it2 = entries.find(lot);
|
||||||
if (it2 != entries.end()) {
|
if (it2 != entries.end()) {
|
||||||
return it2->second;
|
return it2->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_default;
|
return ObjDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDObjects {
|
struct CDObjects {
|
||||||
uint32_t id; //!< The LOT of the object
|
uint32_t id; //!< The LOT of the object
|
||||||
std::string name; //!< The internal name of the object
|
std::string name; //!< The internal name of the object
|
||||||
@@ -24,6 +26,6 @@ class CDObjectsTable : public CDTable<CDObjectsTable, std::map<uint32_t, CDObjec
|
|||||||
public:
|
public:
|
||||||
void LoadValuesFromDatabase();
|
void LoadValuesFromDatabase();
|
||||||
// Gets an entry by ID
|
// Gets an entry by ID
|
||||||
const CDObjects& GetByID(uint32_t LOT);
|
const CDObjects& GetByID(const uint32_t lot);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,11 @@ void CDPackageComponentTable::LoadValuesFromDatabase() {
|
|||||||
// Now get the data
|
// Now get the data
|
||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM PackageComponent");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM PackageComponent");
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDPackageComponent entry;
|
auto& entry = entries.emplace_back();
|
||||||
entry.id = tableData.getIntField("id", -1);
|
entry.id = tableData.getIntField("id", -1);
|
||||||
entry.LootMatrixIndex = tableData.getIntField("LootMatrixIndex", -1);
|
entry.LootMatrixIndex = tableData.getIntField("LootMatrixIndex", -1);
|
||||||
entry.packageType = tableData.getIntField("packageType", -1);
|
entry.packageType = tableData.getIntField("packageType", -1);
|
||||||
|
|
||||||
entries.push_back(entry);
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
// Custom Classes
|
// Custom Classes
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
struct CDPackageComponent {
|
struct CDPackageComponent {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t LootMatrixIndex;
|
uint32_t LootMatrixIndex;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ CDPetComponent& CDPetComponentTable::GetByID(const uint32_t componentID) {
|
|||||||
auto& entries = GetEntriesMutable();
|
auto& entries = GetEntriesMutable();
|
||||||
auto itr = entries.find(componentID);
|
auto itr = entries.find(componentID);
|
||||||
if (itr == entries.end()) {
|
if (itr == entries.end()) {
|
||||||
LOG("Unable to load pet component (ID %i) values from database! Using default values instead.", componentID);
|
Log::Warn("Unable to load pet component (ID {:d}) values from database! Using default values instead.", componentID);
|
||||||
return defaultEntry;
|
return defaultEntry;
|
||||||
}
|
}
|
||||||
return itr->second;
|
return itr->second;
|
||||||
|
|||||||
@@ -4,32 +4,31 @@ void CDPhysicsComponentTable::LoadValuesFromDatabase() {
|
|||||||
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM PhysicsComponent");
|
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM PhysicsComponent");
|
||||||
auto& entries = GetEntriesMutable();
|
auto& entries = GetEntriesMutable();
|
||||||
while (!tableData.eof()) {
|
while (!tableData.eof()) {
|
||||||
CDPhysicsComponent entry;
|
const uint32_t componentID = tableData.getIntField("id", -1);
|
||||||
entry.id = tableData.getIntField("id", -1);
|
|
||||||
|
auto& entry = entries[componentID];
|
||||||
|
entry.id = componentID;
|
||||||
entry.bStatic = tableData.getIntField("static", -1) != 0;
|
entry.bStatic = tableData.getIntField("static", -1) != 0;
|
||||||
entry.physicsAsset = tableData.getStringField("physics_asset", "");
|
entry.physicsAsset = tableData.getStringField("physics_asset", "");
|
||||||
UNUSED(entry->jump = tableData.getIntField("jump", -1) != 0);
|
UNUSED_COLUMN(entry.jump = tableData.getIntField("jump", -1) != 0;)
|
||||||
UNUSED(entry->doublejump = tableData.getIntField("doublejump", -1) != 0);
|
UNUSED_COLUMN(entry.doubleJump = tableData.getIntField("doublejump", -1) != 0;)
|
||||||
entry.speed = tableData.getFloatField("speed", -1);
|
entry.speed = static_cast<float>(tableData.getFloatField("speed", -1));
|
||||||
UNUSED(entry->rotSpeed = tableData.getFloatField("rotSpeed", -1));
|
UNUSED_COLUMN(entry.rotSpeed = tableData.getFloatField("rotSpeed", -1);)
|
||||||
entry.playerHeight = tableData.getFloatField("playerHeight");
|
entry.playerHeight = static_cast<float>(tableData.getFloatField("playerHeight"));
|
||||||
entry.playerRadius = tableData.getFloatField("playerRadius");
|
entry.playerRadius = static_cast<float>(tableData.getFloatField("playerRadius"));
|
||||||
entry.pcShapeType = tableData.getIntField("pcShapeType");
|
entry.pcShapeType = tableData.getIntField("pcShapeType");
|
||||||
entry.collisionGroup = tableData.getIntField("collisionGroup");
|
entry.collisionGroup = tableData.getIntField("collisionGroup");
|
||||||
UNUSED(entry->airSpeed = tableData.getFloatField("airSpeed"));
|
UNUSED_COLUMN(entry.airSpeed = tableData.getFloatField("airSpeed");)
|
||||||
UNUSED(entry->boundaryAsset = tableData.getStringField("boundaryAsset"));
|
UNUSED_COLUMN(entry.boundaryAsset = tableData.getStringField("boundaryAsset");)
|
||||||
UNUSED(entry->jumpAirSpeed = tableData.getFloatField("jumpAirSpeed"));
|
UNUSED_COLUMN(entry.jumpAirSpeed = tableData.getFloatField("jumpAirSpeed");)
|
||||||
UNUSED(entry->friction = tableData.getFloatField("friction"));
|
UNUSED_COLUMN(entry.friction = tableData.getFloatField("friction");)
|
||||||
UNUSED(entry->gravityVolumeAsset = tableData.getStringField("gravityVolumeAsset"));
|
UNUSED_COLUMN(entry.gravityVolumeAsset = tableData.getStringField("gravityVolumeAsset");)
|
||||||
|
|
||||||
entries.insert(std::make_pair(entry.id, entry));
|
|
||||||
tableData.nextRow();
|
tableData.nextRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
tableData.finalize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CDPhysicsComponent* CDPhysicsComponentTable::GetByID(uint32_t componentID) {
|
CDPhysicsComponent* CDPhysicsComponentTable::GetByID(const uint32_t componentID) {
|
||||||
auto& entries = GetEntriesMutable();
|
auto& entries = GetEntriesMutable();
|
||||||
auto itr = entries.find(componentID);
|
auto itr = entries.find(componentID);
|
||||||
return itr != entries.end() ? &itr->second : nullptr;
|
return itr != entries.end() ? &itr->second : nullptr;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "CDTable.h"
|
#include "CDTable.h"
|
||||||
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
struct CDPhysicsComponent {
|
struct CDPhysicsComponent {
|
||||||
@@ -7,7 +8,7 @@ struct CDPhysicsComponent {
|
|||||||
bool bStatic;
|
bool bStatic;
|
||||||
std::string physicsAsset;
|
std::string physicsAsset;
|
||||||
UNUSED(bool jump);
|
UNUSED(bool jump);
|
||||||
UNUSED(bool doublejump);
|
UNUSED(bool doubleJump);
|
||||||
float speed;
|
float speed;
|
||||||
UNUSED(float rotSpeed);
|
UNUSED(float rotSpeed);
|
||||||
float playerHeight;
|
float playerHeight;
|
||||||
@@ -26,5 +27,5 @@ public:
|
|||||||
void LoadValuesFromDatabase();
|
void LoadValuesFromDatabase();
|
||||||
|
|
||||||
static const std::string GetTableName() { return "PhysicsComponent"; };
|
static const std::string GetTableName() { return "PhysicsComponent"; };
|
||||||
CDPhysicsComponent* GetByID(uint32_t componentID);
|
CDPhysicsComponent* GetByID(const uint32_t componentID);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,4 +9,28 @@ foreach(file ${DDATABASE_CDCLIENTDATABASE_CDCLIENTTABLES_SOURCES})
|
|||||||
set(DDATABASE_CDCLIENTDATABASE_SOURCES ${DDATABASE_CDCLIENTDATABASE_SOURCES} "CDClientTables/${file}")
|
set(DDATABASE_CDCLIENTDATABASE_SOURCES ${DDATABASE_CDCLIENTDATABASE_SOURCES} "CDClientTables/${file}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
set(DDATABASE_CDCLIENTDATABASE_SOURCES ${DDATABASE_CDCLIENTDATABASE_SOURCES} PARENT_SCOPE)
|
add_library(dDatabaseCDClient STATIC ${DDATABASE_CDCLIENTDATABASE_SOURCES})
|
||||||
|
target_include_directories(dDatabaseCDClient PUBLIC "."
|
||||||
|
"CDClientTables"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dCommon"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dCommon/dEnums"
|
||||||
|
)
|
||||||
|
target_link_libraries(dDatabaseCDClient PRIVATE fmt sqlite3)
|
||||||
|
|
||||||
|
if (${CDCLIENT_CACHE_ALL})
|
||||||
|
add_compile_definitions(dDatabaseCDClient PRIVATE CDCLIENT_CACHE_ALL=${CDCLIENT_CACHE_ALL})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(
|
||||||
|
GLOB HEADERS_DDATABASE_CDCLIENT
|
||||||
|
LIST_DIRECTORIES false
|
||||||
|
${PROJECT_SOURCE_DIR}/thirdparty/SQLite/*.h
|
||||||
|
CDClientTables/*.h
|
||||||
|
*.h
|
||||||
|
)
|
||||||
|
|
||||||
|
# Need to specify to use the CXX compiler language here or else we get errors including <string>.
|
||||||
|
target_precompile_headers(
|
||||||
|
dDatabaseCDClient PRIVATE
|
||||||
|
"$<$<COMPILE_LANGUAGE:CXX>:${HEADERS_DDATABASE_CDCLIENT}>"
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,20 +1,8 @@
|
|||||||
set(DDATABASE_SOURCES)
|
|
||||||
|
|
||||||
add_subdirectory(CDClientDatabase)
|
add_subdirectory(CDClientDatabase)
|
||||||
|
|
||||||
foreach(file ${DDATABASE_CDCLIENTDATABASE_SOURCES})
|
|
||||||
set(DDATABASE_SOURCES ${DDATABASE_SOURCES} "CDClientDatabase/${file}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
add_subdirectory(GameDatabase)
|
add_subdirectory(GameDatabase)
|
||||||
|
|
||||||
foreach(file ${DDATABASE_GAMEDATABASE_SOURCES})
|
add_library(dDatabase STATIC "MigrationRunner.cpp")
|
||||||
set(DDATABASE_SOURCES ${DDATABASE_SOURCES} "GameDatabase/${file}")
|
target_include_directories(dDatabase PUBLIC ".")
|
||||||
endforeach()
|
target_link_libraries(dDatabase
|
||||||
|
PUBLIC dDatabaseCDClient dDatabaseGame
|
||||||
add_library(dDatabase STATIC ${DDATABASE_SOURCES})
|
PRIVATE fmt)
|
||||||
target_link_libraries(dDatabase sqlite3 mariadbConnCpp)
|
|
||||||
|
|
||||||
if (${CDCLIENT_CACHE_ALL})
|
|
||||||
add_compile_definitions(dDatabase CDCLIENT_CACHE_ALL=${CDCLIENT_CACHE_ALL})
|
|
||||||
endif()
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
set(DDATABASE_GAMEDATABASE_SOURCES
|
set(DDATABASE_GAMEDATABASE_SOURCES
|
||||||
"Database.cpp"
|
"Database.cpp"
|
||||||
"MigrationRunner.cpp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory(MySQL)
|
add_subdirectory(MySQL)
|
||||||
@@ -9,4 +8,26 @@ foreach(file ${DDATABSE_DATABSES_MYSQL_SOURCES})
|
|||||||
set(DDATABASE_GAMEDATABASE_SOURCES ${DDATABASE_GAMEDATABASE_SOURCES} "MySQL/${file}")
|
set(DDATABASE_GAMEDATABASE_SOURCES ${DDATABASE_GAMEDATABASE_SOURCES} "MySQL/${file}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
set(DDATABASE_GAMEDATABASE_SOURCES ${DDATABASE_GAMEDATABASE_SOURCES} PARENT_SCOPE)
|
add_library(dDatabaseGame STATIC ${DDATABASE_GAMEDATABASE_SOURCES})
|
||||||
|
target_include_directories(dDatabaseGame PUBLIC "."
|
||||||
|
"ITables" PRIVATE "MySQL"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dCommon"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dCommon/dEnums"
|
||||||
|
)
|
||||||
|
target_link_libraries(dDatabaseGame
|
||||||
|
PUBLIC MariaDB::ConnCpp
|
||||||
|
PRIVATE fmt
|
||||||
|
INTERFACE dCommon)
|
||||||
|
|
||||||
|
# Glob together all headers that need to be precompiled
|
||||||
|
file(
|
||||||
|
GLOB HEADERS_DDATABASE_GAME
|
||||||
|
LIST_DIRECTORIES false
|
||||||
|
ITables/*.h
|
||||||
|
)
|
||||||
|
|
||||||
|
# Need to specify to use the CXX compiler language here or else we get errors including <string>.
|
||||||
|
target_precompile_headers(
|
||||||
|
dDatabaseGame PRIVATE
|
||||||
|
"$<$<COMPILE_LANGUAGE:CXX>:${HEADERS_DDATABASE_GAME}>"
|
||||||
|
)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ namespace {
|
|||||||
|
|
||||||
void Database::Connect() {
|
void Database::Connect() {
|
||||||
if (database) {
|
if (database) {
|
||||||
LOG("Tried to connect to database when it's already connected!");
|
Log::Warn("Tried to connect to database when it's already connected!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ void Database::Connect() {
|
|||||||
|
|
||||||
GameDatabase* Database::Get() {
|
GameDatabase* Database::Get() {
|
||||||
if (!database) {
|
if (!database) {
|
||||||
LOG("Tried to get database when it's not connected!");
|
Log::Warn("Tried to get database when it's not connected!");
|
||||||
Connect();
|
Connect();
|
||||||
}
|
}
|
||||||
return database;
|
return database;
|
||||||
@@ -35,6 +35,6 @@ void Database::Destroy(std::string source) {
|
|||||||
delete database;
|
delete database;
|
||||||
database = nullptr;
|
database = nullptr;
|
||||||
} else {
|
} else {
|
||||||
LOG("Trying to destroy database when it's not connected!");
|
Log::Warn("Trying to destroy database when it's not connected!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ namespace sql {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
# define DLU_SQL_TRY_CATCH_RETHROW(x) do { try { x; } catch (sql::SQLException& ex) { LOG("SQL Error: %s", ex.what()); throw; } } while(0)
|
# define DLU_SQL_TRY_CATCH_RETHROW(x) do { try { x; } catch (sql::SQLException& ex) { Log::Warn("SQL Error: {:s}", ex.what()); throw; } } while(0)
|
||||||
#else
|
#else
|
||||||
# define DLU_SQL_TRY_CATCH_RETHROW(x) x
|
# define DLU_SQL_TRY_CATCH_RETHROW(x) x
|
||||||
#endif // _DEBUG
|
#endif // _DEBUG
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|
||||||
enum class eGameMasterLevel : uint8_t;
|
enum class eGameMasterLevel : uint8_t;
|
||||||
|
|||||||
@@ -53,8 +53,8 @@ void MySQLDatabase::Connect() {
|
|||||||
void MySQLDatabase::Destroy(std::string source) {
|
void MySQLDatabase::Destroy(std::string source) {
|
||||||
if (!con) return;
|
if (!con) return;
|
||||||
|
|
||||||
if (source.empty()) LOG("Destroying MySQL connection!");
|
if (source.empty()) Log::Info("Destroying MySQL connection!");
|
||||||
else LOG("Destroying MySQL connection from %s!", source.c_str());
|
else Log::Info("Destroying MySQL connection from {:s}!", source);
|
||||||
|
|
||||||
con->close();
|
con->close();
|
||||||
delete con;
|
delete con;
|
||||||
@@ -68,7 +68,7 @@ void MySQLDatabase::ExecuteCustomQuery(const std::string_view query) {
|
|||||||
sql::PreparedStatement* MySQLDatabase::CreatePreppedStmt(const std::string& query) {
|
sql::PreparedStatement* MySQLDatabase::CreatePreppedStmt(const std::string& query) {
|
||||||
if (!con) {
|
if (!con) {
|
||||||
Connect();
|
Connect();
|
||||||
LOG("Trying to reconnect to MySQL");
|
Log::Info("Trying to reconnect to MySQL");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!con->isValid() || con->isClosed()) {
|
if (!con->isValid() || con->isClosed()) {
|
||||||
@@ -77,7 +77,7 @@ sql::PreparedStatement* MySQLDatabase::CreatePreppedStmt(const std::string& quer
|
|||||||
con = nullptr;
|
con = nullptr;
|
||||||
|
|
||||||
Connect();
|
Connect();
|
||||||
LOG("Trying to reconnect to MySQL from invalid or closed connection");
|
Log::Info("Trying to reconnect to MySQL from invalid or closed connection");
|
||||||
}
|
}
|
||||||
|
|
||||||
return con->prepareStatement(sql::SQLString(query.c_str(), query.length()));
|
return con->prepareStatement(sql::SQLString(query.c_str(), query.length()));
|
||||||
|
|||||||
@@ -147,91 +147,91 @@ private:
|
|||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::string_view param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::string_view param) {
|
||||||
// LOG("%s", param.data());
|
// Log::Info("{}", param);
|
||||||
stmt->setString(index, param.data());
|
stmt->setString(index, param.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const char* param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const char* param) {
|
||||||
// LOG("%s", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setString(index, param);
|
stmt->setString(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::string param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::string param) {
|
||||||
// LOG("%s", param.c_str());
|
// Log::Info("{}", param);
|
||||||
stmt->setString(index, param.c_str());
|
stmt->setString(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int8_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int8_t param) {
|
||||||
// LOG("%u", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setByte(index, param);
|
stmt->setByte(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint8_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint8_t param) {
|
||||||
// LOG("%d", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setByte(index, param);
|
stmt->setByte(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int16_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int16_t param) {
|
||||||
// LOG("%u", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setShort(index, param);
|
stmt->setShort(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint16_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint16_t param) {
|
||||||
// LOG("%d", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setShort(index, param);
|
stmt->setShort(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint32_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint32_t param) {
|
||||||
// LOG("%u", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setUInt(index, param);
|
stmt->setUInt(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int32_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int32_t param) {
|
||||||
// LOG("%d", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setInt(index, param);
|
stmt->setInt(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int64_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const int64_t param) {
|
||||||
// LOG("%llu", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setInt64(index, param);
|
stmt->setInt64(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint64_t param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const uint64_t param) {
|
||||||
// LOG("%llu", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setUInt64(index, param);
|
stmt->setUInt64(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const float param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const float param) {
|
||||||
// LOG("%f", param);
|
// Log::Info({}", param);
|
||||||
stmt->setFloat(index, param);
|
stmt->setFloat(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const double param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const double param) {
|
||||||
// LOG("%f", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setDouble(index, param);
|
stmt->setDouble(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const bool param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const bool param) {
|
||||||
// LOG("%d", param);
|
// Log::Info("{}", param);
|
||||||
stmt->setBoolean(index, param);
|
stmt->setBoolean(index, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::istream* param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::istream* param) {
|
||||||
// LOG("Blob");
|
// Log::Info("Blob");
|
||||||
// This is the one time you will ever see me use const_cast.
|
// This is the one time you will ever see me use const_cast.
|
||||||
stmt->setBlob(index, const_cast<std::istream*>(param));
|
stmt->setBlob(index, const_cast<std::istream*>(param));
|
||||||
}
|
}
|
||||||
@@ -239,10 +239,10 @@ inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::istr
|
|||||||
template<>
|
template<>
|
||||||
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::optional<uint32_t> param) {
|
inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::optional<uint32_t> param) {
|
||||||
if (param) {
|
if (param) {
|
||||||
// LOG("%d", param.value());
|
// Log::Info("{}", param.value());
|
||||||
stmt->setInt(index, param.value());
|
stmt->setInt(index, param.value());
|
||||||
} else {
|
} else {
|
||||||
// LOG("Null");
|
// Log::Info("Null");
|
||||||
stmt->setNull(index, sql::DataType::SQLNULL);
|
stmt->setNull(index, sql::DataType::SQLNULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ void MySQLDatabase::InsertNewPropertyModel(const LWOOBJID& propertyId, const IPr
|
|||||||
0, // behavior 4. TODO implement this.
|
0, // behavior 4. TODO implement this.
|
||||||
0 // behavior 5. TODO implement this.
|
0 // behavior 5. TODO implement this.
|
||||||
);
|
);
|
||||||
} catch (sql::SQLException& e) {
|
} catch (const sql::SQLException& e) {
|
||||||
LOG("Error inserting new property model: %s", e.what());
|
Log::Warn("Error inserting new property model: {:s}", e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ void MigrationRunner::RunMigrations() {
|
|||||||
|
|
||||||
if (Database::Get()->IsMigrationRun(migration.name)) continue;
|
if (Database::Get()->IsMigrationRun(migration.name)) continue;
|
||||||
|
|
||||||
LOG("Running migration: %s", migration.name.c_str());
|
Log::Info("Running migration: {:s}", migration.name);
|
||||||
if (migration.name == "dlu/5_brick_model_sd0.sql") {
|
if (migration.name == "dlu/5_brick_model_sd0.sql") {
|
||||||
runSd0Migrations = true;
|
runSd0Migrations = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -56,7 +56,7 @@ void MigrationRunner::RunMigrations() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (finalSQL.empty() && !runSd0Migrations) {
|
if (finalSQL.empty() && !runSd0Migrations) {
|
||||||
LOG("Server database is up to date.");
|
Log::Info("Server database is up to date.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ void MigrationRunner::RunMigrations() {
|
|||||||
if (query.empty()) continue;
|
if (query.empty()) continue;
|
||||||
Database::Get()->ExecuteCustomQuery(query.c_str());
|
Database::Get()->ExecuteCustomQuery(query.c_str());
|
||||||
} catch (sql::SQLException& e) {
|
} catch (sql::SQLException& e) {
|
||||||
LOG("Encountered error running migration: %s", e.what());
|
Log::Info("Encountered error running migration: {:s}", e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,9 +75,9 @@ void MigrationRunner::RunMigrations() {
|
|||||||
// Do this last on the off chance none of the other migrations have been run yet.
|
// Do this last on the off chance none of the other migrations have been run yet.
|
||||||
if (runSd0Migrations) {
|
if (runSd0Migrations) {
|
||||||
uint32_t numberOfUpdatedModels = BrickByBrickFix::UpdateBrickByBrickModelsToSd0();
|
uint32_t numberOfUpdatedModels = BrickByBrickFix::UpdateBrickByBrickModelsToSd0();
|
||||||
LOG("%i models were updated from zlib to sd0.", numberOfUpdatedModels);
|
Log::Info("{:d} models were updated from zlib to sd0.", numberOfUpdatedModels);
|
||||||
uint32_t numberOfTruncatedModels = BrickByBrickFix::TruncateBrokenBrickByBrickXml();
|
uint32_t numberOfTruncatedModels = BrickByBrickFix::TruncateBrokenBrickByBrickXml();
|
||||||
LOG("%i models were truncated from the database.", numberOfTruncatedModels);
|
Log::Info("{:d} models were truncated from the database.", numberOfTruncatedModels);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,14 +111,14 @@ void MigrationRunner::RunSQLiteMigrations() {
|
|||||||
|
|
||||||
// Doing these 1 migration at a time since one takes a long time and some may think it is crashing.
|
// Doing these 1 migration at a time since one takes a long time and some may think it is crashing.
|
||||||
// This will at the least guarentee that the full migration needs to be run in order to be counted as "migrated".
|
// This will at the least guarentee that the full migration needs to be run in order to be counted as "migrated".
|
||||||
LOG("Executing migration: %s. This may take a while. Do not shut down server.", migration.name.c_str());
|
Log::Info("Executing migration: {:s}. This may take a while. Do not shut down server.", migration.name);
|
||||||
CDClientDatabase::ExecuteQuery("BEGIN TRANSACTION;");
|
CDClientDatabase::ExecuteQuery("BEGIN TRANSACTION;");
|
||||||
for (const auto& dml : GeneralUtils::SplitString(migration.data, ';')) {
|
for (const auto& dml : GeneralUtils::SplitString(migration.data, ';')) {
|
||||||
if (dml.empty()) continue;
|
if (dml.empty()) continue;
|
||||||
try {
|
try {
|
||||||
CDClientDatabase::ExecuteDML(dml.c_str());
|
CDClientDatabase::ExecuteDML(dml.c_str());
|
||||||
} catch (CppSQLite3Exception& e) {
|
} catch (CppSQLite3Exception& e) {
|
||||||
LOG("Encountered error running DML command: (%i) : %s", e.errorCode(), e.errorMessage());
|
Log::Warn("Encountered error running DML command: ({:d}) : {:s}", e.errorCode(), e.errorMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,5 +129,5 @@ void MigrationRunner::RunSQLiteMigrations() {
|
|||||||
CDClientDatabase::ExecuteQuery("COMMIT;");
|
CDClientDatabase::ExecuteQuery("COMMIT;");
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("CDServer database is up to date.");
|
Log::Info("CDServer database is up to date.");
|
||||||
}
|
}
|
||||||
@@ -13,11 +13,25 @@ include_directories(
|
|||||||
${PROJECT_SOURCE_DIR}/dGame
|
${PROJECT_SOURCE_DIR}/dGame
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(dGameBase ${DGAME_SOURCES})
|
add_library(dGameBase OBJECT ${DGAME_SOURCES})
|
||||||
target_precompile_headers(dGameBase PRIVATE ${HEADERS_DGAME})
|
target_precompile_headers(dGameBase PRIVATE ${HEADERS_DGAME})
|
||||||
target_link_libraries(dGameBase
|
target_include_directories(dGameBase PUBLIC "." "dEntity"
|
||||||
PUBLIC dDatabase dPhysics
|
PRIVATE "dComponents" "dGameMessages" "dBehaviors" "dMission" "dUtilities" "dInventory"
|
||||||
INTERFACE dComponents dEntity)
|
$<TARGET_PROPERTY:dPropertyBehaviors,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
"${PROJECT_SOURCE_DIR}/dCommon"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dCommon/dEnums"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dCommon/dClient"
|
||||||
|
# dDatabase
|
||||||
|
"${PROJECT_SOURCE_DIR}/dDatabase/CDClientDatabase"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dDatabase/CDClientDatabase/CDClientTables"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dDatabase/GameDatabase/ITables"
|
||||||
|
"${PROJECT_SOURCE_DIR}/thirdparty/mariadb-connector-cpp/include"
|
||||||
|
# dPhysics
|
||||||
|
"${PROJECT_SOURCE_DIR}/thirdparty/recastnavigation/Recast/Include"
|
||||||
|
"${PROJECT_SOURCE_DIR}/thirdparty/recastnavigation/Detour/Include"
|
||||||
|
"${PROJECT_SOURCE_DIR}/dZoneManager"
|
||||||
|
)
|
||||||
|
|
||||||
add_subdirectory(dBehaviors)
|
add_subdirectory(dBehaviors)
|
||||||
add_subdirectory(dComponents)
|
add_subdirectory(dComponents)
|
||||||
@@ -28,7 +42,26 @@ add_subdirectory(dMission)
|
|||||||
add_subdirectory(dPropertyBehaviors)
|
add_subdirectory(dPropertyBehaviors)
|
||||||
add_subdirectory(dUtilities)
|
add_subdirectory(dUtilities)
|
||||||
|
|
||||||
add_library(dGame INTERFACE)
|
add_library(dGame STATIC
|
||||||
target_link_libraries(dGame INTERFACE
|
$<TARGET_OBJECTS:dGameBase>
|
||||||
dGameBase dBehaviors dComponents dEntity dGameMessages dInventory dMission dPropertyBehaviors dUtilities dScripts
|
$<TARGET_OBJECTS:dBehaviors>
|
||||||
|
$<TARGET_OBJECTS:dComponents>
|
||||||
|
$<TARGET_OBJECTS:dEntity>
|
||||||
|
$<TARGET_OBJECTS:dGameMessages>
|
||||||
|
$<TARGET_OBJECTS:dInventory>
|
||||||
|
$<TARGET_OBJECTS:dMission>
|
||||||
|
$<TARGET_OBJECTS:dPropertyBehaviors>
|
||||||
|
$<TARGET_OBJECTS:dUtilities>
|
||||||
|
)
|
||||||
|
target_link_libraries(dGame INTERFACE dNet)
|
||||||
|
target_include_directories(dGame INTERFACE
|
||||||
|
$<TARGET_PROPERTY:dGameBase,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dBehaviors,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dComponents,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dEntity,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dGameMessages,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dInventory,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dMission,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dPropertyBehaviors,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
|
$<TARGET_PROPERTY:dUtilities,INTERFACE_INCLUDE_DIRECTORIES>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -82,16 +82,16 @@ void Character::DoQuickXMLDataParse() {
|
|||||||
if (!m_Doc) return;
|
if (!m_Doc) return;
|
||||||
|
|
||||||
if (m_Doc->Parse(m_XMLData.c_str(), m_XMLData.size()) == 0) {
|
if (m_Doc->Parse(m_XMLData.c_str(), m_XMLData.size()) == 0) {
|
||||||
LOG("Loaded xmlData for character %s (%i)!", m_Name.c_str(), m_ID);
|
Log::Info("Loaded xmlData for character {:s} ({:d})!", m_Name, m_ID);
|
||||||
} else {
|
} else {
|
||||||
LOG("Failed to load xmlData!");
|
Log::Warn("Failed to load xmlData!");
|
||||||
//Server::rakServer->CloseConnection(m_ParentUser->GetSystemAddress(), true);
|
//Server::rakServer->CloseConnection(m_ParentUser->GetSystemAddress(), true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tinyxml2::XMLElement* mf = m_Doc->FirstChildElement("obj")->FirstChildElement("mf");
|
tinyxml2::XMLElement* mf = m_Doc->FirstChildElement("obj")->FirstChildElement("mf");
|
||||||
if (!mf) {
|
if (!mf) {
|
||||||
LOG("Failed to find mf tag!");
|
Log::Warn("Failed to find mf tag!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,14 +110,14 @@ void Character::DoQuickXMLDataParse() {
|
|||||||
|
|
||||||
tinyxml2::XMLElement* inv = m_Doc->FirstChildElement("obj")->FirstChildElement("inv");
|
tinyxml2::XMLElement* inv = m_Doc->FirstChildElement("obj")->FirstChildElement("inv");
|
||||||
if (!inv) {
|
if (!inv) {
|
||||||
LOG("Char has no inv!");
|
Log::Warn("Char has no inv!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tinyxml2::XMLElement* bag = inv->FirstChildElement("items")->FirstChildElement("in");
|
tinyxml2::XMLElement* bag = inv->FirstChildElement("items")->FirstChildElement("in");
|
||||||
|
|
||||||
if (!bag) {
|
if (!bag) {
|
||||||
LOG("Couldn't find bag0!");
|
Log::Warn("Couldn't find bag0!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,7 +310,7 @@ void Character::SaveXMLToDatabase() {
|
|||||||
|
|
||||||
//Call upon the entity to update our xmlDoc:
|
//Call upon the entity to update our xmlDoc:
|
||||||
if (!m_OurEntity) {
|
if (!m_OurEntity) {
|
||||||
LOG("%i:%s didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!", this->GetID(), this->GetName().c_str());
|
Log::Warn("{:d}:{:s} didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!", this->GetID(), this->GetName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,7 +321,7 @@ void Character::SaveXMLToDatabase() {
|
|||||||
//For metrics, log the time it took to save:
|
//For metrics, log the time it took to save:
|
||||||
auto end = std::chrono::system_clock::now();
|
auto end = std::chrono::system_clock::now();
|
||||||
std::chrono::duration<double> elapsed = end - start;
|
std::chrono::duration<double> elapsed = end - start;
|
||||||
LOG("%i:%s Saved character to Database in: %fs", this->GetID(), this->GetName().c_str(), elapsed.count());
|
Log::Info("{:d}:{:s} Saved character to Database in: {:f}s", this->GetID(), this->GetName(), elapsed.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Character::SetIsNewLogin() {
|
void Character::SetIsNewLogin() {
|
||||||
@@ -334,7 +334,7 @@ void Character::SetIsNewLogin() {
|
|||||||
auto* nextChild = currentChild->NextSiblingElement();
|
auto* nextChild = currentChild->NextSiblingElement();
|
||||||
if (currentChild->Attribute("si")) {
|
if (currentChild->Attribute("si")) {
|
||||||
flags->DeleteChild(currentChild);
|
flags->DeleteChild(currentChild);
|
||||||
LOG("Removed isLoggedIn flag from character %i:%s, saving character to database", GetID(), GetName().c_str());
|
Log::Info("Removed isLoggedIn flag from character {:d}:{:s}, saving character to database", GetID(), GetName());
|
||||||
WriteToDatabase();
|
WriteToDatabase();
|
||||||
}
|
}
|
||||||
currentChild = nextChild;
|
currentChild = nextChild;
|
||||||
|
|||||||
240
dGame/Entity.cpp
240
dGame/Entity.cpp
@@ -138,25 +138,23 @@ Entity::Entity(const LWOOBJID& objectID, EntityInfo info, User* parentUser, Enti
|
|||||||
|
|
||||||
Entity::~Entity() {
|
Entity::~Entity() {
|
||||||
if (IsPlayer()) {
|
if (IsPlayer()) {
|
||||||
LOG("Deleted player");
|
Log::Info("Deleted player");
|
||||||
|
|
||||||
// Make sure the player exists first. Remove afterwards to prevent the OnPlayerExist functions from not being able to find the player.
|
// Make sure the player exists first. Remove afterwards to prevent the OnPlayerExist functions from not being able to find the player.
|
||||||
if (!PlayerManager::RemovePlayer(this)) {
|
if (!PlayerManager::RemovePlayer(this)) {
|
||||||
LOG("Unable to find player to remove from manager.");
|
Log::Warn("Unable to find player to remove from manager.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity* zoneControl = Game::entityManager->GetZoneControlEntity();
|
auto* zoneControl = Game::entityManager->GetZoneControlEntity();
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(zoneControl)) {
|
if (zoneControl) {
|
||||||
script->OnPlayerExit(zoneControl, this);
|
zoneControl->GetScript()->OnPlayerExit(zoneControl, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Entity*> scriptedActs = Game::entityManager->GetEntitiesByComponent(eReplicaComponentType::SCRIPTED_ACTIVITY);
|
std::vector<Entity*> scriptedActs = Game::entityManager->GetEntitiesByComponent(eReplicaComponentType::SCRIPTED_ACTIVITY);
|
||||||
for (Entity* scriptEntity : scriptedActs) {
|
for (Entity* scriptEntity : scriptedActs) {
|
||||||
if (scriptEntity->GetObjectID() != zoneControl->GetObjectID()) { // Don't want to trigger twice on instance worlds
|
if (scriptEntity->GetObjectID() != zoneControl->GetObjectID()) { // Don't want to trigger twice on instance worlds
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(scriptEntity)) {
|
scriptEntity->GetScript()->OnPlayerExit(scriptEntity, this);
|
||||||
script->OnPlayerExit(scriptEntity, this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -762,9 +760,7 @@ void Entity::Initialize() {
|
|||||||
|
|
||||||
// Hacky way to trigger these when the object has had a chance to get constructed
|
// Hacky way to trigger these when the object has had a chance to get constructed
|
||||||
AddCallbackTimer(0, [this]() {
|
AddCallbackTimer(0, [this]() {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
this->GetScript()->OnStartup(this);
|
||||||
script->OnStartup(this);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!m_Character && Game::entityManager->GetGhostingEnabled()) {
|
if (!m_Character && Game::entityManager->GetGhostingEnabled()) {
|
||||||
@@ -839,17 +835,6 @@ bool Entity::HasComponent(const eReplicaComponentType componentId) const {
|
|||||||
return m_Components.find(componentId) != m_Components.end();
|
return m_Components.find(componentId) != m_Components.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ScriptComponent*> Entity::GetScriptComponents() {
|
|
||||||
std::vector<ScriptComponent*> comps;
|
|
||||||
for (std::pair<eReplicaComponentType, void*> p : m_Components) {
|
|
||||||
if (p.first == eReplicaComponentType::SCRIPT) {
|
|
||||||
comps.push_back(static_cast<ScriptComponent*>(p.second));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return comps;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Entity::Subscribe(LWOOBJID scriptObjId, CppScripts::Script* scriptToAdd, const std::string& notificationName) {
|
void Entity::Subscribe(LWOOBJID scriptObjId, CppScripts::Script* scriptToAdd, const std::string& notificationName) {
|
||||||
if (notificationName == "HitOrHealResult" || notificationName == "Hit") {
|
if (notificationName == "HitOrHealResult" || notificationName == "Hit") {
|
||||||
auto* destroyableComponent = GetComponent<DestroyableComponent>();
|
auto* destroyableComponent = GetComponent<DestroyableComponent>();
|
||||||
@@ -899,34 +884,34 @@ void Entity::SetGMLevel(eGameMasterLevel value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacketType packetType) {
|
void Entity::WriteBaseReplicaData(RakNet::BitStream& outBitStream, eReplicaPacketType packetType) {
|
||||||
if (packetType == eReplicaPacketType::CONSTRUCTION) {
|
if (packetType == eReplicaPacketType::CONSTRUCTION) {
|
||||||
outBitStream->Write(m_ObjectID);
|
outBitStream.Write(m_ObjectID);
|
||||||
outBitStream->Write(m_TemplateID);
|
outBitStream.Write(m_TemplateID);
|
||||||
|
|
||||||
if (IsPlayer()) {
|
if (IsPlayer()) {
|
||||||
std::string name = m_Character != nullptr ? m_Character->GetName() : "Invalid";
|
std::string name = m_Character != nullptr ? m_Character->GetName() : "Invalid";
|
||||||
outBitStream->Write<uint8_t>(uint8_t(name.size()));
|
outBitStream.Write<uint8_t>(uint8_t(name.size()));
|
||||||
|
|
||||||
for (size_t i = 0; i < name.size(); ++i) {
|
for (size_t i = 0; i < name.size(); ++i) {
|
||||||
outBitStream->Write<uint16_t>(name[i]);
|
outBitStream.Write<uint16_t>(name[i]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const auto& name = GetVar<std::string>(u"npcName");
|
const auto& name = GetVar<std::string>(u"npcName");
|
||||||
outBitStream->Write<uint8_t>(uint8_t(name.size()));
|
outBitStream.Write<uint8_t>(uint8_t(name.size()));
|
||||||
|
|
||||||
for (size_t i = 0; i < name.size(); ++i) {
|
for (size_t i = 0; i < name.size(); ++i) {
|
||||||
outBitStream->Write<uint16_t>(name[i]);
|
outBitStream.Write<uint16_t>(name[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
outBitStream->Write<uint32_t>(0); //Time since created on server
|
outBitStream.Write<uint32_t>(0); //Time since created on server
|
||||||
|
|
||||||
const auto& syncLDF = GetVar<std::vector<std::u16string>>(u"syncLDF");
|
const auto& syncLDF = GetVar<std::vector<std::u16string>>(u"syncLDF");
|
||||||
|
|
||||||
// Only sync for models.
|
// Only sync for models.
|
||||||
if (m_Settings.size() > 0 && (GetComponent<ModelComponent>() && !GetComponent<PetComponent>())) {
|
if (m_Settings.size() > 0 && (GetComponent<ModelComponent>() && !GetComponent<PetComponent>())) {
|
||||||
outBitStream->Write1(); //ldf data
|
outBitStream.Write1(); //ldf data
|
||||||
|
|
||||||
RakNet::BitStream settingStream;
|
RakNet::BitStream settingStream;
|
||||||
int32_t numberOfValidKeys = m_Settings.size();
|
int32_t numberOfValidKeys = m_Settings.size();
|
||||||
@@ -943,13 +928,13 @@ void Entity::WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacke
|
|||||||
|
|
||||||
for (LDFBaseData* data : m_Settings) {
|
for (LDFBaseData* data : m_Settings) {
|
||||||
if (data && data->GetValueType() != eLDFType::LDF_TYPE_UNKNOWN) {
|
if (data && data->GetValueType() != eLDFType::LDF_TYPE_UNKNOWN) {
|
||||||
data->WriteToPacket(&settingStream);
|
data->WriteToPacket(settingStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
outBitStream->Write(settingStream.GetNumberOfBytesUsed() + 1);
|
outBitStream.Write(settingStream.GetNumberOfBytesUsed() + 1);
|
||||||
outBitStream->Write<uint8_t>(0); //no compression used
|
outBitStream.Write<uint8_t>(0); //no compression used
|
||||||
outBitStream->Write(settingStream);
|
outBitStream.Write(settingStream);
|
||||||
} else if (!syncLDF.empty()) {
|
} else if (!syncLDF.empty()) {
|
||||||
std::vector<LDFBaseData*> ldfData;
|
std::vector<LDFBaseData*> ldfData;
|
||||||
|
|
||||||
@@ -957,79 +942,79 @@ void Entity::WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacke
|
|||||||
ldfData.push_back(GetVarData(data));
|
ldfData.push_back(GetVarData(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
outBitStream->Write1(); //ldf data
|
outBitStream.Write1(); //ldf data
|
||||||
|
|
||||||
RakNet::BitStream settingStream;
|
RakNet::BitStream settingStream;
|
||||||
settingStream.Write<uint32_t>(ldfData.size());
|
settingStream.Write<uint32_t>(ldfData.size());
|
||||||
for (LDFBaseData* data : ldfData) {
|
for (LDFBaseData* data : ldfData) {
|
||||||
if (data) {
|
if (data) {
|
||||||
data->WriteToPacket(&settingStream);
|
data->WriteToPacket(settingStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
outBitStream->Write(settingStream.GetNumberOfBytesUsed() + 1);
|
outBitStream.Write(settingStream.GetNumberOfBytesUsed() + 1);
|
||||||
outBitStream->Write<uint8_t>(0); //no compression used
|
outBitStream.Write<uint8_t>(0); //no compression used
|
||||||
outBitStream->Write(settingStream);
|
outBitStream.Write(settingStream);
|
||||||
} else {
|
} else {
|
||||||
outBitStream->Write0(); //No ldf data
|
outBitStream.Write0(); //No ldf data
|
||||||
}
|
}
|
||||||
|
|
||||||
TriggerComponent* triggerComponent;
|
TriggerComponent* triggerComponent;
|
||||||
if (TryGetComponent(eReplicaComponentType::TRIGGER, triggerComponent)) {
|
if (TryGetComponent(eReplicaComponentType::TRIGGER, triggerComponent)) {
|
||||||
// has trigger component, check to see if we have events to handle
|
// has trigger component, check to see if we have events to handle
|
||||||
auto* trigger = triggerComponent->GetTrigger();
|
auto* trigger = triggerComponent->GetTrigger();
|
||||||
outBitStream->Write<bool>(trigger && trigger->events.size() > 0);
|
outBitStream.Write<bool>(trigger && trigger->events.size() > 0);
|
||||||
} else { // no trigger componenet, so definitely no triggers
|
} else { // no trigger componenet, so definitely no triggers
|
||||||
outBitStream->Write0();
|
outBitStream.Write0();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (m_ParentEntity != nullptr || m_SpawnerID != 0) {
|
if (m_ParentEntity != nullptr || m_SpawnerID != 0) {
|
||||||
outBitStream->Write1();
|
outBitStream.Write1();
|
||||||
if (m_ParentEntity != nullptr) outBitStream->Write(GeneralUtils::SetBit(m_ParentEntity->GetObjectID(), static_cast<uint32_t>(eObjectBits::CLIENT)));
|
if (m_ParentEntity != nullptr) outBitStream.Write(GeneralUtils::SetBit(m_ParentEntity->GetObjectID(), static_cast<uint32_t>(eObjectBits::CLIENT)));
|
||||||
else if (m_Spawner != nullptr && m_Spawner->m_Info.isNetwork) outBitStream->Write(m_SpawnerID);
|
else if (m_Spawner != nullptr && m_Spawner->m_Info.isNetwork) outBitStream.Write(m_SpawnerID);
|
||||||
else outBitStream->Write(GeneralUtils::SetBit(m_SpawnerID, static_cast<uint32_t>(eObjectBits::CLIENT)));
|
else outBitStream.Write(GeneralUtils::SetBit(m_SpawnerID, static_cast<uint32_t>(eObjectBits::CLIENT)));
|
||||||
} else outBitStream->Write0();
|
} else outBitStream.Write0();
|
||||||
|
|
||||||
outBitStream->Write(m_HasSpawnerNodeID);
|
outBitStream.Write(m_HasSpawnerNodeID);
|
||||||
if (m_HasSpawnerNodeID) outBitStream->Write(m_SpawnerNodeID);
|
if (m_HasSpawnerNodeID) outBitStream.Write(m_SpawnerNodeID);
|
||||||
|
|
||||||
//outBitStream->Write0(); //Spawner node id
|
//outBitStream.Write0(); //Spawner node id
|
||||||
|
|
||||||
if (m_Scale == 1.0f || m_Scale == 0.0f) outBitStream->Write0();
|
if (m_Scale == 1.0f || m_Scale == 0.0f) outBitStream.Write0();
|
||||||
else {
|
else {
|
||||||
outBitStream->Write1();
|
outBitStream.Write1();
|
||||||
outBitStream->Write(m_Scale);
|
outBitStream.Write(m_Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
outBitStream->Write0(); //ObjectWorldState
|
outBitStream.Write0(); //ObjectWorldState
|
||||||
|
|
||||||
if (m_GMLevel != eGameMasterLevel::CIVILIAN) {
|
if (m_GMLevel != eGameMasterLevel::CIVILIAN) {
|
||||||
outBitStream->Write1();
|
outBitStream.Write1();
|
||||||
outBitStream->Write(m_GMLevel);
|
outBitStream.Write(m_GMLevel);
|
||||||
} else outBitStream->Write0(); //No GM Level
|
} else outBitStream.Write0(); //No GM Level
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only serialize parent / child info should the info be dirty (changed) or if this is the construction of the entity.
|
// Only serialize parent / child info should the info be dirty (changed) or if this is the construction of the entity.
|
||||||
outBitStream->Write(m_IsParentChildDirty || packetType == eReplicaPacketType::CONSTRUCTION);
|
outBitStream.Write(m_IsParentChildDirty || packetType == eReplicaPacketType::CONSTRUCTION);
|
||||||
if (m_IsParentChildDirty || packetType == eReplicaPacketType::CONSTRUCTION) {
|
if (m_IsParentChildDirty || packetType == eReplicaPacketType::CONSTRUCTION) {
|
||||||
m_IsParentChildDirty = false;
|
m_IsParentChildDirty = false;
|
||||||
outBitStream->Write(m_ParentEntity != nullptr);
|
outBitStream.Write(m_ParentEntity != nullptr);
|
||||||
if (m_ParentEntity) {
|
if (m_ParentEntity) {
|
||||||
outBitStream->Write(m_ParentEntity->GetObjectID());
|
outBitStream.Write(m_ParentEntity->GetObjectID());
|
||||||
outBitStream->Write0();
|
outBitStream.Write0();
|
||||||
}
|
}
|
||||||
outBitStream->Write(m_ChildEntities.size() > 0);
|
outBitStream.Write(m_ChildEntities.size() > 0);
|
||||||
if (m_ChildEntities.size() > 0) {
|
if (m_ChildEntities.size() > 0) {
|
||||||
outBitStream->Write<uint16_t>(m_ChildEntities.size());
|
outBitStream.Write<uint16_t>(m_ChildEntities.size());
|
||||||
for (Entity* child : m_ChildEntities) {
|
for (Entity* child : m_ChildEntities) {
|
||||||
outBitStream->Write<uint64_t>(child->GetObjectID());
|
outBitStream.Write<uint64_t>(child->GetObjectID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::WriteComponents(RakNet::BitStream* outBitStream, eReplicaPacketType packetType) {
|
void Entity::WriteComponents(RakNet::BitStream& outBitStream, eReplicaPacketType packetType) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This has to be done in a specific order.
|
* This has to be done in a specific order.
|
||||||
@@ -1117,7 +1102,7 @@ void Entity::WriteComponents(RakNet::BitStream* outBitStream, eReplicaPacketType
|
|||||||
possessorComponent->Serialize(outBitStream, bIsInitialUpdate);
|
possessorComponent->Serialize(outBitStream, bIsInitialUpdate);
|
||||||
} else {
|
} else {
|
||||||
// Should never happen, but just to be safe
|
// Should never happen, but just to be safe
|
||||||
outBitStream->Write0();
|
outBitStream.Write0();
|
||||||
}
|
}
|
||||||
|
|
||||||
LevelProgressionComponent* levelProgressionComponent;
|
LevelProgressionComponent* levelProgressionComponent;
|
||||||
@@ -1125,7 +1110,7 @@ void Entity::WriteComponents(RakNet::BitStream* outBitStream, eReplicaPacketType
|
|||||||
levelProgressionComponent->Serialize(outBitStream, bIsInitialUpdate);
|
levelProgressionComponent->Serialize(outBitStream, bIsInitialUpdate);
|
||||||
} else {
|
} else {
|
||||||
// Should never happen, but just to be safe
|
// Should never happen, but just to be safe
|
||||||
outBitStream->Write0();
|
outBitStream.Write0();
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerForcedMovementComponent* playerForcedMovementComponent;
|
PlayerForcedMovementComponent* playerForcedMovementComponent;
|
||||||
@@ -1133,7 +1118,7 @@ void Entity::WriteComponents(RakNet::BitStream* outBitStream, eReplicaPacketType
|
|||||||
playerForcedMovementComponent->Serialize(outBitStream, bIsInitialUpdate);
|
playerForcedMovementComponent->Serialize(outBitStream, bIsInitialUpdate);
|
||||||
} else {
|
} else {
|
||||||
// Should never happen, but just to be safe
|
// Should never happen, but just to be safe
|
||||||
outBitStream->Write0();
|
outBitStream.Write0();
|
||||||
}
|
}
|
||||||
|
|
||||||
characterComponent->Serialize(outBitStream, bIsInitialUpdate);
|
characterComponent->Serialize(outBitStream, bIsInitialUpdate);
|
||||||
@@ -1250,7 +1235,7 @@ void Entity::WriteComponents(RakNet::BitStream* outBitStream, eReplicaPacketType
|
|||||||
// BBB Component, unused currently
|
// BBB Component, unused currently
|
||||||
// Need to to write0 so that is serialized correctly
|
// Need to to write0 so that is serialized correctly
|
||||||
// TODO: Implement BBB Component
|
// TODO: Implement BBB Component
|
||||||
outBitStream->Write0();
|
outBitStream.Write0();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::UpdateXMLDoc(tinyxml2::XMLDocument* doc) {
|
void Entity::UpdateXMLDoc(tinyxml2::XMLDocument* doc) {
|
||||||
@@ -1278,9 +1263,7 @@ void Entity::Update(const float deltaTime) {
|
|||||||
// Remove the timer from the list of timers first so that scripts and events can remove timers without causing iterator invalidation
|
// Remove the timer from the list of timers first so that scripts and events can remove timers without causing iterator invalidation
|
||||||
auto timerName = timer.GetName();
|
auto timerName = timer.GetName();
|
||||||
m_Timers.erase(m_Timers.begin() + timerPosition);
|
m_Timers.erase(m_Timers.begin() + timerPosition);
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnTimerDone(this, timerName);
|
||||||
script->OnTimerDone(this, timerName);
|
|
||||||
}
|
|
||||||
|
|
||||||
TriggerEvent(eTriggerEventType::TIMER_DONE, this);
|
TriggerEvent(eTriggerEventType::TIMER_DONE, this);
|
||||||
} else {
|
} else {
|
||||||
@@ -1326,9 +1309,7 @@ void Entity::Update(const float deltaTime) {
|
|||||||
Wake();
|
Wake();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnUpdate(this);
|
||||||
script->OnUpdate(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto& pair : m_Components) {
|
for (const auto& pair : m_Components) {
|
||||||
if (pair.second == nullptr) continue;
|
if (pair.second == nullptr) continue;
|
||||||
@@ -1345,9 +1326,7 @@ void Entity::OnCollisionProximity(LWOOBJID otherEntity, const std::string& proxN
|
|||||||
Entity* other = Game::entityManager->GetEntity(otherEntity);
|
Entity* other = Game::entityManager->GetEntity(otherEntity);
|
||||||
if (!other) return;
|
if (!other) return;
|
||||||
|
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnProximityUpdate(this, other, proxName, status);
|
||||||
script->OnProximityUpdate(this, other, proxName, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
RocketLaunchpadControlComponent* rocketComp = GetComponent<RocketLaunchpadControlComponent>();
|
RocketLaunchpadControlComponent* rocketComp = GetComponent<RocketLaunchpadControlComponent>();
|
||||||
if (!rocketComp) return;
|
if (!rocketComp) return;
|
||||||
@@ -1359,9 +1338,7 @@ void Entity::OnCollisionPhantom(const LWOOBJID otherEntity) {
|
|||||||
auto* other = Game::entityManager->GetEntity(otherEntity);
|
auto* other = Game::entityManager->GetEntity(otherEntity);
|
||||||
if (!other) return;
|
if (!other) return;
|
||||||
|
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnCollisionPhantom(this, other);
|
||||||
script->OnCollisionPhantom(this, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto& callback : m_PhantomCollisionCallbacks) {
|
for (const auto& callback : m_PhantomCollisionCallbacks) {
|
||||||
callback(other);
|
callback(other);
|
||||||
@@ -1400,9 +1377,7 @@ void Entity::OnCollisionLeavePhantom(const LWOOBJID otherEntity) {
|
|||||||
auto* other = Game::entityManager->GetEntity(otherEntity);
|
auto* other = Game::entityManager->GetEntity(otherEntity);
|
||||||
if (!other) return;
|
if (!other) return;
|
||||||
|
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnOffCollisionPhantom(this, other);
|
||||||
script->OnOffCollisionPhantom(this, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
TriggerEvent(eTriggerEventType::EXIT, other);
|
TriggerEvent(eTriggerEventType::EXIT, other);
|
||||||
|
|
||||||
@@ -1419,46 +1394,32 @@ void Entity::OnCollisionLeavePhantom(const LWOOBJID otherEntity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnFireEventServerSide(Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) {
|
void Entity::OnFireEventServerSide(Entity* sender, std::string args, int32_t param1, int32_t param2, int32_t param3) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnFireEventServerSide(this, sender, args, param1, param2, param3);
|
||||||
script->OnFireEventServerSide(this, sender, args, param1, param2, param3);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnActivityStateChangeRequest(LWOOBJID senderID, int32_t value1, int32_t value2, const std::u16string& stringValue) {
|
void Entity::OnActivityStateChangeRequest(LWOOBJID senderID, int32_t value1, int32_t value2, const std::u16string& stringValue) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnActivityStateChangeRequest(this, senderID, value1, value2, stringValue);
|
||||||
script->OnActivityStateChangeRequest(this, senderID, value1, value2, stringValue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnCinematicUpdate(Entity* self, Entity* sender, eCinematicEvent event, const std::u16string& pathName,
|
void Entity::OnCinematicUpdate(Entity* self, Entity* sender, eCinematicEvent event, const std::u16string& pathName,
|
||||||
float_t pathTime, float_t totalTime, int32_t waypoint) {
|
float_t pathTime, float_t totalTime, int32_t waypoint) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnCinematicUpdate(self, sender, event, pathName, pathTime, totalTime, waypoint);
|
||||||
script->OnCinematicUpdate(self, sender, event, pathName, pathTime, totalTime, waypoint);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::NotifyObject(Entity* sender, const std::string& name, int32_t param1, int32_t param2) {
|
void Entity::NotifyObject(Entity* sender, const std::string& name, int32_t param1, int32_t param2) {
|
||||||
GameMessages::SendNotifyObject(GetObjectID(), sender->GetObjectID(), GeneralUtils::ASCIIToUTF16(name), UNASSIGNED_SYSTEM_ADDRESS);
|
GameMessages::SendNotifyObject(GetObjectID(), sender->GetObjectID(), GeneralUtils::ASCIIToUTF16(name), UNASSIGNED_SYSTEM_ADDRESS);
|
||||||
|
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnNotifyObject(this, sender, name, param1, param2);
|
||||||
script->OnNotifyObject(this, sender, name, param1, param2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnEmoteReceived(const int32_t emote, Entity* target) {
|
void Entity::OnEmoteReceived(const int32_t emote, Entity* target) {
|
||||||
for (auto* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnEmoteReceived(this, emote, target);
|
||||||
script->OnEmoteReceived(this, emote, target);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnUse(Entity* originator) {
|
void Entity::OnUse(Entity* originator) {
|
||||||
TriggerEvent(eTriggerEventType::INTERACT, originator);
|
TriggerEvent(eTriggerEventType::INTERACT, originator);
|
||||||
|
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnUse(this, originator);
|
||||||
script->OnUse(this, originator);
|
|
||||||
}
|
|
||||||
|
|
||||||
// component base class when
|
|
||||||
|
|
||||||
for (const auto& pair : m_Components) {
|
for (const auto& pair : m_Components) {
|
||||||
if (pair.second == nullptr) continue;
|
if (pair.second == nullptr) continue;
|
||||||
@@ -1468,82 +1429,63 @@ void Entity::OnUse(Entity* originator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnHitOrHealResult(Entity* attacker, int32_t damage) {
|
void Entity::OnHitOrHealResult(Entity* attacker, int32_t damage) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnHitOrHealResult(this, attacker, damage);
|
||||||
script->OnHitOrHealResult(this, attacker, damage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnHit(Entity* attacker) {
|
void Entity::OnHit(Entity* attacker) {
|
||||||
TriggerEvent(eTriggerEventType::HIT, attacker);
|
TriggerEvent(eTriggerEventType::HIT, attacker);
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnHit(this, attacker);
|
||||||
script->OnHit(this, attacker);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyEditBegin() {
|
void Entity::OnZonePropertyEditBegin() {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyEditBegin(this);
|
||||||
script->OnZonePropertyEditBegin(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyEditEnd() {
|
void Entity::OnZonePropertyEditEnd() {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyEditEnd(this);
|
||||||
script->OnZonePropertyEditEnd(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyModelEquipped() {
|
void Entity::OnZonePropertyModelEquipped() {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyModelEquipped(this);
|
||||||
script->OnZonePropertyModelEquipped(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyModelPlaced(Entity* player) {
|
void Entity::OnZonePropertyModelPlaced(Entity* player) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyModelPlaced(this, player);
|
||||||
script->OnZonePropertyModelPlaced(this, player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyModelPickedUp(Entity* player) {
|
void Entity::OnZonePropertyModelPickedUp(Entity* player) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyModelPickedUp(this, player);
|
||||||
script->OnZonePropertyModelPickedUp(this, player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyModelRemoved(Entity* player) {
|
void Entity::OnZonePropertyModelRemoved(Entity* player) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyModelRemoved(this, player);
|
||||||
script->OnZonePropertyModelRemoved(this, player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyModelRemovedWhileEquipped(Entity* player) {
|
void Entity::OnZonePropertyModelRemovedWhileEquipped(Entity* player) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyModelRemovedWhileEquipped(this, player);
|
||||||
script->OnZonePropertyModelRemovedWhileEquipped(this, player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnZonePropertyModelRotated(Entity* player) {
|
void Entity::OnZonePropertyModelRotated(Entity* player) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnZonePropertyModelRotated(this, player);
|
||||||
script->OnZonePropertyModelRotated(this, player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) {
|
void Entity::OnMessageBoxResponse(Entity* sender, int32_t button, const std::u16string& identifier, const std::u16string& userData) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnMessageBoxResponse(this, sender, button, identifier, userData);
|
||||||
script->OnMessageBoxResponse(this, sender, button, identifier, userData);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier) {
|
void Entity::OnChoiceBoxResponse(Entity* sender, int32_t button, const std::u16string& buttonIdentifier, const std::u16string& identifier) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnChoiceBoxResponse(this, sender, button, buttonIdentifier, identifier);
|
||||||
script->OnChoiceBoxResponse(this, sender, button, buttonIdentifier, identifier);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {
|
void Entity::RequestActivityExit(Entity* sender, LWOOBJID player, bool canceled) {
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnRequestActivityExit(sender, player, canceled);
|
||||||
script->OnRequestActivityExit(sender, player, canceled);
|
}
|
||||||
}
|
|
||||||
|
CppScripts::Script* const Entity::GetScript() {
|
||||||
|
auto* scriptComponent = GetComponent<ScriptComponent>();
|
||||||
|
auto* script = scriptComponent ? scriptComponent->GetScript() : CppScripts::GetInvalidScript();
|
||||||
|
DluAssert(script != nullptr);
|
||||||
|
return script;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::Smash(const LWOOBJID source, const eKillType killType, const std::u16string& deathType) {
|
void Entity::Smash(const LWOOBJID source, const eKillType killType, const std::u16string& deathType) {
|
||||||
@@ -1576,9 +1518,7 @@ void Entity::Kill(Entity* murderer, const eKillType killType) {
|
|||||||
|
|
||||||
//OMAI WA MOU, SHINDERIU
|
//OMAI WA MOU, SHINDERIU
|
||||||
|
|
||||||
for (CppScripts::Script* script : CppScripts::GetEntityScripts(this)) {
|
GetScript()->OnDie(this, murderer);
|
||||||
script->OnDie(this, murderer);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_Spawner != nullptr) {
|
if (m_Spawner != nullptr) {
|
||||||
m_Spawner->NotifyOfEntityDeath(m_ObjectID);
|
m_Spawner->NotifyOfEntityDeath(m_ObjectID);
|
||||||
@@ -2126,9 +2066,7 @@ void Entity::ProcessPositionUpdate(PositionUpdate& update) {
|
|||||||
havokVehiclePhysicsComponent->SetIsOnGround(update.onGround);
|
havokVehiclePhysicsComponent->SetIsOnGround(update.onGround);
|
||||||
havokVehiclePhysicsComponent->SetIsOnRail(update.onRail);
|
havokVehiclePhysicsComponent->SetIsOnRail(update.onRail);
|
||||||
havokVehiclePhysicsComponent->SetVelocity(update.velocity);
|
havokVehiclePhysicsComponent->SetVelocity(update.velocity);
|
||||||
havokVehiclePhysicsComponent->SetDirtyVelocity(update.velocity != NiPoint3Constant::ZERO);
|
|
||||||
havokVehiclePhysicsComponent->SetAngularVelocity(update.angularVelocity);
|
havokVehiclePhysicsComponent->SetAngularVelocity(update.angularVelocity);
|
||||||
havokVehiclePhysicsComponent->SetDirtyAngularVelocity(update.angularVelocity != NiPoint3Constant::ZERO);
|
|
||||||
havokVehiclePhysicsComponent->SetRemoteInputInfo(update.remoteInputInfo);
|
havokVehiclePhysicsComponent->SetRemoteInputInfo(update.remoteInputInfo);
|
||||||
} else {
|
} else {
|
||||||
// Need to get the mount's controllable physics
|
// Need to get the mount's controllable physics
|
||||||
@@ -2139,9 +2077,7 @@ void Entity::ProcessPositionUpdate(PositionUpdate& update) {
|
|||||||
possessedControllablePhysicsComponent->SetIsOnGround(update.onGround);
|
possessedControllablePhysicsComponent->SetIsOnGround(update.onGround);
|
||||||
possessedControllablePhysicsComponent->SetIsOnRail(update.onRail);
|
possessedControllablePhysicsComponent->SetIsOnRail(update.onRail);
|
||||||
possessedControllablePhysicsComponent->SetVelocity(update.velocity);
|
possessedControllablePhysicsComponent->SetVelocity(update.velocity);
|
||||||
possessedControllablePhysicsComponent->SetDirtyVelocity(update.velocity != NiPoint3Constant::ZERO);
|
|
||||||
possessedControllablePhysicsComponent->SetAngularVelocity(update.angularVelocity);
|
possessedControllablePhysicsComponent->SetAngularVelocity(update.angularVelocity);
|
||||||
possessedControllablePhysicsComponent->SetDirtyAngularVelocity(update.angularVelocity != NiPoint3Constant::ZERO);
|
|
||||||
}
|
}
|
||||||
Game::entityManager->SerializeEntity(possassableEntity);
|
Game::entityManager->SerializeEntity(possassableEntity);
|
||||||
}
|
}
|
||||||
@@ -2163,9 +2099,7 @@ void Entity::ProcessPositionUpdate(PositionUpdate& update) {
|
|||||||
controllablePhysicsComponent->SetIsOnGround(update.onGround);
|
controllablePhysicsComponent->SetIsOnGround(update.onGround);
|
||||||
controllablePhysicsComponent->SetIsOnRail(update.onRail);
|
controllablePhysicsComponent->SetIsOnRail(update.onRail);
|
||||||
controllablePhysicsComponent->SetVelocity(update.velocity);
|
controllablePhysicsComponent->SetVelocity(update.velocity);
|
||||||
controllablePhysicsComponent->SetDirtyVelocity(update.velocity != NiPoint3Constant::ZERO);
|
|
||||||
controllablePhysicsComponent->SetAngularVelocity(update.angularVelocity);
|
controllablePhysicsComponent->SetAngularVelocity(update.angularVelocity);
|
||||||
controllablePhysicsComponent->SetDirtyAngularVelocity(update.angularVelocity != NiPoint3Constant::ZERO);
|
|
||||||
|
|
||||||
auto* ghostComponent = GetComponent<GhostComponent>();
|
auto* ghostComponent = GetComponent<GhostComponent>();
|
||||||
if (ghostComponent) ghostComponent->SetGhostReferencePoint(update.position);
|
if (ghostComponent) ghostComponent->SetGhostReferencePoint(update.position);
|
||||||
|
|||||||
@@ -146,7 +146,8 @@ public:
|
|||||||
|
|
||||||
void AddComponent(eReplicaComponentType componentId, Component* component);
|
void AddComponent(eReplicaComponentType componentId, Component* component);
|
||||||
|
|
||||||
std::vector<ScriptComponent*> GetScriptComponents();
|
// This is expceted to never return nullptr, an assert checks this.
|
||||||
|
CppScripts::Script* const GetScript();
|
||||||
|
|
||||||
void Subscribe(LWOOBJID scriptObjId, CppScripts::Script* scriptToAdd, const std::string& notificationName);
|
void Subscribe(LWOOBJID scriptObjId, CppScripts::Script* scriptToAdd, const std::string& notificationName);
|
||||||
void Unsubscribe(LWOOBJID scriptObjId, const std::string& notificationName);
|
void Unsubscribe(LWOOBJID scriptObjId, const std::string& notificationName);
|
||||||
@@ -171,8 +172,8 @@ public:
|
|||||||
|
|
||||||
std::unordered_map<eReplicaComponentType, Component*>& GetComponents() { return m_Components; } // TODO: Remove
|
std::unordered_map<eReplicaComponentType, Component*>& GetComponents() { return m_Components; } // TODO: Remove
|
||||||
|
|
||||||
void WriteBaseReplicaData(RakNet::BitStream* outBitStream, eReplicaPacketType packetType);
|
void WriteBaseReplicaData(RakNet::BitStream& outBitStream, eReplicaPacketType packetType);
|
||||||
void WriteComponents(RakNet::BitStream* outBitStream, eReplicaPacketType packetType);
|
void WriteComponents(RakNet::BitStream& outBitStream, eReplicaPacketType packetType);
|
||||||
void UpdateXMLDoc(tinyxml2::XMLDocument* doc);
|
void UpdateXMLDoc(tinyxml2::XMLDocument* doc);
|
||||||
void Update(float deltaTime);
|
void Update(float deltaTime);
|
||||||
|
|
||||||
@@ -295,6 +296,9 @@ public:
|
|||||||
|
|
||||||
void ProcessPositionUpdate(PositionUpdate& update);
|
void ProcessPositionUpdate(PositionUpdate& update);
|
||||||
|
|
||||||
|
// Scale will only be communicated to the client when the construction packet is sent
|
||||||
|
void SetScale(const float scale) { m_Scale = scale; };
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
LWOOBJID m_ObjectID;
|
LWOOBJID m_ObjectID;
|
||||||
|
|
||||||
|
|||||||
@@ -178,18 +178,18 @@ void EntityManager::SerializeEntities() {
|
|||||||
stream.Write<char>(ID_REPLICA_MANAGER_SERIALIZE);
|
stream.Write<char>(ID_REPLICA_MANAGER_SERIALIZE);
|
||||||
stream.Write<unsigned short>(entity->GetNetworkId());
|
stream.Write<unsigned short>(entity->GetNetworkId());
|
||||||
|
|
||||||
entity->WriteBaseReplicaData(&stream, eReplicaPacketType::SERIALIZATION);
|
entity->WriteBaseReplicaData(stream, eReplicaPacketType::SERIALIZATION);
|
||||||
entity->WriteComponents(&stream, eReplicaPacketType::SERIALIZATION);
|
entity->WriteComponents(stream, eReplicaPacketType::SERIALIZATION);
|
||||||
|
|
||||||
if (entity->GetIsGhostingCandidate()) {
|
if (entity->GetIsGhostingCandidate()) {
|
||||||
for (auto* player : PlayerManager::GetAllPlayers()) {
|
for (auto* player : PlayerManager::GetAllPlayers()) {
|
||||||
auto* ghostComponent = player->GetComponent<GhostComponent>();
|
auto* ghostComponent = player->GetComponent<GhostComponent>();
|
||||||
if (ghostComponent && ghostComponent->IsObserved(toSerialize)) {
|
if (ghostComponent && ghostComponent->IsObserved(toSerialize)) {
|
||||||
Game::server->Send(&stream, player->GetSystemAddress(), false);
|
Game::server->Send(stream, player->GetSystemAddress(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Game::server->Send(&stream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
Game::server->Send(stream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_EntitiesToSerialize.clear();
|
m_EntitiesToSerialize.clear();
|
||||||
@@ -201,7 +201,7 @@ void EntityManager::KillEntities() {
|
|||||||
auto* entity = GetEntity(toKill);
|
auto* entity = GetEntity(toKill);
|
||||||
|
|
||||||
if (!entity) {
|
if (!entity) {
|
||||||
LOG("Attempting to kill null entity %llu", toKill);
|
Log::Warn("Attempting to kill null entity {}", toKill);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,7 +231,7 @@ void EntityManager::DeleteEntities() {
|
|||||||
|
|
||||||
if (ghostingToDelete != m_EntitiesToGhost.end()) m_EntitiesToGhost.erase(ghostingToDelete);
|
if (ghostingToDelete != m_EntitiesToGhost.end()) m_EntitiesToGhost.erase(ghostingToDelete);
|
||||||
} else {
|
} else {
|
||||||
LOG("Attempted to delete non-existent entity %llu", toDelete);
|
Log::Warn("Attempted to delete non-existent entity {}", toDelete);
|
||||||
}
|
}
|
||||||
m_Entities.erase(toDelete);
|
m_Entities.erase(toDelete);
|
||||||
}
|
}
|
||||||
@@ -322,7 +322,7 @@ const std::unordered_map<std::string, LWOOBJID>& EntityManager::GetSpawnPointEnt
|
|||||||
|
|
||||||
void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr, const bool skipChecks) {
|
void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr, const bool skipChecks) {
|
||||||
if (!entity) {
|
if (!entity) {
|
||||||
LOG("Attempted to construct null entity");
|
Log::Warn("Attempted to construct null entity");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,16 +359,16 @@ void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr
|
|||||||
stream.Write(true);
|
stream.Write(true);
|
||||||
stream.Write<uint16_t>(entity->GetNetworkId());
|
stream.Write<uint16_t>(entity->GetNetworkId());
|
||||||
|
|
||||||
entity->WriteBaseReplicaData(&stream, eReplicaPacketType::CONSTRUCTION);
|
entity->WriteBaseReplicaData(stream, eReplicaPacketType::CONSTRUCTION);
|
||||||
entity->WriteComponents(&stream, eReplicaPacketType::CONSTRUCTION);
|
entity->WriteComponents(stream, eReplicaPacketType::CONSTRUCTION);
|
||||||
|
|
||||||
if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) {
|
if (sysAddr == UNASSIGNED_SYSTEM_ADDRESS) {
|
||||||
if (skipChecks) {
|
if (skipChecks) {
|
||||||
Game::server->Send(&stream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
Game::server->Send(stream, UNASSIGNED_SYSTEM_ADDRESS, true);
|
||||||
} else {
|
} else {
|
||||||
for (auto* player : PlayerManager::GetAllPlayers()) {
|
for (auto* player : PlayerManager::GetAllPlayers()) {
|
||||||
if (player->GetPlayerReadyForUpdates()) {
|
if (player->GetPlayerReadyForUpdates()) {
|
||||||
Game::server->Send(&stream, player->GetSystemAddress(), false);
|
Game::server->Send(stream, player->GetSystemAddress(), false);
|
||||||
} else {
|
} else {
|
||||||
auto* ghostComponent = player->GetComponent<GhostComponent>();
|
auto* ghostComponent = player->GetComponent<GhostComponent>();
|
||||||
if (ghostComponent) ghostComponent->AddLimboConstruction(entity->GetObjectID());
|
if (ghostComponent) ghostComponent->AddLimboConstruction(entity->GetObjectID());
|
||||||
@@ -376,7 +376,7 @@ void EntityManager::ConstructEntity(Entity* entity, const SystemAddress& sysAddr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Game::server->Send(&stream, sysAddr, false);
|
Game::server->Send(stream, sysAddr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entity->IsPlayer()) {
|
if (entity->IsPlayer()) {
|
||||||
@@ -407,7 +407,7 @@ void EntityManager::DestructEntity(Entity* entity, const SystemAddress& sysAddr)
|
|||||||
stream.Write<uint8_t>(ID_REPLICA_MANAGER_DESTRUCTION);
|
stream.Write<uint8_t>(ID_REPLICA_MANAGER_DESTRUCTION);
|
||||||
stream.Write<uint16_t>(entity->GetNetworkId());
|
stream.Write<uint16_t>(entity->GetNetworkId());
|
||||||
|
|
||||||
Game::server->Send(&stream, sysAddr, sysAddr == UNASSIGNED_SYSTEM_ADDRESS);
|
Game::server->Send(stream, sysAddr, sysAddr == UNASSIGNED_SYSTEM_ADDRESS);
|
||||||
|
|
||||||
for (auto* player : PlayerManager::GetAllPlayers()) {
|
for (auto* player : PlayerManager::GetAllPlayers()) {
|
||||||
if (!player->GetPlayerReadyForUpdates()) {
|
if (!player->GetPlayerReadyForUpdates()) {
|
||||||
@@ -418,10 +418,16 @@ void EntityManager::DestructEntity(Entity* entity, const SystemAddress& sysAddr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EntityManager::SerializeEntity(Entity* entity) {
|
void EntityManager::SerializeEntity(Entity* entity) {
|
||||||
if (!entity || entity->GetNetworkId() == 0) return;
|
if (!entity) return;
|
||||||
|
|
||||||
|
EntityManager::SerializeEntity(*entity);
|
||||||
|
}
|
||||||
|
|
||||||
if (std::find(m_EntitiesToSerialize.begin(), m_EntitiesToSerialize.end(), entity->GetObjectID()) == m_EntitiesToSerialize.end()) {
|
void EntityManager::SerializeEntity(const Entity& entity) {
|
||||||
m_EntitiesToSerialize.push_back(entity->GetObjectID());
|
if (entity.GetNetworkId() == 0) return;
|
||||||
|
|
||||||
|
if (std::find(m_EntitiesToSerialize.cbegin(), m_EntitiesToSerialize.cend(), entity.GetObjectID()) == m_EntitiesToSerialize.cend()) {
|
||||||
|
m_EntitiesToSerialize.push_back(entity.GetObjectID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ public:
|
|||||||
void ConstructEntity(Entity* entity, const SystemAddress& sysAddr = UNASSIGNED_SYSTEM_ADDRESS, bool skipChecks = false);
|
void ConstructEntity(Entity* entity, const SystemAddress& sysAddr = UNASSIGNED_SYSTEM_ADDRESS, bool skipChecks = false);
|
||||||
void DestructEntity(Entity* entity, const SystemAddress& sysAddr = UNASSIGNED_SYSTEM_ADDRESS);
|
void DestructEntity(Entity* entity, const SystemAddress& sysAddr = UNASSIGNED_SYSTEM_ADDRESS);
|
||||||
void SerializeEntity(Entity* entity);
|
void SerializeEntity(Entity* entity);
|
||||||
|
void SerializeEntity(const Entity& entity);
|
||||||
|
|
||||||
void ConstructAllEntities(const SystemAddress& sysAddr);
|
void ConstructAllEntities(const SystemAddress& sysAddr);
|
||||||
void DestructAllEntities(const SystemAddress& sysAddr);
|
void DestructAllEntities(const SystemAddress& sysAddr);
|
||||||
|
|||||||
@@ -43,9 +43,9 @@ inline void WriteLeaderboardRow(std::ostringstream& leaderboard, const uint32_t&
|
|||||||
leaderboard << "\nResult[0].Row[" << index << "]." << data->GetString();
|
leaderboard << "\nResult[0].Row[" << index << "]." << data->GetString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Leaderboard::Serialize(RakNet::BitStream* bitStream) const {
|
void Leaderboard::Serialize(RakNet::BitStream& bitStream) const {
|
||||||
bitStream->Write(gameID);
|
bitStream.Write(gameID);
|
||||||
bitStream->Write(infoType);
|
bitStream.Write(infoType);
|
||||||
|
|
||||||
std::ostringstream leaderboard;
|
std::ostringstream leaderboard;
|
||||||
|
|
||||||
@@ -64,12 +64,12 @@ void Leaderboard::Serialize(RakNet::BitStream* bitStream) const {
|
|||||||
|
|
||||||
// Serialize the thing to a BitStream
|
// Serialize the thing to a BitStream
|
||||||
uint32_t leaderboardSize = leaderboard.tellp();
|
uint32_t leaderboardSize = leaderboard.tellp();
|
||||||
bitStream->Write<uint32_t>(leaderboardSize);
|
bitStream.Write<uint32_t>(leaderboardSize);
|
||||||
// Doing this all in 1 call so there is no possbility of a dangling pointer.
|
// Doing this all in 1 call so there is no possbility of a dangling pointer.
|
||||||
bitStream->WriteAlignedBytes(reinterpret_cast<const unsigned char*>(GeneralUtils::ASCIIToUTF16(leaderboard.str()).c_str()), leaderboardSize * sizeof(char16_t));
|
bitStream.WriteAlignedBytes(reinterpret_cast<const unsigned char*>(GeneralUtils::ASCIIToUTF16(leaderboard.str()).c_str()), leaderboardSize * sizeof(char16_t));
|
||||||
if (leaderboardSize > 0) bitStream->Write<uint16_t>(0);
|
if (leaderboardSize > 0) bitStream.Write<uint16_t>(0);
|
||||||
bitStream->Write0();
|
bitStream.Write0();
|
||||||
bitStream->Write0();
|
bitStream.Write0();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Leaderboard::QueryToLdf(std::unique_ptr<sql::ResultSet>& rows) {
|
void Leaderboard::QueryToLdf(std::unique_ptr<sql::ResultSet>& rows) {
|
||||||
@@ -236,7 +236,7 @@ void Leaderboard::SetupLeaderboard(bool weekly, uint32_t resultStart, uint32_t r
|
|||||||
baseLookup += std::to_string(static_cast<uint32_t>(this->relatedPlayer));
|
baseLookup += std::to_string(static_cast<uint32_t>(this->relatedPlayer));
|
||||||
}
|
}
|
||||||
baseLookup += " LIMIT 1";
|
baseLookup += " LIMIT 1";
|
||||||
LOG_DEBUG("query is %s", baseLookup.c_str());
|
Log::Debug("query is {:s}", baseLookup);
|
||||||
std::unique_ptr<sql::PreparedStatement> baseQuery(Database::Get()->CreatePreppedStmt(baseLookup));
|
std::unique_ptr<sql::PreparedStatement> baseQuery(Database::Get()->CreatePreppedStmt(baseLookup));
|
||||||
baseQuery->setInt(1, this->gameID);
|
baseQuery->setInt(1, this->gameID);
|
||||||
std::unique_ptr<sql::ResultSet> baseResult(baseQuery->executeQuery());
|
std::unique_ptr<sql::ResultSet> baseResult(baseQuery->executeQuery());
|
||||||
@@ -251,7 +251,7 @@ void Leaderboard::SetupLeaderboard(bool weekly, uint32_t resultStart, uint32_t r
|
|||||||
int32_t res = snprintf(lookupBuffer.get(), STRING_LENGTH, queryBase.c_str(), orderBase.data(), filter.c_str(), resultStart, resultEnd);
|
int32_t res = snprintf(lookupBuffer.get(), STRING_LENGTH, queryBase.c_str(), orderBase.data(), filter.c_str(), resultStart, resultEnd);
|
||||||
DluAssert(res != -1);
|
DluAssert(res != -1);
|
||||||
std::unique_ptr<sql::PreparedStatement> query(Database::Get()->CreatePreppedStmt(lookupBuffer.get()));
|
std::unique_ptr<sql::PreparedStatement> query(Database::Get()->CreatePreppedStmt(lookupBuffer.get()));
|
||||||
LOG_DEBUG("Query is %s vars are %i %i %i", lookupBuffer.get(), this->gameID, this->relatedPlayer, relatedPlayerLeaderboardId);
|
Log::Debug("Query is {:s} vars are {:d} {:d} {:d}", lookupBuffer.get(), this->gameID, this->relatedPlayer, relatedPlayerLeaderboardId);
|
||||||
query->setInt(1, this->gameID);
|
query->setInt(1, this->gameID);
|
||||||
if (this->infoType == InfoType::Friends) {
|
if (this->infoType == InfoType::Friends) {
|
||||||
query->setInt(2, this->relatedPlayer);
|
query->setInt(2, this->relatedPlayer);
|
||||||
@@ -358,7 +358,7 @@ void LeaderboardManager::SaveScore(const LWOOBJID& playerID, const GameID activi
|
|||||||
}
|
}
|
||||||
case Leaderboard::Type::None:
|
case Leaderboard::Type::None:
|
||||||
default:
|
default:
|
||||||
LOG("Unknown leaderboard type %i for game %i. Cannot save score!", leaderboardType, activityId);
|
Log::Warn("Unknown leaderboard type {:d} for game {:d}. Cannot save score!", GeneralUtils::ToUnderlying(leaderboardType), activityId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool newHighScore = lowerScoreBetter ? newScore < oldScore : newScore > oldScore;
|
bool newHighScore = lowerScoreBetter ? newScore < oldScore : newScore > oldScore;
|
||||||
@@ -377,7 +377,7 @@ void LeaderboardManager::SaveScore(const LWOOBJID& playerID, const GameID activi
|
|||||||
} else {
|
} else {
|
||||||
saveQuery = FormatInsert(leaderboardType, newScore, false);
|
saveQuery = FormatInsert(leaderboardType, newScore, false);
|
||||||
}
|
}
|
||||||
LOG("save query %s %i %i", saveQuery.c_str(), playerID, activityId);
|
Log::Info("save query {:s} {:d} {:d}", saveQuery, playerID, activityId);
|
||||||
std::unique_ptr<sql::PreparedStatement> saveStatement(Database::Get()->CreatePreppedStmt(saveQuery));
|
std::unique_ptr<sql::PreparedStatement> saveStatement(Database::Get()->CreatePreppedStmt(saveQuery));
|
||||||
saveStatement->setInt(1, playerID);
|
saveStatement->setInt(1, playerID);
|
||||||
saveStatement->setInt(2, activityId);
|
saveStatement->setInt(2, activityId);
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public:
|
|||||||
*
|
*
|
||||||
* Expensive! Leaderboards are very string intensive so be wary of performatnce calling this method.
|
* Expensive! Leaderboards are very string intensive so be wary of performatnce calling this method.
|
||||||
*/
|
*/
|
||||||
void Serialize(RakNet::BitStream* bitStream) const;
|
void Serialize(RakNet::BitStream& bitStream) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds the leaderboard from the database based on the associated gameID
|
* Builds the leaderboard from the database based on the associated gameID
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ void Trade::SetAccepted(LWOOBJID participant, bool value) {
|
|||||||
if (participant == m_ParticipantA) {
|
if (participant == m_ParticipantA) {
|
||||||
m_AcceptedA = !value;
|
m_AcceptedA = !value;
|
||||||
|
|
||||||
LOG("Accepted from A (%d), B: (%d)", value, m_AcceptedB);
|
Log::Info("Accepted from A ({}), B: ({})", value, m_AcceptedB);
|
||||||
|
|
||||||
auto* entityB = GetParticipantBEntity();
|
auto* entityB = GetParticipantBEntity();
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ void Trade::SetAccepted(LWOOBJID participant, bool value) {
|
|||||||
} else if (participant == m_ParticipantB) {
|
} else if (participant == m_ParticipantB) {
|
||||||
m_AcceptedB = !value;
|
m_AcceptedB = !value;
|
||||||
|
|
||||||
LOG("Accepted from B (%d), A: (%d)", value, m_AcceptedA);
|
Log::Info("Accepted from B ({}), A: ({})", value, m_AcceptedA);
|
||||||
|
|
||||||
auto* entityA = GetParticipantAEntity();
|
auto* entityA = GetParticipantAEntity();
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ void Trade::Complete() {
|
|||||||
|
|
||||||
// First verify both players have the coins and items requested for the trade.
|
// First verify both players have the coins and items requested for the trade.
|
||||||
if (characterA->GetCoins() < m_CoinsA || characterB->GetCoins() < m_CoinsB) {
|
if (characterA->GetCoins() < m_CoinsA || characterB->GetCoins() < m_CoinsB) {
|
||||||
LOG("Possible coin trade cheating attempt! Aborting trade.");
|
Log::Warn("Possible coin trade cheating attempt! Aborting trade.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,11 +133,11 @@ void Trade::Complete() {
|
|||||||
auto* itemToRemove = inventoryA->FindItemById(tradeItem.itemId);
|
auto* itemToRemove = inventoryA->FindItemById(tradeItem.itemId);
|
||||||
if (itemToRemove) {
|
if (itemToRemove) {
|
||||||
if (itemToRemove->GetCount() < tradeItem.itemCount) {
|
if (itemToRemove->GetCount() < tradeItem.itemCount) {
|
||||||
LOG("Possible cheating attempt from %s in trading!!! Aborting trade", characterA->GetName().c_str());
|
Log::Warn("Possible cheating attempt from {:s} in trading!!! Aborting trade", characterA->GetName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG("Possible cheating attempt from %s in trading due to item not being available!!!", characterA->GetName().c_str());
|
Log::Warn("Possible cheating attempt from {:s} in trading due to item not being available!!!", characterA->GetName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,11 +146,11 @@ void Trade::Complete() {
|
|||||||
auto* itemToRemove = inventoryB->FindItemById(tradeItem.itemId);
|
auto* itemToRemove = inventoryB->FindItemById(tradeItem.itemId);
|
||||||
if (itemToRemove) {
|
if (itemToRemove) {
|
||||||
if (itemToRemove->GetCount() < tradeItem.itemCount) {
|
if (itemToRemove->GetCount() < tradeItem.itemCount) {
|
||||||
LOG("Possible cheating attempt from %s in trading!!! Aborting trade", characterB->GetName().c_str());
|
Log::Warn("Possible cheating attempt from {:s} in trading!!! Aborting trade", characterB->GetName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG("Possible cheating attempt from %s in trading due to item not being available!!! Aborting trade", characterB->GetName().c_str());
|
Log::Warn("Possible cheating attempt from {:s} in trading due to item not being available!!! Aborting trade", characterB->GetName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ void Trade::SendUpdateToOther(LWOOBJID participant) {
|
|||||||
uint64_t coins;
|
uint64_t coins;
|
||||||
std::vector<TradeItem> itemIds;
|
std::vector<TradeItem> itemIds;
|
||||||
|
|
||||||
LOG("Attempting to send trade update");
|
Log::Info("Attempting to send trade update");
|
||||||
|
|
||||||
if (participant == m_ParticipantA) {
|
if (participant == m_ParticipantA) {
|
||||||
other = GetParticipantBEntity();
|
other = GetParticipantBEntity();
|
||||||
@@ -228,7 +228,7 @@ void Trade::SendUpdateToOther(LWOOBJID participant) {
|
|||||||
items.push_back(tradeItem);
|
items.push_back(tradeItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("Sending trade update");
|
Log::Info("Sending trade update");
|
||||||
|
|
||||||
GameMessages::SendServerTradeUpdate(other->GetObjectID(), coins, items, other->GetSystemAddress());
|
GameMessages::SendServerTradeUpdate(other->GetObjectID(), coins, items, other->GetSystemAddress());
|
||||||
}
|
}
|
||||||
@@ -281,7 +281,7 @@ Trade* TradingManager::NewTrade(LWOOBJID participantA, LWOOBJID participantB) {
|
|||||||
|
|
||||||
trades[tradeId] = trade;
|
trades[tradeId] = trade;
|
||||||
|
|
||||||
LOG("Created new trade between (%llu) <-> (%llu)", participantA, participantB);
|
Log::Info("Created new trade between ({}) <-> ({})", participantA, participantB);
|
||||||
|
|
||||||
return trade;
|
return trade;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ User::User(const SystemAddress& sysAddr, const std::string& username, const std:
|
|||||||
Character* character = new Character(lastUsedCharacterId, this);
|
Character* character = new Character(lastUsedCharacterId, this);
|
||||||
character->UpdateFromDatabase();
|
character->UpdateFromDatabase();
|
||||||
m_Characters.push_back(character);
|
m_Characters.push_back(character);
|
||||||
LOG("Loaded %i as it is the last used char", lastUsedCharacterId);
|
Log::Info("Loaded {:d} as it is the last used char", lastUsedCharacterId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,7 +106,7 @@ void User::UserOutOfSync() {
|
|||||||
m_AmountOfTimesOutOfSync++;
|
m_AmountOfTimesOutOfSync++;
|
||||||
if (m_AmountOfTimesOutOfSync > m_MaxDesyncAllowed) {
|
if (m_AmountOfTimesOutOfSync > m_MaxDesyncAllowed) {
|
||||||
//YEET
|
//YEET
|
||||||
LOG("User %s was out of sync %i times out of %i, disconnecting for suspected speedhacking.", m_Username.c_str(), m_AmountOfTimesOutOfSync, m_MaxDesyncAllowed);
|
Log::Warn("User {:s} was out of sync {:d} times out of {:d}, disconnecting for suspected speedhacking.", m_Username, m_AmountOfTimesOutOfSync, m_MaxDesyncAllowed);
|
||||||
Game::server->Disconnect(this->m_SystemAddress, eServerDisconnectIdentifiers::PLAY_SCHEDULE_TIME_DONE);
|
Game::server->Disconnect(this->m_SystemAddress, eServerDisconnectIdentifiers::PLAY_SCHEDULE_TIME_DONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ void UserManager::Initialize() {
|
|||||||
|
|
||||||
auto fnStream = Game::assetManager->GetFile("names/minifigname_first.txt");
|
auto fnStream = Game::assetManager->GetFile("names/minifigname_first.txt");
|
||||||
if (!fnStream) {
|
if (!fnStream) {
|
||||||
LOG("Failed to load %s", (Game::assetManager->GetResPath() / "names/minifigname_first.txt").string().c_str());
|
Log::Warn("Failed to load {:s}", (Game::assetManager->GetResPath() / "names/minifigname_first.txt").string());
|
||||||
throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
|
throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ void UserManager::Initialize() {
|
|||||||
|
|
||||||
auto mnStream = Game::assetManager->GetFile("names/minifigname_middle.txt");
|
auto mnStream = Game::assetManager->GetFile("names/minifigname_middle.txt");
|
||||||
if (!mnStream) {
|
if (!mnStream) {
|
||||||
LOG("Failed to load %s", (Game::assetManager->GetResPath() / "names/minifigname_middle.txt").string().c_str());
|
Log::Warn("Failed to load {:s}", (Game::assetManager->GetResPath() / "names/minifigname_middle.txt").string());
|
||||||
throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
|
throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +69,7 @@ void UserManager::Initialize() {
|
|||||||
|
|
||||||
auto lnStream = Game::assetManager->GetFile("names/minifigname_last.txt");
|
auto lnStream = Game::assetManager->GetFile("names/minifigname_last.txt");
|
||||||
if (!lnStream) {
|
if (!lnStream) {
|
||||||
LOG("Failed to load %s", (Game::assetManager->GetResPath() / "names/minifigname_last.txt").string().c_str());
|
Log::Warn("Failed to load {:s}", (Game::assetManager->GetResPath() / "names/minifigname_last.txt").string());
|
||||||
throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
|
throw std::runtime_error("Aborting initialization due to missing minifigure name file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ void UserManager::Initialize() {
|
|||||||
// Load our pre-approved names:
|
// Load our pre-approved names:
|
||||||
auto chatListStream = Game::assetManager->GetFile("chatplus_en_us.txt");
|
auto chatListStream = Game::assetManager->GetFile("chatplus_en_us.txt");
|
||||||
if (!chatListStream) {
|
if (!chatListStream) {
|
||||||
LOG("Failed to load %s", (Game::assetManager->GetResPath() / "chatplus_en_us.txt").string().c_str());
|
Log::Warn("Failed to load {:s}", (Game::assetManager->GetResPath() / "chatplus_en_us.txt").string());
|
||||||
throw std::runtime_error("Aborting initialization due to missing chat whitelist file.");
|
throw std::runtime_error("Aborting initialization due to missing chat whitelist file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +145,7 @@ bool UserManager::DeleteUser(const SystemAddress& sysAddr) {
|
|||||||
|
|
||||||
void UserManager::DeletePendingRemovals() {
|
void UserManager::DeletePendingRemovals() {
|
||||||
for (auto* user : m_UsersToDelete) {
|
for (auto* user : m_UsersToDelete) {
|
||||||
LOG("Deleted user %i", user->GetAccountID());
|
Log::Info("Deleted user {:d}", user->GetAccountID());
|
||||||
|
|
||||||
delete user;
|
delete user;
|
||||||
}
|
}
|
||||||
@@ -306,27 +306,27 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
LOT pantsLOT = FindCharPantsID(pantsColor);
|
LOT pantsLOT = FindCharPantsID(pantsColor);
|
||||||
|
|
||||||
if (!name.empty() && Database::Get()->GetCharacterInfo(name)) {
|
if (!name.empty() && Database::Get()->GetCharacterInfo(name)) {
|
||||||
LOG("AccountID: %i chose unavailable name: %s", u->GetAccountID(), name.c_str());
|
Log::Info("AccountID: {:d} chose unavailable name: {:s}", u->GetAccountID(), name);
|
||||||
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::CUSTOM_NAME_IN_USE);
|
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::CUSTOM_NAME_IN_USE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Database::Get()->GetCharacterInfo(predefinedName)) {
|
if (Database::Get()->GetCharacterInfo(predefinedName)) {
|
||||||
LOG("AccountID: %i chose unavailable predefined name: %s", u->GetAccountID(), predefinedName.c_str());
|
Log::Info("AccountID: {:d} chose unavailable predefined name: {:s}", u->GetAccountID(), predefinedName);
|
||||||
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::PREDEFINED_NAME_IN_USE);
|
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::PREDEFINED_NAME_IN_USE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
LOG("AccountID: %i is creating a character with predefined name: %s", u->GetAccountID(), predefinedName.c_str());
|
Log::Info("AccountID: {:d} is creating a character with predefined name: {:s}", u->GetAccountID(), predefinedName);
|
||||||
} else {
|
} else {
|
||||||
LOG("AccountID: %i is creating a character with name: %s (temporary: %s)", u->GetAccountID(), name.c_str(), predefinedName.c_str());
|
Log::Info("AccountID: {:d} is creating a character with name: {:s} (temporary: {:s})", u->GetAccountID(), name, predefinedName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Now that the name is ok, we can get an objectID from Master:
|
//Now that the name is ok, we can get an objectID from Master:
|
||||||
ObjectIDManager::RequestPersistentID([=, this](uint32_t objectID) mutable {
|
ObjectIDManager::RequestPersistentID([=, this](uint32_t objectID) mutable {
|
||||||
if (Database::Get()->GetCharacterInfo(objectID)) {
|
if (Database::Get()->GetCharacterInfo(objectID)) {
|
||||||
LOG("Character object id unavailable, check object_id_tracker!");
|
Log::Warn("Character object id unavailable, check object_id_tracker!");
|
||||||
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::OBJECT_ID_UNAVAILABLE);
|
WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::OBJECT_ID_UNAVAILABLE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -397,7 +397,7 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet) {
|
void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet) {
|
||||||
User* u = GetUser(sysAddr);
|
User* u = GetUser(sysAddr);
|
||||||
if (!u) {
|
if (!u) {
|
||||||
LOG("Couldn't get user to delete character");
|
Log::Warn("Couldn't get user to delete character");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,7 +406,7 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
inStream.Read(objectID);
|
inStream.Read(objectID);
|
||||||
uint32_t charID = static_cast<uint32_t>(objectID);
|
uint32_t charID = static_cast<uint32_t>(objectID);
|
||||||
|
|
||||||
LOG("Received char delete req for ID: %llu (%u)", objectID, charID);
|
Log::Info("Received char delete req for ID: {:d} ({:d})", objectID, charID);
|
||||||
|
|
||||||
bool hasCharacter = CheatDetection::VerifyLwoobjidIsSender(
|
bool hasCharacter = CheatDetection::VerifyLwoobjidIsSender(
|
||||||
objectID,
|
objectID,
|
||||||
@@ -418,7 +418,7 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
if (!hasCharacter) {
|
if (!hasCharacter) {
|
||||||
WorldPackets::SendCharacterDeleteResponse(sysAddr, false);
|
WorldPackets::SendCharacterDeleteResponse(sysAddr, false);
|
||||||
} else {
|
} else {
|
||||||
LOG("Deleting character %i", charID);
|
Log::Info("Deleting character {:d}", charID);
|
||||||
Database::Get()->DeleteCharacter(charID);
|
Database::Get()->DeleteCharacter(charID);
|
||||||
|
|
||||||
CBITSTREAM;
|
CBITSTREAM;
|
||||||
@@ -433,7 +433,7 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet) {
|
void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet) {
|
||||||
User* u = GetUser(sysAddr);
|
User* u = GetUser(sysAddr);
|
||||||
if (!u) {
|
if (!u) {
|
||||||
LOG("Couldn't get user to delete character");
|
Log::Warn("Couldn't get user to delete character");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -444,7 +444,7 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
GeneralUtils::ClearBit(objectID, eObjectBits::PERSISTENT);
|
GeneralUtils::ClearBit(objectID, eObjectBits::PERSISTENT);
|
||||||
|
|
||||||
uint32_t charID = static_cast<uint32_t>(objectID);
|
uint32_t charID = static_cast<uint32_t>(objectID);
|
||||||
LOG("Received char rename request for ID: %llu (%u)", objectID, charID);
|
Log::Info("Received char rename request for ID: {:d} ({:d})", objectID, charID);
|
||||||
|
|
||||||
LUWString LUWStringName;
|
LUWString LUWStringName;
|
||||||
inStream.Read(LUWStringName);
|
inStream.Read(LUWStringName);
|
||||||
@@ -479,12 +479,12 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
if (!Database::Get()->GetCharacterInfo(newName)) {
|
if (!Database::Get()->GetCharacterInfo(newName)) {
|
||||||
if (IsNamePreapproved(newName)) {
|
if (IsNamePreapproved(newName)) {
|
||||||
Database::Get()->SetCharacterName(charID, newName);
|
Database::Get()->SetCharacterName(charID, newName);
|
||||||
LOG("Character %s now known as %s", character->GetName().c_str(), newName.c_str());
|
Log::Info("Character {:s} now known as {:s}", character->GetName(), newName);
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS);
|
||||||
UserManager::RequestCharacterList(sysAddr);
|
UserManager::RequestCharacterList(sysAddr);
|
||||||
} else {
|
} else {
|
||||||
Database::Get()->SetPendingCharacterName(charID, newName);
|
Database::Get()->SetPendingCharacterName(charID, newName);
|
||||||
LOG("Character %s has been renamed to %s and is pending approval by a moderator.", character->GetName().c_str(), newName.c_str());
|
Log::Info("Character {:s} has been renamed to {:s} and is pending approval by a moderator.", character->GetName(), newName);
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS);
|
||||||
UserManager::RequestCharacterList(sysAddr);
|
UserManager::RequestCharacterList(sysAddr);
|
||||||
}
|
}
|
||||||
@@ -492,7 +492,7 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::NAME_IN_USE);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::NAME_IN_USE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG("Unknown error occurred when renaming character, either hasCharacter or character variable != true.");
|
Log::Warn("Unknown error occurred when renaming character, either hasCharacter or character variable != true.");
|
||||||
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::UNKNOWN_ERROR);
|
WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::UNKNOWN_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -500,7 +500,7 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet)
|
|||||||
void UserManager::LoginCharacter(const SystemAddress& sysAddr, uint32_t playerID) {
|
void UserManager::LoginCharacter(const SystemAddress& sysAddr, uint32_t playerID) {
|
||||||
User* u = GetUser(sysAddr);
|
User* u = GetUser(sysAddr);
|
||||||
if (!u) {
|
if (!u) {
|
||||||
LOG("Couldn't get user to log in character");
|
Log::Warn("Couldn't get user to log in character");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,7 +519,7 @@ void UserManager::LoginCharacter(const SystemAddress& sysAddr, uint32_t playerID
|
|||||||
if (zoneID == LWOZONEID_INVALID) zoneID = 1000; //Send char to VE
|
if (zoneID == LWOZONEID_INVALID) zoneID = 1000; //Send char to VE
|
||||||
|
|
||||||
ZoneInstanceManager::Instance()->RequestZoneTransfer(Game::server, zoneID, character->GetZoneClone(), false, [=](bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, std::string serverIP, uint16_t serverPort) {
|
ZoneInstanceManager::Instance()->RequestZoneTransfer(Game::server, zoneID, character->GetZoneClone(), false, [=](bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, std::string serverIP, uint16_t serverPort) {
|
||||||
LOG("Transferring %s to Zone %i (Instance %i | Clone %i | Mythran Shift: %s) with IP %s and Port %i", character->GetName().c_str(), zoneID, zoneInstance, zoneClone, mythranShift == true ? "true" : "false", serverIP.c_str(), serverPort);
|
Log::Info("Transferring {:s} to Zone {:d} (Instance {:d} | Clone {:d} | Mythran Shift: {:s}) with IP {:s} and Port {:d}", character->GetName(), zoneID, zoneInstance, zoneClone, mythranShift == true ? "true" : "false", serverIP, serverPort);
|
||||||
if (character) {
|
if (character) {
|
||||||
character->SetZoneID(zoneID);
|
character->SetZoneID(zoneID);
|
||||||
character->SetZoneInstance(zoneInstance);
|
character->SetZoneInstance(zoneInstance);
|
||||||
@@ -529,7 +529,7 @@ void UserManager::LoginCharacter(const SystemAddress& sysAddr, uint32_t playerID
|
|||||||
return;
|
return;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
LOG("Unknown error occurred when logging in a character, either hasCharacter or character variable != true.");
|
Log::Warn("Unknown error occurred when logging in a character, either hasCharacter or character variable != true.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,7 +546,7 @@ uint32_t FindCharShirtID(uint32_t shirtColor, uint32_t shirtStyle) {
|
|||||||
tableData.finalize();
|
tableData.finalize();
|
||||||
return shirtLOT;
|
return shirtLOT;
|
||||||
} catch (const std::exception& ex) {
|
} catch (const std::exception& ex) {
|
||||||
LOG("Could not look up shirt %i %i: %s", shirtColor, shirtStyle, ex.what());
|
Log::Warn("Could not look up shirt {:d} {:d}: {:s}", shirtColor, shirtStyle, ex.what());
|
||||||
// in case of no shirt found in CDServer, return problematic red vest.
|
// in case of no shirt found in CDServer, return problematic red vest.
|
||||||
return 4069;
|
return 4069;
|
||||||
}
|
}
|
||||||
@@ -564,7 +564,7 @@ uint32_t FindCharPantsID(uint32_t pantsColor) {
|
|||||||
tableData.finalize();
|
tableData.finalize();
|
||||||
return pantsLOT;
|
return pantsLOT;
|
||||||
} catch (const std::exception& ex) {
|
} catch (const std::exception& ex) {
|
||||||
LOG("Could not look up pants %i: %s", pantsColor, ex.what());
|
Log::Warn("Could not look up pants {:d}: {:s}", pantsColor, ex.what());
|
||||||
// in case of no pants color found in CDServer, return red pants.
|
// in case of no pants color found in CDServer, return red pants.
|
||||||
return 2508;
|
return 2508;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,35 +5,35 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
void AirMovementBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void AirMovementBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
uint32_t handle{};
|
uint32_t handle{};
|
||||||
|
|
||||||
if (!bitStream->Read(handle)) {
|
if (!bitStream.Read(handle)) {
|
||||||
LOG("Unable to read handle from bitStream, aborting Handle! %i", bitStream->GetNumberOfUnreadBits());
|
Log::Warn("Unable to read handle from bitStream, aborting Handle! {:d}", bitStream.GetNumberOfUnreadBits());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
context->RegisterSyncBehavior(handle, this, branch, this->m_Timeout);
|
context->RegisterSyncBehavior(handle, this, branch, this->m_Timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AirMovementBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void AirMovementBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
const auto handle = context->GetUniqueSkillId();
|
const auto handle = context->GetUniqueSkillId();
|
||||||
|
|
||||||
bitStream->Write(handle);
|
bitStream.Write(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AirMovementBehavior::Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void AirMovementBehavior::Sync(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
uint32_t behaviorId{};
|
uint32_t behaviorId{};
|
||||||
|
|
||||||
if (!bitStream->Read(behaviorId)) {
|
if (!bitStream.Read(behaviorId)) {
|
||||||
LOG("Unable to read behaviorId from bitStream, aborting Sync! %i", bitStream->GetNumberOfUnreadBits());
|
Log::Warn("Unable to read behaviorId from bitStream, aborting Sync! {:d}", bitStream.GetNumberOfUnreadBits());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LWOOBJID target{};
|
LWOOBJID target{};
|
||||||
|
|
||||||
if (!bitStream->Read(target)) {
|
if (!bitStream.Read(target)) {
|
||||||
LOG("Unable to read target from bitStream, aborting Sync! %i", bitStream->GetNumberOfUnreadBits());
|
Log::Warn("Unable to read target from bitStream, aborting Sync! {:d}", bitStream.GetNumberOfUnreadBits());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ class AirMovementBehavior final : public Behavior
|
|||||||
public:
|
public:
|
||||||
explicit AirMovementBehavior(const uint32_t behavior_id) : Behavior(behavior_id) {}
|
explicit AirMovementBehavior(const uint32_t behavior_id) : Behavior(behavior_id) {}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Sync(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
void AndBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void AndBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
for (auto* behavior : this->m_behaviors) {
|
for (auto* behavior : this->m_behaviors) {
|
||||||
behavior->Handle(context, bitStream, branch);
|
behavior->Handle(context, bitStream, branch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void AndBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
for (auto* behavior : this->m_behaviors) {
|
for (auto* behavior : this->m_behaviors) {
|
||||||
behavior->Calculate(context, bitStream, branch);
|
behavior->Calculate(context, bitStream, branch);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ public:
|
|||||||
explicit AndBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
explicit AndBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "BuffComponent.h"
|
#include "BuffComponent.h"
|
||||||
|
|
||||||
|
|
||||||
void ApplyBuffBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ApplyBuffBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
auto* entity = Game::entityManager->GetEntity(branch.target == LWOOBJID_EMPTY ? context->originator : branch.target);
|
auto* entity = Game::entityManager->GetEntity(branch.target == LWOOBJID_EMPTY ? context->originator : branch.target);
|
||||||
|
|
||||||
if (entity == nullptr) return;
|
if (entity == nullptr) return;
|
||||||
@@ -30,7 +30,7 @@ void ApplyBuffBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext b
|
|||||||
buffComponent->RemoveBuff(m_BuffId);
|
buffComponent->RemoveBuff(m_BuffId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplyBuffBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ApplyBuffBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
Handle(context, bitStream, branch);
|
Handle(context, bitStream, branch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ public:
|
|||||||
explicit ApplyBuffBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
explicit ApplyBuffBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -12,11 +12,11 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
void AreaOfEffectBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void AreaOfEffectBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
uint32_t targetCount{};
|
uint32_t targetCount{};
|
||||||
|
|
||||||
if (!bitStream->Read(targetCount)) {
|
if (!bitStream.Read(targetCount)) {
|
||||||
LOG("Unable to read targetCount from bitStream, aborting Handle! %i", bitStream->GetNumberOfUnreadBits());
|
Log::Warn("Unable to read targetCount from bitStream, aborting Handle! {:d}", bitStream.GetNumberOfUnreadBits());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ void AreaOfEffectBehavior::Handle(BehaviorContext* context, RakNet::BitStream* b
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (targetCount > this->m_maxTargets) {
|
if (targetCount > this->m_maxTargets) {
|
||||||
LOG("Serialized size is greater than max targets! Size: %i, Max: %i", targetCount, this->m_maxTargets);
|
Log::Warn("Serialized size is greater than max targets! Size: {:d}, Max: {:d}", targetCount, this->m_maxTargets);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,8 +40,8 @@ void AreaOfEffectBehavior::Handle(BehaviorContext* context, RakNet::BitStream* b
|
|||||||
|
|
||||||
for (auto i = 0u; i < targetCount; ++i) {
|
for (auto i = 0u; i < targetCount; ++i) {
|
||||||
LWOOBJID target{};
|
LWOOBJID target{};
|
||||||
if (!bitStream->Read(target)) {
|
if (!bitStream.Read(target)) {
|
||||||
LOG("failed to read in target %i from bitStream, aborting target Handle!", i);
|
Log::Warn("failed to read in target {:d} from bitStream, aborting target Handle!", i);
|
||||||
};
|
};
|
||||||
targets.push_back(target);
|
targets.push_back(target);
|
||||||
}
|
}
|
||||||
@@ -54,7 +54,7 @@ void AreaOfEffectBehavior::Handle(BehaviorContext* context, RakNet::BitStream* b
|
|||||||
PlayFx(u"cast", context->originator);
|
PlayFx(u"cast", context->originator);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
auto* caster = Game::entityManager->GetEntity(context->caster);
|
auto* caster = Game::entityManager->GetEntity(context->caster);
|
||||||
if (!caster) return;
|
if (!caster) return;
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream
|
|||||||
// resize if we have more than max targets allows
|
// resize if we have more than max targets allows
|
||||||
if (targets.size() > this->m_maxTargets) targets.resize(this->m_maxTargets);
|
if (targets.size() > this->m_maxTargets) targets.resize(this->m_maxTargets);
|
||||||
|
|
||||||
bitStream->Write<uint32_t>(targets.size());
|
bitStream.Write<uint32_t>(targets.size());
|
||||||
|
|
||||||
if (targets.size() == 0) {
|
if (targets.size() == 0) {
|
||||||
PlayFx(u"miss", context->originator);
|
PlayFx(u"miss", context->originator);
|
||||||
@@ -92,7 +92,7 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream
|
|||||||
context->foundTarget = true;
|
context->foundTarget = true;
|
||||||
// write all the targets to the bitstream
|
// write all the targets to the bitstream
|
||||||
for (auto* target : targets) {
|
for (auto* target : targets) {
|
||||||
bitStream->Write(target->GetObjectID());
|
bitStream.Write(target->GetObjectID());
|
||||||
}
|
}
|
||||||
|
|
||||||
// then cast all the actions
|
// then cast all the actions
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ class AreaOfEffectBehavior final : public Behavior
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit AreaOfEffectBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {}
|
explicit AreaOfEffectBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {}
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
void Load() override;
|
void Load() override;
|
||||||
private:
|
private:
|
||||||
Behavior* m_action;
|
Behavior* m_action;
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
void AttackDelayBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void AttackDelayBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
uint32_t handle{};
|
uint32_t handle{};
|
||||||
|
|
||||||
if (!bitStream->Read(handle)) {
|
if (!bitStream.Read(handle)) {
|
||||||
LOG("Unable to read handle from bitStream, aborting Handle! %i", bitStream->GetNumberOfUnreadBits());
|
Log::Warn("Unable to read handle from bitStream, aborting Handle! {:d}", bitStream.GetNumberOfUnreadBits());
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -17,10 +17,10 @@ void AttackDelayBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttackDelayBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void AttackDelayBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
const auto handle = context->GetUniqueSkillId();
|
const auto handle = context->GetUniqueSkillId();
|
||||||
|
|
||||||
bitStream->Write(handle);
|
bitStream.Write(handle);
|
||||||
|
|
||||||
context->foundTarget = true;
|
context->foundTarget = true;
|
||||||
|
|
||||||
@@ -31,11 +31,11 @@ void AttackDelayBehavior::Calculate(BehaviorContext* context, RakNet::BitStream*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttackDelayBehavior::Sync(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void AttackDelayBehavior::Sync(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
this->m_action->Handle(context, bitStream, branch);
|
this->m_action->Handle(context, bitStream, branch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttackDelayBehavior::SyncCalculation(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void AttackDelayBehavior::SyncCalculation(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
PlayFx(u"cast", context->originator);
|
PlayFx(u"cast", context->originator);
|
||||||
|
|
||||||
this->m_action->Calculate(context, bitStream, branch);
|
this->m_action->Calculate(context, bitStream, branch);
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ public:
|
|||||||
explicit AttackDelayBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
explicit AttackDelayBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Sync(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void SyncCalculation(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void SyncCalculation(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include "BehaviorContext.h"
|
#include "BehaviorContext.h"
|
||||||
#include "eBasicAttackSuccessTypes.h"
|
#include "eBasicAttackSuccessTypes.h"
|
||||||
|
|
||||||
void BasicAttackBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void BasicAttackBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
if (context->unmanaged) {
|
if (context->unmanaged) {
|
||||||
auto* entity = Game::entityManager->GetEntity(branch.target);
|
auto* entity = Game::entityManager->GetEntity(branch.target);
|
||||||
|
|
||||||
@@ -30,31 +30,31 @@ void BasicAttackBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bi
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bitStream->AlignReadToByteBoundary();
|
bitStream.AlignReadToByteBoundary();
|
||||||
|
|
||||||
uint16_t allocatedBits{};
|
uint16_t allocatedBits{};
|
||||||
if (!bitStream->Read(allocatedBits) || allocatedBits == 0) {
|
if (!bitStream.Read(allocatedBits) || allocatedBits == 0) {
|
||||||
LOG_DEBUG("No allocated bits");
|
Log::Debug("No allocated bits");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LOG_DEBUG("Number of allocated bits %i", allocatedBits);
|
Log::Debug("Number of allocated bits {:d}", allocatedBits);
|
||||||
const auto baseAddress = bitStream->GetReadOffset();
|
const auto baseAddress = bitStream.GetReadOffset();
|
||||||
|
|
||||||
DoHandleBehavior(context, bitStream, branch);
|
DoHandleBehavior(context, bitStream, branch);
|
||||||
|
|
||||||
bitStream->SetReadOffset(baseAddress + allocatedBits);
|
bitStream.SetReadOffset(baseAddress + allocatedBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
auto* targetEntity = Game::entityManager->GetEntity(branch.target);
|
auto* targetEntity = Game::entityManager->GetEntity(branch.target);
|
||||||
if (!targetEntity) {
|
if (!targetEntity) {
|
||||||
LOG("Target targetEntity %llu not found.", branch.target);
|
Log::Warn("Target targetEntity {:d} not found.", branch.target);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* destroyableComponent = targetEntity->GetComponent<DestroyableComponent>();
|
auto* destroyableComponent = targetEntity->GetComponent<DestroyableComponent>();
|
||||||
if (!destroyableComponent) {
|
if (!destroyableComponent) {
|
||||||
LOG("No destroyable found on the obj/lot %llu/%i", branch.target, targetEntity->GetLOT());
|
Log::Warn("No destroyable found on the obj/lot {:d}/{:d}", branch.target, targetEntity->GetLOT());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,8 +62,8 @@ void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::Bit
|
|||||||
bool isImmune{};
|
bool isImmune{};
|
||||||
bool isSuccess{};
|
bool isSuccess{};
|
||||||
|
|
||||||
if (!bitStream->Read(isBlocked)) {
|
if (!bitStream.Read(isBlocked)) {
|
||||||
LOG("Unable to read isBlocked");
|
Log::Warn("Unable to read isBlocked");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,32 +74,32 @@ void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::Bit
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bitStream->Read(isImmune)) {
|
if (!bitStream.Read(isImmune)) {
|
||||||
LOG("Unable to read isImmune");
|
Log::Warn("Unable to read isImmune");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isImmune) {
|
if (isImmune) {
|
||||||
LOG_DEBUG("Target targetEntity %llu is immune!", branch.target);
|
Log::Debug("Target targetEntity {} is immune!", branch.target);
|
||||||
this->m_OnFailImmune->Handle(context, bitStream, branch);
|
this->m_OnFailImmune->Handle(context, bitStream, branch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bitStream->Read(isSuccess)) {
|
if (!bitStream.Read(isSuccess)) {
|
||||||
LOG("failed to read success from bitstream");
|
Log::Warn("failed to read success from bitstream");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isSuccess) {
|
if (isSuccess) {
|
||||||
uint32_t armorDamageDealt{};
|
uint32_t armorDamageDealt{};
|
||||||
if (!bitStream->Read(armorDamageDealt)) {
|
if (!bitStream.Read(armorDamageDealt)) {
|
||||||
LOG("Unable to read armorDamageDealt");
|
Log::Warn("Unable to read armorDamageDealt");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t healthDamageDealt{};
|
uint32_t healthDamageDealt{};
|
||||||
if (!bitStream->Read(healthDamageDealt)) {
|
if (!bitStream.Read(healthDamageDealt)) {
|
||||||
LOG("Unable to read healthDamageDealt");
|
Log::Warn("Unable to read healthDamageDealt");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,8 +111,8 @@ void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::Bit
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool died{};
|
bool died{};
|
||||||
if (!bitStream->Read(died)) {
|
if (!bitStream.Read(died)) {
|
||||||
LOG("Unable to read died");
|
Log::Warn("Unable to read died");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto previousArmor = destroyableComponent->GetArmor();
|
auto previousArmor = destroyableComponent->GetArmor();
|
||||||
@@ -122,8 +122,8 @@ void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::Bit
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t successState{};
|
uint8_t successState{};
|
||||||
if (!bitStream->Read(successState)) {
|
if (!bitStream.Read(successState)) {
|
||||||
LOG("Unable to read success state");
|
Log::Warn("Unable to read success state");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::Bit
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (static_cast<eBasicAttackSuccessTypes>(successState) != eBasicAttackSuccessTypes::FAILIMMUNE) {
|
if (static_cast<eBasicAttackSuccessTypes>(successState) != eBasicAttackSuccessTypes::FAILIMMUNE) {
|
||||||
LOG("Unknown success state (%i)!", successState);
|
Log::Warn("Unknown success state ({})!", successState);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this->m_OnFailImmune->Handle(context, bitStream, branch);
|
this->m_OnFailImmune->Handle(context, bitStream, branch);
|
||||||
@@ -144,41 +144,41 @@ void BasicAttackBehavior::DoHandleBehavior(BehaviorContext* context, RakNet::Bit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasicAttackBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void BasicAttackBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
bitStream->AlignWriteToByteBoundary();
|
bitStream.AlignWriteToByteBoundary();
|
||||||
|
|
||||||
const auto allocatedAddress = bitStream->GetWriteOffset();
|
const auto allocatedAddress = bitStream.GetWriteOffset();
|
||||||
|
|
||||||
bitStream->Write<uint16_t>(0);
|
bitStream.Write<uint16_t>(0);
|
||||||
|
|
||||||
const auto startAddress = bitStream->GetWriteOffset();
|
const auto startAddress = bitStream.GetWriteOffset();
|
||||||
|
|
||||||
DoBehaviorCalculation(context, bitStream, branch);
|
DoBehaviorCalculation(context, bitStream, branch);
|
||||||
|
|
||||||
const auto endAddress = bitStream->GetWriteOffset();
|
const auto endAddress = bitStream.GetWriteOffset();
|
||||||
const uint16_t allocate = endAddress - startAddress;
|
const uint16_t allocate = endAddress - startAddress;
|
||||||
|
|
||||||
bitStream->SetWriteOffset(allocatedAddress);
|
bitStream.SetWriteOffset(allocatedAddress);
|
||||||
bitStream->Write(allocate);
|
bitStream.Write(allocate);
|
||||||
bitStream->SetWriteOffset(startAddress + allocate);
|
bitStream.SetWriteOffset(startAddress + allocate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasicAttackBehavior::DoBehaviorCalculation(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void BasicAttackBehavior::DoBehaviorCalculation(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
auto* targetEntity = Game::entityManager->GetEntity(branch.target);
|
auto* targetEntity = Game::entityManager->GetEntity(branch.target);
|
||||||
if (!targetEntity) {
|
if (!targetEntity) {
|
||||||
LOG("Target entity %llu is null!", branch.target);
|
Log::Warn("Target entity {} is null!", branch.target);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* destroyableComponent = targetEntity->GetComponent<DestroyableComponent>();
|
auto* destroyableComponent = targetEntity->GetComponent<DestroyableComponent>();
|
||||||
if (!destroyableComponent || !destroyableComponent->GetParent()) {
|
if (!destroyableComponent || !destroyableComponent->GetParent()) {
|
||||||
LOG("No destroyable component on %llu", branch.target);
|
Log::Warn("No destroyable component on {}", branch.target);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool isBlocking = destroyableComponent->GetAttacksToBlock() > 0;
|
const bool isBlocking = destroyableComponent->GetAttacksToBlock() > 0;
|
||||||
|
|
||||||
bitStream->Write(isBlocking);
|
bitStream.Write(isBlocking);
|
||||||
|
|
||||||
if (isBlocking) {
|
if (isBlocking) {
|
||||||
destroyableComponent->SetAttacksToBlock(destroyableComponent->GetAttacksToBlock() - 1);
|
destroyableComponent->SetAttacksToBlock(destroyableComponent->GetAttacksToBlock() - 1);
|
||||||
@@ -188,10 +188,10 @@ void BasicAttackBehavior::DoBehaviorCalculation(BehaviorContext* context, RakNet
|
|||||||
}
|
}
|
||||||
|
|
||||||
const bool isImmune = destroyableComponent->IsImmune() || destroyableComponent->IsCooldownImmune();
|
const bool isImmune = destroyableComponent->IsImmune() || destroyableComponent->IsCooldownImmune();
|
||||||
bitStream->Write(isImmune);
|
bitStream.Write(isImmune);
|
||||||
|
|
||||||
if (isImmune) {
|
if (isImmune) {
|
||||||
LOG_DEBUG("Target targetEntity %llu is immune!", branch.target);
|
Log::Debug("Target targetEntity {} is immune!", branch.target);
|
||||||
this->m_OnFailImmune->Calculate(context, bitStream, branch);
|
this->m_OnFailImmune->Calculate(context, bitStream, branch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -210,7 +210,7 @@ void BasicAttackBehavior::DoBehaviorCalculation(BehaviorContext* context, RakNet
|
|||||||
const uint32_t healthDamageDealt = previousHealth - destroyableComponent->GetHealth();
|
const uint32_t healthDamageDealt = previousHealth - destroyableComponent->GetHealth();
|
||||||
isSuccess = armorDamageDealt > 0 || healthDamageDealt > 0 || (armorDamageDealt + healthDamageDealt) > 0;
|
isSuccess = armorDamageDealt > 0 || healthDamageDealt > 0 || (armorDamageDealt + healthDamageDealt) > 0;
|
||||||
|
|
||||||
bitStream->Write(isSuccess);
|
bitStream.Write(isSuccess);
|
||||||
|
|
||||||
//Handle player damage cooldown
|
//Handle player damage cooldown
|
||||||
if (isSuccess && targetEntity->IsPlayer() && !this->m_DontApplyImmune) {
|
if (isSuccess && targetEntity->IsPlayer() && !this->m_DontApplyImmune) {
|
||||||
@@ -225,12 +225,12 @@ void BasicAttackBehavior::DoBehaviorCalculation(BehaviorContext* context, RakNet
|
|||||||
successState = this->m_OnFailArmor->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY ? eBasicAttackSuccessTypes::FAILIMMUNE : eBasicAttackSuccessTypes::FAILARMOR;
|
successState = this->m_OnFailArmor->m_templateId == BehaviorTemplates::BEHAVIOR_EMPTY ? eBasicAttackSuccessTypes::FAILIMMUNE : eBasicAttackSuccessTypes::FAILARMOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
bitStream->Write(armorDamageDealt);
|
bitStream.Write(armorDamageDealt);
|
||||||
bitStream->Write(healthDamageDealt);
|
bitStream.Write(healthDamageDealt);
|
||||||
bitStream->Write(targetEntity->GetIsDead());
|
bitStream.Write(targetEntity->GetIsDead());
|
||||||
}
|
}
|
||||||
|
|
||||||
bitStream->Write(successState);
|
bitStream.Write(successState);
|
||||||
|
|
||||||
switch (static_cast<eBasicAttackSuccessTypes>(successState)) {
|
switch (static_cast<eBasicAttackSuccessTypes>(successState)) {
|
||||||
case eBasicAttackSuccessTypes::SUCCESS:
|
case eBasicAttackSuccessTypes::SUCCESS:
|
||||||
@@ -241,7 +241,7 @@ void BasicAttackBehavior::DoBehaviorCalculation(BehaviorContext* context, RakNet
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (static_cast<eBasicAttackSuccessTypes>(successState) != eBasicAttackSuccessTypes::FAILIMMUNE) {
|
if (static_cast<eBasicAttackSuccessTypes>(successState) != eBasicAttackSuccessTypes::FAILIMMUNE) {
|
||||||
LOG("Unknown success state (%i)!", successState);
|
Log::Warn("Unknown success state ({})!", GeneralUtils::ToUnderlying(successState));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
this->m_OnFailImmune->Calculate(context, bitStream, branch);
|
this->m_OnFailImmune->Calculate(context, bitStream, branch);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public:
|
|||||||
* is then offset to after the allocated bits for this stream.
|
* is then offset to after the allocated bits for this stream.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void DoHandleBehavior(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch);
|
void DoHandleBehavior(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Handles a client initialized Basic Attack Behavior cast to be deserialized and verified on the server.
|
* @brief Handles a client initialized Basic Attack Behavior cast to be deserialized and verified on the server.
|
||||||
@@ -22,14 +22,14 @@ public:
|
|||||||
* and will fail gracefully if an overread is detected.
|
* and will fail gracefully if an overread is detected.
|
||||||
* @param branch The context of this specific branch of the Skill Behavior. Changes based on which branch you are going down.
|
* @param branch The context of this specific branch of the Skill Behavior. Changes based on which branch you are going down.
|
||||||
*/
|
*/
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Writes a 16bit short to the bitStream and when the actual behavior calculation finishes with all of its branches, the number
|
* @brief Writes a 16bit short to the bitStream and when the actual behavior calculation finishes with all of its branches, the number
|
||||||
* of bits used is then written to where the 16bit short initially was.
|
* of bits used is then written to where the 16bit short initially was.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Calculates a server initialized Basic Attack Behavior cast to be serialized to the client
|
* @brief Calculates a server initialized Basic Attack Behavior cast to be serialized to the client
|
||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
* @param bitStream The bitStream to serialize to.
|
* @param bitStream The bitStream to serialize to.
|
||||||
* @param branch The context of this specific branch of the Skill Behavior. Changes based on which branch you are going down.
|
* @param branch The context of this specific branch of the Skill Behavior. Changes based on which branch you are going down.
|
||||||
*/
|
*/
|
||||||
void DoBehaviorCalculation(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch);
|
void DoBehaviorCalculation(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Loads this Behaviors parameters from the database. For this behavior specifically:
|
* @brief Loads this Behaviors parameters from the database. For this behavior specifically:
|
||||||
|
|||||||
@@ -281,12 +281,12 @@ Behavior* Behavior::CreateBehavior(const uint32_t behaviorId) {
|
|||||||
case BehaviorTemplates::BEHAVIOR_MOUNT: break;
|
case BehaviorTemplates::BEHAVIOR_MOUNT: break;
|
||||||
case BehaviorTemplates::BEHAVIOR_SKILL_SET: break;
|
case BehaviorTemplates::BEHAVIOR_SKILL_SET: break;
|
||||||
default:
|
default:
|
||||||
//LOG("Failed to load behavior with invalid template id (%i)!", templateId);
|
//Log::Warn("Failed to load behavior with invalid template id ({:d})!", templateId);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (behavior == nullptr) {
|
if (behavior == nullptr) {
|
||||||
//LOG("Failed to load unimplemented template id (%i)!", templateId);
|
//Log::Warn("Failed to load unimplemented template id ({:d})!", templateId);
|
||||||
|
|
||||||
behavior = new EmptyBehavior(behaviorId);
|
behavior = new EmptyBehavior(behaviorId);
|
||||||
}
|
}
|
||||||
@@ -309,7 +309,7 @@ BehaviorTemplates Behavior::GetBehaviorTemplate(const uint32_t behaviorId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (templateID == BehaviorTemplates::BEHAVIOR_EMPTY && behaviorId != 0) {
|
if (templateID == BehaviorTemplates::BEHAVIOR_EMPTY && behaviorId != 0) {
|
||||||
LOG("Failed to load behavior template with id (%i)!", behaviorId);
|
Log::Warn("Failed to load behavior template with id ({:d})!", behaviorId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return templateID;
|
return templateID;
|
||||||
@@ -429,7 +429,7 @@ Behavior::Behavior(const uint32_t behaviorId) {
|
|||||||
|
|
||||||
// Make sure we do not proceed if we are trying to load an invalid behavior
|
// Make sure we do not proceed if we are trying to load an invalid behavior
|
||||||
if (templateInDatabase.behaviorID == 0) {
|
if (templateInDatabase.behaviorID == 0) {
|
||||||
LOG("Failed to load behavior with id (%i)!", behaviorId);
|
Log::Warn("Failed to load behavior with id ({:d})!", behaviorId);
|
||||||
|
|
||||||
this->m_effectId = 0;
|
this->m_effectId = 0;
|
||||||
this->m_effectHandle = nullptr;
|
this->m_effectHandle = nullptr;
|
||||||
@@ -487,10 +487,10 @@ std::map<std::string, float> Behavior::GetParameterNames() const {
|
|||||||
void Behavior::Load() {
|
void Behavior::Load() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Behavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void Behavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Behavior::Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void Behavior::Sync(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Behavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch) {
|
void Behavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch) {
|
||||||
@@ -502,10 +502,10 @@ void Behavior::Timer(BehaviorContext* context, BehaviorBranchContext branch, LWO
|
|||||||
void Behavior::End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) {
|
void Behavior::End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Behavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void Behavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Behavior::SyncCalculation(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void Behavior::SyncCalculation(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Behavior::~Behavior() {
|
Behavior::~Behavior() {
|
||||||
|
|||||||
@@ -68,9 +68,9 @@ public:
|
|||||||
virtual void Load();
|
virtual void Load();
|
||||||
|
|
||||||
// Player side
|
// Player side
|
||||||
virtual void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch);
|
virtual void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch);
|
||||||
|
|
||||||
virtual void Sync(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch);
|
virtual void Sync(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch);
|
||||||
|
|
||||||
virtual void UnCast(BehaviorContext* context, BehaviorBranchContext branch);
|
virtual void UnCast(BehaviorContext* context, BehaviorBranchContext branch);
|
||||||
|
|
||||||
@@ -79,9 +79,9 @@ public:
|
|||||||
virtual void End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second);
|
virtual void End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second);
|
||||||
|
|
||||||
// Npc side
|
// Npc side
|
||||||
virtual void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch);
|
virtual void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch);
|
||||||
|
|
||||||
virtual void SyncCalculation(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch);
|
virtual void SyncCalculation(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Creations/destruction
|
* Creations/destruction
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ uint32_t BehaviorContext::GetUniqueSkillId() const {
|
|||||||
auto* entity = Game::entityManager->GetEntity(this->originator);
|
auto* entity = Game::entityManager->GetEntity(this->originator);
|
||||||
|
|
||||||
if (entity == nullptr) {
|
if (entity == nullptr) {
|
||||||
LOG("Invalid entity for (%llu)!", this->originator);
|
Log::Warn("Invalid entity for ({})!", this->originator);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,7 @@ uint32_t BehaviorContext::GetUniqueSkillId() const {
|
|||||||
auto* component = entity->GetComponent<SkillComponent>();
|
auto* component = entity->GetComponent<SkillComponent>();
|
||||||
|
|
||||||
if (component == nullptr) {
|
if (component == nullptr) {
|
||||||
LOG("No skill component attached to (%llu)!", this->originator);;
|
Log::Warn("No skill component attached to ({})!", this->originator);;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -105,7 +105,7 @@ void BehaviorContext::ExecuteUpdates() {
|
|||||||
this->scheduledUpdates.clear();
|
this->scheduledUpdates.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BehaviorContext::SyncBehavior(const uint32_t syncId, RakNet::BitStream* bitStream) {
|
void BehaviorContext::SyncBehavior(const uint32_t syncId, RakNet::BitStream& bitStream) {
|
||||||
BehaviorSyncEntry entry;
|
BehaviorSyncEntry entry;
|
||||||
auto found = false;
|
auto found = false;
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ void BehaviorContext::SyncBehavior(const uint32_t syncId, RakNet::BitStream* bit
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
LOG("Failed to find behavior sync entry with sync id (%i)!", syncId);
|
Log::Warn("Failed to find behavior sync entry with sync id ({})!", syncId);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -135,7 +135,7 @@ void BehaviorContext::SyncBehavior(const uint32_t syncId, RakNet::BitStream* bit
|
|||||||
const auto branch = entry.branchContext;
|
const auto branch = entry.branchContext;
|
||||||
|
|
||||||
if (behavior == nullptr) {
|
if (behavior == nullptr) {
|
||||||
LOG("Invalid behavior for sync id (%i)!", syncId);
|
Log::Warn("Invalid behavior for sync id ({})!", syncId);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -243,27 +243,25 @@ bool BehaviorContext::CalculateUpdate(const float deltaTime) {
|
|||||||
echo.uiBehaviorHandle = entry.handle;
|
echo.uiBehaviorHandle = entry.handle;
|
||||||
echo.uiSkillHandle = this->skillUId;
|
echo.uiSkillHandle = this->skillUId;
|
||||||
|
|
||||||
auto* bitStream = new RakNet::BitStream();
|
RakNet::BitStream bitStream{};
|
||||||
|
|
||||||
// Calculate sync
|
// Calculate sync
|
||||||
entry.behavior->SyncCalculation(this, bitStream, entry.branchContext);
|
entry.behavior->SyncCalculation(this, bitStream, entry.branchContext);
|
||||||
|
|
||||||
if (!clientInitalized) {
|
if (!clientInitalized) {
|
||||||
echo.sBitStream.assign(reinterpret_cast<char*>(bitStream->GetData()), bitStream->GetNumberOfBytesUsed());
|
echo.sBitStream.assign(reinterpret_cast<char*>(bitStream.GetData()), bitStream.GetNumberOfBytesUsed());
|
||||||
|
|
||||||
// Write message
|
// Write message
|
||||||
RakNet::BitStream message;
|
RakNet::BitStream message;
|
||||||
|
|
||||||
BitStreamUtils::WriteHeader(message, eConnectionType::CLIENT, eClientMessageType::GAME_MSG);
|
BitStreamUtils::WriteHeader(message, eConnectionType::CLIENT, eClientMessageType::GAME_MSG);
|
||||||
message.Write(this->originator);
|
message.Write(this->originator);
|
||||||
echo.Serialize(&message);
|
echo.Serialize(message);
|
||||||
|
|
||||||
Game::server->Send(&message, UNASSIGNED_SYSTEM_ADDRESS, true);
|
Game::server->Send(message, UNASSIGNED_SYSTEM_ADDRESS, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExecuteUpdates();
|
ExecuteUpdates();
|
||||||
|
|
||||||
delete bitStream;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<BehaviorSyncEntry> valid;
|
std::vector<BehaviorSyncEntry> valid;
|
||||||
@@ -319,7 +317,7 @@ void BehaviorContext::FilterTargets(std::vector<Entity*>& targets, std::forward_
|
|||||||
// if the caster is not there, return empty targets list
|
// if the caster is not there, return empty targets list
|
||||||
auto* caster = Game::entityManager->GetEntity(this->caster);
|
auto* caster = Game::entityManager->GetEntity(this->caster);
|
||||||
if (!caster) {
|
if (!caster) {
|
||||||
LOG_DEBUG("Invalid caster for (%llu)!", this->originator);
|
Log::Debug("Invalid caster for ({})!", this->originator);
|
||||||
targets.clear();
|
targets.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ struct BehaviorContext
|
|||||||
|
|
||||||
void ExecuteUpdates();
|
void ExecuteUpdates();
|
||||||
|
|
||||||
void SyncBehavior(uint32_t syncId, RakNet::BitStream* bitStream);
|
void SyncBehavior(uint32_t syncId, RakNet::BitStream& bitStream);
|
||||||
|
|
||||||
void Update(float deltaTime);
|
void Update(float deltaTime);
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "DestroyableComponent.h"
|
#include "DestroyableComponent.h"
|
||||||
|
|
||||||
void BlockBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void BlockBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
const auto target = context->originator;
|
const auto target = context->originator;
|
||||||
|
|
||||||
auto* entity = Game::entityManager->GetEntity(target);
|
auto* entity = Game::entityManager->GetEntity(target);
|
||||||
|
|
||||||
if (entity == nullptr) {
|
if (entity == nullptr) {
|
||||||
LOG("Failed to find target (%llu)!", branch.target);
|
Log::Warn("Failed to find target ({})!", branch.target);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -33,7 +33,7 @@ void BlockBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStrea
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void BlockBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
Handle(context, bitStream, branch);
|
Handle(context, bitStream, branch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ void BlockBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext branc
|
|||||||
auto* entity = Game::entityManager->GetEntity(target);
|
auto* entity = Game::entityManager->GetEntity(target);
|
||||||
|
|
||||||
if (entity == nullptr) {
|
if (entity == nullptr) {
|
||||||
LOG("Failed to find target (%llu)!", branch.target);
|
Log::Warn("Failed to find target ({})!", branch.target);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ public:
|
|||||||
explicit BlockBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
explicit BlockBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "DestroyableComponent.h"
|
#include "DestroyableComponent.h"
|
||||||
|
|
||||||
void BuffBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void BuffBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
const auto target = branch.target != LWOOBJID_EMPTY ? branch.target : context->originator;
|
const auto target = branch.target != LWOOBJID_EMPTY ? branch.target : context->originator;
|
||||||
|
|
||||||
auto* entity = Game::entityManager->GetEntity(target);
|
auto* entity = Game::entityManager->GetEntity(target);
|
||||||
|
|
||||||
if (entity == nullptr) {
|
if (entity == nullptr) {
|
||||||
LOG("Invalid target (%llu)!", target);
|
Log::Warn("Invalid target ({})!", target);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ void BuffBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream
|
|||||||
auto* component = entity->GetComponent<DestroyableComponent>();
|
auto* component = entity->GetComponent<DestroyableComponent>();
|
||||||
|
|
||||||
if (component == nullptr) {
|
if (component == nullptr) {
|
||||||
LOG("Invalid target, no destroyable component (%llu)!", target);
|
Log::Warn("Invalid target, no destroyable component ({})!", target);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ void BuffBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch
|
|||||||
auto* entity = Game::entityManager->GetEntity(target);
|
auto* entity = Game::entityManager->GetEntity(target);
|
||||||
|
|
||||||
if (entity == nullptr) {
|
if (entity == nullptr) {
|
||||||
LOG("Invalid target (%llu)!", target);
|
Log::Warn("Invalid target ({})!", target);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ void BuffBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch
|
|||||||
auto* component = entity->GetComponent<DestroyableComponent>();
|
auto* component = entity->GetComponent<DestroyableComponent>();
|
||||||
|
|
||||||
if (component == nullptr) {
|
if (component == nullptr) {
|
||||||
LOG("Invalid target, no destroyable component (%llu)!", target);
|
Log::Warn("Invalid target, no destroyable component ({})!", target);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public:
|
|||||||
explicit BuffBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
explicit BuffBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ set(DGAME_DBEHAVIORS_SOURCES "AirMovementBehavior.cpp"
|
|||||||
"DamageReductionBehavior.cpp"
|
"DamageReductionBehavior.cpp"
|
||||||
"DarkInspirationBehavior.cpp"
|
"DarkInspirationBehavior.cpp"
|
||||||
"DurationBehavior.cpp"
|
"DurationBehavior.cpp"
|
||||||
"EmptyBehavior.cpp"
|
|
||||||
"EndBehavior.cpp"
|
"EndBehavior.cpp"
|
||||||
"FallSpeedBehavior.cpp"
|
"FallSpeedBehavior.cpp"
|
||||||
"ForceMovementBehavior.cpp"
|
"ForceMovementBehavior.cpp"
|
||||||
@@ -56,7 +55,15 @@ set(DGAME_DBEHAVIORS_SOURCES "AirMovementBehavior.cpp"
|
|||||||
"VentureVisionBehavior.cpp"
|
"VentureVisionBehavior.cpp"
|
||||||
"VerifyBehavior.cpp")
|
"VerifyBehavior.cpp")
|
||||||
|
|
||||||
add_library(dBehaviors STATIC ${DGAME_DBEHAVIORS_SOURCES})
|
add_library(dBehaviors OBJECT ${DGAME_DBEHAVIORS_SOURCES})
|
||||||
target_link_libraries(dBehaviors PUBLIC dPhysics)
|
target_link_libraries(dBehaviors PUBLIC dDatabaseCDClient dPhysics)
|
||||||
target_include_directories(dBehaviors PUBLIC ".")
|
target_include_directories(dBehaviors PUBLIC "."
|
||||||
|
"${PROJECT_SOURCE_DIR}/dGame/dGameMessages" # via BehaviorContext.h
|
||||||
|
PRIVATE
|
||||||
|
"${PROJECT_SOURCE_DIR}/dGame/dComponents" # direct BuffComponent.h
|
||||||
|
"${PROJECT_SOURCE_DIR}/dGame/dUtilities" # Preconditions.h via QuickBuildComponent.h
|
||||||
|
"${PROJECT_SOURCE_DIR}/dGame/dEntity" # via dZoneManager.h, Spawner.h
|
||||||
|
"${PROJECT_SOURCE_DIR}/dGame/dInventory" # via CharacterComponent.h
|
||||||
|
"${PROJECT_SOURCE_DIR}/dZoneManager" # via BasicAttackBehavior.cpp
|
||||||
|
)
|
||||||
target_precompile_headers(dBehaviors REUSE_FROM dGameBase)
|
target_precompile_headers(dBehaviors REUSE_FROM dGameBase)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "PossessableComponent.h"
|
#include "PossessableComponent.h"
|
||||||
|
|
||||||
void CarBoostBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void CarBoostBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
GameMessages::SendVehicleAddPassiveBoostAction(branch.target, UNASSIGNED_SYSTEM_ADDRESS);
|
GameMessages::SendVehicleAddPassiveBoostAction(branch.target, UNASSIGNED_SYSTEM_ADDRESS);
|
||||||
|
|
||||||
auto* entity = Game::entityManager->GetEntity(context->originator);
|
auto* entity = Game::entityManager->GetEntity(context->originator);
|
||||||
@@ -17,7 +17,7 @@ void CarBoostBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitSt
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("Activating car boost!");
|
Log::Info("Activating car boost!");
|
||||||
|
|
||||||
auto* possessableComponent = entity->GetComponent<PossessableComponent>();
|
auto* possessableComponent = entity->GetComponent<PossessableComponent>();
|
||||||
if (possessableComponent != nullptr) {
|
if (possessableComponent != nullptr) {
|
||||||
@@ -27,7 +27,7 @@ void CarBoostBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitSt
|
|||||||
|
|
||||||
auto* characterComponent = possessor->GetComponent<CharacterComponent>();
|
auto* characterComponent = possessor->GetComponent<CharacterComponent>();
|
||||||
if (characterComponent != nullptr) {
|
if (characterComponent != nullptr) {
|
||||||
LOG("Tracking car boost!");
|
Log::Info("Tracking car boost!");
|
||||||
characterComponent->UpdatePlayerStatistic(RacingCarBoostsActivated);
|
characterComponent->UpdatePlayerStatistic(RacingCarBoostsActivated);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
explicit CarBoostBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
explicit CarBoostBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
void ChainBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void ChainBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
uint32_t chainIndex{};
|
uint32_t chainIndex{};
|
||||||
|
|
||||||
if (!bitStream->Read(chainIndex)) {
|
if (!bitStream.Read(chainIndex)) {
|
||||||
LOG("Unable to read chainIndex from bitStream, aborting Handle! %i", bitStream->GetNumberOfUnreadBits());
|
Log::Warn("Unable to read chainIndex from bitStream, aborting Handle! {:d}", bitStream.GetNumberOfUnreadBits());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16,12 +16,12 @@ void ChainBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStrea
|
|||||||
if (chainIndex < this->m_behaviors.size()) {
|
if (chainIndex < this->m_behaviors.size()) {
|
||||||
this->m_behaviors.at(chainIndex)->Handle(context, bitStream, branch);
|
this->m_behaviors.at(chainIndex)->Handle(context, bitStream, branch);
|
||||||
} else {
|
} else {
|
||||||
LOG("chainIndex out of bounds, aborting handle of chain %i bits unread %i", chainIndex, bitStream->GetNumberOfUnreadBits());
|
Log::Warn("chainIndex out of bounds, aborting handle of chain {:d} bits unread {:d}", chainIndex, bitStream.GetNumberOfUnreadBits());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChainBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, const BehaviorBranchContext branch) {
|
void ChainBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, const BehaviorBranchContext branch) {
|
||||||
bitStream->Write(1);
|
bitStream.Write(1);
|
||||||
|
|
||||||
this->m_behaviors.at(0)->Calculate(context, bitStream, branch);
|
this->m_behaviors.at(0)->Calculate(context, bitStream, branch);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ public:
|
|||||||
explicit ChainBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
explicit ChainBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override;
|
void Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) override;
|
||||||
|
|
||||||
void Load() override;
|
void Load() override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "BehaviorContext.h"
|
#include "BehaviorContext.h"
|
||||||
#include "BehaviorBranchContext.h"
|
#include "BehaviorBranchContext.h"
|
||||||
|
|
||||||
void ChangeIdleFlagsBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ChangeIdleFlagsBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
const auto target = branch.target != LWOOBJID_EMPTY ? branch.target : context->originator;
|
const auto target = branch.target != LWOOBJID_EMPTY ? branch.target : context->originator;
|
||||||
if (!target) return;
|
if (!target) return;
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ void ChangeIdleFlagsBehavior::Handle(BehaviorContext* context, RakNet::BitStream
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChangeIdleFlagsBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) {
|
void ChangeIdleFlagsBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
Handle(context, bitStream, branch);
|
Handle(context, bitStream, branch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user