diff --git a/.appveyor.yml b/.appveyor.yml index fb30afe4..6bbe22d5 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -9,8 +9,8 @@ platform: environment: MSVC_DEFAULT_OPTIONS: ON - BOOST_ROOT_DIR: "C:\\Libraries\\boost_1_60_0" - BOOST_LIB_DIR: "C:\\Libraries\\boost_1_60_0\\lib32-msvc-14.0" + BOOST_ROOT_DIR: "C:\\Libraries\\boost_1_63_0" + BOOST_LIB_DIR: "C:\\Libraries\\boost_1_63_0\\lib32-msvc-14.0" MYSQL_PWD: "Password12!" services: diff --git a/.gitignore b/.gitignore index 0747ffb3..f057cbaf 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ build/ *.la *.a *.lib +*.exp # Executables *.exe diff --git a/.travis.yml b/.travis.yml index 21eb7833..d8158ae9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,9 +29,9 @@ cache: before_install: - eval "${MATRIX_EVAL}" - gem install --no-ri --no-rdoc mtime_cache + - sudo add-apt-repository -y ppa:rexut/recoil - sudo apt-get update - - sudo apt-get install -y libboost-dev libboost-all-dev - - sudo apt-get install -y libmysqlclient-dev libmysqlcppconn-dev + - sudo apt-get install -y libboost1.63-dev libboost1.63-all-dev # Build steps script: @@ -39,6 +39,6 @@ script: - mtime_cache src/**/*.{%{cpp}} -c .mtime_cache/cache.json - mkdir -p build - cd build - - cmake .. -DSAPPHIRE_BOOST_VER="1.54.0" && make -j 3 + - cmake .. -DSAPPHIRE_BOOST_VER="1.63.0" && make -j 3 - cd .. - bash sql_import.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 997abb3d..54f7d380 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,8 +4,9 @@ project (Sapphire) set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin) -set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) -set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin) +set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) +set(EXECUTABLE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) set(PROJECT_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) @@ -42,7 +43,6 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/servers/Server_Common/Version.cp ########################################################################## # Common include folders -include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/libraries/external/ChaiScript-6.0.0/include/") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/libraries/sapphire/datReader/") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/libraries/sapphire/mysqlConnector/") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src") @@ -66,3 +66,5 @@ add_subdirectory("src/tools/exd_struct_gen") add_subdirectory("src/tools/exd_struct_test") add_subdirectory("src/tools/quest_parser") add_subdirectory("src/tools/pcb_reader") + +add_subdirectory("scripts/native") diff --git a/bin/config/settings_rest.xml b/bin/config/settings_rest.xml index ddadaf67..e3059921 100644 --- a/bin/config/settings_rest.xml +++ b/bin/config/settings_rest.xml @@ -6,7 +6,7 @@ 127.0.0.1 - C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv + H:\\SteamLibrary\\steamapps\\common\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv 127.0.0.1 diff --git a/bin/config/settings_zone.xml b/bin/config/settings_zone.xml index 18d33bf6..a0d56a0a 100644 --- a/bin/config/settings_zone.xml +++ b/bin/config/settings_zone.xml @@ -1,14 +1,26 @@ - 54992 127.0.0.1 - C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv + H:\\SteamLibrary\\steamapps\\common\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack\\ffxiv + + + + ./compiledscripts/ + ./cache/ + + + 1 + ../cmake-build-debug/ + cmake --build %1% --target %2% + + + - ../scripts/chai + ./compiledscripts/ 127.0.0.1 diff --git a/cmake/mysql.cmake b/cmake/mysql.cmake index 7e3ceccf..77106bc9 100644 --- a/cmake/mysql.cmake +++ b/cmake/mysql.cmake @@ -11,6 +11,7 @@ if(UNIX) /usr/local/mysql/include/mysql $ENV{ProgramFiles}/MySQL/*/include $ENV{SystemDrive}/MySQL/*/include + ${LIBRARY_DIR}/external/MySQL/ ) if(MYSQL_INCLUDE_DIR) diff --git a/scripts/native/CMakeLists.txt b/scripts/native/CMakeLists.txt new file mode 100644 index 00000000..334c9f01 --- /dev/null +++ b/scripts/native/CMakeLists.txt @@ -0,0 +1,47 @@ +cmake_minimum_required(VERSION 3.0) +project(Sapphire_Script) + +file(GLOB SCRIPT_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h") +file(GLOB_RECURSE SCRIPT_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp") + +include_directories("${CMAKE_SOURCE_DIR}/src/servers/") +include_directories("${CMAKE_SOURCE_DIR}/src/servers/Server_Zone/") + +if(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Yc${CMAKE_CURRENT_SOURCE_DIR}/ScriptObject.h /FI${CMAKE_CURRENT_SOURCE_DIR}/ScriptObject.h") +endif() + +message( "exec: ${EXECUTABLE_OUTPUT_DIRECTORY}" ) + +set( SCRIPT_LIB_DIR "${EXECUTABLE_OUTPUT_DIRECTORY}/compiledscripts/" ) +set( EXECUTABLE_OUTPUT_PATH "${SCRIPT_LIB_DIR}") +set( LIBRARY_OUTPUT_PATH "${SCRIPT_LIB_DIR}") +set( RUNTIME_OUTPUT_DIRECTORY "${SCRIPT_LIB_DIR}") + +foreach(_sourcefile ${SCRIPT_FILES}) + get_filename_component(_file "${_sourcefile}" NAME_WE) + add_library("${_file}" MODULE "${_sourcefile}" "${SCRIPT_INCLUDE_FILES}") + + if(MSVC) + set_source_files_properties("${_file}" PROPERTIES + COMPILE_FLAGS "/Yc${CMAKE_CURRENT_SOURCE_DIR}/ScriptObject.h" + ) + set_target_properties(${_file} PROPERTIES + CXX_STANDARD 14 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS ON + LIBRARY_OUTPUT_DIRECTORY_DEBUG "${SCRIPT_LIB_DIR}" + LIBRARY_OUTPUT_DIRECTORY_RELEASE "${SCRIPT_LIB_DIR}" + LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${SCRIPT_LIB_DIR}" + LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL "${SCRIPT_LIB_DIR}" + ) + endif() + + target_link_libraries("${_file}" server_zone) + + add_custom_command(TARGET "${_file}" POST_BUILD + COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/${_file}.exp" + COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/${_file}.lib" + COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/${_file}.ilk" + ) +endforeach(_sourcefile ${SCRIPT_FILES}) \ No newline at end of file diff --git a/scripts/native/CmnDef/CmnDefCutSceneReplay.cpp b/scripts/native/CmnDef/CmnDefCutSceneReplay.cpp new file mode 100644 index 00000000..f190b7d5 --- /dev/null +++ b/scripts/native/CmnDef/CmnDefCutSceneReplay.cpp @@ -0,0 +1,38 @@ +#include "../ScriptObject.h" + +class CmnDefCutSceneReplay : public EventScript +{ +public: + CmnDefCutSceneReplay() : EventScript( "CmnDefCutSceneReplay", 721028 ) + {} + + void Scene00000( Entity::Player& player ) + { + auto callback = [ this ]( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2, uint16_t param3 ) + { + if( param2 != 0 ) + { + Scene00001( player, param2 ); + } + }; + + player.eventPlay( getId(), 0, 0x2000, 0, 1, callback ); + } + + void Scene00001( Entity::Player& player, uint16_t returnScene ) + { + auto callback = []( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2, uint16_t param3 ) + { + // todo: this is fucked + }; + + player.eventPlay( getId(), 1, 0xFB2EC8F8, 0, 1, returnScene, callback ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; + +EXPORT_SCRIPTOBJECT( CmnDefCutSceneReplay ) \ No newline at end of file diff --git a/scripts/native/CmnDef/CmnDefInnBed.cpp b/scripts/native/CmnDef/CmnDefInnBed.cpp new file mode 100644 index 00000000..0238eeac --- /dev/null +++ b/scripts/native/CmnDef/CmnDefInnBed.cpp @@ -0,0 +1,58 @@ +#include "../ScriptObject.h" + +class CmnDefInnBed : public EventScript +{ +public: + CmnDefInnBed() : EventScript( "CmnDefInnBed", 720916 ) + {} + + // menu + void Scene00000( Entity::Player& player ) + { + auto callback = [ this ]( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2, uint16_t param3 ) + { + if( param2 > 0 ) + Scene00001( player, param2 ); + }; + + player.eventPlay( getId(), 0, 0x2000, 0, 1, callback ); + } + + // lay down + void Scene00001( Entity::Player& player, uint16_t param ) + { + auto callback = [ this ]( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2, uint16_t param3 ) + { + Scene00002( player, param2 ); + }; + + player.eventPlay( getId(), 1, 0xF32E48F8, 0, 1, param, callback ); + } + + // logout + void Scene00002( Entity::Player& player, uint16_t param ) + { + player.eventPlay( getId(), 2, 0xF32E48F8, 0, 1, param, nullptr ); + } + + // wake up + void Scene00100( Entity::Player& player ) + { + auto callback = []( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2, uint16_t param3 ) + {}; + + player.eventPlay( getId(), 100, 0x800, 0, 0, callback ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } + + void onEnterZone( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2 ) override + { + Scene00100( player ); + } +}; + +EXPORT_SCRIPTOBJECT( CmnDefInnBed ) \ No newline at end of file diff --git a/scripts/native/CmnDef/CmnDefLinkShell.cpp b/scripts/native/CmnDef/CmnDefLinkShell.cpp new file mode 100644 index 00000000..b85b2d9b --- /dev/null +++ b/scripts/native/CmnDef/CmnDefLinkShell.cpp @@ -0,0 +1,60 @@ +#include "../ScriptObject.h" + +#define ACTION_CREATE 2 +#define ACTION_RENAME 3 +#define ACTION_REMOVE 4 + +class CmnDefLinkShell : public EventScript +{ +public: + CmnDefLinkShell() : EventScript( "CmnDefLinkShell", 0xB0006 ) + {} + + void Scene00001( Entity::Player& player ) + { + auto callback = [ this ]( Entity::Player& player, uint32_t eventId, uint16_t param1, uint16_t param2, uint16_t param3 ) + { + switch( param2 ) + { + case ACTION_CREATE: + Scene00002( player ); + break; + + case ACTION_RENAME: + Scene00003( player ); + break; + + case ACTION_REMOVE: + Scene00004( player ); + break; + } + }; + + player.eventPlay( getId(), 1, 0, 0, 0, callback ); + } + + // create linkshell + void Scene00002( Entity::Player& player ) + { + player.eventPlay( getId(), 2, 0, 0, 0 ); + } + + // rename linkshell + void Scene00003( Entity::Player& player ) + { + player.eventPlay( getId(), 3, 0, 0, 0 ); + } + + // remove linkshell + void Scene00004( Entity::Player& player ) + { + player.eventPlay( getId(), 4, 0, 0, 0 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00001( player ); + } +}; + +EXPORT_SCRIPTOBJECT( CmnDefLinkShell ) \ No newline at end of file diff --git a/scripts/native/CmnDef/HouFurOrchestrion.cpp b/scripts/native/CmnDef/HouFurOrchestrion.cpp new file mode 100644 index 00000000..6544712c --- /dev/null +++ b/scripts/native/CmnDef/HouFurOrchestrion.cpp @@ -0,0 +1,20 @@ +#include "../ScriptObject.h" + +class HouFurOrchestrionDef : public EventScript +{ +public: + HouFurOrchestrionDef() : EventScript( "HouFurOrchestrionDef", 721226 ) + {} + + void Scene00000( Entity::Player& player ) + { + player.eventPlay( getId(), 0, 0x2000, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; + +EXPORT_SCRIPTOBJECT( HouFurOrchestrionDef ) \ No newline at end of file diff --git a/scripts/native/ScriptObject.h b/scripts/native/ScriptObject.h new file mode 100644 index 00000000..108b8df0 --- /dev/null +++ b/scripts/native/ScriptObject.h @@ -0,0 +1,10 @@ +#ifndef SAPPHIRE_SCRIPTOBJECT_H +#define SAPPHIRE_SCRIPTOBJECT_H + +#include