diff --git a/.appveyor.yml b/.appveyor.yml index 70d4d921..ef08146f 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,5 +1,5 @@ os: - - Visual Studio 2017 + - Visual Studio 2019 configuration: - Debug @@ -20,8 +20,8 @@ before_build: - git submodule update --init - mkdir build - cd build - - cmake .. -G "Visual Studio 15 2017 Win64" - - cmake --build . --target ALL_BUILD --config Release + - cmake .. -G "Visual Studio 16 2019" -A x64 + - cmake --build . --target ALL_BUILD --config RelWithDebInfo build_script: - cd bin diff --git a/.gitmodules b/.gitmodules index a7b40f34..f8ad1744 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "deps/recastnavigation"] path = deps/recastnavigation url = https://github.com/SapphireServer/recastnavigation +[submodule "deps/ffxiv-actions"] + path = deps/ffxiv-actions + url = https://github.com/SapphireServer/ffxiv-actions.git diff --git a/.travis.yml b/.travis.yml index 375d4353..4c04e527 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,9 +14,10 @@ matrix: sources: - ubuntu-toolchain-r-test packages: - - g++-7 + - g++-8 env: - - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" + - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" + - CXX=g++-8 # Setup cache cache: diff --git a/CMakeLists.txt b/CMakeLists.txt index f6a3419f..76160f3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,9 @@ add_custom_target( copy_runtime_files ALL COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/config ${CMAKE_BINARY_DIR}/bin/config COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/sql ${CMAKE_BINARY_DIR}/bin/sql COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/web ${CMAKE_BINARY_DIR}/bin/web - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/sql_import.sh ${CMAKE_BINARY_DIR}/bin/sql_import.sh ) + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/sql_import.sh ${CMAKE_BINARY_DIR}/bin/sql_import.sh + COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/bin/data/actions + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/deps/ffxiv-actions/actions ${CMAKE_BINARY_DIR}/bin/data/actions ) ###################################### # Dependencies and compiler settings # diff --git a/CMakeSettings.json b/CMakeSettings.json index 7a6006fe..cc894359 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -1,21 +1,32 @@ { // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file. + "environments": [ + { + "BuildDir": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build" + } + ], "configurations": [ { "name": "x64-Debug", - "generator": "Visual Studio 15 2017 Win64", + "generator": "Visual Studio 16 2019 Win64", "configurationType": "Debug", - "buildRoot": "${env.USERPROFILE}\\CMakeBuild\\${workspaceHash}\\build\\${name}", + "buildRoot": "${env.BuildDir}\\${name}", "cmakeCommandArgs": "-DCMAKE_BUILD_TYPE=\"Debug\"", - "buildCommandArgs": "-m -v:minimal" + "buildCommandArgs": "-m -v:minimal", + "inheritEnvironments": [ + "msvc_x64" + ] }, { "name": "x64-Release", - "generator": "Visual Studio 15 2017 Win64", + "generator": "Visual Studio 16 2019 Win64", "configurationType": "Release", - "buildRoot": "${env.USERPROFILE}\\CMakeBuild\\${workspaceHash}\\build\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-m -v:minimal" + "buildRoot": "${env.BuildDir}\\${name}", + "cmakeCommandArgs": "-DCMAKE_BUILD_TYPE=\"RelWithDebInfo\"", + "buildCommandArgs": "-m -v:minimal", + "inheritEnvironments": [ + "msvc_x64" + ] } ] } diff --git a/README.md b/README.md index 582f4ebf..324a54a1 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Sapphire requires the following software: | *Name* | *Windows* | *Linux* | | ------ | --------- | ------- | -| CMake 3.0.2+ and C++17 capable compiler | [Visual Studio 2017](https://www.visualstudio.com/) | `gcc 7` and `g++ 7` or newer | +| CMake 3.0.2+ and C++17 capable compiler | [Visual Studio 2019](https://www.visualstudio.com/) | `gcc 8` and `g++ 8` or newer, or equivalent `clang` version. | | MySQL Server 5.7 | [Official Site](https://dev.mysql.com/downloads/mysql/) | MySQL server from your distribution's package manager | Please check the [wiki](https://github.com/SapphireMordred/Sapphire/wiki) for detailed installation/build instructions for your OS. diff --git a/cmake/FindMySQL.cmake b/cmake/FindMySQL.cmake index 034e94d7..0042d308 100644 --- a/cmake/FindMySQL.cmake +++ b/cmake/FindMySQL.cmake @@ -85,6 +85,8 @@ find_path(MYSQL_INCLUDE_DIR "${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7/include" "${PROGRAM_FILES_64}/MySQL/include" "${PROGRAM_FILES_64}/MariaDB 10.3/include/mysql" + "${PROGRAM_FILES_64}/MariaDB 10.4/include/mysql" + "${PROGRAM_FILES_64}/MariaDB 10.5/include/mysql" "C:/MySQL/include" "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/include" "$ENV{ProgramFiles}/MySQL/MySQL Server 5.7/include" @@ -124,6 +126,8 @@ if( WIN32 ) "${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7/lib/opt" "${PROGRAM_FILES_64}/MySQL/lib" "${PROGRAM_FILES_64}/MariaDB 10.3/lib" + "${PROGRAM_FILES_64}/MariaDB 10.4/lib" + "${PROGRAM_FILES_64}/MariaDB 10.5/lib" "C:/MySQL/lib/debug" "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/lib" "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/lib/opt" @@ -177,6 +181,8 @@ if( WIN32 ) "${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7/bin/opt" "${PROGRAM_FILES_64}/MySQL/bin" "${PROGRAM_FILES_64}/MariaDB 10.3/bin" + "${PROGRAM_FILES_64}/MariaDB 10.4/bin" + "${PROGRAM_FILES_64}/MariaDB 10.5/bin" "C:/MySQL/bin/debug" "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/bin" "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/bin/opt" diff --git a/cmake/paths.cmake b/cmake/paths.cmake index ab4ae84d..1df097aa 100644 --- a/cmake/paths.cmake +++ b/cmake/paths.cmake @@ -13,3 +13,4 @@ endif() # Create log folder file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin/log ) file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin/navi ) +file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin/data ) diff --git a/deps/datReader/Dat.cpp b/deps/datReader/Dat.cpp index 94812a09..943e12fd 100644 --- a/deps/datReader/Dat.cpp +++ b/deps/datReader/Dat.cpp @@ -4,308 +4,319 @@ #include "File.h" -namespace -{ - const uint32_t model_section_count = 0xB; +namespace { + const uint32_t model_section_count = 0xB; } -namespace xiv +namespace xiv::dat { -namespace dat -{ - struct DatFileHeader - { - uint32_t size; - FileType entry_type; - uint32_t total_uncompressed_size; - uint32_t unknown[0x2]; - }; + struct DatFileHeader + { + uint32_t size; + FileType entry_type; + uint32_t total_uncompressed_size; + uint32_t unknown[0x2]; + }; - struct DatBlockRecord - { - uint32_t offset; - uint32_t size; - uint32_t unknown[0x4]; - SqPackBlockHash block_hash; - }; + struct DatBlockRecord + { + uint32_t offset; + uint32_t size; + uint32_t unknown[0x4]; + SqPackBlockHash block_hash; + }; - struct DatBlockHeader - { - uint32_t size; - uint32_t unknown1; - uint32_t compressed_size; - uint32_t uncompressed_size; - }; + struct DatBlockHeader + { + uint32_t size; + uint32_t unknown1; + uint32_t compressed_size; + uint32_t uncompressed_size; + }; - struct DatStdFileBlockInfos - { - uint32_t offset; - uint16_t size; - uint16_t uncompressed_size; - }; + struct DatStdFileBlockInfos + { + uint32_t offset; + uint16_t size; + uint16_t uncompressed_size; + }; - struct DatMdlFileBlockInfos - { - uint32_t unknown1; - uint32_t uncompressed_sizes[::model_section_count]; - uint32_t compressed_sizes[::model_section_count]; - uint32_t offsets[::model_section_count]; - uint16_t block_ids[::model_section_count]; - uint16_t block_counts[::model_section_count]; - uint32_t unknown2[0x2]; - }; + struct DatMdlFileBlockInfos + { + uint32_t unknown1; + uint32_t uncompressed_sizes[::model_section_count]; + uint32_t compressed_sizes[::model_section_count]; + uint32_t offsets[::model_section_count]; + uint16_t block_ids[::model_section_count]; + uint16_t block_counts[::model_section_count]; + uint32_t unknown2[0x2]; + }; - struct DatTexFileBlockInfos - { - uint32_t offset; - uint32_t size; - uint32_t uncompressed_size; - uint32_t block_id; - uint32_t block_count; - }; - + struct DatTexFileBlockInfos + { + uint32_t offset; + uint32_t size; + uint32_t uncompressed_size; + uint32_t block_id; + uint32_t block_count; + }; } -} -namespace xiv +namespace xiv::utils::bparse { -namespace utils -{ -namespace bparse -{ - template <> - inline void reorder(xiv::dat::DatFileHeader& i_struct) - { - xiv::utils::bparse::reorder(i_struct.size); - xiv::utils::bparse::reorder(i_struct.entry_type); - xiv::utils::bparse::reorder(i_struct.total_uncompressed_size); - for (int32_t i = 0; i < 0x2; ++i) { xiv::utils::bparse::reorder(i_struct.unknown[i]); } - } + template<> + inline void reorder< xiv::dat::DatFileHeader >( xiv::dat::DatFileHeader& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.size ); + xiv::utils::bparse::reorder( i_struct.entry_type ); + xiv::utils::bparse::reorder( i_struct.total_uncompressed_size ); + for( int32_t i = 0; i < 0x2; ++i ) + { + xiv::utils::bparse::reorder( i_struct.unknown[ i ] ); + } + } - template <> - inline void reorder(xiv::dat::DatBlockRecord& i_struct) - { - xiv::utils::bparse::reorder(i_struct.offset); - xiv::utils::bparse::reorder(i_struct.size); - for (int32_t i = 0; i < 0x4; ++i) { xiv::utils::bparse::reorder(i_struct.unknown[i]); } - xiv::utils::bparse::reorder(i_struct.block_hash); - } + template<> + inline void reorder< xiv::dat::DatBlockRecord >( xiv::dat::DatBlockRecord& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.offset ); + xiv::utils::bparse::reorder( i_struct.size ); + for( int32_t i = 0; i < 0x4; ++i ) + { + xiv::utils::bparse::reorder( i_struct.unknown[ i ] ); + } + xiv::utils::bparse::reorder( i_struct.block_hash ); + } - template <> - inline void reorder(xiv::dat::DatBlockHeader& i_struct) - { - xiv::utils::bparse::reorder(i_struct.size); - xiv::utils::bparse::reorder(i_struct.unknown1); - xiv::utils::bparse::reorder(i_struct.compressed_size); - xiv::utils::bparse::reorder(i_struct.uncompressed_size); - } + template<> + inline void reorder< xiv::dat::DatBlockHeader >( xiv::dat::DatBlockHeader& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.size ); + xiv::utils::bparse::reorder( i_struct.unknown1 ); + xiv::utils::bparse::reorder( i_struct.compressed_size ); + xiv::utils::bparse::reorder( i_struct.uncompressed_size ); + } - template <> - inline void reorder(xiv::dat::DatStdFileBlockInfos& i_struct) - { - xiv::utils::bparse::reorder(i_struct.offset); - xiv::utils::bparse::reorder(i_struct.size); - xiv::utils::bparse::reorder(i_struct.uncompressed_size); - } + template<> + inline void reorder< xiv::dat::DatStdFileBlockInfos >( xiv::dat::DatStdFileBlockInfos& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.offset ); + xiv::utils::bparse::reorder( i_struct.size ); + xiv::utils::bparse::reorder( i_struct.uncompressed_size ); + } - template <> - inline void reorder(xiv::dat::DatMdlFileBlockInfos& i_struct) - { - xiv::utils::bparse::reorder(i_struct.unknown1); - for (auto i = 0; i < ::model_section_count; ++i) { xiv::utils::bparse::reorder(i_struct.uncompressed_sizes[i]); } - for (auto i = 0; i < ::model_section_count; ++i) { xiv::utils::bparse::reorder(i_struct.compressed_sizes[i]); } - for (auto i = 0; i < ::model_section_count; ++i) { xiv::utils::bparse::reorder(i_struct.offsets[i]); } - for (auto i = 0; i < ::model_section_count; ++i) { xiv::utils::bparse::reorder(i_struct.block_ids[i]); } - for (auto i = 0; i < ::model_section_count; ++i) { xiv::utils::bparse::reorder(i_struct.block_counts[i]); } - for (auto i = 0; i < 0x2; ++i) { xiv::utils::bparse::reorder(i_struct.unknown2[i]); } - } + template<> + inline void reorder< xiv::dat::DatMdlFileBlockInfos >( xiv::dat::DatMdlFileBlockInfos& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.unknown1 ); + for( auto i = 0; i < ::model_section_count; ++i ) + { + xiv::utils::bparse::reorder( i_struct.uncompressed_sizes[ i ] ); + } + for( auto i = 0; i < ::model_section_count; ++i ) + { + xiv::utils::bparse::reorder( i_struct.compressed_sizes[ i ] ); + } + for( auto i = 0; i < ::model_section_count; ++i ) + { + xiv::utils::bparse::reorder( i_struct.offsets[ i ] ); + } + for( auto i = 0; i < ::model_section_count; ++i ) + { + xiv::utils::bparse::reorder( i_struct.block_ids[ i ] ); + } + for( auto i = 0; i < ::model_section_count; ++i ) + { + xiv::utils::bparse::reorder( i_struct.block_counts[ i ] ); + } + for( auto i = 0; i < 0x2; ++i ) + { + xiv::utils::bparse::reorder( i_struct.unknown2[ i ] ); + } + } - template <> - inline void reorder(xiv::dat::DatTexFileBlockInfos& i_struct) - { - xiv::utils::bparse::reorder(i_struct.offset); - xiv::utils::bparse::reorder(i_struct.size); - xiv::utils::bparse::reorder(i_struct.uncompressed_size); - xiv::utils::bparse::reorder(i_struct.block_id); - xiv::utils::bparse::reorder(i_struct.block_count); - } + template<> + inline void reorder< xiv::dat::DatTexFileBlockInfos >( xiv::dat::DatTexFileBlockInfos& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.offset ); + xiv::utils::bparse::reorder( i_struct.size ); + xiv::utils::bparse::reorder( i_struct.uncompressed_size ); + xiv::utils::bparse::reorder( i_struct.block_id ); + xiv::utils::bparse::reorder( i_struct.block_count ); + } } -} -}; using xiv::utils::bparse::extract; -namespace xiv -{ -namespace dat +namespace xiv::dat { -Dat::Dat( const std::experimental::filesystem::path& i_path, uint32_t i_nb ) : - SqPack( i_path ), - m_num( i_nb ) -{ - auto block_record = extract(m_handle); - block_record.offset *= 0x80; - isBlockValid(block_record.offset, block_record.size, block_record.block_hash); -} + Dat::Dat( const std::filesystem::path& i_path, uint32_t i_nb ) : + SqPack( i_path ), + m_num( i_nb ) + { + auto block_record = extract< DatBlockRecord >( m_handle ); + block_record.offset *= 0x80; + isBlockValid( block_record.offset, block_record.size, block_record.block_hash ); + } -Dat::~Dat() -{ -} + Dat::~Dat() + { + } -std::unique_ptr Dat::getFile( uint32_t i_offset ) -{ - std::unique_ptr outputFile(new File()); - { + std::unique_ptr< File > Dat::getFile( uint32_t i_offset ) + { + std::unique_ptr< File > outputFile( new File() ); + { // Lock in this scope - std::lock_guard lock(m_fileMutex); + std::lock_guard< std::mutex > lock( m_fileMutex ); // Seek to the start of the header of the file record and extract it - m_handle.seekg(i_offset); - auto file_header = extract(m_handle); + m_handle.seekg( i_offset ); + auto file_header = extract< DatFileHeader >( m_handle ); - switch (file_header.entry_type) + switch( file_header.entry_type ) { - case FileType::empty: - throw std::runtime_error("File is empty"); + case FileType::empty: + throw std::runtime_error( "File is empty" ); - case FileType::standard: - { - outputFile->_type = FileType::standard; + case FileType::standard: + { + outputFile->_type = FileType::standard; - uint32_t number_of_blocks = extract(m_handle, "number_of_blocks"); + uint32_t number_of_blocks = extract< uint32_t >( m_handle, "number_of_blocks" ); - // Just extract offset infos for the blocks to extract - std::vector std_file_block_infos; - extract( m_handle, number_of_blocks, std_file_block_infos ); + // Just extract offset infos for the blocks to extract + std::vector< DatStdFileBlockInfos > std_file_block_infos; + extract< DatStdFileBlockInfos >( m_handle, number_of_blocks, std_file_block_infos ); - // Pre allocate data vector for the whole file - outputFile->_data_sections.resize(1); - auto& data_section = outputFile->_data_sections.front(); + // Pre allocate data vector for the whole file + outputFile->_data_sections.resize( 1 ); + auto& data_section = outputFile->_data_sections.front(); - data_section.reserve(file_header.total_uncompressed_size); - // Extract each block - for (auto& file_block_info : std_file_block_infos) + data_section.reserve( file_header.total_uncompressed_size ); + // Extract each block + for( auto& file_block_info : std_file_block_infos ) + { + extractBlock( i_offset + file_header.size + file_block_info.offset, data_section ); + } + } + break; + + case FileType::model: + { + outputFile->_type = FileType::model; + + DatMdlFileBlockInfos mdlBlockInfo = extract< DatMdlFileBlockInfos >( m_handle ); + + // Getting the block number and read their sizes + const uint32_t block_count = mdlBlockInfo.block_ids[ ::model_section_count - 1 ] + + mdlBlockInfo.block_counts[ ::model_section_count - 1 ]; + std::vector< uint16_t > block_sizes; + extract< uint16_t >( m_handle, "block_size", block_count, block_sizes ); + + // Preallocate sufficient space + outputFile->_data_sections.resize( ::model_section_count ); + + for( uint32_t i = 0; i < ::model_section_count; ++i ) + { + // Preallocating for section + auto& data_section = outputFile->_data_sections[ i ]; + data_section.reserve( mdlBlockInfo.uncompressed_sizes[ i ] ); + + uint32_t current_offset = i_offset + file_header.size + mdlBlockInfo.offsets[ i ]; + for( uint32_t j = 0; j < mdlBlockInfo.block_counts[ i ]; ++j ) { - extractBlock(i_offset + file_header.size + file_block_info.offset, data_section); + extractBlock( current_offset, data_section ); + current_offset += block_sizes[ mdlBlockInfo.block_ids[ i ] + j ]; } - } - break; + } + } + break; - case FileType::model: - { - outputFile->_type = FileType::model; + case FileType::texture: + { + outputFile->_type = FileType::texture; - DatMdlFileBlockInfos mdlBlockInfo = extract(m_handle); + // Extracts mipmap entries and the block sizes + uint32_t sectionCount = extract< uint32_t >( m_handle, "sections_count" ); - // Getting the block number and read their sizes - const uint32_t block_count = mdlBlockInfo.block_ids[::model_section_count - 1] + - mdlBlockInfo.block_counts[::model_section_count - 1]; - std::vector block_sizes; - extract(m_handle, "block_size", block_count, block_sizes); + std::vector< DatTexFileBlockInfos > texBlockInfo; + extract< DatTexFileBlockInfos >( m_handle, sectionCount, texBlockInfo ); - // Preallocate sufficient space - outputFile->_data_sections.resize(::model_section_count); + // Extracting block sizes + uint32_t block_count = texBlockInfo.back().block_id + texBlockInfo.back().block_count; + std::vector< uint16_t > block_sizes; + extract< uint16_t >( m_handle, "block_size", block_count, block_sizes ); - for (uint32_t i = 0; i < ::model_section_count; ++i) + outputFile->_data_sections.resize( sectionCount + 1 ); + + // Extracting header in section 0 + const uint32_t header_size = texBlockInfo.front().offset; + auto& header_section = outputFile->_data_sections[ 0 ]; + header_section.resize( header_size ); + + m_handle.seekg( i_offset + file_header.size ); + m_handle.read( header_section.data(), header_size ); + + // Extracting other sections + for( uint32_t i = 0; i < sectionCount; ++i ) + { + auto& data_section = outputFile->_data_sections[ i + 1 ]; + auto& section_infos = texBlockInfo[ i ]; + data_section.reserve( section_infos.uncompressed_size ); + + uint32_t current_offset = i_offset + file_header.size + section_infos.offset; + for( uint32_t j = 0; j < section_infos.block_count; ++j ) { - // Preallocating for section - auto& data_section = outputFile->_data_sections[i]; - data_section.reserve(mdlBlockInfo.uncompressed_sizes[i]); - - uint32_t current_offset = i_offset + file_header.size + mdlBlockInfo.offsets[i]; - for (uint32_t j = 0; j < mdlBlockInfo.block_counts[i]; ++j) - { - extractBlock(current_offset, data_section); - current_offset += block_sizes[mdlBlockInfo.block_ids[i] + j]; - } + extractBlock( current_offset, data_section ); + current_offset += block_sizes[ section_infos.block_id + j ]; } - } - break; + } + } + break; - case FileType::texture: - { - outputFile->_type = FileType::texture; - - // Extracts mipmap entries and the block sizes - uint32_t sectionCount = extract(m_handle, "sections_count"); - - std::vector texBlockInfo; - extract(m_handle, sectionCount, texBlockInfo); - - // Extracting block sizes - uint32_t block_count = texBlockInfo.back().block_id + texBlockInfo.back().block_count; - std::vector block_sizes; - extract(m_handle, "block_size", block_count, block_sizes); - - outputFile->_data_sections.resize(sectionCount + 1); - - // Extracting header in section 0 - const uint32_t header_size = texBlockInfo.front().offset; - auto& header_section = outputFile->_data_sections[0]; - header_section.resize(header_size); - - m_handle.seekg(i_offset + file_header.size); - m_handle.read(header_section.data(), header_size); - - // Extracting other sections - for (uint32_t i = 0; i < sectionCount; ++i) - { - auto& data_section = outputFile->_data_sections[i + 1]; - auto& section_infos = texBlockInfo[i]; - data_section.reserve(section_infos.uncompressed_size); - - uint32_t current_offset = i_offset + file_header.size + section_infos.offset; - for (uint32_t j = 0; j < section_infos.block_count; ++j) - { - extractBlock(current_offset, data_section); - current_offset += block_sizes[section_infos.block_id + j]; - } - } - } - break; - - default: - throw std::runtime_error("Invalid entry_type: " + std::to_string(static_cast(file_header.entry_type))); + default: + throw std::runtime_error( + "Invalid entry_type: " + std::to_string( static_cast(file_header.entry_type) ) ); } - } + } - return outputFile; -} + return outputFile; + } -void Dat::extractBlock( uint32_t i_offset, std::vector& o_data ) -{ - m_handle.seekg(i_offset); + void Dat::extractBlock( uint32_t i_offset, std::vector< char >& o_data ) + { + m_handle.seekg( i_offset ); - DatBlockHeader block_header = extract(m_handle); + DatBlockHeader block_header = extract< DatBlockHeader >( m_handle ); - // Resizing the vector to write directly into it - const uint32_t data_size = o_data.size(); - o_data.resize(data_size + block_header.uncompressed_size); + // Resizing the vector to write directly into it + const uint32_t data_size = o_data.size(); + o_data.resize( data_size + block_header.uncompressed_size ); - // 32000 in compressed_size means it is not compressed so take uncompressed_size - if (block_header.compressed_size == 32000) - { - m_handle.read(o_data.data() + data_size, block_header.uncompressed_size); - } - else - { + // 32000 in compressed_size means it is not compressed so take uncompressed_size + if( block_header.compressed_size == 32000 ) + { + m_handle.read( o_data.data() + data_size, block_header.uncompressed_size ); + } + else + { // If it is compressed use zlib // Read the data to be decompressed - std::vector temp_buffer(block_header.compressed_size); - m_handle.read(temp_buffer.data(), block_header.compressed_size); + std::vector< char > temp_buffer( block_header.compressed_size ); + m_handle.read( temp_buffer.data(), block_header.compressed_size ); - utils::zlib::no_header_decompress(reinterpret_cast(temp_buffer.data()), - temp_buffer.size(), - reinterpret_cast(o_data.data() + data_size), - block_header.uncompressed_size); - } -} + utils::zlib::no_header_decompress( reinterpret_cast(temp_buffer.data()), + temp_buffer.size(), + reinterpret_cast(o_data.data() + data_size), + block_header.uncompressed_size ); + } + } -uint32_t Dat::getNum() const -{ - return m_num; -} + uint32_t Dat::getNum() const + { + return m_num; + } } -} diff --git a/deps/datReader/Dat.h b/deps/datReader/Dat.h index 5311ab48..f1827782 100644 --- a/deps/datReader/Dat.h +++ b/deps/datReader/Dat.h @@ -5,41 +5,38 @@ #include -#include +#include -namespace xiv -{ -namespace dat +namespace xiv::dat { -class File; + class File; -class Dat : public SqPack -{ -public: - // Full path to the dat file - Dat( const std::experimental::filesystem::path& i_path, uint32_t i_nb ); - virtual ~Dat(); + class Dat : public SqPack + { + public: + // Full path to the dat file + Dat( const std::filesystem::path& i_path, uint32_t i_nb ); + virtual ~Dat(); - // Retrieves a file given the offset in the dat file - std::unique_ptr getFile( uint32_t i_offset ); + // Retrieves a file given the offset in the dat file + std::unique_ptr getFile( uint32_t i_offset ); - // Appends to the vector the data of this block, it is assumed to be preallocated - // Is it also assumed that the m_fileMutex is currently locked by this thread before the call - void extractBlock( uint32_t i_offset, std::vector& o_data ); + // Appends to the vector the data of this block, it is assumed to be preallocated + // Is it also assumed that the m_fileMutex is currently locked by this thread before the call + void extractBlock( uint32_t i_offset, std::vector& o_data ); - // Returns the dat number - uint32_t getNum() const; + // Returns the dat number + uint32_t getNum() const; -protected: - // File reading mutex to have only one thread reading the file at a time - std::mutex m_fileMutex; + protected: + // File reading mutex to have only one thread reading the file at a time + std::mutex m_fileMutex; - // Dat nb - uint32_t m_num; -}; + // Dat nb + uint32_t m_num; + }; -} } #endif // XIV_DAT_DAT_H diff --git a/deps/datReader/DatCat.cpp b/deps/datReader/DatCat.cpp index 117c2b9b..ccf3d6a0 100644 --- a/deps/datReader/DatCat.cpp +++ b/deps/datReader/DatCat.cpp @@ -10,7 +10,7 @@ namespace xiv namespace dat { -Cat::Cat( const std::experimental::filesystem::path& basePath, uint32_t catNum, const std::string& name ) : +Cat::Cat( const std::filesystem::path& basePath, uint32_t catNum, const std::string& name ) : m_name( name ), m_catNum( catNum ), m_chunk( -1 ) @@ -21,27 +21,27 @@ Cat::Cat( const std::experimental::filesystem::path& basePath, uint32_t catNum, std::string prefix = ss.str() + "0000.win32"; // Creates the index: XX0000.win32.index - m_index = std::unique_ptr( new Index( basePath / "//ffxiv" / ( prefix + ".index" ) ) ); + m_index = std::unique_ptr( new Index( basePath / "ffxiv" / ( prefix + ".index" ) ) ); // For all dat files linked to this index, create it: XX0000.win32.datX for( uint32_t i = 0; i < getIndex().getDatCount(); ++i ) { - m_dats.emplace_back( std::unique_ptr( new Dat( basePath / "//ffxiv" / ( prefix + ".dat" + std::to_string( i ) ), i ) ) ); + m_dats.emplace_back( std::make_unique< Dat >(basePath / "ffxiv" / ( prefix + ".dat" + std::to_string( i ) ), i ) ); } } -Cat::Cat( const std::experimental::filesystem::path& basePath, uint32_t catNum, const std::string& name, uint32_t exNum, uint32_t chunk ) : +Cat::Cat( const std::filesystem::path& basePath, uint32_t catNum, const std::string& name, uint32_t exNum, uint32_t chunk ) : m_name( name ), m_catNum( catNum ), m_chunk( chunk ) { // Creates the index: XX0000.win32.index - m_index = std::unique_ptr( new Index( basePath / GameData::buildDatStr( "ex" + std::to_string( exNum ), catNum, exNum, chunk, "win32", "index" ) ) ); + m_index = std::make_unique< Index >( basePath / GameData::buildDatStr( "ex" + std::to_string( exNum ), catNum, exNum, chunk, "win32", "index" ) ); // For all dat files linked to this index, create it: XX0000.win32.datX for( uint32_t i = 0; i < getIndex().getDatCount(); ++i ) { - m_dats.emplace_back( std::unique_ptr( new Dat( basePath / GameData::buildDatStr( "ex" + std::to_string( exNum ), catNum, exNum, chunk, "win32", "dat" + std::to_string( i ) ), i ) ) ); + m_dats.emplace_back( std::make_unique< Dat >( basePath / GameData::buildDatStr( "ex" + std::to_string( exNum ), catNum, exNum, chunk, "win32", "dat" + std::to_string( i ) ), i ) ); } } diff --git a/deps/datReader/DatCat.h b/deps/datReader/DatCat.h index 1e1d0759..43d842a1 100644 --- a/deps/datReader/DatCat.h +++ b/deps/datReader/DatCat.h @@ -3,62 +3,66 @@ #include #include -#include +#include -namespace xiv { -namespace dat { - -class Index; -class Dat; -class File; - -// A category represents an .index and its associated .datX -class Cat +namespace xiv::dat { -public: - // basePath: Path to the folder containingthe datfiles - // catNum: The number of the category - // name: The name of the category, empty if not known - Cat( const std::experimental::filesystem::path& basePath, uint32_t catNum, const std::string& name ); - // basePath: Path to the folder containingthe datfiles - // catNum: The number of the category - // name: The name of the category, empty if not known - // exNum: The number of the expansion to load from - // chunk: The chunk to load from - Cat( const std::experimental::filesystem::path& basePath, uint32_t catNum, const std::string& name, uint32_t exNum, uint32_t chunk ); - ~Cat(); + class Index; - // Returns .index of the category - const Index& getIndex() const; + class Dat; - // Retrieve a file from the category given its hashes - std::unique_ptr getFile( uint32_t dir_hash, uint32_t filename_hash ) const; + class File; + + // A category represents an .index and its associated .datX + class Cat + { + public: + // basePath: Path to the folder containingthe datfiles + // catNum: The number of the category + // name: The name of the category, empty if not known + Cat( const std::filesystem::path& basePath, uint32_t catNum, const std::string& name ); + + // basePath: Path to the folder containingthe datfiles + // catNum: The number of the category + // name: The name of the category, empty if not known + // exNum: The number of the expansion to load from + // chunk: The chunk to load from + Cat( const std::filesystem::path& basePath, uint32_t catNum, const std::string& name, uint32_t exNum, + uint32_t chunk ); + + ~Cat(); + + // Returns .index of the category + const Index& getIndex() const; + + // Retrieve a file from the category given its hashes + std::unique_ptr< File > getFile( uint32_t dir_hash, uint32_t filename_hash ) const; - bool doesFileExist( uint32_t dir_hash, uint32_t filename_hash ) const; - bool doesDirExist( uint32_t dir_hash ) const; + bool doesFileExist( uint32_t dir_hash, uint32_t filename_hash ) const; + + bool doesDirExist( uint32_t dir_hash ) const; - // Returns thename of the category - const std::string& getName() const; + // Returns thename of the category + const std::string& getName() const; - // Returns the number of the category - uint32_t getCatNum() const; + // Returns the number of the category + uint32_t getCatNum() const; -protected: - const std::string m_name; - const uint32_t m_catNum; - const uint32_t m_chunk; + protected: + const std::string m_name; + const uint32_t m_catNum; + const uint32_t m_chunk; - // The .index - std::unique_ptr m_index; + // The .index + std::unique_ptr< Index > m_index; - // The .datXs such as dat nb X => m_dats[X] - std::vector> m_dats; -}; + // The .datXs such as dat nb X => m_dats[X] + std::vector< std::unique_ptr< Dat>> m_dats; + }; -} } #endif // XIV_DAT_CAT_H diff --git a/deps/datReader/DatCategories/bg/LgbTypes.h b/deps/datReader/DatCategories/bg/LgbTypes.h new file mode 100644 index 00000000..8b9d5ad5 --- /dev/null +++ b/deps/datReader/DatCategories/bg/LgbTypes.h @@ -0,0 +1,198 @@ +#ifndef SAPPHIRE_LGBTYPES_H +#define SAPPHIRE_LGBTYPES_H + +#include "vec3.h" + +enum class LgbEntryType : uint32_t +{ + BgParts = 1, + Attribute = 2, + Light = 3, + Vfx = 4, + PositionMarker = 5, + Gimmick = 6, + SharedGroup6 = 6,// secondary variable is set to 2 + Sound = 7, + EventNpc = 8, + BattleNpc = 9, + RoutePath = 10, + Character = 11, + Aetheryte = 12, + EnvSpace = 13, + Gathering = 14, + SharedGroup15 = 15,// secondary variable is set to 13 + Treasure = 16, + Player = 37, + Monster = 38, + Weapon = 39, + PopRange = 40, + ExitRange = 41, + LVB = 42, + MapRange = 43, + NaviMeshRange = 44, + EventObject = 45, + DemiHuman = 46, + EnvLocation = 47, + ControlPoint = 48, + EventRange = 49, + RestBonusRange = 50, + QuestMarker = 51, + TimeLine = 52, + ObjectBehaviorSet = 53, + Movie = 54, + ScenarioEXD = 55, + ScenarioText = 56, + CollisionBox = 57, + DoorRange = 58, + LineVfx = 59, + SoundEnvSet = 60, + CutActionTimeline = 61, + CharaScene = 62, + CutAction = 63, + EquipPreset = 64, + ClientPath = 65, + ServerPath = 66, + GimmickRange = 67, + TargetMarker = 68, + ChairMarker = 69, + ClickableRange = 70, + PrefetchRange = 71, + FateRange = 72, + PartyMember = 73, + KeepRange = 74, + SphereCastRange = 75, + IndoorObject = 76, + OutdoorObject = 77, + EditGroup = 78, + StableChocobo = 79 +}; + +enum PopType : uint32_t +{ + PopTypePC = 0x1, + PopTypeNPC = 0x2, + PopTypeBNPC = 0x2, + PopTypeContent = 0x3, +}; + +struct Transformation +{ + vec3 translation; + vec3 rotation; + vec3 scale; +}; + +struct InstanceObject +{ + LgbEntryType type; + uint32_t instanceId; + uint32_t nameOffset; + Transformation transform; +}; + +struct BgPartsData : public InstanceObject +{ + uint32_t modelFileOffset; + uint32_t collisionFileOffset; + uint32_t unknown4; + uint32_t unknown5; + uint32_t unknown6; + uint32_t unknown7; + uint32_t unknown8; + uint32_t unknown9; +}; + +struct RelativePositions +{ + int32_t Pos; + int32_t PosCount; +}; + +struct PopRangeData : public InstanceObject +{ + PopType popType; + RelativePositions relativePositions; + float innerRadiusRatio; + uint8_t index; + uint8_t padding00[3]; + uint32_t reserved; +}; + +struct GimmickData : public InstanceObject +{ + uint32_t gimmickFileOffset; + char unknownBytes[100]; +}; + +struct ENpcData : public InstanceObject +{ + uint32_t enpcId; + uint8_t unknown1[0x24]; +}; + +struct EObjData : public InstanceObject +{ + uint32_t eobjId; + uint32_t levelHierachyId; + uint8_t unknown1[0xC]; +}; + +enum TriggerBoxShape : uint32_t +{ + TriggerBoxShapeBox = 0x1, + TriggerBoxShapeSphere = 0x2, + TriggerBoxShapeCylinder = 0x3, + TriggerBoxShapeBoard = 0x4, + TriggerBoxShapeMesh = 0x5, + TriggerBoxShapeBoardBothSides = 0x6, +}; + +struct TriggerBoxInstanceObject +{ + TriggerBoxShape triggerBoxShape; + int16_t priority; + int8_t enabled; + uint8_t padding; + uint32_t reserved; +}; + +struct ExitRangeData : public InstanceObject +{ + TriggerBoxInstanceObject triggerBoxType; + uint32_t exitType; + uint16_t zoneId; + uint16_t destTerritoryType; + int index; + uint32_t destInstanceObjectId; + uint32_t returnInstanceObjectId; + float direction; + uint32_t reserved; +}; + +struct MapRangeData : public InstanceObject +{ + TriggerBoxInstanceObject triggerBoxType; + uint32_t mapId; + uint32_t placeNameBlock; + uint32_t placeNameSpot; + uint32_t bGM; + uint32_t weather; + uint32_t reserved; + uint32_t reserved2; + uint16_t reserved3; + uint8_t housingBlockId; + int8_t restBonusEffective; + uint8_t discoveryIndex; + int8_t mapEnabled; + int8_t placeNameEnabled; + int8_t discoveryEnabled; + int8_t bGMEnabled; + int8_t weatherEnabled; + int8_t restBonusEnabled; + int8_t bGMPlayZoneInOnly; + int8_t liftEnabled; + int8_t housingEnabled; + uint16_t padding; +}; + +#endif //SAPPHIRE_LGBTYPES_H diff --git a/deps/datReader/DatCategories/bg/lgb.h b/deps/datReader/DatCategories/bg/lgb.h index 50097735..25bd5b6b 100644 --- a/deps/datReader/DatCategories/bg/lgb.h +++ b/deps/datReader/DatCategories/bg/lgb.h @@ -12,87 +12,33 @@ #include "matrix4.h" #include "vec3.h" #include "sgb.h" +#include "LgbTypes.h" -// garbage to skip model loading -extern bool ignoreModels; - -// all credit to -// https://github.com/ufx/SaintCoinach/blob/master/SaintCoinach/Graphics/Lgb/ -// this is simply their work ported to c++ since we dont c# +// based on https://github.com/ufx/SaintCoinach/blob/master/SaintCoinach/Graphics/Lgb/ struct LGB_FILE; struct LGB_FILE_HEADER; struct LGB_GROUP; struct LGB_GROUP_HEADER; -enum class LgbEntryType : - uint32_t -{ - BgParts = 1, - Light = 3, - Vfx = 4, - PositionMarker = 5, - Gimmick = 6, - SharedGroup6 = 6,// secondary variable is set to 2 - Sound = 7, - EventNpc = 8, - BattleNpc = 9, - Aetheryte = 12, - EnvSpace = 13, - Gathering = 14, - SharedGroup15 = 15,// secondary variable is set to 13 - Treasure = 16, - Weapon = 39, - PopRange = 40, - ExitRange = 41, - MapRange = 43, - NaviMeshRange = 44, - EventObject = 45, - EnvLocation = 47, - EventRange = 49, - QuestMarker = 51, - CollisionBox = 57, - DoorRange = 58, - LineVfx = 59, - ClientPath = 65, - ServerPath = 66, - GimmickRange = 67, - TargetMarker = 68, - ChairMarker = 69, - ClickableRange = 70, - PrefetchRange = 71, - FateRange = 72, - SphereCastRange = 75, -}; - -struct LGB_ENTRY_HEADER -{ - LgbEntryType type; - uint32_t unknown; - uint32_t nameOffset; - vec3 translation; - vec3 rotation; - vec3 scale; -}; - -class LGB_ENTRY +class LgbEntry { public: char* m_buf; uint32_t m_offset; - LGB_ENTRY_HEADER header; + InstanceObject header; - LGB_ENTRY() + LgbEntry() { m_buf = nullptr; m_offset = 0; memset( &header, 0, sizeof( header ) ); }; - LGB_ENTRY( char* buf, uint32_t offset ) + LgbEntry( char* buf, uint32_t offset ) { m_buf = buf; m_offset = offset; - header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); + header = *reinterpret_cast< InstanceObject* >( buf + offset ); }; const LgbEntryType getType() const @@ -100,30 +46,16 @@ public: return header.type; }; - virtual ~LGB_ENTRY() + virtual ~LgbEntry() { }; }; -struct LGB_BGPARTS_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t modelFileOffset; - uint32_t collisionFileOffset; - uint32_t unknown4; - uint32_t unknown5; - uint32_t unknown6; - uint32_t unknown7; - uint32_t unknown8; - uint32_t unknown9; -}; - -class LGB_BGPARTS_ENTRY : - public LGB_ENTRY +class LGB_BGPARTS_ENTRY : public LgbEntry { public: - LGB_BGPARTS_HEADER header; + BgPartsData data; std::string name; std::string modelFileName; std::string collisionFileName; @@ -132,124 +64,94 @@ public: { }; - LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + data = *reinterpret_cast< BgPartsData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); - modelFileName = std::string( buf + offset + header.modelFileOffset ); - collisionFileName = std::string( buf + offset + header.collisionFileOffset ); + modelFileName = std::string( buf + offset + data.modelFileOffset ); + collisionFileName = std::string( buf + offset + data.collisionFileOffset ); }; }; -struct LGB_GIMMICK_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t gimmickFileOffset; - char unknownBytes[100]; -}; - -class LGB_GIMMICK_ENTRY : - public LGB_ENTRY +class LGB_GIMMICK_ENTRY : public LgbEntry { public: - LGB_GIMMICK_HEADER header; + GimmickData data; std::string name; std::string gimmickFileName; - LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + data = *reinterpret_cast< GimmickData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); - gimmickFileName = std::string( buf + offset + header.gimmickFileOffset ); - //std::cout << "\t " << gimmickFileName << " unknown: " << header.unknown << "\n"; + gimmickFileName = std::string( buf + offset + data.gimmickFileOffset ); }; }; -struct LGB_ENPC_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t enpcId; - uint8_t unknown1[0x24]; -}; - -class LGB_ENPC_ENTRY : - public LGB_ENTRY +class LGB_ENPC_ENTRY : public LgbEntry { public: - LGB_ENPC_HEADER header; + ENpcData data; std::string name; LGB_ENPC_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_ENPC_HEADER* >( buf + offset ); - name = std::string( buf + offset + header.nameOffset ); - //std::cout << "\t ENpc " << header.enpcId << " " << name << "\n"; - }; -}; - -struct LGB_EOBJ_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t eobjId; - uint32_t levelHierachyId; - uint8_t unknown1[0xC]; -}; - -class LGB_EOBJ_ENTRY : - public LGB_ENTRY -{ -public: - LGB_EOBJ_HEADER header; - std::string name; - - LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) - { - header = *reinterpret_cast< LGB_EOBJ_HEADER* >( buf + offset ); - //std::cout << "\t " << header.eobjId << " " << name << " unknown: " << header.unknown << "\n"; + data = *reinterpret_cast< ENpcData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; -struct LGB_MAPRANGE_HEADER : - public LGB_ENTRY_HEADER -{ - uint32_t type; - uint8_t unknown2; - uint8_t unknown2_1; - uint16_t unknown3; - uint32_t unknown5; - uint32_t mapId; - uint32_t offsetX; - uint32_t offsetY; - uint32_t unkInts[4]; - uint16_t unkShort; - uint8_t unkFlag; - uint8_t unkFlag2; - uint8_t discoveryIndex; - uint8_t unkFlag3; - uint8_t unkFlag4; - uint8_t unknown4[0x09]; -}; - -struct LGB_MAPRANGE_ENTRY : - public LGB_ENTRY +class LGB_EOBJ_ENTRY : public LgbEntry { public: - LGB_MAPRANGE_HEADER header; + EObjData data; std::string name; - LGB_MAPRANGE_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_MAPRANGE_HEADER* >( buf + offset ); + data = *reinterpret_cast< EObjData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; +struct LGB_MAP_RANGE_ENTRY : public LgbEntry +{ +public: + MapRangeData data; + std::string name; + + LGB_MAP_RANGE_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) + { + data = *reinterpret_cast< MapRangeData* >( buf + offset ); + name = std::string( buf + offset + header.nameOffset ); + }; +}; + +struct LGB_EXIT_RANGE_ENTRY : public LgbEntry +{ +public: + ExitRangeData data; + std::string name; + + LGB_EXIT_RANGE_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) + { + data = *reinterpret_cast< ExitRangeData* >( buf + offset ); + name = std::string( buf + offset + header.nameOffset ); + }; +}; + +struct LGB_POP_RANGE_ENTRY : public LgbEntry +{ +public: + PopRangeData data; + + LGB_POP_RANGE_ENTRY( char* buf, uint32_t offset ) : LgbEntry( buf, offset ) + { + data = *reinterpret_cast< PopRangeData* >( buf + offset ); + }; +}; + struct LGB_GROUP_HEADER { uint32_t id; @@ -272,15 +174,13 @@ struct LGB_GROUP LGB_FILE* parent; LGB_GROUP_HEADER header; std::string name; - std::vector< std::shared_ptr< LGB_ENTRY > > entries; + std::vector< std::shared_ptr< LgbEntry > > entries; LGB_GROUP( char* buf, LGB_FILE* parentStruct, uint32_t offset ) { parent = parentStruct; header = *reinterpret_cast< LGB_GROUP_HEADER* >( buf + offset ); name = std::string( buf + offset + header.groupNameOffset ); - //entries.resize( header.entryCount ); - //std::cout << name << "\n\t unknown: " << header.unknown << "\n"; const auto entriesOffset = offset + header.entriesOffset; for( auto i = 0; i < header.entryCount; ++i ) { @@ -288,8 +188,7 @@ struct LGB_GROUP try { - const auto type = *reinterpret_cast( buf + entryOffset ); - // garbage to skip model loading + const auto type = *reinterpret_cast< LgbEntryType* >( buf + entryOffset ); if( type == LgbEntryType::BgParts ) { entries.push_back( std::make_shared< LGB_BGPARTS_ENTRY >( buf, entryOffset ) ); @@ -306,16 +205,18 @@ struct LGB_GROUP { entries.push_back( std::make_shared< LGB_EOBJ_ENTRY >( buf, entryOffset ) ); } + else if( type == LgbEntryType::ExitRange ) + { + entries.push_back( std::make_shared< LGB_EXIT_RANGE_ENTRY >( buf, entryOffset ) ); + } else if( type == LgbEntryType::MapRange ) { - entries.push_back( std::make_shared< LGB_MAPRANGE_ENTRY >( buf, entryOffset ) ); + entries.push_back( std::make_shared< LGB_MAP_RANGE_ENTRY >( buf, entryOffset ) ); } else { - entries.push_back( std::make_shared< LGB_ENTRY >( buf, entryOffset ) ); + entries.push_back( std::make_shared< LgbEntry >( buf, entryOffset ) ); } - - } catch( std::exception& e ) { @@ -344,8 +245,7 @@ struct LGB_FILE std::vector< LGB_GROUP > groups; std::string m_name; - LGB_FILE( char* buf, const std::string& name ) : - LGB_FILE( buf ) + LGB_FILE( char* buf, const std::string& name ) : LGB_FILE( buf ) { m_name = name; } @@ -356,8 +256,6 @@ struct LGB_FILE if( strncmp( &header.magic[ 0 ], "LGB1", 4 ) != 0 || strncmp( &header.magic2[ 0 ], "LGP1", 4 ) != 0 ) throw std::runtime_error( "Invalid LGB file!" ); - //groups.resize(header.groupCount); - constexpr auto baseOffset = sizeof( header ); for( auto i = 0; i < header.groupCount; ++i ) { diff --git a/deps/datReader/DatCategories/bg/sgb.h b/deps/datReader/DatCategories/bg/sgb.h index fb384b69..fbf23f5a 100644 --- a/deps/datReader/DatCategories/bg/sgb.h +++ b/deps/datReader/DatCategories/bg/sgb.h @@ -22,15 +22,13 @@ struct SGB_GROUP; struct SGB_GROUP_HEADER; -enum SgbDataType : - uint32_t +enum SgbDataType : uint32_t { Unknown0008 = 0x0008, Group = 0x0100, }; -enum SgbGroupEntryType : - uint32_t +enum SgbGroupEntryType : uint32_t { Model = 0x01, Gimmick = 0x06, @@ -124,15 +122,13 @@ struct SGB_ENTRY_HEADER vec3 scale; }; -struct SGB_MODEL_HEADER : - public SGB_ENTRY_HEADER +struct SGB_MODEL_HEADER : public SGB_ENTRY_HEADER { int32_t modelFileOffset; int32_t collisionFileOffset; }; -struct SGB_MODEL_ENTRY : - public SGB_GROUP_ENTRY +struct SGB_MODEL_ENTRY : public SGB_GROUP_ENTRY { SGB_MODEL_HEADER header; SgbGroupEntryType type; diff --git a/deps/datReader/Exd.cpp b/deps/datReader/Exd.cpp index e82fcc96..6c4769b5 100644 --- a/deps/datReader/Exd.cpp +++ b/deps/datReader/Exd.cpp @@ -1,380 +1,332 @@ #include "Exd.h" #include "bparse.h" -#include "stream.h" -#include #include "Exh.h" using xiv::utils::bparse::extract; -namespace xiv +namespace xiv::exd { - namespace exd - { + struct ExdHeader + { + char magic[0x4]; + uint16_t unknown; + uint16_t unknown2; + uint32_t index_size; + }; + + struct ExdRecordIndex + { + uint32_t id; + uint32_t offset; + }; +} + +namespace xiv::utils::bparse { +template<> + inline void reorder< xiv::exd::ExdHeader >( xiv::exd::ExdHeader& i_struct ) + { + for( int32_t i = 0; i < 0x4; ++i ) + { + xiv::utils::bparse::reorder( i_struct.magic[ i ] ); + } + i_struct.unknown = xiv::utils::bparse::byteswap( i_struct.unknown ); + xiv::utils::bparse::reorder( i_struct.unknown ); + i_struct.unknown2 = xiv::utils::bparse::byteswap( i_struct.unknown2 ); + xiv::utils::bparse::reorder( i_struct.unknown2 ); + i_struct.index_size = xiv::utils::bparse::byteswap( i_struct.index_size ); + xiv::utils::bparse::reorder( i_struct.index_size ); + } + + template<> + inline void reorder< xiv::exd::ExdRecordIndex >( xiv::exd::ExdRecordIndex& i_struct ) + { + i_struct.id = xiv::utils::bparse::byteswap( i_struct.id ); + xiv::utils::bparse::reorder( i_struct.id ); + i_struct.offset = xiv::utils::bparse::byteswap( i_struct.offset ); + xiv::utils::bparse::reorder( i_struct.offset ); + } +}; + +namespace xiv::exd +{ + Exd::Exd( std::shared_ptr< Exh > exh, const std::vector< std::shared_ptr< dat::File > >& files ) + { + _exh = exh; + + + // Iterates over all the files + for( auto& file : files ) + { + std::vector< char > dataCpy = file->get_data_sections().front(); + + // Extract the header + auto exdHeader = extract< ExdHeader >( dataCpy, 0 ); + + const uint32_t recordCount = exdHeader.index_size / sizeof( ExdRecordIndex ); + for( uint32_t i = 0; i < recordCount; ++i ) + { + auto recordIndex = extract< ExdRecordIndex >( dataCpy, 32 + ( i * sizeof( ExdRecordIndex ) ) ); + _idCache[ recordIndex.id ] = ExdCacheEntry{ file, recordIndex.offset + 6, extract< uint8_t >( dataCpy, recordIndex.offset + 5 ) }; + } + } + } + + Exd::~Exd() + { + } + + const std::vector< Field > Exd::get_row( uint32_t id, uint32_t subRow ) + { + + auto cacheEntryIt = _idCache.find( id ); + if( cacheEntryIt == _idCache.end() || subRow >= cacheEntryIt->second.subRows ) + throw std::runtime_error( "Id + SubId combination not found: " + std::to_string( id ) + "." + std::to_string( subRow ) ); + + auto dataCpy = cacheEntryIt->second.file->get_data_sections().front(); + + std::vector< Field > fields; + fields.reserve( _exh->get_members().size() ); + + uint32_t baseOffset = cacheEntryIt->second.offset + ( subRow * _exh->get_header().data_offset + 2 * ( subRow + 1 ) ); + + for( auto& memberEntry : _exh->get_exh_members() ) + { + // Switch depending on the type to extract + switch( memberEntry.type ) + { + case DataType::string: + // Extract the offset to the actual string + // Then extract the actual string from that offset + { + throw std::runtime_error( "String not implemented for variant 2!" ); + //auto string_offset = extract( iss, "string_offset", false ); + //iss.seekg( cacheEntryIt->second.offset + 6 + _exh->get_header().data_offset + string_offset ); + //fields.emplace_back( utils::bparse::extract_cstring( iss, "string" ) ); + } + break; + + case DataType::boolean: + fields.emplace_back( extract< bool >( dataCpy, baseOffset + memberEntry.offset ) ); + break; + + case DataType::int8: + fields.emplace_back( extract< int8_t >( dataCpy, baseOffset + memberEntry.offset ) ); + break; + + case DataType::uint8: + fields.emplace_back( extract< uint8_t >( dataCpy, baseOffset + memberEntry.offset ) ); + break; + + case DataType::int16: + fields.emplace_back( extract< int16_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::uint16: + fields.emplace_back( extract< uint16_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::int32: + fields.emplace_back( extract< int32_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::uint32: + fields.emplace_back( extract< uint32_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::float32: + fields.emplace_back( extract< float >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::uint64: + fields.emplace_back( extract< uint64_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + default: + auto type = static_cast< uint16_t >( memberEntry.type ); + if( type < 0x19 || type > 0x20 ) + throw std::runtime_error( "Unknown DataType: " + std::to_string( type ) ); + fields.emplace_back( ( extract< uint8_t >( dataCpy, baseOffset + memberEntry.offset ) & ( 1 << ( type - 0x19 ) ) ) != 0 ); + break; + } + } + return fields; + + } + + + const std::vector< Field > Exd::get_row( uint32_t id ) + { + + auto cacheEntryIt = _idCache.find( id ); + if( cacheEntryIt == _idCache.end() ) + throw std::runtime_error( "Id not found: " + std::to_string( id ) ); + + auto dataCpy = cacheEntryIt->second.file->get_data_sections().front(); + + std::vector< Field > fields; + fields.reserve( _exh->get_members().size() ); + + auto stringBaseOffset = cacheEntryIt->second.offset + _exh->get_header().data_offset; + + for( auto& memberEntry : _exh->get_exh_members() ) + { + // Switch depending on the type to extract + switch( memberEntry.type ) + { + case DataType::string: + // Extract the offset to the actual string + // Then extract the actual string from that offset + { + auto stringOffset = extract< uint32_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset, false ); + fields.emplace_back( utils::bparse::extract_cstring( dataCpy, stringBaseOffset + stringOffset ) ); + } + break; + + case DataType::boolean: + fields.emplace_back( extract< bool >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset ) ); + break; + + case DataType::int8: + fields.emplace_back( extract< int8_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset ) ); + break; + + case DataType::uint8: + fields.emplace_back( extract< uint8_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset ) ); + break; + + case DataType::int16: + fields.emplace_back( extract< int16_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset, false ) ); + break; + + case DataType::uint16: + fields.emplace_back( extract< uint16_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset, false ) ); + break; + + case DataType::int32: + fields.emplace_back( extract< int32_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset, false ) ); + break; + + case DataType::uint32: + fields.emplace_back( extract< uint32_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset, false ) ); + break; + + case DataType::float32: + fields.emplace_back( extract< float >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset, false ) ); + break; + + case DataType::uint64: + fields.emplace_back( extract< uint64_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset, false ) ); + break; + + default: + auto type = static_cast< uint16_t >( memberEntry.type ); + if( type < 0x19 || type > 0x20 ) + throw std::runtime_error( "Unknown DataType: " + std::to_string( type ) ); + fields.emplace_back( ( extract< uint8_t >( dataCpy, cacheEntryIt->second.offset + memberEntry.offset ) & ( 1 << ( type - 0x19 ) ) ) != 0 ); + break; + } + } + return fields; + + } + + // Get all rows + const std::map< ExdRow, std::vector< Field >, exdRowSort > Exd::get_rows() + { + std::map< ExdRow, std::vector< Field >, exdRowSort > data; + + // Iterates over all the cached ids + const uint32_t memberCount = _exh->get_members().size(); + for( auto& cacheEntry : _idCache ) + { + std::vector< char > dataCpy = cacheEntry.second.file->get_data_sections().front(); + + auto baseOffset = cacheEntry.second.offset; + auto stringBaseOffset = baseOffset + _exh->get_header().data_offset; + + for( int32_t i = 0; i < cacheEntry.second.subRows; i++ ) + { + // Get the vector fields for the given record and preallocate it + ExdRow row = { cacheEntry.first, i }; + auto& fields = data[ row ]; + fields.reserve( memberCount ); + + if( _exh->get_header().variant == 2 ) + baseOffset = cacheEntry.second.offset + ( i * _exh->get_header().data_offset + 2 * ( i + 1 ) ); + + for( auto& memberEntry : _exh->get_exh_members() ) + //for( auto& member_entry : _exh->get_members() ) + { + // Switch depending on the type to extract + switch( memberEntry.type ) + { + case DataType::string: + // Extract the offset to the actual string + // Then extract the actual string from that offset + { + if( _exh->get_header().variant == 1 ) + { + auto stringOffset = extract< uint32_t >( dataCpy, baseOffset + memberEntry.offset, false ); + fields.emplace_back( utils::bparse::extract_cstring( dataCpy, stringBaseOffset + stringOffset ) ); + } + else if( _exh->get_header().variant == 2 ) + { + throw std::runtime_error( "String not implemented for variant 2!" ); + } + } + break; + + case DataType::boolean: + fields.emplace_back( extract< bool >( dataCpy, baseOffset + memberEntry.offset ) ); + break; + + case DataType::int8: + fields.emplace_back( extract< int8_t >( dataCpy, baseOffset + memberEntry.offset ) ); + break; + + case DataType::uint8: + fields.emplace_back( extract< uint8_t >( dataCpy, baseOffset + memberEntry.offset ) ); + break; + + case DataType::int16: + fields.emplace_back( extract< int16_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::uint16: + fields.emplace_back( extract< uint16_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::int32: + fields.emplace_back( extract< int32_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::uint32: + fields.emplace_back( extract< uint32_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::float32: + fields.emplace_back( extract< float >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + case DataType::uint64: + fields.emplace_back( extract< uint64_t >( dataCpy, baseOffset + memberEntry.offset, false ) ); + break; + + default: + auto type = static_cast< uint16_t >( memberEntry.type ); + if( type < 0x19 || type > 0x20 ) + throw std::runtime_error( "Unknown DataType: " + std::to_string( type ) ); + fields.emplace_back( ( extract< uint8_t >( dataCpy, baseOffset + memberEntry.offset ) & ( 1 << ( type - 0x19 ) ) ) != 0 ); + break; + } + } + } + } + return data; + + } - struct ExdHeader - { - char magic[0x4]; - uint16_t unknown; - uint16_t unknown2; - uint32_t index_size; - }; - - struct ExdRecordIndex - { - uint32_t id; - uint32_t offset; - }; - - } -} - -namespace xiv -{ - namespace utils - { - namespace bparse - { - template <> inline void reorder( xiv::exd::ExdHeader& i_struct ) { for( int32_t i = 0; i < 0x4; ++i ) { xiv::utils::bparse::reorder( i_struct.magic[i] ); } i_struct.unknown = xiv::utils::bparse::byteswap( i_struct.unknown ); xiv::utils::bparse::reorder( i_struct.unknown ); i_struct.unknown2 = xiv::utils::bparse::byteswap( i_struct.unknown2 ); xiv::utils::bparse::reorder( i_struct.unknown2 ); i_struct.index_size = xiv::utils::bparse::byteswap( i_struct.index_size ); xiv::utils::bparse::reorder( i_struct.index_size ); } - template <> inline void reorder( xiv::exd::ExdRecordIndex& i_struct ) { i_struct.id = xiv::utils::bparse::byteswap( i_struct.id ); xiv::utils::bparse::reorder( i_struct.id ); i_struct.offset = xiv::utils::bparse::byteswap( i_struct.offset ); xiv::utils::bparse::reorder( i_struct.offset ); } - } - } -}; - -namespace xiv -{ - namespace exd - { - - Exd::Exd( std::shared_ptr i_exh, const std::vector>& i_files ) - { - _exh = i_exh; - _files = i_files; - - - // Iterates over all the files - const uint32_t member_count = _exh->get_members().size(); - for ( auto &file_ptr : _files ) - { - // Get a stream - std::vector< char > dataCpy = file_ptr->get_data_sections().front(); - std::istringstream iss( std::string( dataCpy.begin(), dataCpy.end() ) ); - - // Extract the header and skip to the record indices - auto exd_header = extract< ExdHeader >( iss ); - iss.seekg( 0x20 ); - - // Preallocate and extract the record_indices - const uint32_t record_count = exd_header.index_size / sizeof( ExdRecordIndex ); - std::vector< ExdRecordIndex > record_indices; - record_indices.reserve( record_count ); - for ( uint32_t i = 0; i < record_count; ++i ) - { - auto recordIndex = extract< ExdRecordIndex >( iss ); - _idCache[recordIndex.id] = ExdCacheEntry{file_ptr, recordIndex.offset}; - } - } - } - - Exd::~Exd() - { - } - - const std::vector Exd::get_row( uint32_t id, uint32_t subRow ) - { - - auto cacheEntryIt = _idCache.find( id ); - if( cacheEntryIt == _idCache.end() ) - throw std::runtime_error( "Id not found: " + std::to_string( id ) ); - - // Iterates over all the files - const uint32_t member_count = _exh->get_members().size(); - auto& file_ptr = cacheEntryIt->second.file; - - std::vector< char > dataCpy = file_ptr->get_data_sections().front(); - std::istringstream iss( std::string( dataCpy.begin(), dataCpy.end() ) ); - - // Get the vector fields for the given record and preallocate it - auto fields = _data[id]; - fields.reserve( member_count ); - iss.seekg( cacheEntryIt->second.offset + 6 ); - - uint8_t subRows = *reinterpret_cast< uint8_t* >( &dataCpy[ cacheEntryIt->second.offset + 5 ] ); - - if( subRow >= subRows ) - throw std::runtime_error( "Out of bounds sub-row!" ); - - int offset = cacheEntryIt->second.offset + 6 + ( subRow * _exh->get_header().data_offset + 2 * ( subRow + 1 ) ); - - for( auto& member_entry : _exh->get_exh_members() ) - { - // Seek to the position of the member to extract. - // 6 is because we have uint32_t/uint16_t at the start of each record - iss.seekg( offset + member_entry.offset ); - - // Switch depending on the type to extract - switch( member_entry.type ) - { - case DataType::string: - // Extract the offset to the actual string - // Seek to it then extract the actual string - { - throw std::runtime_error( "String not implemented for variant 2!" ); - //auto string_offset = extract( iss, "string_offset", false ); - //iss.seekg( cacheEntryIt->second.offset + 6 + _exh->get_header().data_offset + string_offset ); - //fields.emplace_back( utils::bparse::extract_cstring( iss, "string" ) ); - } - break; - - case DataType::boolean: - fields.emplace_back( extract( iss, "bool" ) ); - break; - - case DataType::int8: - fields.emplace_back( extract( iss, "int8_t" ) ); - break; - - case DataType::uint8: - fields.emplace_back( extract( iss, "uint8_t" ) ); - break; - - case DataType::int16: - fields.emplace_back( extract( iss, "int16_t", false ) ); - break; - - case DataType::uint16: - fields.emplace_back( extract( iss, "uint16_t", false ) ); - break; - - case DataType::int32: - fields.emplace_back( extract( iss, "int32_t", false ) ); - break; - - case DataType::uint32: - fields.emplace_back( extract( iss, "uint32_t", false ) ); - break; - - case DataType::float32: - fields.emplace_back( extract( iss, "float", false ) ); - break; - - case DataType::uint64: - fields.emplace_back( extract( iss, "uint64_t", false ) ); - break; - - default: - auto type = static_cast< uint16_t >( member_entry.type ); - if( type < 0x19 || type > 0x20 ) - throw std::runtime_error("Unknown DataType: " + std::to_string( type )); - uint64_t val = extract< uint64_t >( iss, "bool" ); - int32_t shift = type - 0x19; - int32_t i = 1 << shift; - val &= i; - fields.emplace_back( ( val & i ) == i ); - break; - } - } - return fields; - - } - - - const std::vector Exd::get_row( uint32_t id ) - { - - auto cacheEntryIt = _idCache.find( id ); - if( cacheEntryIt == _idCache.end() ) - throw std::runtime_error( "Id not found: " + std::to_string( id ) ); - - // Iterates over all the files - const uint32_t member_count = _exh->get_members().size(); - auto& file_ptr = cacheEntryIt->second.file; - - std::vector< char > dataCpy = file_ptr->get_data_sections().front(); - std::istringstream iss( std::string( dataCpy.begin(), dataCpy.end() ) ); - - // Get the vector fields for the given record and preallocate it - auto fields = _data[id]; - fields.reserve( member_count ); - iss.seekg( cacheEntryIt->second.offset + 6 ); - - uint8_t subRows = *reinterpret_cast< uint8_t* >( &dataCpy[ cacheEntryIt->second.offset + 5 ] ); - - for( auto& member_entry : _exh->get_exh_members() ) - { - // Seek to the position of the member to extract. - // 6 is because we have uint32_t/uint16_t at the start of each record - iss.seekg( cacheEntryIt->second.offset + 6 + member_entry.offset ); - - // Switch depending on the type to extract - switch( member_entry.type ) - { - case DataType::string: - // Extract the offset to the actual string - // Seek to it then extract the actual string - { - auto string_offset = extract( iss, "string_offset", false ); - iss.seekg( cacheEntryIt->second.offset + 6 + _exh->get_header().data_offset + string_offset ); - fields.emplace_back( utils::bparse::extract_cstring( iss, "string" ) ); - } - break; - - case DataType::boolean: - fields.emplace_back( extract( iss, "bool" ) ); - break; - - case DataType::int8: - fields.emplace_back( extract( iss, "int8_t" ) ); - break; - - case DataType::uint8: - fields.emplace_back( extract( iss, "uint8_t" ) ); - break; - - case DataType::int16: - fields.emplace_back( extract( iss, "int16_t", false ) ); - break; - - case DataType::uint16: - fields.emplace_back( extract( iss, "uint16_t", false ) ); - break; - - case DataType::int32: - fields.emplace_back( extract( iss, "int32_t", false ) ); - break; - - case DataType::uint32: - fields.emplace_back( extract( iss, "uint32_t", false ) ); - break; - - case DataType::float32: - fields.emplace_back( extract( iss, "float", false ) ); - break; - - case DataType::uint64: - fields.emplace_back( extract( iss, "uint64_t", false ) ); - break; - - default: - auto type = static_cast< uint16_t >( member_entry.type ); - if( type < 0x19 || type > 0x20 ) - throw std::runtime_error("Unknown DataType: " + std::to_string( type )); - uint64_t val = extract< uint64_t >( iss, "bool" ); - int32_t shift = type - 0x19; - int32_t i = 1 << shift; - val &= i; - fields.emplace_back( ( val & i ) == i ); - break; - } - } - return fields; - - } - - // Get all rows - const std::map>& Exd::get_rows() - { - // Iterates over all the files - const uint32_t member_count = _exh->get_members().size(); - for( auto& file_ptr : _files ) - { - // Get a stream - std::vector< char > dataCpy = file_ptr->get_data_sections().front(); - std::istringstream iss( std::string( dataCpy.begin(), dataCpy.end() ) ); - - // Extract the header and skip to the record indices - auto exd_header = extract( iss ); - iss.seekg( 0x20 ); - - // Preallocate and extract the record_indices - const uint32_t record_count = exd_header.index_size / sizeof( ExdRecordIndex ); - std::vector record_indices; - record_indices.reserve( record_count ); - for( uint32_t i = 0; i < record_count; ++i ) - { - record_indices.emplace_back( extract( iss ) ); - } - - for( auto& record_index : record_indices ) - { - // Get the vector fields for the given record and preallocate it - auto& fields = _data[record_index.id]; - fields.reserve( member_count ); - - for( auto& member_entry : _exh->get_exh_members() ) - //for( auto& member_entry : _exh->get_members() ) - { - // Seek to the position of the member to extract. - // 6 is because we have uint32_t/uint16_t at the start of each record - iss.seekg( record_index.offset + 6 + member_entry.offset ); - - // Switch depending on the type to extract - switch( member_entry.type ) - { - case DataType::string: - // Extract the offset to the actual string - // Seek to it then extract the actual string - { - auto string_offset = extract( iss, "string_offset", false ); - iss.seekg( record_index.offset + 6 + _exh->get_header().data_offset + string_offset ); - fields.emplace_back( utils::bparse::extract_cstring( iss, "string" ) ); - } - break; - - case DataType::boolean: - fields.emplace_back( extract( iss, "bool" ) ); - break; - - case DataType::int8: - fields.emplace_back( extract( iss, "int8_t" ) ); - break; - - case DataType::uint8: - fields.emplace_back( extract( iss, "uint8_t" ) ); - break; - - case DataType::int16: - fields.emplace_back( extract( iss, "int16_t", false ) ); - break; - - case DataType::uint16: - fields.emplace_back( extract( iss, "uint16_t", false ) ); - break; - - case DataType::int32: - fields.emplace_back( extract( iss, "int32_t", false ) ); - break; - - case DataType::uint32: - fields.emplace_back( extract( iss, "uint32_t", false ) ); - break; - - case DataType::float32: - fields.emplace_back( extract( iss, "float", false ) ); - break; - - case DataType::uint64: - fields.emplace_back( extract( iss, "uint64_t", false ) ); - break; - - default: - auto type = static_cast< uint16_t >( member_entry.type ); - if( type < 0x19 || type > 0x20 ) - throw std::runtime_error("Unknown DataType: " + std::to_string( type )); - uint64_t val = extract< uint64_t >( iss, "bool" ); - int32_t shift = type - 0x19; - int32_t i = 1 << shift; - val &= i; - fields.emplace_back( ( val & i ) == i ); - break; - } - } - } - } - return _data; - } - - } } diff --git a/deps/datReader/Exd.h b/deps/datReader/Exd.h index c504176b..30a9e9e0 100644 --- a/deps/datReader/Exd.h +++ b/deps/datReader/Exd.h @@ -3,20 +3,20 @@ #include #include +#include +#include #include #include "File.h" -namespace xiv -{ -namespace exd +namespace xiv::exd { -class Exh; + class Exh; -// Field type containing all the possible types in the data files -using Field = std::variant< + // Field type containing all the possible types in the data files + using Field = std::variant< std::string, bool, int8_t, @@ -27,40 +27,59 @@ using Field = std::variant< uint32_t, float, uint64_t >; - -struct ExdCacheEntry -{ - std::shared_ptr file; - uint32_t offset; -}; -// Data for a given language -class Exd -{ -public: - // i_exh: the header - // i_files: the multiple exd files - Exd() {} - Exd(std::shared_ptr i_exh, const std::vector>& i_files); + struct ExdCacheEntry + { + std::shared_ptr< dat::File > file; + uint32_t offset; + uint8_t subRows; + }; + + struct ExdRow + { + uint32_t rowId; + uint8_t subRowId; + }; + + struct exdRowSort + { + constexpr bool operator()( const ExdRow& _Left, const ExdRow& _Right ) const + { + if( _Left.rowId == _Right.rowId ) + return _Left.subRowId < _Right.subRowId; + + return _Left.rowId < _Right.rowId; + } + }; + + // Data for a given language + class Exd + { + public: + // exh: the header + // files: the multiple exd files + Exd() + { + } + + Exd( std::shared_ptr< Exh > exh, const std::vector< std::shared_ptr< dat::File > >& files ); + ~Exd(); // Get a row by its id - const std::vector get_row(uint32_t id); + const std::vector< Field > get_row( uint32_t id ); // Get a row by its id and sub-row - const std::vector get_row(uint32_t id, uint32_t subRow); + const std::vector< Field > get_row( uint32_t id, uint32_t subRow ); + // Get all rows - const std::map>& get_rows(); + const std::map< ExdRow, std::vector< Field >, exdRowSort > get_rows(); -protected: - // Data indexed by the ID of the row, the vector is field with the same order as exh.members - std::map> _data; - std::vector> _files; - std::shared_ptr _exh; + protected: + std::shared_ptr< Exh > _exh; std::map< uint32_t, ExdCacheEntry > _idCache; -}; + }; -} } #endif // XIV_EXD_EXD_H diff --git a/deps/datReader/ExdCat.cpp b/deps/datReader/ExdCat.cpp index ddab260e..ebf75ec7 100644 --- a/deps/datReader/ExdCat.cpp +++ b/deps/datReader/ExdCat.cpp @@ -9,74 +9,73 @@ namespace { - // Suffix of the filenames given a language - std::map language_map = - {{xiv::exd::Language::none, ""}, - {xiv::exd::Language::ja, "_ja"}, - {xiv::exd::Language::en, "_en"}, - {xiv::exd::Language::de, "_de"}, - {xiv::exd::Language::fr, "_fr"}, - {xiv::exd::Language::chs, "_chs"}}; + // Suffix of the filenames given a language + std::map language_map = + { + {xiv::exd::Language::none, ""}, + {xiv::exd::Language::ja, "_ja"}, + {xiv::exd::Language::en, "_en"}, + {xiv::exd::Language::de, "_de"}, + {xiv::exd::Language::fr, "_fr"}, + {xiv::exd::Language::chs, "_chs"} + }; } -namespace xiv +namespace xiv::exd { - namespace exd - { + Cat::Cat( dat::GameData& i_game_data, const std::string& i_name ) : + _name( i_name ) + { + //XIV_INFO(xiv_exd_logger, "Initializing Cat with name: " << i_name); + // creates the header .exh + { + auto header_file = i_game_data.getFile( "exd/" + i_name + ".exh" ); + _header = std::shared_ptr< Exh >( new Exh( *header_file ) ); - Cat::Cat(dat::GameData& i_game_data, const std::string& i_name) : - _name(i_name) + } + + for( auto language: _header->get_languages() ) + { + // chs not yet in data files + if( language == Language::en || language == Language::none ) { - //XIV_INFO(xiv_exd_logger, "Initializing Cat with name: " << i_name); - // creates the header .exh - { - auto header_file = i_game_data.getFile("exd/" + i_name + ".exh"); - _header = std::shared_ptr< Exh >( new Exh( *header_file ) ); - - } - - for(auto language: _header->get_languages()) - { - // chs not yet in data files - if (language == Language::en || language == Language::none) - { - // Get all the files for a given category/language, in case of multiple range of IDs in separate files (like Quest) - std::vector> files; - for(auto& exd_def: _header->get_exd_defs()) - { - files.emplace_back( i_game_data.getFile("exd/" + i_name + "_" + std::to_string(exd_def.start_id) + language_map.at(language) + ".exd") ); - } - // Instantiate the data for this language - _data[language] = std::unique_ptr(new Exd(_header, files)); - } - } + // Get all the files for a given category/language, in case of multiple range of IDs in separate files (like Quest) + std::vector< std::shared_ptr< dat::File>> files; + for( auto& exd_def: _header->get_exd_defs() ) + { + files.emplace_back( i_game_data.getFile( + "exd/" + i_name + "_" + std::to_string( exd_def.start_id ) + language_map.at( language ) + ".exd" ) ); + } + // Instantiate the data for this language + _data[ language ] = std::make_unique< Exd >( _header, files ); } + } + } - Cat::~Cat() - { + Cat::~Cat() + { - } + } - const std::string& Cat::get_name() const - { - return _name; - } + const std::string& Cat::get_name() const + { + return _name; + } - const Exh& Cat::get_header() const - { - return *_header; - } + const Exh& Cat::get_header() const + { + return *_header; + } - const Exd& Cat::get_data_ln(Language i_language) const - { - auto ln_it = _data.find(i_language); - if (ln_it == _data.end()) - { - throw std::runtime_error("No data for language: " + std::to_string(uint16_t(i_language))); - } + const Exd& Cat::get_data_ln( Language i_language ) const + { + auto ln_it = _data.find( i_language ); + if( ln_it == _data.end() ) + { + throw std::runtime_error( "No data for language: " + std::to_string( uint16_t( i_language ) ) ); + } - return *(ln_it->second); - } + return *( ln_it->second ); + } - } } diff --git a/deps/datReader/ExdCat.h b/deps/datReader/ExdCat.h index af1090d8..e22ec036 100644 --- a/deps/datReader/ExdCat.h +++ b/deps/datReader/ExdCat.h @@ -4,7 +4,7 @@ #include #include -#include +#include #include "bparse.h" #include "Exd.h" diff --git a/deps/datReader/ExdData.cpp b/deps/datReader/ExdData.cpp index 3c4af47a..5307f5de 100644 --- a/deps/datReader/ExdData.cpp +++ b/deps/datReader/ExdData.cpp @@ -7,50 +7,47 @@ #include "ExdCat.h" -namespace xiv -{ -namespace exd +namespace xiv::exd { + +ExdData::ExdData( dat::GameData& i_game_data ) try : + _game_data( i_game_data ) { + //XIV_INFO(xiv_exd_logger, "Initializing ExdData"); -ExdData::ExdData(dat::GameData& i_game_data) try : - _game_data(i_game_data) -{ - //XIV_INFO(xiv_exd_logger, "Initializing ExdData"); + // Fetch the root.exl and get a stream from it + auto root_exl = i_game_data.getFile( "exd/root.exl" ); + std::vector< char > dataCpy = root_exl->get_data_sections().front(); + xiv::utils::stream::vectorwrapbuf< char > databuf( dataCpy ); + std::istream stream( &databuf ); - // Fetch the root.exl and get a stream from it - auto root_exl = i_game_data.getFile("exd/root.exl"); - std::vector< char > dataCpy = root_exl->get_data_sections().front(); - xiv::utils::stream::vectorwrapbuf databuf(dataCpy); - std::istream stream(&databuf); + // Iterates over the lines while skipping the first one + std::string line; + std::getline( stream, line ); // extract first line EXLT,2 + std::getline( stream, line ); - // Iterates over the lines while skipping the first one - std::string line; - std::getline(stream, line); // extract first line EXLT,2 - std::getline(stream, line); + // Until the EOF + while( !line.empty() ) + { + // Format is cat_name,XX + // XX being an internal identifier + // Get only the cat_name + auto sep = line.find( ',' ); + auto category = line.substr( 0, sep ); - // Until the EOF - while (!line.empty()) - { - // Format is cat_name,XX - // XX being an internal identifier - // Get only the cat_name - auto sep = line.find(','); - auto category = line.substr(0, sep); + // Add to the list of category name + // creates the empty category in the cats map + // instantiate the creation mutex for this category + _cat_names.push_back( category ); + _cats[ category ] = std::unique_ptr< Cat >(); + _cat_creation_mutexes[ category ] = std::make_unique< std::mutex >(); - // Add to the list of category name - // creates the empty category in the cats map - // instantiate the creation mutex for this category - _cat_names.push_back(category); - _cats[category] = std::unique_ptr(); - _cat_creation_mutexes[category] = std::unique_ptr(new std::mutex()); - - std::getline(stream, line); - } + std::getline( stream, line ); + } } -catch(std::exception& e) +catch( std::exception& e ) { - // In case of failure here, client is supposed to catch the exception because it is not recoverable on our side - throw std::runtime_error( "ExdData initialization failed: " + std::string( e.what() ) ); + // In case of failure here, client is supposed to catch the exception because it is not recoverable on our side + throw std::runtime_error( "ExdData initialization failed: " + std::string( e.what() ) ); } ExdData::~ExdData() @@ -58,43 +55,42 @@ ExdData::~ExdData() } -const std::vector& ExdData::get_cat_names() const +const std::vector< std::string >& ExdData::get_cat_names() const { - return _cat_names; + return _cat_names; } -const Cat& ExdData::get_category(const std::string& i_cat_name) +const Cat& ExdData::get_category( const std::string& i_cat_name ) { - // Get the category from its name - auto cat_it = _cats.find(i_cat_name); - if (cat_it == _cats.end()) - { - throw std::runtime_error("Category not found: " + i_cat_name); - } + // Get the category from its name + auto cat_it = _cats.find( i_cat_name ); + if( cat_it == _cats.end() ) + { + throw std::runtime_error( "Category not found: " + i_cat_name ); + } - if (cat_it->second) - { - // If valid return it - return *(cat_it->second); - } - else - { - // If not, create it and return it - create_category(i_cat_name); - return *(_cats[i_cat_name]); - } + if( cat_it->second ) + { + // If valid return it + return *( cat_it->second ); + } + else + { + // If not, create it and return it + create_category( i_cat_name ); + return *( _cats[ i_cat_name ] ); + } } -void ExdData::create_category(const std::string& i_cat_name) +void ExdData::create_category( const std::string& i_cat_name ) { - // Lock mutex in this scope - std::lock_guard lock(*(_cat_creation_mutexes[i_cat_name])); - // Maybe after unlocking it has already been created, so check (most likely if it blocked) - if (!_cats[i_cat_name]) - { - _cats[i_cat_name] = std::unique_ptr(new Cat(_game_data, i_cat_name)); - } + // Lock mutex in this scope + std::lock_guard< std::mutex > lock( *( _cat_creation_mutexes[ i_cat_name ] ) ); + // Maybe after unlocking it has already been created, so check (most likely if it blocked) + if( !_cats[ i_cat_name ] ) + { + _cats[ i_cat_name ] = std::make_unique< Cat >( _game_data, i_cat_name ); + } } } -} diff --git a/deps/datReader/ExdData.h b/deps/datReader/ExdData.h index c6ca6170..c7c61626 100644 --- a/deps/datReader/ExdData.h +++ b/deps/datReader/ExdData.h @@ -5,7 +5,8 @@ #include #include -#include +#include +#include namespace xiv { @@ -34,7 +35,7 @@ namespace xiv const Cat& get_category(const std::string& i_cat_name); // Export in csv in base flder i_ouput_path - void export_as_csvs(const std::experimental::filesystem::path& i_output_path); + void export_as_csvs(const std::filesystem::path& i_output_path); protected: // Lazy instantiation of category diff --git a/deps/datReader/Exh.cpp b/deps/datReader/Exh.cpp index 0a829bec..a8c300b8 100644 --- a/deps/datReader/Exh.cpp +++ b/deps/datReader/Exh.cpp @@ -7,71 +7,69 @@ using xiv::utils::bparse::extract; -namespace xiv -{ -namespace exd -{ -Exh::Exh(const dat::File& i_file) +namespace xiv::exd { + + Exh::Exh( const dat::File& i_file ) + { // Get a stream from the file std::vector< char > dataCpy = i_file.get_data_sections().front(); std::istringstream iss( std::string( dataCpy.begin(), dataCpy.end() ) ); // Extract header and skip to member definitions - _header = extract(iss); - iss.seekg(0x20); + _header = extract< ExhHeader >( iss ); + iss.seekg( 0x20 ); // Extract all the members and feed the _members map - for (auto i = 0; i < _header.field_count; ++i) + for( auto i = 0; i < _header.field_count; ++i ) { - auto member = extract(iss); - _members[member.offset] = member; - _exh_defs.push_back( member ); + auto member = extract< ExhMember >( iss ); + _members[ member.offset ] = member; + _exh_defs.push_back( member ); } // Extract all the exd_defs - _exd_defs.reserve(_header.exd_count); - for (auto i = 0; i < _header.exd_count; ++i) + _exd_defs.reserve( _header.exd_count ); + for( auto i = 0; i < _header.exd_count; ++i ) { - _exd_defs.emplace_back(extract(iss)); + _exd_defs.emplace_back( extract< ExhExdDef >( iss ) ); } // Extract all the languages - _languages.reserve(_header.language_count); - for (auto i = 0; i < _header.language_count; ++i) + _languages.reserve( _header.language_count ); + for( auto i = 0; i < _header.language_count; ++i ) { - _languages.emplace_back(Language(extract(iss, "language"))); + _languages.emplace_back( Language( extract< uint16_t >( iss, "language" ) ) ); } -} + } -Exh::~Exh() -{ -} + Exh::~Exh() + { + } -const ExhHeader& Exh::get_header() const -{ + const ExhHeader& Exh::get_header() const + { return _header; -} + } -const std::vector& Exh::get_exd_defs() const -{ + const std::vector< ExhExdDef >& Exh::get_exd_defs() const + { return _exd_defs; -} + } -const std::vector& Exh::get_languages() const -{ + const std::vector< Language >& Exh::get_languages() const + { return _languages; -} + } -const std::map& Exh::get_members() const -{ + const std::map< uint32_t, ExhMember >& Exh::get_members() const + { return _members; -} + } -const std::vector& Exh::get_exh_members() const -{ - return _exh_defs; -} + const std::vector< ExhMember >& Exh::get_exh_members() const + { + return _exh_defs; + } } -} diff --git a/deps/datReader/Exh.h b/deps/datReader/Exh.h index be273185..37301d0b 100644 --- a/deps/datReader/Exh.h +++ b/deps/datReader/Exh.h @@ -5,99 +5,131 @@ #include "bparse.h" -namespace xiv +namespace xiv::exd { - namespace exd - { - enum class DataType : uint16_t - { - string = 0, - boolean = 1, - int8 = 2, - uint8 = 3, - int16 = 4, - uint16 = 5, - int32 = 6, - uint32 = 7, - float32 = 9, - uint64 = 11, - }; + enum class DataType : + uint16_t + { + string = 0, + boolean = 1, + int8 = 2, + uint8 = 3, + int16 = 4, + uint16 = 5, + int32 = 6, + uint32 = 7, + float32 = 9, + uint64 = 11, + }; - struct ExhHeader - { - char magic[0x4]; - uint16_t unknown; - uint16_t data_offset; - uint16_t field_count; - uint16_t exd_count; - uint16_t language_count; - uint16_t unknown1; - uint8_t u2; - uint8_t variant; - }; + struct ExhHeader + { + char magic[0x4]; + uint16_t unknown; + uint16_t data_offset; + uint16_t field_count; + uint16_t exd_count; + uint16_t language_count; + uint16_t unknown1; + uint8_t u2; + uint8_t variant; + }; - struct ExhMember - { - DataType type; - uint16_t offset; - }; + struct ExhMember + { + DataType type; + uint16_t offset; + }; - struct ExhExdDef - { - uint32_t start_id; - uint32_t count_id; - }; - } + struct ExhExdDef + { + uint32_t start_id; + uint32_t count_id; + }; +}; + +namespace xiv::utils::bparse { +template<> +inline void reorder< xiv::exd::ExhHeader >( xiv::exd::ExhHeader& i_struct ) +{ + for( int32_t i = 0; i < 0x4; ++i ) + { + xiv::utils::bparse::reorder( i_struct.magic[ i ] ); + } + i_struct.unknown = xiv::utils::bparse::byteswap( i_struct.unknown ); + xiv::utils::bparse::reorder( i_struct.unknown ); + i_struct.data_offset = xiv::utils::bparse::byteswap( i_struct.data_offset ); + xiv::utils::bparse::reorder( i_struct.data_offset ); + i_struct.field_count = xiv::utils::bparse::byteswap( i_struct.field_count ); + xiv::utils::bparse::reorder( i_struct.field_count ); + i_struct.exd_count = xiv::utils::bparse::byteswap( i_struct.exd_count ); + xiv::utils::bparse::reorder( i_struct.exd_count ); + i_struct.language_count = xiv::utils::bparse::byteswap( i_struct.language_count ); + xiv::utils::bparse::reorder( i_struct.language_count ); +} + +template<> +inline void reorder< xiv::exd::ExhMember >( xiv::exd::ExhMember& i_struct ) +{ + i_struct.type = xiv::utils::bparse::byteswap( i_struct.type ); + xiv::utils::bparse::reorder( i_struct.type ); + i_struct.offset = xiv::utils::bparse::byteswap( i_struct.offset ); + xiv::utils::bparse::reorder( i_struct.offset ); +} + +template<> +inline void reorder< xiv::exd::ExhExdDef >( xiv::exd::ExhExdDef& i_struct ) +{ + i_struct.start_id = xiv::utils::bparse::byteswap( i_struct.start_id ); + xiv::utils::bparse::reorder( i_struct.start_id ); + i_struct.count_id = xiv::utils::bparse::byteswap( i_struct.count_id ); + xiv::utils::bparse::reorder( i_struct.count_id ); +} }; namespace xiv { - namespace utils - { - namespace bparse - { - template <> inline void reorder( xiv::exd::ExhHeader& i_struct ) { for( int32_t i = 0; i < 0x4; ++i ) { xiv::utils::bparse::reorder( i_struct.magic[i] ); } i_struct.unknown = xiv::utils::bparse::byteswap( i_struct.unknown ); xiv::utils::bparse::reorder( i_struct.unknown ); i_struct.data_offset = xiv::utils::bparse::byteswap( i_struct.data_offset ); xiv::utils::bparse::reorder( i_struct.data_offset ); i_struct.field_count = xiv::utils::bparse::byteswap( i_struct.field_count ); xiv::utils::bparse::reorder( i_struct.field_count ); i_struct.exd_count = xiv::utils::bparse::byteswap( i_struct.exd_count ); xiv::utils::bparse::reorder( i_struct.exd_count ); i_struct.language_count = xiv::utils::bparse::byteswap( i_struct.language_count ); xiv::utils::bparse::reorder( i_struct.language_count ); } - template <> inline void reorder( xiv::exd::ExhMember& i_struct ) { i_struct.type = xiv::utils::bparse::byteswap( i_struct.type ); xiv::utils::bparse::reorder( i_struct.type ); i_struct.offset = xiv::utils::bparse::byteswap( i_struct.offset ); xiv::utils::bparse::reorder( i_struct.offset ); } - template <> inline void reorder( xiv::exd::ExhExdDef& i_struct ) { i_struct.start_id = xiv::utils::bparse::byteswap( i_struct.start_id ); xiv::utils::bparse::reorder( i_struct.start_id ); i_struct.count_id = xiv::utils::bparse::byteswap( i_struct.count_id ); xiv::utils::bparse::reorder( i_struct.count_id ); } - } - } -}; -namespace xiv -{ - namespace dat - { - class File; - } - namespace exd - { + namespace dat + { + class File; + } - enum Language : uint16_t; + namespace exd + { - // Header file for exd data - class Exh - { - public: - // The header file - Exh( const dat::File& i_file ); - ~Exh(); + enum Language : + uint16_t; - const ExhHeader& get_header() const; - const std::vector& get_exd_defs() const; - const std::vector& get_languages() const; - const std::map& get_members() const; - const std::vector& get_exh_members() const; + // Header file for exd data + class Exh + { + public: + // The header file + Exh( const dat::File& i_file ); - protected: - ExhHeader _header; - // Members of the datastruct ordered(indexed) by offset - std::map _members; - std::vector _exh_defs; - std::vector _exd_defs; - std::vector _languages; - }; + ~Exh(); - } + const ExhHeader& get_header() const; + + const std::vector< ExhExdDef >& get_exd_defs() const; + + const std::vector< Language >& get_languages() const; + + const std::map< uint32_t, ExhMember >& get_members() const; + + const std::vector< ExhMember >& get_exh_members() const; + + protected: + ExhHeader _header; + // Members of the datastruct ordered(indexed) by offset + std::map< uint32_t, ExhMember > _members; + std::vector< ExhMember > _exh_defs; + std::vector< ExhExdDef > _exd_defs; + std::vector< Language > _languages; + }; + + } } #endif // XIV_EXD_EXH_H diff --git a/deps/datReader/File.cpp b/deps/datReader/File.cpp index 9559159d..e83659c1 100644 --- a/deps/datReader/File.cpp +++ b/deps/datReader/File.cpp @@ -2,44 +2,41 @@ #include -namespace xiv -{ -namespace dat +namespace xiv::dat { -File::File() : - _type(FileType::empty) -{ -} + File::File() : + _type( FileType::empty ) + { + } -File::~File() -{ -} + File::~File() + { + } -FileType File::get_type() const -{ - return _type; -} + FileType File::get_type() const + { + return _type; + } -const std::vector>& File::get_data_sections() const -{ - return _data_sections; -} + const std::vector< std::vector< char>>& File::get_data_sections() const + { + return _data_sections; + } -std::vector>& File::access_data_sections() -{ - return _data_sections; -} + std::vector< std::vector< char>>& File::access_data_sections() + { + return _data_sections; + } -void File::exportToFile(const std::experimental::filesystem::path& i_path) const -{ - std::ofstream ofs( i_path.string(), std::ios_base::binary | std::ios_base::out ); - for( auto& data_section : _data_sections ) - { + void File::exportToFile( const std::filesystem::path& i_path ) const + { + std::ofstream ofs( i_path.string(), std::ios_base::binary | std::ios_base::out ); + for( auto& data_section : _data_sections ) + { ofs.write( data_section.data(), data_section.size() ); - } - ofs.close(); -} + } + ofs.close(); + } } -} diff --git a/deps/datReader/File.h b/deps/datReader/File.h index 1d09e78e..31c12fbe 100644 --- a/deps/datReader/File.h +++ b/deps/datReader/File.h @@ -3,54 +3,46 @@ #include -#include +#include #include #include "bparse.h" - -namespace xiv +namespace xiv::dat { - namespace dat - { - enum class FileType : uint32_t - { - empty = 1, - standard = 2, - model = 3, - texture = 4, - }; - } -}; + enum class FileType : + uint32_t + { + empty = 1, + standard = 2, + model = 3, + texture = 4, + }; -namespace xiv -{ - namespace dat - { + class Dat; - class Dat; + // Basic file from the dats + class File + { + friend class Dat; - // Basic file from the dats - class File - { - friend class Dat; - public: - File(); - ~File(); + public: + File(); - FileType get_type() const; + ~File(); - // Getters functions for the data in the file - const std::vector>& get_data_sections() const; - std::vector>& access_data_sections(); + FileType get_type() const; - void exportToFile( const std::experimental::filesystem::path& i_path ) const; + // Getters functions for the data in the file + const std::vector< std::vector< char>>& get_data_sections() const; - protected: - FileType _type; - std::vector> _data_sections; - }; + std::vector< std::vector< char>>& access_data_sections(); - } + void exportToFile( const std::filesystem::path& i_path ) const; + + protected: + FileType _type; + std::vector< std::vector< char>> _data_sections; + }; } #endif // XIV_DAT_FILE_H diff --git a/deps/datReader/GameData.cpp b/deps/datReader/GameData.cpp index 4b4a71e4..f3e56537 100644 --- a/deps/datReader/GameData.cpp +++ b/deps/datReader/GameData.cpp @@ -11,312 +11,315 @@ #include "DatCat.h" #include "File.h" -namespace -{ - // Relation between category number and category name - // These names are taken straight from the exe, it helps resolve dispatching when getting files by path +namespace { +// Relation between category number and category name +// These names are taken straight from the exe, it helps resolve dispatching when getting files by path - std::unordered_map< std::string, uint32_t > categoryNameToIdMap = - {{"common", 0x00}, - {"bgcommon", 0x01}, - {"bg", 0x02}, - {"cut", 0x03}, - {"chara", 0x04}, - {"shader", 0x05}, - {"ui", 0x06}, - {"sound", 0x07}, - {"vfx", 0x08}, - {"ui_script", 0x09}, - {"exd", 0x0A}, - {"game_script", 0x0B}, - {"music", 0x0C} - }; +std::unordered_map< std::string, uint32_t > categoryNameToIdMap = + { { "common", 0x00 }, + { "bgcommon", 0x01 }, + { "bg", 0x02 }, + { "cut", 0x03 }, + { "chara", 0x04 }, + { "shader", 0x05 }, + { "ui", 0x06 }, + { "sound", 0x07 }, + { "vfx", 0x08 }, + { "ui_script", 0x09 }, + { "exd", 0x0A }, + { "game_script", 0x0B }, + { "music", 0x0C } + }; - std::unordered_map< uint32_t, std::string > categoryIdToNameMap = - {{0x00, "common"}, - {0x01, "bgcommon"}, - {0x02, "bg"}, - {0x03, "cut"}, - {0x04, "chara"}, - {0x05, "shader"}, - {0x06, "ui"}, - {0x07, "sound"}, - {0x08, "vfx"}, - {0x09, "ui_script"}, - {0x0A, "exd"}, - {0x0B, "game_script"}, - {0x0C, "music"}}; +std::unordered_map< uint32_t, std::string > categoryIdToNameMap = + { { 0x00, "common" }, + { 0x01, "bgcommon" }, + { 0x02, "bg" }, + { 0x03, "cut" }, + { 0x04, "chara" }, + { 0x05, "shader" }, + { 0x06, "ui" }, + { 0x07, "sound" }, + { 0x08, "vfx" }, + { 0x09, "ui_script" }, + { 0x0A, "exd" }, + { 0x0B, "game_script" }, + { 0x0C, "music" } }; } -namespace xiv -{ -namespace dat +namespace xiv::dat { + GameData::GameData( const std::filesystem::path& path ) try : + m_path( path ) + { + int maxExLevel = 0; -GameData::GameData(const std::experimental::filesystem::path& path) try : - m_path(path) -{ - int maxExLevel = 0; + // msvc has retarded stdlib implementation + #ifdef _WIN32 + static constexpr auto sep = "\\"; + #else + static constexpr auto sep = std::filesystem::path::preferred_separator; + #endif - // msvc has retarded stdlib implementation -#ifdef _WIN32 - static constexpr auto sep = "\\"; -#else - static constexpr auto sep = std::experimental::filesystem::path::preferred_separator; -#endif - - // Determine which expansions are available - while( std::experimental::filesystem::exists( std::experimental::filesystem::path( m_path.string() + sep + "ex" + std::to_string( maxExLevel + 1 ) + sep + "ex" + std::to_string( maxExLevel + 1 ) + ".ver" ) ) ) - { + // Determine which expansions are available + while( std::filesystem::exists( std::filesystem::path( + m_path.string() + sep + "ex" + std::to_string( maxExLevel + 1 ) + sep + "ex" + std::to_string( maxExLevel + 1 ) + + ".ver" ) ) ) + { maxExLevel++; - } - + } - // Iterate over the files in path - for( auto it = std::experimental::filesystem::directory_iterator( m_path.string() + "//ffxiv" ); it != std::experimental::filesystem::directory_iterator(); ++it ) - { + + // Iterate over the files in path + for( auto it = std::filesystem::directory_iterator( m_path.string() + "//ffxiv" ); + it != std::filesystem::directory_iterator(); ++it ) + { // Get the filename of the current element auto filename = it->path().filename().string(); // If it contains ".win32.index" this is most likely a hit for a category - if( filename.find( ".win32.index" ) != std::string::npos && filename.find( ".win32.index2" ) == std::string::npos ) + if( filename.find( ".win32.index" ) != std::string::npos && filename.find( ".win32.index2" ) == std::string::npos ) { - // Format of indexes is XX0000.win32.index, so fetch the hex number for category number - std::istringstream iss( filename.substr( 0, 2 ) ); - uint32_t cat_nb; - iss >> std::hex >> cat_nb; + // Format of indexes is XX0000.win32.index, so fetch the hex number for category number + std::istringstream iss( filename.substr( 0, 2 ) ); + uint32_t cat_nb; + iss >> std::hex >> cat_nb; - // Add to the list of category number - // creates the empty category in the cats map - // instantiate the creation mutex for this category - m_catNums.push_back( cat_nb ); - m_cats[cat_nb] = std::unique_ptr(); - m_catCreationMutexes[cat_nb] = std::unique_ptr( new std::mutex() ); + // Add to the list of category number + // creates the empty category in the cats map + // instantiate the creation mutex for this category + m_catNums.push_back( cat_nb ); + m_cats[ cat_nb ] = std::unique_ptr< Cat >(); + m_catCreationMutexes[ cat_nb ] = std::make_unique< std::mutex >(); - // Check for expansion - for( int exNum = 1; exNum <= maxExLevel; exNum++ ) - { - const std::string path = m_path.string() + sep + buildDatStr( "ex" + std::to_string( exNum ), cat_nb, exNum, 0, "win32", "index" ); + // Check for expansion + for( int exNum = 1; exNum <= maxExLevel; exNum++ ) + { + const std::string path = + m_path.string() + sep + buildDatStr( "ex" + std::to_string( exNum ), cat_nb, exNum, 0, "win32", "index" ); - if( std::experimental::filesystem::exists( std::experimental::filesystem::path( path ) ) ) + if( std::filesystem::exists( std::filesystem::path( path ) ) ) + { + + int chunkCount = 0; + + for( int chunkTest = 0; chunkTest < 256; chunkTest++ ) { - - int chunkCount = 0; - - for(int chunkTest = 0; chunkTest < 256; chunkTest++ ) - { - if( std::experimental::filesystem::exists( m_path.string() + sep + buildDatStr( "ex" + std::to_string( exNum ), cat_nb, exNum, chunkTest, "win32", "index" ) ) ) - { - m_exCats[cat_nb].exNumToChunkMap[exNum].chunkToCatMap[chunkTest] = std::unique_ptr(); - chunkCount++; - } - } - + if( std::filesystem::exists( m_path.string() + sep + + buildDatStr( "ex" + std::to_string( exNum ), cat_nb, exNum, chunkTest, "win32", + "index" ) ) ) + { + m_exCats[ cat_nb ].exNumToChunkMap[ exNum ].chunkToCatMap[ chunkTest ] = std::unique_ptr< Cat >(); + chunkCount++; + } } - } + + } + } } - } + } -} -catch( std::exception& e ) -{ - // In case of failure here, client is supposed to catch the exception because it is not recoverable on our side - throw std::runtime_error( "GameData initialization failed: " + std::string( e.what() ) ); -} + } + catch( std::exception& e ) + { + // In case of failure here, client is supposed to catch the exception because it is not recoverable on our side + throw std::runtime_error( "GameData initialization failed: " + std::string( e.what() ) ); + } -GameData::~GameData() -{ + GameData::~GameData() + { -} + } -const std::string GameData::buildDatStr( const std::string folder, const int cat, const int exNum, const int chunk, const std::string platform, const std::string type ) -{ - char dat[1024]; - sprintf( dat, "%s/%02x%02x%02x.%s.%s", folder.c_str(), cat, exNum, chunk, platform.c_str(), type.c_str() ); - return std::string( dat ); -} + const std::string GameData::buildDatStr( const std::string folder, const int cat, const int exNum, const int chunk, + const std::string platform, const std::string type ) + { + char dat[1024]; + sprintf( dat, "%s/%02x%02x%02x.%s.%s", folder.c_str(), cat, exNum, chunk, platform.c_str(), type.c_str() ); + return std::string( dat ); + } -const std::vector& GameData::getCatNumbers() const -{ + const std::vector< uint32_t >& GameData::getCatNumbers() const + { return m_catNums; -} + } -std::unique_ptr GameData::getFile(const std::string& path) -{ - // Get the hashes, the category from the path then call the getFile of the category - uint32_t dirHash; - uint32_t filenameHash; - getHashes( path, dirHash, filenameHash ); + std::unique_ptr< File > GameData::getFile( const std::string& path ) + { + // Get the hashes, the category from the path then call the getFile of the category + uint32_t dirHash; + uint32_t filenameHash; + getHashes( path, dirHash, filenameHash ); - return getCategoryFromPath( path ).getFile( dirHash, filenameHash ); -} + return getCategoryFromPath( path ).getFile( dirHash, filenameHash ); + } -bool GameData::doesFileExist(const std::string& path) -{ - uint32_t dirHash; - uint32_t filenameHash; - getHashes( path, dirHash, filenameHash ); + bool GameData::doesFileExist( const std::string& path ) + { + uint32_t dirHash; + uint32_t filenameHash; + getHashes( path, dirHash, filenameHash ); - return getCategoryFromPath( path ).doesFileExist( dirHash, filenameHash ); -} + return getCategoryFromPath( path ).doesFileExist( dirHash, filenameHash ); + } -bool GameData::doesDirExist(const std::string& i_path) -{ - uint32_t dirHash; - uint32_t filenameHash; - getHashes( i_path, dirHash, filenameHash ); + bool GameData::doesDirExist( const std::string& i_path ) + { + uint32_t dirHash; + uint32_t filenameHash; + getHashes( i_path, dirHash, filenameHash ); - return getCategoryFromPath( i_path ).doesDirExist( dirHash ); -} + return getCategoryFromPath( i_path ).doesDirExist( dirHash ); + } -const Cat& GameData::getCategory(uint32_t catNum) -{ - // Check that the category number exists - auto catIt = m_cats.find( catNum ); - if( catIt == m_cats.end() ) - { + const Cat& GameData::getCategory( uint32_t catNum ) + { + // Check that the category number exists + auto catIt = m_cats.find( catNum ); + if( catIt == m_cats.end() ) + { throw std::runtime_error( "Category not found: " + std::to_string( catNum ) ); - } + } - // If it exists and already instantiated return it - if( catIt->second ) - { + // If it exists and already instantiated return it + if( catIt->second ) + { return *( catIt->second ); - } - else - { + } + else + { // Else create it and return it createCategory( catNum ); - return *( m_cats[catNum] ); - } -} + return *( m_cats[ catNum ] ); + } + } -const Cat& GameData::getCategory(const std::string& catName) -{ - // Find the category number from the name - auto categoryNameToIdMapIt = ::categoryNameToIdMap.find( catName ); - if( categoryNameToIdMapIt == ::categoryNameToIdMap.end() ) - { + const Cat& GameData::getCategory( const std::string& catName ) + { + // Find the category number from the name + auto categoryNameToIdMapIt = ::categoryNameToIdMap.find( catName ); + if( categoryNameToIdMapIt == ::categoryNameToIdMap.end() ) + { throw std::runtime_error( "Category not found: " + catName ); - } + } - // From the category number return the category - return getCategory( categoryNameToIdMapIt->second ); -} + // From the category number return the category + return getCategory( categoryNameToIdMapIt->second ); + } -const Cat& GameData::getExCategory( const std::string& catName, uint32_t exNum, const std::string& path ) -{ - // Find the category number from the name - auto categoryMapIt = ::categoryNameToIdMap.find( catName ); - if( categoryMapIt == ::categoryNameToIdMap.end() ) - { + const Cat& GameData::getExCategory( const std::string& catName, uint32_t exNum, const std::string& path ) + { + // Find the category number from the name + auto categoryMapIt = ::categoryNameToIdMap.find( catName ); + if( categoryMapIt == ::categoryNameToIdMap.end() ) + { throw std::runtime_error( "Category not found: " + catName ); - } + } - uint32_t dirHash; - uint32_t filenameHash; - getHashes( path, dirHash, filenameHash ); + uint32_t dirHash; + uint32_t filenameHash; + getHashes( path, dirHash, filenameHash ); - for( auto const& chunk : m_exCats[categoryMapIt->second].exNumToChunkMap[exNum].chunkToCatMap ) - { + for( auto const& chunk : m_exCats[ categoryMapIt->second ].exNumToChunkMap[ exNum ].chunkToCatMap ) + { if( !chunk.second ) - createExCategory( categoryMapIt->second ); + createExCategory( categoryMapIt->second ); if( chunk.second->doesFileExist( dirHash, filenameHash ) ) { - return *( chunk.second ); + return *( chunk.second ); } - } + } - throw std::runtime_error( "Chunk not found for path: " + path ); -} + throw std::runtime_error( "Chunk not found for path: " + path ); + } -const Cat& GameData::getCategoryFromPath(const std::string& path) -{ - // Find the first / in the string, paths are in the format CAT_NAME/..../.../../.... - auto firstSlashPos = path.find( '/' ); - if( firstSlashPos == std::string::npos ) - { + const Cat& GameData::getCategoryFromPath( const std::string& path ) + { + // Find the first / in the string, paths are in the format CAT_NAME/..../.../../.... + auto firstSlashPos = path.find( '/' ); + if( firstSlashPos == std::string::npos ) + { throw std::runtime_error( "Path does not have a / char: " + path ); - } + } - if( path.substr( firstSlashPos + 1, 2) == "ex" ) - { + if( path.substr( firstSlashPos + 1, 2 ) == "ex" ) + { return getExCategory( path.substr( 0, firstSlashPos ), std::stoi( path.substr( firstSlashPos + 3, 1 ) ), path ); - } - else - { + } + else + { // From the sub string found beforethe first / get the category return getCategory( path.substr( 0, firstSlashPos ) ); - } -} + } + } -void GameData::getHashes(const std::string& path, uint32_t& dirHash, uint32_t& filenameHash) const -{ - // Convert the path to lowercase before getting the hashes - std::string pathLower; - pathLower.resize( path.size() ); - std::transform( path.begin(), path.end(), pathLower.begin(), ::tolower ); + void GameData::getHashes( const std::string& path, uint32_t& dirHash, uint32_t& filenameHash ) const + { + // Convert the path to lowercase before getting the hashes + std::string pathLower; + pathLower.resize( path.size() ); + std::transform( path.begin(), path.end(), pathLower.begin(), ::tolower ); - // Find last / to separate dir from filename - auto lastSlashPos = pathLower.rfind( '/' ); - if( lastSlashPos == std::string::npos ) - { + // Find last / to separate dir from filename + auto lastSlashPos = pathLower.rfind( '/' ); + if( lastSlashPos == std::string::npos ) + { throw std::runtime_error( "Path does not have a / char: " + path ); - } + } - std::string dirPart = pathLower.substr( 0, lastSlashPos ); - std::string filenamePart = pathLower.substr( lastSlashPos + 1 ); + std::string dirPart = pathLower.substr( 0, lastSlashPos ); + std::string filenamePart = pathLower.substr( lastSlashPos + 1 ); - // Get the crc32 values from zlib, to compensate the final XOR 0xFFFFFFFF that isnot done in the exe we just reXOR - dirHash = crc32( 0, reinterpret_cast( dirPart.data() ), dirPart.size() ) ^ 0xFFFFFFFF; - filenameHash = crc32( 0, reinterpret_cast( filenamePart.data() ), filenamePart.size() ) ^ 0xFFFFFFFF; -} + // Get the crc32 values from zlib, to compensate the final XOR 0xFFFFFFFF that isnot done in the exe we just reXOR + dirHash = crc32( 0, reinterpret_cast( dirPart.data() ), dirPart.size() ) ^ 0xFFFFFFFF; + filenameHash = crc32( 0, reinterpret_cast( filenamePart.data() ), filenamePart.size() ) ^ 0xFFFFFFFF; + } -void GameData::createCategory(uint32_t catNum) -{ - // Lock mutex in this scope - std::lock_guard lock( *( m_catCreationMutexes[catNum] ) ); - // Maybe after unlocking it has already been created, so check (most likely if it blocked) - if( !m_cats[catNum] ) - { + void GameData::createCategory( uint32_t catNum ) + { + // Lock mutex in this scope + std::lock_guard< std::mutex > lock( *( m_catCreationMutexes[ catNum ] ) ); + // Maybe after unlocking it has already been created, so check (most likely if it blocked) + if( !m_cats[ catNum ] ) + { // Get the category name if we have it std::string catName; auto categoryMapIt = ::categoryIdToNameMap.find( catNum ); if( categoryMapIt != ::categoryIdToNameMap.end() ) { - catName = categoryMapIt->second; + catName = categoryMapIt->second; } // Actually creates the category - m_cats[catNum] = std::unique_ptr( new Cat( m_path, catNum, catName ) ); - } -} + m_cats[ catNum ] = std::make_unique< Cat >( m_path, catNum, catName ); + } + } -void GameData::createExCategory( uint32_t catNum ) -{ - // Maybe after unlocking it has already been created, so check (most likely if it blocked) - if( !m_exCats[catNum].exNumToChunkMap[1].chunkToCatMap[0] ) - { + void GameData::createExCategory( uint32_t catNum ) + { + // Maybe after unlocking it has already been created, so check (most likely if it blocked) + if( !m_exCats[ catNum ].exNumToChunkMap[ 1 ].chunkToCatMap[ 0 ] ) + { // Get the category name if we have it std::string catName; auto categoryMapIt = ::categoryIdToNameMap.find( catNum ); if( categoryMapIt != ::categoryIdToNameMap.end() ) { - catName = categoryMapIt->second; + catName = categoryMapIt->second; } - for( auto const& ex : m_exCats[catNum].exNumToChunkMap ) + for( auto const& ex : m_exCats[ catNum ].exNumToChunkMap ) { - for( auto const& chunk : m_exCats[catNum].exNumToChunkMap[ex.first].chunkToCatMap ) - { - // Actually creates the category - m_exCats[catNum].exNumToChunkMap[ex.first].chunkToCatMap[chunk.first] = std::unique_ptr( new Cat( m_path, catNum, catName, ex.first, chunk.first ) ); - } + for( auto const& chunk : m_exCats[ catNum ].exNumToChunkMap[ ex.first ].chunkToCatMap ) + { + // Actually creates the category + m_exCats[ catNum ].exNumToChunkMap[ ex.first ].chunkToCatMap[ chunk.first ] = std::unique_ptr< Cat >( + new Cat( m_path, catNum, catName, ex.first, chunk.first ) ); + } } - } -} + } + } } -} diff --git a/deps/datReader/GameData.h b/deps/datReader/GameData.h index 2b64fafd..da6b059a 100644 --- a/deps/datReader/GameData.h +++ b/deps/datReader/GameData.h @@ -5,80 +5,89 @@ #include #include -#include +#include +#include -namespace xiv -{ -namespace dat +namespace xiv::dat { -class Cat; -class File; + class Cat; -// Interface to all the datfiles - Main entry point -// All the paths to files/dirs inside the dats are case-insensitive -class GameData -{ -public: - // This should be the path in which the .index/.datX files are located - GameData( const std::experimental::filesystem::path& path ); - ~GameData(); + class File; - static const std::string buildDatStr( const std::string folder, const int cat, const int exNum, const int chunk, const std::string platform, const std::string type ); + // Interface to all the datfiles - Main entry point + // All the paths to files/dirs inside the dats are case-insensitive + class GameData + { + public: + // This should be the path in which the .index/.datX files are located + GameData( const std::filesystem::path& path ); - // Returns all the scanned category number available in the path - const std::vector& getCatNumbers() const; + ~GameData(); - // Return a specific category by its number (see getCatNumbers() for loops) - const Cat& getCategory( uint32_t catNum ); - // Return a specific category by it's name (e.g.: "exd"/"game_script"/ etc...) - const Cat& getCategory( const std::string& catName ); + static const std::string + buildDatStr( const std::string folder, const int cat, const int exNum, const int chunk, const std::string platform, + const std::string type ); - const Cat& getExCategory( const std::string& catName, uint32_t exNum, const std::string& path ); + // Returns all the scanned category number available in the path + const std::vector< uint32_t >& getCatNumbers() const; - // Retrieve a file from the dats given its filename - std::unique_ptr getFile( const std::string& path ); + // Return a specific category by its number (see getCatNumbers() for loops) + const Cat& getCategory( uint32_t catNum ); - // Checks that a file exists - bool doesFileExist( const std::string& path ); + // Return a specific category by it's name (e.g.: "exd"/"game_script"/ etc...) + const Cat& getCategory( const std::string& catName ); - // Checks that a dir exists, there must be a trailing / in the path - // Note that it won't work for dirs that don't contain any file - // e.g.: - "ui/icon/" will return False - // - "ui/icon/000000/" will return True - bool doesDirExist( const std::string& path ); + const Cat& getExCategory( const std::string& catName, uint32_t exNum, const std::string& path ); -protected: - // Return a specific category given a path (calls const Cat& getCategory(const std::string& catName)) - const Cat& getCategoryFromPath( const std::string& path ); + // Retrieve a file from the dats given its filename + std::unique_ptr< File > getFile( const std::string& path ); - // From a full path, returns the dirHash and the filenameHash - void getHashes( const std::string& path, uint32_t& dirHash, uint32_t& filenameHash ) const; + // Checks that a file exists + bool doesFileExist( const std::string& path ); - // Lazy instantiation of category - void createCategory( uint32_t catNum ); + // Checks that a dir exists, there must be a trailing / in the path + // Note that it won't work for dirs that don't contain any file + // e.g.: - "ui/icon/" will return False + // - "ui/icon/000000/" will return True + bool doesDirExist( const std::string& path ); - void createExCategory( uint32_t catNum ); + protected: + // Return a specific category given a path (calls const Cat& getCategory(const std::string& catName)) + const Cat& getCategoryFromPath( const std::string& path ); - // Path given to constructor, pointing to the folder with the .index/.datX files - const std::experimental::filesystem::path m_path; + // From a full path, returns the dirHash and the filenameHash + void getHashes( const std::string& path, uint32_t& dirHash, uint32_t& filenameHash ) const; - // Stored categories, indexed by their number, categories are instantiated and parsed individually when they are needed - std::unordered_map> m_cats; + // Lazy instantiation of category + void createCategory( uint32_t catNum ); - // List of all the categories numbers, is equal to m_cats.keys() - std::vector m_catNums; + void createExCategory( uint32_t catNum ); - // Map of all EX categories and their chunks, "CatNum - (ExNum - (ChunkNum - Cat))" - // Map of all EX categories and their chunks, "CatNum - (ExNum - (ChunkNum - Cat))" - using ChunkToCatMap = struct { std::unordered_map< uint32_t, std::unique_ptr< Cat > > chunkToCatMap; }; - using ExNumToChunkMap = struct { std::unordered_map< uint32_t, ChunkToCatMap > exNumToChunkMap; }; - using CatNumToExNumMap = std::unordered_map< uint32_t, ExNumToChunkMap >; - CatNumToExNumMap m_exCats; - std::unordered_map> m_catCreationMutexes; -}; + // Path given to constructor, pointing to the folder with the .index/.datX files + const std::filesystem::path m_path; + + // Stored categories, indexed by their number, categories are instantiated and parsed individually when they are needed + std::unordered_map< uint32_t, std::unique_ptr< Cat>> m_cats; + + // List of all the categories numbers, is equal to m_cats.keys() + std::vector< uint32_t > m_catNums; + + // Map of all EX categories and their chunks, "CatNum - (ExNum - (ChunkNum - Cat))" + // Map of all EX categories and their chunks, "CatNum - (ExNum - (ChunkNum - Cat))" + using ChunkToCatMap = struct + { + std::unordered_map< uint32_t, std::unique_ptr< Cat > > chunkToCatMap; + }; + using ExNumToChunkMap = struct + { + std::unordered_map< uint32_t, ChunkToCatMap > exNumToChunkMap; + }; + using CatNumToExNumMap = std::unordered_map< uint32_t, ExNumToChunkMap >; + CatNumToExNumMap m_exCats; + std::unordered_map< uint32_t, std::unique_ptr< std::mutex>> m_catCreationMutexes; + }; -} } #endif // XIV_DAT_GAMEDATA_H diff --git a/deps/datReader/Index.cpp b/deps/datReader/Index.cpp index 92dfb5da..d46b20c6 100644 --- a/deps/datReader/Index.cpp +++ b/deps/datReader/Index.cpp @@ -2,166 +2,154 @@ #include "bparse.h" -namespace xiv +namespace xiv::dat { -namespace dat -{ - struct IndexBlockRecord - { - uint32_t offset; - uint32_t size; - SqPackBlockHash blockHash; - }; + struct IndexBlockRecord + { + uint32_t offset; + uint32_t size; + SqPackBlockHash blockHash; + }; - struct IndexHashTableEntry - { - uint32_t filenameHash; - uint32_t dirHash; - uint32_t datOffset; - uint32_t padding; - }; -} + struct IndexHashTableEntry + { + uint32_t filenameHash; + uint32_t dirHash; + uint32_t datOffset; + uint32_t padding; + }; } -namespace xiv +namespace xiv::utils::bparse { -namespace utils -{ -namespace bparse -{ - template <> - inline void reorder(xiv::dat::IndexBlockRecord& i_struct) - { - xiv::utils::bparse::reorder(i_struct.offset); - xiv::utils::bparse::reorder(i_struct.size); - xiv::utils::bparse::reorder(i_struct.blockHash); - } + template<> + inline void reorder< xiv::dat::IndexBlockRecord >( xiv::dat::IndexBlockRecord& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.offset ); + xiv::utils::bparse::reorder( i_struct.size ); + xiv::utils::bparse::reorder( i_struct.blockHash ); + } - template <> - inline void reorder(xiv::dat::IndexHashTableEntry& i_struct) - { - xiv::utils::bparse::reorder(i_struct.filenameHash); - xiv::utils::bparse::reorder(i_struct.dirHash); - xiv::utils::bparse::reorder(i_struct.datOffset); - xiv::utils::bparse::reorder(i_struct.padding); - } + template<> + inline void reorder< xiv::dat::IndexHashTableEntry >( xiv::dat::IndexHashTableEntry& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.filenameHash ); + xiv::utils::bparse::reorder( i_struct.dirHash ); + xiv::utils::bparse::reorder( i_struct.datOffset ); + xiv::utils::bparse::reorder( i_struct.padding ); + } } -} -}; using xiv::utils::bparse::extract; -namespace xiv -{ -namespace dat +namespace xiv::dat { -Index::Index(const std::experimental::filesystem::path& path) : - SqPack( path ) -{ - if( !m_handle ) + Index::Index( const std::filesystem::path& path ) : + SqPack( path ) + { + if( !m_handle ) throw new std::runtime_error( "Failed to load Index at " + path.string() ); - // Hash Table record - auto hashTableBlockRecord = extract( m_handle ); - isIndexBlockValid( hashTableBlockRecord ); + // Hash Table record + auto hashTableBlockRecord = extract< IndexBlockRecord >( m_handle ); + isIndexBlockValid( hashTableBlockRecord ); - // Save the posin the stream to go back to it later on - auto pos = m_handle.tellg(); + // Save the posin the stream to go back to it later on + auto pos = m_handle.tellg(); - // Seek to the pos of the hash table in the file - m_handle.seekg( hashTableBlockRecord.offset ); + // Seek to the pos of the hash table in the file + m_handle.seekg( hashTableBlockRecord.offset ); - // Preallocate and extract the index_hash_table_entries - std::vector indexHashTableEntries; - extract( m_handle, hashTableBlockRecord.size / sizeof( IndexHashTableEntry ), - indexHashTableEntries ); + // Preallocate and extract the index_hash_table_entries + std::vector< IndexHashTableEntry > indexHashTableEntries; + extract< IndexHashTableEntry >( m_handle, hashTableBlockRecord.size / sizeof( IndexHashTableEntry ), + indexHashTableEntries ); - // Feed the correct entry in the HashTable for each index_hash_table_entry - for( auto& indexHashTableEntry : indexHashTableEntries ) - { - auto& hashTableEntry = m_hashTable[indexHashTableEntry.dirHash][indexHashTableEntry.filenameHash]; + // Feed the correct entry in the HashTable for each index_hash_table_entry + for( auto& indexHashTableEntry : indexHashTableEntries ) + { + auto& hashTableEntry = m_hashTable[ indexHashTableEntry.dirHash ][ indexHashTableEntry.filenameHash ]; // The dat number is found in the offset, last four bits hashTableEntry.datNum = ( indexHashTableEntry.datOffset & 0xF ) / 0x2; // The offset in the dat file, needs to strip the dat number indicator - hashTableEntry.datOffset = ( indexHashTableEntry.datOffset & 0xFFFFFFF0 ) * 0x08; + hashTableEntry.datOffset = ( indexHashTableEntry.datOffset - ( indexHashTableEntry.datOffset & 0x000F ) ) * 0x08; hashTableEntry.dirHash = indexHashTableEntry.dirHash; hashTableEntry.filenameHash = indexHashTableEntry.filenameHash; - } + } - // Come back to where we were before reading the HashTable - m_handle.seekg( pos ); + // Come back to where we were before reading the HashTable + m_handle.seekg( pos ); - // Dat Count - m_datCount = extract( m_handle, "dat_count" ); + // Dat Count + m_datCount = extract< uint32_t >( m_handle, "dat_count" ); - // Free List - isIndexBlockValid( extract( m_handle ) ); + // Free List + isIndexBlockValid( extract< IndexBlockRecord >( m_handle ) ); - // Dir Hash Table - isIndexBlockValid( extract( m_handle ) ); -} + // Dir Hash Table + isIndexBlockValid( extract< IndexBlockRecord >( m_handle ) ); + } -Index::~Index() -{ -} + Index::~Index() + { + } -uint32_t Index::getDatCount() const -{ - return m_datCount; -} + uint32_t Index::getDatCount() const + { + return m_datCount; + } -const Index::HashTable& Index::getHashTable() const -{ - return m_hashTable; -} + const Index::HashTable& Index::getHashTable() const + { + return m_hashTable; + } -bool Index::doesFileExist( uint32_t dir_hash, uint32_t filename_hash ) const -{ - auto dir_it = getHashTable().find( dir_hash ); - if( dir_it != getHashTable().end() ) - { + bool Index::doesFileExist( uint32_t dir_hash, uint32_t filename_hash ) const + { + auto dir_it = getHashTable().find( dir_hash ); + if( dir_it != getHashTable().end() ) + { return ( dir_it->second.find( filename_hash ) != dir_it->second.end() ); - } - return false; -} + } + return false; + } -bool Index::doesDirExist( uint32_t dir_hash ) const -{ - return ( getHashTable().find( dir_hash ) != getHashTable().end() ); -} + bool Index::doesDirExist( uint32_t dir_hash ) const + { + return ( getHashTable().find( dir_hash ) != getHashTable().end() ); + } -const Index::DirHashTable& Index::getDirHashTable( uint32_t dir_hash ) const -{ - auto dir_it = getHashTable().find( dir_hash ); - if( dir_it == getHashTable().end() ) - { + const Index::DirHashTable& Index::getDirHashTable( uint32_t dir_hash ) const + { + auto dir_it = getHashTable().find( dir_hash ); + if( dir_it == getHashTable().end() ) + { throw std::runtime_error( "dirHash not found" ); - } - else - { + } + else + { return dir_it->second; - } -} + } + } -const Index::HashTableEntry& Index::getHashTableEntry( uint32_t dir_hash, uint32_t filename_hash ) const -{ - auto& dirHashTable = getDirHashTable( dir_hash ); - auto file_it = dirHashTable.find( filename_hash ); - if( file_it == dirHashTable.end() ) - { + const Index::HashTableEntry& Index::getHashTableEntry( uint32_t dir_hash, uint32_t filename_hash ) const + { + auto& dirHashTable = getDirHashTable( dir_hash ); + auto file_it = dirHashTable.find( filename_hash ); + if( file_it == dirHashTable.end() ) + { throw std::runtime_error( "filenameHash not found" ); - } - else - { + } + else + { return file_it->second; - } -} + } + } -void Index::isIndexBlockValid( const IndexBlockRecord& i_index_block_record ) -{ - isBlockValid( i_index_block_record.offset, i_index_block_record.size, i_index_block_record.blockHash ); -} + void Index::isIndexBlockValid( const IndexBlockRecord& i_index_block_record ) + { + isBlockValid( i_index_block_record.offset, i_index_block_record.size, i_index_block_record.blockHash ); + } } -} diff --git a/deps/datReader/Index.h b/deps/datReader/Index.h index 0dc565b7..d98b96a6 100644 --- a/deps/datReader/Index.h +++ b/deps/datReader/Index.h @@ -5,55 +5,59 @@ #include -#include +#include -namespace xiv { -namespace dat { - -struct IndexBlockRecord; - -class Index : public SqPack +namespace xiv::dat { -public: - // Full path to the index file - Index( const std::experimental::filesystem::path& i_path ); - virtual ~Index(); - // An entry in the hash table, representing a file in a given dat - struct HashTableEntry - { + struct IndexBlockRecord; + + class Index : + public SqPack + { + public: + // Full path to the index file + Index( const std::filesystem::path& i_path ); + + virtual ~Index(); + + // An entry in the hash table, representing a file in a given dat + struct HashTableEntry + { uint32_t datNum; uint32_t dirHash; uint32_t filenameHash; uint32_t datOffset; - }; + }; - // HashTable has dir hashes -> filename hashes -> HashTableEntry - using DirHashTable = std::unordered_map< uint32_t, HashTableEntry >; - using HashTable = std::unordered_map< uint32_t, DirHashTable >; + // HashTable has dir hashes -> filename hashes -> HashTableEntry + using DirHashTable = std::unordered_map< uint32_t, HashTableEntry >; + using HashTable = std::unordered_map< uint32_t, DirHashTable >; - // Get the number of dat files the index is linked to - uint32_t getDatCount() const; + // Get the number of dat files the index is linked to + uint32_t getDatCount() const; - bool doesFileExist( uint32_t dir_hash, uint32_t filename_hash ) const; - bool doesDirExist( uint32_t dir_hash ) const; + bool doesFileExist( uint32_t dir_hash, uint32_t filename_hash ) const; - // Returns the whole HashTable - const HashTable& getHashTable() const; - // Returns the hash table for a specific dir - const DirHashTable& getDirHashTable( uint32_t dir_hash ) const; - // Returns the HashTableEntry for a given file given its hashes - const HashTableEntry& getHashTableEntry( uint32_t dir_hash, uint32_t filename_hash ) const; + bool doesDirExist( uint32_t dir_hash ) const; -protected: - // Checks that the block is valid with regards to its hash - void isIndexBlockValid( const IndexBlockRecord& i_index_block_record ); + // Returns the whole HashTable + const HashTable& getHashTable() const; - uint32_t m_datCount; - HashTable m_hashTable; -}; + // Returns the hash table for a specific dir + const DirHashTable& getDirHashTable( uint32_t dir_hash ) const; + + // Returns the HashTableEntry for a given file given its hashes + const HashTableEntry& getHashTableEntry( uint32_t dir_hash, uint32_t filename_hash ) const; + + protected: + // Checks that the block is valid with regards to its hash + void isIndexBlockValid( const IndexBlockRecord& i_index_block_record ); + + uint32_t m_datCount; + HashTable m_hashTable; + }; -} } #endif // XIV_DAT_INDEX_H diff --git a/deps/datReader/SqPack.cpp b/deps/datReader/SqPack.cpp index ede929aa..fb8c244a 100644 --- a/deps/datReader/SqPack.cpp +++ b/deps/datReader/SqPack.cpp @@ -1,76 +1,78 @@ #include "SqPack.h" -namespace xiv { -namespace dat { - struct SqPackHeader - { - char magic[0x8]; - uint32_t zero; - uint32_t size; - uint32_t version; - uint32_t type; - }; +namespace xiv::dat { + enum PlatformId : + uint8_t + { + Win32, + PS3, + PS4 + }; - struct SqPackIndexHeader - { - uint32_t size; - uint32_t type; - }; -} -} -namespace xiv { -namespace utils { -namespace bparse { - template <> - inline void reorder(xiv::dat::SqPackHeader& i_struct) - { - for (int32_t i = 0; i < 0x8; ++i) - { - xiv::utils::bparse::reorder(i_struct.magic[i]); - } - xiv::utils::bparse::reorder(i_struct.zero); - xiv::utils::bparse::reorder(i_struct.size); - xiv::utils::bparse::reorder(i_struct.version); - xiv::utils::bparse::reorder(i_struct.type); - } + struct SqPackHeader + { + char magic[0x8]; + PlatformId platformId; + uint8_t padding0[3]; + uint32_t size; + uint32_t version; + uint32_t type; + }; - template <> - inline void reorder(xiv::dat::SqPackIndexHeader& i_struct) - { - xiv::utils::bparse::reorder(i_struct.size); - xiv::utils::bparse::reorder(i_struct.type); - } + struct SqPackIndexHeader + { + uint32_t size; + uint32_t type; + }; } + +namespace xiv::utils:: bparse +{ + template<> + inline void reorder< xiv::dat::SqPackHeader >( xiv::dat::SqPackHeader& i_struct ) + { + for( int32_t i = 0; i < 0x8; ++i ) + { + xiv::utils::bparse::reorder( i_struct.magic[ i ] ); + } + xiv::utils::bparse::reorder( i_struct.platformId ); + xiv::utils::bparse::reorder( i_struct.size ); + xiv::utils::bparse::reorder( i_struct.version ); + xiv::utils::bparse::reorder( i_struct.type ); + } + + template<> + inline void reorder< xiv::dat::SqPackIndexHeader >( xiv::dat::SqPackIndexHeader& i_struct ) + { + xiv::utils::bparse::reorder( i_struct.size ); + xiv::utils::bparse::reorder( i_struct.type ); + } } -}; using xiv::utils::bparse::extract; -namespace xiv -{ -namespace dat +namespace xiv::dat { - SqPack::SqPack( const std::experimental::filesystem::path& path ) : - // Open the file - m_handle( path.string(), std::ios_base::in | std::ios_base::binary ) - { - // Extract the header - extract( m_handle ); + // Open the file + SqPack::SqPack( const std::filesystem::path& path ) : + m_handle( path.string(), std::ios_base::in | std::ios_base::binary ) + { + // Extract the header + extract< SqPackHeader >( m_handle ); - // Skip until the IndexHeader the extract it - m_handle.seekg( 0x400 ); - extract( m_handle ); - } + // Skip until the IndexHeader the extract it + m_handle.seekg( 0x400 ); + extract< SqPackIndexHeader >( m_handle ); + } - SqPack::~SqPack() - { - } + SqPack::~SqPack() + { + } - void SqPack::isBlockValid( uint32_t i_offset, uint32_t i_size, const SqPackBlockHash& i_block_hash ) - { - // TODO - } + void SqPack::isBlockValid( uint32_t i_offset, uint32_t i_size, const SqPackBlockHash& i_block_hash ) + { + // TODO + } } -} diff --git a/deps/datReader/SqPack.h b/deps/datReader/SqPack.h index cc7feab3..4c6e34c4 100644 --- a/deps/datReader/SqPack.h +++ b/deps/datReader/SqPack.h @@ -3,64 +3,56 @@ #include -#include +#include #include "bparse.h" -namespace xiv +namespace xiv::dat { - namespace dat - { - - struct SqPackBlockHash - { - uint8_t hash[0x14]; - uint32_t padding[0xB]; - }; - - } + struct SqPackBlockHash + { + uint8_t hash[0x14]; + uint32_t padding[0xB]; + }; } -namespace xiv { - namespace utils { - namespace bparse { - template <> inline void reorder( xiv::dat::SqPackBlockHash& i_struct ) - { - for( auto i = 0; i < 0x14; ++i ) - { - xiv::utils::bparse::reorder( i_struct.hash[i] ); - } - for( auto i = 0; i < 0xB; ++i ) - { - xiv::utils::bparse::reorder( i_struct.padding[i] ); - } - } - } - } + +namespace xiv::utils::bparse +{ + template<> + inline void reorder< xiv::dat::SqPackBlockHash >( xiv::dat::SqPackBlockHash& i_struct ) + { + for( auto i = 0; i < 0x14; ++i ) + { + xiv::utils::bparse::reorder( i_struct.hash[ i ] ); + } + for( auto i = 0; i < 0xB; ++i ) + { + xiv::utils::bparse::reorder( i_struct.padding[ i ] ); + } + } }; -namespace xiv -{ -namespace dat +namespace xiv::dat { -class SqPack -{ + class SqPack + { -public: - // Full path to the sqpack file - SqPack( const std::experimental::filesystem::path& i_path ); - virtual ~SqPack(); + public: + // Full path to the sqpack file + SqPack( const std::filesystem::path& i_path ); -protected: - // Checks that a given block is valid iven its hash - void isBlockValid( uint32_t i_offset, uint32_t i_size, const SqPackBlockHash& i_block_hash ); + virtual ~SqPack(); - // File handle - std::ifstream m_handle; - }; + protected: + // Checks that a given block is valid iven its hash + void isBlockValid( uint32_t i_offset, uint32_t i_size, const SqPackBlockHash& i_block_hash ); + + // File handle + std::ifstream m_handle; + }; -} } #endif // XIV_DAT_SQPACK_H diff --git a/deps/datReader/bparse.cpp b/deps/datReader/bparse.cpp index dc36a7d6..70bdb8b3 100644 --- a/deps/datReader/bparse.cpp +++ b/deps/datReader/bparse.cpp @@ -5,4 +5,9 @@ std::string xiv::utils::bparse::extract_cstring( std::istream& i_stream, const s std::string temp_str; std::getline( i_stream, temp_str, '\0' ); return temp_str; -} \ No newline at end of file +} + +std::string xiv::utils::bparse::extract_cstring( std::vector< char >& data, uint32_t pos ) +{ + return &data[ pos ]; +} diff --git a/deps/datReader/bparse.h b/deps/datReader/bparse.h index f26d2faa..f45fecdd 100644 --- a/deps/datReader/bparse.h +++ b/deps/datReader/bparse.h @@ -6,98 +6,114 @@ #include #include -namespace xiv -{ -namespace utils -{ -namespace bparse +namespace xiv::utils::bparse { -// Internal macro for byteswapping -template -void byteswap_impl(char (&bytes)[N]) -{ - for( auto p = std::begin( bytes ), end = std::end( bytes ) - 1; p < end; ++p, --end ) - { + // Internal macro for byteswapping + template< int N > + void byteswap_impl( char (& bytes)[N] ) + { + for( auto p = std::begin( bytes ), end = std::end( bytes ) - 1; p < end; ++p, --end ) + { std::swap( *p, *end ); - } -} + } + } -// byteswapping any type (no pointers to array) -template -T byteswap(T value) -{ - byteswap_impl(*reinterpret_cast(&value)); + // byteswapping any type (no pointers to array) + template< typename T > + T byteswap( T value ) + { + byteswap_impl( *reinterpret_cast(&value) ); return value; -} + } -// Read a struct from a stream -template -void read(std::istream& i_stream, StructType& i_struct) -{ - static_assert( std::is_pod::value, "StructType must be a POD to be able to use read." ); - i_stream.read( reinterpret_cast( &i_struct ), sizeof( StructType ) ); -} + // Read a struct from a stream + template< typename StructType > + void read( std::istream& i_stream, StructType& i_struct ) + { + static_assert( std::is_pod< StructType >::value, "StructType must be a POD to be able to use read." ); + i_stream.read( reinterpret_cast( &i_struct ), sizeof( StructType ) ); + } -// By default a type does not need reordering -template void reorder(StructType& i_struct) {} + // By default a type does not need reordering + template< typename StructType > + void reorder( StructType& i_struct ) + { + } -// "Overload" for passed struct as arg -template -void extract(std::istream& i_stream, StructType& o_struct) -{ - read( i_stream, o_struct ); - reorder( o_struct ); -} + // "Overload" for passed struct as arg + template< typename StructType > + void extract( std::istream& i_stream, StructType& o_struct ) + { + read( i_stream, o_struct ); + reorder( o_struct ); + } -// This should not copy because of RVO -// Extract a struct from a stream and log it -template -StructType extract( std::istream& i_stream ) -{ - StructType temp_struct; - extract( i_stream, temp_struct ); - return temp_struct; -} + // This should not copy because of RVO + // Extract a struct from a stream and log it + template< typename StructType > + StructType extract( std::istream& i_stream ) + { + StructType temp_struct; + extract< StructType >( i_stream, temp_struct ); + return temp_struct; + } -template -void extract(std::istream& i_stream, uint32_t i_size, std::vector& o_structs ) -{ - o_structs.reserve( i_size ); - for( uint32_t i = 0; i < i_size; ++i ) - { - o_structs.emplace_back( extract( i_stream ) ); - } -} + template< typename StructType > + void extract( std::istream& i_stream, uint32_t i_size, std::vector< StructType >& o_structs ) + { + o_structs.reserve( i_size ); + for( uint32_t i = 0; i < i_size; ++i ) + { + o_structs.emplace_back( extract< StructType >( i_stream ) ); + } + } -// For simple (integral) types just provide name and endianness directly -template -StructType extract(std::istream& i_stream, const std::string& i_name, bool i_is_le = true) -{ - StructType temp_struct; - read( i_stream, temp_struct ); - if( !i_is_le ) - { + // For simple (integral) types just provide name and endianness directly + template< typename StructType > + StructType extract( std::istream& i_stream, const std::string& i_name, bool i_is_le = true ) + { + StructType temp_struct; + read( i_stream, temp_struct ); + if( !i_is_le ) + { temp_struct = byteswap( temp_struct ); - } - return temp_struct; -} + } + return temp_struct; + } -template -void extract(std::istream& i_stream, const std::string& i_name, uint32_t i_size, std::vector& o_structs, bool i_is_le = true) -{ - o_structs.reserve( i_size ); - for( uint32_t i = 0; i < i_size; ++i ) - { - o_structs.emplace_back( extract( i_stream, i_name ) ); - } -} + template< typename StructType > + void extract( std::istream& i_stream, const std::string& i_name, uint32_t i_size, std::vector< StructType >& o_structs, + bool i_is_le = true ) + { + o_structs.reserve( i_size ); + for( uint32_t i = 0; i < i_size; ++i ) + { + o_structs.emplace_back( extract< StructType >( i_stream, i_name ) ); + } + } -// For cstrings -std::string extract_cstring( std::istream& i_stream, const std::string& i_name ); + template< typename StructType > + StructType extract( std::vector< char >& data, uint32_t pos, bool isLe = true ) + { + StructType tempStruct = *reinterpret_cast< StructType* >( &data[ pos ] ); + + if( std::is_class< StructType >::value ) + { + reorder( tempStruct ); + } + else if( !isLe ) + { + tempStruct = byteswap( tempStruct ); + } + return tempStruct; + } + + // For cstrings + std::string extract_cstring( std::istream& i_stream, const std::string& i_name ); + + std::string extract_cstring( std::vector< char >& data, uint32_t pos ); -} -} } #endif // XIV_UTILS_BPARSE_H diff --git a/deps/datReader/conv.cpp b/deps/datReader/conv.cpp index 40b94080..b591045b 100644 --- a/deps/datReader/conv.cpp +++ b/deps/datReader/conv.cpp @@ -1,8 +1,8 @@ #include "conv.h" -namespace xiv { -namespace utils { -namespace conv { +namespace xiv::utils::conv +{ + float half2float( const uint16_t i_value ) { uint32_t t1; @@ -30,6 +30,4 @@ namespace conv { } } -} -} diff --git a/deps/datReader/conv.h b/deps/datReader/conv.h index c0a4529b..b8f3326f 100644 --- a/deps/datReader/conv.h +++ b/deps/datReader/conv.h @@ -5,13 +5,11 @@ #include #include -namespace xiv { -namespace utils { -namespace conv { +namespace xiv::utils::conv +{ float half2float( const uint16_t i_value ); + float ubyte2float( const uint8_t i_value ); } -} -} #endif // XIV_UTILS_CONV_H diff --git a/deps/datReader/crc32.cpp b/deps/datReader/crc32.cpp index 7b9490d9..c861cebc 100644 --- a/deps/datReader/crc32.cpp +++ b/deps/datReader/crc32.cpp @@ -65,116 +65,111 @@ namespace internal } } -namespace xiv -{ -namespace utils -{ -namespace crc32 +namespace xiv::utils::crc32 { -uint32_t compute(const std::string& i_input, uint32_t init_crc) -{ + uint32_t compute( const std::string& i_input, uint32_t init_crc ) + { // Classical crc stuff - auto& crc_table = internal::get_crc_table(); + auto& crc_table = internal::get_crc_table(); auto crc = init_crc; - for(std::size_t i = 0; i < i_input.size(); ++i) + for( std::size_t i = 0; i < i_input.size(); ++i ) { - crc = crc_table[(crc ^ i_input[i]) & 0xFF] ^ (crc >> 8); + crc = crc_table[ ( crc ^ i_input[ i ] ) & 0xFF ] ^ ( crc >> 8 ); } return crc; -} + } -uint32_t rev_compute(const std::string& i_input, uint32_t init_crc) -{ - auto& rev_crc_table = internal::get_rev_crc_table(); + uint32_t rev_compute( const std::string& i_input, uint32_t init_crc ) + { + auto& rev_crc_table = internal::get_rev_crc_table(); auto crc = init_crc; const auto input_size = i_input.size(); // Reverse crc - for(auto i = input_size; i > 0; --i) + for( auto i = input_size; i > 0; --i ) { - crc = rev_crc_table[crc >> 24] ^ ((crc << 8) & 0xFFFFFF00) ^ i_input[input_size - i - 1]; + crc = rev_crc_table[ crc >> 24 ] ^ ( ( crc << 8 ) & 0xFFFFFF00 ) ^ i_input[ input_size - i - 1 ]; } // Compute the 4 bytes needed for this init_crc - for (auto i = 0; i < 4; ++i) + for( auto i = 0; i < 4; ++i ) { - crc = rev_crc_table[crc >> 24] ^ ((crc << 8) & 0xFFFFFF00); + crc = rev_crc_table[ crc >> 24 ] ^ ( ( crc << 8 ) & 0xFFFFFF00 ); } return crc; -} + } -void generate_hashes_1(std::string& i_format, const uint32_t i_first_index, std::vector& o_hashes) -{ - char* str = const_cast(i_format.data()); - const uint32_t str_size = i_format.size(); + void generate_hashes_1( std::string& i_format, const uint32_t i_first_index, std::vector< uint32_t >& o_hashes ) + { + char* str = const_cast(i_format.data()); + const uint32_t str_size = i_format.size(); - o_hashes.resize(10000); + o_hashes.resize( 10000 ); - uint32_t i = 0; - for (char a = '0'; a <= '9'; ++a) - { - str[i_first_index] = a; - for (char b = '0'; b <= '9'; ++b) - { - str[i_first_index + 1] = b; - for (char c = '0'; c <= '9'; ++c) - { - str[i_first_index + 2] = c; - for (char d = '0'; d <= '9'; ++d) - { - str[i_first_index + 3] = d; - o_hashes[i] = ::crc32(0, reinterpret_cast(&(str[0])), str_size) ^ 0xFFFFFFFF; - ++i; - } - } - } - } -} + uint32_t i = 0; + for( char a = '0'; a <= '9'; ++a ) + { + str[ i_first_index ] = a; + for( char b = '0'; b <= '9'; ++b ) + { + str[ i_first_index + 1 ] = b; + for( char c = '0'; c <= '9'; ++c ) + { + str[ i_first_index + 2 ] = c; + for( char d = '0'; d <= '9'; ++d ) + { + str[ i_first_index + 3 ] = d; + o_hashes[ i ] = ::crc32( 0, reinterpret_cast(&( str[ 0 ] )), str_size ) ^ 0xFFFFFFFF; + ++i; + } + } + } + } + } -void generate_hashes_2(std::string& i_format, const uint32_t i_first_index, const uint32_t i_second_index, std::vector& o_hashes) -{ - char* str = const_cast(i_format.data()); - const uint32_t str_size = i_format.size(); + void generate_hashes_2( std::string& i_format, const uint32_t i_first_index, const uint32_t i_second_index, + std::vector< uint32_t >& o_hashes ) + { + char* str = const_cast(i_format.data()); + const uint32_t str_size = i_format.size(); - o_hashes.resize(100000000); + o_hashes.resize( 100000000 ); - uint32_t i = 0; - for (char a = '0'; a <= '9'; ++a) - { - str[i_first_index] = a; - for (char b = '0'; b <= '9'; ++b) - { - str[i_first_index + 1] = b; - for (char c = '0'; c <= '9'; ++c) - { - str[i_first_index + 2] = c; - for (char d = '0'; d <= '9'; ++d) - { - str[i_first_index + 3] = d; - for (char e = '0'; e <= '9'; ++e) - { - str[i_second_index] = e; - for (char f = '0'; f <= '9'; ++f) - { - str[i_second_index + 1] = f; - for (char g = '0'; g <= '9'; ++g) - { - str[i_second_index + 2] = g; - for (char h = '0'; h <= '9'; ++h) - { - str[i_second_index + 3] = h; - o_hashes[i] = ::crc32(0, reinterpret_cast(&(str[0])), str_size) ^ 0xFFFFFFFF; - ++i; - } - } - } - } - } - } - } - } -} + uint32_t i = 0; + for( char a = '0'; a <= '9'; ++a ) + { + str[ i_first_index ] = a; + for( char b = '0'; b <= '9'; ++b ) + { + str[ i_first_index + 1 ] = b; + for( char c = '0'; c <= '9'; ++c ) + { + str[ i_first_index + 2 ] = c; + for( char d = '0'; d <= '9'; ++d ) + { + str[ i_first_index + 3 ] = d; + for( char e = '0'; e <= '9'; ++e ) + { + str[ i_second_index ] = e; + for( char f = '0'; f <= '9'; ++f ) + { + str[ i_second_index + 1 ] = f; + for( char g = '0'; g <= '9'; ++g ) + { + str[ i_second_index + 2 ] = g; + for( char h = '0'; h <= '9'; ++h ) + { + str[ i_second_index + 3 ] = h; + o_hashes[ i ] = ::crc32( 0, reinterpret_cast(&( str[ 0 ] )), str_size ) ^ 0xFFFFFFFF; + ++i; + } + } + } + } + } + } + } + } + } } -} -} diff --git a/deps/datReader/crc32.h b/deps/datReader/crc32.h index e8c59286..7d4894b7 100644 --- a/deps/datReader/crc32.h +++ b/deps/datReader/crc32.h @@ -5,9 +5,8 @@ #include #include -namespace xiv { -namespace utils { -namespace crc32 { +namespace xiv::utils::crc32 +{ // Normal crc32 computation from a given intial crc value, use zlib.crc32 instead, the final XOR 0xFFFFFFFF is not done uint32_t compute( const std::string& i_input, uint32_t init_crc = 0xFFFFFFFF ); @@ -17,10 +16,10 @@ namespace crc32 { uint32_t rev_compute( const std::string& i_input, uint32_t init_crc = 0 ); void generate_hashes_1( std::string& i_format, const uint32_t i_first_index, std::vector< uint32_t >& o_hashes ); - void generate_hashes_2( std::string& i_format, const uint32_t i_first_index, const uint32_t i_second_index, std::vector< uint32_t >& o_hashes ); -} -} + void generate_hashes_2( std::string& i_format, const uint32_t i_first_index, const uint32_t i_second_index, + std::vector< uint32_t >& o_hashes ); + } #endif // XIV_UTILS_CRC32_H diff --git a/deps/datReader/stream.cpp b/deps/datReader/stream.cpp index 0a38fbfc..b9019a6a 100644 --- a/deps/datReader/stream.cpp +++ b/deps/datReader/stream.cpp @@ -4,13 +4,7 @@ #include #include -namespace xiv -{ -namespace utils -{ -namespace stream +namespace xiv::utils::stream { } -} -} diff --git a/deps/datReader/stream.h b/deps/datReader/stream.h index c0b98074..37b9f28e 100644 --- a/deps/datReader/stream.h +++ b/deps/datReader/stream.h @@ -5,23 +5,17 @@ #include #include -namespace xiv +namespace xiv::utils::stream { -namespace utils -{ -namespace stream -{ -template > -class vectorwrapbuf : public std::basic_streambuf -{ -public: - vectorwrapbuf(std::vector &vec) + template< typename CharT, typename TraitsT = std::char_traits< CharT > > + class vectorwrapbuf : + public std::basic_streambuf< CharT, TraitsT > + { + public: + vectorwrapbuf( std::vector< CharT >& vec ) { - this->setg(vec.data(), vec.data(), vec.data() + vec.size()); + this->setg( vec.data(), vec.data(), vec.data() + vec.size() ); } -}; + }; } -} -} - #endif // XIV_UTILS_STREAM_H diff --git a/deps/datReader/zlib.cpp b/deps/datReader/zlib.cpp index 9f75d929..29396b99 100644 --- a/deps/datReader/zlib.cpp +++ b/deps/datReader/zlib.cpp @@ -4,32 +4,28 @@ #include #include -namespace xiv -{ -namespace utils -{ -namespace zlib +namespace xiv::utils::zlib { -void compress(const std::vector& in, std::vector& out) -{ + void compress( const std::vector< char >& in, std::vector< char >& out ) + { // Fetching upper bound for out size - auto out_size = compressBound(in.size()); - out.resize(out_size); + auto out_size = compressBound( in.size() ); + out.resize( out_size ); - auto ret = compress2(reinterpret_cast(out.data()), &out_size, - reinterpret_cast(in.data()), in.size(), Z_BEST_COMPRESSION); + auto ret = compress2( reinterpret_cast(out.data()), &out_size, + reinterpret_cast(in.data()), in.size(), Z_BEST_COMPRESSION ); - if (ret != Z_OK) + if( ret != Z_OK ) { - throw std::runtime_error("Error at zlib uncompress: " + std::to_string(ret)); + throw std::runtime_error( "Error at zlib uncompress: " + std::to_string( ret ) ); } - out.resize(out_size); -} + out.resize( out_size ); + } -void no_header_decompress(uint8_t* in, uint32_t in_size, uint8_t* out, uint32_t out_size) -{ + void no_header_decompress( uint8_t* in, uint32_t in_size, uint8_t* out, uint32_t out_size ) + { z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; @@ -38,10 +34,10 @@ void no_header_decompress(uint8_t* in, uint32_t in_size, uint8_t* out, uint32_t strm.next_in = Z_NULL; // Init with -15 because we do not have header in this compressed data - auto ret = inflateInit2(&strm, -15); - if (ret != Z_OK) + auto ret = inflateInit2( &strm, -15 ); + if( ret != Z_OK ) { - throw std::runtime_error("Error at zlib init: " + std::to_string(ret)); + throw std::runtime_error( "Error at zlib init: " + std::to_string( ret ) ); } // Set pointers to the right addresses @@ -50,16 +46,14 @@ void no_header_decompress(uint8_t* in, uint32_t in_size, uint8_t* out, uint32_t strm.next_out = out; // Effectively decompress data - ret = inflate(&strm, Z_NO_FLUSH); - if (ret != Z_STREAM_END) + ret = inflate( &strm, Z_NO_FLUSH ); + if( ret != Z_STREAM_END ) { - throw std::runtime_error("Error at zlib inflate: " + std::to_string(ret)); + throw std::runtime_error( "Error at zlib inflate: " + std::to_string( ret ) ); } // Clean up - inflateEnd(&strm); -} + inflateEnd( &strm ); + } } -} -} diff --git a/deps/datReader/zlib.h b/deps/datReader/zlib.h index 942efaf9..7c93a5a3 100644 --- a/deps/datReader/zlib.h +++ b/deps/datReader/zlib.h @@ -4,18 +4,13 @@ #include #include -namespace xiv -{ -namespace utils -{ -namespace zlib +namespace xiv::utils::zlib { -void compress(const std::vector& in, std::vector& out); -void no_header_decompress(uint8_t* in, uint32_t in_size, uint8_t* out, uint32_t out_size); + void compress( const std::vector< char >& in, std::vector< char >& out ); + + void no_header_decompress( uint8_t* in, uint32_t in_size, uint8_t* out, uint32_t out_size ); -} -} } #endif // XIV_UTILS_ZLIB_H diff --git a/deps/ffxiv-actions b/deps/ffxiv-actions new file mode 160000 index 00000000..dde9b5bb --- /dev/null +++ b/deps/ffxiv-actions @@ -0,0 +1 @@ +Subproject commit dde9b5bbfc7c0197de0b0b49b982a0ee9fe761ab diff --git a/deps/mysqlConnector/Connection.cpp b/deps/mysqlConnector/Connection.cpp index 9b317dc9..df6a28f0 100644 --- a/deps/mysqlConnector/Connection.cpp +++ b/deps/mysqlConnector/Connection.cpp @@ -4,6 +4,10 @@ #include "PreparedStatement.h" #include +#ifdef _MSC_VER + // fixes compile error when compiling with vs2019 + #include +#endif #include Mysql::Connection::Connection( std::shared_ptr< MySqlBase > pBase, diff --git a/deps/mysqlConnector/Connection.h b/deps/mysqlConnector/Connection.h index 1283ead5..43cc6e07 100644 --- a/deps/mysqlConnector/Connection.h +++ b/deps/mysqlConnector/Connection.h @@ -3,6 +3,8 @@ #include #include +#include + #include "MysqlCommon.h" typedef struct st_mysql MYSQL; diff --git a/deps/watchdog/Watchdog.h b/deps/watchdog/Watchdog.h index d9f7aa25..e64a21f0 100644 --- a/deps/watchdog/Watchdog.h +++ b/deps/watchdog/Watchdog.h @@ -31,8 +31,8 @@ #include #include -#include -namespace ci { namespace fs = std::experimental::filesystem; } +#include +namespace ci { namespace fs = std::filesystem; } //! Exception for when Watchdog can't locate a file or parse the wildcard class WatchedFileSystemExc : public std::exception { @@ -319,7 +319,7 @@ protected: std::string mFilter; std::function mCallback; std::function&)> mListCallback; - std::map< std::string, std::experimental::filesystem::file_time_type > mModificationTimes; + std::map< std::string, std::filesystem::file_time_type > mModificationTimes; }; std::mutex mMutex; diff --git a/sql/schema/inserts.sql b/sql/schema/inserts.sql index bcecda18..cb94763b 100644 --- a/sql/schema/inserts.sql +++ b/sql/schema/inserts.sql @@ -424,4383 +424,6 @@ INSERT IGNORE INTO `bnpctemplate` ( `Name`, `bNPCBaseId`, `bNPCNameId`, `mainWea INSERT IGNORE INTO `bnpctemplate` ( `Name`, `bNPCBaseId`, `bNPCNameId`, `mainWeaponModel`, `secWeaponModel`, `aggressionMode`, `enemyType`, `pose`, `modelChara`, `displayFlags`, `Look`, `Models`) VALUES ( "servantofthesage_8754", 8754, 7205, 0, 0, 3, 4, 0, 2270, 262147, UNHEX( '0000000000000000000000000000000000000000000000000000'), UNHEX( '00000000000000000000000000000000000000000000000000000000000000000000000000000000') ); INSERT IGNORE INTO `bnpctemplate` ( `Name`, `bNPCBaseId`, `bNPCNameId`, `mainWeaponModel`, `secWeaponModel`, `aggressionMode`, `enemyType`, `pose`, `modelChara`, `displayFlags`, `Look`, `Models`) VALUES ( "saitaisui_8780", 8780, 7206, 4295302988, 0, 1, 4, 0, 2218, 12, UNHEX( '0000000000000000000000000000000000000000000000000000'), UNHEX( '00000000000000000000000000000000000000000000000000000000000000000000000000000000') ); -INSERT INTO `discoveryinfo` (`id`, `map_id`, `discover_id`) VALUES -(1367775, 4, 2), -(1367776, 4, 2), -(1367777, 4, 2), -(1367778, 4, 1), -(1367779, 4, 2), -(1367780, 4, 3), -(1367785, 4, 3), -(1367793, 4, 2), -(1367798, 4, 1), -(1367800, 4, 2), -(1367801, 4, 2), -(1367823, 4, 2), -(1420009, 4, 5), -(1420010, 4, 5), -(1420011, 4, 2), -(1420012, 4, 5), -(1420013, 4, 5), -(1436587, 4, 2), -(1436597, 4, 5), -(1436598, 4, 5), -(1436599, 4, 5), -(1436600, 4, 2), -(1436601, 4, 2), -(1436602, 4, 2), -(1436603, 4, 2), -(1436604, 4, 2), -(1436605, 4, 2), -(1436606, 4, 2), -(2052662, 4, 7), -(2052668, 4, 8), -(2052672, 4, 13), -(2052682, 4, 9), -(2052693, 4, 12), -(2052695, 4, 12), -(2052698, 4, 10), -(2052699, 4, 10), -(2052705, 4, 11), -(2052706, 4, 11), -(2052708, 4, 10), -(2052710, 4, 6), -(2052711, 4, 6), -(2052714, 4, 5), -(2052716, 4, 5), -(2052721, 4, 5), -(2052722, 4, 5), -(2052724, 4, 5), -(2065858, 9, 1), -(2065859, 9, 6), -(2065860, 9, 6), -(2065861, 9, 3), -(2065866, 9, 4), -(2065867, 9, 4), -(2065868, 9, 4), -(2065869, 9, 4), -(2065870, 9, 4), -(2065871, 9, 2), -(2065872, 9, 7), -(2065873, 9, 9), -(2065875, 9, 9), -(2065877, 9, 5), -(2065879, 9, 3), -(2065880, 9, 5), -(2065882, 9, 8), -(2065883, 9, 8), -(2065961, 5, 1), -(2065962, 5, 1), -(2065963, 5, 1), -(2065970, 5, 2), -(2065974, 5, 17), -(2065975, 5, 13), -(2065981, 5, 16), -(2065986, 5, 4), -(2065987, 5, 5), -(2065988, 5, 5), -(2065992, 5, 4), -(2065994, 5, 4), -(2065995, 5, 5), -(2065996, 5, 4), -(2065997, 5, 3), -(2065998, 5, 3), -(2065999, 5, 3), -(2066000, 5, 3), -(2066001, 5, 3), -(2066002, 5, 6), -(2066003, 5, 6), -(2066004, 5, 7), -(2066007, 5, 7), -(2066011, 5, 7), -(2066013, 5, 9), -(2066018, 5, 10), -(2066019, 5, 10), -(2066021, 5, 10), -(2066022, 5, 12), -(2066023, 5, 12), -(2066024, 5, 15), -(2066027, 5, 11), -(2066029, 5, 19), -(2066030, 5, 18), -(2112183, 9, 6), -(2112184, 9, 6), -(2112186, 9, 7), -(2112188, 9, 5), -(2112189, 9, 4), -(2152921, 4, 3), -(2152922, 4, 3), -(2152923, 4, 4), -(2152925, 4, 4), -(2152926, 4, 1), -(2152928, 4, 2), -(2152930, 4, 5), -(2152931, 4, 5), -(2152933, 4, 5), -(2152934, 4, 5), -(2152935, 4, 5), -(2152936, 4, 5), -(2152937, 4, 5), -(2152938, 4, 5), -(2152939, 4, 8), -(2152941, 4, 8), -(2152942, 4, 8), -(2152943, 4, 8), -(2152944, 4, 7), -(2152945, 4, 7), -(2152946, 4, 7), -(2152949, 4, 7), -(2152950, 4, 7), -(2152951, 4, 7), -(2152952, 4, 7), -(2152953, 4, 7), -(2152954, 4, 7), -(2152955, 4, 8), -(2152956, 4, 9), -(2152957, 4, 11), -(2152963, 4, 11), -(2152965, 4, 11), -(2152966, 4, 13), -(2152967, 4, 13), -(2264614, 7, 1), -(2264620, 7, 1), -(2264625, 7, 1), -(2264626, 7, 2), -(2264633, 7, 3), -(2264634, 7, 3), -(2264636, 7, 3), -(2264637, 7, 3), -(2264640, 7, 10), -(2264642, 7, 10), -(2264643, 7, 10), -(2264649, 7, 11), -(2264653, 7, 12), -(2264660, 7, 12), -(2264662, 7, 13), -(2264669, 7, 2), -(2264671, 7, 14), -(2264672, 7, 15), -(2264673, 7, 16), -(2264674, 7, 4), -(2264675, 7, 5), -(2264676, 7, 6), -(2264682, 7, 8), -(2264685, 7, 9), -(2264705, 7, 1), -(2264721, 7, 1), -(2264728, 7, 1), -(2264731, 7, 3), -(2264736, 7, 8), -(2264772, 7, 16), -(2264773, 7, 7), -(2264775, 7, 11), -(2264791, 7, 15), -(2264796, 7, 3), -(2264798, 7, 16), -(2264807, 7, 1), -(2280307, 6, 1), -(2280313, 6, 2), -(2280316, 6, 3), -(2280318, 6, 3), -(2280320, 6, 4), -(2280327, 6, 4), -(2280330, 6, 4), -(2280347, 6, 5), -(2280351, 6, 5), -(2280358, 6, 5), -(2280362, 6, 6), -(2280365, 6, 7), -(2280369, 6, 7), -(2280371, 6, 8), -(2280375, 6, 15), -(2280388, 6, 13), -(2280391, 6, 14), -(2280395, 6, 14), -(2280400, 6, 9), -(2280402, 6, 10), -(2280403, 6, 10), -(2280404, 6, 12), -(2280406, 6, 11), -(2280409, 6, 1), -(2280410, 6, 2), -(2280414, 6, 4), -(2280425, 6, 3), -(2280426, 6, 3), -(2280428, 6, 2), -(2280430, 6, 9), -(2280432, 6, 9), -(2280448, 6, 10), -(2280451, 6, 12), -(2280453, 6, 11), -(2280455, 6, 7), -(2280456, 6, 5), -(2280458, 6, 8), -(2280461, 6, 16), -(2280464, 6, 6), -(2299601, 6, 6), -(2308332, 5, 1), -(2308333, 5, 3), -(2308340, 5, 3), -(2308346, 5, 3), -(2308354, 5, 5), -(2308355, 5, 4), -(2308361, 5, 8), -(2308363, 5, 16), -(2308364, 5, 13), -(2308366, 5, 17), -(2341847, 7, 4), -(2341870, 7, 6), -(2341892, 7, 10), -(2349784, 4, 5), -(2349791, 4, 2), -(2349792, 4, 5), -(2349794, 4, 5), -(2349857, 4, 5), -(2349858, 4, 5), -(2349860, 4, 5), -(2351856, 6, 4), -(2351858, 6, 4), -(2351870, 6, 4), -(2381027, 6, 4), -(2381028, 6, 4), -(2381029, 6, 10), -(2381030, 6, 8), -(2381031, 6, 6), -(2381032, 6, 7), -(2381033, 6, 4), -(2381034, 6, 4), -(2381035, 6, 4), -(2381036, 6, 4), -(2381037, 6, 4), -(2381038, 6, 4), -(2381039, 6, 7), -(2381040, 6, 13), -(2381041, 6, 7), -(2381044, 6, 4), -(2422825, 6, 4), -(2453661, 6, 4), -(2453677, 7, 1), -(2453678, 7, 13), -(2453679, 7, 15), -(2453681, 7, 13), -(2453682, 7, 13), -(2453685, 7, 5), -(2453686, 7, 8), -(2453687, 7, 8), -(2453688, 7, 8), -(2453689, 7, 8), -(2453690, 7, 8), -(2465005, 4, 4), -(2465008, 4, 6), -(2465009, 4, 6), -(2465010, 4, 2), -(2465013, 4, 2), -(2465017, 4, 10), -(2465018, 4, 13), -(2465019, 4, 10), -(2465025, 4, 9), -(2465028, 4, 9), -(2465029, 4, 9), -(2465059, 5, 3), -(2465060, 5, 19), -(2465061, 5, 19), -(2465064, 5, 12), -(2465069, 5, 15), -(2465072, 5, 17), -(2496282, 4, 11), -(2496289, 4, 5), -(2496437, 4, 2), -(2499345, 7, 1), -(2563317, 5, 1), -(2563790, 6, 5), -(2563792, 6, 5), -(2563798, 6, 4), -(2563804, 6, 12), -(2563859, 6, 9), -(2563867, 6, 9), -(2563868, 6, 9), -(2563872, 6, 9), -(2563875, 6, 9), -(2563882, 7, 1), -(2564149, 4, 11), -(2564152, 4, 11), -(2564171, 4, 11), -(2622826, 4, 5), -(2622881, 4, 11), -(2622884, 4, 11), -(2622886, 4, 11), -(2652480, 4, 1), -(2652490, 4, 1), -(2763450, 6, 7), -(2763451, 6, 7), -(2763452, 6, 7), -(2927639, 5, 6), -(3643234, 16, 1), -(3643236, 16, 1), -(3643414, 16, 2), -(3643415, 16, 2), -(3643457, 16, 3), -(3643485, 16, 3), -(3643486, 16, 3), -(3643487, 16, 3), -(3643488, 16, 3), -(3643489, 16, 4), -(3643491, 16, 6), -(3643495, 16, 7), -(3643496, 16, 7), -(3643498, 16, 7), -(3643499, 16, 7), -(3643500, 16, 10), -(3643501, 16, 7), -(3643502, 16, 10), -(3643503, 16, 10), -(3643504, 16, 10), -(3643505, 16, 10), -(3643506, 16, 9), -(3643507, 16, 9), -(3643509, 16, 8), -(3643556, 16, 2), -(3643588, 16, 2), -(3643589, 16, 2), -(3643590, 16, 1), -(3643597, 16, 3), -(3643598, 16, 4), -(3643602, 16, 5), -(3643604, 16, 9), -(3643605, 16, 8), -(3643606, 16, 10), -(3643607, 16, 8), -(3643649, 21, 1), -(3643706, 21, 1), -(3643707, 21, 3), -(3643708, 21, 1), -(3643709, 21, 2), -(3643715, 21, 4), -(3643728, 21, 4), -(3643815, 21, 5), -(3643825, 21, 5), -(3643831, 21, 3), -(3643841, 21, 6), -(3643859, 21, 7), -(3643862, 21, 5), -(3643864, 21, 8), -(3643865, 21, 5), -(3643871, 21, 8), -(3643879, 21, 6), -(3645046, 21, 10), -(3645058, 21, 10), -(3645548, 21, 9), -(3645576, 21, 9), -(3645590, 21, 11), -(3645591, 21, 9), -(3645607, 21, 9), -(3645675, 21, 11), -(3645684, 21, 11), -(3645746, 21, 12), -(3645751, 21, 13), -(3645793, 21, 12), -(3645800, 21, 12), -(3646818, 21, 1), -(3646820, 21, 1), -(3646848, 21, 3), -(3646849, 21, 3), -(3647060, 21, 4), -(3647062, 21, 5), -(3647073, 21, 6), -(3647079, 21, 7), -(3647131, 21, 8), -(3647136, 21, 10), -(3647138, 21, 6), -(3647142, 21, 9), -(3647308, 21, 12), -(3649749, 21, 6), -(3649760, 21, 6), -(3692932, 16, 2), -(3692933, 16, 1), -(3692941, 16, 7), -(3692942, 16, 2), -(3692943, 16, 7), -(3692944, 16, 7), -(3692948, 16, 2), -(3692961, 16, 3), -(3692965, 16, 3), -(3692973, 16, 4), -(3692975, 16, 4), -(3692976, 16, 4), -(3692977, 16, 4), -(3693075, 16, 4), -(3693080, 16, 4), -(3693104, 16, 6), -(3693126, 16, 5), -(3693128, 16, 5), -(3693148, 16, 7), -(3693159, 16, 7), -(3693168, 16, 7), -(3693169, 16, 7), -(3693181, 16, 10), -(3693182, 16, 7), -(3693189, 16, 8), -(3693190, 16, 8), -(3746497, 9, 1), -(3746504, 9, 10), -(3746513, 9, 1), -(3746515, 9, 11), -(3746546, 9, 7), -(3746643, 9, 8), -(3746648, 9, 12), -(3746649, 9, 13), -(3746650, 9, 13), -(3762950, 9, 2), -(3784410, 9, 1), -(3784508, 9, 2), -(3784514, 9, 2), -(3784517, 9, 2), -(3784520, 9, 2), -(3784522, 9, 2), -(3784563, 9, 7), -(3784565, 9, 7), -(3861103, 16, 2), -(3861106, 16, 2), -(3861109, 16, 2), -(3861111, 16, 2), -(3861113, 16, 2), -(3899968, 7, 15), -(3907414, 4, 5), -(3907879, 4, 1), -(3907888, 4, 1), -(3907897, 4, 2), -(3907899, 4, 2), -(3907901, 4, 2), -(3907902, 4, 2), -(3907903, 4, 2), -(3907908, 4, 2), -(3907909, 4, 2), -(3908308, 4, 9), -(3908312, 4, 9), -(3908313, 4, 9), -(3923782, 16, 3), -(3923784, 16, 3), -(3923785, 16, 3), -(3923789, 16, 3), -(3923790, 16, 3), -(3925825, 4, 11), -(3929402, 4, 1), -(3975004, 15, 1), -(3975007, 15, 2), -(3975011, 15, 3), -(3975015, 15, 6), -(3975127, 15, 1), -(3975132, 15, 1), -(3975135, 15, 3), -(3975138, 15, 2), -(3975183, 15, 3), -(3975188, 15, 3), -(3975191, 15, 3), -(3975192, 15, 3), -(3975196, 15, 4), -(3975198, 15, 4), -(3975202, 15, 4), -(3975204, 15, 4), -(3975205, 15, 4), -(3975208, 15, 4), -(3975212, 15, 4), -(3975215, 15, 3), -(3975217, 15, 3), -(3975223, 15, 3), -(3975229, 15, 3), -(3975232, 15, 3), -(3975233, 15, 5), -(3975242, 15, 5), -(3975244, 15, 5), -(3975251, 15, 6), -(3975256, 15, 5), -(3975261, 15, 7), -(3975267, 15, 6), -(3975272, 15, 6), -(3975278, 15, 6), -(3975282, 15, 6), -(3975283, 15, 6), -(3975285, 15, 6), -(4091012, 31, 1), -(4091018, 31, 2), -(4091019, 31, 2), -(4092388, 31, 1), -(4092418, 31, 3), -(4092425, 31, 4), -(4092429, 31, 4), -(4092430, 31, 7), -(4092431, 31, 9), -(4092432, 31, 8), -(4092433, 31, 4), -(4092435, 31, 7), -(4092436, 31, 4), -(4092437, 31, 4), -(4092438, 31, 10), -(4092439, 31, 10), -(4092440, 31, 10), -(4092444, 31, 11), -(4092449, 31, 11), -(4092471, 31, 3), -(4092472, 31, 3), -(4092534, 31, 1), -(4092536, 31, 2), -(4092537, 31, 2), -(4092538, 31, 3), -(4092539, 31, 3), -(4092540, 31, 4), -(4092541, 31, 4), -(4092542, 31, 7), -(4092543, 31, 7), -(4092544, 31, 8), -(4092545, 31, 4), -(4092546, 31, 9), -(4092547, 31, 10), -(4092548, 31, 11), -(4098244, 20, 1), -(4098246, 20, 2), -(4098252, 20, 2), -(4098653, 20, 2), -(4098655, 20, 3), -(4098662, 20, 5), -(4098665, 20, 6), -(4098675, 20, 6), -(4098680, 20, 7), -(4098686, 20, 8), -(4098719, 20, 10), -(4098723, 20, 10), -(4098733, 20, 12), -(4098786, 20, 1), -(4098790, 20, 1), -(4098794, 20, 1), -(4098812, 20, 1), -(4098843, 20, 4), -(4098858, 20, 2), -(4098869, 20, 2), -(4098978, 20, 5), -(4098984, 20, 3), -(4098990, 20, 3), -(4098991, 20, 3), -(4098996, 20, 4), -(4099007, 20, 4), -(4099014, 20, 7), -(4099017, 20, 6), -(4099024, 20, 6), -(4099214, 20, 6), -(4099220, 20, 6), -(4099234, 20, 6), -(4099313, 20, 8), -(4099338, 20, 8), -(4099357, 20, 8), -(4099376, 20, 9), -(4099424, 20, 10), -(4099430, 20, 10), -(4099464, 20, 12), -(4101783, 24, 1), -(4101846, 24, 2), -(4101870, 24, 3), -(4101889, 24, 4), -(4101896, 24, 4), -(4101900, 24, 5), -(4101904, 24, 5), -(4101907, 24, 6), -(4101914, 24, 8), -(4102354, 24, 1), -(4102358, 24, 1), -(4102359, 24, 1), -(4102360, 24, 1), -(4102361, 24, 2), -(4102365, 24, 3), -(4102371, 24, 3), -(4102372, 24, 3), -(4102373, 24, 3), -(4102375, 24, 6), -(4102377, 24, 4), -(4102378, 24, 4), -(4102379, 24, 4), -(4102381, 24, 8), -(4103415, 31, 4), -(4107623, 41, 8), -(4121883, 45, 1), -(4121897, 45, 2), -(4121909, 45, 3), -(4121915, 45, 3), -(4121922, 45, 4), -(4123952, 45, 4), -(4123953, 45, 5), -(4125929, 45, 6), -(4125941, 45, 7), -(4125947, 45, 8), -(4125950, 45, 8), -(4125987, 45, 9), -(4125993, 45, 10), -(4126016, 45, 11), -(4126017, 45, 8), -(4126028, 45, 11), -(4126039, 45, 12), -(4126040, 45, 13), -(4126043, 45, 13), -(4126044, 45, 13), -(4126049, 45, 14), -(4126052, 45, 15), -(4126375, 45, 2), -(4126377, 45, 3), -(4126378, 45, 7), -(4126383, 45, 11), -(4126384, 45, 11), -(4126386, 45, 11), -(4126394, 45, 15), -(4127125, 45, 8), -(4127126, 45, 8), -(4127132, 45, 9), -(4127137, 45, 12), -(4127141, 45, 12), -(4142953, 41, 10), -(4142959, 41, 13), -(4142960, 41, 9), -(4143007, 41, 8), -(4143009, 41, 9), -(4143011, 41, 8), -(4143012, 41, 11), -(4143014, 41, 9), -(4143143, 41, 13), -(4143144, 41, 13), -(4143146, 41, 13), -(4143147, 41, 13), -(4143154, 41, 13), -(4161435, 15, 1), -(4161439, 15, 3), -(4161440, 15, 3), -(4161442, 15, 3), -(4161449, 15, 4), -(4161453, 15, 4), -(4161456, 15, 6), -(4161457, 15, 6), -(4161462, 15, 5), -(4162133, 17, 1), -(4162142, 17, 3), -(4162143, 17, 4), -(4162144, 17, 5), -(4162145, 17, 6), -(4162147, 17, 8), -(4162148, 17, 9), -(4162150, 17, 11), -(4162153, 17, 12), -(4162154, 17, 13), -(4162155, 17, 13), -(4162317, 17, 10), -(4162319, 17, 7), -(4162320, 17, 6), -(4162321, 17, 6), -(4162322, 17, 12), -(4162323, 17, 4), -(4162324, 17, 5), -(4162325, 17, 2), -(4162326, 17, 2), -(4162328, 17, 2), -(4162329, 17, 1), -(4164611, 17, 12), -(4164620, 17, 6), -(4164648, 17, 8), -(4164654, 17, 8), -(4164656, 17, 8), -(4164663, 17, 10), -(4164693, 17, 6), -(4164698, 17, 4), -(4164699, 17, 4), -(4164700, 17, 5), -(4164701, 17, 5), -(4164706, 17, 5), -(4164707, 17, 5), -(4164708, 17, 5), -(4164715, 17, 2), -(4164723, 17, 1), -(4164725, 17, 2), -(4164727, 17, 2), -(4164728, 17, 2), -(4164731, 17, 4), -(4164732, 17, 4), -(4164735, 17, 1), -(4164739, 17, 3), -(4164740, 17, 1), -(4164742, 17, 1), -(4164846, 18, 2), -(4164858, 18, 1), -(4164859, 18, 1), -(4164861, 18, 1), -(4164905, 18, 3), -(4164912, 18, 4), -(4164914, 18, 4), -(4164917, 18, 5), -(4164923, 18, 6), -(4164924, 18, 7), -(4164926, 18, 7), -(4164929, 18, 7), -(4164931, 18, 8), -(4164934, 18, 6), -(4164937, 18, 9), -(4164938, 18, 9), -(4164940, 18, 10), -(4164942, 18, 11), -(4164944, 18, 11), -(4164947, 18, 13), -(4164950, 18, 15), -(4164952, 18, 16), -(4164953, 18, 17), -(4164955, 18, 18), -(4164956, 18, 18), -(4164957, 18, 18), -(4164958, 18, 19), -(4165006, 18, 1), -(4165007, 18, 1), -(4165009, 18, 1), -(4165010, 18, 1), -(4165044, 18, 3), -(4165045, 18, 3), -(4165048, 18, 2), -(4165049, 18, 2), -(4165050, 18, 2), -(4165051, 18, 2), -(4165052, 18, 2), -(4165053, 18, 2), -(4165054, 18, 2), -(4165055, 18, 2), -(4165056, 18, 1), -(4165057, 18, 3), -(4165058, 18, 3), -(4165059, 18, 3), -(4165061, 18, 4), -(4165063, 18, 4), -(4165064, 18, 4), -(4165065, 18, 4), -(4165066, 18, 4), -(4165079, 18, 7), -(4165089, 18, 7), -(4165091, 18, 6), -(4165095, 18, 7), -(4165097, 18, 8), -(4165098, 18, 8), -(4165101, 18, 9), -(4165132, 18, 10), -(4165138, 18, 11), -(4165141, 18, 13), -(4165146, 18, 4), -(4165147, 18, 14), -(4165587, 18, 13), -(4165761, 19, 1), -(4165762, 19, 3), -(4165763, 19, 4), -(4165767, 19, 2), -(4165768, 19, 1), -(4165770, 19, 3), -(4165774, 19, 1), -(4165784, 19, 7), -(4165786, 19, 6), -(4165787, 19, 6), -(4165788, 19, 7), -(4165789, 19, 1), -(4165790, 19, 4), -(4165791, 19, 1), -(4165792, 19, 3), -(4165793, 19, 7), -(4165795, 19, 7), -(4165798, 19, 1), -(4165826, 19, 2), -(4165830, 30, 1), -(4165834, 30, 3), -(4165838, 30, 6), -(4165843, 30, 1), -(4165845, 30, 4), -(4165862, 30, 3), -(4165870, 30, 5), -(4170242, 8, 1), -(4170252, 8, 2), -(4170268, 8, 2), -(4170279, 8, 3), -(4170285, 8, 4), -(4170288, 8, 5), -(4170294, 8, 6), -(4170300, 8, 7), -(4170349, 8, 8), -(4170358, 8, 9), -(4170364, 8, 10), -(4170368, 8, 11), -(4170389, 8, 11), -(4170407, 8, 4), -(4170413, 8, 6), -(4170416, 8, 3), -(4170420, 8, 5), -(4170421, 8, 5), -(4170429, 8, 9), -(4170439, 8, 10), -(4170443, 8, 11), -(4170448, 8, 11), -(4175720, 16, 7), -(4191057, 6, 4), -(4191058, 6, 5), -(4191060, 6, 5), -(4191062, 6, 4), -(4191063, 6, 4), -(4191065, 6, 4), -(4191066, 6, 7), -(4191069, 6, 7), -(4191070, 6, 6), -(4191075, 6, 5), -(4191081, 6, 6), -(4200506, 17, 4), -(4200508, 17, 2), -(4203968, 20, 5), -(4203976, 20, 5), -(4203984, 20, 5), -(4204051, 21, 11), -(4204061, 21, 3), -(4204069, 21, 6), -(4204078, 21, 12), -(4204084, 21, 12), -(4204092, 21, 6), -(4218112, 20, 2), -(4218256, 20, 6), -(4218258, 20, 6), -(4218268, 21, 6), -(4230667, 32, 1), -(4230669, 32, 2), -(4230670, 32, 3), -(4230673, 32, 6), -(4230674, 32, 6), -(4230675, 32, 6), -(4230676, 32, 7), -(4230677, 32, 9), -(4230682, 32, 4), -(4230684, 32, 6), -(4230685, 32, 6), -(4230686, 32, 6), -(4230687, 32, 7), -(4230689, 32, 9), -(4230690, 32, 1), -(4235276, 38, 2), -(4235277, 38, 4), -(4235282, 38, 6), -(4235309, 38, 7), -(4235312, 38, 10), -(4236358, 15, 6), -(4237484, 38, 3), -(4237485, 38, 4), -(4237487, 38, 8), -(4237488, 38, 10), -(4238993, 86, 6), -(4238994, 86, 7), -(4238996, 86, 7), -(4239000, 86, 7), -(4239001, 86, 7), -(4239002, 86, 8), -(4239003, 86, 9), -(4239004, 86, 10), -(4239005, 86, 10), -(4239009, 86, 12), -(4241594, 20, 1), -(4241611, 21, 1), -(4241612, 21, 2), -(4241928, 45, 12), -(4242048, 45, 7), -(4242604, 15, 1), -(4242605, 15, 1), -(4242609, 15, 1), -(4242610, 15, 1), -(4247747, 53, 1), -(4247847, 53, 1), -(4247850, 53, 1), -(4247852, 53, 1), -(4247856, 53, 1), -(4247877, 53, 2), -(4247879, 53, 2), -(4247884, 53, 3), -(4247885, 53, 2), -(4247888, 53, 3), -(4247906, 53, 4), -(4247927, 53, 4), -(4248224, 53, 5), -(4248230, 53, 5), -(4248232, 53, 5), -(4248236, 53, 5), -(4248241, 53, 5), -(4248262, 53, 6), -(4248265, 53, 6), -(4248272, 53, 7), -(4248277, 53, 7), -(4248291, 53, 8), -(4248293, 53, 9), -(4248308, 53, 9), -(4248340, 53, 6), -(4248346, 53, 10), -(4248351, 53, 10), -(4248359, 53, 11), -(4248390, 53, 12), -(4248398, 53, 12), -(4248402, 53, 12), -(4248430, 53, 12), -(4248444, 53, 13), -(4248486, 53, 13), -(4248488, 53, 13), -(4248490, 53, 14), -(4248491, 53, 15), -(4248517, 53, 16), -(4248520, 53, 16), -(4248523, 53, 16), -(4248529, 53, 16), -(4248537, 53, 16), -(4248539, 53, 17), -(4248613, 53, 16), -(4248638, 53, 16), -(4248684, 53, 16), -(4248689, 53, 18), -(4248796, 53, 19), -(4248833, 53, 19), -(4248837, 53, 19), -(4248842, 53, 20), -(4248886, 53, 21), -(4248889, 53, 21), -(4248890, 53, 21), -(4248892, 53, 22), -(4248922, 53, 1), -(4248924, 53, 1), -(4248926, 53, 1), -(4248931, 53, 1), -(4248933, 53, 1), -(4248935, 53, 1), -(4248936, 53, 1), -(4248942, 53, 1), -(4248943, 53, 1), -(4248947, 53, 1), -(4248950, 53, 1), -(4248965, 53, 3), -(4248968, 53, 3), -(4248971, 53, 3), -(4248972, 53, 4), -(4248975, 53, 4), -(4248976, 53, 4), -(4248982, 53, 4), -(4248988, 53, 4), -(4249002, 53, 5), -(4249008, 53, 5), -(4249027, 53, 7), -(4249037, 53, 9), -(4249038, 53, 9), -(4249041, 53, 9), -(4249047, 53, 8), -(4249060, 53, 19), -(4249068, 53, 19), -(4249070, 53, 18), -(4249075, 53, 18), -(4249078, 53, 16), -(4249084, 53, 16), -(4249089, 53, 16), -(4249092, 53, 20), -(4249093, 53, 1), -(4249094, 53, 20), -(4249565, 53, 10), -(4249569, 53, 12), -(4249570, 53, 12), -(4249572, 53, 12), -(4249573, 53, 12), -(4249574, 53, 12), -(4249577, 53, 12), -(4249587, 53, 12), -(4249589, 53, 12), -(4249605, 53, 15), -(4249617, 53, 14), -(4249639, 53, 1), -(4249643, 53, 1), -(4251428, 53, 4), -(4262477, 38, 6), -(4262478, 38, 6), -(4278339, 43, 2), -(4278406, 43, 2), -(4278410, 43, 2), -(4278415, 43, 4), -(4278417, 43, 5), -(4278419, 43, 5), -(4278420, 43, 5), -(4278432, 43, 5), -(4278438, 43, 4), -(4278461, 43, 7), -(4278472, 43, 8), -(4278474, 43, 8), -(4278494, 43, 8), -(4279992, 43, 9), -(4280840, 43, 10), -(4282568, 43, 11), -(4282573, 43, 12), -(4282574, 43, 13), -(4282585, 43, 14), -(4282592, 43, 13), -(4282598, 43, 16), -(4283510, 43, 8), -(4283661, 43, 10), -(4284218, 43, 2), -(4284220, 43, 8), -(4284346, 43, 9), -(4284350, 43, 10), -(4284353, 43, 12), -(4284354, 43, 13), -(4284356, 43, 11), -(4284479, 43, 14), -(4284483, 43, 16), -(4284485, 43, 8), -(4284655, 71, 1), -(4284668, 71, 7), -(4284672, 71, 10), -(4284679, 71, 3), -(4287170, 86, 8), -(4287171, 86, 8), -(4287437, 71, 9), -(4287440, 71, 12), -(4303212, 71, 13), -(4303238, 71, 2), -(4303276, 71, 1), -(4303280, 71, 2), -(4303285, 71, 6), -(4303288, 71, 10), -(4310468, 19, 1), -(4310490, 19, 4), -(4310494, 19, 4), -(4311173, 19, 3), -(4311182, 19, 4), -(4313896, 32, 4), -(4313898, 32, 8), -(4313956, 38, 3), -(4313961, 38, 5), -(4313968, 38, 7), -(4313975, 103, 15), -(4317154, 71, 4), -(4317155, 71, 5), -(4317176, 71, 3), -(4317193, 71, 8), -(4317200, 71, 11), -(4322392, 47, 1), -(4322393, 47, 2), -(4322394, 47, 2), -(4322395, 47, 2), -(4322396, 47, 3), -(4322398, 47, 2), -(4322399, 47, 3), -(4322400, 47, 3), -(4322404, 47, 4), -(4322408, 47, 4), -(4322411, 47, 4), -(4322417, 47, 6), -(4322427, 47, 7), -(4322428, 47, 7), -(4322429, 47, 7), -(4322431, 47, 8), -(4322434, 47, 7), -(4322439, 47, 5), -(4322441, 47, 15), -(4322442, 47, 10), -(4322444, 47, 10), -(4322445, 47, 10), -(4322449, 47, 11), -(4322453, 47, 11), -(4322455, 47, 13), -(4322458, 47, 12), -(4322459, 47, 12), -(4322841, 103, 12), -(4322860, 37, 1), -(4322861, 37, 1), -(4322862, 37, 1), -(4322864, 37, 1), -(4322867, 37, 3), -(4322868, 37, 3), -(4322870, 37, 3), -(4322871, 37, 4), -(4322872, 37, 5), -(4322969, 37, 5), -(4322970, 37, 5), -(4322971, 37, 6), -(4322973, 37, 6), -(4322974, 37, 7), -(4322975, 37, 8), -(4322976, 37, 8), -(4322977, 37, 8), -(4322978, 37, 8), -(4322979, 37, 9), -(4323354, 85, 11), -(4323360, 85, 11), -(4323383, 85, 8), -(4323387, 85, 8), -(4323412, 85, 8), -(4323414, 85, 8), -(4323419, 85, 9), -(4323420, 85, 9), -(4323427, 85, 10), -(4323428, 85, 10), -(4323429, 85, 10), -(4323431, 85, 11), -(4323432, 85, 8), -(4328706, 103, 13), -(4328707, 103, 12), -(4328816, 103, 12), -(4328833, 103, 12), -(4328892, 103, 13), -(4328894, 103, 13), -(4328897, 103, 15), -(4328902, 103, 15), -(4332187, 21, 6), -(4332188, 21, 6), -(4332189, 21, 6), -(4332518, 20, 6), -(4332767, 53, 12), -(4332770, 53, 12), -(4333235, 20, 9), -(4334276, 20, 4), -(4334728, 16, 3), -(4334730, 16, 7), -(4334751, 30, 5), -(4334881, 21, 7), -(4334882, 21, 13), -(4334885, 7, 7), -(4335536, 5, 2), -(4335666, 43, 2), -(4335670, 43, 8), -(4373250, 20, 10), -(4373251, 20, 10), -(4373252, 20, 10), -(4373253, 20, 10), -(4374258, 18, 15), -(4374678, 16, 7), -(4374738, 20, 8), -(4374739, 20, 8), -(4395364, 134, 12), -(4404417, 134, 12), -(4404426, 134, 12), -(4404431, 134, 12), -(4404435, 134, 12), -(4404439, 134, 12), -(4404440, 134, 12), -(4404442, 134, 12), -(4404445, 134, 12), -(4404450, 134, 12), -(4404451, 134, 12), -(4404452, 134, 12), -(4481391, 142, 12), -(4481392, 142, 15), -(4481393, 142, 11), -(4481404, 142, 11), -(4481407, 142, 13), -(4481409, 142, 12), -(4481412, 142, 15), -(4481413, 142, 15), -(4481414, 142, 15), -(4481415, 142, 15), -(4481416, 142, 15), -(4481418, 142, 15), -(4488408, 139, 12), -(4488410, 139, 12), -(4488411, 139, 12), -(4488413, 139, 14), -(4488416, 139, 13), -(4488417, 139, 12), -(4488419, 139, 11), -(4488420, 139, 12), -(4488421, 139, 13), -(4488422, 139, 13), -(4488423, 139, 14), -(4488425, 139, 14), -(4488427, 139, 13), -(4488428, 139, 13), -(4488429, 139, 12), -(4488430, 139, 12), -(4488431, 139, 12), -(4488432, 139, 12), -(4488433, 139, 14), -(4488435, 139, 11), -(4488438, 139, 12), -(4489186, 71, 3), -(4489187, 71, 3), -(4489188, 71, 3), -(4489189, 71, 3), -(4489190, 71, 3), -(4489192, 71, 3), -(4489193, 71, 3), -(4489194, 71, 3), -(4489195, 71, 3), -(4489236, 71, 1), -(4489237, 71, 10), -(4515268, 142, 11), -(4515306, 142, 12), -(4515308, 142, 12), -(4515382, 142, 13), -(4515386, 142, 15), -(4515612, 139, 12), -(4515623, 139, 13), -(4515624, 139, 13), -(4515625, 139, 13), -(4515681, 139, 12), -(4515697, 139, 12), -(4515699, 139, 13), -(4515701, 139, 14), -(4515702, 139, 14), -(4515703, 139, 13), -(4515704, 139, 13), -(4515705, 139, 13), -(4515706, 139, 12), -(4515707, 139, 12), -(4515708, 139, 12), -(4515709, 139, 12), -(4515711, 139, 14), -(4515713, 139, 11), -(4516011, 139, 12), -(4517194, 139, 12), -(4559071, 157, 1), -(4559075, 157, 3), -(4559076, 157, 4), -(4559077, 157, 4), -(4559078, 157, 5), -(4559085, 157, 6), -(4559086, 157, 6), -(4559087, 157, 7), -(4559088, 157, 5), -(4559091, 157, 8), -(4559092, 157, 8), -(4559093, 157, 10), -(4559094, 157, 9), -(4569450, 145, 1), -(4569451, 145, 5), -(4569461, 145, 3), -(4569464, 145, 3), -(4569465, 145, 4), -(4569471, 145, 10), -(4569472, 145, 11), -(4569479, 145, 6), -(4586009, 4, 7), -(4627320, 145, 6), -(4627322, 145, 7), -(4627324, 145, 7), -(4627332, 145, 9), -(4630742, 145, 11), -(4634055, 151, 4), -(4634056, 151, 6), -(4634059, 151, 1), -(4634062, 151, 1), -(4634065, 151, 2), -(4634083, 151, 4), -(4634094, 151, 5), -(4634095, 151, 6), -(4634104, 151, 7), -(4634106, 151, 7), -(4634712, 151, 6), -(4634715, 151, 7), -(4635476, 148, 1), -(4635477, 148, 2), -(4635478, 148, 3), -(4635479, 148, 5), -(4635480, 148, 6), -(4639200, 151, 4), -(4639204, 151, 8), -(4639208, 151, 6), -(4660176, 165, 1), -(4660177, 165, 1), -(4660178, 165, 2), -(4660179, 165, 2), -(4660180, 165, 3), -(4660181, 165, 3), -(4660182, 165, 4), -(4660183, 165, 5), -(4660184, 165, 6), -(4660185, 165, 7), -(4660186, 165, 8), -(4660187, 165, 9), -(4660189, 165, 11), -(4660190, 165, 2), -(4660194, 165, 3), -(4660195, 165, 11), -(4660197, 165, 12), -(4660198, 165, 13), -(4665752, 18, 11), -(4665756, 18, 11), -(4665759, 18, 11), -(4665766, 18, 11), -(4665773, 18, 11), -(4665788, 30, 4), -(4695119, 148, 5), -(4721268, 157, 10), -(4721270, 157, 11), -(4721271, 157, 11), -(4721272, 157, 12), -(4721273, 157, 13), -(4755366, 18, 18), -(4755385, 165, 11), -(4755389, 165, 12), -(4755390, 165, 13), -(4757557, 168, 4), -(4757558, 168, 5), -(4757560, 168, 5), -(4757561, 168, 6), -(4757563, 168, 8), -(4757565, 168, 9), -(4757566, 168, 10), -(4757569, 168, 11), -(4759603, 164, 12), -(4759604, 164, 12), -(4759652, 164, 13), -(4759654, 164, 14), -(4760563, 164, 12), -(4760674, 164, 12), -(4760676, 164, 12), -(4760683, 164, 12), -(4760685, 164, 12), -(4760689, 164, 14), -(4768065, 169, 1), -(4768067, 169, 1), -(4768073, 169, 7), -(4768082, 169, 8), -(4768083, 169, 8), -(4768084, 169, 8), -(4768085, 169, 9), -(4768087, 169, 1), -(4768094, 169, 7), -(4768099, 169, 6), -(4768100, 169, 8), -(4768101, 169, 8), -(4768102, 169, 9), -(4768103, 169, 7), -(4889986, 7, 10), -(4889987, 7, 3), -(4889991, 7, 3), -(4889995, 7, 3), -(4890336, 182, 1), -(4890497, 182, 1), -(4890506, 182, 3), -(4890535, 182, 3), -(4890651, 182, 3), -(4890664, 182, 12), -(4890679, 182, 9), -(4890766, 182, 9), -(4890770, 182, 10), -(4890776, 182, 10), -(4890780, 182, 11), -(4890784, 182, 12), -(4890786, 182, 13), -(4890788, 182, 14), -(4890791, 182, 15), -(4902564, 190, 6), -(4902565, 190, 6), -(4902566, 190, 7), -(4902567, 190, 8), -(4902568, 190, 8), -(4902569, 190, 8), -(4902571, 190, 10), -(4902572, 190, 11), -(4902573, 190, 8), -(4972550, 168, 1), -(4972551, 168, 2), -(4980983, 174, 1), -(4980985, 174, 2), -(4980993, 174, 2), -(4980994, 174, 4), -(4980995, 174, 4), -(4980997, 174, 5), -(4980998, 174, 5), -(4980999, 174, 5), -(4981002, 174, 6), -(4981003, 174, 6), -(4981004, 174, 7), -(4981005, 174, 7), -(4981006, 174, 7), -(4981007, 174, 8), -(4981009, 174, 9), -(4981010, 174, 10), -(4982004, 169, 2), -(4982007, 169, 3), -(4982009, 169, 3), -(4982039, 169, 4), -(4982041, 169, 5), -(4982050, 169, 5), -(4982051, 169, 6), -(5018506, 169, 3), -(5018517, 169, 4), -(5018518, 169, 4), -(5018519, 169, 5), -(5018520, 169, 5), -(5018524, 169, 7), -(5018525, 169, 7), -(5018526, 169, 9), -(5018528, 169, 9), -(5032226, 182, 3), -(5034828, 182, 15), -(5034833, 182, 15), -(5034834, 182, 15), -(5119555, 169, 3), -(5119560, 169, 3), -(5321547, 190, 11), -(5321639, 190, 7), -(5348496, 182, 10), -(5476910, 182, 3), -(5485941, 182, 9), -(5579669, 203, 10), -(5680661, 203, 10), -(5681112, 203, 9), -(5681115, 203, 11), -(5681121, 203, 10), -(5681124, 85, 11), -(5681153, 203, 10), -(5681166, 203, 11), -(5759673, 243, 1), -(5759683, 243, 5), -(5759685, 243, 5), -(5759692, 243, 6), -(5759696, 243, 7), -(5759698, 243, 9), -(5759701, 243, 11), -(5759705, 243, 12), -(5759706, 243, 14), -(5759708, 243, 14), -(5762435, 243, 4), -(5762437, 243, 8), -(5762441, 243, 14), -(5795788, 252, 3), -(5795795, 252, 3), -(5795796, 252, 3), -(5840909, 252, 5), -(5840914, 252, 6), -(5840915, 252, 7), -(5840920, 252, 10), -(5840923, 252, 6), -(5858542, 239, 5), -(5864957, 230, 1), -(5865261, 230, 2), -(5865270, 230, 2), -(5865275, 230, 5), -(5865286, 230, 1), -(5865289, 230, 2), -(5868146, 243, 2), -(5868148, 243, 3), -(5868150, 243, 4), -(5868156, 243, 8), -(5868159, 243, 9), -(5868162, 243, 13), -(5868163, 243, 15), -(5874028, 237, 3), -(5874029, 237, 4), -(5874030, 237, 1), -(5874031, 237, 2), -(5874032, 237, 3), -(5878769, 248, 1), -(5879221, 241, 1), -(5896017, 211, 15), -(5908552, 252, 12), -(5908839, 248, 1), -(5908841, 248, 2), -(5908844, 248, 2), -(5908846, 248, 3), -(5908848, 248, 3), -(5908851, 248, 5), -(5908859, 248, 6), -(5908863, 248, 6), -(5908868, 248, 6), -(5908869, 248, 6), -(5909356, 248, 3), -(5909364, 248, 1), -(5909385, 248, 1), -(5909746, 211, 15), -(5909768, 211, 15), -(5909769, 211, 15), -(5909770, 211, 15), -(5909773, 211, 15), -(5909778, 211, 15), -(5909929, 214, 13), -(5909946, 214, 13), -(5909947, 214, 13), -(5909948, 214, 13), -(5909950, 214, 13), -(5909951, 214, 13), -(5909952, 214, 13), -(5909953, 214, 13), -(5909980, 214, 13), -(5910101, 216, 28), -(5910102, 216, 28), -(5910115, 216, 28), -(5910122, 216, 28), -(5910126, 216, 28), -(5910127, 216, 28), -(5910134, 216, 28), -(5910141, 216, 28), -(5910144, 216, 28), -(5910157, 216, 28), -(5910168, 216, 28), -(5910298, 255, 3), -(5910299, 255, 4), -(5910301, 239, 3), -(5910302, 239, 2), -(5910303, 239, 3), -(5910305, 239, 2), -(5910306, 239, 2), -(5910307, 239, 2), -(5910308, 239, 2), -(5911128, 241, 2), -(5911129, 241, 2), -(5911131, 241, 3), -(5911132, 241, 3), -(5911133, 241, 3), -(5911136, 241, 4), -(5911137, 241, 4), -(5911139, 241, 4), -(5911141, 241, 4), -(5911142, 241, 5), -(5911143, 241, 6), -(5911144, 241, 6), -(5911145, 241, 6), -(5911146, 241, 6), -(5911147, 241, 6), -(5911148, 241, 7), -(5911151, 241, 6), -(5911154, 241, 8), -(5911155, 241, 7), -(5911158, 241, 8), -(5911159, 241, 10), -(5911164, 241, 11), -(5911166, 241, 12), -(5911167, 241, 12), -(5911168, 241, 12), -(5911169, 241, 12), -(5911173, 241, 13), -(5911174, 241, 13), -(5911175, 241, 13), -(5911176, 241, 13), -(5911184, 241, 14), -(5911193, 241, 12), -(5911200, 241, 13), -(5911204, 241, 12), -(5911207, 241, 13), -(5911208, 241, 15), -(5913190, 213, 6), -(5913193, 214, 13), -(5913203, 216, 28), -(5915489, 211, 15), -(5915512, 211, 15), -(5915513, 211, 15), -(5915517, 211, 15), -(5915539, 211, 15), -(5915553, 211, 15), -(5915580, 211, 15), -(5915598, 211, 15), -(5915620, 211, 15), -(5915630, 211, 15), -(5915631, 211, 15), -(5915632, 211, 15), -(5915635, 211, 15), -(5915734, 211, 15), -(5915736, 211, 15), -(5915737, 211, 15), -(5915739, 211, 15), -(5915740, 211, 15), -(5915742, 211, 15), -(5917284, 211, 15), -(5917285, 211, 15), -(5917286, 211, 15), -(5917287, 211, 15), -(5917288, 211, 15), -(5917289, 211, 15), -(5917290, 211, 15), -(5917292, 211, 15), -(5917294, 211, 15), -(5917313, 211, 15), -(5917314, 211, 15), -(5917315, 211, 15), -(5917318, 211, 15), -(5917319, 211, 15), -(5917320, 211, 15), -(5917322, 211, 15), -(5917323, 211, 15), -(5917330, 211, 15), -(5917338, 211, 15), -(5917350, 211, 15), -(5917360, 211, 15), -(5917362, 211, 15), -(5917363, 211, 15), -(5917364, 211, 15), -(5919748, 213, 6), -(5919753, 213, 6), -(5919755, 213, 6), -(5919756, 213, 6), -(5919791, 213, 6), -(5919812, 213, 6), -(5919814, 213, 6), -(5919815, 213, 6), -(5919816, 213, 6), -(5919818, 213, 6), -(5919824, 213, 6), -(5919826, 213, 6), -(5919832, 213, 6), -(5919835, 213, 6), -(5919848, 213, 6), -(5919851, 213, 6), -(5919853, 213, 6), -(5919854, 213, 6), -(5919855, 213, 6), -(5919859, 213, 6), -(5919860, 213, 6), -(5919868, 213, 6), -(5919870, 213, 6), -(5919908, 213, 6), -(5919912, 213, 6), -(5919927, 213, 6), -(5919931, 213, 6), -(5919973, 213, 6), -(5920107, 213, 6), -(5920109, 213, 6), -(5920110, 213, 6), -(5920131, 213, 6), -(5920132, 213, 6), -(5920134, 213, 6), -(5920142, 213, 6), -(5920147, 213, 6), -(5921241, 214, 13), -(5921242, 214, 13), -(5921246, 214, 13), -(5921247, 214, 13), -(5921249, 214, 13), -(5921250, 214, 13), -(5921251, 214, 13), -(5921252, 214, 13), -(5921253, 214, 13), -(5921254, 214, 13), -(5921260, 214, 13), -(5921262, 214, 13), -(5921264, 214, 13), -(5921265, 214, 13), -(5921266, 214, 13), -(5921267, 214, 13), -(5921268, 214, 13), -(5921273, 214, 13), -(5921274, 214, 13), -(5921275, 214, 13), -(5921276, 214, 13), -(5921277, 214, 13), -(5921278, 214, 13), -(5921279, 214, 13), -(5921280, 214, 13), -(5921281, 214, 13), -(5921283, 214, 13), -(5921287, 214, 13), -(5921288, 214, 13), -(5921290, 214, 13), -(5921292, 214, 13), -(5921858, 216, 28), -(5921871, 216, 28), -(5921880, 216, 28), -(5921881, 216, 28), -(5921882, 216, 28), -(5921937, 216, 28), -(5921940, 216, 28), -(5921941, 216, 28), -(5921942, 216, 28), -(5921945, 216, 28), -(5921953, 216, 28), -(5921955, 216, 28), -(5921956, 216, 28), -(5921962, 216, 28), -(5921966, 216, 28), -(5921968, 216, 28), -(5921969, 216, 28), -(5921970, 216, 28), -(5921980, 216, 28), -(5921981, 216, 28), -(5921982, 216, 28), -(5921987, 216, 28), -(5921988, 216, 28), -(5921996, 216, 28), -(5921998, 216, 28), -(5921999, 216, 28), -(5922000, 216, 28), -(5922002, 216, 28), -(5922004, 216, 28), -(5922005, 216, 28), -(5922006, 216, 28), -(5922007, 216, 28), -(5922008, 216, 28), -(5922009, 216, 28), -(5922010, 216, 28), -(5922013, 216, 28), -(5922559, 216, 28), -(5922560, 216, 28), -(5925606, 211, 15), -(5925609, 211, 15), -(5925610, 211, 15), -(5925611, 211, 15), -(5925612, 211, 15), -(5925613, 211, 15), -(5925616, 211, 15), -(5925618, 211, 15), -(5925619, 211, 15), -(5925620, 211, 15), -(5925622, 211, 15), -(5925623, 211, 15), -(5925808, 211, 15), -(5925812, 211, 15), -(5925813, 211, 15), -(5925814, 211, 15), -(5925815, 211, 15), -(5925817, 211, 15), -(5925819, 211, 15), -(5925820, 211, 15), -(5925821, 211, 15), -(5925823, 211, 15), -(5925825, 211, 15), -(5925827, 211, 15), -(5925830, 211, 15), -(5925835, 211, 15), -(5925836, 211, 15), -(5925837, 211, 15), -(5925838, 211, 15), -(5925840, 211, 15), -(5925841, 211, 15), -(5925842, 211, 15), -(5925844, 211, 15), -(5925845, 211, 15), -(5925848, 211, 15), -(5925849, 211, 15), -(5925850, 211, 15), -(5925852, 211, 15), -(5925854, 211, 15), -(5925858, 211, 15), -(5925860, 211, 15), -(5926068, 211, 15), -(5926069, 211, 15), -(5926070, 211, 15), -(5926071, 211, 15), -(5926072, 211, 15), -(5926073, 211, 15), -(5926074, 211, 15), -(5926075, 211, 15), -(5926076, 211, 15), -(5926078, 211, 15), -(5926079, 211, 15), -(5926080, 211, 15), -(5926081, 211, 15), -(5926082, 211, 15), -(5926083, 211, 15), -(5926085, 211, 15), -(5926086, 211, 15), -(5926088, 211, 15), -(5926090, 211, 15), -(5926091, 211, 15), -(5926092, 211, 15), -(5926093, 211, 15), -(5926094, 211, 15), -(5926095, 211, 15), -(5926096, 211, 15), -(5926097, 211, 15), -(5926099, 211, 15), -(5926100, 211, 15), -(5926103, 211, 15), -(5926104, 211, 15), -(5926105, 211, 15), -(5926106, 211, 15), -(5926107, 211, 15), -(5926109, 211, 15), -(5926110, 211, 15), -(5926111, 211, 15), -(5926112, 211, 15), -(5926113, 211, 15), -(5926114, 211, 15), -(5926115, 211, 15), -(5926117, 211, 15), -(5926118, 211, 15), -(5926119, 211, 15), -(5926128, 211, 15), -(5926129, 211, 15), -(5926130, 211, 15), -(5926131, 211, 15), -(5926132, 211, 15), -(5926133, 211, 15), -(5926134, 211, 15), -(5926135, 211, 15), -(5926136, 211, 15), -(5926138, 211, 15), -(5926139, 211, 15), -(5926141, 211, 15), -(5926142, 211, 15), -(5926143, 211, 15), -(5926144, 211, 15), -(5926146, 211, 15), -(5926157, 211, 15), -(5926158, 211, 15), -(5926160, 211, 15), -(5926161, 211, 15), -(5926162, 211, 15), -(5926163, 211, 15), -(5926164, 211, 15), -(5926563, 211, 15), -(5926566, 211, 15), -(5926610, 211, 15), -(5926611, 211, 15), -(5926614, 211, 15), -(5926615, 211, 15), -(5926616, 211, 15), -(5926619, 211, 15), -(5926622, 211, 15), -(5926623, 211, 15), -(5926627, 211, 15), -(5926630, 211, 15), -(5926637, 211, 15), -(5926639, 211, 15), -(5926644, 211, 15), -(5926651, 211, 15), -(5926653, 211, 15), -(5926654, 211, 15), -(5926663, 211, 15), -(5926665, 211, 15), -(5926666, 211, 15), -(5926667, 211, 15), -(5926668, 211, 15), -(5926670, 211, 15), -(5926671, 211, 15), -(5926672, 211, 15), -(5926674, 211, 15), -(5926676, 211, 15), -(5926680, 211, 15), -(5926681, 211, 15), -(5926683, 211, 15), -(5926685, 211, 15), -(5926686, 211, 15), -(5926687, 211, 15), -(5926696, 211, 15), -(5926702, 211, 15), -(5926709, 211, 15), -(5926710, 211, 15), -(5926711, 211, 15), -(5926713, 211, 15), -(5926717, 211, 15), -(5926718, 211, 15), -(5926720, 211, 15), -(5926723, 211, 15), -(5926724, 211, 15), -(5926727, 211, 15), -(5926729, 211, 15), -(5926734, 211, 15), -(5926736, 211, 15), -(5926737, 211, 15), -(5926739, 211, 15), -(5926740, 211, 15), -(5926742, 211, 15), -(5926744, 211, 15), -(5926745, 211, 15), -(5926753, 211, 15), -(5926757, 211, 15), -(5926758, 211, 15), -(5926759, 211, 15), -(5926760, 211, 15), -(5927843, 248, 1), -(5927869, 248, 5), -(5927903, 248, 1), -(5927964, 241, 1), -(5927966, 241, 5), -(5927968, 241, 6), -(5927969, 241, 7), -(5927970, 241, 8), -(5927971, 241, 10), -(5927972, 241, 14), -(5927973, 241, 15), -(5930418, 213, 6), -(5930419, 213, 6), -(5930420, 213, 6), -(5930421, 213, 6), -(5930422, 213, 6), -(5930423, 213, 6), -(5930424, 213, 6), -(5930425, 213, 6), -(5930426, 213, 6), -(5930427, 213, 6), -(5930428, 213, 6), -(5930429, 213, 6), -(5930430, 213, 6), -(5930431, 213, 6), -(5930432, 213, 6), -(5930433, 213, 6), -(5930434, 213, 6), -(5930435, 213, 6), -(5930436, 213, 6), -(5930437, 213, 6), -(5930438, 213, 6), -(5930439, 213, 6), -(5930440, 213, 6), -(5930441, 213, 6), -(5930442, 213, 6), -(5930443, 213, 6), -(5930444, 213, 6), -(5930445, 213, 6), -(5930446, 213, 6), -(5930447, 213, 6), -(5930448, 213, 6), -(5930449, 213, 6), -(5930450, 213, 6), -(5930451, 213, 6), -(5930452, 213, 6), -(5930453, 213, 6), -(5930454, 213, 6), -(5930455, 213, 6), -(5930456, 213, 6), -(5930457, 213, 6), -(5930458, 213, 6), -(5930459, 213, 6), -(5930460, 213, 6), -(5930461, 213, 6), -(5930462, 213, 6), -(5930463, 213, 6), -(5930464, 213, 6), -(5930465, 213, 6), -(5930466, 213, 6), -(5930467, 213, 6), -(5930468, 213, 6), -(5930469, 213, 6), -(5930470, 213, 6), -(5930471, 213, 6), -(5930472, 213, 6), -(5930473, 213, 6), -(5930474, 213, 6), -(5930475, 213, 6), -(5930476, 213, 6), -(5930477, 213, 6), -(5930478, 213, 6), -(5930479, 213, 6), -(5930480, 213, 6), -(5930481, 213, 6), -(5930482, 213, 6), -(5930483, 213, 6), -(5930484, 213, 6), -(5930485, 213, 6), -(5930486, 213, 6), -(5930487, 213, 6), -(5930488, 213, 6), -(5930489, 213, 6), -(5930490, 213, 6), -(5930491, 213, 6), -(5930492, 213, 6), -(5930493, 213, 6), -(5930494, 213, 6), -(5930495, 213, 6), -(5930496, 213, 6), -(5930497, 213, 6), -(5930498, 213, 6), -(5930499, 213, 6), -(5930500, 213, 6), -(5933083, 216, 28), -(5933084, 216, 28), -(5933085, 216, 28), -(5933086, 216, 28), -(5933087, 216, 28), -(5933088, 216, 28), -(5933089, 216, 28), -(5933090, 216, 28), -(5933091, 216, 28), -(5933092, 216, 28), -(5933093, 216, 28), -(5933094, 216, 28), -(5933095, 216, 28), -(5933096, 216, 28), -(5933097, 216, 28), -(5933098, 216, 28), -(5933099, 216, 28), -(5933100, 216, 28), -(5933101, 216, 28), -(5933102, 216, 28), -(5933103, 216, 28), -(5933104, 216, 28), -(5933105, 216, 28), -(5933106, 216, 28), -(5933107, 216, 28), -(5933108, 216, 28), -(5933109, 216, 28), -(5933110, 216, 28), -(5933111, 216, 28), -(5933112, 216, 28), -(5933113, 216, 28), -(5933114, 216, 28), -(5933115, 216, 28), -(5933116, 216, 28), -(5933117, 216, 28), -(5933118, 216, 28), -(5933119, 216, 28), -(5933120, 216, 28), -(5933121, 216, 28), -(5933122, 216, 28), -(5933123, 216, 28), -(5933124, 216, 28), -(5933125, 216, 28), -(5933126, 216, 28), -(5933127, 216, 28), -(5933128, 216, 28), -(5933129, 216, 28), -(5933130, 216, 28), -(5933131, 216, 28), -(5933132, 216, 28), -(5933133, 216, 28), -(5933134, 216, 28), -(5933135, 216, 28), -(5933136, 216, 28), -(5933137, 216, 28), -(5933138, 216, 28), -(5933139, 216, 28), -(5933140, 216, 28), -(5933141, 216, 28), -(5933142, 216, 28), -(5933143, 216, 28), -(5933144, 216, 28), -(5933145, 216, 28), -(5933146, 216, 28), -(5933147, 216, 28), -(5933148, 216, 28), -(5933149, 216, 28), -(5933150, 216, 28), -(5933151, 216, 28), -(5933152, 216, 28), -(5933153, 216, 28), -(5933154, 216, 28), -(5933155, 216, 28), -(5933156, 216, 28), -(5933157, 216, 28), -(5933158, 216, 28), -(5933159, 216, 28), -(5933160, 216, 28), -(5933161, 216, 28), -(5933162, 216, 28), -(5933163, 216, 28), -(5933164, 216, 28), -(5933165, 216, 28), -(5933166, 216, 28), -(5933167, 216, 28), -(5933168, 216, 28), -(5933169, 216, 28), -(5933170, 216, 28), -(5933171, 216, 28), -(5933172, 216, 28), -(5933173, 216, 28), -(5933174, 216, 28), -(5933175, 216, 28), -(5933176, 216, 28), -(5933177, 216, 28), -(5933178, 216, 28), -(5933179, 216, 28), -(5933180, 216, 28), -(5933181, 216, 28), -(5933182, 216, 28), -(5933183, 216, 28), -(5933184, 216, 28), -(5933185, 216, 28), -(5933186, 216, 28), -(5933187, 216, 28), -(5933188, 216, 28), -(5933189, 216, 28), -(5933190, 216, 28), -(5933191, 216, 28), -(5933192, 216, 28), -(5933193, 216, 28), -(5933194, 216, 28), -(5933195, 216, 28), -(5933196, 216, 28), -(5933197, 216, 28), -(5933198, 216, 28), -(5933199, 216, 28), -(5933200, 216, 28), -(5933201, 216, 28), -(5933202, 216, 28), -(5933203, 216, 28), -(5933204, 216, 28), -(5933205, 216, 28), -(5933206, 216, 28), -(5933207, 216, 28), -(5933208, 216, 28), -(5933209, 216, 28), -(5933210, 216, 28), -(5933211, 216, 28), -(5933212, 216, 28), -(5933213, 216, 28), -(5933214, 216, 28), -(5933215, 216, 28), -(5933216, 216, 28), -(5933217, 216, 28), -(5933218, 216, 28), -(5933371, 214, 13), -(5933372, 214, 13), -(5933373, 214, 13), -(5933374, 214, 13), -(5933375, 214, 13), -(5933376, 214, 13), -(5933377, 214, 13), -(5933378, 214, 13), -(5933379, 214, 13), -(5933380, 214, 13), -(5933381, 214, 13), -(5933382, 214, 13), -(5933383, 214, 13), -(5933384, 214, 13), -(5933385, 214, 13), -(5933386, 214, 13), -(5933387, 214, 13), -(5933388, 214, 13), -(5933389, 214, 13), -(5933390, 214, 13), -(5933391, 214, 13), -(5933392, 214, 13), -(5933393, 214, 13), -(5933394, 214, 13), -(5933395, 214, 13), -(5933396, 214, 13), -(5933397, 214, 13), -(5933398, 214, 13), -(5933399, 214, 13), -(5933400, 214, 13), -(5933401, 214, 13), -(5933402, 214, 13), -(5933403, 214, 13), -(5933404, 214, 13), -(5933405, 214, 13), -(5933406, 214, 13), -(5933407, 214, 13), -(5933408, 214, 13), -(5933409, 214, 13), -(5933410, 214, 13), -(5933411, 214, 13), -(5933412, 214, 13), -(5933413, 214, 13), -(5933414, 214, 13), -(5933415, 214, 13), -(5933416, 214, 13), -(5933417, 214, 13), -(5933418, 214, 13), -(5933419, 214, 13), -(5933420, 214, 13), -(5933421, 214, 13), -(5933422, 214, 13), -(5933423, 214, 13), -(5933424, 214, 13), -(5933425, 214, 13), -(5933426, 214, 13), -(5933427, 214, 13), -(5933428, 214, 13), -(5933429, 214, 13), -(5933430, 214, 13), -(5933431, 214, 13), -(5933432, 214, 13), -(5933433, 214, 13), -(5933434, 214, 13), -(5933435, 214, 13), -(5933436, 214, 13), -(5933437, 214, 13), -(5933438, 214, 13), -(5933439, 214, 13), -(5933440, 214, 13), -(5933441, 214, 13), -(5933442, 214, 13), -(5933443, 214, 13), -(5933444, 214, 13), -(5933445, 214, 13), -(5933446, 214, 13), -(5933447, 214, 13), -(5933448, 214, 13), -(5933449, 214, 13), -(5933450, 214, 13), -(5933451, 214, 13), -(5933452, 214, 13), -(5933453, 214, 13), -(5933454, 214, 13), -(5933455, 214, 13), -(5933456, 214, 13), -(5933457, 214, 13), -(5933458, 214, 13), -(5933459, 214, 13), -(5933460, 214, 13), -(5933461, 214, 13), -(5933462, 214, 13), -(5933463, 214, 13), -(5933464, 214, 13), -(5933465, 214, 13), -(5933466, 214, 13), -(5933467, 214, 13), -(5933468, 214, 13), -(5933469, 214, 13), -(5933470, 214, 13), -(5933471, 214, 13), -(5933472, 214, 13), -(5933473, 214, 13), -(5933474, 214, 13), -(5933475, 214, 13), -(5933476, 214, 13), -(5933477, 214, 13), -(5933478, 214, 13), -(5933479, 214, 13), -(5933480, 214, 13), -(5933481, 214, 13), -(5933482, 214, 13), -(5933483, 214, 13), -(5933484, 214, 13), -(5933485, 214, 13), -(5933486, 214, 13), -(5933487, 214, 13), -(5933488, 214, 13), -(5933489, 214, 13), -(5933490, 214, 13), -(5933491, 214, 13), -(5933492, 214, 13), -(5933493, 214, 13), -(5933494, 214, 13), -(5933495, 214, 13), -(5933496, 214, 13), -(5933497, 214, 13), -(5933498, 214, 13), -(5933499, 214, 13), -(5934961, 211, 15), -(5934962, 211, 15), -(5934964, 211, 15), -(5934965, 211, 15), -(5935045, 213, 6), -(5935100, 214, 13), -(5935104, 214, 13), -(5935105, 214, 13), -(5935119, 214, 13), -(5935490, 216, 28), -(5935520, 216, 28), -(5935521, 216, 28), -(5935525, 216, 28), -(5936097, 216, 28), -(5936102, 216, 28), -(5936113, 216, 28), -(5936125, 216, 28), -(5936127, 216, 28), -(5936562, 213, 6), -(5937520, 252, 3), -(5937536, 252, 10), -(5937626, 211, 15), -(5937643, 211, 15), -(5937644, 211, 15), -(5937659, 211, 15), -(5937660, 211, 15), -(5937661, 211, 15), -(5937662, 211, 15), -(5937663, 211, 15), -(5937665, 211, 15), -(5937666, 211, 15), -(5937667, 211, 15), -(5937668, 211, 15), -(5937669, 211, 15), -(5937670, 211, 15), -(5937671, 211, 15), -(5937672, 211, 15), -(5937673, 211, 15), -(5937674, 211, 15), -(5937675, 211, 15), -(5937676, 211, 15), -(5937677, 211, 15), -(5937678, 211, 15), -(5937679, 211, 15), -(5937680, 211, 15), -(5937681, 211, 15), -(5937682, 211, 15), -(5937683, 211, 15), -(5937684, 211, 15), -(5937685, 211, 15), -(5937686, 211, 15), -(5937687, 211, 15), -(5937688, 211, 15), -(5937689, 211, 15), -(5937690, 211, 15), -(5937691, 211, 15), -(5937692, 211, 15), -(5937788, 213, 6), -(5937789, 213, 6), -(5937791, 213, 6), -(5937798, 213, 6), -(5937800, 213, 6), -(5937801, 213, 6), -(5937802, 213, 6), -(5937803, 213, 6), -(5937804, 213, 6), -(5937805, 213, 6), -(5938265, 213, 6), -(5938270, 213, 6), -(5938281, 213, 6), -(5938291, 213, 6), -(5938292, 213, 6), -(5938293, 213, 6), -(5938296, 213, 6), -(5938298, 213, 6), -(5938299, 213, 6), -(5938300, 213, 6), -(5938302, 213, 6), -(5938305, 213, 6), -(5938307, 213, 6), -(5938308, 213, 6), -(5938310, 213, 6), -(5938311, 213, 6), -(5938314, 213, 6), -(5938315, 213, 6), -(5938317, 213, 6), -(5938318, 213, 6), -(5938319, 213, 6), -(5938321, 213, 6), -(5938323, 213, 6), -(5938344, 214, 13), -(5938387, 214, 13), -(5938388, 214, 13), -(5938389, 214, 13), -(5938390, 214, 13), -(5938391, 214, 13), -(5938392, 214, 13), -(5938393, 214, 13), -(5938394, 214, 13), -(5938395, 214, 13), -(5938396, 214, 13), -(5938397, 214, 13), -(5938398, 214, 13), -(5938399, 214, 13), -(5938400, 214, 13), -(5938401, 214, 13), -(5938402, 214, 13), -(5938403, 214, 13), -(5938404, 214, 13), -(5938405, 214, 13), -(5938406, 214, 13), -(5938407, 214, 13), -(5938408, 214, 13), -(5938409, 214, 13), -(5938410, 214, 13), -(5938411, 214, 13), -(5938412, 214, 13), -(5938413, 214, 13), -(5938414, 214, 13), -(5938416, 214, 13), -(5938417, 214, 13), -(5938418, 214, 13), -(5938419, 214, 13), -(5938781, 216, 28), -(5938782, 216, 28), -(5938783, 216, 28), -(5938784, 216, 28), -(5938785, 216, 28), -(5938786, 216, 28), -(5938787, 216, 28), -(5938788, 216, 28), -(5938789, 216, 28), -(5938790, 216, 28), -(5938791, 216, 28), -(5938792, 216, 28), -(5938793, 216, 28), -(5938794, 216, 28), -(5938795, 216, 28), -(5938796, 216, 28), -(5938797, 216, 28), -(5938798, 216, 28), -(5938799, 216, 28), -(5938800, 216, 28), -(5938801, 216, 28), -(5938802, 216, 28), -(5938803, 216, 28), -(5938804, 216, 28), -(5938805, 216, 28), -(5938806, 216, 28), -(5938807, 216, 28), -(5938808, 216, 28), -(5938809, 216, 28), -(5938810, 216, 28), -(5938811, 216, 28), -(5938812, 216, 28), -(5938813, 216, 28), -(5938814, 216, 28), -(5938815, 216, 28), -(5938816, 216, 28), -(5953591, 248, 1), -(5953592, 248, 3), -(5960788, 216, 28), -(5960797, 211, 15), -(5960798, 211, 15), -(5960799, 211, 15), -(5960800, 211, 15), -(5960801, 211, 15), -(5960802, 211, 15), -(5960803, 211, 15), -(5960805, 211, 15), -(5960806, 211, 15), -(5960807, 211, 15), -(5964409, 262, 1), -(5964410, 262, 1), -(5964418, 262, 1), -(5964439, 262, 2), -(5964441, 262, 1), -(5964449, 262, 1), -(5964457, 262, 1), -(6032372, 262, 2), -(6046582, 255, 3), -(6070090, 273, 9), -(6070269, 273, 9), -(6070278, 273, 9), -(6095410, 272, 13), -(6098955, 272, 12), -(6123737, 276, 12), -(6123738, 276, 1), -(6123739, 276, 1), -(6123740, 276, 1), -(6123741, 276, 1), -(6123742, 276, 1), -(6123743, 276, 1), -(6123744, 276, 1), -(6123745, 276, 1), -(6123746, 276, 12), -(6161036, 276, 12), -(6161039, 276, 1), -(6161040, 276, 1), -(6161041, 276, 1), -(6161042, 276, 1), -(6161048, 276, 17), -(6161083, 279, 12), -(6163807, 276, 1), -(6163808, 276, 19), -(6163809, 276, 20), -(6163810, 276, 21), -(6163811, 276, 9), -(6163812, 276, 8), -(6163813, 276, 7), -(6163814, 276, 6), -(6163815, 276, 4), -(6163816, 276, 16), -(6163817, 276, 16), -(6163818, 276, 16), -(6170636, 276, 17), -(6170637, 276, 2), -(6170638, 276, 2), -(6170639, 276, 3), -(6170640, 276, 2), -(6170641, 276, 3), -(6170642, 276, 3), -(6170643, 276, 3), -(6170644, 276, 10), -(6170645, 276, 10), -(6170646, 276, 10), -(6170647, 276, 11), -(6170648, 276, 11), -(6170649, 276, 2), -(6170650, 276, 11), -(6170651, 276, 1), -(6170652, 276, 1), -(6170653, 276, 4), -(6170654, 276, 4), -(6170655, 276, 6), -(6170656, 276, 6), -(6170657, 276, 5), -(6170658, 276, 7), -(6170659, 276, 7), -(6170660, 276, 8), -(6170661, 276, 8), -(6170662, 276, 9), -(6170663, 276, 12), -(6170664, 276, 13), -(6170665, 276, 14), -(6170666, 276, 15), -(6170667, 276, 16), -(6170668, 276, 1), -(6170669, 276, 19), -(6170670, 276, 20), -(6170671, 276, 21), -(6170672, 276, 9), -(6170673, 276, 8), -(6170674, 276, 7), -(6170675, 276, 6), -(6170676, 276, 4), -(6170677, 276, 1), -(6171334, 276, 17), -(6171335, 276, 12), -(6171336, 276, 13), -(6171337, 276, 12), -(6171338, 276, 11), -(6171339, 276, 8), -(6171340, 276, 5), -(6171341, 276, 1), -(6171342, 276, 12), -(6234179, 297, 1), -(6234181, 297, 3), -(6234182, 297, 4), -(6234184, 297, 5), -(6234185, 297, 6), -(6234186, 297, 7), -(6234187, 297, 8), -(6234188, 297, 8), -(6234189, 297, 9), -(6234190, 297, 10), -(6236450, 279, 13), -(6236452, 279, 14), -(6236476, 286, 3), -(6236478, 286, 1), -(6236479, 286, 2), -(6236480, 286, 3), -(6236481, 286, 4), -(6236486, 286, 5), -(6236497, 288, 5), -(6236500, 288, 5), -(6236501, 288, 6), -(6236502, 288, 6), -(6236519, 289, 2), -(6238456, 213, 6), -(6238457, 213, 6), -(6238459, 213, 6), -(6242634, 279, 12), -(6242635, 279, 13), -(6242683, 279, 14), -(6268735, 303, 15), -(6268736, 303, 15), -(6271621, 303, 15), -(6280057, 297, 2), -(6280060, 297, 2), -(6280251, 297, 12), -(6280417, 297, 1), -(6280446, 297, 4), -(6280447, 297, 5), -(6280449, 297, 7), -(6280451, 297, 5), -(6280453, 297, 12), -(6288695, 303, 15), -(6331526, 312, 12), -(6402356, 313, 6), -(6402704, 313, 11), -(6407718, 214, 13), -(6407719, 214, 13), -(6407720, 214, 13), -(6407721, 214, 13), -(6407722, 214, 13), -(6421882, 297, 8), -(6515982, 313, 11), -(6564487, 340, 12), -(6599910, 356, 12), -(6599911, 356, 1), -(6599912, 356, 1), -(6599913, 356, 1), -(6599914, 356, 1), -(6599915, 356, 1), -(6599916, 356, 1), -(6599917, 356, 1), -(6599918, 356, 1), -(6599919, 356, 12), -(6599920, 356, 12), -(6599922, 356, 1), -(6599923, 356, 1), -(6599924, 356, 1), -(6599925, 356, 1), -(6599926, 356, 17), -(6599927, 356, 1), -(6599928, 356, 19), -(6599929, 356, 20), -(6599930, 356, 21), -(6599931, 356, 9), -(6599932, 356, 8), -(6599933, 356, 7), -(6599934, 356, 6), -(6599935, 356, 4), -(6599936, 356, 16), -(6599937, 356, 16), -(6599938, 356, 16), -(6599939, 356, 17), -(6599940, 356, 2), -(6599941, 356, 2), -(6599942, 356, 3), -(6599943, 356, 2), -(6599944, 356, 3), -(6599945, 356, 3), -(6599946, 356, 3), -(6599947, 356, 10), -(6599948, 356, 10), -(6599949, 356, 10), -(6599950, 356, 11), -(6599951, 356, 11), -(6599952, 356, 2), -(6599953, 356, 11), -(6599954, 356, 1), -(6599955, 356, 1), -(6599956, 356, 4), -(6599957, 356, 4), -(6599958, 356, 6), -(6599959, 356, 6), -(6599960, 356, 5), -(6599961, 356, 7), -(6599962, 356, 7), -(6599963, 356, 8), -(6599964, 356, 8), -(6599965, 356, 9), -(6599966, 356, 12), -(6599967, 356, 13), -(6599968, 356, 14), -(6599969, 356, 15), -(6599970, 356, 16), -(6599971, 356, 1), -(6599972, 356, 19), -(6599973, 356, 20), -(6599974, 356, 21), -(6599975, 356, 9), -(6599976, 356, 8), -(6599977, 356, 7), -(6599978, 356, 6), -(6599979, 356, 4), -(6599980, 356, 1), -(6599981, 356, 17), -(6599982, 356, 12), -(6599983, 356, 13), -(6599984, 356, 12), -(6599985, 356, 11), -(6599986, 356, 8), -(6599987, 356, 5), -(6599988, 356, 1), -(6599989, 356, 12), -(6622965, 356, 17), -(6627252, 345, 13), -(6627266, 345, 13), -(6740473, 345, 13), -(6782060, 352, 12), -(6784914, 356, 2), -(6784915, 356, 2), -(6787121, 356, 3), -(6886431, 356, 2), -(6890477, 389, 1), -(6891617, 336, 1), -(6891627, 336, 1), -(6891637, 336, 2), -(6891692, 336, 3), -(6891694, 336, 5), -(6893032, 336, 6), -(6893241, 336, 7), -(6893758, 336, 9), -(6893761, 336, 11), -(6893762, 336, 11), -(6922034, 375, 1), -(6942997, 371, 13), -(6942999, 354, 10), -(6943038, 372, 30), -(6943043, 367, 8), -(6943044, 368, 21), -(6943045, 369, 17), -(6950667, 359, 1), -(6950676, 359, 2), -(6950680, 359, 3), -(6950685, 359, 4), -(6950720, 359, 4), -(6950723, 359, 5), -(6950726, 359, 6), -(6950727, 359, 7), -(6950728, 359, 8), -(6950731, 359, 8), -(6950777, 359, 9), -(6950784, 359, 9), -(6950788, 359, 10), -(6950798, 359, 11), -(6950799, 359, 12), -(6950811, 359, 14), -(6950815, 359, 15), -(6950824, 359, 15), -(6950847, 359, 8), -(6950853, 359, 8), -(6951063, 361, 9), -(6953721, 367, 2), -(6953722, 367, 4), -(6953723, 367, 3), -(6953726, 367, 3), -(6953738, 367, 5), -(6953772, 367, 1), -(6953773, 367, 1), -(6953776, 367, 1), -(6953780, 367, 6), -(6953786, 367, 7), -(6953788, 367, 8), -(6953789, 367, 2), -(6953790, 367, 10), -(6953792, 367, 22), -(6953800, 367, 23), -(6953802, 367, 27), -(6953804, 367, 19), -(6953807, 367, 21), -(6953811, 367, 24), -(6953814, 367, 27), -(6953815, 367, 27), -(6953816, 367, 27), -(6953817, 367, 27), -(6953818, 367, 27), -(6953819, 367, 27), -(6953820, 367, 27), -(6954096, 367, 1), -(6954100, 367, 1), -(6954246, 389, 3), -(6954248, 389, 4), -(6954278, 367, 1), -(6954280, 367, 3), -(6954281, 367, 3), -(6954284, 367, 4), -(6954287, 367, 5), -(6954295, 367, 6), -(6954296, 367, 6), -(6954297, 367, 5), -(6954298, 367, 6), -(6954300, 367, 8), -(6954302, 367, 8), -(6954311, 367, 8), -(6954328, 367, 11), -(6954522, 367, 4), -(6954780, 367, 11), -(6954781, 367, 11), -(6954784, 367, 11), -(6954791, 367, 11), -(6955593, 367, 15), -(6955601, 367, 15), -(6955610, 367, 18), -(6955618, 367, 18), -(6955619, 367, 18), -(6955623, 367, 22), -(6955625, 367, 22), -(6955627, 367, 22), -(6955631, 367, 22), -(6955632, 367, 22), -(6955633, 367, 22), -(6955643, 367, 17), -(6955645, 367, 17), -(6955646, 367, 17), -(6955647, 367, 17), -(6955648, 367, 17), -(6955649, 367, 17), -(6955650, 367, 22), -(6955651, 367, 28), -(6955652, 367, 28), -(6955653, 367, 28), -(6955654, 367, 28), -(6955655, 367, 28), -(6955656, 367, 28), -(6955657, 367, 28), -(6955658, 367, 28), -(6955659, 367, 28), -(6955660, 367, 28), -(6955661, 367, 28), -(6955662, 367, 22), -(6955663, 367, 28), -(6955664, 367, 28), -(6955666, 367, 28), -(6955667, 367, 20), -(6957295, 375, 1), -(6957309, 375, 2), -(6957314, 375, 2), -(6957316, 375, 2), -(6957345, 375, 4), -(6957347, 375, 5), -(6957348, 375, 5), -(6957349, 375, 6), -(6957357, 375, 6), -(6957359, 375, 7), -(6957361, 375, 8), -(6957363, 375, 8), -(6957364, 375, 10), -(6957365, 375, 10), -(6957366, 375, 11), -(6957367, 375, 11), -(6957368, 375, 12), -(6957369, 375, 13), -(6957370, 375, 13), -(6958837, 368, 1), -(6958838, 368, 16), -(6958839, 368, 13), -(6958840, 368, 13), -(6958841, 368, 13), -(6958842, 368, 17), -(6958843, 368, 17), -(6959180, 368, 18), -(6959190, 368, 30), -(6959196, 368, 29), -(6959201, 368, 29), -(6959202, 368, 29), -(6959204, 368, 29), -(6959205, 368, 29), -(6959210, 368, 28), -(6959270, 368, 20), -(6959276, 368, 20), -(6959284, 368, 20), -(6959315, 368, 20), -(6959321, 368, 20), -(6959322, 368, 20), -(6959332, 368, 20), -(6959337, 368, 21), -(6959418, 368, 9), -(6959448, 368, 6), -(6967602, 368, 22), -(6967981, 368, 22), -(6968551, 368, 22), -(6969053, 368, 22), -(6969094, 368, 8), -(6969098, 368, 8), -(6969100, 368, 8), -(6969102, 368, 8), -(6969105, 368, 8), -(6969117, 368, 8), -(6969118, 368, 8), -(6969119, 368, 8), -(6969120, 368, 8), -(6969121, 368, 8), -(6969122, 368, 8), -(6969455, 396, 1), -(6969457, 396, 2), -(6969461, 396, 2), -(6969463, 396, 3), -(6969464, 396, 3), -(6969467, 396, 3), -(6969468, 396, 3), -(6969470, 396, 5), -(6969475, 396, 6), -(6969478, 396, 6), -(6969486, 396, 7), -(6969492, 396, 7), -(6969496, 396, 7), -(6969507, 396, 7), -(6969509, 396, 8), -(6969513, 396, 7), -(6969517, 396, 9), -(6969520, 396, 10), -(6969521, 396, 10), -(6969607, 396, 11), -(6969611, 396, 12), -(6969612, 396, 13), -(6969618, 368, 24), -(6969620, 368, 22), -(6969622, 368, 22), -(6969626, 368, 26), -(6969630, 368, 25), -(6969632, 368, 25), -(6969633, 368, 25), -(6969635, 368, 25), -(6970815, 369, 29), -(6970818, 369, 30), -(6970820, 369, 28), -(6970822, 369, 28), -(6970824, 369, 26), -(6970826, 369, 28), -(6970827, 369, 28), -(6970858, 369, 30), -(6970860, 369, 30), -(6970861, 369, 21), -(6970863, 369, 22), -(6971003, 369, 15), -(6971057, 369, 13), -(6971058, 369, 15), -(6971059, 369, 12), -(6971060, 369, 13), -(6971062, 369, 13), -(6971063, 369, 1), -(6971064, 369, 1), -(6971065, 369, 2), -(6971068, 369, 2), -(6971069, 369, 2), -(6971070, 369, 2), -(6971072, 369, 2), -(6971073, 369, 2), -(6971075, 369, 13), -(6971077, 369, 26), -(6971084, 369, 17), -(6971185, 369, 5), -(6971191, 369, 5), -(6971193, 369, 6), -(6971194, 369, 6), -(6971199, 369, 4), -(6971201, 369, 4), -(6971202, 369, 4), -(6971218, 369, 7), -(6971225, 369, 3), -(6971339, 369, 3), -(6971342, 369, 3), -(6971343, 369, 4), -(6971345, 369, 9), -(6971346, 369, 9), -(6971347, 369, 8), -(6971349, 369, 8), -(6971350, 369, 8), -(6971351, 369, 9), -(6971352, 369, 9), -(6971353, 369, 9), -(6971386, 369, 8), -(6971395, 369, 8), -(6971398, 369, 8), -(6971399, 369, 8), -(6971401, 369, 8), -(6971402, 369, 8), -(6971404, 369, 8), -(6971406, 369, 8), -(6971407, 369, 8), -(6971412, 369, 19), -(6971414, 369, 19), -(6971416, 369, 19), -(6971418, 369, 19), -(6971424, 369, 20), -(6971428, 369, 21), -(6971432, 369, 21), -(6971460, 369, 18), -(6971461, 369, 16), -(6971463, 369, 16), -(6971464, 369, 1), -(6971465, 369, 1), -(6971466, 369, 1), -(6971467, 369, 1), -(6971468, 369, 1), -(6971471, 369, 13), -(6971479, 369, 27), -(6971482, 369, 27), -(6971969, 369, 27), -(6971973, 369, 26), -(6971977, 369, 25), -(6971980, 369, 25), -(6971982, 369, 25), -(6971983, 369, 25), -(6971984, 369, 25), -(6971985, 369, 25), -(6971986, 369, 25), -(6971989, 369, 15), -(6971991, 369, 13), -(6971993, 369, 13), -(6971994, 369, 15), -(6971996, 369, 17), -(6971998, 369, 17), -(6972099, 371, 4), -(6972116, 371, 4), -(6972119, 371, 2), -(6972120, 371, 2), -(6972122, 371, 3), -(6972123, 371, 2), -(6972124, 371, 10), -(6972127, 371, 1), -(6972129, 371, 10), -(6972130, 371, 1), -(6972131, 371, 27), -(6972132, 371, 7), -(6972136, 371, 2), -(6972138, 371, 1), -(6972141, 371, 2); -INSERT INTO `discoveryinfo` (`id`, `map_id`, `discover_id`) VALUES -(6972145, 371, 2), -(6972153, 371, 4), -(6972155, 371, 3), -(6972157, 371, 3), -(6972158, 371, 3), -(6972169, 371, 10), -(6972171, 371, 12), -(6972175, 371, 12), -(6972176, 371, 12), -(6972422, 371, 12), -(6972423, 371, 12), -(6972424, 371, 12), -(6973154, 371, 12), -(6973156, 371, 12), -(6973157, 371, 11), -(6973158, 371, 11), -(6973160, 371, 11), -(6973163, 371, 11), -(6973166, 371, 11), -(6973168, 371, 22), -(6973172, 371, 21), -(6973186, 371, 20), -(6973189, 371, 23), -(6973192, 371, 23), -(6973193, 371, 24), -(6973200, 371, 26), -(6973201, 371, 23), -(6973209, 371, 28), -(6973213, 371, 30), -(6973214, 371, 29), -(6973215, 371, 23), -(6973223, 371, 29), -(6973224, 371, 29), -(6973225, 371, 17), -(6973231, 371, 17), -(6973232, 371, 16), -(6973233, 371, 15), -(6973236, 371, 16), -(6973237, 371, 16), -(6973238, 371, 17), -(6973241, 371, 17), -(6973242, 371, 16), -(6973243, 371, 17), -(6973251, 371, 13), -(6973906, 371, 8), -(6973923, 371, 8), -(6973969, 371, 7), -(6973991, 371, 7), -(6973998, 371, 7), -(6974005, 371, 19), -(6974006, 371, 19), -(6974007, 371, 19), -(6975746, 371, 12), -(6976755, 354, 5), -(6976758, 354, 3), -(6976760, 354, 10), -(6976762, 354, 9), -(6976763, 354, 8), -(6976765, 354, 28), -(6976768, 354, 30), -(6976773, 354, 21), -(6976823, 354, 10), -(6977088, 354, 23), -(6977089, 354, 22), -(6977100, 354, 24), -(6977101, 354, 24), -(6977102, 354, 25), -(6977106, 354, 19), -(6977145, 354, 18), -(6977146, 354, 17), -(6977148, 354, 1), -(6977200, 354, 3), -(6977202, 354, 6), -(6977203, 354, 6), -(6977204, 354, 6), -(6977205, 354, 3), -(6977208, 354, 6), -(6977254, 354, 28), -(6977257, 354, 30), -(6977258, 354, 30), -(6977260, 354, 30), -(6977261, 354, 30), -(6977262, 354, 30), -(6977275, 354, 30), -(6977280, 354, 30), -(6977285, 354, 30), -(6977286, 354, 30), -(6977287, 354, 30), -(6977290, 354, 30), -(6977293, 354, 30), -(6977335, 354, 30), -(6977436, 354, 28), -(6977459, 354, 26), -(6977464, 354, 26), -(6977465, 354, 26), -(6977467, 354, 26), -(6977470, 354, 26), -(6977472, 354, 26), -(6977478, 354, 25), -(6977481, 354, 25), -(6977488, 354, 25), -(6977489, 354, 25), -(6977495, 354, 24), -(6977497, 354, 24), -(6977499, 354, 22), -(6977502, 354, 22), -(6977509, 354, 22), -(6977514, 354, 22), -(6977518, 354, 22), -(6977533, 354, 22), -(6977552, 354, 22), -(6977561, 354, 10), -(6977566, 354, 16), -(6977567, 354, 16), -(6977570, 354, 19), -(6977576, 354, 19), -(6977579, 354, 19), -(6977581, 354, 13), -(6977586, 354, 12), -(6977591, 354, 12), -(6977592, 354, 12), -(6977594, 354, 13), -(6977649, 354, 19), -(6977651, 354, 19), -(6979969, 372, 3), -(6979985, 372, 3), -(6979987, 372, 3), -(6980003, 372, 3), -(6980011, 372, 5), -(6980019, 372, 5), -(6980024, 372, 8), -(6980026, 372, 8), -(6980073, 372, 5), -(6980078, 372, 30), -(6980079, 372, 30), -(6980080, 372, 30), -(6980082, 372, 30), -(6980083, 372, 30), -(6980084, 372, 30), -(6980087, 372, 30), -(6980090, 372, 30), -(6980108, 372, 21), -(6980117, 372, 20), -(6980124, 372, 20), -(6980126, 372, 20), -(6980128, 372, 18), -(6980134, 372, 17), -(6980135, 372, 17), -(6980136, 372, 17), -(6980137, 372, 17), -(6980138, 372, 16), -(6980140, 372, 15), -(6980142, 372, 16), -(6980143, 372, 16), -(6980145, 372, 15), -(6980150, 372, 1), -(6980155, 372, 2), -(6980157, 372, 29), -(6980160, 372, 29), -(6980161, 372, 29), -(6980187, 372, 22), -(6980188, 372, 26), -(6980190, 372, 7), -(6980212, 372, 30), -(6980214, 372, 9), -(6980218, 372, 11), -(6980223, 372, 7), -(6980229, 372, 8), -(6980250, 372, 8), -(6980251, 372, 8), -(6980252, 372, 3), -(6980253, 372, 3), -(6980256, 372, 3), -(6980257, 372, 3), -(6980258, 372, 3), -(6980259, 372, 17), -(6980260, 372, 19), -(6980262, 372, 18), -(6980263, 372, 18), -(6980264, 372, 18), -(6980265, 372, 18), -(6980266, 372, 18), -(6980267, 372, 18), -(6980271, 372, 18), -(6980273, 372, 18), -(6980275, 372, 30), -(6980277, 372, 22), -(6980283, 372, 20), -(6980284, 372, 23), -(6980285, 372, 25), -(6980311, 372, 26), -(6980313, 372, 26), -(6980323, 372, 25), -(6980325, 372, 25), -(6980333, 372, 24), -(6980334, 372, 25), -(6980336, 372, 25), -(6980337, 372, 26), -(6980347, 372, 27), -(6980355, 372, 27), -(6980357, 372, 27), -(6980358, 372, 2), -(6980359, 372, 2), -(6980366, 372, 1), -(6980368, 372, 2), -(6980383, 372, 25), -(6980387, 372, 26), -(6983070, 336, 3), -(6983076, 336, 7), -(6987034, 367, 1), -(6987035, 367, 1), -(6987036, 367, 1), -(6987037, 367, 2), -(6987038, 367, 2), -(6987039, 367, 2), -(6987040, 367, 2), -(6987041, 367, 3), -(6987042, 367, 3), -(6987043, 367, 3), -(6987044, 367, 4), -(6987045, 367, 4), -(6987046, 367, 4), -(6987047, 367, 5), -(6987048, 367, 5), -(6987049, 367, 5), -(6987050, 367, 6), -(6987051, 367, 6), -(6987052, 367, 6), -(6987053, 367, 7), -(6987054, 367, 7), -(6987055, 367, 7), -(6987056, 367, 8), -(6987057, 367, 8), -(6987058, 367, 8), -(6987059, 367, 2), -(6987060, 367, 10), -(6987061, 367, 11), -(6987062, 367, 11), -(6987063, 367, 11), -(6987064, 367, 11), -(6987065, 367, 11), -(6987067, 367, 25), -(6987068, 367, 25), -(6987070, 367, 13), -(6987071, 367, 13), -(6987072, 367, 13), -(6987073, 367, 12), -(6987074, 367, 14), -(6987075, 367, 14), -(6987076, 367, 15), -(6987077, 367, 15), -(6987078, 367, 15), -(6987079, 367, 24), -(6987080, 367, 25), -(6987081, 367, 25), -(6987082, 367, 26), -(6987083, 367, 27), -(6987084, 367, 27), -(6987085, 367, 27), -(6987086, 367, 27), -(6987087, 367, 28), -(6987088, 367, 28), -(6987089, 367, 28), -(6987090, 367, 28), -(6987091, 367, 28), -(6987092, 367, 30), -(6987093, 367, 30), -(6987094, 367, 30), -(6987095, 367, 29), -(6987096, 367, 23), -(6987097, 367, 23), -(6987098, 367, 8), -(6987099, 367, 16), -(6987100, 367, 16), -(6987101, 367, 17), -(6987102, 367, 17), -(6987103, 367, 22), -(6987104, 367, 22), -(6987105, 367, 22), -(6987106, 367, 21), -(6987107, 367, 21), -(6987108, 367, 18), -(6987109, 367, 18), -(6987110, 367, 19), -(6987111, 367, 20), -(6987112, 367, 10), -(6987113, 367, 10), -(6989593, 368, 1), -(6989594, 368, 1), -(6989595, 368, 1), -(6989596, 368, 1), -(6989597, 368, 3), -(6989598, 368, 3), -(6989599, 368, 2), -(6989600, 368, 1), -(6989601, 368, 2), -(6989602, 368, 2), -(6989603, 368, 14), -(6989604, 368, 14), -(6989605, 368, 14), -(6989606, 368, 15), -(6989607, 368, 15), -(6989608, 368, 15), -(6989609, 368, 17), -(6989610, 368, 17), -(6989611, 368, 17), -(6989612, 368, 16), -(6989613, 368, 16), -(6989614, 368, 16), -(6989615, 368, 16), -(6989616, 368, 16), -(6989617, 368, 18), -(6989618, 368, 18), -(6989619, 368, 18), -(6989620, 368, 18), -(6989621, 368, 18), -(6989622, 368, 30), -(6989623, 368, 30), -(6989624, 368, 30), -(6989625, 368, 30), -(6989626, 368, 30), -(6989627, 368, 29), -(6989628, 368, 29), -(6989629, 368, 31), -(6989630, 368, 28), -(6989631, 368, 28), -(6989632, 368, 19), -(6989633, 368, 19), -(6989634, 368, 20), -(6989635, 368, 20), -(6989636, 368, 19), -(6989637, 368, 20), -(6989638, 368, 27), -(6989639, 368, 27), -(6989640, 368, 27), -(6989641, 368, 26), -(6989642, 368, 26), -(6989643, 368, 26), -(6989644, 368, 24), -(6989645, 368, 24), -(6989646, 368, 25), -(6989647, 368, 25), -(6989648, 368, 25), -(6989649, 368, 25), -(6989650, 368, 25), -(6989651, 368, 23), -(6989652, 368, 21), -(6989653, 368, 21), -(6989654, 368, 21), -(6989655, 368, 21), -(6989656, 368, 11), -(6989657, 368, 11), -(6989658, 368, 11), -(6989659, 368, 11), -(6989660, 368, 11), -(6989661, 368, 11), -(6989662, 368, 11), -(6989663, 368, 11), -(6989664, 368, 13), -(6989665, 368, 12), -(6989666, 368, 4), -(6989667, 368, 4), -(6989668, 368, 4), -(6989669, 368, 5), -(6989670, 368, 5), -(6989671, 368, 5), -(6989672, 368, 10), -(6989673, 368, 10), -(6989674, 368, 10), -(6989675, 368, 22), -(6989676, 368, 22), -(6989677, 368, 22), -(6989678, 368, 22), -(6989679, 368, 9), -(6989680, 368, 9), -(6989681, 368, 9), -(6989682, 368, 8), -(6989683, 368, 7), -(6989685, 368, 6), -(6994517, 375, 1), -(6994518, 375, 2), -(6994519, 375, 4), -(6994521, 375, 8), -(6994536, 375, 12), -(6994537, 375, 13), -(6994636, 396, 5), -(6994637, 396, 9), -(6994638, 396, 11), -(6994639, 396, 13), -(6997567, 389, 1), -(6997901, 368, 17), -(6997902, 368, 17), -(6997903, 368, 15), -(6997904, 368, 16), -(6997905, 368, 16), -(6997906, 368, 11), -(6997907, 368, 2), -(6997908, 368, 20), -(6997909, 368, 16), -(6997910, 368, 20), -(6997911, 368, 28), -(6997912, 368, 21), -(6997913, 368, 21), -(6997914, 368, 22), -(6997915, 368, 22), -(6997916, 368, 22), -(6997917, 368, 9), -(6997918, 368, 26), -(6997919, 368, 20), -(6998414, 372, 8), -(6998415, 372, 8), -(6998416, 372, 18), -(6998468, 372, 3), -(6998470, 369, 1), -(6998471, 369, 1), -(6998472, 369, 1), -(6998474, 369, 1), -(6998479, 369, 1), -(6998483, 369, 2), -(6998486, 369, 2), -(6998487, 369, 2), -(6998488, 369, 2), -(6998490, 369, 2), -(6998491, 369, 1), -(6998492, 369, 3), -(6998493, 369, 3), -(6998494, 369, 3), -(6998495, 369, 3), -(6998496, 369, 3), -(6998499, 369, 4), -(6998502, 369, 4), -(6998503, 369, 4), -(6998504, 369, 4), -(6998506, 369, 5), -(6998507, 369, 5), -(6998508, 369, 5), -(6998509, 369, 5), -(6998510, 369, 6), -(6998512, 369, 6), -(6998513, 369, 6), -(6998514, 369, 6), -(6998515, 369, 6), -(6998523, 369, 6), -(6998529, 369, 7), -(6998530, 369, 7), -(6998533, 369, 7), -(6998535, 369, 20), -(6998536, 369, 20), -(6998537, 369, 20), -(6998538, 369, 20), -(6998541, 369, 19), -(6998543, 369, 19), -(6998545, 369, 19), -(6998546, 369, 19), -(6998547, 369, 19), -(6998548, 369, 20), -(6998551, 369, 19), -(6998552, 369, 21), -(6998553, 369, 21), -(6998555, 369, 21), -(6998556, 369, 21), -(6998559, 369, 31), -(6998561, 369, 31), -(6998565, 369, 21), -(6998569, 369, 30), -(6998571, 369, 30), -(6998573, 369, 29), -(6998575, 369, 28), -(6998576, 369, 28), -(6998577, 369, 28), -(6998579, 369, 28), -(6998580, 369, 28), -(6998581, 369, 28), -(6998582, 369, 26), -(6998583, 369, 28), -(6998592, 369, 28), -(6998593, 369, 28), -(6998594, 369, 27), -(6998595, 369, 27), -(6998596, 369, 27), -(6998598, 369, 26), -(6998599, 369, 26), -(6998600, 369, 26), -(6998601, 369, 25), -(6998603, 369, 25), -(6998605, 369, 25), -(6998607, 369, 14), -(6998608, 369, 14), -(6998609, 369, 14), -(6998610, 369, 14), -(6998611, 369, 14), -(6998612, 369, 15), -(6998613, 369, 15), -(6998618, 369, 15), -(6998620, 369, 25), -(6998622, 369, 13), -(6998623, 369, 13), -(6998625, 369, 13), -(6998627, 369, 12), -(6998628, 369, 12), -(6998637, 369, 12), -(6998638, 369, 12), -(6998639, 369, 12), -(6998640, 369, 11), -(6998641, 369, 3), -(6998642, 369, 10), -(6998643, 369, 10), -(6998644, 369, 10), -(6998646, 369, 10), -(6998647, 369, 9), -(6998648, 369, 9), -(6998649, 369, 9), -(6998653, 369, 8), -(6998654, 369, 8), -(6998655, 369, 8), -(6998656, 369, 8), -(6998657, 369, 22), -(6998658, 369, 22), -(6998659, 369, 22), -(6998661, 369, 18), -(6998666, 369, 17), -(6998667, 369, 17), -(6998668, 369, 17), -(6998669, 369, 23), -(6998670, 369, 24), -(6998676, 369, 24), -(6998682, 369, 16), -(6998684, 369, 1), -(6998685, 369, 1), -(6998686, 369, 1), -(6998687, 369, 1), -(6998688, 369, 1), -(6998689, 369, 2), -(6998690, 369, 2), -(6998691, 369, 2), -(6998692, 369, 2), -(6998693, 369, 2), -(6998694, 369, 1), -(6998695, 369, 3), -(6998696, 369, 3), -(6998697, 369, 3), -(6998698, 369, 3), -(6998699, 369, 3), -(6998700, 369, 4), -(6998701, 369, 4), -(6998702, 369, 4), -(6998703, 369, 4), -(6998704, 369, 5), -(6998705, 369, 5), -(6998706, 369, 5), -(6998707, 369, 5), -(6998708, 369, 6), -(6998709, 369, 6), -(6998710, 369, 6), -(6998711, 369, 6), -(6998712, 369, 6), -(6998713, 369, 6), -(6998714, 369, 7), -(6998715, 369, 7), -(6998716, 369, 7), -(6998717, 369, 20), -(6998718, 369, 20), -(6998719, 369, 20), -(6998720, 369, 20), -(6998722, 369, 19), -(6998723, 369, 19), -(6998724, 369, 19), -(6998725, 369, 19), -(6998726, 369, 19), -(6998727, 369, 20), -(6998728, 369, 19), -(6998729, 369, 21), -(6998730, 369, 21), -(6998731, 369, 21), -(6998732, 369, 21), -(6998735, 369, 31), -(6998736, 369, 31), -(6998737, 369, 21), -(6998738, 369, 30), -(6998739, 369, 30), -(6998740, 369, 29), -(6998741, 369, 28), -(6998742, 369, 28), -(6998743, 369, 28), -(6998744, 369, 28), -(6998745, 369, 28), -(6998746, 369, 28), -(6998747, 369, 26), -(6998748, 369, 28), -(6998749, 369, 28), -(6998750, 369, 28), -(6998751, 369, 27), -(6998752, 369, 27), -(6998753, 369, 27), -(6998754, 369, 26), -(6998755, 369, 26), -(6998756, 369, 26), -(6998757, 369, 25), -(6998758, 369, 25), -(6998759, 369, 25), -(6998760, 369, 14), -(6998761, 369, 14), -(6998762, 369, 14), -(6998763, 369, 14), -(6998764, 369, 14), -(6998765, 369, 15), -(6998766, 369, 15), -(6998767, 369, 15), -(6998768, 369, 25), -(6998769, 369, 13), -(6998770, 369, 13), -(6998771, 369, 13), -(6998772, 369, 12), -(6998773, 369, 12), -(6998774, 369, 12), -(6998775, 369, 12), -(6998776, 369, 12), -(6998777, 369, 11), -(6998778, 369, 3), -(6998779, 369, 10), -(6998780, 369, 10), -(6998781, 369, 10), -(6998782, 369, 10), -(6998783, 369, 9), -(6998784, 369, 9), -(6998785, 369, 9), -(6998786, 369, 8), -(6998787, 369, 8), -(6998788, 369, 8), -(6998789, 369, 8), -(6998790, 369, 22), -(6998791, 369, 22), -(6998792, 369, 22), -(6998793, 369, 18), -(6998794, 369, 17), -(6998795, 369, 17), -(6998796, 369, 17), -(6998797, 369, 23), -(6998798, 369, 24), -(6998799, 369, 24), -(6998800, 369, 16), -(6998818, 371, 1), -(6998896, 371, 1), -(6998897, 371, 1), -(6998898, 371, 1), -(6998899, 371, 2), -(6998900, 371, 2), -(6998901, 371, 2), -(6998902, 371, 2), -(6998946, 371, 3), -(6998947, 371, 3), -(6998982, 371, 3), -(6998983, 371, 3), -(6998984, 371, 3), -(6998986, 371, 4), -(6998987, 371, 4), -(6998988, 371, 4), -(6998990, 371, 4), -(6998991, 371, 4), -(6999007, 371, 6), -(6999008, 371, 6), -(6999009, 371, 6), -(6999010, 371, 6), -(6999011, 371, 15), -(6999012, 371, 15), -(6999013, 371, 15), -(6999014, 371, 5), -(6999015, 371, 16), -(6999016, 371, 16), -(6999017, 371, 16), -(6999020, 371, 17), -(6999021, 371, 17), -(6999022, 371, 17), -(6999023, 371, 17), -(6999024, 371, 17), -(6999025, 371, 17), -(6999026, 371, 29), -(6999028, 371, 29), -(6999029, 371, 30), -(6999030, 371, 27), -(6999032, 371, 27), -(6999034, 371, 27), -(6999147, 371, 28), -(6999150, 371, 23), -(6999152, 371, 23), -(6999153, 371, 23), -(6999154, 371, 23), -(6999156, 371, 23), -(6999157, 371, 23), -(6999158, 371, 23), -(6999159, 371, 23), -(6999160, 371, 23), -(6999163, 371, 23), -(6999166, 371, 23), -(6999169, 371, 24), -(6999170, 371, 24), -(6999171, 371, 24), -(6999172, 371, 24), -(6999173, 371, 26), -(6999174, 371, 26), -(6999175, 371, 23), -(6999176, 371, 25), -(6999177, 371, 21), -(6999179, 371, 21), -(6999180, 371, 21), -(6999181, 371, 21), -(6999182, 371, 21), -(6999183, 371, 21), -(6999184, 371, 22), -(6999185, 371, 12), -(6999186, 371, 12), -(6999188, 371, 12), -(6999189, 371, 12), -(6999190, 371, 12), -(6999191, 371, 12), -(6999192, 371, 11), -(6999193, 371, 11), -(6999194, 371, 11), -(6999195, 371, 10), -(6999196, 371, 10), -(6999197, 371, 10), -(6999200, 371, 10), -(6999201, 371, 10), -(6999202, 371, 9), -(6999203, 371, 9), -(6999204, 371, 9), -(6999206, 371, 8), -(6999207, 371, 8), -(6999209, 371, 8), -(6999212, 371, 7), -(6999213, 371, 7), -(6999214, 371, 7), -(6999216, 371, 14), -(6999217, 371, 19), -(6999218, 371, 19), -(6999219, 371, 7), -(6999220, 371, 19), -(6999221, 371, 18), -(6999222, 371, 20), -(6999223, 371, 23), -(6999224, 371, 13), -(6999476, 371, 1), -(6999477, 371, 1), -(6999478, 371, 1), -(6999479, 371, 1), -(6999480, 371, 2), -(6999481, 371, 2), -(6999482, 371, 2), -(6999483, 371, 2), -(6999484, 371, 3), -(6999485, 371, 3), -(6999486, 371, 3), -(6999487, 371, 3), -(6999488, 371, 3), -(6999489, 371, 4), -(6999490, 371, 4), -(6999491, 371, 4), -(6999492, 371, 4), -(6999493, 371, 4), -(6999494, 371, 6), -(6999495, 371, 6), -(6999496, 371, 6), -(6999497, 371, 6), -(6999498, 371, 15), -(6999499, 371, 15), -(6999500, 371, 15), -(6999501, 371, 5), -(6999502, 371, 16), -(6999503, 371, 16), -(6999504, 371, 16), -(6999505, 371, 17), -(6999506, 371, 17), -(6999507, 371, 17), -(6999508, 371, 17), -(6999509, 371, 17), -(6999510, 371, 17), -(6999511, 371, 29), -(6999512, 371, 29), -(6999513, 371, 30), -(6999514, 371, 27), -(6999515, 371, 27), -(6999516, 371, 27), -(6999517, 371, 28), -(6999518, 371, 23), -(6999519, 371, 23), -(6999520, 371, 23), -(6999521, 371, 23), -(6999522, 371, 23), -(6999523, 371, 23), -(6999524, 371, 23), -(6999525, 371, 23), -(6999526, 371, 23), -(6999527, 371, 23), -(6999528, 371, 23), -(6999529, 371, 24), -(6999530, 371, 24), -(6999531, 371, 24), -(6999532, 371, 24), -(6999533, 371, 26), -(6999534, 371, 26), -(6999535, 371, 23), -(6999536, 371, 25), -(6999537, 371, 21), -(6999538, 371, 21), -(6999539, 371, 21), -(6999540, 371, 21), -(6999541, 371, 21), -(6999542, 371, 21), -(6999543, 371, 22), -(6999544, 371, 12), -(6999545, 371, 12), -(6999546, 371, 12), -(6999547, 371, 12), -(6999548, 371, 12), -(6999549, 371, 12), -(6999550, 371, 11), -(6999551, 371, 11), -(6999552, 371, 11), -(6999553, 371, 10), -(6999554, 371, 10), -(6999555, 371, 10), -(6999556, 371, 10), -(6999557, 371, 10), -(6999558, 371, 9), -(6999559, 371, 9), -(6999560, 371, 9), -(6999561, 371, 8), -(6999562, 371, 8), -(6999563, 371, 8), -(6999564, 371, 7), -(6999565, 371, 7), -(6999566, 371, 7), -(6999567, 371, 14), -(6999568, 371, 19), -(6999569, 371, 19), -(6999570, 371, 7), -(6999571, 371, 19), -(6999572, 371, 18), -(6999573, 371, 20), -(6999574, 371, 23), -(6999575, 371, 13), -(7001712, 354, 1), -(7002280, 354, 1), -(7002282, 354, 1), -(7002283, 354, 1), -(7002284, 354, 3), -(7002286, 354, 3), -(7002287, 354, 3), -(7002289, 354, 3), -(7002290, 354, 3), -(7002292, 354, 3), -(7002297, 354, 4), -(7002298, 354, 4), -(7002324, 354, 6), -(7002325, 354, 6), -(7002327, 354, 3), -(7002328, 354, 2), -(7002329, 354, 2), -(7002333, 354, 8), -(7002334, 354, 8), -(7002335, 354, 8), -(7002336, 354, 7), -(7002337, 354, 30), -(7002338, 354, 30), -(7002339, 354, 30), -(7002360, 354, 30), -(7002361, 354, 29), -(7002363, 354, 9), -(7002364, 354, 9), -(7002365, 354, 10), -(7002366, 354, 10), -(7002370, 354, 10), -(7002371, 354, 10), -(7002372, 354, 10), -(7002373, 354, 9), -(7002374, 354, 9), -(7002376, 354, 28), -(7002378, 354, 28), -(7002382, 354, 28), -(7002385, 354, 28), -(7002387, 354, 27), -(7002388, 354, 27), -(7002390, 354, 26), -(7002391, 354, 26), -(7002392, 354, 25), -(7002393, 354, 26), -(7002394, 354, 25), -(7002395, 354, 25), -(7002396, 354, 25), -(7002397, 354, 25), -(7002398, 354, 24), -(7002399, 354, 24), -(7002401, 354, 24), -(7002404, 354, 24), -(7002410, 354, 23), -(7002412, 354, 23), -(7002413, 354, 23), -(7002414, 354, 23), -(7002415, 354, 23), -(7002416, 354, 23), -(7002417, 354, 23), -(7002418, 354, 22), -(7002419, 354, 19), -(7002420, 354, 22), -(7002422, 354, 21), -(7002423, 354, 17), -(7002424, 354, 17), -(7002425, 354, 17), -(7002426, 354, 16), -(7002427, 354, 17), -(7002428, 354, 16), -(7002430, 354, 16), -(7002431, 354, 16), -(7002432, 354, 16), -(7002434, 354, 15), -(7002436, 354, 15), -(7002437, 354, 15), -(7002439, 354, 19), -(7002694, 354, 19), -(7002695, 354, 19), -(7002696, 354, 19), -(7002697, 354, 19), -(7002698, 354, 18), -(7002700, 354, 20), -(7002701, 354, 20), -(7002703, 354, 20), -(7002705, 354, 11), -(7002708, 354, 11), -(7002710, 354, 14), -(7002711, 354, 14), -(7002712, 354, 14), -(7002713, 354, 13), -(7002714, 354, 12), -(7002715, 354, 1), -(7002716, 354, 1), -(7002717, 354, 1), -(7002718, 354, 1), -(7002719, 354, 3), -(7002720, 354, 3), -(7002721, 354, 3), -(7002722, 354, 3), -(7002723, 354, 3), -(7002725, 354, 3), -(7002726, 354, 4), -(7002727, 354, 4), -(7002730, 354, 6), -(7002731, 354, 6), -(7002732, 354, 3), -(7002733, 354, 2), -(7002734, 354, 2), -(7002735, 354, 8), -(7002736, 354, 8), -(7002737, 354, 8), -(7002738, 354, 7), -(7002739, 354, 30), -(7002740, 354, 30), -(7002741, 354, 30), -(7002742, 354, 30), -(7002743, 354, 29), -(7002744, 354, 9), -(7002745, 354, 9), -(7002746, 354, 10), -(7002747, 354, 10), -(7002748, 354, 10), -(7002749, 354, 10), -(7002750, 354, 10), -(7002751, 354, 9), -(7002752, 354, 9), -(7002753, 354, 28), -(7002754, 354, 28), -(7002755, 354, 28), -(7002756, 354, 28), -(7002757, 354, 27), -(7002758, 354, 27), -(7002759, 354, 26), -(7002760, 354, 26), -(7002761, 354, 25), -(7002762, 354, 26), -(7002763, 354, 25), -(7002764, 354, 25), -(7002765, 354, 25), -(7002766, 354, 25), -(7002767, 354, 24), -(7002768, 354, 24), -(7002769, 354, 24), -(7002770, 354, 24), -(7002771, 354, 23), -(7002772, 354, 23), -(7002773, 354, 23), -(7002774, 354, 23), -(7002775, 354, 23), -(7002776, 354, 23), -(7002777, 354, 23), -(7002778, 354, 22), -(7002779, 354, 19), -(7002780, 354, 22), -(7002781, 354, 21), -(7002782, 354, 17), -(7002783, 354, 17), -(7002784, 354, 17), -(7002785, 354, 16), -(7002786, 354, 17), -(7002787, 354, 16), -(7002789, 354, 16), -(7002790, 354, 16), -(7002791, 354, 16), -(7002793, 354, 15), -(7002794, 354, 15), -(7002795, 354, 15), -(7002796, 354, 19), -(7002797, 354, 19), -(7002798, 354, 19), -(7002799, 354, 19), -(7002800, 354, 19), -(7002801, 354, 18), -(7002802, 354, 20), -(7002803, 354, 20), -(7002804, 354, 20), -(7002805, 354, 11), -(7002806, 354, 11), -(7002807, 354, 14), -(7002808, 354, 14), -(7002809, 354, 14), -(7002810, 354, 13), -(7002811, 354, 12), -(7005090, 372, 1), -(7005094, 372, 1), -(7005096, 372, 1), -(7005098, 372, 1), -(7005107, 372, 1), -(7005115, 372, 5), -(7005118, 372, 5), -(7005165, 372, 5), -(7005166, 372, 5), -(7005167, 372, 5), -(7005168, 372, 8), -(7005169, 372, 8), -(7005170, 372, 18), -(7005171, 372, 8), -(7005172, 372, 3), -(7005173, 372, 3), -(7005174, 372, 3), -(7005175, 372, 3), -(7005176, 372, 9), -(7005177, 372, 9), -(7005179, 372, 9), -(7005180, 372, 9), -(7005181, 372, 10), -(7005183, 372, 15), -(7005184, 372, 14), -(7005186, 372, 14), -(7005210, 372, 14), -(7005211, 372, 14), -(7005212, 372, 14), -(7005213, 372, 14), -(7005214, 372, 14), -(7005215, 372, 11), -(7005217, 372, 11), -(7005240, 372, 7), -(7005401, 372, 7), -(7005404, 372, 7), -(7005406, 372, 6), -(7005408, 372, 12), -(7005409, 372, 12), -(7005410, 372, 12), -(7005411, 372, 12), -(7005412, 372, 13), -(7005413, 372, 13), -(7005414, 372, 13), -(7005415, 372, 13), -(7005417, 372, 15), -(7005418, 372, 15), -(7005419, 372, 15), -(7005420, 372, 15), -(7005422, 372, 18), -(7005423, 372, 18), -(7005424, 372, 18), -(7005425, 372, 18), -(7005426, 372, 16), -(7005427, 372, 19), -(7005429, 372, 19), -(7005431, 372, 19), -(7005432, 372, 19), -(7005433, 372, 19), -(7005434, 372, 19), -(7005435, 372, 19), -(7005436, 372, 19), -(7005437, 372, 19), -(7005438, 372, 17), -(7005441, 372, 17), -(7005442, 372, 17), -(7005444, 372, 17), -(7005445, 372, 20), -(7005446, 372, 20), -(7005447, 372, 20), -(7005451, 372, 20), -(7005452, 372, 21), -(7005453, 372, 21), -(7005454, 372, 21), -(7005455, 372, 23), -(7005456, 372, 23), -(7005457, 372, 23), -(7005458, 372, 23), -(7005459, 372, 23), -(7005460, 372, 23), -(7005465, 372, 22), -(7005468, 372, 22), -(7005469, 372, 22), -(7005470, 372, 22), -(7005471, 372, 22), -(7005472, 372, 22), -(7005473, 372, 22), -(7005474, 372, 22), -(7005475, 372, 22), -(7005477, 372, 24), -(7005481, 372, 24), -(7005482, 372, 24), -(7005584, 372, 25), -(7005585, 372, 25), -(7005586, 372, 30), -(7005587, 372, 30), -(7005588, 372, 30), -(7005589, 372, 4), -(7005590, 372, 4), -(7005591, 372, 4), -(7005592, 372, 30), -(7005593, 372, 2), -(7005594, 372, 2), -(7005595, 372, 2), -(7005596, 372, 29), -(7005598, 372, 29), -(7005600, 372, 27), -(7005601, 372, 27), -(7005602, 372, 27), -(7005606, 372, 28), -(7005607, 372, 28), -(7005608, 372, 26), -(7005609, 372, 10), -(7005610, 372, 14), -(7007424, 372, 1), -(7007425, 372, 1), -(7007426, 372, 1), -(7007427, 372, 1), -(7007428, 372, 1), -(7007429, 372, 5), -(7007430, 372, 5), -(7007431, 372, 5), -(7007432, 372, 5), -(7007433, 372, 5), -(7007434, 372, 8), -(7007435, 372, 8), -(7007436, 372, 18), -(7007437, 372, 8), -(7007438, 372, 3), -(7007439, 372, 3), -(7007440, 372, 3), -(7007441, 372, 3), -(7007442, 372, 9), -(7007443, 372, 9), -(7007444, 372, 9), -(7007445, 372, 9), -(7007446, 372, 10), -(7007447, 372, 15), -(7007448, 372, 14), -(7007449, 372, 14), -(7007450, 372, 14), -(7007451, 372, 14), -(7007452, 372, 14), -(7007453, 372, 14), -(7007454, 372, 14), -(7007455, 372, 11), -(7007456, 372, 11), -(7007457, 372, 7), -(7007458, 372, 7), -(7007459, 372, 7), -(7007460, 372, 6), -(7007461, 372, 12), -(7007462, 372, 12), -(7007463, 372, 12), -(7007464, 372, 12), -(7007465, 372, 13), -(7007466, 372, 13), -(7007467, 372, 13), -(7007468, 372, 13), -(7007469, 372, 15), -(7007470, 372, 15), -(7007471, 372, 15), -(7007472, 372, 15), -(7007473, 372, 18), -(7007474, 372, 18), -(7007475, 372, 18), -(7007476, 372, 18), -(7007477, 372, 16), -(7007478, 372, 19), -(7007479, 372, 19), -(7007480, 372, 19), -(7007481, 372, 19), -(7007482, 372, 19), -(7007483, 372, 19), -(7007484, 372, 19), -(7007485, 372, 19), -(7007486, 372, 19), -(7007487, 372, 17), -(7007488, 372, 17), -(7007489, 372, 17), -(7007490, 372, 17), -(7007491, 372, 20), -(7007492, 372, 20), -(7007493, 372, 20), -(7007494, 372, 20), -(7007495, 372, 21), -(7007496, 372, 21), -(7007497, 372, 21), -(7007498, 372, 23), -(7007499, 372, 23), -(7007500, 372, 23), -(7007501, 372, 23), -(7007502, 372, 23), -(7007503, 372, 23), -(7007504, 372, 22), -(7007505, 372, 22), -(7007506, 372, 22), -(7007507, 372, 22), -(7007508, 372, 22), -(7007509, 372, 22), -(7007510, 372, 22), -(7007511, 372, 22), -(7007512, 372, 22), -(7007513, 372, 24), -(7007514, 372, 24), -(7007515, 372, 24), -(7007516, 372, 25), -(7007517, 372, 25), -(7007518, 372, 30), -(7007519, 372, 30), -(7007520, 372, 30), -(7007521, 372, 4), -(7007522, 372, 4), -(7007523, 372, 4), -(7007524, 372, 30), -(7007525, 372, 2), -(7007526, 372, 2), -(7007527, 372, 2), -(7007528, 372, 29), -(7007529, 372, 29), -(7007530, 372, 27), -(7007531, 372, 27), -(7007532, 372, 27), -(7007533, 372, 28), -(7007534, 372, 28), -(7007535, 372, 26), -(7007536, 372, 10), -(7007537, 372, 14), -(7008614, 368, 17), -(7008615, 368, 17), -(7008616, 368, 17), -(7008617, 368, 17), -(7008977, 372, 16), -(7011528, 369, 23), -(7011608, 368, 16), -(7011609, 368, 16), -(7011611, 368, 16), -(7011612, 368, 16), -(7011613, 368, 16), -(7011909, 369, 23), -(7011910, 369, 16), -(7011911, 369, 16), -(7011912, 369, 17), -(7011913, 369, 18), -(7011914, 369, 22), -(7011915, 369, 24), -(7011916, 369, 17), -(7011917, 369, 24), -(7011918, 369, 16), -(7011919, 369, 24), -(7011920, 369, 16), -(7011921, 369, 18), -(7011922, 369, 16), -(7011923, 369, 10), -(7015554, 371, 12), -(7015555, 371, 12), -(7015556, 371, 12), -(7015557, 371, 12), -(7015559, 371, 12), -(7015560, 371, 12), -(7015561, 371, 12), -(7015562, 371, 12), -(7015563, 371, 1), -(7015564, 371, 1), -(7015565, 371, 1), -(7015639, 371, 1), -(7015809, 371, 29), -(7015810, 371, 29), -(7015811, 371, 29), -(7015831, 371, 29), -(7017072, 368, 21), -(7017073, 368, 21), -(7017074, 368, 21), -(7017821, 368, 21), -(7017822, 368, 21), -(7017823, 368, 21), -(7017824, 368, 21), -(7017825, 368, 21), -(7018030, 372, 8), -(7018032, 372, 8), -(7021959, 354, 6), -(7022000, 371, 8), -(7022001, 371, 8), -(7022002, 371, 8), -(7022080, 369, 13), -(7022081, 369, 13), -(7022082, 369, 10), -(7022083, 369, 10), -(7022084, 369, 10), -(7022085, 369, 10), -(7022086, 369, 3), -(7022088, 369, 3), -(7022089, 369, 3), -(7022221, 372, 1), -(7022434, 371, 21), -(7022435, 371, 7), -(7022436, 371, 6), -(7022437, 371, 15), -(7022438, 371, 5), -(7022439, 371, 5), -(7022472, 369, 12), -(7022480, 369, 12), -(7022482, 369, 12), -(7022484, 369, 12), -(7031210, 369, 31), -(7031211, 369, 31), -(7031212, 369, 31), -(7031213, 369, 31), -(7031219, 369, 31), -(7031225, 369, 31), -(7031226, 369, 30), -(7031228, 369, 31), -(7031229, 369, 31), -(7031230, 369, 31), -(7031233, 369, 30), -(7031341, 369, 31), -(7031346, 369, 31), -(7031381, 369, 31), -(7031993, 369, 30), -(7032050, 369, 21), -(7032051, 369, 21), -(7036942, 369, 30), -(7082919, 415, 14), -(7082925, 415, 14), -(7082926, 415, 14), -(7171388, 415, 15), -(7171970, 439, 1), -(7171972, 439, 2), -(7171973, 439, 3), -(7171974, 439, 4), -(7171977, 439, 7), -(7171981, 439, 11), -(7171982, 439, 11), -(7171983, 439, 6), -(7171987, 439, 7), -(7171988, 439, 7), -(7171997, 439, 4), -(7171998, 439, 9), -(7171999, 439, 13), -(7247207, 445, 1), -(7257150, 414, 1), -(7309598, 414, 1), -(7309601, 414, 2), -(7309602, 414, 2), -(7309603, 414, 2), -(7309608, 414, 2), -(7309609, 414, 2), -(7309615, 414, 13), -(7309629, 414, 13), -(7309632, 414, 12), -(7309633, 414, 12), -(7309634, 414, 12), -(7309640, 414, 12), -(7309641, 414, 11), -(7309642, 414, 11), -(7309679, 414, 8), -(7309688, 414, 9), -(7309690, 414, 9), -(7309692, 414, 9), -(7309694, 414, 9), -(7309695, 414, 7), -(7309697, 414, 7), -(7309698, 414, 7), -(7309699, 414, 7), -(7310021, 414, 5), -(7310031, 414, 5), -(7310032, 414, 5), -(7310046, 414, 10), -(7310052, 414, 3), -(7310119, 414, 7), -(7310228, 414, 12), -(7310233, 414, 11), -(7310337, 414, 5), -(7329610, 414, 10), -(7329613, 414, 12), -(7329615, 414, 12), -(7329616, 414, 12), -(7329617, 414, 13), -(7329620, 414, 13), -(7329621, 414, 13), -(7329623, 414, 2), -(7329624, 414, 2), -(7329625, 414, 2), -(7329626, 414, 2), -(7329627, 414, 2), -(7329629, 414, 2), -(7329630, 414, 2), -(7329631, 414, 2), -(7329635, 414, 4), -(7329639, 414, 5), -(7329641, 414, 7), -(7329643, 414, 7), -(7329644, 414, 7), -(7329645, 414, 7), -(7329646, 414, 7), -(7329648, 414, 7), -(7329650, 414, 8), -(7329651, 414, 8), -(7329653, 414, 8), -(7329654, 414, 2), -(7329655, 414, 9), -(7329656, 414, 9), -(7329658, 414, 9); - - INSERT INTO `land` (`LandSetId`, `LandId`, `Type`, `Size`, `Status`, `LandPrice`, `UpdateTime`, `OwnerId`, `HouseId`, `UPDATE_DATE`) VALUES (22216704, 0, 0, 1, 1, 19000000, 0, 0, 0, '2018-12-02 23:28:14'), (22216704, 1, 0, 2, 1, 47500000, 0, 0, 0, '2018-12-02 23:28:14'), diff --git a/sql/schema/schema.sql b/sql/schema/schema.sql index e58df240..0017310c 100644 --- a/sql/schema/schema.sql +++ b/sql/schema/schema.sql @@ -400,13 +400,6 @@ CREATE TABLE `dbupdate` ( PRIMARY KEY(`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `discoveryinfo` ( - `id` int(10) NOT NULL, - `map_id` int(3) NOT NULL, - `discover_id` int(3) NOT NULL, - PRIMARY KEY(`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - CREATE TABLE `house` ( `HouseId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `LandSetId` int(10) UNSIGNED DEFAULT NULL, diff --git a/src/api/PlayerMinimal.h b/src/api/PlayerMinimal.h index d51251c2..a5e41b7b 100644 --- a/src/api/PlayerMinimal.h +++ b/src/api/PlayerMinimal.h @@ -2,8 +2,9 @@ #define _PLAYERMINIMAL_H #include -#include -#include +#include +#include +#include namespace Sapphire::Api { diff --git a/src/api/SapphireApi.cpp b/src/api/SapphireApi.cpp index f12da082..e31e37c1 100644 --- a/src/api/SapphireApi.cpp +++ b/src/api/SapphireApi.cpp @@ -192,13 +192,15 @@ void SapphireApi::deleteCharacter( std::string name, const uint32_t accountId ) g_charaDb.execute( "DELETE FROM characlass WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charaglobalitem WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charainfoblacklist WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); - g_charaDb.execute( "DELETE FROM charainfofriendlist WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charainfolinkshell WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charainfosearch WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charaitemcrystal WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_charaDb.execute( "DELETE FROM charaitemcurrency WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charaiteminventory WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charaitemgearset WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_charaDb.execute( "DELETE FROM charamonsternote WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); g_charaDb.execute( "DELETE FROM charaquest WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); + g_charaDb.execute( "DELETE FROM charastatus WHERE CharacterId LIKE '" + std::to_string( id ) + "';" ); } std::vector< PlayerMinimal > SapphireApi::getCharList( uint32_t accountId ) diff --git a/src/api/main.cpp b/src/api/main.cpp index 004233ba..edced26a 100644 --- a/src/api/main.cpp +++ b/src/api/main.cpp @@ -22,24 +22,23 @@ //Added for the default_resource example #include #include -#include +#include #include #include -#include #include #include "SapphireApi.h" #include -Sapphire::Common::Util::CrashHandler crashHandler; +[[maybe_unused]] Sapphire::Common::Util::CrashHandler crashHandler; Sapphire::Db::DbWorkerPool< Sapphire::Db::ZoneDbConnection > g_charaDb; Sapphire::Data::ExdDataGenerated g_exdDataGen; Sapphire::Api::SapphireApi g_sapphireAPI; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; using namespace std; using namespace Sapphire; @@ -671,8 +670,9 @@ void defaultGet( shared_ptr< HttpServer::Response > response, shared_ptr< HttpSe print_request_info( request ); try { - auto web_root_path = fs::canonical( "web" ); - auto path = fs::canonical( web_root_path / request->path ); + auto web_root_path = fs::current_path() / "web"; + auto path = web_root_path / request->path; + //Check if path is within web_root_path if( distance( web_root_path.begin(), web_root_path.end() ) > distance( path.begin(), path.end() ) || !std::equal( web_root_path.begin(), web_root_path.end(), path.begin() ) ) @@ -718,19 +718,19 @@ int main( int argc, char* argv[] ) Logger::setLogLevel( m_config.global.general.logLevel ); - server.resource[ "^/ZoneName/([0-9]+)$" ][ "GET" ] = &getZoneName; - server.resource[ "^/sapphire-api/lobby/createAccount" ][ "POST" ] = &createAccount; - server.resource[ "^/sapphire-api/lobby/login" ][ "POST" ] = &login; - server.resource[ "^/sapphire-api/lobby/deleteCharacter" ][ "POST" ] = &deleteCharacter; - server.resource[ "^/sapphire-api/lobby/createCharacter" ][ "POST" ] = &createCharacter; - server.resource[ "^/sapphire-api/lobby/insertSession" ][ "POST" ] = &insertSession; - server.resource[ "^/sapphire-api/lobby/checkNameTaken" ][ "POST" ] = &checkNameTaken; - server.resource[ "^/sapphire-api/lobby/checkSession" ][ "POST" ] = &checkSession; - server.resource[ "^/sapphire-api/lobby/getNextCharId" ][ "POST" ] = &getNextCharId; - server.resource[ "^/sapphire-api/lobby/getNextContentId" ][ "POST" ] = &getNextContentId; - server.resource[ "^/sapphire-api/lobby/getCharacterList" ][ "POST" ] = &getCharacterList; - server.resource[ "^(/frontier-api/ffxivsupport/view/get_init)(.*)" ][ "GET" ] = &get_init; - server.resource[ "^(/frontier-api/ffxivsupport/information/get_headline_all)(.*)" ][ "GET" ] = &get_headline_all; + server.resource[ "^ZoneName/([0-9]+)$" ][ "GET" ] = &getZoneName; + server.resource[ "^sapphire-api/lobby/createAccount" ][ "POST" ] = &createAccount; + server.resource[ "^sapphire-api/lobby/login" ][ "POST" ] = &login; + server.resource[ "^sapphire-api/lobby/deleteCharacter" ][ "POST" ] = &deleteCharacter; + server.resource[ "^sapphire-api/lobby/createCharacter" ][ "POST" ] = &createCharacter; + server.resource[ "^sapphire-api/lobby/insertSession" ][ "POST" ] = &insertSession; + server.resource[ "^sapphire-api/lobby/checkNameTaken" ][ "POST" ] = &checkNameTaken; + server.resource[ "^sapphire-api/lobby/checkSession" ][ "POST" ] = &checkSession; + server.resource[ "^sapphire-api/lobby/getNextCharId" ][ "POST" ] = &getNextCharId; + server.resource[ "^sapphire-api/lobby/getNextContentId" ][ "POST" ] = &getNextContentId; + server.resource[ "^sapphire-api/lobby/getCharacterList" ][ "POST" ] = &getCharacterList; + server.resource[ "^(frontier-api/ffxivsupport/view/get_init)(.*)" ][ "GET" ] = &get_init; + server.resource[ "^(frontier-api/ffxivsupport/information/get_headline_all)(.*)" ][ "GET" ] = &get_headline_all; server.default_resource[ "GET" ] = &defaultGet; diff --git a/src/api/server_http.hpp b/src/api/server_http.hpp index 8a6d2226..b9166c57 100644 --- a/src/api/server_http.hpp +++ b/src/api/server_http.hpp @@ -304,7 +304,7 @@ namespace SimpleWeb { size_t path_end; if((path_end=line.find(' ', method_end+1))!=std::string::npos) { request->method=line.substr(0, method_end); - request->path=line.substr(method_end+1, path_end-method_end-1); + request->path=line.substr(method_end+2, path_end-method_end-2); size_t protocol_end; if((protocol_end=line.find('/', path_end+1))!=std::string::npos) { diff --git a/src/common/Common.h b/src/common/Common.h index 7bb57000..8f9c258b 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -6,6 +6,7 @@ #include "CommonGen.h" #include "Vector3.h" +#include "Network/PacketDef/Ipcs.h" // +--------------------------------------------------------------------------- // The following enumerations are structures to require their type be included. @@ -25,7 +26,9 @@ namespace Sapphire::Common const uint8_t CURRENT_EXPANSION_ID = 3; const uint8_t CLASSJOB_TOTAL = 38; - const uint8_t CLASSJOB_SLOTS = 28; + const uint8_t CLASSJOB_SLOTS = 30; + + const uint8_t TOWN_COUNT = 6; /*! * @brief The maximum length (in ms) of a combo before it is canceled/voided. @@ -47,13 +50,13 @@ namespace Sapphire::Common uint8_t plot; }; - enum InventoryOperation : uint8_t + enum InventoryOperation : uint16_t { - Discard = 0x07, - Move = 0x08, - Swap = 0x09, - Merge = 0x0C, - Split = 0x0A + Discard = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 7, + Move = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 8, + Swap = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 9, + Split = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 10, + Merge = Network::Packets::ClientZoneIpcType::InventoryModifyHandler + 12 }; enum ClientLanguage : uint8_t @@ -157,44 +160,29 @@ namespace Sapphire::Common ModelRing2 = 9 }; - enum EquipSlotCategory : uint8_t + enum class EquipSlotCategory : uint8_t { - Unequippable = 0, - - // main slots - - CharaMainHand = 1, - CharaOffHand = 2, - CharaHead = 3, - CharaBody = 4, - CharaHands = 5, - CharaWaist = 6, - CharaLegs = 7, - CharaFeet = 8, - CharaEars = 9, - CharaNeck = 10, - CharaWrist = 11, - CharaRing = 12, - CharaSoulCrystal = 17, - - // specials - - /*! Cannot equip gear to offhand slot */ - MainTwoHandedWeapon = 13, - /*! Can be equipped in either main or offhand slot */ - MainOrOffHand = 14, // unused - /*! Cannot equip gear to head */ - BodyDisallowHead = 15, - /*! Cannot equip gear to hands, legs and feet slots */ - BodyDisallowHandsLegsFeet = 16, - /*! Cannot equip gear to feet slot */ - LegsDisallowFeet = 18, - /*! Cannot equp gear to head, hands, legs, feet slots */ - BodyDisallowAll = 19, - /*! Cannot equip gear to hands slot */ - BodyDisallowHands = 20, - /*! Cannot equip gear to legs & feet slots */ - BodyDisallowLegsFeet = 21, + MainHand = 1, + OffHand = 2, + Head = 3, + Body = 4, + Hands = 5, + Waist = 6, + Legs = 7, + Feet = 8, + Ears = 9, + Neck = 10, + Wrist = 11, + Ring = 12, + MainTwoHandedWeapon = 13, + //MainOrOffHand = 14, // unused + BodyDisallowHead = 15, + BodyDisallowHandsLegsFeet = 16, + SoulCrystal = 17, + LegsDisallowFeet = 18, + BodyDisallowAll = 19, + BodyDisallowHands = 20, + BodyDisallowLegsFeet = 21, }; enum InventoryType : uint16_t @@ -214,6 +202,8 @@ namespace Sapphire::Common HandIn = 2005, DamagedGear = 2007, //UNKNOWN_1 = 2008, + // Temporary inventory that is used for the "trade" window + TradeInventory = 2009, ArmoryOff = 3200, ArmoryHead = 3201, @@ -222,8 +212,8 @@ namespace Sapphire::Common ArmoryWaist = 3204, ArmoryLegs = 3205, ArmoryFeet = 3206, - ArmoryNeck = 3207, - ArmoryEar = 3208, + ArmoryEar = 3207, + ArmoryNeck = 3208, ArmoryWrist = 3209, ArmoryRing = 3300, @@ -232,6 +222,9 @@ namespace Sapphire::Common SaddleBag0 = 4000, SaddleBag1 = 4001, + // These are the ones you get when paying for premium companion app + PremiumSaddleBag0 = 4100, + PremiumSaddleBag1 = 4101, RetainerBag0 = 10000, RetainerBag1 = 10001, @@ -405,7 +398,7 @@ namespace Sapphire::Common struct StatusEffect { uint16_t effect_id; - uint16_t unknown1; + uint16_t param; float duration; uint32_t sourceActorId; }; @@ -557,6 +550,30 @@ namespace Sapphire::Common }; + enum FieldMarkerStatus : uint32_t + { + A = 0x1, + B = 0x2, + C = 0x4, + D = 0x8, + One = 0x10, + Two = 0x20, + Three = 0x40, + Four = 0x80 + }; + // TODO: consolidate these two into one since FieldMarkerStatus == 1 << FieldMarkerId? + enum class FieldMarkerId : uint8_t + { + A, + B, + C, + D, + One, + Two, + Three, + Four + }; + enum struct ActionAspect : uint8_t { None = 0, // Doesn't imply unaspected @@ -574,19 +591,27 @@ namespace Sapphire::Common None = 0, // ? MagicPoints = 3, TacticsPoints = 5, -// WARGauge = 22, -// DRKGauge = 25, -// AetherflowStack = 30, -// Status = 32, -// PLDGauge = 41, -// RDMGaugeBoth = 74, -//// RDMGaugeBlack = 75, // not right? -// DRGGauge3Eyes = 76, + StatusEffect = 10, + WARGauge = 22, + DRKGauge = 25, + // AetherflowStack = 30, + // Status = 32, + SAMKenki = 39, + SAMSen = 40, + PLDGauge = 41, + GNBAmmo = 55, + WHMBloodLily = 56, + WHMLily = 57, + SAMMeditation = 63, + // RDMGaugeBoth = 74, + //// RDMGaugeBlack = 75, // not right? + // DRGGauge3Eyes = 76, }; - enum class ActionType : int8_t + enum class AttackType : int8_t { - WeaponOverride = -1, // Needs more investigation (takes the damage type of the equipped weapon)? + //WeaponOverride = -1, // Needs more investigation (takes the damage type of the equipped weapon)? + Physical = -1, // seems to be the case Unknown_0 = 0, Slashing = 1, Piercing = 2, @@ -615,28 +640,41 @@ namespace Sapphire::Common TpLoss = 12, TpGain = 13, GpGain = 14, + ApplyStatusEffectTarget = 15, + ApplyStatusEffectSource = 16, // effect entry on target but buff applies to source, like storm's eye + StatusNoEffect = 20, // shifted one up from 5.18 /*! * @brief Tells the client that it should show combo indicators on actions. * * @param flags Required to be 128, doesn't show combo rings on hotbars otherwise * @param value The actionid that starts/continues the combo. eg, 3617 will start a spinning slash and/or syphon strike combo */ - StartActionCombo = 28, + StartActionCombo = 27, // shifted one up from 5.18 + ComboSucceed = 28, // shifted one up from 5.18, on retail this is not seen anymore, still working though. Knockback = 33, - Mount = 38, + Mount = 40, // shifted one down from 5.18 VFX = 59, // links to VFX sheet }; enum class ActionHitSeverityType : uint8_t { NormalDamage = 0, - CritHeal = 0, + NormalHeal = 0, CritDamage = 1, - NormalHeal = 1, + CritHeal = 1, DirectHitDamage = 2, CritDirectHitDamage = 3 }; + enum class ActionEffectResultFlag : uint8_t + { + None = 0, + Absorbed = 0x04, + ExtendedValue = 0x40, + EffectOnSource = 0x80, + Reflected = 0xA0, + }; + enum ItemActionType : uint16_t { ItemActionVFX = 852, @@ -653,15 +691,15 @@ namespace Sapphire::Common struct EffectEntry { Common::ActionEffectType effectType; - Common::ActionHitSeverityType hitSeverity; - uint8_t param; + uint8_t param0; + uint8_t param1; /*! * @brief Shows an additional percentage in the battle log * * Has no effect on what is shown and stored in value */ - int8_t bonusPercent; - uint8_t valueMultiplier; // This multiplies whatever value is in the 'value' param by 10. Possibly a workaround for big numbers + uint8_t param2; + uint8_t extendedValueHighestByte; uint8_t flags; int16_t value; }; @@ -719,6 +757,7 @@ namespace Sapphire::Common BetweenAreas = 24, BoundByDuty = 28, + Performing = 40, WatchingCutscene = 50, // this is actually just a dummy, this id is different @@ -989,6 +1028,7 @@ namespace Sapphire::Common { SingleTarget = 1, CircularAOE = 2, + Type3 = 3, // another single target? no idea how to call it RectangularAOE = 4, CircularAoEPlaced = 7 }; @@ -1005,8 +1045,209 @@ namespace Sapphire::Common Gatherer }; - using PlayerStateFlagList = std::vector< PlayerStateFlag >; + enum class AstCardType : uint8_t + { + None = 0, + Balance = 1, + Bole = 2, + Arrow = 3, + Spear = 4, + Ewer = 5, + Spire = 6, + Lord = 0x70, + Lady = 0x80, + }; + enum class AstSealType : uint8_t + { + None = 0, + Sun = 1, + Moon = 2, + Celestrial = 3, + }; + + enum class DrgState : uint8_t + { + None = 0, + BloodOfTheDragon = 1, + LifeOfTheDragon = 2, + }; + + enum class SamSen : uint8_t + { + None = 0, + Setsu = 1, + Getsu = 2, + Ka = 4, + }; + + enum class SchDismissedFairy : uint8_t + { + None = 0, + Eos = 6, + Selene = 7, + }; + + enum class SmnPet : uint8_t + { + None = 0, + Ifrit = 3, + Titan = 4, + Garuda = 5, + }; + + enum class SmnPetGlam : uint8_t + { + None = 0, + Emerald = 1, + Topaz = 2, + Ruby = 3, + }; + + enum class BrdSong : uint8_t + { + Mage = 5, + Army = 0x0A, + Wanderer = 0x0F, + }; + + union JobGauge + { + struct + { + uint8_t gauge_data[15]; + } _raw; + + struct + { + uint32_t unused; + AstCardType card; + AstSealType seals[3]; + } ast; + struct + { + uint16_t timeUntilNextPolyglot; + uint16_t elementTimer; + uint8_t elementStance; + uint8_t umbralhearts; + uint8_t polyglotStacks; + uint8_t enochainState; + } blm; + struct + { + uint16_t songTimer; + uint8_t songStacks; + uint8_t unused; + BrdSong song; + } brd; + struct + { + uint8_t feathers; + uint8_t esprit; + uint8_t stepOrder[4]; + uint8_t completeSteps; + } dnc; + struct + { + uint16_t dragonTimer; + DrgState dragonState; + uint8_t eyes; + } drg; + struct + { + uint8_t blood; + uint8_t unused; + uint16_t darksideTimer; + uint8_t darkArts; + uint8_t unused2; + uint16_t shadowTimer; + } drk; + struct + { + uint8_t ammo; + uint8_t unused; + uint16_t maxTimerDuration; + uint8_t ammoComboStep; + } gnb; + struct + { + uint16_t overheatTimer; + uint16_t robotTimer; + uint8_t heat; + uint8_t battery; + uint8_t lastRobotBatteryPower; + uint8_t activeTimerFlag; + } mch; + struct + { + uint8_t greasedLightningTimer; + uint8_t unused; + uint8_t greasedLightningStacks; + uint8_t chakra; + uint8_t greasedLightningTimerFreezed; + } mnk; + struct + { + uint32_t hutonTimer; + uint8_t tenChiJinMudrasUsed; + uint8_t ninki; + uint8_t hutonManualCasts; + } nin; + struct + { + uint8_t oathGauge; + } pld; + struct + { + uint8_t whiteGauge; + uint8_t blackGauge; + } rdm; + struct + { + uint16_t unused; + uint8_t unused2; + uint8_t kenki; + uint8_t meditationStacks; + SamSen sen; + } sam; + struct + { + uint16_t unused; + uint8_t aetherflowStacks; + uint8_t fairyGauge; + uint16_t seraphTimer; + SchDismissedFairy dismissedFairy; + } sch; + struct + { + uint16_t timer; + SmnPet returnSummon; + SmnPetGlam petGlam; + uint8_t stacks; + } smn; + + struct + { + uint8_t beastGauge; + } war; + struct + { + uint16_t unused; + uint16_t lilyTimer; + uint8_t lilies; + uint8_t bloodLilies; + } whm; + }; + + enum class LootMessageType : uint8_t + { + GetItem1 = 1, // p1: actorId, p4: itemId (HQ: itemId + 1,000,000 lol), p5: amount + GetItem2 = 3, // p1: actorId, p2: itemId, p3: amount, seems like same thing as GetItem1 but different param position. + FailedToGetLootNoFreeInventorySlot = 5, // p1: actorId + LootRolled = 7, // p1: actorId, p2: itemId, p3: amount + GetGil = 9, // p1: gil + EmptyCoffer = 11, // seems like no param + }; } #endif diff --git a/src/common/CommonGen.h b/src/common/CommonGen.h index 4833e57a..98ad9d71 100644 --- a/src/common/CommonGen.h +++ b/src/common/CommonGen.h @@ -4,732 +4,801 @@ #include /* This file has been automatically generated. - Changes will be lost upon regeneration. - To change the content edit tools/exd_common_gen */ +Changes will be lost upon regeneration. +To change the content edit tools/exd_common_gen */ namespace Sapphire::Common { -/////////////////////////////////////////////////////////// -//ActionCategory.exd -enum class ActionCategory : uint8_t -{ - None = 0, - Autoattack = 1, - Spell = 2, - Weaponskill = 3, - Ability = 4, - Item = 5, - DoLAbility = 6, - DoHAbility = 7, - Event = 8, - LimitBreak = 9, - System = 10, - Artillery = 11, - Mount = 12, - Glamour = 13, - ItemManipulation = 14, - AdrenalineRush = 15, -}; + /////////////////////////////////////////////////////////// + //ActionCategory.exd + enum class ActionCategory : uint8_t + { + None = 0, + Autoattack = 1, + Spell = 2, + Weaponskill = 3, + Ability = 4, + Item = 5, + DoLAbility = 6, + DoHAbility = 7, + Event = 8, + LimitBreak = 9, + System = 10, + Artillery = 11, + Mount = 12, + Special = 13, + ItemManipulation = 14, + AdrenalineRush = 15, + //1 = 16, + }; -/////////////////////////////////////////////////////////// -//BaseParam.exd -enum class BaseParam : uint8_t -{ - None = 0, - Strength = 1, - Dexterity = 2, - Vitality = 3, - Intelligence = 4, - Mind = 5, - Piety = 6, - HP = 7, - MP = 8, - TP = 9, - GP = 10, - CP = 11, - PhysicalDamage = 12, - MagicDamage = 13, - Delay = 14, - AdditionalEffect = 15, - AttackSpeed = 16, - BlockRate = 17, - BlockStrength = 18, - Tenacity = 19, - AttackPower = 20, - Defense = 21, - DirectHitRate = 22, - Evasion = 23, - MagicDefense = 24, - CriticalHitPower = 25, - CriticalHitResilience = 26, - CriticalHit = 27, - CriticalHitEvasion = 28, - SlashingResistance = 29, - PiercingResistance = 30, - BluntResistance = 31, - ProjectileResistance = 32, - AttackMagicPotency = 33, - HealingMagicPotency = 34, - EnhancementMagicPotency = 35, - ElementalBonus = 36, - FireResistance = 37, - IceResistance = 38, - WindResistance = 39, - EarthResistance = 40, - LightningResistance = 41, - WaterResistance = 42, - MagicResistance = 43, - Determination = 44, - SkillSpeed = 45, - SpellSpeed = 46, - Haste = 47, - Morale = 48, - Enmity = 49, - EnmityReduction = 50, - CarefulDesynthesis = 51, - EXPBonus = 52, - Regen = 53, - Refresh = 54, - MainAttribute = 55, - SecondaryAttribute = 56, - SlowResistance = 57, - PetrificationResistance = 58, - ParalysisResistance = 59, - SilenceResistance = 60, - BlindResistance = 61, - PoisonResistance = 62, - StunResistance = 63, - SleepResistance = 64, - BindResistance = 65, - HeavyResistance = 66, - DoomResistance = 67, - ReducedDurabilityLoss = 68, - IncreasedSpiritbondGain = 69, - Craftsmanship = 70, - Control = 71, - Gathering = 72, - Perception = 73, -}; + /////////////////////////////////////////////////////////// + //BaseParam.exd + enum class BaseParam : uint8_t + { + None = 0, + Strength = 1, + Dexterity = 2, + Vitality = 3, + Intelligence = 4, + Mind = 5, + Piety = 6, + HP = 7, + MP = 8, + TP = 9, + GP = 10, + CP = 11, + PhysicalDamage = 12, + MagicDamage = 13, + Delay = 14, + AdditionalEffect = 15, + AttackSpeed = 16, + BlockRate = 17, + BlockStrength = 18, + Tenacity = 19, + AttackPower = 20, + Defense = 21, + DirectHitRate = 22, + Evasion = 23, + MagicDefense = 24, + CriticalHitPower = 25, + CriticalHitResilience = 26, + CriticalHit = 27, + CriticalHitEvasion = 28, + SlashingResistance = 29, + PiercingResistance = 30, + BluntResistance = 31, + ProjectileResistance = 32, + AttackMagicPotency = 33, + HealingMagicPotency = 34, + EnhancementMagicPotency = 35, + ElementalBonus = 36, + FireResistance = 37, + IceResistance = 38, + WindResistance = 39, + EarthResistance = 40, + LightningResistance = 41, + WaterResistance = 42, + MagicResistance = 43, + Determination = 44, + SkillSpeed = 45, + SpellSpeed = 46, + Haste = 47, + Morale = 48, + Enmity = 49, + EnmityReduction = 50, + DesynthesisSkillGain = 51, + EXPBonus = 52, + Regen = 53, + Refresh = 54, + MainAttribute = 55, + SecondaryAttribute = 56, + SlowResistance = 57, + PetrificationResistance = 58, + ParalysisResistance = 59, + SilenceResistance = 60, + BlindResistance = 61, + PoisonResistance = 62, + StunResistance = 63, + SleepResistance = 64, + BindResistance = 65, + HeavyResistance = 66, + DoomResistance = 67, + ReducedDurabilityLoss = 68, + IncreasedSpiritbondGain = 69, + Craftsmanship = 70, + Control = 71, + Gathering = 72, + Perception = 73, + }; -/////////////////////////////////////////////////////////// -//BeastReputationRank.exd -enum class BeastReputationRank : uint8_t -{ - None = 0, - Neutral = 1, - Recognized = 2, - Friendly = 3, - Trusted = 4, - Respected = 5, - Honored = 6, - Sworn = 7, - Allied = 8, -}; + /////////////////////////////////////////////////////////// + //BeastReputationRank.exd + enum class BeastReputationRank : uint8_t + { + None = 0, + Neutral = 1, + Recognized = 2, + Friendly = 3, + Trusted = 4, + Respected = 5, + Honored = 6, + Sworn = 7, + Allied = 8, + }; -/////////////////////////////////////////////////////////// -//BeastTribe.exd -enum class BeastTribe : uint8_t -{ -}; + /////////////////////////////////////////////////////////// + //BeastTribe.exd + enum class BeastTribe : uint8_t + { + /* = 0, + 1 = 1, + 2 = 2, + 3 = 3, + 4 = 4, + 5 = 5, + 6 = 6, + 7 = 7, + 8 = 8, + 9 = 9, + 10 = 10, + 11 = 11, + 12 = 12, + 13 = 13, + 14 = 14,*/ + }; -/////////////////////////////////////////////////////////// -//ClassJob.exd -enum class ClassJob : uint8_t -{ - Adventurer = 0, - Gladiator = 1, - Pugilist = 2, - Marauder = 3, - Lancer = 4, - Archer = 5, - Conjurer = 6, - Thaumaturge = 7, - Carpenter = 8, - Blacksmith = 9, - Armorer = 10, - Goldsmith = 11, - Leatherworker = 12, - Weaver = 13, - Alchemist = 14, - Culinarian = 15, - Miner = 16, - Botanist = 17, - Fisher = 18, - Paladin = 19, - Monk = 20, - Warrior = 21, - Dragoon = 22, - Bard = 23, - Whitemage = 24, - Blackmage = 25, - Arcanist = 26, - Summoner = 27, - Scholar = 28, - Rogue = 29, - Ninja = 30, - Machinist = 31, - Darkknight = 32, - Astrologian = 33, - Samurai = 34, - Redmage = 35, - Bluemage = 36, - Gunbreaker = 37, - Dancer = 38, -}; + /////////////////////////////////////////////////////////// + //ClassJob.exd + enum class ClassJob : uint8_t + { + Adventurer = 0, + Gladiator = 1, + Pugilist = 2, + Marauder = 3, + Lancer = 4, + Archer = 5, + Conjurer = 6, + Thaumaturge = 7, + Carpenter = 8, + Blacksmith = 9, + Armorer = 10, + Goldsmith = 11, + Leatherworker = 12, + Weaver = 13, + Alchemist = 14, + Culinarian = 15, + Miner = 16, + Botanist = 17, + Fisher = 18, + Paladin = 19, + Monk = 20, + Warrior = 21, + Dragoon = 22, + Bard = 23, + Whitemage = 24, + Blackmage = 25, + Arcanist = 26, + Summoner = 27, + Scholar = 28, + Rogue = 29, + Ninja = 30, + Machinist = 31, + Darkknight = 32, + Astrologian = 33, + Samurai = 34, + Redmage = 35, + Bluemage = 36, + Gunbreaker = 37, + Dancer = 38, + // = 39, + //1 = 40, + }; -/////////////////////////////////////////////////////////// -//ContentType.exd -enum class ContentType : uint8_t -{ - None = 0, - DutyRoulette = 1, - Dungeons = 2, - Guildhests = 3, - Trials = 4, - Raids = 5, - PvP = 6, - QuestBattles = 7, - FATEs = 8, - TreasureHunt = 9, - Levequests = 10, - GrandCompany = 11, - Companions = 12, - BeastTribeQuests = 13, - OverallCompletion = 14, - PlayerCommendation = 15, - DisciplesoftheLand = 16, - DisciplesoftheHand = 17, - RetainerVentures = 18, - GoldSaucer = 19, - DeepDungeons = 21, - WondrousTails = 24, - CustomDeliveries = 25, - Eureka = 26, -}; + /////////////////////////////////////////////////////////// + //ContentType.exd + enum class ContentType : uint8_t + { + None = 0, + DutyRoulette = 1, + Dungeons = 2, + Guildhests = 3, + Trials = 4, + Raids = 5, + PvP = 6, + QuestBattles = 7, + FATEs = 8, + TreasureHunt = 9, + Levequests = 10, + GrandCompany = 11, + Companions = 12, + BeastTribeQuests = 13, + OverallCompletion = 14, + PlayerCommendation = 15, + DisciplesoftheLand = 16, + DisciplesoftheHand = 17, + RetainerVentures = 18, + GoldSaucer = 19, + //1 = 20, + DeepDungeons = 21, + //2 = 22, + //3 = 23, + WondrousTails = 24, + CustomDeliveries = 25, + Eureka = 26, + //4 = 27, + UltimateRaids = 28, + //5 = 29, + }; -/////////////////////////////////////////////////////////// -//EmoteCategory.exd -enum class EmoteCategory : uint8_t -{ - None = 0, - General = 1, - Special = 2, - Expressions = 3, -}; + /////////////////////////////////////////////////////////// + //EmoteCategory.exd + enum class EmoteCategory : uint8_t + { + None = 0, + General = 1, + Special = 2, + Expressions = 3, + //1 = 4, + }; -/////////////////////////////////////////////////////////// -//ExVersion.exd -enum class ExVersion : uint8_t -{ - ARealmReborn = 0, - Heavensward = 1, - Stormblood = 2, - Shadowbringers = 3, -}; + /////////////////////////////////////////////////////////// + //ExVersion.exd + enum class ExVersion : uint8_t + { + ARealmReborn = 0, + Heavensward = 1, + Stormblood = 2, + Shadowbringers = 3, + }; -/////////////////////////////////////////////////////////// -//GrandCompany.exd -enum class GrandCompany : uint8_t -{ - None = 0, - Maelstrom = 1, - OrderoftheTwinAdder = 2, - ImmortalFlames = 3, -}; + /////////////////////////////////////////////////////////// + //GrandCompany.exd + enum class GrandCompany : uint8_t + { + None = 0, + Maelstrom = 1, + OrderoftheTwinAdder = 2, + ImmortalFlames = 3, + }; -/////////////////////////////////////////////////////////// -//GuardianDeity.exd -enum class GuardianDeity : uint8_t -{ - None = 0, - HalonetheFury = 1, - MenphinatheLover = 2, - ThaliaktheScholar = 3, - NymeiatheSpinner = 4, - LlymlaentheNavigator = 5, - OschontheWanderer = 6, - ByregottheBuilder = 7, - RhalgrtheDestroyer = 8, - AzeymatheWarden = 9, - NaldthaltheTraders = 10, - NophicatheMatron = 11, - AlthyktheKeeper = 12, -}; + /////////////////////////////////////////////////////////// + //GuardianDeity.exd + enum class GuardianDeity : uint8_t + { + None = 0, + HalonetheFury = 1, + MenphinatheLover = 2, + ThaliaktheScholar = 3, + NymeiatheSpinner = 4, + LlymlaentheNavigator = 5, + OschontheWanderer = 6, + ByregottheBuilder = 7, + RhalgrtheDestroyer = 8, + AzeymatheWarden = 9, + NaldthaltheTraders = 10, + NophicatheMatron = 11, + AlthyktheKeeper = 12, + }; -/////////////////////////////////////////////////////////// -//ItemUICategory.exd -enum class ItemUICategory : uint8_t -{ - None = 0, - PugilistsArm = 1, - GladiatorsArm = 2, - MaraudersArm = 3, - ArchersArm = 4, - LancersArm = 5, - OnehandedThaumaturgesArm = 6, - TwohandedThaumaturgesArm = 7, - OnehandedConjurersArm = 8, - TwohandedConjurersArm = 9, - ArcanistsGrimoire = 10, - Shield = 11, - CarpentersPrimaryTool = 12, - CarpentersSecondaryTool = 13, - BlacksmithsPrimaryTool = 14, - BlacksmithsSecondaryTool = 15, - ArmorersPrimaryTool = 16, - ArmorersSecondaryTool = 17, - GoldsmithsPrimaryTool = 18, - GoldsmithsSecondaryTool = 19, - LeatherworkersPrimaryTool = 20, - LeatherworkersSecondaryTool = 21, - WeaversPrimaryTool = 22, - WeaversSecondaryTool = 23, - AlchemistsPrimaryTool = 24, - AlchemistsSecondaryTool = 25, - CulinariansPrimaryTool = 26, - CulinariansSecondaryTool = 27, - MinersPrimaryTool = 28, - MinersSecondaryTool = 29, - BotanistsPrimaryTool = 30, - BotanistsSecondaryTool = 31, - FishersPrimaryTool = 32, - FishingTackle = 33, - Head = 34, - Body = 35, - Legs = 36, - Hands = 37, - Feet = 38, - Waist = 39, - Necklace = 40, - Earrings = 41, - Bracelets = 42, - Ring = 43, - Medicine = 44, - Ingredient = 45, - Meal = 46, - Seafood = 47, - Stone = 48, - Metal = 49, - Lumber = 50, - Cloth = 51, - Leather = 52, - Bone = 53, - Reagent = 54, - Dye = 55, - Part = 56, - Furnishing = 57, - Materia = 58, - Crystal = 59, - Catalyst = 60, - Miscellany = 61, - SoulCrystal = 62, - Other = 63, - ConstructionPermit = 64, - Roof = 65, - ExteriorWall = 66, - Window = 67, - Door = 68, - RoofDecoration = 69, - ExteriorWallDecoration = 70, - Placard = 71, - Fence = 72, - InteriorWall = 73, - Flooring = 74, - CeilingLight = 75, - OutdoorFurnishing = 76, - Table = 77, - Tabletop = 78, - Wallmounted = 79, - Rug = 80, - Minion = 81, - Gardening = 82, - Demimateria = 83, - RoguesArm = 84, - SeasonalMiscellany = 85, - TripleTriadCard = 86, - DarkKnightsArm = 87, - MachinistsArm = 88, - AstrologiansArm = 89, - AirshipHull = 90, - AirshipRigging = 91, - AirshipAftcastle = 92, - AirshipForecastle = 93, - OrchestrionRoll = 94, - Painting = 95, - SamuraisArm = 96, - RedMagesArm = 97, - ScholarsArm = 98, - FishersSecondaryTool = 99, - Currency = 100, - SubmersibleHull = 101, - SubmersibleStern = 102, - SubmersibleBow = 103, - SubmersibleBridge = 104, - BlueMagesArm = 105, - GunbreakersArm = 106, - DancersArm = 107, -}; + /////////////////////////////////////////////////////////// + //ItemUICategory.exd + enum class ItemUICategory : uint8_t + { + None = 0, + PugilistsArm = 1, + GladiatorsArm = 2, + MaraudersArm = 3, + ArchersArm = 4, + LancersArm = 5, + OnehandedThaumaturgesArm = 6, + TwohandedThaumaturgesArm = 7, + OnehandedConjurersArm = 8, + TwohandedConjurersArm = 9, + ArcanistsGrimoire = 10, + Shield = 11, + CarpentersPrimaryTool = 12, + CarpentersSecondaryTool = 13, + BlacksmithsPrimaryTool = 14, + BlacksmithsSecondaryTool = 15, + ArmorersPrimaryTool = 16, + ArmorersSecondaryTool = 17, + GoldsmithsPrimaryTool = 18, + GoldsmithsSecondaryTool = 19, + LeatherworkersPrimaryTool = 20, + LeatherworkersSecondaryTool = 21, + WeaversPrimaryTool = 22, + WeaversSecondaryTool = 23, + AlchemistsPrimaryTool = 24, + AlchemistsSecondaryTool = 25, + CulinariansPrimaryTool = 26, + CulinariansSecondaryTool = 27, + MinersPrimaryTool = 28, + MinersSecondaryTool = 29, + BotanistsPrimaryTool = 30, + BotanistsSecondaryTool = 31, + FishersPrimaryTool = 32, + FishingTackle = 33, + Head = 34, + Body = 35, + Legs = 36, + Hands = 37, + Feet = 38, + Waist = 39, + Necklace = 40, + Earrings = 41, + Bracelets = 42, + Ring = 43, + Medicine = 44, + Ingredient = 45, + Meal = 46, + Seafood = 47, + Stone = 48, + Metal = 49, + Lumber = 50, + Cloth = 51, + Leather = 52, + Bone = 53, + Reagent = 54, + Dye = 55, + Part = 56, + Furnishing = 57, + Materia = 58, + Crystal = 59, + Catalyst = 60, + Miscellany = 61, + SoulCrystal = 62, + Other = 63, + ConstructionPermit = 64, + Roof = 65, + ExteriorWall = 66, + Window = 67, + Door = 68, + RoofDecoration = 69, + ExteriorWallDecoration = 70, + Placard = 71, + Fence = 72, + InteriorWall = 73, + Flooring = 74, + CeilingLight = 75, + OutdoorFurnishing = 76, + Table = 77, + Tabletop = 78, + Wallmounted = 79, + Rug = 80, + Minion = 81, + Gardening = 82, + Demimateria = 83, + RoguesArm = 84, + SeasonalMiscellany = 85, + TripleTriadCard = 86, + DarkKnightsArm = 87, + MachinistsArm = 88, + AstrologiansArm = 89, + AirshipHull = 90, + AirshipRigging = 91, + AirshipAftcastle = 92, + AirshipForecastle = 93, + OrchestrionRoll = 94, + Painting = 95, + SamuraisArm = 96, + RedMagesArm = 97, + ScholarsArm = 98, + FishersSecondaryTool = 99, + Currency = 100, + SubmersibleHull = 101, + SubmersibleStern = 102, + SubmersibleBow = 103, + SubmersibleBridge = 104, + BlueMagesArm = 105, + GunbreakersArm = 106, + DancersArm = 107, + }; -/////////////////////////////////////////////////////////// -//ItemSearchCategory.exd -enum class ItemSearchCategory : uint8_t -{ - None = 0, - PrimaryArms = 1, - PrimaryTools = 2, - PrimaryTools1 = 3, - Armor = 4, - Accessories = 5, - Medicines = 6, - Materials = 7, - Other = 8, - PugilistsArms = 9, - GladiatorsArms = 10, - MaraudersArms = 11, - ArchersArms = 12, - LancersArms = 13, - ThaumaturgesArms = 14, - ConjurersArms = 15, - ArcanistsArms = 16, - Shields = 17, - DancersArms = 18, - CarpentersTools = 19, - BlacksmithsTools = 20, - ArmorersTools = 21, - GoldsmithsTools = 22, - LeatherworkersTools = 23, - WeaversTools = 24, - AlchemistsTools = 25, - CulinariansTools = 26, - MinersTools = 27, - BotanistsTools = 28, - FishersTools = 29, - FishingTackle = 30, - Head = 31, - Undershirts = 32, - Body = 33, - Undergarments = 34, - Legs = 35, - Hands = 36, - Feet = 37, - Waist = 38, - Necklaces = 39, - Earrings = 40, - Bracelets = 41, - Rings = 42, - Medicine = 43, - Ingredients = 44, - Meals = 45, - Seafood = 46, - Stone = 47, - Metal = 48, - Lumber = 49, - Cloth = 50, - Leather = 51, - Bone = 52, - Reagents = 53, - Dyes = 54, - WeaponParts = 55, - Furnishings = 56, - Materia = 57, - Crystals = 58, - Catalysts = 59, - Miscellany = 60, - SoulCrystals = 61, - Arrows = 62, - QuestItems = 63, - Other1 = 64, - ExteriorFixtures = 65, - InteriorFixtures = 66, - OutdoorFurnishings = 67, - ChairsandBeds = 68, - Tables = 69, - Tabletop = 70, - Wallmounted = 71, - Rugs = 72, - RoguesArms = 73, - SeasonalMiscellany = 74, - Minions = 75, - DarkKnightsArms = 76, - MachinistsArms = 77, - AstrologiansArms = 78, - AirshipSubmersibleComponents = 79, - OrchestrionComponents = 80, - GardeningItems = 81, - Paintings = 82, - SamuraisArms = 83, - RedMagesArms = 84, - ScholarsArms = 85, - GunbreakersArms = 86, - ThrowingWeapons = 87, -}; + /////////////////////////////////////////////////////////// + //ItemSearchCategory.exd + enum class ItemSearchCategory : uint8_t + { + None = 0, + PrimaryArms = 1, + PrimaryTools = 2, + PrimaryTools1 = 3, + Armor = 4, + Accessories = 5, + Medicines = 6, + Materials = 7, + Other = 8, + PugilistsArms = 9, + GladiatorsArms = 10, + MaraudersArms = 11, + ArchersArms = 12, + LancersArms = 13, + ThaumaturgesArms = 14, + ConjurersArms = 15, + ArcanistsArms = 16, + Shields = 17, + DancersArms = 18, + CarpentersTools = 19, + BlacksmithsTools = 20, + ArmorersTools = 21, + GoldsmithsTools = 22, + LeatherworkersTools = 23, + WeaversTools = 24, + AlchemistsTools = 25, + CulinariansTools = 26, + MinersTools = 27, + BotanistsTools = 28, + FishersTools = 29, + FishingTackle = 30, + Head = 31, + Undershirts = 32, + Body = 33, + Undergarments = 34, + Legs = 35, + Hands = 36, + Feet = 37, + Waist = 38, + Necklaces = 39, + Earrings = 40, + Bracelets = 41, + Rings = 42, + Medicine = 43, + Ingredients = 44, + Meals = 45, + Seafood = 46, + Stone = 47, + Metal = 48, + Lumber = 49, + Cloth = 50, + Leather = 51, + Bone = 52, + Reagents = 53, + Dyes = 54, + WeaponParts = 55, + Furnishings = 56, + Materia = 57, + Crystals = 58, + Catalysts = 59, + Miscellany = 60, + SoulCrystals = 61, + Arrows = 62, + QuestItems = 63, + Other1 = 64, + ExteriorFixtures = 65, + InteriorFixtures = 66, + OutdoorFurnishings = 67, + ChairsandBeds = 68, + Tables = 69, + Tabletop = 70, + Wallmounted = 71, + Rugs = 72, + RoguesArms = 73, + SeasonalMiscellany = 74, + Minions = 75, + DarkKnightsArms = 76, + MachinistsArms = 77, + AstrologiansArms = 78, + AirshipSubmersibleComponents = 79, + OrchestrionComponents = 80, + GardeningItems = 81, + Paintings = 82, + SamuraisArms = 83, + RedMagesArms = 84, + ScholarsArms = 85, + GunbreakersArms = 86, + DancersArms1 = 87, + /*1 = 88, + 2 = 89, + 3 = 90, + 4 = 91, + 5 = 92, + 6 = 93, + 7 = 94, + 8 = 95, + 9 = 96, + 10 = 97, + 11 = 98, + 12 = 99, + 13 = 100,*/ + }; -/////////////////////////////////////////////////////////// -//OnlineStatus.exd -enum class OnlineStatus : uint8_t -{ - Producer = 1, - GameMaster = 2, - GameMaster1 = 3, - GameMaster2 = 4, - Disconnected = 5, - WaitingforFriendListApproval = 6, - WaitingforLinkshellApproval = 7, - WaitingforFreeCompanyApproval = 8, - NotFound = 9, - Offline = 10, - Mentor = 11, - Busy = 12, - PvP = 13, - PlayingTripleTriad = 14, - ViewingCutscene = 15, - UsingaChocoboPorter = 16, - AwayfromKeyboard = 17, - CameraMode = 18, - LookingforRepairs = 19, - LookingtoRepair = 20, - LookingtoMeldMateria = 21, - Roleplaying = 22, - LookingforParty = 23, - SwordforHire = 24, - WaitingforDutyFinder = 25, - RecruitingPartyMembers = 26, - Mentor1 = 27, - PvEMentor = 28, - TradeMentor = 29, - PvPMentor = 30, - Returner = 31, - NewAdventurer = 32, - AllianceLeader = 33, - AlliancePartyLeader = 34, - AlliancePartyMember = 35, - PartyLeader = 36, - PartyMember = 37, - PartyLeaderCrossworld = 38, - PartyMemberCrossworld = 39, - AnotherWorld = 40, - SharingDuty = 41, - SimilarDuty = 42, - InDuty = 43, - TrialAdventurer = 44, - FreeCompany = 45, - GrandCompany = 46, - Online = 47, -}; + /////////////////////////////////////////////////////////// + //OnlineStatus.exd + enum class OnlineStatus : uint8_t + { + Producer = 1, + GameMaster = 2, + GameMaster1 = 3, + GameMaster2 = 4, + Disconnected = 5, + WaitingforFriendListApproval = 6, + WaitingforLinkshellApproval = 7, + WaitingforFreeCompanyApproval = 8, + NotFound = 9, + Offline = 10, + Mentor = 11, + Busy = 12, + PvP = 13, + PlayingTripleTriad = 14, + ViewingCutscene = 15, + UsingaChocoboPorter = 16, + AwayfromKeyboard = 17, + CameraMode = 18, + LookingforRepairs = 19, + LookingtoRepair = 20, + LookingtoMeldMateria = 21, + Roleplaying = 22, + LookingforParty = 23, + SwordforHire = 24, + WaitingforDutyFinder = 25, + RecruitingPartyMembers = 26, + Mentor1 = 27, + PvEMentor = 28, + TradeMentor = 29, + PvPMentor = 30, + Returner = 31, + NewAdventurer = 32, + AllianceLeader = 33, + AlliancePartyLeader = 34, + AlliancePartyMember = 35, + PartyLeader = 36, + PartyMember = 37, + PartyLeaderCrossworld = 38, + PartyMemberCrossworld = 39, + AnotherWorld = 40, + SharingDuty = 41, + SimilarDuty = 42, + InDuty = 43, + TrialAdventurer = 44, + FreeCompany = 45, + GrandCompany = 46, + Online = 47, + }; -/////////////////////////////////////////////////////////// -//Race.exd -enum class Race : uint8_t -{ - None = 0, - Hyur = 1, - Elezen = 2, - Lalafell = 3, - Miqote = 4, - Roegadyn = 5, - AuRa = 6, - Hrothgar = 7, - Viera = 8, -}; + /////////////////////////////////////////////////////////// + //Race.exd + enum class Race : uint8_t + { + None = 0, + Hyur = 1, + Elezen = 2, + Lalafell = 3, + Miqote = 4, + Roegadyn = 5, + AuRa = 6, + Hrothgar = 7, + Viera = 8, + }; -/////////////////////////////////////////////////////////// -//Tribe.exd -enum class Tribe : uint8_t -{ - None = 0, - Midlander = 1, - Highlander = 2, - Wildwood = 3, - Duskwight = 4, - Plainsfolk = 5, - Dunesfolk = 6, - SeekeroftheSun = 7, - KeeperoftheMoon = 8, - SeaWolf = 9, - Hellsguard = 10, - Raen = 11, - Xaela = 12, - Helions = 13, - TheLost = 14, - Rava = 15, - Veena = 16, -}; + /////////////////////////////////////////////////////////// + //Tribe.exd + enum class Tribe : uint8_t + { + None = 0, + Midlander = 1, + Highlander = 2, + Wildwood = 3, + Duskwight = 4, + Plainsfolk = 5, + Dunesfolk = 6, + SeekeroftheSun = 7, + KeeperoftheMoon = 8, + SeaWolf = 9, + Hellsguard = 10, + Raen = 11, + Xaela = 12, + Helions = 13, + TheLost = 14, + Rava = 15, + Veena = 16, + }; -/////////////////////////////////////////////////////////// -//Town.exd -enum class Town : uint8_t -{ - Nowheresville = 0, - LimsaLominsa = 1, - Gridania = 2, - Uldah = 3, - Ishgard = 4, - Kugane = 7, - TheCrystarium = 10, -}; + /////////////////////////////////////////////////////////// + //Town.exd + enum class Town : uint8_t + { + Nowheresville = 0, + LimsaLominsa = 1, + Gridania = 2, + Uldah = 3, + Ishgard = 4, + // = 5, + //1 = 6, + Kugane = 7, + //2 = 8, + //3 = 9, + Crystarium = 10, + //4 = 11, + }; -/////////////////////////////////////////////////////////// -//Weather.exd -enum class Weather : uint8_t -{ - None = 0, - ClearSkies = 1, - FairSkies = 2, - Clouds = 3, - Fog = 4, - Wind = 5, - Gales = 6, - Rain = 7, - Showers = 8, - Thunder = 9, - Thunderstorms = 10, - DustStorms = 11, - Sandstorms = 12, - HotSpells = 13, - HeatWaves = 14, - Snow = 15, - Blizzards = 16, - Gloom = 17, - Auroras = 18, - Darkness = 19, - Tension = 20, - Clouds1 = 21, - StormClouds = 22, - RoughSeas = 23, - RoughSeas1 = 24, - Louring = 25, - HeatWaves1 = 26, - Gloom1 = 27, - Gales1 = 28, - Eruptions = 29, - FairSkies1 = 30, - FairSkies2 = 31, - FairSkies3 = 32, - FairSkies4 = 33, - FairSkies5 = 34, - Irradiance = 35, - CoreRadiation = 36, - CoreRadiation1 = 37, - CoreRadiation2 = 38, - CoreRadiation3 = 39, - ShelfClouds = 40, - ShelfClouds1 = 41, - ShelfClouds2 = 42, - ShelfClouds3 = 43, - Oppression = 44, - Oppression1 = 45, - Oppression2 = 46, - Oppression3 = 47, - Oppression4 = 48, - UmbralWind = 49, - UmbralStatic = 50, - Smoke = 51, - FairSkies6 = 52, - RoyalLevin = 53, - Hyperelectricity = 54, - RoyalLevin1 = 55, - Oppression5 = 56, - Thunder1 = 57, - Thunder2 = 58, - CutScene = 59, - Multiplicity = 60, - Multiplicity1 = 61, - Rain1 = 62, - FairSkies7 = 63, - Rain2 = 64, - FairSkies8 = 65, - Dragonstorms = 66, - Dragonstorms1 = 67, - Subterrain = 68, - Concordance = 69, - Concordance1 = 70, - BeyondTime = 71, - BeyondTime1 = 72, - BeyondTime2 = 73, - DemonicInfinity = 74, - DemonicInfinity1 = 75, - DemonicInfinity2 = 76, - DimensionalDisruption = 77, - DimensionalDisruption1 = 78, - DimensionalDisruption2 = 79, - Revelstorms = 80, - Revelstorms1 = 81, - EternalBliss = 82, - EternalBliss1 = 83, - Wyrmstorms = 84, - Wyrmstorms1 = 85, - Revelstorms2 = 86, - Quicklevin = 87, - Thunder3 = 88, - DimensionalDisruption3 = 89, - FairSkies9 = 90, - ClearSkies1 = 91, - WhiteCyclones = 92, - WhiteCyclones1 = 93, - WhiteCyclones2 = 94, - Ultimania = 95, - WhiteCyclones3 = 96, - Moonlight = 97, - Moonlight1 = 98, - Moonlight2 = 99, - Moonlight3 = 100, - FairSkies10 = 101, - Scarlet = 102, - Scarlet1 = 103, - Scarlet2 = 104, - FairSkies11 = 105, - FairSkies12 = 106, - FairSkies13 = 107, - FairSkies14 = 108, - Flames = 109, - Tsunamis = 110, - Cyclones = 111, - Geostorms = 112, - TrueBlue = 113, - TrueBlue1 = 114, - TrueBlue2 = 115, - UmbralTurbulence = 116, - TrueBlue3 = 117, - EverlastingLight = 118, - Gales2 = 119, - Termination = 120, - Termination1 = 121, - Dreams = 122, - Dreams1 = 123, - Dreams2 = 124, - Brilliance = 125, - Brilliance1 = 126, - Termination2 = 127, - Termination3 = 128, - EverlastingLight1 = 129, - Termination4 = 131, -}; - -/////////////////////////////////////////////////////////// -//HousingAppeal.exd -enum class HousingAppeal : uint8_t -{ - None = 0, - Emporium = 1, - Boutique = 2, - DesignerHome = 3, - MessageBook = 4, - Tavern = 5, - Eatery = 6, - ImmersiveExperience = 7, - Cafe = 8, - Aquarium = 9, - Sanctum = 10, - Venue = 11, - Florist = 12, - Library = 14, - PhotoStudio = 15, - HauntedHouse = 16, - Atelier = 17, - Bathhouse = 18, - Garden = 19, - FarEastern = 20, -}; + /////////////////////////////////////////////////////////// + //Weather.exd + enum class Weather : uint8_t + { + None = 0, + ClearSkies = 1, + FairSkies = 2, + Clouds = 3, + Fog = 4, + Wind = 5, + Gales = 6, + Rain = 7, + Showers = 8, + Thunder = 9, + Thunderstorms = 10, + DustStorms = 11, + Sandstorms = 12, + HotSpells = 13, + HeatWaves = 14, + Snow = 15, + Blizzards = 16, + Gloom = 17, + Auroras = 18, + Darkness = 19, + Tension = 20, + Clouds1 = 21, + StormClouds = 22, + RoughSeas = 23, + RoughSeas1 = 24, + Louring = 25, + HeatWaves1 = 26, + Gloom1 = 27, + Gales1 = 28, + Eruptions = 29, + FairSkies1 = 30, + FairSkies2 = 31, + FairSkies3 = 32, + FairSkies4 = 33, + FairSkies5 = 34, + Irradiance = 35, + CoreRadiation = 36, + CoreRadiation1 = 37, + CoreRadiation2 = 38, + CoreRadiation3 = 39, + ShelfClouds = 40, + ShelfClouds1 = 41, + ShelfClouds2 = 42, + ShelfClouds3 = 43, + Oppression = 44, + Oppression1 = 45, + Oppression2 = 46, + Oppression3 = 47, + Oppression4 = 48, + UmbralWind = 49, + UmbralStatic = 50, + Smoke = 51, + FairSkies6 = 52, + RoyalLevin = 53, + Hyperelectricity = 54, + RoyalLevin1 = 55, + Oppression5 = 56, + Thunder1 = 57, + Thunder2 = 58, + CutScene = 59, + Multiplicity = 60, + Multiplicity1 = 61, + Rain1 = 62, + FairSkies7 = 63, + Rain2 = 64, + FairSkies8 = 65, + Dragonstorms = 66, + Dragonstorms1 = 67, + Subterrain = 68, + Concordance = 69, + Concordance1 = 70, + BeyondTime = 71, + BeyondTime1 = 72, + BeyondTime2 = 73, + DemonicInfinity = 74, + DemonicInfinity1 = 75, + DemonicInfinity2 = 76, + DimensionalDisruption = 77, + DimensionalDisruption1 = 78, + DimensionalDisruption2 = 79, + Revelstorms = 80, + Revelstorms1 = 81, + EternalBliss = 82, + EternalBliss1 = 83, + Wyrmstorms = 84, + Wyrmstorms1 = 85, + Revelstorms2 = 86, + Quicklevin = 87, + Thunder3 = 88, + DimensionalDisruption3 = 89, + FairSkies9 = 90, + ClearSkies1 = 91, + WhiteCyclones = 92, + WhiteCyclones1 = 93, + WhiteCyclones2 = 94, + Ultimania = 95, + WhiteCyclones3 = 96, + Moonlight = 97, + Moonlight1 = 98, + Moonlight2 = 99, + Moonlight3 = 100, + RedMoon = 101, + Scarlet = 102, + Scarlet1 = 103, + Scarlet2 = 104, + FairSkies10 = 105, + FairSkies11 = 106, + FairSkies12 = 107, + FairSkies13 = 108, + Flames = 109, + Tsunamis = 110, + Cyclones = 111, + Geostorms = 112, + TrueBlue = 113, + TrueBlue1 = 114, + TrueBlue2 = 115, + UmbralTurbulence = 116, + TrueBlue3 = 117, + EverlastingLight = 118, + Gales2 = 119, + Termination = 120, + Termination1 = 121, + Dreams = 122, + Dreams1 = 123, + Dreams2 = 124, + Brilliance = 125, + Brilliance1 = 126, + Termination2 = 127, + Termination3 = 128, + EverlastingLight1 = 129, + Eruptions1 = 130, + Termination4 = 131, + FairSkies14 = 132, + UmbralFlare = 133, + UmbralDuststorm = 134, + UmbralLevin = 135, + UmbralTempest = 136, + Starshower = 137, + Delirium = 138, + Clouds2 = 139, + Clouds3 = 140, + Irradiance1 = 141, + Irradiance2 = 142, + StormClouds1 = 143, + Firestorm = 144, + SpectralCurrent = 145, + //1 = 146, + Climactic = 147, + //2 = 148, + //3 = 149, + //4 = 150, + //5 = 151, + //6 = 152, + //7 = 153, + }; + /////////////////////////////////////////////////////////// + //HousingAppeal.exd + enum class HousingAppeal : uint8_t + { + None = 0, + Emporium = 1, + Boutique = 2, + DesignerHome = 3, + MessageBook = 4, + Tavern = 5, + Eatery = 6, + ImmersiveExperience = 7, + Cafe = 8, + Aquarium = 9, + Sanctum = 10, + Venue = 11, + Florist = 12, + // = 13, + Library = 14, + PhotoStudio = 15, + HauntedHouse = 16, + Atelier = 17, + Bathhouse = 18, + Garden = 19, + FarEastern = 20, + VisitorsWelcome = 21, + Bakery = 22, + UnderRenovation = 23, + ConcertHall = 24, + }; } -#endif - +#endif \ No newline at end of file diff --git a/src/common/Config/ConfigMgr.cpp b/src/common/Config/ConfigMgr.cpp index 8b8823f2..e581a37c 100644 --- a/src/common/Config/ConfigMgr.cpp +++ b/src/common/Config/ConfigMgr.cpp @@ -1,9 +1,8 @@ #include "ConfigMgr.h" #include -#include -#include +#include -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; using namespace Sapphire; using namespace Sapphire::Common; diff --git a/src/common/Database/DbCommon.h b/src/common/Database/DbCommon.h index 89d537b6..d702ce72 100644 --- a/src/common/Database/DbCommon.h +++ b/src/common/Database/DbCommon.h @@ -1,6 +1,8 @@ #ifndef SAPPHIRE_DBCOMMON_H #define SAPPHIRE_DBCOMMON_H +#include + namespace Sapphire::Db { struct ConnectionInfo diff --git a/src/common/Database/DbConnection.cpp b/src/common/Database/DbConnection.cpp index f03b7f9e..7013d626 100644 --- a/src/common/Database/DbConnection.cpp +++ b/src/common/Database/DbConnection.cpp @@ -4,7 +4,6 @@ #include "Logging/Logger.h" #include "PreparedStatement.h" -#include "Framework.h" Sapphire::Db::DbConnection::DbConnection( ConnectionInfo& connInfo ) : m_reconnecting( false ), diff --git a/src/common/Database/DbWorkerPool.cpp b/src/common/Database/DbWorkerPool.cpp index 81b9d96d..09a24bfb 100644 --- a/src/common/Database/DbWorkerPool.cpp +++ b/src/common/Database/DbWorkerPool.cpp @@ -5,7 +5,6 @@ #include "StatementTask.h" #include "Operation.h" #include "ZoneDbConnection.h" -#include "Framework.h" #include "Logging/Logger.h" #include diff --git a/src/common/Exd/ExdDataGenerated.cpp b/src/common/Exd/ExdDataGenerated.cpp index 04c8fa1e..201cc540 100644 --- a/src/common/Exd/ExdDataGenerated.cpp +++ b/src/common/Exd/ExdDataGenerated.cpp @@ -7,22 +7,23 @@ Sapphire::Data::Achievement::Achievement( uint32_t row_id, Sapphire::Data::ExdDa achievementCategory = exdData->getField< uint8_t >( row, 0 ); name = exdData->getField< std::string >( row, 1 ); description = exdData->getField< std::string >( row, 2 ); - points = exdData->getField< uint8_t >( row, 3 ); - title = exdData->getField< uint16_t >( row, 4 ); - item = exdData->getField< uint32_t >( row, 5 ); - icon = exdData->getField< uint16_t >( row, 6 ); - type = exdData->getField< uint8_t >( row, 8 ); - key = exdData->getField< int32_t >( row, 9 ); - data.push_back( exdData->getField< int32_t >( row, 10 ) ); - data.push_back( exdData->getField< int32_t >( row, 11 ) ); - data.push_back( exdData->getField< int32_t >( row, 12 ) ); - data.push_back( exdData->getField< int32_t >( row, 13 ) ); - data.push_back( exdData->getField< int32_t >( row, 14 ) ); + achievementTarget = exdData->getField< uint8_t >( row, 3 ); + points = exdData->getField< uint8_t >( row, 5 ); + title = exdData->getField< uint16_t >( row, 6 ); + item = exdData->getField< uint32_t >( row, 7 ); + icon = exdData->getField< uint16_t >( row, 11 ); + type = exdData->getField< uint8_t >( row, 13 ); + key = exdData->getField< int32_t >( row, 14 ); data.push_back( exdData->getField< int32_t >( row, 15 ) ); data.push_back( exdData->getField< int32_t >( row, 16 ) ); data.push_back( exdData->getField< int32_t >( row, 17 ) ); - order = exdData->getField< uint16_t >( row, 18 ); - initialHide = exdData->getField< uint8_t >( row, 20 ); + data.push_back( exdData->getField< int32_t >( row, 18 ) ); + data.push_back( exdData->getField< int32_t >( row, 19 ) ); + data.push_back( exdData->getField< int32_t >( row, 20 ) ); + data.push_back( exdData->getField< int32_t >( row, 21 ) ); + data.push_back( exdData->getField< int32_t >( row, 22 ) ); + order = exdData->getField< uint16_t >( row, 23 ); + achievementHideCondition = exdData->getField< uint8_t >( row, 25 ); } Sapphire::Data::AchievementCategory::AchievementCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -30,13 +31,31 @@ Sapphire::Data::AchievementCategory::AchievementCategory( uint32_t row_id, Sapph auto row = exdData->m_AchievementCategoryDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); achievementKind = exdData->getField< uint8_t >( row, 1 ); + showComplete = exdData->getField< bool >( row, 2 ); hideCategory = exdData->getField< bool >( row, 3 ); + order = exdData->getField< uint8_t >( row, 4 ); +} + +Sapphire::Data::AchievementHideCondition::AchievementHideCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AchievementHideConditionDat.get_row( row_id ); + hideAchievement = exdData->getField< bool >( row, 0 ); + hideName = exdData->getField< bool >( row, 1 ); + hideConditions = exdData->getField< bool >( row, 2 ); } Sapphire::Data::AchievementKind::AchievementKind( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AchievementKindDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + order = exdData->getField< uint8_t >( row, 1 ); +} + +Sapphire::Data::AchievementTarget::AchievementTarget( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AchievementTargetDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); + value = exdData->getField< uint32_t >( row, 1 ); } Sapphire::Data::Action::Action( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -50,6 +69,7 @@ Sapphire::Data::Action::Action( uint32_t row_id, Sapphire::Data::ExdDataGenerate animationEnd = exdData->getField< int16_t >( row, 7 ); actionTimelineHit = exdData->getField< uint16_t >( row, 8 ); classJob = exdData->getField< int8_t >( row, 10 ); + behaviourType = exdData->getField< uint8_t >( row, 11 ); classJobLevel = exdData->getField< uint8_t >( row, 12 ); isRoleAction = exdData->getField< bool >( row, 13 ); range = exdData->getField< int8_t >( row, 14 ); @@ -71,6 +91,8 @@ Sapphire::Data::Action::Action( uint32_t row_id, Sapphire::Data::ExdDataGenerate cast100ms = exdData->getField< uint16_t >( row, 37 ); recast100ms = exdData->getField< uint16_t >( row, 38 ); cooldownGroup = exdData->getField< uint8_t >( row, 39 ); + additionalCooldownGroup = exdData->getField< uint8_t >( row, 40 ); + maxCharges = exdData->getField< uint8_t >( row, 41 ); attackType = exdData->getField< int8_t >( row, 42 ); aspect = exdData->getField< uint8_t >( row, 43 ); actionProcStatus = exdData->getField< uint8_t >( row, 44 ); @@ -78,7 +100,7 @@ Sapphire::Data::Action::Action( uint32_t row_id, Sapphire::Data::ExdDataGenerate unlockLink = exdData->getField< uint32_t >( row, 47 ); classJobCategory = exdData->getField< uint8_t >( row, 48 ); affectsPosition = exdData->getField< bool >( row, 51 ); - omen = exdData->getField< uint8_t >( row, 52 ); + omen = exdData->getField< uint16_t >( row, 52 ); isPvP = exdData->getField< bool >( row, 53 ); isPlayerAction = exdData->getField< bool >( row, 65 ); } @@ -116,6 +138,8 @@ Sapphire::Data::ActionIndirection::ActionIndirection( uint32_t row_id, Sapphire: { auto row = exdData->m_ActionIndirectionDat.get_row( row_id ); name = exdData->getField< int32_t >( row, 0 ); + classJob = exdData->getField< int8_t >( row, 1 ); + previousComboAction = exdData->getField< int32_t >( row, 2 ); } Sapphire::Data::ActionParam::ActionParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -133,7 +157,22 @@ Sapphire::Data::ActionProcStatus::ActionProcStatus( uint32_t row_id, Sapphire::D Sapphire::Data::ActionTimeline::ActionTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ActionTimelineDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); + priority = exdData->getField< uint8_t >( row, 1 ); + pause = exdData->getField< bool >( row, 2 ); + stance = exdData->getField< uint8_t >( row, 3 ); + slot = exdData->getField< uint8_t >( row, 4 ); + lookAtMode = exdData->getField< uint8_t >( row, 5 ); key = exdData->getField< std::string >( row, 6 ); + actionTimelineIDMode = exdData->getField< uint8_t >( row, 7 ); + weaponTimeline = exdData->getField< uint8_t >( row, 8 ); + loadType = exdData->getField< uint8_t >( row, 9 ); + startAttach = exdData->getField< uint8_t >( row, 10 ); + residentPap = exdData->getField< uint8_t >( row, 11 ); + resident = exdData->getField< bool >( row, 12 ); + killUpper = exdData->getField< uint16_t >( row, 13 ); + isMotionCanceledByMoving = exdData->getField< bool >( row, 14 ); + isLoop = exdData->getField< uint8_t >( row, 16 ); } Sapphire::Data::ActionTimelineMove::ActionTimelineMove( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -197,18 +236,12 @@ Sapphire::Data::Addon::Addon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* text = exdData->getField< std::string >( row, 0 ); } -Sapphire::Data::AddonHud::AddonHud( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_AddonHudDat.get_row( row_id ); - _long = exdData->getField< std::string >( row, 0 ); - _short = exdData->getField< std::string >( row, 1 ); - function = exdData->getField< std::string >( row, 2 ); -} - Sapphire::Data::Adventure::Adventure( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AdventureDat.get_row( row_id ); level = exdData->getField< int32_t >( row, 0 ); + minLevel = exdData->getField< int32_t >( row, 1 ); + maxLevel = exdData->getField< uint8_t >( row, 2 ); emote = exdData->getField< uint16_t >( row, 3 ); minTime = exdData->getField< uint16_t >( row, 4 ); maxTime = exdData->getField< uint16_t >( row, 5 ); @@ -284,22 +317,25 @@ Sapphire::Data::Aetheryte::Aetheryte( uint32_t row_id, Sapphire::Data::ExdDataGe level.push_back( exdData->getField< uint32_t >( row, 13 ) ); level.push_back( exdData->getField< uint32_t >( row, 14 ) ); isAetheryte = exdData->getField< bool >( row, 15 ); - aethernetGroup = exdData->getField< uint8_t >( row, 16 ); - requiredQuest = exdData->getField< uint32_t >( row, 18 ); - map = exdData->getField< uint16_t >( row, 19 ); - aetherstreamX = exdData->getField< int16_t >( row, 20 ); - aetherstreamY = exdData->getField< int16_t >( row, 21 ); + aethernetGroup = exdData->getField< uint8_t >( row, 17 ); + invisible = exdData->getField< bool >( row, 18 ); + requiredQuest = exdData->getField< uint32_t >( row, 19 ); + map = exdData->getField< uint16_t >( row, 20 ); + aetherstreamX = exdData->getField< int16_t >( row, 21 ); + aetherstreamY = exdData->getField< int16_t >( row, 22 ); } Sapphire::Data::AetheryteSystemDefine::AetheryteSystemDefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AetheryteSystemDefineDat.get_row( row_id ); text = exdData->getField< std::string >( row, 0 ); + defineValue = exdData->getField< uint32_t >( row, 1 ); } Sapphire::Data::AirshipExplorationLevel::AirshipExplorationLevel( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AirshipExplorationLevelDat.get_row( row_id ); + capacity = exdData->getField< uint16_t >( row, 0 ); expToNext = exdData->getField< uint32_t >( row, 1 ); } @@ -318,6 +354,7 @@ Sapphire::Data::AirshipExplorationParamType::AirshipExplorationParamType( uint32 Sapphire::Data::AirshipExplorationPart::AirshipExplorationPart( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AirshipExplorationPartDat.get_row( row_id ); + slot = exdData->getField< uint8_t >( row, 0 ); rank = exdData->getField< uint8_t >( row, 1 ); components = exdData->getField< uint8_t >( row, 2 ); surveillance = exdData->getField< int16_t >( row, 3 ); @@ -325,6 +362,7 @@ Sapphire::Data::AirshipExplorationPart::AirshipExplorationPart( uint32_t row_id, speed = exdData->getField< int16_t >( row, 5 ); range = exdData->getField< int16_t >( row, 6 ); favor = exdData->getField< int16_t >( row, 7 ); + _class = exdData->getField< uint16_t >( row, 8 ); repairMaterials = exdData->getField< uint8_t >( row, 9 ); } @@ -340,6 +378,22 @@ Sapphire::Data::AirshipExplorationPoint::AirshipExplorationPoint( uint32_t row_i expReward = exdData->getField< uint32_t >( row, 13 ); } +Sapphire::Data::AnimationLOD::AnimationLOD( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AnimationLODDat.get_row( row_id ); + cameraDistance = exdData->getField< float >( row, 0 ); + sampleInterval = exdData->getField< float >( row, 1 ); + boneLOD = exdData->getField< int8_t >( row, 2 ); + animationEnable.push_back( exdData->getField< bool >( row, 3 ) ); + animationEnable.push_back( exdData->getField< bool >( row, 4 ) ); + animationEnable.push_back( exdData->getField< bool >( row, 5 ) ); + animationEnable.push_back( exdData->getField< bool >( row, 6 ) ); + animationEnable.push_back( exdData->getField< bool >( row, 7 ) ); + animationEnable.push_back( exdData->getField< bool >( row, 8 ) ); + animationEnable.push_back( exdData->getField< bool >( row, 9 ) ); + animationEnable.push_back( exdData->getField< bool >( row, 10 ) ); +} + Sapphire::Data::AnimaWeapon5::AnimaWeapon5( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AnimaWeapon5Dat.get_row( row_id ); @@ -432,29 +486,46 @@ Sapphire::Data::AozAction::AozAction( uint32_t row_id, Sapphire::Data::ExdDataGe { auto row = exdData->m_AozActionDat.get_row( row_id ); action = exdData->getField< uint32_t >( row, 0 ); + rank = exdData->getField< uint8_t >( row, 1 ); } Sapphire::Data::AozActionTransient::AozActionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AozActionTransientDat.get_row( row_id ); + number = exdData->getField< uint8_t >( row, 0 ); icon = exdData->getField< uint32_t >( row, 1 ); stats = exdData->getField< std::string >( row, 2 ); description = exdData->getField< std::string >( row, 3 ); + locationKey = exdData->getField< uint8_t >( row, 4 ); location = exdData->getField< uint16_t >( row, 5 ); - startQuest = exdData->getField< uint32_t >( row, 6 ); - nextQuest = exdData->getField< uint32_t >( row, 7 ); + requiredForQuest = exdData->getField< uint32_t >( row, 6 ); + previousQuest = exdData->getField< uint32_t >( row, 7 ); + targetsEnemy = exdData->getField< bool >( row, 8 ); + targetsSelfOrAlly = exdData->getField< bool >( row, 9 ); + causeSlow = exdData->getField< bool >( row, 10 ); + causePetrify = exdData->getField< bool >( row, 11 ); + causeParalysis = exdData->getField< bool >( row, 12 ); + causeInterrupt = exdData->getField< bool >( row, 13 ); + causeBlind = exdData->getField< bool >( row, 14 ); + causeStun = exdData->getField< bool >( row, 15 ); + causeSleep = exdData->getField< bool >( row, 16 ); + causeBind = exdData->getField< bool >( row, 17 ); + causeHeavy = exdData->getField< bool >( row, 18 ); + causeDeath = exdData->getField< bool >( row, 19 ); } Sapphire::Data::AOZArrangement::AOZArrangement( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AOZArrangementDat.get_row( row_id, subRow ); aOZContentBriefingBNpc = exdData->getField< uint16_t >( row, 0 ); + position = exdData->getField< uint16_t >( row, 1 ); } Sapphire::Data::AOZBoss::AOZBoss( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_AOZBossDat.get_row( row_id ); boss = exdData->getField< uint16_t >( row, 0 ); + position = exdData->getField< uint16_t >( row, 1 ); } Sapphire::Data::AOZContent::AOZContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -484,6 +555,7 @@ Sapphire::Data::AOZContentBriefingBNpc::AOZContentBriefingBNpc( uint32_t row_id, bNpcName = exdData->getField< uint32_t >( row, 0 ); targetSmall = exdData->getField< uint32_t >( row, 1 ); targetLarge = exdData->getField< uint32_t >( row, 2 ); + hideStats = exdData->getField< bool >( row, 3 ); endurance = exdData->getField< uint8_t >( row, 4 ); fire = exdData->getField< uint8_t >( row, 5 ); ice = exdData->getField< uint8_t >( row, 6 ); @@ -495,16 +567,32 @@ Sapphire::Data::AOZContentBriefingBNpc::AOZContentBriefingBNpc( uint32_t row_id, piercing = exdData->getField< uint8_t >( row, 12 ); blunt = exdData->getField< uint8_t >( row, 13 ); magic = exdData->getField< uint8_t >( row, 14 ); - slowResistance = exdData->getField< bool >( row, 15 ); - petrificationResistance = exdData->getField< bool >( row, 16 ); - paralysisResistance = exdData->getField< bool >( row, 17 ); - silenceResistance = exdData->getField< bool >( row, 18 ); - blindResistance = exdData->getField< bool >( row, 19 ); - stunResistance = exdData->getField< bool >( row, 20 ); - sleepResistance = exdData->getField< bool >( row, 21 ); - bindResistance = exdData->getField< bool >( row, 22 ); - heavyResistance = exdData->getField< bool >( row, 23 ); - instaDeathResistance = exdData->getField< bool >( row, 24 ); + slowVuln = exdData->getField< bool >( row, 15 ); + petrificationVuln = exdData->getField< bool >( row, 16 ); + paralysisVuln = exdData->getField< bool >( row, 17 ); + interruptionVuln = exdData->getField< bool >( row, 18 ); + blindVuln = exdData->getField< bool >( row, 19 ); + stunVuln = exdData->getField< bool >( row, 20 ); + sleepVuln = exdData->getField< bool >( row, 21 ); + bindVuln = exdData->getField< bool >( row, 22 ); + heavyVuln = exdData->getField< bool >( row, 23 ); + flatOrDeathVuln = exdData->getField< bool >( row, 24 ); +} + +Sapphire::Data::AOZReport::AOZReport( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AOZReportDat.get_row( row_id ); + reward = exdData->getField< uint8_t >( row, 1 ); + order = exdData->getField< int8_t >( row, 2 ); +} + +Sapphire::Data::AOZScore::AOZScore( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_AOZScoreDat.get_row( row_id ); + isHidden = exdData->getField< bool >( row, 0 ); + score = exdData->getField< int32_t >( row, 1 ); + name = exdData->getField< std::string >( row, 2 ); + description = exdData->getField< std::string >( row, 3 ); } Sapphire::Data::AquariumFish::AquariumFish( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -554,18 +642,34 @@ Sapphire::Data::BacklightColor::BacklightColor( uint32_t row_id, Sapphire::Data: color = exdData->getField< uint32_t >( row, 0 ); } +Sapphire::Data::Ballista::Ballista( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_BallistaDat.get_row( row_id ); + bNPC = exdData->getField< uint16_t >( row, 0 ); + near = exdData->getField< int8_t >( row, 1 ); + far = exdData->getField< int8_t >( row, 2 ); + angle = exdData->getField< uint16_t >( row, 3 ); + bullet = exdData->getField< uint8_t >( row, 4 ); + action0 = exdData->getField< uint16_t >( row, 7 ); + action1 = exdData->getField< uint16_t >( row, 8 ); + action2 = exdData->getField< uint16_t >( row, 9 ); + action3 = exdData->getField< uint16_t >( row, 10 ); +} + Sapphire::Data::Balloon::Balloon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BalloonDat.get_row( row_id ); + slowly = exdData->getField< bool >( row, 0 ); dialogue = exdData->getField< std::string >( row, 1 ); } Sapphire::Data::BaseParam::BaseParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BaseParamDat.get_row( row_id ); - order = exdData->getField< int8_t >( row, 0 ); + packetIndex = exdData->getField< int8_t >( row, 0 ); name = exdData->getField< std::string >( row, 1 ); description = exdData->getField< std::string >( row, 2 ); + orderPriority = exdData->getField< uint8_t >( row, 3 ); oneHWpn = exdData->getField< uint8_t >( row, 4 ); oH = exdData->getField< uint8_t >( row, 5 ); head = exdData->getField< uint8_t >( row, 6 ); @@ -579,17 +683,47 @@ Sapphire::Data::BaseParam::BaseParam( uint32_t row_id, Sapphire::Data::ExdDataGe bracelet = exdData->getField< uint8_t >( row, 14 ); ring = exdData->getField< uint8_t >( row, 15 ); twoHWpn = exdData->getField< uint8_t >( row, 16 ); + underArmor = exdData->getField< uint8_t >( row, 17 ); chestHead = exdData->getField< uint8_t >( row, 18 ); chestHeadLegsFeet = exdData->getField< uint8_t >( row, 19 ); legsFeet = exdData->getField< uint8_t >( row, 21 ); headChestHandsLegsFeet = exdData->getField< uint8_t >( row, 22 ); chestLegsGloves = exdData->getField< uint8_t >( row, 23 ); chestLegsFeet = exdData->getField< uint8_t >( row, 24 ); + meldParam.push_back( exdData->getField< uint8_t >( row, 25 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 26 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 27 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 28 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 29 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 30 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 31 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 32 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 33 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 34 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 35 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 36 ) ); + meldParam.push_back( exdData->getField< uint8_t >( row, 37 ) ); } Sapphire::Data::BattleLeve::BattleLeve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BattleLeveDat.get_row( row_id ); + time.push_back( exdData->getField< uint16_t >( row, 0 ) ); + time.push_back( exdData->getField< uint16_t >( row, 1 ) ); + time.push_back( exdData->getField< uint16_t >( row, 2 ) ); + time.push_back( exdData->getField< uint16_t >( row, 3 ) ); + time.push_back( exdData->getField< uint16_t >( row, 4 ) ); + time.push_back( exdData->getField< uint16_t >( row, 5 ) ); + time.push_back( exdData->getField< uint16_t >( row, 6 ) ); + time.push_back( exdData->getField< uint16_t >( row, 7 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 8 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 9 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 10 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 11 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 12 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 13 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 14 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 15 ) ); enemyLevel.push_back( exdData->getField< uint16_t >( row, 16 ) ); enemyLevel.push_back( exdData->getField< uint16_t >( row, 17 ) ); enemyLevel.push_back( exdData->getField< uint16_t >( row, 18 ) ); @@ -630,11 +764,48 @@ Sapphire::Data::BattleLeve::BattleLeve( uint32_t row_id, Sapphire::Data::ExdData itemDropRate.push_back( exdData->getField< uint8_t >( row, 53 ) ); itemDropRate.push_back( exdData->getField< uint8_t >( row, 54 ) ); itemDropRate.push_back( exdData->getField< uint8_t >( row, 55 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 56 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 57 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 58 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 59 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 60 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 61 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 62 ) ); + toDoNumberInvolved.push_back( exdData->getField< uint32_t >( row, 63 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 168 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 169 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 170 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 171 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 172 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 173 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 174 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 175 ) ); + rule = exdData->getField< int32_t >( row, 176 ); + varient = exdData->getField< uint8_t >( row, 177 ); + objective0 = exdData->getField< uint16_t >( row, 178 ); + objective1 = exdData->getField< uint16_t >( row, 179 ); + objective2 = exdData->getField< uint16_t >( row, 180 ); + help0 = exdData->getField< uint16_t >( row, 181 ); + help1 = exdData->getField< uint16_t >( row, 182 ); +} + +Sapphire::Data::BattleLeveRule::BattleLeveRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_BattleLeveRuleDat.get_row( row_id ); + rule = exdData->getField< std::string >( row, 0 ); } Sapphire::Data::BeastRankBonus::BeastRankBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BeastRankBonusDat.get_row( row_id ); + neutral = exdData->getField< uint16_t >( row, 0 ); + recognized = exdData->getField< uint16_t >( row, 1 ); + friendly = exdData->getField< uint16_t >( row, 2 ); + trusted = exdData->getField< uint16_t >( row, 3 ); + respected = exdData->getField< uint16_t >( row, 4 ); + honored = exdData->getField< uint16_t >( row, 5 ); + sworn = exdData->getField< uint16_t >( row, 6 ); + alliedBloodsworn = exdData->getField< uint16_t >( row, 7 ); item = exdData->getField< uint32_t >( row, 8 ); itemQuantity.push_back( exdData->getField< uint8_t >( row, 9 ) ); itemQuantity.push_back( exdData->getField< uint8_t >( row, 10 ) ); @@ -651,6 +822,8 @@ Sapphire::Data::BeastReputationRank::BeastReputationRank( uint32_t row_id, Sapph auto row = exdData->m_BeastReputationRankDat.get_row( row_id ); requiredReputation = exdData->getField< uint16_t >( row, 0 ); name = exdData->getField< std::string >( row, 1 ); + alliedNames = exdData->getField< std::string >( row, 2 ); + color = exdData->getField< uint32_t >( row, 3 ); } Sapphire::Data::BeastTribe::BeastTribe( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -665,34 +838,114 @@ Sapphire::Data::BeastTribe::BeastTribe( uint32_t row_id, Sapphire::Data::ExdData currencyItem = exdData->getField< uint32_t >( row, 7 ); displayOrder = exdData->getField< uint8_t >( row, 8 ); name = exdData->getField< std::string >( row, 9 ); + adjective = exdData->getField< int8_t >( row, 10 ); + plural = exdData->getField< std::string >( row, 11 ); + possessivePronoun = exdData->getField< int8_t >( row, 12 ); + startsWithVowel = exdData->getField< int8_t >( row, 13 ); + pronoun = exdData->getField< int8_t >( row, 14 ); + article = exdData->getField< int8_t >( row, 15 ); + dEF = exdData->getField< int8_t >( row, 16 ); nameRelation = exdData->getField< std::string >( row, 17 ); } Sapphire::Data::Behavior::Behavior( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BehaviorDat.get_row( row_id, subRow ); - balloon = exdData->getField< uint16_t >( row, 7 ); + condition0Target = exdData->getField< uint8_t >( row, 2 ); + condition0Type = exdData->getField< uint8_t >( row, 3 ); + balloon = exdData->getField< int32_t >( row, 4 ); + condition1Target = exdData->getField< uint8_t >( row, 9 ); + condition1Type = exdData->getField< uint8_t >( row, 10 ); + contentArgument0 = exdData->getField< uint32_t >( row, 11 ); + contentArgument1 = exdData->getField< uint8_t >( row, 12 ); +} + +Sapphire::Data::BehaviorPath::BehaviorPath( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_BehaviorPathDat.get_row( row_id ); + isTurnTransition = exdData->getField< bool >( row, 0 ); + isFadeOut = exdData->getField< bool >( row, 1 ); + isFadeIn = exdData->getField< bool >( row, 2 ); + isWalking = exdData->getField< bool >( row, 3 ); + speed = exdData->getField< float >( row, 5 ); +} + +Sapphire::Data::BenchmarkOverrideEquipment::BenchmarkOverrideEquipment( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_BenchmarkOverrideEquipmentDat.get_row( row_id ); + modelMainHand = exdData->getField< uint64_t >( row, 4 ); + dyeMainHand = exdData->getField< uint8_t >( row, 5 ); + modelOffHand = exdData->getField< uint64_t >( row, 6 ); + dyeOffHand = exdData->getField< uint8_t >( row, 7 ); + modelHead = exdData->getField< uint32_t >( row, 10 ); + dyeHead = exdData->getField< uint8_t >( row, 11 ); + modelBody = exdData->getField< uint32_t >( row, 12 ); + dyeBody = exdData->getField< uint8_t >( row, 13 ); + modelHands = exdData->getField< uint32_t >( row, 14 ); + dyeHands = exdData->getField< uint8_t >( row, 15 ); + modelLegs = exdData->getField< uint32_t >( row, 16 ); + dyeLegs = exdData->getField< uint8_t >( row, 17 ); + modelFeet = exdData->getField< uint32_t >( row, 18 ); + dyeFeet = exdData->getField< uint8_t >( row, 19 ); + modelEars = exdData->getField< uint32_t >( row, 20 ); + dyeEars = exdData->getField< uint8_t >( row, 21 ); + modelNeck = exdData->getField< uint32_t >( row, 22 ); + dyeNeck = exdData->getField< uint8_t >( row, 23 ); + modelWrists = exdData->getField< uint32_t >( row, 24 ); + dyeWrists = exdData->getField< uint8_t >( row, 25 ); + modelLeftRing = exdData->getField< uint32_t >( row, 26 ); + dyeLeftRing = exdData->getField< uint8_t >( row, 27 ); + modelRightRing = exdData->getField< uint32_t >( row, 28 ); + dyeRightRing = exdData->getField< uint8_t >( row, 29 ); } Sapphire::Data::BGM::BGM( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BGMDat.get_row( row_id ); file = exdData->getField< std::string >( row, 0 ); + priority = exdData->getField< uint8_t >( row, 1 ); + disableRestartTimeOut = exdData->getField< bool >( row, 2 ); + disableRestart = exdData->getField< bool >( row, 3 ); + passEnd = exdData->getField< bool >( row, 4 ); + disableRestartResetTime = exdData->getField< float >( row, 5 ); + specialMode = exdData->getField< uint8_t >( row, 6 ); } Sapphire::Data::BGMFade::BGMFade( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BGMFadeDat.get_row( row_id ); + sceneOut = exdData->getField< int32_t >( row, 0 ); + sceneIn = exdData->getField< int32_t >( row, 1 ); bGMFadeType = exdData->getField< int32_t >( row, 2 ); } +Sapphire::Data::BGMFadeType::BGMFadeType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_BGMFadeTypeDat.get_row( row_id ); + fadeOutTime = exdData->getField< float >( row, 0 ); + fadeInTime = exdData->getField< float >( row, 1 ); + fadeInStartTime = exdData->getField< float >( row, 2 ); + resumeFadeInTime = exdData->getField< float >( row, 3 ); +} + +Sapphire::Data::BGMScene::BGMScene( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_BGMSceneDat.get_row( row_id ); + enableDisableRestart = exdData->getField< bool >( row, 0 ); + resume = exdData->getField< bool >( row, 1 ); + enablePassEnd = exdData->getField< bool >( row, 2 ); + forceAutoReset = exdData->getField< bool >( row, 3 ); + ignoreBattle = exdData->getField< bool >( row, 4 ); +} + Sapphire::Data::BGMSituation::BGMSituation( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BGMSituationDat.get_row( row_id ); - bGMDay = exdData->getField< uint16_t >( row, 0 ); - bGMNight = exdData->getField< uint16_t >( row, 1 ); - bGMBattle = exdData->getField< uint16_t >( row, 2 ); - bGMField = exdData->getField< uint16_t >( row, 3 ); + daytimeID = exdData->getField< uint16_t >( row, 0 ); + nightID = exdData->getField< uint16_t >( row, 1 ); + battleID = exdData->getField< uint16_t >( row, 2 ); + daybreakID = exdData->getField< uint16_t >( row, 3 ); + twilightID = exdData->getField< uint16_t >( row, 4 ); } Sapphire::Data::BGMSwitch::BGMSwitch( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -700,6 +953,7 @@ Sapphire::Data::BGMSwitch::BGMSwitch( uint32_t row_id, uint32_t subRow, Sapphire auto row = exdData->m_BGMSwitchDat.get_row( row_id, subRow ); bGMSystemDefine = exdData->getField< uint8_t >( row, 0 ); quest = exdData->getField< uint32_t >( row, 1 ); + bGM = exdData->getField< uint16_t >( row, 3 ); } Sapphire::Data::BGMSystemDefine::BGMSystemDefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -718,13 +972,19 @@ Sapphire::Data::BNpcBase::BNpcBase( uint32_t row_id, Sapphire::Data::ExdDataGene { auto row = exdData->m_BNpcBaseDat.get_row( row_id ); behavior = exdData->getField< uint16_t >( row, 0 ); - actionTimelineMove = exdData->getField< uint8_t >( row, 1 ); + battalion = exdData->getField< uint8_t >( row, 1 ); + linkRace = exdData->getField< uint8_t >( row, 2 ); + rank = exdData->getField< uint8_t >( row, 3 ); scale = exdData->getField< float >( row, 4 ); modelChara = exdData->getField< uint16_t >( row, 5 ); bNpcCustomize = exdData->getField< uint16_t >( row, 6 ); npcEquip = exdData->getField< uint16_t >( row, 7 ); + special = exdData->getField< uint16_t >( row, 8 ); + sEPack = exdData->getField< uint8_t >( row, 9 ); arrayEventHandler = exdData->getField< int32_t >( row, 11 ); bNpcParts = exdData->getField< uint8_t >( row, 12 ); + isTargetLine = exdData->getField< bool >( row, 14 ); + isDisplayLevel = exdData->getField< bool >( row, 15 ); } Sapphire::Data::BNpcCustomize::BNpcCustomize( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -805,11 +1065,29 @@ Sapphire::Data::BNpcParts::BNpcParts( uint32_t row_id, Sapphire::Data::ExdDataGe scale5 = exdData->getField< float >( row, 54 ); } +Sapphire::Data::BNpcState::BNpcState( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_BNpcStateDat.get_row( row_id ); + slot = exdData->getField< uint8_t >( row, 0 ); + overRay = exdData->getField< int8_t >( row, 1 ); + idle = exdData->getField< uint16_t >( row, 4 ); + attribute0 = exdData->getField< uint8_t >( row, 5 ); + attributeFlag0 = exdData->getField< bool >( row, 6 ); + attribute1 = exdData->getField< uint8_t >( row, 7 ); + attributeFlag1 = exdData->getField< bool >( row, 8 ); + attribute2 = exdData->getField< uint8_t >( row, 9 ); + attributeFlag2 = exdData->getField< bool >( row, 10 ); + scale = exdData->getField< float >( row, 11 ); + loopTimeline = exdData->getField< int32_t >( row, 13 ); +} + Sapphire::Data::Buddy::Buddy( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BuddyDat.get_row( row_id ); + base = exdData->getField< uint8_t >( row, 0 ); questRequirement2 = exdData->getField< int32_t >( row, 1 ); questRequirement1 = exdData->getField< int32_t >( row, 2 ); + baseEquip = exdData->getField< int32_t >( row, 3 ); soundEffect4 = exdData->getField< std::string >( row, 4 ); soundEffect3 = exdData->getField< std::string >( row, 5 ); soundEffect2 = exdData->getField< std::string >( row, 6 ); @@ -823,6 +1101,8 @@ Sapphire::Data::BuddyAction::BuddyAction( uint32_t row_id, Sapphire::Data::ExdDa description = exdData->getField< std::string >( row, 1 ); icon = exdData->getField< int32_t >( row, 2 ); iconStatus = exdData->getField< int32_t >( row, 3 ); + reward = exdData->getField< uint16_t >( row, 4 ); + sort = exdData->getField< uint8_t >( row, 5 ); } Sapphire::Data::BuddyEquip::BuddyEquip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -843,12 +1123,16 @@ Sapphire::Data::BuddyEquip::BuddyEquip( uint32_t row_id, Sapphire::Data::ExdData iconHead = exdData->getField< uint16_t >( row, 13 ); iconBody = exdData->getField< uint16_t >( row, 14 ); iconLegs = exdData->getField< uint16_t >( row, 15 ); + order = exdData->getField< uint8_t >( row, 16 ); } Sapphire::Data::BuddyItem::BuddyItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_BuddyItemDat.get_row( row_id ); item = exdData->getField< uint16_t >( row, 0 ); + useField = exdData->getField< bool >( row, 1 ); + useTraining = exdData->getField< bool >( row, 2 ); + status = exdData->getField< uint8_t >( row, 4 ); } Sapphire::Data::BuddyRank::BuddyRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -952,12 +1236,91 @@ Sapphire::Data::Calendar::Calendar( uint32_t row_id, Sapphire::Data::ExdDataGene day.push_back( exdData->getField< uint8_t >( row, 63 ) ); } +Sapphire::Data::Carry::Carry( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CarryDat.get_row( row_id ); + model = exdData->getField< uint64_t >( row, 0 ); + timeline = exdData->getField< uint8_t >( row, 1 ); +} + +Sapphire::Data::Channeling::Channeling( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ChannelingDat.get_row( row_id ); + file = exdData->getField< std::string >( row, 0 ); + widthScale = exdData->getField< uint8_t >( row, 1 ); +} + +Sapphire::Data::CharaMakeClassEquip::CharaMakeClassEquip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CharaMakeClassEquipDat.get_row( row_id ); + helmet = exdData->getField< uint64_t >( row, 0 ); + top = exdData->getField< uint64_t >( row, 1 ); + glove = exdData->getField< uint64_t >( row, 2 ); + down = exdData->getField< uint64_t >( row, 3 ); + shoes = exdData->getField< uint64_t >( row, 4 ); + weapon = exdData->getField< uint64_t >( row, 5 ); + subWeapon = exdData->getField< uint64_t >( row, 6 ); + _class = exdData->getField< int32_t >( row, 7 ); +} + Sapphire::Data::CharaMakeCustomize::CharaMakeCustomize( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CharaMakeCustomizeDat.get_row( row_id ); + featureID = exdData->getField< uint8_t >( row, 0 ); icon = exdData->getField< uint32_t >( row, 1 ); data = exdData->getField< uint16_t >( row, 2 ); isPurchasable = exdData->getField< bool >( row, 3 ); + hint = exdData->getField< uint32_t >( row, 4 ); + hintItem = exdData->getField< uint32_t >( row, 5 ); +} + +Sapphire::Data::CharaMakeName::CharaMakeName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CharaMakeNameDat.get_row( row_id ); + hyurMidlanderMale = exdData->getField< std::string >( row, 0 ); + hyurMidlanderFemale = exdData->getField< std::string >( row, 1 ); + hyurMidlanderLastName = exdData->getField< std::string >( row, 2 ); + hyurHighlanderMale = exdData->getField< std::string >( row, 3 ); + hyurHighlanderFemale = exdData->getField< std::string >( row, 4 ); + hyurHighlanderLastName = exdData->getField< std::string >( row, 5 ); + elezenMale = exdData->getField< std::string >( row, 6 ); + elezenFemale = exdData->getField< std::string >( row, 7 ); + elezenWildwoodLastName = exdData->getField< std::string >( row, 8 ); + elezenDuskwightLastName = exdData->getField< std::string >( row, 9 ); + miqoteSunMale = exdData->getField< std::string >( row, 10 ); + miqoteSunFemale = exdData->getField< std::string >( row, 11 ); + miqoteSunMaleLastName = exdData->getField< std::string >( row, 12 ); + miqoteSunFemaleLastName = exdData->getField< std::string >( row, 13 ); + miqoteMoonMale = exdData->getField< std::string >( row, 14 ); + miqoteMoonFemale = exdData->getField< std::string >( row, 15 ); + miqoteMoonLastname = exdData->getField< std::string >( row, 16 ); + lalafellPlainsfolkFirstNameStart = exdData->getField< std::string >( row, 17 ); + lalafellPlainsfolkLastNameStart = exdData->getField< std::string >( row, 18 ); + lalafellPlainsfolkEndOfNames = exdData->getField< std::string >( row, 19 ); + lalafellDunesfolkMale = exdData->getField< std::string >( row, 20 ); + lalafellDunesfolkMaleLastName = exdData->getField< std::string >( row, 21 ); + lalafellDunesfolkFemale = exdData->getField< std::string >( row, 22 ); + lalafellDunesfolkFemaleLastName = exdData->getField< std::string >( row, 23 ); + roegadynSeaWolfMale = exdData->getField< std::string >( row, 24 ); + roegadynSeaWolfMaleLastName = exdData->getField< std::string >( row, 25 ); + roegadynSeaWolfFemale = exdData->getField< std::string >( row, 26 ); + roegadynSeaWolfFemaleLastName = exdData->getField< std::string >( row, 27 ); + roegadynHellsguardFirstName = exdData->getField< std::string >( row, 28 ); + roegadynHellsguardMaleLastName = exdData->getField< std::string >( row, 29 ); + roegadynHellsguardFemaleLastName = exdData->getField< std::string >( row, 30 ); + auRaRaenMale = exdData->getField< std::string >( row, 31 ); + auRaRaenFemale = exdData->getField< std::string >( row, 32 ); + auRaRaenLastName = exdData->getField< std::string >( row, 33 ); + auRaXaelaMale = exdData->getField< std::string >( row, 34 ); + auRaXaelaFemale = exdData->getField< std::string >( row, 35 ); + auRaXaelaLastName = exdData->getField< std::string >( row, 36 ); + hrothgarHellionsFirstName = exdData->getField< std::string >( row, 37 ); + hrothgarHellionsLastName = exdData->getField< std::string >( row, 38 ); + hrothgarLostFirstName = exdData->getField< std::string >( row, 39 ); + hrothgarLostLastName = exdData->getField< std::string >( row, 40 ); + vieraFirstName = exdData->getField< std::string >( row, 41 ); + vieraRavaLastName = exdData->getField< std::string >( row, 42 ); + vieraVeenaLastName = exdData->getField< std::string >( row, 43 ); } Sapphire::Data::CharaMakeType::CharaMakeType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -966,60 +1329,214 @@ Sapphire::Data::CharaMakeType::CharaMakeType( uint32_t row_id, Sapphire::Data::E race = exdData->getField< int32_t >( row, 0 ); tribe = exdData->getField< int32_t >( row, 1 ); gender = exdData->getField< int8_t >( row, 2 ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3293 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3294 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3295 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3296 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3297 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3298 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3299 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3300 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3301 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3302 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3303 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3304 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3305 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3306 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3307 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3308 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3309 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3310 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3311 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3312 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3313 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3314 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3315 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3316 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3317 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3318 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3319 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3320 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3321 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3322 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3323 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3324 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3325 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3326 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3327 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3328 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3329 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3330 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3331 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3332 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3333 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3334 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3335 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3336 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3337 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3338 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3339 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3340 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3341 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3342 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3343 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3344 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3345 ) ); - facialFeatureIcon.push_back( exdData->getField< int32_t >( row, 3346 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 3 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 4 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 5 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 6 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 7 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 8 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 9 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 10 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 11 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 12 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 13 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 14 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 15 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 16 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 17 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 18 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 19 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 20 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 21 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 22 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 23 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 24 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 25 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 26 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 27 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 28 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 29 ) ); + menu.push_back( exdData->getField< uint32_t >( row, 30 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 31 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 32 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 33 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 34 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 35 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 36 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 37 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 38 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 39 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 40 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 41 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 42 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 43 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 44 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 45 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 46 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 47 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 48 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 49 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 50 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 51 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 52 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 53 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 54 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 55 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 56 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 57 ) ); + initVal.push_back( exdData->getField< uint8_t >( row, 58 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 59 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 60 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 61 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 62 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 63 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 64 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 65 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 66 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 67 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 68 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 69 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 70 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 71 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 72 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 73 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 74 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 75 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 76 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 77 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 78 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 79 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 80 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 81 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 82 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 83 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 84 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 85 ) ); + subMenuType.push_back( exdData->getField< uint8_t >( row, 86 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 87 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 88 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 89 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 90 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 91 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 92 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 93 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 94 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 95 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 96 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 97 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 98 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 99 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 100 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 101 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 102 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 103 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 104 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 105 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 106 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 107 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 108 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 109 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 110 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 111 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 112 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 113 ) ); + subMenuNum.push_back( exdData->getField< uint8_t >( row, 114 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 115 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 116 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 117 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 118 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 119 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 120 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 121 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 122 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 123 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 124 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 125 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 126 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 127 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 128 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 129 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 130 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 131 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 132 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 133 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 134 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 135 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 136 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 137 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 138 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 139 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 140 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 141 ) ); + lookAt.push_back( exdData->getField< uint8_t >( row, 142 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 143 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 144 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 145 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 146 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 147 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 148 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 149 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 150 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 151 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 152 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 153 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 154 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 155 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 156 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 157 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 158 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 159 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 160 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 161 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 162 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 163 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 164 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 165 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 166 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 167 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 168 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 169 ) ); + subMenuMask.push_back( exdData->getField< uint32_t >( row, 170 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 171 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 172 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 173 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 174 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 175 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 176 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 177 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 178 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 179 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 180 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 181 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 182 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 183 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 184 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 185 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 186 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 187 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 188 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 189 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 190 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 191 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 192 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 193 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 194 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 195 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 196 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 197 ) ); + customize.push_back( exdData->getField< uint32_t >( row, 198 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3279 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3280 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3281 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3282 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3283 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3284 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3285 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3286 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3287 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3288 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3289 ) ); + voiceStruct.push_back( exdData->getField< uint8_t >( row, 3290 ) ); } Sapphire::Data::ChocoboRace::ChocoboRace( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1100,14 +1617,32 @@ Sapphire::Data::ChocoboTaxi::ChocoboTaxi( uint32_t row_id, Sapphire::Data::ExdDa { auto row = exdData->m_ChocoboTaxiDat.get_row( row_id ); location = exdData->getField< uint32_t >( row, 0 ); + fare = exdData->getField< uint8_t >( row, 1 ); + timeRequired = exdData->getField< uint16_t >( row, 2 ); } Sapphire::Data::ChocoboTaxiStand::ChocoboTaxiStand( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ChocoboTaxiStandDat.get_row( row_id ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 0 ) ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 1 ) ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 2 ) ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 3 ) ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 4 ) ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 5 ) ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 6 ) ); + targetLocations.push_back( exdData->getField< uint16_t >( row, 7 ) ); placeName = exdData->getField< std::string >( row, 8 ); } +Sapphire::Data::CircleActivity::CircleActivity( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CircleActivityDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); + icon = exdData->getField< int32_t >( row, 1 ); + order = exdData->getField< uint16_t >( row, 2 ); +} + Sapphire::Data::ClassJob::ClassJob( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ClassJobDat.get_row( row_id ); @@ -1115,6 +1650,9 @@ Sapphire::Data::ClassJob::ClassJob( uint32_t row_id, Sapphire::Data::ExdDataGene abbreviation = exdData->getField< std::string >( row, 1 ); classJobCategory = exdData->getField< uint8_t >( row, 3 ); expArrayIndex = exdData->getField< int8_t >( row, 4 ); + battleClassIndex = exdData->getField< int8_t >( row, 5 ); + jobIndex = exdData->getField< uint8_t >( row, 7 ); + dohDolJobIndex = exdData->getField< int8_t >( row, 8 ); modifierHitPoints = exdData->getField< uint16_t >( row, 9 ); modifierManaPoints = exdData->getField< uint16_t >( row, 10 ); modifierStrength = exdData->getField< uint16_t >( row, 11 ); @@ -1123,15 +1661,18 @@ Sapphire::Data::ClassJob::ClassJob( uint32_t row_id, Sapphire::Data::ExdDataGene modifierIntelligence = exdData->getField< uint16_t >( row, 14 ); modifierMind = exdData->getField< uint16_t >( row, 15 ); modifierPiety = exdData->getField< uint16_t >( row, 16 ); + pvPActionSortRow = exdData->getField< uint8_t >( row, 24 ); classJobParent = exdData->getField< uint8_t >( row, 26 ); nameEnglish = exdData->getField< std::string >( row, 27 ); itemStartingWeapon = exdData->getField< int32_t >( row, 28 ); role = exdData->getField< uint8_t >( row, 30 ); startingTown = exdData->getField< uint8_t >( row, 31 ); + monsterNote = exdData->getField< int8_t >( row, 32 ); primaryStat = exdData->getField< uint8_t >( row, 33 ); limitBreak1 = exdData->getField< uint16_t >( row, 34 ); limitBreak2 = exdData->getField< uint16_t >( row, 35 ); limitBreak3 = exdData->getField< uint16_t >( row, 36 ); + uIPriority = exdData->getField< uint8_t >( row, 37 ); itemSoulCrystal = exdData->getField< uint32_t >( row, 38 ); unlockQuest = exdData->getField< uint32_t >( row, 39 ); relicQuest = exdData->getField< uint32_t >( row, 40 ); @@ -1139,6 +1680,7 @@ Sapphire::Data::ClassJob::ClassJob( uint32_t row_id, Sapphire::Data::ExdDataGene startingLevel = exdData->getField< uint8_t >( row, 42 ); partyBonus = exdData->getField< uint8_t >( row, 43 ); isLimitedJob = exdData->getField< bool >( row, 44 ); + canQueueForDuty = exdData->getField< bool >( row, 45 ); } Sapphire::Data::ClassJobCategory::ClassJobCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1181,6 +1723,76 @@ Sapphire::Data::ClassJobCategory::ClassJobCategory( uint32_t row_id, Sapphire::D aST = exdData->getField< bool >( row, 34 ); sAM = exdData->getField< bool >( row, 35 ); rDM = exdData->getField< bool >( row, 36 ); + bLU = exdData->getField< bool >( row, 37 ); + gNB = exdData->getField< bool >( row, 38 ); + dNC = exdData->getField< bool >( row, 39 ); +} + +Sapphire::Data::CollectablesShop::CollectablesShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CollectablesShopDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); + quest = exdData->getField< uint32_t >( row, 1 ); + rewardType = exdData->getField< uint8_t >( row, 2 ); + shopItems.push_back( exdData->getField< uint16_t >( row, 3 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 4 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 5 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 6 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 7 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 8 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 9 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 10 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 11 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 12 ) ); + shopItems.push_back( exdData->getField< uint16_t >( row, 13 ) ); +} + +Sapphire::Data::CollectablesShopItem::CollectablesShopItem( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CollectablesShopItemDat.get_row( row_id, subRow ); + item = exdData->getField< uint32_t >( row, 0 ); + collectablesShopItemGroup = exdData->getField< uint8_t >( row, 1 ); + levelMin = exdData->getField< uint16_t >( row, 2 ); + levelMax = exdData->getField< uint16_t >( row, 3 ); + stars = exdData->getField< uint8_t >( row, 4 ); + key = exdData->getField< uint8_t >( row, 5 ); + collectablesShopRefine = exdData->getField< uint16_t >( row, 6 ); + collectablesShopRewardScrip = exdData->getField< uint16_t >( row, 7 ); +} + +Sapphire::Data::CollectablesShopItemGroup::CollectablesShopItemGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CollectablesShopItemGroupDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::CollectablesShopRefine::CollectablesShopRefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CollectablesShopRefineDat.get_row( row_id ); + lowCollectability = exdData->getField< uint16_t >( row, 0 ); + midCollectability = exdData->getField< uint16_t >( row, 1 ); + highCollectability = exdData->getField< uint16_t >( row, 2 ); +} + +Sapphire::Data::CollectablesShopRewardItem::CollectablesShopRewardItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CollectablesShopRewardItemDat.get_row( row_id ); + item = exdData->getField< uint32_t >( row, 0 ); + rewardLow = exdData->getField< uint8_t >( row, 2 ); + rewardMid = exdData->getField< uint8_t >( row, 3 ); + rewardHigh = exdData->getField< uint8_t >( row, 4 ); +} + +Sapphire::Data::CollectablesShopRewardScrip::CollectablesShopRewardScrip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CollectablesShopRewardScripDat.get_row( row_id ); + currency = exdData->getField< uint16_t >( row, 0 ); + lowReward = exdData->getField< uint16_t >( row, 1 ); + midReward = exdData->getField< uint16_t >( row, 2 ); + highReward = exdData->getField< uint16_t >( row, 3 ); + expRatioLow = exdData->getField< uint16_t >( row, 4 ); + expRatioMid = exdData->getField< uint16_t >( row, 5 ); + expRatioHigh = exdData->getField< uint16_t >( row, 6 ); } Sapphire::Data::Companion::Companion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1194,7 +1806,22 @@ Sapphire::Data::Companion::Companion( uint32_t row_id, Sapphire::Data::ExdDataGe pronoun = exdData->getField< int8_t >( row, 6 ); article = exdData->getField< int8_t >( row, 7 ); model = exdData->getField< uint16_t >( row, 8 ); + scale = exdData->getField< uint8_t >( row, 9 ); + inactiveIdle0 = exdData->getField< uint8_t >( row, 10 ); + inactiveIdle1 = exdData->getField< uint8_t >( row, 11 ); + inactiveBattle = exdData->getField< uint8_t >( row, 12 ); + inactiveWandering = exdData->getField< uint8_t >( row, 13 ); behavior = exdData->getField< uint8_t >( row, 14 ); + special = exdData->getField< uint8_t >( row, 15 ); + wanderingWait = exdData->getField< uint8_t >( row, 16 ); + priority = exdData->getField< uint16_t >( row, 17 ); + roulette = exdData->getField< bool >( row, 18 ); + battle = exdData->getField< bool >( row, 20 ); + lookAt = exdData->getField< bool >( row, 21 ); + poke = exdData->getField< bool >( row, 22 ); + enemy = exdData->getField< uint16_t >( row, 23 ); + stroke = exdData->getField< bool >( row, 24 ); + clapping = exdData->getField< bool >( row, 25 ); icon = exdData->getField< uint16_t >( row, 26 ); order = exdData->getField< uint16_t >( row, 27 ); cost = exdData->getField< uint8_t >( row, 30 ); @@ -1279,6 +1906,7 @@ Sapphire::Data::CompanyCraftSequence::CompanyCraftSequence( uint32_t row_id, Sap { auto row = exdData->m_CompanyCraftSequenceDat.get_row( row_id ); resultItem = exdData->getField< int32_t >( row, 0 ); + category = exdData->getField< int32_t >( row, 1 ); companyCraftDraftCategory = exdData->getField< int32_t >( row, 2 ); companyCraftType = exdData->getField< int32_t >( row, 3 ); companyCraftDraft = exdData->getField< int32_t >( row, 4 ); @@ -1290,6 +1918,7 @@ Sapphire::Data::CompanyCraftSequence::CompanyCraftSequence( uint32_t row_id, Sap companyCraftPart.push_back( exdData->getField< uint16_t >( row, 10 ) ); companyCraftPart.push_back( exdData->getField< uint16_t >( row, 11 ) ); companyCraftPart.push_back( exdData->getField< uint16_t >( row, 12 ) ); + order = exdData->getField< uint32_t >( row, 13 ); } Sapphire::Data::CompanyCraftSupplyItem::CompanyCraftSupplyItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1307,15 +1936,80 @@ Sapphire::Data::CompanyCraftType::CompanyCraftType( uint32_t row_id, Sapphire::D Sapphire::Data::CompanyLeve::CompanyLeve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CompanyLeveDat.get_row( row_id ); - eventItem = exdData->getField< int32_t >( row, 32 ); - eventItemAmount = exdData->getField< uint8_t >( row, 40 ); - companyLeveRule = exdData->getField< int32_t >( row, 176 ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 0 ) ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 1 ) ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 2 ) ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 3 ) ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 4 ) ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 5 ) ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 6 ) ); + routePointTime.push_back( exdData->getField< uint16_t >( row, 7 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 8 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 9 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 10 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 11 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 12 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 13 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 14 ) ); + baseID.push_back( exdData->getField< int32_t >( row, 15 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 16 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 17 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 18 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 19 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 20 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 21 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 22 ) ); + enemyLevel.push_back( exdData->getField< uint16_t >( row, 23 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 24 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 25 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 26 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 27 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 28 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 29 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 30 ) ); + bNpcName.push_back( exdData->getField< uint32_t >( row, 31 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 32 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 33 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 34 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 35 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 36 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 37 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 38 ) ); + itemsInvolved.push_back( exdData->getField< int32_t >( row, 39 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 40 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 41 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 42 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 43 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 44 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 45 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 46 ) ); + itemsInvolvedQty.push_back( exdData->getField< uint8_t >( row, 47 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 48 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 49 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 50 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 51 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 52 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 53 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 54 ) ); + itemDropRate.push_back( exdData->getField< uint8_t >( row, 55 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 168 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 169 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 170 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 171 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 172 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 173 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 174 ) ); + toDoSequence.push_back( exdData->getField< uint8_t >( row, 175 ) ); + rule = exdData->getField< int32_t >( row, 176 ); + ruleParam = exdData->getField< uint8_t >( row, 177 ); } Sapphire::Data::CompanyLeveRule::CompanyLeveRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CompanyLeveRuleDat.get_row( row_id ); type = exdData->getField< std::string >( row, 0 ); + objective = exdData->getField< uint16_t >( row, 1 ); + help = exdData->getField< uint16_t >( row, 2 ); } Sapphire::Data::CompleteJournal::CompleteJournal( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1357,6 +2051,33 @@ Sapphire::Data::CompleteJournalCategory::CompleteJournalCategory( uint32_t row_i lastQuest = exdData->getField< uint32_t >( row, 1 ); } +Sapphire::Data::Completion::Completion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CompletionDat.get_row( row_id ); + group = exdData->getField< uint16_t >( row, 0 ); + key = exdData->getField< uint16_t >( row, 1 ); + lookupTable = exdData->getField< std::string >( row, 2 ); + text = exdData->getField< std::string >( row, 3 ); + groupTitle = exdData->getField< std::string >( row, 4 ); +} + +Sapphire::Data::Condition::Condition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ConditionDat.get_row( row_id ); + logMessage = exdData->getField< uint32_t >( row, 2 ); +} + +Sapphire::Data::ConfigKey::ConfigKey( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ConfigKeyDat.get_row( row_id ); + label = exdData->getField< std::string >( row, 0 ); + param = exdData->getField< uint8_t >( row, 1 ); + platform = exdData->getField< uint8_t >( row, 2 ); + required = exdData->getField< bool >( row, 3 ); + category = exdData->getField< uint8_t >( row, 4 ); + text = exdData->getField< std::string >( row, 7 ); +} + Sapphire::Data::ContentCloseCycle::ContentCloseCycle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentCloseCycleDat.get_row( row_id ); @@ -1374,36 +2095,43 @@ Sapphire::Data::ContentExAction::ContentExAction( uint32_t row_id, Sapphire::Dat Sapphire::Data::ContentFinderCondition::ContentFinderCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentFinderConditionDat.get_row( row_id ); + shortCode = exdData->getField< std::string >( row, 0 ); territoryType = exdData->getField< uint16_t >( row, 1 ); contentLinkType = exdData->getField< uint8_t >( row, 2 ); content = exdData->getField< uint16_t >( row, 3 ); + pvP = exdData->getField< bool >( row, 4 ); + acceptClassJobCategory = exdData->getField< uint8_t >( row, 8 ); contentMemberType = exdData->getField< uint8_t >( row, 9 ); unlockQuest = exdData->getField< uint32_t >( row, 13 ); classJobLevelRequired = exdData->getField< uint8_t >( row, 15 ); classJobLevelSync = exdData->getField< uint8_t >( row, 16 ); itemLevelRequired = exdData->getField< uint16_t >( row, 17 ); itemLevelSync = exdData->getField< uint16_t >( row, 18 ); - allowReplacement = exdData->getField< bool >( row, 20 ); - highEndDuty = exdData->getField< bool >( row, 26 ); - dutyRecorderAllowed = exdData->getField< bool >( row, 30 ); - name = exdData->getField< std::string >( row, 34 ); - contentType = exdData->getField< uint8_t >( row, 35 ); - transientKey = exdData->getField< uint8_t >( row, 36 ); - transient = exdData->getField< uint32_t >( row, 37 ); - sortKey = exdData->getField< uint16_t >( row, 38 ); - image = exdData->getField< uint32_t >( row, 39 ); - icon = exdData->getField< uint32_t >( row, 40 ); - levelingRoulette = exdData->getField< bool >( row, 42 ); - level5060Roulette = exdData->getField< bool >( row, 43 ); - mSQRoulette = exdData->getField< bool >( row, 44 ); - guildHestRoulette = exdData->getField< bool >( row, 45 ); - expertRoulette = exdData->getField< bool >( row, 46 ); - trialRoulette = exdData->getField< bool >( row, 47 ); - dailyFrontlineChallenge = exdData->getField< bool >( row, 48 ); - level70Roulette = exdData->getField< bool >( row, 49 ); - mentorRoulette = exdData->getField< bool >( row, 50 ); - allianceRoulette = exdData->getField< bool >( row, 56 ); - normalRaidRoulette = exdData->getField< bool >( row, 58 ); + allowUndersized = exdData->getField< bool >( row, 20 ); + allowReplacement = exdData->getField< bool >( row, 21 ); + allowExplorerMode = exdData->getField< bool >( row, 23 ); + highEndDuty = exdData->getField< bool >( row, 28 ); + dutyRecorderAllowed = exdData->getField< bool >( row, 32 ); + name = exdData->getField< std::string >( row, 37 ); + nameShort = exdData->getField< std::string >( row, 38 ); + contentType = exdData->getField< uint8_t >( row, 39 ); + transientKey = exdData->getField< uint8_t >( row, 40 ); + transient = exdData->getField< uint32_t >( row, 41 ); + sortKey = exdData->getField< uint16_t >( row, 42 ); + image = exdData->getField< uint32_t >( row, 43 ); + icon = exdData->getField< uint32_t >( row, 44 ); + level506070Roulette = exdData->getField< bool >( row, 46 ); + levelingRoulette = exdData->getField< bool >( row, 47 ); + mSQRoulette = exdData->getField< bool >( row, 48 ); + guildHestRoulette = exdData->getField< bool >( row, 49 ); + expertRoulette = exdData->getField< bool >( row, 50 ); + trialRoulette = exdData->getField< bool >( row, 51 ); + dailyFrontlineChallenge = exdData->getField< bool >( row, 52 ); + level80Roulette = exdData->getField< bool >( row, 53 ); + mentorRoulette = exdData->getField< bool >( row, 54 ); + allianceRoulette = exdData->getField< bool >( row, 60 ); + feastTeamRoulette = exdData->getField< bool >( row, 61 ); + normalRaidRoulette = exdData->getField< bool >( row, 62 ); } Sapphire::Data::ContentFinderConditionTransient::ContentFinderConditionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1431,15 +2159,16 @@ Sapphire::Data::ContentGaugeColor::ContentGaugeColor( uint32_t row_id, Sapphire: Sapphire::Data::ContentMemberType::ContentMemberType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentMemberTypeDat.get_row( row_id ); - tanksPerParty = exdData->getField< uint8_t >( row, 9 ); - healersPerParty = exdData->getField< uint8_t >( row, 10 ); - meleesPerParty = exdData->getField< uint8_t >( row, 11 ); - rangedPerParty = exdData->getField< uint8_t >( row, 12 ); + tanksPerParty = exdData->getField< uint8_t >( row, 10 ); + healersPerParty = exdData->getField< uint8_t >( row, 11 ); + meleesPerParty = exdData->getField< uint8_t >( row, 12 ); + rangedPerParty = exdData->getField< uint8_t >( row, 13 ); } Sapphire::Data::ContentNpcTalk::ContentNpcTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentNpcTalkDat.get_row( row_id ); + type = exdData->getField< int32_t >( row, 0 ); contentTalk.push_back( exdData->getField< uint32_t >( row, 1 ) ); contentTalk.push_back( exdData->getField< uint32_t >( row, 2 ) ); contentTalk.push_back( exdData->getField< uint32_t >( row, 3 ) ); @@ -1450,26 +2179,33 @@ Sapphire::Data::ContentNpcTalk::ContentNpcTalk( uint32_t row_id, Sapphire::Data: contentTalk.push_back( exdData->getField< uint32_t >( row, 8 ) ); } +Sapphire::Data::ContentRandomSelect::ContentRandomSelect( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ContentRandomSelectDat.get_row( row_id, subRow ); + name = exdData->getField< uint16_t >( row, 0 ); +} + Sapphire::Data::ContentRoulette::ContentRoulette( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentRouletteDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); - description = exdData->getField< std::string >( row, 2 ); - dutyType = exdData->getField< std::string >( row, 3 ); - isInDutyFinder = exdData->getField< bool >( row, 6 ); - openRule = exdData->getField< uint8_t >( row, 7 ); - requiredLevel = exdData->getField< uint8_t >( row, 9 ); - itemLevelRequired = exdData->getField< uint16_t >( row, 11 ); - icon = exdData->getField< uint32_t >( row, 13 ); - contentRouletteRoleBonus = exdData->getField< uint8_t >( row, 14 ); - rewardTomeA = exdData->getField< uint16_t >( row, 15 ); - rewardTomeB = exdData->getField< uint16_t >( row, 16 ); - rewardTomeC = exdData->getField< uint16_t >( row, 17 ); - sortKey = exdData->getField< uint8_t >( row, 20 ); - contentMemberType = exdData->getField< uint8_t >( row, 22 ); - requireAllDuties = exdData->getField< bool >( row, 32 ); - contentRouletteOpenRule = exdData->getField< uint8_t >( row, 34 ); - instanceContent = exdData->getField< uint16_t >( row, 35 ); + category = exdData->getField< std::string >( row, 1 ); + description = exdData->getField< std::string >( row, 3 ); + dutyType = exdData->getField< std::string >( row, 4 ); + isInDutyFinder = exdData->getField< bool >( row, 8 ); + openRule = exdData->getField< uint8_t >( row, 9 ); + requiredLevel = exdData->getField< uint8_t >( row, 11 ); + itemLevelRequired = exdData->getField< uint16_t >( row, 13 ); + icon = exdData->getField< uint32_t >( row, 15 ); + contentRouletteRoleBonus = exdData->getField< uint8_t >( row, 16 ); + rewardTomeA = exdData->getField< uint16_t >( row, 17 ); + rewardTomeB = exdData->getField< uint16_t >( row, 18 ); + rewardTomeC = exdData->getField< uint16_t >( row, 19 ); + sortKey = exdData->getField< uint8_t >( row, 22 ); + contentMemberType = exdData->getField< uint8_t >( row, 24 ); + requireAllDuties = exdData->getField< bool >( row, 34 ); + contentRouletteOpenRule = exdData->getField< uint8_t >( row, 36 ); + instanceContent = exdData->getField< uint16_t >( row, 37 ); } Sapphire::Data::ContentRouletteOpenRule::ContentRouletteOpenRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1492,7 +2228,9 @@ Sapphire::Data::ContentsNote::ContentsNote( uint32_t row_id, Sapphire::Data::Exd icon = exdData->getField< int32_t >( row, 1 ); menuOrder = exdData->getField< uint8_t >( row, 2 ); requiredAmount = exdData->getField< int32_t >( row, 3 ); + reward0 = exdData->getField< uint8_t >( row, 4 ); expMultiplier = exdData->getField< int32_t >( row, 5 ); + reward1 = exdData->getField< uint8_t >( row, 6 ); gilRward = exdData->getField< int32_t >( row, 7 ); levelUnlock = exdData->getField< uint16_t >( row, 8 ); howTo = exdData->getField< uint16_t >( row, 9 ); @@ -1502,6 +2240,28 @@ Sapphire::Data::ContentsNote::ContentsNote( uint32_t row_id, Sapphire::Data::Exd expCap = exdData->getField< int32_t >( row, 13 ); } +Sapphire::Data::ContentsTutorial::ContentsTutorial( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ContentsTutorialDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); + page.push_back( exdData->getField< int32_t >( row, 2 ) ); + page.push_back( exdData->getField< int32_t >( row, 3 ) ); + page.push_back( exdData->getField< int32_t >( row, 4 ) ); + page.push_back( exdData->getField< int32_t >( row, 5 ) ); + page.push_back( exdData->getField< int32_t >( row, 6 ) ); + page.push_back( exdData->getField< int32_t >( row, 7 ) ); + page.push_back( exdData->getField< int32_t >( row, 8 ) ); + page.push_back( exdData->getField< int32_t >( row, 9 ) ); +} + +Sapphire::Data::ContentsTutorialPage::ContentsTutorialPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ContentsTutorialPageDat.get_row( row_id ); + image = exdData->getField< int32_t >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); +} + Sapphire::Data::ContentTalk::ContentTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ContentTalkDat.get_row( row_id ); @@ -1556,9 +2316,30 @@ Sapphire::Data::CraftLeve::CraftLeve( uint32_t row_id, Sapphire::Data::ExdDataGe repeats = exdData->getField< uint8_t >( row, 2 ); } +Sapphire::Data::CraftLevelDifference::CraftLevelDifference( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CraftLevelDifferenceDat.get_row( row_id ); + difference = exdData->getField< int16_t >( row, 0 ); + progressFactor = exdData->getField< int16_t >( row, 1 ); + qualityFactor = exdData->getField< int16_t >( row, 2 ); +} + +Sapphire::Data::CraftLeveTalk::CraftLeveTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CraftLeveTalkDat.get_row( row_id ); + talk.push_back( exdData->getField< std::string >( row, 36 ) ); + talk.push_back( exdData->getField< std::string >( row, 37 ) ); + talk.push_back( exdData->getField< std::string >( row, 38 ) ); + talk.push_back( exdData->getField< std::string >( row, 39 ) ); + talk.push_back( exdData->getField< std::string >( row, 40 ) ); + talk.push_back( exdData->getField< std::string >( row, 41 ) ); +} + Sapphire::Data::CraftType::CraftType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CraftTypeDat.get_row( row_id ); + mainPhysical = exdData->getField< uint8_t >( row, 0 ); + subPhysical = exdData->getField< uint8_t >( row, 1 ); name = exdData->getField< std::string >( row, 2 ); } @@ -1580,7 +2361,7 @@ Sapphire::Data::Credit::Credit( uint32_t row_id, uint32_t subRow, Sapphire::Data Sapphire::Data::CreditBackImage::CreditBackImage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CreditBackImageDat.get_row( row_id, subRow ); - backImage = exdData->getField< uint32_t >( row, 2 ); + backImage = exdData->getField< uint32_t >( row, 5 ); } Sapphire::Data::CreditCast::CreditCast( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1604,13 +2385,6 @@ Sapphire::Data::CreditListText::CreditListText( uint32_t row_id, Sapphire::Data: name = exdData->getField< std::string >( row, 0 ); } -Sapphire::Data::Currency::Currency( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_CurrencyDat.get_row( row_id ); - item = exdData->getField< uint32_t >( row, 0 ); - limit = exdData->getField< uint32_t >( row, 3 ); -} - Sapphire::Data::CustomTalk::CustomTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CustomTalkDat.get_row( row_id ); @@ -1677,14 +2451,9 @@ Sapphire::Data::CustomTalk::CustomTalk( uint32_t row_id, Sapphire::Data::ExdData scriptArg.push_back( exdData->getField< uint32_t >( row, 60 ) ); scriptArg.push_back( exdData->getField< uint32_t >( row, 61 ) ); scriptArg.push_back( exdData->getField< uint32_t >( row, 62 ) ); - text = exdData->getField< bool >( row, 66 ); -} - -Sapphire::Data::CustomTalkDynamicIcon::CustomTalkDynamicIcon( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_CustomTalkDynamicIconDat.get_row( row_id, subRow ); - smallIcon = exdData->getField< uint32_t >( row, 0 ); - largeIcon = exdData->getField< uint32_t >( row, 1 ); + mainOption = exdData->getField< std::string >( row, 64 ); + subOption = exdData->getField< std::string >( row, 65 ); + specialLinks = exdData->getField< uint32_t >( row, 75 ); } Sapphire::Data::CustomTalkNestHandlers::CustomTalkNestHandlers( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1699,21 +2468,130 @@ Sapphire::Data::Cutscene::Cutscene( uint32_t row_id, Sapphire::Data::ExdDataGene path = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::CutSceneIncompQuest::CutSceneIncompQuest( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CutSceneIncompQuestDat.get_row( row_id, subRow ); + quest = exdData->getField< uint32_t >( row, 0 ); +} + +Sapphire::Data::CutsceneMotion::CutsceneMotion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CutsceneMotionDat.get_row( row_id ); + wALK_LOOP_SPEED = exdData->getField< float >( row, 0 ); + rUN_LOOP_SPEED = exdData->getField< float >( row, 1 ); + sLOWWALK_LOOP_SPEED = exdData->getField< float >( row, 2 ); + sLOWRUN_LOOP_SPEED = exdData->getField< float >( row, 3 ); + bATTLEWALK_LOOP_SPEED = exdData->getField< float >( row, 4 ); + bATTLERUN_LOOP_SPEED = exdData->getField< float >( row, 5 ); + dASH_LOOP_SPEED = exdData->getField< float >( row, 6 ); + tURN_CW90_FRAME = exdData->getField< uint8_t >( row, 7 ); + tURN_CCW90_FRAME = exdData->getField< uint8_t >( row, 8 ); + tURN_CW180_FRAME = exdData->getField< uint8_t >( row, 9 ); + tURN_CCW180_FRAME = exdData->getField< uint8_t >( row, 10 ); +} + +Sapphire::Data::CutsceneWorkIndex::CutsceneWorkIndex( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CutsceneWorkIndexDat.get_row( row_id ); + workIndex = exdData->getField< uint16_t >( row, 0 ); +} + Sapphire::Data::CutScreenImage::CutScreenImage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_CutScreenImageDat.get_row( row_id ); + type = exdData->getField< int16_t >( row, 0 ); image = exdData->getField< int32_t >( row, 1 ); } +Sapphire::Data::CycleTime::CycleTime( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_CycleTimeDat.get_row( row_id ); + firstCycle = exdData->getField< uint32_t >( row, 0 ); + cycle = exdData->getField< uint32_t >( row, 1 ); +} + Sapphire::Data::DailySupplyItem::DailySupplyItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_DailySupplyItemDat.get_row( row_id ); } +Sapphire::Data::DawnContent::DawnContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DawnContentDat.get_row( row_id ); + content = exdData->getField< uint32_t >( row, 0 ); + exp = exdData->getField< uint32_t >( row, 1 ); +} + +Sapphire::Data::DawnGrowMember::DawnGrowMember( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DawnGrowMemberDat.get_row( row_id ); + member = exdData->getField< uint32_t >( row, 0 ); + imageName = exdData->getField< uint32_t >( row, 1 ); + bigImageOld = exdData->getField< uint32_t >( row, 2 ); + bigImageNew = exdData->getField< uint32_t >( row, 3 ); + smallImageOld = exdData->getField< uint32_t >( row, 4 ); + smallImageNew = exdData->getField< uint32_t >( row, 5 ); + _class = exdData->getField< uint8_t >( row, 6 ); +} + +Sapphire::Data::DawnMemberUIParam::DawnMemberUIParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DawnMemberUIParamDat.get_row( row_id ); + classSingular = exdData->getField< std::string >( row, 0 ); + voiceLine = exdData->getField< uint32_t >( row, 1 ); + classPlural = exdData->getField< std::string >( row, 2 ); +} + +Sapphire::Data::DawnQuestAnnounce::DawnQuestAnnounce( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DawnQuestAnnounceDat.get_row( row_id ); + quest = exdData->getField< uint32_t >( row, 0 ); + content = exdData->getField< uint8_t >( row, 1 ); + eNPC.push_back( exdData->getField< uint32_t >( row, 2 ) ); + eNPC.push_back( exdData->getField< uint32_t >( row, 3 ) ); + eNPC.push_back( exdData->getField< uint32_t >( row, 4 ) ); + eNPC.push_back( exdData->getField< uint32_t >( row, 5 ) ); + eNPC.push_back( exdData->getField< uint32_t >( row, 6 ) ); + eNPC.push_back( exdData->getField< uint32_t >( row, 7 ) ); +} + +Sapphire::Data::DawnQuestMember::DawnQuestMember( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DawnQuestMemberDat.get_row( row_id ); + member = exdData->getField< uint32_t >( row, 0 ); + imageName = exdData->getField< uint32_t >( row, 1 ); + bigImageOld = exdData->getField< uint32_t >( row, 2 ); + bigImageNew = exdData->getField< uint32_t >( row, 3 ); + _class = exdData->getField< uint8_t >( row, 4 ); +} + Sapphire::Data::DeepDungeon::DeepDungeon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_DeepDungeonDat.get_row( row_id ); + aetherpoolArm = exdData->getField< uint8_t >( row, 0 ); + aetherpoolArmor = exdData->getField< uint8_t >( row, 1 ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 2 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 3 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 4 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 5 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 6 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 7 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 8 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 9 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 10 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 11 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 12 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 13 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 14 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 15 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 16 ) ); + pomanderSlot.push_back( exdData->getField< uint8_t >( row, 17 ) ); + magiciteSlot.push_back( exdData->getField< uint8_t >( row, 18 ) ); + magiciteSlot.push_back( exdData->getField< uint8_t >( row, 19 ) ); + magiciteSlot.push_back( exdData->getField< uint8_t >( row, 20 ) ); + magiciteSlot.push_back( exdData->getField< uint8_t >( row, 21 ) ); name = exdData->getField< std::string >( row, 22 ); + contentFinderConditionStart = exdData->getField< uint16_t >( row, 23 ); } Sapphire::Data::DeepDungeonBan::DeepDungeonBan( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1775,6 +2653,12 @@ Sapphire::Data::DeepDungeonLayer::DeepDungeonLayer( uint32_t row_id, Sapphire::D { auto row = exdData->m_DeepDungeonLayerDat.get_row( row_id ); deepDungeon = exdData->getField< uint8_t >( row, 0 ); + floorSet = exdData->getField< uint8_t >( row, 1 ); + roomA = exdData->getField< uint16_t >( row, 2 ); + roomB = exdData->getField< uint16_t >( row, 3 ); + roomC = exdData->getField< uint16_t >( row, 4 ); + wepMinLv = exdData->getField< uint8_t >( row, 5 ); + armourMinLv = exdData->getField< uint8_t >( row, 6 ); } Sapphire::Data::DeepDungeonMagicStone::DeepDungeonMagicStone( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1843,27 +2727,27 @@ Sapphire::Data::DeliveryQuest::DeliveryQuest( uint32_t row_id, Sapphire::Data::E quest = exdData->getField< int32_t >( row, 0 ); } +Sapphire::Data::Description::Description( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DescriptionDat.get_row( row_id ); + quest = exdData->getField< uint32_t >( row, 0 ); + textLong = exdData->getField< std::string >( row, 1 ); + textShort = exdData->getField< std::string >( row, 2 ); + textCommentary = exdData->getField< std::string >( row, 3 ); + section = exdData->getField< uint32_t >( row, 5 ); +} + Sapphire::Data::DescriptionPage::DescriptionPage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_DescriptionPageDat.get_row( row_id, subRow ); - text1 = exdData->getField< uint32_t >( row, 1 ); - image1 = exdData->getField< uint32_t >( row, 2 ); - text2 = exdData->getField< uint32_t >( row, 3 ); - image2 = exdData->getField< uint32_t >( row, 4 ); - text3 = exdData->getField< uint32_t >( row, 5 ); - image3 = exdData->getField< uint32_t >( row, 6 ); - text4 = exdData->getField< uint32_t >( row, 7 ); - image4 = exdData->getField< uint32_t >( row, 8 ); - text5 = exdData->getField< uint32_t >( row, 9 ); - image5 = exdData->getField< uint32_t >( row, 10 ); - text6 = exdData->getField< uint32_t >( row, 11 ); - image6 = exdData->getField< uint32_t >( row, 12 ); - text7 = exdData->getField< uint32_t >( row, 13 ); - image7 = exdData->getField< uint32_t >( row, 14 ); - text8 = exdData->getField< uint32_t >( row, 15 ); - image8 = exdData->getField< uint32_t >( row, 16 ); - text9 = exdData->getField< uint32_t >( row, 17 ); - image9 = exdData->getField< uint32_t >( row, 18 ); + quest = exdData->getField< uint32_t >( row, 1 ); +} + +Sapphire::Data::DescriptionSection::DescriptionSection( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DescriptionSectionDat.get_row( row_id, subRow ); + string = exdData->getField< uint16_t >( row, 0 ); + page = exdData->getField< uint16_t >( row, 1 ); } Sapphire::Data::DescriptionString::DescriptionString( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -1940,6 +2824,41 @@ Sapphire::Data::DpsChallengeTransient::DpsChallengeTransient( uint32_t row_id, S instanceContent = exdData->getField< uint16_t >( row, 0 ); } +Sapphire::Data::DynamicEvent::DynamicEvent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DynamicEventDat.get_row( row_id ); + eventType = exdData->getField< uint8_t >( row, 0 ); + enemyType = exdData->getField< uint8_t >( row, 1 ); + lGBEventObject = exdData->getField< uint32_t >( row, 4 ); + lGBMapRange = exdData->getField< uint32_t >( row, 5 ); + quest = exdData->getField< uint32_t >( row, 6 ); + singleBattle = exdData->getField< uint8_t >( row, 8 ); + announce = exdData->getField< uint32_t >( row, 9 ); + name = exdData->getField< std::string >( row, 10 ); + description = exdData->getField< std::string >( row, 11 ); +} + +Sapphire::Data::DynamicEventEnemyType::DynamicEventEnemyType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DynamicEventEnemyTypeDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::DynamicEventSingleBattle::DynamicEventSingleBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DynamicEventSingleBattleDat.get_row( row_id ); + bNpcName = exdData->getField< int32_t >( row, 0 ); + icon = exdData->getField< uint32_t >( row, 1 ); + text = exdData->getField< std::string >( row, 2 ); +} + +Sapphire::Data::DynamicEventType::DynamicEventType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_DynamicEventTypeDat.get_row( row_id ); + iconObjective0 = exdData->getField< uint32_t >( row, 0 ); + iconObjective1 = exdData->getField< uint32_t >( row, 1 ); +} + Sapphire::Data::EmjAddon::EmjAddon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_EmjAddonDat.get_row( row_id ); @@ -1967,6 +2886,7 @@ Sapphire::Data::Emote::Emote( uint32_t row_id, Sapphire::Data::ExdDataGenerated* emoteMode = exdData->getField< uint8_t >( row, 12 ); hasCancelEmote = exdData->getField< bool >( row, 15 ); drawsWeapon = exdData->getField< bool >( row, 16 ); + order = exdData->getField< uint16_t >( row, 17 ); textCommand = exdData->getField< int32_t >( row, 18 ); icon = exdData->getField< uint16_t >( row, 19 ); logMessageTargeted = exdData->getField< uint16_t >( row, 20 ); @@ -1980,9 +2900,23 @@ Sapphire::Data::EmoteCategory::EmoteCategory( uint32_t row_id, Sapphire::Data::E name = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::EmoteMode::EmoteMode( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EmoteModeDat.get_row( row_id ); + startEmote = exdData->getField< uint16_t >( row, 0 ); + endEmote = exdData->getField< uint16_t >( row, 1 ); + move = exdData->getField< bool >( row, 2 ); + camera = exdData->getField< bool >( row, 3 ); + endOnRotate = exdData->getField< bool >( row, 4 ); + endOnEmote = exdData->getField< bool >( row, 5 ); + conditionMode = exdData->getField< uint8_t >( row, 6 ); +} + Sapphire::Data::ENpcBase::ENpcBase( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ENpcBaseDat.get_row( row_id ); + eventHandler = exdData->getField< uint16_t >( row, 0 ); + important = exdData->getField< bool >( row, 1 ); eNpcData.push_back( exdData->getField< uint32_t >( row, 2 ) ); eNpcData.push_back( exdData->getField< uint32_t >( row, 3 ) ); eNpcData.push_back( exdData->getField< uint32_t >( row, 4 ) ); @@ -2070,7 +3004,10 @@ Sapphire::Data::ENpcBase::ENpcBase( uint32_t row_id, Sapphire::Data::ExdDataGene dyeLeftRing = exdData->getField< uint8_t >( row, 87 ); modelRightRing = exdData->getField< uint32_t >( row, 88 ); dyeRightRing = exdData->getField< uint8_t >( row, 89 ); + invisibility = exdData->getField< uint8_t >( row, 90 ); balloon = exdData->getField< uint16_t >( row, 91 ); + notRewriteHeight = exdData->getField< bool >( row, 92 ); + defaultBalloon = exdData->getField< uint8_t >( row, 93 ); } Sapphire::Data::ENpcDressUp::ENpcDressUp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2082,22 +3019,22 @@ Sapphire::Data::ENpcDressUp::ENpcDressUp( uint32_t row_id, Sapphire::Data::ExdDa Sapphire::Data::ENpcDressUpDress::ENpcDressUpDress( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ENpcDressUpDressDat.get_row( row_id, subRow ); - eNpc = exdData->getField< uint32_t >( row, 6 ); - behavior = exdData->getField< uint16_t >( row, 8 ); - modelMainHand = exdData->getField< uint64_t >( row, 35 ); - dyeMainHand = exdData->getField< uint8_t >( row, 36 ); - modelOffHand = exdData->getField< uint64_t >( row, 37 ); - dyeOffHand = exdData->getField< uint8_t >( row, 38 ); - modelHead = exdData->getField< uint32_t >( row, 39 ); - dyeHead = exdData->getField< uint8_t >( row, 40 ); - modelBody = exdData->getField< uint32_t >( row, 41 ); - dyeBody = exdData->getField< uint8_t >( row, 42 ); - modelHands = exdData->getField< uint32_t >( row, 43 ); - dyeHands = exdData->getField< uint8_t >( row, 44 ); - modelLegs = exdData->getField< uint32_t >( row, 45 ); - dyeLegs = exdData->getField< uint8_t >( row, 46 ); - modelFeet = exdData->getField< uint32_t >( row, 47 ); - dyeFeet = exdData->getField< uint8_t >( row, 48 ); + eNpc = exdData->getField< uint32_t >( row, 7 ); + behavior = exdData->getField< uint16_t >( row, 9 ); + modelMainHand = exdData->getField< uint64_t >( row, 37 ); + dyeMainHand = exdData->getField< uint8_t >( row, 38 ); + modelOffHand = exdData->getField< uint64_t >( row, 39 ); + dyeOffHand = exdData->getField< uint8_t >( row, 40 ); + modelHead = exdData->getField< uint32_t >( row, 41 ); + dyeHead = exdData->getField< uint8_t >( row, 42 ); + modelBody = exdData->getField< uint32_t >( row, 43 ); + dyeBody = exdData->getField< uint8_t >( row, 44 ); + modelHands = exdData->getField< uint32_t >( row, 45 ); + dyeHands = exdData->getField< uint8_t >( row, 46 ); + modelLegs = exdData->getField< uint32_t >( row, 47 ); + dyeLegs = exdData->getField< uint8_t >( row, 48 ); + modelFeet = exdData->getField< uint32_t >( row, 49 ); + dyeFeet = exdData->getField< uint8_t >( row, 50 ); } Sapphire::Data::ENpcResident::ENpcResident( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2117,8 +3054,15 @@ Sapphire::Data::ENpcResident::ENpcResident( uint32_t row_id, Sapphire::Data::Exd Sapphire::Data::EObj::EObj( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_EObjDat.get_row( row_id ); + popType = exdData->getField< uint8_t >( row, 8 ); data = exdData->getField< uint32_t >( row, 9 ); + invisibility = exdData->getField< uint8_t >( row, 10 ); sgbPath = exdData->getField< uint16_t >( row, 11 ); + eyeCollision = exdData->getField< bool >( row, 12 ); + directorControl = exdData->getField< bool >( row, 13 ); + target = exdData->getField< bool >( row, 14 ); + eventHighAddition = exdData->getField< uint8_t >( row, 15 ); + addedIn53 = exdData->getField< bool >( row, 18 ); } Sapphire::Data::EObjName::EObjName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2234,6 +3178,61 @@ Sapphire::Data::EventAction::EventAction( uint32_t row_id, Sapphire::Data::ExdDa animation.push_back( exdData->getField< uint16_t >( row, 5 ) ); } +Sapphire::Data::EventCustomIconType::EventCustomIconType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EventCustomIconTypeDat.get_row( row_id ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 0 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 1 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 2 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 3 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 4 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 5 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 6 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 7 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 8 ) ); + announceQuest.push_back( exdData->getField< uint32_t >( row, 9 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 10 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 11 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 12 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 13 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 14 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 15 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 16 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 17 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 18 ) ); + announceQuestLocked.push_back( exdData->getField< uint32_t >( row, 19 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 20 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 21 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 22 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 23 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 24 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 25 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 26 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 27 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 28 ) ); + mapAnnounceQuest0.push_back( exdData->getField< uint32_t >( row, 29 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 30 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 31 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 32 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 33 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 34 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 35 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 36 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 37 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 38 ) ); + mapAnnounceQuestLocked.push_back( exdData->getField< uint32_t >( row, 39 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 40 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 41 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 42 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 43 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 44 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 45 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 46 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 47 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 48 ) ); + mapAnnounceQuest1.push_back( exdData->getField< uint32_t >( row, 49 ) ); +} + Sapphire::Data::EventIconPriority::EventIconPriority( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_EventIconPriorityDat.get_row( row_id ); @@ -2253,6 +3252,9 @@ Sapphire::Data::EventIconPriority::EventIconPriority( uint32_t row_id, Sapphire: icon.push_back( exdData->getField< uint32_t >( row, 13 ) ); icon.push_back( exdData->getField< uint32_t >( row, 14 ) ); icon.push_back( exdData->getField< uint32_t >( row, 15 ) ); + icon.push_back( exdData->getField< uint32_t >( row, 16 ) ); + icon.push_back( exdData->getField< uint32_t >( row, 17 ) ); + icon.push_back( exdData->getField< uint32_t >( row, 18 ) ); } Sapphire::Data::EventIconType::EventIconType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2281,6 +3283,8 @@ Sapphire::Data::EventItem::EventItem( uint32_t row_id, Sapphire::Data::ExdDataGe stackSize = exdData->getField< uint8_t >( row, 12 ); quest = exdData->getField< uint32_t >( row, 14 ); castTime = exdData->getField< uint8_t >( row, 15 ); + castTimeline = exdData->getField< uint8_t >( row, 16 ); + timeline = exdData->getField< uint8_t >( row, 17 ); } Sapphire::Data::EventItemCastTimeline::EventItemCastTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2301,6 +3305,21 @@ Sapphire::Data::EventItemTimeline::EventItemTimeline( uint32_t row_id, Sapphire: actionTimeline = exdData->getField< uint32_t >( row, 0 ); } +Sapphire::Data::EventSystemDefine::EventSystemDefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_EventSystemDefineDat.get_row( row_id ); + text = exdData->getField< std::string >( row, 0 ); + defineValue = exdData->getField< uint32_t >( row, 1 ); +} + +Sapphire::Data::ExportedGatheringPoint::ExportedGatheringPoint( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ExportedGatheringPointDat.get_row( row_id ); + x = exdData->getField< float >( row, 0 ); + y = exdData->getField< float >( row, 1 ); + radius = exdData->getField< uint8_t >( row, 2 ); +} + Sapphire::Data::ExportedSG::ExportedSG( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ExportedSGDat.get_row( row_id ); @@ -2311,39 +3330,165 @@ Sapphire::Data::ExVersion::ExVersion( uint32_t row_id, Sapphire::Data::ExdDataGe { auto row = exdData->m_ExVersionDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + acceptJingle = exdData->getField< uint16_t >( row, 1 ); + completeJingle = exdData->getField< uint16_t >( row, 2 ); } Sapphire::Data::Fate::Fate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FateDat.get_row( row_id ); - eurekaFate = exdData->getField< uint8_t >( row, 0 ); - location = exdData->getField< uint32_t >( row, 2 ); - classJobLevel = exdData->getField< uint8_t >( row, 3 ); - classJobLevelMax = exdData->getField< uint8_t >( row, 4 ); - eventItem = exdData->getField< uint32_t >( row, 5 ); - iconObjective = exdData->getField< uint32_t >( row, 9 ); - iconMap = exdData->getField< uint32_t >( row, 10 ); - music = exdData->getField< int32_t >( row, 12 ); - hasWorldMapIcon = exdData->getField< bool >( row, 17 ); - name = exdData->getField< std::string >( row, 25 ); - description = exdData->getField< std::string >( row, 26 ); - objective = exdData->getField< std::string >( row, 27 ); - statusText.push_back( exdData->getField< std::string >( row, 28 ) ); - statusText.push_back( exdData->getField< std::string >( row, 29 ) ); - statusText.push_back( exdData->getField< std::string >( row, 30 ) ); - arrayIndex = exdData->getField< uint32_t >( row, 31 ); + name = exdData->getField< std::string >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); + objective = exdData->getField< std::string >( row, 2 ); + statusText.push_back( exdData->getField< std::string >( row, 3 ) ); + statusText.push_back( exdData->getField< std::string >( row, 4 ) ); + statusText.push_back( exdData->getField< std::string >( row, 5 ) ); + eurekaFate = exdData->getField< uint8_t >( row, 6 ); + rule = exdData->getField< uint8_t >( row, 7 ); + fateRuleEx = exdData->getField< uint16_t >( row, 8 ); + location = exdData->getField< uint32_t >( row, 9 ); + classJobLevel = exdData->getField< uint8_t >( row, 10 ); + classJobLevelMax = exdData->getField< uint8_t >( row, 11 ); + eventItem = exdData->getField< uint32_t >( row, 12 ); + typeToDoValue.push_back( exdData->getField< uint8_t >( row, 13 ) ); + typeToDoValue.push_back( exdData->getField< uint8_t >( row, 14 ) ); + typeToDoValue.push_back( exdData->getField< uint8_t >( row, 15 ) ); + iconObjective = exdData->getField< uint32_t >( row, 16 ); + iconMap = exdData->getField< uint32_t >( row, 17 ); + iconInactiveMap = exdData->getField< uint32_t >( row, 18 ); + music = exdData->getField< int32_t >( row, 19 ); + lGBGuardNPCLocation = exdData->getField< uint32_t >( row, 20 ); + screenImageAccept = exdData->getField< uint16_t >( row, 21 ); + screenImageComplete = exdData->getField< uint16_t >( row, 22 ); + screenImageFailed = exdData->getField< uint16_t >( row, 23 ); + requiredQuest = exdData->getField< uint32_t >( row, 25 ); + specialFate = exdData->getField< bool >( row, 26 ); + givenStatus = exdData->getField< uint16_t >( row, 28 ); + adventEvent = exdData->getField< bool >( row, 30 ); + moonFaireEvent = exdData->getField< bool >( row, 31 ); + fATEChain = exdData->getField< uint32_t >( row, 33 ); + arrayIndex = exdData->getField< uint32_t >( row, 36 ); + reqEventItem = exdData->getField< uint32_t >( row, 38 ); + turnInEventItem = exdData->getField< uint32_t >( row, 39 ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 43 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 44 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 45 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 46 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 47 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 48 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 49 ) ); + objectiveIcon.push_back( exdData->getField< uint16_t >( row, 50 ) ); +} + +Sapphire::Data::FateEvent::FateEvent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FateEventDat.get_row( row_id ); + turn.push_back( exdData->getField< uint8_t >( row, 0 ) ); + turn.push_back( exdData->getField< uint8_t >( row, 1 ) ); + turn.push_back( exdData->getField< uint8_t >( row, 2 ) ); + turn.push_back( exdData->getField< uint8_t >( row, 3 ) ); + turn.push_back( exdData->getField< uint8_t >( row, 4 ) ); + turn.push_back( exdData->getField< uint8_t >( row, 5 ) ); + turn.push_back( exdData->getField< uint8_t >( row, 6 ) ); + turn.push_back( exdData->getField< uint8_t >( row, 7 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 8 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 9 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 10 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 11 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 12 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 13 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 14 ) ); + gesture.push_back( exdData->getField< uint32_t >( row, 15 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 16 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 17 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 18 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 19 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 20 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 21 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 22 ) ); + lipSync.push_back( exdData->getField< int32_t >( row, 23 ) ); + facial.push_back( exdData->getField< int32_t >( row, 24 ) ); + facial.push_back( exdData->getField< int32_t >( row, 25 ) ); + facial.push_back( exdData->getField< int32_t >( row, 26 ) ); + facial.push_back( exdData->getField< int32_t >( row, 27 ) ); + facial.push_back( exdData->getField< int32_t >( row, 28 ) ); + facial.push_back( exdData->getField< int32_t >( row, 29 ) ); + facial.push_back( exdData->getField< int32_t >( row, 30 ) ); + facial.push_back( exdData->getField< int32_t >( row, 31 ) ); + shape.push_back( exdData->getField< int32_t >( row, 32 ) ); + shape.push_back( exdData->getField< int32_t >( row, 33 ) ); + shape.push_back( exdData->getField< int32_t >( row, 34 ) ); + shape.push_back( exdData->getField< int32_t >( row, 35 ) ); + shape.push_back( exdData->getField< int32_t >( row, 36 ) ); + shape.push_back( exdData->getField< int32_t >( row, 37 ) ); + shape.push_back( exdData->getField< int32_t >( row, 38 ) ); + shape.push_back( exdData->getField< int32_t >( row, 39 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 40 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 41 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 42 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 43 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 44 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 45 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 46 ) ); + isAutoShake.push_back( exdData->getField< bool >( row, 47 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 48 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 49 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 50 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 51 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 52 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 53 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 54 ) ); + widgetType.push_back( exdData->getField< uint8_t >( row, 55 ) ); + text.push_back( exdData->getField< std::string >( row, 56 ) ); + text.push_back( exdData->getField< std::string >( row, 57 ) ); + text.push_back( exdData->getField< std::string >( row, 58 ) ); + text.push_back( exdData->getField< std::string >( row, 59 ) ); + text.push_back( exdData->getField< std::string >( row, 60 ) ); + text.push_back( exdData->getField< std::string >( row, 61 ) ); + text.push_back( exdData->getField< std::string >( row, 62 ) ); + text.push_back( exdData->getField< std::string >( row, 63 ) ); +} + +Sapphire::Data::FateMode::FateMode( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FateModeDat.get_row( row_id ); + motivationIcon = exdData->getField< uint32_t >( row, 1 ); + motivationMapMarker = exdData->getField< uint32_t >( row, 2 ); + objectiveIcon = exdData->getField< uint32_t >( row, 3 ); + objectiveMapMarker = exdData->getField< uint32_t >( row, 4 ); +} + +Sapphire::Data::FateProgressUI::FateProgressUI( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FateProgressUIDat.get_row( row_id ); + location = exdData->getField< int32_t >( row, 0 ); + achievement = exdData->getField< int32_t >( row, 1 ); + reqFatesToRank2 = exdData->getField< uint8_t >( row, 2 ); + reqFatesToRank3 = exdData->getField< uint8_t >( row, 3 ); + displayOrder = exdData->getField< uint8_t >( row, 4 ); +} + +Sapphire::Data::FateTokenType::FateTokenType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FateTokenTypeDat.get_row( row_id ); + currency = exdData->getField< uint32_t >( row, 0 ); } Sapphire::Data::FCActivity::FCActivity( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FCActivityDat.get_row( row_id ); text = exdData->getField< std::string >( row, 0 ); + selfKind = exdData->getField< uint8_t >( row, 1 ); + targetKind = exdData->getField< uint8_t >( row, 2 ); + numParam = exdData->getField< uint8_t >( row, 3 ); fCActivityCategory = exdData->getField< uint8_t >( row, 4 ); + iconType = exdData->getField< int8_t >( row, 5 ); } Sapphire::Data::FCActivityCategory::FCActivityCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FCActivityCategoryDat.get_row( row_id ); + priority = exdData->getField< uint8_t >( row, 0 ); name = exdData->getField< std::string >( row, 1 ); } @@ -2366,6 +3511,13 @@ Sapphire::Data::FCChestName::FCChestName( uint32_t row_id, Sapphire::Data::ExdDa name = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::FCCrestSymbol::FCCrestSymbol( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FCCrestSymbolDat.get_row( row_id ); + colorNum = exdData->getField< uint8_t >( row, 0 ); + fCRight = exdData->getField< uint8_t >( row, 1 ); +} + Sapphire::Data::FccShop::FccShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FccShopDat.get_row( row_id ); @@ -2381,14 +3533,27 @@ Sapphire::Data::FCHierarchy::FCHierarchy( uint32_t row_id, Sapphire::Data::ExdDa Sapphire::Data::FCProfile::FCProfile( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FCProfileDat.get_row( row_id ); + priority = exdData->getField< uint8_t >( row, 0 ); name = exdData->getField< std::string >( row, 1 ); } +Sapphire::Data::FCRank::FCRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FCRankDat.get_row( row_id ); + nextPoint = exdData->getField< uint32_t >( row, 0 ); + currentPoint = exdData->getField< uint32_t >( row, 1 ); + rights = exdData->getField< uint16_t >( row, 2 ); + fCActionActiveNum = exdData->getField< uint8_t >( row, 5 ); + fCActionStockNum = exdData->getField< uint8_t >( row, 6 ); +} + Sapphire::Data::FCReputation::FCReputation( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_FCReputationDat.get_row( row_id ); pointsToNext = exdData->getField< uint32_t >( row, 0 ); requiredPoints = exdData->getField< uint32_t >( row, 1 ); + discountRate = exdData->getField< uint8_t >( row, 2 ); + color = exdData->getField< uint32_t >( row, 3 ); name = exdData->getField< std::string >( row, 4 ); } @@ -2411,7 +3576,9 @@ Sapphire::Data::FieldMarker::FieldMarker( uint32_t row_id, Sapphire::Data::ExdDa { auto row = exdData->m_FieldMarkerDat.get_row( row_id ); vFX = exdData->getField< int32_t >( row, 0 ); - icon = exdData->getField< uint16_t >( row, 1 ); + uiIcon = exdData->getField< uint16_t >( row, 1 ); + mapIcon = exdData->getField< uint16_t >( row, 2 ); + name = exdData->getField< std::string >( row, 3 ); } Sapphire::Data::FishingRecordType::FishingRecordType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2437,12 +3604,13 @@ Sapphire::Data::FishingSpot::FishingSpot( uint32_t row_id, Sapphire::Data::ExdDa bigFishOnReach = exdData->getField< std::string >( row, 1 ); bigFishOnEnd = exdData->getField< std::string >( row, 2 ); fishingSpotCategory = exdData->getField< uint8_t >( row, 3 ); + rare = exdData->getField< bool >( row, 4 ); territoryType = exdData->getField< uint16_t >( row, 5 ); - x = exdData->getField< int16_t >( row, 6 ); - z = exdData->getField< int16_t >( row, 7 ); - radius = exdData->getField< uint16_t >( row, 8 ); - item.push_back( exdData->getField< int32_t >( row, 10 ) ); - item.push_back( exdData->getField< int32_t >( row, 11 ) ); + placeNameMain = exdData->getField< uint16_t >( row, 6 ); + placeNameSub = exdData->getField< uint16_t >( row, 7 ); + x = exdData->getField< int16_t >( row, 8 ); + z = exdData->getField< int16_t >( row, 9 ); + radius = exdData->getField< uint16_t >( row, 10 ); item.push_back( exdData->getField< int32_t >( row, 12 ) ); item.push_back( exdData->getField< int32_t >( row, 13 ) ); item.push_back( exdData->getField< int32_t >( row, 14 ) ); @@ -2451,8 +3619,10 @@ Sapphire::Data::FishingSpot::FishingSpot( uint32_t row_id, Sapphire::Data::ExdDa item.push_back( exdData->getField< int32_t >( row, 17 ) ); item.push_back( exdData->getField< int32_t >( row, 18 ) ); item.push_back( exdData->getField< int32_t >( row, 19 ) ); - placeName = exdData->getField< uint16_t >( row, 20 ); - order = exdData->getField< uint8_t >( row, 21 ); + item.push_back( exdData->getField< int32_t >( row, 20 ) ); + item.push_back( exdData->getField< int32_t >( row, 21 ) ); + placeName = exdData->getField< uint16_t >( row, 22 ); + order = exdData->getField< uint8_t >( row, 23 ); } Sapphire::Data::FishParameter::FishParameter( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2461,13 +3631,13 @@ Sapphire::Data::FishParameter::FishParameter( uint32_t row_id, Sapphire::Data::E text = exdData->getField< std::string >( row, 0 ); item = exdData->getField< int32_t >( row, 1 ); gatheringItemLevel = exdData->getField< uint16_t >( row, 2 ); - isHidden = exdData->getField< bool >( row, 3 ); - fishingRecordType = exdData->getField< uint8_t >( row, 5 ); - territoryType = exdData->getField< int32_t >( row, 6 ); - gatheringSubCategory = exdData->getField< uint16_t >( row, 7 ); - isInLog = exdData->getField< bool >( row, 8 ); - timeRestricted = exdData->getField< bool >( row, 9 ); - weatherRestricted = exdData->getField< bool >( row, 10 ); + isHidden = exdData->getField< bool >( row, 4 ); + fishingRecordType = exdData->getField< uint8_t >( row, 6 ); + territoryType = exdData->getField< int32_t >( row, 7 ); + gatheringSubCategory = exdData->getField< uint16_t >( row, 8 ); + isInLog = exdData->getField< bool >( row, 9 ); + timeRestricted = exdData->getField< bool >( row, 10 ); + weatherRestricted = exdData->getField< bool >( row, 11 ); } Sapphire::Data::Frontline03::Frontline03( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2493,40 +3663,29 @@ Sapphire::Data::Frontline04::Frontline04( uint32_t row_id, Sapphire::Data::ExdDa level1 = exdData->getField< int32_t >( row, 0 ); level2 = exdData->getField< int32_t >( row, 1 ); level3 = exdData->getField< int32_t >( row, 2 ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 6 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 7 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 8 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 9 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 10 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 11 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 12 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 13 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 14 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 15 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 16 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 17 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 18 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 19 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 20 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 21 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 22 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 23 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 24 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 25 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 26 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 27 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 28 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 29 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 30 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 31 ) ); - unknownLevel.push_back( exdData->getField< int32_t >( row, 32 ) ); +} + +Sapphire::Data::FurnitureCatalogCategory::FurnitureCatalogCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FurnitureCatalogCategoryDat.get_row( row_id ); + category = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::FurnitureCatalogItemList::FurnitureCatalogItemList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_FurnitureCatalogItemListDat.get_row( row_id ); + category = exdData->getField< uint16_t >( row, 0 ); + item = exdData->getField< int32_t >( row, 1 ); + patch = exdData->getField< uint16_t >( row, 2 ); } Sapphire::Data::GardeningSeed::GardeningSeed( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GardeningSeedDat.get_row( row_id ); item = exdData->getField< uint32_t >( row, 0 ); + modelID = exdData->getField< uint16_t >( row, 1 ); icon = exdData->getField< uint32_t >( row, 2 ); + sE = exdData->getField< bool >( row, 3 ); } Sapphire::Data::GatheringCondition::GatheringCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2538,7 +3697,7 @@ Sapphire::Data::GatheringCondition::GatheringCondition( uint32_t row_id, Sapphir Sapphire::Data::GatheringExp::GatheringExp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GatheringExpDat.get_row( row_id ); - exp = exdData->getField< uint16_t >( row, 0 ); + exp = exdData->getField< int32_t >( row, 0 ); } Sapphire::Data::GatheringItem::GatheringItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2546,7 +3705,7 @@ Sapphire::Data::GatheringItem::GatheringItem( uint32_t row_id, Sapphire::Data::E auto row = exdData->m_GatheringItemDat.get_row( row_id ); item = exdData->getField< int32_t >( row, 0 ); gatheringItemLevel = exdData->getField< uint16_t >( row, 1 ); - isHidden = exdData->getField< bool >( row, 3 ); + isHidden = exdData->getField< bool >( row, 4 ); } Sapphire::Data::GatheringItemLevelConvertTable::GatheringItemLevelConvertTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2565,9 +3724,25 @@ Sapphire::Data::GatheringItemPoint::GatheringItemPoint( uint32_t row_id, uint32_ Sapphire::Data::GatheringLeve::GatheringLeve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GatheringLeveDat.get_row( row_id ); - requiredItem1 = exdData->getField< int32_t >( row, 4 ); - leveLevel = exdData->getField< uint8_t >( row, 5 ); - requiredItem2 = exdData->getField< int32_t >( row, 6 ); + route.push_back( exdData->getField< int32_t >( row, 0 ) ); + route.push_back( exdData->getField< int32_t >( row, 1 ) ); + route.push_back( exdData->getField< int32_t >( row, 2 ) ); + route.push_back( exdData->getField< int32_t >( row, 3 ) ); + requiredItem0 = exdData->getField< int32_t >( row, 4 ); + requiredItemQty0 = exdData->getField< uint8_t >( row, 5 ); + requiredItem1 = exdData->getField< int32_t >( row, 6 ); + requiredItemQty1 = exdData->getField< uint8_t >( row, 7 ); + requiredItem2 = exdData->getField< int32_t >( row, 8 ); + requiredItemQty2 = exdData->getField< uint8_t >( row, 9 ); + requiredItem3 = exdData->getField< int32_t >( row, 10 ); + requiredItemQty3 = exdData->getField< uint8_t >( row, 11 ); + itemNumber = exdData->getField< uint8_t >( row, 12 ); + rule = exdData->getField< int32_t >( row, 13 ); + varient = exdData->getField< uint8_t >( row, 14 ); + objective0 = exdData->getField< uint16_t >( row, 15 ); + objective1 = exdData->getField< uint16_t >( row, 16 ); + bNpcEntry = exdData->getField< int32_t >( row, 17 ); + useSecondaryTool = exdData->getField< bool >( row, 18 ); } Sapphire::Data::GatheringLeveRoute::GatheringLeveRoute( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2575,6 +3750,12 @@ Sapphire::Data::GatheringLeveRoute::GatheringLeveRoute( uint32_t row_id, Sapphir auto row = exdData->m_GatheringLeveRouteDat.get_row( row_id ); } +Sapphire::Data::GatheringLeveRule::GatheringLeveRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GatheringLeveRuleDat.get_row( row_id ); + rule = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::GatheringNotebookList::GatheringNotebookList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GatheringNotebookListDat.get_row( row_id ); @@ -2683,7 +3864,9 @@ Sapphire::Data::GatheringNotebookList::GatheringNotebookList( uint32_t row_id, S Sapphire::Data::GatheringPoint::GatheringPoint( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GatheringPointDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); gatheringPointBase = exdData->getField< int32_t >( row, 1 ); + count = exdData->getField< uint8_t >( row, 2 ); gatheringPointBonus.push_back( exdData->getField< uint16_t >( row, 3 ) ); gatheringPointBonus.push_back( exdData->getField< uint16_t >( row, 4 ) ); territoryType = exdData->getField< uint16_t >( row, 5 ); @@ -2711,7 +3894,7 @@ Sapphire::Data::GatheringPointBonus::GatheringPointBonus( uint32_t row_id, Sapph { auto row = exdData->m_GatheringPointBonusDat.get_row( row_id ); condition = exdData->getField< uint8_t >( row, 0 ); - conditionValue = exdData->getField< uint16_t >( row, 1 ); + conditionValue = exdData->getField< uint32_t >( row, 1 ); bonusType = exdData->getField< uint8_t >( row, 3 ); bonusValue = exdData->getField< uint16_t >( row, 4 ); } @@ -2734,9 +3917,25 @@ Sapphire::Data::GatheringPointName::GatheringPointName( uint32_t row_id, Sapphir article = exdData->getField< int8_t >( row, 7 ); } +Sapphire::Data::GatheringPointTransient::GatheringPointTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GatheringPointTransientDat.get_row( row_id ); + ephemeralStartTime = exdData->getField< uint16_t >( row, 0 ); + ephemeralEndTime = exdData->getField< uint16_t >( row, 1 ); + gatheringRarePopTimeTable = exdData->getField< int32_t >( row, 2 ); +} + +Sapphire::Data::GatheringRarePopTimeTable::GatheringRarePopTimeTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GatheringRarePopTimeTableDat.get_row( row_id ); +} + Sapphire::Data::GatheringSubCategory::GatheringSubCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GatheringSubCategoryDat.get_row( row_id ); + gatheringType = exdData->getField< uint8_t >( row, 0 ); + classJob = exdData->getField< uint8_t >( row, 1 ); + division = exdData->getField< uint16_t >( row, 3 ); item = exdData->getField< int32_t >( row, 4 ); folkloreBook = exdData->getField< std::string >( row, 5 ); } @@ -2760,6 +3959,18 @@ Sapphire::Data::GcArmyCaptureTactics::GcArmyCaptureTactics( uint32_t row_id, Sap icon = exdData->getField< uint32_t >( row, 5 ); } +Sapphire::Data::GcArmyEquipPreset::GcArmyEquipPreset( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GcArmyEquipPresetDat.get_row( row_id ); + mainHand = exdData->getField< int32_t >( row, 0 ); + offHand = exdData->getField< int32_t >( row, 1 ); + head = exdData->getField< int32_t >( row, 2 ); + body = exdData->getField< int32_t >( row, 3 ); + gloves = exdData->getField< int32_t >( row, 4 ); + legs = exdData->getField< int32_t >( row, 5 ); + feet = exdData->getField< int32_t >( row, 6 ); +} + Sapphire::Data::GcArmyExpedition::GcArmyExpedition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GcArmyExpeditionDat.get_row( row_id ); @@ -2792,6 +4003,246 @@ Sapphire::Data::GcArmyMemberGrow::GcArmyMemberGrow( uint32_t row_id, Sapphire::D auto row = exdData->m_GcArmyMemberGrowDat.get_row( row_id ); classJob = exdData->getField< uint8_t >( row, 0 ); classBook = exdData->getField< int32_t >( row, 1 ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 2 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 3 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 4 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 5 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 6 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 7 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 8 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 9 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 10 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 11 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 12 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 13 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 14 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 15 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 16 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 17 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 18 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 19 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 20 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 21 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 22 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 23 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 24 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 25 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 26 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 27 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 28 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 29 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 30 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 31 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 32 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 33 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 34 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 35 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 36 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 37 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 38 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 39 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 40 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 41 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 42 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 43 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 44 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 45 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 46 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 47 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 48 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 49 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 50 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 51 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 52 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 53 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 54 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 55 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 56 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 57 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 58 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 59 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 60 ) ); + equipPreset.push_back( exdData->getField< uint16_t >( row, 61 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 63 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 64 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 65 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 66 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 67 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 68 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 69 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 70 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 71 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 72 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 73 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 74 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 75 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 76 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 77 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 78 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 79 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 80 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 81 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 82 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 83 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 84 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 85 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 86 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 87 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 88 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 89 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 90 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 91 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 92 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 93 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 94 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 95 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 96 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 97 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 98 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 99 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 100 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 101 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 102 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 103 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 104 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 105 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 106 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 107 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 108 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 109 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 110 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 111 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 112 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 113 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 114 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 115 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 116 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 117 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 118 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 119 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 120 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 121 ) ); + physical.push_back( exdData->getField< uint8_t >( row, 122 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 124 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 125 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 126 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 127 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 128 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 129 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 130 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 131 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 132 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 133 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 134 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 135 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 136 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 137 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 138 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 139 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 140 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 141 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 142 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 143 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 144 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 145 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 146 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 147 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 148 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 149 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 150 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 151 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 152 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 153 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 154 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 155 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 156 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 157 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 158 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 159 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 160 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 161 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 162 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 163 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 164 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 165 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 166 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 167 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 168 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 169 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 170 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 171 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 172 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 173 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 174 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 175 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 176 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 177 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 178 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 179 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 180 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 181 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 182 ) ); + mental.push_back( exdData->getField< uint8_t >( row, 183 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 185 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 186 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 187 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 188 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 189 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 190 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 191 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 192 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 193 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 194 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 195 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 196 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 197 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 198 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 199 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 200 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 201 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 202 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 203 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 204 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 205 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 206 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 207 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 208 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 209 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 210 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 211 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 212 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 213 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 214 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 215 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 216 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 217 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 218 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 219 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 220 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 221 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 222 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 223 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 224 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 225 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 226 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 227 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 228 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 229 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 230 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 231 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 232 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 233 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 234 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 235 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 236 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 237 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 238 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 239 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 240 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 241 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 242 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 243 ) ); + tactical.push_back( exdData->getField< uint8_t >( row, 244 ) ); } Sapphire::Data::GcArmyTraining::GcArmyTraining( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -2934,6 +4385,8 @@ Sapphire::Data::GeneralAction::GeneralAction( uint32_t row_id, Sapphire::Data::E description = exdData->getField< std::string >( row, 1 ); action = exdData->getField< uint16_t >( row, 3 ); unlockLink = exdData->getField< uint16_t >( row, 4 ); + recast = exdData->getField< uint8_t >( row, 5 ); + uIPriority = exdData->getField< uint8_t >( row, 6 ); icon = exdData->getField< int32_t >( row, 7 ); } @@ -2987,6 +4440,7 @@ Sapphire::Data::GilShop::GilShop( uint32_t row_id, Sapphire::Data::ExdDataGenera auto row = exdData->m_GilShopDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); icon = exdData->getField< uint32_t >( row, 1 ); + quest = exdData->getField< uint32_t >( row, 2 ); acceptTalk = exdData->getField< int32_t >( row, 3 ); failTalk = exdData->getField< int32_t >( row, 4 ); } @@ -2995,13 +4449,42 @@ Sapphire::Data::GilShopItem::GilShopItem( uint32_t row_id, uint32_t subRow, Sapp { auto row = exdData->m_GilShopItemDat.get_row( row_id, subRow ); item = exdData->getField< int32_t >( row, 0 ); - rowRequired.push_back( exdData->getField< int32_t >( row, 3 ) ); - rowRequired.push_back( exdData->getField< int32_t >( row, 4 ) ); - rowRequired.push_back( exdData->getField< int32_t >( row, 5 ) ); + questRequired.push_back( exdData->getField< int32_t >( row, 3 ) ); + questRequired.push_back( exdData->getField< int32_t >( row, 4 ) ); + achievementRequired = exdData->getField< int32_t >( row, 5 ); stateRequired = exdData->getField< uint16_t >( row, 7 ); patch = exdData->getField< uint16_t >( row, 8 ); } +Sapphire::Data::GimmickAccessor::GimmickAccessor( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GimmickAccessorDat.get_row( row_id ); + param0 = exdData->getField< int32_t >( row, 0 ); + param1 = exdData->getField< uint32_t >( row, 1 ); + param2 = exdData->getField< uint32_t >( row, 2 ); + type = exdData->getField< uint32_t >( row, 3 ); +} + +Sapphire::Data::GimmickJump::GimmickJump( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GimmickJumpDat.get_row( row_id ); + fallDamage = exdData->getField< uint16_t >( row, 0 ); + height = exdData->getField< int8_t >( row, 1 ); + loopMotion = exdData->getField< uint32_t >( row, 2 ); + endMotion = exdData->getField< uint32_t >( row, 3 ); + startClient = exdData->getField< bool >( row, 4 ); +} + +Sapphire::Data::GimmickRect::GimmickRect( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GimmickRectDat.get_row( row_id ); + layoutID = exdData->getField< uint32_t >( row, 0 ); + triggerIn = exdData->getField< uint8_t >( row, 1 ); + param0 = exdData->getField< uint32_t >( row, 2 ); + triggerOut = exdData->getField< uint8_t >( row, 6 ); + param1 = exdData->getField< uint32_t >( row, 7 ); +} + Sapphire::Data::GoldSaucerArcadeMachine::GoldSaucerArcadeMachine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GoldSaucerArcadeMachineDat.get_row( row_id ); @@ -3039,6 +4522,28 @@ Sapphire::Data::GrandCompanyRank::GrandCompanyRank( uint32_t row_id, Sapphire::D questFlames = exdData->getField< int32_t >( row, 9 ); } +Sapphire::Data::GroupPoseFrame::GroupPoseFrame( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GroupPoseFrameDat.get_row( row_id ); + image = exdData->getField< int32_t >( row, 1 ); + gridText = exdData->getField< std::string >( row, 2 ); + text = exdData->getField< std::string >( row, 7 ); +} + +Sapphire::Data::GroupPoseStamp::GroupPoseStamp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GroupPoseStampDat.get_row( row_id ); + stampIcon = exdData->getField< int32_t >( row, 0 ); + category = exdData->getField< int32_t >( row, 2 ); + name = exdData->getField< std::string >( row, 8 ); +} + +Sapphire::Data::GroupPoseStampCategory::GroupPoseStampCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GroupPoseStampCategoryDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 1 ); +} + Sapphire::Data::GuardianDeity::GuardianDeity( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GuardianDeityDat.get_row( row_id ); @@ -3047,12 +4552,41 @@ Sapphire::Data::GuardianDeity::GuardianDeity( uint32_t row_id, Sapphire::Data::E icon = exdData->getField< uint16_t >( row, 2 ); } +Sapphire::Data::Guide::Guide( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GuideDat.get_row( row_id ); + guideTitle = exdData->getField< uint16_t >( row, 0 ); + guidePage = exdData->getField< uint16_t >( row, 1 ); +} + +Sapphire::Data::GuidePage::GuidePage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GuidePageDat.get_row( row_id, subRow ); + key = exdData->getField< uint8_t >( row, 0 ); + output = exdData->getField< uint32_t >( row, 1 ); +} + +Sapphire::Data::GuidePageString::GuidePageString( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GuidePageStringDat.get_row( row_id ); + string = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::GuideTitle::GuideTitle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GuideTitleDat.get_row( row_id ); + title = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::GuildleveAssignment::GuildleveAssignment( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GuildleveAssignmentDat.get_row( row_id ); - assignmentTalk = exdData->getField< uint32_t >( row, 1 ); - quest.push_back( exdData->getField< uint32_t >( row, 2 ) ); + type = exdData->getField< std::string >( row, 0 ); + typeId = exdData->getField< uint8_t >( row, 1 ); + assignmentTalk = exdData->getField< uint32_t >( row, 2 ); quest.push_back( exdData->getField< uint32_t >( row, 3 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 4 ) ); + grandCompanyRank = exdData->getField< uint8_t >( row, 10 ); } Sapphire::Data::GuildleveAssignmentCategory::GuildleveAssignmentCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3068,6 +4602,19 @@ Sapphire::Data::GuildleveAssignmentCategory::GuildleveAssignmentCategory( uint32 category.push_back( exdData->getField< int32_t >( row, 7 ) ); } +Sapphire::Data::GuildleveAssignmentTalk::GuildleveAssignmentTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_GuildleveAssignmentTalkDat.get_row( row_id ); + talk.push_back( exdData->getField< std::string >( row, 30 ) ); + talk.push_back( exdData->getField< std::string >( row, 31 ) ); + talk.push_back( exdData->getField< std::string >( row, 32 ) ); + talk.push_back( exdData->getField< std::string >( row, 33 ) ); + talk.push_back( exdData->getField< std::string >( row, 34 ) ); + talk.push_back( exdData->getField< std::string >( row, 35 ) ); + talk.push_back( exdData->getField< std::string >( row, 36 ) ); + talk.push_back( exdData->getField< std::string >( row, 37 ) ); +} + Sapphire::Data::GuildOrder::GuildOrder( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_GuildOrderDat.get_row( row_id ); @@ -3422,17 +4969,20 @@ Sapphire::Data::HousingYardObject::HousingYardObject( uint32_t row_id, Sapphire: Sapphire::Data::HowTo::HowTo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HowToDat.get_row( row_id ); - images.push_back( exdData->getField< int16_t >( row, 2 ) ); - images.push_back( exdData->getField< int16_t >( row, 3 ) ); - images.push_back( exdData->getField< int16_t >( row, 4 ) ); - images.push_back( exdData->getField< int16_t >( row, 5 ) ); - images.push_back( exdData->getField< int16_t >( row, 6 ) ); - images.push_back( exdData->getField< int16_t >( row, 7 ) ); - images.push_back( exdData->getField< int16_t >( row, 8 ) ); - images.push_back( exdData->getField< int16_t >( row, 9 ) ); - images.push_back( exdData->getField< int16_t >( row, 10 ) ); - images.push_back( exdData->getField< int16_t >( row, 11 ) ); + name = exdData->getField< std::string >( row, 0 ); + announce = exdData->getField< bool >( row, 1 ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 2 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 3 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 4 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 5 ) ); + howToPagePC.push_back( exdData->getField< int16_t >( row, 6 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 7 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 8 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 9 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 10 ) ); + howToPageController.push_back( exdData->getField< int16_t >( row, 11 ) ); category = exdData->getField< int8_t >( row, 12 ); + sort = exdData->getField< uint8_t >( row, 13 ); } Sapphire::Data::HowToCategory::HowToCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3444,7 +4994,1114 @@ Sapphire::Data::HowToCategory::HowToCategory( uint32_t row_id, Sapphire::Data::E Sapphire::Data::HowToPage::HowToPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_HowToPageDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); + iconType = exdData->getField< uint8_t >( row, 1 ); image = exdData->getField< int32_t >( row, 2 ); + textType = exdData->getField< uint8_t >( row, 3 ); + text.push_back( exdData->getField< std::string >( row, 4 ) ); + text.push_back( exdData->getField< std::string >( row, 5 ) ); + text.push_back( exdData->getField< std::string >( row, 6 ) ); +} + +Sapphire::Data::HugeCraftworksNpc::HugeCraftworksNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HugeCraftworksNpcDat.get_row( row_id ); + eNpcResident = exdData->getField< uint32_t >( row, 0 ); + classJobCategory = exdData->getField< uint16_t >( row, 1 ); + itemRequested.push_back( exdData->getField< uint32_t >( row, 3 ) ); + itemRequested.push_back( exdData->getField< uint32_t >( row, 4 ) ); + itemRequested.push_back( exdData->getField< uint32_t >( row, 5 ) ); + itemRequested.push_back( exdData->getField< uint32_t >( row, 6 ) ); + qtyRequested.push_back( exdData->getField< uint8_t >( row, 9 ) ); + qtyRequested.push_back( exdData->getField< uint8_t >( row, 10 ) ); + qtyRequested.push_back( exdData->getField< uint8_t >( row, 11 ) ); + qtyRequested.push_back( exdData->getField< uint8_t >( row, 12 ) ); + itemReward.push_back( exdData->getField< uint32_t >( row, 52 ) ); + itemReward.push_back( exdData->getField< uint32_t >( row, 53 ) ); + itemReward.push_back( exdData->getField< uint32_t >( row, 54 ) ); + itemReward.push_back( exdData->getField< uint32_t >( row, 55 ) ); + qtyItemReward.push_back( exdData->getField< uint8_t >( row, 64 ) ); + qtyItemReward.push_back( exdData->getField< uint8_t >( row, 65 ) ); + qtyItemReward.push_back( exdData->getField< uint8_t >( row, 66 ) ); + qtyItemReward.push_back( exdData->getField< uint8_t >( row, 67 ) ); + itemUnkown.push_back( exdData->getField< uint32_t >( row, 70 ) ); + itemUnkown.push_back( exdData->getField< uint32_t >( row, 71 ) ); + itemUnkown.push_back( exdData->getField< uint32_t >( row, 72 ) ); + itemUnkown.push_back( exdData->getField< uint32_t >( row, 73 ) ); + qtyItemUnkown.push_back( exdData->getField< uint8_t >( row, 82 ) ); + qtyItemUnkown.push_back( exdData->getField< uint8_t >( row, 83 ) ); + qtyItemUnkown.push_back( exdData->getField< uint8_t >( row, 84 ) ); + qtyItemUnkown.push_back( exdData->getField< uint8_t >( row, 85 ) ); + transient = exdData->getField< std::string >( row, 86 ); +} + +Sapphire::Data::HugeCraftworksRank::HugeCraftworksRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HugeCraftworksRankDat.get_row( row_id ); + crafterLevel = exdData->getField< uint8_t >( row, 0 ); + expRewardPerItem = exdData->getField< uint32_t >( row, 1 ); +} + +Sapphire::Data::HWDAnnounce::HWDAnnounce( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDAnnounceDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); + eNPC = exdData->getField< uint32_t >( row, 1 ); +} + +Sapphire::Data::HWDCrafterSupply::HWDCrafterSupply( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDCrafterSupplyDat.get_row( row_id ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 0 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 1 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 2 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 3 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 4 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 5 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 6 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 7 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 8 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 9 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 10 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 11 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 12 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 13 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 14 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 15 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 16 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 17 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 18 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 19 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 20 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 21 ) ); + itemTradeIn.push_back( exdData->getField< uint32_t >( row, 22 ) ); + level.push_back( exdData->getField< uint8_t >( row, 23 ) ); + level.push_back( exdData->getField< uint8_t >( row, 24 ) ); + level.push_back( exdData->getField< uint8_t >( row, 25 ) ); + level.push_back( exdData->getField< uint8_t >( row, 26 ) ); + level.push_back( exdData->getField< uint8_t >( row, 27 ) ); + level.push_back( exdData->getField< uint8_t >( row, 28 ) ); + level.push_back( exdData->getField< uint8_t >( row, 29 ) ); + level.push_back( exdData->getField< uint8_t >( row, 30 ) ); + level.push_back( exdData->getField< uint8_t >( row, 31 ) ); + level.push_back( exdData->getField< uint8_t >( row, 32 ) ); + level.push_back( exdData->getField< uint8_t >( row, 33 ) ); + level.push_back( exdData->getField< uint8_t >( row, 34 ) ); + level.push_back( exdData->getField< uint8_t >( row, 35 ) ); + level.push_back( exdData->getField< uint8_t >( row, 36 ) ); + level.push_back( exdData->getField< uint8_t >( row, 37 ) ); + level.push_back( exdData->getField< uint8_t >( row, 38 ) ); + level.push_back( exdData->getField< uint8_t >( row, 39 ) ); + level.push_back( exdData->getField< uint8_t >( row, 40 ) ); + level.push_back( exdData->getField< uint8_t >( row, 41 ) ); + level.push_back( exdData->getField< uint8_t >( row, 42 ) ); + level.push_back( exdData->getField< uint8_t >( row, 43 ) ); + level.push_back( exdData->getField< uint8_t >( row, 44 ) ); + level.push_back( exdData->getField< uint8_t >( row, 45 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 46 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 47 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 48 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 49 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 50 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 51 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 52 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 53 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 54 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 55 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 56 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 57 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 58 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 59 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 60 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 61 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 62 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 63 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 64 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 65 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 66 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 67 ) ); + levelMax.push_back( exdData->getField< uint8_t >( row, 68 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 92 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 93 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 94 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 95 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 96 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 97 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 98 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 99 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 100 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 101 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 102 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 103 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 104 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 105 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 106 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 107 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 108 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 109 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 110 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 111 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 112 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 113 ) ); + baseCollectableRating.push_back( exdData->getField< uint16_t >( row, 114 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 115 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 116 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 117 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 118 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 119 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 120 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 121 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 122 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 123 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 124 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 125 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 126 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 127 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 128 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 129 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 130 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 131 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 132 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 133 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 134 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 135 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 136 ) ); + midCollectableRating.push_back( exdData->getField< uint16_t >( row, 137 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 138 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 139 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 140 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 141 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 142 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 143 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 144 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 145 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 146 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 147 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 148 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 149 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 150 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 151 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 152 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 153 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 154 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 155 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 156 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 157 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 158 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 159 ) ); + highCollectableRating.push_back( exdData->getField< uint16_t >( row, 160 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 161 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 162 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 163 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 164 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 165 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 166 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 167 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 168 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 169 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 170 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 171 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 172 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 173 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 174 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 175 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 176 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 177 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 178 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 179 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 180 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 181 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 182 ) ); + baseCollectableReward.push_back( exdData->getField< uint16_t >( row, 183 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 184 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 185 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 186 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 187 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 188 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 189 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 190 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 191 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 192 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 193 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 194 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 195 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 196 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 197 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 198 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 199 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 200 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 201 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 202 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 203 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 204 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 205 ) ); + midCollectableReward.push_back( exdData->getField< uint16_t >( row, 206 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 207 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 208 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 209 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 210 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 211 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 212 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 213 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 214 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 215 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 216 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 217 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 218 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 219 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 220 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 221 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 222 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 223 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 224 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 225 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 226 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 227 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 228 ) ); + highCollectableReward.push_back( exdData->getField< uint16_t >( row, 229 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 230 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 231 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 232 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 233 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 234 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 235 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 236 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 237 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 238 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 239 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 240 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 241 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 242 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 243 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 244 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 245 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 246 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 247 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 248 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 249 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 250 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 251 ) ); + baseCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 252 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 253 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 254 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 255 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 256 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 257 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 258 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 259 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 260 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 261 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 262 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 263 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 264 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 265 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 266 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 267 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 268 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 269 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 270 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 271 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 272 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 273 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 274 ) ); + midCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 275 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 276 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 277 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 278 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 279 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 280 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 281 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 282 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 283 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 284 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 285 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 286 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 287 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 288 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 289 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 290 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 291 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 292 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 293 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 294 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 295 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 296 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 297 ) ); + highCollectableRewardPostPhase.push_back( exdData->getField< uint16_t >( row, 298 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 299 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 300 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 301 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 302 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 303 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 304 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 305 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 306 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 307 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 308 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 309 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 310 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 311 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 312 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 313 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 314 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 315 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 316 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 317 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 318 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 319 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 320 ) ); + termName.push_back( exdData->getField< uint8_t >( row, 321 ) ); +} + +Sapphire::Data::HWDCrafterSupplyReward::HWDCrafterSupplyReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDCrafterSupplyRewardDat.get_row( row_id ); + scriptRewardAmount = exdData->getField< uint16_t >( row, 0 ); + expReward = exdData->getField< uint32_t >( row, 1 ); + Points = exdData->getField< uint16_t >( row, 2 ); +} + +Sapphire::Data::HWDCrafterSupplyTerm::HWDCrafterSupplyTerm( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDCrafterSupplyTermDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::HWDDevLayerControl::HWDDevLayerControl( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDDevLayerControlDat.get_row( row_id ); +} + +Sapphire::Data::HWDDevLevelUI::HWDDevLevelUI( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDDevLevelUIDat.get_row( row_id ); +} + +Sapphire::Data::HWDDevLively::HWDDevLively( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDDevLivelyDat.get_row( row_id, subRow ); + eNPC = exdData->getField< uint32_t >( row, 0 ); +} + +Sapphire::Data::HWDDevProgress::HWDDevProgress( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDDevProgressDat.get_row( row_id ); + canGoNext = exdData->getField< bool >( row, 0 ); +} + +Sapphire::Data::HWDGathereInspectTerm::HWDGathereInspectTerm( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDGathereInspectTermDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::HWDGathererInspection::HWDGathererInspection( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDGathererInspectionDat.get_row( row_id ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 0 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 1 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 2 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 3 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 4 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 5 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 6 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 7 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 8 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 9 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 10 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 11 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 12 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 13 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 14 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 15 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 16 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 17 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 18 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 19 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 20 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 21 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 22 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 23 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 24 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 25 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 26 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 27 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 28 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 29 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 30 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 31 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 32 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 33 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 34 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 35 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 36 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 37 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 38 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 39 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 40 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 41 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 42 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 43 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 44 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 45 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 46 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 47 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 48 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 49 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 50 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 51 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 52 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 53 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 54 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 55 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 56 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 57 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 58 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 59 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 60 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 61 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 62 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 63 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 64 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 65 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 66 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 67 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 68 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 69 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 70 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 71 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 72 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 73 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 74 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 75 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 76 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 77 ) ); + itemRequired.push_back( exdData->getField< uint32_t >( row, 78 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 79 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 80 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 81 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 82 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 83 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 84 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 85 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 86 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 87 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 88 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 89 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 90 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 91 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 92 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 93 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 94 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 95 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 96 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 97 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 98 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 99 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 100 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 101 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 102 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 103 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 104 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 105 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 106 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 107 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 108 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 109 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 110 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 111 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 112 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 113 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 114 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 115 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 116 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 117 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 118 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 119 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 120 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 121 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 122 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 123 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 124 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 125 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 126 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 127 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 128 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 129 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 130 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 131 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 132 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 133 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 134 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 135 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 136 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 137 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 138 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 139 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 140 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 141 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 142 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 143 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 144 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 145 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 146 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 147 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 148 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 149 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 150 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 151 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 152 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 153 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 154 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 155 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 156 ) ); + fishParameter.push_back( exdData->getField< uint32_t >( row, 157 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 158 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 159 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 160 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 161 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 162 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 163 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 164 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 165 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 166 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 167 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 168 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 169 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 170 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 171 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 172 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 173 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 174 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 175 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 176 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 177 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 178 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 179 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 180 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 181 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 182 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 183 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 184 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 185 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 186 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 187 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 188 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 189 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 190 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 191 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 192 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 193 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 194 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 195 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 196 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 197 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 198 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 199 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 200 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 201 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 202 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 203 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 204 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 205 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 206 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 207 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 208 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 209 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 210 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 211 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 212 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 213 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 214 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 215 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 216 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 217 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 218 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 219 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 220 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 221 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 222 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 223 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 224 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 225 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 226 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 227 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 228 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 229 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 230 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 231 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 232 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 233 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 234 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 235 ) ); + amountRequired.push_back( exdData->getField< uint8_t >( row, 236 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 237 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 238 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 239 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 240 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 241 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 242 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 243 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 244 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 245 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 246 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 247 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 248 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 249 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 250 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 251 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 252 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 253 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 254 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 255 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 256 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 257 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 258 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 259 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 260 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 261 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 262 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 263 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 264 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 265 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 266 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 267 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 268 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 269 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 270 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 271 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 272 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 273 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 274 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 275 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 276 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 277 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 278 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 279 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 280 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 281 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 282 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 283 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 284 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 285 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 286 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 287 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 288 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 289 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 290 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 291 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 292 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 293 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 294 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 295 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 296 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 297 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 298 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 299 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 300 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 301 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 302 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 303 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 304 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 305 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 306 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 307 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 308 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 309 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 310 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 311 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 312 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 313 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 314 ) ); + itemReceived.push_back( exdData->getField< uint32_t >( row, 315 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 316 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 317 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 318 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 319 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 320 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 321 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 322 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 323 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 324 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 325 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 326 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 327 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 328 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 329 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 330 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 331 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 332 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 333 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 334 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 335 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 336 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 337 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 338 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 339 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 340 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 341 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 342 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 343 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 344 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 345 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 346 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 347 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 348 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 349 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 350 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 351 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 352 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 353 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 354 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 355 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 356 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 357 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 358 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 359 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 360 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 361 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 362 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 363 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 364 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 365 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 366 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 367 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 368 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 369 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 370 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 371 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 372 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 373 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 374 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 375 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 376 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 377 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 378 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 379 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 380 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 381 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 382 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 383 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 384 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 385 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 386 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 387 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 388 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 389 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 390 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 391 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 392 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 393 ) ); + reward1.push_back( exdData->getField< uint16_t >( row, 394 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 395 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 396 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 397 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 398 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 399 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 400 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 401 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 402 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 403 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 404 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 405 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 406 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 407 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 408 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 409 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 410 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 411 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 412 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 413 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 414 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 415 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 416 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 417 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 418 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 419 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 420 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 421 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 422 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 423 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 424 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 425 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 426 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 427 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 428 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 429 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 430 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 431 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 432 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 433 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 434 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 435 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 436 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 437 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 438 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 439 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 440 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 441 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 442 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 443 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 444 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 445 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 446 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 447 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 448 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 449 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 450 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 451 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 452 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 453 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 454 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 455 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 456 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 457 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 458 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 459 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 460 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 461 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 462 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 463 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 464 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 465 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 466 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 467 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 468 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 469 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 470 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 471 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 472 ) ); + reward2.push_back( exdData->getField< uint16_t >( row, 473 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 474 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 475 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 476 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 477 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 478 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 479 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 480 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 481 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 482 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 483 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 484 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 485 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 486 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 487 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 488 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 489 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 490 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 491 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 492 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 493 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 494 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 495 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 496 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 497 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 498 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 499 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 500 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 501 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 502 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 503 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 504 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 505 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 506 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 507 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 508 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 509 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 510 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 511 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 512 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 513 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 514 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 515 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 516 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 517 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 518 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 519 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 520 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 521 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 522 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 523 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 524 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 525 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 526 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 527 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 528 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 529 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 530 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 531 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 532 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 533 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 534 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 535 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 536 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 537 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 538 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 539 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 540 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 541 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 542 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 543 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 544 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 545 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 546 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 547 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 548 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 549 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 550 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 551 ) ); + phase.push_back( exdData->getField< uint8_t >( row, 552 ) ); +} + +Sapphire::Data::HWDGathererInspectionReward::HWDGathererInspectionReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDGathererInspectionRewardDat.get_row( row_id ); + scrips = exdData->getField< uint16_t >( row, 0 ); + points = exdData->getField< uint16_t >( row, 1 ); +} + +Sapphire::Data::HWDInfoBoardArticle::HWDInfoBoardArticle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDInfoBoardArticleDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); + text = exdData->getField< std::string >( row, 4 ); +} + +Sapphire::Data::HWDInfoBoardArticleTransient::HWDInfoBoardArticleTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDInfoBoardArticleTransientDat.get_row( row_id ); + image = exdData->getField< uint32_t >( row, 0 ); + text = exdData->getField< std::string >( row, 1 ); + npcName = exdData->getField< std::string >( row, 2 ); +} + +Sapphire::Data::HWDInfoBoardArticleType::HWDInfoBoardArticleType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDInfoBoardArticleTypeDat.get_row( row_id ); + type = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::HWDLevelChangeDeception::HWDLevelChangeDeception( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDLevelChangeDeceptionDat.get_row( row_id ); + image = exdData->getField< int32_t >( row, 0 ); +} + +Sapphire::Data::HWDSharedGroup::HWDSharedGroup( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDSharedGroupDat.get_row( row_id, subRow ); + lGB = exdData->getField< uint32_t >( row, 0 ); + param = exdData->getField< uint8_t >( row, 1 ); +} + +Sapphire::Data::HWDSharedGroupControlParam::HWDSharedGroupControlParam( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_HWDSharedGroupControlParamDat.get_row( row_id, subRow ); + paramValue = exdData->getField< uint8_t >( row, 1 ); +} + +Sapphire::Data::IKDContentBonus::IKDContentBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_IKDContentBonusDat.get_row( row_id ); + objective = exdData->getField< std::string >( row, 0 ); + requirement = exdData->getField< std::string >( row, 1 ); + image = exdData->getField< uint32_t >( row, 3 ); + order = exdData->getField< uint8_t >( row, 4 ); +} + +Sapphire::Data::IKDFishParam::IKDFishParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_IKDFishParamDat.get_row( row_id ); + fish = exdData->getField< uint32_t >( row, 0 ); + iKDContentBonus = exdData->getField< uint8_t >( row, 1 ); +} + +Sapphire::Data::IKDRoute::IKDRoute( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_IKDRouteDat.get_row( row_id ); + image = exdData->getField< uint32_t >( row, 6 ); + territoryType = exdData->getField< uint32_t >( row, 7 ); + name = exdData->getField< std::string >( row, 8 ); +} + +Sapphire::Data::IKDRouteTable::IKDRouteTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_IKDRouteTableDat.get_row( row_id ); + route = exdData->getField< uint32_t >( row, 0 ); +} + +Sapphire::Data::IKDSpot::IKDSpot( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_IKDSpotDat.get_row( row_id ); + spotMain = exdData->getField< uint32_t >( row, 0 ); + spotSub = exdData->getField< uint32_t >( row, 1 ); + placeName = exdData->getField< uint32_t >( row, 2 ); +} + +Sapphire::Data::InclusionShop::InclusionShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_InclusionShopDat.get_row( row_id ); + category.push_back( exdData->getField< uint16_t >( row, 2 ) ); + category.push_back( exdData->getField< uint16_t >( row, 3 ) ); + category.push_back( exdData->getField< uint16_t >( row, 4 ) ); + category.push_back( exdData->getField< uint16_t >( row, 5 ) ); + category.push_back( exdData->getField< uint16_t >( row, 6 ) ); + category.push_back( exdData->getField< uint16_t >( row, 7 ) ); + category.push_back( exdData->getField< uint16_t >( row, 8 ) ); + category.push_back( exdData->getField< uint16_t >( row, 9 ) ); + category.push_back( exdData->getField< uint16_t >( row, 10 ) ); + category.push_back( exdData->getField< uint16_t >( row, 11 ) ); + category.push_back( exdData->getField< uint16_t >( row, 12 ) ); + category.push_back( exdData->getField< uint16_t >( row, 13 ) ); + category.push_back( exdData->getField< uint16_t >( row, 14 ) ); + category.push_back( exdData->getField< uint16_t >( row, 15 ) ); + category.push_back( exdData->getField< uint16_t >( row, 16 ) ); + category.push_back( exdData->getField< uint16_t >( row, 17 ) ); + category.push_back( exdData->getField< uint16_t >( row, 18 ) ); + category.push_back( exdData->getField< uint16_t >( row, 19 ) ); + category.push_back( exdData->getField< uint16_t >( row, 20 ) ); + category.push_back( exdData->getField< uint16_t >( row, 21 ) ); + category.push_back( exdData->getField< uint16_t >( row, 22 ) ); + category.push_back( exdData->getField< uint16_t >( row, 23 ) ); + category.push_back( exdData->getField< uint16_t >( row, 24 ) ); + category.push_back( exdData->getField< uint16_t >( row, 25 ) ); + category.push_back( exdData->getField< uint16_t >( row, 26 ) ); + category.push_back( exdData->getField< uint16_t >( row, 27 ) ); + category.push_back( exdData->getField< uint16_t >( row, 28 ) ); + category.push_back( exdData->getField< uint16_t >( row, 29 ) ); + category.push_back( exdData->getField< uint16_t >( row, 30 ) ); + category.push_back( exdData->getField< uint16_t >( row, 31 ) ); +} + +Sapphire::Data::InclusionShopCategory::InclusionShopCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_InclusionShopCategoryDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); + classJobCategory = exdData->getField< uint8_t >( row, 1 ); + inclusionShopSeries = exdData->getField< uint16_t >( row, 2 ); +} + +Sapphire::Data::InclusionShopSeries::InclusionShopSeries( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_InclusionShopSeriesDat.get_row( row_id, subRow ); + specialShop = exdData->getField< uint32_t >( row, 0 ); +} + +Sapphire::Data::IndividualWeather::IndividualWeather( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_IndividualWeatherDat.get_row( row_id ); + weather.push_back( exdData->getField< uint8_t >( row, 0 ) ); + weather.push_back( exdData->getField< uint8_t >( row, 1 ) ); + weather.push_back( exdData->getField< uint8_t >( row, 2 ) ); + weather.push_back( exdData->getField< uint8_t >( row, 3 ) ); + weather.push_back( exdData->getField< uint8_t >( row, 4 ) ); + weather.push_back( exdData->getField< uint8_t >( row, 5 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 15 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 16 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 17 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 18 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 19 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 20 ) ); } Sapphire::Data::InstanceContent::InstanceContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3453,29 +6110,30 @@ Sapphire::Data::InstanceContent::InstanceContent( uint32_t row_id, Sapphire::Dat instanceContentType = exdData->getField< uint8_t >( row, 0 ); weekRestriction = exdData->getField< uint8_t >( row, 1 ); timeLimitmin = exdData->getField< uint16_t >( row, 2 ); - name = exdData->getField< std::string >( row, 3 ); - bGM = exdData->getField< uint16_t >( row, 5 ); - winBGM = exdData->getField< uint16_t >( row, 6 ); - cutscene = exdData->getField< uint32_t >( row, 7 ); - order = exdData->getField< uint16_t >( row, 9 ); - instanceContentTextDataBossStart = exdData->getField< uint32_t >( row, 12 ); - instanceContentTextDataBossEnd = exdData->getField< uint32_t >( row, 13 ); - bNpcBaseBoss = exdData->getField< uint32_t >( row, 14 ); - instanceContentTextDataObjectiveStart = exdData->getField< uint32_t >( row, 15 ); - instanceContentTextDataObjectiveEnd = exdData->getField< uint32_t >( row, 16 ); - sortKey = exdData->getField< uint16_t >( row, 17 ); - instanceClearExp = exdData->getField< uint32_t >( row, 18 ); - newPlayerBonusA = exdData->getField< uint16_t >( row, 20 ); - finalBossCurrencyC = exdData->getField< uint16_t >( row, 21 ); - finalBossCurrencyA = exdData->getField< uint16_t >( row, 23 ); - finalBossCurrencyB = exdData->getField< uint16_t >( row, 24 ); - newPlayerBonusB = exdData->getField< uint16_t >( row, 25 ); - instanceClearGil = exdData->getField< uint32_t >( row, 47 ); - instanceContentRewardItem = exdData->getField< uint32_t >( row, 48 ); - finalBossExp = exdData->getField< uint32_t >( row, 50 ); - instanceContentBuff = exdData->getField< int32_t >( row, 51 ); - reqInstance = exdData->getField< uint32_t >( row, 52 ); - partyCondition = exdData->getField< uint8_t >( row, 54 ); + bGM = exdData->getField< uint16_t >( row, 4 ); + winBGM = exdData->getField< uint16_t >( row, 5 ); + cutscene = exdData->getField< uint32_t >( row, 6 ); + lGBEventRange = exdData->getField< uint32_t >( row, 7 ); + order = exdData->getField< uint16_t >( row, 8 ); + colosseum = exdData->getField< uint8_t >( row, 9 ); + instanceContentTextDataBossStart = exdData->getField< uint32_t >( row, 11 ); + instanceContentTextDataBossEnd = exdData->getField< uint32_t >( row, 12 ); + bNpcBaseBoss = exdData->getField< uint32_t >( row, 13 ); + instanceContentTextDataObjectiveStart = exdData->getField< uint32_t >( row, 14 ); + instanceContentTextDataObjectiveEnd = exdData->getField< uint32_t >( row, 15 ); + sortKey = exdData->getField< uint16_t >( row, 16 ); + instanceClearExp = exdData->getField< uint32_t >( row, 17 ); + newPlayerBonusA = exdData->getField< uint16_t >( row, 19 ); + finalBossCurrencyC = exdData->getField< uint16_t >( row, 20 ); + finalBossCurrencyA = exdData->getField< uint32_t >( row, 22 ); + finalBossCurrencyB = exdData->getField< uint16_t >( row, 23 ); + newPlayerBonusB = exdData->getField< uint16_t >( row, 24 ); + instanceClearGil = exdData->getField< uint32_t >( row, 46 ); + instanceContentRewardItem = exdData->getField< uint32_t >( row, 47 ); + finalBossExp = exdData->getField< uint8_t >( row, 49 ); + instanceContentBuff = exdData->getField< uint32_t >( row, 50 ); + reqInstance = exdData->getField< int32_t >( row, 51 ); + partyCondition = exdData->getField< int16_t >( row, 53 ); } Sapphire::Data::InstanceContentBuff::InstanceContentBuff( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3524,58 +6182,64 @@ Sapphire::Data::Item::Item( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e itemUICategory = exdData->getField< uint8_t >( row, 15 ); itemSearchCategory = exdData->getField< uint8_t >( row, 16 ); equipSlotCategory = exdData->getField< uint8_t >( row, 17 ); - stackSize = exdData->getField< uint32_t >( row, 19 ); - isUnique = exdData->getField< bool >( row, 20 ); - isUntradable = exdData->getField< bool >( row, 21 ); - isIndisposable = exdData->getField< bool >( row, 22 ); - isEquippable = exdData->getField< bool >( row, 23 ); - priceMid = exdData->getField< uint32_t >( row, 24 ); - priceLow = exdData->getField< uint32_t >( row, 25 ); - canBeHq = exdData->getField< bool >( row, 26 ); - isDyeable = exdData->getField< bool >( row, 27 ); - isCrestWorthy = exdData->getField< bool >( row, 28 ); - itemAction = exdData->getField< uint16_t >( row, 29 ); - cooldowns = exdData->getField< uint16_t >( row, 31 ); - classJobRepair = exdData->getField< uint8_t >( row, 32 ); - itemRepair = exdData->getField< int32_t >( row, 33 ); - itemGlamour = exdData->getField< int32_t >( row, 34 ); - salvage = exdData->getField< uint16_t >( row, 35 ); - isCollectable = exdData->getField< bool >( row, 36 ); - aetherialReduce = exdData->getField< uint16_t >( row, 37 ); - levelEquip = exdData->getField< uint8_t >( row, 38 ); - equipRestriction = exdData->getField< uint8_t >( row, 40 ); - classJobCategory = exdData->getField< uint8_t >( row, 41 ); - grandCompany = exdData->getField< uint8_t >( row, 42 ); - itemSeries = exdData->getField< uint8_t >( row, 43 ); - baseParamModifier = exdData->getField< uint8_t >( row, 44 ); - modelMain = exdData->getField< uint64_t >( row, 45 ); - modelSub = exdData->getField< uint64_t >( row, 46 ); - classJobUse = exdData->getField< uint8_t >( row, 47 ); - damagePhys = exdData->getField< uint16_t >( row, 49 ); - damageMag = exdData->getField< uint16_t >( row, 50 ); - delayms = exdData->getField< uint16_t >( row, 51 ); - blockRate = exdData->getField< uint16_t >( row, 53 ); - block = exdData->getField< uint16_t >( row, 54 ); - defensePhys = exdData->getField< uint16_t >( row, 55 ); - defenseMag = exdData->getField< uint16_t >( row, 56 ); - itemSpecialBonus = exdData->getField< uint8_t >( row, 69 ); - itemSpecialBonusParam = exdData->getField< uint8_t >( row, 70 ); - materializeType = exdData->getField< uint8_t >( row, 83 ); - materiaSlotCount = exdData->getField< uint8_t >( row, 84 ); - isAdvancedMeldingPermitted = exdData->getField< bool >( row, 85 ); - isPvP = exdData->getField< bool >( row, 86 ); - isGlamourous = exdData->getField< bool >( row, 88 ); - + itemSortCategory = exdData->getField< uint8_t >( row, 18 ); + stackSize = exdData->getField< uint32_t >( row, 20 ); + isUnique = exdData->getField< bool >( row, 21 ); + isUntradable = exdData->getField< bool >( row, 22 ); + isIndisposable = exdData->getField< bool >( row, 23 ); + lot = exdData->getField< bool >( row, 24 ); + priceMid = exdData->getField< uint32_t >( row, 25 ); + priceLow = exdData->getField< uint32_t >( row, 26 ); + canBeHq = exdData->getField< bool >( row, 27 ); + isDyeable = exdData->getField< bool >( row, 28 ); + isCrestWorthy = exdData->getField< bool >( row, 29 ); + itemAction = exdData->getField< uint16_t >( row, 30 ); + cooldowns = exdData->getField< uint16_t >( row, 32 ); + classJobRepair = exdData->getField< uint8_t >( row, 33 ); + itemRepair = exdData->getField< int32_t >( row, 34 ); + itemGlamour = exdData->getField< int32_t >( row, 35 ); + desynth = exdData->getField< uint16_t >( row, 36 ); + isCollectable = exdData->getField< bool >( row, 37 ); + alwaysCollectable = exdData->getField< bool >( row, 38 ); + aetherialReduce = exdData->getField< uint16_t >( row, 39 ); + levelEquip = exdData->getField< uint8_t >( row, 40 ); + equipRestriction = exdData->getField< uint8_t >( row, 42 ); + classJobCategory = exdData->getField< uint8_t >( row, 43 ); + grandCompany = exdData->getField< uint8_t >( row, 44 ); + itemSeries = exdData->getField< uint8_t >( row, 45 ); + baseParamModifier = exdData->getField< uint8_t >( row, 46 ); + modelMain = exdData->getField< uint64_t >( row, 47 ); + modelSub = exdData->getField< uint64_t >( row, 48 ); + classJobUse = exdData->getField< uint8_t >( row, 49 ); + damagePhys = exdData->getField< uint16_t >( row, 51 ); + damageMag = exdData->getField< uint16_t >( row, 52 ); + delayms = exdData->getField< uint16_t >( row, 53 ); + blockRate = exdData->getField< uint16_t >( row, 55 ); + block = exdData->getField< uint16_t >( row, 56 ); + defensePhys = exdData->getField< uint16_t >( row, 57 ); + defenseMag = exdData->getField< uint16_t >( row, 58 ); + itemSpecialBonus = exdData->getField< uint8_t >( row, 71 ); + itemSpecialBonusParam = exdData->getField< uint8_t >( row, 72 ); + materializeType = exdData->getField< uint8_t >( row, 85 ); + materiaSlotCount = exdData->getField< uint8_t >( row, 86 ); + isAdvancedMeldingPermitted = exdData->getField< bool >( row, 87 ); + isPvP = exdData->getField< bool >( row, 88 ); + subStatCategory = exdData->getField< uint8_t >( row, 89 ); + isGlamourous = exdData->getField< bool >( row, 90 ); for( int i = 0; i < 6; ++i ) { - param[i].baseparam = exdData->getField< uint8_t >( row, 57 + i * 2 ); - param[i].value = exdData->getField< int16_t >( row, 58 + i * 2 ); + param[i].baseparam = exdData->getField< uint8_t >( row, 59 + i * 2 ); + param[i].value = exdData->getField< int16_t >( row, 60 + i * 2 ); } } Sapphire::Data::ItemAction::ItemAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ItemActionDat.get_row( row_id ); + condLv = exdData->getField< uint8_t >( row, 0 ); + condBattle = exdData->getField< bool >( row, 1 ); + condPVP = exdData->getField< bool >( row, 2 ); + condPVPOnly = exdData->getField< bool >( row, 3 ); type = exdData->getField< uint16_t >( row, 4 ); data.push_back( exdData->getField< uint16_t >( row, 5 ) ); data.push_back( exdData->getField< uint16_t >( row, 6 ) ); @@ -3597,6 +6261,21 @@ Sapphire::Data::ItemAction::ItemAction( uint32_t row_id, Sapphire::Data::ExdData dataHQ.push_back( exdData->getField< uint16_t >( row, 22 ) ); } +Sapphire::Data::ItemActionTelepo::ItemActionTelepo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ItemActionTelepoDat.get_row( row_id ); + requirement = exdData->getField< uint32_t >( row, 0 ); + denyMessage = exdData->getField< uint32_t >( row, 1 ); +} + +Sapphire::Data::ItemBarterCheck::ItemBarterCheck( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ItemBarterCheckDat.get_row( row_id, subRow ); + category = exdData->getField< uint16_t >( row, 0 ); + question = exdData->getField< uint32_t >( row, 1 ); + confirm = exdData->getField< uint32_t >( row, 2 ); +} + Sapphire::Data::ItemFood::ItemFood( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ItemFoodDat.get_row( row_id ); @@ -3697,6 +6376,12 @@ Sapphire::Data::ItemSeries::ItemSeries( uint32_t row_id, Sapphire::Data::ExdData name = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::ItemSortCategory::ItemSortCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ItemSortCategoryDat.get_row( row_id ); + param = exdData->getField< uint8_t >( row, 0 ); +} + Sapphire::Data::ItemSpecialBonus::ItemSpecialBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ItemSpecialBonusDat.get_row( row_id ); @@ -3712,10 +6397,33 @@ Sapphire::Data::ItemUICategory::ItemUICategory( uint32_t row_id, Sapphire::Data: orderMajor = exdData->getField< uint8_t >( row, 3 ); } +Sapphire::Data::Jingle::Jingle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_JingleDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::JobHudManual::JobHudManual( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_JobHudManualDat.get_row( row_id ); + action = exdData->getField< uint32_t >( row, 2 ); + guide = exdData->getField< uint16_t >( row, 5 ); +} + +Sapphire::Data::JobHudManualPriority::JobHudManualPriority( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_JobHudManualPriorityDat.get_row( row_id ); + jobHudManual.push_back( exdData->getField< uint8_t >( row, 0 ) ); + jobHudManual.push_back( exdData->getField< uint8_t >( row, 1 ) ); + jobHudManual.push_back( exdData->getField< uint8_t >( row, 2 ) ); +} + Sapphire::Data::JournalCategory::JournalCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_JournalCategoryDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + separateType = exdData->getField< uint8_t >( row, 1 ); + dataType = exdData->getField< uint8_t >( row, 2 ); journalSection = exdData->getField< uint8_t >( row, 3 ); } @@ -3733,31 +6441,60 @@ Sapphire::Data::JournalSection::JournalSection( uint32_t row_id, Sapphire::Data: name = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::Knockback::Knockback( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_KnockbackDat.get_row( row_id ); + distance = exdData->getField< uint8_t >( row, 0 ); + speed = exdData->getField< uint8_t >( row, 1 ); + motion = exdData->getField< bool >( row, 2 ); + nearDistance = exdData->getField< uint8_t >( row, 3 ); + direction = exdData->getField< uint8_t >( row, 4 ); + directionArg = exdData->getField< uint8_t >( row, 5 ); + cancelMove = exdData->getField< bool >( row, 6 ); +} + +Sapphire::Data::LegacyQuest::LegacyQuest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_LegacyQuestDat.get_row( row_id ); + legacyQuestID = exdData->getField< uint16_t >( row, 0 ); + text = exdData->getField< std::string >( row, 1 ); + string = exdData->getField< std::string >( row, 2 ); + sortKey = exdData->getField< uint16_t >( row, 3 ); + genre = exdData->getField< uint8_t >( row, 4 ); +} + Sapphire::Data::Leve::Leve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_LeveDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); description = exdData->getField< std::string >( row, 1 ); leveClient = exdData->getField< int32_t >( row, 2 ); - leveAssignmentType = exdData->getField< int32_t >( row, 3 ); - classJobLevel = exdData->getField< uint16_t >( row, 5 ); - allowanceCost = exdData->getField< uint8_t >( row, 7 ); - placeNameStart = exdData->getField< int32_t >( row, 9 ); - placeNameIssued = exdData->getField< int32_t >( row, 10 ); - classJobCategory = exdData->getField< uint8_t >( row, 12 ); - journalGenre = exdData->getField< int32_t >( row, 13 ); - placeNameStartZone = exdData->getField< int32_t >( row, 15 ); - iconCityState = exdData->getField< int32_t >( row, 16 ); - dataId = exdData->getField< int32_t >( row, 17 ); - expReward = exdData->getField< uint32_t >( row, 21 ); - gilReward = exdData->getField< uint32_t >( row, 22 ); - leveRewardItem = exdData->getField< uint16_t >( row, 23 ); - leveVfx = exdData->getField< uint8_t >( row, 24 ); - leveVfxFrame = exdData->getField< uint8_t >( row, 25 ); - levelLevemete = exdData->getField< uint32_t >( row, 26 ); - iconIssuer = exdData->getField< int32_t >( row, 27 ); - levelStart = exdData->getField< uint32_t >( row, 29 ); - bGM = exdData->getField< uint16_t >( row, 30 ); + leveAssignmentType = exdData->getField< uint8_t >( row, 3 ); + town = exdData->getField< int32_t >( row, 5 ); + classJobLevel = exdData->getField< uint16_t >( row, 6 ); + timeLimit = exdData->getField< uint8_t >( row, 7 ); + allowanceCost = exdData->getField< uint8_t >( row, 8 ); + evaluation = exdData->getField< int32_t >( row, 9 ); + placeNameStart = exdData->getField< int32_t >( row, 10 ); + placeNameIssued = exdData->getField< int32_t >( row, 11 ); + classJobCategory = exdData->getField< uint8_t >( row, 13 ); + journalGenre = exdData->getField< int32_t >( row, 14 ); + placeNameStartZone = exdData->getField< int32_t >( row, 16 ); + iconCityState = exdData->getField< int32_t >( row, 17 ); + dataId = exdData->getField< int32_t >( row, 18 ); + canCancel = exdData->getField< bool >( row, 19 ); + maxDifficulty = exdData->getField< uint8_t >( row, 20 ); + expFactor = exdData->getField< float >( row, 21 ); + expReward = exdData->getField< uint32_t >( row, 22 ); + gilReward = exdData->getField< uint32_t >( row, 23 ); + leveRewardItem = exdData->getField< uint16_t >( row, 24 ); + leveVfx = exdData->getField< uint8_t >( row, 25 ); + leveVfxFrame = exdData->getField< uint8_t >( row, 26 ); + levelLevemete = exdData->getField< uint32_t >( row, 27 ); + iconIssuer = exdData->getField< int32_t >( row, 28 ); + lockedLeve = exdData->getField< bool >( row, 29 ); + levelStart = exdData->getField< uint32_t >( row, 30 ); + bGM = exdData->getField< uint16_t >( row, 31 ); } Sapphire::Data::LeveAssignmentType::LeveAssignmentType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3799,6 +6536,12 @@ Sapphire::Data::LeveRewardItemGroup::LeveRewardItemGroup( uint32_t row_id, Sapph auto row = exdData->m_LeveRewardItemGroupDat.get_row( row_id ); } +Sapphire::Data::LeveString::LeveString( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_LeveStringDat.get_row( row_id ); + objective = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::LeveVfx::LeveVfx( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_LeveVfxDat.get_row( row_id ); @@ -3806,10 +6549,24 @@ Sapphire::Data::LeveVfx::LeveVfx( uint32_t row_id, Sapphire::Data::ExdDataGenera icon = exdData->getField< int32_t >( row, 1 ); } +Sapphire::Data::Lobby::Lobby( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_LobbyDat.get_row( row_id ); + tYPE = exdData->getField< uint32_t >( row, 0 ); + pARAM = exdData->getField< uint32_t >( row, 1 ); + lINK = exdData->getField< uint32_t >( row, 2 ); + text = exdData->getField< std::string >( row, 3 ); +} + Sapphire::Data::LogFilter::LogFilter( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_LogFilterDat.get_row( row_id ); logKind = exdData->getField< uint8_t >( row, 0 ); + caster = exdData->getField< uint16_t >( row, 1 ); + target = exdData->getField< uint16_t >( row, 2 ); + category = exdData->getField< uint8_t >( row, 3 ); + displayOrder = exdData->getField< uint8_t >( row, 4 ); + preset = exdData->getField< uint8_t >( row, 5 ); name = exdData->getField< std::string >( row, 6 ); example = exdData->getField< std::string >( row, 7 ); } @@ -3818,15 +6575,6 @@ Sapphire::Data::LogKind::LogKind( uint32_t row_id, Sapphire::Data::ExdDataGenera { auto row = exdData->m_LogKindDat.get_row( row_id ); format = exdData->getField< std::string >( row, 1 ); - name = exdData->getField< std::string >( row, 2 ); - example = exdData->getField< std::string >( row, 3 ); - logKindCategoryText = exdData->getField< uint8_t >( row, 4 ); -} - -Sapphire::Data::LogKindCategoryText::LogKindCategoryText( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_LogKindCategoryTextDat.get_row( row_id ); - text = exdData->getField< std::string >( row, 0 ); } Sapphire::Data::LogMessage::LogMessage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3855,22 +6603,58 @@ Sapphire::Data::LotteryExchangeShop::LotteryExchangeShop( uint32_t row_id, Sapph itemAccepted.push_back( exdData->getField< int32_t >( row, 14 ) ); itemAccepted.push_back( exdData->getField< int32_t >( row, 15 ) ); itemAccepted.push_back( exdData->getField< int32_t >( row, 16 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 17 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 18 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 19 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 20 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 21 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 22 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 23 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 24 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 25 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 26 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 27 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 28 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 29 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 30 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 31 ) ); - amountAccepted.push_back( exdData->getField< uint32_t >( row, 32 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 17 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 18 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 19 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 20 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 21 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 22 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 23 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 24 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 25 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 26 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 27 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 28 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 29 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 30 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 31 ) ); + itemAccepted.push_back( exdData->getField< int32_t >( row, 32 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 33 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 34 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 35 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 36 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 37 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 38 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 39 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 40 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 41 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 42 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 43 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 44 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 45 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 46 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 47 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 48 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 49 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 50 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 51 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 52 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 53 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 54 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 55 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 56 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 57 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 58 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 59 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 60 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 61 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 62 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 63 ) ); + amountAccepted.push_back( exdData->getField< uint32_t >( row, 64 ) ); + lua = exdData->getField< std::string >( row, 129 ); + logMessage.push_back( exdData->getField< uint32_t >( row, 130 ) ); + logMessage.push_back( exdData->getField< uint32_t >( row, 131 ) ); + logMessage.push_back( exdData->getField< uint32_t >( row, 132 ) ); } Sapphire::Data::MacroIcon::MacroIcon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3890,7 +6674,9 @@ Sapphire::Data::MainCommand::MainCommand( uint32_t row_id, Sapphire::Data::ExdDa { auto row = exdData->m_MainCommandDat.get_row( row_id ); icon = exdData->getField< int32_t >( row, 0 ); + category = exdData->getField< uint8_t >( row, 1 ); mainCommandCategory = exdData->getField< uint8_t >( row, 2 ); + sortID = exdData->getField< int8_t >( row, 3 ); name = exdData->getField< std::string >( row, 4 ); description = exdData->getField< std::string >( row, 5 ); } @@ -3916,19 +6702,30 @@ Sapphire::Data::ManeuversArmor::ManeuversArmor( uint32_t row_id, Sapphire::Data: Sapphire::Data::Map::Map( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MapDat.get_row( row_id ); - mapIndex = exdData->getField< int8_t >( row, 2 ); - hierarchy = exdData->getField< uint8_t >( row, 3 ); - mapMarkerRange = exdData->getField< uint16_t >( row, 4 ); - id = exdData->getField< std::string >( row, 5 ); - sizeFactor = exdData->getField< uint16_t >( row, 6 ); - offsetX = exdData->getField< int16_t >( row, 7 ); - offsetY = exdData->getField< int16_t >( row, 8 ); - placeNameRegion = exdData->getField< uint16_t >( row, 9 ); - placeName = exdData->getField< uint16_t >( row, 10 ); - placeNameSub = exdData->getField< uint16_t >( row, 11 ); - discoveryIndex = exdData->getField< int16_t >( row, 12 ); - territoryType = exdData->getField< uint16_t >( row, 14 ); - discoveryArrayByte = exdData->getField< bool >( row, 15 ); + mapCondition = exdData->getField< uint8_t >( row, 0 ); + priorityCategoryUI = exdData->getField< uint8_t >( row, 1 ); + priorityUI = exdData->getField< uint8_t >( row, 2 ); + mapIndex = exdData->getField< int8_t >( row, 3 ); + hierarchy = exdData->getField< uint8_t >( row, 4 ); + mapMarkerRange = exdData->getField< uint16_t >( row, 5 ); + id = exdData->getField< std::string >( row, 6 ); + sizeFactor = exdData->getField< uint16_t >( row, 7 ); + offsetX = exdData->getField< int16_t >( row, 8 ); + offsetY = exdData->getField< int16_t >( row, 9 ); + placeNameRegion = exdData->getField< uint16_t >( row, 10 ); + placeName = exdData->getField< uint16_t >( row, 11 ); + placeNameSub = exdData->getField< uint16_t >( row, 12 ); + discoveryIndex = exdData->getField< int16_t >( row, 13 ); + discoveryFlag = exdData->getField< uint32_t >( row, 14 ); + territoryType = exdData->getField< uint16_t >( row, 15 ); + discoveryArrayByte = exdData->getField< bool >( row, 16 ); + isEvent = exdData->getField< bool >( row, 17 ); +} + +Sapphire::Data::MapCondition::MapCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MapConditionDat.get_row( row_id ); + quest = exdData->getField< uint16_t >( row, 0 ); } Sapphire::Data::MapMarker::MapMarker( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3956,6 +6753,7 @@ Sapphire::Data::MapSymbol::MapSymbol( uint32_t row_id, Sapphire::Data::ExdDataGe auto row = exdData->m_MapSymbolDat.get_row( row_id ); icon = exdData->getField< int32_t >( row, 0 ); placeName = exdData->getField< int32_t >( row, 1 ); + displayNavi = exdData->getField< bool >( row, 2 ); } Sapphire::Data::Marker::Marker( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -3965,23 +6763,6 @@ Sapphire::Data::Marker::Marker( uint32_t row_id, Sapphire::Data::ExdDataGenerate name = exdData->getField< std::string >( row, 1 ); } -Sapphire::Data::MasterpieceSupplyDuty::MasterpieceSupplyDuty( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_MasterpieceSupplyDutyDat.get_row( row_id ); - classJob = exdData->getField< uint8_t >( row, 0 ); - classJobLevel = exdData->getField< uint8_t >( row, 1 ); - rewardCurrency = exdData->getField< uint16_t >( row, 2 ); -} - -Sapphire::Data::MasterpieceSupplyMultiplier::MasterpieceSupplyMultiplier( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_MasterpieceSupplyMultiplierDat.get_row( row_id ); - xpMultiplier.push_back( exdData->getField< uint16_t >( row, 0 ) ); - xpMultiplier.push_back( exdData->getField< uint16_t >( row, 1 ) ); - currencyMultiplier.push_back( exdData->getField< uint16_t >( row, 4 ) ); - currencyMultiplier.push_back( exdData->getField< uint16_t >( row, 5 ) ); -} - Sapphire::Data::Materia::Materia( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MateriaDat.get_row( row_id ); @@ -3996,23 +6777,56 @@ Sapphire::Data::Materia::Materia( uint32_t row_id, Sapphire::Data::ExdDataGenera item.push_back( exdData->getField< int32_t >( row, 8 ) ); item.push_back( exdData->getField< int32_t >( row, 9 ) ); baseParam = exdData->getField< uint8_t >( row, 10 ); - value.push_back( exdData->getField< uint8_t >( row, 11 ) ); - value.push_back( exdData->getField< uint8_t >( row, 12 ) ); - value.push_back( exdData->getField< uint8_t >( row, 13 ) ); - value.push_back( exdData->getField< uint8_t >( row, 14 ) ); - value.push_back( exdData->getField< uint8_t >( row, 15 ) ); - value.push_back( exdData->getField< uint8_t >( row, 16 ) ); - value.push_back( exdData->getField< uint8_t >( row, 17 ) ); - value.push_back( exdData->getField< uint8_t >( row, 18 ) ); - value.push_back( exdData->getField< uint8_t >( row, 19 ) ); - value.push_back( exdData->getField< uint8_t >( row, 20 ) ); + value.push_back( exdData->getField< int16_t >( row, 11 ) ); + value.push_back( exdData->getField< int16_t >( row, 12 ) ); + value.push_back( exdData->getField< int16_t >( row, 13 ) ); + value.push_back( exdData->getField< int16_t >( row, 14 ) ); + value.push_back( exdData->getField< int16_t >( row, 15 ) ); + value.push_back( exdData->getField< int16_t >( row, 16 ) ); + value.push_back( exdData->getField< int16_t >( row, 17 ) ); + value.push_back( exdData->getField< int16_t >( row, 18 ) ); + value.push_back( exdData->getField< int16_t >( row, 19 ) ); + value.push_back( exdData->getField< int16_t >( row, 20 ) ); +} + +Sapphire::Data::MateriaJoinRate::MateriaJoinRate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MateriaJoinRateDat.get_row( row_id ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 0 ) ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 1 ) ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 2 ) ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 3 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 4 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 5 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 6 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 7 ) ); +} + +Sapphire::Data::MateriaJoinRateGatherCraft::MateriaJoinRateGatherCraft( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MateriaJoinRateGatherCraftDat.get_row( row_id ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 0 ) ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 1 ) ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 2 ) ); + NQOvermeldSlot.push_back( exdData->getField< float >( row, 3 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 4 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 5 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 6 ) ); + HQOvermeldSlot.push_back( exdData->getField< float >( row, 7 ) ); +} + +Sapphire::Data::MateriaTomestoneRate::MateriaTomestoneRate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MateriaTomestoneRateDat.get_row( row_id ); + rate = exdData->getField< uint32_t >( row, 0 ); } Sapphire::Data::MiniGameRA::MiniGameRA( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MiniGameRADat.get_row( row_id ); icon = exdData->getField< int32_t >( row, 1 ); - bGM = exdData->getField< int32_t >( row, 2 ); + image = exdData->getField< int32_t >( row, 2 ); + bGM = exdData->getField< int32_t >( row, 3 ); } Sapphire::Data::MinionRace::MinionRace( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4034,11 +6848,39 @@ Sapphire::Data::MinionSkillType::MinionSkillType( uint32_t row_id, Sapphire::Dat name = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::MobHuntOrder::MobHuntOrder( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MobHuntOrderDat.get_row( row_id, subRow ); + target = exdData->getField< uint16_t >( row, 0 ); + neededKills = exdData->getField< uint8_t >( row, 1 ); + type = exdData->getField< uint8_t >( row, 2 ); + rank = exdData->getField< uint8_t >( row, 3 ); + mobHuntReward = exdData->getField< uint8_t >( row, 4 ); +} + Sapphire::Data::MobHuntOrderType::MobHuntOrderType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MobHuntOrderTypeDat.get_row( row_id ); + type = exdData->getField< uint8_t >( row, 0 ); quest = exdData->getField< uint32_t >( row, 1 ); eventItem = exdData->getField< uint32_t >( row, 2 ); + orderStart = exdData->getField< uint16_t >( row, 3 ); + orderAmount = exdData->getField< uint8_t >( row, 4 ); +} + +Sapphire::Data::MobHuntReward::MobHuntReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MobHuntRewardDat.get_row( row_id ); + expReward = exdData->getField< uint32_t >( row, 0 ); + gilReward = exdData->getField< uint16_t >( row, 1 ); + expansion = exdData->getField< uint8_t >( row, 2 ); + currencyReward = exdData->getField< uint16_t >( row, 3 ); +} + +Sapphire::Data::MobHuntRewardCap::MobHuntRewardCap( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MobHuntRewardCapDat.get_row( row_id ); + expCap = exdData->getField< uint32_t >( row, 0 ); } Sapphire::Data::MobHuntTarget::MobHuntTarget( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4058,12 +6900,21 @@ Sapphire::Data::ModelChara::ModelChara( uint32_t row_id, Sapphire::Data::ExdData model = exdData->getField< uint16_t >( row, 1 ); base = exdData->getField< uint8_t >( row, 2 ); variant = exdData->getField< uint8_t >( row, 3 ); + sEPack = exdData->getField< uint16_t >( row, 4 ); + papVariation = exdData->getField< bool >( row, 7 ); } Sapphire::Data::ModelSkeleton::ModelSkeleton( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ModelSkeletonDat.get_row( row_id ); - scaleFactor = exdData->getField< float >( row, 0 ); + radius = exdData->getField< float >( row, 0 ); + height = exdData->getField< float >( row, 1 ); + vFXScale = exdData->getField< float >( row, 2 ); + floatHeight = exdData->getField< float >( row, 11 ); + floatDown = exdData->getField< float >( row, 12 ); + floatUp = exdData->getField< uint16_t >( row, 13 ); + motionBlendType = exdData->getField< bool >( row, 15 ); + loopFlySE = exdData->getField< uint8_t >( row, 16 ); } Sapphire::Data::ModelState::ModelState( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4092,6 +6943,28 @@ Sapphire::Data::MonsterNoteTarget::MonsterNoteTarget( uint32_t row_id, Sapphire: auto row = exdData->m_MonsterNoteTargetDat.get_row( row_id ); bNpcName = exdData->getField< uint16_t >( row, 0 ); icon = exdData->getField< int32_t >( row, 1 ); + town = exdData->getField< uint8_t >( row, 2 ); +} + +Sapphire::Data::MotionTimeline::MotionTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MotionTimelineDat.get_row( row_id ); + filename = exdData->getField< std::string >( row, 0 ); + blendGroup = exdData->getField< uint8_t >( row, 1 ); + isLoop = exdData->getField< bool >( row, 2 ); + isBlinkEnable = exdData->getField< bool >( row, 3 ); + isLipEnable = exdData->getField< bool >( row, 4 ); +} + +Sapphire::Data::MotionTimelineBlendTable::MotionTimelineBlendTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MotionTimelineBlendTableDat.get_row( row_id ); + destBlendGroup = exdData->getField< uint8_t >( row, 0 ); + srcBlendGroup = exdData->getField< uint8_t >( row, 1 ); + blendFrame_PC = exdData->getField< uint8_t >( row, 2 ); + blendFram_TypeA = exdData->getField< uint8_t >( row, 3 ); + blendFram_TypeB = exdData->getField< uint8_t >( row, 4 ); + blendFram_TypeC = exdData->getField< uint8_t >( row, 5 ); } Sapphire::Data::Mount::Mount( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4109,11 +6982,23 @@ Sapphire::Data::Mount::Mount( uint32_t row_id, Sapphire::Data::ExdDataGenerated* isFlying = exdData->getField< uint8_t >( row, 14 ); mountCustomize = exdData->getField< uint8_t >( row, 16 ); rideBGM = exdData->getField< uint16_t >( row, 17 ); + exitMoveDist = exdData->getField< uint8_t >( row, 21 ); + exitMoveSpeed = exdData->getField< uint8_t >( row, 22 ); + isEmote = exdData->getField< bool >( row, 24 ); + equipHead = exdData->getField< int32_t >( row, 25 ); + equipBody = exdData->getField< int32_t >( row, 26 ); + equipLeg = exdData->getField< int32_t >( row, 27 ); + equipFoot = exdData->getField< int32_t >( row, 28 ); order = exdData->getField< int16_t >( row, 29 ); icon = exdData->getField< uint16_t >( row, 30 ); + uIPriority = exdData->getField< uint8_t >( row, 31 ); + radiusRate = exdData->getField< uint8_t >( row, 32 ); + baseMotionSpeed_Run = exdData->getField< uint8_t >( row, 33 ); + baseMotionSpeed_Walk = exdData->getField< uint8_t >( row, 34 ); extraSeats = exdData->getField< uint8_t >( row, 36 ); mountAction = exdData->getField< uint16_t >( row, 37 ); isAirborne = exdData->getField< bool >( row, 38 ); + exHotbarEnableConfig = exdData->getField< bool >( row, 39 ); useEP = exdData->getField< bool >( row, 40 ); isImmobile = exdData->getField< bool >( row, 42 ); } @@ -4132,18 +7017,38 @@ Sapphire::Data::MountAction::MountAction( uint32_t row_id, Sapphire::Data::ExdDa Sapphire::Data::MountCustomize::MountCustomize( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_MountCustomizeDat.get_row( row_id ); + hyurMaleScale = exdData->getField< uint16_t >( row, 1 ); + hyurFemaleScale = exdData->getField< uint16_t >( row, 2 ); + elezenMaleScale = exdData->getField< uint16_t >( row, 3 ); + elezenFemaleScale = exdData->getField< uint16_t >( row, 4 ); + lalaMaleScale = exdData->getField< uint16_t >( row, 5 ); + lalaFemaleScale = exdData->getField< uint16_t >( row, 6 ); + miqoMaleScale = exdData->getField< uint16_t >( row, 7 ); + miqoFemaleScale = exdData->getField< uint16_t >( row, 8 ); + roeMaleScale = exdData->getField< uint16_t >( row, 9 ); + roeFemaleScale = exdData->getField< uint16_t >( row, 10 ); + auRaMaleScale = exdData->getField< uint16_t >( row, 11 ); + auRaFemaleScale = exdData->getField< uint16_t >( row, 12 ); + hrothgarMaleScale = exdData->getField< uint16_t >( row, 13 ); + hrothgarFemaleScale = exdData->getField< uint16_t >( row, 14 ); + vieraMaleScale = exdData->getField< uint16_t >( row, 15 ); + vieraFemaleScale = exdData->getField< uint16_t >( row, 16 ); hyurMaleCameraHeight = exdData->getField< uint8_t >( row, 17 ); hyurFemaleCameraHeight = exdData->getField< uint8_t >( row, 18 ); - elezenMaleCameraHeight = exdData->getField< uint8_t >( row, 21 ); - elezenFemaleCameraHeight = exdData->getField< uint8_t >( row, 22 ); - lalaMaleCameraHeight = exdData->getField< uint8_t >( row, 23 ); - lalaFemaleCameraHeight = exdData->getField< uint8_t >( row, 24 ); - miqoMaleCameraHeight = exdData->getField< uint8_t >( row, 25 ); - miqoFemaleCameraHeight = exdData->getField< uint8_t >( row, 26 ); - roeMaleCameraHeight = exdData->getField< uint8_t >( row, 27 ); - roeFemaleCameraHeight = exdData->getField< uint8_t >( row, 28 ); - auRaMaleCameraHeight = exdData->getField< uint8_t >( row, 29 ); - auRaFemaleCameraHeight = exdData->getField< uint8_t >( row, 30 ); + elezenMaleCameraHeight = exdData->getField< uint8_t >( row, 19 ); + elezenFemaleCameraHeight = exdData->getField< uint8_t >( row, 20 ); + lalaMaleCameraHeight = exdData->getField< uint8_t >( row, 21 ); + lalaFemaleCameraHeight = exdData->getField< uint8_t >( row, 22 ); + miqoMaleCameraHeight = exdData->getField< uint8_t >( row, 23 ); + miqoFemaleCameraHeight = exdData->getField< uint8_t >( row, 24 ); + roeMaleCameraHeight = exdData->getField< uint8_t >( row, 25 ); + roeFemaleCameraHeight = exdData->getField< uint8_t >( row, 26 ); + auRaMaleCameraHeight = exdData->getField< uint8_t >( row, 27 ); + auRaFemaleCameraHeight = exdData->getField< uint8_t >( row, 28 ); + hrothgarMaleCameraHeight = exdData->getField< uint8_t >( row, 29 ); + hrothgarRoeFemaleCameraHeight = exdData->getField< uint8_t >( row, 30 ); + vieraMaleCameraHeight = exdData->getField< uint8_t >( row, 31 ); + vieraFemaleCameraHeight = exdData->getField< uint8_t >( row, 32 ); } Sapphire::Data::MountFlyingCondition::MountFlyingCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4188,17 +7093,97 @@ Sapphire::Data::MoveVfx::MoveVfx( uint32_t row_id, Sapphire::Data::ExdDataGenera vFXWalking = exdData->getField< uint16_t >( row, 1 ); } +Sapphire::Data::MovieStaffList::MovieStaffList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MovieStaffListDat.get_row( row_id ); + image = exdData->getField< uint32_t >( row, 0 ); + startTime = exdData->getField< float >( row, 1 ); + endTime = exdData->getField< float >( row, 2 ); +} + +Sapphire::Data::MovieSubtitle::MovieSubtitle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MovieSubtitleDat.get_row( row_id ); + startTime = exdData->getField< float >( row, 0 ); + endTime = exdData->getField< float >( row, 1 ); +} + +Sapphire::Data::MovieSubtitle500::MovieSubtitle500( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MovieSubtitle500Dat.get_row( row_id ); + startTime = exdData->getField< float >( row, 0 ); + endTime = exdData->getField< float >( row, 1 ); +} + +Sapphire::Data::MovieSubtitleVoyage::MovieSubtitleVoyage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MovieSubtitleVoyageDat.get_row( row_id ); + startTime = exdData->getField< float >( row, 0 ); + endTime = exdData->getField< float >( row, 1 ); +} + +Sapphire::Data::MYCTemporaryItem::MYCTemporaryItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MYCTemporaryItemDat.get_row( row_id ); + category = exdData->getField< uint8_t >( row, 0 ); + type = exdData->getField< uint8_t >( row, 1 ); + action = exdData->getField< uint32_t >( row, 2 ); + max = exdData->getField< uint8_t >( row, 3 ); + weight = exdData->getField< uint8_t >( row, 4 ); + order = exdData->getField< uint8_t >( row, 5 ); +} + +Sapphire::Data::MYCTemporaryItemUICategory::MYCTemporaryItemUICategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MYCTemporaryItemUICategoryDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::MYCWarResultNotebook::MYCWarResultNotebook( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_MYCWarResultNotebookDat.get_row( row_id ); + number = exdData->getField< uint8_t >( row, 0 ); + link = exdData->getField< uint8_t >( row, 2 ); + quest = exdData->getField< int32_t >( row, 3 ); + icon = exdData->getField< int32_t >( row, 5 ); + image = exdData->getField< int32_t >( row, 6 ); + rarity = exdData->getField< uint8_t >( row, 7 ); + nameJP = exdData->getField< std::string >( row, 8 ); + name = exdData->getField< std::string >( row, 9 ); + description = exdData->getField< std::string >( row, 10 ); +} + Sapphire::Data::NotebookDivision::NotebookDivision( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_NotebookDivisionDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); notebookDivisionCategory = exdData->getField< uint8_t >( row, 1 ); + craftOpeningLevel = exdData->getField< uint8_t >( row, 2 ); + gatheringOpeningLevel = exdData->getField< uint8_t >( row, 3 ); + questUnlock = exdData->getField< uint32_t >( row, 4 ); + cRPCraft = exdData->getField< bool >( row, 7 ); + bSMCraft = exdData->getField< bool >( row, 8 ); + aRMCraft = exdData->getField< bool >( row, 9 ); + gSMCraft = exdData->getField< bool >( row, 10 ); + lTWCraft = exdData->getField< bool >( row, 11 ); + wVRCraft = exdData->getField< bool >( row, 12 ); + aLCCraft = exdData->getField< bool >( row, 13 ); + cULCraft = exdData->getField< bool >( row, 14 ); } Sapphire::Data::NotebookDivisionCategory::NotebookDivisionCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_NotebookDivisionCategoryDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + index = exdData->getField< uint8_t >( row, 1 ); +} + +Sapphire::Data::NotoriousMonster::NotoriousMonster( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_NotoriousMonsterDat.get_row( row_id ); + bNpcBase = exdData->getField< int32_t >( row, 0 ); + rank = exdData->getField< uint8_t >( row, 1 ); + bNpcName = exdData->getField< uint32_t >( row, 2 ); } Sapphire::Data::NpcEquip::NpcEquip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4234,23 +7219,75 @@ Sapphire::Data::NpcEquip::NpcEquip( uint32_t row_id, Sapphire::Data::ExdDataGene Sapphire::Data::NpcYell::NpcYell( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_NpcYellDat.get_row( row_id ); - text = exdData->getField< std::string >( row, 9 ); + outputType = exdData->getField< uint8_t >( row, 5 ); + balloonTime = exdData->getField< float >( row, 6 ); + isBalloonSlow = exdData->getField< bool >( row, 7 ); + battleTalkTime = exdData->getField< bool >( row, 8 ); + text = exdData->getField< std::string >( row, 10 ); } Sapphire::Data::Omen::Omen( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_OmenDat.get_row( row_id ); - fileName = exdData->getField< std::string >( row, 0 ); + path = exdData->getField< std::string >( row, 0 ); + pathAlly = exdData->getField< std::string >( row, 1 ); + type = exdData->getField< uint8_t >( row, 2 ); + restrictYScale = exdData->getField< bool >( row, 3 ); + largeScale = exdData->getField< bool >( row, 4 ); } Sapphire::Data::OnlineStatus::OnlineStatus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_OnlineStatusDat.get_row( row_id ); + list = exdData->getField< bool >( row, 0 ); priority = exdData->getField< uint8_t >( row, 2 ); name = exdData->getField< std::string >( row, 3 ); icon = exdData->getField< uint32_t >( row, 4 ); } +Sapphire::Data::OpenContent::OpenContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_OpenContentDat.get_row( row_id ); + content.push_back( exdData->getField< uint16_t >( row, 0 ) ); + content.push_back( exdData->getField< uint16_t >( row, 1 ) ); + content.push_back( exdData->getField< uint16_t >( row, 2 ) ); + content.push_back( exdData->getField< uint16_t >( row, 3 ) ); + content.push_back( exdData->getField< uint16_t >( row, 4 ) ); + content.push_back( exdData->getField< uint16_t >( row, 5 ) ); + content.push_back( exdData->getField< uint16_t >( row, 6 ) ); + content.push_back( exdData->getField< uint16_t >( row, 7 ) ); + content.push_back( exdData->getField< uint16_t >( row, 8 ) ); + content.push_back( exdData->getField< uint16_t >( row, 9 ) ); + content.push_back( exdData->getField< uint16_t >( row, 10 ) ); + content.push_back( exdData->getField< uint16_t >( row, 11 ) ); + content.push_back( exdData->getField< uint16_t >( row, 12 ) ); + content.push_back( exdData->getField< uint16_t >( row, 13 ) ); + content.push_back( exdData->getField< uint16_t >( row, 14 ) ); + content.push_back( exdData->getField< uint16_t >( row, 15 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 16 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 17 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 18 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 19 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 20 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 21 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 22 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 23 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 24 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 25 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 26 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 27 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 28 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 29 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 30 ) ); + candidateName.push_back( exdData->getField< uint32_t >( row, 31 ) ); +} + +Sapphire::Data::OpenContentCandidateName::OpenContentCandidateName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_OpenContentCandidateNameDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::Opening::Opening( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_OpeningDat.get_row( row_id ); @@ -4269,6 +7306,9 @@ Sapphire::Data::OrchestrionCategory::OrchestrionCategory( uint32_t row_id, Sapph { auto row = exdData->m_OrchestrionCategoryDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + hideOrder = exdData->getField< uint8_t >( row, 1 ); + icon = exdData->getField< uint32_t >( row, 2 ); + order = exdData->getField< uint8_t >( row, 3 ); } Sapphire::Data::OrchestrionPath::OrchestrionPath( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4284,11 +7324,28 @@ Sapphire::Data::OrchestrionUiparam::OrchestrionUiparam( uint32_t row_id, Sapphir order = exdData->getField< uint16_t >( row, 1 ); } +Sapphire::Data::Ornament::Ornament( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_OrnamentDat.get_row( row_id ); + model = exdData->getField< uint16_t >( row, 0 ); + order = exdData->getField< int16_t >( row, 4 ); + icon = exdData->getField< uint16_t >( row, 5 ); + transient = exdData->getField< uint16_t >( row, 6 ); + singular = exdData->getField< std::string >( row, 7 ); + adjective = exdData->getField< int8_t >( row, 8 ); + plural = exdData->getField< std::string >( row, 9 ); + possessivePronoun = exdData->getField< int8_t >( row, 10 ); + startsWithVowel = exdData->getField< int8_t >( row, 11 ); + pronoun = exdData->getField< int8_t >( row, 13 ); + article = exdData->getField< int8_t >( row, 14 ); +} + Sapphire::Data::ParamGrow::ParamGrow( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ParamGrowDat.get_row( row_id ); expToNext = exdData->getField< int32_t >( row, 0 ); additionalActions = exdData->getField< uint8_t >( row, 1 ); + applyAction = exdData->getField< uint8_t >( row, 2 ); scaledQuestXP = exdData->getField< uint16_t >( row, 3 ); mpModifier = exdData->getField< int32_t >( row, 4 ); baseSpeed = exdData->getField< int32_t >( row, 5 ); @@ -4296,7 +7353,11 @@ Sapphire::Data::ParamGrow::ParamGrow( uint32_t row_id, Sapphire::Data::ExdDataGe questExpModifier = exdData->getField< uint8_t >( row, 7 ); hpModifier = exdData->getField< uint16_t >( row, 8 ); huntingLogExpReward = exdData->getField< int32_t >( row, 9 ); + monsterNoteSeals = exdData->getField< int32_t >( row, 10 ); itemLevelSync = exdData->getField< uint16_t >( row, 11 ); + properDungeon = exdData->getField< uint16_t >( row, 12 ); + properGuildOrder = exdData->getField< uint16_t >( row, 13 ); + craftingLevel = exdData->getField< uint16_t >( row, 14 ); } Sapphire::Data::PartyContent::PartyContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4304,9 +7365,36 @@ Sapphire::Data::PartyContent::PartyContent( uint32_t row_id, Sapphire::Data::Exd auto row = exdData->m_PartyContentDat.get_row( row_id ); key = exdData->getField< uint8_t >( row, 0 ); timeLimit = exdData->getField< uint16_t >( row, 1 ); - name = exdData->getField< std::string >( row, 2 ); + name = exdData->getField< bool >( row, 2 ); textDataStart = exdData->getField< uint32_t >( row, 3 ); textDataEnd = exdData->getField< uint32_t >( row, 4 ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 5 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 6 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 7 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 8 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 9 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 10 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 11 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 12 ) ); + lGBEventObject0.push_back( exdData->getField< uint32_t >( row, 13 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 14 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 15 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 16 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 17 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 18 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 19 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 20 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 21 ) ); + lGBEventRange.push_back( exdData->getField< uint32_t >( row, 22 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 23 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 24 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 25 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 26 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 27 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 28 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 29 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 30 ) ); + lGBEventObject1.push_back( exdData->getField< uint32_t >( row, 31 ) ); contentFinderCondition = exdData->getField< uint16_t >( row, 33 ); image = exdData->getField< uint32_t >( row, 34 ); } @@ -4323,6 +7411,16 @@ Sapphire::Data::PartyContentTextData::PartyContentTextData( uint32_t row_id, Sap data = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::PatchMark::PatchMark( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PatchMarkDat.get_row( row_id ); + category = exdData->getField< int8_t >( row, 0 ); + subCategoryType = exdData->getField< uint8_t >( row, 1 ); + subCategory = exdData->getField< uint16_t >( row, 2 ); + markID = exdData->getField< uint32_t >( row, 5 ); + version = exdData->getField< uint8_t >( row, 6 ); +} + Sapphire::Data::Perform::Perform( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PerformDat.get_row( row_id ); @@ -4335,9 +7433,20 @@ Sapphire::Data::Perform::Perform( uint32_t row_id, Sapphire::Data::ExdDataGenera animationPlay02 = exdData->getField< uint16_t >( row, 7 ); stopAnimation = exdData->getField< int32_t >( row, 8 ); instrument = exdData->getField< std::string >( row, 9 ); + order = exdData->getField< int32_t >( row, 10 ); transient = exdData->getField< uint8_t >( row, 11 ); } +Sapphire::Data::PerformGroup::PerformGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PerformGroupDat.get_row( row_id ); + perform.push_back( exdData->getField< uint8_t >( row, 0 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 1 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 2 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 3 ) ); + perform.push_back( exdData->getField< uint8_t >( row, 4 ) ); +} + Sapphire::Data::PerformTransient::PerformTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PerformTransientDat.get_row( row_id ); @@ -4358,6 +7467,49 @@ Sapphire::Data::PetAction::PetAction( uint32_t row_id, Sapphire::Data::ExdDataGe icon = exdData->getField< int32_t >( row, 2 ); action = exdData->getField< uint16_t >( row, 3 ); pet = exdData->getField< uint8_t >( row, 4 ); + masterOrder = exdData->getField< bool >( row, 5 ); + disableOrder = exdData->getField< bool >( row, 6 ); +} + +Sapphire::Data::PetMirage::PetMirage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PetMirageDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 2 ); +} + +Sapphire::Data::PhysicsGroup::PhysicsGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PhysicsGroupDat.get_row( row_id ); + simulationTime.push_back( exdData->getField< float >( row, 0 ) ); + simulationTime.push_back( exdData->getField< float >( row, 1 ) ); + simulationTime.push_back( exdData->getField< float >( row, 2 ) ); + simulationTime.push_back( exdData->getField< float >( row, 3 ) ); + simulationTime.push_back( exdData->getField< float >( row, 4 ) ); + simulationTime.push_back( exdData->getField< float >( row, 5 ) ); + pS3SimulationTime.push_back( exdData->getField< float >( row, 6 ) ); + pS3SimulationTime.push_back( exdData->getField< float >( row, 7 ) ); + pS3SimulationTime.push_back( exdData->getField< float >( row, 8 ) ); + pS3SimulationTime.push_back( exdData->getField< float >( row, 9 ) ); + pS3SimulationTime.push_back( exdData->getField< float >( row, 10 ) ); + pS3SimulationTime.push_back( exdData->getField< float >( row, 11 ) ); + resetByLookAt = exdData->getField< bool >( row, 12 ); + rootFollowingGame = exdData->getField< float >( row, 13 ); + rootFollowingCutScene = exdData->getField< float >( row, 14 ); + configSwitch.push_back( exdData->getField< int8_t >( row, 15 ) ); + configSwitch.push_back( exdData->getField< int8_t >( row, 16 ) ); + configSwitch.push_back( exdData->getField< int8_t >( row, 17 ) ); + forceAttractByPhysicsOff = exdData->getField< bool >( row, 18 ); +} + +Sapphire::Data::PhysicsWind::PhysicsWind( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PhysicsWindDat.get_row( row_id ); + threshold = exdData->getField< float >( row, 0 ); + amplitude = exdData->getField< float >( row, 1 ); + amplitudeFrequency = exdData->getField< float >( row, 2 ); + powerMin = exdData->getField< float >( row, 3 ); + powerMax = exdData->getField< float >( row, 4 ); + powerFrequency = exdData->getField< float >( row, 5 ); } Sapphire::Data::Picture::Picture( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4365,7 +7517,6 @@ Sapphire::Data::Picture::Picture( uint32_t row_id, Sapphire::Data::ExdDataGenera auto row = exdData->m_PictureDat.get_row( row_id ); item = exdData->getField< int32_t >( row, 0 ); image = exdData->getField< int32_t >( row, 1 ); - signature = exdData->getField< int32_t >( row, 2 ); } Sapphire::Data::PlaceName::PlaceName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4392,8 +7543,52 @@ Sapphire::Data::PlantPotFlowerSeed::PlantPotFlowerSeed( uint32_t row_id, Sapphir Sapphire::Data::PreHandler::PreHandler( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PreHandlerDat.get_row( row_id ); - target = exdData->getField< uint32_t >( row, 0 ); - actionTimeline = exdData->getField< uint16_t >( row, 2 ); + image = exdData->getField< uint32_t >( row, 1 ); + target = exdData->getField< uint32_t >( row, 2 ); + unlockQuest = exdData->getField< uint32_t >( row, 3 ); + acceptMessage = exdData->getField< uint32_t >( row, 4 ); + denyMessage = exdData->getField< uint32_t >( row, 5 ); +} + +Sapphire::Data::PresetCamera::PresetCamera( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PresetCameraDat.get_row( row_id ); + eID = exdData->getField< uint16_t >( row, 0 ); + posX = exdData->getField< float >( row, 1 ); + posY = exdData->getField< float >( row, 2 ); + posZ = exdData->getField< float >( row, 3 ); + elezen = exdData->getField< float >( row, 4 ); + lalafell = exdData->getField< float >( row, 5 ); + miqote = exdData->getField< float >( row, 6 ); + roe = exdData->getField< float >( row, 7 ); + hrothgar = exdData->getField< float >( row, 8 ); + viera = exdData->getField< float >( row, 9 ); + hyur_F = exdData->getField< float >( row, 10 ); + elezen_F = exdData->getField< float >( row, 11 ); + lalafell_F = exdData->getField< float >( row, 12 ); + miqote_F = exdData->getField< float >( row, 13 ); + roe_F = exdData->getField< float >( row, 14 ); + hrothgar_F = exdData->getField< float >( row, 15 ); + viera_F = exdData->getField< float >( row, 16 ); +} + +Sapphire::Data::PresetCameraAdjust::PresetCameraAdjust( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_PresetCameraAdjustDat.get_row( row_id ); + hyur_M = exdData->getField< float >( row, 0 ); + hyur_F = exdData->getField< float >( row, 1 ); + elezen_M = exdData->getField< float >( row, 2 ); + elezen_F = exdData->getField< float >( row, 3 ); + lalafell_M = exdData->getField< float >( row, 4 ); + lalafell_F = exdData->getField< float >( row, 5 ); + miqote_M = exdData->getField< float >( row, 6 ); + miqote_F = exdData->getField< float >( row, 7 ); + roe_M = exdData->getField< float >( row, 8 ); + roe_F = exdData->getField< float >( row, 9 ); + hrothgar_M = exdData->getField< float >( row, 10 ); + hrothgar_F = exdData->getField< float >( row, 11 ); + viera_M = exdData->getField< float >( row, 12 ); + viera_F = exdData->getField< float >( row, 13 ); } Sapphire::Data::PublicContent::PublicContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4405,8 +7600,12 @@ Sapphire::Data::PublicContent::PublicContent( uint32_t row_id, Sapphire::Data::E name = exdData->getField< std::string >( row, 3 ); textDataStart = exdData->getField< uint32_t >( row, 4 ); textDataEnd = exdData->getField< uint32_t >( row, 5 ); - contentFinderCondition = exdData->getField< uint16_t >( row, 8 ); - additionalData = exdData->getField< uint16_t >( row, 9 ); + startCutscene = exdData->getField< uint32_t >( row, 6 ); + lGBEventRange = exdData->getField< uint32_t >( row, 7 ); + lGBPopRange = exdData->getField< uint32_t >( row, 8 ); + contentFinderCondition = exdData->getField< uint16_t >( row, 9 ); + additionalData = exdData->getField< uint16_t >( row, 10 ); + endCutscene = exdData->getField< uint32_t >( row, 16 ); } Sapphire::Data::PublicContentCutscene::PublicContentCutscene( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -4426,12 +7625,15 @@ Sapphire::Data::PvPAction::PvPAction( uint32_t row_id, Sapphire::Data::ExdDataGe { auto row = exdData->m_PvPActionDat.get_row( row_id ); action = exdData->getField< uint16_t >( row, 0 ); + grandCompany.push_back( exdData->getField< bool >( row, 5 ) ); + grandCompany.push_back( exdData->getField< bool >( row, 6 ) ); + grandCompany.push_back( exdData->getField< bool >( row, 7 ) ); } Sapphire::Data::PvPActionSort::PvPActionSort( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_PvPActionSortDat.get_row( row_id, subRow ); - name = exdData->getField< uint8_t >( row, 0 ); + actionType = exdData->getField< uint8_t >( row, 0 ); action = exdData->getField< uint16_t >( row, 1 ); } @@ -4469,12 +7671,16 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* classJobCategory1 = exdData->getField< uint8_t >( row, 6 ); classJobLevel1 = exdData->getField< uint16_t >( row, 7 ); previousQuestJoin = exdData->getField< uint8_t >( row, 8 ); - previousQuest0 = exdData->getField< uint32_t >( row, 9 ); - previousQuest1 = exdData->getField< uint32_t >( row, 11 ); - previousQuest2 = exdData->getField< uint32_t >( row, 12 ); + previousQuest.push_back( exdData->getField< uint32_t >( row, 9 ) ); + previousQuest0Sequence = exdData->getField< uint8_t >( row, 10 ); + previousQuest.push_back( exdData->getField< uint32_t >( row, 11 ) ); + previousQuest.push_back( exdData->getField< uint32_t >( row, 12 ) ); questLockJoin = exdData->getField< uint8_t >( row, 13 ); questLock.push_back( exdData->getField< uint32_t >( row, 14 ) ); questLock.push_back( exdData->getField< uint32_t >( row, 15 ) ); + header = exdData->getField< uint16_t >( row, 16 ); + startTown = exdData->getField< uint8_t >( row, 17 ); + classJobUnlockFlag = exdData->getField< uint8_t >( row, 18 ); classJobUnlock = exdData->getField< uint8_t >( row, 19 ); grandCompany = exdData->getField< uint8_t >( row, 20 ); grandCompanyRank = exdData->getField< uint8_t >( row, 21 ); @@ -4483,21 +7689,26 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* instanceContent.push_back( exdData->getField< uint32_t >( row, 24 ) ); instanceContent.push_back( exdData->getField< uint32_t >( row, 25 ) ); festival = exdData->getField< uint8_t >( row, 26 ); + festivalBegin = exdData->getField< uint8_t >( row, 27 ); + festivalEnd = exdData->getField< uint8_t >( row, 28 ); bellStart = exdData->getField< uint16_t >( row, 29 ); bellEnd = exdData->getField< uint16_t >( row, 30 ); beastTribe = exdData->getField< uint8_t >( row, 31 ); beastReputationRank = exdData->getField< uint8_t >( row, 32 ); - levelMax = exdData->getField< uint16_t >( row, 33 ); + beastReputationValue = exdData->getField< uint16_t >( row, 33 ); + satisfactionNpc = exdData->getField< uint8_t >( row, 34 ); + satisfactionLevel = exdData->getField< uint8_t >( row, 35 ); mountRequired = exdData->getField< int32_t >( row, 36 ); isHouseRequired = exdData->getField< bool >( row, 37 ); deliveryQuest = exdData->getField< uint8_t >( row, 38 ); issuerStart = exdData->getField< uint32_t >( row, 39 ); - behavior = exdData->getField< uint16_t >( row, 40 ); - targetEnd = exdData->getField< uint32_t >( row, 41 ); - isRepeatable = exdData->getField< bool >( row, 42 ); - repeatIntervalType = exdData->getField< uint8_t >( row, 43 ); - questRepeatFlag = exdData->getField< uint8_t >( row, 44 ); - unlocksSystemContent = exdData->getField< bool >( row, 45 ); + issuerLocation = exdData->getField< uint32_t >( row, 40 ); + clientBehavior = exdData->getField< uint16_t >( row, 41 ); + targetEnd = exdData->getField< uint32_t >( row, 42 ); + isRepeatable = exdData->getField< bool >( row, 43 ); + repeatIntervalType = exdData->getField< uint8_t >( row, 44 ); + questRepeatFlag = exdData->getField< uint8_t >( row, 45 ); + canCancel = exdData->getField< bool >( row, 46 ); type = exdData->getField< uint8_t >( row, 47 ); questClassJobSupply = exdData->getField< uint16_t >( row, 48 ); scriptInstruction.push_back( exdData->getField< std::string >( row, 49 ) ); @@ -4728,70 +7939,70 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* actorDespawnSeq.push_back( exdData->getField< uint8_t >( row, 274 ) ); actorDespawnSeq.push_back( exdData->getField< uint8_t >( row, 275 ) ); actorDespawnSeq.push_back( exdData->getField< uint8_t >( row, 276 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 277 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 278 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 279 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 280 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 281 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 282 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 283 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 284 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 285 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 286 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 287 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 288 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 289 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 290 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 291 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 292 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 293 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 294 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 295 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 296 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 297 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 298 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 299 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 300 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 301 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 302 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 303 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 304 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 305 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 306 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 307 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 308 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 309 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 310 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 311 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 312 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 313 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 314 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 315 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 316 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 317 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 318 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 319 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 320 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 321 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 322 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 323 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 324 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 325 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 326 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 327 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 328 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 329 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 330 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 331 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 332 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 333 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 334 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 335 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 336 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 337 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 338 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 339 ) ); - actorSpawn.push_back( exdData->getField< uint32_t >( row, 340 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 277 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 278 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 279 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 280 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 281 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 282 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 283 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 284 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 285 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 286 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 287 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 288 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 289 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 290 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 291 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 292 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 293 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 294 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 295 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 296 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 297 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 298 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 299 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 300 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 301 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 302 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 303 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 304 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 305 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 306 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 307 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 308 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 309 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 310 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 311 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 312 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 313 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 314 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 315 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 316 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 317 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 318 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 319 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 320 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 321 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 322 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 323 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 324 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 325 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 326 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 327 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 328 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 329 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 330 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 331 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 332 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 333 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 334 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 335 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 336 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 337 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 338 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 339 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 340 ) ); questUInt8A.push_back( exdData->getField< uint8_t >( row, 341 ) ); questUInt8A.push_back( exdData->getField< uint8_t >( row, 342 ) ); questUInt8A.push_back( exdData->getField< uint8_t >( row, 343 ) ); @@ -4856,6 +8067,774 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* questUInt8B.push_back( exdData->getField< uint8_t >( row, 402 ) ); questUInt8B.push_back( exdData->getField< uint8_t >( row, 403 ) ); questUInt8B.push_back( exdData->getField< uint8_t >( row, 404 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 405 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 406 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 407 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 408 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 409 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 410 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 411 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 412 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 413 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 414 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 415 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 416 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 417 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 418 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 419 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 420 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 421 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 422 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 423 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 424 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 425 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 426 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 427 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 428 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 429 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 430 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 431 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 432 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 433 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 434 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 435 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 436 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 437 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 438 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 439 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 440 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 441 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 442 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 443 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 444 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 445 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 446 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 447 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 448 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 449 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 450 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 451 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 452 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 453 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 454 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 455 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 456 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 457 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 458 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 459 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 460 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 461 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 462 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 463 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 464 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 465 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 466 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 467 ) ); + conditionType.push_back( exdData->getField< uint8_t >( row, 468 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 469 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 470 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 471 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 472 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 473 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 474 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 475 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 476 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 477 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 478 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 479 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 480 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 481 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 482 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 483 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 484 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 485 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 486 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 487 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 488 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 489 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 490 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 491 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 492 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 493 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 494 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 495 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 496 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 497 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 498 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 499 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 500 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 501 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 502 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 503 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 504 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 505 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 506 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 507 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 508 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 509 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 510 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 511 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 512 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 513 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 514 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 515 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 516 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 517 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 518 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 519 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 520 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 521 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 522 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 523 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 524 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 525 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 526 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 527 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 528 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 529 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 530 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 531 ) ); + conditionValue.push_back( exdData->getField< uint32_t >( row, 532 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 533 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 534 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 535 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 536 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 537 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 538 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 539 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 540 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 541 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 542 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 543 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 544 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 545 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 546 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 547 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 548 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 549 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 550 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 551 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 552 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 553 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 554 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 555 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 556 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 557 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 558 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 559 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 560 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 561 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 562 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 563 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 564 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 565 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 566 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 567 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 568 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 569 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 570 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 571 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 572 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 573 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 574 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 575 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 576 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 577 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 578 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 579 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 580 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 581 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 582 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 583 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 584 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 585 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 586 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 587 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 588 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 589 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 590 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 591 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 592 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 593 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 594 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 595 ) ); + conditionOperator.push_back( exdData->getField< uint8_t >( row, 596 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 597 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 598 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 599 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 600 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 601 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 602 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 603 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 604 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 605 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 606 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 607 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 608 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 609 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 610 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 611 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 612 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 613 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 614 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 615 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 616 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 617 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 618 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 619 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 620 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 621 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 622 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 623 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 624 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 625 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 626 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 627 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 628 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 629 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 630 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 631 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 632 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 633 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 634 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 635 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 636 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 637 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 638 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 639 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 640 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 641 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 642 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 643 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 644 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 645 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 646 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 647 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 648 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 649 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 650 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 651 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 652 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 653 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 654 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 655 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 656 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 657 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 658 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 659 ) ); + behavior.push_back( exdData->getField< uint16_t >( row, 660 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 661 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 662 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 663 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 664 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 665 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 666 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 667 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 668 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 669 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 670 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 671 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 672 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 673 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 674 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 675 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 676 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 677 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 678 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 679 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 680 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 681 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 682 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 683 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 684 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 685 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 686 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 687 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 688 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 689 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 690 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 691 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 692 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 693 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 694 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 695 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 696 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 697 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 698 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 699 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 700 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 701 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 702 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 703 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 704 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 705 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 706 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 707 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 708 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 709 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 710 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 711 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 712 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 713 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 714 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 715 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 716 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 717 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 718 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 719 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 720 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 721 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 722 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 723 ) ); + visibleBool.push_back( exdData->getField< bool >( row, 724 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 725 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 726 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 727 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 728 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 729 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 730 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 731 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 732 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 733 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 734 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 735 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 736 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 737 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 738 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 739 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 740 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 741 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 742 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 743 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 744 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 745 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 746 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 747 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 748 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 749 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 750 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 751 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 752 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 753 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 754 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 755 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 756 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 757 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 758 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 759 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 760 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 761 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 762 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 763 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 764 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 765 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 766 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 767 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 768 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 769 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 770 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 771 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 772 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 773 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 774 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 775 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 776 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 777 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 778 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 779 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 780 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 781 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 782 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 783 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 784 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 785 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 786 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 787 ) ); + conditionBool.push_back( exdData->getField< bool >( row, 788 ) ); + itemBool.push_back( exdData->getField< bool >( row, 789 ) ); + itemBool.push_back( exdData->getField< bool >( row, 790 ) ); + itemBool.push_back( exdData->getField< bool >( row, 791 ) ); + itemBool.push_back( exdData->getField< bool >( row, 792 ) ); + itemBool.push_back( exdData->getField< bool >( row, 793 ) ); + itemBool.push_back( exdData->getField< bool >( row, 794 ) ); + itemBool.push_back( exdData->getField< bool >( row, 795 ) ); + itemBool.push_back( exdData->getField< bool >( row, 796 ) ); + itemBool.push_back( exdData->getField< bool >( row, 797 ) ); + itemBool.push_back( exdData->getField< bool >( row, 798 ) ); + itemBool.push_back( exdData->getField< bool >( row, 799 ) ); + itemBool.push_back( exdData->getField< bool >( row, 800 ) ); + itemBool.push_back( exdData->getField< bool >( row, 801 ) ); + itemBool.push_back( exdData->getField< bool >( row, 802 ) ); + itemBool.push_back( exdData->getField< bool >( row, 803 ) ); + itemBool.push_back( exdData->getField< bool >( row, 804 ) ); + itemBool.push_back( exdData->getField< bool >( row, 805 ) ); + itemBool.push_back( exdData->getField< bool >( row, 806 ) ); + itemBool.push_back( exdData->getField< bool >( row, 807 ) ); + itemBool.push_back( exdData->getField< bool >( row, 808 ) ); + itemBool.push_back( exdData->getField< bool >( row, 809 ) ); + itemBool.push_back( exdData->getField< bool >( row, 810 ) ); + itemBool.push_back( exdData->getField< bool >( row, 811 ) ); + itemBool.push_back( exdData->getField< bool >( row, 812 ) ); + itemBool.push_back( exdData->getField< bool >( row, 813 ) ); + itemBool.push_back( exdData->getField< bool >( row, 814 ) ); + itemBool.push_back( exdData->getField< bool >( row, 815 ) ); + itemBool.push_back( exdData->getField< bool >( row, 816 ) ); + itemBool.push_back( exdData->getField< bool >( row, 817 ) ); + itemBool.push_back( exdData->getField< bool >( row, 818 ) ); + itemBool.push_back( exdData->getField< bool >( row, 819 ) ); + itemBool.push_back( exdData->getField< bool >( row, 820 ) ); + itemBool.push_back( exdData->getField< bool >( row, 821 ) ); + itemBool.push_back( exdData->getField< bool >( row, 822 ) ); + itemBool.push_back( exdData->getField< bool >( row, 823 ) ); + itemBool.push_back( exdData->getField< bool >( row, 824 ) ); + itemBool.push_back( exdData->getField< bool >( row, 825 ) ); + itemBool.push_back( exdData->getField< bool >( row, 826 ) ); + itemBool.push_back( exdData->getField< bool >( row, 827 ) ); + itemBool.push_back( exdData->getField< bool >( row, 828 ) ); + itemBool.push_back( exdData->getField< bool >( row, 829 ) ); + itemBool.push_back( exdData->getField< bool >( row, 830 ) ); + itemBool.push_back( exdData->getField< bool >( row, 831 ) ); + itemBool.push_back( exdData->getField< bool >( row, 832 ) ); + itemBool.push_back( exdData->getField< bool >( row, 833 ) ); + itemBool.push_back( exdData->getField< bool >( row, 834 ) ); + itemBool.push_back( exdData->getField< bool >( row, 835 ) ); + itemBool.push_back( exdData->getField< bool >( row, 836 ) ); + itemBool.push_back( exdData->getField< bool >( row, 837 ) ); + itemBool.push_back( exdData->getField< bool >( row, 838 ) ); + itemBool.push_back( exdData->getField< bool >( row, 839 ) ); + itemBool.push_back( exdData->getField< bool >( row, 840 ) ); + itemBool.push_back( exdData->getField< bool >( row, 841 ) ); + itemBool.push_back( exdData->getField< bool >( row, 842 ) ); + itemBool.push_back( exdData->getField< bool >( row, 843 ) ); + itemBool.push_back( exdData->getField< bool >( row, 844 ) ); + itemBool.push_back( exdData->getField< bool >( row, 845 ) ); + itemBool.push_back( exdData->getField< bool >( row, 846 ) ); + itemBool.push_back( exdData->getField< bool >( row, 847 ) ); + itemBool.push_back( exdData->getField< bool >( row, 848 ) ); + itemBool.push_back( exdData->getField< bool >( row, 849 ) ); + itemBool.push_back( exdData->getField< bool >( row, 850 ) ); + itemBool.push_back( exdData->getField< bool >( row, 851 ) ); + itemBool.push_back( exdData->getField< bool >( row, 852 ) ); + announceBool.push_back( exdData->getField< bool >( row, 853 ) ); + announceBool.push_back( exdData->getField< bool >( row, 854 ) ); + announceBool.push_back( exdData->getField< bool >( row, 855 ) ); + announceBool.push_back( exdData->getField< bool >( row, 856 ) ); + announceBool.push_back( exdData->getField< bool >( row, 857 ) ); + announceBool.push_back( exdData->getField< bool >( row, 858 ) ); + announceBool.push_back( exdData->getField< bool >( row, 859 ) ); + announceBool.push_back( exdData->getField< bool >( row, 860 ) ); + announceBool.push_back( exdData->getField< bool >( row, 861 ) ); + announceBool.push_back( exdData->getField< bool >( row, 862 ) ); + announceBool.push_back( exdData->getField< bool >( row, 863 ) ); + announceBool.push_back( exdData->getField< bool >( row, 864 ) ); + announceBool.push_back( exdData->getField< bool >( row, 865 ) ); + announceBool.push_back( exdData->getField< bool >( row, 866 ) ); + announceBool.push_back( exdData->getField< bool >( row, 867 ) ); + announceBool.push_back( exdData->getField< bool >( row, 868 ) ); + announceBool.push_back( exdData->getField< bool >( row, 869 ) ); + announceBool.push_back( exdData->getField< bool >( row, 870 ) ); + announceBool.push_back( exdData->getField< bool >( row, 871 ) ); + announceBool.push_back( exdData->getField< bool >( row, 872 ) ); + announceBool.push_back( exdData->getField< bool >( row, 873 ) ); + announceBool.push_back( exdData->getField< bool >( row, 874 ) ); + announceBool.push_back( exdData->getField< bool >( row, 875 ) ); + announceBool.push_back( exdData->getField< bool >( row, 876 ) ); + announceBool.push_back( exdData->getField< bool >( row, 877 ) ); + announceBool.push_back( exdData->getField< bool >( row, 878 ) ); + announceBool.push_back( exdData->getField< bool >( row, 879 ) ); + announceBool.push_back( exdData->getField< bool >( row, 880 ) ); + announceBool.push_back( exdData->getField< bool >( row, 881 ) ); + announceBool.push_back( exdData->getField< bool >( row, 882 ) ); + announceBool.push_back( exdData->getField< bool >( row, 883 ) ); + announceBool.push_back( exdData->getField< bool >( row, 884 ) ); + announceBool.push_back( exdData->getField< bool >( row, 885 ) ); + announceBool.push_back( exdData->getField< bool >( row, 886 ) ); + announceBool.push_back( exdData->getField< bool >( row, 887 ) ); + announceBool.push_back( exdData->getField< bool >( row, 888 ) ); + announceBool.push_back( exdData->getField< bool >( row, 889 ) ); + announceBool.push_back( exdData->getField< bool >( row, 890 ) ); + announceBool.push_back( exdData->getField< bool >( row, 891 ) ); + announceBool.push_back( exdData->getField< bool >( row, 892 ) ); + announceBool.push_back( exdData->getField< bool >( row, 893 ) ); + announceBool.push_back( exdData->getField< bool >( row, 894 ) ); + announceBool.push_back( exdData->getField< bool >( row, 895 ) ); + announceBool.push_back( exdData->getField< bool >( row, 896 ) ); + announceBool.push_back( exdData->getField< bool >( row, 897 ) ); + announceBool.push_back( exdData->getField< bool >( row, 898 ) ); + announceBool.push_back( exdData->getField< bool >( row, 899 ) ); + announceBool.push_back( exdData->getField< bool >( row, 900 ) ); + announceBool.push_back( exdData->getField< bool >( row, 901 ) ); + announceBool.push_back( exdData->getField< bool >( row, 902 ) ); + announceBool.push_back( exdData->getField< bool >( row, 903 ) ); + announceBool.push_back( exdData->getField< bool >( row, 904 ) ); + announceBool.push_back( exdData->getField< bool >( row, 905 ) ); + announceBool.push_back( exdData->getField< bool >( row, 906 ) ); + announceBool.push_back( exdData->getField< bool >( row, 907 ) ); + announceBool.push_back( exdData->getField< bool >( row, 908 ) ); + announceBool.push_back( exdData->getField< bool >( row, 909 ) ); + announceBool.push_back( exdData->getField< bool >( row, 910 ) ); + announceBool.push_back( exdData->getField< bool >( row, 911 ) ); + announceBool.push_back( exdData->getField< bool >( row, 912 ) ); + announceBool.push_back( exdData->getField< bool >( row, 913 ) ); + announceBool.push_back( exdData->getField< bool >( row, 914 ) ); + announceBool.push_back( exdData->getField< bool >( row, 915 ) ); + announceBool.push_back( exdData->getField< bool >( row, 916 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 917 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 918 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 919 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 920 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 921 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 922 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 923 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 924 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 925 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 926 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 927 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 928 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 929 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 930 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 931 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 932 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 933 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 934 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 935 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 936 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 937 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 938 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 939 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 940 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 941 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 942 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 943 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 944 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 945 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 946 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 947 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 948 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 949 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 950 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 951 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 952 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 953 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 954 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 955 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 956 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 957 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 958 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 959 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 960 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 961 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 962 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 963 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 964 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 965 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 966 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 967 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 968 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 969 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 970 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 971 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 972 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 973 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 974 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 975 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 976 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 977 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 978 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 979 ) ); + behaviorBool.push_back( exdData->getField< bool >( row, 980 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 981 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 982 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 983 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 984 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 985 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 986 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 987 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 988 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 989 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 990 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 991 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 992 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 993 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 994 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 995 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 996 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 997 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 998 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 999 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1000 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1001 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1002 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1003 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1004 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1005 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1006 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1007 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1008 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1009 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1010 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1011 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1012 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1013 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1014 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1015 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1016 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1017 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1018 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1019 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1020 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1021 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1022 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1023 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1024 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1025 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1026 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1027 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1028 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1029 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1030 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1031 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1032 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1033 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1034 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1035 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1036 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1037 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1038 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1039 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1040 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1041 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1042 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1043 ) ); + acceptBool.push_back( exdData->getField< bool >( row, 1044 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1045 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1046 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1047 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1048 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1049 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1050 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1051 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1052 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1053 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1054 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1055 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1056 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1057 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1058 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1059 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1060 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1061 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1062 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1063 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1064 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1065 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1066 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1067 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1068 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1069 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1070 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1071 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1072 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1073 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1074 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1075 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1076 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1077 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1078 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1079 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1080 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1081 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1082 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1083 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1084 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1085 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1086 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1087 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1088 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1089 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1090 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1091 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1092 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1093 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1094 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1095 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1096 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1097 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1098 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1099 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1100 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1101 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1102 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1103 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1104 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1105 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1106 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1107 ) ); + qualifiedBool.push_back( exdData->getField< bool >( row, 1108 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1109 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1110 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1111 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1112 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1113 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1114 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1115 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1116 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1117 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1118 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1119 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1120 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1121 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1122 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1123 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1124 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1125 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1126 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1127 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1128 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1129 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1130 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1131 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1132 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1133 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1134 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1135 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1136 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1137 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1138 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1139 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1140 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1141 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1142 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1143 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1144 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1145 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1146 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1147 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1148 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1149 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1150 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1151 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1152 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1153 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1154 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1155 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1156 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1157 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1158 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1159 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1160 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1161 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1162 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1163 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1164 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1165 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1166 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1167 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1168 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1169 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1170 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1171 ) ); + canTargetBool.push_back( exdData->getField< bool >( row, 1172 ) ); toDoCompleteSeq.push_back( exdData->getField< uint8_t >( row, 1173 ) ); toDoCompleteSeq.push_back( exdData->getField< uint8_t >( row, 1174 ) ); toDoCompleteSeq.push_back( exdData->getField< uint8_t >( row, 1175 ) ); @@ -4928,10 +8907,35 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* toDoMainLocation.push_back( exdData->getField< uint32_t >( row, 1242 ) ); toDoMainLocation.push_back( exdData->getField< uint32_t >( row, 1243 ) ); toDoMainLocation.push_back( exdData->getField< uint32_t >( row, 1244 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1413 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1414 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1415 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1416 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1417 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1418 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1419 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1420 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1421 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1422 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1423 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1424 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1425 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1426 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1427 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1428 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1429 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1430 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1431 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1432 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1433 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1434 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1435 ) ); + countableNum.push_back( exdData->getField< uint8_t >( row, 1436 ) ); + levelMax = exdData->getField< uint8_t >( row, 1437 ); classJobRequired = exdData->getField< uint8_t >( row, 1438 ); expFactor = exdData->getField< uint16_t >( row, 1440 ); gilReward = exdData->getField< uint32_t >( row, 1441 ); - gCSeals = exdData->getField< uint16_t >( row, 1443 ); + gCSeals = exdData->getField< uint32_t >( row, 1443 ); itemCatalyst.push_back( exdData->getField< uint8_t >( row, 1444 ) ); itemCatalyst.push_back( exdData->getField< uint8_t >( row, 1445 ) ); itemCatalyst.push_back( exdData->getField< uint8_t >( row, 1446 ) ); @@ -4945,6 +8949,7 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* itemReward0.push_back( exdData->getField< uint32_t >( row, 1454 ) ); itemReward0.push_back( exdData->getField< uint32_t >( row, 1455 ) ); itemReward0.push_back( exdData->getField< uint32_t >( row, 1456 ) ); + itemReward0.push_back( exdData->getField< uint32_t >( row, 1457 ) ); itemCountReward0.push_back( exdData->getField< uint8_t >( row, 1458 ) ); itemCountReward0.push_back( exdData->getField< uint8_t >( row, 1459 ) ); itemCountReward0.push_back( exdData->getField< uint8_t >( row, 1460 ) ); @@ -4981,7 +8986,10 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* actionReward = exdData->getField< uint16_t >( row, 1493 ); generalActionReward.push_back( exdData->getField< uint8_t >( row, 1494 ) ); generalActionReward.push_back( exdData->getField< uint8_t >( row, 1495 ) ); + systemReward0 = exdData->getField< uint16_t >( row, 1496 ); otherReward = exdData->getField< uint8_t >( row, 1497 ); + systemReward1 = exdData->getField< uint16_t >( row, 1498 ); + gCTypeReward = exdData->getField< uint16_t >( row, 1499 ); instanceContentUnlock = exdData->getField< uint32_t >( row, 1500 ); tomestoneReward = exdData->getField< uint8_t >( row, 1502 ); tomestoneCountReward = exdData->getField< uint8_t >( row, 1503 ); @@ -4990,14 +8998,24 @@ Sapphire::Data::Quest::Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* journalGenre = exdData->getField< uint8_t >( row, 1506 ); icon = exdData->getField< uint32_t >( row, 1508 ); iconSpecial = exdData->getField< uint32_t >( row, 1509 ); + introduction = exdData->getField< bool >( row, 1510 ); + hideOfferIcon = exdData->getField< bool >( row, 1511 ); eventIconType = exdData->getField< uint8_t >( row, 1512 ); sortKey = exdData->getField< uint16_t >( row, 1514 ); } +Sapphire::Data::QuestAcceptAdditionCondition::QuestAcceptAdditionCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestAcceptAdditionConditionDat.get_row( row_id ); + requirement0 = exdData->getField< uint32_t >( row, 0 ); + requirement1 = exdData->getField< uint32_t >( row, 1 ); +} + Sapphire::Data::QuestBattle::QuestBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_QuestBattleDat.get_row( row_id ); quest = exdData->getField< int32_t >( row, 0 ); + questBattleScene = exdData->getField< uint8_t >( row, 1 ); timeLimit = exdData->getField< uint16_t >( row, 2 ); levelSync = exdData->getField< uint16_t >( row, 3 ); scriptInstruction.push_back( exdData->getField< std::string >( row, 4 ) ); @@ -5402,6 +9420,13 @@ Sapphire::Data::QuestBattle::QuestBattle( uint32_t row_id, Sapphire::Data::ExdDa scriptValue.push_back( exdData->getField< uint32_t >( row, 403 ) ); } +Sapphire::Data::QuestChapter::QuestChapter( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestChapterDat.get_row( row_id ); + quest = exdData->getField< uint32_t >( row, 0 ); + redo = exdData->getField< uint16_t >( row, 1 ); +} + Sapphire::Data::QuestClassJobReward::QuestClassJobReward( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_QuestClassJobRewardDat.get_row( row_id, subRow ); @@ -5430,6 +9455,98 @@ Sapphire::Data::QuestClassJobSupply::QuestClassJobSupply( uint32_t row_id, uint3 classJobCategory = exdData->getField< uint8_t >( row, 0 ); eNpcResident = exdData->getField< uint32_t >( row, 2 ); item = exdData->getField< uint32_t >( row, 3 ); + amountRequired = exdData->getField< uint8_t >( row, 4 ); + itemHQ = exdData->getField< bool >( row, 5 ); +} + +Sapphire::Data::QuestDerivedClass::QuestDerivedClass( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestDerivedClassDat.get_row( row_id ); + classJob = exdData->getField< uint8_t >( row, 0 ); +} + +Sapphire::Data::QuestEffect::QuestEffect( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestEffectDat.get_row( row_id ); +} + +Sapphire::Data::QuestEffectDefine::QuestEffectDefine( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestEffectDefineDat.get_row( row_id, subRow ); + effect = exdData->getField< uint16_t >( row, 0 ); +} + +Sapphire::Data::QuestRedo::QuestRedo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestRedoDat.get_row( row_id ); + finalQuest = exdData->getField< uint32_t >( row, 0 ); + chapter = exdData->getField< uint16_t >( row, 2 ); + quest.push_back( exdData->getField< uint32_t >( row, 3 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 4 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 5 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 6 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 7 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 8 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 9 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 10 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 11 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 12 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 13 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 14 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 15 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 16 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 17 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 18 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 19 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 20 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 21 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 22 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 23 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 24 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 25 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 26 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 27 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 28 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 29 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 30 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 31 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 32 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 33 ) ); + quest.push_back( exdData->getField< uint32_t >( row, 34 ) ); +} + +Sapphire::Data::QuestRedoChapterUI::QuestRedoChapterUI( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestRedoChapterUIDat.get_row( row_id ); + quest = exdData->getField< uint32_t >( row, 0 ); + uITab = exdData->getField< uint8_t >( row, 1 ); + category = exdData->getField< uint8_t >( row, 2 ); + questRedoUISmall = exdData->getField< uint32_t >( row, 4 ); + questRedoUILarge = exdData->getField< uint32_t >( row, 5 ); + questRedoUIWide = exdData->getField< uint32_t >( row, 6 ); + chapterName = exdData->getField< std::string >( row, 7 ); + chapterPart = exdData->getField< std::string >( row, 8 ); + transient = exdData->getField< std::string >( row, 9 ); +} + +Sapphire::Data::QuestRedoChapterUICategory::QuestRedoChapterUICategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestRedoChapterUICategoryDat.get_row( row_id ); + expac = exdData->getField< std::string >( row, 1 ); +} + +Sapphire::Data::QuestRedoChapterUITab::QuestRedoChapterUITab( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestRedoChapterUITabDat.get_row( row_id ); + icon1 = exdData->getField< uint32_t >( row, 1 ); + icon2 = exdData->getField< uint32_t >( row, 2 ); + text = exdData->getField< std::string >( row, 3 ); +} + +Sapphire::Data::QuestRedoIncompChapter::QuestRedoIncompChapter( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_QuestRedoIncompChapterDat.get_row( row_id, subRow ); + chapter = exdData->getField< uint16_t >( row, 0 ); } Sapphire::Data::QuestRepeatFlag::QuestRepeatFlag( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5473,6 +9590,7 @@ Sapphire::Data::Race::Race( uint32_t row_id, Sapphire::Data::ExdDataGenerated* e rSEFHands = exdData->getField< int32_t >( row, 7 ); rSEFLegs = exdData->getField< int32_t >( row, 8 ); rSEFFeet = exdData->getField< int32_t >( row, 9 ); + exPac = exdData->getField< uint8_t >( row, 11 ); } Sapphire::Data::RacingChocoboItem::RacingChocoboItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5501,6 +9619,9 @@ Sapphire::Data::RacingChocoboNameInfo::RacingChocoboNameInfo( uint32_t row_id, S { auto row = exdData->m_RacingChocoboNameInfoDat.get_row( row_id ); racingChocoboNameCategory = exdData->getField< uint8_t >( row, 0 ); + name.push_back( exdData->getField< uint16_t >( row, 5 ) ); + name.push_back( exdData->getField< uint16_t >( row, 6 ) ); + name.push_back( exdData->getField< uint16_t >( row, 7 ) ); } Sapphire::Data::RacingChocoboParam::RacingChocoboParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5531,11 +9652,13 @@ Sapphire::Data::RecastNavimesh::RecastNavimesh( uint32_t row_id, Sapphire::Data: Sapphire::Data::Recipe::Recipe( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RecipeDat.get_row( row_id ); + number = exdData->getField< int32_t >( row, 0 ); craftType = exdData->getField< int32_t >( row, 1 ); recipeLevelTable = exdData->getField< uint16_t >( row, 2 ); itemResult = exdData->getField< int32_t >( row, 3 ); amountResult = exdData->getField< uint8_t >( row, 4 ); isSecondary = exdData->getField< bool >( row, 26 ); + materialQualityFactor = exdData->getField< uint8_t >( row, 27 ); difficultyFactor = exdData->getField< uint16_t >( row, 28 ); qualityFactor = exdData->getField< uint16_t >( row, 29 ); durabilityFactor = exdData->getField< uint16_t >( row, 30 ); @@ -5544,13 +9667,14 @@ Sapphire::Data::Recipe::Recipe( uint32_t row_id, Sapphire::Data::ExdDataGenerate quickSynthCraftsmanship = exdData->getField< uint16_t >( row, 34 ); quickSynthControl = exdData->getField< uint16_t >( row, 35 ); secretRecipeBook = exdData->getField< uint16_t >( row, 36 ); - canQuickSynth = exdData->getField< bool >( row, 37 ); - canHq = exdData->getField< bool >( row, 38 ); - expRewarded = exdData->getField< bool >( row, 39 ); - statusRequired = exdData->getField< int32_t >( row, 40 ); - itemRequired = exdData->getField< int32_t >( row, 41 ); - isSpecializationRequired = exdData->getField< bool >( row, 42 ); - patchNumber = exdData->getField< uint16_t >( row, 44 ); + canQuickSynth = exdData->getField< bool >( row, 38 ); + canHq = exdData->getField< bool >( row, 39 ); + expRewarded = exdData->getField< bool >( row, 40 ); + statusRequired = exdData->getField< int32_t >( row, 41 ); + itemRequired = exdData->getField< int32_t >( row, 42 ); + isSpecializationRequired = exdData->getField< bool >( row, 43 ); + isExpert = exdData->getField< bool >( row, 44 ); + patchNumber = exdData->getField< uint16_t >( row, 45 ); } Sapphire::Data::RecipeLevelTable::RecipeLevelTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5559,14 +9683,30 @@ Sapphire::Data::RecipeLevelTable::RecipeLevelTable( uint32_t row_id, Sapphire::D classJobLevel = exdData->getField< uint8_t >( row, 0 ); stars = exdData->getField< uint8_t >( row, 1 ); suggestedCraftsmanship = exdData->getField< uint16_t >( row, 2 ); + suggestedControl = exdData->getField< uint16_t >( row, 3 ); difficulty = exdData->getField< uint16_t >( row, 4 ); quality = exdData->getField< uint32_t >( row, 5 ); durability = exdData->getField< uint16_t >( row, 6 ); + conditionsFlag = exdData->getField< uint16_t >( row, 7 ); +} + +Sapphire::Data::RecipeLookup::RecipeLookup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_RecipeLookupDat.get_row( row_id ); + cRP = exdData->getField< uint16_t >( row, 0 ); + bSM = exdData->getField< uint16_t >( row, 1 ); + aRM = exdData->getField< uint16_t >( row, 2 ); + gSM = exdData->getField< uint16_t >( row, 3 ); + lTW = exdData->getField< uint16_t >( row, 4 ); + wVR = exdData->getField< uint16_t >( row, 5 ); + aLC = exdData->getField< uint16_t >( row, 6 ); + cUL = exdData->getField< uint16_t >( row, 7 ); } Sapphire::Data::RecipeNotebookList::RecipeNotebookList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RecipeNotebookListDat.get_row( row_id ); + count = exdData->getField< uint8_t >( row, 0 ); recipe.push_back( exdData->getField< int32_t >( row, 1 ) ); recipe.push_back( exdData->getField< int32_t >( row, 2 ) ); recipe.push_back( exdData->getField< int32_t >( row, 3 ) ); @@ -5733,6 +9873,9 @@ Sapphire::Data::RecommendContents::RecommendContents( uint32_t row_id, Sapphire: { auto row = exdData->m_RecommendContentsDat.get_row( row_id ); level = exdData->getField< int32_t >( row, 0 ); + classJob = exdData->getField< uint8_t >( row, 1 ); + minLevel = exdData->getField< uint8_t >( row, 2 ); + maxLevel = exdData->getField< uint8_t >( row, 3 ); } Sapphire::Data::Relic::Relic( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5741,6 +9884,19 @@ Sapphire::Data::Relic::Relic( uint32_t row_id, Sapphire::Data::ExdDataGenerated* itemAtma = exdData->getField< uint32_t >( row, 0 ); itemAnimus = exdData->getField< uint32_t >( row, 1 ); icon = exdData->getField< int32_t >( row, 2 ); + materia0 = exdData->getField< uint16_t >( row, 3 ); + noteMain0 = exdData->getField< uint8_t >( row, 4 ); + noteSub0 = exdData->getField< uint8_t >( row, 5 ); + noteSelection10 = exdData->getField< uint8_t >( row, 6 ); + materia1 = exdData->getField< uint16_t >( row, 7 ); + noteMain1 = exdData->getField< uint8_t >( row, 8 ); + noteSub1 = exdData->getField< uint8_t >( row, 9 ); + noteSelection1 = exdData->getField< uint8_t >( row, 10 ); + materia2 = exdData->getField< uint16_t >( row, 11 ); + noteMain2 = exdData->getField< uint8_t >( row, 12 ); + noteSub2 = exdData->getField< uint8_t >( row, 13 ); + materia3 = exdData->getField< uint16_t >( row, 14 ); + noteSelection3 = exdData->getField< uint8_t >( row, 15 ); } Sapphire::Data::Relic3::Relic3( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5792,7 +9948,25 @@ Sapphire::Data::Resident::Resident( uint32_t row_id, uint32_t subRow, Sapphire:: auto row = exdData->m_ResidentDat.get_row( row_id, subRow ); model = exdData->getField< uint64_t >( row, 1 ); npcYell = exdData->getField< int32_t >( row, 2 ); - residentMotionType = exdData->getField< uint8_t >( row, 3 ); + residentMotionType = exdData->getField< uint8_t >( row, 4 ); +} + +Sapphire::Data::ResistanceWeaponAdjust::ResistanceWeaponAdjust( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_ResistanceWeaponAdjustDat.get_row( row_id ); + maxTotalStats = exdData->getField< uint16_t >( row, 0 ); + maxEachStat = exdData->getField< uint16_t >( row, 1 ); + baseParam.push_back( exdData->getField< uint8_t >( row, 2 ) ); + baseParam.push_back( exdData->getField< uint8_t >( row, 3 ) ); + baseParam.push_back( exdData->getField< uint8_t >( row, 4 ) ); + baseParam.push_back( exdData->getField< uint8_t >( row, 5 ) ); + image = exdData->getField< uint32_t >( row, 6 ); +} + +Sapphire::Data::RetainerFortuneRewardRange::RetainerFortuneRewardRange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_RetainerFortuneRewardRangeDat.get_row( row_id ); + percentOfLevel = exdData->getField< uint16_t >( row, 0 ); } Sapphire::Data::RetainerTask::RetainerTask( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5806,6 +9980,8 @@ Sapphire::Data::RetainerTask::RetainerTask( uint32_t row_id, Sapphire::Data::Exd maxTimemin = exdData->getField< uint16_t >( row, 6 ); experience = exdData->getField< int32_t >( row, 7 ); requiredItemLevel = exdData->getField< uint16_t >( row, 8 ); + conditionParam0 = exdData->getField< uint8_t >( row, 9 ); + conditionParam1 = exdData->getField< uint8_t >( row, 10 ); requiredGathering = exdData->getField< uint16_t >( row, 11 ); task = exdData->getField< uint16_t >( row, 13 ); } @@ -5846,6 +10022,50 @@ Sapphire::Data::RetainerTaskRandom::RetainerTaskRandom( uint32_t row_id, Sapphir requirement = exdData->getField< int16_t >( row, 1 ); } +Sapphire::Data::RideShooting::RideShooting( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_RideShootingDat.get_row( row_id ); + gFateRideShooting = exdData->getField< uint16_t >( row, 0 ); + startText = exdData->getField< uint16_t >( row, 5 ); + popRange.push_back( exdData->getField< uint32_t >( row, 14 ) ); + popRange.push_back( exdData->getField< uint32_t >( row, 15 ) ); + popRange.push_back( exdData->getField< uint32_t >( row, 16 ) ); + popRange.push_back( exdData->getField< uint32_t >( row, 17 ) ); + popRange.push_back( exdData->getField< uint32_t >( row, 18 ) ); + popRange.push_back( exdData->getField< uint32_t >( row, 19 ) ); + popRange.push_back( exdData->getField< uint32_t >( row, 20 ) ); + popRange.push_back( exdData->getField< uint32_t >( row, 21 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 22 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 23 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 24 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 25 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 26 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 27 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 28 ) ); + eNpc.push_back( exdData->getField< uint32_t >( row, 29 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 30 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 31 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 32 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 33 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 34 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 35 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 36 ) ); + eNpcScale.push_back( exdData->getField< uint8_t >( row, 37 ) ); +} + +Sapphire::Data::RideShootingTargetType::RideShootingTargetType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_RideShootingTargetTypeDat.get_row( row_id ); + eObj = exdData->getField< uint32_t >( row, 0 ); + score = exdData->getField< int16_t >( row, 1 ); +} + +Sapphire::Data::RideShootingTextData::RideShootingTextData( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_RideShootingTextDataDat.get_row( row_id ); + string = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::RPParameter::RPParameter( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_RPParameterDat.get_row( row_id ); @@ -5853,10 +10073,10 @@ Sapphire::Data::RPParameter::RPParameter( uint32_t row_id, Sapphire::Data::ExdDa classJob = exdData->getField< uint8_t >( row, 1 ); } -Sapphire::Data::Salvage::Salvage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +Sapphire::Data::SatisfactionArbitration::SatisfactionArbitration( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { - auto row = exdData->m_SalvageDat.get_row( row_id ); - optimalSkill = exdData->getField< uint16_t >( row, 0 ); + auto row = exdData->m_SatisfactionArbitrationDat.get_row( row_id, subRow ); + quest = exdData->getField< uint32_t >( row, 2 ); } Sapphire::Data::SatisfactionNpc::SatisfactionNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5864,6 +10084,7 @@ Sapphire::Data::SatisfactionNpc::SatisfactionNpc( uint32_t row_id, Sapphire::Dat auto row = exdData->m_SatisfactionNpcDat.get_row( row_id ); npc = exdData->getField< int32_t >( row, 0 ); questRequired = exdData->getField< int32_t >( row, 1 ); + levelUnlock = exdData->getField< uint8_t >( row, 2 ); deliveriesPerWeek = exdData->getField< uint8_t >( row, 3 ); supplyIndex.push_back( exdData->getField< int32_t >( row, 4 ) ); supplyIndex.push_back( exdData->getField< int32_t >( row, 5 ) ); @@ -5926,12 +10147,6 @@ Sapphire::Data::ScenarioTreeTipsClassQuest::ScenarioTreeTipsClassQuest( uint32_t requiredQuest = exdData->getField< uint32_t >( row, 3 ); } -Sapphire::Data::ScenarioTreeTipsQuest::ScenarioTreeTipsQuest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) -{ - auto row = exdData->m_ScenarioTreeTipsQuestDat.get_row( row_id ); - level = exdData->getField< uint32_t >( row, 0 ); -} - Sapphire::Data::ScenarioType::ScenarioType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_ScenarioTypeDat.get_row( row_id ); @@ -5942,6 +10157,9 @@ Sapphire::Data::ScreenImage::ScreenImage( uint32_t row_id, Sapphire::Data::ExdDa { auto row = exdData->m_ScreenImageDat.get_row( row_id ); image = exdData->getField< uint32_t >( row, 0 ); + jingle = exdData->getField< int16_t >( row, 1 ); + type = exdData->getField< int8_t >( row, 2 ); + lang = exdData->getField< bool >( row, 3 ); } Sapphire::Data::SecretRecipeBook::SecretRecipeBook( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -5956,11 +10174,15 @@ Sapphire::Data::SkyIsland2Mission::SkyIsland2Mission( uint32_t row_id, Sapphire: auto row = exdData->m_SkyIsland2MissionDat.get_row( row_id ); item1 = exdData->getField< uint32_t >( row, 0 ); item2 = exdData->getField< uint32_t >( row, 1 ); + placeName = exdData->getField< uint16_t >( row, 2 ); objective1 = exdData->getField< uint16_t >( row, 4 ); + popRange0 = exdData->getField< uint32_t >( row, 5 ); requiredAmount1 = exdData->getField< uint8_t >( row, 6 ); objective2 = exdData->getField< uint16_t >( row, 9 ); + popRange1 = exdData->getField< uint32_t >( row, 10 ); requiredAmount2 = exdData->getField< uint8_t >( row, 11 ); objective3 = exdData->getField< uint16_t >( row, 14 ); + popRange2 = exdData->getField< uint32_t >( row, 15 ); image = exdData->getField< uint32_t >( row, 20 ); } @@ -5985,12 +10207,26 @@ Sapphire::Data::SkyIsland2RangeType::SkyIsland2RangeType( uint32_t row_id, Sapph type = exdData->getField< uint8_t >( row, 0 ); } +Sapphire::Data::SnipeTalk::SnipeTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_SnipeTalkDat.get_row( row_id ); + name = exdData->getField< uint16_t >( row, 2 ); + text = exdData->getField< std::string >( row, 3 ); +} + +Sapphire::Data::SnipeTalkName::SnipeTalkName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_SnipeTalkNameDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::SpearfishingItem::SpearfishingItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_SpearfishingItemDat.get_row( row_id ); description = exdData->getField< std::string >( row, 0 ); item = exdData->getField< int32_t >( row, 1 ); gatheringItemLevel = exdData->getField< uint16_t >( row, 2 ); + fishingRecordType = exdData->getField< uint8_t >( row, 3 ); territoryType = exdData->getField< uint16_t >( row, 4 ); isVisible = exdData->getField< bool >( row, 5 ); } @@ -5999,6 +10235,7 @@ Sapphire::Data::SpearfishingNotebook::SpearfishingNotebook( uint32_t row_id, Sap { auto row = exdData->m_SpearfishingNotebookDat.get_row( row_id ); gatheringLevel = exdData->getField< uint8_t >( row, 0 ); + isShadowNode = exdData->getField< bool >( row, 1 ); territoryType = exdData->getField< int32_t >( row, 2 ); x = exdData->getField< int16_t >( row, 3 ); y = exdData->getField< int16_t >( row, 4 ); @@ -6078,66 +10315,6 @@ Sapphire::Data::SpecialShop::SpecialShop( uint32_t row_id, Sapphire::Data::ExdDa questItem.push_back( exdData->getField< int32_t >( row, 1258 ) ); questItem.push_back( exdData->getField< int32_t >( row, 1259 ) ); questItem.push_back( exdData->getField< int32_t >( row, 1260 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1261 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1262 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1263 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1264 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1265 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1266 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1267 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1268 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1269 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1270 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1271 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1272 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1273 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1274 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1275 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1276 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1277 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1278 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1279 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1280 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1281 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1282 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1283 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1284 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1285 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1286 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1287 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1288 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1289 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1290 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1291 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1292 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1293 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1294 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1295 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1296 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1297 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1298 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1299 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1300 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1301 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1302 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1303 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1304 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1305 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1306 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1307 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1308 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1309 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1310 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1311 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1312 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1313 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1314 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1315 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1316 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1317 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1318 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1319 ) ); - unknown.push_back( exdData->getField< int32_t >( row, 1320 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1321 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1322 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1323 ) ); @@ -6198,69 +10375,70 @@ Sapphire::Data::SpecialShop::SpecialShop( uint32_t row_id, Sapphire::Data::ExdDa achievementUnlock.push_back( exdData->getField< int32_t >( row, 1378 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1379 ) ); achievementUnlock.push_back( exdData->getField< int32_t >( row, 1380 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1801 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1802 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1803 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1804 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1805 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1806 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1807 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1808 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1809 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1810 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1811 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1812 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1813 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1814 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1815 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1816 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1817 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1818 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1819 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1820 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1821 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1822 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1823 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1824 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1825 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1826 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1827 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1828 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1829 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1830 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1831 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1832 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1833 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1834 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1835 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1836 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1837 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1838 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1839 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1840 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1841 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1842 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1843 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1844 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1845 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1846 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1847 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1848 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1849 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1850 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1851 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1852 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1853 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1854 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1855 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1856 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1857 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1858 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1859 ) ); - patchNumber.push_back( exdData->getField< uint16_t >( row, 1860 ) ); - questUnlock = exdData->getField< uint32_t >( row, 1862 ); - notCompleteText = exdData->getField< int32_t >( row, 1863 ); - completeText = exdData->getField< int32_t >( row, 1864 ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1441 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1442 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1443 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1444 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1445 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1446 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1447 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1448 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1449 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1450 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1451 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1452 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1453 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1454 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1455 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1456 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1457 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1458 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1459 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1460 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1461 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1462 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1463 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1464 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1465 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1466 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1467 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1468 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1469 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1470 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1471 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1472 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1473 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1474 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1475 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1476 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1477 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1478 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1479 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1480 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1481 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1482 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1483 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1484 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1485 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1486 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1487 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1488 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1489 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1490 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1491 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1492 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1493 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1494 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1495 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1496 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1497 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1498 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1499 ) ); + patchNumber.push_back( exdData->getField< uint16_t >( row, 1500 ) ); + useCurrencyType = exdData->getField< uint8_t >( row, 1501 ); + questUnlock = exdData->getField< uint32_t >( row, 1502 ); + completeText = exdData->getField< int32_t >( row, 1503 ); + notCompleteText = exdData->getField< int32_t >( row, 1504 ); } Sapphire::Data::SpecialShopItemCategory::SpecialShopItemCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6274,7 +10452,8 @@ Sapphire::Data::Stain::Stain( uint32_t row_id, Sapphire::Data::ExdDataGenerated* auto row = exdData->m_StainDat.get_row( row_id ); color = exdData->getField< uint32_t >( row, 0 ); shade = exdData->getField< uint8_t >( row, 1 ); - name = exdData->getField< std::string >( row, 2 ); + subOrder = exdData->getField< uint8_t >( row, 2 ); + name = exdData->getField< std::string >( row, 3 ); } Sapphire::Data::StainTransient::StainTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6284,6 +10463,13 @@ Sapphire::Data::StainTransient::StainTransient( uint32_t row_id, Sapphire::Data: item2 = exdData->getField< uint32_t >( row, 1 ); } +Sapphire::Data::StanceChange::StanceChange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_StanceChangeDat.get_row( row_id ); + action.push_back( exdData->getField< uint16_t >( row, 1 ) ); + action.push_back( exdData->getField< uint16_t >( row, 2 ) ); +} + Sapphire::Data::Status::Status( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_StatusDat.get_row( row_id ); @@ -6293,7 +10479,7 @@ Sapphire::Data::Status::Status( uint32_t row_id, Sapphire::Data::ExdDataGenerate maxStacks = exdData->getField< uint8_t >( row, 3 ); category = exdData->getField< uint8_t >( row, 5 ); hitEffect = exdData->getField< uint8_t >( row, 6 ); - vFX = exdData->getField< uint8_t >( row, 7 ); + vFX = exdData->getField< uint16_t >( row, 7 ); lockMovement = exdData->getField< bool >( row, 8 ); lockActions = exdData->getField< bool >( row, 10 ); lockControl = exdData->getField< bool >( row, 11 ); @@ -6301,8 +10487,10 @@ Sapphire::Data::Status::Status( uint32_t row_id, Sapphire::Data::ExdDataGenerate canDispel = exdData->getField< bool >( row, 14 ); inflictedByActor = exdData->getField< bool >( row, 15 ); isPermanent = exdData->getField< bool >( row, 16 ); - isFcBuff = exdData->getField< bool >( row, 24 ); - invisibility = exdData->getField< bool >( row, 25 ); + partyListPriority = exdData->getField< uint8_t >( row, 17 ); + log = exdData->getField< uint16_t >( row, 24 ); + isFcBuff = exdData->getField< bool >( row, 25 ); + invisibility = exdData->getField< bool >( row, 26 ); } Sapphire::Data::StatusHitEffect::StatusHitEffect( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6322,6 +10510,1869 @@ Sapphire::Data::StatusLoopVFX::StatusLoopVFX( uint32_t row_id, Sapphire::Data::E Sapphire::Data::Story::Story( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_StoryDat.get_row( row_id ); + script = exdData->getField< std::string >( row, 0 ); + instruction.push_back( exdData->getField< std::string >( row, 1 ) ); + instruction.push_back( exdData->getField< std::string >( row, 2 ) ); + instruction.push_back( exdData->getField< std::string >( row, 3 ) ); + instruction.push_back( exdData->getField< std::string >( row, 4 ) ); + instruction.push_back( exdData->getField< std::string >( row, 5 ) ); + instruction.push_back( exdData->getField< std::string >( row, 6 ) ); + instruction.push_back( exdData->getField< std::string >( row, 7 ) ); + instruction.push_back( exdData->getField< std::string >( row, 8 ) ); + instruction.push_back( exdData->getField< std::string >( row, 9 ) ); + instruction.push_back( exdData->getField< std::string >( row, 10 ) ); + instruction.push_back( exdData->getField< std::string >( row, 11 ) ); + instruction.push_back( exdData->getField< std::string >( row, 12 ) ); + instruction.push_back( exdData->getField< std::string >( row, 13 ) ); + instruction.push_back( exdData->getField< std::string >( row, 14 ) ); + instruction.push_back( exdData->getField< std::string >( row, 15 ) ); + instruction.push_back( exdData->getField< std::string >( row, 16 ) ); + instruction.push_back( exdData->getField< std::string >( row, 17 ) ); + instruction.push_back( exdData->getField< std::string >( row, 18 ) ); + instruction.push_back( exdData->getField< std::string >( row, 19 ) ); + instruction.push_back( exdData->getField< std::string >( row, 20 ) ); + instruction.push_back( exdData->getField< std::string >( row, 21 ) ); + instruction.push_back( exdData->getField< std::string >( row, 22 ) ); + instruction.push_back( exdData->getField< std::string >( row, 23 ) ); + instruction.push_back( exdData->getField< std::string >( row, 24 ) ); + instruction.push_back( exdData->getField< std::string >( row, 25 ) ); + instruction.push_back( exdData->getField< std::string >( row, 26 ) ); + instruction.push_back( exdData->getField< std::string >( row, 27 ) ); + instruction.push_back( exdData->getField< std::string >( row, 28 ) ); + instruction.push_back( exdData->getField< std::string >( row, 29 ) ); + instruction.push_back( exdData->getField< std::string >( row, 30 ) ); + instruction.push_back( exdData->getField< std::string >( row, 31 ) ); + instruction.push_back( exdData->getField< std::string >( row, 32 ) ); + instruction.push_back( exdData->getField< std::string >( row, 33 ) ); + instruction.push_back( exdData->getField< std::string >( row, 34 ) ); + instruction.push_back( exdData->getField< std::string >( row, 35 ) ); + instruction.push_back( exdData->getField< std::string >( row, 36 ) ); + instruction.push_back( exdData->getField< std::string >( row, 37 ) ); + instruction.push_back( exdData->getField< std::string >( row, 38 ) ); + instruction.push_back( exdData->getField< std::string >( row, 39 ) ); + instruction.push_back( exdData->getField< std::string >( row, 40 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 41 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 42 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 43 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 44 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 45 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 46 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 47 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 48 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 49 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 50 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 51 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 52 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 53 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 54 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 55 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 56 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 57 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 58 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 59 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 60 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 61 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 62 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 63 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 64 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 65 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 66 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 67 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 68 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 69 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 70 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 71 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 72 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 73 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 74 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 75 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 76 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 77 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 78 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 79 ) ); + argument.push_back( exdData->getField< uint32_t >( row, 80 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 81 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 82 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 83 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 84 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 85 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 86 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 87 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 88 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 89 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 90 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 91 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 92 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 93 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 94 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 95 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 96 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 97 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 98 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 99 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 100 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 101 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 102 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 103 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 104 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 105 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 106 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 107 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 108 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 109 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 110 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 111 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 112 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 113 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 114 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 115 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 116 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 117 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 118 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 119 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 120 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 121 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 122 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 123 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 124 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 125 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 126 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 127 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 128 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 129 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 130 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 131 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 132 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 133 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 134 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 135 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 136 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 137 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 138 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 139 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 140 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 141 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 142 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 143 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 144 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 145 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 146 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 147 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 148 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 149 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 150 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 151 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 152 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 153 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 154 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 155 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 156 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 157 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 158 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 159 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 160 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 161 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 162 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 163 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 164 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 165 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 166 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 167 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 168 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 169 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 170 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 171 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 172 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 173 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 174 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 175 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 176 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 177 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 178 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 179 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 180 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 181 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 182 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 183 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 184 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 185 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 186 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 187 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 188 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 189 ) ); + sequence.push_back( exdData->getField< uint16_t >( row, 190 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 191 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 192 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 193 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 194 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 195 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 196 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 197 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 198 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 199 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 200 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 201 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 202 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 203 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 204 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 205 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 206 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 207 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 208 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 209 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 210 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 211 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 212 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 213 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 214 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 215 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 216 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 217 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 218 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 219 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 220 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 221 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 222 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 223 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 224 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 225 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 226 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 227 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 228 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 229 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 230 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 231 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 232 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 233 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 234 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 235 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 236 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 237 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 238 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 239 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 240 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 241 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 242 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 243 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 244 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 245 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 246 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 247 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 248 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 249 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 250 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 251 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 252 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 253 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 254 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 255 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 256 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 257 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 258 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 259 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 260 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 261 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 262 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 263 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 264 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 265 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 266 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 267 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 268 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 269 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 270 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 271 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 272 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 273 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 274 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 275 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 276 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 277 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 278 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 279 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 280 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 281 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 282 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 283 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 284 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 285 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 286 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 287 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 288 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 289 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 290 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 291 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 292 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 293 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 294 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 295 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 296 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 297 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 298 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 299 ) ); + completedQuestOperator.push_back( exdData->getField< uint8_t >( row, 300 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 301 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 302 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 303 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 304 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 305 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 306 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 307 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 308 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 309 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 310 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 311 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 312 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 313 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 314 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 315 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 316 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 317 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 318 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 319 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 320 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 321 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 322 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 323 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 324 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 325 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 326 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 327 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 328 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 329 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 330 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 331 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 332 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 333 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 334 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 335 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 336 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 337 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 338 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 339 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 340 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 341 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 342 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 343 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 344 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 345 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 346 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 347 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 348 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 349 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 350 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 351 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 352 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 353 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 354 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 355 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 356 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 357 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 358 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 359 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 360 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 361 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 362 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 363 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 364 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 365 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 366 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 367 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 368 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 369 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 370 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 371 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 372 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 373 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 374 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 375 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 376 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 377 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 378 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 379 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 380 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 381 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 382 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 383 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 384 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 385 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 386 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 387 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 388 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 389 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 390 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 391 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 392 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 393 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 394 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 395 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 396 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 397 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 398 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 399 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 400 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 401 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 402 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 403 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 404 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 405 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 406 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 407 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 408 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 409 ) ); + completedQuest0.push_back( exdData->getField< uint32_t >( row, 410 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 411 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 412 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 413 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 414 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 415 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 416 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 417 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 418 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 419 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 420 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 421 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 422 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 423 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 424 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 425 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 426 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 427 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 428 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 429 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 430 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 431 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 432 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 433 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 434 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 435 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 436 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 437 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 438 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 439 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 440 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 441 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 442 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 443 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 444 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 445 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 446 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 447 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 448 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 449 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 450 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 451 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 452 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 453 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 454 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 455 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 456 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 457 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 458 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 459 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 460 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 461 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 462 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 463 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 464 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 465 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 466 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 467 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 468 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 469 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 470 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 471 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 472 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 473 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 474 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 475 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 476 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 477 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 478 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 479 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 480 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 481 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 482 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 483 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 484 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 485 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 486 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 487 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 488 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 489 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 490 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 491 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 492 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 493 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 494 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 495 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 496 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 497 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 498 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 499 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 500 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 501 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 502 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 503 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 504 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 505 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 506 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 507 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 508 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 509 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 510 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 511 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 512 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 513 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 514 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 515 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 516 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 517 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 518 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 519 ) ); + completedQuest1.push_back( exdData->getField< uint32_t >( row, 520 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 521 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 522 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 523 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 524 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 525 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 526 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 527 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 528 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 529 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 530 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 531 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 532 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 533 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 534 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 535 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 536 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 537 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 538 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 539 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 540 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 541 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 542 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 543 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 544 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 545 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 546 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 547 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 548 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 549 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 550 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 551 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 552 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 553 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 554 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 555 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 556 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 557 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 558 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 559 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 560 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 561 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 562 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 563 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 564 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 565 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 566 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 567 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 568 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 569 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 570 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 571 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 572 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 573 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 574 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 575 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 576 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 577 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 578 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 579 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 580 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 581 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 582 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 583 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 584 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 585 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 586 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 587 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 588 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 589 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 590 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 591 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 592 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 593 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 594 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 595 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 596 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 597 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 598 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 599 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 600 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 601 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 602 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 603 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 604 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 605 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 606 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 607 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 608 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 609 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 610 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 611 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 612 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 613 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 614 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 615 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 616 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 617 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 618 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 619 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 620 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 621 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 622 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 623 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 624 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 625 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 626 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 627 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 628 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 629 ) ); + completedQuest2.push_back( exdData->getField< uint32_t >( row, 630 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 631 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 632 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 633 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 634 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 635 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 636 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 637 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 638 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 639 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 640 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 641 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 642 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 643 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 644 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 645 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 646 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 647 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 648 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 649 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 650 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 651 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 652 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 653 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 654 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 655 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 656 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 657 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 658 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 659 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 660 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 661 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 662 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 663 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 664 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 665 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 666 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 667 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 668 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 669 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 670 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 671 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 672 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 673 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 674 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 675 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 676 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 677 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 678 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 679 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 680 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 681 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 682 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 683 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 684 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 685 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 686 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 687 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 688 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 689 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 690 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 691 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 692 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 693 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 694 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 695 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 696 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 697 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 698 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 699 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 700 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 701 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 702 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 703 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 704 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 705 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 706 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 707 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 708 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 709 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 710 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 711 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 712 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 713 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 714 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 715 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 716 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 717 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 718 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 719 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 720 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 721 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 722 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 723 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 724 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 725 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 726 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 727 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 728 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 729 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 730 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 731 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 732 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 733 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 734 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 735 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 736 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 737 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 738 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 739 ) ); + acceptedQuestOperator.push_back( exdData->getField< uint8_t >( row, 740 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 741 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 742 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 743 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 744 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 745 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 746 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 747 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 748 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 749 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 750 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 751 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 752 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 753 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 754 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 755 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 756 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 757 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 758 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 759 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 760 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 761 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 762 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 763 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 764 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 765 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 766 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 767 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 768 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 769 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 770 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 771 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 772 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 773 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 774 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 775 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 776 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 777 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 778 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 779 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 780 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 781 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 782 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 783 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 784 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 785 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 786 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 787 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 788 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 789 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 790 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 791 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 792 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 793 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 794 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 795 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 796 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 797 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 798 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 799 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 800 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 801 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 802 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 803 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 804 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 805 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 806 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 807 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 808 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 809 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 810 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 811 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 812 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 813 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 814 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 815 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 816 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 817 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 818 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 819 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 820 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 821 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 822 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 823 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 824 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 825 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 826 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 827 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 828 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 829 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 830 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 831 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 832 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 833 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 834 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 835 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 836 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 837 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 838 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 839 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 840 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 841 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 842 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 843 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 844 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 845 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 846 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 847 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 848 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 849 ) ); + acceptedQuest0.push_back( exdData->getField< uint32_t >( row, 850 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 851 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 852 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 853 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 854 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 855 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 856 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 857 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 858 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 859 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 860 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 861 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 862 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 863 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 864 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 865 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 866 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 867 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 868 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 869 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 870 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 871 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 872 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 873 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 874 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 875 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 876 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 877 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 878 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 879 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 880 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 881 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 882 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 883 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 884 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 885 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 886 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 887 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 888 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 889 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 890 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 891 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 892 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 893 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 894 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 895 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 896 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 897 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 898 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 899 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 900 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 901 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 902 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 903 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 904 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 905 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 906 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 907 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 908 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 909 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 910 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 911 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 912 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 913 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 914 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 915 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 916 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 917 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 918 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 919 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 920 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 921 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 922 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 923 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 924 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 925 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 926 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 927 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 928 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 929 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 930 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 931 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 932 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 933 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 934 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 935 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 936 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 937 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 938 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 939 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 940 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 941 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 942 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 943 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 944 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 945 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 946 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 947 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 948 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 949 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 950 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 951 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 952 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 953 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 954 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 955 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 956 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 957 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 958 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 959 ) ); + acceptedQuestSequence0.push_back( exdData->getField< uint8_t >( row, 960 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 961 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 962 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 963 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 964 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 965 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 966 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 967 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 968 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 969 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 970 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 971 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 972 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 973 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 974 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 975 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 976 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 977 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 978 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 979 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 980 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 981 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 982 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 983 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 984 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 985 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 986 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 987 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 988 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 989 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 990 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 991 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 992 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 993 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 994 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 995 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 996 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 997 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 998 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 999 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1000 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1001 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1002 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1003 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1004 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1005 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1006 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1007 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1008 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1009 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1010 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1011 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1012 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1013 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1014 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1015 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1016 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1017 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1018 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1019 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1020 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1021 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1022 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1023 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1024 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1025 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1026 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1027 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1028 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1029 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1030 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1031 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1032 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1033 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1034 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1035 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1036 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1037 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1038 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1039 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1040 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1041 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1042 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1043 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1044 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1045 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1046 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1047 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1048 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1049 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1050 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1051 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1052 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1053 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1054 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1055 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1056 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1057 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1058 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1059 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1060 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1061 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1062 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1063 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1064 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1065 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1066 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1067 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1068 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1069 ) ); + acceptedQuest1.push_back( exdData->getField< uint32_t >( row, 1070 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1071 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1072 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1073 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1074 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1075 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1076 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1077 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1078 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1079 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1080 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1081 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1082 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1083 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1084 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1085 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1086 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1087 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1088 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1089 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1090 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1091 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1092 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1093 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1094 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1095 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1096 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1097 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1098 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1099 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1100 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1101 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1102 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1103 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1104 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1105 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1106 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1107 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1108 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1109 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1110 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1111 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1112 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1113 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1114 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1115 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1116 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1117 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1118 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1119 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1120 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1121 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1122 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1123 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1124 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1125 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1126 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1127 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1128 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1129 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1130 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1131 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1132 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1133 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1134 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1135 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1136 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1137 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1138 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1139 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1140 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1141 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1142 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1143 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1144 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1145 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1146 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1147 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1148 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1149 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1150 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1151 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1152 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1153 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1154 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1155 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1156 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1157 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1158 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1159 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1160 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1161 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1162 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1163 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1164 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1165 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1166 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1167 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1168 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1169 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1170 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1171 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1172 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1173 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1174 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1175 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1176 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1177 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1178 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1179 ) ); + acceptedQuestSequence1.push_back( exdData->getField< uint8_t >( row, 1180 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1181 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1182 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1183 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1184 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1185 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1186 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1187 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1188 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1189 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1190 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1191 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1192 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1193 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1194 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1195 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1196 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1197 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1198 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1199 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1200 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1201 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1202 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1203 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1204 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1205 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1206 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1207 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1208 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1209 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1210 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1211 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1212 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1213 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1214 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1215 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1216 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1217 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1218 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1219 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1220 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1221 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1222 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1223 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1224 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1225 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1226 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1227 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1228 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1229 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1230 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1231 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1232 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1233 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1234 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1235 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1236 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1237 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1238 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1239 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1240 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1241 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1242 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1243 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1244 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1245 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1246 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1247 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1248 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1249 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1250 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1251 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1252 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1253 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1254 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1255 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1256 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1257 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1258 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1259 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1260 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1261 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1262 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1263 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1264 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1265 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1266 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1267 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1268 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1269 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1270 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1271 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1272 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1273 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1274 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1275 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1276 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1277 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1278 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1279 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1280 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1281 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1282 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1283 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1284 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1285 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1286 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1287 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1288 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1289 ) ); + acceptedQuest2.push_back( exdData->getField< uint32_t >( row, 1290 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1291 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1292 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1293 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1294 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1295 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1296 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1297 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1298 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1299 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1300 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1301 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1302 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1303 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1304 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1305 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1306 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1307 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1308 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1309 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1310 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1311 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1312 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1313 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1314 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1315 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1316 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1317 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1318 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1319 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1320 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1321 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1322 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1323 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1324 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1325 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1326 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1327 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1328 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1329 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1330 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1331 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1332 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1333 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1334 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1335 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1336 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1337 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1338 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1339 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1340 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1341 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1342 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1343 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1344 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1345 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1346 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1347 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1348 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1349 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1350 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1351 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1352 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1353 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1354 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1355 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1356 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1357 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1358 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1359 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1360 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1361 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1362 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1363 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1364 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1365 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1366 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1367 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1368 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1369 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1370 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1371 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1372 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1373 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1374 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1375 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1376 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1377 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1378 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1379 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1380 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1381 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1382 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1383 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1384 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1385 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1386 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1387 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1388 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1389 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1390 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1391 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1392 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1393 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1394 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1395 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1396 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1397 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1398 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1399 ) ); + acceptedQuestSequence2.push_back( exdData->getField< uint8_t >( row, 1400 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1401 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1402 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1403 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1404 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1405 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1406 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1407 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1408 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1409 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1410 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1411 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1412 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1413 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1414 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1415 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1416 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1417 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1418 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1419 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1420 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1421 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1422 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1423 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1424 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1425 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1426 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1427 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1428 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1429 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1430 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1431 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1432 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1433 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1434 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1435 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1436 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1437 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1438 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1439 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1440 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1441 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1442 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1443 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1444 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1445 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1446 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1447 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1448 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1449 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1450 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1451 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1452 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1453 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1454 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1455 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1456 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1457 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1458 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1459 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1460 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1461 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1462 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1463 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1464 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1465 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1466 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1467 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1468 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1469 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1470 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1471 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1472 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1473 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1474 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1475 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1476 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1477 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1478 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1479 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1480 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1481 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1482 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1483 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1484 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1485 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1486 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1487 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1488 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1489 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1490 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1491 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1492 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1493 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1494 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1495 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1496 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1497 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1498 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1499 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1500 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1501 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1502 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1503 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1504 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1505 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1506 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1507 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1508 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1509 ) ); + layerSet0.push_back( exdData->getField< uint32_t >( row, 1510 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1511 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1512 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1513 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1514 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1515 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1516 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1517 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1518 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1519 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1520 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1521 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1522 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1523 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1524 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1525 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1526 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1527 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1528 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1529 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1530 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1531 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1532 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1533 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1534 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1535 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1536 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1537 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1538 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1539 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1540 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1541 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1542 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1543 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1544 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1545 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1546 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1547 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1548 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1549 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1550 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1551 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1552 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1553 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1554 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1555 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1556 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1557 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1558 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1559 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1560 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1561 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1562 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1563 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1564 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1565 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1566 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1567 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1568 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1569 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1570 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1571 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1572 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1573 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1574 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1575 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1576 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1577 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1578 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1579 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1580 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1581 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1582 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1583 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1584 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1585 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1586 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1587 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1588 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1589 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1590 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1591 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1592 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1593 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1594 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1595 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1596 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1597 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1598 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1599 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1600 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1601 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1602 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1603 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1604 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1605 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1606 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1607 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1608 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1609 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1610 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1611 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1612 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1613 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1614 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1615 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1616 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1617 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1618 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1619 ) ); + layerSet1.push_back( exdData->getField< uint32_t >( row, 1620 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1621 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1622 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1623 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1624 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1625 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1626 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1627 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1628 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1629 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1630 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1631 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1632 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1633 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1634 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1635 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1636 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1637 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1638 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1639 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1640 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1641 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1642 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1643 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1644 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1645 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1646 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1647 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1648 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1649 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1650 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1651 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1652 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1653 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1654 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1655 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1656 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1657 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1658 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1659 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1660 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1661 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1662 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1663 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1664 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1665 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1666 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1667 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1668 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1669 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1670 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1671 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1672 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1673 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1674 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1675 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1676 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1677 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1678 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1679 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1680 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1681 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1682 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1683 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1684 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1685 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1686 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1687 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1688 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1689 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1690 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1691 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1692 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1693 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1694 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1695 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1696 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1697 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1698 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1699 ) ); + sequenceBegin.push_back( exdData->getField< uint16_t >( row, 1700 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1701 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1702 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1703 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1704 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1705 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1706 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1707 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1708 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1709 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1710 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1711 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1712 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1713 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1714 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1715 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1716 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1717 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1718 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1719 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1720 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1721 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1722 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1723 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1724 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1725 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1726 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1727 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1728 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1729 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1730 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1731 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1732 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1733 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1734 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1735 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1736 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1737 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1738 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1739 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1740 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1741 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1742 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1743 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1744 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1745 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1746 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1747 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1748 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1749 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1750 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1751 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1752 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1753 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1754 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1755 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1756 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1757 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1758 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1759 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1760 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1761 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1762 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1763 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1764 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1765 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1766 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1767 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1768 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1769 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1770 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1771 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1772 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1773 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1774 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1775 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1776 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1777 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1778 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1779 ) ); + sequenceEnd.push_back( exdData->getField< uint16_t >( row, 1780 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1781 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1782 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1783 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1784 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1785 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1786 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1787 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1788 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1789 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1790 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1791 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1792 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1793 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1794 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1795 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1796 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1797 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1798 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1799 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1800 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1801 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1802 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1803 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1804 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1805 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1806 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1807 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1808 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1809 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1810 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1811 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1812 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1813 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1814 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1815 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1816 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1817 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1818 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1819 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1820 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1821 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1822 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1823 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1824 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1825 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1826 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1827 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1828 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1829 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1830 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1831 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1832 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1833 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1834 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1835 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1836 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1837 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1838 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1839 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1840 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1841 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1842 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1843 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1844 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1845 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1846 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1847 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1848 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1849 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1850 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1851 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1852 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1853 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1854 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1855 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1856 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1857 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1858 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1859 ) ); + listener.push_back( exdData->getField< uint32_t >( row, 1860 ) ); + layerSetTerritoryType0 = exdData->getField< uint16_t >( row, 1861 ); + layerSetTerritoryType1 = exdData->getField< uint16_t >( row, 1862 ); } Sapphire::Data::SubmarineExploration::SubmarineExploration( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6329,6 +12380,8 @@ Sapphire::Data::SubmarineExploration::SubmarineExploration( uint32_t row_id, Sap auto row = exdData->m_SubmarineExplorationDat.get_row( row_id ); destination = exdData->getField< std::string >( row, 0 ); location = exdData->getField< std::string >( row, 1 ); + map = exdData->getField< uint8_t >( row, 5 ); + stars = exdData->getField< uint8_t >( row, 7 ); rankReq = exdData->getField< uint8_t >( row, 8 ); ceruleumTankReq = exdData->getField< uint8_t >( row, 9 ); durationmin = exdData->getField< uint16_t >( row, 10 ); @@ -6336,6 +12389,13 @@ Sapphire::Data::SubmarineExploration::SubmarineExploration( uint32_t row_id, Sap expReward = exdData->getField< uint32_t >( row, 12 ); } +Sapphire::Data::SubmarineMap::SubmarineMap( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_SubmarineMapDat.get_row( row_id ); + name = exdData->getField< std::string >( row, 0 ); + image = exdData->getField< uint32_t >( row, 1 ); +} + Sapphire::Data::SubmarinePart::SubmarinePart( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_SubmarinePartDat.get_row( row_id ); @@ -6347,50 +12407,33 @@ Sapphire::Data::SubmarinePart::SubmarinePart( uint32_t row_id, Sapphire::Data::E speed = exdData->getField< int16_t >( row, 5 ); range = exdData->getField< int16_t >( row, 6 ); favor = exdData->getField< int16_t >( row, 7 ); + _class = exdData->getField< uint16_t >( row, 8 ); repairMaterials = exdData->getField< uint8_t >( row, 9 ); } Sapphire::Data::SubmarineRank::SubmarineRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_SubmarineRankDat.get_row( row_id ); - rank = exdData->getField< uint16_t >( row, 0 ); + capacity = exdData->getField< uint16_t >( row, 0 ); expToNext = exdData->getField< uint32_t >( row, 1 ); + surveillanceBonus = exdData->getField< uint8_t >( row, 2 ); + retrievalBonus = exdData->getField< uint8_t >( row, 3 ); + speedBonus = exdData->getField< uint8_t >( row, 4 ); + rangeBonus = exdData->getField< uint8_t >( row, 5 ); + favorBonus = exdData->getField< uint8_t >( row, 6 ); } Sapphire::Data::SwitchTalk::SwitchTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_SwitchTalkDat.get_row( row_id ); - quest.push_back( exdData->getField< uint32_t >( row, 2 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 3 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 4 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 5 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 6 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 7 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 8 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 9 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 10 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 11 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 12 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 13 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 14 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 15 ) ); - quest.push_back( exdData->getField< uint32_t >( row, 16 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 17 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 18 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 19 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 20 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 21 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 22 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 23 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 24 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 25 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 26 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 27 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 28 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 29 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 30 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 31 ) ); - defaultTalk.push_back( exdData->getField< uint32_t >( row, 32 ) ); +} + +Sapphire::Data::SwitchTalkVariation::SwitchTalkVariation( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_SwitchTalkVariationDat.get_row( row_id, subRow ); + quest0 = exdData->getField< uint32_t >( row, 0 ); + quest1 = exdData->getField< uint32_t >( row, 1 ); + defaultTalk = exdData->getField< uint32_t >( row, 3 ); } Sapphire::Data::TerritoryType::TerritoryType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6398,18 +12441,37 @@ Sapphire::Data::TerritoryType::TerritoryType( uint32_t row_id, Sapphire::Data::E auto row = exdData->m_TerritoryTypeDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); bg = exdData->getField< std::string >( row, 1 ); + battalionMode = exdData->getField< uint8_t >( row, 2 ); placeNameRegion = exdData->getField< uint16_t >( row, 3 ); placeNameZone = exdData->getField< uint16_t >( row, 4 ); placeName = exdData->getField< uint16_t >( row, 5 ); map = exdData->getField< uint16_t >( row, 6 ); + loadingImage = exdData->getField< uint8_t >( row, 7 ); + exclusiveType = exdData->getField< uint8_t >( row, 8 ); territoryIntendedUse = exdData->getField< uint8_t >( row, 9 ); + contentFinderCondition = exdData->getField< uint16_t >( row, 10 ); weatherRate = exdData->getField< uint8_t >( row, 12 ); + pCSearch = exdData->getField< bool >( row, 15 ); + stealth = exdData->getField< bool >( row, 16 ); + mount = exdData->getField< bool >( row, 17 ); + bGM = exdData->getField< uint16_t >( row, 19 ); placeNameRegionIcon = exdData->getField< int32_t >( row, 20 ); placeNameIcon = exdData->getField< int32_t >( row, 21 ); arrayEventHandler = exdData->getField< uint32_t >( row, 22 ); questBattle = exdData->getField< uint16_t >( row, 23 ); aetheryte = exdData->getField< int32_t >( row, 24 ); + fixedTime = exdData->getField< int32_t >( row, 25 ); + resident = exdData->getField< uint16_t >( row, 26 ); + achievementIndex = exdData->getField< int8_t >( row, 27 ); isPvpZone = exdData->getField< bool >( row, 28 ); + exVersion = exdData->getField< uint8_t >( row, 29 ); + mountSpeed = exdData->getField< uint8_t >( row, 33 ); +} + +Sapphire::Data::TerritoryTypeTransient::TerritoryTypeTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_TerritoryTypeTransientDat.get_row( row_id ); + offsetZ = exdData->getField< int16_t >( row, 0 ); } Sapphire::Data::TextCommand::TextCommand( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6420,6 +12482,13 @@ Sapphire::Data::TextCommand::TextCommand( uint32_t row_id, Sapphire::Data::ExdDa description = exdData->getField< std::string >( row, 7 ); alias = exdData->getField< std::string >( row, 8 ); shortAlias = exdData->getField< std::string >( row, 9 ); + param = exdData->getField< uint16_t >( row, 10 ); +} + +Sapphire::Data::TextCommandParam::TextCommandParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_TextCommandParamDat.get_row( row_id ); + param = exdData->getField< std::string >( row, 0 ); } Sapphire::Data::Title::Title( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6490,20 +12559,24 @@ Sapphire::Data::Transformation::Transformation( uint32_t row_id, Sapphire::Data: bNpcName = exdData->getField< uint16_t >( row, 2 ); bNpcCustomize = exdData->getField< int32_t >( row, 3 ); npcEquip = exdData->getField< int32_t >( row, 4 ); - action.push_back( exdData->getField< uint16_t >( row, 10 ) ); - action.push_back( exdData->getField< uint16_t >( row, 11 ) ); - action.push_back( exdData->getField< uint16_t >( row, 12 ) ); - action.push_back( exdData->getField< uint16_t >( row, 13 ) ); - action.push_back( exdData->getField< uint16_t >( row, 14 ) ); - action.push_back( exdData->getField< uint16_t >( row, 15 ) ); - rPParameter = exdData->getField< uint8_t >( row, 18 ); - speed = exdData->getField< float >( row, 19 ); - scale = exdData->getField< float >( row, 20 ); - isPvP = exdData->getField< bool >( row, 21 ); - isEvent = exdData->getField< bool >( row, 22 ); - playerCamera = exdData->getField< bool >( row, 23 ); - startVFX = exdData->getField< uint16_t >( row, 24 ); - endVFX = exdData->getField< uint16_t >( row, 25 ); + exHotbarEnableConfig = exdData->getField< bool >( row, 5 ); + action0 = exdData->getField< uint16_t >( row, 6 ); + action1 = exdData->getField< uint16_t >( row, 8 ); + action2 = exdData->getField< uint16_t >( row, 10 ); + action3 = exdData->getField< uint16_t >( row, 12 ); + action4 = exdData->getField< uint16_t >( row, 14 ); + action5 = exdData->getField< uint16_t >( row, 16 ); + rPParameter = exdData->getField< uint16_t >( row, 18 ); + removeAction = exdData->getField< uint16_t >( row, 19 ); + speed = exdData->getField< float >( row, 23 ); + scale = exdData->getField< float >( row, 24 ); + isPvP = exdData->getField< bool >( row, 25 ); + isEvent = exdData->getField< bool >( row, 26 ); + playerCamera = exdData->getField< bool >( row, 27 ); + startVFX = exdData->getField< uint16_t >( row, 30 ); + endVFX = exdData->getField< uint16_t >( row, 31 ); + action6 = exdData->getField< uint32_t >( row, 32 ); + action7 = exdData->getField< uint16_t >( row, 35 ); } Sapphire::Data::Treasure::Treasure( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6520,13 +12593,21 @@ Sapphire::Data::TreasureHuntRank::TreasureHuntRank( uint32_t row_id, Sapphire::D keyItemName = exdData->getField< int32_t >( row, 3 ); instanceMap = exdData->getField< int32_t >( row, 4 ); maxPartySize = exdData->getField< uint8_t >( row, 5 ); - minPartySize = exdData->getField< uint8_t >( row, 6 ); + treasureHuntTexture = exdData->getField< uint8_t >( row, 6 ); +} + +Sapphire::Data::TreasureModel::TreasureModel( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_TreasureModelDat.get_row( row_id ); + path = exdData->getField< std::string >( row, 0 ); } Sapphire::Data::TreasureSpot::TreasureSpot( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_TreasureSpotDat.get_row( row_id, subRow ); location = exdData->getField< int32_t >( row, 0 ); + mapOffsetX = exdData->getField< float >( row, 1 ); + mapOffsetY = exdData->getField< float >( row, 2 ); } Sapphire::Data::Tribe::Tribe( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6534,9 +12615,11 @@ Sapphire::Data::Tribe::Tribe( uint32_t row_id, Sapphire::Data::ExdDataGenerated* auto row = exdData->m_TribeDat.get_row( row_id ); masculine = exdData->getField< std::string >( row, 0 ); feminine = exdData->getField< std::string >( row, 1 ); + hp = exdData->getField< int8_t >( row, 2 ); + mp = exdData->getField< int8_t >( row, 3 ); sTR = exdData->getField< int8_t >( row, 4 ); - dEX = exdData->getField< int8_t >( row, 5 ); - vIT = exdData->getField< int8_t >( row, 6 ); + vIT = exdData->getField< int8_t >( row, 5 ); + dEX = exdData->getField< int8_t >( row, 6 ); iNT = exdData->getField< int8_t >( row, 7 ); mND = exdData->getField< int8_t >( row, 8 ); pIE = exdData->getField< int8_t >( row, 9 ); @@ -6601,6 +12684,12 @@ Sapphire::Data::TripleTriadCardResident::TripleTriadCardResident( uint32_t row_i tripleTriadCardType = exdData->getField< uint8_t >( row, 6 ); saleValue = exdData->getField< uint16_t >( row, 7 ); sortKey = exdData->getField< uint8_t >( row, 8 ); + order = exdData->getField< uint16_t >( row, 9 ); + uIPriority = exdData->getField< uint8_t >( row, 10 ); + acquisitionType = exdData->getField< uint8_t >( row, 12 ); + acquisition = exdData->getField< uint32_t >( row, 13 ); + location = exdData->getField< uint32_t >( row, 14 ); + quest = exdData->getField< uint32_t >( row, 15 ); } Sapphire::Data::TripleTriadCardType::TripleTriadCardType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6615,10 +12704,17 @@ Sapphire::Data::TripleTriadCompetition::TripleTriadCompetition( uint32_t row_id, name = exdData->getField< std::string >( row, 0 ); } +Sapphire::Data::TripleTriadResident::TripleTriadResident( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_TripleTriadResidentDat.get_row( row_id ); + order = exdData->getField< uint16_t >( row, 0 ); +} + Sapphire::Data::TripleTriadRule::TripleTriadRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_TripleTriadRuleDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + description = exdData->getField< std::string >( row, 1 ); } Sapphire::Data::Tutorial::Tutorial( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6650,6 +12746,52 @@ Sapphire::Data::TutorialTank::TutorialTank( uint32_t row_id, Sapphire::Data::Exd objective = exdData->getField< uint8_t >( row, 0 ); } +Sapphire::Data::UDS_Event::UDS_Event( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_UDS_EventDat.get_row( row_id ); + text = exdData->getField< std::string >( row, 0 ); + type = exdData->getField< std::string >( row, 1 ); + property.push_back( exdData->getField< int32_t >( row, 2 ) ); + property.push_back( exdData->getField< int32_t >( row, 3 ) ); + property.push_back( exdData->getField< int32_t >( row, 4 ) ); + property.push_back( exdData->getField< int32_t >( row, 5 ) ); + property.push_back( exdData->getField< int32_t >( row, 6 ) ); + property.push_back( exdData->getField< int32_t >( row, 7 ) ); + property.push_back( exdData->getField< int32_t >( row, 8 ) ); + property.push_back( exdData->getField< int32_t >( row, 9 ) ); + property.push_back( exdData->getField< int32_t >( row, 10 ) ); + property.push_back( exdData->getField< int32_t >( row, 11 ) ); + property.push_back( exdData->getField< int32_t >( row, 12 ) ); + property.push_back( exdData->getField< int32_t >( row, 13 ) ); + property.push_back( exdData->getField< int32_t >( row, 14 ) ); + property.push_back( exdData->getField< int32_t >( row, 15 ) ); + property.push_back( exdData->getField< int32_t >( row, 16 ) ); + property.push_back( exdData->getField< int32_t >( row, 17 ) ); + property.push_back( exdData->getField< int32_t >( row, 18 ) ); + property.push_back( exdData->getField< int32_t >( row, 19 ) ); + property.push_back( exdData->getField< int32_t >( row, 20 ) ); + property.push_back( exdData->getField< int32_t >( row, 21 ) ); + property.push_back( exdData->getField< int32_t >( row, 22 ) ); + property.push_back( exdData->getField< int32_t >( row, 23 ) ); + property.push_back( exdData->getField< int32_t >( row, 24 ) ); + property.push_back( exdData->getField< int32_t >( row, 25 ) ); + property.push_back( exdData->getField< int32_t >( row, 26 ) ); + property.push_back( exdData->getField< int32_t >( row, 27 ) ); + property.push_back( exdData->getField< int32_t >( row, 28 ) ); + property.push_back( exdData->getField< int32_t >( row, 29 ) ); + property.push_back( exdData->getField< int32_t >( row, 30 ) ); + property.push_back( exdData->getField< int32_t >( row, 31 ) ); + property.push_back( exdData->getField< int32_t >( row, 32 ) ); + property.push_back( exdData->getField< int32_t >( row, 33 ) ); +} + +Sapphire::Data::UDS_Property::UDS_Property( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_UDS_PropertyDat.get_row( row_id ); + text = exdData->getField< std::string >( row, 0 ); + type = exdData->getField< std::string >( row, 1 ); +} + Sapphire::Data::UIColor::UIColor( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_UIColorDat.get_row( row_id ); @@ -6672,28 +12814,38 @@ Sapphire::Data::VFX::VFX( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exd Sapphire::Data::Warp::Warp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_WarpDat.get_row( row_id ); - level = exdData->getField< uint32_t >( row, 0 ); - placeName = exdData->getField< uint16_t >( row, 1 ); + popRange = exdData->getField< uint32_t >( row, 0 ); + territoryType = exdData->getField< uint16_t >( row, 1 ); conditionSuccessEvent = exdData->getField< uint32_t >( row, 2 ); conditionFailEvent = exdData->getField< uint32_t >( row, 3 ); confirmEvent = exdData->getField< uint32_t >( row, 4 ); warpCondition = exdData->getField< uint16_t >( row, 5 ); warpLogic = exdData->getField< uint16_t >( row, 6 ); + startCutscene = exdData->getField< uint16_t >( row, 7 ); + endCutscene = exdData->getField< uint16_t >( row, 8 ); + canSkipCutscene = exdData->getField< bool >( row, 9 ); + name = exdData->getField< std::string >( row, 10 ); + question = exdData->getField< std::string >( row, 11 ); } Sapphire::Data::WarpCondition::WarpCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_WarpConditionDat.get_row( row_id ); + gil = exdData->getField< uint16_t >( row, 0 ); + completeParam = exdData->getField< uint8_t >( row, 1 ); requiredQuest1 = exdData->getField< uint32_t >( row, 2 ); requiredQuest2 = exdData->getField< uint32_t >( row, 3 ); dRequiredQuest3 = exdData->getField< uint32_t >( row, 4 ); requiredQuest4 = exdData->getField< uint32_t >( row, 5 ); + questReward = exdData->getField< uint16_t >( row, 6 ); + classLevel = exdData->getField< uint16_t >( row, 7 ); } Sapphire::Data::WarpLogic::WarpLogic( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_WarpLogicDat.get_row( row_id ); warpName = exdData->getField< std::string >( row, 1 ); + canSkipCutscene = exdData->getField< bool >( row, 2 ); function.push_back( exdData->getField< std::string >( row, 3 ) ); function.push_back( exdData->getField< std::string >( row, 4 ) ); function.push_back( exdData->getField< std::string >( row, 5 ) ); @@ -6709,6 +12861,13 @@ Sapphire::Data::WarpLogic::WarpLogic( uint32_t row_id, Sapphire::Data::ExdDataGe responseNo = exdData->getField< std::string >( row, 25 ); } +Sapphire::Data::WeaponTimeline::WeaponTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_WeaponTimelineDat.get_row( row_id ); + file = exdData->getField< std::string >( row, 0 ); + nextWeaponTimeline = exdData->getField< int16_t >( row, 1 ); +} + Sapphire::Data::Weather::Weather( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_WeatherDat.get_row( row_id ); @@ -6735,6 +12894,21 @@ Sapphire::Data::WeatherReportReplace::WeatherReportReplace( uint32_t row_id, Sap placeNameParent = exdData->getField< uint16_t >( row, 1 ); } +Sapphire::Data::WebGuidance::WebGuidance( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_WebGuidanceDat.get_row( row_id ); + image = exdData->getField< int32_t >( row, 0 ); + url = exdData->getField< uint8_t >( row, 1 ); + name = exdData->getField< std::string >( row, 2 ); + description = exdData->getField< std::string >( row, 4 ); +} + +Sapphire::Data::WebURL::WebURL( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_WebURLDat.get_row( row_id ); + uRL = exdData->getField< std::string >( row, 0 ); +} + Sapphire::Data::WeddingBGM::WeddingBGM( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_WeddingBGMDat.get_row( row_id ); @@ -6805,6 +12979,7 @@ Sapphire::Data::World::World( uint32_t row_id, Sapphire::Data::ExdDataGenerated* { auto row = exdData->m_WorldDat.get_row( row_id ); name = exdData->getField< std::string >( row, 0 ); + userType = exdData->getField< uint8_t >( row, 1 ); dataCenter = exdData->getField< uint8_t >( row, 2 ); isPublic = exdData->getField< bool >( row, 3 ); } @@ -6816,6 +12991,20 @@ Sapphire::Data::WorldDCGroupType::WorldDCGroupType( uint32_t row_id, Sapphire::D region = exdData->getField< uint8_t >( row, 1 ); } +Sapphire::Data::YardCatalogCategory::YardCatalogCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_YardCatalogCategoryDat.get_row( row_id ); + category = exdData->getField< std::string >( row, 0 ); +} + +Sapphire::Data::YardCatalogItemList::YardCatalogItemList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) +{ + auto row = exdData->m_YardCatalogItemListDat.get_row( row_id ); + category = exdData->getField< uint16_t >( row, 0 ); + item = exdData->getField< int32_t >( row, 1 ); + patch = exdData->getField< uint16_t >( row, 2 ); +} + Sapphire::Data::YKW::YKW( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ) { auto row = exdData->m_YKWDat.get_row( row_id ); @@ -6823,6 +13012,9 @@ Sapphire::Data::YKW::YKW( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exd location.push_back( exdData->getField< uint16_t >( row, 2 ) ); location.push_back( exdData->getField< uint16_t >( row, 3 ) ); location.push_back( exdData->getField< uint16_t >( row, 4 ) ); + location.push_back( exdData->getField< uint16_t >( row, 5 ) ); + location.push_back( exdData->getField< uint16_t >( row, 6 ) ); + location.push_back( exdData->getField< uint16_t >( row, 7 ) ); } Sapphire::Data::ZoneSharedGroup::ZoneSharedGroup( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ) @@ -6858,7 +13050,7 @@ void Sapphire::Data::ExdDataGenerated::loadIdList( xiv::exd::Exd& data, std::set for( auto row : pDataRows ) { - uint32_t id = row.first; + uint32_t id = row.first.rowId; outIdList.insert( id ); } } @@ -6872,7 +13064,9 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_AchievementDat = setupDatAccess( "Achievement", xiv::exd::Language::en ); m_AchievementCategoryDat = setupDatAccess( "AchievementCategory", xiv::exd::Language::en ); + m_AchievementHideConditionDat = setupDatAccess( "AchievementHideCondition", xiv::exd::Language::none ); m_AchievementKindDat = setupDatAccess( "AchievementKind", xiv::exd::Language::en ); + m_AchievementTargetDat = setupDatAccess( "AchievementTarget", xiv::exd::Language::none ); m_ActionDat = setupDatAccess( "Action", xiv::exd::Language::en ); m_ActionCastTimelineDat = setupDatAccess( "ActionCastTimeline", xiv::exd::Language::none ); m_ActionCastVFXDat = setupDatAccess( "ActionCastVFX", xiv::exd::Language::none ); @@ -6890,7 +13084,6 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_ActivityFeedGroupCaptionsDat = setupDatAccess( "ActivityFeedGroupCaptions", xiv::exd::Language::none ); m_ActivityFeedImagesDat = setupDatAccess( "ActivityFeedImages", xiv::exd::Language::none ); m_AddonDat = setupDatAccess( "Addon", xiv::exd::Language::en ); - m_AddonHudDat = setupDatAccess( "AddonHud", xiv::exd::Language::en ); m_AdventureDat = setupDatAccess( "Adventure", xiv::exd::Language::en ); m_AdventureExPhaseDat = setupDatAccess( "AdventureExPhase", xiv::exd::Language::none ); m_AetherCurrentDat = setupDatAccess( "AetherCurrent", xiv::exd::Language::none ); @@ -6903,6 +13096,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_AirshipExplorationParamTypeDat = setupDatAccess( "AirshipExplorationParamType", xiv::exd::Language::en ); m_AirshipExplorationPartDat = setupDatAccess( "AirshipExplorationPart", xiv::exd::Language::none ); m_AirshipExplorationPointDat = setupDatAccess( "AirshipExplorationPoint", xiv::exd::Language::en ); + m_AnimationLODDat = setupDatAccess( "AnimationLOD", xiv::exd::Language::none ); m_AnimaWeapon5Dat = setupDatAccess( "AnimaWeapon5", xiv::exd::Language::none ); m_AnimaWeapon5ParamDat = setupDatAccess( "AnimaWeapon5Param", xiv::exd::Language::en ); m_AnimaWeapon5PatternGroupDat = setupDatAccess( "AnimaWeapon5PatternGroup", xiv::exd::Language::en ); @@ -6919,20 +13113,28 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_AOZBossDat = setupDatAccess( "AOZBoss", xiv::exd::Language::none ); m_AOZContentDat = setupDatAccess( "AOZContent", xiv::exd::Language::none ); m_AOZContentBriefingBNpcDat = setupDatAccess( "AOZContentBriefingBNpc", xiv::exd::Language::none ); + m_AOZReportDat = setupDatAccess( "AOZReport", xiv::exd::Language::none ); + m_AOZScoreDat = setupDatAccess( "AOZScore", xiv::exd::Language::en ); m_AquariumFishDat = setupDatAccess( "AquariumFish", xiv::exd::Language::none ); m_AquariumWaterDat = setupDatAccess( "AquariumWater", xiv::exd::Language::en ); m_ArrayEventHandlerDat = setupDatAccess( "ArrayEventHandler", xiv::exd::Language::none ); m_AttackTypeDat = setupDatAccess( "AttackType", xiv::exd::Language::en ); m_BacklightColorDat = setupDatAccess( "BacklightColor", xiv::exd::Language::none ); + m_BallistaDat = setupDatAccess( "Ballista", xiv::exd::Language::none ); m_BalloonDat = setupDatAccess( "Balloon", xiv::exd::Language::en ); m_BaseParamDat = setupDatAccess( "BaseParam", xiv::exd::Language::en ); m_BattleLeveDat = setupDatAccess( "BattleLeve", xiv::exd::Language::none ); + m_BattleLeveRuleDat = setupDatAccess( "BattleLeveRule", xiv::exd::Language::none ); m_BeastRankBonusDat = setupDatAccess( "BeastRankBonus", xiv::exd::Language::none ); m_BeastReputationRankDat = setupDatAccess( "BeastReputationRank", xiv::exd::Language::en ); m_BeastTribeDat = setupDatAccess( "BeastTribe", xiv::exd::Language::en ); m_BehaviorDat = setupDatAccess( "Behavior", xiv::exd::Language::none ); + m_BehaviorPathDat = setupDatAccess( "BehaviorPath", xiv::exd::Language::none ); + m_BenchmarkOverrideEquipmentDat = setupDatAccess( "BenchmarkOverrideEquipment", xiv::exd::Language::none ); m_BGMDat = setupDatAccess( "BGM", xiv::exd::Language::none ); m_BGMFadeDat = setupDatAccess( "BGMFade", xiv::exd::Language::none ); + m_BGMFadeTypeDat = setupDatAccess( "BGMFadeType", xiv::exd::Language::none ); + m_BGMSceneDat = setupDatAccess( "BGMScene", xiv::exd::Language::none ); m_BGMSituationDat = setupDatAccess( "BGMSituation", xiv::exd::Language::none ); m_BGMSwitchDat = setupDatAccess( "BGMSwitch", xiv::exd::Language::none ); m_BGMSystemDefineDat = setupDatAccess( "BGMSystemDefine", xiv::exd::Language::none ); @@ -6941,6 +13143,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_BNpcCustomizeDat = setupDatAccess( "BNpcCustomize", xiv::exd::Language::none ); m_BNpcNameDat = setupDatAccess( "BNpcName", xiv::exd::Language::en ); m_BNpcPartsDat = setupDatAccess( "BNpcParts", xiv::exd::Language::none ); + m_BNpcStateDat = setupDatAccess( "BNpcState", xiv::exd::Language::none ); m_BuddyDat = setupDatAccess( "Buddy", xiv::exd::Language::none ); m_BuddyActionDat = setupDatAccess( "BuddyAction", xiv::exd::Language::en ); m_BuddyEquipDat = setupDatAccess( "BuddyEquip", xiv::exd::Language::en ); @@ -6950,7 +13153,11 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_CabinetDat = setupDatAccess( "Cabinet", xiv::exd::Language::none ); m_CabinetCategoryDat = setupDatAccess( "CabinetCategory", xiv::exd::Language::none ); m_CalendarDat = setupDatAccess( "Calendar", xiv::exd::Language::none ); + m_CarryDat = setupDatAccess( "Carry", xiv::exd::Language::none ); + m_ChannelingDat = setupDatAccess( "Channeling", xiv::exd::Language::none ); + m_CharaMakeClassEquipDat = setupDatAccess( "CharaMakeClassEquip", xiv::exd::Language::none ); m_CharaMakeCustomizeDat = setupDatAccess( "CharaMakeCustomize", xiv::exd::Language::none ); + m_CharaMakeNameDat = setupDatAccess( "CharaMakeName", xiv::exd::Language::en ); m_CharaMakeTypeDat = setupDatAccess( "CharaMakeType", xiv::exd::Language::en ); m_ChocoboRaceDat = setupDatAccess( "ChocoboRace", xiv::exd::Language::none ); m_ChocoboRaceAbilityDat = setupDatAccess( "ChocoboRaceAbility", xiv::exd::Language::en ); @@ -6963,8 +13170,15 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_ChocoboRaceWeatherDat = setupDatAccess( "ChocoboRaceWeather", xiv::exd::Language::none ); m_ChocoboTaxiDat = setupDatAccess( "ChocoboTaxi", xiv::exd::Language::none ); m_ChocoboTaxiStandDat = setupDatAccess( "ChocoboTaxiStand", xiv::exd::Language::en ); + m_CircleActivityDat = setupDatAccess( "CircleActivity", xiv::exd::Language::en ); m_ClassJobDat = setupDatAccess( "ClassJob", xiv::exd::Language::en ); m_ClassJobCategoryDat = setupDatAccess( "ClassJobCategory", xiv::exd::Language::en ); + m_CollectablesShopDat = setupDatAccess( "CollectablesShop", xiv::exd::Language::en ); + m_CollectablesShopItemDat = setupDatAccess( "CollectablesShopItem", xiv::exd::Language::none ); + m_CollectablesShopItemGroupDat = setupDatAccess( "CollectablesShopItemGroup", xiv::exd::Language::en ); + m_CollectablesShopRefineDat = setupDatAccess( "CollectablesShopRefine", xiv::exd::Language::none ); + m_CollectablesShopRewardItemDat = setupDatAccess( "CollectablesShopRewardItem", xiv::exd::Language::none ); + m_CollectablesShopRewardScripDat = setupDatAccess( "CollectablesShopRewardScrip", xiv::exd::Language::none ); m_CompanionDat = setupDatAccess( "Companion", xiv::exd::Language::en ); m_CompanionMoveDat = setupDatAccess( "CompanionMove", xiv::exd::Language::en ); m_CompanionTransientDat = setupDatAccess( "CompanionTransient", xiv::exd::Language::en ); @@ -6981,6 +13195,9 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_CompanyLeveRuleDat = setupDatAccess( "CompanyLeveRule", xiv::exd::Language::none ); m_CompleteJournalDat = setupDatAccess( "CompleteJournal", xiv::exd::Language::en ); m_CompleteJournalCategoryDat = setupDatAccess( "CompleteJournalCategory", xiv::exd::Language::none ); + m_CompletionDat = setupDatAccess( "Completion", xiv::exd::Language::en ); + m_ConditionDat = setupDatAccess( "Condition", xiv::exd::Language::none ); + m_ConfigKeyDat = setupDatAccess( "ConfigKey", xiv::exd::Language::en ); m_ContentCloseCycleDat = setupDatAccess( "ContentCloseCycle", xiv::exd::Language::none ); m_ContentExActionDat = setupDatAccess( "ContentExAction", xiv::exd::Language::none ); m_ContentFinderConditionDat = setupDatAccess( "ContentFinderCondition", xiv::exd::Language::en ); @@ -6989,28 +13206,40 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_ContentGaugeColorDat = setupDatAccess( "ContentGaugeColor", xiv::exd::Language::none ); m_ContentMemberTypeDat = setupDatAccess( "ContentMemberType", xiv::exd::Language::none ); m_ContentNpcTalkDat = setupDatAccess( "ContentNpcTalk", xiv::exd::Language::none ); + m_ContentRandomSelectDat = setupDatAccess( "ContentRandomSelect", xiv::exd::Language::none ); m_ContentRouletteDat = setupDatAccess( "ContentRoulette", xiv::exd::Language::en ); m_ContentRouletteOpenRuleDat = setupDatAccess( "ContentRouletteOpenRule", xiv::exd::Language::none ); m_ContentRouletteRoleBonusDat = setupDatAccess( "ContentRouletteRoleBonus", xiv::exd::Language::none ); m_ContentsNoteDat = setupDatAccess( "ContentsNote", xiv::exd::Language::en ); + m_ContentsTutorialDat = setupDatAccess( "ContentsTutorial", xiv::exd::Language::en ); + m_ContentsTutorialPageDat = setupDatAccess( "ContentsTutorialPage", xiv::exd::Language::en ); m_ContentTalkDat = setupDatAccess( "ContentTalk", xiv::exd::Language::en ); m_ContentTalkParamDat = setupDatAccess( "ContentTalkParam", xiv::exd::Language::none ); m_ContentTypeDat = setupDatAccess( "ContentType", xiv::exd::Language::en ); m_CraftActionDat = setupDatAccess( "CraftAction", xiv::exd::Language::en ); m_CraftLeveDat = setupDatAccess( "CraftLeve", xiv::exd::Language::none ); + m_CraftLevelDifferenceDat = setupDatAccess( "CraftLevelDifference", xiv::exd::Language::none ); + m_CraftLeveTalkDat = setupDatAccess( "CraftLeveTalk", xiv::exd::Language::en ); m_CraftTypeDat = setupDatAccess( "CraftType", xiv::exd::Language::en ); m_CreditDat = setupDatAccess( "Credit", xiv::exd::Language::none ); m_CreditBackImageDat = setupDatAccess( "CreditBackImage", xiv::exd::Language::none ); m_CreditCastDat = setupDatAccess( "CreditCast", xiv::exd::Language::en ); m_CreditListDat = setupDatAccess( "CreditList", xiv::exd::Language::none ); m_CreditListTextDat = setupDatAccess( "CreditListText", xiv::exd::Language::en ); - m_CurrencyDat = setupDatAccess( "Currency", xiv::exd::Language::none ); m_CustomTalkDat = setupDatAccess( "CustomTalk", xiv::exd::Language::en ); - m_CustomTalkDynamicIconDat = setupDatAccess( "CustomTalkDynamicIcon", xiv::exd::Language::none ); m_CustomTalkNestHandlersDat = setupDatAccess( "CustomTalkNestHandlers", xiv::exd::Language::none ); m_CutsceneDat = setupDatAccess( "Cutscene", xiv::exd::Language::none ); + m_CutSceneIncompQuestDat = setupDatAccess( "CutSceneIncompQuest", xiv::exd::Language::none ); + m_CutsceneMotionDat = setupDatAccess( "CutsceneMotion", xiv::exd::Language::none ); + m_CutsceneWorkIndexDat = setupDatAccess( "CutsceneWorkIndex", xiv::exd::Language::none ); m_CutScreenImageDat = setupDatAccess( "CutScreenImage", xiv::exd::Language::none ); + m_CycleTimeDat = setupDatAccess( "CycleTime", xiv::exd::Language::none ); m_DailySupplyItemDat = setupDatAccess( "DailySupplyItem", xiv::exd::Language::none ); + m_DawnContentDat = setupDatAccess( "DawnContent", xiv::exd::Language::none ); + m_DawnGrowMemberDat = setupDatAccess( "DawnGrowMember", xiv::exd::Language::none ); + m_DawnMemberUIParamDat = setupDatAccess( "DawnMemberUIParam", xiv::exd::Language::en ); + m_DawnQuestAnnounceDat = setupDatAccess( "DawnQuestAnnounce", xiv::exd::Language::none ); + m_DawnQuestMemberDat = setupDatAccess( "DawnQuestMember", xiv::exd::Language::none ); m_DeepDungeonDat = setupDatAccess( "DeepDungeon", xiv::exd::Language::en ); m_DeepDungeonBanDat = setupDatAccess( "DeepDungeonBan", xiv::exd::Language::none ); m_DeepDungeonDangerDat = setupDatAccess( "DeepDungeonDanger", xiv::exd::Language::none ); @@ -7025,7 +13254,9 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_DefaultTalkDat = setupDatAccess( "DefaultTalk", xiv::exd::Language::en ); m_DefaultTalkLipSyncTypeDat = setupDatAccess( "DefaultTalkLipSyncType", xiv::exd::Language::none ); m_DeliveryQuestDat = setupDatAccess( "DeliveryQuest", xiv::exd::Language::none ); + m_DescriptionDat = setupDatAccess( "Description", xiv::exd::Language::en ); m_DescriptionPageDat = setupDatAccess( "DescriptionPage", xiv::exd::Language::none ); + m_DescriptionSectionDat = setupDatAccess( "DescriptionSection", xiv::exd::Language::none ); m_DescriptionStringDat = setupDatAccess( "DescriptionString", xiv::exd::Language::en ); m_DisposalShopDat = setupDatAccess( "DisposalShop", xiv::exd::Language::en ); m_DisposalShopFilterTypeDat = setupDatAccess( "DisposalShopFilterType", xiv::exd::Language::en ); @@ -7033,10 +13264,15 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_DpsChallengeDat = setupDatAccess( "DpsChallenge", xiv::exd::Language::en ); m_DpsChallengeOfficerDat = setupDatAccess( "DpsChallengeOfficer", xiv::exd::Language::none ); m_DpsChallengeTransientDat = setupDatAccess( "DpsChallengeTransient", xiv::exd::Language::none ); + m_DynamicEventDat = setupDatAccess( "DynamicEvent", xiv::exd::Language::en ); + m_DynamicEventEnemyTypeDat = setupDatAccess( "DynamicEventEnemyType", xiv::exd::Language::en ); + m_DynamicEventSingleBattleDat = setupDatAccess( "DynamicEventSingleBattle", xiv::exd::Language::en ); + m_DynamicEventTypeDat = setupDatAccess( "DynamicEventType", xiv::exd::Language::none ); m_EmjAddonDat = setupDatAccess( "EmjAddon", xiv::exd::Language::en ); m_EmjDaniDat = setupDatAccess( "EmjDani", xiv::exd::Language::none ); m_EmoteDat = setupDatAccess( "Emote", xiv::exd::Language::en ); m_EmoteCategoryDat = setupDatAccess( "EmoteCategory", xiv::exd::Language::en ); + m_EmoteModeDat = setupDatAccess( "EmoteMode", xiv::exd::Language::none ); m_ENpcBaseDat = setupDatAccess( "ENpcBase", xiv::exd::Language::none ); m_ENpcDressUpDat = setupDatAccess( "ENpcDressUp", xiv::exd::Language::none ); m_ENpcDressUpDressDat = setupDatAccess( "ENpcDressUpDress", xiv::exd::Language::none ); @@ -7054,23 +13290,32 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_EurekaMagiciteItemTypeDat = setupDatAccess( "EurekaMagiciteItemType", xiv::exd::Language::en ); m_EurekaSphereElementAdjustDat = setupDatAccess( "EurekaSphereElementAdjust", xiv::exd::Language::none ); m_EventActionDat = setupDatAccess( "EventAction", xiv::exd::Language::en ); + m_EventCustomIconTypeDat = setupDatAccess( "EventCustomIconType", xiv::exd::Language::none ); m_EventIconPriorityDat = setupDatAccess( "EventIconPriority", xiv::exd::Language::none ); m_EventIconTypeDat = setupDatAccess( "EventIconType", xiv::exd::Language::none ); m_EventItemDat = setupDatAccess( "EventItem", xiv::exd::Language::en ); m_EventItemCastTimelineDat = setupDatAccess( "EventItemCastTimeline", xiv::exd::Language::none ); m_EventItemHelpDat = setupDatAccess( "EventItemHelp", xiv::exd::Language::en ); m_EventItemTimelineDat = setupDatAccess( "EventItemTimeline", xiv::exd::Language::none ); + m_EventSystemDefineDat = setupDatAccess( "EventSystemDefine", xiv::exd::Language::none ); + m_ExportedGatheringPointDat = setupDatAccess( "ExportedGatheringPoint", xiv::exd::Language::none ); m_ExportedSGDat = setupDatAccess( "ExportedSG", xiv::exd::Language::none ); m_ExVersionDat = setupDatAccess( "ExVersion", xiv::exd::Language::en ); m_FateDat = setupDatAccess( "Fate", xiv::exd::Language::en ); + m_FateEventDat = setupDatAccess( "FateEvent", xiv::exd::Language::en ); + m_FateModeDat = setupDatAccess( "FateMode", xiv::exd::Language::none ); + m_FateProgressUIDat = setupDatAccess( "FateProgressUI", xiv::exd::Language::none ); + m_FateTokenTypeDat = setupDatAccess( "FateTokenType", xiv::exd::Language::none ); m_FCActivityDat = setupDatAccess( "FCActivity", xiv::exd::Language::en ); m_FCActivityCategoryDat = setupDatAccess( "FCActivityCategory", xiv::exd::Language::en ); m_FCAuthorityDat = setupDatAccess( "FCAuthority", xiv::exd::Language::en ); m_FCAuthorityCategoryDat = setupDatAccess( "FCAuthorityCategory", xiv::exd::Language::en ); m_FCChestNameDat = setupDatAccess( "FCChestName", xiv::exd::Language::en ); + m_FCCrestSymbolDat = setupDatAccess( "FCCrestSymbol", xiv::exd::Language::none ); m_FccShopDat = setupDatAccess( "FccShop", xiv::exd::Language::en ); m_FCHierarchyDat = setupDatAccess( "FCHierarchy", xiv::exd::Language::en ); m_FCProfileDat = setupDatAccess( "FCProfile", xiv::exd::Language::en ); + m_FCRankDat = setupDatAccess( "FCRank", xiv::exd::Language::none ); m_FCReputationDat = setupDatAccess( "FCReputation", xiv::exd::Language::en ); m_FCRightsDat = setupDatAccess( "FCRights", xiv::exd::Language::en ); m_FestivalDat = setupDatAccess( "Festival", xiv::exd::Language::none ); @@ -7081,6 +13326,8 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_FishParameterDat = setupDatAccess( "FishParameter", xiv::exd::Language::en ); m_Frontline03Dat = setupDatAccess( "Frontline03", xiv::exd::Language::none ); m_Frontline04Dat = setupDatAccess( "Frontline04", xiv::exd::Language::none ); + m_FurnitureCatalogCategoryDat = setupDatAccess( "FurnitureCatalogCategory", xiv::exd::Language::en ); + m_FurnitureCatalogItemListDat = setupDatAccess( "FurnitureCatalogItemList", xiv::exd::Language::none ); m_GardeningSeedDat = setupDatAccess( "GardeningSeed", xiv::exd::Language::none ); m_GatheringConditionDat = setupDatAccess( "GatheringCondition", xiv::exd::Language::en ); m_GatheringExpDat = setupDatAccess( "GatheringExp", xiv::exd::Language::none ); @@ -7089,15 +13336,19 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_GatheringItemPointDat = setupDatAccess( "GatheringItemPoint", xiv::exd::Language::none ); m_GatheringLeveDat = setupDatAccess( "GatheringLeve", xiv::exd::Language::none ); m_GatheringLeveRouteDat = setupDatAccess( "GatheringLeveRoute", xiv::exd::Language::none ); + m_GatheringLeveRuleDat = setupDatAccess( "GatheringLeveRule", xiv::exd::Language::none ); m_GatheringNotebookListDat = setupDatAccess( "GatheringNotebookList", xiv::exd::Language::none ); m_GatheringPointDat = setupDatAccess( "GatheringPoint", xiv::exd::Language::none ); m_GatheringPointBaseDat = setupDatAccess( "GatheringPointBase", xiv::exd::Language::none ); m_GatheringPointBonusDat = setupDatAccess( "GatheringPointBonus", xiv::exd::Language::none ); m_GatheringPointBonusTypeDat = setupDatAccess( "GatheringPointBonusType", xiv::exd::Language::en ); m_GatheringPointNameDat = setupDatAccess( "GatheringPointName", xiv::exd::Language::en ); + m_GatheringPointTransientDat = setupDatAccess( "GatheringPointTransient", xiv::exd::Language::none ); + m_GatheringRarePopTimeTableDat = setupDatAccess( "GatheringRarePopTimeTable", xiv::exd::Language::none ); m_GatheringSubCategoryDat = setupDatAccess( "GatheringSubCategory", xiv::exd::Language::en ); m_GatheringTypeDat = setupDatAccess( "GatheringType", xiv::exd::Language::en ); m_GcArmyCaptureTacticsDat = setupDatAccess( "GcArmyCaptureTactics", xiv::exd::Language::none ); + m_GcArmyEquipPresetDat = setupDatAccess( "GcArmyEquipPreset", xiv::exd::Language::none ); m_GcArmyExpeditionDat = setupDatAccess( "GcArmyExpedition", xiv::exd::Language::en ); m_GcArmyExpeditionMemberBonusDat = setupDatAccess( "GcArmyExpeditionMemberBonus", xiv::exd::Language::none ); m_GcArmyExpeditionTypeDat = setupDatAccess( "GcArmyExpeditionType", xiv::exd::Language::en ); @@ -7123,13 +13374,24 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_GFateRideShootingDat = setupDatAccess( "GFateRideShooting", xiv::exd::Language::none ); m_GilShopDat = setupDatAccess( "GilShop", xiv::exd::Language::en ); m_GilShopItemDat = setupDatAccess( "GilShopItem", xiv::exd::Language::none ); + m_GimmickAccessorDat = setupDatAccess( "GimmickAccessor", xiv::exd::Language::none ); + m_GimmickJumpDat = setupDatAccess( "GimmickJump", xiv::exd::Language::none ); + m_GimmickRectDat = setupDatAccess( "GimmickRect", xiv::exd::Language::none ); m_GoldSaucerArcadeMachineDat = setupDatAccess( "GoldSaucerArcadeMachine", xiv::exd::Language::en ); m_GoldSaucerTextDataDat = setupDatAccess( "GoldSaucerTextData", xiv::exd::Language::en ); m_GrandCompanyDat = setupDatAccess( "GrandCompany", xiv::exd::Language::en ); m_GrandCompanyRankDat = setupDatAccess( "GrandCompanyRank", xiv::exd::Language::none ); + m_GroupPoseFrameDat = setupDatAccess( "GroupPoseFrame", xiv::exd::Language::en ); + m_GroupPoseStampDat = setupDatAccess( "GroupPoseStamp", xiv::exd::Language::en ); + m_GroupPoseStampCategoryDat = setupDatAccess( "GroupPoseStampCategory", xiv::exd::Language::en ); m_GuardianDeityDat = setupDatAccess( "GuardianDeity", xiv::exd::Language::en ); - m_GuildleveAssignmentDat = setupDatAccess( "GuildleveAssignment", xiv::exd::Language::none ); + m_GuideDat = setupDatAccess( "Guide", xiv::exd::Language::none ); + m_GuidePageDat = setupDatAccess( "GuidePage", xiv::exd::Language::none ); + m_GuidePageStringDat = setupDatAccess( "GuidePageString", xiv::exd::Language::en ); + m_GuideTitleDat = setupDatAccess( "GuideTitle", xiv::exd::Language::en ); + m_GuildleveAssignmentDat = setupDatAccess( "GuildleveAssignment", xiv::exd::Language::en ); m_GuildleveAssignmentCategoryDat = setupDatAccess( "GuildleveAssignmentCategory", xiv::exd::Language::none ); + m_GuildleveAssignmentTalkDat = setupDatAccess( "GuildleveAssignmentTalk", xiv::exd::Language::en ); m_GuildOrderDat = setupDatAccess( "GuildOrder", xiv::exd::Language::en ); m_GuildOrderGuideDat = setupDatAccess( "GuildOrderGuide", xiv::exd::Language::none ); m_GuildOrderOfficerDat = setupDatAccess( "GuildOrderOfficer", xiv::exd::Language::none ); @@ -7151,32 +13413,69 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_HowToDat = setupDatAccess( "HowTo", xiv::exd::Language::en ); m_HowToCategoryDat = setupDatAccess( "HowToCategory", xiv::exd::Language::en ); m_HowToPageDat = setupDatAccess( "HowToPage", xiv::exd::Language::en ); - m_InstanceContentDat = setupDatAccess( "InstanceContent", xiv::exd::Language::en ); + m_HugeCraftworksNpcDat = setupDatAccess( "HugeCraftworksNpc", xiv::exd::Language::en ); + m_HugeCraftworksRankDat = setupDatAccess( "HugeCraftworksRank", xiv::exd::Language::none ); + m_HWDAnnounceDat = setupDatAccess( "HWDAnnounce", xiv::exd::Language::en ); + m_HWDCrafterSupplyDat = setupDatAccess( "HWDCrafterSupply", xiv::exd::Language::none ); + m_HWDCrafterSupplyRewardDat = setupDatAccess( "HWDCrafterSupplyReward", xiv::exd::Language::none ); + m_HWDCrafterSupplyTermDat = setupDatAccess( "HWDCrafterSupplyTerm", xiv::exd::Language::en ); + m_HWDDevLayerControlDat = setupDatAccess( "HWDDevLayerControl", xiv::exd::Language::none ); + m_HWDDevLevelUIDat = setupDatAccess( "HWDDevLevelUI", xiv::exd::Language::none ); + m_HWDDevLivelyDat = setupDatAccess( "HWDDevLively", xiv::exd::Language::none ); + m_HWDDevProgressDat = setupDatAccess( "HWDDevProgress", xiv::exd::Language::none ); + m_HWDGathereInspectTermDat = setupDatAccess( "HWDGathereInspectTerm", xiv::exd::Language::en ); + m_HWDGathererInspectionDat = setupDatAccess( "HWDGathererInspection", xiv::exd::Language::none ); + m_HWDGathererInspectionRewardDat = setupDatAccess( "HWDGathererInspectionReward", xiv::exd::Language::none ); + m_HWDInfoBoardArticleDat = setupDatAccess( "HWDInfoBoardArticle", xiv::exd::Language::en ); + m_HWDInfoBoardArticleTransientDat = setupDatAccess( "HWDInfoBoardArticleTransient", xiv::exd::Language::en ); + m_HWDInfoBoardArticleTypeDat = setupDatAccess( "HWDInfoBoardArticleType", xiv::exd::Language::en ); + m_HWDLevelChangeDeceptionDat = setupDatAccess( "HWDLevelChangeDeception", xiv::exd::Language::none ); + m_HWDSharedGroupDat = setupDatAccess( "HWDSharedGroup", xiv::exd::Language::none ); + m_HWDSharedGroupControlParamDat = setupDatAccess( "HWDSharedGroupControlParam", xiv::exd::Language::none ); + m_IKDContentBonusDat = setupDatAccess( "IKDContentBonus", xiv::exd::Language::en ); + m_IKDFishParamDat = setupDatAccess( "IKDFishParam", xiv::exd::Language::none ); + m_IKDRouteDat = setupDatAccess( "IKDRoute", xiv::exd::Language::en ); + m_IKDRouteTableDat = setupDatAccess( "IKDRouteTable", xiv::exd::Language::none ); + m_IKDSpotDat = setupDatAccess( "IKDSpot", xiv::exd::Language::none ); + m_InclusionShopDat = setupDatAccess( "InclusionShop", xiv::exd::Language::en ); + m_InclusionShopCategoryDat = setupDatAccess( "InclusionShopCategory", xiv::exd::Language::en ); + m_InclusionShopSeriesDat = setupDatAccess( "InclusionShopSeries", xiv::exd::Language::none ); + m_IndividualWeatherDat = setupDatAccess( "IndividualWeather", xiv::exd::Language::none ); + m_InstanceContentDat = setupDatAccess( "InstanceContent", xiv::exd::Language::none ); m_InstanceContentBuffDat = setupDatAccess( "InstanceContentBuff", xiv::exd::Language::none ); m_InstanceContentCSBonusDat = setupDatAccess( "InstanceContentCSBonus", xiv::exd::Language::none ); m_InstanceContentGuideDat = setupDatAccess( "InstanceContentGuide", xiv::exd::Language::none ); m_InstanceContentTextDataDat = setupDatAccess( "InstanceContentTextData", xiv::exd::Language::en ); m_ItemDat = setupDatAccess( "Item", xiv::exd::Language::en ); m_ItemActionDat = setupDatAccess( "ItemAction", xiv::exd::Language::none ); + m_ItemActionTelepoDat = setupDatAccess( "ItemActionTelepo", xiv::exd::Language::none ); + m_ItemBarterCheckDat = setupDatAccess( "ItemBarterCheck", xiv::exd::Language::none ); m_ItemFoodDat = setupDatAccess( "ItemFood", xiv::exd::Language::none ); m_ItemLevelDat = setupDatAccess( "ItemLevel", xiv::exd::Language::none ); m_ItemSearchCategoryDat = setupDatAccess( "ItemSearchCategory", xiv::exd::Language::en ); m_ItemSeriesDat = setupDatAccess( "ItemSeries", xiv::exd::Language::en ); + m_ItemSortCategoryDat = setupDatAccess( "ItemSortCategory", xiv::exd::Language::none ); m_ItemSpecialBonusDat = setupDatAccess( "ItemSpecialBonus", xiv::exd::Language::en ); m_ItemUICategoryDat = setupDatAccess( "ItemUICategory", xiv::exd::Language::en ); + m_JingleDat = setupDatAccess( "Jingle", xiv::exd::Language::none ); + m_JobHudManualDat = setupDatAccess( "JobHudManual", xiv::exd::Language::none ); + m_JobHudManualPriorityDat = setupDatAccess( "JobHudManualPriority", xiv::exd::Language::none ); m_JournalCategoryDat = setupDatAccess( "JournalCategory", xiv::exd::Language::en ); m_JournalGenreDat = setupDatAccess( "JournalGenre", xiv::exd::Language::en ); m_JournalSectionDat = setupDatAccess( "JournalSection", xiv::exd::Language::en ); + m_KnockbackDat = setupDatAccess( "Knockback", xiv::exd::Language::none ); + m_LegacyQuestDat = setupDatAccess( "LegacyQuest", xiv::exd::Language::en ); m_LeveDat = setupDatAccess( "Leve", xiv::exd::Language::en ); m_LeveAssignmentTypeDat = setupDatAccess( "LeveAssignmentType", xiv::exd::Language::en ); m_LeveClientDat = setupDatAccess( "LeveClient", xiv::exd::Language::en ); m_LevelDat = setupDatAccess( "Level", xiv::exd::Language::none ); m_LeveRewardItemDat = setupDatAccess( "LeveRewardItem", xiv::exd::Language::none ); m_LeveRewardItemGroupDat = setupDatAccess( "LeveRewardItemGroup", xiv::exd::Language::none ); + m_LeveStringDat = setupDatAccess( "LeveString", xiv::exd::Language::en ); m_LeveVfxDat = setupDatAccess( "LeveVfx", xiv::exd::Language::none ); + m_LobbyDat = setupDatAccess( "Lobby", xiv::exd::Language::en ); m_LogFilterDat = setupDatAccess( "LogFilter", xiv::exd::Language::en ); m_LogKindDat = setupDatAccess( "LogKind", xiv::exd::Language::en ); - m_LogKindCategoryTextDat = setupDatAccess( "LogKindCategoryText", xiv::exd::Language::en ); m_LogMessageDat = setupDatAccess( "LogMessage", xiv::exd::Language::en ); m_LotteryExchangeShopDat = setupDatAccess( "LotteryExchangeShop", xiv::exd::Language::en ); m_MacroIconDat = setupDatAccess( "MacroIcon", xiv::exd::Language::none ); @@ -7185,24 +13484,31 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_MainCommandCategoryDat = setupDatAccess( "MainCommandCategory", xiv::exd::Language::en ); m_ManeuversArmorDat = setupDatAccess( "ManeuversArmor", xiv::exd::Language::en ); m_MapDat = setupDatAccess( "Map", xiv::exd::Language::none ); + m_MapConditionDat = setupDatAccess( "MapCondition", xiv::exd::Language::none ); m_MapMarkerDat = setupDatAccess( "MapMarker", xiv::exd::Language::none ); m_MapMarkerRegionDat = setupDatAccess( "MapMarkerRegion", xiv::exd::Language::none ); m_MapSymbolDat = setupDatAccess( "MapSymbol", xiv::exd::Language::none ); m_MarkerDat = setupDatAccess( "Marker", xiv::exd::Language::en ); - m_MasterpieceSupplyDutyDat = setupDatAccess( "MasterpieceSupplyDuty", xiv::exd::Language::none ); - m_MasterpieceSupplyMultiplierDat = setupDatAccess( "MasterpieceSupplyMultiplier", xiv::exd::Language::none ); m_MateriaDat = setupDatAccess( "Materia", xiv::exd::Language::none ); + m_MateriaJoinRateDat = setupDatAccess( "MateriaJoinRate", xiv::exd::Language::none ); + m_MateriaJoinRateGatherCraftDat = setupDatAccess( "MateriaJoinRateGatherCraft", xiv::exd::Language::none ); + m_MateriaTomestoneRateDat = setupDatAccess( "MateriaTomestoneRate", xiv::exd::Language::none ); m_MiniGameRADat = setupDatAccess( "MiniGameRA", xiv::exd::Language::none ); m_MinionRaceDat = setupDatAccess( "MinionRace", xiv::exd::Language::en ); m_MinionRulesDat = setupDatAccess( "MinionRules", xiv::exd::Language::en ); m_MinionSkillTypeDat = setupDatAccess( "MinionSkillType", xiv::exd::Language::en ); + m_MobHuntOrderDat = setupDatAccess( "MobHuntOrder", xiv::exd::Language::none ); m_MobHuntOrderTypeDat = setupDatAccess( "MobHuntOrderType", xiv::exd::Language::none ); + m_MobHuntRewardDat = setupDatAccess( "MobHuntReward", xiv::exd::Language::none ); + m_MobHuntRewardCapDat = setupDatAccess( "MobHuntRewardCap", xiv::exd::Language::none ); m_MobHuntTargetDat = setupDatAccess( "MobHuntTarget", xiv::exd::Language::none ); m_ModelCharaDat = setupDatAccess( "ModelChara", xiv::exd::Language::none ); m_ModelSkeletonDat = setupDatAccess( "ModelSkeleton", xiv::exd::Language::none ); m_ModelStateDat = setupDatAccess( "ModelState", xiv::exd::Language::none ); m_MonsterNoteDat = setupDatAccess( "MonsterNote", xiv::exd::Language::en ); m_MonsterNoteTargetDat = setupDatAccess( "MonsterNoteTarget", xiv::exd::Language::none ); + m_MotionTimelineDat = setupDatAccess( "MotionTimeline", xiv::exd::Language::none ); + m_MotionTimelineBlendTableDat = setupDatAccess( "MotionTimelineBlendTable", xiv::exd::Language::none ); m_MountDat = setupDatAccess( "Mount", xiv::exd::Language::en ); m_MountActionDat = setupDatAccess( "MountAction", xiv::exd::Language::none ); m_MountCustomizeDat = setupDatAccess( "MountCustomize", xiv::exd::Language::none ); @@ -7211,29 +13517,47 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_MountTransientDat = setupDatAccess( "MountTransient", xiv::exd::Language::en ); m_MoveTimelineDat = setupDatAccess( "MoveTimeline", xiv::exd::Language::none ); m_MoveVfxDat = setupDatAccess( "MoveVfx", xiv::exd::Language::none ); + m_MovieStaffListDat = setupDatAccess( "MovieStaffList", xiv::exd::Language::none ); + m_MovieSubtitleDat = setupDatAccess( "MovieSubtitle", xiv::exd::Language::en ); + m_MovieSubtitle500Dat = setupDatAccess( "MovieSubtitle500", xiv::exd::Language::en ); + m_MovieSubtitleVoyageDat = setupDatAccess( "MovieSubtitleVoyage", xiv::exd::Language::en ); + m_MYCTemporaryItemDat = setupDatAccess( "MYCTemporaryItem", xiv::exd::Language::none ); + m_MYCTemporaryItemUICategoryDat = setupDatAccess( "MYCTemporaryItemUICategory", xiv::exd::Language::en ); + m_MYCWarResultNotebookDat = setupDatAccess( "MYCWarResultNotebook", xiv::exd::Language::en ); m_NotebookDivisionDat = setupDatAccess( "NotebookDivision", xiv::exd::Language::en ); m_NotebookDivisionCategoryDat = setupDatAccess( "NotebookDivisionCategory", xiv::exd::Language::en ); + m_NotoriousMonsterDat = setupDatAccess( "NotoriousMonster", xiv::exd::Language::none ); m_NpcEquipDat = setupDatAccess( "NpcEquip", xiv::exd::Language::none ); m_NpcYellDat = setupDatAccess( "NpcYell", xiv::exd::Language::en ); m_OmenDat = setupDatAccess( "Omen", xiv::exd::Language::none ); m_OnlineStatusDat = setupDatAccess( "OnlineStatus", xiv::exd::Language::en ); + m_OpenContentDat = setupDatAccess( "OpenContent", xiv::exd::Language::none ); + m_OpenContentCandidateNameDat = setupDatAccess( "OpenContentCandidateName", xiv::exd::Language::en ); m_OpeningDat = setupDatAccess( "Opening", xiv::exd::Language::none ); m_OrchestrionDat = setupDatAccess( "Orchestrion", xiv::exd::Language::en ); m_OrchestrionCategoryDat = setupDatAccess( "OrchestrionCategory", xiv::exd::Language::en ); m_OrchestrionPathDat = setupDatAccess( "OrchestrionPath", xiv::exd::Language::none ); m_OrchestrionUiparamDat = setupDatAccess( "OrchestrionUiparam", xiv::exd::Language::none ); + m_OrnamentDat = setupDatAccess( "Ornament", xiv::exd::Language::en ); m_ParamGrowDat = setupDatAccess( "ParamGrow", xiv::exd::Language::none ); - m_PartyContentDat = setupDatAccess( "PartyContent", xiv::exd::Language::en ); + m_PartyContentDat = setupDatAccess( "PartyContent", xiv::exd::Language::none ); m_PartyContentCutsceneDat = setupDatAccess( "PartyContentCutscene", xiv::exd::Language::none ); m_PartyContentTextDataDat = setupDatAccess( "PartyContentTextData", xiv::exd::Language::en ); + m_PatchMarkDat = setupDatAccess( "PatchMark", xiv::exd::Language::none ); m_PerformDat = setupDatAccess( "Perform", xiv::exd::Language::en ); + m_PerformGroupDat = setupDatAccess( "PerformGroup", xiv::exd::Language::none ); m_PerformTransientDat = setupDatAccess( "PerformTransient", xiv::exd::Language::en ); m_PetDat = setupDatAccess( "Pet", xiv::exd::Language::en ); m_PetActionDat = setupDatAccess( "PetAction", xiv::exd::Language::en ); + m_PetMirageDat = setupDatAccess( "PetMirage", xiv::exd::Language::en ); + m_PhysicsGroupDat = setupDatAccess( "PhysicsGroup", xiv::exd::Language::none ); + m_PhysicsWindDat = setupDatAccess( "PhysicsWind", xiv::exd::Language::none ); m_PictureDat = setupDatAccess( "Picture", xiv::exd::Language::none ); m_PlaceNameDat = setupDatAccess( "PlaceName", xiv::exd::Language::en ); m_PlantPotFlowerSeedDat = setupDatAccess( "PlantPotFlowerSeed", xiv::exd::Language::none ); - m_PreHandlerDat = setupDatAccess( "PreHandler", xiv::exd::Language::none ); + m_PreHandlerDat = setupDatAccess( "PreHandler", xiv::exd::Language::en ); + m_PresetCameraDat = setupDatAccess( "PresetCamera", xiv::exd::Language::none ); + m_PresetCameraAdjustDat = setupDatAccess( "PresetCameraAdjust", xiv::exd::Language::none ); m_PublicContentDat = setupDatAccess( "PublicContent", xiv::exd::Language::en ); m_PublicContentCutsceneDat = setupDatAccess( "PublicContentCutscene", xiv::exd::Language::none ); m_PublicContentTextDataDat = setupDatAccess( "PublicContentTextData", xiv::exd::Language::en ); @@ -7243,9 +13567,19 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_PvPSelectTraitDat = setupDatAccess( "PvPSelectTrait", xiv::exd::Language::en ); m_PvPTraitDat = setupDatAccess( "PvPTrait", xiv::exd::Language::none ); m_QuestDat = setupDatAccess( "Quest", xiv::exd::Language::en ); + m_QuestAcceptAdditionConditionDat = setupDatAccess( "QuestAcceptAdditionCondition", xiv::exd::Language::none ); m_QuestBattleDat = setupDatAccess( "QuestBattle", xiv::exd::Language::none ); + m_QuestChapterDat = setupDatAccess( "QuestChapter", xiv::exd::Language::none ); m_QuestClassJobRewardDat = setupDatAccess( "QuestClassJobReward", xiv::exd::Language::none ); m_QuestClassJobSupplyDat = setupDatAccess( "QuestClassJobSupply", xiv::exd::Language::none ); + m_QuestDerivedClassDat = setupDatAccess( "QuestDerivedClass", xiv::exd::Language::none ); + m_QuestEffectDat = setupDatAccess( "QuestEffect", xiv::exd::Language::none ); + m_QuestEffectDefineDat = setupDatAccess( "QuestEffectDefine", xiv::exd::Language::none ); + m_QuestRedoDat = setupDatAccess( "QuestRedo", xiv::exd::Language::none ); + m_QuestRedoChapterUIDat = setupDatAccess( "QuestRedoChapterUI", xiv::exd::Language::en ); + m_QuestRedoChapterUICategoryDat = setupDatAccess( "QuestRedoChapterUICategory", xiv::exd::Language::en ); + m_QuestRedoChapterUITabDat = setupDatAccess( "QuestRedoChapterUITab", xiv::exd::Language::en ); + m_QuestRedoIncompChapterDat = setupDatAccess( "QuestRedoIncompChapter", xiv::exd::Language::none ); m_QuestRepeatFlagDat = setupDatAccess( "QuestRepeatFlag", xiv::exd::Language::none ); m_QuestRewardOtherDat = setupDatAccess( "QuestRewardOther", xiv::exd::Language::en ); m_QuickChatDat = setupDatAccess( "QuickChat", xiv::exd::Language::en ); @@ -7259,6 +13593,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_RecastNavimeshDat = setupDatAccess( "RecastNavimesh", xiv::exd::Language::none ); m_RecipeDat = setupDatAccess( "Recipe", xiv::exd::Language::none ); m_RecipeLevelTableDat = setupDatAccess( "RecipeLevelTable", xiv::exd::Language::none ); + m_RecipeLookupDat = setupDatAccess( "RecipeLookup", xiv::exd::Language::none ); m_RecipeNotebookListDat = setupDatAccess( "RecipeNotebookList", xiv::exd::Language::none ); m_RecommendContentsDat = setupDatAccess( "RecommendContents", xiv::exd::Language::none ); m_RelicDat = setupDatAccess( "Relic", xiv::exd::Language::none ); @@ -7267,20 +13602,24 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_RelicNoteDat = setupDatAccess( "RelicNote", xiv::exd::Language::none ); m_RelicNoteCategoryDat = setupDatAccess( "RelicNoteCategory", xiv::exd::Language::en ); m_ResidentDat = setupDatAccess( "Resident", xiv::exd::Language::none ); + m_ResistanceWeaponAdjustDat = setupDatAccess( "ResistanceWeaponAdjust", xiv::exd::Language::none ); + m_RetainerFortuneRewardRangeDat = setupDatAccess( "RetainerFortuneRewardRange", xiv::exd::Language::none ); m_RetainerTaskDat = setupDatAccess( "RetainerTask", xiv::exd::Language::none ); m_RetainerTaskLvRangeDat = setupDatAccess( "RetainerTaskLvRange", xiv::exd::Language::none ); m_RetainerTaskNormalDat = setupDatAccess( "RetainerTaskNormal", xiv::exd::Language::none ); m_RetainerTaskParameterDat = setupDatAccess( "RetainerTaskParameter", xiv::exd::Language::none ); m_RetainerTaskRandomDat = setupDatAccess( "RetainerTaskRandom", xiv::exd::Language::en ); + m_RideShootingDat = setupDatAccess( "RideShooting", xiv::exd::Language::none ); + m_RideShootingTargetTypeDat = setupDatAccess( "RideShootingTargetType", xiv::exd::Language::none ); + m_RideShootingTextDataDat = setupDatAccess( "RideShootingTextData", xiv::exd::Language::en ); m_RPParameterDat = setupDatAccess( "RPParameter", xiv::exd::Language::none ); - m_SalvageDat = setupDatAccess( "Salvage", xiv::exd::Language::none ); + m_SatisfactionArbitrationDat = setupDatAccess( "SatisfactionArbitration", xiv::exd::Language::none ); m_SatisfactionNpcDat = setupDatAccess( "SatisfactionNpc", xiv::exd::Language::none ); m_SatisfactionSupplyDat = setupDatAccess( "SatisfactionSupply", xiv::exd::Language::none ); m_SatisfactionSupplyRewardDat = setupDatAccess( "SatisfactionSupplyReward", xiv::exd::Language::none ); m_ScenarioTreeDat = setupDatAccess( "ScenarioTree", xiv::exd::Language::none ); m_ScenarioTreeTipsDat = setupDatAccess( "ScenarioTreeTips", xiv::exd::Language::none ); m_ScenarioTreeTipsClassQuestDat = setupDatAccess( "ScenarioTreeTipsClassQuest", xiv::exd::Language::none ); - m_ScenarioTreeTipsQuestDat = setupDatAccess( "ScenarioTreeTipsQuest", xiv::exd::Language::none ); m_ScenarioTypeDat = setupDatAccess( "ScenarioType", xiv::exd::Language::en ); m_ScreenImageDat = setupDatAccess( "ScreenImage", xiv::exd::Language::none ); m_SecretRecipeBookDat = setupDatAccess( "SecretRecipeBook", xiv::exd::Language::en ); @@ -7288,6 +13627,8 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_SkyIsland2MissionDetailDat = setupDatAccess( "SkyIsland2MissionDetail", xiv::exd::Language::en ); m_SkyIsland2MissionTypeDat = setupDatAccess( "SkyIsland2MissionType", xiv::exd::Language::none ); m_SkyIsland2RangeTypeDat = setupDatAccess( "SkyIsland2RangeType", xiv::exd::Language::none ); + m_SnipeTalkDat = setupDatAccess( "SnipeTalk", xiv::exd::Language::en ); + m_SnipeTalkNameDat = setupDatAccess( "SnipeTalkName", xiv::exd::Language::en ); m_SpearfishingItemDat = setupDatAccess( "SpearfishingItem", xiv::exd::Language::en ); m_SpearfishingNotebookDat = setupDatAccess( "SpearfishingNotebook", xiv::exd::Language::none ); m_SpearfishingRecordPageDat = setupDatAccess( "SpearfishingRecordPage", xiv::exd::Language::none ); @@ -7295,16 +13636,21 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_SpecialShopItemCategoryDat = setupDatAccess( "SpecialShopItemCategory", xiv::exd::Language::en ); m_StainDat = setupDatAccess( "Stain", xiv::exd::Language::en ); m_StainTransientDat = setupDatAccess( "StainTransient", xiv::exd::Language::none ); + m_StanceChangeDat = setupDatAccess( "StanceChange", xiv::exd::Language::none ); m_StatusDat = setupDatAccess( "Status", xiv::exd::Language::en ); m_StatusHitEffectDat = setupDatAccess( "StatusHitEffect", xiv::exd::Language::none ); m_StatusLoopVFXDat = setupDatAccess( "StatusLoopVFX", xiv::exd::Language::none ); m_StoryDat = setupDatAccess( "Story", xiv::exd::Language::none ); m_SubmarineExplorationDat = setupDatAccess( "SubmarineExploration", xiv::exd::Language::en ); + m_SubmarineMapDat = setupDatAccess( "SubmarineMap", xiv::exd::Language::en ); m_SubmarinePartDat = setupDatAccess( "SubmarinePart", xiv::exd::Language::none ); m_SubmarineRankDat = setupDatAccess( "SubmarineRank", xiv::exd::Language::none ); m_SwitchTalkDat = setupDatAccess( "SwitchTalk", xiv::exd::Language::none ); + m_SwitchTalkVariationDat = setupDatAccess( "SwitchTalkVariation", xiv::exd::Language::none ); m_TerritoryTypeDat = setupDatAccess( "TerritoryType", xiv::exd::Language::none ); + m_TerritoryTypeTransientDat = setupDatAccess( "TerritoryTypeTransient", xiv::exd::Language::none ); m_TextCommandDat = setupDatAccess( "TextCommand", xiv::exd::Language::en ); + m_TextCommandParamDat = setupDatAccess( "TextCommandParam", xiv::exd::Language::en ); m_TitleDat = setupDatAccess( "Title", xiv::exd::Language::en ); m_TomestonesDat = setupDatAccess( "Tomestones", xiv::exd::Language::none ); m_TomestonesItemDat = setupDatAccess( "TomestonesItem", xiv::exd::Language::none ); @@ -7316,6 +13662,7 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_TransformationDat = setupDatAccess( "Transformation", xiv::exd::Language::none ); m_TreasureDat = setupDatAccess( "Treasure", xiv::exd::Language::en ); m_TreasureHuntRankDat = setupDatAccess( "TreasureHuntRank", xiv::exd::Language::none ); + m_TreasureModelDat = setupDatAccess( "TreasureModel", xiv::exd::Language::none ); m_TreasureSpotDat = setupDatAccess( "TreasureSpot", xiv::exd::Language::none ); m_TribeDat = setupDatAccess( "Tribe", xiv::exd::Language::en ); m_TripleTriadDat = setupDatAccess( "TripleTriad", xiv::exd::Language::none ); @@ -7324,21 +13671,27 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_TripleTriadCardResidentDat = setupDatAccess( "TripleTriadCardResident", xiv::exd::Language::none ); m_TripleTriadCardTypeDat = setupDatAccess( "TripleTriadCardType", xiv::exd::Language::en ); m_TripleTriadCompetitionDat = setupDatAccess( "TripleTriadCompetition", xiv::exd::Language::en ); + m_TripleTriadResidentDat = setupDatAccess( "TripleTriadResident", xiv::exd::Language::none ); m_TripleTriadRuleDat = setupDatAccess( "TripleTriadRule", xiv::exd::Language::en ); m_TutorialDat = setupDatAccess( "Tutorial", xiv::exd::Language::none ); m_TutorialDPSDat = setupDatAccess( "TutorialDPS", xiv::exd::Language::none ); m_TutorialHealerDat = setupDatAccess( "TutorialHealer", xiv::exd::Language::none ); m_TutorialTankDat = setupDatAccess( "TutorialTank", xiv::exd::Language::none ); + m_UDS_EventDat = setupDatAccess( "UDS_Event", xiv::exd::Language::none ); + m_UDS_PropertyDat = setupDatAccess( "UDS_Property", xiv::exd::Language::none ); m_UIColorDat = setupDatAccess( "UIColor", xiv::exd::Language::none ); m_VaseFlowerDat = setupDatAccess( "VaseFlower", xiv::exd::Language::none ); m_VFXDat = setupDatAccess( "VFX", xiv::exd::Language::none ); m_WarpDat = setupDatAccess( "Warp", xiv::exd::Language::en ); m_WarpConditionDat = setupDatAccess( "WarpCondition", xiv::exd::Language::none ); m_WarpLogicDat = setupDatAccess( "WarpLogic", xiv::exd::Language::en ); + m_WeaponTimelineDat = setupDatAccess( "WeaponTimeline", xiv::exd::Language::none ); m_WeatherDat = setupDatAccess( "Weather", xiv::exd::Language::en ); m_WeatherGroupDat = setupDatAccess( "WeatherGroup", xiv::exd::Language::none ); m_WeatherRateDat = setupDatAccess( "WeatherRate", xiv::exd::Language::none ); m_WeatherReportReplaceDat = setupDatAccess( "WeatherReportReplace", xiv::exd::Language::none ); + m_WebGuidanceDat = setupDatAccess( "WebGuidance", xiv::exd::Language::en ); + m_WebURLDat = setupDatAccess( "WebURL", xiv::exd::Language::en ); m_WeddingBGMDat = setupDatAccess( "WeddingBGM", xiv::exd::Language::en ); m_WeeklyBingoOrderDataDat = setupDatAccess( "WeeklyBingoOrderData", xiv::exd::Language::none ); m_WeeklyBingoRewardDataDat = setupDatAccess( "WeeklyBingoRewardData", xiv::exd::Language::none ); @@ -7346,6 +13699,8 @@ bool Sapphire::Data::ExdDataGenerated::init( const std::string& path ) m_WeeklyLotBonusDat = setupDatAccess( "WeeklyLotBonus", xiv::exd::Language::none ); m_WorldDat = setupDatAccess( "World", xiv::exd::Language::none ); m_WorldDCGroupTypeDat = setupDatAccess( "WorldDCGroupType", xiv::exd::Language::none ); + m_YardCatalogCategoryDat = setupDatAccess( "YardCatalogCategory", xiv::exd::Language::en ); + m_YardCatalogItemListDat = setupDatAccess( "YardCatalogItemList", xiv::exd::Language::none ); m_YKWDat = setupDatAccess( "YKW", xiv::exd::Language::en ); m_ZoneSharedGroupDat = setupDatAccess( "ZoneSharedGroup", xiv::exd::Language::none ); diff --git a/src/common/Exd/ExdDataGenerated.h b/src/common/Exd/ExdDataGenerated.h index 725fb2a7..7f890fdd 100644 --- a/src/common/Exd/ExdDataGenerated.h +++ b/src/common/Exd/ExdDataGenerated.h @@ -13,14 +13,20 @@ #include #include -namespace Sapphire { -namespace Data { +#if _WIN32 +#undef near +#undef far +#endif + +namespace Sapphire::Data { class ExdDataGenerated; struct Achievement; struct AchievementCategory; +struct AchievementHideCondition; struct AchievementKind; +struct AchievementTarget; struct Action; struct ActionCastTimeline; struct ActionCastVFX; @@ -38,7 +44,6 @@ struct ActivityFeedCaptions; struct ActivityFeedGroupCaptions; struct ActivityFeedImages; struct Addon; -struct AddonHud; struct Adventure; struct AdventureExPhase; struct AetherCurrent; @@ -51,6 +56,7 @@ struct AirshipExplorationLog; struct AirshipExplorationParamType; struct AirshipExplorationPart; struct AirshipExplorationPoint; +struct AnimationLOD; struct AnimaWeapon5; struct AnimaWeapon5Param; struct AnimaWeapon5PatternGroup; @@ -67,20 +73,28 @@ struct AOZArrangement; struct AOZBoss; struct AOZContent; struct AOZContentBriefingBNpc; +struct AOZReport; +struct AOZScore; struct AquariumFish; struct AquariumWater; struct ArrayEventHandler; struct AttackType; struct BacklightColor; +struct Ballista; struct Balloon; struct BaseParam; struct BattleLeve; +struct BattleLeveRule; struct BeastRankBonus; struct BeastReputationRank; struct BeastTribe; struct Behavior; +struct BehaviorPath; +struct BenchmarkOverrideEquipment; struct BGM; struct BGMFade; +struct BGMFadeType; +struct BGMScene; struct BGMSituation; struct BGMSwitch; struct BGMSystemDefine; @@ -89,6 +103,7 @@ struct BNpcBase; struct BNpcCustomize; struct BNpcName; struct BNpcParts; +struct BNpcState; struct Buddy; struct BuddyAction; struct BuddyEquip; @@ -98,7 +113,11 @@ struct BuddySkill; struct Cabinet; struct CabinetCategory; struct Calendar; +struct Carry; +struct Channeling; +struct CharaMakeClassEquip; struct CharaMakeCustomize; +struct CharaMakeName; struct CharaMakeType; struct ChocoboRace; struct ChocoboRaceAbility; @@ -111,8 +130,15 @@ struct ChocoboRaceTutorial; struct ChocoboRaceWeather; struct ChocoboTaxi; struct ChocoboTaxiStand; +struct CircleActivity; struct ClassJob; struct ClassJobCategory; +struct CollectablesShop; +struct CollectablesShopItem; +struct CollectablesShopItemGroup; +struct CollectablesShopRefine; +struct CollectablesShopRewardItem; +struct CollectablesShopRewardScrip; struct Companion; struct CompanionMove; struct CompanionTransient; @@ -129,6 +155,9 @@ struct CompanyLeve; struct CompanyLeveRule; struct CompleteJournal; struct CompleteJournalCategory; +struct Completion; +struct Condition; +struct ConfigKey; struct ContentCloseCycle; struct ContentExAction; struct ContentFinderCondition; @@ -137,28 +166,40 @@ struct ContentGauge; struct ContentGaugeColor; struct ContentMemberType; struct ContentNpcTalk; +struct ContentRandomSelect; struct ContentRoulette; struct ContentRouletteOpenRule; struct ContentRouletteRoleBonus; struct ContentsNote; +struct ContentsTutorial; +struct ContentsTutorialPage; struct ContentTalk; struct ContentTalkParam; struct ContentType; struct CraftAction; struct CraftLeve; +struct CraftLevelDifference; +struct CraftLeveTalk; struct CraftType; struct Credit; struct CreditBackImage; struct CreditCast; struct CreditList; struct CreditListText; -struct Currency; struct CustomTalk; -struct CustomTalkDynamicIcon; struct CustomTalkNestHandlers; struct Cutscene; +struct CutSceneIncompQuest; +struct CutsceneMotion; +struct CutsceneWorkIndex; struct CutScreenImage; +struct CycleTime; struct DailySupplyItem; +struct DawnContent; +struct DawnGrowMember; +struct DawnMemberUIParam; +struct DawnQuestAnnounce; +struct DawnQuestMember; struct DeepDungeon; struct DeepDungeonBan; struct DeepDungeonDanger; @@ -173,7 +214,9 @@ struct DeepDungeonStatus; struct DefaultTalk; struct DefaultTalkLipSyncType; struct DeliveryQuest; +struct Description; struct DescriptionPage; +struct DescriptionSection; struct DescriptionString; struct DisposalShop; struct DisposalShopFilterType; @@ -181,10 +224,15 @@ struct DisposalShopItem; struct DpsChallenge; struct DpsChallengeOfficer; struct DpsChallengeTransient; +struct DynamicEvent; +struct DynamicEventEnemyType; +struct DynamicEventSingleBattle; +struct DynamicEventType; struct EmjAddon; struct EmjDani; struct Emote; struct EmoteCategory; +struct EmoteMode; struct ENpcBase; struct ENpcDressUp; struct ENpcDressUpDress; @@ -202,23 +250,32 @@ struct EurekaMagiciteItem; struct EurekaMagiciteItemType; struct EurekaSphereElementAdjust; struct EventAction; +struct EventCustomIconType; struct EventIconPriority; struct EventIconType; struct EventItem; struct EventItemCastTimeline; struct EventItemHelp; struct EventItemTimeline; +struct EventSystemDefine; +struct ExportedGatheringPoint; struct ExportedSG; struct ExVersion; struct Fate; +struct FateEvent; +struct FateMode; +struct FateProgressUI; +struct FateTokenType; struct FCActivity; struct FCActivityCategory; struct FCAuthority; struct FCAuthorityCategory; struct FCChestName; +struct FCCrestSymbol; struct FccShop; struct FCHierarchy; struct FCProfile; +struct FCRank; struct FCReputation; struct FCRights; struct Festival; @@ -229,6 +286,8 @@ struct FishingSpot; struct FishParameter; struct Frontline03; struct Frontline04; +struct FurnitureCatalogCategory; +struct FurnitureCatalogItemList; struct GardeningSeed; struct GatheringCondition; struct GatheringExp; @@ -237,15 +296,19 @@ struct GatheringItemLevelConvertTable; struct GatheringItemPoint; struct GatheringLeve; struct GatheringLeveRoute; +struct GatheringLeveRule; struct GatheringNotebookList; struct GatheringPoint; struct GatheringPointBase; struct GatheringPointBonus; struct GatheringPointBonusType; struct GatheringPointName; +struct GatheringPointTransient; +struct GatheringRarePopTimeTable; struct GatheringSubCategory; struct GatheringType; struct GcArmyCaptureTactics; +struct GcArmyEquipPreset; struct GcArmyExpedition; struct GcArmyExpeditionMemberBonus; struct GcArmyExpeditionType; @@ -271,13 +334,24 @@ struct GFateClimbing2TotemType; struct GFateRideShooting; struct GilShop; struct GilShopItem; +struct GimmickAccessor; +struct GimmickJump; +struct GimmickRect; struct GoldSaucerArcadeMachine; struct GoldSaucerTextData; struct GrandCompany; struct GrandCompanyRank; +struct GroupPoseFrame; +struct GroupPoseStamp; +struct GroupPoseStampCategory; struct GuardianDeity; +struct Guide; +struct GuidePage; +struct GuidePageString; +struct GuideTitle; struct GuildleveAssignment; struct GuildleveAssignmentCategory; +struct GuildleveAssignmentTalk; struct GuildOrder; struct GuildOrderGuide; struct GuildOrderOfficer; @@ -299,6 +373,34 @@ struct HousingYardObject; struct HowTo; struct HowToCategory; struct HowToPage; +struct HugeCraftworksNpc; +struct HugeCraftworksRank; +struct HWDAnnounce; +struct HWDCrafterSupply; +struct HWDCrafterSupplyReward; +struct HWDCrafterSupplyTerm; +struct HWDDevLayerControl; +struct HWDDevLevelUI; +struct HWDDevLively; +struct HWDDevProgress; +struct HWDGathereInspectTerm; +struct HWDGathererInspection; +struct HWDGathererInspectionReward; +struct HWDInfoBoardArticle; +struct HWDInfoBoardArticleTransient; +struct HWDInfoBoardArticleType; +struct HWDLevelChangeDeception; +struct HWDSharedGroup; +struct HWDSharedGroupControlParam; +struct IKDContentBonus; +struct IKDFishParam; +struct IKDRoute; +struct IKDRouteTable; +struct IKDSpot; +struct InclusionShop; +struct InclusionShopCategory; +struct InclusionShopSeries; +struct IndividualWeather; struct InstanceContent; struct InstanceContentBuff; struct InstanceContentCSBonus; @@ -306,25 +408,34 @@ struct InstanceContentGuide; struct InstanceContentTextData; struct Item; struct ItemAction; +struct ItemActionTelepo; +struct ItemBarterCheck; struct ItemFood; struct ItemLevel; struct ItemSearchCategory; struct ItemSeries; +struct ItemSortCategory; struct ItemSpecialBonus; struct ItemUICategory; +struct Jingle; +struct JobHudManual; +struct JobHudManualPriority; struct JournalCategory; struct JournalGenre; struct JournalSection; +struct Knockback; +struct LegacyQuest; struct Leve; struct LeveAssignmentType; struct LeveClient; struct Level; struct LeveRewardItem; struct LeveRewardItemGroup; +struct LeveString; struct LeveVfx; +struct Lobby; struct LogFilter; struct LogKind; -struct LogKindCategoryText; struct LogMessage; struct LotteryExchangeShop; struct MacroIcon; @@ -333,24 +444,31 @@ struct MainCommand; struct MainCommandCategory; struct ManeuversArmor; struct Map; +struct MapCondition; struct MapMarker; struct MapMarkerRegion; struct MapSymbol; struct Marker; -struct MasterpieceSupplyDuty; -struct MasterpieceSupplyMultiplier; struct Materia; +struct MateriaJoinRate; +struct MateriaJoinRateGatherCraft; +struct MateriaTomestoneRate; struct MiniGameRA; struct MinionRace; struct MinionRules; struct MinionSkillType; +struct MobHuntOrder; struct MobHuntOrderType; +struct MobHuntReward; +struct MobHuntRewardCap; struct MobHuntTarget; struct ModelChara; struct ModelSkeleton; struct ModelState; struct MonsterNote; struct MonsterNoteTarget; +struct MotionTimeline; +struct MotionTimelineBlendTable; struct Mount; struct MountAction; struct MountCustomize; @@ -359,29 +477,47 @@ struct MountSpeed; struct MountTransient; struct MoveTimeline; struct MoveVfx; +struct MovieStaffList; +struct MovieSubtitle; +struct MovieSubtitle500; +struct MovieSubtitleVoyage; +struct MYCTemporaryItem; +struct MYCTemporaryItemUICategory; +struct MYCWarResultNotebook; struct NotebookDivision; struct NotebookDivisionCategory; +struct NotoriousMonster; struct NpcEquip; struct NpcYell; struct Omen; struct OnlineStatus; +struct OpenContent; +struct OpenContentCandidateName; struct Opening; struct Orchestrion; struct OrchestrionCategory; struct OrchestrionPath; struct OrchestrionUiparam; +struct Ornament; struct ParamGrow; struct PartyContent; struct PartyContentCutscene; struct PartyContentTextData; +struct PatchMark; struct Perform; +struct PerformGroup; struct PerformTransient; struct Pet; struct PetAction; +struct PetMirage; +struct PhysicsGroup; +struct PhysicsWind; struct Picture; struct PlaceName; struct PlantPotFlowerSeed; struct PreHandler; +struct PresetCamera; +struct PresetCameraAdjust; struct PublicContent; struct PublicContentCutscene; struct PublicContentTextData; @@ -391,9 +527,19 @@ struct PvPRank; struct PvPSelectTrait; struct PvPTrait; struct Quest; +struct QuestAcceptAdditionCondition; struct QuestBattle; +struct QuestChapter; struct QuestClassJobReward; struct QuestClassJobSupply; +struct QuestDerivedClass; +struct QuestEffect; +struct QuestEffectDefine; +struct QuestRedo; +struct QuestRedoChapterUI; +struct QuestRedoChapterUICategory; +struct QuestRedoChapterUITab; +struct QuestRedoIncompChapter; struct QuestRepeatFlag; struct QuestRewardOther; struct QuickChat; @@ -407,6 +553,7 @@ struct RacingChocoboParam; struct RecastNavimesh; struct Recipe; struct RecipeLevelTable; +struct RecipeLookup; struct RecipeNotebookList; struct RecommendContents; struct Relic; @@ -415,20 +562,24 @@ struct RelicItem; struct RelicNote; struct RelicNoteCategory; struct Resident; +struct ResistanceWeaponAdjust; +struct RetainerFortuneRewardRange; struct RetainerTask; struct RetainerTaskLvRange; struct RetainerTaskNormal; struct RetainerTaskParameter; struct RetainerTaskRandom; +struct RideShooting; +struct RideShootingTargetType; +struct RideShootingTextData; struct RPParameter; -struct Salvage; +struct SatisfactionArbitration; struct SatisfactionNpc; struct SatisfactionSupply; struct SatisfactionSupplyReward; struct ScenarioTree; struct ScenarioTreeTips; struct ScenarioTreeTipsClassQuest; -struct ScenarioTreeTipsQuest; struct ScenarioType; struct ScreenImage; struct SecretRecipeBook; @@ -436,6 +587,8 @@ struct SkyIsland2Mission; struct SkyIsland2MissionDetail; struct SkyIsland2MissionType; struct SkyIsland2RangeType; +struct SnipeTalk; +struct SnipeTalkName; struct SpearfishingItem; struct SpearfishingNotebook; struct SpearfishingRecordPage; @@ -443,16 +596,21 @@ struct SpecialShop; struct SpecialShopItemCategory; struct Stain; struct StainTransient; +struct StanceChange; struct Status; struct StatusHitEffect; struct StatusLoopVFX; struct Story; struct SubmarineExploration; +struct SubmarineMap; struct SubmarinePart; struct SubmarineRank; struct SwitchTalk; +struct SwitchTalkVariation; struct TerritoryType; +struct TerritoryTypeTransient; struct TextCommand; +struct TextCommandParam; struct Title; struct Tomestones; struct TomestonesItem; @@ -464,6 +622,7 @@ struct TraitTransient; struct Transformation; struct Treasure; struct TreasureHuntRank; +struct TreasureModel; struct TreasureSpot; struct Tribe; struct TripleTriad; @@ -472,21 +631,27 @@ struct TripleTriadCardRarity; struct TripleTriadCardResident; struct TripleTriadCardType; struct TripleTriadCompetition; +struct TripleTriadResident; struct TripleTriadRule; struct Tutorial; struct TutorialDPS; struct TutorialHealer; struct TutorialTank; +struct UDS_Event; +struct UDS_Property; struct UIColor; struct VaseFlower; struct VFX; struct Warp; struct WarpCondition; struct WarpLogic; +struct WeaponTimeline; struct Weather; struct WeatherGroup; struct WeatherRate; struct WeatherReportReplace; +struct WebGuidance; +struct WebURL; struct WeddingBGM; struct WeeklyBingoOrderData; struct WeeklyBingoRewardData; @@ -494,6 +659,8 @@ struct WeeklyBingoText; struct WeeklyLotBonus; struct World; struct WorldDCGroupType; +struct YardCatalogCategory; +struct YardCatalogItemList; struct YKW; struct ZoneSharedGroup; @@ -503,6 +670,7 @@ struct Achievement uint8_t achievementCategory; std::string name; std::string description; + uint8_t achievementTarget; uint8_t points; uint16_t title; uint32_t item; @@ -511,7 +679,7 @@ struct Achievement int32_t key; std::vector< int32_t > data; uint16_t order; - uint8_t initialHide; + uint8_t achievementHideCondition; Achievement( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -520,18 +688,38 @@ struct AchievementCategory { std::string name; uint8_t achievementKind; + bool showComplete; bool hideCategory; + uint8_t order; AchievementCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct AchievementHideCondition +{ + bool hideAchievement; + bool hideName; + bool hideConditions; + + AchievementHideCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct AchievementKind { std::string name; + uint8_t order; AchievementKind( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct AchievementTarget +{ + uint8_t type; + uint32_t value; + + AchievementTarget( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Action { std::string name; @@ -542,6 +730,7 @@ struct Action int16_t animationEnd; uint16_t actionTimelineHit; int8_t classJob; + uint8_t behaviourType; uint8_t classJobLevel; bool isRoleAction; int8_t range; @@ -563,6 +752,8 @@ struct Action uint16_t cast100ms; uint16_t recast100ms; uint8_t cooldownGroup; + uint8_t additionalCooldownGroup; + uint8_t maxCharges; int8_t attackType; uint8_t aspect; uint8_t actionProcStatus; @@ -570,7 +761,7 @@ struct Action uint32_t unlockLink; uint8_t classJobCategory; bool affectsPosition; - uint8_t omen; + uint16_t omen; bool isPvP; bool isPlayerAction; @@ -610,6 +801,8 @@ struct ActionComboRoute struct ActionIndirection { int32_t name; + int8_t classJob; + int32_t previousComboAction; ActionIndirection( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -630,7 +823,22 @@ struct ActionProcStatus struct ActionTimeline { + uint8_t type; + uint8_t priority; + bool pause; + uint8_t stance; + uint8_t slot; + uint8_t lookAtMode; std::string key; + uint8_t actionTimelineIDMode; + uint8_t weaponTimeline; + uint8_t loadType; + uint8_t startAttach; + uint8_t residentPap; + bool resident; + uint16_t killUpper; + bool isMotionCanceledByMoving; + uint8_t isLoop; ActionTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -704,18 +912,11 @@ struct Addon Addon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct AddonHud -{ - std::string _long; - std::string _short; - std::string function; - - AddonHud( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct Adventure { int32_t level; + int32_t minLevel; + uint8_t maxLevel; uint16_t emote; uint16_t minTime; uint16_t maxTime; @@ -780,6 +981,7 @@ struct Aetheryte std::vector< uint32_t > level; bool isAetheryte; uint8_t aethernetGroup; + bool invisible; uint32_t requiredQuest; uint16_t map; int16_t aetherstreamX; @@ -791,12 +993,14 @@ struct Aetheryte struct AetheryteSystemDefine { std::string text; + uint32_t defineValue; AetheryteSystemDefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct AirshipExplorationLevel { + uint16_t capacity; uint32_t expToNext; AirshipExplorationLevel( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -818,6 +1022,7 @@ struct AirshipExplorationParamType struct AirshipExplorationPart { + uint8_t slot; uint8_t rank; uint8_t components; int16_t surveillance; @@ -825,6 +1030,7 @@ struct AirshipExplorationPart int16_t speed; int16_t range; int16_t favor; + uint16_t _class; uint8_t repairMaterials; AirshipExplorationPart( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -843,6 +1049,16 @@ struct AirshipExplorationPoint AirshipExplorationPoint( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct AnimationLOD +{ + float cameraDistance; + float sampleInterval; + int8_t boneLOD; + std::vector< bool > animationEnable; + + AnimationLOD( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct AnimaWeapon5 { int32_t item; @@ -927,18 +1143,33 @@ struct AnimaWeaponItem struct AozAction { uint32_t action; + uint8_t rank; AozAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct AozActionTransient { + uint8_t number; uint32_t icon; std::string stats; std::string description; + uint8_t locationKey; uint16_t location; - uint32_t startQuest; - uint32_t nextQuest; + uint32_t requiredForQuest; + uint32_t previousQuest; + bool targetsEnemy; + bool targetsSelfOrAlly; + bool causeSlow; + bool causePetrify; + bool causeParalysis; + bool causeInterrupt; + bool causeBlind; + bool causeStun; + bool causeSleep; + bool causeBind; + bool causeHeavy; + bool causeDeath; AozActionTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -946,6 +1177,7 @@ struct AozActionTransient struct AOZArrangement { uint16_t aOZContentBriefingBNpc; + uint16_t position; AOZArrangement( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -953,6 +1185,7 @@ struct AOZArrangement struct AOZBoss { uint16_t boss; + uint16_t position; AOZBoss( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -984,6 +1217,7 @@ struct AOZContentBriefingBNpc uint32_t bNpcName; uint32_t targetSmall; uint32_t targetLarge; + bool hideStats; uint8_t endurance; uint8_t fire; uint8_t ice; @@ -995,20 +1229,38 @@ struct AOZContentBriefingBNpc uint8_t piercing; uint8_t blunt; uint8_t magic; - bool slowResistance; - bool petrificationResistance; - bool paralysisResistance; - bool silenceResistance; - bool blindResistance; - bool stunResistance; - bool sleepResistance; - bool bindResistance; - bool heavyResistance; - bool instaDeathResistance; + bool slowVuln; + bool petrificationVuln; + bool paralysisVuln; + bool interruptionVuln; + bool blindVuln; + bool stunVuln; + bool sleepVuln; + bool bindVuln; + bool heavyVuln; + bool flatOrDeathVuln; AOZContentBriefingBNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct AOZReport +{ + uint8_t reward; + int8_t order; + + AOZReport( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct AOZScore +{ + bool isHidden; + int32_t score; + std::string name; + std::string description; + + AOZScore( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct AquariumFish { uint8_t aquariumWater; @@ -1046,8 +1298,24 @@ struct BacklightColor BacklightColor( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Ballista +{ + uint16_t bNPC; + int8_t near; + int8_t far; + uint16_t angle; + uint8_t bullet; + uint16_t action0; + uint16_t action1; + uint16_t action2; + uint16_t action3; + + Ballista( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Balloon { + bool slowly; std::string dialogue; Balloon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -1055,9 +1323,10 @@ struct Balloon struct BaseParam { - int8_t order; + int8_t packetIndex; std::string name; std::string description; + uint8_t orderPriority; uint8_t oneHWpn; uint8_t oH; uint8_t head; @@ -1071,29 +1340,57 @@ struct BaseParam uint8_t bracelet; uint8_t ring; uint8_t twoHWpn; + uint8_t underArmor; uint8_t chestHead; uint8_t chestHeadLegsFeet; uint8_t legsFeet; uint8_t headChestHandsLegsFeet; uint8_t chestLegsGloves; uint8_t chestLegsFeet; + std::vector< uint8_t > meldParam; BaseParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct BattleLeve { + std::vector< uint16_t > time; + std::vector< int32_t > baseID; std::vector< uint16_t > enemyLevel; std::vector< uint32_t > bNpcName; std::vector< int32_t > itemsInvolved; std::vector< uint8_t > itemsInvolvedQty; std::vector< uint8_t > itemDropRate; + std::vector< uint32_t > toDoNumberInvolved; + std::vector< uint8_t > toDoSequence; + int32_t rule; + uint8_t varient; + uint16_t objective0; + uint16_t objective1; + uint16_t objective2; + uint16_t help0; + uint16_t help1; BattleLeve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct BattleLeveRule +{ + std::string rule; + + BattleLeveRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct BeastRankBonus { + uint16_t neutral; + uint16_t recognized; + uint16_t friendly; + uint16_t trusted; + uint16_t respected; + uint16_t honored; + uint16_t sworn; + uint16_t alliedBloodsworn; uint32_t item; std::vector< uint8_t > itemQuantity; @@ -1104,6 +1401,8 @@ struct BeastReputationRank { uint16_t requiredReputation; std::string name; + std::string alliedNames; + uint32_t color; BeastReputationRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1119,6 +1418,13 @@ struct BeastTribe uint32_t currencyItem; uint8_t displayOrder; std::string name; + int8_t adjective; + std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; + int8_t dEF; std::string nameRelation; BeastTribe( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -1126,31 +1432,108 @@ struct BeastTribe struct Behavior { - uint16_t balloon; + uint8_t condition0Target; + uint8_t condition0Type; + int32_t balloon; + uint8_t condition1Target; + uint8_t condition1Type; + uint32_t contentArgument0; + uint8_t contentArgument1; Behavior( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct BehaviorPath +{ + bool isTurnTransition; + bool isFadeOut; + bool isFadeIn; + bool isWalking; + float speed; + + BehaviorPath( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct BenchmarkOverrideEquipment +{ + uint64_t modelMainHand; + uint8_t dyeMainHand; + uint64_t modelOffHand; + uint8_t dyeOffHand; + uint32_t modelHead; + uint8_t dyeHead; + uint32_t modelBody; + uint8_t dyeBody; + uint32_t modelHands; + uint8_t dyeHands; + uint32_t modelLegs; + uint8_t dyeLegs; + uint32_t modelFeet; + uint8_t dyeFeet; + uint32_t modelEars; + uint8_t dyeEars; + uint32_t modelNeck; + uint8_t dyeNeck; + uint32_t modelWrists; + uint8_t dyeWrists; + uint32_t modelLeftRing; + uint8_t dyeLeftRing; + uint32_t modelRightRing; + uint8_t dyeRightRing; + + BenchmarkOverrideEquipment( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct BGM { std::string file; + uint8_t priority; + bool disableRestartTimeOut; + bool disableRestart; + bool passEnd; + float disableRestartResetTime; + uint8_t specialMode; BGM( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct BGMFade { + int32_t sceneOut; + int32_t sceneIn; int32_t bGMFadeType; BGMFade( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct BGMFadeType +{ + float fadeOutTime; + float fadeInTime; + float fadeInStartTime; + float resumeFadeInTime; + + BGMFadeType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct BGMScene +{ + bool enableDisableRestart; + bool resume; + bool enablePassEnd; + bool forceAutoReset; + bool ignoreBattle; + + BGMScene( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct BGMSituation { - uint16_t bGMDay; - uint16_t bGMNight; - uint16_t bGMBattle; - uint16_t bGMField; + uint16_t daytimeID; + uint16_t nightID; + uint16_t battleID; + uint16_t daybreakID; + uint16_t twilightID; BGMSituation( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1159,6 +1542,7 @@ struct BGMSwitch { uint8_t bGMSystemDefine; uint32_t quest; + uint16_t bGM; BGMSwitch( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1180,13 +1564,19 @@ struct BNpcAnnounceIcon struct BNpcBase { uint16_t behavior; - uint8_t actionTimelineMove; + uint8_t battalion; + uint8_t linkRace; + uint8_t rank; float scale; uint16_t modelChara; uint16_t bNpcCustomize; uint16_t npcEquip; + uint16_t special; + uint8_t sEPack; int32_t arrayEventHandler; uint8_t bNpcParts; + bool isTargetLine; + bool isDisplayLevel; BNpcBase( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1272,10 +1662,29 @@ struct BNpcParts BNpcParts( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct BNpcState +{ + uint8_t slot; + int8_t overRay; + uint16_t idle; + uint8_t attribute0; + bool attributeFlag0; + uint8_t attribute1; + bool attributeFlag1; + uint8_t attribute2; + bool attributeFlag2; + float scale; + int32_t loopTimeline; + + BNpcState( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Buddy { + uint8_t base; int32_t questRequirement2; int32_t questRequirement1; + int32_t baseEquip; std::string soundEffect4; std::string soundEffect3; std::string soundEffect2; @@ -1290,6 +1699,8 @@ struct BuddyAction std::string description; int32_t icon; int32_t iconStatus; + uint16_t reward; + uint8_t sort; BuddyAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1311,6 +1722,7 @@ struct BuddyEquip uint16_t iconHead; uint16_t iconBody; uint16_t iconLegs; + uint8_t order; BuddyEquip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1318,6 +1730,9 @@ struct BuddyEquip struct BuddyItem { uint16_t item; + bool useField; + bool useTraining; + uint8_t status; BuddyItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1366,21 +1781,111 @@ struct Calendar Calendar( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Carry +{ + uint64_t model; + uint8_t timeline; + + Carry( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct Channeling +{ + std::string file; + uint8_t widthScale; + + Channeling( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CharaMakeClassEquip +{ + uint64_t helmet; + uint64_t top; + uint64_t glove; + uint64_t down; + uint64_t shoes; + uint64_t weapon; + uint64_t subWeapon; + int32_t _class; + + CharaMakeClassEquip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct CharaMakeCustomize { + uint8_t featureID; uint32_t icon; uint16_t data; bool isPurchasable; + uint32_t hint; + uint32_t hintItem; CharaMakeCustomize( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CharaMakeName +{ + std::string hyurMidlanderMale; + std::string hyurMidlanderFemale; + std::string hyurMidlanderLastName; + std::string hyurHighlanderMale; + std::string hyurHighlanderFemale; + std::string hyurHighlanderLastName; + std::string elezenMale; + std::string elezenFemale; + std::string elezenWildwoodLastName; + std::string elezenDuskwightLastName; + std::string miqoteSunMale; + std::string miqoteSunFemale; + std::string miqoteSunMaleLastName; + std::string miqoteSunFemaleLastName; + std::string miqoteMoonMale; + std::string miqoteMoonFemale; + std::string miqoteMoonLastname; + std::string lalafellPlainsfolkFirstNameStart; + std::string lalafellPlainsfolkLastNameStart; + std::string lalafellPlainsfolkEndOfNames; + std::string lalafellDunesfolkMale; + std::string lalafellDunesfolkMaleLastName; + std::string lalafellDunesfolkFemale; + std::string lalafellDunesfolkFemaleLastName; + std::string roegadynSeaWolfMale; + std::string roegadynSeaWolfMaleLastName; + std::string roegadynSeaWolfFemale; + std::string roegadynSeaWolfFemaleLastName; + std::string roegadynHellsguardFirstName; + std::string roegadynHellsguardMaleLastName; + std::string roegadynHellsguardFemaleLastName; + std::string auRaRaenMale; + std::string auRaRaenFemale; + std::string auRaRaenLastName; + std::string auRaXaelaMale; + std::string auRaXaelaFemale; + std::string auRaXaelaLastName; + std::string hrothgarHellionsFirstName; + std::string hrothgarHellionsLastName; + std::string hrothgarLostFirstName; + std::string hrothgarLostLastName; + std::string vieraFirstName; + std::string vieraRavaLastName; + std::string vieraVeenaLastName; + + CharaMakeName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct CharaMakeType { int32_t race; int32_t tribe; int8_t gender; - std::vector< int32_t > facialFeatureIcon; + std::vector< uint32_t > menu; + std::vector< uint8_t > initVal; + std::vector< uint8_t > subMenuType; + std::vector< uint8_t > subMenuNum; + std::vector< uint8_t > lookAt; + std::vector< uint32_t > subMenuMask; + std::vector< uint32_t > customize; + std::vector< uint8_t > voiceStruct; CharaMakeType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1464,23 +1969,38 @@ struct ChocoboRaceWeather struct ChocoboTaxi { uint32_t location; + uint8_t fare; + uint16_t timeRequired; ChocoboTaxi( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct ChocoboTaxiStand { + std::vector< uint16_t > targetLocations; std::string placeName; ChocoboTaxiStand( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CircleActivity +{ + std::string name; + int32_t icon; + uint16_t order; + + CircleActivity( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ClassJob { std::string name; std::string abbreviation; uint8_t classJobCategory; int8_t expArrayIndex; + int8_t battleClassIndex; + uint8_t jobIndex; + int8_t dohDolJobIndex; uint16_t modifierHitPoints; uint16_t modifierManaPoints; uint16_t modifierStrength; @@ -1489,15 +2009,18 @@ struct ClassJob uint16_t modifierIntelligence; uint16_t modifierMind; uint16_t modifierPiety; + uint8_t pvPActionSortRow; uint8_t classJobParent; std::string nameEnglish; int32_t itemStartingWeapon; uint8_t role; uint8_t startingTown; + int8_t monsterNote; uint8_t primaryStat; uint16_t limitBreak1; uint16_t limitBreak2; uint16_t limitBreak3; + uint8_t uIPriority; uint32_t itemSoulCrystal; uint32_t unlockQuest; uint32_t relicQuest; @@ -1505,6 +2028,7 @@ struct ClassJob uint8_t startingLevel; uint8_t partyBonus; bool isLimitedJob; + bool canQueueForDuty; ClassJob( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1548,10 +2072,76 @@ struct ClassJobCategory bool aST; bool sAM; bool rDM; + bool bLU; + bool gNB; + bool dNC; ClassJobCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CollectablesShop +{ + std::string name; + uint32_t quest; + uint8_t rewardType; + std::vector< uint16_t > shopItems; + + CollectablesShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CollectablesShopItem +{ + uint32_t item; + uint8_t collectablesShopItemGroup; + uint16_t levelMin; + uint16_t levelMax; + uint8_t stars; + uint8_t key; + uint16_t collectablesShopRefine; + uint16_t collectablesShopRewardScrip; + + CollectablesShopItem( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CollectablesShopItemGroup +{ + std::string name; + + CollectablesShopItemGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CollectablesShopRefine +{ + uint16_t lowCollectability; + uint16_t midCollectability; + uint16_t highCollectability; + + CollectablesShopRefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CollectablesShopRewardItem +{ + uint32_t item; + uint8_t rewardLow; + uint8_t rewardMid; + uint8_t rewardHigh; + + CollectablesShopRewardItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CollectablesShopRewardScrip +{ + uint16_t currency; + uint16_t lowReward; + uint16_t midReward; + uint16_t highReward; + uint16_t expRatioLow; + uint16_t expRatioMid; + uint16_t expRatioHigh; + + CollectablesShopRewardScrip( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Companion { std::string singular; @@ -1562,7 +2152,22 @@ struct Companion int8_t pronoun; int8_t article; uint16_t model; + uint8_t scale; + uint8_t inactiveIdle0; + uint8_t inactiveIdle1; + uint8_t inactiveBattle; + uint8_t inactiveWandering; uint8_t behavior; + uint8_t special; + uint8_t wanderingWait; + uint16_t priority; + bool roulette; + bool battle; + bool lookAt; + bool poke; + uint16_t enemy; + bool stroke; + bool clapping; uint16_t icon; uint16_t order; uint8_t cost; @@ -1654,10 +2259,12 @@ struct CompanyCraftProcess struct CompanyCraftSequence { int32_t resultItem; + int32_t category; int32_t companyCraftDraftCategory; int32_t companyCraftType; int32_t companyCraftDraft; std::vector< uint16_t > companyCraftPart; + uint32_t order; CompanyCraftSequence( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1678,9 +2285,16 @@ struct CompanyCraftType struct CompanyLeve { - int32_t eventItem; - uint8_t eventItemAmount; - int32_t companyLeveRule; + std::vector< uint16_t > routePointTime; + std::vector< int32_t > baseID; + std::vector< uint16_t > enemyLevel; + std::vector< uint32_t > bNpcName; + std::vector< int32_t > itemsInvolved; + std::vector< uint8_t > itemsInvolvedQty; + std::vector< uint8_t > itemDropRate; + std::vector< uint8_t > toDoSequence; + int32_t rule; + uint8_t ruleParam; CompanyLeve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1688,6 +2302,8 @@ struct CompanyLeve struct CompanyLeveRule { std::string type; + uint16_t objective; + uint16_t help; CompanyLeveRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -1710,6 +2326,36 @@ struct CompleteJournalCategory CompleteJournalCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Completion +{ + uint16_t group; + uint16_t key; + std::string lookupTable; + std::string text; + std::string groupTitle; + + Completion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct Condition +{ + uint32_t logMessage; + + Condition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct ConfigKey +{ + std::string label; + uint8_t param; + uint8_t platform; + bool required; + uint8_t category; + std::string text; + + ConfigKey( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ContentCloseCycle { uint32_t unixtime; @@ -1728,35 +2374,42 @@ struct ContentExAction struct ContentFinderCondition { + std::string shortCode; uint16_t territoryType; uint8_t contentLinkType; uint16_t content; + bool pvP; + uint8_t acceptClassJobCategory; uint8_t contentMemberType; uint32_t unlockQuest; uint8_t classJobLevelRequired; uint8_t classJobLevelSync; uint16_t itemLevelRequired; uint16_t itemLevelSync; + bool allowUndersized; bool allowReplacement; + bool allowExplorerMode; bool highEndDuty; bool dutyRecorderAllowed; std::string name; + std::string nameShort; uint8_t contentType; uint8_t transientKey; uint32_t transient; uint16_t sortKey; uint32_t image; uint32_t icon; + bool level506070Roulette; bool levelingRoulette; - bool level5060Roulette; bool mSQRoulette; bool guildHestRoulette; bool expertRoulette; bool trialRoulette; bool dailyFrontlineChallenge; - bool level70Roulette; + bool level80Roulette; bool mentorRoulette; bool allianceRoulette; + bool feastTeamRoulette; bool normalRaidRoulette; ContentFinderCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -1799,14 +2452,23 @@ struct ContentMemberType struct ContentNpcTalk { + int32_t type; std::vector< uint32_t > contentTalk; ContentNpcTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ContentRandomSelect +{ + uint16_t name; + + ContentRandomSelect( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ContentRoulette { std::string name; + std::string category; std::string description; std::string dutyType; bool isInDutyFinder; @@ -1848,7 +2510,9 @@ struct ContentsNote int32_t icon; uint8_t menuOrder; int32_t requiredAmount; + uint8_t reward0; int32_t expMultiplier; + uint8_t reward1; int32_t gilRward; uint16_t levelUnlock; uint16_t howTo; @@ -1860,6 +2524,23 @@ struct ContentsNote ContentsNote( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ContentsTutorial +{ + std::string name; + std::string description; + std::vector< int32_t > page; + + ContentsTutorial( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct ContentsTutorialPage +{ + int32_t image; + std::string description; + + ContentsTutorialPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ContentTalk { uint8_t contentTalkParam; @@ -1919,8 +2600,26 @@ struct CraftLeve CraftLeve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CraftLevelDifference +{ + int16_t difference; + int16_t progressFactor; + int16_t qualityFactor; + + CraftLevelDifference( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CraftLeveTalk +{ + std::vector< std::string > talk; + + CraftLeveTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct CraftType { + uint8_t mainPhysical; + uint8_t subPhysical; std::string name; CraftType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -1973,14 +2672,6 @@ struct CreditListText CreditListText( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct Currency -{ - uint32_t item; - uint32_t limit; - - Currency( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct CustomTalk { uint32_t iconActor; @@ -1988,19 +2679,13 @@ struct CustomTalk std::string name; std::vector< std::string > scriptInstruction; std::vector< uint32_t > scriptArg; - bool text; + std::string mainOption; + std::string subOption; + uint32_t specialLinks; CustomTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct CustomTalkDynamicIcon -{ - uint32_t smallIcon; - uint32_t largeIcon; - - CustomTalkDynamicIcon( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct CustomTalkNestHandlers { uint32_t nestHandler; @@ -2015,22 +2700,117 @@ struct Cutscene Cutscene( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CutSceneIncompQuest +{ + uint32_t quest; + + CutSceneIncompQuest( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CutsceneMotion +{ + float wALK_LOOP_SPEED; + float rUN_LOOP_SPEED; + float sLOWWALK_LOOP_SPEED; + float sLOWRUN_LOOP_SPEED; + float bATTLEWALK_LOOP_SPEED; + float bATTLERUN_LOOP_SPEED; + float dASH_LOOP_SPEED; + uint8_t tURN_CW90_FRAME; + uint8_t tURN_CCW90_FRAME; + uint8_t tURN_CW180_FRAME; + uint8_t tURN_CCW180_FRAME; + + CutsceneMotion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct CutsceneWorkIndex +{ + uint16_t workIndex; + + CutsceneWorkIndex( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct CutScreenImage { + int16_t type; int32_t image; CutScreenImage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct CycleTime +{ + uint32_t firstCycle; + uint32_t cycle; + + CycleTime( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct DailySupplyItem { DailySupplyItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct DawnContent +{ + uint32_t content; + uint32_t exp; + + DawnContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct DawnGrowMember +{ + uint32_t member; + uint32_t imageName; + uint32_t bigImageOld; + uint32_t bigImageNew; + uint32_t smallImageOld; + uint32_t smallImageNew; + uint8_t _class; + + DawnGrowMember( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct DawnMemberUIParam +{ + std::string classSingular; + uint32_t voiceLine; + std::string classPlural; + + DawnMemberUIParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct DawnQuestAnnounce +{ + uint32_t quest; + uint8_t content; + std::vector< uint32_t > eNPC; + + DawnQuestAnnounce( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct DawnQuestMember +{ + uint32_t member; + uint32_t imageName; + uint32_t bigImageOld; + uint32_t bigImageNew; + uint8_t _class; + + DawnQuestMember( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct DeepDungeon { + uint8_t aetherpoolArm; + uint8_t aetherpoolArmor; + std::vector< uint8_t > pomanderSlot; + std::vector< uint8_t > magiciteSlot; std::string name; + uint16_t contentFinderConditionStart; DeepDungeon( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2098,6 +2878,12 @@ struct DeepDungeonItem struct DeepDungeonLayer { uint8_t deepDungeon; + uint8_t floorSet; + uint16_t roomA; + uint16_t roomB; + uint16_t roomC; + uint8_t wepMinLv; + uint8_t armourMinLv; DeepDungeonLayer( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2163,30 +2949,32 @@ struct DeliveryQuest DeliveryQuest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Description +{ + uint32_t quest; + std::string textLong; + std::string textShort; + std::string textCommentary; + uint32_t section; + + Description( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct DescriptionPage { - uint32_t text1; - uint32_t image1; - uint32_t text2; - uint32_t image2; - uint32_t text3; - uint32_t image3; - uint32_t text4; - uint32_t image4; - uint32_t text5; - uint32_t image5; - uint32_t text6; - uint32_t image6; - uint32_t text7; - uint32_t image7; - uint32_t text8; - uint32_t image8; - uint32_t text9; - uint32_t image9; + uint32_t quest; DescriptionPage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct DescriptionSection +{ + uint16_t string; + uint16_t page; + + DescriptionSection( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct DescriptionString { std::string text; @@ -2244,6 +3032,45 @@ struct DpsChallengeTransient DpsChallengeTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct DynamicEvent +{ + uint8_t eventType; + uint8_t enemyType; + uint32_t lGBEventObject; + uint32_t lGBMapRange; + uint32_t quest; + uint8_t singleBattle; + uint32_t announce; + std::string name; + std::string description; + + DynamicEvent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct DynamicEventEnemyType +{ + std::string name; + + DynamicEventEnemyType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct DynamicEventSingleBattle +{ + int32_t bNpcName; + uint32_t icon; + std::string text; + + DynamicEventSingleBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct DynamicEventType +{ + uint32_t iconObjective0; + uint32_t iconObjective1; + + DynamicEventType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct EmjAddon { std::string text; @@ -2266,6 +3093,7 @@ struct Emote uint8_t emoteMode; bool hasCancelEmote; bool drawsWeapon; + uint16_t order; int32_t textCommand; uint16_t icon; uint16_t logMessageTargeted; @@ -2282,8 +3110,23 @@ struct EmoteCategory EmoteCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct EmoteMode +{ + uint16_t startEmote; + uint16_t endEmote; + bool move; + bool camera; + bool endOnRotate; + bool endOnEmote; + uint8_t conditionMode; + + EmoteMode( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ENpcBase { + uint16_t eventHandler; + bool important; std::vector< uint32_t > eNpcData; float scale; uint16_t modelChara; @@ -2340,7 +3183,10 @@ struct ENpcBase uint8_t dyeLeftRing; uint32_t modelRightRing; uint8_t dyeRightRing; + uint8_t invisibility; uint16_t balloon; + bool notRewriteHeight; + uint8_t defaultBalloon; ENpcBase( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2391,8 +3237,15 @@ struct ENpcResident struct EObj { + uint8_t popType; uint32_t data; + uint8_t invisibility; uint16_t sgbPath; + bool eyeCollision; + bool directorControl; + bool target; + uint8_t eventHighAddition; + bool addedIn53; EObj( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2520,6 +3373,17 @@ struct EventAction EventAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct EventCustomIconType +{ + std::vector< uint32_t > announceQuest; + std::vector< uint32_t > announceQuestLocked; + std::vector< uint32_t > mapAnnounceQuest0; + std::vector< uint32_t > mapAnnounceQuestLocked; + std::vector< uint32_t > mapAnnounceQuest1; + + EventCustomIconType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct EventIconPriority { std::vector< uint32_t > icon; @@ -2553,6 +3417,8 @@ struct EventItem uint8_t stackSize; uint32_t quest; uint8_t castTime; + uint8_t castTimeline; + uint8_t timeline; EventItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2578,6 +3444,23 @@ struct EventItemTimeline EventItemTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct EventSystemDefine +{ + std::string text; + uint32_t defineValue; + + EventSystemDefine( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct ExportedGatheringPoint +{ + float x; + float y; + uint8_t radius; + + ExportedGatheringPoint( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ExportedSG { std::string sgbPath; @@ -2588,40 +3471,105 @@ struct ExportedSG struct ExVersion { std::string name; + uint16_t acceptJingle; + uint16_t completeJingle; ExVersion( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct Fate { - uint8_t eurekaFate; - uint32_t location; - uint8_t classJobLevel; - uint8_t classJobLevelMax; - uint32_t eventItem; - uint32_t iconObjective; - uint32_t iconMap; - int32_t music; - bool hasWorldMapIcon; std::string name; std::string description; std::string objective; std::vector< std::string > statusText; + uint8_t eurekaFate; + uint8_t rule; + uint16_t fateRuleEx; + uint32_t location; + uint8_t classJobLevel; + uint8_t classJobLevelMax; + uint32_t eventItem; + std::vector< uint8_t > typeToDoValue; + uint32_t iconObjective; + uint32_t iconMap; + uint32_t iconInactiveMap; + int32_t music; + uint32_t lGBGuardNPCLocation; + uint16_t screenImageAccept; + uint16_t screenImageComplete; + uint16_t screenImageFailed; + uint32_t requiredQuest; + bool specialFate; + uint16_t givenStatus; + bool adventEvent; + bool moonFaireEvent; + uint32_t fATEChain; uint32_t arrayIndex; + uint32_t reqEventItem; + uint32_t turnInEventItem; + std::vector< uint16_t > objectiveIcon; Fate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct FateEvent +{ + std::vector< uint8_t > turn; + std::vector< uint32_t > gesture; + std::vector< int32_t > lipSync; + std::vector< int32_t > facial; + std::vector< int32_t > shape; + std::vector< bool > isAutoShake; + std::vector< uint8_t > widgetType; + std::vector< std::string > text; + + FateEvent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct FateMode +{ + uint32_t motivationIcon; + uint32_t motivationMapMarker; + uint32_t objectiveIcon; + uint32_t objectiveMapMarker; + + FateMode( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct FateProgressUI +{ + int32_t location; + int32_t achievement; + uint8_t reqFatesToRank2; + uint8_t reqFatesToRank3; + uint8_t displayOrder; + + FateProgressUI( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct FateTokenType +{ + uint32_t currency; + + FateTokenType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct FCActivity { std::string text; + uint8_t selfKind; + uint8_t targetKind; + uint8_t numParam; uint8_t fCActivityCategory; + int8_t iconType; FCActivity( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct FCActivityCategory { + uint8_t priority; std::string name; FCActivityCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -2649,6 +3597,14 @@ struct FCChestName FCChestName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct FCCrestSymbol +{ + uint8_t colorNum; + uint8_t fCRight; + + FCCrestSymbol( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct FccShop { std::string name; @@ -2665,15 +3621,29 @@ struct FCHierarchy struct FCProfile { + uint8_t priority; std::string name; FCProfile( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct FCRank +{ + uint32_t nextPoint; + uint32_t currentPoint; + uint16_t rights; + uint8_t fCActionActiveNum; + uint8_t fCActionStockNum; + + FCRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct FCReputation { uint32_t pointsToNext; uint32_t requiredPoints; + uint8_t discountRate; + uint32_t color; std::string name; FCReputation( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -2699,7 +3669,9 @@ struct Festival struct FieldMarker { int32_t vFX; - uint16_t icon; + uint16_t uiIcon; + uint16_t mapIcon; + std::string name; FieldMarker( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2728,7 +3700,10 @@ struct FishingSpot std::string bigFishOnReach; std::string bigFishOnEnd; uint8_t fishingSpotCategory; + bool rare; uint16_t territoryType; + uint16_t placeNameMain; + uint16_t placeNameSub; int16_t x; int16_t z; uint16_t radius; @@ -2770,15 +3745,32 @@ struct Frontline04 int32_t level1; int32_t level2; int32_t level3; - std::vector< int32_t > unknownLevel; Frontline04( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct FurnitureCatalogCategory +{ + std::string category; + + FurnitureCatalogCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct FurnitureCatalogItemList +{ + uint16_t category; + int32_t item; + uint16_t patch; + + FurnitureCatalogItemList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GardeningSeed { uint32_t item; + uint16_t modelID; uint32_t icon; + bool sE; GardeningSeed( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2792,7 +3784,7 @@ struct GatheringCondition struct GatheringExp { - uint16_t exp; + int32_t exp; GatheringExp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2823,9 +3815,22 @@ struct GatheringItemPoint struct GatheringLeve { + std::vector< int32_t > route; + int32_t requiredItem0; + uint8_t requiredItemQty0; int32_t requiredItem1; - uint8_t leveLevel; + uint8_t requiredItemQty1; int32_t requiredItem2; + uint8_t requiredItemQty2; + int32_t requiredItem3; + uint8_t requiredItemQty3; + uint8_t itemNumber; + int32_t rule; + uint8_t varient; + uint16_t objective0; + uint16_t objective1; + int32_t bNpcEntry; + bool useSecondaryTool; GatheringLeve( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -2836,6 +3841,13 @@ struct GatheringLeveRoute GatheringLeveRoute( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GatheringLeveRule +{ + std::string rule; + + GatheringLeveRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GatheringNotebookList { std::vector< int32_t > gatheringItem; @@ -2845,7 +3857,9 @@ struct GatheringNotebookList struct GatheringPoint { + uint8_t type; int32_t gatheringPointBase; + uint8_t count; std::vector< uint16_t > gatheringPointBonus; uint16_t territoryType; uint16_t placeName; @@ -2867,7 +3881,7 @@ struct GatheringPointBase struct GatheringPointBonus { uint8_t condition; - uint16_t conditionValue; + uint32_t conditionValue; uint8_t bonusType; uint16_t bonusValue; @@ -2894,8 +3908,26 @@ struct GatheringPointName GatheringPointName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GatheringPointTransient +{ + uint16_t ephemeralStartTime; + uint16_t ephemeralEndTime; + int32_t gatheringRarePopTimeTable; + + GatheringPointTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GatheringRarePopTimeTable +{ + + GatheringRarePopTimeTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GatheringSubCategory { + uint8_t gatheringType; + uint8_t classJob; + uint16_t division; int32_t item; std::string folkloreBook; @@ -2923,6 +3955,19 @@ struct GcArmyCaptureTactics GcArmyCaptureTactics( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GcArmyEquipPreset +{ + int32_t mainHand; + int32_t offHand; + int32_t head; + int32_t body; + int32_t gloves; + int32_t legs; + int32_t feet; + + GcArmyEquipPreset( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GcArmyExpedition { uint8_t requiredFlag; @@ -2957,6 +4002,10 @@ struct GcArmyMemberGrow { uint8_t classJob; int32_t classBook; + std::vector< uint16_t > equipPreset; + std::vector< uint8_t > physical; + std::vector< uint8_t > mental; + std::vector< uint8_t > tactical; GcArmyMemberGrow( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3113,6 +4162,8 @@ struct GeneralAction std::string description; uint16_t action; uint16_t unlockLink; + uint8_t recast; + uint8_t uIPriority; int32_t icon; GeneralAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -3157,6 +4208,7 @@ struct GilShop { std::string name; uint32_t icon; + uint32_t quest; int32_t acceptTalk; int32_t failTalk; @@ -3166,13 +4218,46 @@ struct GilShop struct GilShopItem { int32_t item; - std::vector< int32_t > rowRequired; + std::vector< int32_t > questRequired; + int32_t achievementRequired; uint16_t stateRequired; uint16_t patch; GilShopItem( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GimmickAccessor +{ + int32_t param0; + uint32_t param1; + uint32_t param2; + uint32_t type; + + GimmickAccessor( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GimmickJump +{ + uint16_t fallDamage; + int8_t height; + uint32_t loopMotion; + uint32_t endMotion; + bool startClient; + + GimmickJump( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GimmickRect +{ + uint32_t layoutID; + uint8_t triggerIn; + uint32_t param0; + uint8_t triggerOut; + uint32_t param1; + + GimmickRect( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GoldSaucerArcadeMachine { uint32_t failImage; @@ -3214,6 +4299,31 @@ struct GrandCompanyRank GrandCompanyRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GroupPoseFrame +{ + int32_t image; + std::string gridText; + std::string text; + + GroupPoseFrame( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GroupPoseStamp +{ + int32_t stampIcon; + int32_t category; + std::string name; + + GroupPoseStamp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GroupPoseStampCategory +{ + std::string name; + + GroupPoseStampCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GuardianDeity { std::string name; @@ -3223,10 +4333,43 @@ struct GuardianDeity GuardianDeity( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Guide +{ + uint16_t guideTitle; + uint16_t guidePage; + + Guide( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GuidePage +{ + uint8_t key; + uint32_t output; + + GuidePage( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GuidePageString +{ + std::string string; + + GuidePageString( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct GuideTitle +{ + std::string title; + + GuideTitle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GuildleveAssignment { + std::string type; + uint8_t typeId; uint32_t assignmentTalk; std::vector< uint32_t > quest; + uint8_t grandCompanyRank; GuildleveAssignment( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3238,6 +4381,13 @@ struct GuildleveAssignmentCategory GuildleveAssignmentCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct GuildleveAssignmentTalk +{ + std::vector< std::string > talk; + + GuildleveAssignmentTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct GuildOrder { uint32_t eNpcName; @@ -3424,8 +4574,12 @@ struct HousingYardObject struct HowTo { - std::vector< int16_t > images; + std::string name; + bool announce; + std::vector< int16_t > howToPagePC; + std::vector< int16_t > howToPageController; int8_t category; + uint8_t sort; HowTo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3439,21 +4593,266 @@ struct HowToCategory struct HowToPage { + uint8_t type; + uint8_t iconType; int32_t image; + uint8_t textType; + std::vector< std::string > text; HowToPage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct HugeCraftworksNpc +{ + uint32_t eNpcResident; + uint16_t classJobCategory; + std::vector< uint32_t > itemRequested; + std::vector< uint8_t > qtyRequested; + std::vector< uint32_t > itemReward; + std::vector< uint8_t > qtyItemReward; + std::vector< uint32_t > itemUnkown; + std::vector< uint8_t > qtyItemUnkown; + std::string transient; + + HugeCraftworksNpc( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HugeCraftworksRank +{ + uint8_t crafterLevel; + uint32_t expRewardPerItem; + + HugeCraftworksRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDAnnounce +{ + std::string name; + uint32_t eNPC; + + HWDAnnounce( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDCrafterSupply +{ + std::vector< uint32_t > itemTradeIn; + std::vector< uint8_t > level; + std::vector< uint8_t > levelMax; + std::vector< uint16_t > baseCollectableRating; + std::vector< uint16_t > midCollectableRating; + std::vector< uint16_t > highCollectableRating; + std::vector< uint16_t > baseCollectableReward; + std::vector< uint16_t > midCollectableReward; + std::vector< uint16_t > highCollectableReward; + std::vector< uint16_t > baseCollectableRewardPostPhase; + std::vector< uint16_t > midCollectableRewardPostPhase; + std::vector< uint16_t > highCollectableRewardPostPhase; + std::vector< uint8_t > termName; + + HWDCrafterSupply( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDCrafterSupplyReward +{ + uint16_t scriptRewardAmount; + uint32_t expReward; + uint16_t Points; + + HWDCrafterSupplyReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDCrafterSupplyTerm +{ + std::string name; + + HWDCrafterSupplyTerm( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDDevLayerControl +{ + + HWDDevLayerControl( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDDevLevelUI +{ + + HWDDevLevelUI( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDDevLively +{ + uint32_t eNPC; + + HWDDevLively( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDDevProgress +{ + bool canGoNext; + + HWDDevProgress( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDGathereInspectTerm +{ + std::string name; + + HWDGathereInspectTerm( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDGathererInspection +{ + std::vector< uint32_t > itemRequired; + std::vector< uint32_t > fishParameter; + std::vector< uint8_t > amountRequired; + std::vector< uint32_t > itemReceived; + std::vector< uint16_t > reward1; + std::vector< uint16_t > reward2; + std::vector< uint8_t > phase; + + HWDGathererInspection( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDGathererInspectionReward +{ + uint16_t scrips; + uint16_t points; + + HWDGathererInspectionReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDInfoBoardArticle +{ + uint8_t type; + std::string text; + + HWDInfoBoardArticle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDInfoBoardArticleTransient +{ + uint32_t image; + std::string text; + std::string npcName; + + HWDInfoBoardArticleTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDInfoBoardArticleType +{ + std::string type; + + HWDInfoBoardArticleType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDLevelChangeDeception +{ + int32_t image; + + HWDLevelChangeDeception( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDSharedGroup +{ + uint32_t lGB; + uint8_t param; + + HWDSharedGroup( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct HWDSharedGroupControlParam +{ + uint8_t paramValue; + + HWDSharedGroupControlParam( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct IKDContentBonus +{ + std::string objective; + std::string requirement; + uint32_t image; + uint8_t order; + + IKDContentBonus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct IKDFishParam +{ + uint32_t fish; + uint8_t iKDContentBonus; + + IKDFishParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct IKDRoute +{ + uint32_t image; + uint32_t territoryType; + std::string name; + + IKDRoute( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct IKDRouteTable +{ + uint32_t route; + + IKDRouteTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct IKDSpot +{ + uint32_t spotMain; + uint32_t spotSub; + uint32_t placeName; + + IKDSpot( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct InclusionShop +{ + std::vector< uint16_t > category; + + InclusionShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct InclusionShopCategory +{ + std::string name; + uint8_t classJobCategory; + uint16_t inclusionShopSeries; + + InclusionShopCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct InclusionShopSeries +{ + uint32_t specialShop; + + InclusionShopSeries( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct IndividualWeather +{ + std::vector< uint8_t > weather; + std::vector< uint32_t > quest; + + IndividualWeather( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct InstanceContent { uint8_t instanceContentType; uint8_t weekRestriction; uint16_t timeLimitmin; - std::string name; uint16_t bGM; uint16_t winBGM; uint32_t cutscene; + uint32_t lGBEventRange; uint16_t order; + uint8_t colosseum; uint32_t instanceContentTextDataBossStart; uint32_t instanceContentTextDataBossEnd; uint32_t bNpcBaseBoss; @@ -3463,15 +4862,15 @@ struct InstanceContent uint32_t instanceClearExp; uint16_t newPlayerBonusA; uint16_t finalBossCurrencyC; - uint16_t finalBossCurrencyA; + uint32_t finalBossCurrencyA; uint16_t finalBossCurrencyB; uint16_t newPlayerBonusB; uint32_t instanceClearGil; uint32_t instanceContentRewardItem; - uint32_t finalBossExp; - int32_t instanceContentBuff; - uint32_t reqInstance; - uint8_t partyCondition; + uint8_t finalBossExp; + uint32_t instanceContentBuff; + int32_t reqInstance; + int16_t partyCondition; InstanceContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3525,11 +4924,12 @@ struct Item uint8_t itemUICategory; uint8_t itemSearchCategory; uint8_t equipSlotCategory; + uint8_t itemSortCategory; uint32_t stackSize; bool isUnique; bool isUntradable; bool isIndisposable; - bool isEquippable; + bool lot; uint32_t priceMid; uint32_t priceLow; bool canBeHq; @@ -3540,8 +4940,9 @@ struct Item uint8_t classJobRepair; int32_t itemRepair; int32_t itemGlamour; - uint16_t salvage; + uint16_t desynth; bool isCollectable; + bool alwaysCollectable; uint16_t aetherialReduce; uint8_t levelEquip; uint8_t equipRestriction; @@ -3565,6 +4966,7 @@ struct Item uint8_t materiaSlotCount; bool isAdvancedMeldingPermitted; bool isPvP; + uint8_t subStatCategory; bool isGlamourous; struct @@ -3578,6 +4980,10 @@ struct Item struct ItemAction { + uint8_t condLv; + bool condBattle; + bool condPVP; + bool condPVPOnly; uint16_t type; std::vector< uint16_t > data; std::vector< uint16_t > dataHQ; @@ -3585,6 +4991,23 @@ struct ItemAction ItemAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ItemActionTelepo +{ + uint32_t requirement; + uint32_t denyMessage; + + ItemActionTelepo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct ItemBarterCheck +{ + uint16_t category; + uint32_t question; + uint32_t confirm; + + ItemBarterCheck( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ItemFood { uint8_t eXPBonus; @@ -3689,6 +5112,13 @@ struct ItemSeries ItemSeries( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ItemSortCategory +{ + uint8_t param; + + ItemSortCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ItemSpecialBonus { std::string name; @@ -3706,9 +5136,33 @@ struct ItemUICategory ItemUICategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Jingle +{ + std::string name; + + Jingle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct JobHudManual +{ + uint32_t action; + uint16_t guide; + + JobHudManual( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct JobHudManualPriority +{ + std::vector< uint8_t > jobHudManual; + + JobHudManualPriority( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct JournalCategory { std::string name; + uint8_t separateType; + uint8_t dataType; uint8_t journalSection; JournalCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -3730,14 +5184,41 @@ struct JournalSection JournalSection( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Knockback +{ + uint8_t distance; + uint8_t speed; + bool motion; + uint8_t nearDistance; + uint8_t direction; + uint8_t directionArg; + bool cancelMove; + + Knockback( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct LegacyQuest +{ + uint16_t legacyQuestID; + std::string text; + std::string string; + uint16_t sortKey; + uint8_t genre; + + LegacyQuest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Leve { std::string name; std::string description; int32_t leveClient; - int32_t leveAssignmentType; + uint8_t leveAssignmentType; + int32_t town; uint16_t classJobLevel; + uint8_t timeLimit; uint8_t allowanceCost; + int32_t evaluation; int32_t placeNameStart; int32_t placeNameIssued; uint8_t classJobCategory; @@ -3745,6 +5226,9 @@ struct Leve int32_t placeNameStartZone; int32_t iconCityState; int32_t dataId; + bool canCancel; + uint8_t maxDifficulty; + float expFactor; uint32_t expReward; uint32_t gilReward; uint16_t leveRewardItem; @@ -3752,6 +5236,7 @@ struct Leve uint8_t leveVfxFrame; uint32_t levelLevemete; int32_t iconIssuer; + bool lockedLeve; uint32_t levelStart; uint16_t bGM; @@ -3802,6 +5287,13 @@ struct LeveRewardItemGroup LeveRewardItemGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct LeveString +{ + std::string objective; + + LeveString( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct LeveVfx { std::string effect; @@ -3810,9 +5302,24 @@ struct LeveVfx LeveVfx( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Lobby +{ + uint32_t tYPE; + uint32_t pARAM; + uint32_t lINK; + std::string text; + + Lobby( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct LogFilter { uint8_t logKind; + uint16_t caster; + uint16_t target; + uint8_t category; + uint8_t displayOrder; + uint8_t preset; std::string name; std::string example; @@ -3822,20 +5329,10 @@ struct LogFilter struct LogKind { std::string format; - std::string name; - std::string example; - uint8_t logKindCategoryText; LogKind( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct LogKindCategoryText -{ - std::string text; - - LogKindCategoryText( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct LogMessage { uint16_t logKind; @@ -3848,6 +5345,8 @@ struct LotteryExchangeShop { std::vector< int32_t > itemAccepted; std::vector< uint32_t > amountAccepted; + std::string lua; + std::vector< uint32_t > logMessage; LotteryExchangeShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3870,7 +5369,9 @@ struct MacroIconRedirectOld struct MainCommand { int32_t icon; + uint8_t category; uint8_t mainCommandCategory; + int8_t sortID; std::string name; std::string description; @@ -3894,6 +5395,9 @@ struct ManeuversArmor struct Map { + uint8_t mapCondition; + uint8_t priorityCategoryUI; + uint8_t priorityUI; int8_t mapIndex; uint8_t hierarchy; uint16_t mapMarkerRange; @@ -3905,12 +5409,21 @@ struct Map uint16_t placeName; uint16_t placeNameSub; int16_t discoveryIndex; + uint32_t discoveryFlag; uint16_t territoryType; bool discoveryArrayByte; + bool isEvent; Map( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MapCondition +{ + uint16_t quest; + + MapCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct MapMarker { int16_t x; @@ -3937,6 +5450,7 @@ struct MapSymbol { int32_t icon; int32_t placeName; + bool displayNavi; MapSymbol( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -3949,35 +5463,42 @@ struct Marker Marker( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct MasterpieceSupplyDuty -{ - uint8_t classJob; - uint8_t classJobLevel; - uint16_t rewardCurrency; - - MasterpieceSupplyDuty( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - -struct MasterpieceSupplyMultiplier -{ - std::vector< uint16_t > xpMultiplier; - std::vector< uint16_t > currencyMultiplier; - - MasterpieceSupplyMultiplier( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct Materia { std::vector< int32_t > item; uint8_t baseParam; - std::vector< uint8_t > value; + std::vector< int16_t > value; Materia( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MateriaJoinRate +{ + std::vector< float > NQOvermeldSlot; + std::vector< float > HQOvermeldSlot; + + MateriaJoinRate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MateriaJoinRateGatherCraft +{ + std::vector< float > NQOvermeldSlot; + std::vector< float > HQOvermeldSlot; + + MateriaJoinRateGatherCraft( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MateriaTomestoneRate +{ + uint32_t rate; + + MateriaTomestoneRate( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct MiniGameRA { int32_t icon; + int32_t image; int32_t bGM; MiniGameRA( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4005,14 +5526,45 @@ struct MinionSkillType MinionSkillType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MobHuntOrder +{ + uint16_t target; + uint8_t neededKills; + uint8_t type; + uint8_t rank; + uint8_t mobHuntReward; + + MobHuntOrder( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct MobHuntOrderType { + uint8_t type; uint32_t quest; uint32_t eventItem; + uint16_t orderStart; + uint8_t orderAmount; MobHuntOrderType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MobHuntReward +{ + uint32_t expReward; + uint16_t gilReward; + uint8_t expansion; + uint16_t currencyReward; + + MobHuntReward( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MobHuntRewardCap +{ + uint32_t expCap; + + MobHuntRewardCap( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct MobHuntTarget { uint16_t name; @@ -4030,13 +5582,22 @@ struct ModelChara uint16_t model; uint8_t base; uint8_t variant; + uint16_t sEPack; + bool papVariation; ModelChara( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct ModelSkeleton { - float scaleFactor; + float radius; + float height; + float vFXScale; + float floatHeight; + float floatDown; + uint16_t floatUp; + bool motionBlendType; + uint8_t loopFlySE; ModelSkeleton( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4062,10 +5623,34 @@ struct MonsterNoteTarget { uint16_t bNpcName; int32_t icon; + uint8_t town; MonsterNoteTarget( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MotionTimeline +{ + std::string filename; + uint8_t blendGroup; + bool isLoop; + bool isBlinkEnable; + bool isLipEnable; + + MotionTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MotionTimelineBlendTable +{ + uint8_t destBlendGroup; + uint8_t srcBlendGroup; + uint8_t blendFrame_PC; + uint8_t blendFram_TypeA; + uint8_t blendFram_TypeB; + uint8_t blendFram_TypeC; + + MotionTimelineBlendTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Mount { std::string singular; @@ -4080,11 +5665,23 @@ struct Mount uint8_t isFlying; uint8_t mountCustomize; uint16_t rideBGM; + uint8_t exitMoveDist; + uint8_t exitMoveSpeed; + bool isEmote; + int32_t equipHead; + int32_t equipBody; + int32_t equipLeg; + int32_t equipFoot; int16_t order; uint16_t icon; + uint8_t uIPriority; + uint8_t radiusRate; + uint8_t baseMotionSpeed_Run; + uint8_t baseMotionSpeed_Walk; uint8_t extraSeats; uint16_t mountAction; bool isAirborne; + bool exHotbarEnableConfig; bool useEP; bool isImmobile; @@ -4100,6 +5697,22 @@ struct MountAction struct MountCustomize { + uint16_t hyurMaleScale; + uint16_t hyurFemaleScale; + uint16_t elezenMaleScale; + uint16_t elezenFemaleScale; + uint16_t lalaMaleScale; + uint16_t lalaFemaleScale; + uint16_t miqoMaleScale; + uint16_t miqoFemaleScale; + uint16_t roeMaleScale; + uint16_t roeFemaleScale; + uint16_t auRaMaleScale; + uint16_t auRaFemaleScale; + uint16_t hrothgarMaleScale; + uint16_t hrothgarFemaleScale; + uint16_t vieraMaleScale; + uint16_t vieraFemaleScale; uint8_t hyurMaleCameraHeight; uint8_t hyurFemaleCameraHeight; uint8_t elezenMaleCameraHeight; @@ -4112,6 +5725,10 @@ struct MountCustomize uint8_t roeFemaleCameraHeight; uint8_t auRaMaleCameraHeight; uint8_t auRaFemaleCameraHeight; + uint8_t hrothgarMaleCameraHeight; + uint8_t hrothgarRoeFemaleCameraHeight; + uint8_t vieraMaleCameraHeight; + uint8_t vieraFemaleCameraHeight; MountCustomize( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4163,10 +5780,88 @@ struct MoveVfx MoveVfx( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct MovieStaffList +{ + uint32_t image; + float startTime; + float endTime; + + MovieStaffList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MovieSubtitle +{ + float startTime; + float endTime; + + MovieSubtitle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MovieSubtitle500 +{ + float startTime; + float endTime; + + MovieSubtitle500( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MovieSubtitleVoyage +{ + float startTime; + float endTime; + + MovieSubtitleVoyage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MYCTemporaryItem +{ + uint8_t category; + uint8_t type; + uint32_t action; + uint8_t max; + uint8_t weight; + uint8_t order; + + MYCTemporaryItem( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MYCTemporaryItemUICategory +{ + std::string name; + + MYCTemporaryItemUICategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct MYCWarResultNotebook +{ + uint8_t number; + uint8_t link; + int32_t quest; + int32_t icon; + int32_t image; + uint8_t rarity; + std::string nameJP; + std::string name; + std::string description; + + MYCWarResultNotebook( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct NotebookDivision { std::string name; uint8_t notebookDivisionCategory; + uint8_t craftOpeningLevel; + uint8_t gatheringOpeningLevel; + uint32_t questUnlock; + bool cRPCraft; + bool bSMCraft; + bool aRMCraft; + bool gSMCraft; + bool lTWCraft; + bool wVRCraft; + bool aLCCraft; + bool cULCraft; NotebookDivision( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4174,10 +5869,20 @@ struct NotebookDivision struct NotebookDivisionCategory { std::string name; + uint8_t index; NotebookDivisionCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct NotoriousMonster +{ + int32_t bNpcBase; + uint8_t rank; + uint32_t bNpcName; + + NotoriousMonster( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct NpcEquip { uint64_t modelMainHand; @@ -4211,6 +5916,10 @@ struct NpcEquip struct NpcYell { + uint8_t outputType; + float balloonTime; + bool isBalloonSlow; + bool battleTalkTime; std::string text; NpcYell( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4218,13 +5927,18 @@ struct NpcYell struct Omen { - std::string fileName; + std::string path; + std::string pathAlly; + uint8_t type; + bool restrictYScale; + bool largeScale; Omen( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct OnlineStatus { + bool list; uint8_t priority; std::string name; uint32_t icon; @@ -4232,6 +5946,21 @@ struct OnlineStatus OnlineStatus( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct OpenContent +{ + std::vector< uint16_t > content; + std::vector< uint32_t > candidateName; + + OpenContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct OpenContentCandidateName +{ + std::string name; + + OpenContentCandidateName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Opening { std::string name; @@ -4251,6 +5980,9 @@ struct Orchestrion struct OrchestrionCategory { std::string name; + uint8_t hideOrder; + uint32_t icon; + uint8_t order; OrchestrionCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4270,10 +6002,28 @@ struct OrchestrionUiparam OrchestrionUiparam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct Ornament +{ + uint16_t model; + int16_t order; + uint16_t icon; + uint16_t transient; + std::string singular; + int8_t adjective; + std::string plural; + int8_t possessivePronoun; + int8_t startsWithVowel; + int8_t pronoun; + int8_t article; + + Ornament( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct ParamGrow { int32_t expToNext; uint8_t additionalActions; + uint8_t applyAction; uint16_t scaledQuestXP; int32_t mpModifier; int32_t baseSpeed; @@ -4281,7 +6031,11 @@ struct ParamGrow uint8_t questExpModifier; uint16_t hpModifier; int32_t huntingLogExpReward; + int32_t monsterNoteSeals; uint16_t itemLevelSync; + uint16_t properDungeon; + uint16_t properGuildOrder; + uint16_t craftingLevel; ParamGrow( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4290,9 +6044,12 @@ struct PartyContent { uint8_t key; uint16_t timeLimit; - std::string name; + bool name; uint32_t textDataStart; uint32_t textDataEnd; + std::vector< uint32_t > lGBEventObject0; + std::vector< uint32_t > lGBEventRange; + std::vector< uint32_t > lGBEventObject1; uint16_t contentFinderCondition; uint32_t image; @@ -4313,6 +6070,17 @@ struct PartyContentTextData PartyContentTextData( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct PatchMark +{ + int8_t category; + uint8_t subCategoryType; + uint16_t subCategory; + uint32_t markID; + uint8_t version; + + PatchMark( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Perform { std::string name; @@ -4324,11 +6092,19 @@ struct Perform uint16_t animationPlay02; int32_t stopAnimation; std::string instrument; + int32_t order; uint8_t transient; Perform( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct PerformGroup +{ + std::vector< uint8_t > perform; + + PerformGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct PerformTransient { std::string text; @@ -4350,15 +6126,48 @@ struct PetAction int32_t icon; uint16_t action; uint8_t pet; + bool masterOrder; + bool disableOrder; PetAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct PetMirage +{ + std::string name; + + PetMirage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct PhysicsGroup +{ + std::vector< float > simulationTime; + std::vector< float > pS3SimulationTime; + bool resetByLookAt; + float rootFollowingGame; + float rootFollowingCutScene; + std::vector< int8_t > configSwitch; + bool forceAttractByPhysicsOff; + + PhysicsGroup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct PhysicsWind +{ + float threshold; + float amplitude; + float amplitudeFrequency; + float powerMin; + float powerMax; + float powerFrequency; + + PhysicsWind( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Picture { int32_t item; int32_t image; - int32_t signature; Picture( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4380,12 +6189,58 @@ struct PlantPotFlowerSeed struct PreHandler { + uint32_t image; uint32_t target; - uint16_t actionTimeline; + uint32_t unlockQuest; + uint32_t acceptMessage; + uint32_t denyMessage; PreHandler( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct PresetCamera +{ + uint16_t eID; + float posX; + float posY; + float posZ; + float elezen; + float lalafell; + float miqote; + float roe; + float hrothgar; + float viera; + float hyur_F; + float elezen_F; + float lalafell_F; + float miqote_F; + float roe_F; + float hrothgar_F; + float viera_F; + + PresetCamera( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct PresetCameraAdjust +{ + float hyur_M; + float hyur_F; + float elezen_M; + float elezen_F; + float lalafell_M; + float lalafell_F; + float miqote_M; + float miqote_F; + float roe_M; + float roe_F; + float hrothgar_M; + float hrothgar_F; + float viera_M; + float viera_F; + + PresetCameraAdjust( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct PublicContent { uint8_t type; @@ -4394,8 +6249,12 @@ struct PublicContent std::string name; uint32_t textDataStart; uint32_t textDataEnd; + uint32_t startCutscene; + uint32_t lGBEventRange; + uint32_t lGBPopRange; uint16_t contentFinderCondition; uint16_t additionalData; + uint32_t endCutscene; PublicContent( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4418,13 +6277,14 @@ struct PublicContentTextData struct PvPAction { uint16_t action; + std::vector< bool > grandCompany; PvPAction( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct PvPActionSort { - uint8_t name; + uint8_t actionType; uint16_t action; PvPActionSort( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4466,48 +6326,69 @@ struct Quest uint8_t classJobCategory1; uint16_t classJobLevel1; uint8_t previousQuestJoin; - uint32_t previousQuest0; - uint32_t previousQuest1; - uint32_t previousQuest2; + std::vector< uint32_t > previousQuest; + uint8_t previousQuest0Sequence; uint8_t questLockJoin; std::vector< uint32_t > questLock; + uint16_t header; + uint8_t startTown; + uint8_t classJobUnlockFlag; uint8_t classJobUnlock; uint8_t grandCompany; uint8_t grandCompanyRank; uint8_t instanceContentJoin; std::vector< uint32_t > instanceContent; uint8_t festival; + uint8_t festivalBegin; + uint8_t festivalEnd; uint16_t bellStart; uint16_t bellEnd; uint8_t beastTribe; uint8_t beastReputationRank; - uint16_t levelMax; + uint16_t beastReputationValue; + uint8_t satisfactionNpc; + uint8_t satisfactionLevel; int32_t mountRequired; bool isHouseRequired; uint8_t deliveryQuest; uint32_t issuerStart; - uint16_t behavior; + uint32_t issuerLocation; + uint16_t clientBehavior; uint32_t targetEnd; bool isRepeatable; uint8_t repeatIntervalType; uint8_t questRepeatFlag; - bool unlocksSystemContent; + bool canCancel; uint8_t type; uint16_t questClassJobSupply; std::vector< std::string > scriptInstruction; std::vector< uint32_t > scriptArg; std::vector< uint8_t > actorSpawnSeq; std::vector< uint8_t > actorDespawnSeq; - std::vector< uint32_t > actorSpawn; + std::vector< uint32_t > listener; std::vector< uint8_t > questUInt8A; std::vector< uint8_t > questUInt8B; + std::vector< uint8_t > conditionType; + std::vector< uint32_t > conditionValue; + std::vector< uint8_t > conditionOperator; + std::vector< uint16_t > behavior; + std::vector< bool > visibleBool; + std::vector< bool > conditionBool; + std::vector< bool > itemBool; + std::vector< bool > announceBool; + std::vector< bool > behaviorBool; + std::vector< bool > acceptBool; + std::vector< bool > qualifiedBool; + std::vector< bool > canTargetBool; std::vector< uint8_t > toDoCompleteSeq; std::vector< uint8_t > toDoQty; std::vector< uint32_t > toDoMainLocation; + std::vector< uint8_t > countableNum; + uint8_t levelMax; uint8_t classJobRequired; uint16_t expFactor; uint32_t gilReward; - uint16_t gCSeals; + uint32_t gCSeals; std::vector< uint8_t > itemCatalyst; std::vector< uint8_t > itemCountCatalyst; uint8_t itemRewardType; @@ -4521,7 +6402,10 @@ struct Quest uint8_t emoteReward; uint16_t actionReward; std::vector< uint8_t > generalActionReward; + uint16_t systemReward0; uint8_t otherReward; + uint16_t systemReward1; + uint16_t gCTypeReward; uint32_t instanceContentUnlock; uint8_t tomestoneReward; uint8_t tomestoneCountReward; @@ -4530,15 +6414,26 @@ struct Quest uint8_t journalGenre; uint32_t icon; uint32_t iconSpecial; + bool introduction; + bool hideOfferIcon; uint8_t eventIconType; uint16_t sortKey; Quest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct QuestAcceptAdditionCondition +{ + uint32_t requirement0; + uint32_t requirement1; + + QuestAcceptAdditionCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct QuestBattle { int32_t quest; + uint8_t questBattleScene; uint16_t timeLimit; uint16_t levelSync; std::vector< std::string > scriptInstruction; @@ -4547,6 +6442,14 @@ struct QuestBattle QuestBattle( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct QuestChapter +{ + uint32_t quest; + uint16_t redo; + + QuestChapter( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct QuestClassJobReward { uint8_t classJobCategory; @@ -4563,10 +6466,79 @@ struct QuestClassJobSupply uint8_t classJobCategory; uint32_t eNpcResident; uint32_t item; + uint8_t amountRequired; + bool itemHQ; QuestClassJobSupply( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct QuestDerivedClass +{ + uint8_t classJob; + + QuestDerivedClass( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestEffect +{ + + QuestEffect( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestEffectDefine +{ + uint16_t effect; + + QuestEffectDefine( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestRedo +{ + uint32_t finalQuest; + uint16_t chapter; + std::vector< uint32_t > quest; + + QuestRedo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestRedoChapterUI +{ + uint32_t quest; + uint8_t uITab; + uint8_t category; + uint32_t questRedoUISmall; + uint32_t questRedoUILarge; + uint32_t questRedoUIWide; + std::string chapterName; + std::string chapterPart; + std::string transient; + + QuestRedoChapterUI( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestRedoChapterUICategory +{ + std::string expac; + + QuestRedoChapterUICategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestRedoChapterUITab +{ + uint32_t icon1; + uint32_t icon2; + std::string text; + + QuestRedoChapterUITab( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct QuestRedoIncompChapter +{ + uint16_t chapter; + + QuestRedoIncompChapter( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct QuestRepeatFlag { uint32_t quest; @@ -4611,6 +6583,7 @@ struct Race int32_t rSEFHands; int32_t rSEFLegs; int32_t rSEFFeet; + uint8_t exPac; Race( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4642,6 +6615,7 @@ struct RacingChocoboNameCategory struct RacingChocoboNameInfo { uint8_t racingChocoboNameCategory; + std::vector< uint16_t > name; RacingChocoboNameInfo( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4675,11 +6649,13 @@ struct RecastNavimesh struct Recipe { + int32_t number; int32_t craftType; uint16_t recipeLevelTable; int32_t itemResult; uint8_t amountResult; bool isSecondary; + uint8_t materialQualityFactor; uint16_t difficultyFactor; uint16_t qualityFactor; uint16_t durabilityFactor; @@ -4694,6 +6670,7 @@ struct Recipe int32_t statusRequired; int32_t itemRequired; bool isSpecializationRequired; + bool isExpert; uint16_t patchNumber; Recipe( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4704,15 +6681,32 @@ struct RecipeLevelTable uint8_t classJobLevel; uint8_t stars; uint16_t suggestedCraftsmanship; + uint16_t suggestedControl; uint16_t difficulty; uint32_t quality; uint16_t durability; + uint16_t conditionsFlag; RecipeLevelTable( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct RecipeLookup +{ + uint16_t cRP; + uint16_t bSM; + uint16_t aRM; + uint16_t gSM; + uint16_t lTW; + uint16_t wVR; + uint16_t aLC; + uint16_t cUL; + + RecipeLookup( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct RecipeNotebookList { + uint8_t count; std::vector< int32_t > recipe; RecipeNotebookList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4721,6 +6715,9 @@ struct RecipeNotebookList struct RecommendContents { int32_t level; + uint8_t classJob; + uint8_t minLevel; + uint8_t maxLevel; RecommendContents( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4730,6 +6727,19 @@ struct Relic uint32_t itemAtma; uint32_t itemAnimus; int32_t icon; + uint16_t materia0; + uint8_t noteMain0; + uint8_t noteSub0; + uint8_t noteSelection10; + uint16_t materia1; + uint8_t noteMain1; + uint8_t noteSub1; + uint8_t noteSelection1; + uint16_t materia2; + uint8_t noteMain2; + uint8_t noteSub2; + uint16_t materia3; + uint8_t noteSelection3; Relic( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4787,6 +6797,23 @@ struct Resident Resident( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct ResistanceWeaponAdjust +{ + uint16_t maxTotalStats; + uint16_t maxEachStat; + std::vector< uint8_t > baseParam; + uint32_t image; + + ResistanceWeaponAdjust( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct RetainerFortuneRewardRange +{ + uint16_t percentOfLevel; + + RetainerFortuneRewardRange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct RetainerTask { bool isRandom; @@ -4797,6 +6824,8 @@ struct RetainerTask uint16_t maxTimemin; int32_t experience; uint16_t requiredItemLevel; + uint8_t conditionParam0; + uint8_t conditionParam1; uint16_t requiredGathering; uint16_t task; @@ -4840,6 +6869,32 @@ struct RetainerTaskRandom RetainerTaskRandom( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct RideShooting +{ + uint16_t gFateRideShooting; + uint16_t startText; + std::vector< uint32_t > popRange; + std::vector< uint32_t > eNpc; + std::vector< uint8_t > eNpcScale; + + RideShooting( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct RideShootingTargetType +{ + uint32_t eObj; + int16_t score; + + RideShootingTargetType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct RideShootingTextData +{ + std::string string; + + RideShootingTextData( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct RPParameter { uint16_t bNpcName; @@ -4848,17 +6903,18 @@ struct RPParameter RPParameter( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct Salvage +struct SatisfactionArbitration { - uint16_t optimalSkill; + uint32_t quest; - Salvage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); + SatisfactionArbitration( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; struct SatisfactionNpc { int32_t npc; int32_t questRequired; + uint8_t levelUnlock; uint8_t deliveriesPerWeek; std::vector< int32_t > supplyIndex; std::vector< uint16_t > satisfactionRequired; @@ -4918,13 +6974,6 @@ struct ScenarioTreeTipsClassQuest ScenarioTreeTipsClassQuest( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; -struct ScenarioTreeTipsQuest -{ - uint32_t level; - - ScenarioTreeTipsQuest( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); -}; - struct ScenarioType { std::string type; @@ -4935,6 +6984,9 @@ struct ScenarioType struct ScreenImage { uint32_t image; + int16_t jingle; + int8_t type; + bool lang; ScreenImage( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -4951,11 +7003,15 @@ struct SkyIsland2Mission { uint32_t item1; uint32_t item2; + uint16_t placeName; uint16_t objective1; + uint32_t popRange0; uint8_t requiredAmount1; uint16_t objective2; + uint32_t popRange1; uint8_t requiredAmount2; uint16_t objective3; + uint32_t popRange2; uint32_t image; SkyIsland2Mission( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -4985,11 +7041,27 @@ struct SkyIsland2RangeType SkyIsland2RangeType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct SnipeTalk +{ + uint16_t name; + std::string text; + + SnipeTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct SnipeTalkName +{ + std::string name; + + SnipeTalkName( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct SpearfishingItem { std::string description; int32_t item; uint16_t gatheringItemLevel; + uint8_t fishingRecordType; uint16_t territoryType; bool isVisible; @@ -4999,6 +7071,7 @@ struct SpearfishingItem struct SpearfishingNotebook { uint8_t gatheringLevel; + bool isShadowNode; int32_t territoryType; int16_t x; int16_t y; @@ -5021,12 +7094,12 @@ struct SpecialShop { std::string name; std::vector< int32_t > questItem; - std::vector< int32_t > unknown; std::vector< int32_t > achievementUnlock; std::vector< uint16_t > patchNumber; + uint8_t useCurrencyType; uint32_t questUnlock; - int32_t notCompleteText; int32_t completeText; + int32_t notCompleteText; SpecialShop( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5042,6 +7115,7 @@ struct Stain { uint32_t color; uint8_t shade; + uint8_t subOrder; std::string name; Stain( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -5055,6 +7129,13 @@ struct StainTransient StainTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct StanceChange +{ + std::vector< uint16_t > action; + + StanceChange( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Status { std::string name; @@ -5063,7 +7144,7 @@ struct Status uint8_t maxStacks; uint8_t category; uint8_t hitEffect; - uint8_t vFX; + uint16_t vFX; bool lockMovement; bool lockActions; bool lockControl; @@ -5071,6 +7152,8 @@ struct Status bool canDispel; bool inflictedByActor; bool isPermanent; + uint8_t partyListPriority; + uint16_t log; bool isFcBuff; bool invisibility; @@ -5095,6 +7178,28 @@ struct StatusLoopVFX struct Story { + std::string script; + std::vector< std::string > instruction; + std::vector< uint32_t > argument; + std::vector< uint16_t > sequence; + std::vector< uint8_t > completedQuestOperator; + std::vector< uint32_t > completedQuest0; + std::vector< uint32_t > completedQuest1; + std::vector< uint32_t > completedQuest2; + std::vector< uint8_t > acceptedQuestOperator; + std::vector< uint32_t > acceptedQuest0; + std::vector< uint8_t > acceptedQuestSequence0; + std::vector< uint32_t > acceptedQuest1; + std::vector< uint8_t > acceptedQuestSequence1; + std::vector< uint32_t > acceptedQuest2; + std::vector< uint8_t > acceptedQuestSequence2; + std::vector< uint32_t > layerSet0; + std::vector< uint32_t > layerSet1; + std::vector< uint16_t > sequenceBegin; + std::vector< uint16_t > sequenceEnd; + std::vector< uint32_t > listener; + uint16_t layerSetTerritoryType0; + uint16_t layerSetTerritoryType1; Story( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5103,6 +7208,8 @@ struct SubmarineExploration { std::string destination; std::string location; + uint8_t map; + uint8_t stars; uint8_t rankReq; uint8_t ceruleumTankReq; uint16_t durationmin; @@ -5112,6 +7219,14 @@ struct SubmarineExploration SubmarineExploration( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct SubmarineMap +{ + std::string name; + uint32_t image; + + SubmarineMap( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct SubmarinePart { uint8_t slot; @@ -5122,6 +7237,7 @@ struct SubmarinePart int16_t speed; int16_t range; int16_t favor; + uint16_t _class; uint8_t repairMaterials; SubmarinePart( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); @@ -5129,40 +7245,72 @@ struct SubmarinePart struct SubmarineRank { - uint16_t rank; + uint16_t capacity; uint32_t expToNext; + uint8_t surveillanceBonus; + uint8_t retrievalBonus; + uint8_t speedBonus; + uint8_t rangeBonus; + uint8_t favorBonus; SubmarineRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct SwitchTalk { - std::vector< uint32_t > quest; - std::vector< uint32_t > defaultTalk; SwitchTalk( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct SwitchTalkVariation +{ + uint32_t quest0; + uint32_t quest1; + uint32_t defaultTalk; + + SwitchTalkVariation( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct TerritoryType { std::string name; std::string bg; + uint8_t battalionMode; uint16_t placeNameRegion; uint16_t placeNameZone; uint16_t placeName; uint16_t map; + uint8_t loadingImage; + uint8_t exclusiveType; uint8_t territoryIntendedUse; + uint16_t contentFinderCondition; uint8_t weatherRate; + bool pCSearch; + bool stealth; + bool mount; + uint16_t bGM; int32_t placeNameRegionIcon; int32_t placeNameIcon; uint32_t arrayEventHandler; uint16_t questBattle; int32_t aetheryte; + int32_t fixedTime; + uint16_t resident; + int8_t achievementIndex; bool isPvpZone; + uint8_t exVersion; + uint8_t mountSpeed; TerritoryType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct TerritoryTypeTransient +{ + int16_t offsetZ; + + TerritoryTypeTransient( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct TextCommand { std::string command; @@ -5170,10 +7318,18 @@ struct TextCommand std::string description; std::string alias; std::string shortAlias; + uint16_t param; TextCommand( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct TextCommandParam +{ + std::string param; + + TextCommandParam( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Title { std::string masculine; @@ -5249,8 +7405,15 @@ struct Transformation uint16_t bNpcName; int32_t bNpcCustomize; int32_t npcEquip; - std::vector< uint16_t > action; - uint8_t rPParameter; + bool exHotbarEnableConfig; + uint16_t action0; + uint16_t action1; + uint16_t action2; + uint16_t action3; + uint16_t action4; + uint16_t action5; + uint16_t rPParameter; + uint16_t removeAction; float speed; float scale; bool isPvP; @@ -5258,6 +7421,8 @@ struct Transformation bool playerCamera; uint16_t startVFX; uint16_t endVFX; + uint32_t action6; + uint16_t action7; Transformation( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5276,14 +7441,23 @@ struct TreasureHuntRank int32_t keyItemName; int32_t instanceMap; uint8_t maxPartySize; - uint8_t minPartySize; + uint8_t treasureHuntTexture; TreasureHuntRank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct TreasureModel +{ + std::string path; + + TreasureModel( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct TreasureSpot { int32_t location; + float mapOffsetX; + float mapOffsetY; TreasureSpot( uint32_t row_id, uint32_t subRow, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5292,9 +7466,11 @@ struct Tribe { std::string masculine; std::string feminine; + int8_t hp; + int8_t mp; int8_t sTR; - int8_t dEX; int8_t vIT; + int8_t dEX; int8_t iNT; int8_t mND; int8_t pIE; @@ -5349,6 +7525,12 @@ struct TripleTriadCardResident uint8_t tripleTriadCardType; uint16_t saleValue; uint8_t sortKey; + uint16_t order; + uint8_t uIPriority; + uint8_t acquisitionType; + uint32_t acquisition; + uint32_t location; + uint32_t quest; TripleTriadCardResident( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5367,9 +7549,17 @@ struct TripleTriadCompetition TripleTriadCompetition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct TripleTriadResident +{ + uint16_t order; + + TripleTriadResident( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct TripleTriadRule { std::string name; + std::string description; TripleTriadRule( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5407,6 +7597,23 @@ struct TutorialTank TutorialTank( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct UDS_Event +{ + std::string text; + std::string type; + std::vector< int32_t > property; + + UDS_Event( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct UDS_Property +{ + std::string text; + std::string type; + + UDS_Property( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct UIColor { uint32_t uIForeground; @@ -5431,23 +7638,32 @@ struct VFX struct Warp { - uint32_t level; - uint16_t placeName; + uint32_t popRange; + uint16_t territoryType; uint32_t conditionSuccessEvent; uint32_t conditionFailEvent; uint32_t confirmEvent; uint16_t warpCondition; uint16_t warpLogic; + uint16_t startCutscene; + uint16_t endCutscene; + bool canSkipCutscene; + std::string name; + std::string question; Warp( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; struct WarpCondition { + uint16_t gil; + uint8_t completeParam; uint32_t requiredQuest1; uint32_t requiredQuest2; uint32_t dRequiredQuest3; uint32_t requiredQuest4; + uint16_t questReward; + uint16_t classLevel; WarpCondition( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; @@ -5455,6 +7671,7 @@ struct WarpCondition struct WarpLogic { std::string warpName; + bool canSkipCutscene; std::vector< std::string > function; std::string question; std::string responseYes; @@ -5463,6 +7680,14 @@ struct WarpLogic WarpLogic( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct WeaponTimeline +{ + std::string file; + int16_t nextWeaponTimeline; + + WeaponTimeline( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct Weather { int32_t icon; @@ -5493,6 +7718,23 @@ struct WeatherReportReplace WeatherReportReplace( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct WebGuidance +{ + int32_t image; + uint8_t url; + std::string name; + std::string description; + + WebGuidance( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct WebURL +{ + std::string uRL; + + WebURL( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct WeddingBGM { uint16_t song; @@ -5537,6 +7779,7 @@ struct WeeklyLotBonus struct World { std::string name; + uint8_t userType; uint8_t dataCenter; bool isPublic; @@ -5551,6 +7794,22 @@ struct WorldDCGroupType WorldDCGroupType( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); }; +struct YardCatalogCategory +{ + std::string category; + + YardCatalogCategory( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + +struct YardCatalogItemList +{ + uint16_t category; + int32_t item; + uint16_t patch; + + YardCatalogItemList( uint32_t row_id, Sapphire::Data::ExdDataGenerated* exdData ); +}; + struct YKW { uint32_t item; @@ -5594,6 +7853,11 @@ struct ZoneSharedGroup std::shared_ptr< xiv::dat::GameData > m_data; std::shared_ptr< xiv::exd::ExdData > m_exd_data; + std::shared_ptr< xiv::dat::GameData > getGameData() + { + return m_data; + } + template< class T > std::shared_ptr< T > get( uint32_t id ) { @@ -5626,7 +7890,9 @@ struct ZoneSharedGroup xiv::exd::Exd m_AchievementDat; xiv::exd::Exd m_AchievementCategoryDat; + xiv::exd::Exd m_AchievementHideConditionDat; xiv::exd::Exd m_AchievementKindDat; + xiv::exd::Exd m_AchievementTargetDat; xiv::exd::Exd m_ActionDat; xiv::exd::Exd m_ActionCastTimelineDat; xiv::exd::Exd m_ActionCastVFXDat; @@ -5644,7 +7910,6 @@ struct ZoneSharedGroup xiv::exd::Exd m_ActivityFeedGroupCaptionsDat; xiv::exd::Exd m_ActivityFeedImagesDat; xiv::exd::Exd m_AddonDat; - xiv::exd::Exd m_AddonHudDat; xiv::exd::Exd m_AdventureDat; xiv::exd::Exd m_AdventureExPhaseDat; xiv::exd::Exd m_AetherCurrentDat; @@ -5657,6 +7922,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_AirshipExplorationParamTypeDat; xiv::exd::Exd m_AirshipExplorationPartDat; xiv::exd::Exd m_AirshipExplorationPointDat; + xiv::exd::Exd m_AnimationLODDat; xiv::exd::Exd m_AnimaWeapon5Dat; xiv::exd::Exd m_AnimaWeapon5ParamDat; xiv::exd::Exd m_AnimaWeapon5PatternGroupDat; @@ -5673,20 +7939,28 @@ struct ZoneSharedGroup xiv::exd::Exd m_AOZBossDat; xiv::exd::Exd m_AOZContentDat; xiv::exd::Exd m_AOZContentBriefingBNpcDat; + xiv::exd::Exd m_AOZReportDat; + xiv::exd::Exd m_AOZScoreDat; xiv::exd::Exd m_AquariumFishDat; xiv::exd::Exd m_AquariumWaterDat; xiv::exd::Exd m_ArrayEventHandlerDat; xiv::exd::Exd m_AttackTypeDat; xiv::exd::Exd m_BacklightColorDat; + xiv::exd::Exd m_BallistaDat; xiv::exd::Exd m_BalloonDat; xiv::exd::Exd m_BaseParamDat; xiv::exd::Exd m_BattleLeveDat; + xiv::exd::Exd m_BattleLeveRuleDat; xiv::exd::Exd m_BeastRankBonusDat; xiv::exd::Exd m_BeastReputationRankDat; xiv::exd::Exd m_BeastTribeDat; xiv::exd::Exd m_BehaviorDat; + xiv::exd::Exd m_BehaviorPathDat; + xiv::exd::Exd m_BenchmarkOverrideEquipmentDat; xiv::exd::Exd m_BGMDat; xiv::exd::Exd m_BGMFadeDat; + xiv::exd::Exd m_BGMFadeTypeDat; + xiv::exd::Exd m_BGMSceneDat; xiv::exd::Exd m_BGMSituationDat; xiv::exd::Exd m_BGMSwitchDat; xiv::exd::Exd m_BGMSystemDefineDat; @@ -5695,6 +7969,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_BNpcCustomizeDat; xiv::exd::Exd m_BNpcNameDat; xiv::exd::Exd m_BNpcPartsDat; + xiv::exd::Exd m_BNpcStateDat; xiv::exd::Exd m_BuddyDat; xiv::exd::Exd m_BuddyActionDat; xiv::exd::Exd m_BuddyEquipDat; @@ -5704,7 +7979,11 @@ struct ZoneSharedGroup xiv::exd::Exd m_CabinetDat; xiv::exd::Exd m_CabinetCategoryDat; xiv::exd::Exd m_CalendarDat; + xiv::exd::Exd m_CarryDat; + xiv::exd::Exd m_ChannelingDat; + xiv::exd::Exd m_CharaMakeClassEquipDat; xiv::exd::Exd m_CharaMakeCustomizeDat; + xiv::exd::Exd m_CharaMakeNameDat; xiv::exd::Exd m_CharaMakeTypeDat; xiv::exd::Exd m_ChocoboRaceDat; xiv::exd::Exd m_ChocoboRaceAbilityDat; @@ -5717,8 +7996,15 @@ struct ZoneSharedGroup xiv::exd::Exd m_ChocoboRaceWeatherDat; xiv::exd::Exd m_ChocoboTaxiDat; xiv::exd::Exd m_ChocoboTaxiStandDat; + xiv::exd::Exd m_CircleActivityDat; xiv::exd::Exd m_ClassJobDat; xiv::exd::Exd m_ClassJobCategoryDat; + xiv::exd::Exd m_CollectablesShopDat; + xiv::exd::Exd m_CollectablesShopItemDat; + xiv::exd::Exd m_CollectablesShopItemGroupDat; + xiv::exd::Exd m_CollectablesShopRefineDat; + xiv::exd::Exd m_CollectablesShopRewardItemDat; + xiv::exd::Exd m_CollectablesShopRewardScripDat; xiv::exd::Exd m_CompanionDat; xiv::exd::Exd m_CompanionMoveDat; xiv::exd::Exd m_CompanionTransientDat; @@ -5735,6 +8021,9 @@ struct ZoneSharedGroup xiv::exd::Exd m_CompanyLeveRuleDat; xiv::exd::Exd m_CompleteJournalDat; xiv::exd::Exd m_CompleteJournalCategoryDat; + xiv::exd::Exd m_CompletionDat; + xiv::exd::Exd m_ConditionDat; + xiv::exd::Exd m_ConfigKeyDat; xiv::exd::Exd m_ContentCloseCycleDat; xiv::exd::Exd m_ContentExActionDat; xiv::exd::Exd m_ContentFinderConditionDat; @@ -5743,28 +8032,40 @@ struct ZoneSharedGroup xiv::exd::Exd m_ContentGaugeColorDat; xiv::exd::Exd m_ContentMemberTypeDat; xiv::exd::Exd m_ContentNpcTalkDat; + xiv::exd::Exd m_ContentRandomSelectDat; xiv::exd::Exd m_ContentRouletteDat; xiv::exd::Exd m_ContentRouletteOpenRuleDat; xiv::exd::Exd m_ContentRouletteRoleBonusDat; xiv::exd::Exd m_ContentsNoteDat; + xiv::exd::Exd m_ContentsTutorialDat; + xiv::exd::Exd m_ContentsTutorialPageDat; xiv::exd::Exd m_ContentTalkDat; xiv::exd::Exd m_ContentTalkParamDat; xiv::exd::Exd m_ContentTypeDat; xiv::exd::Exd m_CraftActionDat; xiv::exd::Exd m_CraftLeveDat; + xiv::exd::Exd m_CraftLevelDifferenceDat; + xiv::exd::Exd m_CraftLeveTalkDat; xiv::exd::Exd m_CraftTypeDat; xiv::exd::Exd m_CreditDat; xiv::exd::Exd m_CreditBackImageDat; xiv::exd::Exd m_CreditCastDat; xiv::exd::Exd m_CreditListDat; xiv::exd::Exd m_CreditListTextDat; - xiv::exd::Exd m_CurrencyDat; xiv::exd::Exd m_CustomTalkDat; - xiv::exd::Exd m_CustomTalkDynamicIconDat; xiv::exd::Exd m_CustomTalkNestHandlersDat; xiv::exd::Exd m_CutsceneDat; + xiv::exd::Exd m_CutSceneIncompQuestDat; + xiv::exd::Exd m_CutsceneMotionDat; + xiv::exd::Exd m_CutsceneWorkIndexDat; xiv::exd::Exd m_CutScreenImageDat; + xiv::exd::Exd m_CycleTimeDat; xiv::exd::Exd m_DailySupplyItemDat; + xiv::exd::Exd m_DawnContentDat; + xiv::exd::Exd m_DawnGrowMemberDat; + xiv::exd::Exd m_DawnMemberUIParamDat; + xiv::exd::Exd m_DawnQuestAnnounceDat; + xiv::exd::Exd m_DawnQuestMemberDat; xiv::exd::Exd m_DeepDungeonDat; xiv::exd::Exd m_DeepDungeonBanDat; xiv::exd::Exd m_DeepDungeonDangerDat; @@ -5779,7 +8080,9 @@ struct ZoneSharedGroup xiv::exd::Exd m_DefaultTalkDat; xiv::exd::Exd m_DefaultTalkLipSyncTypeDat; xiv::exd::Exd m_DeliveryQuestDat; + xiv::exd::Exd m_DescriptionDat; xiv::exd::Exd m_DescriptionPageDat; + xiv::exd::Exd m_DescriptionSectionDat; xiv::exd::Exd m_DescriptionStringDat; xiv::exd::Exd m_DisposalShopDat; xiv::exd::Exd m_DisposalShopFilterTypeDat; @@ -5787,10 +8090,15 @@ struct ZoneSharedGroup xiv::exd::Exd m_DpsChallengeDat; xiv::exd::Exd m_DpsChallengeOfficerDat; xiv::exd::Exd m_DpsChallengeTransientDat; + xiv::exd::Exd m_DynamicEventDat; + xiv::exd::Exd m_DynamicEventEnemyTypeDat; + xiv::exd::Exd m_DynamicEventSingleBattleDat; + xiv::exd::Exd m_DynamicEventTypeDat; xiv::exd::Exd m_EmjAddonDat; xiv::exd::Exd m_EmjDaniDat; xiv::exd::Exd m_EmoteDat; xiv::exd::Exd m_EmoteCategoryDat; + xiv::exd::Exd m_EmoteModeDat; xiv::exd::Exd m_ENpcBaseDat; xiv::exd::Exd m_ENpcDressUpDat; xiv::exd::Exd m_ENpcDressUpDressDat; @@ -5808,23 +8116,32 @@ struct ZoneSharedGroup xiv::exd::Exd m_EurekaMagiciteItemTypeDat; xiv::exd::Exd m_EurekaSphereElementAdjustDat; xiv::exd::Exd m_EventActionDat; + xiv::exd::Exd m_EventCustomIconTypeDat; xiv::exd::Exd m_EventIconPriorityDat; xiv::exd::Exd m_EventIconTypeDat; xiv::exd::Exd m_EventItemDat; xiv::exd::Exd m_EventItemCastTimelineDat; xiv::exd::Exd m_EventItemHelpDat; xiv::exd::Exd m_EventItemTimelineDat; + xiv::exd::Exd m_EventSystemDefineDat; + xiv::exd::Exd m_ExportedGatheringPointDat; xiv::exd::Exd m_ExportedSGDat; xiv::exd::Exd m_ExVersionDat; xiv::exd::Exd m_FateDat; + xiv::exd::Exd m_FateEventDat; + xiv::exd::Exd m_FateModeDat; + xiv::exd::Exd m_FateProgressUIDat; + xiv::exd::Exd m_FateTokenTypeDat; xiv::exd::Exd m_FCActivityDat; xiv::exd::Exd m_FCActivityCategoryDat; xiv::exd::Exd m_FCAuthorityDat; xiv::exd::Exd m_FCAuthorityCategoryDat; xiv::exd::Exd m_FCChestNameDat; + xiv::exd::Exd m_FCCrestSymbolDat; xiv::exd::Exd m_FccShopDat; xiv::exd::Exd m_FCHierarchyDat; xiv::exd::Exd m_FCProfileDat; + xiv::exd::Exd m_FCRankDat; xiv::exd::Exd m_FCReputationDat; xiv::exd::Exd m_FCRightsDat; xiv::exd::Exd m_FestivalDat; @@ -5835,6 +8152,8 @@ struct ZoneSharedGroup xiv::exd::Exd m_FishParameterDat; xiv::exd::Exd m_Frontline03Dat; xiv::exd::Exd m_Frontline04Dat; + xiv::exd::Exd m_FurnitureCatalogCategoryDat; + xiv::exd::Exd m_FurnitureCatalogItemListDat; xiv::exd::Exd m_GardeningSeedDat; xiv::exd::Exd m_GatheringConditionDat; xiv::exd::Exd m_GatheringExpDat; @@ -5843,15 +8162,19 @@ struct ZoneSharedGroup xiv::exd::Exd m_GatheringItemPointDat; xiv::exd::Exd m_GatheringLeveDat; xiv::exd::Exd m_GatheringLeveRouteDat; + xiv::exd::Exd m_GatheringLeveRuleDat; xiv::exd::Exd m_GatheringNotebookListDat; xiv::exd::Exd m_GatheringPointDat; xiv::exd::Exd m_GatheringPointBaseDat; xiv::exd::Exd m_GatheringPointBonusDat; xiv::exd::Exd m_GatheringPointBonusTypeDat; xiv::exd::Exd m_GatheringPointNameDat; + xiv::exd::Exd m_GatheringPointTransientDat; + xiv::exd::Exd m_GatheringRarePopTimeTableDat; xiv::exd::Exd m_GatheringSubCategoryDat; xiv::exd::Exd m_GatheringTypeDat; xiv::exd::Exd m_GcArmyCaptureTacticsDat; + xiv::exd::Exd m_GcArmyEquipPresetDat; xiv::exd::Exd m_GcArmyExpeditionDat; xiv::exd::Exd m_GcArmyExpeditionMemberBonusDat; xiv::exd::Exd m_GcArmyExpeditionTypeDat; @@ -5877,13 +8200,24 @@ struct ZoneSharedGroup xiv::exd::Exd m_GFateRideShootingDat; xiv::exd::Exd m_GilShopDat; xiv::exd::Exd m_GilShopItemDat; + xiv::exd::Exd m_GimmickAccessorDat; + xiv::exd::Exd m_GimmickJumpDat; + xiv::exd::Exd m_GimmickRectDat; xiv::exd::Exd m_GoldSaucerArcadeMachineDat; xiv::exd::Exd m_GoldSaucerTextDataDat; xiv::exd::Exd m_GrandCompanyDat; xiv::exd::Exd m_GrandCompanyRankDat; + xiv::exd::Exd m_GroupPoseFrameDat; + xiv::exd::Exd m_GroupPoseStampDat; + xiv::exd::Exd m_GroupPoseStampCategoryDat; xiv::exd::Exd m_GuardianDeityDat; + xiv::exd::Exd m_GuideDat; + xiv::exd::Exd m_GuidePageDat; + xiv::exd::Exd m_GuidePageStringDat; + xiv::exd::Exd m_GuideTitleDat; xiv::exd::Exd m_GuildleveAssignmentDat; xiv::exd::Exd m_GuildleveAssignmentCategoryDat; + xiv::exd::Exd m_GuildleveAssignmentTalkDat; xiv::exd::Exd m_GuildOrderDat; xiv::exd::Exd m_GuildOrderGuideDat; xiv::exd::Exd m_GuildOrderOfficerDat; @@ -5905,6 +8239,34 @@ struct ZoneSharedGroup xiv::exd::Exd m_HowToDat; xiv::exd::Exd m_HowToCategoryDat; xiv::exd::Exd m_HowToPageDat; + xiv::exd::Exd m_HugeCraftworksNpcDat; + xiv::exd::Exd m_HugeCraftworksRankDat; + xiv::exd::Exd m_HWDAnnounceDat; + xiv::exd::Exd m_HWDCrafterSupplyDat; + xiv::exd::Exd m_HWDCrafterSupplyRewardDat; + xiv::exd::Exd m_HWDCrafterSupplyTermDat; + xiv::exd::Exd m_HWDDevLayerControlDat; + xiv::exd::Exd m_HWDDevLevelUIDat; + xiv::exd::Exd m_HWDDevLivelyDat; + xiv::exd::Exd m_HWDDevProgressDat; + xiv::exd::Exd m_HWDGathereInspectTermDat; + xiv::exd::Exd m_HWDGathererInspectionDat; + xiv::exd::Exd m_HWDGathererInspectionRewardDat; + xiv::exd::Exd m_HWDInfoBoardArticleDat; + xiv::exd::Exd m_HWDInfoBoardArticleTransientDat; + xiv::exd::Exd m_HWDInfoBoardArticleTypeDat; + xiv::exd::Exd m_HWDLevelChangeDeceptionDat; + xiv::exd::Exd m_HWDSharedGroupDat; + xiv::exd::Exd m_HWDSharedGroupControlParamDat; + xiv::exd::Exd m_IKDContentBonusDat; + xiv::exd::Exd m_IKDFishParamDat; + xiv::exd::Exd m_IKDRouteDat; + xiv::exd::Exd m_IKDRouteTableDat; + xiv::exd::Exd m_IKDSpotDat; + xiv::exd::Exd m_InclusionShopDat; + xiv::exd::Exd m_InclusionShopCategoryDat; + xiv::exd::Exd m_InclusionShopSeriesDat; + xiv::exd::Exd m_IndividualWeatherDat; xiv::exd::Exd m_InstanceContentDat; xiv::exd::Exd m_InstanceContentBuffDat; xiv::exd::Exd m_InstanceContentCSBonusDat; @@ -5912,25 +8274,34 @@ struct ZoneSharedGroup xiv::exd::Exd m_InstanceContentTextDataDat; xiv::exd::Exd m_ItemDat; xiv::exd::Exd m_ItemActionDat; + xiv::exd::Exd m_ItemActionTelepoDat; + xiv::exd::Exd m_ItemBarterCheckDat; xiv::exd::Exd m_ItemFoodDat; xiv::exd::Exd m_ItemLevelDat; xiv::exd::Exd m_ItemSearchCategoryDat; xiv::exd::Exd m_ItemSeriesDat; + xiv::exd::Exd m_ItemSortCategoryDat; xiv::exd::Exd m_ItemSpecialBonusDat; xiv::exd::Exd m_ItemUICategoryDat; + xiv::exd::Exd m_JingleDat; + xiv::exd::Exd m_JobHudManualDat; + xiv::exd::Exd m_JobHudManualPriorityDat; xiv::exd::Exd m_JournalCategoryDat; xiv::exd::Exd m_JournalGenreDat; xiv::exd::Exd m_JournalSectionDat; + xiv::exd::Exd m_KnockbackDat; + xiv::exd::Exd m_LegacyQuestDat; xiv::exd::Exd m_LeveDat; xiv::exd::Exd m_LeveAssignmentTypeDat; xiv::exd::Exd m_LeveClientDat; xiv::exd::Exd m_LevelDat; xiv::exd::Exd m_LeveRewardItemDat; xiv::exd::Exd m_LeveRewardItemGroupDat; + xiv::exd::Exd m_LeveStringDat; xiv::exd::Exd m_LeveVfxDat; + xiv::exd::Exd m_LobbyDat; xiv::exd::Exd m_LogFilterDat; xiv::exd::Exd m_LogKindDat; - xiv::exd::Exd m_LogKindCategoryTextDat; xiv::exd::Exd m_LogMessageDat; xiv::exd::Exd m_LotteryExchangeShopDat; xiv::exd::Exd m_MacroIconDat; @@ -5939,24 +8310,31 @@ struct ZoneSharedGroup xiv::exd::Exd m_MainCommandCategoryDat; xiv::exd::Exd m_ManeuversArmorDat; xiv::exd::Exd m_MapDat; + xiv::exd::Exd m_MapConditionDat; xiv::exd::Exd m_MapMarkerDat; xiv::exd::Exd m_MapMarkerRegionDat; xiv::exd::Exd m_MapSymbolDat; xiv::exd::Exd m_MarkerDat; - xiv::exd::Exd m_MasterpieceSupplyDutyDat; - xiv::exd::Exd m_MasterpieceSupplyMultiplierDat; xiv::exd::Exd m_MateriaDat; + xiv::exd::Exd m_MateriaJoinRateDat; + xiv::exd::Exd m_MateriaJoinRateGatherCraftDat; + xiv::exd::Exd m_MateriaTomestoneRateDat; xiv::exd::Exd m_MiniGameRADat; xiv::exd::Exd m_MinionRaceDat; xiv::exd::Exd m_MinionRulesDat; xiv::exd::Exd m_MinionSkillTypeDat; + xiv::exd::Exd m_MobHuntOrderDat; xiv::exd::Exd m_MobHuntOrderTypeDat; + xiv::exd::Exd m_MobHuntRewardDat; + xiv::exd::Exd m_MobHuntRewardCapDat; xiv::exd::Exd m_MobHuntTargetDat; xiv::exd::Exd m_ModelCharaDat; xiv::exd::Exd m_ModelSkeletonDat; xiv::exd::Exd m_ModelStateDat; xiv::exd::Exd m_MonsterNoteDat; xiv::exd::Exd m_MonsterNoteTargetDat; + xiv::exd::Exd m_MotionTimelineDat; + xiv::exd::Exd m_MotionTimelineBlendTableDat; xiv::exd::Exd m_MountDat; xiv::exd::Exd m_MountActionDat; xiv::exd::Exd m_MountCustomizeDat; @@ -5965,29 +8343,47 @@ struct ZoneSharedGroup xiv::exd::Exd m_MountTransientDat; xiv::exd::Exd m_MoveTimelineDat; xiv::exd::Exd m_MoveVfxDat; + xiv::exd::Exd m_MovieStaffListDat; + xiv::exd::Exd m_MovieSubtitleDat; + xiv::exd::Exd m_MovieSubtitle500Dat; + xiv::exd::Exd m_MovieSubtitleVoyageDat; + xiv::exd::Exd m_MYCTemporaryItemDat; + xiv::exd::Exd m_MYCTemporaryItemUICategoryDat; + xiv::exd::Exd m_MYCWarResultNotebookDat; xiv::exd::Exd m_NotebookDivisionDat; xiv::exd::Exd m_NotebookDivisionCategoryDat; + xiv::exd::Exd m_NotoriousMonsterDat; xiv::exd::Exd m_NpcEquipDat; xiv::exd::Exd m_NpcYellDat; xiv::exd::Exd m_OmenDat; xiv::exd::Exd m_OnlineStatusDat; + xiv::exd::Exd m_OpenContentDat; + xiv::exd::Exd m_OpenContentCandidateNameDat; xiv::exd::Exd m_OpeningDat; xiv::exd::Exd m_OrchestrionDat; xiv::exd::Exd m_OrchestrionCategoryDat; xiv::exd::Exd m_OrchestrionPathDat; xiv::exd::Exd m_OrchestrionUiparamDat; + xiv::exd::Exd m_OrnamentDat; xiv::exd::Exd m_ParamGrowDat; xiv::exd::Exd m_PartyContentDat; xiv::exd::Exd m_PartyContentCutsceneDat; xiv::exd::Exd m_PartyContentTextDataDat; + xiv::exd::Exd m_PatchMarkDat; xiv::exd::Exd m_PerformDat; + xiv::exd::Exd m_PerformGroupDat; xiv::exd::Exd m_PerformTransientDat; xiv::exd::Exd m_PetDat; xiv::exd::Exd m_PetActionDat; + xiv::exd::Exd m_PetMirageDat; + xiv::exd::Exd m_PhysicsGroupDat; + xiv::exd::Exd m_PhysicsWindDat; xiv::exd::Exd m_PictureDat; xiv::exd::Exd m_PlaceNameDat; xiv::exd::Exd m_PlantPotFlowerSeedDat; xiv::exd::Exd m_PreHandlerDat; + xiv::exd::Exd m_PresetCameraDat; + xiv::exd::Exd m_PresetCameraAdjustDat; xiv::exd::Exd m_PublicContentDat; xiv::exd::Exd m_PublicContentCutsceneDat; xiv::exd::Exd m_PublicContentTextDataDat; @@ -5997,9 +8393,19 @@ struct ZoneSharedGroup xiv::exd::Exd m_PvPSelectTraitDat; xiv::exd::Exd m_PvPTraitDat; xiv::exd::Exd m_QuestDat; + xiv::exd::Exd m_QuestAcceptAdditionConditionDat; xiv::exd::Exd m_QuestBattleDat; + xiv::exd::Exd m_QuestChapterDat; xiv::exd::Exd m_QuestClassJobRewardDat; xiv::exd::Exd m_QuestClassJobSupplyDat; + xiv::exd::Exd m_QuestDerivedClassDat; + xiv::exd::Exd m_QuestEffectDat; + xiv::exd::Exd m_QuestEffectDefineDat; + xiv::exd::Exd m_QuestRedoDat; + xiv::exd::Exd m_QuestRedoChapterUIDat; + xiv::exd::Exd m_QuestRedoChapterUICategoryDat; + xiv::exd::Exd m_QuestRedoChapterUITabDat; + xiv::exd::Exd m_QuestRedoIncompChapterDat; xiv::exd::Exd m_QuestRepeatFlagDat; xiv::exd::Exd m_QuestRewardOtherDat; xiv::exd::Exd m_QuickChatDat; @@ -6013,6 +8419,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_RecastNavimeshDat; xiv::exd::Exd m_RecipeDat; xiv::exd::Exd m_RecipeLevelTableDat; + xiv::exd::Exd m_RecipeLookupDat; xiv::exd::Exd m_RecipeNotebookListDat; xiv::exd::Exd m_RecommendContentsDat; xiv::exd::Exd m_RelicDat; @@ -6021,20 +8428,24 @@ struct ZoneSharedGroup xiv::exd::Exd m_RelicNoteDat; xiv::exd::Exd m_RelicNoteCategoryDat; xiv::exd::Exd m_ResidentDat; + xiv::exd::Exd m_ResistanceWeaponAdjustDat; + xiv::exd::Exd m_RetainerFortuneRewardRangeDat; xiv::exd::Exd m_RetainerTaskDat; xiv::exd::Exd m_RetainerTaskLvRangeDat; xiv::exd::Exd m_RetainerTaskNormalDat; xiv::exd::Exd m_RetainerTaskParameterDat; xiv::exd::Exd m_RetainerTaskRandomDat; + xiv::exd::Exd m_RideShootingDat; + xiv::exd::Exd m_RideShootingTargetTypeDat; + xiv::exd::Exd m_RideShootingTextDataDat; xiv::exd::Exd m_RPParameterDat; - xiv::exd::Exd m_SalvageDat; + xiv::exd::Exd m_SatisfactionArbitrationDat; xiv::exd::Exd m_SatisfactionNpcDat; xiv::exd::Exd m_SatisfactionSupplyDat; xiv::exd::Exd m_SatisfactionSupplyRewardDat; xiv::exd::Exd m_ScenarioTreeDat; xiv::exd::Exd m_ScenarioTreeTipsDat; xiv::exd::Exd m_ScenarioTreeTipsClassQuestDat; - xiv::exd::Exd m_ScenarioTreeTipsQuestDat; xiv::exd::Exd m_ScenarioTypeDat; xiv::exd::Exd m_ScreenImageDat; xiv::exd::Exd m_SecretRecipeBookDat; @@ -6042,6 +8453,8 @@ struct ZoneSharedGroup xiv::exd::Exd m_SkyIsland2MissionDetailDat; xiv::exd::Exd m_SkyIsland2MissionTypeDat; xiv::exd::Exd m_SkyIsland2RangeTypeDat; + xiv::exd::Exd m_SnipeTalkDat; + xiv::exd::Exd m_SnipeTalkNameDat; xiv::exd::Exd m_SpearfishingItemDat; xiv::exd::Exd m_SpearfishingNotebookDat; xiv::exd::Exd m_SpearfishingRecordPageDat; @@ -6049,16 +8462,21 @@ struct ZoneSharedGroup xiv::exd::Exd m_SpecialShopItemCategoryDat; xiv::exd::Exd m_StainDat; xiv::exd::Exd m_StainTransientDat; + xiv::exd::Exd m_StanceChangeDat; xiv::exd::Exd m_StatusDat; xiv::exd::Exd m_StatusHitEffectDat; xiv::exd::Exd m_StatusLoopVFXDat; xiv::exd::Exd m_StoryDat; xiv::exd::Exd m_SubmarineExplorationDat; + xiv::exd::Exd m_SubmarineMapDat; xiv::exd::Exd m_SubmarinePartDat; xiv::exd::Exd m_SubmarineRankDat; xiv::exd::Exd m_SwitchTalkDat; + xiv::exd::Exd m_SwitchTalkVariationDat; xiv::exd::Exd m_TerritoryTypeDat; + xiv::exd::Exd m_TerritoryTypeTransientDat; xiv::exd::Exd m_TextCommandDat; + xiv::exd::Exd m_TextCommandParamDat; xiv::exd::Exd m_TitleDat; xiv::exd::Exd m_TomestonesDat; xiv::exd::Exd m_TomestonesItemDat; @@ -6070,6 +8488,7 @@ struct ZoneSharedGroup xiv::exd::Exd m_TransformationDat; xiv::exd::Exd m_TreasureDat; xiv::exd::Exd m_TreasureHuntRankDat; + xiv::exd::Exd m_TreasureModelDat; xiv::exd::Exd m_TreasureSpotDat; xiv::exd::Exd m_TribeDat; xiv::exd::Exd m_TripleTriadDat; @@ -6078,21 +8497,27 @@ struct ZoneSharedGroup xiv::exd::Exd m_TripleTriadCardResidentDat; xiv::exd::Exd m_TripleTriadCardTypeDat; xiv::exd::Exd m_TripleTriadCompetitionDat; + xiv::exd::Exd m_TripleTriadResidentDat; xiv::exd::Exd m_TripleTriadRuleDat; xiv::exd::Exd m_TutorialDat; xiv::exd::Exd m_TutorialDPSDat; xiv::exd::Exd m_TutorialHealerDat; xiv::exd::Exd m_TutorialTankDat; + xiv::exd::Exd m_UDS_EventDat; + xiv::exd::Exd m_UDS_PropertyDat; xiv::exd::Exd m_UIColorDat; xiv::exd::Exd m_VaseFlowerDat; xiv::exd::Exd m_VFXDat; xiv::exd::Exd m_WarpDat; xiv::exd::Exd m_WarpConditionDat; xiv::exd::Exd m_WarpLogicDat; + xiv::exd::Exd m_WeaponTimelineDat; xiv::exd::Exd m_WeatherDat; xiv::exd::Exd m_WeatherGroupDat; xiv::exd::Exd m_WeatherRateDat; xiv::exd::Exd m_WeatherReportReplaceDat; + xiv::exd::Exd m_WebGuidanceDat; + xiv::exd::Exd m_WebURLDat; xiv::exd::Exd m_WeddingBGMDat; xiv::exd::Exd m_WeeklyBingoOrderDataDat; xiv::exd::Exd m_WeeklyBingoRewardDataDat; @@ -6100,13 +8525,17 @@ struct ZoneSharedGroup xiv::exd::Exd m_WeeklyLotBonusDat; xiv::exd::Exd m_WorldDat; xiv::exd::Exd m_WorldDCGroupTypeDat; + xiv::exd::Exd m_YardCatalogCategoryDat; + xiv::exd::Exd m_YardCatalogItemListDat; xiv::exd::Exd m_YKWDat; xiv::exd::Exd m_ZoneSharedGroupDat; using AchievementPtr = std::shared_ptr< Achievement >; using AchievementCategoryPtr = std::shared_ptr< AchievementCategory >; + using AchievementHideConditionPtr = std::shared_ptr< AchievementHideCondition >; using AchievementKindPtr = std::shared_ptr< AchievementKind >; + using AchievementTargetPtr = std::shared_ptr< AchievementTarget >; using ActionPtr = std::shared_ptr< Action >; using ActionCastTimelinePtr = std::shared_ptr< ActionCastTimeline >; using ActionCastVFXPtr = std::shared_ptr< ActionCastVFX >; @@ -6124,7 +8553,6 @@ struct ZoneSharedGroup using ActivityFeedGroupCaptionsPtr = std::shared_ptr< ActivityFeedGroupCaptions >; using ActivityFeedImagesPtr = std::shared_ptr< ActivityFeedImages >; using AddonPtr = std::shared_ptr< Addon >; - using AddonHudPtr = std::shared_ptr< AddonHud >; using AdventurePtr = std::shared_ptr< Adventure >; using AdventureExPhasePtr = std::shared_ptr< AdventureExPhase >; using AetherCurrentPtr = std::shared_ptr< AetherCurrent >; @@ -6137,6 +8565,7 @@ struct ZoneSharedGroup using AirshipExplorationParamTypePtr = std::shared_ptr< AirshipExplorationParamType >; using AirshipExplorationPartPtr = std::shared_ptr< AirshipExplorationPart >; using AirshipExplorationPointPtr = std::shared_ptr< AirshipExplorationPoint >; + using AnimationLODPtr = std::shared_ptr< AnimationLOD >; using AnimaWeapon5Ptr = std::shared_ptr< AnimaWeapon5 >; using AnimaWeapon5ParamPtr = std::shared_ptr< AnimaWeapon5Param >; using AnimaWeapon5PatternGroupPtr = std::shared_ptr< AnimaWeapon5PatternGroup >; @@ -6153,20 +8582,28 @@ struct ZoneSharedGroup using AOZBossPtr = std::shared_ptr< AOZBoss >; using AOZContentPtr = std::shared_ptr< AOZContent >; using AOZContentBriefingBNpcPtr = std::shared_ptr< AOZContentBriefingBNpc >; + using AOZReportPtr = std::shared_ptr< AOZReport >; + using AOZScorePtr = std::shared_ptr< AOZScore >; using AquariumFishPtr = std::shared_ptr< AquariumFish >; using AquariumWaterPtr = std::shared_ptr< AquariumWater >; using ArrayEventHandlerPtr = std::shared_ptr< ArrayEventHandler >; using AttackTypePtr = std::shared_ptr< AttackType >; using BacklightColorPtr = std::shared_ptr< BacklightColor >; + using BallistaPtr = std::shared_ptr< Ballista >; using BalloonPtr = std::shared_ptr< Balloon >; using BaseParamPtr = std::shared_ptr< BaseParam >; using BattleLevePtr = std::shared_ptr< BattleLeve >; + using BattleLeveRulePtr = std::shared_ptr< BattleLeveRule >; using BeastRankBonusPtr = std::shared_ptr< BeastRankBonus >; using BeastReputationRankPtr = std::shared_ptr< BeastReputationRank >; using BeastTribePtr = std::shared_ptr< BeastTribe >; using BehaviorPtr = std::shared_ptr< Behavior >; + using BehaviorPathPtr = std::shared_ptr< BehaviorPath >; + using BenchmarkOverrideEquipmentPtr = std::shared_ptr< BenchmarkOverrideEquipment >; using BGMPtr = std::shared_ptr< BGM >; using BGMFadePtr = std::shared_ptr< BGMFade >; + using BGMFadeTypePtr = std::shared_ptr< BGMFadeType >; + using BGMScenePtr = std::shared_ptr< BGMScene >; using BGMSituationPtr = std::shared_ptr< BGMSituation >; using BGMSwitchPtr = std::shared_ptr< BGMSwitch >; using BGMSystemDefinePtr = std::shared_ptr< BGMSystemDefine >; @@ -6175,6 +8612,7 @@ struct ZoneSharedGroup using BNpcCustomizePtr = std::shared_ptr< BNpcCustomize >; using BNpcNamePtr = std::shared_ptr< BNpcName >; using BNpcPartsPtr = std::shared_ptr< BNpcParts >; + using BNpcStatePtr = std::shared_ptr< BNpcState >; using BuddyPtr = std::shared_ptr< Buddy >; using BuddyActionPtr = std::shared_ptr< BuddyAction >; using BuddyEquipPtr = std::shared_ptr< BuddyEquip >; @@ -6184,7 +8622,11 @@ struct ZoneSharedGroup using CabinetPtr = std::shared_ptr< Cabinet >; using CabinetCategoryPtr = std::shared_ptr< CabinetCategory >; using CalendarPtr = std::shared_ptr< Calendar >; + using CarryPtr = std::shared_ptr< Carry >; + using ChannelingPtr = std::shared_ptr< Channeling >; + using CharaMakeClassEquipPtr = std::shared_ptr< CharaMakeClassEquip >; using CharaMakeCustomizePtr = std::shared_ptr< CharaMakeCustomize >; + using CharaMakeNamePtr = std::shared_ptr< CharaMakeName >; using CharaMakeTypePtr = std::shared_ptr< CharaMakeType >; using ChocoboRacePtr = std::shared_ptr< ChocoboRace >; using ChocoboRaceAbilityPtr = std::shared_ptr< ChocoboRaceAbility >; @@ -6197,8 +8639,15 @@ struct ZoneSharedGroup using ChocoboRaceWeatherPtr = std::shared_ptr< ChocoboRaceWeather >; using ChocoboTaxiPtr = std::shared_ptr< ChocoboTaxi >; using ChocoboTaxiStandPtr = std::shared_ptr< ChocoboTaxiStand >; + using CircleActivityPtr = std::shared_ptr< CircleActivity >; using ClassJobPtr = std::shared_ptr< ClassJob >; using ClassJobCategoryPtr = std::shared_ptr< ClassJobCategory >; + using CollectablesShopPtr = std::shared_ptr< CollectablesShop >; + using CollectablesShopItemPtr = std::shared_ptr< CollectablesShopItem >; + using CollectablesShopItemGroupPtr = std::shared_ptr< CollectablesShopItemGroup >; + using CollectablesShopRefinePtr = std::shared_ptr< CollectablesShopRefine >; + using CollectablesShopRewardItemPtr = std::shared_ptr< CollectablesShopRewardItem >; + using CollectablesShopRewardScripPtr = std::shared_ptr< CollectablesShopRewardScrip >; using CompanionPtr = std::shared_ptr< Companion >; using CompanionMovePtr = std::shared_ptr< CompanionMove >; using CompanionTransientPtr = std::shared_ptr< CompanionTransient >; @@ -6215,6 +8664,9 @@ struct ZoneSharedGroup using CompanyLeveRulePtr = std::shared_ptr< CompanyLeveRule >; using CompleteJournalPtr = std::shared_ptr< CompleteJournal >; using CompleteJournalCategoryPtr = std::shared_ptr< CompleteJournalCategory >; + using CompletionPtr = std::shared_ptr< Completion >; + using ConditionPtr = std::shared_ptr< Condition >; + using ConfigKeyPtr = std::shared_ptr< ConfigKey >; using ContentCloseCyclePtr = std::shared_ptr< ContentCloseCycle >; using ContentExActionPtr = std::shared_ptr< ContentExAction >; using ContentFinderConditionPtr = std::shared_ptr< ContentFinderCondition >; @@ -6223,28 +8675,40 @@ struct ZoneSharedGroup using ContentGaugeColorPtr = std::shared_ptr< ContentGaugeColor >; using ContentMemberTypePtr = std::shared_ptr< ContentMemberType >; using ContentNpcTalkPtr = std::shared_ptr< ContentNpcTalk >; + using ContentRandomSelectPtr = std::shared_ptr< ContentRandomSelect >; using ContentRoulettePtr = std::shared_ptr< ContentRoulette >; using ContentRouletteOpenRulePtr = std::shared_ptr< ContentRouletteOpenRule >; using ContentRouletteRoleBonusPtr = std::shared_ptr< ContentRouletteRoleBonus >; using ContentsNotePtr = std::shared_ptr< ContentsNote >; + using ContentsTutorialPtr = std::shared_ptr< ContentsTutorial >; + using ContentsTutorialPagePtr = std::shared_ptr< ContentsTutorialPage >; using ContentTalkPtr = std::shared_ptr< ContentTalk >; using ContentTalkParamPtr = std::shared_ptr< ContentTalkParam >; using ContentTypePtr = std::shared_ptr< ContentType >; using CraftActionPtr = std::shared_ptr< CraftAction >; using CraftLevePtr = std::shared_ptr< CraftLeve >; + using CraftLevelDifferencePtr = std::shared_ptr< CraftLevelDifference >; + using CraftLeveTalkPtr = std::shared_ptr< CraftLeveTalk >; using CraftTypePtr = std::shared_ptr< CraftType >; using CreditPtr = std::shared_ptr< Credit >; using CreditBackImagePtr = std::shared_ptr< CreditBackImage >; using CreditCastPtr = std::shared_ptr< CreditCast >; using CreditListPtr = std::shared_ptr< CreditList >; using CreditListTextPtr = std::shared_ptr< CreditListText >; - using CurrencyPtr = std::shared_ptr< Currency >; using CustomTalkPtr = std::shared_ptr< CustomTalk >; - using CustomTalkDynamicIconPtr = std::shared_ptr< CustomTalkDynamicIcon >; using CustomTalkNestHandlersPtr = std::shared_ptr< CustomTalkNestHandlers >; using CutscenePtr = std::shared_ptr< Cutscene >; + using CutSceneIncompQuestPtr = std::shared_ptr< CutSceneIncompQuest >; + using CutsceneMotionPtr = std::shared_ptr< CutsceneMotion >; + using CutsceneWorkIndexPtr = std::shared_ptr< CutsceneWorkIndex >; using CutScreenImagePtr = std::shared_ptr< CutScreenImage >; + using CycleTimePtr = std::shared_ptr< CycleTime >; using DailySupplyItemPtr = std::shared_ptr< DailySupplyItem >; + using DawnContentPtr = std::shared_ptr< DawnContent >; + using DawnGrowMemberPtr = std::shared_ptr< DawnGrowMember >; + using DawnMemberUIParamPtr = std::shared_ptr< DawnMemberUIParam >; + using DawnQuestAnnouncePtr = std::shared_ptr< DawnQuestAnnounce >; + using DawnQuestMemberPtr = std::shared_ptr< DawnQuestMember >; using DeepDungeonPtr = std::shared_ptr< DeepDungeon >; using DeepDungeonBanPtr = std::shared_ptr< DeepDungeonBan >; using DeepDungeonDangerPtr = std::shared_ptr< DeepDungeonDanger >; @@ -6259,7 +8723,9 @@ struct ZoneSharedGroup using DefaultTalkPtr = std::shared_ptr< DefaultTalk >; using DefaultTalkLipSyncTypePtr = std::shared_ptr< DefaultTalkLipSyncType >; using DeliveryQuestPtr = std::shared_ptr< DeliveryQuest >; + using DescriptionPtr = std::shared_ptr< Description >; using DescriptionPagePtr = std::shared_ptr< DescriptionPage >; + using DescriptionSectionPtr = std::shared_ptr< DescriptionSection >; using DescriptionStringPtr = std::shared_ptr< DescriptionString >; using DisposalShopPtr = std::shared_ptr< DisposalShop >; using DisposalShopFilterTypePtr = std::shared_ptr< DisposalShopFilterType >; @@ -6267,10 +8733,15 @@ struct ZoneSharedGroup using DpsChallengePtr = std::shared_ptr< DpsChallenge >; using DpsChallengeOfficerPtr = std::shared_ptr< DpsChallengeOfficer >; using DpsChallengeTransientPtr = std::shared_ptr< DpsChallengeTransient >; + using DynamicEventPtr = std::shared_ptr< DynamicEvent >; + using DynamicEventEnemyTypePtr = std::shared_ptr< DynamicEventEnemyType >; + using DynamicEventSingleBattlePtr = std::shared_ptr< DynamicEventSingleBattle >; + using DynamicEventTypePtr = std::shared_ptr< DynamicEventType >; using EmjAddonPtr = std::shared_ptr< EmjAddon >; using EmjDaniPtr = std::shared_ptr< EmjDani >; using EmotePtr = std::shared_ptr< Emote >; using EmoteCategoryPtr = std::shared_ptr< EmoteCategory >; + using EmoteModePtr = std::shared_ptr< EmoteMode >; using ENpcBasePtr = std::shared_ptr< ENpcBase >; using ENpcDressUpPtr = std::shared_ptr< ENpcDressUp >; using ENpcDressUpDressPtr = std::shared_ptr< ENpcDressUpDress >; @@ -6288,23 +8759,32 @@ struct ZoneSharedGroup using EurekaMagiciteItemTypePtr = std::shared_ptr< EurekaMagiciteItemType >; using EurekaSphereElementAdjustPtr = std::shared_ptr< EurekaSphereElementAdjust >; using EventActionPtr = std::shared_ptr< EventAction >; + using EventCustomIconTypePtr = std::shared_ptr< EventCustomIconType >; using EventIconPriorityPtr = std::shared_ptr< EventIconPriority >; using EventIconTypePtr = std::shared_ptr< EventIconType >; using EventItemPtr = std::shared_ptr< EventItem >; using EventItemCastTimelinePtr = std::shared_ptr< EventItemCastTimeline >; using EventItemHelpPtr = std::shared_ptr< EventItemHelp >; using EventItemTimelinePtr = std::shared_ptr< EventItemTimeline >; + using EventSystemDefinePtr = std::shared_ptr< EventSystemDefine >; + using ExportedGatheringPointPtr = std::shared_ptr< ExportedGatheringPoint >; using ExportedSGPtr = std::shared_ptr< ExportedSG >; using ExVersionPtr = std::shared_ptr< ExVersion >; using FatePtr = std::shared_ptr< Fate >; + using FateEventPtr = std::shared_ptr< FateEvent >; + using FateModePtr = std::shared_ptr< FateMode >; + using FateProgressUIPtr = std::shared_ptr< FateProgressUI >; + using FateTokenTypePtr = std::shared_ptr< FateTokenType >; using FCActivityPtr = std::shared_ptr< FCActivity >; using FCActivityCategoryPtr = std::shared_ptr< FCActivityCategory >; using FCAuthorityPtr = std::shared_ptr< FCAuthority >; using FCAuthorityCategoryPtr = std::shared_ptr< FCAuthorityCategory >; using FCChestNamePtr = std::shared_ptr< FCChestName >; + using FCCrestSymbolPtr = std::shared_ptr< FCCrestSymbol >; using FccShopPtr = std::shared_ptr< FccShop >; using FCHierarchyPtr = std::shared_ptr< FCHierarchy >; using FCProfilePtr = std::shared_ptr< FCProfile >; + using FCRankPtr = std::shared_ptr< FCRank >; using FCReputationPtr = std::shared_ptr< FCReputation >; using FCRightsPtr = std::shared_ptr< FCRights >; using FestivalPtr = std::shared_ptr< Festival >; @@ -6315,6 +8795,8 @@ struct ZoneSharedGroup using FishParameterPtr = std::shared_ptr< FishParameter >; using Frontline03Ptr = std::shared_ptr< Frontline03 >; using Frontline04Ptr = std::shared_ptr< Frontline04 >; + using FurnitureCatalogCategoryPtr = std::shared_ptr< FurnitureCatalogCategory >; + using FurnitureCatalogItemListPtr = std::shared_ptr< FurnitureCatalogItemList >; using GardeningSeedPtr = std::shared_ptr< GardeningSeed >; using GatheringConditionPtr = std::shared_ptr< GatheringCondition >; using GatheringExpPtr = std::shared_ptr< GatheringExp >; @@ -6323,15 +8805,19 @@ struct ZoneSharedGroup using GatheringItemPointPtr = std::shared_ptr< GatheringItemPoint >; using GatheringLevePtr = std::shared_ptr< GatheringLeve >; using GatheringLeveRoutePtr = std::shared_ptr< GatheringLeveRoute >; + using GatheringLeveRulePtr = std::shared_ptr< GatheringLeveRule >; using GatheringNotebookListPtr = std::shared_ptr< GatheringNotebookList >; using GatheringPointPtr = std::shared_ptr< GatheringPoint >; using GatheringPointBasePtr = std::shared_ptr< GatheringPointBase >; using GatheringPointBonusPtr = std::shared_ptr< GatheringPointBonus >; using GatheringPointBonusTypePtr = std::shared_ptr< GatheringPointBonusType >; using GatheringPointNamePtr = std::shared_ptr< GatheringPointName >; + using GatheringPointTransientPtr = std::shared_ptr< GatheringPointTransient >; + using GatheringRarePopTimeTablePtr = std::shared_ptr< GatheringRarePopTimeTable >; using GatheringSubCategoryPtr = std::shared_ptr< GatheringSubCategory >; using GatheringTypePtr = std::shared_ptr< GatheringType >; using GcArmyCaptureTacticsPtr = std::shared_ptr< GcArmyCaptureTactics >; + using GcArmyEquipPresetPtr = std::shared_ptr< GcArmyEquipPreset >; using GcArmyExpeditionPtr = std::shared_ptr< GcArmyExpedition >; using GcArmyExpeditionMemberBonusPtr = std::shared_ptr< GcArmyExpeditionMemberBonus >; using GcArmyExpeditionTypePtr = std::shared_ptr< GcArmyExpeditionType >; @@ -6357,13 +8843,24 @@ struct ZoneSharedGroup using GFateRideShootingPtr = std::shared_ptr< GFateRideShooting >; using GilShopPtr = std::shared_ptr< GilShop >; using GilShopItemPtr = std::shared_ptr< GilShopItem >; + using GimmickAccessorPtr = std::shared_ptr< GimmickAccessor >; + using GimmickJumpPtr = std::shared_ptr< GimmickJump >; + using GimmickRectPtr = std::shared_ptr< GimmickRect >; using GoldSaucerArcadeMachinePtr = std::shared_ptr< GoldSaucerArcadeMachine >; using GoldSaucerTextDataPtr = std::shared_ptr< GoldSaucerTextData >; using GrandCompanyPtr = std::shared_ptr< GrandCompany >; using GrandCompanyRankPtr = std::shared_ptr< GrandCompanyRank >; + using GroupPoseFramePtr = std::shared_ptr< GroupPoseFrame >; + using GroupPoseStampPtr = std::shared_ptr< GroupPoseStamp >; + using GroupPoseStampCategoryPtr = std::shared_ptr< GroupPoseStampCategory >; using GuardianDeityPtr = std::shared_ptr< GuardianDeity >; + using GuidePtr = std::shared_ptr< Guide >; + using GuidePagePtr = std::shared_ptr< GuidePage >; + using GuidePageStringPtr = std::shared_ptr< GuidePageString >; + using GuideTitlePtr = std::shared_ptr< GuideTitle >; using GuildleveAssignmentPtr = std::shared_ptr< GuildleveAssignment >; using GuildleveAssignmentCategoryPtr = std::shared_ptr< GuildleveAssignmentCategory >; + using GuildleveAssignmentTalkPtr = std::shared_ptr< GuildleveAssignmentTalk >; using GuildOrderPtr = std::shared_ptr< GuildOrder >; using GuildOrderGuidePtr = std::shared_ptr< GuildOrderGuide >; using GuildOrderOfficerPtr = std::shared_ptr< GuildOrderOfficer >; @@ -6385,6 +8882,34 @@ struct ZoneSharedGroup using HowToPtr = std::shared_ptr< HowTo >; using HowToCategoryPtr = std::shared_ptr< HowToCategory >; using HowToPagePtr = std::shared_ptr< HowToPage >; + using HugeCraftworksNpcPtr = std::shared_ptr< HugeCraftworksNpc >; + using HugeCraftworksRankPtr = std::shared_ptr< HugeCraftworksRank >; + using HWDAnnouncePtr = std::shared_ptr< HWDAnnounce >; + using HWDCrafterSupplyPtr = std::shared_ptr< HWDCrafterSupply >; + using HWDCrafterSupplyRewardPtr = std::shared_ptr< HWDCrafterSupplyReward >; + using HWDCrafterSupplyTermPtr = std::shared_ptr< HWDCrafterSupplyTerm >; + using HWDDevLayerControlPtr = std::shared_ptr< HWDDevLayerControl >; + using HWDDevLevelUIPtr = std::shared_ptr< HWDDevLevelUI >; + using HWDDevLivelyPtr = std::shared_ptr< HWDDevLively >; + using HWDDevProgressPtr = std::shared_ptr< HWDDevProgress >; + using HWDGathereInspectTermPtr = std::shared_ptr< HWDGathereInspectTerm >; + using HWDGathererInspectionPtr = std::shared_ptr< HWDGathererInspection >; + using HWDGathererInspectionRewardPtr = std::shared_ptr< HWDGathererInspectionReward >; + using HWDInfoBoardArticlePtr = std::shared_ptr< HWDInfoBoardArticle >; + using HWDInfoBoardArticleTransientPtr = std::shared_ptr< HWDInfoBoardArticleTransient >; + using HWDInfoBoardArticleTypePtr = std::shared_ptr< HWDInfoBoardArticleType >; + using HWDLevelChangeDeceptionPtr = std::shared_ptr< HWDLevelChangeDeception >; + using HWDSharedGroupPtr = std::shared_ptr< HWDSharedGroup >; + using HWDSharedGroupControlParamPtr = std::shared_ptr< HWDSharedGroupControlParam >; + using IKDContentBonusPtr = std::shared_ptr< IKDContentBonus >; + using IKDFishParamPtr = std::shared_ptr< IKDFishParam >; + using IKDRoutePtr = std::shared_ptr< IKDRoute >; + using IKDRouteTablePtr = std::shared_ptr< IKDRouteTable >; + using IKDSpotPtr = std::shared_ptr< IKDSpot >; + using InclusionShopPtr = std::shared_ptr< InclusionShop >; + using InclusionShopCategoryPtr = std::shared_ptr< InclusionShopCategory >; + using InclusionShopSeriesPtr = std::shared_ptr< InclusionShopSeries >; + using IndividualWeatherPtr = std::shared_ptr< IndividualWeather >; using InstanceContentPtr = std::shared_ptr< InstanceContent >; using InstanceContentBuffPtr = std::shared_ptr< InstanceContentBuff >; using InstanceContentCSBonusPtr = std::shared_ptr< InstanceContentCSBonus >; @@ -6392,25 +8917,34 @@ struct ZoneSharedGroup using InstanceContentTextDataPtr = std::shared_ptr< InstanceContentTextData >; using ItemPtr = std::shared_ptr< Item >; using ItemActionPtr = std::shared_ptr< ItemAction >; + using ItemActionTelepoPtr = std::shared_ptr< ItemActionTelepo >; + using ItemBarterCheckPtr = std::shared_ptr< ItemBarterCheck >; using ItemFoodPtr = std::shared_ptr< ItemFood >; using ItemLevelPtr = std::shared_ptr< ItemLevel >; using ItemSearchCategoryPtr = std::shared_ptr< ItemSearchCategory >; using ItemSeriesPtr = std::shared_ptr< ItemSeries >; + using ItemSortCategoryPtr = std::shared_ptr< ItemSortCategory >; using ItemSpecialBonusPtr = std::shared_ptr< ItemSpecialBonus >; using ItemUICategoryPtr = std::shared_ptr< ItemUICategory >; + using JinglePtr = std::shared_ptr< Jingle >; + using JobHudManualPtr = std::shared_ptr< JobHudManual >; + using JobHudManualPriorityPtr = std::shared_ptr< JobHudManualPriority >; using JournalCategoryPtr = std::shared_ptr< JournalCategory >; using JournalGenrePtr = std::shared_ptr< JournalGenre >; using JournalSectionPtr = std::shared_ptr< JournalSection >; + using KnockbackPtr = std::shared_ptr< Knockback >; + using LegacyQuestPtr = std::shared_ptr< LegacyQuest >; using LevePtr = std::shared_ptr< Leve >; using LeveAssignmentTypePtr = std::shared_ptr< LeveAssignmentType >; using LeveClientPtr = std::shared_ptr< LeveClient >; using LevelPtr = std::shared_ptr< Level >; using LeveRewardItemPtr = std::shared_ptr< LeveRewardItem >; using LeveRewardItemGroupPtr = std::shared_ptr< LeveRewardItemGroup >; + using LeveStringPtr = std::shared_ptr< LeveString >; using LeveVfxPtr = std::shared_ptr< LeveVfx >; + using LobbyPtr = std::shared_ptr< Lobby >; using LogFilterPtr = std::shared_ptr< LogFilter >; using LogKindPtr = std::shared_ptr< LogKind >; - using LogKindCategoryTextPtr = std::shared_ptr< LogKindCategoryText >; using LogMessagePtr = std::shared_ptr< LogMessage >; using LotteryExchangeShopPtr = std::shared_ptr< LotteryExchangeShop >; using MacroIconPtr = std::shared_ptr< MacroIcon >; @@ -6419,24 +8953,31 @@ struct ZoneSharedGroup using MainCommandCategoryPtr = std::shared_ptr< MainCommandCategory >; using ManeuversArmorPtr = std::shared_ptr< ManeuversArmor >; using MapPtr = std::shared_ptr< Map >; + using MapConditionPtr = std::shared_ptr< MapCondition >; using MapMarkerPtr = std::shared_ptr< MapMarker >; using MapMarkerRegionPtr = std::shared_ptr< MapMarkerRegion >; using MapSymbolPtr = std::shared_ptr< MapSymbol >; using MarkerPtr = std::shared_ptr< Marker >; - using MasterpieceSupplyDutyPtr = std::shared_ptr< MasterpieceSupplyDuty >; - using MasterpieceSupplyMultiplierPtr = std::shared_ptr< MasterpieceSupplyMultiplier >; using MateriaPtr = std::shared_ptr< Materia >; + using MateriaJoinRatePtr = std::shared_ptr< MateriaJoinRate >; + using MateriaJoinRateGatherCraftPtr = std::shared_ptr< MateriaJoinRateGatherCraft >; + using MateriaTomestoneRatePtr = std::shared_ptr< MateriaTomestoneRate >; using MiniGameRAPtr = std::shared_ptr< MiniGameRA >; using MinionRacePtr = std::shared_ptr< MinionRace >; using MinionRulesPtr = std::shared_ptr< MinionRules >; using MinionSkillTypePtr = std::shared_ptr< MinionSkillType >; + using MobHuntOrderPtr = std::shared_ptr< MobHuntOrder >; using MobHuntOrderTypePtr = std::shared_ptr< MobHuntOrderType >; + using MobHuntRewardPtr = std::shared_ptr< MobHuntReward >; + using MobHuntRewardCapPtr = std::shared_ptr< MobHuntRewardCap >; using MobHuntTargetPtr = std::shared_ptr< MobHuntTarget >; using ModelCharaPtr = std::shared_ptr< ModelChara >; using ModelSkeletonPtr = std::shared_ptr< ModelSkeleton >; using ModelStatePtr = std::shared_ptr< ModelState >; using MonsterNotePtr = std::shared_ptr< MonsterNote >; using MonsterNoteTargetPtr = std::shared_ptr< MonsterNoteTarget >; + using MotionTimelinePtr = std::shared_ptr< MotionTimeline >; + using MotionTimelineBlendTablePtr = std::shared_ptr< MotionTimelineBlendTable >; using MountPtr = std::shared_ptr< Mount >; using MountActionPtr = std::shared_ptr< MountAction >; using MountCustomizePtr = std::shared_ptr< MountCustomize >; @@ -6445,29 +8986,47 @@ struct ZoneSharedGroup using MountTransientPtr = std::shared_ptr< MountTransient >; using MoveTimelinePtr = std::shared_ptr< MoveTimeline >; using MoveVfxPtr = std::shared_ptr< MoveVfx >; + using MovieStaffListPtr = std::shared_ptr< MovieStaffList >; + using MovieSubtitlePtr = std::shared_ptr< MovieSubtitle >; + using MovieSubtitle500Ptr = std::shared_ptr< MovieSubtitle500 >; + using MovieSubtitleVoyagePtr = std::shared_ptr< MovieSubtitleVoyage >; + using MYCTemporaryItemPtr = std::shared_ptr< MYCTemporaryItem >; + using MYCTemporaryItemUICategoryPtr = std::shared_ptr< MYCTemporaryItemUICategory >; + using MYCWarResultNotebookPtr = std::shared_ptr< MYCWarResultNotebook >; using NotebookDivisionPtr = std::shared_ptr< NotebookDivision >; using NotebookDivisionCategoryPtr = std::shared_ptr< NotebookDivisionCategory >; + using NotoriousMonsterPtr = std::shared_ptr< NotoriousMonster >; using NpcEquipPtr = std::shared_ptr< NpcEquip >; using NpcYellPtr = std::shared_ptr< NpcYell >; using OmenPtr = std::shared_ptr< Omen >; using OnlineStatusPtr = std::shared_ptr< OnlineStatus >; + using OpenContentPtr = std::shared_ptr< OpenContent >; + using OpenContentCandidateNamePtr = std::shared_ptr< OpenContentCandidateName >; using OpeningPtr = std::shared_ptr< Opening >; using OrchestrionPtr = std::shared_ptr< Orchestrion >; using OrchestrionCategoryPtr = std::shared_ptr< OrchestrionCategory >; using OrchestrionPathPtr = std::shared_ptr< OrchestrionPath >; using OrchestrionUiparamPtr = std::shared_ptr< OrchestrionUiparam >; + using OrnamentPtr = std::shared_ptr< Ornament >; using ParamGrowPtr = std::shared_ptr< ParamGrow >; using PartyContentPtr = std::shared_ptr< PartyContent >; using PartyContentCutscenePtr = std::shared_ptr< PartyContentCutscene >; using PartyContentTextDataPtr = std::shared_ptr< PartyContentTextData >; + using PatchMarkPtr = std::shared_ptr< PatchMark >; using PerformPtr = std::shared_ptr< Perform >; + using PerformGroupPtr = std::shared_ptr< PerformGroup >; using PerformTransientPtr = std::shared_ptr< PerformTransient >; using PetPtr = std::shared_ptr< Pet >; using PetActionPtr = std::shared_ptr< PetAction >; + using PetMiragePtr = std::shared_ptr< PetMirage >; + using PhysicsGroupPtr = std::shared_ptr< PhysicsGroup >; + using PhysicsWindPtr = std::shared_ptr< PhysicsWind >; using PicturePtr = std::shared_ptr< Picture >; using PlaceNamePtr = std::shared_ptr< PlaceName >; using PlantPotFlowerSeedPtr = std::shared_ptr< PlantPotFlowerSeed >; using PreHandlerPtr = std::shared_ptr< PreHandler >; + using PresetCameraPtr = std::shared_ptr< PresetCamera >; + using PresetCameraAdjustPtr = std::shared_ptr< PresetCameraAdjust >; using PublicContentPtr = std::shared_ptr< PublicContent >; using PublicContentCutscenePtr = std::shared_ptr< PublicContentCutscene >; using PublicContentTextDataPtr = std::shared_ptr< PublicContentTextData >; @@ -6477,9 +9036,19 @@ struct ZoneSharedGroup using PvPSelectTraitPtr = std::shared_ptr< PvPSelectTrait >; using PvPTraitPtr = std::shared_ptr< PvPTrait >; using QuestPtr = std::shared_ptr< Quest >; + using QuestAcceptAdditionConditionPtr = std::shared_ptr< QuestAcceptAdditionCondition >; using QuestBattlePtr = std::shared_ptr< QuestBattle >; + using QuestChapterPtr = std::shared_ptr< QuestChapter >; using QuestClassJobRewardPtr = std::shared_ptr< QuestClassJobReward >; using QuestClassJobSupplyPtr = std::shared_ptr< QuestClassJobSupply >; + using QuestDerivedClassPtr = std::shared_ptr< QuestDerivedClass >; + using QuestEffectPtr = std::shared_ptr< QuestEffect >; + using QuestEffectDefinePtr = std::shared_ptr< QuestEffectDefine >; + using QuestRedoPtr = std::shared_ptr< QuestRedo >; + using QuestRedoChapterUIPtr = std::shared_ptr< QuestRedoChapterUI >; + using QuestRedoChapterUICategoryPtr = std::shared_ptr< QuestRedoChapterUICategory >; + using QuestRedoChapterUITabPtr = std::shared_ptr< QuestRedoChapterUITab >; + using QuestRedoIncompChapterPtr = std::shared_ptr< QuestRedoIncompChapter >; using QuestRepeatFlagPtr = std::shared_ptr< QuestRepeatFlag >; using QuestRewardOtherPtr = std::shared_ptr< QuestRewardOther >; using QuickChatPtr = std::shared_ptr< QuickChat >; @@ -6493,6 +9062,7 @@ struct ZoneSharedGroup using RecastNavimeshPtr = std::shared_ptr< RecastNavimesh >; using RecipePtr = std::shared_ptr< Recipe >; using RecipeLevelTablePtr = std::shared_ptr< RecipeLevelTable >; + using RecipeLookupPtr = std::shared_ptr< RecipeLookup >; using RecipeNotebookListPtr = std::shared_ptr< RecipeNotebookList >; using RecommendContentsPtr = std::shared_ptr< RecommendContents >; using RelicPtr = std::shared_ptr< Relic >; @@ -6501,20 +9071,24 @@ struct ZoneSharedGroup using RelicNotePtr = std::shared_ptr< RelicNote >; using RelicNoteCategoryPtr = std::shared_ptr< RelicNoteCategory >; using ResidentPtr = std::shared_ptr< Resident >; + using ResistanceWeaponAdjustPtr = std::shared_ptr< ResistanceWeaponAdjust >; + using RetainerFortuneRewardRangePtr = std::shared_ptr< RetainerFortuneRewardRange >; using RetainerTaskPtr = std::shared_ptr< RetainerTask >; using RetainerTaskLvRangePtr = std::shared_ptr< RetainerTaskLvRange >; using RetainerTaskNormalPtr = std::shared_ptr< RetainerTaskNormal >; using RetainerTaskParameterPtr = std::shared_ptr< RetainerTaskParameter >; using RetainerTaskRandomPtr = std::shared_ptr< RetainerTaskRandom >; + using RideShootingPtr = std::shared_ptr< RideShooting >; + using RideShootingTargetTypePtr = std::shared_ptr< RideShootingTargetType >; + using RideShootingTextDataPtr = std::shared_ptr< RideShootingTextData >; using RPParameterPtr = std::shared_ptr< RPParameter >; - using SalvagePtr = std::shared_ptr< Salvage >; + using SatisfactionArbitrationPtr = std::shared_ptr< SatisfactionArbitration >; using SatisfactionNpcPtr = std::shared_ptr< SatisfactionNpc >; using SatisfactionSupplyPtr = std::shared_ptr< SatisfactionSupply >; using SatisfactionSupplyRewardPtr = std::shared_ptr< SatisfactionSupplyReward >; using ScenarioTreePtr = std::shared_ptr< ScenarioTree >; using ScenarioTreeTipsPtr = std::shared_ptr< ScenarioTreeTips >; using ScenarioTreeTipsClassQuestPtr = std::shared_ptr< ScenarioTreeTipsClassQuest >; - using ScenarioTreeTipsQuestPtr = std::shared_ptr< ScenarioTreeTipsQuest >; using ScenarioTypePtr = std::shared_ptr< ScenarioType >; using ScreenImagePtr = std::shared_ptr< ScreenImage >; using SecretRecipeBookPtr = std::shared_ptr< SecretRecipeBook >; @@ -6522,6 +9096,8 @@ struct ZoneSharedGroup using SkyIsland2MissionDetailPtr = std::shared_ptr< SkyIsland2MissionDetail >; using SkyIsland2MissionTypePtr = std::shared_ptr< SkyIsland2MissionType >; using SkyIsland2RangeTypePtr = std::shared_ptr< SkyIsland2RangeType >; + using SnipeTalkPtr = std::shared_ptr< SnipeTalk >; + using SnipeTalkNamePtr = std::shared_ptr< SnipeTalkName >; using SpearfishingItemPtr = std::shared_ptr< SpearfishingItem >; using SpearfishingNotebookPtr = std::shared_ptr< SpearfishingNotebook >; using SpearfishingRecordPagePtr = std::shared_ptr< SpearfishingRecordPage >; @@ -6529,16 +9105,21 @@ struct ZoneSharedGroup using SpecialShopItemCategoryPtr = std::shared_ptr< SpecialShopItemCategory >; using StainPtr = std::shared_ptr< Stain >; using StainTransientPtr = std::shared_ptr< StainTransient >; + using StanceChangePtr = std::shared_ptr< StanceChange >; using StatusPtr = std::shared_ptr< Status >; using StatusHitEffectPtr = std::shared_ptr< StatusHitEffect >; using StatusLoopVFXPtr = std::shared_ptr< StatusLoopVFX >; using StoryPtr = std::shared_ptr< Story >; using SubmarineExplorationPtr = std::shared_ptr< SubmarineExploration >; + using SubmarineMapPtr = std::shared_ptr< SubmarineMap >; using SubmarinePartPtr = std::shared_ptr< SubmarinePart >; using SubmarineRankPtr = std::shared_ptr< SubmarineRank >; using SwitchTalkPtr = std::shared_ptr< SwitchTalk >; + using SwitchTalkVariationPtr = std::shared_ptr< SwitchTalkVariation >; using TerritoryTypePtr = std::shared_ptr< TerritoryType >; + using TerritoryTypeTransientPtr = std::shared_ptr< TerritoryTypeTransient >; using TextCommandPtr = std::shared_ptr< TextCommand >; + using TextCommandParamPtr = std::shared_ptr< TextCommandParam >; using TitlePtr = std::shared_ptr< Title >; using TomestonesPtr = std::shared_ptr< Tomestones >; using TomestonesItemPtr = std::shared_ptr< TomestonesItem >; @@ -6550,6 +9131,7 @@ struct ZoneSharedGroup using TransformationPtr = std::shared_ptr< Transformation >; using TreasurePtr = std::shared_ptr< Treasure >; using TreasureHuntRankPtr = std::shared_ptr< TreasureHuntRank >; + using TreasureModelPtr = std::shared_ptr< TreasureModel >; using TreasureSpotPtr = std::shared_ptr< TreasureSpot >; using TribePtr = std::shared_ptr< Tribe >; using TripleTriadPtr = std::shared_ptr< TripleTriad >; @@ -6558,21 +9140,27 @@ struct ZoneSharedGroup using TripleTriadCardResidentPtr = std::shared_ptr< TripleTriadCardResident >; using TripleTriadCardTypePtr = std::shared_ptr< TripleTriadCardType >; using TripleTriadCompetitionPtr = std::shared_ptr< TripleTriadCompetition >; + using TripleTriadResidentPtr = std::shared_ptr< TripleTriadResident >; using TripleTriadRulePtr = std::shared_ptr< TripleTriadRule >; using TutorialPtr = std::shared_ptr< Tutorial >; using TutorialDPSPtr = std::shared_ptr< TutorialDPS >; using TutorialHealerPtr = std::shared_ptr< TutorialHealer >; using TutorialTankPtr = std::shared_ptr< TutorialTank >; + using UDS_EventPtr = std::shared_ptr< UDS_Event >; + using UDS_PropertyPtr = std::shared_ptr< UDS_Property >; using UIColorPtr = std::shared_ptr< UIColor >; using VaseFlowerPtr = std::shared_ptr< VaseFlower >; using VFXPtr = std::shared_ptr< VFX >; using WarpPtr = std::shared_ptr< Warp >; using WarpConditionPtr = std::shared_ptr< WarpCondition >; using WarpLogicPtr = std::shared_ptr< WarpLogic >; + using WeaponTimelinePtr = std::shared_ptr< WeaponTimeline >; using WeatherPtr = std::shared_ptr< Weather >; using WeatherGroupPtr = std::shared_ptr< WeatherGroup >; using WeatherRatePtr = std::shared_ptr< WeatherRate >; using WeatherReportReplacePtr = std::shared_ptr< WeatherReportReplace >; + using WebGuidancePtr = std::shared_ptr< WebGuidance >; + using WebURLPtr = std::shared_ptr< WebURL >; using WeddingBGMPtr = std::shared_ptr< WeddingBGM >; using WeeklyBingoOrderDataPtr = std::shared_ptr< WeeklyBingoOrderData >; using WeeklyBingoRewardDataPtr = std::shared_ptr< WeeklyBingoRewardData >; @@ -6580,13 +9168,17 @@ struct ZoneSharedGroup using WeeklyLotBonusPtr = std::shared_ptr< WeeklyLotBonus >; using WorldPtr = std::shared_ptr< World >; using WorldDCGroupTypePtr = std::shared_ptr< WorldDCGroupType >; + using YardCatalogCategoryPtr = std::shared_ptr< YardCatalogCategory >; + using YardCatalogItemListPtr = std::shared_ptr< YardCatalogItemList >; using YKWPtr = std::shared_ptr< YKW >; using ZoneSharedGroupPtr = std::shared_ptr< ZoneSharedGroup >; std::set< uint32_t > m_AchievementIdList; std::set< uint32_t > m_AchievementCategoryIdList; + std::set< uint32_t > m_AchievementHideConditionIdList; std::set< uint32_t > m_AchievementKindIdList; + std::set< uint32_t > m_AchievementTargetIdList; std::set< uint32_t > m_ActionIdList; std::set< uint32_t > m_ActionCastTimelineIdList; std::set< uint32_t > m_ActionCastVFXIdList; @@ -6604,7 +9196,6 @@ struct ZoneSharedGroup std::set< uint32_t > m_ActivityFeedGroupCaptionsIdList; std::set< uint32_t > m_ActivityFeedImagesIdList; std::set< uint32_t > m_AddonIdList; - std::set< uint32_t > m_AddonHudIdList; std::set< uint32_t > m_AdventureIdList; std::set< uint32_t > m_AdventureExPhaseIdList; std::set< uint32_t > m_AetherCurrentIdList; @@ -6617,6 +9208,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_AirshipExplorationParamTypeIdList; std::set< uint32_t > m_AirshipExplorationPartIdList; std::set< uint32_t > m_AirshipExplorationPointIdList; + std::set< uint32_t > m_AnimationLODIdList; std::set< uint32_t > m_AnimaWeapon5IdList; std::set< uint32_t > m_AnimaWeapon5ParamIdList; std::set< uint32_t > m_AnimaWeapon5PatternGroupIdList; @@ -6633,20 +9225,28 @@ struct ZoneSharedGroup std::set< uint32_t > m_AOZBossIdList; std::set< uint32_t > m_AOZContentIdList; std::set< uint32_t > m_AOZContentBriefingBNpcIdList; + std::set< uint32_t > m_AOZReportIdList; + std::set< uint32_t > m_AOZScoreIdList; std::set< uint32_t > m_AquariumFishIdList; std::set< uint32_t > m_AquariumWaterIdList; std::set< uint32_t > m_ArrayEventHandlerIdList; std::set< uint32_t > m_AttackTypeIdList; std::set< uint32_t > m_BacklightColorIdList; + std::set< uint32_t > m_BallistaIdList; std::set< uint32_t > m_BalloonIdList; std::set< uint32_t > m_BaseParamIdList; std::set< uint32_t > m_BattleLeveIdList; + std::set< uint32_t > m_BattleLeveRuleIdList; std::set< uint32_t > m_BeastRankBonusIdList; std::set< uint32_t > m_BeastReputationRankIdList; std::set< uint32_t > m_BeastTribeIdList; std::set< uint32_t > m_BehaviorIdList; + std::set< uint32_t > m_BehaviorPathIdList; + std::set< uint32_t > m_BenchmarkOverrideEquipmentIdList; std::set< uint32_t > m_BGMIdList; std::set< uint32_t > m_BGMFadeIdList; + std::set< uint32_t > m_BGMFadeTypeIdList; + std::set< uint32_t > m_BGMSceneIdList; std::set< uint32_t > m_BGMSituationIdList; std::set< uint32_t > m_BGMSwitchIdList; std::set< uint32_t > m_BGMSystemDefineIdList; @@ -6655,6 +9255,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_BNpcCustomizeIdList; std::set< uint32_t > m_BNpcNameIdList; std::set< uint32_t > m_BNpcPartsIdList; + std::set< uint32_t > m_BNpcStateIdList; std::set< uint32_t > m_BuddyIdList; std::set< uint32_t > m_BuddyActionIdList; std::set< uint32_t > m_BuddyEquipIdList; @@ -6664,7 +9265,11 @@ struct ZoneSharedGroup std::set< uint32_t > m_CabinetIdList; std::set< uint32_t > m_CabinetCategoryIdList; std::set< uint32_t > m_CalendarIdList; + std::set< uint32_t > m_CarryIdList; + std::set< uint32_t > m_ChannelingIdList; + std::set< uint32_t > m_CharaMakeClassEquipIdList; std::set< uint32_t > m_CharaMakeCustomizeIdList; + std::set< uint32_t > m_CharaMakeNameIdList; std::set< uint32_t > m_CharaMakeTypeIdList; std::set< uint32_t > m_ChocoboRaceIdList; std::set< uint32_t > m_ChocoboRaceAbilityIdList; @@ -6677,8 +9282,15 @@ struct ZoneSharedGroup std::set< uint32_t > m_ChocoboRaceWeatherIdList; std::set< uint32_t > m_ChocoboTaxiIdList; std::set< uint32_t > m_ChocoboTaxiStandIdList; + std::set< uint32_t > m_CircleActivityIdList; std::set< uint32_t > m_ClassJobIdList; std::set< uint32_t > m_ClassJobCategoryIdList; + std::set< uint32_t > m_CollectablesShopIdList; + std::set< uint32_t > m_CollectablesShopItemIdList; + std::set< uint32_t > m_CollectablesShopItemGroupIdList; + std::set< uint32_t > m_CollectablesShopRefineIdList; + std::set< uint32_t > m_CollectablesShopRewardItemIdList; + std::set< uint32_t > m_CollectablesShopRewardScripIdList; std::set< uint32_t > m_CompanionIdList; std::set< uint32_t > m_CompanionMoveIdList; std::set< uint32_t > m_CompanionTransientIdList; @@ -6695,6 +9307,9 @@ struct ZoneSharedGroup std::set< uint32_t > m_CompanyLeveRuleIdList; std::set< uint32_t > m_CompleteJournalIdList; std::set< uint32_t > m_CompleteJournalCategoryIdList; + std::set< uint32_t > m_CompletionIdList; + std::set< uint32_t > m_ConditionIdList; + std::set< uint32_t > m_ConfigKeyIdList; std::set< uint32_t > m_ContentCloseCycleIdList; std::set< uint32_t > m_ContentExActionIdList; std::set< uint32_t > m_ContentFinderConditionIdList; @@ -6703,28 +9318,40 @@ struct ZoneSharedGroup std::set< uint32_t > m_ContentGaugeColorIdList; std::set< uint32_t > m_ContentMemberTypeIdList; std::set< uint32_t > m_ContentNpcTalkIdList; + std::set< uint32_t > m_ContentRandomSelectIdList; std::set< uint32_t > m_ContentRouletteIdList; std::set< uint32_t > m_ContentRouletteOpenRuleIdList; std::set< uint32_t > m_ContentRouletteRoleBonusIdList; std::set< uint32_t > m_ContentsNoteIdList; + std::set< uint32_t > m_ContentsTutorialIdList; + std::set< uint32_t > m_ContentsTutorialPageIdList; std::set< uint32_t > m_ContentTalkIdList; std::set< uint32_t > m_ContentTalkParamIdList; std::set< uint32_t > m_ContentTypeIdList; std::set< uint32_t > m_CraftActionIdList; std::set< uint32_t > m_CraftLeveIdList; + std::set< uint32_t > m_CraftLevelDifferenceIdList; + std::set< uint32_t > m_CraftLeveTalkIdList; std::set< uint32_t > m_CraftTypeIdList; std::set< uint32_t > m_CreditIdList; std::set< uint32_t > m_CreditBackImageIdList; std::set< uint32_t > m_CreditCastIdList; std::set< uint32_t > m_CreditListIdList; std::set< uint32_t > m_CreditListTextIdList; - std::set< uint32_t > m_CurrencyIdList; std::set< uint32_t > m_CustomTalkIdList; - std::set< uint32_t > m_CustomTalkDynamicIconIdList; std::set< uint32_t > m_CustomTalkNestHandlersIdList; std::set< uint32_t > m_CutsceneIdList; + std::set< uint32_t > m_CutSceneIncompQuestIdList; + std::set< uint32_t > m_CutsceneMotionIdList; + std::set< uint32_t > m_CutsceneWorkIndexIdList; std::set< uint32_t > m_CutScreenImageIdList; + std::set< uint32_t > m_CycleTimeIdList; std::set< uint32_t > m_DailySupplyItemIdList; + std::set< uint32_t > m_DawnContentIdList; + std::set< uint32_t > m_DawnGrowMemberIdList; + std::set< uint32_t > m_DawnMemberUIParamIdList; + std::set< uint32_t > m_DawnQuestAnnounceIdList; + std::set< uint32_t > m_DawnQuestMemberIdList; std::set< uint32_t > m_DeepDungeonIdList; std::set< uint32_t > m_DeepDungeonBanIdList; std::set< uint32_t > m_DeepDungeonDangerIdList; @@ -6739,7 +9366,9 @@ struct ZoneSharedGroup std::set< uint32_t > m_DefaultTalkIdList; std::set< uint32_t > m_DefaultTalkLipSyncTypeIdList; std::set< uint32_t > m_DeliveryQuestIdList; + std::set< uint32_t > m_DescriptionIdList; std::set< uint32_t > m_DescriptionPageIdList; + std::set< uint32_t > m_DescriptionSectionIdList; std::set< uint32_t > m_DescriptionStringIdList; std::set< uint32_t > m_DisposalShopIdList; std::set< uint32_t > m_DisposalShopFilterTypeIdList; @@ -6747,10 +9376,15 @@ struct ZoneSharedGroup std::set< uint32_t > m_DpsChallengeIdList; std::set< uint32_t > m_DpsChallengeOfficerIdList; std::set< uint32_t > m_DpsChallengeTransientIdList; + std::set< uint32_t > m_DynamicEventIdList; + std::set< uint32_t > m_DynamicEventEnemyTypeIdList; + std::set< uint32_t > m_DynamicEventSingleBattleIdList; + std::set< uint32_t > m_DynamicEventTypeIdList; std::set< uint32_t > m_EmjAddonIdList; std::set< uint32_t > m_EmjDaniIdList; std::set< uint32_t > m_EmoteIdList; std::set< uint32_t > m_EmoteCategoryIdList; + std::set< uint32_t > m_EmoteModeIdList; std::set< uint32_t > m_ENpcBaseIdList; std::set< uint32_t > m_ENpcDressUpIdList; std::set< uint32_t > m_ENpcDressUpDressIdList; @@ -6768,23 +9402,32 @@ struct ZoneSharedGroup std::set< uint32_t > m_EurekaMagiciteItemTypeIdList; std::set< uint32_t > m_EurekaSphereElementAdjustIdList; std::set< uint32_t > m_EventActionIdList; + std::set< uint32_t > m_EventCustomIconTypeIdList; std::set< uint32_t > m_EventIconPriorityIdList; std::set< uint32_t > m_EventIconTypeIdList; std::set< uint32_t > m_EventItemIdList; std::set< uint32_t > m_EventItemCastTimelineIdList; std::set< uint32_t > m_EventItemHelpIdList; std::set< uint32_t > m_EventItemTimelineIdList; + std::set< uint32_t > m_EventSystemDefineIdList; + std::set< uint32_t > m_ExportedGatheringPointIdList; std::set< uint32_t > m_ExportedSGIdList; std::set< uint32_t > m_ExVersionIdList; std::set< uint32_t > m_FateIdList; + std::set< uint32_t > m_FateEventIdList; + std::set< uint32_t > m_FateModeIdList; + std::set< uint32_t > m_FateProgressUIIdList; + std::set< uint32_t > m_FateTokenTypeIdList; std::set< uint32_t > m_FCActivityIdList; std::set< uint32_t > m_FCActivityCategoryIdList; std::set< uint32_t > m_FCAuthorityIdList; std::set< uint32_t > m_FCAuthorityCategoryIdList; std::set< uint32_t > m_FCChestNameIdList; + std::set< uint32_t > m_FCCrestSymbolIdList; std::set< uint32_t > m_FccShopIdList; std::set< uint32_t > m_FCHierarchyIdList; std::set< uint32_t > m_FCProfileIdList; + std::set< uint32_t > m_FCRankIdList; std::set< uint32_t > m_FCReputationIdList; std::set< uint32_t > m_FCRightsIdList; std::set< uint32_t > m_FestivalIdList; @@ -6795,6 +9438,8 @@ struct ZoneSharedGroup std::set< uint32_t > m_FishParameterIdList; std::set< uint32_t > m_Frontline03IdList; std::set< uint32_t > m_Frontline04IdList; + std::set< uint32_t > m_FurnitureCatalogCategoryIdList; + std::set< uint32_t > m_FurnitureCatalogItemListIdList; std::set< uint32_t > m_GardeningSeedIdList; std::set< uint32_t > m_GatheringConditionIdList; std::set< uint32_t > m_GatheringExpIdList; @@ -6803,15 +9448,19 @@ struct ZoneSharedGroup std::set< uint32_t > m_GatheringItemPointIdList; std::set< uint32_t > m_GatheringLeveIdList; std::set< uint32_t > m_GatheringLeveRouteIdList; + std::set< uint32_t > m_GatheringLeveRuleIdList; std::set< uint32_t > m_GatheringNotebookListIdList; std::set< uint32_t > m_GatheringPointIdList; std::set< uint32_t > m_GatheringPointBaseIdList; std::set< uint32_t > m_GatheringPointBonusIdList; std::set< uint32_t > m_GatheringPointBonusTypeIdList; std::set< uint32_t > m_GatheringPointNameIdList; + std::set< uint32_t > m_GatheringPointTransientIdList; + std::set< uint32_t > m_GatheringRarePopTimeTableIdList; std::set< uint32_t > m_GatheringSubCategoryIdList; std::set< uint32_t > m_GatheringTypeIdList; std::set< uint32_t > m_GcArmyCaptureTacticsIdList; + std::set< uint32_t > m_GcArmyEquipPresetIdList; std::set< uint32_t > m_GcArmyExpeditionIdList; std::set< uint32_t > m_GcArmyExpeditionMemberBonusIdList; std::set< uint32_t > m_GcArmyExpeditionTypeIdList; @@ -6837,13 +9486,24 @@ struct ZoneSharedGroup std::set< uint32_t > m_GFateRideShootingIdList; std::set< uint32_t > m_GilShopIdList; std::set< uint32_t > m_GilShopItemIdList; + std::set< uint32_t > m_GimmickAccessorIdList; + std::set< uint32_t > m_GimmickJumpIdList; + std::set< uint32_t > m_GimmickRectIdList; std::set< uint32_t > m_GoldSaucerArcadeMachineIdList; std::set< uint32_t > m_GoldSaucerTextDataIdList; std::set< uint32_t > m_GrandCompanyIdList; std::set< uint32_t > m_GrandCompanyRankIdList; + std::set< uint32_t > m_GroupPoseFrameIdList; + std::set< uint32_t > m_GroupPoseStampIdList; + std::set< uint32_t > m_GroupPoseStampCategoryIdList; std::set< uint32_t > m_GuardianDeityIdList; + std::set< uint32_t > m_GuideIdList; + std::set< uint32_t > m_GuidePageIdList; + std::set< uint32_t > m_GuidePageStringIdList; + std::set< uint32_t > m_GuideTitleIdList; std::set< uint32_t > m_GuildleveAssignmentIdList; std::set< uint32_t > m_GuildleveAssignmentCategoryIdList; + std::set< uint32_t > m_GuildleveAssignmentTalkIdList; std::set< uint32_t > m_GuildOrderIdList; std::set< uint32_t > m_GuildOrderGuideIdList; std::set< uint32_t > m_GuildOrderOfficerIdList; @@ -6865,6 +9525,34 @@ struct ZoneSharedGroup std::set< uint32_t > m_HowToIdList; std::set< uint32_t > m_HowToCategoryIdList; std::set< uint32_t > m_HowToPageIdList; + std::set< uint32_t > m_HugeCraftworksNpcIdList; + std::set< uint32_t > m_HugeCraftworksRankIdList; + std::set< uint32_t > m_HWDAnnounceIdList; + std::set< uint32_t > m_HWDCrafterSupplyIdList; + std::set< uint32_t > m_HWDCrafterSupplyRewardIdList; + std::set< uint32_t > m_HWDCrafterSupplyTermIdList; + std::set< uint32_t > m_HWDDevLayerControlIdList; + std::set< uint32_t > m_HWDDevLevelUIIdList; + std::set< uint32_t > m_HWDDevLivelyIdList; + std::set< uint32_t > m_HWDDevProgressIdList; + std::set< uint32_t > m_HWDGathereInspectTermIdList; + std::set< uint32_t > m_HWDGathererInspectionIdList; + std::set< uint32_t > m_HWDGathererInspectionRewardIdList; + std::set< uint32_t > m_HWDInfoBoardArticleIdList; + std::set< uint32_t > m_HWDInfoBoardArticleTransientIdList; + std::set< uint32_t > m_HWDInfoBoardArticleTypeIdList; + std::set< uint32_t > m_HWDLevelChangeDeceptionIdList; + std::set< uint32_t > m_HWDSharedGroupIdList; + std::set< uint32_t > m_HWDSharedGroupControlParamIdList; + std::set< uint32_t > m_IKDContentBonusIdList; + std::set< uint32_t > m_IKDFishParamIdList; + std::set< uint32_t > m_IKDRouteIdList; + std::set< uint32_t > m_IKDRouteTableIdList; + std::set< uint32_t > m_IKDSpotIdList; + std::set< uint32_t > m_InclusionShopIdList; + std::set< uint32_t > m_InclusionShopCategoryIdList; + std::set< uint32_t > m_InclusionShopSeriesIdList; + std::set< uint32_t > m_IndividualWeatherIdList; std::set< uint32_t > m_InstanceContentIdList; std::set< uint32_t > m_InstanceContentBuffIdList; std::set< uint32_t > m_InstanceContentCSBonusIdList; @@ -6872,25 +9560,34 @@ struct ZoneSharedGroup std::set< uint32_t > m_InstanceContentTextDataIdList; std::set< uint32_t > m_ItemIdList; std::set< uint32_t > m_ItemActionIdList; + std::set< uint32_t > m_ItemActionTelepoIdList; + std::set< uint32_t > m_ItemBarterCheckIdList; std::set< uint32_t > m_ItemFoodIdList; std::set< uint32_t > m_ItemLevelIdList; std::set< uint32_t > m_ItemSearchCategoryIdList; std::set< uint32_t > m_ItemSeriesIdList; + std::set< uint32_t > m_ItemSortCategoryIdList; std::set< uint32_t > m_ItemSpecialBonusIdList; std::set< uint32_t > m_ItemUICategoryIdList; + std::set< uint32_t > m_JingleIdList; + std::set< uint32_t > m_JobHudManualIdList; + std::set< uint32_t > m_JobHudManualPriorityIdList; std::set< uint32_t > m_JournalCategoryIdList; std::set< uint32_t > m_JournalGenreIdList; std::set< uint32_t > m_JournalSectionIdList; + std::set< uint32_t > m_KnockbackIdList; + std::set< uint32_t > m_LegacyQuestIdList; std::set< uint32_t > m_LeveIdList; std::set< uint32_t > m_LeveAssignmentTypeIdList; std::set< uint32_t > m_LeveClientIdList; std::set< uint32_t > m_LevelIdList; std::set< uint32_t > m_LeveRewardItemIdList; std::set< uint32_t > m_LeveRewardItemGroupIdList; + std::set< uint32_t > m_LeveStringIdList; std::set< uint32_t > m_LeveVfxIdList; + std::set< uint32_t > m_LobbyIdList; std::set< uint32_t > m_LogFilterIdList; std::set< uint32_t > m_LogKindIdList; - std::set< uint32_t > m_LogKindCategoryTextIdList; std::set< uint32_t > m_LogMessageIdList; std::set< uint32_t > m_LotteryExchangeShopIdList; std::set< uint32_t > m_MacroIconIdList; @@ -6899,24 +9596,31 @@ struct ZoneSharedGroup std::set< uint32_t > m_MainCommandCategoryIdList; std::set< uint32_t > m_ManeuversArmorIdList; std::set< uint32_t > m_MapIdList; + std::set< uint32_t > m_MapConditionIdList; std::set< uint32_t > m_MapMarkerIdList; std::set< uint32_t > m_MapMarkerRegionIdList; std::set< uint32_t > m_MapSymbolIdList; std::set< uint32_t > m_MarkerIdList; - std::set< uint32_t > m_MasterpieceSupplyDutyIdList; - std::set< uint32_t > m_MasterpieceSupplyMultiplierIdList; std::set< uint32_t > m_MateriaIdList; + std::set< uint32_t > m_MateriaJoinRateIdList; + std::set< uint32_t > m_MateriaJoinRateGatherCraftIdList; + std::set< uint32_t > m_MateriaTomestoneRateIdList; std::set< uint32_t > m_MiniGameRAIdList; std::set< uint32_t > m_MinionRaceIdList; std::set< uint32_t > m_MinionRulesIdList; std::set< uint32_t > m_MinionSkillTypeIdList; + std::set< uint32_t > m_MobHuntOrderIdList; std::set< uint32_t > m_MobHuntOrderTypeIdList; + std::set< uint32_t > m_MobHuntRewardIdList; + std::set< uint32_t > m_MobHuntRewardCapIdList; std::set< uint32_t > m_MobHuntTargetIdList; std::set< uint32_t > m_ModelCharaIdList; std::set< uint32_t > m_ModelSkeletonIdList; std::set< uint32_t > m_ModelStateIdList; std::set< uint32_t > m_MonsterNoteIdList; std::set< uint32_t > m_MonsterNoteTargetIdList; + std::set< uint32_t > m_MotionTimelineIdList; + std::set< uint32_t > m_MotionTimelineBlendTableIdList; std::set< uint32_t > m_MountIdList; std::set< uint32_t > m_MountActionIdList; std::set< uint32_t > m_MountCustomizeIdList; @@ -6925,29 +9629,47 @@ struct ZoneSharedGroup std::set< uint32_t > m_MountTransientIdList; std::set< uint32_t > m_MoveTimelineIdList; std::set< uint32_t > m_MoveVfxIdList; + std::set< uint32_t > m_MovieStaffListIdList; + std::set< uint32_t > m_MovieSubtitleIdList; + std::set< uint32_t > m_MovieSubtitle500IdList; + std::set< uint32_t > m_MovieSubtitleVoyageIdList; + std::set< uint32_t > m_MYCTemporaryItemIdList; + std::set< uint32_t > m_MYCTemporaryItemUICategoryIdList; + std::set< uint32_t > m_MYCWarResultNotebookIdList; std::set< uint32_t > m_NotebookDivisionIdList; std::set< uint32_t > m_NotebookDivisionCategoryIdList; + std::set< uint32_t > m_NotoriousMonsterIdList; std::set< uint32_t > m_NpcEquipIdList; std::set< uint32_t > m_NpcYellIdList; std::set< uint32_t > m_OmenIdList; std::set< uint32_t > m_OnlineStatusIdList; + std::set< uint32_t > m_OpenContentIdList; + std::set< uint32_t > m_OpenContentCandidateNameIdList; std::set< uint32_t > m_OpeningIdList; std::set< uint32_t > m_OrchestrionIdList; std::set< uint32_t > m_OrchestrionCategoryIdList; std::set< uint32_t > m_OrchestrionPathIdList; std::set< uint32_t > m_OrchestrionUiparamIdList; + std::set< uint32_t > m_OrnamentIdList; std::set< uint32_t > m_ParamGrowIdList; std::set< uint32_t > m_PartyContentIdList; std::set< uint32_t > m_PartyContentCutsceneIdList; std::set< uint32_t > m_PartyContentTextDataIdList; + std::set< uint32_t > m_PatchMarkIdList; std::set< uint32_t > m_PerformIdList; + std::set< uint32_t > m_PerformGroupIdList; std::set< uint32_t > m_PerformTransientIdList; std::set< uint32_t > m_PetIdList; std::set< uint32_t > m_PetActionIdList; + std::set< uint32_t > m_PetMirageIdList; + std::set< uint32_t > m_PhysicsGroupIdList; + std::set< uint32_t > m_PhysicsWindIdList; std::set< uint32_t > m_PictureIdList; std::set< uint32_t > m_PlaceNameIdList; std::set< uint32_t > m_PlantPotFlowerSeedIdList; std::set< uint32_t > m_PreHandlerIdList; + std::set< uint32_t > m_PresetCameraIdList; + std::set< uint32_t > m_PresetCameraAdjustIdList; std::set< uint32_t > m_PublicContentIdList; std::set< uint32_t > m_PublicContentCutsceneIdList; std::set< uint32_t > m_PublicContentTextDataIdList; @@ -6957,9 +9679,19 @@ struct ZoneSharedGroup std::set< uint32_t > m_PvPSelectTraitIdList; std::set< uint32_t > m_PvPTraitIdList; std::set< uint32_t > m_QuestIdList; + std::set< uint32_t > m_QuestAcceptAdditionConditionIdList; std::set< uint32_t > m_QuestBattleIdList; + std::set< uint32_t > m_QuestChapterIdList; std::set< uint32_t > m_QuestClassJobRewardIdList; std::set< uint32_t > m_QuestClassJobSupplyIdList; + std::set< uint32_t > m_QuestDerivedClassIdList; + std::set< uint32_t > m_QuestEffectIdList; + std::set< uint32_t > m_QuestEffectDefineIdList; + std::set< uint32_t > m_QuestRedoIdList; + std::set< uint32_t > m_QuestRedoChapterUIIdList; + std::set< uint32_t > m_QuestRedoChapterUICategoryIdList; + std::set< uint32_t > m_QuestRedoChapterUITabIdList; + std::set< uint32_t > m_QuestRedoIncompChapterIdList; std::set< uint32_t > m_QuestRepeatFlagIdList; std::set< uint32_t > m_QuestRewardOtherIdList; std::set< uint32_t > m_QuickChatIdList; @@ -6973,6 +9705,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_RecastNavimeshIdList; std::set< uint32_t > m_RecipeIdList; std::set< uint32_t > m_RecipeLevelTableIdList; + std::set< uint32_t > m_RecipeLookupIdList; std::set< uint32_t > m_RecipeNotebookListIdList; std::set< uint32_t > m_RecommendContentsIdList; std::set< uint32_t > m_RelicIdList; @@ -6981,20 +9714,24 @@ struct ZoneSharedGroup std::set< uint32_t > m_RelicNoteIdList; std::set< uint32_t > m_RelicNoteCategoryIdList; std::set< uint32_t > m_ResidentIdList; + std::set< uint32_t > m_ResistanceWeaponAdjustIdList; + std::set< uint32_t > m_RetainerFortuneRewardRangeIdList; std::set< uint32_t > m_RetainerTaskIdList; std::set< uint32_t > m_RetainerTaskLvRangeIdList; std::set< uint32_t > m_RetainerTaskNormalIdList; std::set< uint32_t > m_RetainerTaskParameterIdList; std::set< uint32_t > m_RetainerTaskRandomIdList; + std::set< uint32_t > m_RideShootingIdList; + std::set< uint32_t > m_RideShootingTargetTypeIdList; + std::set< uint32_t > m_RideShootingTextDataIdList; std::set< uint32_t > m_RPParameterIdList; - std::set< uint32_t > m_SalvageIdList; + std::set< uint32_t > m_SatisfactionArbitrationIdList; std::set< uint32_t > m_SatisfactionNpcIdList; std::set< uint32_t > m_SatisfactionSupplyIdList; std::set< uint32_t > m_SatisfactionSupplyRewardIdList; std::set< uint32_t > m_ScenarioTreeIdList; std::set< uint32_t > m_ScenarioTreeTipsIdList; std::set< uint32_t > m_ScenarioTreeTipsClassQuestIdList; - std::set< uint32_t > m_ScenarioTreeTipsQuestIdList; std::set< uint32_t > m_ScenarioTypeIdList; std::set< uint32_t > m_ScreenImageIdList; std::set< uint32_t > m_SecretRecipeBookIdList; @@ -7002,6 +9739,8 @@ struct ZoneSharedGroup std::set< uint32_t > m_SkyIsland2MissionDetailIdList; std::set< uint32_t > m_SkyIsland2MissionTypeIdList; std::set< uint32_t > m_SkyIsland2RangeTypeIdList; + std::set< uint32_t > m_SnipeTalkIdList; + std::set< uint32_t > m_SnipeTalkNameIdList; std::set< uint32_t > m_SpearfishingItemIdList; std::set< uint32_t > m_SpearfishingNotebookIdList; std::set< uint32_t > m_SpearfishingRecordPageIdList; @@ -7009,16 +9748,21 @@ struct ZoneSharedGroup std::set< uint32_t > m_SpecialShopItemCategoryIdList; std::set< uint32_t > m_StainIdList; std::set< uint32_t > m_StainTransientIdList; + std::set< uint32_t > m_StanceChangeIdList; std::set< uint32_t > m_StatusIdList; std::set< uint32_t > m_StatusHitEffectIdList; std::set< uint32_t > m_StatusLoopVFXIdList; std::set< uint32_t > m_StoryIdList; std::set< uint32_t > m_SubmarineExplorationIdList; + std::set< uint32_t > m_SubmarineMapIdList; std::set< uint32_t > m_SubmarinePartIdList; std::set< uint32_t > m_SubmarineRankIdList; std::set< uint32_t > m_SwitchTalkIdList; + std::set< uint32_t > m_SwitchTalkVariationIdList; std::set< uint32_t > m_TerritoryTypeIdList; + std::set< uint32_t > m_TerritoryTypeTransientIdList; std::set< uint32_t > m_TextCommandIdList; + std::set< uint32_t > m_TextCommandParamIdList; std::set< uint32_t > m_TitleIdList; std::set< uint32_t > m_TomestonesIdList; std::set< uint32_t > m_TomestonesItemIdList; @@ -7030,6 +9774,7 @@ struct ZoneSharedGroup std::set< uint32_t > m_TransformationIdList; std::set< uint32_t > m_TreasureIdList; std::set< uint32_t > m_TreasureHuntRankIdList; + std::set< uint32_t > m_TreasureModelIdList; std::set< uint32_t > m_TreasureSpotIdList; std::set< uint32_t > m_TribeIdList; std::set< uint32_t > m_TripleTriadIdList; @@ -7038,21 +9783,27 @@ struct ZoneSharedGroup std::set< uint32_t > m_TripleTriadCardResidentIdList; std::set< uint32_t > m_TripleTriadCardTypeIdList; std::set< uint32_t > m_TripleTriadCompetitionIdList; + std::set< uint32_t > m_TripleTriadResidentIdList; std::set< uint32_t > m_TripleTriadRuleIdList; std::set< uint32_t > m_TutorialIdList; std::set< uint32_t > m_TutorialDPSIdList; std::set< uint32_t > m_TutorialHealerIdList; std::set< uint32_t > m_TutorialTankIdList; + std::set< uint32_t > m_UDS_EventIdList; + std::set< uint32_t > m_UDS_PropertyIdList; std::set< uint32_t > m_UIColorIdList; std::set< uint32_t > m_VaseFlowerIdList; std::set< uint32_t > m_VFXIdList; std::set< uint32_t > m_WarpIdList; std::set< uint32_t > m_WarpConditionIdList; std::set< uint32_t > m_WarpLogicIdList; + std::set< uint32_t > m_WeaponTimelineIdList; std::set< uint32_t > m_WeatherIdList; std::set< uint32_t > m_WeatherGroupIdList; std::set< uint32_t > m_WeatherRateIdList; std::set< uint32_t > m_WeatherReportReplaceIdList; + std::set< uint32_t > m_WebGuidanceIdList; + std::set< uint32_t > m_WebURLIdList; std::set< uint32_t > m_WeddingBGMIdList; std::set< uint32_t > m_WeeklyBingoOrderDataIdList; std::set< uint32_t > m_WeeklyBingoRewardDataIdList; @@ -7060,6 +9811,8 @@ struct ZoneSharedGroup std::set< uint32_t > m_WeeklyLotBonusIdList; std::set< uint32_t > m_WorldIdList; std::set< uint32_t > m_WorldDCGroupTypeIdList; + std::set< uint32_t > m_YardCatalogCategoryIdList; + std::set< uint32_t > m_YardCatalogItemListIdList; std::set< uint32_t > m_YKWIdList; std::set< uint32_t > m_ZoneSharedGroupIdList; @@ -7076,12 +9829,24 @@ const std::set< uint32_t >& getAchievementCategoryIdList() loadIdList( m_AchievementCategoryDat, m_AchievementCategoryIdList ); return m_AchievementCategoryIdList; } +const std::set< uint32_t >& getAchievementHideConditionIdList() +{ + if( m_AchievementHideConditionIdList.size() == 0 ) + loadIdList( m_AchievementHideConditionDat, m_AchievementHideConditionIdList ); + return m_AchievementHideConditionIdList; +} const std::set< uint32_t >& getAchievementKindIdList() { if( m_AchievementKindIdList.size() == 0 ) loadIdList( m_AchievementKindDat, m_AchievementKindIdList ); return m_AchievementKindIdList; } +const std::set< uint32_t >& getAchievementTargetIdList() +{ + if( m_AchievementTargetIdList.size() == 0 ) + loadIdList( m_AchievementTargetDat, m_AchievementTargetIdList ); + return m_AchievementTargetIdList; +} const std::set< uint32_t >& getActionIdList() { if( m_ActionIdList.size() == 0 ) @@ -7184,12 +9949,6 @@ const std::set< uint32_t >& getAddonIdList() loadIdList( m_AddonDat, m_AddonIdList ); return m_AddonIdList; } -const std::set< uint32_t >& getAddonHudIdList() -{ - if( m_AddonHudIdList.size() == 0 ) - loadIdList( m_AddonHudDat, m_AddonHudIdList ); - return m_AddonHudIdList; -} const std::set< uint32_t >& getAdventureIdList() { if( m_AdventureIdList.size() == 0 ) @@ -7262,6 +10021,12 @@ const std::set< uint32_t >& getAirshipExplorationPointIdList() loadIdList( m_AirshipExplorationPointDat, m_AirshipExplorationPointIdList ); return m_AirshipExplorationPointIdList; } +const std::set< uint32_t >& getAnimationLODIdList() +{ + if( m_AnimationLODIdList.size() == 0 ) + loadIdList( m_AnimationLODDat, m_AnimationLODIdList ); + return m_AnimationLODIdList; +} const std::set< uint32_t >& getAnimaWeapon5IdList() { if( m_AnimaWeapon5IdList.size() == 0 ) @@ -7358,6 +10123,18 @@ const std::set< uint32_t >& getAOZContentBriefingBNpcIdList() loadIdList( m_AOZContentBriefingBNpcDat, m_AOZContentBriefingBNpcIdList ); return m_AOZContentBriefingBNpcIdList; } +const std::set< uint32_t >& getAOZReportIdList() +{ + if( m_AOZReportIdList.size() == 0 ) + loadIdList( m_AOZReportDat, m_AOZReportIdList ); + return m_AOZReportIdList; +} +const std::set< uint32_t >& getAOZScoreIdList() +{ + if( m_AOZScoreIdList.size() == 0 ) + loadIdList( m_AOZScoreDat, m_AOZScoreIdList ); + return m_AOZScoreIdList; +} const std::set< uint32_t >& getAquariumFishIdList() { if( m_AquariumFishIdList.size() == 0 ) @@ -7388,6 +10165,12 @@ const std::set< uint32_t >& getBacklightColorIdList() loadIdList( m_BacklightColorDat, m_BacklightColorIdList ); return m_BacklightColorIdList; } +const std::set< uint32_t >& getBallistaIdList() +{ + if( m_BallistaIdList.size() == 0 ) + loadIdList( m_BallistaDat, m_BallistaIdList ); + return m_BallistaIdList; +} const std::set< uint32_t >& getBalloonIdList() { if( m_BalloonIdList.size() == 0 ) @@ -7406,6 +10189,12 @@ const std::set< uint32_t >& getBattleLeveIdList() loadIdList( m_BattleLeveDat, m_BattleLeveIdList ); return m_BattleLeveIdList; } +const std::set< uint32_t >& getBattleLeveRuleIdList() +{ + if( m_BattleLeveRuleIdList.size() == 0 ) + loadIdList( m_BattleLeveRuleDat, m_BattleLeveRuleIdList ); + return m_BattleLeveRuleIdList; +} const std::set< uint32_t >& getBeastRankBonusIdList() { if( m_BeastRankBonusIdList.size() == 0 ) @@ -7430,6 +10219,18 @@ const std::set< uint32_t >& getBehaviorIdList() loadIdList( m_BehaviorDat, m_BehaviorIdList ); return m_BehaviorIdList; } +const std::set< uint32_t >& getBehaviorPathIdList() +{ + if( m_BehaviorPathIdList.size() == 0 ) + loadIdList( m_BehaviorPathDat, m_BehaviorPathIdList ); + return m_BehaviorPathIdList; +} +const std::set< uint32_t >& getBenchmarkOverrideEquipmentIdList() +{ + if( m_BenchmarkOverrideEquipmentIdList.size() == 0 ) + loadIdList( m_BenchmarkOverrideEquipmentDat, m_BenchmarkOverrideEquipmentIdList ); + return m_BenchmarkOverrideEquipmentIdList; +} const std::set< uint32_t >& getBGMIdList() { if( m_BGMIdList.size() == 0 ) @@ -7442,6 +10243,18 @@ const std::set< uint32_t >& getBGMFadeIdList() loadIdList( m_BGMFadeDat, m_BGMFadeIdList ); return m_BGMFadeIdList; } +const std::set< uint32_t >& getBGMFadeTypeIdList() +{ + if( m_BGMFadeTypeIdList.size() == 0 ) + loadIdList( m_BGMFadeTypeDat, m_BGMFadeTypeIdList ); + return m_BGMFadeTypeIdList; +} +const std::set< uint32_t >& getBGMSceneIdList() +{ + if( m_BGMSceneIdList.size() == 0 ) + loadIdList( m_BGMSceneDat, m_BGMSceneIdList ); + return m_BGMSceneIdList; +} const std::set< uint32_t >& getBGMSituationIdList() { if( m_BGMSituationIdList.size() == 0 ) @@ -7490,6 +10303,12 @@ const std::set< uint32_t >& getBNpcPartsIdList() loadIdList( m_BNpcPartsDat, m_BNpcPartsIdList ); return m_BNpcPartsIdList; } +const std::set< uint32_t >& getBNpcStateIdList() +{ + if( m_BNpcStateIdList.size() == 0 ) + loadIdList( m_BNpcStateDat, m_BNpcStateIdList ); + return m_BNpcStateIdList; +} const std::set< uint32_t >& getBuddyIdList() { if( m_BuddyIdList.size() == 0 ) @@ -7544,12 +10363,36 @@ const std::set< uint32_t >& getCalendarIdList() loadIdList( m_CalendarDat, m_CalendarIdList ); return m_CalendarIdList; } +const std::set< uint32_t >& getCarryIdList() +{ + if( m_CarryIdList.size() == 0 ) + loadIdList( m_CarryDat, m_CarryIdList ); + return m_CarryIdList; +} +const std::set< uint32_t >& getChannelingIdList() +{ + if( m_ChannelingIdList.size() == 0 ) + loadIdList( m_ChannelingDat, m_ChannelingIdList ); + return m_ChannelingIdList; +} +const std::set< uint32_t >& getCharaMakeClassEquipIdList() +{ + if( m_CharaMakeClassEquipIdList.size() == 0 ) + loadIdList( m_CharaMakeClassEquipDat, m_CharaMakeClassEquipIdList ); + return m_CharaMakeClassEquipIdList; +} const std::set< uint32_t >& getCharaMakeCustomizeIdList() { if( m_CharaMakeCustomizeIdList.size() == 0 ) loadIdList( m_CharaMakeCustomizeDat, m_CharaMakeCustomizeIdList ); return m_CharaMakeCustomizeIdList; } +const std::set< uint32_t >& getCharaMakeNameIdList() +{ + if( m_CharaMakeNameIdList.size() == 0 ) + loadIdList( m_CharaMakeNameDat, m_CharaMakeNameIdList ); + return m_CharaMakeNameIdList; +} const std::set< uint32_t >& getCharaMakeTypeIdList() { if( m_CharaMakeTypeIdList.size() == 0 ) @@ -7622,6 +10465,12 @@ const std::set< uint32_t >& getChocoboTaxiStandIdList() loadIdList( m_ChocoboTaxiStandDat, m_ChocoboTaxiStandIdList ); return m_ChocoboTaxiStandIdList; } +const std::set< uint32_t >& getCircleActivityIdList() +{ + if( m_CircleActivityIdList.size() == 0 ) + loadIdList( m_CircleActivityDat, m_CircleActivityIdList ); + return m_CircleActivityIdList; +} const std::set< uint32_t >& getClassJobIdList() { if( m_ClassJobIdList.size() == 0 ) @@ -7634,6 +10483,42 @@ const std::set< uint32_t >& getClassJobCategoryIdList() loadIdList( m_ClassJobCategoryDat, m_ClassJobCategoryIdList ); return m_ClassJobCategoryIdList; } +const std::set< uint32_t >& getCollectablesShopIdList() +{ + if( m_CollectablesShopIdList.size() == 0 ) + loadIdList( m_CollectablesShopDat, m_CollectablesShopIdList ); + return m_CollectablesShopIdList; +} +const std::set< uint32_t >& getCollectablesShopItemIdList() +{ + if( m_CollectablesShopItemIdList.size() == 0 ) + loadIdList( m_CollectablesShopItemDat, m_CollectablesShopItemIdList ); + return m_CollectablesShopItemIdList; +} +const std::set< uint32_t >& getCollectablesShopItemGroupIdList() +{ + if( m_CollectablesShopItemGroupIdList.size() == 0 ) + loadIdList( m_CollectablesShopItemGroupDat, m_CollectablesShopItemGroupIdList ); + return m_CollectablesShopItemGroupIdList; +} +const std::set< uint32_t >& getCollectablesShopRefineIdList() +{ + if( m_CollectablesShopRefineIdList.size() == 0 ) + loadIdList( m_CollectablesShopRefineDat, m_CollectablesShopRefineIdList ); + return m_CollectablesShopRefineIdList; +} +const std::set< uint32_t >& getCollectablesShopRewardItemIdList() +{ + if( m_CollectablesShopRewardItemIdList.size() == 0 ) + loadIdList( m_CollectablesShopRewardItemDat, m_CollectablesShopRewardItemIdList ); + return m_CollectablesShopRewardItemIdList; +} +const std::set< uint32_t >& getCollectablesShopRewardScripIdList() +{ + if( m_CollectablesShopRewardScripIdList.size() == 0 ) + loadIdList( m_CollectablesShopRewardScripDat, m_CollectablesShopRewardScripIdList ); + return m_CollectablesShopRewardScripIdList; +} const std::set< uint32_t >& getCompanionIdList() { if( m_CompanionIdList.size() == 0 ) @@ -7730,6 +10615,24 @@ const std::set< uint32_t >& getCompleteJournalCategoryIdList() loadIdList( m_CompleteJournalCategoryDat, m_CompleteJournalCategoryIdList ); return m_CompleteJournalCategoryIdList; } +const std::set< uint32_t >& getCompletionIdList() +{ + if( m_CompletionIdList.size() == 0 ) + loadIdList( m_CompletionDat, m_CompletionIdList ); + return m_CompletionIdList; +} +const std::set< uint32_t >& getConditionIdList() +{ + if( m_ConditionIdList.size() == 0 ) + loadIdList( m_ConditionDat, m_ConditionIdList ); + return m_ConditionIdList; +} +const std::set< uint32_t >& getConfigKeyIdList() +{ + if( m_ConfigKeyIdList.size() == 0 ) + loadIdList( m_ConfigKeyDat, m_ConfigKeyIdList ); + return m_ConfigKeyIdList; +} const std::set< uint32_t >& getContentCloseCycleIdList() { if( m_ContentCloseCycleIdList.size() == 0 ) @@ -7778,6 +10681,12 @@ const std::set< uint32_t >& getContentNpcTalkIdList() loadIdList( m_ContentNpcTalkDat, m_ContentNpcTalkIdList ); return m_ContentNpcTalkIdList; } +const std::set< uint32_t >& getContentRandomSelectIdList() +{ + if( m_ContentRandomSelectIdList.size() == 0 ) + loadIdList( m_ContentRandomSelectDat, m_ContentRandomSelectIdList ); + return m_ContentRandomSelectIdList; +} const std::set< uint32_t >& getContentRouletteIdList() { if( m_ContentRouletteIdList.size() == 0 ) @@ -7802,6 +10711,18 @@ const std::set< uint32_t >& getContentsNoteIdList() loadIdList( m_ContentsNoteDat, m_ContentsNoteIdList ); return m_ContentsNoteIdList; } +const std::set< uint32_t >& getContentsTutorialIdList() +{ + if( m_ContentsTutorialIdList.size() == 0 ) + loadIdList( m_ContentsTutorialDat, m_ContentsTutorialIdList ); + return m_ContentsTutorialIdList; +} +const std::set< uint32_t >& getContentsTutorialPageIdList() +{ + if( m_ContentsTutorialPageIdList.size() == 0 ) + loadIdList( m_ContentsTutorialPageDat, m_ContentsTutorialPageIdList ); + return m_ContentsTutorialPageIdList; +} const std::set< uint32_t >& getContentTalkIdList() { if( m_ContentTalkIdList.size() == 0 ) @@ -7832,6 +10753,18 @@ const std::set< uint32_t >& getCraftLeveIdList() loadIdList( m_CraftLeveDat, m_CraftLeveIdList ); return m_CraftLeveIdList; } +const std::set< uint32_t >& getCraftLevelDifferenceIdList() +{ + if( m_CraftLevelDifferenceIdList.size() == 0 ) + loadIdList( m_CraftLevelDifferenceDat, m_CraftLevelDifferenceIdList ); + return m_CraftLevelDifferenceIdList; +} +const std::set< uint32_t >& getCraftLeveTalkIdList() +{ + if( m_CraftLeveTalkIdList.size() == 0 ) + loadIdList( m_CraftLeveTalkDat, m_CraftLeveTalkIdList ); + return m_CraftLeveTalkIdList; +} const std::set< uint32_t >& getCraftTypeIdList() { if( m_CraftTypeIdList.size() == 0 ) @@ -7868,24 +10801,12 @@ const std::set< uint32_t >& getCreditListTextIdList() loadIdList( m_CreditListTextDat, m_CreditListTextIdList ); return m_CreditListTextIdList; } -const std::set< uint32_t >& getCurrencyIdList() -{ - if( m_CurrencyIdList.size() == 0 ) - loadIdList( m_CurrencyDat, m_CurrencyIdList ); - return m_CurrencyIdList; -} const std::set< uint32_t >& getCustomTalkIdList() { if( m_CustomTalkIdList.size() == 0 ) loadIdList( m_CustomTalkDat, m_CustomTalkIdList ); return m_CustomTalkIdList; } -const std::set< uint32_t >& getCustomTalkDynamicIconIdList() -{ - if( m_CustomTalkDynamicIconIdList.size() == 0 ) - loadIdList( m_CustomTalkDynamicIconDat, m_CustomTalkDynamicIconIdList ); - return m_CustomTalkDynamicIconIdList; -} const std::set< uint32_t >& getCustomTalkNestHandlersIdList() { if( m_CustomTalkNestHandlersIdList.size() == 0 ) @@ -7898,18 +10819,72 @@ const std::set< uint32_t >& getCutsceneIdList() loadIdList( m_CutsceneDat, m_CutsceneIdList ); return m_CutsceneIdList; } +const std::set< uint32_t >& getCutSceneIncompQuestIdList() +{ + if( m_CutSceneIncompQuestIdList.size() == 0 ) + loadIdList( m_CutSceneIncompQuestDat, m_CutSceneIncompQuestIdList ); + return m_CutSceneIncompQuestIdList; +} +const std::set< uint32_t >& getCutsceneMotionIdList() +{ + if( m_CutsceneMotionIdList.size() == 0 ) + loadIdList( m_CutsceneMotionDat, m_CutsceneMotionIdList ); + return m_CutsceneMotionIdList; +} +const std::set< uint32_t >& getCutsceneWorkIndexIdList() +{ + if( m_CutsceneWorkIndexIdList.size() == 0 ) + loadIdList( m_CutsceneWorkIndexDat, m_CutsceneWorkIndexIdList ); + return m_CutsceneWorkIndexIdList; +} const std::set< uint32_t >& getCutScreenImageIdList() { if( m_CutScreenImageIdList.size() == 0 ) loadIdList( m_CutScreenImageDat, m_CutScreenImageIdList ); return m_CutScreenImageIdList; } +const std::set< uint32_t >& getCycleTimeIdList() +{ + if( m_CycleTimeIdList.size() == 0 ) + loadIdList( m_CycleTimeDat, m_CycleTimeIdList ); + return m_CycleTimeIdList; +} const std::set< uint32_t >& getDailySupplyItemIdList() { if( m_DailySupplyItemIdList.size() == 0 ) loadIdList( m_DailySupplyItemDat, m_DailySupplyItemIdList ); return m_DailySupplyItemIdList; } +const std::set< uint32_t >& getDawnContentIdList() +{ + if( m_DawnContentIdList.size() == 0 ) + loadIdList( m_DawnContentDat, m_DawnContentIdList ); + return m_DawnContentIdList; +} +const std::set< uint32_t >& getDawnGrowMemberIdList() +{ + if( m_DawnGrowMemberIdList.size() == 0 ) + loadIdList( m_DawnGrowMemberDat, m_DawnGrowMemberIdList ); + return m_DawnGrowMemberIdList; +} +const std::set< uint32_t >& getDawnMemberUIParamIdList() +{ + if( m_DawnMemberUIParamIdList.size() == 0 ) + loadIdList( m_DawnMemberUIParamDat, m_DawnMemberUIParamIdList ); + return m_DawnMemberUIParamIdList; +} +const std::set< uint32_t >& getDawnQuestAnnounceIdList() +{ + if( m_DawnQuestAnnounceIdList.size() == 0 ) + loadIdList( m_DawnQuestAnnounceDat, m_DawnQuestAnnounceIdList ); + return m_DawnQuestAnnounceIdList; +} +const std::set< uint32_t >& getDawnQuestMemberIdList() +{ + if( m_DawnQuestMemberIdList.size() == 0 ) + loadIdList( m_DawnQuestMemberDat, m_DawnQuestMemberIdList ); + return m_DawnQuestMemberIdList; +} const std::set< uint32_t >& getDeepDungeonIdList() { if( m_DeepDungeonIdList.size() == 0 ) @@ -7994,12 +10969,24 @@ const std::set< uint32_t >& getDeliveryQuestIdList() loadIdList( m_DeliveryQuestDat, m_DeliveryQuestIdList ); return m_DeliveryQuestIdList; } +const std::set< uint32_t >& getDescriptionIdList() +{ + if( m_DescriptionIdList.size() == 0 ) + loadIdList( m_DescriptionDat, m_DescriptionIdList ); + return m_DescriptionIdList; +} const std::set< uint32_t >& getDescriptionPageIdList() { if( m_DescriptionPageIdList.size() == 0 ) loadIdList( m_DescriptionPageDat, m_DescriptionPageIdList ); return m_DescriptionPageIdList; } +const std::set< uint32_t >& getDescriptionSectionIdList() +{ + if( m_DescriptionSectionIdList.size() == 0 ) + loadIdList( m_DescriptionSectionDat, m_DescriptionSectionIdList ); + return m_DescriptionSectionIdList; +} const std::set< uint32_t >& getDescriptionStringIdList() { if( m_DescriptionStringIdList.size() == 0 ) @@ -8042,6 +11029,30 @@ const std::set< uint32_t >& getDpsChallengeTransientIdList() loadIdList( m_DpsChallengeTransientDat, m_DpsChallengeTransientIdList ); return m_DpsChallengeTransientIdList; } +const std::set< uint32_t >& getDynamicEventIdList() +{ + if( m_DynamicEventIdList.size() == 0 ) + loadIdList( m_DynamicEventDat, m_DynamicEventIdList ); + return m_DynamicEventIdList; +} +const std::set< uint32_t >& getDynamicEventEnemyTypeIdList() +{ + if( m_DynamicEventEnemyTypeIdList.size() == 0 ) + loadIdList( m_DynamicEventEnemyTypeDat, m_DynamicEventEnemyTypeIdList ); + return m_DynamicEventEnemyTypeIdList; +} +const std::set< uint32_t >& getDynamicEventSingleBattleIdList() +{ + if( m_DynamicEventSingleBattleIdList.size() == 0 ) + loadIdList( m_DynamicEventSingleBattleDat, m_DynamicEventSingleBattleIdList ); + return m_DynamicEventSingleBattleIdList; +} +const std::set< uint32_t >& getDynamicEventTypeIdList() +{ + if( m_DynamicEventTypeIdList.size() == 0 ) + loadIdList( m_DynamicEventTypeDat, m_DynamicEventTypeIdList ); + return m_DynamicEventTypeIdList; +} const std::set< uint32_t >& getEmjAddonIdList() { if( m_EmjAddonIdList.size() == 0 ) @@ -8066,6 +11077,12 @@ const std::set< uint32_t >& getEmoteCategoryIdList() loadIdList( m_EmoteCategoryDat, m_EmoteCategoryIdList ); return m_EmoteCategoryIdList; } +const std::set< uint32_t >& getEmoteModeIdList() +{ + if( m_EmoteModeIdList.size() == 0 ) + loadIdList( m_EmoteModeDat, m_EmoteModeIdList ); + return m_EmoteModeIdList; +} const std::set< uint32_t >& getENpcBaseIdList() { if( m_ENpcBaseIdList.size() == 0 ) @@ -8168,6 +11185,12 @@ const std::set< uint32_t >& getEventActionIdList() loadIdList( m_EventActionDat, m_EventActionIdList ); return m_EventActionIdList; } +const std::set< uint32_t >& getEventCustomIconTypeIdList() +{ + if( m_EventCustomIconTypeIdList.size() == 0 ) + loadIdList( m_EventCustomIconTypeDat, m_EventCustomIconTypeIdList ); + return m_EventCustomIconTypeIdList; +} const std::set< uint32_t >& getEventIconPriorityIdList() { if( m_EventIconPriorityIdList.size() == 0 ) @@ -8204,6 +11227,18 @@ const std::set< uint32_t >& getEventItemTimelineIdList() loadIdList( m_EventItemTimelineDat, m_EventItemTimelineIdList ); return m_EventItemTimelineIdList; } +const std::set< uint32_t >& getEventSystemDefineIdList() +{ + if( m_EventSystemDefineIdList.size() == 0 ) + loadIdList( m_EventSystemDefineDat, m_EventSystemDefineIdList ); + return m_EventSystemDefineIdList; +} +const std::set< uint32_t >& getExportedGatheringPointIdList() +{ + if( m_ExportedGatheringPointIdList.size() == 0 ) + loadIdList( m_ExportedGatheringPointDat, m_ExportedGatheringPointIdList ); + return m_ExportedGatheringPointIdList; +} const std::set< uint32_t >& getExportedSGIdList() { if( m_ExportedSGIdList.size() == 0 ) @@ -8222,6 +11257,30 @@ const std::set< uint32_t >& getFateIdList() loadIdList( m_FateDat, m_FateIdList ); return m_FateIdList; } +const std::set< uint32_t >& getFateEventIdList() +{ + if( m_FateEventIdList.size() == 0 ) + loadIdList( m_FateEventDat, m_FateEventIdList ); + return m_FateEventIdList; +} +const std::set< uint32_t >& getFateModeIdList() +{ + if( m_FateModeIdList.size() == 0 ) + loadIdList( m_FateModeDat, m_FateModeIdList ); + return m_FateModeIdList; +} +const std::set< uint32_t >& getFateProgressUIIdList() +{ + if( m_FateProgressUIIdList.size() == 0 ) + loadIdList( m_FateProgressUIDat, m_FateProgressUIIdList ); + return m_FateProgressUIIdList; +} +const std::set< uint32_t >& getFateTokenTypeIdList() +{ + if( m_FateTokenTypeIdList.size() == 0 ) + loadIdList( m_FateTokenTypeDat, m_FateTokenTypeIdList ); + return m_FateTokenTypeIdList; +} const std::set< uint32_t >& getFCActivityIdList() { if( m_FCActivityIdList.size() == 0 ) @@ -8252,6 +11311,12 @@ const std::set< uint32_t >& getFCChestNameIdList() loadIdList( m_FCChestNameDat, m_FCChestNameIdList ); return m_FCChestNameIdList; } +const std::set< uint32_t >& getFCCrestSymbolIdList() +{ + if( m_FCCrestSymbolIdList.size() == 0 ) + loadIdList( m_FCCrestSymbolDat, m_FCCrestSymbolIdList ); + return m_FCCrestSymbolIdList; +} const std::set< uint32_t >& getFccShopIdList() { if( m_FccShopIdList.size() == 0 ) @@ -8270,6 +11335,12 @@ const std::set< uint32_t >& getFCProfileIdList() loadIdList( m_FCProfileDat, m_FCProfileIdList ); return m_FCProfileIdList; } +const std::set< uint32_t >& getFCRankIdList() +{ + if( m_FCRankIdList.size() == 0 ) + loadIdList( m_FCRankDat, m_FCRankIdList ); + return m_FCRankIdList; +} const std::set< uint32_t >& getFCReputationIdList() { if( m_FCReputationIdList.size() == 0 ) @@ -8330,6 +11401,18 @@ const std::set< uint32_t >& getFrontline04IdList() loadIdList( m_Frontline04Dat, m_Frontline04IdList ); return m_Frontline04IdList; } +const std::set< uint32_t >& getFurnitureCatalogCategoryIdList() +{ + if( m_FurnitureCatalogCategoryIdList.size() == 0 ) + loadIdList( m_FurnitureCatalogCategoryDat, m_FurnitureCatalogCategoryIdList ); + return m_FurnitureCatalogCategoryIdList; +} +const std::set< uint32_t >& getFurnitureCatalogItemListIdList() +{ + if( m_FurnitureCatalogItemListIdList.size() == 0 ) + loadIdList( m_FurnitureCatalogItemListDat, m_FurnitureCatalogItemListIdList ); + return m_FurnitureCatalogItemListIdList; +} const std::set< uint32_t >& getGardeningSeedIdList() { if( m_GardeningSeedIdList.size() == 0 ) @@ -8378,6 +11461,12 @@ const std::set< uint32_t >& getGatheringLeveRouteIdList() loadIdList( m_GatheringLeveRouteDat, m_GatheringLeveRouteIdList ); return m_GatheringLeveRouteIdList; } +const std::set< uint32_t >& getGatheringLeveRuleIdList() +{ + if( m_GatheringLeveRuleIdList.size() == 0 ) + loadIdList( m_GatheringLeveRuleDat, m_GatheringLeveRuleIdList ); + return m_GatheringLeveRuleIdList; +} const std::set< uint32_t >& getGatheringNotebookListIdList() { if( m_GatheringNotebookListIdList.size() == 0 ) @@ -8414,6 +11503,18 @@ const std::set< uint32_t >& getGatheringPointNameIdList() loadIdList( m_GatheringPointNameDat, m_GatheringPointNameIdList ); return m_GatheringPointNameIdList; } +const std::set< uint32_t >& getGatheringPointTransientIdList() +{ + if( m_GatheringPointTransientIdList.size() == 0 ) + loadIdList( m_GatheringPointTransientDat, m_GatheringPointTransientIdList ); + return m_GatheringPointTransientIdList; +} +const std::set< uint32_t >& getGatheringRarePopTimeTableIdList() +{ + if( m_GatheringRarePopTimeTableIdList.size() == 0 ) + loadIdList( m_GatheringRarePopTimeTableDat, m_GatheringRarePopTimeTableIdList ); + return m_GatheringRarePopTimeTableIdList; +} const std::set< uint32_t >& getGatheringSubCategoryIdList() { if( m_GatheringSubCategoryIdList.size() == 0 ) @@ -8432,6 +11533,12 @@ const std::set< uint32_t >& getGcArmyCaptureTacticsIdList() loadIdList( m_GcArmyCaptureTacticsDat, m_GcArmyCaptureTacticsIdList ); return m_GcArmyCaptureTacticsIdList; } +const std::set< uint32_t >& getGcArmyEquipPresetIdList() +{ + if( m_GcArmyEquipPresetIdList.size() == 0 ) + loadIdList( m_GcArmyEquipPresetDat, m_GcArmyEquipPresetIdList ); + return m_GcArmyEquipPresetIdList; +} const std::set< uint32_t >& getGcArmyExpeditionIdList() { if( m_GcArmyExpeditionIdList.size() == 0 ) @@ -8582,6 +11689,24 @@ const std::set< uint32_t >& getGilShopItemIdList() loadIdList( m_GilShopItemDat, m_GilShopItemIdList ); return m_GilShopItemIdList; } +const std::set< uint32_t >& getGimmickAccessorIdList() +{ + if( m_GimmickAccessorIdList.size() == 0 ) + loadIdList( m_GimmickAccessorDat, m_GimmickAccessorIdList ); + return m_GimmickAccessorIdList; +} +const std::set< uint32_t >& getGimmickJumpIdList() +{ + if( m_GimmickJumpIdList.size() == 0 ) + loadIdList( m_GimmickJumpDat, m_GimmickJumpIdList ); + return m_GimmickJumpIdList; +} +const std::set< uint32_t >& getGimmickRectIdList() +{ + if( m_GimmickRectIdList.size() == 0 ) + loadIdList( m_GimmickRectDat, m_GimmickRectIdList ); + return m_GimmickRectIdList; +} const std::set< uint32_t >& getGoldSaucerArcadeMachineIdList() { if( m_GoldSaucerArcadeMachineIdList.size() == 0 ) @@ -8606,12 +11731,54 @@ const std::set< uint32_t >& getGrandCompanyRankIdList() loadIdList( m_GrandCompanyRankDat, m_GrandCompanyRankIdList ); return m_GrandCompanyRankIdList; } +const std::set< uint32_t >& getGroupPoseFrameIdList() +{ + if( m_GroupPoseFrameIdList.size() == 0 ) + loadIdList( m_GroupPoseFrameDat, m_GroupPoseFrameIdList ); + return m_GroupPoseFrameIdList; +} +const std::set< uint32_t >& getGroupPoseStampIdList() +{ + if( m_GroupPoseStampIdList.size() == 0 ) + loadIdList( m_GroupPoseStampDat, m_GroupPoseStampIdList ); + return m_GroupPoseStampIdList; +} +const std::set< uint32_t >& getGroupPoseStampCategoryIdList() +{ + if( m_GroupPoseStampCategoryIdList.size() == 0 ) + loadIdList( m_GroupPoseStampCategoryDat, m_GroupPoseStampCategoryIdList ); + return m_GroupPoseStampCategoryIdList; +} const std::set< uint32_t >& getGuardianDeityIdList() { if( m_GuardianDeityIdList.size() == 0 ) loadIdList( m_GuardianDeityDat, m_GuardianDeityIdList ); return m_GuardianDeityIdList; } +const std::set< uint32_t >& getGuideIdList() +{ + if( m_GuideIdList.size() == 0 ) + loadIdList( m_GuideDat, m_GuideIdList ); + return m_GuideIdList; +} +const std::set< uint32_t >& getGuidePageIdList() +{ + if( m_GuidePageIdList.size() == 0 ) + loadIdList( m_GuidePageDat, m_GuidePageIdList ); + return m_GuidePageIdList; +} +const std::set< uint32_t >& getGuidePageStringIdList() +{ + if( m_GuidePageStringIdList.size() == 0 ) + loadIdList( m_GuidePageStringDat, m_GuidePageStringIdList ); + return m_GuidePageStringIdList; +} +const std::set< uint32_t >& getGuideTitleIdList() +{ + if( m_GuideTitleIdList.size() == 0 ) + loadIdList( m_GuideTitleDat, m_GuideTitleIdList ); + return m_GuideTitleIdList; +} const std::set< uint32_t >& getGuildleveAssignmentIdList() { if( m_GuildleveAssignmentIdList.size() == 0 ) @@ -8624,6 +11791,12 @@ const std::set< uint32_t >& getGuildleveAssignmentCategoryIdList() loadIdList( m_GuildleveAssignmentCategoryDat, m_GuildleveAssignmentCategoryIdList ); return m_GuildleveAssignmentCategoryIdList; } +const std::set< uint32_t >& getGuildleveAssignmentTalkIdList() +{ + if( m_GuildleveAssignmentTalkIdList.size() == 0 ) + loadIdList( m_GuildleveAssignmentTalkDat, m_GuildleveAssignmentTalkIdList ); + return m_GuildleveAssignmentTalkIdList; +} const std::set< uint32_t >& getGuildOrderIdList() { if( m_GuildOrderIdList.size() == 0 ) @@ -8750,6 +11923,174 @@ const std::set< uint32_t >& getHowToPageIdList() loadIdList( m_HowToPageDat, m_HowToPageIdList ); return m_HowToPageIdList; } +const std::set< uint32_t >& getHugeCraftworksNpcIdList() +{ + if( m_HugeCraftworksNpcIdList.size() == 0 ) + loadIdList( m_HugeCraftworksNpcDat, m_HugeCraftworksNpcIdList ); + return m_HugeCraftworksNpcIdList; +} +const std::set< uint32_t >& getHugeCraftworksRankIdList() +{ + if( m_HugeCraftworksRankIdList.size() == 0 ) + loadIdList( m_HugeCraftworksRankDat, m_HugeCraftworksRankIdList ); + return m_HugeCraftworksRankIdList; +} +const std::set< uint32_t >& getHWDAnnounceIdList() +{ + if( m_HWDAnnounceIdList.size() == 0 ) + loadIdList( m_HWDAnnounceDat, m_HWDAnnounceIdList ); + return m_HWDAnnounceIdList; +} +const std::set< uint32_t >& getHWDCrafterSupplyIdList() +{ + if( m_HWDCrafterSupplyIdList.size() == 0 ) + loadIdList( m_HWDCrafterSupplyDat, m_HWDCrafterSupplyIdList ); + return m_HWDCrafterSupplyIdList; +} +const std::set< uint32_t >& getHWDCrafterSupplyRewardIdList() +{ + if( m_HWDCrafterSupplyRewardIdList.size() == 0 ) + loadIdList( m_HWDCrafterSupplyRewardDat, m_HWDCrafterSupplyRewardIdList ); + return m_HWDCrafterSupplyRewardIdList; +} +const std::set< uint32_t >& getHWDCrafterSupplyTermIdList() +{ + if( m_HWDCrafterSupplyTermIdList.size() == 0 ) + loadIdList( m_HWDCrafterSupplyTermDat, m_HWDCrafterSupplyTermIdList ); + return m_HWDCrafterSupplyTermIdList; +} +const std::set< uint32_t >& getHWDDevLayerControlIdList() +{ + if( m_HWDDevLayerControlIdList.size() == 0 ) + loadIdList( m_HWDDevLayerControlDat, m_HWDDevLayerControlIdList ); + return m_HWDDevLayerControlIdList; +} +const std::set< uint32_t >& getHWDDevLevelUIIdList() +{ + if( m_HWDDevLevelUIIdList.size() == 0 ) + loadIdList( m_HWDDevLevelUIDat, m_HWDDevLevelUIIdList ); + return m_HWDDevLevelUIIdList; +} +const std::set< uint32_t >& getHWDDevLivelyIdList() +{ + if( m_HWDDevLivelyIdList.size() == 0 ) + loadIdList( m_HWDDevLivelyDat, m_HWDDevLivelyIdList ); + return m_HWDDevLivelyIdList; +} +const std::set< uint32_t >& getHWDDevProgressIdList() +{ + if( m_HWDDevProgressIdList.size() == 0 ) + loadIdList( m_HWDDevProgressDat, m_HWDDevProgressIdList ); + return m_HWDDevProgressIdList; +} +const std::set< uint32_t >& getHWDGathereInspectTermIdList() +{ + if( m_HWDGathereInspectTermIdList.size() == 0 ) + loadIdList( m_HWDGathereInspectTermDat, m_HWDGathereInspectTermIdList ); + return m_HWDGathereInspectTermIdList; +} +const std::set< uint32_t >& getHWDGathererInspectionIdList() +{ + if( m_HWDGathererInspectionIdList.size() == 0 ) + loadIdList( m_HWDGathererInspectionDat, m_HWDGathererInspectionIdList ); + return m_HWDGathererInspectionIdList; +} +const std::set< uint32_t >& getHWDGathererInspectionRewardIdList() +{ + if( m_HWDGathererInspectionRewardIdList.size() == 0 ) + loadIdList( m_HWDGathererInspectionRewardDat, m_HWDGathererInspectionRewardIdList ); + return m_HWDGathererInspectionRewardIdList; +} +const std::set< uint32_t >& getHWDInfoBoardArticleIdList() +{ + if( m_HWDInfoBoardArticleIdList.size() == 0 ) + loadIdList( m_HWDInfoBoardArticleDat, m_HWDInfoBoardArticleIdList ); + return m_HWDInfoBoardArticleIdList; +} +const std::set< uint32_t >& getHWDInfoBoardArticleTransientIdList() +{ + if( m_HWDInfoBoardArticleTransientIdList.size() == 0 ) + loadIdList( m_HWDInfoBoardArticleTransientDat, m_HWDInfoBoardArticleTransientIdList ); + return m_HWDInfoBoardArticleTransientIdList; +} +const std::set< uint32_t >& getHWDInfoBoardArticleTypeIdList() +{ + if( m_HWDInfoBoardArticleTypeIdList.size() == 0 ) + loadIdList( m_HWDInfoBoardArticleTypeDat, m_HWDInfoBoardArticleTypeIdList ); + return m_HWDInfoBoardArticleTypeIdList; +} +const std::set< uint32_t >& getHWDLevelChangeDeceptionIdList() +{ + if( m_HWDLevelChangeDeceptionIdList.size() == 0 ) + loadIdList( m_HWDLevelChangeDeceptionDat, m_HWDLevelChangeDeceptionIdList ); + return m_HWDLevelChangeDeceptionIdList; +} +const std::set< uint32_t >& getHWDSharedGroupIdList() +{ + if( m_HWDSharedGroupIdList.size() == 0 ) + loadIdList( m_HWDSharedGroupDat, m_HWDSharedGroupIdList ); + return m_HWDSharedGroupIdList; +} +const std::set< uint32_t >& getHWDSharedGroupControlParamIdList() +{ + if( m_HWDSharedGroupControlParamIdList.size() == 0 ) + loadIdList( m_HWDSharedGroupControlParamDat, m_HWDSharedGroupControlParamIdList ); + return m_HWDSharedGroupControlParamIdList; +} +const std::set< uint32_t >& getIKDContentBonusIdList() +{ + if( m_IKDContentBonusIdList.size() == 0 ) + loadIdList( m_IKDContentBonusDat, m_IKDContentBonusIdList ); + return m_IKDContentBonusIdList; +} +const std::set< uint32_t >& getIKDFishParamIdList() +{ + if( m_IKDFishParamIdList.size() == 0 ) + loadIdList( m_IKDFishParamDat, m_IKDFishParamIdList ); + return m_IKDFishParamIdList; +} +const std::set< uint32_t >& getIKDRouteIdList() +{ + if( m_IKDRouteIdList.size() == 0 ) + loadIdList( m_IKDRouteDat, m_IKDRouteIdList ); + return m_IKDRouteIdList; +} +const std::set< uint32_t >& getIKDRouteTableIdList() +{ + if( m_IKDRouteTableIdList.size() == 0 ) + loadIdList( m_IKDRouteTableDat, m_IKDRouteTableIdList ); + return m_IKDRouteTableIdList; +} +const std::set< uint32_t >& getIKDSpotIdList() +{ + if( m_IKDSpotIdList.size() == 0 ) + loadIdList( m_IKDSpotDat, m_IKDSpotIdList ); + return m_IKDSpotIdList; +} +const std::set< uint32_t >& getInclusionShopIdList() +{ + if( m_InclusionShopIdList.size() == 0 ) + loadIdList( m_InclusionShopDat, m_InclusionShopIdList ); + return m_InclusionShopIdList; +} +const std::set< uint32_t >& getInclusionShopCategoryIdList() +{ + if( m_InclusionShopCategoryIdList.size() == 0 ) + loadIdList( m_InclusionShopCategoryDat, m_InclusionShopCategoryIdList ); + return m_InclusionShopCategoryIdList; +} +const std::set< uint32_t >& getInclusionShopSeriesIdList() +{ + if( m_InclusionShopSeriesIdList.size() == 0 ) + loadIdList( m_InclusionShopSeriesDat, m_InclusionShopSeriesIdList ); + return m_InclusionShopSeriesIdList; +} +const std::set< uint32_t >& getIndividualWeatherIdList() +{ + if( m_IndividualWeatherIdList.size() == 0 ) + loadIdList( m_IndividualWeatherDat, m_IndividualWeatherIdList ); + return m_IndividualWeatherIdList; +} const std::set< uint32_t >& getInstanceContentIdList() { if( m_InstanceContentIdList.size() == 0 ) @@ -8792,6 +12133,18 @@ const std::set< uint32_t >& getItemActionIdList() loadIdList( m_ItemActionDat, m_ItemActionIdList ); return m_ItemActionIdList; } +const std::set< uint32_t >& getItemActionTelepoIdList() +{ + if( m_ItemActionTelepoIdList.size() == 0 ) + loadIdList( m_ItemActionTelepoDat, m_ItemActionTelepoIdList ); + return m_ItemActionTelepoIdList; +} +const std::set< uint32_t >& getItemBarterCheckIdList() +{ + if( m_ItemBarterCheckIdList.size() == 0 ) + loadIdList( m_ItemBarterCheckDat, m_ItemBarterCheckIdList ); + return m_ItemBarterCheckIdList; +} const std::set< uint32_t >& getItemFoodIdList() { if( m_ItemFoodIdList.size() == 0 ) @@ -8816,6 +12169,12 @@ const std::set< uint32_t >& getItemSeriesIdList() loadIdList( m_ItemSeriesDat, m_ItemSeriesIdList ); return m_ItemSeriesIdList; } +const std::set< uint32_t >& getItemSortCategoryIdList() +{ + if( m_ItemSortCategoryIdList.size() == 0 ) + loadIdList( m_ItemSortCategoryDat, m_ItemSortCategoryIdList ); + return m_ItemSortCategoryIdList; +} const std::set< uint32_t >& getItemSpecialBonusIdList() { if( m_ItemSpecialBonusIdList.size() == 0 ) @@ -8828,6 +12187,24 @@ const std::set< uint32_t >& getItemUICategoryIdList() loadIdList( m_ItemUICategoryDat, m_ItemUICategoryIdList ); return m_ItemUICategoryIdList; } +const std::set< uint32_t >& getJingleIdList() +{ + if( m_JingleIdList.size() == 0 ) + loadIdList( m_JingleDat, m_JingleIdList ); + return m_JingleIdList; +} +const std::set< uint32_t >& getJobHudManualIdList() +{ + if( m_JobHudManualIdList.size() == 0 ) + loadIdList( m_JobHudManualDat, m_JobHudManualIdList ); + return m_JobHudManualIdList; +} +const std::set< uint32_t >& getJobHudManualPriorityIdList() +{ + if( m_JobHudManualPriorityIdList.size() == 0 ) + loadIdList( m_JobHudManualPriorityDat, m_JobHudManualPriorityIdList ); + return m_JobHudManualPriorityIdList; +} const std::set< uint32_t >& getJournalCategoryIdList() { if( m_JournalCategoryIdList.size() == 0 ) @@ -8846,6 +12223,18 @@ const std::set< uint32_t >& getJournalSectionIdList() loadIdList( m_JournalSectionDat, m_JournalSectionIdList ); return m_JournalSectionIdList; } +const std::set< uint32_t >& getKnockbackIdList() +{ + if( m_KnockbackIdList.size() == 0 ) + loadIdList( m_KnockbackDat, m_KnockbackIdList ); + return m_KnockbackIdList; +} +const std::set< uint32_t >& getLegacyQuestIdList() +{ + if( m_LegacyQuestIdList.size() == 0 ) + loadIdList( m_LegacyQuestDat, m_LegacyQuestIdList ); + return m_LegacyQuestIdList; +} const std::set< uint32_t >& getLeveIdList() { if( m_LeveIdList.size() == 0 ) @@ -8882,12 +12271,24 @@ const std::set< uint32_t >& getLeveRewardItemGroupIdList() loadIdList( m_LeveRewardItemGroupDat, m_LeveRewardItemGroupIdList ); return m_LeveRewardItemGroupIdList; } +const std::set< uint32_t >& getLeveStringIdList() +{ + if( m_LeveStringIdList.size() == 0 ) + loadIdList( m_LeveStringDat, m_LeveStringIdList ); + return m_LeveStringIdList; +} const std::set< uint32_t >& getLeveVfxIdList() { if( m_LeveVfxIdList.size() == 0 ) loadIdList( m_LeveVfxDat, m_LeveVfxIdList ); return m_LeveVfxIdList; } +const std::set< uint32_t >& getLobbyIdList() +{ + if( m_LobbyIdList.size() == 0 ) + loadIdList( m_LobbyDat, m_LobbyIdList ); + return m_LobbyIdList; +} const std::set< uint32_t >& getLogFilterIdList() { if( m_LogFilterIdList.size() == 0 ) @@ -8900,12 +12301,6 @@ const std::set< uint32_t >& getLogKindIdList() loadIdList( m_LogKindDat, m_LogKindIdList ); return m_LogKindIdList; } -const std::set< uint32_t >& getLogKindCategoryTextIdList() -{ - if( m_LogKindCategoryTextIdList.size() == 0 ) - loadIdList( m_LogKindCategoryTextDat, m_LogKindCategoryTextIdList ); - return m_LogKindCategoryTextIdList; -} const std::set< uint32_t >& getLogMessageIdList() { if( m_LogMessageIdList.size() == 0 ) @@ -8954,6 +12349,12 @@ const std::set< uint32_t >& getMapIdList() loadIdList( m_MapDat, m_MapIdList ); return m_MapIdList; } +const std::set< uint32_t >& getMapConditionIdList() +{ + if( m_MapConditionIdList.size() == 0 ) + loadIdList( m_MapConditionDat, m_MapConditionIdList ); + return m_MapConditionIdList; +} const std::set< uint32_t >& getMapMarkerIdList() { if( m_MapMarkerIdList.size() == 0 ) @@ -8978,24 +12379,30 @@ const std::set< uint32_t >& getMarkerIdList() loadIdList( m_MarkerDat, m_MarkerIdList ); return m_MarkerIdList; } -const std::set< uint32_t >& getMasterpieceSupplyDutyIdList() -{ - if( m_MasterpieceSupplyDutyIdList.size() == 0 ) - loadIdList( m_MasterpieceSupplyDutyDat, m_MasterpieceSupplyDutyIdList ); - return m_MasterpieceSupplyDutyIdList; -} -const std::set< uint32_t >& getMasterpieceSupplyMultiplierIdList() -{ - if( m_MasterpieceSupplyMultiplierIdList.size() == 0 ) - loadIdList( m_MasterpieceSupplyMultiplierDat, m_MasterpieceSupplyMultiplierIdList ); - return m_MasterpieceSupplyMultiplierIdList; -} const std::set< uint32_t >& getMateriaIdList() { if( m_MateriaIdList.size() == 0 ) loadIdList( m_MateriaDat, m_MateriaIdList ); return m_MateriaIdList; } +const std::set< uint32_t >& getMateriaJoinRateIdList() +{ + if( m_MateriaJoinRateIdList.size() == 0 ) + loadIdList( m_MateriaJoinRateDat, m_MateriaJoinRateIdList ); + return m_MateriaJoinRateIdList; +} +const std::set< uint32_t >& getMateriaJoinRateGatherCraftIdList() +{ + if( m_MateriaJoinRateGatherCraftIdList.size() == 0 ) + loadIdList( m_MateriaJoinRateGatherCraftDat, m_MateriaJoinRateGatherCraftIdList ); + return m_MateriaJoinRateGatherCraftIdList; +} +const std::set< uint32_t >& getMateriaTomestoneRateIdList() +{ + if( m_MateriaTomestoneRateIdList.size() == 0 ) + loadIdList( m_MateriaTomestoneRateDat, m_MateriaTomestoneRateIdList ); + return m_MateriaTomestoneRateIdList; +} const std::set< uint32_t >& getMiniGameRAIdList() { if( m_MiniGameRAIdList.size() == 0 ) @@ -9020,12 +12427,30 @@ const std::set< uint32_t >& getMinionSkillTypeIdList() loadIdList( m_MinionSkillTypeDat, m_MinionSkillTypeIdList ); return m_MinionSkillTypeIdList; } +const std::set< uint32_t >& getMobHuntOrderIdList() +{ + if( m_MobHuntOrderIdList.size() == 0 ) + loadIdList( m_MobHuntOrderDat, m_MobHuntOrderIdList ); + return m_MobHuntOrderIdList; +} const std::set< uint32_t >& getMobHuntOrderTypeIdList() { if( m_MobHuntOrderTypeIdList.size() == 0 ) loadIdList( m_MobHuntOrderTypeDat, m_MobHuntOrderTypeIdList ); return m_MobHuntOrderTypeIdList; } +const std::set< uint32_t >& getMobHuntRewardIdList() +{ + if( m_MobHuntRewardIdList.size() == 0 ) + loadIdList( m_MobHuntRewardDat, m_MobHuntRewardIdList ); + return m_MobHuntRewardIdList; +} +const std::set< uint32_t >& getMobHuntRewardCapIdList() +{ + if( m_MobHuntRewardCapIdList.size() == 0 ) + loadIdList( m_MobHuntRewardCapDat, m_MobHuntRewardCapIdList ); + return m_MobHuntRewardCapIdList; +} const std::set< uint32_t >& getMobHuntTargetIdList() { if( m_MobHuntTargetIdList.size() == 0 ) @@ -9062,6 +12487,18 @@ const std::set< uint32_t >& getMonsterNoteTargetIdList() loadIdList( m_MonsterNoteTargetDat, m_MonsterNoteTargetIdList ); return m_MonsterNoteTargetIdList; } +const std::set< uint32_t >& getMotionTimelineIdList() +{ + if( m_MotionTimelineIdList.size() == 0 ) + loadIdList( m_MotionTimelineDat, m_MotionTimelineIdList ); + return m_MotionTimelineIdList; +} +const std::set< uint32_t >& getMotionTimelineBlendTableIdList() +{ + if( m_MotionTimelineBlendTableIdList.size() == 0 ) + loadIdList( m_MotionTimelineBlendTableDat, m_MotionTimelineBlendTableIdList ); + return m_MotionTimelineBlendTableIdList; +} const std::set< uint32_t >& getMountIdList() { if( m_MountIdList.size() == 0 ) @@ -9110,6 +12547,48 @@ const std::set< uint32_t >& getMoveVfxIdList() loadIdList( m_MoveVfxDat, m_MoveVfxIdList ); return m_MoveVfxIdList; } +const std::set< uint32_t >& getMovieStaffListIdList() +{ + if( m_MovieStaffListIdList.size() == 0 ) + loadIdList( m_MovieStaffListDat, m_MovieStaffListIdList ); + return m_MovieStaffListIdList; +} +const std::set< uint32_t >& getMovieSubtitleIdList() +{ + if( m_MovieSubtitleIdList.size() == 0 ) + loadIdList( m_MovieSubtitleDat, m_MovieSubtitleIdList ); + return m_MovieSubtitleIdList; +} +const std::set< uint32_t >& getMovieSubtitle500IdList() +{ + if( m_MovieSubtitle500IdList.size() == 0 ) + loadIdList( m_MovieSubtitle500Dat, m_MovieSubtitle500IdList ); + return m_MovieSubtitle500IdList; +} +const std::set< uint32_t >& getMovieSubtitleVoyageIdList() +{ + if( m_MovieSubtitleVoyageIdList.size() == 0 ) + loadIdList( m_MovieSubtitleVoyageDat, m_MovieSubtitleVoyageIdList ); + return m_MovieSubtitleVoyageIdList; +} +const std::set< uint32_t >& getMYCTemporaryItemIdList() +{ + if( m_MYCTemporaryItemIdList.size() == 0 ) + loadIdList( m_MYCTemporaryItemDat, m_MYCTemporaryItemIdList ); + return m_MYCTemporaryItemIdList; +} +const std::set< uint32_t >& getMYCTemporaryItemUICategoryIdList() +{ + if( m_MYCTemporaryItemUICategoryIdList.size() == 0 ) + loadIdList( m_MYCTemporaryItemUICategoryDat, m_MYCTemporaryItemUICategoryIdList ); + return m_MYCTemporaryItemUICategoryIdList; +} +const std::set< uint32_t >& getMYCWarResultNotebookIdList() +{ + if( m_MYCWarResultNotebookIdList.size() == 0 ) + loadIdList( m_MYCWarResultNotebookDat, m_MYCWarResultNotebookIdList ); + return m_MYCWarResultNotebookIdList; +} const std::set< uint32_t >& getNotebookDivisionIdList() { if( m_NotebookDivisionIdList.size() == 0 ) @@ -9122,6 +12601,12 @@ const std::set< uint32_t >& getNotebookDivisionCategoryIdList() loadIdList( m_NotebookDivisionCategoryDat, m_NotebookDivisionCategoryIdList ); return m_NotebookDivisionCategoryIdList; } +const std::set< uint32_t >& getNotoriousMonsterIdList() +{ + if( m_NotoriousMonsterIdList.size() == 0 ) + loadIdList( m_NotoriousMonsterDat, m_NotoriousMonsterIdList ); + return m_NotoriousMonsterIdList; +} const std::set< uint32_t >& getNpcEquipIdList() { if( m_NpcEquipIdList.size() == 0 ) @@ -9146,6 +12631,18 @@ const std::set< uint32_t >& getOnlineStatusIdList() loadIdList( m_OnlineStatusDat, m_OnlineStatusIdList ); return m_OnlineStatusIdList; } +const std::set< uint32_t >& getOpenContentIdList() +{ + if( m_OpenContentIdList.size() == 0 ) + loadIdList( m_OpenContentDat, m_OpenContentIdList ); + return m_OpenContentIdList; +} +const std::set< uint32_t >& getOpenContentCandidateNameIdList() +{ + if( m_OpenContentCandidateNameIdList.size() == 0 ) + loadIdList( m_OpenContentCandidateNameDat, m_OpenContentCandidateNameIdList ); + return m_OpenContentCandidateNameIdList; +} const std::set< uint32_t >& getOpeningIdList() { if( m_OpeningIdList.size() == 0 ) @@ -9176,6 +12673,12 @@ const std::set< uint32_t >& getOrchestrionUiparamIdList() loadIdList( m_OrchestrionUiparamDat, m_OrchestrionUiparamIdList ); return m_OrchestrionUiparamIdList; } +const std::set< uint32_t >& getOrnamentIdList() +{ + if( m_OrnamentIdList.size() == 0 ) + loadIdList( m_OrnamentDat, m_OrnamentIdList ); + return m_OrnamentIdList; +} const std::set< uint32_t >& getParamGrowIdList() { if( m_ParamGrowIdList.size() == 0 ) @@ -9200,12 +12703,24 @@ const std::set< uint32_t >& getPartyContentTextDataIdList() loadIdList( m_PartyContentTextDataDat, m_PartyContentTextDataIdList ); return m_PartyContentTextDataIdList; } +const std::set< uint32_t >& getPatchMarkIdList() +{ + if( m_PatchMarkIdList.size() == 0 ) + loadIdList( m_PatchMarkDat, m_PatchMarkIdList ); + return m_PatchMarkIdList; +} const std::set< uint32_t >& getPerformIdList() { if( m_PerformIdList.size() == 0 ) loadIdList( m_PerformDat, m_PerformIdList ); return m_PerformIdList; } +const std::set< uint32_t >& getPerformGroupIdList() +{ + if( m_PerformGroupIdList.size() == 0 ) + loadIdList( m_PerformGroupDat, m_PerformGroupIdList ); + return m_PerformGroupIdList; +} const std::set< uint32_t >& getPerformTransientIdList() { if( m_PerformTransientIdList.size() == 0 ) @@ -9224,6 +12739,24 @@ const std::set< uint32_t >& getPetActionIdList() loadIdList( m_PetActionDat, m_PetActionIdList ); return m_PetActionIdList; } +const std::set< uint32_t >& getPetMirageIdList() +{ + if( m_PetMirageIdList.size() == 0 ) + loadIdList( m_PetMirageDat, m_PetMirageIdList ); + return m_PetMirageIdList; +} +const std::set< uint32_t >& getPhysicsGroupIdList() +{ + if( m_PhysicsGroupIdList.size() == 0 ) + loadIdList( m_PhysicsGroupDat, m_PhysicsGroupIdList ); + return m_PhysicsGroupIdList; +} +const std::set< uint32_t >& getPhysicsWindIdList() +{ + if( m_PhysicsWindIdList.size() == 0 ) + loadIdList( m_PhysicsWindDat, m_PhysicsWindIdList ); + return m_PhysicsWindIdList; +} const std::set< uint32_t >& getPictureIdList() { if( m_PictureIdList.size() == 0 ) @@ -9248,6 +12781,18 @@ const std::set< uint32_t >& getPreHandlerIdList() loadIdList( m_PreHandlerDat, m_PreHandlerIdList ); return m_PreHandlerIdList; } +const std::set< uint32_t >& getPresetCameraIdList() +{ + if( m_PresetCameraIdList.size() == 0 ) + loadIdList( m_PresetCameraDat, m_PresetCameraIdList ); + return m_PresetCameraIdList; +} +const std::set< uint32_t >& getPresetCameraAdjustIdList() +{ + if( m_PresetCameraAdjustIdList.size() == 0 ) + loadIdList( m_PresetCameraAdjustDat, m_PresetCameraAdjustIdList ); + return m_PresetCameraAdjustIdList; +} const std::set< uint32_t >& getPublicContentIdList() { if( m_PublicContentIdList.size() == 0 ) @@ -9302,12 +12847,24 @@ const std::set< uint32_t >& getQuestIdList() loadIdList( m_QuestDat, m_QuestIdList ); return m_QuestIdList; } +const std::set< uint32_t >& getQuestAcceptAdditionConditionIdList() +{ + if( m_QuestAcceptAdditionConditionIdList.size() == 0 ) + loadIdList( m_QuestAcceptAdditionConditionDat, m_QuestAcceptAdditionConditionIdList ); + return m_QuestAcceptAdditionConditionIdList; +} const std::set< uint32_t >& getQuestBattleIdList() { if( m_QuestBattleIdList.size() == 0 ) loadIdList( m_QuestBattleDat, m_QuestBattleIdList ); return m_QuestBattleIdList; } +const std::set< uint32_t >& getQuestChapterIdList() +{ + if( m_QuestChapterIdList.size() == 0 ) + loadIdList( m_QuestChapterDat, m_QuestChapterIdList ); + return m_QuestChapterIdList; +} const std::set< uint32_t >& getQuestClassJobRewardIdList() { if( m_QuestClassJobRewardIdList.size() == 0 ) @@ -9320,6 +12877,54 @@ const std::set< uint32_t >& getQuestClassJobSupplyIdList() loadIdList( m_QuestClassJobSupplyDat, m_QuestClassJobSupplyIdList ); return m_QuestClassJobSupplyIdList; } +const std::set< uint32_t >& getQuestDerivedClassIdList() +{ + if( m_QuestDerivedClassIdList.size() == 0 ) + loadIdList( m_QuestDerivedClassDat, m_QuestDerivedClassIdList ); + return m_QuestDerivedClassIdList; +} +const std::set< uint32_t >& getQuestEffectIdList() +{ + if( m_QuestEffectIdList.size() == 0 ) + loadIdList( m_QuestEffectDat, m_QuestEffectIdList ); + return m_QuestEffectIdList; +} +const std::set< uint32_t >& getQuestEffectDefineIdList() +{ + if( m_QuestEffectDefineIdList.size() == 0 ) + loadIdList( m_QuestEffectDefineDat, m_QuestEffectDefineIdList ); + return m_QuestEffectDefineIdList; +} +const std::set< uint32_t >& getQuestRedoIdList() +{ + if( m_QuestRedoIdList.size() == 0 ) + loadIdList( m_QuestRedoDat, m_QuestRedoIdList ); + return m_QuestRedoIdList; +} +const std::set< uint32_t >& getQuestRedoChapterUIIdList() +{ + if( m_QuestRedoChapterUIIdList.size() == 0 ) + loadIdList( m_QuestRedoChapterUIDat, m_QuestRedoChapterUIIdList ); + return m_QuestRedoChapterUIIdList; +} +const std::set< uint32_t >& getQuestRedoChapterUICategoryIdList() +{ + if( m_QuestRedoChapterUICategoryIdList.size() == 0 ) + loadIdList( m_QuestRedoChapterUICategoryDat, m_QuestRedoChapterUICategoryIdList ); + return m_QuestRedoChapterUICategoryIdList; +} +const std::set< uint32_t >& getQuestRedoChapterUITabIdList() +{ + if( m_QuestRedoChapterUITabIdList.size() == 0 ) + loadIdList( m_QuestRedoChapterUITabDat, m_QuestRedoChapterUITabIdList ); + return m_QuestRedoChapterUITabIdList; +} +const std::set< uint32_t >& getQuestRedoIncompChapterIdList() +{ + if( m_QuestRedoIncompChapterIdList.size() == 0 ) + loadIdList( m_QuestRedoIncompChapterDat, m_QuestRedoIncompChapterIdList ); + return m_QuestRedoIncompChapterIdList; +} const std::set< uint32_t >& getQuestRepeatFlagIdList() { if( m_QuestRepeatFlagIdList.size() == 0 ) @@ -9398,6 +13003,12 @@ const std::set< uint32_t >& getRecipeLevelTableIdList() loadIdList( m_RecipeLevelTableDat, m_RecipeLevelTableIdList ); return m_RecipeLevelTableIdList; } +const std::set< uint32_t >& getRecipeLookupIdList() +{ + if( m_RecipeLookupIdList.size() == 0 ) + loadIdList( m_RecipeLookupDat, m_RecipeLookupIdList ); + return m_RecipeLookupIdList; +} const std::set< uint32_t >& getRecipeNotebookListIdList() { if( m_RecipeNotebookListIdList.size() == 0 ) @@ -9446,6 +13057,18 @@ const std::set< uint32_t >& getResidentIdList() loadIdList( m_ResidentDat, m_ResidentIdList ); return m_ResidentIdList; } +const std::set< uint32_t >& getResistanceWeaponAdjustIdList() +{ + if( m_ResistanceWeaponAdjustIdList.size() == 0 ) + loadIdList( m_ResistanceWeaponAdjustDat, m_ResistanceWeaponAdjustIdList ); + return m_ResistanceWeaponAdjustIdList; +} +const std::set< uint32_t >& getRetainerFortuneRewardRangeIdList() +{ + if( m_RetainerFortuneRewardRangeIdList.size() == 0 ) + loadIdList( m_RetainerFortuneRewardRangeDat, m_RetainerFortuneRewardRangeIdList ); + return m_RetainerFortuneRewardRangeIdList; +} const std::set< uint32_t >& getRetainerTaskIdList() { if( m_RetainerTaskIdList.size() == 0 ) @@ -9476,17 +13099,35 @@ const std::set< uint32_t >& getRetainerTaskRandomIdList() loadIdList( m_RetainerTaskRandomDat, m_RetainerTaskRandomIdList ); return m_RetainerTaskRandomIdList; } +const std::set< uint32_t >& getRideShootingIdList() +{ + if( m_RideShootingIdList.size() == 0 ) + loadIdList( m_RideShootingDat, m_RideShootingIdList ); + return m_RideShootingIdList; +} +const std::set< uint32_t >& getRideShootingTargetTypeIdList() +{ + if( m_RideShootingTargetTypeIdList.size() == 0 ) + loadIdList( m_RideShootingTargetTypeDat, m_RideShootingTargetTypeIdList ); + return m_RideShootingTargetTypeIdList; +} +const std::set< uint32_t >& getRideShootingTextDataIdList() +{ + if( m_RideShootingTextDataIdList.size() == 0 ) + loadIdList( m_RideShootingTextDataDat, m_RideShootingTextDataIdList ); + return m_RideShootingTextDataIdList; +} const std::set< uint32_t >& getRPParameterIdList() { if( m_RPParameterIdList.size() == 0 ) loadIdList( m_RPParameterDat, m_RPParameterIdList ); return m_RPParameterIdList; } -const std::set< uint32_t >& getSalvageIdList() +const std::set< uint32_t >& getSatisfactionArbitrationIdList() { - if( m_SalvageIdList.size() == 0 ) - loadIdList( m_SalvageDat, m_SalvageIdList ); - return m_SalvageIdList; + if( m_SatisfactionArbitrationIdList.size() == 0 ) + loadIdList( m_SatisfactionArbitrationDat, m_SatisfactionArbitrationIdList ); + return m_SatisfactionArbitrationIdList; } const std::set< uint32_t >& getSatisfactionNpcIdList() { @@ -9524,12 +13165,6 @@ const std::set< uint32_t >& getScenarioTreeTipsClassQuestIdList() loadIdList( m_ScenarioTreeTipsClassQuestDat, m_ScenarioTreeTipsClassQuestIdList ); return m_ScenarioTreeTipsClassQuestIdList; } -const std::set< uint32_t >& getScenarioTreeTipsQuestIdList() -{ - if( m_ScenarioTreeTipsQuestIdList.size() == 0 ) - loadIdList( m_ScenarioTreeTipsQuestDat, m_ScenarioTreeTipsQuestIdList ); - return m_ScenarioTreeTipsQuestIdList; -} const std::set< uint32_t >& getScenarioTypeIdList() { if( m_ScenarioTypeIdList.size() == 0 ) @@ -9572,6 +13207,18 @@ const std::set< uint32_t >& getSkyIsland2RangeTypeIdList() loadIdList( m_SkyIsland2RangeTypeDat, m_SkyIsland2RangeTypeIdList ); return m_SkyIsland2RangeTypeIdList; } +const std::set< uint32_t >& getSnipeTalkIdList() +{ + if( m_SnipeTalkIdList.size() == 0 ) + loadIdList( m_SnipeTalkDat, m_SnipeTalkIdList ); + return m_SnipeTalkIdList; +} +const std::set< uint32_t >& getSnipeTalkNameIdList() +{ + if( m_SnipeTalkNameIdList.size() == 0 ) + loadIdList( m_SnipeTalkNameDat, m_SnipeTalkNameIdList ); + return m_SnipeTalkNameIdList; +} const std::set< uint32_t >& getSpearfishingItemIdList() { if( m_SpearfishingItemIdList.size() == 0 ) @@ -9614,6 +13261,12 @@ const std::set< uint32_t >& getStainTransientIdList() loadIdList( m_StainTransientDat, m_StainTransientIdList ); return m_StainTransientIdList; } +const std::set< uint32_t >& getStanceChangeIdList() +{ + if( m_StanceChangeIdList.size() == 0 ) + loadIdList( m_StanceChangeDat, m_StanceChangeIdList ); + return m_StanceChangeIdList; +} const std::set< uint32_t >& getStatusIdList() { if( m_StatusIdList.size() == 0 ) @@ -9644,6 +13297,12 @@ const std::set< uint32_t >& getSubmarineExplorationIdList() loadIdList( m_SubmarineExplorationDat, m_SubmarineExplorationIdList ); return m_SubmarineExplorationIdList; } +const std::set< uint32_t >& getSubmarineMapIdList() +{ + if( m_SubmarineMapIdList.size() == 0 ) + loadIdList( m_SubmarineMapDat, m_SubmarineMapIdList ); + return m_SubmarineMapIdList; +} const std::set< uint32_t >& getSubmarinePartIdList() { if( m_SubmarinePartIdList.size() == 0 ) @@ -9662,18 +13321,36 @@ const std::set< uint32_t >& getSwitchTalkIdList() loadIdList( m_SwitchTalkDat, m_SwitchTalkIdList ); return m_SwitchTalkIdList; } +const std::set< uint32_t >& getSwitchTalkVariationIdList() +{ + if( m_SwitchTalkVariationIdList.size() == 0 ) + loadIdList( m_SwitchTalkVariationDat, m_SwitchTalkVariationIdList ); + return m_SwitchTalkVariationIdList; +} const std::set< uint32_t >& getTerritoryTypeIdList() { if( m_TerritoryTypeIdList.size() == 0 ) loadIdList( m_TerritoryTypeDat, m_TerritoryTypeIdList ); return m_TerritoryTypeIdList; } +const std::set< uint32_t >& getTerritoryTypeTransientIdList() +{ + if( m_TerritoryTypeTransientIdList.size() == 0 ) + loadIdList( m_TerritoryTypeTransientDat, m_TerritoryTypeTransientIdList ); + return m_TerritoryTypeTransientIdList; +} const std::set< uint32_t >& getTextCommandIdList() { if( m_TextCommandIdList.size() == 0 ) loadIdList( m_TextCommandDat, m_TextCommandIdList ); return m_TextCommandIdList; } +const std::set< uint32_t >& getTextCommandParamIdList() +{ + if( m_TextCommandParamIdList.size() == 0 ) + loadIdList( m_TextCommandParamDat, m_TextCommandParamIdList ); + return m_TextCommandParamIdList; +} const std::set< uint32_t >& getTitleIdList() { if( m_TitleIdList.size() == 0 ) @@ -9740,6 +13417,12 @@ const std::set< uint32_t >& getTreasureHuntRankIdList() loadIdList( m_TreasureHuntRankDat, m_TreasureHuntRankIdList ); return m_TreasureHuntRankIdList; } +const std::set< uint32_t >& getTreasureModelIdList() +{ + if( m_TreasureModelIdList.size() == 0 ) + loadIdList( m_TreasureModelDat, m_TreasureModelIdList ); + return m_TreasureModelIdList; +} const std::set< uint32_t >& getTreasureSpotIdList() { if( m_TreasureSpotIdList.size() == 0 ) @@ -9788,6 +13471,12 @@ const std::set< uint32_t >& getTripleTriadCompetitionIdList() loadIdList( m_TripleTriadCompetitionDat, m_TripleTriadCompetitionIdList ); return m_TripleTriadCompetitionIdList; } +const std::set< uint32_t >& getTripleTriadResidentIdList() +{ + if( m_TripleTriadResidentIdList.size() == 0 ) + loadIdList( m_TripleTriadResidentDat, m_TripleTriadResidentIdList ); + return m_TripleTriadResidentIdList; +} const std::set< uint32_t >& getTripleTriadRuleIdList() { if( m_TripleTriadRuleIdList.size() == 0 ) @@ -9818,6 +13507,18 @@ const std::set< uint32_t >& getTutorialTankIdList() loadIdList( m_TutorialTankDat, m_TutorialTankIdList ); return m_TutorialTankIdList; } +const std::set< uint32_t >& getUDS_EventIdList() +{ + if( m_UDS_EventIdList.size() == 0 ) + loadIdList( m_UDS_EventDat, m_UDS_EventIdList ); + return m_UDS_EventIdList; +} +const std::set< uint32_t >& getUDS_PropertyIdList() +{ + if( m_UDS_PropertyIdList.size() == 0 ) + loadIdList( m_UDS_PropertyDat, m_UDS_PropertyIdList ); + return m_UDS_PropertyIdList; +} const std::set< uint32_t >& getUIColorIdList() { if( m_UIColorIdList.size() == 0 ) @@ -9854,6 +13555,12 @@ const std::set< uint32_t >& getWarpLogicIdList() loadIdList( m_WarpLogicDat, m_WarpLogicIdList ); return m_WarpLogicIdList; } +const std::set< uint32_t >& getWeaponTimelineIdList() +{ + if( m_WeaponTimelineIdList.size() == 0 ) + loadIdList( m_WeaponTimelineDat, m_WeaponTimelineIdList ); + return m_WeaponTimelineIdList; +} const std::set< uint32_t >& getWeatherIdList() { if( m_WeatherIdList.size() == 0 ) @@ -9878,6 +13585,18 @@ const std::set< uint32_t >& getWeatherReportReplaceIdList() loadIdList( m_WeatherReportReplaceDat, m_WeatherReportReplaceIdList ); return m_WeatherReportReplaceIdList; } +const std::set< uint32_t >& getWebGuidanceIdList() +{ + if( m_WebGuidanceIdList.size() == 0 ) + loadIdList( m_WebGuidanceDat, m_WebGuidanceIdList ); + return m_WebGuidanceIdList; +} +const std::set< uint32_t >& getWebURLIdList() +{ + if( m_WebURLIdList.size() == 0 ) + loadIdList( m_WebURLDat, m_WebURLIdList ); + return m_WebURLIdList; +} const std::set< uint32_t >& getWeddingBGMIdList() { if( m_WeddingBGMIdList.size() == 0 ) @@ -9920,6 +13639,18 @@ const std::set< uint32_t >& getWorldDCGroupTypeIdList() loadIdList( m_WorldDCGroupTypeDat, m_WorldDCGroupTypeIdList ); return m_WorldDCGroupTypeIdList; } +const std::set< uint32_t >& getYardCatalogCategoryIdList() +{ + if( m_YardCatalogCategoryIdList.size() == 0 ) + loadIdList( m_YardCatalogCategoryDat, m_YardCatalogCategoryIdList ); + return m_YardCatalogCategoryIdList; +} +const std::set< uint32_t >& getYardCatalogItemListIdList() +{ + if( m_YardCatalogItemListIdList.size() == 0 ) + loadIdList( m_YardCatalogItemListDat, m_YardCatalogItemListIdList ); + return m_YardCatalogItemListIdList; +} const std::set< uint32_t >& getYKWIdList() { if( m_YKWIdList.size() == 0 ) @@ -9937,7 +13668,6 @@ const std::set< uint32_t >& getZoneSharedGroupIdList() }; } -} #endif diff --git a/src/common/Logging/Logger.cpp b/src/common/Logging/Logger.cpp index 221f9291..4b37aba9 100644 --- a/src/common/Logging/Logger.cpp +++ b/src/common/Logging/Logger.cpp @@ -8,9 +8,9 @@ #include // #include -#include // or #include +#include // or #include -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; void Sapphire::Logger::init( const std::string& logPath ) { diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index f620b381..c713148c 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -24,6 +24,9 @@ namespace Sapphire::Network::ActorControl SetStatus = 0x02, CastStart = 0x03, ToggleAggro = 0x04, + /*! + * param1 = ClassJob ID + */ ClassJobChange = 0x05, DefeatMsg = 0x06, GainExpMsg = 0x07, @@ -108,6 +111,8 @@ namespace Sapphire::Network::ActorControl ScreenFadeOut = 0xAA, + CeremonyDecoration = 0xB9, + ZoneIn = 0xC8, ZoneInDefaultPos = 0xC9, @@ -142,6 +147,15 @@ namespace Sapphire::Network::ActorControl SetPose = 0x127, + /*! + * This is used for general crafting events, I found some of them but some are missing: + * + * param1 = event type, the rest of the struct depends on this param. + * - 18 & 19: Quicksynth result, 19 means HQ result item, item ID is param2 and is + 1 000 000 when HQ. + * Quantity is param3 (possible quicksynth that gives more than one item in the future?) + * + * All the other values have unkown behavior for now. + */ CraftingUnk = 0x12C, GatheringSenseMsg = 0x130, @@ -175,6 +189,14 @@ namespace Sapphire::Network::ActorControl RelicInfuseMsg = 0x179, + /*! + * Sent as result of an aetherial reduction. + * param1 = Reduced item ID + 500 000 (idk what this 500 000 is but it's always here no matter what) + * param2 = First result item id (+ 1 000 000 if HQ) + * param3 = First result item quantity + * param4 = (Optional) Second result item id (+ 1 000 000 if HQ) + * param5 = (Optional) Second result item quantity + */ AetherReductionDlg = 0x17D, /*! @@ -193,7 +215,19 @@ namespace Sapphire::Network::ActorControl SetFavorite = 0x1FC, LearnTeleport = 0x1FD, - OpenRecommendationGuide = 0x200, + /*! + * param1 = event type bitmask + * 1 = Quest + * 2 = GuildLeveAssignment + * 4 = GuildOrderGuide + * 8 = TripleTriad + * 16 = CustomTalk + * 32 = PreHandler + */ + BeginMapUpdate = 0x1FF, + FinishMapUpdate = 0x200, + + //OpenRecommendationGuide = 0x200, ArmoryErrorMsg = 0x201, AchievementPopup = 0x203, @@ -208,11 +242,19 @@ namespace Sapphire::Network::ActorControl /*! * Sent when a player desynths an item, one packet per result type (one for consumed item, one for each obtained items, and one for exp if the player received exp) - * param1 = result type (4921 => Item consumed, 4922 => Item obtained, 4925 => Exp obtained) - * param3 = item id (used for result types 4921 & 4922) + * param1 = result type + * 4921 => Desynth item consumed + * 4922 => Desynth item obtained + * 4925 => Desynth exp obtained) + * 3553 => Reduction item used + * 3555 => Reduction item obtained + * param3 = u32 item id (+100 000 if item is HQ) + * param4 = item amount (used only for reduction it seems) * param5 = exp amount (x 100) + * + * Idk exactly how reduce's param3 is formatted, it seems like it's item id + 500 000 but it seems too... shady. */ - DesynthResult = 0x20F, + DesynthOrReductionResult = 0x20F, GilTrailMsg = 0x211, @@ -230,18 +272,22 @@ namespace Sapphire::Network::ActorControl GearSetEquipMsg = 0x321, + SetBait = 0x325, // param1: bait ID + SetFestival = 0x386, // param1: festival.exd index ToggleOrchestrionUnlock = 0x396, + EventBattleDialog = 0x39D, + /*! * param1 = mountSpeed * Retail sends 12 for mount speed star 1 unlocked and 15 for mount speed star 2 unlocked * This also has to be sent before mounting finishes for it to take effect */ - SetMountSpeed = 0x39F, + SetMountSpeed = 0x3A0, // updated 5.35 hotfix - Dismount = 0x3A1, // updated 4.5 + Dismount = 0x3A2, // updated 5.35 hotfix // Duty Recorder BeginReplayAck = 0x3A2, @@ -318,6 +364,7 @@ namespace Sapphire::Network::ActorControl DismountReq = 0x65, SpawnCompanionReq = 0x66, + DespawnCompanionReq = 0x67, RemoveStatusEffect = 0x68, CastCancel = 0x69, @@ -331,6 +378,7 @@ namespace Sapphire::Network::ActorControl TitleList = 0x12F, UpdatedSeenHowTos = 0x133, + CutscenePlayed = 0x134, // param1 = cutscene id AllotAttribute = 0x135, ClearFieldMarkers = 0x13A, @@ -340,13 +388,19 @@ namespace Sapphire::Network::ActorControl Timers = 0x1AB, - DyeItem = 0x1B5, + DyeItem = 0x1B0, // updated 5.21 RequestChocoboInventory = 0x1C4, EmoteReq = 0x1F4, EmoteCancel = 0x1F6, PersistentEmoteCancel = 0x1F7, + /*! + * param2 = pose ID + * 0 = idle pose 0 (just standing) + * 1 = idle pose 1 + * 2-4 = idle poses 2-4 + */ PoseChange = 0x1F9, PoseReapply = 0x1FA, PoseCancel = 0x1FB, @@ -355,6 +409,8 @@ namespace Sapphire::Network::ActorControl AchievementComp = 0x203, AchievementCatChat = 0x206, + RequestEventBattle = 0x232C, + QuestJournalUpdateQuestVisibility = 0x2BE, QuestJournalClosed = 0x2BF, diff --git a/src/common/Network/Connection.cpp b/src/common/Network/Connection.cpp index 1bc9054a..a2e71f38 100644 --- a/src/common/Network/Connection.cpp +++ b/src/common/Network/Connection.cpp @@ -1,17 +1,15 @@ #include "Connection.h" #include "Hive.h" #include -#include "Framework.h" using namespace Sapphire; -Network::Connection::Connection( HivePtr hive, FrameworkPtr pFw ) : +Network::Connection::Connection( HivePtr hive ) : m_hive( hive ), m_socket( hive->getService() ), m_io_strand( hive->getService() ), m_receive_buffer_size( 32000 ), - m_error_state( 0 ), - m_pFw( pFw ) + m_error_state( 0 ) { } diff --git a/src/common/Network/Connection.h b/src/common/Network/Connection.h index ef5c4070..91f86aea 100644 --- a/src/common/Network/Connection.h +++ b/src/common/Network/Connection.h @@ -35,9 +35,8 @@ namespace Sapphire::Network std::list< std::vector< uint8_t > > m_pending_sends; int32_t m_receive_buffer_size; std::atomic< uint32_t > m_error_state; - FrameworkPtr m_pFw; - Connection( HivePtr hive, FrameworkPtr pFw ); + Connection( HivePtr hive ); virtual ~Connection(); @@ -141,13 +140,13 @@ namespace Sapphire::Network //----------------------------------------------------------------------------- template< class T > - std::shared_ptr< T > addServerToHive( const std::string& listenIp, uint32_t port, HivePtr pHive, FrameworkPtr pFw ) + std::shared_ptr< T > addServerToHive( const std::string& listenIp, uint32_t port, HivePtr pHive ) { try { AcceptorPtr acceptor( new Acceptor( pHive ) ); acceptor->listen( listenIp, port ); - std::shared_ptr< T > connection( new T( pHive, acceptor, pFw ) ); + std::shared_ptr< T > connection( new T( pHive, acceptor ) ); acceptor->accept( connection ); return connection; } diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 8ffe9347..0db60930 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -1,8 +1,8 @@ #ifndef _CORE_NETWORK_PACKETS_IPCS_H #define _CORE_NETWORK_PACKETS_IPCS_H - + #include - + namespace Sapphire::Network::Packets { @@ -43,207 +43,252 @@ namespace Sapphire::Network::Packets */ enum ServerZoneIpcType : uint16_t { + Ping = 0x02A8, // updated 5.58 hotfix + Init = 0x013C, // updated 5.58 hotfix - // static opcode ( the ones that rarely, if ever, change ) - Ping = 0x0065, - Init = 0x0066, + ActorFreeSpawn = 0x00B5, // updated 5.58 hotfix + InitZone = 0x0320, // updated 5.58 hotfix - ActorFreeSpawn = 0x0191, - InitZone = 0x019A, + EffectResult = 0x0387, // updated 5.58 hotfix + ActorControl = 0x00B0, // updated 5.58 hotfix + ActorControlSelf = 0x02B6, // updated 5.58 hotfix + ActorControlTarget = 0x03C5, // updated 5.58 hotfix - EffectResult = 0x0141, - ActorControl = 0x0142, - ActorControlSelf = 0x0143, - ActorControlTarget = 0x0144, - UpdateHpMpTp = 0x0145, // used when resting + /*! + * @brief Used when resting + */ + UpdateHpMpTp = 0x01A7, // updated 5.58 hotfix /////////////////////////////////////////////////// - ChatBanned = 0x006B, - Playtime = 0x0100, // updated 5.0 - Logout = 0x0077, // updated 5.0 - CFNotify = 0x0078, + ChatBanned = 0xF06B, + Playtime = 0x0179, // updated 5.58 hotfix + Logout = 0x0214, // updated 5.58 hotfix + CFNotify = 0x0327, // updated 5.58 hotfix CFMemberStatus = 0x0079, - CFDutyInfo = 0x007A, - CFPlayerInNeed = 0x007F, + CFDutyInfo = 0x03AA, // updated 5.58 hotfix + CFPlayerInNeed = 0xF07F, + CFPreferredRole = 0x024B, // updated 5.58 hotfix + CFCancel = 0x01AC, // updated 5.58 hotfix + SocialRequestError = 0xF0AD, - SocialRequestError = 0x00AD, + CFRegistered = 0x029F, // updated 5.58 hotfix + SocialRequestResponse = 0x0082, // updated 5.58 hotfix + SocialMessage = 0x03CB, // updated 5.58 hotfix + SocialMessage2 = 0x01D7, // updated 5.58 hotfix + CancelAllianceForming = 0xF0C6, // updated 4.2 - CFRegistered = 0x00B8, // updated 4.1 - SocialRequestResponse = 0x00BB, // updated 4.1 - CancelAllianceForming = 0x00C6, // updated 4.2 + LogMessage = 0x0118, // updated 5.58 hotfix - LogMessage = 0x00D0, + Chat = 0x00FE, // updated 5.58 hotfix + PartyChat = 0x0065, - Chat = 0x0104, // updated 5.0 + WorldVisitList = 0xF0FE, // added 4.5 - WorldVisitList = 0x00FE, // added 4.5 + SocialList = 0x015F, // updated 5.58 hotfix - SocialList = 0x010D, // updated 5.0 + ExamineSearchInfo = 0x0133, // updated 5.58 hotfix + UpdateSearchInfo = 0x03E5, // updated 5.58 hotfix + InitSearchInfo = 0x0321, // updated 5.58 hotfix + ExamineSearchComment = 0x03AD, // updated 5.58 hotfix - ExamineSearchInfo = 0x010F, // added 5.0 - UpdateSearchInfo = 0x0110, // updated 5.0 - InitSearchInfo = 0x0111, // updated 5.0 - ExamineSearchComment = 0x0102, // updated 4.1 + ServerNoticeShort = 0x0333, // updated 5.58 hotfix + ServerNotice = 0x0171, // updated 5.58 hotfix + SetOnlineStatus = 0x037B, // updated 5.58 hotfix - ServerNoticeShort = 0x0115, // updated 5.0 - ServerNotice = 0x0116, // updated 5.0 - SetOnlineStatus = 0x0117, // updated 5.0 + CountdownInitiate = 0x0111, // updated 5.58 hotfix + CountdownCancel = 0x0231, // updated 5.58 hotfix - CountdownInitiate = 0x011E, // updated 5.0 - CountdownCancel = 0x011F, // updated 5.0 + PlayerAddedToBlacklist = 0x024E, // updated 5.58 hotfix + PlayerRemovedFromBlacklist = 0x011D, // updated 5.58 hotfix + BlackList = 0x03C0, // updated 5.58 hotfix - PlayerAddedToBlacklist = 0x0120, // updated 5.0 - PlayerRemovedFromBlacklist = 0x0121, // updated 5.0 - BlackList = 0x0123, // updated 5.0 + LinkshellList = 0x02E2, // updated 5.58 hotfix - LinkshellList = 0x012A, // updated 5.0 - - MailDeleteRequest = 0x012B, // updated 5.0 + MailDeleteRequest = 0xF12B, // updated 5.0 // 12D - 137 - constant gap between 4.5x -> 5.0 - ReqMoogleMailList = 0x0138, // updated 5.0 - ReqMoogleMailLetter = 0x0139, // updated 5.0 + ReqMoogleMailList = 0xF138, // updated 5.0 + ReqMoogleMailLetter = 0xF139, // updated 5.0 MailLetterNotification = 0x013A, // updated 5.0 - MarketBoardItemListingCount = 0x013B, // updated 5.0 - MarketBoardItemListing = 0x013C, // updated 5.0 - MarketBoardItemListingHistory = 0x012A, // updated 4.5 - MarketBoardSearchResult = 0x0139, // updated 4.5 + MarketTaxRates = 0x01F8, // updated 5.35 hotfix + + MarketBoardSearchResult = 0x01F1, // updated 5.58 hotfix + MarketBoardItemListingCount = 0x0068, // updated 5.58 hotfix + MarketBoardItemListingHistory = 0x01BA, // updated 5.58 hotfix + MarketBoardItemListing = 0x0076, // updated 5.58 hotfix CharaFreeCompanyTag = 0x013B, // updated 4.5 - FreeCompanyBoardMsg = 0x013C, // updated 4.5 - FreeCompanyInfo = 0x013D, // updated 4.5 - ExamineFreeCompanyInfo = 0x013E, // updated 4.5 + FreeCompanyBoardMsg = 0x03DB, // updated 5.58 hotfix + FreeCompanyInfo = 0x01F7, // updated 5.58 hotfix + ExamineFreeCompanyInfo = 0x0324, // updated 5.58 hotfix - FreeCompanyUpdateShortMessage = 0x0157, // added 5.0 + FreeCompanyUpdateShortMessage = 0xF157, // added 5.0 - StatusEffectList = 0x015B, // updated 5.0 - EurekaStatusEffectList = 0x015C, // updated 5.0 - Effect = 0x015E, // updated 5.0 - AoeEffect8 = 0x0161, // updated 5.0 - AoeEffect16 = 0x0162, // updated 5.0 - AoeEffect24 = 0x0163, // updated 5.0 - AoeEffect32 = 0x0164, // updated 5.0 - PersistantEffect = 0x0165, // updated 5.0 + StatusEffectList = 0x0074, // updated 5.58 hotfix + EurekaStatusEffectList = 0x0167, // updated 5.18 + BossStatusEffectList = 0x0312, // added 5.1 + Effect = 0x03CA, // updated 5.58 hotfix + AoeEffect8 = 0x03C4, // updated 5.58 hotfix + AoeEffect16 = 0x00FA, // updated 5.58 hotfix + AoeEffect24 = 0x0339, // updated 5.58 hotfix + AoeEffect32 = 0x023C, // updated 5.58 hotfix + PersistantEffect = 0x025D, // updated 5.58 hotfix - GCAffiliation = 0x016F, // updated 5.0 + GCAffiliation = 0x0094, // updated 5.58 hotfix - PlayerSpawn = 0x017F, // updated 5.0 - NpcSpawn = 0x0180, // updated 5.0 - NpcSpawn2 = 0x0181, // ( Bigger statuseffectlist? ) updated 5.0 - ActorMove = 0x0182, // updated 5.0 + PlayerSpawn = 0x01D8, // updated 5.58 hotfix + NpcSpawn = 0x00D2, // updated 5.58 hotfix + NpcSpawn2 = 0x01CB, // ( Bigger statuseffectlist? ) updated 5.3 + ActorMove = 0x00F8, // updated 5.58 hotfix - ActorSetPos = 0x0184, // updated 5.0 + ActorSetPos = 0x0299, // updated 5.58 hotfix - ActorCast = 0x0186, // updated 5.0 - SomeCustomiseChangePacketProbably = 0x0187, // added 5.0 - PartyList = 0x0188, // updated 5.0 - HateRank = 0x0189, // updated 5.0 - HateList = 0x018A, // updated 5.0 - ObjectSpawn = 0x018B, // updated 5.0 - ObjectDespawn = 0x018C, // updated 5.0 - UpdateClassInfo = 0x018D, // updated 5.0 - SilentSetClassJob = 0x018E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything - PlayerSetup = 0x018F, // updated 5.0 - PlayerStats = 0x0190, // updated 5.0 - ActorOwner = 0x0192, // updated 5.0 - PlayerStateFlags = 0x0193, // updated 5.0 - PlayerClassInfo = 0x0194, // updated 5.0 + ActorCast = 0x015D, // updated 5.58 hotfix + SomeCustomiseChangePacketProbably = 0x00CD, // added 5.18 - ModelEquip = 0x0196, // updated 5.0 - Examine = 0x0197, // updated 5.0 - CharaNameReq = 0x0198, // updated 5.0 + PartyList = 0x0349, // updated 5.58 hotfix + PartyMessage = 0x00A4, // updated 5.58 hotfix + HateRank = 0x0150, // updated 5.58 hotfix + HateList = 0x0243, // updated 5.58 hotfix + ObjectSpawn = 0x0125, // updated 5.58 hotfix + ObjectDespawn = 0x0148, // updated 5.58 hotfix + UpdateClassInfo = 0x0084, // updated 5.58 hotfix + SilentSetClassJob = 0xF18E, // updated 5.0 - seems to be the case, not sure if it's actually used for anything + PlayerSetup = 0x01D5, // updated 5.58 hotfix + PlayerStats = 0x0295, // updated 5.58 hotfix + ActorOwner = 0x0260, // updated 5.58 hotfix + PlayerStateFlags = 0x03BF, // updated 5.58 hotfix + PlayerClassInfo = 0x0131, // updated 5.58 hotfix + CharaVisualEffect = 0x0292, // updated 5.58 hotfix + + ModelEquip = 0x03A2, // updated 5.58 hotfix + Examine = 0x0365, // updated 5.58 hotfix + CharaNameReq = 0x01F0, // updated 5.58 hotfix // nb: see #565 on github - UpdateRetainerItemSalePrice = 0x019F, // updated 5.0 + UpdateRetainerItemSalePrice = 0xF19F, // updated 5.0 + RetainerSaleHistory = 0x03CE, // updated 5.58 hotfix + RetainerInformation = 0x022F, // updated 5.58 hotfix SetLevelSync = 0x1186, // not updated for 4.4, not sure what it is anymore - ItemInfo = 0x01A1, // updated 5.0 - ContainerInfo = 0x01A2, // updated 5.0 - InventoryTransactionFinish = 0x01A3, // updated 5.0 - InventoryTransaction = 0x01A4, // updated 5.0 - CurrencyCrystalInfo = 0x01A5, // updated 5.0 + ItemInfo = 0x01CC, // updated 5.58 hotfix + ContainerInfo = 0x025C, // updated 5.58 hotfix + InventoryTransactionFinish = 0x0176, // updated 5.58 hotfix + InventoryTransaction = 0x027F, // updated 5.58 hotfix + CurrencyCrystalInfo = 0x0345, // updated 5.58 hotfix - InventoryActionAck = 0x01A7, // updated 5.0 - UpdateInventorySlot = 0x01A8, // updated 5.0 + InventoryActionAck = 0x03B8, // updated 5.58 hotfix + UpdateInventorySlot = 0x02F7, // updated 5.58 hotfix - HuntingLogEntry = 0x01B3, // updated 5.0 + HuntingLogEntry = 0x01D9, // updated 5.58 hotfix - EventPlay = 0x01B5, // updated 5.0 - DirectorPlayScene = 0x01B9, // updated 5.0 - EventOpenGilShop = 0x01BC, // updated 5.0 + EventPlay = 0x016B, // updated 5.58 hotfix + EventPlay4 = 0x010A, // updated 5.58 hotfix + EventPlay8 = 0x0337, // updated 5.58 hotfix + EventPlay16 = 0x0269, // updated 5.58 hotfix + EventPlay32 = 0x023E, // updated 5.58 hotfix + EventPlay64 = 0x00DE, // updated 5.58 hotfix + EventPlay128 = 0x02D0, // updated 5.58 hotfix + EventPlay255 = 0x0362, // updated 5.58 hotfix - EventStart = 0x01BE, // updated 5.0 - EventFinish = 0x01BF, // updated 5.0 + EventContinue = 0x00B6, // updated 5.58 hotfix + + EventStart = 0x02DA, // updated 5.58 hotfix + EventFinish = 0x0235, // updated 5.58 hotfix EventLinkshell = 0x1169, - QuestActiveList = 0x01D2, // updated 5.0 - QuestUpdate = 0x01D3, // updated 5.0 - QuestCompleteList = 0x01D4, // updated 5.0 + QuestActiveList = 0x0097, // updated 5.58 hotfix + QuestUpdate = 0x01B2, // updated 5.58 hotfix + QuestCompleteList = 0x006D, // updated 5.58 hotfix - QuestFinish = 0x01D5, // updated 5.0 - MSQTrackerComplete = 0x01D6, // updated 5.0 + QuestFinish = 0x021B, // updated 5.58 hotfix + MSQTrackerComplete = 0x0348, // updated 5.58 hotfix MSQTrackerProgress = 0xF1CD, // updated 4.5 ? this actually looks like the two opcodes have been combined, see #474 - QuestMessage = 0x01DE, // updated 5.0 + QuestMessage = 0x0220, // updated 5.58 hotfix - QuestTracker = 0x01E3, // updated 5.0 + QuestTracker = 0x00D8, // updated 5.58 hotfix - Mount = 0x01F3, // updated 5.0 + Mount = 0x01E1, // updated 5.58 hotfix - DirectorVars = 0x01F5, // updated 5.0 - DirectorPopUp = 0x0200, // updated 5.0 - display dialogue pop-ups in duties and FATEs, for example, Teraflare's countdown + DirectorVars = 0x0154, // updated 5.58 hotfix + SomeDirectorUnk1 = 0x0084, // updated 5.18 + SomeDirectorUnk2 = 0xF0C1, // updated 5.18 + SomeDirectorUnk4 = 0x03DD, // updated 5.58 hotfix + SomeDirectorUnk8 = 0x028A, // updated 5.18 + SomeDirectorUnk16 = 0x028C, // updated 5.18 + DirectorPopUp = 0x03DF, // updated 5.58 hotfix + DirectorPopUp4 = 0x019B, // updated 5.58 hotfix + DirectorPopUp8 = 0x0271, // updated 5.58 hotfix CFAvailableContents = 0xF1FD, // updated 4.2 - WeatherChange = 0x0210, // updated 5.0 - PlayerTitleList = 0x0211, // updated 5.0 - Discovery = 0x0212, // updated 5.0 + WeatherChange = 0x0323, // updated 5.58 hotfix + PlayerTitleList = 0x014E, // updated 5.58 hotfix + Discovery = 0x01C2, // updated 5.58 hotfix - EorzeaTimeOffset = 0x0214, // updated 5.0 + EorzeaTimeOffset = 0x0070, // updated 5.58 hotfix - EquipDisplayFlags = 0x0220, // updated 5.0 + EquipDisplayFlags = 0x02C6, // updated 5.58 hotfix + + MiniCactpotInit = 0x0286, // added 5.31 + ShopMessage = 0x0287, // updated 5.58 hotfix + LootMessage = 0x0383, // updated 5.58 hotfix + ResultDialog = 0x0273, // updated 5.58 hotfix + DesynthResult = 0x0238, // updated 5.58 hotfix /// Housing ////////////////////////////////////// - LandSetInitialize = 0x0234, // updated 5.0 - LandUpdate = 0x0235, // updated 5.0 - YardObjectSpawn = 0x0236, // updated 5.0 - HousingIndoorInitialize = 0x0237, // updated 5.0 - LandPriceUpdate = 0x0238, // updated 5.0 - LandInfoSign = 0x0239, // updated 5.0 - LandRename = 0x023A, // updated 5.0 - HousingEstateGreeting = 0x023B, // updated 5.0 - HousingUpdateLandFlagsSlot = 0x023C, // updated 5.0 - HousingLandFlags = 0x023D, // updated 5.0 - HousingShowEstateGuestAccess = 0x023E, // updated 5.0 + LandSetInitialize = 0x0159, // updated 5.58 hotfix + LandUpdate = 0x0228, // updated 5.58 hotfix + YardObjectSpawn = 0x023D, // updated 5.58 hotfix + HousingIndoorInitialize = 0x0210, // updated 5.58 hotfix + LandPriceUpdate = 0x0300, // updated 5.58 hotfix + LandInfoSign = 0x03E7, // updated 5.58 hotfix + LandRename = 0x01BF, // updated 5.58 hotfix + HousingEstateGreeting = 0x0126, // updated 5.58 hotfix + HousingUpdateLandFlagsSlot = 0x0157, // updated 5.58 hotfix + HousingLandFlags = 0x03B1, // updated 5.58 hotfix + HousingShowEstateGuestAccess = 0x00CC, // updated 5.58 hotfix - HousingObjectInitialize = 0x0240, // updated 5.0 - HousingInternalObjectSpawn = 0x241, // updated 5.0 + HousingObjectInitialize = 0x0112, // updated 5.58 hotfix + HousingInternalObjectSpawn = 0x02C8, // updated 5.58 hotfix - HousingWardInfo = 0x0243, // updated 5.0 - HousingObjectMove = 0x0244, // updated 5.0 + HousingWardInfo = 0x012A, // updated 5.58 hotfix + HousingObjectMove = 0x0265, // updated 5.58 hotfix - SharedEstateSettingsResponse = 0x0245, // updated 4.5 + SharedEstateSettingsResponse = 0x030E, // updated 5.58 hotfix - LandUpdateHouseName = 0x0257, // updated 4.5 + LandUpdateHouseName = 0x017C, // updated 5.58 hotfix - LandSetMap = 0x025B, // updated 4.5 + LandSetMap = 0x02E5, // updated 5.58 hotfix + + CeremonySetActorAppearance = 0x02ED, // updated 5.58 hotfix ////////////////////////////////////////////////// DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui - PerformNote = 0x0286, // updated 4.3 + PerformNote = 0x0127, // updated 5.58 hotfix - PrepareZoning = 0x02A4, // updated 5.0 - ActorGauge = 0x0292, // updated 4.3 + PrepareZoning = 0x02AB, // updated 5.58 hotfix + ActorGauge = 0x01C1, // updated 5.58 hotfix + DutyGauge = 0x02E5, // updated 5.58 hotfix // daily quest info -> without them sent, login will take longer... - DailyQuests = 0x025E, // updated 5.0 - DailyQuestRepeatFlags = 0x0260, // updated 5.0 + DailyQuests = 0x02D6, // updated 5.58 hotfix + DailyQuestRepeatFlags = 0x01AB, // updated 5.58 hotfix + + MapUpdate = 0x0394, // updated 5.58 hotfix + MapUpdate4 = 0x036F, // updated 5.58 hotfix + MapUpdate8 = 0x0311, // updated 5.58 hotfix + MapUpdate16 = 0x0108, // updated 5.58 hotfix + MapUpdate32 = 0x007A, // updated 5.58 hotfix + MapUpdate64 = 0x02A0, // updated 5.58 hotfix + MapUpdate128 = 0x0303, // updated 5.58 hotfix /// Doman Mahjong ////////////////////////////////////// MahjongOpenGui = 0x02A4, // only available in mahjong instance @@ -252,10 +297,20 @@ namespace Sapphire::Network::Packets MahjongEndRoundTsumo = 0x02BF, // called tsumo MahjongEndRoundRon = 0x2C0, // called ron or double ron (waiting for action must be flagged from discard packet to call) MahjongTileDiscard = 0x02C1, // giri (discarding a tile.) chi(1)/pon(2)/kan(4)/ron(8) flags etc.. - MahjongPlayersInfo = 0x02C2, // actor id, name, rating and stuff.. + MahjongPlayersInfo = 0xF2C2, // actor id, name, rating and stuff.. // 2C3 and 2C4 are currently unknown MahjongEndRoundDraw = 0x02C5, // self explanatory MahjongEndGame = 0x02C6, // finished oorasu(all-last) round; shows a result screen. + + /// Airship & Submarine ////////////////////////////////////// + AirshipExplorationResult = 0x0203, // updated 5.58 hotfix + AirshipStatus = 0x030C, // updated 5.58 hotfix + AirshipStatusList = 0x02FE, // updated 5.58 hotfix + AirshipTimers = 0x0166, // updated 5.58 hotfix + SubmarineExplorationResult = 0x00AA, // updated 5.58 hotfix + SubmarineProgressionStatus = 0x0357, // updated 5.58 hotfix + SubmarineStatusList = 0x01EF, // updated 5.58 hotfix + SubmarineTimers = 0x0247, // updated 5.58 hotfix }; /** @@ -263,102 +318,111 @@ namespace Sapphire::Network::Packets */ enum ClientZoneIpcType : uint16_t { + PingHandler = 0x0288, // updated 5.58 hotfix + InitHandler = 0x02EB, // updated 5.58 hotfix - PingHandler = 0x0065, // unchanged 5.0 - InitHandler = 0x0066, // unchanged 5.0 + FinishLoadingHandler = 0x013C, // updated 5.58 hotfix - FinishLoadingHandler = 0x0069, // unchanged 5.0 + CFCommenceHandler = 0x0381, // updated 5.58 hotfix - CFCommenceHandler = 0x006F, + CFCancelHandler = 0x02B2, // updated 5.58 hotfix + CFRegisterDuty = 0x01BD, // updated 5.58 hotfix + CFRegisterRoulette = 0x037A, // updated 5.58 hotfix + PlayTimeHandler = 0x02B7, // updated 5.58 hotfix + LogoutHandler = 0x00A0, // updated 5.58 hotfix + CancelLogout = 0x01AC, // updated 5.58 hotfix + CFDutyInfoHandler = 0xF078, // updated 4.2 + SocialReqSendHandler = 0x00D7, // updated 5.58 hotfix + SocialResponseHandler = 0x023B, // updated 5.58 hotfix + CreateCrossWorldLS = 0x035D, // updated 5.58 hotfix - CFRegisterDuty = 0x0071, - CFRegisterRoulette = 0x0072, - PlayTimeHandler = 0x0073, // unchanged 5.0 - LogoutHandler = 0x0074, // unchanged 5.0 - CancelLogout = 0x0075, // updated 5.0 + ChatHandler = 0x03B0, // updated 5.58 hotfix + PartyChatHandler = 0x0065, + PartySetLeaderHandler = 0x036C, // updated 5.58 hotfix + LeavePartyHandler = 0x019D, // updated 5.58 hotfix + KickPartyMemberHandler = 0x0262, // updated 5.58 hotfix + DisbandPartyHandler = 0x0276, // updated 5.58 hotfix - CFDutyInfoHandler = 0x0078, // updated 4.2 - - SocialReqSendHandler = 0x00AE, // updated 4.1 - CreateCrossWorldLS = 0x00AF, // updated 4.3 - - ChatHandler = 0x00D9, // updated 5.0 - - SocialListHandler = 0x00E1, // updated 5.0 - SetSearchInfoHandler = 0x00E4, // updated 5.0 - ReqSearchInfoHandler = 0x00E6, // updated 5.0 + SocialListHandler = 0x01CA, // updated 5.58 hotfix + SetSearchInfoHandler = 0x01D4, // updated 5.58 hotfix + ReqSearchInfoHandler = 0x014F, // updated 5.58 hotfix ReqExamineSearchCommentHandler = 0x00E7, // updated 5.0 - ReqRemovePlayerFromBlacklist = 0x00F1, // updated 5.0 - BlackListHandler = 0x00F2, // updated 5.0 - PlayerSearchHandler = 0x00F4, // updated 5.0 + ReqRemovePlayerFromBlacklist = 0x00B4, // updated 5.58 hotfix + BlackListHandler = 0x00F2, // updated 5.58 hotfix + PlayerSearchHandler = 0x037D, // updated 5.58 hotfix - LinkshellListHandler = 0x00FA, // updated 5.0 + LinkshellListHandler = 0x03B6, // updated 5.58 hotfix - MarketBoardRequestItemListingInfo = 0x0102, // updated 4.5 - MarketBoardRequestItemListings = 0x0103, // updated 4.5 - MarketBoardSearch = 0x0107, // updated 4.5 + MarketBoardRequestItemListingInfo = 0x00F4, // updated 5.58 hotfix + MarketBoardRequestItemListings = 0x0122, // updated 5.58 hotfix + MarketBoardSearch = 0x0082, // updated 5.58 hotfix - ReqExamineFcInfo = 0x0113, // updated 4.1 + ReqExamineFcInfo = 0x037B, // updated 5.58 hotfix - FcInfoReqHandler = 0x011A, // updated 4.2 + FcInfoReqHandler = 0x03D4, // updated 5.58 hotfix FreeCompanyUpdateShortMessageHandler = 0x0123, // added 5.0 - ReqMarketWishList = 0x012C, // updated 4.3 + ReqMarketWishList = 0x00C3, // updated 5.58 hotfix ReqJoinNoviceNetwork = 0x0129, // updated 4.2 - ReqCountdownInitiate = 0x0135, // updated 5.0 - ReqCountdownCancel = 0x0136, // updated 5.0 + ReqCountdownInitiate = 0x02EC, // updated 5.58 hotfix + ReqCountdownCancel = 0x0068, // updated 5.58 hotfix - ZoneLineHandler = 0x0139, // updated 5.0 - ClientTrigger = 0x013A, // updated 5.0 - DiscoveryHandler = 0x013B, // updated 5.0 + ZoneLineHandler = 0x008D, // updated 5.58 hotfix + ClientTrigger = 0x03DB, // updated 5.58 hotfix + DiscoveryHandler = 0x038B, // updated 5.58 hotfix - PlaceFieldMarker = 0x013C, // updated 5.0 + PlaceFieldMarkerPreset = 0x026D, // updated 5.58 hotfix + PlaceFieldMarker = 0x0371, // updated 5.58 hotfix + SkillHandler = 0x02DC, // updated 5.58 hotfix + GMCommand1 = 0x0272, // updated 5.58 hotfix + GMCommand2 = 0x00E9, // updated 5.58 hotfix + AoESkillHandler = 0x0152, // updated 5.58 hotfix - SkillHandler = 0x013D, // updated 5.0 - GMCommand1 = 0x013E, // updated 5.0 - GMCommand2 = 0x013F, // updated 5.0 - AoESkillHandler = 0x140, // updated 5.0 + UpdatePositionHandler = 0x01AF, // updated 5.58 hotfix - UpdatePositionHandler = 0x0141, // updated 5.0 + InventoryModifyHandler = 0x029E, // updated 5.58 hotfix - InventoryModifyHandler = 0x0148, // updated 5.0 - InventoryEquipRecommendedItems = 0x0149, // updated 5.0 + InventoryEquipRecommendedItems = 0x01C9, // updated 5.58 hotfix - ReqPlaceHousingItem = 0x014B, // updated 5.0 - BuildPresetHandler = 0x014F, // updated 5.0 + ReqPlaceHousingItem = 0x02D4, // updated 5.58 hotfix + BuildPresetHandler = 0x0223, // updated 5.58 hotfix - TalkEventHandler = 0x0151, // updated 5.0 - EmoteEventHandler = 0x0152, // updated 5.0 - WithinRangeEventHandler = 0x0153, // updated 5.0 - OutOfRangeEventHandler = 0x0154, // updated 5.0 - EnterTeriEventHandler = 0x0155, // updated 5.0 - ShopEventHandler = 0x0156, // updated 5.0 - - ReturnEventHandler = 0x015A, // updated 5.0? - TradeReturnEventHandler = 0x015B, // updated 5.0? + TalkEventHandler = 0x0387, // updated 5.58 hotfix + EmoteEventHandler = 0x00B0, // updated 5.58 hotfix + WithinRangeEventHandler = 0x02B6, // updated 5.58 hotfix + OutOfRangeEventHandler = 0x03C5, // updated 5.58 hotfix + EnterTeriEventHandler = 0x01A7, // updated 5.58 hotfix + ShopEventHandler = 0x0384, // updated 5.58 hotfix + ReturnEventHandler = 0x00FA, // updated 5.58 hotfix + TradeReturnEventHandler = 0x0339, // updated 5.58 hotfix + TradeReturnEventHandler2 = 0x023C, // updated 5.58 hotfix + EventYield2Handler = 0x021D, // updated 5.58 hotfix + EventYield16Handler = 0x0207, // updated 5.58 hotfix LinkshellEventHandler = 0x016B, // updated 4.5 LinkshellEventHandler1 = 0x016C, // updated 4.5 - ReqEquipDisplayFlagsChange = 0x0175, // updated 5.0 + ReqEquipDisplayFlagsChange = 0x02A5, // updated 5.58 hotfix - LandRenameHandler = 0x0177, // updated 5.0 - HousingUpdateHouseGreeting = 0x0178, // updated 5.0 - HousingUpdateObjectPosition = 0x0179, // updated 5.0 + LandRenameHandler = 0x028E, // updated 5.58 hotfix + HousingUpdateHouseGreeting = 0x0343, // updated 5.58 hotfix + HousingUpdateObjectPosition = 0x012C, // updated 5.58 hotfix + HousingEditExterior = 0x027B, // updated 5.58 hotfix + HousingEditInterior = 0x02E3, // updated 5.58 hotfix - SetSharedEstateSettings = 0x017B, // updated 5.0 - - UpdatePositionInstance = 0x0180, // updated 5.0 - - PerformNoteHandler = 0x029B, // updated 4.3 + SetSharedEstateSettings = 0x00D2, // updated 5.58 hotfix + UpdatePositionInstance = 0x00F8, // updated 5.58 hotfix + PerformNoteHandler = 0x0243, // updated 5.58 hotfix + WorldInteractionHandler = 0x0274, // updated 5.58 hotfix + Dive = 0x0320, // updated 5.58 hotfix }; //////////////////////////////////////////////////////////////////////////////// @@ -369,6 +433,7 @@ namespace Sapphire::Network::Packets enum ServerChatIpcType : uint16_t { Tell = 0x0064, // updated for sb + PublicContentTell = 0x00FB, // added 4.5, this is used when receiving a /tell in PublicContent instances such as Eureka or Bozja TellErrNotFound = 0x0066, FreeCompanyEvent = 0x012C, // added 5.0 @@ -380,9 +445,10 @@ namespace Sapphire::Network::Packets enum ClientChatIpcType : uint16_t { TellReq = 0x0064, + PublicContentTellReq = 0x0326, // updated 5.35 hotfix, this is used when sending a /tell in PublicContent instances such as Eureka or Bozja }; } - + #endif /*_CORE_NETWORK_PACKETS_IPCS_H*/ diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 7b0d39ea..5efe9771 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -49,14 +49,25 @@ struct FFXIVIpcUpdatePosition : FFXIVIpcBasePacket< UpdatePositionHandler > { /* 0000 */ float rotation; - /* 0004 */ uint8_t unk_1[ 3 ]; + /* 0004 */ uint8_t animationType; + /* 0005 */ uint8_t animationState; + /* 0006 */ uint8_t clientAnimationType; /* 0007 */ uint8_t headPosition; /* 0008 */ Common::FFXIVARR_POSITION3 position; - /* 000C */ uint8_t animationType; - /* 000D */ uint8_t animationState; - /* 000E */ uint8_t clientAnimationType; - /* 000F */ uint8_t unk_2; + /* 000C */ uint8_t unk[ 4 ]; // padding? }; + + struct FFXIVIpcUpdatePositionInstance : + FFXIVIpcBasePacket< UpdatePositionInstance > +{ + /* 0000 */ float rotation; + /* 0004 */ float interpolateRotation; + /* 0008 */ uint32_t flags; + /* 000C */ Common::FFXIVARR_POSITION3 position; + /* 0018 */ Common::FFXIVARR_POSITION3 interpolatePosition; + /* 0024 */ uint32_t unknown; +}; + struct FFXIVIpcSkillHandler : FFXIVIpcBasePacket< SkillHandler > @@ -196,6 +207,13 @@ struct FFXIVIpcChatHandler : /* 001A */ char message[1012]; }; +struct FFXIVIpcPartyChatHandler : + FFXIVIpcBasePacket< ChatHandler > +{ + uint64_t unknown; + char message[1024]; +}; + struct FFXIVIpcShopEventHandler : FFXIVIpcBasePacket< ShopEventHandler > { @@ -217,7 +235,7 @@ struct FFXIVIpcInventoryModifyHandler : { /* 0000 */ uint32_t seq; /* 0004 */ Common::InventoryOperation action; - /* 0005 */ uint8_t pad_0005[7]; + /* 0006 */ uint8_t pad_0006[6]; /* 000C */ uint16_t fromContainer; /* 000E */ uint8_t pad_000E[2]; /* 0010 */ uint8_t fromSlot; @@ -333,6 +351,126 @@ struct FFXIVIpcFreeCompanyUpdateShortMessageHandler : uint16_t unknown2; }; +struct FFXIVIpcWorldInteractionHandler : + FFXIVIpcBasePacket< WorldInteractionHandler > +{ + uint32_t action; + uint32_t param1; + uint32_t param2; + uint32_t param3; + uint32_t param4; + Common::FFXIVARR_POSITION3 position; +}; + +struct FFXIVIpcSocialReqSendHandler : + FFXIVIpcBasePacket< SocialReqSendHandler > +{ + uint64_t unknown; + uint8_t p1; + uint8_t p2; + uint8_t socialType; + char name[32]; + uint8_t padding[5]; +}; + +struct FFXIVIpcSocialResponseHandler : + FFXIVIpcBasePacket< SocialResponseHandler > +{ + uint64_t contentId; + uint8_t p1; + uint8_t p2; + uint8_t socialType; + uint8_t response; + uint32_t unknown; +}; + +struct FFXIVIpcPartySetLeaderHandler : + FFXIVIpcBasePacket< PartySetLeaderHandler > +{ + uint64_t contentId; + uint8_t p1; + uint8_t p2; + char name[32]; + uint8_t padding[6]; +}; + +struct FFXIVIpcLeavePartyHandler : + FFXIVIpcBasePacket< LeavePartyHandler > +{ + uint64_t empty; +}; + +struct FFXIVIpcKickPartyMemberHander : + FFXIVIpcBasePacket< KickPartyMemberHandler > +{ + uint64_t contentId; + uint8_t p1; + uint8_t p2; + char name[32]; + uint8_t padding[6]; +}; + +struct FFXIVIpcDisbandPartyHandler : + FFXIVIpcBasePacket< DisbandPartyHandler > +{ + uint64_t empty; +}; + + +struct FFXIVIpcDive : + FFXIVIpcBasePacket< Dive > +{ + float unknown; + Common::FFXIVARR_POSITION3 posTarget; + Common::FFXIVARR_POSITION3 posOriginal; + uint32_t padding; +}; + +struct FFXIVIpcHousingEditExterior : + FFXIVIpcBasePacket< HousingEditExterior > +{ + uint16_t landId; + uint8_t unknown[6]; + uint8_t removeFlag; + uint8_t unknown2; + uint16_t container[9]; + uint16_t slot[9]; + uint16_t padding; +}; + +struct FFXIVIpcHousingEditInterior : + FFXIVIpcBasePacket< HousingEditInterior > +{ + uint64_t unknown; + uint16_t container[10]; + uint16_t slot[10]; +}; + +struct FFXIVIpcEventYieldHandler : + FFXIVIpcBasePacket< EventYield2Handler > +{ + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint64_t unknown; +}; + +struct FFXIVIpcEventYield16Handler : + FFXIVIpcBasePacket< EventYield16Handler > +{ + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t params[16]; +}; + +struct FFXIVIpcCFCommenceHandler : + FFXIVIpcBasePacket< CFCommenceHandler > +{ + uint8_t param; + uint8_t dummy[7]; +}; + } #endif //_CORE_NETWORK_PACKETS_ZONE_CLIENT_IPC_H diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 8812e17f..87ab1c3d 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -46,6 +46,19 @@ namespace Sapphire::Network::Packets::Server char msg[1012]; }; + struct FFXIVIpcPartyChat : FFXIVIpcBasePacket< PartyChat > + { + uint64_t unknown; + uint64_t contentId; + uint32_t charaId; + uint8_t u1; + uint8_t u2; + uint8_t u3; + char name[32]; + char message[1024]; + uint8_t padding; + }; + struct FFXIVIpcChatBanned : FFXIVIpcBasePacket< ChatBanned > { uint8_t padding[4]; // I was not sure reinterpreting ZST is valid behavior in C++. @@ -244,6 +257,7 @@ namespace Sapphire::Network::Packets::Server uint8_t rank; uint16_t padding; uint8_t lsName[20]; + uint8_t unk[16]; } entry[8]; }; @@ -283,6 +297,17 @@ namespace Sapphire::Network::Packets::Server char unk2[0x4]; // This has probs something to do with the support desk (inquiry id?) }; + struct FFFXIVIpcMarketTaxRates : FFXIVIpcBasePacket< MarketTaxRates > + { + // Same handler as MiniCactpotInit + uint32_t type; + uint16_t category; + uint8_t unknown1; + uint8_t unknown2; + uint32_t taxRate[Common::TOWN_COUNT]; // In the order of Common::Town + uint64_t unknown3; + }; + struct FFFXIVIpcMarketBoardItemListingCount : FFXIVIpcBasePacket< MarketBoardItemListingCount > { uint32_t itemCatalogId; @@ -322,15 +347,7 @@ namespace Sapphire::Network::Packets::Server bool hq; uint8_t materiaCount; uint8_t onMannequin; - /** - * 0x01 Limsa Lominsa - * 0x02 Gridania - * 0x03 Ul'dah - * 0x04 Ishgard - * 0x07 Kugane - * 0x0A Crystarium - */ - uint8_t retainerCity; + Common::Town marketCity; uint16_t dyeId; uint16_t padding3; uint32_t padding4; @@ -419,8 +436,9 @@ namespace Sapphire::Network::Packets::Server uint32_t max_hp; uint16_t current_mp; uint16_t max_mp; - uint16_t currentTp; - uint16_t unknown1; + uint8_t shieldPercentage; + uint8_t unknown1; + uint16_t unknown2; Common::StatusEffect effect[30]; uint32_t padding; }; @@ -437,17 +455,16 @@ namespace Sapphire::Network::Packets::Server */ struct FFXIVIpcEffectResult : FFXIVIpcBasePacket< EffectResult > { - uint32_t unknown; + uint32_t globalSequence; uint32_t actor_id; - uint8_t unknown1; - uint8_t unknown2; - uint16_t padding1; uint32_t current_hp; - uint16_t current_mp; - uint16_t current_tp; uint32_t max_hp; - uint16_t max_mp; - uint16_t max_something; + uint16_t current_mp; + uint8_t unknown1; + uint8_t classId; + uint8_t shieldPercentage; + uint8_t entryCount; + uint16_t unknown2; struct StatusEntry { @@ -455,12 +472,11 @@ namespace Sapphire::Network::Packets::Server uint8_t unknown3; uint16_t id; uint16_t param; - uint16_t unknown5; // Sort this out (old right half of power/param property) + uint16_t unknown4; // Sort this out (old right half of power/param property) float duration; uint32_t sourceActorId; } statusEntries[4]; - uint32_t unknown4; }; /** @@ -525,33 +541,6 @@ namespace Sapphire::Network::Packets::Server /* 0012 */ uint32_t unknown_12; }; - - /** - * Structural representation of the packet sent by the server - * for battle actions - */ - struct EffectHeader - { - uint64_t animationTargetId; // who the animation targets - - uint32_t actionId; // what the casting player casts, shown in battle log/ui - uint32_t globalEffectCounter; // seems to only increment on retail? - - float animationLockTime; // maybe? doesn't seem to do anything - uint32_t someTargetId; // always 00 00 00 E0, 0x0E000000 is the internal def for INVALID TARGET ID - - uint16_t hiddenAnimation; // if 0, always shows animation, otherwise hides it. counts up by 1 for each animation skipped on a caster - uint16_t rotation; - uint16_t actionAnimationId; // the animation that is played by the casting character - uint8_t variation; // variation in the animation - Common::ActionEffectDisplayType effectDisplayType; - - uint8_t unknown20; // is read by handler, runs code which gets the LODWORD of animationLockTime (wtf?) - uint8_t effectCount; // ignores effects if 0, otherwise parses all of them - uint16_t padding_21; - - }; - struct FFXIVIpcEffect : FFXIVIpcBasePacket< Effect > { uint64_t animationTargetId; // who the animation targets @@ -596,17 +585,35 @@ namespace Sapphire::Network::Packets::Server template< int size > struct FFXIVIpcAoeEffect { - EffectHeader header; + uint64_t animationTargetId; // who the animation targets - Common::EffectEntry effects[size]; + uint32_t actionId; // what the casting player casts, shown in battle log/ui + uint32_t globalSequence; // seems to only increment on retail? + + float animationLockTime; // maybe? doesn't seem to do anything + uint32_t someTargetId; // always 00 00 00 E0, 0x0E000000 is the internal def for INVALID TARGET ID + + uint16_t sourceSequence; // if 0, always shows animation, otherwise hides it. counts up by 1 for each animation skipped on a caster + uint16_t rotation; + uint16_t actionAnimationId; // the animation that is played by the casting character + uint8_t variation; // variation in the animation + Common::ActionEffectDisplayType effectDisplayType; + + uint8_t unknown20; // is read by handler, runs code which gets the LODWORD of animationLockTime (wtf?) + uint8_t effectCount; // ignores effects if 0, otherwise parses all of them + uint16_t padding_21[3]; + uint16_t padding; + + struct + { + Common::EffectEntry entries[8]; + } effects[size]; uint16_t padding_6A[3]; - uint32_t effectTargetId[size]; - Common::FFXIVARR_POSITION3 position; - uint32_t effectFlags; - - uint32_t padding_78; + uint64_t effectTargetId[size]; + uint16_t unkFlag[3]; // all 0x7FFF + uint16_t unk[3]; }; struct FFXIVIpcAoeEffect8 : @@ -669,11 +676,11 @@ namespace Sapphire::Network::Packets::Server uint32_t displayFlags; uint16_t fateID; uint16_t mPCurr; - uint16_t tPCurr; uint16_t mPMax; - uint16_t tPMax; + uint16_t unk; // == 0 uint16_t modelChara; uint16_t rotation; + uint16_t currentMount; uint16_t activeMinion; uint8_t spawnIndex; uint8_t state; @@ -687,21 +694,20 @@ namespace Sapphire::Network::Packets::Server uint8_t classJob; uint8_t u26d; uint16_t u27a; - uint8_t currentMount; uint8_t mountHead; uint8_t mountBody; uint8_t mountFeet; uint8_t mountColor; uint8_t scale; - uint32_t u29b; - uint32_t u30b; + uint8_t elementData[6]; + uint8_t unknown5_5[3]; Common::StatusEffect effect[30]; Common::FFXIVARR_POSITION3 pos; uint32_t models[10]; char name[32]; uint8_t look[26]; char fcTag[6]; - uint32_t unk30; + uint32_t unk30[2]; }; /** @@ -744,10 +750,10 @@ namespace Sapphire::Network::Packets::Server uint32_t displayFlags; uint16_t fateID; uint16_t mPCurr; - uint16_t tPCurr; - uint16_t mPMax; - uint16_t tPMax; + uint16_t unknown1; + uint16_t unknown2; uint16_t modelChara; + uint16_t currentMount; uint16_t rotation; uint16_t activeMinion; uint8_t spawnIndex; @@ -762,15 +768,13 @@ namespace Sapphire::Network::Packets::Server uint8_t classJob; uint8_t u26d; uint16_t u27a; - uint8_t currentMount; uint8_t mountHead; uint8_t mountBody; uint8_t mountFeet; uint8_t mountColor; uint8_t scale; - uint16_t elementalLevel; // Eureka - uint16_t element; // Eureka - uint32_t u30b; + uint8_t elemental[6]; + uint8_t unknown5_5[3]; Common::StatusEffect effect[30]; Common::FFXIVARR_POSITION3 pos; uint32_t models[10]; @@ -782,7 +786,7 @@ namespace Sapphire::Network::Packets::Server uint8_t bNPCPartSlot; uint8_t unk32; uint16_t unk33; - uint32_t unk34; + uint32_t unk34[2]; }; /** @@ -840,10 +844,11 @@ namespace Sapphire::Network::Packets::Server uint16_t action_id; Common::SkillType skillType; uint8_t unknown; - uint32_t unknown_1; // Also action id + uint32_t unknown_1; // action id or mount id float cast_time; uint32_t target_id; - float rotation; // In radians + uint16_t rotation; + uint16_t flag; // 1 = interruptible blinking cast bar uint32_t unknown_2; uint16_t posX; uint16_t posY; @@ -922,15 +927,17 @@ namespace Sapphire::Network::Packets::Server //Current instance can be confirmed at any time using the /instance text command." ( 7B F8 69 ) uint8_t unknown5; + uint32_t unknown7; uint32_t unknown8; - uint16_t festivalId; - uint16_t additionalFestivalId; uint32_t unknown9; uint32_t unknown10; - uint32_t unknown11; - uint32_t unknown12[4]; + uint32_t festivalId; + uint32_t unknown12[3]; + uint32_t additionalFestivalId; + uint32_t unknown13[3]; Common::FFXIVARR_POSITION3 pos; - uint32_t unknown13; + uint32_t unknown14[3]; + uint32_t unknown15; }; @@ -978,6 +985,7 @@ namespace Sapphire::Network::Packets::Server unsigned char expansion; unsigned char unknown76; unsigned char unknown77; + unsigned char very_unknown; unsigned char race; unsigned char tribe; unsigned char gender; @@ -1004,7 +1012,7 @@ namespace Sapphire::Network::Packets::Server unsigned char craftingMasterMask; unsigned char unknown95[9]; unsigned char unknown9F[2]; - unsigned char unknownA1[3]; + unsigned char unknownA1[6]; unsigned int exp[Common::CLASSJOB_SLOTS]; unsigned int unknown108; unsigned int pvpTotalExp; @@ -1012,6 +1020,7 @@ namespace Sapphire::Network::Packets::Server unsigned int pvpExp; unsigned int pvpFrontlineOverallRanks[3]; unsigned short levels[Common::CLASSJOB_SLOTS]; + /* unsigned short unknown15C[9]; unsigned short u1; unsigned short u2; @@ -1025,8 +1034,17 @@ namespace Sapphire::Network::Packets::Server unsigned char companionDefRank; unsigned char companionAttRank; unsigned char companionHealRank; - unsigned char u19[2]; - unsigned char mountGuideMask[19]; + unsigned char u19[8]; + unsigned char mountGuideMask[22]; + unsigned char u19_2; + */ + unsigned char unknown5_55a[178]; + unsigned char companionName[21]; + unsigned char companionDefRank; + unsigned char companionAttRank; + unsigned char companionHealRank; + unsigned char mountGuideMask[29]; + //== char name[32]; unsigned char unknownOword[16]; unsigned char unknownOw; @@ -1034,13 +1052,14 @@ namespace Sapphire::Network::Packets::Server unsigned char aetheryte[21]; unsigned char discovery[445]; unsigned char howto[34]; - unsigned char minions[45]; + unsigned char minions[55]; unsigned char chocoboTaxiMask[10]; - unsigned char watchedCutscenes[124]; - unsigned char companionBardingMask[10]; + unsigned char watchedCutscenes[137]; + unsigned char companionBardingMask[11]; unsigned char companionEquippedHead; unsigned char companionEquippedBody; unsigned char companionEquippedLegs; + /* unsigned char unknown52A[4]; unsigned char unknownMask52E[11]; unsigned char fishingGuideMask[105]; @@ -1050,7 +1069,11 @@ namespace Sapphire::Network::Packets::Server unsigned char beastRank[11]; unsigned char unknownPvp5AB[11]; unsigned char unknown5B9[5]; + */ + unsigned char unknown5_45b[236]; + //== unsigned char pose; + /* unsigned char unknown5B91; unsigned char challengeLogComplete[9]; unsigned char weaponPose; @@ -1064,24 +1087,34 @@ namespace Sapphire::Network::Packets::Server unsigned char u13; unsigned char aetherCurrentMask[22]; unsigned char u10[3]; - unsigned char orchestrionMask[40]; + */ + unsigned char unknown5_55b[295]; + //== + unsigned char orchestrionMask[40]; // this field may already be extended, if it is, the beginning bytes are at the end of unknown5_55b unsigned char hallOfNoviceCompletion[3]; unsigned char animaCompletion[11]; - unsigned char u14[16]; - unsigned char u15[13]; + unsigned char unknown5_55c[35]; unsigned char unlockedRaids[28]; unsigned char unlockedDungeons[18]; unsigned char unlockedGuildhests[10]; - unsigned char unlockedTrials[8]; - unsigned char unlockedPvp[5]; + /* + at least 8 bytes at most 10 bytes in unlockedTrials not confirmed, adjust unlockedPvp so they share a total of 15 bytes and sync with clearedTrials/clearedPvp. + */ + unsigned char unlockedTrials[9]; + unsigned char unlockedPvp[6]; + //== unsigned char clearedRaids[28]; unsigned char clearedDungeons[18]; unsigned char clearedGuildhests[10]; - unsigned char clearedTrials[8]; - unsigned char clearedPvp[5]; + unsigned char clearedTrials[9]; + unsigned char clearedPvp[6]; + /* unsigned short fishingRecordsFishWeight[26]; unsigned int exploratoryMissionNextTimestamp; unsigned char pvpLevel; + */ + unsigned char unknown5_55d[9]; + //== }; @@ -1205,7 +1238,8 @@ namespace Sapphire::Network::Packets::Server uint32_t appearanceCatalogId; uint64_t crafterId; uint8_t quality; - uint8_t unknown[3]; + uint8_t stain; + uint8_t unknown[2]; struct Materia { uint16_t materiaId; @@ -1300,8 +1334,7 @@ namespace Sapphire::Network::Packets::Server struct FFXIVIpcInventoryTransaction : FFXIVIpcBasePacket< InventoryTransaction > { uint32_t sequence; - uint8_t type; - uint8_t padding; + uint16_t type; uint16_t padding1; uint32_t ownerId; uint32_t storageId; @@ -1406,11 +1439,39 @@ namespace Sapphire::Network::Packets::Server uint8_t unknown[8]; }; + struct FFXIVIpcEventPlay16 : FFXIVIpcBasePacket< EventPlay16 > + { + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t flags; + uint32_t param3; + uint8_t paramSize; + uint8_t padding1[3]; + uint32_t param[16]; + uint32_t padding2; + }; + + template< int ArgCount > + struct FFXIVIpcEventPlayN + { + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t sceneFlags; + uint32_t unknown; + uint8_t paramSize; + uint8_t padding2[3]; + uint32_t params[ArgCount]; + }; + /** * Structural representation of the packet sent by the server * to play an event */ - struct FFXIVIpcDirectorPlayScene : FFXIVIpcBasePacket< DirectorPlayScene > + struct FFXIVIpcDirectorPlayScene : FFXIVIpcBasePacket< EventPlay32 > { uint64_t actorId; uint32_t eventId; @@ -1439,15 +1500,10 @@ namespace Sapphire::Network::Packets::Server /* 000C */ uint32_t padding1; }; - struct FFXIVIpcEventOpenGilShop : FFXIVIpcBasePacket< EventOpenGilShop > + struct FFXIVIpcEventPlay255 : + FFXIVIpcBasePacket< EventPlay255 >, + FFXIVIpcEventPlayN< 255 > { - uint64_t actorId; - uint32_t eventId; - uint16_t scene; - uint16_t padding; - uint32_t sceneFlags; - - uint32_t unknown_wtf[0x101]; }; @@ -1494,8 +1550,8 @@ namespace Sapphire::Network::Packets::Server */ struct FFXIVIpcQuestCompleteList : FFXIVIpcBasePacket< QuestCompleteList > { - uint8_t questCompleteMask[480]; - uint8_t unknownCompleteMask[32]; + uint8_t questCompleteMask[487]; + uint8_t unknownCompleteMask[73]; }; /** @@ -1546,15 +1602,14 @@ namespace Sapphire::Network::Packets::Server /** * Structural representation of the packet sent by the server - * to send a unviel a map + * to send a unveil a map */ struct FFXIVIpcDiscovery : FFXIVIpcBasePacket< Discovery > { - /* 0000 */ uint32_t map_part_id; - /* 0004 */ uint32_t map_id; + /* 0000 */ uint32_t mapPartId; + /* 0004 */ uint32_t mapId; }; - /** * UNKOWN TYPE */ @@ -1676,6 +1731,80 @@ namespace Sapphire::Network::Packets::Server uint8_t bitmask; }; + struct FFXIVIpcMiniCactPotInit : FFXIVIpcBasePacket< MiniCactpotInit > + { + /* + * Looks like this shares a handler with MarketTaxRates and a few + * other packets, so these first fields are most likely discriminators + * or other metadata for the handler itself. + */ + uint32_t type; + uint16_t category; + uint8_t unknown1; + uint8_t unknown2; + /* + * Always 18 for this packet, incidentally the number of payouts plus 1. + * Used similarly for MarketTaxRates => for (auto i = 0; i <= indexEnd; i++) {} + */ + uint8_t indexEnd; + uint8_t unknown3; + uint16_t padding1; + /* + * On clicking a number, the client sends a ClientTrigger (DirectorSync) with an unknown + * param2, param5; param1 session, param3 column, param4 row; zero param6, and the server + * replies with an ActorControlSelf (DirectorUpdate) with an unknown param2; param1 session, + * param3 column, param4 row, param5 digit; zero param6. After a line is selected, + * the server replies with 9 DirectorUpdate packets, in order (column, row), containing every + * number on the board (why tho). Finally, one last DirectorUpdate is sent with parameters + * param1 session, param3 payout index; unknown param2, param4; zero param5, param6. + */ + uint32_t column; // zero-based + uint32_t row; + uint32_t firstDigit; + uint32_t payouts[19]; // In in-game display order + uint32_t unknown4; + /* + * All of the below fields seem to be gibberish, and change completely between + * draws and characters. + */ + uint32_t unknown5; + uint32_t unknown6; + uint32_t unknown7; + uint32_t unknown8; + uint16_t unknown9; + uint16_t unknown10; + uint32_t unknown11; + uint64_t unknown12; + }; + + /** + * Structural representation of the packet sent by the server + * to place/remove field marker presets + */ + struct FFXIVIpcPlaceFieldMarkerPreset : FFXIVIpcBasePacket< PlaceFieldMarkerPreset > + { + /*! which fieldmarks to show */ + Common::FieldMarkerStatus status; + /*! A coordinates would be (float)Xints[0]/1000.0, (float)Yints[0]/1000.0, (float)Zints[0]/1000.0 */ + uint32_t Xints[8]; + uint32_t Yints[8]; + uint32_t Zints[8]; + }; + + /** + * Structural representation of the packet sent by the server + * to place/remove a field marker + */ + struct FFXIVIpcPlaceFieldMarker : FFXIVIpcBasePacket< PlaceFieldMarker > + { + Common::FieldMarkerId markerId; + uint8_t status; + uint8_t pad[2]; + uint32_t Xint; + uint32_t Yint; + uint32_t Zint; + }; + /** * Structural representation of the packet sent by the server * to mount a player @@ -1683,6 +1812,7 @@ namespace Sapphire::Network::Packets::Server struct FFXIVIpcMount : FFXIVIpcBasePacket< Mount > { uint32_t id; + uint32_t padding[3]; }; /** @@ -1719,7 +1849,7 @@ namespace Sapphire::Network::Packets::Server uint32_t bNPCName; uint32_t textId; uint32_t popupTimeMs; - uint32_t pad3[4]; + uint32_t param[6]; }; @@ -1731,7 +1861,7 @@ namespace Sapphire::Network::Packets::Server struct FFXIVIpcPerformNote : FFXIVIpcBasePacket< PerformNote > { - uint8_t data[32]; + uint8_t data[16]; }; struct FFXIVIpcHousingUpdateLandFlagsSlot : FFXIVIpcBasePacket< HousingUpdateLandFlagsSlot > @@ -1900,7 +2030,7 @@ namespace Sapphire::Network::Packets::Server uint32_t housePrice; uint8_t infoFlags; Common::HousingAppeal houseAppeal[3]; - char estateOwnerName[30]; + char estateOwnerName[32]; } houseInfoEntry[60]; }; @@ -1963,7 +2093,7 @@ namespace Sapphire::Network::Packets::Server uint16_t rotation; int16_t unknown24a; int16_t unknown24b; - uint16_t unknown28a; + uint16_t flag; int16_t unknown28c; uint32_t housingLink; Common::FFXIVARR_POSITION3 position; @@ -1988,7 +2118,231 @@ namespace Sapphire::Network::Packets::Server char otherName[32]; }; + + struct FFXIVIpcRetainerInformation : FFXIVIpcBasePacket< RetainerInformation > + { + uint8_t unknown0[8]; + uint64_t retainerId; + uint8_t hireOrder; + uint8_t itemCount; + uint8_t unknown5[2]; + uint32_t gil; + uint8_t sellingCount; + uint8_t cityId; + uint8_t classJob; + uint8_t level; + uint8_t unknown11[4]; + uint32_t retainerTask; + uint32_t retainerTaskComplete; + uint8_t unknown14; + char retainerName[20]; + }; + struct FFXIVIpcCharaVisualEffect : FFXIVIpcBasePacket< CharaVisualEffect > + { + uint32_t id; + uint32_t padding; + }; + + struct FFXIVIpcCFCancel : FFXIVIpcBasePacket< CFCancel > + { + uint32_t cancelReason; + uint32_t unknown2; + }; + + struct FFXIVIpcShopMessage : FFXIVIpcBasePacket< ShopMessage > + { + uint32_t shopId; + uint32_t msgType; + uint32_t unknown2; + uint32_t itemId; + uint32_t amount; + uint32_t price; + uint32_t unknown6; + uint32_t unknown7; + }; + + struct FFXIVIpcLootMessage : FFXIVIpcBasePacket< LootMessage > + { + Common::LootMessageType msgType; + uint8_t padding[3]; + uint32_t param1; + uint32_t param2; + uint32_t param3; + uint32_t param4; + uint32_t param5; + uint32_t param6; + uint32_t param7; + }; + + struct FFXIVIpcSocialMessage : FFXIVIpcBasePacket< SocialMessage > + { + uint64_t contentId; + uint32_t expireTime; + uint8_t p1; + uint8_t p2; + uint8_t socialType; + uint8_t padding; + uint8_t type; + uint8_t unknown4; + char name[32]; + uint8_t padding2[6]; + }; + + struct FFXIVIpcSocialMessage2 : FFXIVIpcBasePacket< SocialMessage2 > + { + uint64_t contentId; + uint32_t unknown3; + uint8_t p1; + uint8_t p2; + uint8_t socialType; + uint8_t padding; + char name[32]; + }; + + struct FFXIVIpcSocialRequestResponse : FFXIVIpcBasePacket< SocialRequestResponse > + { + uint64_t contentId; + uint32_t unknown3; + uint8_t u1AlwaysOne; + uint8_t response; + uint8_t u2AlwaysOne; + char name[32]; + uint8_t padding; + }; + + struct FFXIVIpcPartyList : FFXIVIpcBasePacket< PartyList > + { + struct + { + char name[32]; + uint64_t contentId; + uint32_t charaId; + uint32_t u1; + uint32_t u2; + uint32_t hp; + uint32_t maxHp; + uint16_t mp; + uint16_t maxMp; + uint16_t u3; + uint16_t zoneId; + uint8_t gposeSelectable; + uint8_t classId; + uint8_t u5; + uint8_t level; + uint8_t otherData[368]; + } member[8]; + uint64_t someContentId1; + uint64_t someContentId2; + uint8_t leaderIndex; + uint8_t partySize; + uint16_t padding1; + uint32_t padding2; + }; + + struct FFXIVIpcPartyMessage : FFXIVIpcBasePacket< PartyMessage > + { + uint64_t leaderContentId; + uint64_t memberContentId; + uint8_t u1; + uint8_t u2; + uint16_t type; + uint8_t partySize; // ? + char leaderName[32]; + char memberName[32]; + uint8_t padding[3]; + }; + + struct FFXIVIpcEventContinue : FFXIVIpcBasePacket< EventContinue > + { + uint32_t eventId; + uint16_t scene; + uint16_t unknown; + uint64_t unknown2; + }; + + struct FFXIVDirectorUnk4 : FFXIVIpcBasePacket< SomeDirectorUnk4 > + { + uint32_t param[4]; + uint64_t unknown; + }; + + struct FFXIVCeremonySetActorAppearance : FFXIVIpcBasePacket< CeremonySetActorAppearance > + { + uint8_t u1; + uint8_t questBL; + uint16_t padding1; + uint32_t u3; + struct + { + uint64_t mainWeaponModel; + uint64_t secWeaponModel; + uint64_t craftToolModel; + uint32_t c_u6; + uint32_t c_u7; + uint32_t charId; + uint16_t u4; + uint16_t guardianDeity; + uint32_t u5; + uint32_t models[10]; + uint8_t look[26]; + uint16_t padding3; + } actors[2]; + }; + + //For quests this is only used for pre-accepted ones. Accepted quests are getting handled by the client. + template< int ArgCount > + struct FFXIVIpcMapUpdateN + { + uint8_t entryCount; + uint8_t padding[ 3 ]; + uint32_t iconIds[ ArgCount ]; + uint32_t levelIds[ ArgCount ]; + uint32_t eventIds[ ArgCount ]; // possible event ids for this: Quest, GuildLeveAssignment, GuildOrderGuide, TripleTriad, CustomTalk, PreHandler + uint8_t additionalData[ ArgCount ]; // use unknown + }; + + struct FFXIVIpcMapUpdate : + FFXIVIpcBasePacket< MapUpdate >, + FFXIVIpcMapUpdateN< 2 > + { + }; + + struct FFXIVIpcMapUpdate4 : + FFXIVIpcBasePacket< MapUpdate4 >, + FFXIVIpcMapUpdateN< 4 > + { + }; + + struct FFXIVIpcMapUpdate8 : + FFXIVIpcBasePacket< MapUpdate8 >, + FFXIVIpcMapUpdateN< 8 > + { + }; + + struct FFXIVIpcMapUpdate16 : + FFXIVIpcBasePacket< MapUpdate16 >, + FFXIVIpcMapUpdateN< 16 > + { + }; + + struct FFXIVIpcMapUpdate32 : + FFXIVIpcBasePacket< MapUpdate32 >, + FFXIVIpcMapUpdateN< 32 > + { + }; + + struct FFXIVIpcMapUpdate64 : + FFXIVIpcBasePacket< MapUpdate64 >, + FFXIVIpcMapUpdateN< 64 > + { + }; + + struct FFXIVIpcMapUpdate128 : + FFXIVIpcBasePacket< MapUpdate128 >, + FFXIVIpcMapUpdateN< 128 > + { + }; } #endif /*_CORE_NETWORK_PACKETS_SERVER_IPC_H*/ diff --git a/src/common/Service.h b/src/common/Service.h new file mode 100644 index 00000000..8cbb43a1 --- /dev/null +++ b/src/common/Service.h @@ -0,0 +1,115 @@ +#ifndef SAPPHIRE_SERVICE_H +#define SAPPHIRE_SERVICE_H + +#include +#include +#include + +// stolen from: https://github.com/skypjack/entt/blob/master/src/entt/locator/locator.hpp + +namespace Sapphire::Common +{ + /** + * @brief Service locator, nothing more. + * + * A service locator can be used to do what it promises: locate services.
+ * Usually service locators are tightly bound to the services they expose and + * thus it's hard to define a general purpose class to do that. This template + * based implementation tries to fill the gap and to get rid of the burden of + * defining a different specific locator for each application. + * + * @tparam SvcType Type of service managed by the locator. + */ + template< typename SvcType > + struct Service + { + /*! @brief Type of service offered. */ + using ServiceType = SvcType; + + /*! @brief Default constructor, deleted on purpose. */ + Service() = delete; + + /*! @brief Default destructor, deleted on purpose. */ + ~Service() = delete; + + /** + * @brief Tests if a valid service implementation is set. + * @return True if the service is set, false otherwise. + */ + static bool empty() noexcept + { + return !static_cast< bool >( service ); + } + + /** + * @brief Returns a weak pointer to a service implementation, if any. + * + * Clients of a service shouldn't retain references to it. The recommended + * way is to retrieve the service implementation currently set each and + * every time the need of using it arises. Otherwise users can incur in + * unexpected behaviors. + * + * @return A reference to the service implementation currently set, if any. + */ + static std::weak_ptr< SvcType > get() noexcept + { + return service; + } + + /** + * @brief Returns a weak reference to a service implementation, if any. + * + * Clients of a service shouldn't retain references to it. The recommended + * way is to retrieve the service implementation currently set each and + * every time the need of using it arises. Otherwise users can incur in + * unexpected behaviors. + * + * @warning + * In case no service implementation has been set, a call to this function + * results in undefined behavior. + * + * @return A reference to the service implementation currently set, if any. + */ + static SvcType& ref() noexcept + { + return *service; + } + + /** + * @brief Sets or replaces a service. + * @tparam Impl Type of the new service to use. + * @tparam Args Types of arguments to use to construct the service. + * @param args Parameters to use to construct the service. + */ + template< typename Impl = SvcType, typename... Args > + static void set( Args&& ... args ) + { + service = std::make_shared< Impl >( std::forward< Args >( args )... ); + } + + /** + * @brief Sets or replaces a service. + * @param ptr Service to use to replace the current one. + */ + static void set( std::shared_ptr< SvcType > ptr ) + { + assert( static_cast< bool >( ptr ) ); + service = std::move( ptr ); + } + + /** + * @brief Resets a service. + * + * The service is no longer valid after a reset. + */ + static void reset() + { + service.reset(); + } + + private: + inline static std::shared_ptr< SvcType > service = nullptr; + }; +} + +#endif //SAPPHIRE_SERVICE_H diff --git a/src/common/Util/Util.cpp b/src/common/Util/Util.cpp index 2be5d946..5aa64bf6 100644 --- a/src/common/Util/Util.cpp +++ b/src/common/Util/Util.cpp @@ -129,7 +129,7 @@ uint32_t Util::getTimeSeconds() uint64_t Util::getEorzeanTimeStamp() { - return static_cast< uint64_t >( getTimeSeconds() * 20.571428571428573f ); + return static_cast< uint64_t >( getTimeSeconds() * 20.571428571428573 ); } void Util::valueToFlagByteIndexValue( uint32_t inVal, uint8_t& outVal, uint16_t& outIndex ) diff --git a/src/common/Util/UtilMath.cpp b/src/common/Util/UtilMath.cpp index ae61e171..d81a2f62 100644 --- a/src/common/Util/UtilMath.cpp +++ b/src/common/Util/UtilMath.cpp @@ -76,4 +76,9 @@ uint16_t Util::floatToUInt16Rot( float val ) uint8_t Util::floatToUInt8Rot( float val ) { return static_cast< uint8_t >( 0x80 * ( ( val + PI ) ) / PI ); +} + +float Util::floatFromUInt16Rot( uint16_t rot ) +{ + return rot / 32768.0f * PI - PI; } \ No newline at end of file diff --git a/src/common/Util/UtilMath.h b/src/common/Util/UtilMath.h index c35ef6be..1168d71b 100644 --- a/src/common/Util/UtilMath.h +++ b/src/common/Util/UtilMath.h @@ -25,6 +25,8 @@ namespace Sapphire::Common::Util uint16_t floatToUInt16Rot( float val ); + float floatFromUInt16Rot( uint16_t rot ); + uint8_t floatToUInt8Rot( float val ); template < typename T > diff --git a/src/dbm/DbManager.cpp b/src/dbm/DbManager.cpp index e39eedcd..4b7a7783 100644 --- a/src/dbm/DbManager.cpp +++ b/src/dbm/DbManager.cpp @@ -5,14 +5,14 @@ #include #include #include -#include +#include #include using namespace Sapphire; using namespace Sapphire::Common; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; DbManager::DbManager( const std::string& host, const std::string& database, const std::string& user, const std::string& pw, uint16_t port ) : m_host( host ), diff --git a/src/dbm/main.cpp b/src/dbm/main.cpp index 3eeebf2c..ed6c09d4 100644 --- a/src/dbm/main.cpp +++ b/src/dbm/main.cpp @@ -3,14 +3,14 @@ #include #include #include -#include +#include #include #include #include -Sapphire::Common::Util::CrashHandler crashHandler; +[[maybe_unused]] Sapphire::Common::Util::CrashHandler crashHandler; -namespace filesys = std::experimental::filesystem; +namespace fs = std::filesystem; #include #include @@ -30,19 +30,19 @@ std::vector< std::string > getAllFilesInDir( const std::string& dirPath, try { // Check if given path exists and points to a directory - if( filesys::exists( dirPath ) && filesys::is_directory( dirPath ) ) + if( fs::exists( dirPath ) && fs::is_directory( dirPath ) ) { // Create a Recursive Directory Iterator object and points to the starting of directory - filesys::recursive_directory_iterator iter( dirPath ); + fs::recursive_directory_iterator iter( dirPath ); // Create a Recursive Directory Iterator object pointing to end. - filesys::recursive_directory_iterator end; + fs::recursive_directory_iterator end; // Iterate till end while( iter != end ) { // Check if current entry is a directory and if exists in skip list - if( filesys::is_directory( iter->path() ) && + if( fs::is_directory( iter->path() ) && ( std::find( dirSkipList.begin(), dirSkipList.end(), iter->path().filename() ) != dirSkipList.end() ) ) { // Skip the iteration of current directory pointed by iterator diff --git a/src/lobby/Forwards.h b/src/lobby/Forwards.h index 1f54bcc7..2e2d4e36 100644 --- a/src/lobby/Forwards.h +++ b/src/lobby/Forwards.h @@ -12,11 +12,6 @@ x ## Ptr make_ ## x( Args &&...args ) { \ return std::make_shared< x >( std::forward< Args >( args ) ... ); }\ typedef std::vector< x > x ## PtrList; -namespace Sapphire -{ - TYPE_FORWARD( Framework ); -} - namespace Sapphire::Lobby { TYPE_FORWARD( LobbySession ); diff --git a/src/lobby/GameConnection.cpp b/src/lobby/GameConnection.cpp index 16c4d4da..b7156cd4 100644 --- a/src/lobby/GameConnection.cpp +++ b/src/lobby/GameConnection.cpp @@ -25,9 +25,8 @@ extern Lobby::ServerLobby g_serverLobby; extern Lobby::RestConnector g_restConnector; Lobby::GameConnection::GameConnection( Sapphire::Network::HivePtr pHive, - Sapphire::Network::AcceptorPtr pAcceptor, - FrameworkPtr pFw ) : - Sapphire::Network::Connection( pHive, pFw ), + Sapphire::Network::AcceptorPtr pAcceptor ) : + Sapphire::Network::Connection( pHive ), m_pAcceptor( pAcceptor ), m_bEncryptionInitialized( false ) { @@ -42,7 +41,7 @@ Lobby::GameConnection::~GameConnection() // overwrite the parents onConnect for our game socket needs void Lobby::GameConnection::onAccept( const std::string& host, uint16_t port ) { - auto connection = make_GameConnection( m_hive, m_pAcceptor, m_pFw ); + auto connection = make_GameConnection( m_hive, m_pAcceptor ); m_pAcceptor->accept( connection ); Logger::info( "Connect from {0}", m_socket.remote_endpoint().address().to_string() ); @@ -267,7 +266,7 @@ bool Lobby::GameConnection::sendServiceAccountList( FFXIVARR_PACKET_RAW& packet, } else { - Logger::info( "Could not retrieve session: {0}", std::string( ( char* ) &packet.data[ 0 ] + 0x20 ) ); + Logger::info( "Could not retrieve session: {0}", std::string( ( char* ) &packet.data[ 0 ] + 0x22 ) ); sendError( 1, 5006, 13001, tmpId ); return true; @@ -453,8 +452,8 @@ void Lobby::GameConnection::generateEncryptionKey( uint32_t key, const std::stri m_baseKey[ 2 ] = 0x34; m_baseKey[ 3 ] = 0x12; memcpy( m_baseKey + 0x04, &key, 4 ); - m_baseKey[ 8 ] = 0x88; - m_baseKey[ 9 ] = 0x13; + m_baseKey[ 8 ] = 0x18; + m_baseKey[ 9 ] = 0x15; memcpy( ( char* ) m_baseKey + 0x0C, keyPhrase.c_str(), keyPhrase.size() ); Common::Util::md5( m_baseKey, m_encKey, 0x2C ); } diff --git a/src/lobby/GameConnection.h b/src/lobby/GameConnection.h index fbed9386..a98c01c5 100644 --- a/src/lobby/GameConnection.h +++ b/src/lobby/GameConnection.h @@ -41,7 +41,7 @@ namespace Sapphire::Lobby std::vector< uint8_t > m_packets; public: - GameConnection( Network::HivePtr pHive, Network::AcceptorPtr pAcceptor, FrameworkPtr pFw ); + GameConnection( Network::HivePtr pHive, Network::AcceptorPtr pAcceptor ); ~GameConnection(); diff --git a/src/lobby/ServerLobby.cpp b/src/lobby/ServerLobby.cpp index b85380c9..97a252fa 100644 --- a/src/lobby/ServerLobby.cpp +++ b/src/lobby/ServerLobby.cpp @@ -10,7 +10,6 @@ #include #include -#include "Framework.h" #include "ServerLobby.h" @@ -65,9 +64,8 @@ namespace Sapphire::Lobby Logger::setLogLevel( m_config.global.general.logLevel ); - auto pFw = make_Framework(); auto hive = Network::make_Hive(); - Network::addServerToHive< GameConnection >( m_ip, m_port, hive, pFw ); + Network::addServerToHive< GameConnection >( m_ip, m_port, hive ); Logger::info( "Lobby server running on {0}:{1}", m_ip, m_port ); diff --git a/src/lobby/mainLobbyServer.cpp b/src/lobby/mainLobbyServer.cpp index eb3c7653..0b16ff26 100644 --- a/src/lobby/mainLobbyServer.cpp +++ b/src/lobby/mainLobbyServer.cpp @@ -2,7 +2,7 @@ #include -Sapphire::Common::Util::CrashHandler crashHandler; +[[maybe_unused]] Sapphire::Common::Util::CrashHandler crashHandler; Sapphire::Lobby::ServerLobby g_serverLobby( "lobby.ini" ); diff --git a/src/scripts/action/common/ActionDye2472.cpp b/src/scripts/action/common/ActionDye2472.cpp new file mode 100644 index 00000000..b1049a8d --- /dev/null +++ b/src/scripts/action/common/ActionDye2472.cpp @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +class ActionDye2472 : + public Sapphire::ScriptAPI::ActionScript +{ +public: + ActionDye2472() : + Sapphire::ScriptAPI::ActionScript( 2472 ) + { + } + + void onExecute( Sapphire::World::Action::Action& action ) override + { + auto sourceChara = action.getSourceChara(); + + if( !sourceChara->isPlayer() ) + return; + + //TODO: Effect + sourceChara->getAsPlayer()->dyeItemFromDyeingInfo(); + } +}; + +EXPOSE_SCRIPT(ActionDye2472); \ No newline at end of file diff --git a/src/scripts/action/common/ActionSprint3.cpp b/src/scripts/action/common/ActionSprint3.cpp index 133cbb2e..4a442ad7 100644 --- a/src/scripts/action/common/ActionSprint3.cpp +++ b/src/scripts/action/common/ActionSprint3.cpp @@ -18,6 +18,8 @@ public: if( !sourceChara->isPlayer() ) return; + action.getEffectbuilder()->applyStatusEffect( sourceChara, 50, 30 ); + sourceChara->getAsPlayer()->addStatusEffectByIdIfNotExist( 50, 20000, *sourceChara, 30 ); } }; diff --git a/src/scripts/common/CmnDefCutSceneReplay.cpp b/src/scripts/common/CmnDefCutSceneReplay.cpp index 2ccfab69..11c9b80b 100644 --- a/src/scripts/common/CmnDefCutSceneReplay.cpp +++ b/src/scripts/common/CmnDefCutSceneReplay.cpp @@ -32,7 +32,7 @@ public: // todo: this is fucked }; - player.playScene( getId(), 1, 0xFB2EC8F8, 0, 1, returnScene, callback ); + player.playScene( getId(), 1, FADE_OUT | CONDITION_CUTSCENE | HIDE_UI, 0, 1, returnScene, callback ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override diff --git a/src/scripts/common/GilShop.cpp b/src/scripts/common/GilShop.cpp index a57a1ecd..d18047c2 100644 --- a/src/scripts/common/GilShop.cpp +++ b/src/scripts/common/GilShop.cpp @@ -1,8 +1,8 @@ #include #include -#include #include +#include using namespace Sapphire; @@ -25,25 +25,30 @@ public: private: void shopInteractionCallback( Entity::Player& player, const Event::SceneResult& result ) { - // item purchase - if( result.param1 == 768 ) + // buy, sell, buy back + if( result.param1 == 768 || result.param1 == 512 ) { // buy if( result.param2 == 1 ) { - auto shopMgr = framework()->get< Sapphire::World::Manager::ShopMgr >(); - - shopMgr->purchaseGilShopItem( player, result.eventId, result.param3, result.param4 ); + auto& shopMgr = Common::Service< Sapphire::World::Manager::ShopMgr >::ref(); + shopMgr.purchaseGilShopItem( player, result.eventId, result.param3, result.param4 ); } - // sell // can't sell if the vendor is yourself (eg, housing permit shop) else if( result.param2 == 2 && result.actorId != player.getId() ) { - + auto& shopMgr = Common::Service< Sapphire::World::Manager::ShopMgr >::ref(); + shopMgr.shopSellItem( player, result.eventId, result.param3, result.param4 ); + } + //buy back + else if( result.param2 == 3 && result.actorId != player.getId() ) + { + auto& shopMgr = Common::Service< Sapphire::World::Manager::ShopMgr >::ref(); + shopMgr.shopBuyBack( player, result.eventId, result.param3 ); } - player.playGilShop( result.eventId, SCENE_FLAGS, std::bind( &GilShop::shopInteractionCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); + player.playGilShop( result.eventId, SCENE_FLAGS, result.param2, std::bind( &GilShop::shopInteractionCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); return; } @@ -53,7 +58,7 @@ private: void shopCallback( Entity::Player& player, const Event::SceneResult& result ) { - player.playGilShop( result.eventId, SCENE_FLAGS, std::bind( &GilShop::shopInteractionCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); + player.playGilShop( result.eventId, SCENE_FLAGS, 0, std::bind( &GilShop::shopInteractionCallback, this, std::placeholders::_1, std::placeholders::_2 ) ); } }; diff --git a/src/scripts/common/aethernet/Aetheryte.cpp b/src/scripts/common/aethernet/Aetheryte.cpp index 2ba4f14a..64acd0c5 100644 --- a/src/scripts/common/aethernet/Aetheryte.cpp +++ b/src/scripts/common/aethernet/Aetheryte.cpp @@ -1,9 +1,8 @@ #include #include -#include #include - +#include using namespace Sapphire; @@ -33,7 +32,7 @@ public: { player.playScene( eventId, 2, 0, [this]( Entity::Player& player, const Event::SceneResult& result ) { - if( result.param1 == 256 ) + if( result.param1 == 256 && result.param2 != 0 ) { player.teleport( result.param2, 2 ); } @@ -59,7 +58,8 @@ public: { if( player.isAetheryteRegistered( eventId & 0xFFFF ) ) { - player.playScene( eventId, 0, 1, [this]( Entity::Player& player, const Event::SceneResult& result ) + // eventParam4 (or params[1] if using EventPlay8, which is actually used on retail) anything bigger than 1 will show select instance menu item + player.playScene( eventId, 0, 1, 0, 1, 2, [this]( Entity::Player& player, const Event::SceneResult& result ) { if( result.param1 == 256 ) // set homepoint { @@ -68,7 +68,7 @@ public: } else if( result.param1 == 512 ) // aethernet access { - if( result.param2 == 4 ) + if( result.param2 == 4 && result.param3 != 0 ) { player.teleport( result.param3, 2 ); } @@ -108,11 +108,9 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pExdData = framework()->get< Sapphire::Data::ExdDataGenerated >(); - if( !pExdData ) - return; + auto& exdData = Common::Service< Sapphire::Data::ExdDataGenerated >::ref(); - auto aetherInfo = pExdData->get< Sapphire::Data::Aetheryte >( eventId & 0xFFFF ); + auto aetherInfo = exdData.get< Sapphire::Data::Aetheryte >( eventId & 0xFFFF ); if( !aetherInfo ) return; diff --git a/src/scripts/common/aethernet/HousingAethernet.cpp b/src/scripts/common/aethernet/HousingAethernet.cpp index f89c6d4c..1af780ad 100644 --- a/src/scripts/common/aethernet/HousingAethernet.cpp +++ b/src/scripts/common/aethernet/HousingAethernet.cpp @@ -1,10 +1,10 @@ #include #include -#include #include #include #include +#include using namespace Sapphire; @@ -21,16 +21,14 @@ public: { player.playScene( eventId, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, [this, eventId]( Entity::Player& player, const Event::SceneResult& result ) { - auto pExdData = framework()->get< Sapphire::Data::ExdDataGenerated >(); - if( !pExdData ) - return; + auto& exdData = Common::Service< Sapphire::Data::ExdDataGenerated >::ref(); auto housingZone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ); if( !housingZone ) return; // param2 is the index starting from 0 inside housingaethernet.exd, but the ID column starts at 0x001E0000........ wtf - auto pHousingAethernet = pExdData->get< Sapphire::Data::HousingAethernet >( getId() + result.param2 ); + auto pHousingAethernet = exdData.get< Sapphire::Data::HousingAethernet >( getId() + result.param2 ); if( !pHousingAethernet ) return; @@ -39,11 +37,11 @@ public: return; // todo: this needs to be done properly and used queued zoning + aethernet animation - // moving a player inside an event will crash the game so we end it hre + // moving a player inside an event will crash the game so we end it here player.eventFinish( eventId, 1 ); - auto playerMgr = framework()->get< Sapphire::World::Manager::PlayerMgr >(); - playerMgr->movePlayerToLandDestination( player, pHousingAethernet->level, housingZone->getWardNum() ); + auto& playerMgr = Common::Service< Sapphire::World::Manager::PlayerMgr >::ref(); + playerMgr.movePlayerToLandDestination( player, pHousingAethernet->level, housingZone->getWardNum() ); } ); } }; diff --git a/src/scripts/common/eobj/HousingEstateEntrance.cpp b/src/scripts/common/eobj/HousingEstateEntrance.cpp index e0447f31..bb280288 100644 --- a/src/scripts/common/eobj/HousingEstateEntrance.cpp +++ b/src/scripts/common/eobj/HousingEstateEntrance.cpp @@ -1,11 +1,11 @@ #include #include +#include #include "Actor/EventObject.h" #include "Territory/HousingZone.h" #include "Manager/TerritoryMgr.h" #include "Territory/Land.h" -#include "Framework.h" using namespace Sapphire; @@ -26,9 +26,7 @@ public: if( result.param2 != 1 ) return; - auto terriMgr = framework()->get< Sapphire::World::Manager::TerritoryMgr >(); - if( !terriMgr ) - return; + auto& terriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); auto zone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ); if( !zone ) @@ -40,7 +38,7 @@ public: ident.wardNum = zone->getWardNum(); ident.worldId = 67; - auto internalZone = terriMgr->findOrCreateHousingInterior( ident ); + auto internalZone = terriMgr.findOrCreateHousingInterior( ident ); if( !internalZone ) { // an error occurred during event movement @@ -60,6 +58,7 @@ public: switch( land->getSize() ) { + // todo: think there's actually a poprange for this? double czech case 0: { pos = { 0.1321167f, 0.f, 2.746273f }; @@ -79,7 +78,7 @@ public: return; } - player.setInstance( internalZone, pos ); + player.setInstance( internalZone, pos, player.getRot() ); } ); } }; diff --git a/src/scripts/common/housing/CmnDefHousingSignboard.cpp b/src/scripts/common/housing/CmnDefHousingSignboard.cpp index 21f13046..3de38035 100644 --- a/src/scripts/common/housing/CmnDefHousingSignboard.cpp +++ b/src/scripts/common/housing/CmnDefHousingSignboard.cpp @@ -5,7 +5,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -25,9 +25,6 @@ public: { auto callback = [ this ]( Entity::Player& player, const Event::SceneResult& result ) { - auto pFw = framework(); - if( !pFw ) - return LandPurchaseResult::ERR_INTERNAL; // Purchase Land if( result.param2 == 2 ) { @@ -36,9 +33,9 @@ public: auto pTerritory = player.getCurrentTerritory(); auto pHousing = std::dynamic_pointer_cast< HousingZone >( pTerritory ); - auto pHouMgr = pFw->get< HousingMgr >(); + auto& pHouMgr = Common::Service< HousingMgr >::ref(); - LandPurchaseResult res = pHouMgr->purchaseLand( player, activeLand.plot, + LandPurchaseResult res = pHouMgr.purchaseLand( player, activeLand.plot, static_cast< uint8_t >( result.param2 ) ); switch( res ) diff --git a/src/scripts/common/warptaxi/WarpTaxi.cpp b/src/scripts/common/warptaxi/WarpTaxi.cpp index e867cb12..8d88f6f4 100644 --- a/src/scripts/common/warptaxi/WarpTaxi.cpp +++ b/src/scripts/common/warptaxi/WarpTaxi.cpp @@ -1,9 +1,14 @@ #include #include +#include +#include + +#include "Territory/InstanceObjectCache.h" + #include -#include #include +#include using namespace Sapphire; @@ -27,13 +32,27 @@ public: player.eventFinish( 1310721, 0 ); player.eventFinish( getId(), 1 ); - auto exdData = framework()->get< Sapphire::Data::ExdDataGenerated >(); - auto warp = exdData->get< Sapphire::Data::Warp >( getId() ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto& popRange = Common::Service< Sapphire::InstanceObjectCache >::ref(); + + auto warp = exdData.get< Sapphire::Data::Warp >( getId() ); if( !warp ) return; - auto playerMgr = framework()->get< Sapphire::World::Manager::PlayerMgr >(); - playerMgr->movePlayerToLandDestination( player, warp->level, result.param3 ); + auto& playerMgr = Common::Service< Sapphire::World::Manager::PlayerMgr >::ref(); + + auto pPop = popRange.getPopRange( warp->territoryType, warp->popRange ); + + if( !pPop ) + { + std::cout << "not found..."; + } + else + { + std::cout << "found!!"; + } + + playerMgr.movePlayerToLandDestination( player, warp->popRange, result.param3 ); } else { @@ -56,11 +75,9 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto exdData = framework()->get< Sapphire::Data::ExdDataGenerated >(); - if( !exdData ) - return; + auto& exdData = Common::Service< Sapphire::Data::ExdDataGenerated >::ref(); - auto warp = exdData->get< Sapphire::Data::Warp >( eventId ); + auto warp = exdData.get< Sapphire::Data::Warp >( eventId ); if( !warp ) return; diff --git a/src/scripts/instances/questbattles/ChasingShadows.cpp b/src/scripts/instances/questbattles/ChasingShadows.cpp index 336cd0d6..8963ff11 100644 --- a/src/scripts/instances/questbattles/ChasingShadows.cpp +++ b/src/scripts/instances/questbattles/ChasingShadows.cpp @@ -38,7 +38,7 @@ private: public: ChasingShadows() : Sapphire::ScriptAPI::QuestBattleScript( 11 ) {} - void onPlayerSetup( Sapphire::QuestBattle& instance, Entity::Player& player ) + void onPlayerSetup( Sapphire::QuestBattle& instance, Entity::Player& player ) override { player.setRot( 3.f ); player.setPos( { 323.f, -1.28f, -320.f } ); diff --git a/src/scripts/quest/ManFst001.cpp b/src/scripts/quest/ManFst001.cpp index 1411a0d9..684b77f8 100644 --- a/src/scripts/quest/ManFst001.cpp +++ b/src/scripts/quest/ManFst001.cpp @@ -2,7 +2,7 @@ #include #include "Manager/EventMgr.h" #include "Event/EventHandler.h" -#include "Framework.h" +#include // Quest Script: ManFst001_00039 // Quest Name: Coming to Gridania @@ -96,8 +96,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 ) Scene00000( player ); diff --git a/src/scripts/quest/ManFst002.cpp b/src/scripts/quest/ManFst002.cpp index e7a2b364..0d0a114a 100644 --- a/src/scripts/quest/ManFst002.cpp +++ b/src/scripts/quest/ManFst002.cpp @@ -2,7 +2,7 @@ #include #include "Event/EventHandler.h" #include "Manager/EventMgr.h" -#include "Framework.h" +#include // Quest Script: ManFst002_00124 // Quest Name: Close to Home @@ -193,8 +193,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 ) Scene00000( player ); diff --git a/src/scripts/quest/ManFst003.cpp b/src/scripts/quest/ManFst003.cpp index f9725a64..e3bc085e 100644 --- a/src/scripts/quest/ManFst003.cpp +++ b/src/scripts/quest/ManFst003.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include // Quest Script: ManFst003_00123 // Quest Name: Close to Home @@ -82,8 +82,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/ManFst004.cpp b/src/scripts/quest/ManFst004.cpp index 6ec0b56a..79168cb3 100644 --- a/src/scripts/quest/ManFst004.cpp +++ b/src/scripts/quest/ManFst004.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include // Quest Script: ManFst004_00124 // Quest Name: Close to Home @@ -80,8 +80,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ManFst004::Actor0 ) { diff --git a/src/scripts/quest/ManFst005.cpp b/src/scripts/quest/ManFst005.cpp index 1089248b..f9177bf8 100644 --- a/src/scripts/quest/ManFst005.cpp +++ b/src/scripts/quest/ManFst005.cpp @@ -2,7 +2,7 @@ #include "Manager/EventMgr.h" #include "Manager/TerritoryMgr.h" #include -#include "Framework.h" +#include // Quest Script: ManFst005_00445 // Quest Name: Chasing Shadows @@ -61,8 +61,8 @@ class ManFst005 : public Sapphire::ScriptAPI::EventScript // Event Handlers void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { @@ -142,11 +142,10 @@ class ManFst005 : public Sapphire::ScriptAPI::EventScript { if( result.param2 == 1 ) { - auto pTeriMgr = framework()->get< Sapphire::World::Manager::TerritoryMgr >(); - if( !pTeriMgr ) - return; + auto& pTeriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); + player.eventFinish( result.eventId, 0 ); - pTeriMgr->createAndJoinQuestBattle( player, Questbattle0 ); + pTeriMgr.createAndJoinQuestBattle( player, Questbattle0 ); } } ); } diff --git a/src/scripts/quest/ManSea001.cpp b/src/scripts/quest/ManSea001.cpp index 0c54a0e7..ddad3d00 100644 --- a/src/scripts/quest/ManSea001.cpp +++ b/src/scripts/quest/ManSea001.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include // Quest Script: ManSea001_00107 // Quest Name: Coming to Limsa Lominsa @@ -142,8 +142,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 ) Scene00000( player ); diff --git a/src/scripts/quest/ManSea002.cpp b/src/scripts/quest/ManSea002.cpp index e6153df2..a072b62f 100644 --- a/src/scripts/quest/ManSea002.cpp +++ b/src/scripts/quest/ManSea002.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include // Quest Script: ManSea002_00108 // Quest Name: Close to Home @@ -48,8 +48,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 ) { diff --git a/src/scripts/quest/ManSea003.cpp b/src/scripts/quest/ManSea003.cpp index 2c9d712a..2032d990 100644 --- a/src/scripts/quest/ManSea003.cpp +++ b/src/scripts/quest/ManSea003.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include // Quest Script: ManSea003_00109 // Quest Name: Close to Home @@ -64,8 +64,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/ManWil001.cpp b/src/scripts/quest/ManWil001.cpp index 55fa454e..20735575 100644 --- a/src/scripts/quest/ManWil001.cpp +++ b/src/scripts/quest/ManWil001.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include // Quest Script: ManWil001_00594 // Quest Name: Coming to Ul'dah @@ -174,8 +174,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 ) { diff --git a/src/scripts/quest/ManWil002.cpp b/src/scripts/quest/ManWil002.cpp index 3c9a24bc..d340329c 100644 --- a/src/scripts/quest/ManWil002.cpp +++ b/src/scripts/quest/ManWil002.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include // Quest Script: ManWil002_00568 // Quest Name: Close to Home @@ -70,8 +70,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/ManWil003.cpp b/src/scripts/quest/ManWil003.cpp index 1380b9c0..c32b2d7a 100644 --- a/src/scripts/quest/ManWil003.cpp +++ b/src/scripts/quest/ManWil003.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include // Quest Script: ManWil003_00569 // Quest Name: Close to Home @@ -70,8 +70,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/ManWil004.cpp b/src/scripts/quest/ManWil004.cpp index aaa3b757..acbb5a53 100644 --- a/src/scripts/quest/ManWil004.cpp +++ b/src/scripts/quest/ManWil004.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include // Quest Script: ManWil004_00570 // Quest Name: Close to Home @@ -70,8 +70,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/classquest/ARC/ClsArc000.cpp b/src/scripts/quest/classquest/ARC/ClsArc000.cpp new file mode 100644 index 00000000..533b12e3 --- /dev/null +++ b/src/scripts/quest/classquest/ARC/ClsArc000.cpp @@ -0,0 +1,190 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsArc000_00021 +// Quest Name: Way of the Archer +// Quest ID: 65557 +// Start NPC: 1000197 +// End NPC: 1000200 + +class ClsArc000 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + // GetQuestUI8BL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardItem = 4657; + static constexpr auto RewardItemCount = 5; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000197; + static constexpr auto Actor1 = 1000200; + static constexpr auto Enemy0 = 37; + static constexpr auto Enemy1 = 49; + static constexpr auto Enemy2 = 47; + static constexpr auto LocFace0 = 604; + static constexpr auto LocFace1 = 605; + static constexpr auto LogmessageMonsterNotePageUnlock = 1008; + static constexpr auto Seq0Actor0 = 0; + static constexpr auto Seq1Actor1 = 1; + static constexpr auto Seq3Actor1 = 2; + static constexpr auto UnlockImageMonsterNote = 32; + + public: + ClsArc000() : Sapphire::ScriptAPI::EventScript( 65557 ){}; + ~ClsArc000(){}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if( actor == Actor0 ) + Scene00000( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq1 ) + Scene00001( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00002( player ); + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override + { + if( npcId != Enemy0 && npcId != Enemy1 && npcId != Enemy2 ) + return; + + if ( npcId == Enemy0 ) + { + auto currentKC37 = player.getQuestUI8AL( getId() ); + + if ( currentKC37 + 1 >= 3 ) + { + checkQuestCompletion( player, 1 ); + player.setQuestUI8AL( getId(), currentKC37 + 1 ); + } + else + { + player.setQuestUI8AL( getId(), currentKC37 + 1 ); + player.sendQuestMessage( getId(), 1, 2, currentKC37 + 1, 3 ); + } + } + + if ( npcId == Enemy1 ) + { + auto currentKC49 = player.getQuestUI8BH( getId() ); + + if ( currentKC49 + 1 >= 3 ) + { + checkQuestCompletion( player, 2 ); + player.setQuestUI8BH( getId(), currentKC49 + 1 ); + } + else + { + player.setQuestUI8BH( getId(), currentKC49 + 1 ); + player.sendQuestMessage( getId(), 2, 2, currentKC49 + 1, 3 ); + } + } + + if ( npcId == Enemy2 ) + { + auto currentKC47 = player.getQuestUI8BL( getId() ); + + if ( currentKC47 + 1 >= 3 ) + { + checkQuestCompletion( player, 3 ); + player.setQuestUI8BL( getId(), currentKC47 + 1 ); + } + else + { + player.setQuestUI8BL( getId(), currentKC47 + 1 ); + player.sendQuestMessage( getId(), 3, 2, currentKC47 + 1, 3 ); + } + } + } + + private: + + void checkQuestCompletion( Entity::Player& player, uint32_t varIdx ) + { + if( varIdx == 1 ) + player.sendQuestMessage( getId(), 1, 0, 0, 0 ); + else if( varIdx == 2 ) + player.sendQuestMessage( getId(), 2, 0, 0, 0 ); + else + player.sendQuestMessage( getId(), 3, 0, 0, 0 ); + + auto questId = getId(); + + auto QUEST_ONKILL_37 = player.getQuestUI8AL( questId ); + auto QUEST_ONKILL_49 = player.getQuestUI8BH( questId ); + auto QUEST_ONKILL_47 = player.getQuestUI8BL( questId ); + + if( QUEST_ONKILL_37 >= 3 && QUEST_ONKILL_49 >= 3 && QUEST_ONKILL_47 >= 3 ) + { + player.updateQuest( questId, SeqFinish ); + } + } + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq1 ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.sendQuestMessage( getId(), 0, 0, 0, 0 ); + player.updateQuest( getId(), Seq2 ); + } + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + if( player.giveQuestRewards( getId(), 0 ) ) + { + player.learnAction( 21 ); + player.finishQuest( getId() ); + } + } + } ); + } +}; + +EXPOSE_SCRIPT( ClsArc000 ); \ No newline at end of file diff --git a/src/scripts/quest/classquest/ARC/ClsArc001.cpp b/src/scripts/quest/classquest/ARC/ClsArc001.cpp new file mode 100644 index 00000000..8f3b86c5 --- /dev/null +++ b/src/scripts/quest/classquest/ARC/ClsArc001.cpp @@ -0,0 +1,456 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsArc001_00046 +// Quest Name: A Matter of Perspective +// Quest ID: 65582 +// Start NPC: 1000200 +// End NPC: 1000200 + +class ClsArc001 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + // GetQuestUI8BH + + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + Seq3 = 3, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardItem = 1891; + static constexpr auto RewardItemCount = 1; + uint16_t RewardItemOptional[5] = { 3003, 2653, 3530, 4305, 5823 }; + uint16_t RewardItemOptionalCount[5] = { 1, 1, 1, 1, 5 }; + + // Entities found in the script data of the quest + static constexpr auto Action0 = 97; + static constexpr auto Actor0 = 1000200; + static constexpr auto CutScene01 = 10; + static constexpr auto Enemy0 = 5; + static constexpr auto Enemy1 = 32; + static constexpr auto Eobject0 = 2000925; + static constexpr auto Eobject1 = 2000926; + static constexpr auto Eobject2 = 2000927; + static constexpr auto Eobject3 = 2000928; + static constexpr auto Eobject4 = 2000929; + static constexpr auto Eobject5 = 2000930; + static constexpr auto Eobject6 = 2000931; + static constexpr auto Eobject7 = 2000934; + + public: + ClsArc001() : Sapphire::ScriptAPI::EventScript( 65582 ){}; + ~ClsArc001(){}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + if( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if( actor == Actor0 && player.getQuestSeq( getId() ) == Seq2 ) + Scene00025( player ); + if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00028( player ); + } + + void onEObjHit( Entity::Player& player, uint64_t actorId, uint32_t actionId ) + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + //Eobjects + // eventActionStart let crash world.exe + // eventStart is hardcode fix + if ( actor == Eobject0 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00001( player ); + } + else if (actor == Eobject1) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00002( player ); + } + else if ( actor == Eobject2 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00003( player ); + } + else if ( actor == Eobject3 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00004( player ); + } + else if ( actor == Eobject4 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00005( player ); + } + else if ( actor == Eobject5 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00006( player ); + } + else if ( actor == Eobject6 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00007( player ); + } + else if ( actor == Eobject7 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00008( player ); + } + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) + { + if( npcId != Enemy0 && npcId != Enemy1 ) + return; + // PALESEMENTE SBAGLIATO + auto currentKC5 = player.getQuestUI8AL( getId() ) + 1; + auto currentKC32 = player.getQuestUI8BH( getId() ) + 1; + + if ( npcId == Enemy0 ) + { + if ( currentKC5 >= 8 ) + { + player.setQuestUI8AL( getId(), currentKC5 ); + checkQuestCompletion( player, 2 ); + player.sendQuestMessage( getId(), 2, 2, currentKC5, 8 ); + } + else if ( currentKC5 < 8 ) + { + player.setQuestUI8AL( getId(), currentKC5 ); + player.sendQuestMessage( getId(), 2, 2, currentKC5, 8 ); + } + } + if ( npcId == Enemy1 ) + { + if ( currentKC32 >= 8 ) + { + player.setQuestUI8BH( getId(), currentKC32 ); + checkQuestCompletion( player, 2 ); + player.sendQuestMessage( getId(), 3, 2, currentKC32, 8 ); + } + else if ( currentKC32 < 8 ) + { + player.setQuestUI8BH( getId(), currentKC32 ); + player.sendQuestMessage( getId(), 3, 2, currentKC32, 8 ); + } + } + } + + private: + + void checkQuestCompletion( Entity::Player& player, uint32_t varIdx ) + { + if( varIdx == 1 ) + { + auto currentCC = player.getQuestUI8AL( getId() ); + + player.sendQuestMessage( getId(), 0, 2, currentCC + 1, 6 ); + player.setQuestUI8AL( getId(), currentCC + 1 ); + + if( currentCC + 1 >= 6 ) + { + player.updateQuest( getId(), Seq2 ); + player.setQuestUI8AL( getId(), 0 ); + } + else + { + player.setQuestUI8AL( getId(), currentCC + 1 ); + } + } + else if(varIdx == 2) + { + auto QUEST_ONKILL_5 = player.getQuestUI8AL( getId() ); + auto QUEST_ONKILL_32 = player.getQuestUI8BH( getId() ); + + if( QUEST_ONKILL_5 == 8 && QUEST_ONKILL_32 == 8 ) + { + player.updateQuest( getId(), SeqFinish ); + } + } + } + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq1 ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 1, true ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 2, true ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 3, true ); + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 4, true ); + } ); + } + + void Scene00005( Entity::Player& player ) + { + player.playScene( getId(), 5, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 5, true ); + } ); + } + + void Scene00006( Entity::Player& player ) + { + player.playScene( getId(), 6, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 6, true ); + } ); + } + + void Scene00007( Entity::Player& player ) + { + player.playScene( getId(), 7, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 7, true ); + } ); + } + + void Scene00008( Entity::Player& player ) + { + player.playScene( getId(), 8, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 8, true ); + } ); + } + + void Scene00009( Entity::Player& player ) + { + player.playScene( getId(), 9, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00010( Entity::Player& player ) + { + player.playScene( getId(), 10, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00011( Entity::Player& player ) + { + player.playScene( getId(), 11, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00012( Entity::Player& player ) + { + player.playScene( getId(), 12, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00013( Entity::Player& player ) + { + player.playScene( getId(), 13, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00014( Entity::Player& player ) + { + player.playScene( getId(), 14, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00015( Entity::Player& player ) + { + player.playScene( getId(), 15, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00016( Entity::Player& player ) + { + player.playScene( getId(), 16, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00017( Entity::Player& player ) + { + player.playScene( getId(), 17, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00018( Entity::Player& player ) + { + player.playScene( getId(), 18, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00019( Entity::Player& player ) + { + player.playScene( getId(), 19, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00020( Entity::Player& player ) + { + player.playScene( getId(), 20, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00021( Entity::Player& player ) + { + player.playScene( getId(), 21, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00022( Entity::Player& player ) + { + player.playScene( getId(), 22, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00023( Entity::Player& player ) + { + player.playScene( getId(), 23, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00024( Entity::Player& player ) + { + player.playScene( getId(), 24, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00025( Entity::Player& player ) + { + player.playScene( getId(), 25, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 1, 2, 0, 0 ); + player.updateQuest( getId(), Seq3 ); + } ); + } + + void Scene00026( Entity::Player& player ) + { + player.playScene( getId(), 26, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00027( Entity::Player& player ) + { + player.playScene( getId(), 27, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00028( Entity::Player& player ) + { + player.playScene( getId(), 28, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + if( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } + } ); + } +}; + +EXPOSE_SCRIPT(ClsArc001); \ No newline at end of file diff --git a/src/scripts/quest/classquest/ARC/ClsArc002.cpp b/src/scripts/quest/classquest/ARC/ClsArc002.cpp new file mode 100644 index 00000000..075e2a5d --- /dev/null +++ b/src/scripts/quest/classquest/ARC/ClsArc002.cpp @@ -0,0 +1,488 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsArc002_00067 +// Quest Name: School of Hard Nocks +// Quest ID: 65603 +// Start NPC: 1000200 +// End NPC: 1000200 + +class ClsArc002 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + // GetQuestUI8BH + + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + Seq3 = 3, + Seq4 = 4, + Seq5 = 5, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardItem = 1893; + static constexpr auto RewardItemCount = 1; + uint16_t RewardItemOptional[5] = { 3016, 2662, 3539, 3772, 5824 }; + uint16_t RewardItemOptionalCount[5] = { 1, 1, 1, 1, 2 }; + + // Entities found in the script data of the quest + static constexpr auto Action0 = 97; + static constexpr auto Actor0 = 1000200; + static constexpr auto Actor1 = 1000199; + static constexpr auto Actor2 = 1000204; + static constexpr auto Enemy0 = 39; + static constexpr auto Enemy1 = 12; + static constexpr auto Eobject0 = 2000936; + static constexpr auto Eobject1 = 2000937; + static constexpr auto Eobject2 = 2000938; + static constexpr auto Eobject3 = 2000939; + static constexpr auto Eobject4 = 2000940; + static constexpr auto Eobject5 = 2001171; + static constexpr auto Eobject6 = 2001173; + static constexpr auto Eobject7 = 2001174; + static constexpr auto UnlockCheckClassStart = 6; + static constexpr auto UnlockImageClassCange = 22; + static constexpr auto UnlockImageGearSet = 29; + + public: + ClsArc002() : Sapphire::ScriptAPI::EventScript( 65603 ){}; + ~ClsArc002(){}; + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor(static_cast(actorId)); + + if( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq1 ) + Scene00001( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq3 ) + Scene00026( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq5 ) + Scene00029( player ); + if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00030( player ); + } + + void onEObjHit( Entity::Player& player, uint64_t actorId, uint32_t actionId ) + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + //Eobjects + // eventActionStart let crash world.exe + // eventStart is hardcode fix + if ( actor == Eobject0 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00002( player ); + } + else if ( actor == Eobject1 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00003( player ); + } + else if ( actor == Eobject2 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00004( player ); + } + else if ( actor == Eobject3 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00005( player ); + } + else if ( actor == Eobject4 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00006( player ); + } + else if ( actor == Eobject5 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00007( player ); + } + else if ( actor == Eobject6 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00008( player ); + } + else if ( actor == Eobject7 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00009( player ); + } + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override + { + if( npcId != Enemy0 && npcId != Enemy1 ) + return; + + auto currentKC39 = player.getQuestUI8AL( getId() ) + 1; + auto currentKC12 = player.getQuestUI8BH( getId() ) + 1; + + if ( npcId == Enemy0 ) + { + if ( currentKC39 >= 8 ) + { + player.setQuestUI8AL( getId(), currentKC39 ); + checkQuestCompletion( player, 2 ); + player.sendQuestMessage( getId(), 3, 2, currentKC39, 8 ); + } + else if ( currentKC39 < 8 ) + { + player.setQuestUI8AL( getId(), currentKC39 ); + player.sendQuestMessage( getId(), 3, 2, currentKC39, 8 ); + } + } + + if( npcId == Enemy1 ) + { + if ( currentKC12 >= 8 ) + { + player.setQuestUI8BH( getId(), currentKC12 ); + checkQuestCompletion( player, 2 ); + player.sendQuestMessage( getId(), 4, 2, currentKC12, 8 ); + } + else if ( currentKC12 < 8 ) + { + player.setQuestUI8BH( getId(), currentKC12 ); + player.sendQuestMessage( getId(), 4, 2, currentKC12, 8 ); + } + } + } + + private: + + void checkQuestCompletion( Entity::Player& player, uint32_t varIdx ) + { + if( varIdx == 1 ) + { + auto currentCC = player.getQuestUI8AL( getId() ); + + player.sendQuestMessage( getId(), 1, 2, currentCC + 1, 6 ); + + if( currentCC + 1 >= 6 ) + { + player.updateQuest( getId(), Seq3 ); + player.setQuestUI8AL( getId(), 0 ); + player.setQuestUI8BH( getId(), 0 ); + } + else + { + player.setQuestUI8AL( getId(), currentCC + 1 ); + } + } + else if( varIdx == 2 ) + { + auto QUEST_ONKILL_39 = player.getQuestUI8AL( getId() ); + auto QUEST_ONKILL_12 = player.getQuestUI8BH( getId() ); + + if( QUEST_ONKILL_39 == 8 && QUEST_ONKILL_12 == 8 ) + { + player.setQuestUI8AL( getId(), 0 ); + player.setQuestUI8BH( getId(), 0 ); + player.updateQuest( getId(), Seq5 ); + } + } + } + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq1 ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq2 ); + player.sendQuestMessage( getId(), 0, 2, 0, 0 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 1, true ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 2, true ); + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 3, true ); + } ); + } + + void Scene00005( Entity::Player& player ) + { + player.playScene( getId(), 5, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 4, true ); + } ); + } + + void Scene00006( Entity::Player& player ) + { + player.playScene( getId(), 6, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 5, true ); + } ); + } + + void Scene00007( Entity::Player& player ) + { + player.playScene( getId(), 7, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 6, true ); + } ); + } + + void Scene00008( Entity::Player& player ) + { + player.playScene( getId(), 8, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 7, true ); + } ); + } + + void Scene00009( Entity::Player& player ) + { + player.playScene( getId(), 9, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player, 1 ); + player.setQuestBitFlag8( getId(), 8, true ); + } ); + } + + void Scene00010( Entity::Player& player ) + { + player.playScene( getId(), 10, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00011( Entity::Player& player ) + { + player.playScene( getId(), 11, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00012( Entity::Player& player ) + { + player.playScene( getId(), 12, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00013( Entity::Player& player ) + { + player.playScene( getId(), 13, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00014( Entity::Player& player ) + { + player.playScene( getId(), 14, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00015( Entity::Player& player ) + { + player.playScene( getId(), 15, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00016( Entity::Player& player ) + { + player.playScene( getId(), 16, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00017( Entity::Player& player ) + { + player.playScene( getId(), 17, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00018( Entity::Player& player ) + { + player.playScene( getId(), 18, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00019( Entity::Player& player ) + { + player.playScene( getId(), 19, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00020( Entity::Player& player ) + { + player.playScene( getId(), 20, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00021( Entity::Player& player ) + { + player.playScene( getId(), 21, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00022( Entity::Player& player ) + { + player.playScene( getId(), 22, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00023( Entity::Player& player ) + { + player.playScene( getId(), 23, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00024( Entity::Player& player ) + { + player.playScene( getId(), 24, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00025( Entity::Player& player ) + { + player.playScene( getId(), 25, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00026( Entity::Player& player ) + { + player.playScene( getId(), 26, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 2, 2, 0, 0 ); + player.updateQuest( getId(), Seq4 ); + } ); + } + + void Scene00027( Entity::Player& player ) + { + player.playScene( getId(), 27, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00028( Entity::Player& player ) + { + player.playScene( getId(), 28, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00029( Entity::Player& player ) + { + player.playScene( getId(), 29, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 5, 2, 0, 0 ); + player.updateQuest( getId(), SeqFinish ); + } ); + } + + void Scene00030( Entity::Player& player ) + { + player.playScene( getId(), 30, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + if ( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } + else return; + } ); + } +}; + +EXPOSE_SCRIPT( ClsArc002 ); \ No newline at end of file diff --git a/src/scripts/quest/classquest/ARC/ClsArc003.cpp b/src/scripts/quest/classquest/ARC/ClsArc003.cpp new file mode 100644 index 00000000..86c5050d --- /dev/null +++ b/src/scripts/quest/classquest/ARC/ClsArc003.cpp @@ -0,0 +1,460 @@ +#include +#include "Manager/EventMgr.h" +#include "Manager/TerritoryMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsArc003_00068 +// Quest Name: Violators Will Be Shot +// Quest ID: 65604 +// Start NPC: 1000200 +// End NPC: 1000200 + +class ClsArc003 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + Seq3 = 3, + Seq4 = 4, + Seq5 = 5, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardAction = 112; + static constexpr auto RewardItem = 1895; + static constexpr auto RewardItemCount = 1; + uint16_t RewardItemOptional[5] = { 3028, 2677, 3546, 3780, 5824 }; + uint16_t RewardItemOptionalCount[5] = { 1, 1, 1, 1, 3 }; + + // Entities found in the script data of the quest + static constexpr auto Action0 = 97; + static constexpr auto Actor0 = 1000200; + static constexpr auto Actor1 = 1000204; + static constexpr auto Actor2 = 1000199; + static constexpr auto Eobject0 = 2000941; + static constexpr auto Eobject1 = 2000942; + static constexpr auto Eobject2 = 2000943; + static constexpr auto Eobject3 = 2000944; + static constexpr auto Eobject4 = 2000945; + static constexpr auto Eobject5 = 2000946; + static constexpr auto Eobject6 = 2001179; + static constexpr auto Eobject7 = 2001180; + static constexpr auto Eobject8 = 2000962; + static constexpr auto EventActionWaiting2Middle = 12; + static constexpr auto EventMotZephyr = 366; + static constexpr auto LocAction0 = 995; + static constexpr auto LocVfx = 241; + static constexpr auto LocWs = 112; + static constexpr auto Questbattle0 = 6; + static constexpr auto Territorytype0 = 228; + + public: + ClsArc003() : Sapphire::ScriptAPI::EventScript( 65604 ){}; + ~ClsArc003(){}; + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + if( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq1 ) + Scene00001( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq3 ) + Scene00026( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq5 ) + Scene00030( player ); + if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00031( player ); + } + + void onEObjHit( Entity::Player& player, uint64_t actorId, uint32_t actionId ) + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + //Eobjects + // eventActionStart let crash world.exe + // eventStart is hardcode fix + if ( actor == Eobject0 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00002( player ); + } + else if ( actor == Eobject1 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00003( player ); + } + else if ( actor == Eobject2 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00004( player ); + } + else if ( actor == Eobject3 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00005( player ); + } + else if ( actor == Eobject4 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00006( player ); + } + else if ( actor == Eobject5 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00007( player ); + } + else if ( actor == Eobject6 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00008( player ); + } + else if ( actor == Eobject7 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00009( player ); + } + else if ( actor == Eobject8 ) + { + player.eventStart( actor, getId(), Event::EventHandler::Nest, 0, 0 ); + Scene00027( player ); + } + } + + private: + + void checkQuestCompletion( Entity::Player& player ) + { + auto currentCC = player.getQuestUI8AL( getId() ); + + player.sendQuestMessage( getId(), 1, 2, currentCC + 1, 6 ); + + if( currentCC + 1 >= 6 ) + { + player.setQuestUI8AL( getId(), 0 ); + player.updateQuest( getId(), Seq3 ); + } + else + { + player.setQuestUI8AL( getId(), currentCC + 1 ); + } + } + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq1 ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 0, 2, 0, 0 ); + player.updateQuest( getId(), Seq2 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 1, true ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 2, true ); + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 3, true ); + } ); + } + + void Scene00005( Entity::Player& player ) + { + player.playScene( getId(), 5, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 4, true ); + } ); + } + + void Scene00006( Entity::Player& player ) + { + player.playScene( getId(), 6, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 5, true ); + } ); + } + + void Scene00007( Entity::Player& player ) + { + player.playScene( getId(), 7, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 6, true ); + } ); + } + + void Scene00008( Entity::Player& player ) + { + player.playScene( getId(), 8, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 7, true ); + } ); + } + + void Scene00009( Entity::Player& player ) + { + player.playScene( getId(), 9, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 8, true ); + } ); + } + + void Scene00010( Entity::Player& player ) + { + player.playScene( getId(), 10, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00011( Entity::Player& player ) + { + player.playScene( getId(), 11, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00012( Entity::Player& player ) + { + player.playScene( getId(), 12, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00013( Entity::Player& player ) + { + player.playScene( getId(), 13, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00014( Entity::Player& player ) + { + player.playScene( getId(), 14, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00015( Entity::Player& player ) + { + player.playScene( getId(), 15, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00016( Entity::Player& player ) + { + player.playScene( getId(), 16, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00017( Entity::Player& player ) + { + player.playScene( getId(), 17, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00018( Entity::Player& player ) + { + player.playScene( getId(), 18, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00019( Entity::Player& player ) + { + player.playScene( getId(), 19, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00020( Entity::Player& player ) + { + player.playScene( getId(), 20, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00021( Entity::Player& player ) + { + player.playScene( getId(), 21, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00022( Entity::Player& player ) + { + player.playScene( getId(), 22, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00023( Entity::Player& player ) + { + player.playScene( getId(), 23, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00024( Entity::Player& player ) + { + player.playScene( getId(), 24, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00025( Entity::Player& player ) + { + player.playScene( getId(), 25, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00026( Entity::Player& player ) + { + player.playScene( getId(), 26, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.setQuestUI8AL( getId(), 0 ); + player.sendQuestMessage( getId(), 2, 2, 0, 0 ); + player.updateQuest( getId(), Seq4 ); + } ); + } + + void Scene00027( Entity::Player& player ) + { + player.playScene( getId(), 27, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + Scene00028( player ); + } ); + } + + void Scene00028( Entity::Player& player ) + { + player.playScene( getId(), 28, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq5 ); + // QuestBattle doesn't work + /*auto& pTeriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); + + player.eventFinish( result.eventId, 0 ); + pTeriMgr.createAndJoinQuestBattle( player, Questbattle0 );*/ + } + } ); + } + + void Scene00029( Entity::Player& player ) + { + player.playScene( getId(), 29, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00030( Entity::Player& player ) + { + player.playScene( getId(), 30, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 4, 2, 0, 0 ); + player.updateQuest( getId(), SeqFinish ); + } ); + } + + void Scene00031( Entity::Player& player ) + { + player.playScene( getId(), 31, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + if( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } + } ); + } +}; + +EXPOSE_SCRIPT(ClsArc003); \ No newline at end of file diff --git a/src/scripts/quest/classquest/ARC/ClsArc004.cpp b/src/scripts/quest/classquest/ARC/ClsArc004.cpp new file mode 100644 index 00000000..12cab011 --- /dev/null +++ b/src/scripts/quest/classquest/ARC/ClsArc004.cpp @@ -0,0 +1,349 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsArc004_00070 +// Quest Name: To Catch a Poacher +// Quest ID: 65606 +// Start NPC: 1000200 +// End NPC: 1000200 + +class ClsArc004 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + Seq3 = 3, + Seq4 = 4, + Seq5 = 5, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardItem = 1899; + static constexpr auto RewardItemCount = 1; + uint16_t RewardItemOptional[5] = { 3043, 2708, 3559, 3791, 5824 }; + uint16_t RewardItemOptionalCount[5] = { 1, 1, 1, 1, 5 }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000200; + static constexpr auto Actor1 = 1000590; + static constexpr auto Actor2 = 1000731; + static constexpr auto Actor3 = 1000732; + static constexpr auto Actor4 = 1000199; + static constexpr auto Actor5 = 1000204; + static constexpr auto Eobject0 = 2000947; + static constexpr auto Eobject1 = 2000948; + static constexpr auto Eobject2 = 2000949; + static constexpr auto Eobject3 = 2001105; + static constexpr auto Eobject4 = 2000136; + static constexpr auto EventActionGatherMiddle = 7; + static constexpr auto EventActionSearch = 1; + static constexpr auto EventActionWaiting = 10; + static constexpr auto LocPosActor5 = 3875531; + static constexpr auto Questbattle0 = 5; + static constexpr auto Seq0Actor0Lq = 90; + static constexpr auto Territorytype0 = 229; + + public: + ClsArc004() : Sapphire::ScriptAPI::EventScript( 65606 ){}; + ~ClsArc004(){}; + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + if( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq1 ) + Scene00002( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq5 ) // <- Player can't talk with NPC... idk + Scene00018( player ); + if( actor == Actor3 && player.getQuestSeq( getId() ) == Seq5 ) + Scene00019( player ); + if( actor == Actor2 && player.getQuestSeq( getId() ) == Seq5 ) + Scene00020( player ); + if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00021( player ); + //Eobjects + else if( actor == Eobject0 ) + player.eventActionStart( getId(), 0x07, + [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00003( player ); + }, + nullptr, eventId ); + else if( actor == Eobject1 ) + player.eventActionStart( getId(), 0x07, + [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00004( player ); + }, + nullptr, eventId ); + else if( actor == Eobject2 ) + player.eventActionStart( getId(), 0x07, + [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00005( player ); + }, + nullptr, eventId ); + else if( actor == Eobject3 ) + player.eventActionStart( getId(), 0x0A, + [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00013( player ); + player.sendQuestMessage( getId(), 2, 2, 0, 0 ); + }, + nullptr, eventId ); + else if( actor == Eobject4 ) + player.eventActionStart( getId(), 0x01, + [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00015( player ); + }, + nullptr, eventId ); + } + + private: + + void checkQuestCompletion( Entity::Player& player ) + { + auto currentCC = player.getQuestUI8AL( getId() ); + + player.sendQuestMessage( getId(), 1, 2, currentCC + 1, 3 ); + + if( currentCC + 1 >= 3 ) + { + player.updateQuest( getId(), Seq3 ); + player.setQuestUI8AL( getId(), 0 ); + } + else + { + player.setQuestUI8AL( getId(), currentCC + 1 ); + } + } + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + Scene00001( player ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq1 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 0, 2, 0, 0 ); + player.updateQuest( getId(), Seq2 ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.setQuestBitFlag8( getId(), 1, true ); + checkQuestCompletion( player ); + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.setQuestBitFlag8(getId(), 2, true); + checkQuestCompletion( player ); + } ); + } + + void Scene00005( Entity::Player& player ) + { + player.playScene( getId(), 5, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.setQuestBitFlag8(getId(), 3, true); + checkQuestCompletion( player ); + } ); + } + + void Scene00006( Entity::Player& player ) + { + player.playScene( getId(), 6, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00007( Entity::Player& player ) + { + player.playScene( getId(), 7, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00008( Entity::Player& player ) + { + player.playScene( getId(), 8, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00009( Entity::Player& player ) + { + player.playScene( getId(), 9, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00010( Entity::Player& player ) + { + player.playScene( getId(), 10, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00011( Entity::Player& player ) + { + player.playScene( getId(), 11, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00012( Entity::Player& player ) + { + player.playScene( getId(), 12, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00013( Entity::Player& player ) + { + player.playScene( getId(), 13, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq4 ); + } ); + } + + void Scene00014( Entity::Player& player ) + { + player.playScene( getId(), 14, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00015( Entity::Player& player ) + { + player.playScene( getId(), 15, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + Scene00016( player ); + } ); + } + + void Scene00016( Entity::Player& player ) + { + player.playScene( getId(), 16, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq5 ); + // QuestBattle doesn't work + /*auto& pTeriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); + + player.eventFinish(result.eventId, 0); + pTeriMgr.createAndJoinQuestBattle(player, Questbattle0);*/ + } + } ); + } + + void Scene00017( Entity::Player& player ) + { + player.playScene( getId(), 17, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00018( Entity::Player& player ) + { + player.playScene( getId(), 18, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 4, 2, 0, 0 ); + player.updateQuest( getId(), SeqFinish ); + } ); + } + + void Scene00019( Entity::Player& player ) + { + player.playScene( getId(), 19, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00020( Entity::Player& player ) + { + player.playScene( getId(), 20, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00021( Entity::Player& player ) + { + player.playScene( getId(), 21, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + if( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } + } ); + } +}; + +EXPOSE_SCRIPT(ClsArc004); \ No newline at end of file diff --git a/src/scripts/quest/classquest/ARC/ClsArc005.cpp b/src/scripts/quest/classquest/ARC/ClsArc005.cpp new file mode 100644 index 00000000..c24a77e0 --- /dev/null +++ b/src/scripts/quest/classquest/ARC/ClsArc005.cpp @@ -0,0 +1,206 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsArc005_00071 +// Quest Name: Homecoming +// Quest ID: 65607 +// Start NPC: 1000200 +// End NPC: 1000200 + +class ClsArc005 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + Seq3 = 3, + Seq4 = 4, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardItem = 1905; + static constexpr auto RewardItemCount = 1; + uint16_t RewardItemOptional[5] = { 3066, 2729, 3576, 3808, 5825 }; + uint16_t RewardItemOptionalCount[5] = { 1, 1, 1, 1, 2 }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000200; + static constexpr auto Actor1 = 1000204; + static constexpr auto Actor2 = 1000199; + static constexpr auto Actor3 = 1000534; + static constexpr auto Actor4 = 1001284; + static constexpr auto Actor5 = 1003025; + static constexpr auto Actor6 = 1003026; + static constexpr auto Eobject0 = 2000951; + static constexpr auto Eobject1 = 2001840; + static constexpr auto EventActionSearch = 1; + static constexpr auto EventActionWaiting = 10; + static constexpr auto LocActor5Action1 = 834; + static constexpr auto LocPosActor5 = 3877820; + static constexpr auto LocPosPc = 3877813; + static constexpr auto Questbattle0 = 4; + static constexpr auto Territorytype0 = 230; + + public: + ClsArc005() : Sapphire::ScriptAPI::EventScript( 65607 ){}; + ~ClsArc005(){}; + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + if( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq1 ) + Scene00002( player ); + if( actor == Actor2 && player.getQuestSeq( getId() ) == Seq2 ) + Scene00003( player ); + if( actor == Actor3 && player.getQuestSeq( getId() ) == Seq4 ) + Scene00006( player ); + if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00010( player ); + //EOBJECTS + else if( actor == Eobject0 ) + player.eventActionStart( getId(), 0x0A, + [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00004( player ); + player.sendQuestMessage( getId(), 2, 2, 0, 0 ); + }, + nullptr, eventId ); + } + + private: + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + Scene00001( player ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq1 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 0, 2, 0, 0 ); + player.updateQuest( getId(), Seq2 ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.sendQuestMessage( getId(), 1, 2, 0, 0 ); + player.updateQuest( getId(), Seq3 ); + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + Scene00005( player ); + } ); + } + + void Scene00005( Entity::Player& player ) + { + player.playScene( getId(), 5, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq4 ); + } ); + } + + void Scene00006( Entity::Player& player ) + { + player.playScene( getId(), 6, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + Scene00007( player ); + } ); + } + + void Scene00007( Entity::Player& player ) + { + player.playScene( getId(), 7, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), SeqFinish ); + // QuestBattle doesn't work + /*auto& pTeriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); + + player.eventFinish(result.eventId, 0); + pTeriMgr.createAndJoinQuestBattle(player, Questbattle0);*/ + } + } ); + } + + void Scene00008( Entity::Player& player ) + { + player.playScene( getId(), 8, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00009( Entity::Player& player ) + { + player.playScene( getId(), 9, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00010( Entity::Player& player ) + { + player.playScene( getId(), 10, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + if( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } + } ); + } +}; + +EXPOSE_SCRIPT(ClsArc005); \ No newline at end of file diff --git a/src/scripts/quest/classquest/ARC/ClsArc006.cpp b/src/scripts/quest/classquest/ARC/ClsArc006.cpp new file mode 100644 index 00000000..da055533 --- /dev/null +++ b/src/scripts/quest/classquest/ARC/ClsArc006.cpp @@ -0,0 +1,265 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsArc006_00076 +// Quest Name: The One That Got Away +// Quest ID: 65612 +// Start NPC: 1000200 +// End NPC: 1000200 + +class ClsArc006 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardAction = 113; + static constexpr auto RewardItem = 1915; + static constexpr auto RewardItemCount = 1; + uint16_t RewardItemOptional[5] = { 3100, 2753, 3597, 3827, 5825 }; + uint16_t RewardItemOptionalCount[5] = { 1, 1, 1, 1, 3 }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000200; + static constexpr auto Actor1 = 1000795; + static constexpr auto Actor2 = 1000796; + static constexpr auto Actor3 = 1000797; + static constexpr auto Actor4 = 1000798; + static constexpr auto Actor5 = 1000799; + static constexpr auto Actor6 = 1000800; + static constexpr auto Actor7 = 1003066; // silver + static constexpr auto Actor8 = 1003067; // lea + static constexpr auto Actor9 = 1003068; // pawah + static constexpr auto Eobject0 = 2001841; + static constexpr auto Eobject1 = 2000709; + static constexpr auto EventAction = 27; + static constexpr auto EventActionSearch = 1; + static constexpr auto EventMotZephyr = 366; + static constexpr auto LocAction0 = 995; + static constexpr auto LocActor0 = 1000199; + static constexpr auto LocActor1 = 1000204; + static constexpr auto LocVfx = 241; + static constexpr auto LocWs = 113; + static constexpr auto Questbattle0 = 2; + static constexpr auto Questbattle1 = 3; + static constexpr auto Seq0Actor0Lq = 98; + static constexpr auto Territorytype0 = 231; + static constexpr auto Territorytype1 = 236; + + public: + ClsArc006() : Sapphire::ScriptAPI::EventScript( 65612 ){}; + ~ClsArc006(){}; + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + if( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if( actor == Actor1 && player.getQuestSeq( getId() ) == Seq1 ) + Scene00002( player ); + if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00013( player ); + if( actor == Actor7 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00014( player ); + if( actor == Actor8 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00015( player ); + if( actor == Actor9 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00016( player ); + //EOBJECTS + else if( actor == Eobject1 ) + player.eventActionStart( getId(), 0x1B, + [ & ]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00011( player ); + }, + nullptr, eventId ); + } + + private: + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + Scene00001( player ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq1 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq2 ); + // QuestBattle doesn't work + /*auto& pTeriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); + + player.eventFinish(result.eventId, 0); + pTeriMgr.createAndJoinQuestBattle(player, Questbattle0);*/ + } + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00005( Entity::Player& player ) + { + player.playScene( getId(), 5, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00006( Entity::Player& player ) + { + player.playScene( getId(), 6, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00007( Entity::Player& player ) + { + player.playScene( getId(), 7, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00008( Entity::Player& player ) + { + player.playScene( getId(), 8, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00009( Entity::Player& player ) + { + player.playScene( getId(), 9, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00010( Entity::Player& player ) + { + player.playScene( getId(), 10, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00011( Entity::Player& player ) + { + player.playScene( getId(), 11, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + player.updateQuest( getId(), SeqFinish ); + // QuestBattle doesn't work + /*auto& pTeriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); + + player.eventFinish(result.eventId, 0); + pTeriMgr.createAndJoinQuestBattle(player, Questbattle1);*/ + } + } ); + } + + void Scene00012( Entity::Player& player ) + { + player.playScene( getId(), 12, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00013( Entity::Player& player ) + { + player.playScene( getId(), 13, SET_EOBJ_BASE | HIDE_HOTBAR | INVIS_EOBJ, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + if( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } + } ); + } + + void Scene00014( Entity::Player& player ) + { + player.playScene( getId(), 14, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00015( Entity::Player& player ) + { + player.playScene( getId(), 15, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00016( Entity::Player& player ) + { + player.playScene( getId(), 16, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } +}; + +EXPOSE_SCRIPT(ClsArc006); \ No newline at end of file diff --git a/src/scripts/quest/classquest/LNC/ClsLnc000.cpp b/src/scripts/quest/classquest/LNC/ClsLnc000.cpp new file mode 100644 index 00000000..a73330a5 --- /dev/null +++ b/src/scripts/quest/classquest/LNC/ClsLnc000.cpp @@ -0,0 +1,174 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: ClsLnc000_00023 +// Quest Name: Way of the Lancer +// Quest ID: 65559 +// Start NPC: 1000251 +// End NPC: 1000254 + +class ClsLnc000 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + // GetQuestUI8BL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + Seq2 = 2, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + static constexpr auto RewardItem = { 4639, 0, 0, 0, 0, 0 }; + static constexpr auto RewardItemCount = { 5, 0, 0, 0, 0, 0 }; + static constexpr auto RewardItemOptional = { 0, 0, 0, 0, 0 }; + static constexpr auto RewardItemOptionalCount = { 0, 0, 0, 0, 0 }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000251; + static constexpr auto Actor1 = 1000254; + static constexpr auto Enemy0 = 37; + static constexpr auto Enemy1 = 49; + static constexpr auto Enemy2 = 47; + static constexpr auto LogmessageMonsterNotePageUnlock = 1007; + static constexpr auto Seq0Actor0 = 0; + static constexpr auto Seq1Actor1 = 1; + static constexpr auto Seq3Actor1 = 2; + static constexpr auto UnlockImageMonsterNote = 32; + + public: + ClsLnc000() : Sapphire::ScriptAPI::EventScript( 65559 ){}; + ~ClsLnc000(){}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if( actor == Actor0 ) + { + if( !player.hasQuest( getId() ) ) + Scene00000( player ); + else + Scene00002( player ); + + } + else if( actor == Actor1 && player.getQuestSeq( getId() ) != SeqFinish) + { + Scene00001( player ); + } + else if( actor == Actor1 && player.getQuestSeq( getId() ) == SeqFinish ) + { + Scene00002( player ); + } + } + + bool checkCompletion( Entity::Player& player ) + { + auto al = player.getQuestUI8AL( getId() ); + auto bh = player.getQuestUI8BH( getId() ); + auto bl = player.getQuestUI8BL( getId() ); + return al == 3 && bh == 3 && bl == 3; + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override + { + + auto al = player.getQuestUI8AL( getId() ); + auto bh = player.getQuestUI8BH( getId() ); + auto bl = player.getQuestUI8BL( getId() ); + + switch( npcId ) + { + case Enemy0: + if( al < 3 ) + { + player.setQuestUI8AL( getId(), ++al ); + player.sendQuestMessage( getId(), 0, 2, al, 3 ); + } + + break; + case Enemy1: + if( bh < 3 ) + { + player.setQuestUI8BH( getId(), ++bh ); + player.sendQuestMessage( getId(), 1, 2, bh, 3 ); + } + + break; + case Enemy2: + if( bl < 3 ) + { + player.setQuestUI8BL( getId(), ++bl ); + player.sendQuestMessage( getId(), 2, 2, bl, 3 ); + } + + break; + } + + if( checkCompletion( player ) ) + { + player.updateQuest( getId(), SeqFinish ); + } + + + } + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) // accept quest + player.updateQuest( getId(), Seq1 ); + + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, FADE_OUT | HIDE_HOTBAR | CONDITION_CUTSCENE | HIDE_UI, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param1 == 256 ) // accept quest + player.updateQuest( getId(), Seq2 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + { + if( player.giveQuestRewards( getId(), 0 ) ) + { + player.finishQuest( getId() ); + player.learnAction( 21 ); + } + } + } ); + } + +}; + +EXPOSE_SCRIPT( ClsLnc000 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst001.cpp b/src/scripts/quest/subquest/gridania/SubFst001.cpp index aa7ffdef..5dc93336 100644 --- a/src/scripts/quest/subquest/gridania/SubFst001.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst001.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -73,8 +73,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst002.cpp b/src/scripts/quest/subquest/gridania/SubFst002.cpp index e3d0661c..7713deff 100644 --- a/src/scripts/quest/subquest/gridania/SubFst002.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst002.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -43,7 +43,7 @@ private: { if( result.param2 == 1 ) // finish quest { - if( player.giveQuestRewards( getId(), 0 ) ) + if( player.giveQuestRewards( getId(), result.param3 ) ) player.finishQuest( getId() ); } }; @@ -59,8 +59,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 && !player.hasQuest( getId() ) ) Scene00000( player ); diff --git a/src/scripts/quest/subquest/gridania/SubFst003.cpp b/src/scripts/quest/subquest/gridania/SubFst003.cpp index 84bc9655..87d4ff4e 100644 --- a/src/scripts/quest/subquest/gridania/SubFst003.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst003.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -52,8 +52,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst004.cpp b/src/scripts/quest/subquest/gridania/SubFst004.cpp index aa6b65f4..506b7cf9 100644 --- a/src/scripts/quest/subquest/gridania/SubFst004.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst004.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -56,8 +56,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst005.cpp b/src/scripts/quest/subquest/gridania/SubFst005.cpp index b401f66b..4846a063 100644 --- a/src/scripts/quest/subquest/gridania/SubFst005.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst005.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -48,8 +48,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if ( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst007.cpp b/src/scripts/quest/subquest/gridania/SubFst007.cpp new file mode 100644 index 00000000..533e5d73 --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst007.cpp @@ -0,0 +1,134 @@ +#include +#include "Manager/EventMgr.h" +#include +#include + +using namespace Sapphire; + +// Quest Script: SubFst007_00031 +// Quest Name: Essential Oil +// Quest ID: 65567 +// Start NPC: 1000705 +// End NPC: 1000705 + +class SubFst007 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 100; + uint32_t RewardItemOptional[3] = { 3530, 3531, 5823 }; + uint32_t RewardItemOptionalCount[3] = { 1, 1, 3 }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000705; + static constexpr auto Enemy0 = 49; + static constexpr auto Item0 = 2000098; + static constexpr auto Seq0Actor0 = 0; + static constexpr auto Seq2Actor0 = 1; + static constexpr auto Seq2Actor0Npctradeno = 99; + static constexpr auto Seq2Actor0Npctradeok = 100; + + public: + SubFst007() : Sapphire::ScriptAPI::EventScript( 65567 ){}; + ~SubFst007(){}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + if ( actor == Actor0 && !player.hasQuest( getId() ) ) + { + Scene00000( player ); + } + if ( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + { + Scene00001( player ); + } + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) + { + if ( npcId != Enemy0 ) + return; + + auto currentKC = player.getQuestUI8AL( getId() ); + + if ( currentKC + 1 >= 6 ) + { + player.setQuestUI8AL( getId(), currentKC + 1 ); + player.setQuestUI8BH( getId(), currentKC + 1 ); + player.sendQuestMessage( getId(), 0, 2, currentKC + 1, 6 ); + player.updateQuest( getId(), SeqFinish ); + } + else + { + player.sendQuestMessage( getId(), 0, 2, currentKC + 1, 6 ); + player.setQuestUI8AL( getId(), currentKC + 1 ); + player.setQuestUI8BH( getId(), currentKC + 1 ); + } + } + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + player.updateQuest( getId(), Seq1 ); + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + result.param2 == 1 ? Scene00100( player ) : Scene00099( player ); + } ); + } + + void Scene00099( Entity::Player& player ) + { + player.playScene( getId(), 99, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00100( Entity::Player& player ) + { + player.playScene( getId(), 100, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + if ( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } + } ); + } +}; + +EXPOSE_SCRIPT(SubFst007); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst008.cpp b/src/scripts/quest/subquest/gridania/SubFst008.cpp index 94613bbb..ad00c64c 100644 --- a/src/scripts/quest/subquest/gridania/SubFst008.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst008.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -56,8 +56,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { @@ -93,6 +93,7 @@ private: [ & ]( Entity::Player& player, const Event::SceneResult& result ) { player.setQuestUI8BH( getId(), 1 ); + player.sendQuestMessage( getId(), 0, 0, 0, 0 ); player.updateQuest( getId(), SeqFinish ); } ); } @@ -102,14 +103,7 @@ private: player.playScene( getId(), 2, HIDE_HOTBAR, [ & ]( Entity::Player& player, const Event::SceneResult& result ) { - if( result.param2 == 1 ) - { - Scene00100( player ); - } - else - { - Scene00099( player ); - } + result.param2 == 1 ? Scene00100( player ) : Scene00099( player ); } ); } @@ -131,7 +125,7 @@ private: { if( player.giveQuestRewards( getId(), 0 ) ) { - player.setQuestUI8BH( getId(), 0 ); + player.setQuestUI8BH( getId(), result.param3 ); player.finishQuest( getId() ); } } diff --git a/src/scripts/quest/subquest/gridania/SubFst009.cpp b/src/scripts/quest/subquest/gridania/SubFst009.cpp index 5ff64741..424d4151 100644 --- a/src/scripts/quest/subquest/gridania/SubFst009.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst009.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -52,8 +52,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst010.cpp b/src/scripts/quest/subquest/gridania/SubFst010.cpp index ea07711e..9af037f8 100644 --- a/src/scripts/quest/subquest/gridania/SubFst010.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst010.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -55,8 +55,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR0 ) Scene00000( player ); diff --git a/src/scripts/quest/subquest/gridania/SubFst011.cpp b/src/scripts/quest/subquest/gridania/SubFst011.cpp index 029e996e..63c37934 100644 --- a/src/scripts/quest/subquest/gridania/SubFst011.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst011.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -11,8 +11,6 @@ using namespace Sapphire; // Start NPC: 1000195 // End NPC: 1000195 -//NEED TEST KILLCREDIT - class SubFst011 : public Sapphire::ScriptAPI::EventScript { @@ -49,8 +47,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { @@ -67,15 +65,12 @@ public: if( npcId != Enemy0 ) return; - auto currentKC = player.getQuestUI8AL( getId() ) + 1; + auto currentKC = player.getQuestUI8AL( getId() ); + player.setQuestUI8AL( getId(), currentKC + 1 ); + player.sendQuestMessage( getId(), 0, 2, currentKC + 1, 6 ); - if( currentKC >= 6 ) + if( currentKC + 1 >= 6 ) player.updateQuest( getId(), SeqFinish ); - else - { - player.setQuestUI8AL( getId(), currentKC ); - player.sendQuestMessage( getId(), 0, 2, currentKC, 6 ); - } } private: @@ -99,7 +94,7 @@ private: { if( result.param2 == 1 ) { - if( player.giveQuestRewards( getId(), 0 ) ) + if( player.giveQuestRewards( getId(), result.param3 ) ) { player.finishQuest( getId() ); } diff --git a/src/scripts/quest/subquest/gridania/SubFst013.cpp b/src/scripts/quest/subquest/gridania/SubFst013.cpp index bca98f07..f373eb69 100644 --- a/src/scripts/quest/subquest/gridania/SubFst013.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst013.cpp @@ -1,7 +1,7 @@ #include #include #include "Manager/EventMgr.h" -#include "Framework.h" +#include using namespace Sapphire; @@ -161,8 +161,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( !player.hasQuest( getId() ) ) { @@ -182,8 +182,8 @@ public: void onEmote( uint64_t actorId, uint32_t eventId, uint32_t emoteId, Entity::Player& player ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == ACTOR1 && emoteId == 5 && player.getQuestSeq( getId() ) == SEQ_1 ) Scene00100( player ); diff --git a/src/scripts/quest/subquest/gridania/SubFst014.cpp b/src/scripts/quest/subquest/gridania/SubFst014.cpp index 45fc19c9..8eff7725 100644 --- a/src/scripts/quest/subquest/gridania/SubFst014.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst014.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -56,14 +56,14 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { Scene00000( player ); } - else if( actor == Actor0 ) + else if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) { Scene00007( player ); } @@ -131,15 +131,13 @@ private: auto currentCC = player.getQuestUI8AL( getId() ); player.sendQuestMessage( getId(), 0, 2, currentCC + 1, 6 ); + player.setQuestUI8AL( getId(), currentCC + 1 ); + player.setQuestUI8BH( getId(), currentCC + 1 ); - if( currentCC + 1 >= 6 ) + if ( currentCC + 1 >= 6 ) { player.updateQuest( getId(), SeqFinish ); } - else - { - player.setQuestUI8AL( getId(), currentCC + 1 ); - } } void Scene00000( Entity::Player& player ) @@ -211,14 +209,10 @@ private: player.playScene( getId(), 7, HIDE_HOTBAR, [ & ]( Entity::Player& player, const Event::SceneResult& result ) { - if( result.param2 == 1 ) + if ( result.param2 == 1 ) { Scene00088( player ); } - else - { - Scene00087( player ); - } } ); } @@ -227,7 +221,6 @@ private: player.playScene( getId(), 87, HIDE_HOTBAR, [ & ]( Entity::Player& player, const Event::SceneResult& result ) { - player.playScene( getId(), 87, 0, 0, 0 ); } ); } @@ -236,13 +229,9 @@ private: player.playScene( getId(), 88, HIDE_HOTBAR, [ & ]( Entity::Player& player, const Event::SceneResult& result ) { - if( result.param2 == 1 ) + if ( player.giveQuestRewards( getId(), 0 ) ) { - if( player.giveQuestRewards( getId(), 0 ) ) - { - player.setQuestUI8AL( getId(), 0 ); - player.finishQuest( getId() ); - } + player.finishQuest( getId() ); } } ); } diff --git a/src/scripts/quest/subquest/gridania/SubFst015.cpp b/src/scripts/quest/subquest/gridania/SubFst015.cpp index 5690e82e..d7e8040b 100644 --- a/src/scripts/quest/subquest/gridania/SubFst015.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst015.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -54,8 +54,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst019.cpp b/src/scripts/quest/subquest/gridania/SubFst019.cpp index d5a2338c..5dd015a5 100644 --- a/src/scripts/quest/subquest/gridania/SubFst019.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst019.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -49,8 +49,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst021.cpp b/src/scripts/quest/subquest/gridania/SubFst021.cpp new file mode 100644 index 00000000..eac5b435 --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst021.cpp @@ -0,0 +1,112 @@ +// This is an automatically generated C++ script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, move it to the correct folder in /scripts/ + +#include +#include "Manager/EventMgr.h" +#include +#include + +// Quest Script: SubFst021_00095 +// Quest Name: Hematophagic Harassment +// Quest ID: 65631 +// Start NPC: 1000640 +// End NPC: 1000640 + +using namespace Sapphire; + +class SubFst021 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000640; + static constexpr auto Enemy0 = 118; //136; <- WRONG INFO + + public: + SubFst021() : Sapphire::ScriptAPI::EventScript( 65631 ){}; + ~SubFst021(){}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if ( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if ( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00002( player ); + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override + { + if ( npcId != Enemy0 ) + return; + + auto credit = player.getQuestUI8AL( getId() ); + if ( credit + 1 >= 6 ) + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 2, credit + 1, 6 ); + player.updateQuest( getId(), SeqFinish ); + } + else + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 2, credit + 1, 6 ); + } + } + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + Scene00001( player ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq1 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + if ( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } ); + } +}; + +EXPOSE_SCRIPT( SubFst021 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst025.cpp b/src/scripts/quest/subquest/gridania/SubFst025.cpp new file mode 100644 index 00000000..9c4176c9 --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst025.cpp @@ -0,0 +1,134 @@ +// This is an automatically generated C++ script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, move it to the correct folder in /scripts/ + +#include +#include "Manager/EventMgr.h" +#include +#include + +// Quest Script: SubFst025_00103 +// Quest Name: Death to the Bean Thieves +// Quest ID: 65639 +// Start NPC: 1000627 +// End NPC: 1000656 + +using namespace Sapphire; + +class SubFst025 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000627; + static constexpr auto Actor1 = 1000656; + static constexpr auto Enemy0 = 5; + static constexpr auto Item0 = 2000075; + + public: + SubFst025() : Sapphire::ScriptAPI::EventScript( 65639 ){}; + ~SubFst025() {}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if ( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if ( actor == Actor1 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00002( player ); + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override + { + if ( npcId != Enemy0 ) + return; + + auto credit = player.getQuestUI8AL( getId() ); + + if ( credit + 1 >= 6 ) + { + player.sendQuestMessage( getId(), 0, 2, credit + 1, 6 ); + player.setQuestUI8BH( getId(), credit + 1 ); + player.updateQuest( getId(), SeqFinish ); + } + else + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.setQuestUI8BH( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 2, credit + 1, 6 ); + } + + } + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + Scene00001( player ); + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId(), Seq1 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + Scene00003( player ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + if ( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } +}; + +EXPOSE_SCRIPT( SubFst025 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst026.cpp b/src/scripts/quest/subquest/gridania/SubFst026.cpp index 05486014..13a835e4 100644 --- a/src/scripts/quest/subquest/gridania/SubFst026.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst026.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -11,8 +11,6 @@ using namespace Sapphire; // Start NPC: 1000629 // End NPC: 1000629 -//NEED TEST KILLCREDIT - class SubFst026 : public Sapphire::ScriptAPI::EventScript { @@ -51,32 +49,31 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) - { Scene00000( player ); - } else if( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) - { Scene00001( player ); - } } - void onMobKill( Entity::Player& player, uint64_t npcId ) + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override { if( npcId != Enemy0 ) return; - auto currentKC = player.getQuestUI8AL( getId() ) + 1; + auto currentKC = player.getQuestUI8AL( getId() ); - if( currentKC >= 6 ) + if ( currentKC + 1 >= 6 ) + { + player.sendQuestMessage( getId(), 0, 2, currentKC + 1, 6 ); player.updateQuest( getId(), SeqFinish ); + } else { - player.setQuestUI8AL( getId(), currentKC ); - player.sendQuestMessage( getId(), 0, 2, currentKC, 6 ); + player.setQuestUI8AL( getId(), currentKC + 1 ); + player.sendQuestMessage( getId(), 0, 2, currentKC + 1, 6 ); } } diff --git a/src/scripts/quest/subquest/gridania/SubFst029.cpp b/src/scripts/quest/subquest/gridania/SubFst029.cpp index e14918e3..b22ee88a 100644 --- a/src/scripts/quest/subquest/gridania/SubFst029.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst029.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -47,8 +47,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == SubFst029::Actor0 && !player.hasQuest( getId() ) ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst030.cpp b/src/scripts/quest/subquest/gridania/SubFst030.cpp index c32245fa..cb542930 100644 --- a/src/scripts/quest/subquest/gridania/SubFst030.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst030.cpp @@ -2,7 +2,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -65,8 +65,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst034.cpp b/src/scripts/quest/subquest/gridania/SubFst034.cpp index bde01858..2c52e661 100644 --- a/src/scripts/quest/subquest/gridania/SubFst034.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst034.cpp @@ -2,7 +2,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -56,8 +56,8 @@ class SubFst034 : public Sapphire::ScriptAPI::EventScript // Event Handlers void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { @@ -72,7 +72,7 @@ class SubFst034 : public Sapphire::ScriptAPI::EventScript } - void onBNpcKill( uint32_t npcId, Entity::Player& player ) + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override { switch( npcId ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst037.cpp b/src/scripts/quest/subquest/gridania/SubFst037.cpp new file mode 100644 index 00000000..73ca87cb --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst037.cpp @@ -0,0 +1,146 @@ +// This is an automatically generated C++ script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, move it to the correct folder in /scripts/ + +#include +#include "Manager/EventMgr.h" +#include +#include + +// Quest Script: SubFst037_00174 +// Quest Name: No Quarter Given +// Quest ID: 65710 +// Start NPC: 1000612 +// End NPC: 1000612 + +using namespace Sapphire; + +class SubFst037 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestUI8AL + // GetQuestUI8BH + // GetQuestUI8BL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000612; + static constexpr auto Enemy0 = 192; //743; <- WRONG INFO + static constexpr auto Enemy1 = 193; //744; <- WRONG INFO + static constexpr auto Enemy2 = 194; //745; <- WRONG INFO + + public: + SubFst037() : Sapphire::ScriptAPI::EventScript( 65710 ){}; + ~SubFst037() {}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if ( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if ( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00002( player ); + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override + { + auto credit = 0; + + switch( npcId ) + { + case Enemy0: + { + credit = player.getQuestUI8AL( getId() ); + + player.setQuestUI8AL( getId() , credit + 1 ); + if( credit + 1 <= 2 ) + player.sendQuestMessage( getId() , 0, 2, credit + 1, 2 ); + + break; + } + case Enemy1: + { + credit = player.getQuestUI8BH( getId() ); + + player.setQuestUI8BH( getId() , credit + 1 ); + if ( credit + 1 <= 2 ) + player.sendQuestMessage( getId() , 1, 2, credit + 1, 2 ); + + break; + } + case Enemy2: + { + credit = player.getQuestUI8BL( getId() ); + + player.setQuestUI8BL( getId() , credit + 1 ); + if ( credit + 1 <= 2 ) + player.sendQuestMessage( getId() , 2, 2, credit + 1, 2 ); + + break; + } + } + + checkQuestCompletion( player ); + } + + void checkQuestCompletion( Entity::Player& player ) + { + auto credit192 = player.getQuestUI8AL( getId() ); + auto credit193 = player.getQuestUI8BH( getId() ); + auto credit194 = player.getQuestUI8BL( getId() ); + + if ( credit192 >= 2 && credit193 >= 2 && credit194 >= 2 ) + player.updateQuest( getId() , SeqFinish ); + } + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + Scene00001( player ); + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + player.updateQuest( getId() , Seq1 ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + if ( player.giveQuestRewards( getId() , result.param3 ) ) + { + player.finishQuest( getId() ); + } + } ); + } +}; + +EXPOSE_SCRIPT( SubFst037 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst039.cpp b/src/scripts/quest/subquest/gridania/SubFst039.cpp index c5fac2c9..f7ca9a56 100644 --- a/src/scripts/quest/subquest/gridania/SubFst039.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst039.cpp @@ -2,7 +2,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -42,8 +42,8 @@ class SubFst039 : public Sapphire::ScriptAPI::EventScript // Event Handlers void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst041.cpp b/src/scripts/quest/subquest/gridania/SubFst041.cpp index 6a983731..a96a19bc 100644 --- a/src/scripts/quest/subquest/gridania/SubFst041.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst041.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -11,8 +11,6 @@ using namespace Sapphire; // Start NPC: 1000432 // End NPC: 1000411 -//NEED TEST KILLCREDIT - class SubFst041 : public Sapphire::ScriptAPI::EventScript { @@ -38,7 +36,7 @@ private: // Entities found in the script data of the quest static constexpr auto Actor0 = 1000432; static constexpr auto Actor1 = 1000411; - static constexpr auto Enemy0 = 159; + static constexpr auto Enemy0 = 197; //159; WRONG INFO static constexpr auto Item0 = 2000142; static constexpr auto Seq0Actor0 = 0; static constexpr auto Seq2Actor1 = 1; @@ -57,32 +55,34 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) - { Scene00000( player ); - } if( actor == Actor1 ) - { Scene00001( player ); - } } - void onMobKill( Entity::Player& player, uint64_t npcId ) + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override { if( npcId != Enemy0 ) return; - auto currentKC = player.getQuestUI8BH( getId() ) + 1; + auto currentKC = player.getQuestUI8BH( getId() ); - if( currentKC >= 6 ) + if ( currentKC + 1 >= 4 ) + { + player.setQuestUI8AL( getId(), currentKC + 1 ); + player.setQuestUI8BH( getId(), currentKC + 1 ); + player.sendQuestMessage( getId(), 1, 0, 0, 0 ); player.updateQuest( getId(), SeqFinish ); + } else { - player.setQuestUI8BH( getId(), currentKC ); - player.sendQuestMessage( getId(), 0, 2, currentKC, 6 ); + player.setQuestUI8AL( getId(), currentKC + 1 ); + player.setQuestUI8BH( getId(), currentKC + 1 ); + player.sendQuestMessage( getId(), 0, 2, currentKC + 1, 4 ); } } @@ -132,7 +132,7 @@ private: { if( result.param2 == 1 ) { - if( player.giveQuestRewards( getId(), 0 ) ) + if( player.giveQuestRewards( getId(), result.param3 ) ) { player.setQuestUI8BH( getId(), 0 ); player.finishQuest( getId() ); diff --git a/src/scripts/quest/subquest/gridania/SubFst042.cpp b/src/scripts/quest/subquest/gridania/SubFst042.cpp new file mode 100644 index 00000000..d8883f36 --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst042.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include + +using namespace Sapphire; + +// Quest Script: SubFst042_00198 +// Quest Name: Butcher of Greentear +// Quest ID: 65734 +// Start NPC: 1000685 +// End NPC: 1000685 + +class SubFst042 : public Sapphire::ScriptAPI::EventScript +{ +private: + // Basic quest information + // Quest vars / flags used + // GetQuestUI8AL + + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Quest rewards + static constexpr auto RewardExpFactor = 200; + uint32_t RewardItemOptional[3] = { 4092, 4091, 5824 }; + uint32_t RewardItemOptionalCount[3] = { 1, 1, 1 }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000685; + static constexpr auto Enemy0 = 14; + static constexpr auto Seq0Actor0 = 0; + static constexpr auto Seq2Actor0 = 1; + +public: + SubFst042() : Sapphire::ScriptAPI::EventScript( 65734 ){}; + ~SubFst042(){}; + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast( actorId ) ); + + if ( actor == Actor0 && !player.hasQuest( getId() ) ) + { + Scene00000( player ); + } + else if ( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + { + Scene00001( player ); + } + } + + void onBNpcKill( uint32_t npcId, Entity::Player& player ) override + { + if ( npcId != Enemy0 ) + return; + + auto currentKC = player.getQuestUI8AL( getId() ) + 1; + + if ( currentKC >= 6 ) + player.updateQuest( getId(), SeqFinish ); + else + { + player.setQuestUI8AL( getId(), currentKC ); + player.sendQuestMessage( getId(), 0, 2, currentKC, 6 ); + } + } + +private: + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + player.updateQuest( getId(), 1 ); + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + if ( player.giveQuestRewards( getId(), 0 ) ) + player.finishQuest( getId() ); + } + } ); + } +}; + +EXPOSE_SCRIPT( SubFst042 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst043.cpp b/src/scripts/quest/subquest/gridania/SubFst043.cpp new file mode 100644 index 00000000..c48c0736 --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst043.cpp @@ -0,0 +1,184 @@ +// This is an automatically generated C++ script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, move it to the correct folder in /scripts/ + +#include +#include "Manager/EventMgr.h" +#include +#include + +// Quest Script: SubFst043_00199 +// Quest Name: A Clear Sign +// Quest ID: 65735 +// Start NPC: 1000172 +// End NPC: 1000627 + +using namespace Sapphire; + +class SubFst043 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000172; + static constexpr auto Actor1 = 1000627; + static constexpr auto Eobject0 = 2000143; + static constexpr auto Eobject1 = 2000144; + static constexpr auto EventActionProcessMiddle = 16; + static constexpr auto Seq0Actor0 = 0; + static constexpr auto Seq1Eobject0 = 1; + static constexpr auto Seq1Eobject0Eventactionno = 99; + static constexpr auto Seq1Eobject0Eventactionok = 100; + static constexpr auto Seq1Eobject1 = 2; + static constexpr auto Seq1Eobject1Eventactionno = 97; + static constexpr auto Seq1Eobject1Eventactionok = 98; + static constexpr auto Seq2Actor1 = 3; + + public: + SubFst043() : Sapphire::ScriptAPI::EventScript( 65735 ){}; + ~SubFst043() {}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if ( actor == Actor0 ) + Scene00000( player ); + else if (actor == Actor1 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00003( player ); + else if ( actor == Eobject0 ) + player.eventActionStart( getId(), EventActionProcessMiddle, + [&]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00001( player ); + }, + nullptr, eventId ); + else if ( actor == Eobject1 ) + player.eventActionStart( getId(), EventActionProcessMiddle, + [&]( Entity::Player& player, uint32_t eventId, uint64_t additional ) + { + Scene00002( player ); + }, + nullptr, eventId ); + } + + void checkQuestCompletion( Entity::Player& player ) + { + auto credit = player.getQuestUI8AL( getId() ); + + if ( credit + 1 >= 2 ) + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 2, credit + 1, 2 ); + player.updateQuest( getId(), SeqFinish ); + } + else + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 2, credit + 1, 2 ); + } + } + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq1 ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + Scene00100( player ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + Scene00098( player ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + if ( player.giveQuestRewards( getId(), 0 ) ) + { + player.setQuestUI8BH( getId(), 0 ); + player.finishQuest( getId() ); + } + } + }); + } + + void Scene00097( Entity::Player& player ) + { + player.playScene( getId(), 97, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00098( Entity::Player& player ) + { + player.playScene( getId(), 98, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 2, true ); + } ); + } + + void Scene00099( Entity::Player& player ) + { + player.playScene( getId(), 99, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + } ); + } + + void Scene00100( Entity::Player& player ) + { + player.playScene( getId(), 100, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 1, true ); + } ); + } +}; + +EXPOSE_SCRIPT( SubFst043 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst045.cpp b/src/scripts/quest/subquest/gridania/SubFst045.cpp index 095a485f..a8fbb691 100644 --- a/src/scripts/quest/subquest/gridania/SubFst045.cpp +++ b/src/scripts/quest/subquest/gridania/SubFst045.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -47,8 +47,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast( actorId ) ); + auto pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if ( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/gridania/SubFst046.cpp b/src/scripts/quest/subquest/gridania/SubFst046.cpp new file mode 100644 index 00000000..69ce3802 --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst046.cpp @@ -0,0 +1,150 @@ +// This is an automatically generated C++ script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, move it to the correct folder in /scripts/ + +#include +#include "Manager/EventMgr.h" +#include +#include + +// Quest Script: SubFst046_00210 +// Quest Name: Idle Initiatives +// Quest ID: 65746 +// Start NPC: 1000408 +// End NPC: 1000408 + +using namespace Sapphire; + +class SubFst046 : + public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Entities found in the script data of the quest + static constexpr auto ActionTimelineEventBaseIdle = 783; + static constexpr auto Actor0 = 1000408; + static constexpr auto Actor1 = 1000792; + static constexpr auto Actor2 = 1000793; + static constexpr auto Actor3 = 1000794; + static constexpr auto Seq0Actor0 = 0; + static constexpr auto Seq1Actor1 = 1; + static constexpr auto Seq1Actor2 = 2; + static constexpr auto Seq1Actor3 = 3; + static constexpr auto Seq2Actor0 = 4; + + public: + SubFst046() : Sapphire::ScriptAPI::EventScript( 65746 ){}; + ~SubFst046() {}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if ( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if ( actor == Actor1 ) + Scene00001( player ); + if ( actor == Actor2 ) + Scene00002( player ); + if ( actor == Actor3 ) + Scene00003( player ); + if ( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00004( player ); + } + + void checkQuestCompletion( Entity::Player& player ) + { + auto credit = player.getQuestUI8AL( getId() ); + + if ( credit + 1 >= 3 ) + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 0, credit + 1, 3 ); + player.updateQuest( getId(), SeqFinish ); + } + else + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 0, credit + 1, 3 ); + } + } + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + player.updateQuest( getId(), Seq1 ); + } + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 1, true ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 2, true ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 3, true ); + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [ & ]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + { + if ( player.giveQuestRewards( getId(), 0 ) ) + { + player.setQuestUI8BH( getId(), 0 ); + player.finishQuest( getId() ); + } + } + } ); + } +}; + +EXPOSE_SCRIPT( SubFst046 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/gridania/SubFst048.cpp b/src/scripts/quest/subquest/gridania/SubFst048.cpp new file mode 100644 index 00000000..1dc1c172 --- /dev/null +++ b/src/scripts/quest/subquest/gridania/SubFst048.cpp @@ -0,0 +1,144 @@ +// This is an automatically generated C++ script template +// Content needs to be added by hand to make it function +// In order for this script to be loaded, move it to the correct folder in /scripts/ + +#include +#include "Manager/EventMgr.h" +#include +#include + +// Quest Script: SubFst048_00375 +// Quest Name: Not a Material Girl +// Quest ID: 65911 +// Start NPC: 1000742 +// End NPC: 1000742 + +using namespace Sapphire; + +class SubFst048 : public Sapphire::ScriptAPI::EventScript +{ + private: + // Basic quest information + // Quest vars / flags used + // GetQuestBitFlag8 + // GetQuestUI8AL + + // Steps in this quest ( 0 is before accepting, + // 1 is first, 255 means ready for turning it in + enum Sequence : uint8_t + { + Seq0 = 0, + Seq1 = 1, + SeqFinish = 255, + }; + + // Entities found in the script data of the quest + static constexpr auto Actor0 = 1000742; + static constexpr auto Actor1 = 1000474; + static constexpr auto Actor2 = 1000476; + static constexpr auto Actor3 = 1000483; + static constexpr auto Seq0Actor0 = 0; + static constexpr auto Seq1Actor1 = 1; + static constexpr auto Seq1Actor2 = 2; + static constexpr auto Seq1Actor3 = 3; + static constexpr auto Seq2Actor0 = 4; + + public: + SubFst048() : Sapphire::ScriptAPI::EventScript( 65911 ){}; + ~SubFst048() {}; + + ////////////////////////////////////////////////////////////////////// + // Event Handlers + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + + if ( actor == Actor0 && !player.hasQuest( getId() ) ) + Scene00000( player ); + if ( actor == Actor0 && player.getQuestSeq( getId() ) == SeqFinish ) + Scene00004( player ); + if ( actor == Actor1 ) + Scene00001( player ); + if ( actor == Actor2 ) + Scene00002( player ); + if ( actor == Actor3 ) + Scene00003( player ); + } + + void checkQuestCompletion( Entity::Player& player ) + { + auto credit = player.getQuestUI8AL( getId() ); + + if ( credit + 1 >= 3 ) + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 2, credit + 1, 3 ); + player.updateQuest( getId(), SeqFinish ); + } + else + { + player.setQuestUI8AL( getId(), credit + 1 ); + player.sendQuestMessage( getId(), 0, 2, credit + 1, 3 ); + } + } + + + private: + ////////////////////////////////////////////////////////////////////// + // Available Scenes in this quest, not necessarly all are used + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if ( result.param2 == 1 ) + player.updateQuest( getId(), Seq1 ); + } ); + } + + void Scene00001( Entity::Player& player ) + { + player.playScene( getId(), 1, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 1, true ); + } ); + } + + void Scene00002( Entity::Player& player ) + { + player.playScene( getId(), 2, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 2, true ); + } ); + } + + void Scene00003( Entity::Player& player ) + { + player.playScene( getId(), 3, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + checkQuestCompletion( player ); + player.setQuestBitFlag8( getId(), 3, true ); + } ); + } + + void Scene00004( Entity::Player& player ) + { + player.playScene( getId(), 4, HIDE_HOTBAR, + [&]( Entity::Player& player, const Event::SceneResult& result ) + { + if( result.param2 == 1 ) + if ( player.giveQuestRewards( getId(), result.param3 ) ) + { + player.finishQuest( getId() ); + } + } ); + } +}; + +EXPOSE_SCRIPT( SubFst048 ); \ No newline at end of file diff --git a/src/scripts/quest/subquest/limsa/SubSea001.cpp b/src/scripts/quest/subquest/limsa/SubSea001.cpp index 65169946..8f198f34 100644 --- a/src/scripts/quest/subquest/limsa/SubSea001.cpp +++ b/src/scripts/quest/subquest/limsa/SubSea001.cpp @@ -2,7 +2,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -65,8 +65,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/limsa/SubSea012.cpp b/src/scripts/quest/subquest/limsa/SubSea012.cpp index 33855690..4dad6132 100644 --- a/src/scripts/quest/subquest/limsa/SubSea012.cpp +++ b/src/scripts/quest/subquest/limsa/SubSea012.cpp @@ -1,7 +1,7 @@ #include #include "Manager/EventMgr.h" #include -#include "Framework.h" +#include using namespace Sapphire; @@ -48,8 +48,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil000.cpp b/src/scripts/quest/subquest/uldah/SubWil000.cpp index 60ea8a7b..37f1adbc 100644 --- a/src/scripts/quest/subquest/uldah/SubWil000.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil000.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -48,8 +48,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil001.cpp b/src/scripts/quest/subquest/uldah/SubWil001.cpp index 45f60668..e34a38e1 100644 --- a/src/scripts/quest/subquest/uldah/SubWil001.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil001.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -49,8 +49,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil002.cpp b/src/scripts/quest/subquest/uldah/SubWil002.cpp index b0d110ae..d59112ef 100644 --- a/src/scripts/quest/subquest/uldah/SubWil002.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil002.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -53,8 +53,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil004.cpp b/src/scripts/quest/subquest/uldah/SubWil004.cpp index 86ce8440..abd78646 100644 --- a/src/scripts/quest/subquest/uldah/SubWil004.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil004.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -58,8 +58,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil006.cpp b/src/scripts/quest/subquest/uldah/SubWil006.cpp index 5b0dc867..1ce3fa26 100644 --- a/src/scripts/quest/subquest/uldah/SubWil006.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil006.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -51,8 +51,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil007.cpp b/src/scripts/quest/subquest/uldah/SubWil007.cpp index 9c65c4b1..c11572c5 100644 --- a/src/scripts/quest/subquest/uldah/SubWil007.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil007.cpp @@ -2,7 +2,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -55,8 +55,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { @@ -90,8 +90,8 @@ public: void onEmote( uint64_t actorId, uint32_t eventId, uint32_t emoteId, Entity::Player& player ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && emoteId == 41 && player.getQuestSeq( getId() ) == Seq1 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil018.cpp b/src/scripts/quest/subquest/uldah/SubWil018.cpp index d29e33b7..f237a068 100644 --- a/src/scripts/quest/subquest/uldah/SubWil018.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil018.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -55,8 +55,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 && !player.hasQuest( getId() ) ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil019.cpp b/src/scripts/quest/subquest/uldah/SubWil019.cpp index 77a54877..257ca62d 100644 --- a/src/scripts/quest/subquest/uldah/SubWil019.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil019.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -47,8 +47,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil020.cpp b/src/scripts/quest/subquest/uldah/SubWil020.cpp index e29f8d05..588dfefe 100644 --- a/src/scripts/quest/subquest/uldah/SubWil020.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil020.cpp @@ -2,7 +2,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -63,8 +63,8 @@ class SubWil020 : public Sapphire::ScriptAPI::EventScript // Event Handlers void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); /*player.setQuestUI8BH( getId(), 0 ); player.setQuestUI8AL( getId(), 0 ); diff --git a/src/scripts/quest/subquest/uldah/SubWil021.cpp b/src/scripts/quest/subquest/uldah/SubWil021.cpp index 4de1484d..f4c73c11 100644 --- a/src/scripts/quest/subquest/uldah/SubWil021.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil021.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -52,8 +52,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil022.cpp b/src/scripts/quest/subquest/uldah/SubWil022.cpp index da169d97..a852601d 100644 --- a/src/scripts/quest/subquest/uldah/SubWil022.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil022.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -52,8 +52,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil027.cpp b/src/scripts/quest/subquest/uldah/SubWil027.cpp index 2dee104f..a19f7c2c 100644 --- a/src/scripts/quest/subquest/uldah/SubWil027.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil027.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -46,8 +46,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil028.cpp b/src/scripts/quest/subquest/uldah/SubWil028.cpp index 45bb3fc2..f52a9e63 100644 --- a/src/scripts/quest/subquest/uldah/SubWil028.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil028.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -48,8 +48,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/scripts/quest/subquest/uldah/SubWil029.cpp b/src/scripts/quest/subquest/uldah/SubWil029.cpp index 77fab777..f5734318 100644 --- a/src/scripts/quest/subquest/uldah/SubWil029.cpp +++ b/src/scripts/quest/subquest/uldah/SubWil029.cpp @@ -1,7 +1,7 @@ #include #include #include -#include "Framework.h" +#include using namespace Sapphire; @@ -51,8 +51,8 @@ public: void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto pEventMgr = m_framework->get< World::Manager::EventMgr >(); - auto actor = pEventMgr->mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); + auto& pEventMgr = Common::Service< World::Manager::EventMgr >::ref(); + auto actor = pEventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) ); if( actor == Actor0 ) { diff --git a/src/tools/action_parse/main.cpp b/src/tools/action_parse/main.cpp index aa40bdd1..9aacb0cd 100644 --- a/src/tools/action_parse/main.cpp +++ b/src/tools/action_parse/main.cpp @@ -17,15 +17,15 @@ #include #include -#include +#include Sapphire::Data::ExdDataGenerated g_exdData; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; using namespace Sapphire; -const std::string datLocation( "/home/mordred/sqpack" ); +std::string datLocation( "/home/mordred/sqpack" ); //const std::string datLocation( "/mnt/c/Program Files (x86)/Steam/steamapps/common/FINAL FANTASY XIV Online/game/sqpack" ); struct ActionEntry @@ -69,7 +69,7 @@ uint32_t stripNonNumerics( std::string& str ) return std::atoi( str.c_str() ); } -int main() +int main( int argc, char* argv[] ) { Logger::init( "action_parse" ); @@ -77,6 +77,11 @@ int main() if( !fs::exists( "ActionLutData.cpp.tmpl" ) ) throw std::runtime_error( "ActionLut.cpp.tmpl is missing in working directory" ); + if( argc == 2 ) + { + datLocation = std::string( argv[ 1 ] ); + } + Logger::info( "Setting up EXD data" ); if( !g_exdData.init( datLocation ) ) { @@ -249,11 +254,11 @@ int main() // action.first, data.name, data.potency, data.flankPotency, data.frontPotency, data.rearPotency, // data.curePotency, data.restorePercentage ); - auto out = fmt::format( " // {}\n {{ {}, {{ {}, {}, {}, {}, {}, {} }} }},\n", + auto out = fmt::format( " // {}\n {{ {}, {{ {}, {}, {}, {}, {}, {}, {} }} }},\n", data.name, action.first, data.potency, data.comboPotency, data.flankPotency, data.frontPotency, data.rearPotency, - data.curePotency ); + data.curePotency, 0 ); output += out; // Logger::info( out ); diff --git a/src/tools/discovery_parser/main.cpp b/src/tools/discovery_parser/main.cpp index 0ded1f58..cfc427d9 100644 --- a/src/tools/discovery_parser/main.cpp +++ b/src/tools/discovery_parser/main.cpp @@ -36,10 +36,11 @@ struct ZoneInfo uint16_t id; std::string name; std::string path; + uint16_t mapId; }; // parsing shit -std::string gamePath( "C:\\Program Files (x86)\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); +std::string gamePath( "C:\\SquareEnix\\FINAL FANTASY XIV - A Realm Reborn\\game\\sqpack" ); std::unordered_map< uint32_t, std::string > eobjNameMap; std::unordered_map< uint16_t, ZoneInfo > zoneInfoMap; std::unordered_map< uint16_t, std::vector< std::pair< uint16_t, std::string > > > zoneInstanceMap; @@ -60,8 +61,7 @@ struct vec2 float x, y; }; -struct DiscoveryMap : - std::enable_shared_from_this< DiscoveryMap > +struct DiscoveryMap : std::enable_shared_from_this< DiscoveryMap > { std::string path; Image img; @@ -120,11 +120,11 @@ struct DiscoveryMap : std::map< uint16_t, std::map< uint16_t, std::map< uint16_t, std::shared_ptr< DiscoveryMap > > > > discoveryMaps; -enum class TerritoryTypeExdIndexes : - size_t +enum class TerritoryTypeExdIndexes : size_t { TerritoryType = 0, - Path = 1 + Path = 1, + Map = 6 }; using namespace std::chrono_literals; @@ -162,10 +162,12 @@ std::string zoneNameToPath( const std::string& name ) auto teriPath = std::get< std::string >( fields.at( static_cast< size_t >( TerritoryTypeExdIndexes::Path ) ) ); ZoneInfo info; - info.id = row.first; + info.id = row.first.rowId; info.path = teriPath; info.name = teriName; - zoneInfoMap[ row.first ] = info; + info.mapId = std::get< uint16_t >( + fields.at( static_cast< size_t >( TerritoryTypeExdIndexes::Map ) ) ); + zoneInfoMap[ row.first.rowId ] = info; if( !found && ( Common::Util::toLowerCopy( name ) == Common::Util::toLowerCopy( teriName ) ) ) { @@ -210,76 +212,38 @@ void loadEobjNames() static auto exd = static_cast< xiv::exd::Exd >( cat.get_data_ln( xiv::exd::Language::en ) ); for( auto& row : exd.get_rows() ) { - auto id = row.first; + auto id = row.first.rowId; auto& fields = row.second; auto name = std::get< std::string >( fields.at( 0 ) ); eobjNameMap[ id ] = name; } } -void writeEobjEntry( std::ofstream& out, LGB_ENTRY* pObj ) +void writeMapRangeEntry( std::ofstream& out, LgbEntry* pObj ) { - static std::string mapRangeStr( "\"MapRange\", " ); - std::ofstream discoverySql( zoneName + "_poprange.txt", std::ios::app ); - uint32_t id; - uint32_t unknown2 = 0, unknown2_1 = 0, unknown3 = 0; - std::string name; - std::string typeStr; - uint32_t eobjlevelHierachyId = 0; - static std::map< uint32_t, std::map< uint32_t, uint32_t > > exportedMapRange; + auto pMapRange = reinterpret_cast< LGB_MAP_RANGE_ENTRY* >( pObj ); + if( !pMapRange->data.discoveryEnabled ) + return; - auto pMapRange = reinterpret_cast< LGB_MAPRANGE_ENTRY* >( pObj ); - id = pMapRange->header.unknown; - unknown2 = pMapRange->header.unknown2; - unknown2_1 = pMapRange->header.unknown2_1; - unknown3 = pMapRange->header.unknown3; - typeStr = mapRangeStr; - - // discovery shit - vec2 pos{ 0 }; auto subArea = 0; auto mapId = -1; - auto discoveryIndex = pMapRange->header.discoveryIndex; + auto discoveryIndex = pMapRange->data.discoveryIndex; - vec3 translation = pObj->header.translation; + vec3 translation = pObj->header.transform.translation; - bool found = false; - float scale = 100.f; //pMapRange->header.unknown2 - - std::string outStr( pMapRange->name + " " + std::to_string( pMapRange->header.unknown ) + " " + - std::to_string( pMapRange->header.translation.x ) + " " + - std::to_string( pMapRange->header.translation.y ) + " " + - std::to_string( pMapRange->header.translation.z ) + " " + - std::to_string( pMapRange->header.rotation.y ) + "\n" + std::string outStr( pMapRange->name + " " + std::to_string( pMapRange->header.instanceId ) + " " + + std::to_string( pMapRange->header.transform.translation.x ) + " " + + std::to_string( pMapRange->header.transform.translation.y ) + " " + + std::to_string( pMapRange->header.transform.translation.z ) + " " + + std::to_string( pMapRange->header.transform.rotation.y ) + " " + + std::to_string( pMapRange->data.mapId ) + " " + + std::to_string( pMapRange->data.discoveryIndex ) + "\n" ); - //std::to_string( pObj->header.translation.x ) + ", " + std::to_string( pObj->header.translation.y ) + ", " + std::to_string( pObj->header.translation.z ) + - //", " + std::to_string( subArea ) + "" + "\n" - //); - discoverySql.write( outStr.c_str(), outStr.size() ); - //out.write( outStr.c_str(), outStr.size() ); -} + out.write( outStr.c_str(), outStr.size() ); -void readFileToBuffer( const std::string& path, std::vector< char >& buf ) -{ - auto inFile = std::ifstream( path, std::ios::binary ); - if( inFile.good() ) - { - inFile.seekg( 0, inFile.end ); - int32_t fileSize = ( int32_t ) inFile.tellg(); - buf.resize( fileSize ); - inFile.seekg( 0, inFile.beg ); - inFile.read( &buf[ 0 ], fileSize ); - inFile.close(); - } - else - { - throw std::runtime_error( "Unable to open " + path ); - } } -bool isEx = false; - int main( int argc, char* argv[] ) { auto startTime = std::chrono::system_clock::now(); @@ -288,10 +252,6 @@ int main( int argc, char* argv[] ) std::vector< std::string > argVec( argv + 1, argv + argc ); zoneName = "s1h1"; - bool dumpAll = ignoreModels = std::remove_if( argVec.begin(), argVec.end(), []( auto arg ) - { return arg == "--dump-all"; } ) != argVec.end(); - dumpAll = true; - ignoreModels = true; if( argc > 1 ) { zoneName = argv[ 1 ]; @@ -304,118 +264,42 @@ int main( int argc, char* argv[] ) } initExd( gamePath ); - std::ofstream discoverySql( zoneName + "_poprange.txt", std::ios::trunc ); - discoverySql.close(); + std::ofstream discoverySql( "maprange_export.txt", std::ios::trunc ); - if( dumpAll ) + zoneNameToPath( "f1f1" ); + zoneDumpList.emplace( "f1f1" ); + zoneDumpList.emplace( "f1f2" ); + + for( const auto& zoneName : zoneDumpList ) { - zoneNameToPath( "s1h1" ); - - zoneDumpList.emplace( "s1h1" ); - zoneDumpList.emplace( "f1h1" ); - zoneDumpList.emplace( "w1h1" ); - zoneDumpList.emplace( "e1h1" ); - } - else - { - zoneDumpList.emplace( zoneName ); - } - - LABEL_DUMP: - entryStartTime = std::chrono::system_clock::now(); - zoneName = *zoneDumpList.begin(); - discoverySql.open( zoneName + "_poprange.txt", std::ios::trunc ); - discoverySql.write( ( zoneName + "\n" ).c_str() , zoneName.size() + 1 ); - try - { - const auto zonePath = zoneNameToPath( zoneName ); - - std::string listPcbPath( zonePath + "/collision/list.pcb" ); - std::string bgLgbPath( zonePath + "/level/bg.lgb" ); - std::string planmapLgbPath( zonePath + "/level/planmap.lgb" ); - std::string collisionFilePath( zonePath + "/collision/" ); - - isEx = bgLgbPath.find( "ex1" ) != -1 || bgLgbPath.find( "ex2" ) != -1; - std::vector< char > section; - std::vector< char > section1; - std::vector< char > section2; - - auto test_file = gameData->getFile( bgLgbPath ); - section = test_file->access_data_sections().at( 0 ); - - auto planmap_file = gameData->getFile( planmapLgbPath ); - section2 = planmap_file->access_data_sections().at( 0 ); - - auto test_file1 = gameData->getFile( listPcbPath ); - section1 = test_file1->access_data_sections().at( 0 ); - - std::vector< std::string > stringList; - - uint32_t offset1 = 0x20; - - //loadEobjNames(); - //getMapExdEntries( zoneId ); - - std::string eobjFileName( zoneName + "_eobj.csv" ); - std::ofstream eobjOut( eobjFileName, std::ios::trunc ); - if( !eobjOut.good() ) - throw std::string( "Unable to create " + zoneName + - "_eobj.csv for eobj entries. Run as admin or check there isnt already a handle on the file." ).c_str(); - - eobjOut.close(); - eobjOut.open( eobjFileName, std::ios::app ); - - if( !eobjOut.good() ) - throw std::string( "Unable to create " + zoneName + - "_eobj.csv for eobj entries. Run as admin or check there isnt already a handle on the file." ).c_str(); - - if( 0 ) + entryStartTime = std::chrono::system_clock::now(); + discoverySql.write( ( zoneName + "\n" ).c_str(), zoneName.size() + 1 ); + try { - for( ;; ) - { + const auto zonePath = zoneNameToPath( zoneName ); - uint16_t trId = *( uint16_t* ) §ion1[ offset1 ]; + std::string bgLgbPath( zonePath + "/level/bg.lgb" ); + std::string planmapLgbPath( zonePath + "/level/planmap.lgb" ); + std::vector< char > section; + std::vector< char > section2; - char someString[200]; - sprintf( someString, "%str%04d.pcb", collisionFilePath.c_str(), trId ); - stringList.push_back( std::string( someString ) ); - //std::cout << someString << "\n"; - offset1 += 0x20; + auto test_file = gameData->getFile( bgLgbPath ); + section = test_file->access_data_sections().at( 0 ); - if( offset1 >= section1.size() ) - { - break; - } - } - } - LGB_FILE bgLgb( §ion[ 0 ], "bg" ); - LGB_FILE planmapLgb( §ion2[ 0 ], "planmap" ); + auto planmap_file = gameData->getFile( planmapLgbPath ); + section2 = planmap_file->access_data_sections().at( 0 ); - std::vector< LGB_FILE > lgbList{ bgLgb, planmapLgb }; - uint32_t max_index = 0; + std::vector< std::string > stringList; - // dont bother if we cant write to a file - FILE* fp_out = nullptr; - //auto fp_out = ignoreModels ? ( FILE* )nullptr : fopen( ( zoneName + ".obj" ).c_str(), "w" ); - if( fp_out ) - { - fprintf( fp_out, "\n" ); - fclose( fp_out ); - } - else if( /*!ignoreModels*/ false ) - { - std::string errorMessage( "Cannot create " + zoneName + ".obj\n" + - " Check no programs have a handle to file and run as admin.\n" ); - std::cout << errorMessage; - throw std::runtime_error( errorMessage.c_str() ); - return 0; - } + uint32_t offset1 = 0x20; + LGB_FILE bgLgb( §ion[ 0 ], "bg" ); + LGB_FILE planmapLgb( §ion2[ 0 ], "planmap" ); - { - std::map< std::string, PCB_FILE > pcbFiles; + std::vector< LGB_FILE > lgbList{ bgLgb, planmapLgb }; + uint32_t max_index = 0; - std::cout << "[Info] " << ( ignoreModels ? "Dumping MapRange and EObj" : "Writing obj file " ) << "\n"; + std::cout << "[Info] " << "Dumping MapRange and EObj" << "\n"; uint32_t totalGroups = 0; uint32_t totalGroupEntries = 0; @@ -423,48 +307,46 @@ int main( int argc, char* argv[] ) { for( const auto& group : lgb.groups ) { - //std::cout << "\t" << group.name << " Size " << group.header.entryCount << "\n"; totalGroups++; for( const auto& pEntry : group.entries ) { - if( pEntry->getType() == LgbEntryType::PopRange ) + if( pEntry->getType() == LgbEntryType::MapRange ) { totalGroupEntries++; - writeEobjEntry( eobjOut, pEntry.get() ); + writeMapRangeEntry( discoverySql, pEntry.get() ); + } + else if( pEntry->getType() == LgbEntryType::ExitRange ) + { + auto pExitRange = reinterpret_cast< LGB_EXIT_RANGE_ENTRY* >( pEntry.get() ); + } } } } - std::cout << "[Info] " << "Loaded " << pcbFiles.size() << " PCB Files \n"; std::cout << "[Info] " << "Total Groups " << totalGroups << " Total entries " << totalGroupEntries << "\n"; + + std::cout << "[Success] " << "Exported " << zoneName << " in " << + std::chrono::duration_cast< std::chrono::seconds >( + std::chrono::system_clock::now() - entryStartTime ).count() << " seconds\n"; } - std::cout << "[Success] " << "Exported " << zoneName << " in " << - std::chrono::duration_cast< std::chrono::seconds >( - std::chrono::system_clock::now() - entryStartTime ).count() << " seconds\n"; + catch( std::exception& e ) + { + std::cout << "[Error] " << e.what() << std::endl; + std::cout << "[Error] " + << "Unable to extract collision data.\n\tIf using standalone ensure your working directory folder layout is \n\tbg/[ffxiv|ex1|ex2]/teri/type/zone/[level|collision]" + << std::endl; + std::cout << std::endl; + std::cout << "[Info] " << "Usage: pcb_reader2 territory \"path/to/game/sqpack/ffxiv\" " << std::endl; + } + std::cout << "\n"; + if( discoverySql.good() ) + discoverySql.flush(); } - catch( std::exception& e ) - { - std::cout << "[Error] " << e.what() << std::endl; - std::cout << "[Error] " - << "Unable to extract collision data.\n\tIf using standalone ensure your working directory folder layout is \n\tbg/[ffxiv|ex1|ex2]/teri/type/zone/[level|collision]" - << std::endl; - std::cout << std::endl; - std::cout << "[Info] " << "Usage: pcb_reader2 territory \"path/to/game/sqpack/ffxiv\" " << std::endl; - } - std::cout << "\n\n\n"; - if( discoverySql.good() ) - discoverySql.flush(); - - LABEL_NEXT_ZONE_ENTRY: - zoneDumpList.erase( zoneName ); - if( !zoneDumpList.empty() ) - goto LABEL_DUMP; - - - std::cout << "\n\n\n[Success] Finished all tasks in " << + std::cout << "\n[Success] Finished all tasks in " << std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - startTime ).count() << " seconds\n"; + std::cout << "Press any key to exit..."; getchar(); if( eData ) diff --git a/src/tools/event_object_parser/instance.tmpl b/src/tools/event_object_parser/instance.tmpl index 18073304..c8188474 100644 --- a/src/tools/event_object_parser/instance.tmpl +++ b/src/tools/event_object_parser/instance.tmpl @@ -14,7 +14,7 @@ public: EOBJ_INIT } - void onUpdate( InstanceContent& instance, uint32_t currTime ) override + void onUpdate( InstanceContent& instance, uint64_t tickCount ) override { } diff --git a/src/tools/event_object_parser/main.cpp b/src/tools/event_object_parser/main.cpp index a4d451a9..f1529fcb 100644 --- a/src/tools/event_object_parser/main.cpp +++ b/src/tools/event_object_parser/main.cpp @@ -26,14 +26,14 @@ #include #include -#include +#include -Sapphire::Common::Util::CrashHandler crashHandler; +[[maybe_unused]] Sapphire::Common::Util::CrashHandler crashHandler; Sapphire::Data::ExdDataGenerated g_exdData; using namespace Sapphire; using namespace std::chrono_literals; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; // garbage to ignore models bool ignoreModels = false; @@ -137,7 +137,7 @@ void loadAllInstanceContentEntries() if( !ic ) continue; type = ic->instanceContentType; - name = ic->name; + name = cfc->name; } else if( cfc->contentLinkType == 5 ) { @@ -284,10 +284,10 @@ int main( int argc, char* argv[] ) uint32_t eobjlevelHierachyId = 0; auto pEobj = reinterpret_cast< LGB_EOBJ_ENTRY* >( pObj ); - id = pEobj->header.eobjId; - unknown = pEobj->header.unknown; + id = pEobj->data.eobjId; + unknown = pEobj->header.instanceId; - eobjlevelHierachyId = pEobj->header.levelHierachyId; + eobjlevelHierachyId = pEobj->data.levelHierachyId; std::string states = ""; std::string gimmickName = ""; @@ -295,7 +295,7 @@ int main( int argc, char* argv[] ) { auto pGObj = pEntry1.get(); if( pGObj->getType() == LgbEntryType::Gimmick && - pGObj->header.unknown == pEobj->header.levelHierachyId ) + pGObj->header.instanceId == pEobj->data.levelHierachyId ) { auto pGObjR = reinterpret_cast< LGB_GIMMICK_ENTRY* >( pGObj ); char* dataSection = nullptr; @@ -361,13 +361,13 @@ int main( int argc, char* argv[] ) eobjects += " instance.registerEObj( \"" + name + "\", " + std::to_string( id ) + ", " + std::to_string( eobjlevelHierachyId ) + ", " + std::to_string( state ) + ", " + - "{ " + std::to_string( pObj->header.translation.x ) + "f, " - + std::to_string( pObj->header.translation.y ) + "f, " - + std::to_string( pObj->header.translation.z ) + "f }, " + - std::to_string( pObj->header.scale.x ) + "f, " + + "{ " + std::to_string( pObj->header.transform.translation.x ) + "f, " + + std::to_string( pObj->header.transform.translation.y ) + "f, " + + std::to_string( pObj->header.transform.translation.z ) + "f }, " + + std::to_string( pObj->header.transform.scale.x ) + "f, " + // the rotation inside the sgbs is the inverse of what the game uses - std::to_string( pObj->header.rotation.y * -1.f ) + "f ); \n" + states; + std::to_string( pObj->header.transform.rotation.y * -1.f ) + "f ); \n" + states; } } } diff --git a/src/tools/event_object_parser/questbattle.tmpl b/src/tools/event_object_parser/questbattle.tmpl index cc161d97..9e7d968c 100644 --- a/src/tools/event_object_parser/questbattle.tmpl +++ b/src/tools/event_object_parser/questbattle.tmpl @@ -16,7 +16,7 @@ public: EOBJ_INIT } - void onUpdate( QuestBattle& instance, uint32_t currTime ) override + void onUpdate( QuestBattle& instance, uint64_t tickCount ) override { } diff --git a/src/tools/exd_common_gen/main.cpp b/src/tools/exd_common_gen/main.cpp index 768b53c4..0f88b8a9 100644 --- a/src/tools/exd_common_gen/main.cpp +++ b/src/tools/exd_common_gen/main.cpp @@ -42,7 +42,7 @@ std::string generateEnum( const std::string& exd, int8_t nameIndex, const std::s for( auto row : rows ) { auto& fields = row.second; - uint32_t id = row.first; + uint32_t id = row.first.rowId; std::string value; try diff --git a/src/tools/exd_struct_gen/ExdData.cpp.tmpl b/src/tools/exd_struct_gen/ExdData.cpp.tmpl index 77d1398f..43ff75e4 100644 --- a/src/tools/exd_struct_gen/ExdData.cpp.tmpl +++ b/src/tools/exd_struct_gen/ExdData.cpp.tmpl @@ -23,7 +23,7 @@ void Sapphire::Data::ExdDataGenerated::loadIdList( xiv::exd::Exd& data, std::set for( auto row : pDataRows ) { - uint32_t id = row.first; + uint32_t id = row.first.rowId; outIdList.insert( id ); } } diff --git a/src/tools/exd_struct_gen/ExdData.h.tmpl b/src/tools/exd_struct_gen/ExdData.h.tmpl index 4b344f7b..4b15822a 100644 --- a/src/tools/exd_struct_gen/ExdData.h.tmpl +++ b/src/tools/exd_struct_gen/ExdData.h.tmpl @@ -13,8 +13,12 @@ #include #include -namespace Sapphire { -namespace Data { +#if _WIN32 +#undef near +#undef far +#endif + +namespace Sapphire::Data { class ExdDataGenerated; @@ -43,6 +47,11 @@ STRUCTS std::shared_ptr< xiv::dat::GameData > m_data; std::shared_ptr< xiv::exd::ExdData > m_exd_data; + std::shared_ptr< xiv::dat::GameData > getGameData() + { + return m_data; + } + template< class T > std::shared_ptr< T > get( uint32_t id ) { @@ -84,7 +93,6 @@ IDLISTGETTERS }; } -} #endif diff --git a/src/tools/exd_struct_gen/main.cpp b/src/tools/exd_struct_gen/main.cpp index c418dd61..7526a231 100644 --- a/src/tools/exd_struct_gen/main.cpp +++ b/src/tools/exd_struct_gen/main.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include @@ -22,7 +22,7 @@ using namespace Sapphire; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; Sapphire::Data::ExdDataGenerated g_exdData; bool skipUnmapped = true; @@ -127,8 +127,17 @@ std::string generateStruct( const std::string& exd ) } auto sheet = nlohmann::json(); - std::ifstream defJson( path ); - defJson >> sheet; + + try + { + std::ifstream defJson( path ); + defJson >> sheet; + } + catch( const std::exception& ex ) + { + Logger::error( "Failed parsing json definition, err: {} file: {}", ex.what(), path ); + return ""; + } for( auto& definition : sheet[ "definitions" ] ) { diff --git a/src/tools/exd_struct_test/main.cpp b/src/tools/exd_struct_test/main.cpp index 88ad0d46..cb997b6f 100644 --- a/src/tools/exd_struct_test/main.cpp +++ b/src/tools/exd_struct_test/main.cpp @@ -22,16 +22,16 @@ #include -#include +#include -Sapphire::Common::Util::CrashHandler crashHandler; +[[maybe_unused]] Sapphire::Common::Util::CrashHandler crashHandler; Sapphire::Data::ExdDataGenerated g_exdData; xiv::dat::GameData* gameData = nullptr; using namespace Sapphire; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; //const std::string datLocation( "/opt/sapphire_3_15_0/bin/sqpack" ); const std::string datLocation( "/mnt/c/Program Files (x86)/Steam/steamapps/common/FINAL FANTASY XIV Online/game/sqpack" ); diff --git a/src/tools/mob_parse/main.cpp b/src/tools/mob_parse/main.cpp index e8598da0..7ed1966d 100644 --- a/src/tools/mob_parse/main.cpp +++ b/src/tools/mob_parse/main.cpp @@ -13,9 +13,9 @@ #include #include -#include +#include -namespace filesys = std::experimental::filesystem; +namespace fs = std::filesystem; #include #include @@ -138,19 +138,19 @@ std::vector< std::string > getAllFilesInDir( const std::string& dirPath, try { // Check if given path exists and points to a directory - if( filesys::exists( dirPath ) && filesys::is_directory( dirPath ) ) + if( fs::exists( dirPath ) && fs::is_directory( dirPath ) ) { // Create a Recursive Directory Iterator object and points to the starting of directory - filesys::recursive_directory_iterator iter( dirPath ); + fs::recursive_directory_iterator iter( dirPath ); // Create a Recursive Directory Iterator object pointing to end. - filesys::recursive_directory_iterator end; + fs::recursive_directory_iterator end; // Iterate till end while( iter != end ) { // Check if current entry is a directory and if exists in skip list - if( filesys::is_directory( iter->path() ) && + if( fs::is_directory( iter->path() ) && ( std::find( dirSkipList.begin(), dirSkipList.end(), iter->path().filename() ) != dirSkipList.end() ) ) { // Skip the iteration of current directory pointed by iterator @@ -212,17 +212,17 @@ int dumpSpawns() for( auto file : listOfFiles ) { - if( !filesys::is_directory( file ) ) + if( !fs::is_directory( file ) ) { auto pos = file.find_last_of( "\\" ); if( pos != std::string::npos ) { - auto pos = file.find_last_of( filesys::path::preferred_separator ); + auto pos = file.find_last_of( fs::path::preferred_separator ); if( pos != std::string::npos ) { auto str = file.substr( 0, pos ); - pos = str.find_last_of( filesys::path::preferred_separator ); + pos = str.find_last_of( fs::path::preferred_separator ); auto zone = str.substr( pos + 1 ); //Logger::info( zone ); @@ -399,17 +399,17 @@ int dumpTemplates() for( auto file : listOfFiles ) { - if( !filesys::is_directory( file ) ) + if( !fs::is_directory( file ) ) { auto pos = file.find_last_of( "\\" ); if( pos != std::string::npos ) { - auto pos = file.find_last_of( filesys::path::preferred_separator ); + auto pos = file.find_last_of( fs::path::preferred_separator ); if( pos != std::string::npos ) { auto str = file.substr( 0, pos ); - pos = str.find_last_of( filesys::path::preferred_separator ); + pos = str.find_last_of( fs::path::preferred_separator ); auto zone = str.substr( pos + 1 ); //Logger::info( zone ); @@ -434,7 +434,7 @@ int dumpTemplates() } - /* if( filesys::is_directory( file ) ) + /* if( fs::is_directory( file ) ) { auto pos = file.find_last_of( "\\" ); if( pos != std::string::npos ) diff --git a/src/tools/nav_export/lgb.h b/src/tools/nav_export/lgb.h index b363dcb3..937f2f77 100644 --- a/src/tools/nav_export/lgb.h +++ b/src/tools/nav_export/lgb.h @@ -68,7 +68,7 @@ enum class LgbEntryType : SphereCastRange = 75, }; -struct LGB_ENTRY_HEADER +struct InstanceObject { LgbEntryType type; uint32_t unknown; @@ -78,25 +78,25 @@ struct LGB_ENTRY_HEADER vec3 scale; }; -class LGB_ENTRY +class LgbEntry { public: char* m_buf; uint32_t m_offset; - LGB_ENTRY_HEADER header; + InstanceObject header; - LGB_ENTRY() + LgbEntry() { m_buf = nullptr; m_offset = 0; memset( &header, 0, sizeof( header ) ); }; - LGB_ENTRY( char* buf, uint32_t offset ) + LgbEntry( char* buf, uint32_t offset ) { m_buf = buf; m_offset = offset; - header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); + header = *reinterpret_cast< InstanceObject* >( buf + offset ); }; const LgbEntryType getType() const @@ -104,14 +104,14 @@ public: return header.type; }; - virtual ~LGB_ENTRY() + virtual ~LgbEntry() { }; }; -struct LGB_BGPARTS_HEADER : - public LGB_ENTRY_HEADER +struct BgPartsData : + public InstanceObject { uint32_t modelFileOffset; uint32_t collisionFileOffset; @@ -124,10 +124,10 @@ struct LGB_BGPARTS_HEADER : }; class LGB_BGPARTS_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_BGPARTS_HEADER header; + BgPartsData header; std::string name; std::string modelFileName; std::string collisionFileName; @@ -137,65 +137,65 @@ public: }; LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); modelFileName = std::string( buf + offset + header.modelFileOffset ); collisionFileName = std::string( buf + offset + header.collisionFileOffset ); }; }; -struct LGB_GIMMICK_HEADER : - public LGB_ENTRY_HEADER +struct GimmickData : + public InstanceObject { uint32_t gimmickFileOffset; char unknownBytes[100]; }; class LGB_GIMMICK_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_GIMMICK_HEADER header; + GimmickData header; std::string name; std::string gimmickFileName; LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); gimmickFileName = std::string( buf + offset + header.gimmickFileOffset ); //std::cout << "\t " << gimmickFileName << " unknown: " << header.unknown << "\n"; }; }; -struct LGB_ENPC_HEADER : - public LGB_ENTRY_HEADER +struct ENpcData : + public InstanceObject { uint32_t enpcId; uint8_t unknown1[0x24]; }; class LGB_ENPC_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_ENPC_HEADER header; + ENpcData header; std::string name; LGB_ENPC_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_ENPC_HEADER* >( buf + offset ); + header = *reinterpret_cast< ENpcData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); //std::cout << "\t ENpc " << header.enpcId << " " << name << "\n"; }; }; -struct LGB_EOBJ_HEADER : - public LGB_ENTRY_HEADER +struct EObjData : + public InstanceObject { uint32_t eobjId; uint32_t levelHierachyId; @@ -203,23 +203,23 @@ struct LGB_EOBJ_HEADER : }; class LGB_EOBJ_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_EOBJ_HEADER header; + EObjData header; std::string name; LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_EOBJ_HEADER* >( buf + offset ); + header = *reinterpret_cast< EObjData* >( buf + offset ); //std::cout << "\t " << header.eobjId << " " << name << " unknown: " << header.unknown << "\n"; name = std::string( buf + offset + header.nameOffset ); }; }; -struct LGB_MAPRANGE_HEADER : - public LGB_ENTRY_HEADER +struct MapRangeData : + public InstanceObject { uint32_t type; uint16_t unknown2; @@ -227,35 +227,35 @@ struct LGB_MAPRANGE_HEADER : uint8_t unknown4[0x10]; }; -struct LGB_MAPRANGE_ENTRY : - public LGB_ENTRY +struct LGB_MAP_RANGE_ENTRY : + public LgbEntry { public: - LGB_MAPRANGE_HEADER header; + MapRangeData header; std::string name; - LGB_MAPRANGE_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_MAP_RANGE_ENTRY( char* buf, uint32_t offset ) : + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_MAPRANGE_HEADER* >( buf + offset ); + header = *reinterpret_cast< MapRangeData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; struct LGB_COLLISION_BOX_HEADER : - public LGB_ENTRY_HEADER + public InstanceObject { uint8_t unk[100]; }; struct LGB_COLLISION_BOX_ENTRY : - public LGB_ENTRY + public LgbEntry { LGB_COLLISION_BOX_HEADER header; std::string name; LGB_COLLISION_BOX_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { header = *reinterpret_cast< LGB_COLLISION_BOX_HEADER* >( buf + offset ); header.type = LgbEntryType::CollisionBox; @@ -305,7 +305,7 @@ struct LGB_GROUP LGB_FILE* parent; LGB_GROUP_HEADER header; std::string name; - std::vector< std::shared_ptr< LGB_ENTRY > > entries; + std::vector< std::shared_ptr< LgbEntry > > entries; LGB_GROUP( char* buf, LGB_FILE* parentStruct, uint32_t offset ) { diff --git a/src/tools/nav_export/main.cpp b/src/tools/nav_export/main.cpp index 12e1c840..5f5a5b32 100644 --- a/src/tools/nav_export/main.cpp +++ b/src/tools/nav_export/main.cpp @@ -89,7 +89,7 @@ std::string getEobjSgbPath( uint32_t eobjId ) for( auto& row : exportedSgExd.get_rows() ) { - auto id = row.first; + auto id = row.first.rowId; auto& fields = row.second; auto path = std::get< std::string >( fields.at( 0 ) ); @@ -100,7 +100,7 @@ std::string getEobjSgbPath( uint32_t eobjId ) for( auto& row : eObjExd.get_rows() ) { - auto id = row.first; + auto id = row.first.rowId; auto& fields = row.second; eobjSgbPaths[id] = std::get< uint16_t >( fields.at( 11 ) ); @@ -127,9 +127,9 @@ std::string zoneNameToPath( const std::string& name ) { path = teriPath; found = true; - zoneId = row.first; + zoneId = row.first.rowId; } - zoneNameMap[ row.first ] = teriName; + zoneNameMap[ row.first.rowId ] = teriName; } if( found ) @@ -257,7 +257,7 @@ bool pcbTransformModel( const std::string& fileName, const vec3* scale, const ve return true; }; -void exportSgbModel( const std::string& sgbFilePath, LGB_ENTRY* pGimmick, ExportedGroup& exportgroup, bool isEobj = false ) +void exportSgbModel( const std::string& sgbFilePath, LgbEntry* pGimmick, ExportedGroup& exportgroup, bool isEobj = false ) { if( auto pSgbFile = pCache->getSgbFile( sgbFilePath ) ) { diff --git a/src/tools/nav_export/nav/TiledNavmeshGenerator.cpp b/src/tools/nav_export/nav/TiledNavmeshGenerator.cpp index 0204910f..f5e6f00d 100644 --- a/src/tools/nav_export/nav/TiledNavmeshGenerator.cpp +++ b/src/tools/nav_export/nav/TiledNavmeshGenerator.cpp @@ -1,11 +1,11 @@ #include "TiledNavmeshGenerator.h" -#include +#include #include #include -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; inline unsigned int nextPow2( uint32_t v ) @@ -317,7 +317,13 @@ unsigned char* TiledNavmeshGenerator::buildTileMesh( const int tx, const int ty, const int ncid = rcGetChunksOverlappingRect( m_chunkyMesh, tbmin, tbmax, cid, 512 ); if( !ncid ) + { + rcFreeHeightField( m_solid ); + m_solid = nullptr; + delete[] m_triareas; + m_triareas = nullptr; return nullptr; + } m_tileTriCount = 0; @@ -452,6 +458,10 @@ unsigned char* TiledNavmeshGenerator::buildTileMesh( const int tx, const int ty, if( m_cset->nconts == 0 ) { + rcFreeCompactHeightfield( m_chf ); + rcFreeContourSet( m_cset ); + m_chf = nullptr; + m_cset = nullptr; return nullptr; } diff --git a/src/tools/nav_export/navmesh_exporter.h b/src/tools/nav_export/navmesh_exporter.h index 6035b552..642c404b 100644 --- a/src/tools/nav_export/navmesh_exporter.h +++ b/src/tools/nav_export/navmesh_exporter.h @@ -12,9 +12,9 @@ #include "obj_exporter.h" #include "nav/TiledNavmeshGenerator.h" -#include +#include -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; class NavmeshExporter { @@ -23,7 +23,7 @@ public: { auto start = std::chrono::high_resolution_clock::now(); - static std::string currPath = std::experimental::filesystem::current_path().string(); + static std::string currPath = std::filesystem::current_path().string(); auto dir = fs::current_path().string() + "/pcb_export/" + zone.name + "/"; auto fileName = dir + zone.name; diff --git a/src/tools/nav_export/obj_exporter.h b/src/tools/nav_export/obj_exporter.h index b01ad970..fc7ddc99 100644 --- a/src/tools/nav_export/obj_exporter.h +++ b/src/tools/nav_export/obj_exporter.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include @@ -16,7 +16,7 @@ class ObjExporter public: static std::string exportZone( const ExportedZone& zone ) { - static std::string currPath = std::experimental::filesystem::current_path().string(); + static std::string currPath = std::filesystem::current_path().string(); auto start = std::chrono::high_resolution_clock::now(); @@ -25,9 +25,9 @@ public: std::error_code e; - if( !std::experimental::filesystem::exists( dir, e ) ) + if( !std::filesystem::exists( dir, e ) ) { - if( !std::experimental::filesystem::create_directories( dir, e ) ) + if( !std::filesystem::create_directories( dir, e ) ) { printf( "Unable to create directory '%s'", ( dir ).c_str() ); return ""; @@ -59,7 +59,7 @@ public: static std::string exportGroup( const std::string& zoneName, const ExportedGroup& group ) { - static std::string currPath = std::experimental::filesystem::current_path().string(); + static std::string currPath = std::filesystem::current_path().string(); auto start = std::chrono::high_resolution_clock::now(); @@ -67,9 +67,9 @@ public: auto fileName = dir + group.name + ".obj"; std::error_code e; - if( !std::experimental::filesystem::exists( dir, e ) ) + if( !std::filesystem::exists( dir, e ) ) { - if( !std::experimental::filesystem::create_directories( dir, e ) ) + if( !std::filesystem::create_directories( dir, e ) ) { printf( "Unable to create directory '%s'", ( dir ).c_str() ); return ""; diff --git a/src/tools/pcb_reader/lgb.h b/src/tools/pcb_reader/lgb.h index b363dcb3..d87a2809 100644 --- a/src/tools/pcb_reader/lgb.h +++ b/src/tools/pcb_reader/lgb.h @@ -68,7 +68,7 @@ enum class LgbEntryType : SphereCastRange = 75, }; -struct LGB_ENTRY_HEADER +struct InstanceObject { LgbEntryType type; uint32_t unknown; @@ -78,25 +78,25 @@ struct LGB_ENTRY_HEADER vec3 scale; }; -class LGB_ENTRY +class LgbEntry { public: char* m_buf; uint32_t m_offset; - LGB_ENTRY_HEADER header; + InstanceObject header; - LGB_ENTRY() + LgbEntry() { m_buf = nullptr; m_offset = 0; memset( &header, 0, sizeof( header ) ); }; - LGB_ENTRY( char* buf, uint32_t offset ) + LgbEntry( char* buf, uint32_t offset ) { m_buf = buf; m_offset = offset; - header = *reinterpret_cast< LGB_ENTRY_HEADER* >( buf + offset ); + header = *reinterpret_cast< InstanceObject* >( buf + offset ); }; const LgbEntryType getType() const @@ -104,14 +104,14 @@ public: return header.type; }; - virtual ~LGB_ENTRY() + virtual ~LgbEntry() { }; }; -struct LGB_BGPARTS_HEADER : - public LGB_ENTRY_HEADER +struct BgPartsData : + public InstanceObject { uint32_t modelFileOffset; uint32_t collisionFileOffset; @@ -124,10 +124,10 @@ struct LGB_BGPARTS_HEADER : }; class LGB_BGPARTS_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_BGPARTS_HEADER header; + BgPartsData header; std::string name; std::string modelFileName; std::string collisionFileName; @@ -137,65 +137,65 @@ public: }; LGB_BGPARTS_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); modelFileName = std::string( buf + offset + header.modelFileOffset ); collisionFileName = std::string( buf + offset + header.collisionFileOffset ); }; }; -struct LGB_GIMMICK_HEADER : - public LGB_ENTRY_HEADER +struct GimmickData : + public InstanceObject { uint32_t gimmickFileOffset; char unknownBytes[100]; }; class LGB_GIMMICK_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_GIMMICK_HEADER header; + GimmickData header; std::string name; std::string gimmickFileName; LGB_GIMMICK_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast( buf + offset ); + header = *reinterpret_cast( buf + offset ); name = std::string( buf + offset + header.nameOffset ); gimmickFileName = std::string( buf + offset + header.gimmickFileOffset ); //std::cout << "\t " << gimmickFileName << " unknown: " << header.unknown << "\n"; }; }; -struct LGB_ENPC_HEADER : - public LGB_ENTRY_HEADER +struct ENpcData : + public InstanceObject { uint32_t enpcId; uint8_t unknown1[0x24]; }; class LGB_ENPC_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_ENPC_HEADER header; + ENpcData header; std::string name; LGB_ENPC_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_ENPC_HEADER* >( buf + offset ); + header = *reinterpret_cast< ENpcData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); //std::cout << "\t ENpc " << header.enpcId << " " << name << "\n"; }; }; -struct LGB_EOBJ_HEADER : - public LGB_ENTRY_HEADER +struct EObjData : + public InstanceObject { uint32_t eobjId; uint32_t levelHierachyId; @@ -203,23 +203,23 @@ struct LGB_EOBJ_HEADER : }; class LGB_EOBJ_ENTRY : - public LGB_ENTRY + public LgbEntry { public: - LGB_EOBJ_HEADER header; + EObjData header; std::string name; LGB_EOBJ_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_EOBJ_HEADER* >( buf + offset ); + header = *reinterpret_cast< EObjData* >( buf + offset ); //std::cout << "\t " << header.eobjId << " " << name << " unknown: " << header.unknown << "\n"; name = std::string( buf + offset + header.nameOffset ); }; }; -struct LGB_MAPRANGE_HEADER : - public LGB_ENTRY_HEADER +struct MapRangeData : + public InstanceObject { uint32_t type; uint16_t unknown2; @@ -227,35 +227,34 @@ struct LGB_MAPRANGE_HEADER : uint8_t unknown4[0x10]; }; -struct LGB_MAPRANGE_ENTRY : - public LGB_ENTRY +struct LGB_MAP_RANGE_ENTRY : public LgbEntry { public: - LGB_MAPRANGE_HEADER header; + MapRangeData header; std::string name; - LGB_MAPRANGE_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LGB_MAP_RANGE_ENTRY( char* buf, uint32_t offset ) : + LgbEntry( buf, offset ) { - header = *reinterpret_cast< LGB_MAPRANGE_HEADER* >( buf + offset ); + header = *reinterpret_cast< MapRangeData* >( buf + offset ); name = std::string( buf + offset + header.nameOffset ); }; }; struct LGB_COLLISION_BOX_HEADER : - public LGB_ENTRY_HEADER + public InstanceObject { uint8_t unk[100]; }; struct LGB_COLLISION_BOX_ENTRY : - public LGB_ENTRY + public LgbEntry { LGB_COLLISION_BOX_HEADER header; std::string name; LGB_COLLISION_BOX_ENTRY( char* buf, uint32_t offset ) : - LGB_ENTRY( buf, offset ) + LgbEntry( buf, offset ) { header = *reinterpret_cast< LGB_COLLISION_BOX_HEADER* >( buf + offset ); header.type = LgbEntryType::CollisionBox; @@ -305,7 +304,7 @@ struct LGB_GROUP LGB_FILE* parent; LGB_GROUP_HEADER header; std::string name; - std::vector< std::shared_ptr< LGB_ENTRY > > entries; + std::vector< std::shared_ptr< LgbEntry > > entries; LGB_GROUP( char* buf, LGB_FILE* parentStruct, uint32_t offset ) { diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index f4d29d2a..29ce3eb3 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -91,7 +91,7 @@ std::string getEobjSgbPath( uint32_t eobjId ) for( auto& row : exportedSgExd.get_rows() ) { - auto id = row.first; + auto id = row.first.rowId; auto& fields = row.second; auto path = std::get< std::string >( fields.at( 0 ) ); @@ -102,7 +102,7 @@ std::string getEobjSgbPath( uint32_t eobjId ) for( auto& row : eObjExd.get_rows() ) { - auto id = row.first; + auto id = row.first.rowId; auto& fields = row.second; eobjSgbPaths[id] = std::get< uint16_t >( fields.at( 11 ) ); @@ -129,9 +129,9 @@ std::string zoneNameToPath( const std::string& name ) { path = teriPath; found = true; - zoneId = row.first; + zoneId = row.first.rowId; } - zoneNameMap[ row.first ] = teriName; + zoneNameMap[ row.first.rowId ] = teriName; } if( found ) @@ -429,7 +429,7 @@ int main( int argc, char* argv[] ) } return true; }; - auto exportSgbModel = [&]( const std::string& sgbFilePath, LGB_ENTRY* pGimmick, bool isEobj = false ) + auto exportSgbModel = [&]( const std::string& sgbFilePath, LgbEntry* pGimmick, bool isEobj = false ) { if( auto pSgbFile = pCache->getSgbFile( sgbFilePath ) ) { diff --git a/src/tools/pcb_reader/nav/TiledNavmeshGenerator.cpp b/src/tools/pcb_reader/nav/TiledNavmeshGenerator.cpp index c4423177..40b4ba62 100644 --- a/src/tools/pcb_reader/nav/TiledNavmeshGenerator.cpp +++ b/src/tools/pcb_reader/nav/TiledNavmeshGenerator.cpp @@ -1,11 +1,11 @@ #include "TiledNavmeshGenerator.h" -#include +#include #include #include -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; inline unsigned int nextPow2( uint32_t v ) diff --git a/src/tools/pcb_reader/navmesh_exporter.h b/src/tools/pcb_reader/navmesh_exporter.h index 29e4cecd..ba890727 100644 --- a/src/tools/pcb_reader/navmesh_exporter.h +++ b/src/tools/pcb_reader/navmesh_exporter.h @@ -12,9 +12,9 @@ #include "obj_exporter.h" #include "nav/TiledNavmeshGenerator.h" -#include +#include -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; class NavmeshExporter { @@ -23,7 +23,7 @@ public: { auto start = std::chrono::high_resolution_clock::now(); - static std::string currPath = std::experimental::filesystem::current_path().string(); + static std::string currPath = std::filesystem::current_path().string(); auto dir = fs::current_path().string() + "/pcb_export/" + zone.name + "/"; auto fileName = dir + zone.name; @@ -60,7 +60,7 @@ public: { auto start = std::chrono::high_resolution_clock::now(); - static std::string currPath = std::experimental::filesystem::current_path().string(); + static std::string currPath = std::filesystem::current_path().string(); auto dir = fs::current_path().string() + "/pcb_export/" + zoneName + "/"; diff --git a/src/tools/pcb_reader/obj_exporter.h b/src/tools/pcb_reader/obj_exporter.h index b01ad970..fc7ddc99 100644 --- a/src/tools/pcb_reader/obj_exporter.h +++ b/src/tools/pcb_reader/obj_exporter.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include @@ -16,7 +16,7 @@ class ObjExporter public: static std::string exportZone( const ExportedZone& zone ) { - static std::string currPath = std::experimental::filesystem::current_path().string(); + static std::string currPath = std::filesystem::current_path().string(); auto start = std::chrono::high_resolution_clock::now(); @@ -25,9 +25,9 @@ public: std::error_code e; - if( !std::experimental::filesystem::exists( dir, e ) ) + if( !std::filesystem::exists( dir, e ) ) { - if( !std::experimental::filesystem::create_directories( dir, e ) ) + if( !std::filesystem::create_directories( dir, e ) ) { printf( "Unable to create directory '%s'", ( dir ).c_str() ); return ""; @@ -59,7 +59,7 @@ public: static std::string exportGroup( const std::string& zoneName, const ExportedGroup& group ) { - static std::string currPath = std::experimental::filesystem::current_path().string(); + static std::string currPath = std::filesystem::current_path().string(); auto start = std::chrono::high_resolution_clock::now(); @@ -67,9 +67,9 @@ public: auto fileName = dir + group.name + ".obj"; std::error_code e; - if( !std::experimental::filesystem::exists( dir, e ) ) + if( !std::filesystem::exists( dir, e ) ) { - if( !std::experimental::filesystem::create_directories( dir, e ) ) + if( !std::filesystem::create_directories( dir, e ) ) { printf( "Unable to create directory '%s'", ( dir ).c_str() ); return ""; diff --git a/src/tools/quest_parser/main.cpp b/src/tools/quest_parser/main.cpp index 0fa1a6f2..44d60f05 100644 --- a/src/tools/quest_parser/main.cpp +++ b/src/tools/quest_parser/main.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include @@ -21,13 +21,14 @@ #include Sapphire::Data::ExdDataGenerated g_exdDataGen; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; using namespace Sapphire; const std::string onTalkStr( " void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override\n" " {\n" - " auto actor = Event::mapEventActorToRealActor( actorId );\n" + " auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref();\n" + " auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) );\n" " }\n\n" ); @@ -40,6 +41,8 @@ const std::string onWithinRangeStr( const std::string onEmoteStr( " void onEmote( uint32_t eventId, Entity::Player& player, uint64_t actorId, uint32_t emoteId ) override\n" " {\n" + " auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref();\n" + " auto actor = eventMgr.mapEventActorToRealActor( static_cast< uint32_t >( actorId ) );\n" " }\n\n" ); @@ -61,6 +64,17 @@ std::string titleCase( const std::string& str ) return retStr; } +std::string titleCaseNoUnderscores( const std::string& str ) +{ + std::string result = titleCase( str ); + + result.erase( std::remove_if( result.begin(), result.end(), []( const char c ) { + return c == '_'; + }), result.end()); + + return result; +} + void createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< std::string >& additionalList, int questId ) { @@ -72,7 +86,7 @@ createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< st "#include \n" "#include \"Manager/EventMgr.h\"\n" "#include \n" - "#include \"Framework.h\"\n\n" + "#include \n\n" ); std::size_t splitPos( pQuestData->id.find( "_" ) ); @@ -101,12 +115,15 @@ createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< st sceneName + "( Entity::Player& player )\n" " {\n" + " auto callback = [ & ]( Entity::Player& player, const Event::SceneResult& result )\n" + " {\n" + " };\n" + "\n" " player.playScene( getId(), " + - sceneId + - ", 0,\n" - " [ & ]( Entity::Player& player, const Event::SceneResult& result )\n" - " {\n" - " });\n" + sceneId + ", " + "NONE, " + "callback" + " );\n" " }\n\n" ); } @@ -126,12 +143,7 @@ createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< st } else { - std::string seqName = titleCase( entry ); - - seqName.erase( std::remove_if( seqName.begin(), seqName.end(), []( const char c ) { - return c == '_'; - }), seqName.end()); - + std::string seqName = titleCaseNoUnderscores( entry ); std::string seqId = entry.substr( 4 ); seqStr += " " + seqName + " = " + seqId + ",\n"; } @@ -189,12 +201,7 @@ createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< st std::sort( script_entities.begin(), script_entities.end() ); for( auto& entity : script_entities ) { - auto name = titleCase( entity ); - - name.erase( std::remove_if( name.begin(), name.end(), []( const char c ) { - return c == '_'; - }), name.end()); - + auto name = titleCaseNoUnderscores( entity ); sentities += " static constexpr auto " + name + ";\n"; } @@ -204,6 +211,8 @@ createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< st additional += "// Start NPC: " + std::to_string( pQuestData->issuerStart ) + "\n"; additional += "// End NPC: " + std::to_string( pQuestData->targetEnd ) + "\n\n"; + additional += "using namespace Sapphire;\n\n"; + std::string actionEntry; std::string scriptEntry; scriptEntry.reserve( 0xFFFF ); @@ -224,14 +233,14 @@ createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< st if( !enemy_ids.empty() ) scriptEntry += std::string( - " void onBNpcKill( uint32_t npcId, Entity::Player& player )\n" + " void onBNpcKill( uint32_t npcId, Entity::Player& player ) override\n" " {\n" " switch( npcId )\n" " {\n" ); for( auto enemy : enemy_strings ) { - scriptEntry += " case " + enemy + ": { break; }\n"; + scriptEntry += " case " + titleCaseNoUnderscores( enemy ) + ": { break; }\n"; } if( !enemy_ids.empty() ) @@ -240,14 +249,14 @@ createScript( std::shared_ptr< Sapphire::Data::Quest >& pQuestData, std::set< st if( !action_ids.empty() ) actionEntry += std::string( - " void onEObjHit( uint32_t npcId, Entity::Player& player, uin32_t actionId )\n" + " void onEObjHit( uint32_t npcId, Entity::Player& player, uint32_t actionId )\n" " {\n" " switch( actionId )\n" " {\n" ); for( auto action : action_names ) { - actionEntry += " case " + action + ": { break; }\n"; + actionEntry += " case " + titleCaseNoUnderscores( action ) + ": { break; }\n"; } if( !action_ids.empty() ) diff --git a/src/tools/questbattle_bruteforce/main.cpp b/src/tools/questbattle_bruteforce/main.cpp index 37ecd51d..d8c1c6d4 100644 --- a/src/tools/questbattle_bruteforce/main.cpp +++ b/src/tools/questbattle_bruteforce/main.cpp @@ -18,16 +18,16 @@ #include -#include +#include -Sapphire::Common::Util::CrashHandler crashHandler; +[[maybe_unused]] Sapphire::Common::Util::CrashHandler crashHandler; Sapphire::Data::ExdDataGenerated g_exdData; xiv::dat::GameData* gameData = nullptr; using namespace Sapphire; -namespace fs = std::experimental::filesystem; +namespace fs = std::filesystem; //const std::string datLocation( "/opt/sapphire_3_15_0/bin/sqpack" ); //const std::string datLocation( "/mnt/c/Program Files (x86)/Steam/steamapps/common/FINAL FANTASY XIV Online/game/sqpack" ); diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index 2fb1fb4c..fbf08757 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -1,12 +1,9 @@ #include "Action.h" -#include "ActionLut.h" -#include "EffectBuilder.h" #include #include #include -#include "Framework.h" #include "Script/ScriptMgr.h" #include @@ -25,6 +22,7 @@ #include #include +#include using namespace Sapphire; using namespace Sapphire::Common; @@ -38,15 +36,14 @@ using namespace Sapphire::World; Action::Action::Action() = default; Action::Action::~Action() = default; -Action::Action::Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t sequence, FrameworkPtr fw ) : - Action( std::move( caster ), actionId, sequence, nullptr, std::move( fw ) ) +Action::Action::Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t sequence) : + Action( std::move( caster ), actionId, sequence, nullptr ) { } Action::Action::Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t sequence, - Data::ActionPtr actionData, FrameworkPtr fw ) : + Data::ActionPtr actionData ) : m_pSource( std::move( caster ) ), - m_pFw( std::move( fw ) ), m_actionData( std::move( actionData ) ), m_id( actionId ), m_targetId( 0 ), @@ -66,10 +63,9 @@ bool Action::Action::init() if( !m_actionData ) { // need to get actionData - auto exdData = m_pFw->get< Data::ExdDataGenerated >(); - assert( exdData ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - auto actionData = exdData->get< Data::Action >( m_id ); + auto actionData = exdData.get< Data::Action >( m_id ); assert( actionData ); m_actionData = actionData; @@ -127,6 +123,15 @@ bool Action::Action::init() // todo: add missing rows for secondaryCostType/secondaryCostType and rename the current rows to primaryCostX + if( ActionLut::validEntryExists( static_cast< uint16_t >( getId() ) ) ) + { + m_lutEntry = ActionLut::getEntry( static_cast< uint16_t >( getId() ) ); + } + else + { + std::memset( &m_lutEntry, 0, sizeof( ActionEntry ) ); + } + addDefaultActorFilters(); return true; @@ -162,6 +167,11 @@ bool Action::Action::isInterrupted() const return m_interruptType != Common::ActionInterruptType::None; } +Common::ActionInterruptType Action::Action::getInterruptType() const +{ + return m_interruptType; +} + void Action::Action::setInterrupted( Common::ActionInterruptType type ) { m_interruptType = type; @@ -206,12 +216,36 @@ bool Action::Action::update() uint64_t tickCount = Common::Util::getTimeMs(); - if( !hasCastTime() || std::difftime( tickCount, m_startTime ) > m_castTimeMs ) + if( !hasCastTime() || std::difftime( static_cast< time_t >( tickCount ), static_cast< time_t >( m_startTime ) ) > m_castTimeMs ) { execute(); return true; } + if( m_pTarget == nullptr && m_targetId != 0 ) + { + // try to search for the target actor + for( auto actor : m_pSource->getInRangeActors( true ) ) + { + if( actor->getId() == m_targetId ) + { + m_pTarget = actor->getAsChara(); + break; + } + } + } + + if( m_pTarget != nullptr ) + { + if( !m_pTarget->isAlive() ) + { + // interrupt the cast if target died + setInterrupted( Common::ActionInterruptType::RegularInterrupt ); + interrupt(); + return true; + } + } + return false; } @@ -239,7 +273,7 @@ void Action::Action::start() data.posX = Common::Util::floatToUInt16( pos.x ); data.posY = Common::Util::floatToUInt16( pos.y ); data.posZ = Common::Util::floatToUInt16( pos.z ); - data.rotation = m_pSource->getRot(); + data.rotation = Common::Util::floatToUInt16Rot( m_pSource->getRot() ); m_pSource->sendToInRangeSet( castPacket, true ); @@ -254,10 +288,10 @@ void Action::Action::start() m_recastTimeMs / 10 ); player->queuePacket( actionStartPkt ); - auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); // check the lut too and see if we have something usable, otherwise cancel the cast - if( !pScriptMgr->onStart( *this ) && !ActionLut::validEntryExists( getId() ) ) + if( !scriptMgr.onStart( *this ) && !ActionLut::validEntryExists( static_cast< uint16_t >( getId() ) ) ) { // script not implemented and insufficient lut data (no potencies) interrupt(); @@ -306,8 +340,8 @@ void Action::Action::interrupt() m_pSource->sendToInRangeSet( control, true ); } - auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); - pScriptMgr->onInterrupt( *this ); + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + scriptMgr.onInterrupt( *this ); } void Action::Action::execute() @@ -321,7 +355,7 @@ void Action::Action::execute() return; } - auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); if( hasCastTime() ) { @@ -336,7 +370,7 @@ void Action::Action::execute() } } - if( isComboAction() ) + if( isCorrectCombo() ) { auto player = m_pSource->getAsPlayer(); @@ -349,14 +383,22 @@ void Action::Action::execute() } else if( auto player = m_pSource->getAsPlayer() ) { - pScriptMgr->onEObjHit( *player, m_targetId, getId() ); + scriptMgr.onEObjHit( *player, m_targetId, getId() ); } // set currently casted action as the combo action if it interrupts a combo // ignore it otherwise (ogcds, etc.) if( !m_actionData->preservesCombo ) { - m_pSource->setLastComboActionId( getId() ); + // potential combo starter or correct combo from last action, must hit something to progress combo + if( !m_hitActors.empty() && ( !isComboAction() || isCorrectCombo() ) ) + { + m_pSource->setLastComboActionId( getId() ); + } + else // clear last combo action if the combo breaks + { + m_pSource->setLastComboActionId( 0 ); + } } } @@ -381,18 +423,40 @@ std::pair< uint32_t, Common::ActionHitSeverityType > Action::Action::calcDamage( } } - auto dmg = Math::CalcStats::calcActionDamage( *m_pSource, potency, wepDmg ); + return Math::CalcStats::calcActionDamage( *m_pSource, potency, wepDmg ); +} - return std::make_pair( dmg, Common::ActionHitSeverityType::NormalDamage ); +std::pair< uint32_t, Common::ActionHitSeverityType > Action::Action::calcHealing( uint32_t potency ) +{ + auto wepDmg = 1.f; + + if( auto player = m_pSource->getAsPlayer() ) + { + auto item = player->getEquippedWeapon(); + assert( item ); + + auto role = player->getRole(); + if( role == Common::Role::RangedMagical || role == Common::Role::Healer ) + { + wepDmg = item->getMagicalDmg(); + } + else + { + wepDmg = item->getPhysicalDmg(); + } + } + + return Math::CalcStats::calcActionHealing( *m_pSource, potency, wepDmg ); } void Action::Action::buildEffects() { snapshotAffectedActors( m_hitActors ); - auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + auto hasLutEntry = hasValidLutEntry(); - if( !pScriptMgr->onExecute( *this ) && !ActionLut::validEntryExists( getId() ) ) + if( !scriptMgr.onExecute( *this ) && !hasLutEntry ) { if( auto player = m_pSource->getAsPlayer() ) { @@ -402,32 +466,76 @@ void Action::Action::buildEffects() return; } - if( m_hitActors.empty() ) + if( !hasLutEntry || m_hitActors.empty() ) + { + // send any effect packet added by script or an empty one just to play animation for other players + m_effectBuilder->buildAndSendPackets(); return; - - auto lutEntry = ActionLut::getEntry( getId() ); + } // no script exists but we have a valid lut entry if( auto player = getSourceChara()->getAsPlayer() ) { - player->sendDebug( "Hit target: pot: {} (c: {}, f: {}, r: {}), heal pot: {}", - lutEntry.potency, lutEntry.comboPotency, lutEntry.flankPotency, lutEntry.rearPotency, - lutEntry.curePotency ); + player->sendDebug( "Hit target: pot: {} (c: {}, f: {}, r: {}), heal pot: {}, mpp: {}", + m_lutEntry.potency, m_lutEntry.comboPotency, m_lutEntry.flankPotency, m_lutEntry.rearPotency, + m_lutEntry.curePotency, m_lutEntry.restoreMPPercentage ); } + // when aoe, these effects are in the target whatever is hit first + bool shouldRestoreMP = true; + bool shouldApplyComboSucceedEffect = true; + for( auto& actor : m_hitActors ) { - // todo: this is shit - if( lutEntry.curePotency > 0 ) + if( m_lutEntry.potency > 0 ) { + auto dmg = calcDamage( isCorrectCombo() ? m_lutEntry.comboPotency : m_lutEntry.potency ); + m_effectBuilder->damage( actor, actor, dmg.first, dmg.second ); - m_effectBuilder->healTarget( actor, lutEntry.curePotency ); + if( dmg.first > 0 ) + actor->onActionHostile( m_pSource ); + + if( isCorrectCombo() && shouldApplyComboSucceedEffect ) + { + m_effectBuilder->comboSucceed( actor ); + shouldApplyComboSucceedEffect = false; + } + + if( !isComboAction() || isCorrectCombo() ) + { + if( m_lutEntry.curePotency > 0 ) // actions with self heal + { + auto heal = calcHealing( m_lutEntry.curePotency ); + m_effectBuilder->heal( actor, m_pSource, heal.first, heal.second, Common::ActionEffectResultFlag::EffectOnSource ); + } + + if( m_lutEntry.restoreMPPercentage > 0 && shouldRestoreMP ) + { + m_effectBuilder->restoreMP( actor, m_pSource, m_pSource->getMaxMp() * m_lutEntry.restoreMPPercentage / 100, Common::ActionEffectResultFlag::EffectOnSource ); + shouldRestoreMP = false; + } + + if ( !m_actionData->preservesCombo ) // we need something like m_actionData->hasNextComboAction + { + m_effectBuilder->startCombo( actor, getId() ); // this is on all targets hit + } + } } - - else if( lutEntry.potency > 0 ) + else if( m_lutEntry.curePotency > 0 ) { - auto dmg = calcDamage( lutEntry.potency ); - m_effectBuilder->damageTarget( actor, dmg.first, dmg.second ); + auto heal = calcHealing( m_lutEntry.curePotency ); + m_effectBuilder->heal( actor, actor, heal.first, heal.second ); + + if( m_lutEntry.restoreMPPercentage > 0 && shouldRestoreMP ) + { + m_effectBuilder->restoreMP( actor, m_pSource, m_pSource->getMaxMp() * m_lutEntry.restoreMPPercentage / 100, Common::ActionEffectResultFlag::EffectOnSource ); + shouldRestoreMP = false; + } + } + else if( m_lutEntry.restoreMPPercentage > 0 && shouldRestoreMP ) + { + m_effectBuilder->restoreMP( actor, m_pSource, m_pSource->getMaxMp() * m_lutEntry.restoreMPPercentage / 100, Common::ActionEffectResultFlag::EffectOnSource ); + shouldRestoreMP = false; } } @@ -455,7 +563,7 @@ bool Action::Action::playerPreCheck( Entity::Player& player ) return false; // npc actions/non player actions - if( m_actionData->classJob == -1 ) + if( m_actionData->classJob == -1 && !m_actionData->isRoleAction ) return false; if( player.getLevel() < m_actionData->classJobLevel ) @@ -464,13 +572,12 @@ bool Action::Action::playerPreCheck( Entity::Player& player ) auto currentClass = player.getClass(); auto actionClass = static_cast< Common::ClassJob >( m_actionData->classJob ); - if( actionClass != Common::ClassJob::Adventurer && currentClass != actionClass ) + if( actionClass != Common::ClassJob::Adventurer && currentClass != actionClass && !m_actionData->isRoleAction ) { // check if not a base class action - auto exdData = m_pFw->get< Data::ExdDataGenerated >(); - assert( exdData ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - auto classJob = exdData->get< Data::ClassJob >( static_cast< uint8_t >( currentClass ) ); + auto classJob = exdData.get< Data::ClassJob >( static_cast< uint8_t >( currentClass ) ); if( !classJob ) return false; @@ -510,7 +617,7 @@ void Action::Action::setAdditionalData( uint32_t data ) m_additionalData = data; } -bool Action::Action::isComboAction() const +bool Action::Action::isCorrectCombo() const { auto lastActionId = m_pSource->getLastComboActionId(); @@ -522,6 +629,11 @@ bool Action::Action::isComboAction() const return m_actionData->actionCombo == lastActionId; } +bool Action::Action::isComboAction() const +{ + return m_actionData->actionCombo != 0; +} + bool Action::Action::primaryCostCheck( bool subtractCosts ) { switch( m_primaryCostType ) @@ -545,11 +657,11 @@ bool Action::Action::primaryCostCheck( bool subtractCosts ) auto cost = m_primaryCost * 100; - if( curMp < cost ) + if( curMp < static_cast< uint32_t >( cost ) ) return false; if( subtractCosts ) - m_pSource->setMp( curMp - cost ); + m_pSource->setMp( curMp - static_cast< uint32_t >( cost ) ); return true; } @@ -621,6 +733,7 @@ void Action::Action::addDefaultActorFilters() switch( m_castType ) { case Common::CastType::SingleTarget: + case Common::CastType::Type3: { auto filter = std::make_shared< World::Util::ActorFilterSingleTarget >( static_cast< uint32_t >( m_targetId ) ); @@ -656,12 +769,23 @@ void Action::Action::addDefaultActorFilters() bool Action::Action::preFilterActor( Sapphire::Entity::Actor& actor ) const { auto kind = actor.getObjKind(); + auto chara = actor.getAsChara(); // todo: are there any server side eobjs that players can hit? if( kind != ObjKind::BattleNpc && kind != ObjKind::Player ) return false; + + if( !m_canTargetSelf && chara->getId() == m_pSource->getId() ) + return false; + + if( ( m_lutEntry.potency > 0 || m_lutEntry.curePotency > 0 ) && !chara->isAlive() ) // !m_canTargetDead not working for aoe + return false; - // todo: handle things such based on canTargetX + if( m_lutEntry.potency > 0 && m_pSource->getObjKind() == chara->getObjKind() ) // !m_canTargetFriendly not working for aoe + return false; + + if( ( m_lutEntry.potency == 0 && m_lutEntry.curePotency > 0 ) && m_pSource->getObjKind() != chara->getObjKind() ) // !m_canTargetHostile not working for aoe + return false; return true; } @@ -679,4 +803,15 @@ Sapphire::Entity::CharaPtr Action::Action::getHitChara() } return nullptr; +} + +bool Action::Action::hasValidLutEntry() const +{ + return m_lutEntry.potency != 0 || m_lutEntry.comboPotency != 0 || m_lutEntry.flankPotency != 0 || m_lutEntry.frontPotency != 0 || + m_lutEntry.rearPotency != 0 || m_lutEntry.curePotency != 0 || m_lutEntry.restoreMPPercentage != 0; +} + +Action::EffectBuilderPtr Action::Action::getEffectbuilder() +{ + return m_effectBuilder; } \ No newline at end of file diff --git a/src/world/Action/Action.h b/src/world/Action/Action.h index 8288b90e..0b62f856 100644 --- a/src/world/Action/Action.h +++ b/src/world/Action/Action.h @@ -2,8 +2,10 @@ #define _ACTION_H_ #include +#include "ActionLut.h" #include "Util/ActorFilter.h" #include "ForwardsZone.h" +#include "EffectBuilder.h" namespace Sapphire::Data { @@ -20,8 +22,8 @@ namespace Sapphire::World::Action public: Action(); - Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t sequence, FrameworkPtr fw ); - Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t sequence, Data::ActionPtr actionData, FrameworkPtr fw ); + Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t sequence ); + Action( Entity::CharaPtr caster, uint32_t actionId, uint16_t sequence, Data::ActionPtr actionData ); virtual ~Action(); @@ -37,6 +39,7 @@ namespace Sapphire::World::Action Entity::CharaPtr getSourceChara() const; bool isInterrupted() const; + Common::ActionInterruptType getInterruptType() const; void setInterrupted( Common::ActionInterruptType type ); uint32_t getCastTime() const; @@ -45,6 +48,8 @@ namespace Sapphire::World::Action uint32_t getAdditionalData() const; void setAdditionalData( uint32_t data ); + bool isCorrectCombo() const; + bool isComboAction() const; /*! @@ -75,7 +80,7 @@ namespace Sapphire::World::Action * @brief Tests if an action is castable by the current source chara * @return true if castable, false if the caster doesn't meet the requirements */ - bool preCheck(); + virtual bool preCheck(); /*! * @brief Snapshots characters affected by a cast. @@ -85,6 +90,8 @@ namespace Sapphire::World::Action */ bool snapshotAffectedActors( std::vector< Entity::CharaPtr >& actors ); + EffectBuilderPtr getEffectbuilder(); + void buildEffects(); /*! @@ -143,6 +150,8 @@ namespace Sapphire::World::Action bool preFilterActor( Entity::Actor& actor ) const; + bool hasValidLutEntry() const; + uint32_t m_id; uint16_t m_sequence; @@ -174,7 +183,6 @@ namespace Sapphire::World::Action Common::ActionInterruptType m_interruptType; - FrameworkPtr m_pFw; Data::ActionPtr m_actionData; Common::FFXIVARR_POSITION3 m_pos; @@ -183,6 +191,8 @@ namespace Sapphire::World::Action std::vector< World::Util::ActorFilterPtr > m_actorFilters; std::vector< Entity::CharaPtr > m_hitActors; + + ActionEntry m_lutEntry; }; } diff --git a/src/world/Action/ActionLut.h b/src/world/Action/ActionLut.h index f8eeafa8..f19b8c84 100644 --- a/src/world/Action/ActionLut.h +++ b/src/world/Action/ActionLut.h @@ -13,7 +13,7 @@ namespace Sapphire::World::Action uint16_t frontPotency; uint16_t rearPotency; uint16_t curePotency; -// uint16_t restorePercentage; + uint16_t restoreMPPercentage; }; class ActionLut diff --git a/src/world/Action/ActionLutData.cpp b/src/world/Action/ActionLutData.cpp index 76e352ae..88b8a71a 100644 --- a/src/world/Action/ActionLutData.cpp +++ b/src/world/Action/ActionLutData.cpp @@ -5,1402 +5,1523 @@ using namespace Sapphire::World::Action; ActionLut::Lut ActionLut::m_actionLut = { // attack - { 7, { 0, 0, 0, 0, 0, 0 } }, + { 7, { 0, 0, 0, 0, 0, 0, 0 } }, // Shot - { 8, { 0, 0, 0, 0, 0, 0 } }, + { 8, { 0, 0, 0, 0, 0, 0, 0 } }, // Fast Blade - { 9, { 200, 0, 0, 0, 0, 0 } }, + { 9, { 200, 0, 0, 0, 0, 0, 0 } }, // Riot Blade - { 15, { 100, 300, 0, 0, 0, 0 } }, + { 15, { 100, 300, 0, 0, 0, 0, 10 } }, // Shield Bash - { 16, { 110, 0, 0, 0, 0, 0 } }, + { 16, { 110, 0, 0, 0, 0, 0, 0 } }, // Sentinel - { 17, { 0, 0, 0, 0, 0, 0 } }, + { 17, { 0, 0, 0, 0, 0, 0, 0 } }, // Fight or Flight - { 20, { 0, 0, 0, 0, 0, 0 } }, + { 20, { 0, 0, 0, 0, 0, 0, 0 } }, // Rage of Halone - { 21, { 100, 350, 0, 0, 0, 0 } }, + { 21, { 100, 350, 0, 0, 0, 0, 0 } }, // Circle of Scorn - { 23, { 120, 0, 0, 0, 0, 0 } }, + { 23, { 120, 0, 0, 0, 0, 0, 0 } }, // Shield Lob - { 24, { 120, 0, 0, 0, 0, 0 } }, + { 24, { 120, 0, 0, 0, 0, 0, 0 } }, // Cover - { 27, { 0, 0, 0, 0, 0, 0 } }, + { 27, { 0, 0, 0, 0, 0, 0, 0 } }, // Iron Will - { 28, { 0, 0, 0, 0, 0, 0 } }, + { 28, { 0, 0, 0, 0, 0, 0, 0 } }, // Spirits Within - { 29, { 370, 0, 0, 0, 0, 0 } }, + { 29, { 100, 0, 0, 0, 0, 0, 5 } }, // Hallowed Ground - { 30, { 0, 0, 0, 0, 0, 0 } }, + { 30, { 0, 0, 0, 0, 0, 0, 0 } }, // Heavy Swing - { 31, { 200, 0, 0, 0, 0, 0 } }, + { 31, { 200, 0, 0, 0, 0, 0, 0 } }, // Maim - { 37, { 100, 300, 0, 0, 0, 0 } }, + { 37, { 100, 300, 0, 0, 0, 0, 0 } }, // Berserk - { 38, { 0, 0, 0, 0, 0, 0 } }, + { 38, { 0, 0, 0, 0, 0, 0, 0 } }, // Thrill of Battle - { 40, { 0, 0, 0, 0, 0, 0 } }, + { 40, { 0, 0, 0, 0, 0, 0, 0 } }, // Overpower - { 41, { 130, 0, 0, 0, 0, 0 } }, + { 41, { 130, 0, 0, 0, 0, 0, 0 } }, // Storm's Path - { 42, { 100, 380, 0, 0, 0, 250 } }, + { 42, { 100, 380, 0, 0, 0, 250, 0 } }, // Holmgang - { 43, { 0, 0, 0, 0, 0, 0 } }, + { 43, { 0, 0, 0, 0, 0, 0, 0 } }, // Vengeance - { 44, { 55, 0, 0, 0, 0, 0 } }, + { 44, { 55, 0, 0, 0, 0, 0, 0 } }, // Storm's Eye - { 45, { 100, 380, 0, 0, 0, 0 } }, + { 45, { 100, 380, 0, 0, 0, 0, 0 } }, // Tomahawk - { 46, { 140, 0, 0, 0, 0, 0 } }, + { 46, { 140, 0, 0, 0, 0, 0, 0 } }, // Defiance - { 48, { 0, 0, 0, 0, 0, 0 } }, + { 48, { 0, 0, 0, 0, 0, 0, 0 } }, // Inner Beast - { 49, { 350, 0, 0, 0, 0, 0 } }, + { 49, { 350, 0, 0, 0, 0, 0, 0 } }, // Steel Cyclone - { 51, { 220, 0, 0, 0, 0, 0 } }, + { 51, { 220, 0, 0, 0, 0, 0, 0 } }, // Infuriate - { 52, { 0, 0, 0, 0, 0, 0 } }, + { 52, { 0, 0, 0, 0, 0, 0, 0 } }, // Bootshine - { 53, { 150, 0, 0, 0, 0, 0 } }, + { 53, { 150, 0, 0, 0, 0, 0, 0 } }, // True Strike - { 54, { 220, 0, 0, 0, 240, 0 } }, + { 54, { 220, 0, 0, 0, 240, 0, 0 } }, // Snap Punch - { 56, { 210, 0, 230, 0, 0, 0 } }, + { 56, { 210, 0, 230, 0, 0, 0, 0 } }, // Fists of Earth - { 60, { 0, 0, 0, 0, 0, 0 } }, + { 60, { 0, 0, 0, 0, 0, 0, 0 } }, // Twin Snakes - { 61, { 150, 0, 170, 0, 0, 0 } }, + { 61, { 150, 0, 170, 0, 0, 0, 0 } }, // Arm of the Destroyer - { 62, { 80, 0, 0, 0, 0, 0 } }, + { 62, { 80, 0, 0, 0, 0, 0, 0 } }, // Fists of Fire - { 63, { 0, 0, 0, 0, 0, 0 } }, + { 63, { 0, 0, 0, 0, 0, 0, 0 } }, // Mantra - { 65, { 0, 0, 0, 0, 0, 0 } }, + { 65, { 0, 0, 0, 0, 0, 0, 0 } }, // Demolish - { 66, { 70, 0, 0, 0, 90, 0 } }, + { 66, { 70, 0, 0, 0, 90, 0, 0 } }, // Perfect Balance - { 69, { 0, 0, 0, 0, 0, 0 } }, + { 69, { 0, 0, 0, 0, 0, 0, 0 } }, // Rockbreaker - { 70, { 120, 0, 0, 0, 0, 0 } }, + { 70, { 120, 0, 0, 0, 0, 0, 0 } }, // Shoulder Tackle - { 71, { 100, 0, 0, 0, 0, 0 } }, + { 71, { 100, 0, 0, 0, 0, 0, 0 } }, // Fists of Wind - { 73, { 0, 0, 0, 0, 0, 0 } }, + { 73, { 0, 0, 0, 0, 0, 0, 0 } }, // Dragon Kick - { 74, { 180, 0, 200, 0, 0, 0 } }, + { 74, { 180, 0, 200, 0, 0, 0, 0 } }, // True Thrust - { 75, { 0, 0, 0, 0, 0, 0 } }, + { 75, { 0, 0, 0, 0, 0, 0, 0 } }, // Vorpal Thrust - { 78, { 0, 0, 0, 0, 0, 0 } }, + { 78, { 0, 0, 0, 0, 0, 0, 0 } }, // Life Surge - { 83, { 0, 0, 0, 0, 0, 0 } }, + { 83, { 0, 0, 0, 0, 0, 0, 0 } }, // Full Thrust - { 84, { 100, 530, 0, 0, 0, 0 } }, + { 84, { 100, 530, 0, 0, 0, 0, 0 } }, // Lance Charge - { 85, { 0, 0, 0, 0, 0, 0 } }, + { 85, { 0, 0, 0, 0, 0, 0, 0 } }, // Doom Spike - { 86, { 170, 0, 0, 0, 0, 0 } }, + { 86, { 170, 0, 0, 0, 0, 0, 0 } }, // Disembowel - { 87, { 0, 0, 0, 0, 0, 0 } }, + { 87, { 0, 0, 0, 0, 0, 0, 0 } }, // Chaos Thrust - { 88, { 100, 290, 0, 0, 140, 0 } }, + { 88, { 100, 290, 0, 0, 140, 0, 0 } }, // Piercing Talon - { 90, { 150, 0, 0, 0, 0, 0 } }, + { 90, { 150, 0, 0, 0, 0, 0, 0 } }, // Jump - { 92, { 310, 0, 0, 0, 0, 0 } }, + { 92, { 310, 0, 0, 0, 0, 0, 0 } }, // Elusive Jump - { 94, { 0, 0, 0, 0, 0, 0 } }, + { 94, { 0, 0, 0, 0, 0, 0, 0 } }, // Spineshatter Dive - { 95, { 240, 0, 0, 0, 0, 0 } }, + { 95, { 240, 0, 0, 0, 0, 0, 0 } }, // Dragonfire Dive - { 96, { 380, 0, 0, 0, 0, 0 } }, + { 96, { 380, 0, 0, 0, 0, 0, 0 } }, // Heavy Shot - { 97, { 180, 0, 0, 0, 0, 0 } }, + { 97, { 180, 0, 0, 0, 0, 0, 0 } }, // Straight Shot - { 98, { 200, 0, 0, 0, 0, 0 } }, + { 98, { 200, 0, 0, 0, 0, 0, 0 } }, // Venomous Bite - { 100, { 100, 0, 0, 0, 0, 0 } }, + { 100, { 100, 0, 0, 0, 0, 0, 0 } }, // Raging Strikes - { 101, { 0, 0, 0, 0, 0, 0 } }, + { 101, { 0, 0, 0, 0, 0, 0, 0 } }, // Quick Nock - { 106, { 150, 0, 0, 0, 0, 0 } }, + { 106, { 150, 0, 0, 0, 0, 0, 0 } }, // Barrage - { 107, { 0, 0, 0, 0, 0, 0 } }, + { 107, { 0, 0, 0, 0, 0, 0, 0 } }, // Bloodletter - { 110, { 150, 0, 0, 0, 0, 0 } }, + { 110, { 150, 0, 0, 0, 0, 0, 0 } }, // Repelling Shot - { 112, { 0, 0, 0, 0, 0, 0 } }, + { 112, { 0, 0, 0, 0, 0, 0, 0 } }, // Windbite - { 113, { 60, 0, 0, 0, 0, 0 } }, + { 113, { 60, 0, 0, 0, 0, 0, 0 } }, // Mage's Ballad - { 114, { 100, 0, 0, 0, 0, 0 } }, + { 114, { 100, 0, 0, 0, 0, 0, 0 } }, // Army's Paeon - { 116, { 100, 0, 0, 0, 0, 0 } }, + { 116, { 100, 0, 0, 0, 0, 0, 0 } }, // Rain of Death - { 117, { 130, 0, 0, 0, 0, 0 } }, + { 117, { 130, 0, 0, 0, 0, 0, 0 } }, // Battle Voice - { 118, { 0, 0, 0, 0, 0, 0 } }, + { 118, { 0, 0, 0, 0, 0, 0, 0 } }, // Stone - { 119, { 140, 0, 0, 0, 0, 0 } }, + { 119, { 140, 0, 0, 0, 0, 0, 0 } }, // Cure - { 120, { 0, 0, 0, 0, 0, 450 } }, + { 120, { 0, 0, 0, 0, 0, 450, 0 } }, // Aero - { 121, { 50, 0, 0, 0, 0, 0 } }, + { 121, { 50, 0, 0, 0, 0, 0, 0 } }, // Medica - { 124, { 0, 0, 0, 0, 0, 300 } }, + { 124, { 0, 0, 0, 0, 0, 300, 0 } }, // Raise - { 125, { 0, 0, 0, 0, 0, 0 } }, + { 125, { 0, 0, 0, 0, 0, 0, 0 } }, // Stone II - { 127, { 200, 0, 0, 0, 0, 0 } }, + { 127, { 200, 0, 0, 0, 0, 0, 0 } }, // Cure III - { 131, { 0, 0, 0, 0, 0, 550 } }, + { 131, { 0, 0, 0, 0, 0, 550, 0 } }, // Aero II - { 132, { 60, 0, 0, 0, 0, 0 } }, + { 132, { 60, 0, 0, 0, 0, 0, 0 } }, // Medica II - { 133, { 0, 0, 0, 0, 0, 200 } }, + { 133, { 0, 0, 0, 0, 0, 200, 0 } }, // Fluid Aura - { 134, { 0, 0, 0, 0, 0, 0 } }, + { 134, { 0, 0, 0, 0, 0, 0, 0 } }, // Cure II - { 135, { 0, 0, 0, 0, 0, 700 } }, + { 135, { 0, 0, 0, 0, 0, 700, 0 } }, // Presence of Mind - { 136, { 0, 0, 0, 0, 0, 0 } }, + { 136, { 0, 0, 0, 0, 0, 0, 0 } }, // Regen - { 137, { 0, 0, 0, 0, 0, 200 } }, + { 137, { 0, 0, 0, 0, 0, 200, 0 } }, // Holy - { 139, { 140, 0, 0, 0, 0, 0 } }, + { 139, { 140, 0, 0, 0, 0, 0, 0 } }, // Benediction - { 140, { 0, 0, 0, 0, 0, 0 } }, + { 140, { 0, 0, 0, 0, 0, 0, 0 } }, // Fire - { 141, { 180, 0, 0, 0, 0, 0 } }, + { 141, { 180, 0, 0, 0, 0, 0, 0 } }, // Blizzard - { 142, { 180, 0, 0, 0, 0, 0 } }, + { 142, { 180, 0, 0, 0, 0, 0, 0 } }, // Thunder - { 144, { 30, 0, 0, 0, 0, 0 } }, + { 144, { 30, 0, 0, 0, 0, 0, 0 } }, // Sleep - { 145, { 0, 0, 0, 0, 0, 0 } }, + { 145, { 0, 0, 0, 0, 0, 0, 0 } }, // Blizzard II - { 146, { 50, 0, 0, 0, 0, 0 } }, + { 146, { 50, 0, 0, 0, 0, 0, 0 } }, // Fire II - { 147, { 80, 0, 0, 0, 0, 0 } }, + { 147, { 80, 0, 0, 0, 0, 0, 0 } }, // Transpose - { 149, { 0, 0, 0, 0, 0, 0 } }, + { 149, { 0, 0, 0, 0, 0, 0, 0 } }, // Fire III - { 152, { 240, 0, 0, 0, 0, 0 } }, + { 152, { 240, 0, 0, 0, 0, 0, 0 } }, // Thunder III - { 153, { 70, 0, 0, 0, 0, 0 } }, + { 153, { 70, 0, 0, 0, 0, 0, 0 } }, // Blizzard III - { 154, { 240, 0, 0, 0, 0, 0 } }, + { 154, { 240, 0, 0, 0, 0, 0, 0 } }, // Aetherial Manipulation - { 155, { 0, 0, 0, 0, 0, 0 } }, + { 155, { 0, 0, 0, 0, 0, 0, 0 } }, // Scathe - { 156, { 100, 0, 0, 0, 0, 0 } }, + { 156, { 100, 0, 0, 0, 0, 0, 0 } }, // Manaward - { 157, { 0, 0, 0, 0, 0, 0 } }, + { 157, { 0, 0, 0, 0, 0, 0, 0 } }, // Manafont - { 158, { 0, 0, 0, 0, 0, 0 } }, + { 158, { 0, 0, 0, 0, 0, 0, 30 } }, // Freeze - { 159, { 100, 0, 0, 0, 0, 0 } }, + { 159, { 100, 0, 0, 0, 0, 0, 0 } }, // Flare - { 162, { 260, 0, 0, 0, 0, 0 } }, + { 162, { 260, 0, 0, 0, 0, 0, 0 } }, // Ruin - { 163, { 80, 0, 0, 0, 0, 0 } }, + { 163, { 180, 0, 0, 0, 0, 0, 0 } }, // Bio - { 164, { 0, 0, 0, 0, 0, 0 } }, + { 164, { 0, 0, 0, 0, 0, 0, 0 } }, // Summon - { 165, { 0, 0, 0, 0, 0, 0 } }, + { 165, { 0, 0, 0, 0, 0, 0, 0 } }, // Aetherflow - { 166, { 0, 0, 0, 0, 0, 0 } }, - // Miasma - { 168, { 20, 0, 0, 0, 0, 0 } }, - // Summon II - { 170, { 0, 0, 0, 0, 0, 0 } }, - // Ruin II - { 172, { 80, 0, 0, 0, 0, 0 } }, - // Resurrection - { 173, { 0, 0, 0, 0, 0, 0 } }, - // Bane - { 174, { 0, 0, 0, 0, 0, 0 } }, - // Bio II - { 178, { 0, 0, 0, 0, 0, 0 } }, - // Summon III - { 180, { 0, 0, 0, 0, 0, 0 } }, - // Fester - { 181, { 100, 0, 0, 0, 0, 0 } }, - // Enkindle - { 184, { 0, 0, 0, 0, 0, 0 } }, - // Adloquium - { 185, { 0, 0, 0, 0, 0, 300 } }, - // Succor - { 186, { 0, 0, 0, 0, 0, 180 } }, - // Sacred Soil - { 188, { 0, 0, 0, 0, 0, 100 } }, - // Lustrate - { 189, { 0, 0, 0, 0, 0, 600 } }, - // Physick - { 190, { 0, 0, 0, 0, 0, 400 } }, - // Shield Wall - { 197, { 0, 0, 0, 0, 0, 0 } }, - // Stronghold - { 198, { 0, 0, 0, 0, 0, 0 } }, - // Last Bastion - { 199, { 0, 0, 0, 0, 0, 0 } }, - // Braver - { 200, { 2400, 0, 0, 0, 0, 0 } }, - // Bladedance - { 201, { 5250, 0, 0, 0, 0, 0 } }, - // Final Heaven - { 202, { 9000, 0, 0, 0, 0, 0 } }, - // Skyshard - { 203, { 1650, 0, 0, 0, 0, 0 } }, - // Starstorm - { 204, { 3600, 0, 0, 0, 0, 0 } }, - // Meteor - { 205, { 6150, 0, 0, 0, 0, 0 } }, - // Healing Wind - { 206, { 0, 0, 0, 0, 0, 0 } }, - // Breath of the Earth - { 207, { 0, 0, 0, 0, 0, 0 } }, - // Pulse of Life - { 208, { 0, 0, 0, 0, 0, 0 } }, - // Magitek Cannon - { 1128, { 0, 0, 0, 0, 0, 0 } }, - // Photon Stream - { 1129, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 1533, { 0, 0, 0, 0, 0, 0 } }, - // Spinning Edge - { 2240, { 200, 0, 0, 0, 0, 0 } }, - // Shade Shift - { 2241, { 0, 0, 0, 0, 0, 0 } }, - // Gust Slash - { 2242, { 100, 250, 0, 0, 0, 0 } }, - // Hide - { 2245, { 0, 0, 0, 0, 0, 0 } }, - // Assassinate - { 2246, { 200, 0, 0, 0, 0, 0 } }, - // Throwing Dagger - { 2247, { 120, 0, 0, 0, 0, 0 } }, - // Mug - { 2248, { 150, 0, 0, 0, 0, 0 } }, - // Death Blossom - { 2254, { 120, 0, 0, 0, 0, 0 } }, - // Aeolian Edge - { 2255, { 100, 360, 0, 0, 160, 0 } }, - // Shadow Fang - { 2257, { 100, 200, 0, 0, 0, 0 } }, - // Trick Attack - { 2258, { 340, 0, 0, 0, 500, 0 } }, - // Ten - { 2259, { 0, 0, 0, 0, 0, 0 } }, - // Ninjutsu - { 2260, { 0, 0, 0, 0, 0, 0 } }, - // Chi - { 2261, { 0, 0, 0, 0, 0, 0 } }, - // Shukuchi - { 2262, { 0, 0, 0, 0, 0, 0 } }, - // Jin - { 2263, { 0, 0, 0, 0, 0, 0 } }, - // Kassatsu - { 2264, { 0, 0, 0, 0, 0, 0 } }, - // Fuma Shuriken - { 2265, { 280, 0, 0, 0, 0, 0 } }, - // Katon - { 2266, { 250, 0, 0, 0, 0, 0 } }, - // Raiton - { 2267, { 400, 0, 0, 0, 0, 0 } }, - // Hyoton - { 2268, { 140, 0, 0, 0, 0, 0 } }, - // Huton - { 2269, { 0, 0, 0, 0, 0, 0 } }, - // Doton - { 2270, { 45, 0, 0, 0, 0, 0 } }, - // Suiton - { 2271, { 130, 0, 0, 0, 0, 0 } }, - // Rabbit Medium - { 2272, { 0, 0, 0, 0, 0, 0 } }, - // Rook Autoturret - { 2864, { 80, 0, 0, 0, 0, 0 } }, - // Split Shot - { 2866, { 160, 0, 0, 0, 0, 0 } }, - // Slug Shot - { 2868, { 100, 240, 0, 0, 0, 0 } }, - // Spread Shot - { 2870, { 180, 0, 0, 0, 0, 0 } }, - // Hot Shot - { 2872, { 300, 0, 0, 0, 0, 0 } }, - // Clean Shot - { 2873, { 100, 320, 0, 0, 0, 0 } }, - // Gauss Round - { 2874, { 150, 0, 0, 0, 0, 0 } }, - // Reassemble - { 2876, { 0, 0, 0, 0, 0, 0 } }, - // Wildfire - { 2878, { 0, 0, 0, 0, 0, 0 } }, - // Ricochet - { 2890, { 150, 0, 0, 0, 0, 0 } }, - // Raiton - { 3203, { 0, 0, 0, 0, 0, 0 } }, - // Raiton - { 3204, { 0, 0, 0, 0, 0, 0 } }, - // Kanashibari - { 3207, { 0, 0, 0, 0, 0, 0 } }, - // Goring Blade - { 3538, { 100, 390, 0, 0, 0, 0 } }, - // Royal Authority - { 3539, { 100, 550, 0, 0, 0, 0 } }, - // Divine Veil - { 3540, { 0, 0, 0, 0, 0, 0 } }, - // Clemency - { 3541, { 0, 0, 0, 0, 0, 1200 } }, - // Sheltron - { 3542, { 0, 0, 0, 0, 0, 0 } }, - // Tornado Kick - { 3543, { 330, 0, 0, 0, 0, 0 } }, - // Elixir Field - { 3545, { 200, 0, 0, 0, 0, 0 } }, - // Meditation - { 3546, { 0, 0, 0, 0, 0, 0 } }, - // the Forbidden Chakra - { 3547, { 370, 0, 0, 0, 0, 0 } }, - // Fell Cleave - { 3549, { 590, 0, 0, 0, 0, 0 } }, - // Decimate - { 3550, { 250, 0, 0, 0, 0, 0 } }, - // Raw Intuition - { 3551, { 0, 0, 0, 0, 0, 0 } }, - // Equilibrium - { 3552, { 0, 0, 0, 0, 0, 1200 } }, - // Blood of the Dragon - { 3553, { 0, 0, 0, 0, 0, 0 } }, - // Fang and Claw - { 3554, { 320, 0, 360, 0, 0, 0 } }, - // Geirskogul - { 3555, { 270, 0, 0, 0, 0, 0 } }, - // Wheeling Thrust - { 3556, { 320, 0, 0, 0, 360, 0 } }, - // Battle Litany - { 3557, { 0, 0, 0, 0, 0, 0 } }, - // Empyreal Arrow - { 3558, { 230, 0, 0, 0, 0, 0 } }, - // the Wanderer's Minuet - { 3559, { 100, 0, 0, 0, 0, 0 } }, - // Iron Jaws - { 3560, { 100, 0, 0, 0, 0, 0 } }, - // the Warden's Paean - { 3561, { 0, 0, 0, 0, 0, 0 } }, - // Sidewinder - { 3562, { 100, 0, 0, 0, 0, 0 } }, - // Armor Crush - { 3563, { 100, 330, 160, 0, 0, 0 } }, - // Dream Within a Dream - { 3566, { 200, 0, 0, 0, 0, 0 } }, - // Stone III - { 3568, { 240, 0, 0, 0, 0, 0 } }, - // Asylum - { 3569, { 0, 0, 0, 0, 0, 100 } }, - // Tetragrammaton - { 3570, { 0, 0, 0, 0, 0, 700 } }, - // Assize - { 3571, { 400, 0, 0, 0, 0, 400 } }, - // Ley Lines - { 3573, { 0, 0, 0, 0, 0, 0 } }, - // Sharpcast - { 3574, { 0, 0, 0, 0, 0, 0 } }, - // Enochian - { 3575, { 0, 0, 0, 0, 0, 0 } }, - // Blizzard IV - { 3576, { 300, 0, 0, 0, 0, 0 } }, - // Fire IV - { 3577, { 300, 0, 0, 0, 0, 0 } }, - // Painflare - { 3578, { 150, 0, 0, 0, 0, 0 } }, - // Ruin III - { 3579, { 100, 0, 0, 0, 0, 0 } }, - // Tri-disaster - { 3580, { 0, 0, 0, 0, 0, 0 } }, - // Dreadwyrm Trance - { 3581, { 0, 0, 0, 0, 0, 0 } }, - // Deathflare - { 3582, { 400, 0, 0, 0, 0, 0 } }, - // Indomitability - { 3583, { 0, 0, 0, 0, 0, 400 } }, - // Broil - { 3584, { 240, 0, 0, 0, 0, 0 } }, - // Deployment Tactics - { 3585, { 0, 0, 0, 0, 0, 0 } }, - // Emergency Tactics - { 3586, { 0, 0, 0, 0, 0, 0 } }, - // Dissipation - { 3587, { 0, 0, 0, 0, 0, 0 } }, - // Draw - { 3590, { 0, 0, 0, 0, 0, 0 } }, - // Redraw - { 3593, { 0, 0, 0, 0, 0, 0 } }, - // Benefic - { 3594, { 0, 0, 0, 0, 0, 400 } }, - // Aspected Benefic - { 3595, { 0, 0, 0, 0, 0, 200 } }, - // Malefic - { 3596, { 150, 0, 0, 0, 0, 0 } }, - // Malefic II - { 3598, { 170, 0, 0, 0, 0, 0 } }, - // Combust - { 3599, { 0, 0, 0, 0, 0, 0 } }, - // Helios - { 3600, { 0, 0, 0, 0, 0, 330 } }, - // Aspected Helios - { 3601, { 0, 0, 0, 0, 0, 100 } }, - // Ascend - { 3603, { 0, 0, 0, 0, 0, 0 } }, - // Diurnal Sect - { 3604, { 0, 0, 0, 0, 0, 0 } }, - // Nocturnal Sect - { 3605, { 0, 0, 0, 0, 0, 0 } }, - // Lightspeed - { 3606, { 0, 0, 0, 0, 0, 0 } }, - // Combust II - { 3608, { 0, 0, 0, 0, 0, 0 } }, - // Benefic II - { 3610, { 0, 0, 0, 0, 0, 700 } }, - // Synastry - { 3612, { 0, 0, 0, 0, 0, 0 } }, - // Collective Unconscious - { 3613, { 0, 0, 0, 0, 0, 50 } }, - // Essential Dignity - { 3614, { 0, 0, 0, 0, 0, 400 } }, - // Gravity - { 3615, { 130, 0, 0, 0, 0, 0 } }, - // Hard Slash - { 3617, { 200, 0, 0, 0, 0, 0 } }, - // Unleash - { 3621, { 150, 0, 0, 0, 0, 0 } }, - // Syphon Strike - { 3623, { 100, 300, 0, 0, 0, 0 } }, - // Unmend - { 3624, { 150, 0, 0, 0, 0, 0 } }, - // Blood Weapon - { 3625, { 0, 0, 0, 0, 0, 0 } }, - // Grit - { 3629, { 0, 0, 0, 0, 0, 0 } }, - // Souleater - { 3632, { 100, 400, 0, 0, 0, 300 } }, - // Dark Mind - { 3634, { 0, 0, 0, 0, 0, 0 } }, - // Shadow Wall - { 3636, { 0, 0, 0, 0, 0, 0 } }, - // Living Dead - { 3638, { 0, 0, 0, 0, 0, 0 } }, - // Salted Earth - { 3639, { 60, 0, 0, 0, 0, 0 } }, - // Plunge - { 3640, { 200, 0, 0, 0, 0, 0 } }, - // Abyssal Drain - { 3641, { 200, 0, 0, 0, 0, 200 } }, - // Carve and Spit - { 3643, { 450, 0, 0, 0, 0, 0 } }, - // Big Shot - { 4238, { 0, 0, 0, 0, 0, 0 } }, - // Desperado - { 4239, { 0, 0, 0, 0, 0, 0 } }, - // Land Waker - { 4240, { 0, 0, 0, 0, 0, 0 } }, - // Dark Force - { 4241, { 0, 0, 0, 0, 0, 0 } }, - // Dragonsong Dive - { 4242, { 0, 0, 0, 0, 0, 0 } }, - // Chimatsuri - { 4243, { 0, 0, 0, 0, 0, 0 } }, - // Sagittarius Arrow - { 4244, { 0, 0, 0, 0, 0, 0 } }, - // Satellite Beam - { 4245, { 0, 0, 0, 0, 0, 0 } }, - // Teraflare - { 4246, { 0, 0, 0, 0, 0, 0 } }, - // Angel Feathers - { 4247, { 0, 0, 0, 0, 0, 0 } }, - // Astral Stasis - { 4248, { 0, 0, 0, 0, 0, 0 } }, - // Form Shift - { 4262, { 0, 0, 0, 0, 0, 0 } }, - // Cannonfire - { 4271, { 0, 0, 0, 0, 0, 0 } }, - // the Balance - { 4401, { 0, 0, 0, 0, 0, 0 } }, - // the Arrow - { 4402, { 0, 0, 0, 0, 0, 0 } }, - // the Spear - { 4403, { 0, 0, 0, 0, 0, 0 } }, - // the Bole - { 4404, { 0, 0, 0, 0, 0, 0 } }, - // the Ewer - { 4405, { 0, 0, 0, 0, 0, 0 } }, - // the Spire - { 4406, { 0, 0, 0, 0, 0, 0 } }, - // Raiton - { 4977, { 0, 0, 0, 0, 0, 0 } }, - // Raiton - { 5069, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 5199, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 5846, { 0, 0, 0, 0, 0, 0 } }, - // Stickyloom - { 5874, { 0, 0, 0, 0, 0, 0 } }, - // Void Fire II - { 6274, { 0, 0, 0, 0, 0, 0 } }, - // Total Eclipse - { 7381, { 120, 0, 0, 0, 0, 0 } }, - // Intervention - { 7382, { 0, 0, 0, 0, 0, 0 } }, - // Requiescat - { 7383, { 550, 0, 0, 0, 0, 0 } }, - // Holy Spirit - { 7384, { 350, 0, 0, 0, 0, 0 } }, - // Passage of Arms - { 7385, { 0, 0, 0, 0, 0, 0 } }, - // Onslaught - { 7386, { 100, 0, 0, 0, 0, 0 } }, - // Upheaval - { 7387, { 450, 0, 0, 0, 0, 0 } }, - // Shake It Off - { 7388, { 0, 0, 0, 0, 0, 0 } }, - // Inner Release - { 7389, { 0, 0, 0, 0, 0, 0 } }, - // Delirium - { 7390, { 0, 0, 0, 0, 0, 0 } }, - // Quietus - { 7391, { 210, 0, 0, 0, 0, 0 } }, - // Bloodspiller - { 7392, { 600, 0, 0, 0, 0, 0 } }, - // The Blackest Night - { 7393, { 0, 0, 0, 0, 0, 0 } }, - // Riddle of Earth - { 7394, { 0, 0, 0, 0, 0, 0 } }, - // Riddle of Fire - { 7395, { 0, 0, 0, 0, 0, 0 } }, - // Brotherhood - { 7396, { 0, 0, 0, 0, 0, 0 } }, - // Sonic Thrust - { 7397, { 100, 200, 0, 0, 0, 0 } }, - // Dragon Sight - { 7398, { 0, 0, 0, 0, 0, 0 } }, - // Mirage Dive - { 7399, { 250, 0, 0, 0, 0, 0 } }, - // Nastrond - { 7400, { 400, 0, 0, 0, 0, 0 } }, - // Hellfrog Medium - { 7401, { 400, 0, 0, 0, 0, 0 } }, - // Bhavacakra - { 7402, { 500, 0, 0, 0, 0, 0 } }, - // Ten Chi Jin - { 7403, { 0, 0, 0, 0, 0, 0 } }, - // Pitch Perfect - { 7404, { 100, 0, 0, 0, 0, 0 } }, - // Troubadour - { 7405, { 0, 0, 0, 0, 0, 0 } }, - // Caustic Bite - { 7406, { 150, 0, 0, 0, 0, 0 } }, - // Stormbite - { 7407, { 100, 0, 0, 0, 0, 0 } }, - // Nature's Minne - { 7408, { 0, 0, 0, 0, 0, 0 } }, - // Refulgent Arrow - { 7409, { 340, 0, 0, 0, 0, 0 } }, - // Heat Blast - { 7410, { 200, 0, 0, 0, 0, 0 } }, - // Heated Split Shot - { 7411, { 200, 0, 0, 0, 0, 0 } }, - // Heated Slug Shot - { 7412, { 100, 300, 0, 0, 0, 0 } }, - // Heated Clean Shot - { 7413, { 100, 400, 0, 0, 0, 0 } }, - // Barrel Stabilizer - { 7414, { 0, 0, 0, 0, 0, 0 } }, - // Rook Overdrive - { 7415, { 0, 0, 0, 0, 0, 0 } }, - // Flamethrower - { 7418, { 0, 0, 0, 0, 0, 0 } }, - // Between the Lines - { 7419, { 0, 0, 0, 0, 0, 0 } }, - // Thunder IV - { 7420, { 50, 0, 0, 0, 0, 0 } }, - // Triplecast - { 7421, { 0, 0, 0, 0, 0, 0 } }, - // Foul - { 7422, { 650, 0, 0, 0, 0, 0 } }, - // Aetherpact - { 7423, { 0, 0, 0, 0, 0, 0 } }, - // Bio III - { 7424, { 0, 0, 0, 0, 0, 0 } }, - // Miasma III - { 7425, { 40, 0, 0, 0, 0, 0 } }, - // Ruin IV - { 7426, { 120, 0, 0, 0, 0, 0 } }, - // Summon Bahamut - { 7427, { 0, 0, 0, 0, 0, 0 } }, - // Enkindle Bahamut - { 7429, { 0, 0, 0, 0, 0, 0 } }, - // Thin Air - { 7430, { 0, 0, 0, 0, 0, 0 } }, - // Stone IV - { 7431, { 280, 0, 0, 0, 0, 0 } }, - // Divine Benison - { 7432, { 0, 0, 0, 0, 0, 0 } }, - // Plenary Indulgence - { 7433, { 0, 0, 0, 0, 0, 200 } }, - // Excogitation - { 7434, { 0, 0, 0, 0, 0, 800 } }, - // Broil II - { 7435, { 260, 0, 0, 0, 0, 0 } }, - // Chain Stratagem - { 7436, { 0, 0, 0, 0, 0, 0 } }, - // Aetherpact - { 7437, { 0, 0, 0, 0, 0, 0 } }, - // Earthly Star - { 7439, { 100, 0, 0, 0, 0, 540 } }, - // Malefic III - { 7442, { 210, 0, 0, 0, 0, 0 } }, - // Minor Arcana - { 7443, { 0, 0, 0, 0, 0, 0 } }, - // Lord of Crowns - { 7444, { 0, 0, 0, 0, 0, 0 } }, - // Lady of Crowns - { 7445, { 0, 0, 0, 0, 0, 0 } }, - // Thunder II - { 7447, { 30, 0, 0, 0, 0, 0 } }, - // Sleeve Draw - { 7448, { 0, 0, 0, 0, 0, 0 } }, - // Hakaze - { 7477, { 170, 0, 0, 0, 0, 0 } }, - // Jinpu - { 7478, { 100, 320, 0, 0, 0, 0 } }, - // Shifu - { 7479, { 100, 320, 0, 0, 0, 0 } }, - // Yukikaze - { 7480, { 100, 400, 0, 0, 0, 0 } }, - // Gekko - { 7481, { 100, 470, 0, 0, 0, 0 } }, - // Kasha - { 7482, { 100, 470, 0, 0, 0, 0 } }, - // Fuga - { 7483, { 100, 0, 0, 0, 0, 0 } }, - // Mangetsu - { 7484, { 100, 160, 0, 0, 0, 0 } }, - // Oka - { 7485, { 100, 160, 0, 0, 0, 0 } }, - // Enpi - { 7486, { 100, 0, 0, 0, 0, 0 } }, - // Midare Setsugekka - { 7487, { 800, 0, 0, 0, 0, 0 } }, - // Tenka Goken - { 7488, { 360, 0, 0, 0, 0, 0 } }, - // Higanbana - { 7489, { 250, 0, 0, 0, 0, 0 } }, - // Hissatsu: Shinten - { 7490, { 320, 0, 0, 0, 0, 0 } }, - // Hissatsu: Kyuten - { 7491, { 150, 0, 0, 0, 0, 0 } }, - // Hissatsu: Gyoten - { 7492, { 100, 0, 0, 0, 0, 0 } }, - // Hissatsu: Yaten - { 7493, { 100, 0, 0, 0, 0, 0 } }, - // Hissatsu: Kaiten - { 7494, { 0, 0, 0, 0, 0, 0 } }, - // Hissatsu: Guren - { 7496, { 850, 0, 0, 0, 0, 0 } }, - // Meditate - { 7497, { 0, 0, 0, 0, 0, 0 } }, - // Third Eye - { 7498, { 0, 0, 0, 0, 0, 0 } }, - // Meikyo Shisui - { 7499, { 0, 0, 0, 0, 0, 0 } }, - // Hissatsu: Seigan - { 7501, { 220, 0, 0, 0, 0, 0 } }, - // Merciful Eyes - { 7502, { 0, 0, 0, 0, 0, 200 } }, - // Jolt - { 7503, { 180, 0, 0, 0, 0, 0 } }, - // Riposte - { 7504, { 130, 0, 0, 0, 0, 0 } }, - // Verthunder - { 7505, { 310, 0, 0, 0, 0, 0 } }, - // Corps-a-corps - { 7506, { 130, 0, 0, 0, 0, 0 } }, - // Veraero - { 7507, { 310, 0, 0, 0, 0, 0 } }, - // Scatter - { 7509, { 120, 0, 0, 0, 0, 0 } }, - // Verfire - { 7510, { 270, 0, 0, 0, 0, 0 } }, - // Verstone - { 7511, { 270, 0, 0, 0, 0, 0 } }, - // Zwerchhau - { 7512, { 100, 150, 0, 0, 0, 0 } }, - // Moulinet - { 7513, { 60, 0, 0, 0, 0, 0 } }, - // Vercure - { 7514, { 0, 0, 0, 0, 0, 350 } }, - // Displacement - { 7515, { 0, 0, 0, 0, 0, 0 } }, - // Redoublement - { 7516, { 100, 230, 0, 0, 0, 0 } }, - // Fleche - { 7517, { 420, 0, 0, 0, 0, 0 } }, - // Acceleration - { 7518, { 0, 0, 0, 0, 0, 0 } }, - // Contre Sixte - { 7519, { 350, 0, 0, 0, 0, 0 } }, - // Embolden - { 7520, { 0, 0, 0, 0, 0, 0 } }, - // Manafication - { 7521, { 0, 0, 0, 0, 0, 0 } }, - // Verraise - { 7523, { 0, 0, 0, 0, 0, 0 } }, - // Jolt II - { 7524, { 250, 0, 0, 0, 0, 0 } }, - // Verflare - { 7525, { 600, 0, 0, 0, 0, 0 } }, - // Verholy - { 7526, { 600, 0, 0, 0, 0, 0 } }, - // Enchanted Riposte - { 7527, { 210, 0, 0, 0, 0, 0 } }, - // Enchanted Zwerchhau - { 7528, { 100, 290, 0, 0, 0, 0 } }, - // Enchanted Redoublement - { 7529, { 100, 470, 0, 0, 0, 0 } }, - // Enchanted Moulinet - { 7530, { 200, 0, 0, 0, 0, 0 } }, - // Magitek Cannon - { 7619, { 0, 0, 0, 0, 0, 0 } }, - // Photon Stream - { 7620, { 0, 0, 0, 0, 0, 0 } }, - // Diffractive Magitek Cannon - { 7621, { 0, 0, 0, 0, 0, 0 } }, - // High-powered Magitek Cannon - { 7622, { 0, 0, 0, 0, 0, 0 } }, - // Doom of the Living - { 7861, { 0, 0, 0, 0, 0, 0 } }, - // Vermilion Scourge - { 7862, { 0, 0, 0, 0, 0, 0 } }, - // Iaijutsu - { 7867, { 0, 0, 0, 0, 0, 0 } }, - // Dissolve Union - { 7869, { 0, 0, 0, 0, 0, 0 } }, - // Stellar Detonation - { 8324, { 100, 0, 0, 0, 0, 540 } }, - // Broken Ridge - { 8395, { 0, 0, 0, 0, 0, 0 } }, - // Magitek Pulse - { 8624, { 0, 0, 0, 0, 0, 0 } }, - // Magitek Thunder - { 8625, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 8687, { 0, 0, 0, 0, 0, 0 } }, - // Katon - { 9012, { 0, 0, 0, 0, 0, 0 } }, - // Remove Barrel - { 9015, { 0, 0, 0, 0, 0, 0 } }, - // Tenka Goken - { 9143, { 0, 0, 0, 0, 0, 0 } }, - // Thunderous Force - { 9294, { 0, 0, 0, 0, 0, 0 } }, - // Raiton - { 9301, { 0, 0, 0, 0, 0, 0 } }, - // Raiton - { 9302, { 0, 0, 0, 0, 0, 0 } }, - // Bishop Overdrive - { 9372, { 0, 0, 0, 0, 0, 0 } }, - // Undraw - { 9629, { 0, 0, 0, 0, 0, 0 } }, - // Self-detonate - { 9775, { 0, 0, 0, 0, 0, 0 } }, - // Shatterstone - { 9823, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 9996, { 0, 0, 0, 0, 0, 0 } }, - // Ungarmax - { 10001, { 0, 0, 0, 0, 0, 0 } }, - // Starstorm - { 10894, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 10946, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 10947, { 0, 0, 0, 0, 0, 0 } }, - // Ruin III - { 11191, { 200, 0, 0, 0, 0, 0 } }, - // Physick - { 11192, { 0, 0, 0, 0, 0, 400 } }, - // Starstorm - { 11193, { 3600, 0, 0, 0, 0, 0 } }, - // Snort - { 11383, { 0, 0, 0, 0, 0, 0 } }, - // 4-tonze Weight - { 11384, { 110, 0, 0, 0, 0, 0 } }, - // Water Cannon - { 11385, { 120, 0, 0, 0, 0, 0 } }, - // Song of Torment - { 11386, { 50, 0, 0, 0, 0, 0 } }, - // High Voltage - { 11387, { 90, 0, 0, 0, 0, 0 } }, - // Bad Breath - { 11388, { 0, 0, 0, 0, 0, 0 } }, - // Flying Frenzy - { 11389, { 80, 0, 0, 0, 0, 0 } }, - // Aqua Breath - { 11390, { 90, 0, 0, 0, 0, 0 } }, - // Plaincracker - { 11391, { 130, 0, 0, 0, 0, 0 } }, - // Acorn Bomb - { 11392, { 0, 0, 0, 0, 0, 0 } }, - // Bristle - { 11393, { 0, 0, 0, 0, 0, 0 } }, - // Mind Blast - { 11394, { 100, 0, 0, 0, 0, 0 } }, - // Blood Drain - { 11395, { 20, 0, 0, 0, 0, 0 } }, - // Bomb Toss - { 11396, { 110, 0, 0, 0, 0, 0 } }, - // 1000 Needles - { 11397, { 0, 0, 0, 0, 0, 0 } }, - // Drill Cannons - { 11398, { 120, 0, 0, 0, 0, 0 } }, - // the Look - { 11399, { 130, 0, 0, 0, 0, 0 } }, - // Sharpened Knife - { 11400, { 120, 0, 0, 0, 0, 0 } }, - // Loom - { 11401, { 0, 0, 0, 0, 0, 0 } }, - // Flame Thrower - { 11402, { 130, 0, 0, 0, 0, 0 } }, - // Faze - { 11403, { 0, 0, 0, 0, 0, 0 } }, - // Glower - { 11404, { 130, 0, 0, 0, 0, 0 } }, - // Missile - { 11405, { 0, 0, 0, 0, 0, 0 } }, - // White Wind - { 11406, { 0, 0, 0, 0, 0, 0 } }, - // Final Sting - { 11407, { 1500, 0, 0, 0, 0, 0 } }, - // Self-destruct - { 11408, { 900, 0, 0, 0, 0, 0 } }, - // Transfusion - { 11409, { 0, 0, 0, 0, 0, 0 } }, - // Toad Oil - { 11410, { 0, 0, 0, 0, 0, 0 } }, - // Off-guard - { 11411, { 0, 0, 0, 0, 0, 0 } }, - // Sticky Tongue - { 11412, { 0, 0, 0, 0, 0, 0 } }, - // Tail Screw - { 11413, { 0, 0, 0, 0, 0, 0 } }, - // Level 5 Petrify - { 11414, { 0, 0, 0, 0, 0, 0 } }, - // Moon Flute - { 11415, { 0, 0, 0, 0, 0, 0 } }, - // Doom - { 11416, { 0, 0, 0, 0, 0, 0 } }, - // Mighty Guard - { 11417, { 0, 0, 0, 0, 0, 0 } }, - // Ice Spikes - { 11418, { 0, 0, 0, 0, 0, 0 } }, - // the Ram's Voice - { 11419, { 130, 0, 0, 0, 0, 0 } }, - // the Dragon's Voice - { 11420, { 110, 0, 0, 0, 0, 0 } }, - // Peculiar Light - { 11421, { 0, 0, 0, 0, 0, 0 } }, - // Ink Jet - { 11422, { 120, 0, 0, 0, 0, 0 } }, - // Flying Sardine - { 11423, { 10, 0, 0, 0, 0, 0 } }, - // Diamondback - { 11424, { 0, 0, 0, 0, 0, 0 } }, - // Fire Angon - { 11425, { 100, 0, 0, 0, 0, 0 } }, - // Feather Rain - { 11426, { 180, 0, 0, 0, 0, 0 } }, - // Eruption - { 11427, { 220, 0, 0, 0, 0, 0 } }, - // Mountain Buster - { 11428, { 310, 0, 0, 0, 0, 0 } }, - // Shock Strike - { 11429, { 310, 0, 0, 0, 0, 0 } }, - // Glass Dance - { 11430, { 290, 0, 0, 0, 0, 0 } }, - // Veil of the Whorl - { 11431, { 0, 0, 0, 0, 0, 0 } }, - // Tri-shackle - { 11482, { 30, 0, 0, 0, 0, 0 } }, - // attack - { 11784, { 0, 0, 0, 0, 0, 0 } }, - // Stone IV of the Seventh Dawn - { 13423, { 140, 0, 0, 0, 0, 0 } }, - // Aero II of the Seventh Dawn - { 13424, { 50, 0, 0, 0, 0, 0 } }, - // Cure II of the Seventh Dawn - { 13425, { 0, 0, 0, 0, 0, 700 } }, - // Aetherwell - { 13426, { 0, 0, 0, 0, 0, 0 } }, - // Thunderous Force - { 14587, { 0, 0, 0, 0, 0, 0 } }, - // Kyokufu - { 14840, { 180, 0, 0, 0, 0, 0 } }, - // Ajisai - { 14841, { 100, 0, 0, 0, 0, 0 } }, - // Hissatsu: Gyoten - { 14842, { 100, 0, 0, 0, 0, 0 } }, - // 冥界恐叫打 - { 14843, { 0, 0, 0, 0, 0, 0 } }, - // Second Wind - { 15375, { 0, 0, 0, 0, 0, 500 } }, - // Interject - { 15537, { 0, 0, 0, 0, 0, 0 } }, - // Fight or Flight - { 15870, { 0, 0, 0, 0, 0, 0 } }, - // Cascade - { 15989, { 200, 0, 0, 0, 0, 0 } }, - // Fountain - { 15990, { 100, 250, 0, 0, 0, 0 } }, - // Reverse Cascade - { 15991, { 300, 0, 0, 0, 0, 0 } }, - // Fountainfall - { 15992, { 350, 0, 0, 0, 0, 0 } }, - // Windmill - { 15993, { 150, 0, 0, 0, 0, 0 } }, - // Bladeshower - { 15994, { 100, 200, 0, 0, 0, 0 } }, - // Rising Windmill - { 15995, { 250, 0, 0, 0, 0, 0 } }, - // Bloodshower - { 15996, { 300, 0, 0, 0, 0, 0 } }, - // Standard Step - { 15997, { 0, 0, 0, 0, 0, 0 } }, - // Technical Step - { 15998, { 0, 0, 0, 0, 0, 0 } }, - // Emboite - { 15999, { 0, 0, 0, 0, 0, 0 } }, - // Entrechat - { 16000, { 0, 0, 0, 0, 0, 0 } }, - // Jete - { 16001, { 0, 0, 0, 0, 0, 0 } }, - // Pirouette - { 16002, { 0, 0, 0, 0, 0, 0 } }, - // Standard Finish - { 16003, { 0, 0, 0, 0, 0, 0 } }, - // Technical Finish - { 16004, { 0, 0, 0, 0, 0, 0 } }, - // Saber Dance - { 16005, { 600, 0, 0, 0, 0, 0 } }, - // Closed Position - { 16006, { 0, 0, 0, 0, 0, 0 } }, - // Fan Dance - { 16007, { 150, 0, 0, 0, 0, 0 } }, - // Fan Dance II - { 16008, { 100, 0, 0, 0, 0, 0 } }, - // Fan Dance III - { 16009, { 200, 0, 0, 0, 0, 0 } }, - // En Avant - { 16010, { 0, 0, 0, 0, 0, 0 } }, - // Devilment - { 16011, { 0, 0, 0, 0, 0, 0 } }, - // Shield Samba - { 16012, { 0, 0, 0, 0, 0, 0 } }, - // Flourish - { 16013, { 0, 0, 0, 0, 0, 0 } }, - // Improvisation - { 16014, { 0, 0, 0, 0, 0, 0 } }, - // Curing Waltz - { 16015, { 0, 0, 0, 0, 0, 200 } }, - // Keen Edge - { 16137, { 200, 0, 0, 0, 0, 0 } }, - // No Mercy - { 16138, { 0, 0, 0, 0, 0, 0 } }, - // Brutal Shell - { 16139, { 100, 300, 0, 0, 0, 150 } }, - // Camouflage - { 16140, { 0, 0, 0, 0, 0, 0 } }, - // Demon Slice - { 16141, { 150, 0, 0, 0, 0, 0 } }, - // Royal Guard - { 16142, { 0, 0, 0, 0, 0, 0 } }, - // Lightning Shot - { 16143, { 150, 0, 0, 0, 0, 0 } }, - // Danger Zone - { 16144, { 350, 0, 0, 0, 0, 0 } }, - // Solid Barrel - { 16145, { 100, 400, 0, 0, 0, 0 } }, - // Gnashing Fang - { 16146, { 450, 0, 0, 0, 0, 0 } }, - // Savage Claw - { 16147, { 550, 0, 0, 0, 0, 0 } }, - // Nebula - { 16148, { 0, 0, 0, 0, 0, 0 } }, - // Demon Slaughter - { 16149, { 100, 250, 0, 0, 0, 0 } }, - // Wicked Talon - { 16150, { 650, 0, 0, 0, 0, 0 } }, - // Aurora - { 16151, { 0, 0, 0, 0, 0, 200 } }, - // Superbolide - { 16152, { 0, 0, 0, 0, 0, 0 } }, - // Sonic Break - { 16153, { 300, 0, 0, 0, 0, 0 } }, - // Rough Divide - { 16154, { 200, 0, 0, 0, 0, 0 } }, - // Continuation - { 16155, { 0, 0, 0, 0, 0, 0 } }, - // Jugular Rip - { 16156, { 260, 0, 0, 0, 0, 0 } }, - // Abdomen Tear - { 16157, { 280, 0, 0, 0, 0, 0 } }, - // Eye Gouge - { 16158, { 300, 0, 0, 0, 0, 0 } }, - // Bow Shock - { 16159, { 200, 0, 0, 0, 0, 0 } }, - // Heart of Light - { 16160, { 0, 0, 0, 0, 0, 0 } }, - // Heart of Stone - { 16161, { 0, 0, 0, 0, 0, 0 } }, - // Burst Strike - { 16162, { 500, 0, 0, 0, 0, 0 } }, - // Fated Circle - { 16163, { 320, 0, 0, 0, 0, 0 } }, - // Bloodfest - { 16164, { 0, 0, 0, 0, 0, 0 } }, - // Blasting Zone - { 16165, { 800, 0, 0, 0, 0, 0 } }, - // Single Standard Finish - { 16191, { 0, 0, 0, 0, 0, 0 } }, - // Double Standard Finish - { 16192, { 0, 0, 0, 0, 0, 0 } }, - // Single Technical Finish - { 16193, { 0, 0, 0, 0, 0, 0 } }, - // Double Technical Finish - { 16194, { 0, 0, 0, 0, 0, 0 } }, - // Triple Technical Finish - { 16195, { 0, 0, 0, 0, 0, 0 } }, - // Quadruple Technical Finish - { 16196, { 0, 0, 0, 0, 0, 0 } }, - // Physick - { 16230, { 0, 0, 0, 0, 0, 400 } }, - // Rightful Sword - { 16269, { 0, 0, 0, 0, 0, 0 } }, - // Brutal Shell - { 16418, { 0, 0, 0, 0, 0, 0 } }, - // Keen Edge - { 16434, { 0, 0, 0, 0, 0, 0 } }, - // Solid Barrel - { 16435, { 0, 0, 0, 0, 0, 0 } }, - // Soothing Potion - { 16436, { 0, 0, 0, 0, 0, 0 } }, - // Shining Blade - { 16437, { 0, 0, 0, 0, 0, 0 } }, - // Perfect Deception - { 16438, { 0, 0, 0, 0, 0, 0 } }, - // Leap of Faith - { 16439, { 0, 0, 0, 0, 0, 0 } }, - // Prominence - { 16457, { 100, 220, 0, 0, 0, 0 } }, - // Holy Circle - { 16458, { 250, 0, 0, 0, 0, 0 } }, - // Confiteor - { 16459, { 800, 0, 0, 0, 0, 0 } }, - // Atonement - { 16460, { 550, 0, 0, 0, 0, 0 } }, - // Intervene - { 16461, { 200, 0, 0, 0, 0, 0 } }, - // Mythril Tempest - { 16462, { 100, 200, 0, 0, 0, 0 } }, - // Chaotic Cyclone - { 16463, { 400, 0, 0, 0, 0, 0 } }, - // Nascent Flash - { 16464, { 0, 0, 0, 0, 0, 0 } }, - // Inner Chaos - { 16465, { 920, 0, 0, 0, 0, 0 } }, - // Flood of Darkness - { 16466, { 250, 0, 0, 0, 0, 0 } }, - // Edge of Darkness - { 16467, { 350, 0, 0, 0, 0, 0 } }, - // Stalwart Soul - { 16468, { 100, 160, 0, 0, 0, 0 } }, - // Flood of Shadow - { 16469, { 300, 0, 0, 0, 0, 0 } }, - // Edge of Shadow - { 16470, { 500, 0, 0, 0, 0, 0 } }, - // Dark Missionary - { 16471, { 0, 0, 0, 0, 0, 0 } }, - // Living Shadow - { 16472, { 0, 0, 0, 0, 0, 0 } }, - // Four-point Fury - { 16473, { 120, 0, 0, 0, 0, 0 } }, - // Enlightenment - { 16474, { 220, 0, 0, 0, 0, 0 } }, - // Anatman - { 16475, { 0, 0, 0, 0, 0, 0 } }, - // Six-sided Star - { 16476, { 400, 0, 0, 0, 0, 0 } }, - // Coerthan Torment - { 16477, { 100, 230, 0, 0, 0, 0 } }, - // High Jump - { 16478, { 400, 0, 0, 0, 0, 0 } }, - // Raiden Thrust - { 16479, { 330, 0, 0, 0, 0, 0 } }, - // Stardiver - { 16480, { 550, 0, 0, 0, 0, 0 } }, - // Hissatsu: Senei - { 16481, { 1100, 0, 0, 0, 0, 0 } }, - // Ikishoten - { 16482, { 0, 0, 0, 0, 0, 0 } }, - // Tsubame-gaeshi - { 16483, { 0, 0, 0, 0, 0, 0 } }, - // Kaeshi: Higanbana - { 16484, { 375, 0, 0, 0, 0, 0 } }, - // Kaeshi: Goken - { 16485, { 540, 0, 0, 0, 0, 0 } }, - // Kaeshi: Setsugekka - { 16486, { 1200, 0, 0, 0, 0, 0 } }, - // Shoha - { 16487, { 0, 0, 0, 0, 0, 0 } }, - // Hakke Mujinsatsu - { 16488, { 100, 140, 0, 0, 0, 0 } }, - // Meisui - { 16489, { 0, 0, 0, 0, 0, 0 } }, - // Goka Mekkyaku - { 16491, { 400, 0, 0, 0, 0, 0 } }, - // Hyosho Ranryu - { 16492, { 600, 0, 0, 0, 0, 0 } }, - // Bunshin - { 16493, { 0, 0, 0, 0, 0, 0 } }, - // Shadowbite - { 16494, { 100, 0, 0, 0, 0, 0 } }, - // Burst Shot - { 16495, { 230, 0, 0, 0, 0, 0 } }, - // Apex Arrow - { 16496, { 500, 0, 0, 0, 0, 0 } }, - // Auto Crossbow - { 16497, { 180, 0, 0, 0, 0, 0 } }, - // Drill - { 16498, { 700, 0, 0, 0, 0, 0 } }, - // Bioblaster - { 16499, { 60, 0, 0, 0, 0, 0 } }, - // Air Anchor - { 16500, { 700, 0, 0, 0, 0, 0 } }, - // Automaton Queen - { 16501, { 0, 0, 0, 0, 0, 0 } }, - // Queen Overdrive - { 16502, { 0, 0, 0, 0, 0, 0 } }, - // Despair - { 16505, { 380, 0, 0, 0, 0, 0 } }, - // Umbral Soul - { 16506, { 0, 0, 0, 0, 0, 0 } }, - // Xenoglossy - { 16507, { 750, 0, 0, 0, 0, 0 } }, + { 166, { 0, 0, 0, 0, 0, 0, 10 } }, // Energy Drain - { 16508, { 100, 0, 0, 0, 0, 0 } }, - // Egi Assault - { 16509, { 0, 0, 0, 0, 0, 0 } }, - // Energy Siphon - { 16510, { 40, 0, 0, 0, 0, 0 } }, - // Outburst - { 16511, { 70, 0, 0, 0, 0, 0 } }, - // Egi Assault II - { 16512, { 0, 0, 0, 0, 0, 0 } }, - // Firebird Trance - { 16513, { 0, 0, 0, 0, 0, 0 } }, - // Fountain of Fire - { 16514, { 250, 0, 0, 0, 0, 0 } }, - // Brand of Purgatory - { 16515, { 350, 0, 0, 0, 0, 0 } }, - // Enkindle Phoenix - { 16516, { 0, 0, 0, 0, 0, 0 } }, - // Verthunder II - { 16524, { 0, 0, 0, 0, 0, 0 } }, - // Veraero II - { 16525, { 0, 0, 0, 0, 0, 0 } }, - // Impact - { 16526, { 220, 0, 0, 0, 0, 0 } }, - // Engagement - { 16527, { 150, 0, 0, 0, 0, 0 } }, - // Enchanted Reprise - { 16528, { 220, 0, 0, 0, 0, 0 } }, - // Reprise - { 16529, { 100, 0, 0, 0, 0, 0 } }, - // Scorch - { 16530, { 700, 0, 0, 0, 0, 0 } }, - // Afflatus Solace - { 16531, { 0, 0, 0, 0, 0, 700 } }, - // Dia - { 16532, { 120, 0, 0, 0, 0, 0 } }, - // Glare - { 16533, { 300, 0, 0, 0, 0, 0 } }, - // Afflatus Rapture - { 16534, { 0, 0, 0, 0, 0, 300 } }, - // Afflatus Misery - { 16535, { 900, 0, 0, 0, 0, 0 } }, - // Temperance - { 16536, { 0, 0, 0, 0, 0, 0 } }, - // Whispering Dawn - { 16537, { 0, 0, 0, 0, 0, 0 } }, - // Fey Illumination - { 16538, { 0, 0, 0, 0, 0, 0 } }, - // Art of War - { 16539, { 150, 0, 0, 0, 0, 0 } }, - // Biolysis - { 16540, { 0, 0, 0, 0, 0, 0 } }, - // Broil III - { 16541, { 280, 0, 0, 0, 0, 0 } }, - // Recitation - { 16542, { 0, 0, 0, 0, 0, 0 } }, - // Fey Blessing - { 16543, { 0, 0, 0, 0, 0, 0 } }, - // Summon Seraph - { 16545, { 0, 0, 0, 0, 0, 0 } }, - // Consolation - { 16546, { 0, 0, 0, 0, 0, 0 } }, - // Firebird Trance - { 16549, { 0, 0, 0, 0, 0, 0 } }, - // Divination - { 16552, { 0, 0, 0, 0, 0, 0 } }, - // Celestial Opposition - { 16553, { 0, 0, 0, 0, 0, 100 } }, - // Combust III - { 16554, { 0, 0, 0, 0, 0, 0 } }, - // Malefic IV - { 16555, { 240, 0, 0, 0, 0, 0 } }, - // Celestial Intersection - { 16556, { 0, 0, 0, 0, 0, 150 } }, - // Horoscope - { 16557, { 0, 0, 0, 0, 0, 100 } }, - // Horoscope - { 16558, { 0, 0, 0, 0, 0, 0 } }, - // Neutral Sect - { 16559, { 0, 0, 0, 0, 0, 0 } }, - // Ronkan Fire III - { 16574, { 430, 0, 0, 0, 0, 0 } }, - // Ronkan Blizzard III - { 16575, { 240, 0, 0, 0, 0, 0 } }, - // Ronkan Thunder III - { 16576, { 200, 0, 0, 0, 0, 0 } }, - // Ronkan Flare - { 16577, { 460, 0, 0, 0, 0, 0 } }, - // Falling Star - { 16578, { 1500, 0, 0, 0, 0, 0 } }, - // Detonator - { 16766, { 0, 0, 0, 0, 0, 0 } }, - // Fast Blade - { 16788, { 0, 0, 0, 0, 0, 0 } }, - // Sunshadow - { 16789, { 0, 0, 0, 0, 0, 0 } }, - // Assault I: Glittering Topaz - { 16791, { 0, 0, 0, 0, 0, 0 } }, - // Assault II: Shining Topaz - { 16792, { 0, 0, 0, 0, 0, 0 } }, - // Assault I: Downburst - { 16793, { 0, 0, 0, 0, 0, 0 } }, - // Assault II: Glittering Emerald - { 16794, { 0, 0, 0, 0, 0, 0 } }, - // Assault I: Earthen Armor - { 16795, { 0, 0, 0, 0, 0, 0 } }, - // Assault II: Mountain Buster - { 16796, { 0, 0, 0, 0, 0, 0 } }, - // Assault I: Aerial Slash - { 16797, { 0, 0, 0, 0, 0, 0 } }, - // Assault II: Slipstream - { 16798, { 0, 0, 0, 0, 0, 0 } }, - // Assault I: Crimson Cyclone - { 16799, { 0, 0, 0, 0, 0, 0 } }, - // Assault II: Flaming Crush - { 16800, { 0, 0, 0, 0, 0, 0 } }, - // Enkindle: Earthen Fury - { 16801, { 0, 0, 0, 0, 0, 0 } }, - // Enkindle: Aerial Blast - { 16802, { 0, 0, 0, 0, 0, 0 } }, - // Enkindle: Inferno - { 16803, { 0, 0, 0, 0, 0, 0 } }, - // Rough Divide - { 16804, { 200, 0, 0, 0, 0, 0 } }, - // Tactician - { 16889, { 0, 0, 0, 0, 0, 0 } }, - // Swashbuckler - { 16984, { 0, 0, 0, 0, 0, 0 } }, - // Greatest Eclipse - { 16985, { 0, 0, 0, 0, 0, 0 } }, - // Ronkan Cure II - { 17000, { 0, 0, 0, 0, 0, 1300 } }, - // Ronkan Medica - { 17001, { 0, 0, 0, 0, 0, 500 } }, - // Ronkan Esuna - { 17002, { 0, 0, 0, 0, 0, 0 } }, - // Ronkan Stone II - { 17003, { 200, 0, 0, 0, 0, 0 } }, - // Ronkan Renew - { 17004, { 0, 0, 0, 0, 0, 0 } }, - // Play - { 17055, { 0, 0, 0, 0, 0, 0 } }, - // Gunmetal Soul - { 17105, { 0, 0, 0, 0, 0, 0 } }, - // Crimson Lotus - { 17106, { 0, 0, 0, 0, 0, 0 } }, - // Acidic Bite - { 17122, { 300, 0, 0, 0, 0, 0 } }, - // Heavy Shot - { 17123, { 550, 0, 0, 0, 0, 0 } }, - // Radiant Arrow - { 17124, { 1100, 0, 0, 0, 0, 0 } }, - // Dulling Arrow - { 17125, { 0, 0, 0, 0, 0, 0 } }, - // Aspected Benefic - { 17151, { 0, 0, 0, 0, 0, 200 } }, - // Aspected Helios - { 17152, { 0, 0, 0, 0, 0, 100 } }, - // Hypercharge - { 17209, { 0, 0, 0, 0, 0, 0 } }, - // Summon Eos - { 17215, { 0, 0, 0, 0, 0, 0 } }, - // Summon Selene - { 17216, { 0, 0, 0, 0, 0, 0 } }, - // attack - { 17222, { 0, 0, 0, 0, 0, 0 } }, - // Chivalrous Spirit - { 17236, { 0, 0, 0, 0, 0, 1200 } }, - // Souldeep Invisibility - { 17291, { 0, 0, 0, 0, 0, 0 } }, - // Spinning Edge - { 17413, { 0, 0, 0, 0, 0, 0 } }, - // Gust Slash - { 17414, { 0, 0, 0, 0, 0, 0 } }, - // Aeolian Edge - { 17415, { 0, 0, 0, 0, 0, 0 } }, - // Shadow Fang - { 17416, { 0, 0, 0, 0, 0, 0 } }, - // Armor Crush - { 17417, { 0, 0, 0, 0, 0, 0 } }, - // Throwing Dagger - { 17418, { 0, 0, 0, 0, 0, 0 } }, - // Death Blossom - { 17419, { 0, 0, 0, 0, 0, 0 } }, - // Hakke Mujinsatsu - { 17420, { 0, 0, 0, 0, 0, 0 } }, - // Hunter's Prudence - { 17596, { 0, 0, 0, 0, 0, 1000 } }, - // Nebula - { 17839, { 0, 0, 0, 0, 0, 0 } }, - // Bio - { 17864, { 0, 0, 0, 0, 0, 0 } }, - // Bio II - { 17865, { 0, 0, 0, 0, 0, 0 } }, - // Ruin - { 17869, { 160, 0, 0, 0, 0, 0 } }, + { 167, { 150, 0, 0, 0, 0, 0, 5 } }, + // Miasma + { 168, { 20, 0, 0, 0, 0, 0, 0 } }, + // Summon II + { 170, { 0, 0, 0, 0, 0, 0, 0 } }, // Ruin II - { 17870, { 0, 0, 0, 0, 0, 0 } }, + { 172, { 160, 0, 0, 0, 0, 0, 0 } }, + // Resurrection + { 173, { 0, 0, 0, 0, 0, 0, 0 } }, + // Bane + { 174, { 0, 0, 0, 0, 0, 0, 0 } }, + // Bio II + { 178, { 0, 0, 0, 0, 0, 0, 0 } }, + // Summon III + { 180, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fester + { 181, { 100, 0, 0, 0, 0, 0, 0 } }, + // Enkindle + { 184, { 0, 0, 0, 0, 0, 0, 0 } }, + // Adloquium + { 185, { 0, 0, 0, 0, 0, 300, 0 } }, + // Succor + { 186, { 0, 0, 0, 0, 0, 180, 0 } }, + // Sacred Soil + { 188, { 0, 0, 0, 0, 0, 100, 0 } }, + // Lustrate + { 189, { 0, 0, 0, 0, 0, 600, 0 } }, + // Physick + { 190, { 0, 0, 0, 0, 0, 400, 0 } }, + // Shield Wall + { 197, { 0, 0, 0, 0, 0, 0, 0 } }, + // Stronghold + { 198, { 0, 0, 0, 0, 0, 0, 0 } }, + // Last Bastion + { 199, { 0, 0, 0, 0, 0, 0, 0 } }, + // Braver + { 200, { 2400, 0, 0, 0, 0, 0, 0 } }, + // Bladedance + { 201, { 5250, 0, 0, 0, 0, 0, 0 } }, + // Final Heaven + { 202, { 9000, 0, 0, 0, 0, 0, 0 } }, + // Skyshard + { 203, { 1650, 0, 0, 0, 0, 0, 0 } }, + // Starstorm + { 204, { 3600, 0, 0, 0, 0, 0, 0 } }, + // Meteor + { 205, { 6150, 0, 0, 0, 0, 0, 0 } }, + // Healing Wind + { 206, { 0, 0, 0, 0, 0, 0, 0 } }, + // Breath of the Earth + { 207, { 0, 0, 0, 0, 0, 0, 0 } }, + // Pulse of Life + { 208, { 0, 0, 0, 0, 0, 0, 0 } }, + // Magitek Cannon + { 1128, { 0, 0, 0, 0, 0, 0, 0 } }, + // Photon Stream + { 1129, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 1533, { 0, 0, 0, 0, 0, 0, 0 } }, + // Spinning Edge + { 2240, { 220, 0, 0, 0, 0, 0, 0 } }, + // Shade Shift + { 2241, { 0, 0, 0, 0, 0, 0, 0 } }, + // Gust Slash + { 2242, { 100, 330, 0, 0, 0, 0, 0 } }, + // Hide + { 2245, { 0, 0, 0, 0, 0, 0, 0 } }, + // Assassinate + { 2246, { 200, 0, 0, 0, 0, 0, 0 } }, + // Throwing Dagger + { 2247, { 120, 0, 0, 0, 0, 0, 0 } }, + // Mug + { 2248, { 150, 0, 0, 0, 0, 0, 0 } }, + // Death Blossom + { 2254, { 120, 0, 0, 0, 0, 0, 0 } }, + // Aeolian Edge + { 2255, { 100, 420, 0, 0, 160, 0, 0 } }, + // Shadow Fang + { 2257, { 200, 0, 0, 0, 0, 0, 0 } }, + // Trick Attack + { 2258, { 350, 0, 0, 0, 500, 0, 0 } }, + // Ten + { 2259, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ninjutsu + { 2260, { 0, 0, 0, 0, 0, 0, 0 } }, + // Chi + { 2261, { 0, 0, 0, 0, 0, 0, 0 } }, + // Shukuchi + { 2262, { 0, 0, 0, 0, 0, 0, 0 } }, + // Jin + { 2263, { 0, 0, 0, 0, 0, 0, 0 } }, + // Kassatsu + { 2264, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fuma Shuriken + { 2265, { 500, 0, 0, 0, 0, 0, 0 } }, + // Katon + { 2266, { 500, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 2267, { 800, 0, 0, 0, 0, 0, 0 } }, + // Hyoton + { 2268, { 400, 0, 0, 0, 0, 0, 0 } }, + // Huton + { 2269, { 0, 0, 0, 0, 0, 0, 0 } }, + // Doton + { 2270, { 100, 0, 0, 0, 0, 0, 0 } }, + // Suiton + { 2271, { 600, 0, 0, 0, 0, 0, 0 } }, + // Rabbit Medium + { 2272, { 0, 0, 0, 0, 0, 0, 0 } }, + // Rook Autoturret + { 2864, { 80, 0, 0, 0, 0, 0, 0 } }, + // Split Shot + { 2866, { 180, 0, 0, 0, 0, 0, 0 } }, + // Slug Shot + { 2868, { 100, 260, 0, 0, 0, 0, 0 } }, + // Spread Shot + { 2870, { 180, 0, 0, 0, 0, 0, 0 } }, + // Hot Shot + { 2872, { 300, 0, 0, 0, 0, 0, 0 } }, + // Clean Shot + { 2873, { 100, 340, 0, 0, 0, 0, 0 } }, + // Gauss Round + { 2874, { 150, 0, 0, 0, 0, 0, 0 } }, + // Reassemble + { 2876, { 0, 0, 0, 0, 0, 0, 0 } }, + // Wildfire + { 2878, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ricochet + { 2890, { 150, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 3203, { 0, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 3204, { 0, 0, 0, 0, 0, 0, 0 } }, + // Kanashibari + { 3207, { 0, 0, 0, 0, 0, 0, 0 } }, + // Goring Blade + { 3538, { 100, 390, 0, 0, 0, 0, 0 } }, + // Royal Authority + { 3539, { 100, 550, 0, 0, 0, 0, 0 } }, + // Divine Veil + { 3540, { 0, 0, 0, 0, 0, 0, 0 } }, + // Clemency + { 3541, { 0, 0, 0, 0, 0, 1200, 0 } }, + // Sheltron + { 3542, { 0, 0, 0, 0, 0, 0, 0 } }, + // Tornado Kick + { 3543, { 430, 0, 0, 0, 0, 0, 0 } }, + // Elixir Field + { 3545, { 200, 0, 0, 0, 0, 0, 0 } }, + // Meditation + { 3546, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Forbidden Chakra + { 3547, { 370, 0, 0, 0, 0, 0, 0 } }, + // Fell Cleave + { 3549, { 590, 0, 0, 0, 0, 0, 0 } }, + // Decimate + { 3550, { 250, 0, 0, 0, 0, 0, 0 } }, + // Raw Intuition + { 3551, { 0, 0, 0, 0, 0, 0, 0 } }, + // Equilibrium + { 3552, { 0, 0, 0, 0, 0, 1200, 0 } }, + // Blood of the Dragon + { 3553, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fang and Claw + { 3554, { 320, 0, 360, 0, 0, 0, 0 } }, + // Geirskogul + { 3555, { 300, 0, 0, 0, 0, 0, 0 } }, + // Wheeling Thrust + { 3556, { 320, 0, 0, 0, 360, 0, 0 } }, + // Battle Litany + { 3557, { 0, 0, 0, 0, 0, 0, 0 } }, + // Empyreal Arrow + { 3558, { 230, 0, 0, 0, 0, 0, 0 } }, + // the Wanderer's Minuet + { 3559, { 100, 0, 0, 0, 0, 0, 0 } }, + // Iron Jaws + { 3560, { 100, 0, 0, 0, 0, 0, 0 } }, + // the Warden's Paean + { 3561, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sidewinder + { 3562, { 100, 0, 0, 0, 0, 0, 0 } }, + // Armor Crush + { 3563, { 100, 400, 160, 0, 0, 0, 0 } }, + // Dream Within a Dream + { 3566, { 200, 0, 0, 0, 0, 0, 0 } }, + // Stone III + { 3568, { 240, 0, 0, 0, 0, 0, 0 } }, + // Asylum + { 3569, { 0, 0, 0, 0, 0, 100, 0 } }, + // Tetragrammaton + { 3570, { 0, 0, 0, 0, 0, 700, 0 } }, + // Assize + { 3571, { 400, 0, 0, 0, 0, 400, 5 } }, + // Ley Lines + { 3573, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sharpcast + { 3574, { 0, 0, 0, 0, 0, 0, 0 } }, + // Enochian + { 3575, { 0, 0, 0, 0, 0, 0, 0 } }, + // Blizzard IV + { 3576, { 300, 0, 0, 0, 0, 0, 0 } }, + // Fire IV + { 3577, { 300, 0, 0, 0, 0, 0, 0 } }, + // Painflare + { 3578, { 130, 0, 0, 0, 0, 0, 0 } }, + // Ruin III + { 3579, { 200, 0, 0, 0, 0, 0, 0 } }, + // Tri-disaster + { 3580, { 300, 0, 0, 0, 0, 0, 0 } }, + // Dreadwyrm Trance + { 3581, { 0, 0, 0, 0, 0, 0, 0 } }, + // Deathflare + { 3582, { 400, 0, 0, 0, 0, 0, 0 } }, + // Indomitability + { 3583, { 0, 0, 0, 0, 0, 400, 0 } }, + // Broil + { 3584, { 240, 0, 0, 0, 0, 0, 0 } }, + // Deployment Tactics + { 3585, { 0, 0, 0, 0, 0, 0, 0 } }, + // Emergency Tactics + { 3586, { 0, 0, 0, 0, 0, 0, 0 } }, + // Dissipation + { 3587, { 0, 0, 0, 0, 0, 0, 0 } }, + // Draw + { 3590, { 0, 0, 0, 0, 0, 0, 0 } }, + // Redraw + { 3593, { 0, 0, 0, 0, 0, 0, 0 } }, + // Benefic + { 3594, { 0, 0, 0, 0, 0, 400, 0 } }, + // Aspected Benefic + { 3595, { 0, 0, 0, 0, 0, 200, 0 } }, + // Malefic + { 3596, { 150, 0, 0, 0, 0, 0, 0 } }, + // Malefic II + { 3598, { 170, 0, 0, 0, 0, 0, 0 } }, + // Combust + { 3599, { 0, 0, 0, 0, 0, 0, 0 } }, + // Helios + { 3600, { 0, 0, 0, 0, 0, 330, 0 } }, + // Aspected Helios + { 3601, { 0, 0, 0, 0, 0, 200, 0 } }, + // Ascend + { 3603, { 0, 0, 0, 0, 0, 0, 0 } }, + // Diurnal Sect + { 3604, { 0, 0, 0, 0, 0, 0, 0 } }, + // Nocturnal Sect + { 3605, { 0, 0, 0, 0, 0, 0, 0 } }, + // Lightspeed + { 3606, { 0, 0, 0, 0, 0, 0, 0 } }, + // Combust II + { 3608, { 0, 0, 0, 0, 0, 0, 0 } }, + // Benefic II + { 3610, { 0, 0, 0, 0, 0, 700, 0 } }, + // Synastry + { 3612, { 0, 0, 0, 0, 0, 0, 0 } }, + // Collective Unconscious + { 3613, { 0, 0, 0, 0, 0, 100, 0 } }, + // Essential Dignity + { 3614, { 0, 0, 0, 0, 0, 400, 0 } }, + // Gravity + { 3615, { 140, 0, 0, 0, 0, 0, 0 } }, + // Hard Slash + { 3617, { 200, 0, 0, 0, 0, 0, 0 } }, + // Unleash + { 3621, { 150, 0, 0, 0, 0, 0, 0 } }, + // Syphon Strike + { 3623, { 100, 300, 0, 0, 0, 0, 6 } }, + // Unmend + { 3624, { 150, 0, 0, 0, 0, 0, 0 } }, + // Blood Weapon + { 3625, { 0, 0, 0, 0, 0, 0, 0 } }, + // Grit + { 3629, { 0, 0, 0, 0, 0, 0, 0 } }, + // Souleater + { 3632, { 100, 400, 0, 0, 0, 300, 0 } }, + // Dark Mind + { 3634, { 0, 0, 0, 0, 0, 0, 0 } }, + // Shadow Wall + { 3636, { 0, 0, 0, 0, 0, 0, 0 } }, + // Living Dead + { 3638, { 0, 0, 0, 0, 0, 0, 0 } }, + // Salted Earth + { 3639, { 60, 0, 0, 0, 0, 0, 0 } }, + // Plunge + { 3640, { 200, 0, 0, 0, 0, 0, 0 } }, + // Abyssal Drain + { 3641, { 200, 0, 0, 0, 0, 200, 0 } }, + // Carve and Spit + { 3643, { 450, 0, 0, 0, 0, 0, 6 } }, + // Big Shot + { 4238, { 0, 0, 0, 0, 0, 0, 0 } }, + // Desperado + { 4239, { 0, 0, 0, 0, 0, 0, 0 } }, + // Land Waker + { 4240, { 0, 0, 0, 0, 0, 0, 0 } }, + // Dark Force + { 4241, { 0, 0, 0, 0, 0, 0, 0 } }, + // Dragonsong Dive + { 4242, { 0, 0, 0, 0, 0, 0, 0 } }, + // Chimatsuri + { 4243, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sagittarius Arrow + { 4244, { 0, 0, 0, 0, 0, 0, 0 } }, + // Satellite Beam + { 4245, { 0, 0, 0, 0, 0, 0, 0 } }, + // Teraflare + { 4246, { 0, 0, 0, 0, 0, 0, 0 } }, + // Angel Feathers + { 4247, { 0, 0, 0, 0, 0, 0, 0 } }, + // Astral Stasis + { 4248, { 0, 0, 0, 0, 0, 0, 0 } }, + // Form Shift + { 4262, { 0, 0, 0, 0, 0, 0, 0 } }, + // Cannonfire + { 4271, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Balance + { 4401, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Arrow + { 4402, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Spear + { 4403, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Bole + { 4404, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Ewer + { 4405, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Spire + { 4406, { 0, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 4977, { 0, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 5069, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 5199, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 5846, { 0, 0, 0, 0, 0, 0, 0 } }, + // Stickyloom + { 5874, { 0, 0, 0, 0, 0, 0, 0 } }, + // Void Fire II + { 6274, { 0, 0, 0, 0, 0, 0, 0 } }, + // Total Eclipse + { 7381, { 120, 0, 0, 0, 0, 0, 0 } }, + // Intervention + { 7382, { 0, 0, 0, 0, 0, 0, 0 } }, + // Requiescat + { 7383, { 150, 0, 0, 0, 0, 0, 0 } }, + // Holy Spirit + { 7384, { 350, 0, 0, 0, 0, 0, 0 } }, + // Passage of Arms + { 7385, { 0, 0, 0, 0, 0, 0, 0 } }, + // Onslaught + { 7386, { 100, 0, 0, 0, 0, 0, 0 } }, + // Upheaval + { 7387, { 450, 0, 0, 0, 0, 0, 0 } }, + // Shake It Off + { 7388, { 0, 0, 0, 0, 0, 0, 0 } }, + // Inner Release + { 7389, { 0, 0, 0, 0, 0, 0, 0 } }, + // Delirium + { 7390, { 0, 0, 0, 0, 0, 0, 0 } }, + // Quietus + { 7391, { 210, 0, 0, 0, 0, 0, 6 } }, + // Bloodspiller + { 7392, { 600, 0, 0, 0, 0, 0, 0 } }, + // The Blackest Night + { 7393, { 0, 0, 0, 0, 0, 0, 0 } }, + // Riddle of Earth + { 7394, { 0, 0, 0, 0, 0, 0, 0 } }, + // Riddle of Fire + { 7395, { 0, 0, 0, 0, 0, 0, 0 } }, + // Brotherhood + { 7396, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sonic Thrust + { 7397, { 100, 200, 0, 0, 0, 0, 0 } }, + // Dragon Sight + { 7398, { 0, 0, 0, 0, 0, 0, 0 } }, + // Mirage Dive + { 7399, { 300, 0, 0, 0, 0, 0, 0 } }, + // Nastrond + { 7400, { 400, 0, 0, 0, 0, 0, 0 } }, + // Hellfrog Medium + { 7401, { 200, 0, 0, 0, 0, 0, 0 } }, + // Bhavacakra + { 7402, { 300, 0, 0, 0, 0, 0, 0 } }, + // Ten Chi Jin + { 7403, { 0, 0, 0, 0, 0, 0, 0 } }, + // Pitch Perfect + { 7404, { 100, 0, 0, 0, 0, 0, 0 } }, + // Troubadour + { 7405, { 0, 0, 0, 0, 0, 0, 0 } }, + // Caustic Bite + { 7406, { 150, 0, 0, 0, 0, 0, 0 } }, + // Stormbite + { 7407, { 100, 0, 0, 0, 0, 0, 0 } }, + // Nature's Minne + { 7408, { 0, 0, 0, 0, 0, 0, 0 } }, + // Refulgent Arrow + { 7409, { 330, 0, 0, 0, 0, 0, 0 } }, + // Heat Blast + { 7410, { 220, 0, 0, 0, 0, 0, 0 } }, + // Heated Split Shot + { 7411, { 220, 0, 0, 0, 0, 0, 0 } }, + // Heated Slug Shot + { 7412, { 100, 330, 0, 0, 0, 0, 0 } }, + // Heated Clean Shot + { 7413, { 100, 440, 0, 0, 0, 0, 0 } }, + // Barrel Stabilizer + { 7414, { 0, 0, 0, 0, 0, 0, 0 } }, + // Rook Overdrive + { 7415, { 0, 0, 0, 0, 0, 0, 0 } }, + // Flamethrower + { 7418, { 0, 0, 0, 0, 0, 0, 0 } }, + // Between the Lines + { 7419, { 0, 0, 0, 0, 0, 0, 0 } }, + // Thunder IV + { 7420, { 50, 0, 0, 0, 0, 0, 0 } }, + // Triplecast + { 7421, { 0, 0, 0, 0, 0, 0, 0 } }, + // Foul + { 7422, { 650, 0, 0, 0, 0, 0, 0 } }, + // Aetherpact + { 7423, { 0, 0, 0, 0, 0, 0, 0 } }, + // Bio III + { 7424, { 0, 0, 0, 0, 0, 0, 0 } }, + // Miasma III + { 7425, { 50, 0, 0, 0, 0, 0, 0 } }, + // Ruin IV + { 7426, { 300, 0, 0, 0, 0, 0, 0 } }, + // Summon Bahamut + { 7427, { 0, 0, 0, 0, 0, 0, 0 } }, + // Enkindle Bahamut + { 7429, { 650, 0, 0, 0, 0, 0, 0 } }, + // Thin Air + { 7430, { 0, 0, 0, 0, 0, 0, 0 } }, + // Stone IV + { 7431, { 280, 0, 0, 0, 0, 0, 0 } }, + // Divine Benison + { 7432, { 0, 0, 0, 0, 0, 0, 0 } }, + // Plenary Indulgence + { 7433, { 0, 0, 0, 0, 0, 200, 0 } }, + // Excogitation + { 7434, { 0, 0, 0, 0, 0, 800, 0 } }, + // Broil II + { 7435, { 260, 0, 0, 0, 0, 0, 0 } }, + // Chain Stratagem + { 7436, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aetherpact + { 7437, { 0, 0, 0, 0, 0, 0, 0 } }, + // Earthly Star + { 7439, { 100, 0, 0, 0, 0, 540, 0 } }, + // Malefic III + { 7442, { 210, 0, 0, 0, 0, 0, 0 } }, + // Minor Arcana + { 7443, { 0, 0, 0, 0, 0, 0, 0 } }, + // Lord of Crowns + { 7444, { 0, 0, 0, 0, 0, 0, 0 } }, + // Lady of Crowns + { 7445, { 0, 0, 0, 0, 0, 0, 0 } }, + // Thunder II + { 7447, { 30, 0, 0, 0, 0, 0, 0 } }, + // Sleeve Draw + { 7448, { 0, 0, 0, 0, 0, 0, 0 } }, + // Hakaze + { 7477, { 200, 0, 0, 0, 0, 0, 0 } }, + // Jinpu + { 7478, { 100, 320, 0, 0, 0, 0, 0 } }, + // Shifu + { 7479, { 100, 320, 0, 0, 0, 0, 0 } }, + // Yukikaze + { 7480, { 100, 360, 0, 0, 0, 0, 0 } }, + // Gekko + { 7481, { 100, 480, 0, 0, 0, 0, 0 } }, + // Kasha + { 7482, { 100, 480, 0, 0, 0, 0, 0 } }, + // Fuga + { 7483, { 100, 0, 0, 0, 0, 0, 0 } }, + // Mangetsu + { 7484, { 100, 160, 0, 0, 0, 0, 0 } }, + // Oka + { 7485, { 100, 160, 0, 0, 0, 0, 0 } }, + // Enpi + { 7486, { 100, 0, 0, 0, 0, 0, 0 } }, + // Midare Setsugekka + { 7487, { 800, 0, 0, 0, 0, 0, 0 } }, + // Tenka Goken + { 7488, { 360, 0, 0, 0, 0, 0, 0 } }, + // Higanbana + { 7489, { 250, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Shinten + { 7490, { 320, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Kyuten + { 7491, { 150, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Gyoten + { 7492, { 100, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Yaten + { 7493, { 100, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Kaiten + { 7494, { 0, 0, 0, 0, 0, 0, 0 } }, + // Hagakure + { 7495, { 0, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Guren + { 7496, { 850, 0, 0, 0, 0, 0, 0 } }, + // Meditate + { 7497, { 0, 0, 0, 0, 0, 0, 0 } }, + // Third Eye + { 7498, { 0, 0, 0, 0, 0, 0, 0 } }, + // Meikyo Shisui + { 7499, { 0, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Seigan + { 7501, { 220, 0, 0, 0, 0, 0, 0 } }, + // Merciful Eyes + { 7502, { 0, 0, 0, 0, 0, 200, 0 } }, + // Jolt + { 7503, { 180, 0, 0, 0, 0, 0, 0 } }, + // Riposte + { 7504, { 130, 0, 0, 0, 0, 0, 0 } }, + // Verthunder + { 7505, { 0, 0, 0, 0, 0, 0, 0 } }, + // Corps-a-corps + { 7506, { 130, 0, 0, 0, 0, 0, 0 } }, + // Veraero + { 7507, { 0, 0, 0, 0, 0, 0, 0 } }, + // Scatter + { 7509, { 120, 0, 0, 0, 0, 0, 0 } }, + // Verfire + { 7510, { 0, 0, 0, 0, 0, 0, 0 } }, + // Verstone + { 7511, { 0, 0, 0, 0, 0, 0, 0 } }, + // Zwerchhau + { 7512, { 100, 150, 0, 0, 0, 0, 0 } }, + // Moulinet + { 7513, { 60, 0, 0, 0, 0, 0, 0 } }, + // Vercure + { 7514, { 0, 0, 0, 0, 0, 350, 0 } }, + // Displacement + { 7515, { 0, 0, 0, 0, 0, 0, 0 } }, + // Redoublement + { 7516, { 100, 230, 0, 0, 0, 0, 0 } }, + // Fleche + { 7517, { 420, 0, 0, 0, 0, 0, 0 } }, + // Acceleration + { 7518, { 0, 0, 0, 0, 0, 0, 0 } }, + // Contre Sixte + { 7519, { 380, 0, 0, 0, 0, 0, 0 } }, + // Embolden + { 7520, { 0, 0, 0, 0, 0, 0, 0 } }, + // Manafication + { 7521, { 0, 0, 0, 0, 0, 0, 0 } }, + // Verraise + { 7523, { 0, 0, 0, 0, 0, 0, 0 } }, + // Jolt II + { 7524, { 280, 0, 0, 0, 0, 0, 0 } }, + // Verflare + { 7525, { 600, 0, 0, 0, 0, 0, 0 } }, + // Verholy + { 7526, { 600, 0, 0, 0, 0, 0, 0 } }, + // Enchanted Riposte + { 7527, { 210, 0, 0, 0, 0, 0, 0 } }, + // Enchanted Zwerchhau + { 7528, { 100, 290, 0, 0, 0, 0, 0 } }, + // Enchanted Redoublement + { 7529, { 100, 470, 0, 0, 0, 0, 0 } }, + // Enchanted Moulinet + { 7530, { 200, 0, 0, 0, 0, 0, 0 } }, + // Magitek Cannon + { 7619, { 0, 0, 0, 0, 0, 0, 0 } }, + // Photon Stream + { 7620, { 0, 0, 0, 0, 0, 0, 0 } }, + // Diffractive Magitek Cannon + { 7621, { 0, 0, 0, 0, 0, 0, 0 } }, + // High-powered Magitek Cannon + { 7622, { 0, 0, 0, 0, 0, 0, 0 } }, + // Doom of the Living + { 7861, { 0, 0, 0, 0, 0, 0, 0 } }, + // Vermilion Scourge + { 7862, { 0, 0, 0, 0, 0, 0, 0 } }, + // Iaijutsu + { 7867, { 0, 0, 0, 0, 0, 0, 0 } }, + // Dissolve Union + { 7869, { 0, 0, 0, 0, 0, 0, 0 } }, + // Stellar Detonation + { 8324, { 100, 0, 0, 0, 0, 540, 0 } }, + // Broken Ridge + { 8395, { 0, 0, 0, 0, 0, 0, 0 } }, + // Magitek Pulse + { 8624, { 0, 0, 0, 0, 0, 0, 0 } }, + // Magitek Thunder + { 8625, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 8687, { 0, 0, 0, 0, 0, 0, 0 } }, + // Katon + { 9012, { 0, 0, 0, 0, 0, 0, 0 } }, + // Remove Barrel + { 9015, { 0, 0, 0, 0, 0, 0, 0 } }, + // Tenka Goken + { 9143, { 0, 0, 0, 0, 0, 0, 0 } }, + // Thunderous Force + { 9294, { 0, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 9301, { 0, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 9302, { 0, 0, 0, 0, 0, 0, 0 } }, + // Bishop Overdrive + { 9372, { 0, 0, 0, 0, 0, 0, 0 } }, + // Undraw + { 9629, { 0, 0, 0, 0, 0, 0, 0 } }, + // Self-detonate + { 9775, { 0, 0, 0, 0, 0, 0, 0 } }, + // Shatterstone + { 9823, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 9996, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ungarmax + { 10001, { 0, 0, 0, 0, 0, 0, 0 } }, + // Starstorm + { 10894, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 10946, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 10947, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ruin III + { 11191, { 200, 0, 0, 0, 0, 0, 0 } }, + // Physick + { 11192, { 0, 0, 0, 0, 0, 400, 0 } }, + // Starstorm + { 11193, { 3600, 0, 0, 0, 0, 0, 0 } }, + // Snort + { 11383, { 0, 0, 0, 0, 0, 0, 0 } }, + // 4-tonze Weight + { 11384, { 200, 0, 0, 0, 0, 0, 0 } }, + // Water Cannon + { 11385, { 200, 0, 0, 0, 0, 0, 0 } }, + // Song of Torment + { 11386, { 50, 0, 0, 0, 0, 0, 0 } }, + // High Voltage + { 11387, { 180, 0, 0, 0, 0, 0, 0 } }, + // Bad Breath + { 11388, { 0, 0, 0, 0, 0, 0, 0 } }, + // Flying Frenzy + { 11389, { 150, 0, 0, 0, 0, 0, 0 } }, + // Aqua Breath + { 11390, { 140, 0, 0, 0, 0, 0, 0 } }, + // Plaincracker + { 11391, { 220, 0, 0, 0, 0, 0, 0 } }, + // Acorn Bomb + { 11392, { 0, 0, 0, 0, 0, 0, 0 } }, + // Bristle + { 11393, { 0, 0, 0, 0, 0, 0, 0 } }, + // Mind Blast + { 11394, { 200, 0, 0, 0, 0, 0, 0 } }, + // Blood Drain + { 11395, { 50, 0, 0, 0, 0, 0, 0 } }, + // Bomb Toss + { 11396, { 200, 0, 0, 0, 0, 0, 0 } }, + // 1000 Needles + { 11397, { 0, 0, 0, 0, 0, 0, 0 } }, + // Drill Cannons + { 11398, { 200, 0, 0, 0, 0, 0, 0 } }, + // the Look + { 11399, { 220, 0, 0, 0, 0, 0, 0 } }, + // Sharpened Knife + { 11400, { 220, 0, 0, 0, 0, 0, 0 } }, + // Loom + { 11401, { 0, 0, 0, 0, 0, 0, 0 } }, + // Flame Thrower + { 11402, { 220, 0, 0, 0, 0, 0, 0 } }, + // Faze + { 11403, { 0, 0, 0, 0, 0, 0, 0 } }, + // Glower + { 11404, { 220, 0, 0, 0, 0, 0, 0 } }, + // Missile + { 11405, { 0, 0, 0, 0, 0, 0, 0 } }, + // White Wind + { 11406, { 0, 0, 0, 0, 0, 0, 0 } }, + // Final Sting + { 11407, { 2000, 0, 0, 0, 0, 0, 0 } }, + // Self-destruct + { 11408, { 1500, 0, 0, 0, 0, 0, 0 } }, + // Transfusion + { 11409, { 0, 0, 0, 0, 0, 0, 0 } }, + // Toad Oil + { 11410, { 0, 0, 0, 0, 0, 0, 0 } }, + // Off-guard + { 11411, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sticky Tongue + { 11412, { 0, 0, 0, 0, 0, 0, 0 } }, + // Tail Screw + { 11413, { 0, 0, 0, 0, 0, 0, 0 } }, + // Level 5 Petrify + { 11414, { 0, 0, 0, 0, 0, 0, 0 } }, + // Moon Flute + { 11415, { 0, 0, 0, 0, 0, 0, 0 } }, + // Doom + { 11416, { 0, 0, 0, 0, 0, 0, 0 } }, + // Mighty Guard + { 11417, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ice Spikes + { 11418, { 0, 0, 0, 0, 0, 0, 0 } }, + // the Ram's Voice + { 11419, { 220, 0, 0, 0, 0, 0, 0 } }, + // the Dragon's Voice + { 11420, { 200, 0, 0, 0, 0, 0, 0 } }, + // Peculiar Light + { 11421, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ink Jet + { 11422, { 200, 0, 0, 0, 0, 0, 0 } }, + // Flying Sardine + { 11423, { 10, 0, 0, 0, 0, 0, 0 } }, + // Diamondback + { 11424, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fire Angon + { 11425, { 200, 0, 0, 0, 0, 0, 0 } }, + // Feather Rain + { 11426, { 220, 0, 0, 0, 0, 0, 0 } }, + // Eruption + { 11427, { 300, 0, 0, 0, 0, 0, 0 } }, + // Mountain Buster + { 11428, { 400, 0, 0, 0, 0, 0, 0 } }, + // Shock Strike + { 11429, { 400, 0, 0, 0, 0, 0, 0 } }, + // Glass Dance + { 11430, { 350, 0, 0, 0, 0, 0, 0 } }, + // Veil of the Whorl + { 11431, { 0, 0, 0, 0, 0, 0, 0 } }, + // Tri-shackle + { 11482, { 30, 0, 0, 0, 0, 0, 0 } }, + // attack + { 11784, { 0, 0, 0, 0, 0, 0, 0 } }, + // Stone IV of the Seventh Dawn + { 13423, { 140, 0, 0, 0, 0, 0, 0 } }, + // Aero II of the Seventh Dawn + { 13424, { 50, 0, 0, 0, 0, 0, 0 } }, + // Cure II of the Seventh Dawn + { 13425, { 0, 0, 0, 0, 0, 700, 0 } }, + // Aetherwell + { 13426, { 0, 0, 0, 0, 0, 0, 0 } }, + // Thunderous Force + { 14587, { 0, 0, 0, 0, 0, 0, 0 } }, + // Kyokufu + { 14840, { 180, 0, 0, 0, 0, 0, 0 } }, + // Ajisai + { 14841, { 100, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Gyoten + { 14842, { 100, 0, 0, 0, 0, 0, 0 } }, + // 冥界恐叫打 + { 14843, { 0, 0, 0, 0, 0, 0, 0 } }, + // Second Wind + { 15375, { 0, 0, 0, 0, 0, 500, 0 } }, + // Interject + { 15537, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fight or Flight + { 15870, { 0, 0, 0, 0, 0, 0, 0 } }, + // Cascade + { 15989, { 250, 0, 0, 0, 0, 0, 0 } }, + // Fountain + { 15990, { 100, 300, 0, 0, 0, 0, 0 } }, + // Reverse Cascade + { 15991, { 300, 0, 0, 0, 0, 0, 0 } }, + // Fountainfall + { 15992, { 350, 0, 0, 0, 0, 0, 0 } }, + // Windmill + { 15993, { 150, 0, 0, 0, 0, 0, 0 } }, + // Bladeshower + { 15994, { 100, 200, 0, 0, 0, 0, 0 } }, + // Rising Windmill + { 15995, { 300, 0, 0, 0, 0, 0, 0 } }, + // Bloodshower + { 15996, { 350, 0, 0, 0, 0, 0, 0 } }, + // Standard Step + { 15997, { 0, 0, 0, 0, 0, 0, 0 } }, + // Technical Step + { 15998, { 0, 0, 0, 0, 0, 0, 0 } }, + // Emboite + { 15999, { 0, 0, 0, 0, 0, 0, 0 } }, + // Entrechat + { 16000, { 0, 0, 0, 0, 0, 0, 0 } }, + // Jete + { 16001, { 0, 0, 0, 0, 0, 0, 0 } }, + // Pirouette + { 16002, { 0, 0, 0, 0, 0, 0, 0 } }, + // Standard Finish + { 16003, { 0, 0, 0, 0, 0, 0, 0 } }, + // Technical Finish + { 16004, { 0, 0, 0, 0, 0, 0, 0 } }, + // Saber Dance + { 16005, { 600, 0, 0, 0, 0, 0, 0 } }, + // Closed Position + { 16006, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fan Dance + { 16007, { 150, 0, 0, 0, 0, 0, 0 } }, + // Fan Dance II + { 16008, { 100, 0, 0, 0, 0, 0, 0 } }, + // Fan Dance III + { 16009, { 200, 0, 0, 0, 0, 0, 0 } }, + // En Avant + { 16010, { 0, 0, 0, 0, 0, 0, 0 } }, + // Devilment + { 16011, { 0, 0, 0, 0, 0, 0, 0 } }, + // Shield Samba + { 16012, { 0, 0, 0, 0, 0, 0, 0 } }, + // Flourish + { 16013, { 0, 0, 0, 0, 0, 0, 0 } }, + // Improvisation + { 16014, { 0, 0, 0, 0, 0, 0, 0 } }, + // Curing Waltz + { 16015, { 0, 0, 0, 0, 0, 300, 0 } }, + // Keen Edge + { 16137, { 200, 0, 0, 0, 0, 0, 0 } }, + // No Mercy + { 16138, { 0, 0, 0, 0, 0, 0, 0 } }, + // Brutal Shell + { 16139, { 100, 300, 0, 0, 0, 150, 0 } }, + // Camouflage + { 16140, { 0, 0, 0, 0, 0, 0, 0 } }, + // Demon Slice + { 16141, { 150, 0, 0, 0, 0, 0, 0 } }, + // Royal Guard + { 16142, { 0, 0, 0, 0, 0, 0, 0 } }, + // Lightning Shot + { 16143, { 150, 0, 0, 0, 0, 0, 0 } }, + // Danger Zone + { 16144, { 350, 0, 0, 0, 0, 0, 0 } }, + // Solid Barrel + { 16145, { 100, 400, 0, 0, 0, 0, 0 } }, + // Gnashing Fang + { 16146, { 450, 0, 0, 0, 0, 0, 0 } }, + // Savage Claw + { 16147, { 550, 0, 0, 0, 0, 0, 0 } }, + // Nebula + { 16148, { 0, 0, 0, 0, 0, 0, 0 } }, + // Demon Slaughter + { 16149, { 100, 250, 0, 0, 0, 0, 0 } }, + // Wicked Talon + { 16150, { 650, 0, 0, 0, 0, 0, 0 } }, + // Aurora + { 16151, { 0, 0, 0, 0, 0, 200, 0 } }, + // Superbolide + { 16152, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sonic Break + { 16153, { 300, 0, 0, 0, 0, 0, 0 } }, + // Rough Divide + { 16154, { 200, 0, 0, 0, 0, 0, 0 } }, + // Continuation + { 16155, { 0, 0, 0, 0, 0, 0, 0 } }, + // Jugular Rip + { 16156, { 260, 0, 0, 0, 0, 0, 0 } }, + // Abdomen Tear + { 16157, { 280, 0, 0, 0, 0, 0, 0 } }, + // Eye Gouge + { 16158, { 300, 0, 0, 0, 0, 0, 0 } }, + // Bow Shock + { 16159, { 200, 0, 0, 0, 0, 0, 0 } }, + // Heart of Light + { 16160, { 0, 0, 0, 0, 0, 0, 0 } }, + // Heart of Stone + { 16161, { 0, 0, 0, 0, 0, 0, 0 } }, + // Burst Strike + { 16162, { 500, 0, 0, 0, 0, 0, 0 } }, + // Fated Circle + { 16163, { 320, 0, 0, 0, 0, 0, 0 } }, + // Bloodfest + { 16164, { 0, 0, 0, 0, 0, 0, 0 } }, + // Blasting Zone + { 16165, { 800, 0, 0, 0, 0, 0, 0 } }, + // Single Standard Finish + { 16191, { 0, 0, 0, 0, 0, 0, 0 } }, + // Double Standard Finish + { 16192, { 0, 0, 0, 0, 0, 0, 0 } }, + // Single Technical Finish + { 16193, { 0, 0, 0, 0, 0, 0, 0 } }, + // Double Technical Finish + { 16194, { 0, 0, 0, 0, 0, 0, 0 } }, + // Triple Technical Finish + { 16195, { 0, 0, 0, 0, 0, 0, 0 } }, + // Quadruple Technical Finish + { 16196, { 0, 0, 0, 0, 0, 0, 0 } }, + // Physick + { 16230, { 0, 0, 0, 0, 0, 400, 0 } }, + // Rightful Sword + { 16269, { 0, 0, 0, 0, 0, 0, 0 } }, + // Brutal Shell + { 16418, { 0, 0, 0, 0, 0, 0, 0 } }, + // Keen Edge + { 16434, { 0, 0, 0, 0, 0, 0, 0 } }, + // Solid Barrel + { 16435, { 0, 0, 0, 0, 0, 0, 0 } }, + // Soothing Potion + { 16436, { 0, 0, 0, 0, 0, 0, 0 } }, + // Shining Blade + { 16437, { 0, 0, 0, 0, 0, 0, 0 } }, + // Perfect Deception + { 16438, { 0, 0, 0, 0, 0, 0, 0 } }, + // Leap of Faith + { 16439, { 0, 0, 0, 0, 0, 0, 0 } }, + // Prominence + { 16457, { 100, 220, 0, 0, 0, 0, 5 } }, + // Holy Circle + { 16458, { 250, 0, 0, 0, 0, 0, 0 } }, + // Confiteor + { 16459, { 800, 0, 0, 0, 0, 0, 0 } }, + // Atonement + { 16460, { 550, 0, 0, 0, 0, 0, 0 } }, + // Intervene + { 16461, { 200, 0, 0, 0, 0, 0, 0 } }, + // Mythril Tempest + { 16462, { 100, 200, 0, 0, 0, 0, 0 } }, + // Chaotic Cyclone + { 16463, { 400, 0, 0, 0, 0, 0, 0 } }, + // Nascent Flash + { 16464, { 0, 0, 0, 0, 0, 0, 0 } }, + // Inner Chaos + { 16465, { 920, 0, 0, 0, 0, 0, 0 } }, + // Flood of Darkness + { 16466, { 250, 0, 0, 0, 0, 0, 0 } }, + // Edge of Darkness + { 16467, { 350, 0, 0, 0, 0, 0, 0 } }, + // Stalwart Soul + { 16468, { 100, 160, 0, 0, 0, 0, 6 } }, + // Flood of Shadow + { 16469, { 300, 0, 0, 0, 0, 0, 0 } }, + // Edge of Shadow + { 16470, { 500, 0, 0, 0, 0, 0, 0 } }, + // Dark Missionary + { 16471, { 0, 0, 0, 0, 0, 0, 0 } }, + // Living Shadow + { 16472, { 0, 0, 0, 0, 0, 0, 0 } }, + // Four-point Fury + { 16473, { 120, 0, 0, 0, 0, 0, 0 } }, + // Enlightenment + { 16474, { 220, 0, 0, 0, 0, 0, 0 } }, + // Anatman + { 16475, { 0, 0, 0, 0, 0, 0, 0 } }, + // Six-sided Star + { 16476, { 400, 0, 0, 0, 0, 0, 0 } }, + // Coerthan Torment + { 16477, { 100, 230, 0, 0, 0, 0, 0 } }, + // High Jump + { 16478, { 400, 0, 0, 0, 0, 0, 0 } }, + // Raiden Thrust + { 16479, { 330, 0, 0, 0, 0, 0, 0 } }, + // Stardiver + { 16480, { 600, 0, 0, 0, 0, 0, 0 } }, + // Hissatsu: Senei + { 16481, { 1100, 0, 0, 0, 0, 0, 0 } }, + // Ikishoten + { 16482, { 0, 0, 0, 0, 0, 0, 0 } }, + // Tsubame-gaeshi + { 16483, { 0, 0, 0, 0, 0, 0, 0 } }, + // Kaeshi: Higanbana + { 16484, { 375, 0, 0, 0, 0, 0, 0 } }, + // Kaeshi: Goken + { 16485, { 540, 0, 0, 0, 0, 0, 0 } }, + // Kaeshi: Setsugekka + { 16486, { 1200, 0, 0, 0, 0, 0, 0 } }, + // Shoha + { 16487, { 400, 0, 0, 0, 0, 0, 0 } }, + // Hakke Mujinsatsu + { 16488, { 100, 140, 0, 0, 0, 0, 0 } }, + // Meisui + { 16489, { 0, 0, 0, 0, 0, 0, 0 } }, + // Goka Mekkyaku + { 16491, { 750, 0, 0, 0, 0, 0, 0 } }, + // Hyosho Ranryu + { 16492, { 1200, 0, 0, 0, 0, 0, 0 } }, + // Bunshin + { 16493, { 0, 0, 0, 0, 0, 0, 0 } }, + // Shadowbite + { 16494, { 100, 0, 0, 0, 0, 0, 0 } }, + // Burst Shot + { 16495, { 230, 0, 0, 0, 0, 0, 0 } }, + // Apex Arrow + { 16496, { 120, 0, 0, 0, 0, 0, 0 } }, + // Auto Crossbow + { 16497, { 180, 0, 0, 0, 0, 0, 0 } }, + // Drill + { 16498, { 700, 0, 0, 0, 0, 0, 0 } }, + // Bioblaster + { 16499, { 60, 0, 0, 0, 0, 0, 0 } }, + // Air Anchor + { 16500, { 700, 0, 0, 0, 0, 0, 0 } }, + // Automaton Queen + { 16501, { 0, 0, 0, 0, 0, 0, 0 } }, + // Queen Overdrive + { 16502, { 0, 0, 0, 0, 0, 0, 0 } }, + // Despair + { 16505, { 380, 0, 0, 0, 0, 0, 0 } }, + // Umbral Soul + { 16506, { 0, 0, 0, 0, 0, 0, 0 } }, + // Xenoglossy + { 16507, { 750, 0, 0, 0, 0, 0, 0 } }, + // Energy Drain + { 16508, { 100, 0, 0, 0, 0, 0, 0 } }, + // Egi Assault + { 16509, { 0, 0, 0, 0, 0, 0, 0 } }, + // Energy Siphon + { 16510, { 40, 0, 0, 0, 0, 0, 0 } }, + // Outburst + { 16511, { 0, 0, 0, 0, 0, 0, 0 } }, + // Egi Assault II + { 16512, { 0, 0, 0, 0, 0, 0, 0 } }, + // Firebird Trance + { 16513, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fountain of Fire + { 16514, { 250, 0, 0, 0, 0, 0, 0 } }, + // Brand of Purgatory + { 16515, { 350, 0, 0, 0, 0, 0, 0 } }, + // Enkindle Phoenix + { 16516, { 650, 0, 0, 0, 0, 0, 0 } }, + // Verthunder II + { 16524, { 0, 0, 0, 0, 0, 0, 0 } }, + // Veraero II + { 16525, { 0, 0, 0, 0, 0, 0, 0 } }, + // Impact + { 16526, { 220, 0, 0, 0, 0, 0, 0 } }, + // Engagement + { 16527, { 150, 0, 0, 0, 0, 0, 0 } }, + // Enchanted Reprise + { 16528, { 300, 0, 0, 0, 0, 0, 0 } }, + // Reprise + { 16529, { 100, 0, 0, 0, 0, 0, 0 } }, + // Scorch + { 16530, { 700, 0, 0, 0, 0, 0, 0 } }, + // Afflatus Solace + { 16531, { 0, 0, 0, 0, 0, 700, 0 } }, + // Dia + { 16532, { 120, 0, 0, 0, 0, 0, 0 } }, + // Glare + { 16533, { 300, 0, 0, 0, 0, 0, 0 } }, + // Afflatus Rapture + { 16534, { 0, 0, 0, 0, 0, 300, 0 } }, + // Afflatus Misery + { 16535, { 900, 0, 0, 0, 0, 0, 0 } }, + // Temperance + { 16536, { 0, 0, 0, 0, 0, 0, 0 } }, + // Whispering Dawn + { 16537, { 0, 0, 0, 0, 0, 120, 0 } }, + // Fey Illumination + { 16538, { 0, 0, 0, 0, 0, 0, 0 } }, + // Art of War + { 16539, { 0, 0, 0, 0, 0, 0, 0 } }, + // Biolysis + { 16540, { 0, 0, 0, 0, 0, 0, 0 } }, + // Broil III + { 16541, { 280, 0, 0, 0, 0, 0, 0 } }, + // Recitation + { 16542, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fey Blessing + { 16543, { 0, 0, 0, 0, 0, 350, 0 } }, + // Summon Seraph + { 16545, { 0, 0, 0, 0, 0, 0, 0 } }, + // Consolation + { 16546, { 0, 0, 0, 0, 0, 300, 0 } }, + // Firebird Trance + { 16549, { 0, 0, 0, 0, 0, 0, 0 } }, + // Divination + { 16552, { 0, 0, 0, 0, 0, 0, 0 } }, + // Celestial Opposition + { 16553, { 0, 0, 0, 0, 0, 200, 0 } }, + // Combust III + { 16554, { 0, 0, 0, 0, 0, 0, 0 } }, + // Malefic IV + { 16555, { 250, 0, 0, 0, 0, 0, 0 } }, + // Celestial Intersection + { 16556, { 0, 0, 0, 0, 0, 200, 0 } }, + // Horoscope + { 16557, { 0, 0, 0, 0, 0, 200, 0 } }, + // Horoscope + { 16558, { 0, 0, 0, 0, 0, 0, 0 } }, + // Neutral Sect + { 16559, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ronkan Fire III + { 16574, { 430, 0, 0, 0, 0, 0, 0 } }, + // Ronkan Blizzard III + { 16575, { 240, 0, 0, 0, 0, 0, 0 } }, + // Ronkan Thunder III + { 16576, { 200, 0, 0, 0, 0, 0, 0 } }, + // Ronkan Flare + { 16577, { 460, 0, 0, 0, 0, 0, 0 } }, + // Falling Star + { 16578, { 1500, 0, 0, 0, 0, 0, 0 } }, + // Detonator + { 16766, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fast Blade + { 16788, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sunshadow + { 16789, { 0, 0, 0, 0, 0, 0, 0 } }, + // Assault I: Glittering Topaz + { 16791, { 0, 0, 0, 0, 0, 0, 0 } }, + // Assault II: Shining Topaz + { 16792, { 200, 0, 0, 0, 0, 0, 0 } }, + // Assault I: Downburst + { 16793, { 100, 0, 0, 0, 0, 0, 0 } }, + // Assault II: Glittering Emerald + { 16794, { 30, 0, 0, 0, 0, 0, 0 } }, + // Assault I: Earthen Armor + { 16795, { 0, 0, 0, 0, 0, 0, 0 } }, + // Assault II: Mountain Buster + { 16796, { 250, 0, 0, 0, 0, 0, 0 } }, + // Assault I: Aerial Slash + { 16797, { 150, 0, 0, 0, 0, 0, 0 } }, + // Assault II: Slipstream + { 16798, { 50, 0, 0, 0, 0, 0, 0 } }, + // Assault I: Crimson Cyclone + { 16799, { 250, 0, 0, 0, 0, 0, 0 } }, + // Assault II: Flaming Crush + { 16800, { 250, 0, 0, 0, 0, 0, 0 } }, + // Enkindle: Earthen Fury + { 16801, { 300, 0, 0, 0, 0, 0, 0 } }, + // Enkindle: Aerial Blast + { 16802, { 350, 0, 0, 0, 0, 0, 0 } }, + // Enkindle: Inferno + { 16803, { 300, 0, 0, 0, 0, 0, 0 } }, + // Rough Divide + { 16804, { 200, 0, 0, 0, 0, 0, 0 } }, + // Tactician + { 16889, { 0, 0, 0, 0, 0, 0, 0 } }, + // Swashbuckler + { 16984, { 0, 0, 0, 0, 0, 0, 0 } }, + // Greatest Eclipse + { 16985, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ronkan Cure II + { 17000, { 0, 0, 0, 0, 0, 1300, 0 } }, + // Ronkan Medica + { 17001, { 0, 0, 0, 0, 0, 500, 0 } }, + // Ronkan Esuna + { 17002, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ronkan Stone II + { 17003, { 200, 0, 0, 0, 0, 0, 0 } }, + // Ronkan Renew + { 17004, { 0, 0, 0, 0, 0, 0, 0 } }, + // Play + { 17055, { 0, 0, 0, 0, 0, 0, 0 } }, + // Gunmetal Soul + { 17105, { 0, 0, 0, 0, 0, 0, 0 } }, + // Crimson Lotus + { 17106, { 0, 0, 0, 0, 0, 0, 0 } }, + // Acidic Bite + { 17122, { 300, 0, 0, 0, 0, 0, 0 } }, + // Heavy Shot + { 17123, { 550, 0, 0, 0, 0, 0, 0 } }, + // Radiant Arrow + { 17124, { 1100, 0, 0, 0, 0, 0, 0 } }, + // Dulling Arrow + { 17125, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aspected Benefic + { 17151, { 0, 0, 0, 0, 0, 200, 0 } }, + // Aspected Helios + { 17152, { 0, 0, 0, 0, 0, 200, 0 } }, + // Hypercharge + { 17209, { 0, 0, 0, 0, 0, 0, 0 } }, + // Summon Eos + { 17215, { 0, 0, 0, 0, 0, 0, 0 } }, + // Summon Selene + { 17216, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 17222, { 0, 0, 0, 0, 0, 0, 0 } }, + // Chivalrous Spirit + { 17236, { 0, 0, 0, 0, 0, 1200, 0 } }, + // Souldeep Invisibility + { 17291, { 0, 0, 0, 0, 0, 0, 0 } }, + // Spinning Edge + { 17413, { 0, 0, 0, 0, 0, 0, 0 } }, + // Gust Slash + { 17414, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aeolian Edge + { 17415, { 0, 0, 0, 0, 0, 0, 0 } }, + // Shadow Fang + { 17416, { 0, 0, 0, 0, 0, 0, 0 } }, + // Armor Crush + { 17417, { 0, 0, 0, 0, 0, 0, 0 } }, + // Throwing Dagger + { 17418, { 0, 0, 0, 0, 0, 0, 0 } }, + // Death Blossom + { 17419, { 0, 0, 0, 0, 0, 0, 0 } }, + // Hakke Mujinsatsu + { 17420, { 0, 0, 0, 0, 0, 0, 0 } }, + // Hunter's Prudence + { 17596, { 0, 0, 0, 0, 0, 1000, 0 } }, + // Nebula + { 17839, { 0, 0, 0, 0, 0, 0, 0 } }, + // Bio + { 17864, { 0, 0, 0, 0, 0, 0, 0 } }, + // Bio II + { 17865, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ruin + { 17869, { 160, 0, 0, 0, 0, 0, 0 } }, + // Ruin II + { 17870, { 0, 0, 0, 0, 0, 0, 0 } }, // Smackdown - { 17901, { 0, 0, 0, 0, 0, 0 } }, + { 17901, { 0, 0, 0, 0, 0, 0, 0 } }, // 攻撃 - { 18034, { 0, 0, 0, 0, 0, 0 } }, + { 18034, { 0, 0, 0, 0, 0, 0, 0 } }, // Ending - { 18073, { 0, 0, 0, 0, 0, 0 } }, - // Straight Shot - { 18190, { 0, 0, 0, 0, 0, 0 } }, - + { 18073, { 0, 0, 0, 0, 0, 0, 0 } }, + // Alpine Draft + { 18295, { 220, 0, 0, 0, 0, 0, 0 } }, + // Protean Wave + { 18296, { 220, 0, 0, 0, 0, 0, 0 } }, + // Northerlies + { 18297, { 220, 0, 0, 0, 0, 0, 0 } }, + // Electrogenesis + { 18298, { 220, 0, 0, 0, 0, 0, 0 } }, + // Kaltstrahl + { 18299, { 220, 0, 0, 0, 0, 0, 0 } }, + // Abyssal Transfixion + { 18300, { 220, 0, 0, 0, 0, 0, 0 } }, + // Chirp + { 18301, { 0, 0, 0, 0, 0, 0, 0 } }, + // Eerie Soundwave + { 18302, { 0, 0, 0, 0, 0, 0, 0 } }, + // Pom Cure + { 18303, { 0, 0, 0, 0, 0, 100, 0 } }, + // Gobskin + { 18304, { 0, 0, 0, 0, 0, 0, 0 } }, + // Magic Hammer + { 18305, { 250, 0, 0, 0, 0, 0, 0 } }, + // Avail + { 18306, { 0, 0, 0, 0, 0, 0, 0 } }, + // Frog Legs + { 18307, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sonic Boom + { 18308, { 210, 0, 0, 0, 0, 0, 0 } }, + // Whistle + { 18309, { 0, 0, 0, 0, 0, 0, 0 } }, + // White Knight's Tour + { 18310, { 200, 0, 0, 0, 0, 0, 0 } }, + // Black Knight's Tour + { 18311, { 200, 0, 0, 0, 0, 0, 0 } }, + // Level 5 Death + { 18312, { 0, 0, 0, 0, 0, 0, 0 } }, + // Launcher + { 18313, { 0, 0, 0, 0, 0, 0, 0 } }, + // Perpetual Ray + { 18314, { 220, 0, 0, 0, 0, 0, 0 } }, + // Cactguard + { 18315, { 0, 0, 0, 0, 0, 0, 0 } }, + // Revenge Blast + { 18316, { 50, 0, 0, 0, 0, 0, 0 } }, + // Angel Whisper + { 18317, { 0, 0, 0, 0, 0, 0, 0 } }, + // Exuviation + { 18318, { 0, 0, 0, 0, 0, 50, 0 } }, + // Reflux + { 18319, { 220, 0, 0, 0, 0, 0, 0 } }, + // Devour + { 18320, { 250, 0, 0, 0, 0, 0, 0 } }, + // Condensed Libra + { 18321, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aetherial Mimicry + { 18322, { 0, 0, 0, 0, 0, 0, 0 } }, + // Surpanakha + { 18323, { 200, 0, 0, 0, 0, 0, 0 } }, + // Quasar + { 18324, { 300, 0, 0, 0, 0, 0, 0 } }, + // J Kick + { 18325, { 300, 0, 0, 0, 0, 0, 0 } }, + // Doom Spike + { 18772, { 0, 0, 0, 0, 0, 0, 0 } }, + // Sonic Thrust + { 18773, { 0, 0, 0, 0, 0, 0, 0 } }, + // Coerthan Torment + { 18774, { 0, 0, 0, 0, 0, 0, 0 } }, + // Skydragon Dive + { 18775, { 800, 0, 0, 0, 0, 0, 0 } }, + // Ala Morn + { 18776, { 3000, 0, 0, 0, 0, 0, 0 } }, + // Drachenlance + { 18777, { 500, 0, 0, 0, 0, 0, 0 } }, + // Horrid Roar + { 18778, { 600, 0, 0, 0, 0, 0, 0 } }, + // Stardiver + { 18780, { 1500, 0, 0, 0, 0, 0, 0 } }, + // Dragonshadow Dive + { 18781, { 0, 0, 0, 0, 0, 0, 0 } }, + // Dragonshadow Dive + { 18782, { 0, 0, 0, 0, 0, 0, 0 } }, + // Ten + { 18805, { 0, 0, 0, 0, 0, 0, 0 } }, + // Chi + { 18806, { 0, 0, 0, 0, 0, 0, 0 } }, + // Jin + { 18807, { 0, 0, 0, 0, 0, 0, 0 } }, + // Fuma Shuriken + { 18873, { 500, 0, 0, 0, 0, 0, 0 } }, + // Fuma Shuriken + { 18874, { 500, 0, 0, 0, 0, 0, 0 } }, + // Fuma Shuriken + { 18875, { 500, 0, 0, 0, 0, 0, 0 } }, + // Katon + { 18876, { 500, 0, 0, 0, 0, 0, 0 } }, + // Raiton + { 18877, { 800, 0, 0, 0, 0, 0, 0 } }, + // Hyoton + { 18878, { 400, 0, 0, 0, 0, 0, 0 } }, + // Huton + { 18879, { 0, 0, 0, 0, 0, 0, 0 } }, + // Doton + { 18880, { 100, 0, 0, 0, 0, 0, 0 } }, + // Suiton + { 18881, { 600, 0, 0, 0, 0, 0, 0 } }, + // Gofu + { 19046, { 0, 0, 0, 0, 0, 0, 0 } }, + // Yagetsu + { 19047, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aqua Vitae + { 19218, { 0, 0, 0, 0, 0, 0, 0 } }, + // attack + { 19221, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aetherial Mimicry + { 19238, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aetherial Mimicry + { 19239, { 0, 0, 0, 0, 0, 0, 0 } }, + // Aetherial Mimicry + { 19240, { 0, 0, 0, 0, 0, 0, 0 } }, }; \ No newline at end of file diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index 7068c01e..447ef48b 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -31,62 +31,230 @@ uint64_t EffectBuilder::getResultDelayMs() return Common::Util::getTimeMs() + 850; } -EffectResultPtr EffectBuilder::getResult( Entity::CharaPtr& chara ) +void EffectBuilder::moveToResultList( Entity::CharaPtr& chara, EffectResultPtr result ) { auto it = m_resolvedEffects.find( chara->getId() ); if( it == m_resolvedEffects.end() ) { - // create a new one and return it - // todo: this feels kinda dirty but makes for easy work - auto result = make_EffectResult( chara, getResultDelayMs() ); + // create a new one + auto resultList = std::make_shared< std::vector< EffectResultPtr > >(); - m_resolvedEffects[ chara->getId() ] = result; + m_resolvedEffects[ chara->getId() ] = resultList; - return result; + resultList->push_back( std::move( result ) ); + + return; } - return it->second; + it->second->push_back( std::move( result ) ); } -void EffectBuilder::healTarget( Entity::CharaPtr& target, uint32_t amount, Common::ActionHitSeverityType severity ) +void EffectBuilder::heal( Entity::CharaPtr& effectTarget, Entity::CharaPtr& healingTarget, uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) { - auto result = getResult( target ); - assert( result ); - - result->heal( amount, severity ); + EffectResultPtr nextResult = make_EffectResult( healingTarget, getResultDelayMs() ); + nextResult->heal( amount, severity, flag ); + moveToResultList( effectTarget, nextResult ); } -void EffectBuilder::damageTarget( Entity::CharaPtr& target, uint32_t amount, Common::ActionHitSeverityType severity ) +void EffectBuilder::restoreMP( Entity::CharaPtr& target, Entity::CharaPtr& restoringTarget, uint32_t amount, Common::ActionEffectResultFlag flag ) { - auto result = getResult( target ); - assert( result ); + EffectResultPtr nextResult = make_EffectResult( restoringTarget, getResultDelayMs() ); // restore mp source actor + nextResult->restoreMP( amount, flag ); + moveToResultList( target, nextResult ); +} - result->damage( amount, severity ); +void EffectBuilder::damage( Entity::CharaPtr& effectTarget, Entity::CharaPtr& damagingTarget, uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) +{ + EffectResultPtr nextResult = make_EffectResult( damagingTarget, getResultDelayMs() ); + nextResult->damage( amount, severity, flag ); + moveToResultList( effectTarget, nextResult ); +} + +void EffectBuilder::startCombo( Entity::CharaPtr& target, uint16_t actionId ) +{ + EffectResultPtr nextResult = make_EffectResult( target, 0 ); + nextResult->startCombo( actionId ); + moveToResultList( target, nextResult ); +} + +void EffectBuilder::comboSucceed( Entity::CharaPtr& target ) +{ + EffectResultPtr nextResult = make_EffectResult( target, 0 ); + nextResult->comboSucceed(); + moveToResultList( target, nextResult ); +} + +void EffectBuilder::applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param ) +{ + EffectResultPtr nextResult = make_EffectResult( target, 0 ); + nextResult->applyStatusEffect( statusId, param ); + moveToResultList( target, nextResult ); +} + +void EffectBuilder::mount( Entity::CharaPtr& target, uint16_t mountId ) +{ + EffectResultPtr nextResult = make_EffectResult( target, getResultDelayMs() ); + nextResult->mount( mountId ); + moveToResultList( target, nextResult ); } void EffectBuilder::buildAndSendPackets() { + auto targetCount = m_resolvedEffects.size(); Logger::debug( "EffectBuilder result: " ); - Logger::debug( "Targets afflicted: {}", m_resolvedEffects.size() ); + Logger::debug( "Targets afflicted: {}", targetCount ); - for( auto it = m_resolvedEffects.begin(); it != m_resolvedEffects.end(); ) + auto globalSequence = m_sourceChara->getCurrentTerritory()->getNextEffectSequence(); + + do // we want to send at least one packet even nothing is hit so other players can see { - auto result = it->second; - Logger::debug( " - id: {}", result->getTarget()->getId() ); + auto packet = buildNextEffectPacket( globalSequence ); + m_sourceChara->sendToInRangeSet( packet, true ); + } + while( !m_resolvedEffects.empty() ); +} + +std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( uint32_t globalSequence ) +{ + auto remainingTargetCount = m_resolvedEffects.size(); + + if( remainingTargetCount > 1 ) // use AoeEffect packets + { + int packetSize = remainingTargetCount <= 8 ? 8 : ( remainingTargetCount <= 16 ? 16 : ( remainingTargetCount <= 24 ? 24 : 32 ) ); + + using EffectHeader = Server::FFXIVIpcAoeEffect< 8 >; // dummy type to access header part of the packet + + FFXIVPacketBasePtr effectPacket = nullptr; + EffectHeader* pHeader; + Common::EffectEntry* pEntry; + uint64_t* pEffectTargetId; + uint16_t* pFlag; + switch( packetSize ) + { + case 8: + { + auto p = makeZonePacket< Server::FFXIVIpcAoeEffect8 >( m_sourceChara->getId() ); + pHeader = reinterpret_cast< EffectHeader* >( &p->data() ); + pEntry = reinterpret_cast< Common::EffectEntry* >( &p->data().effects ); + pEffectTargetId = reinterpret_cast< uint64_t* >( &p->data().effectTargetId ); + pFlag = reinterpret_cast< uint16_t* >( &p->data().unkFlag ); + effectPacket = std::move( p ); + break; + } + case 16: + { + auto p = makeZonePacket< Server::FFXIVIpcAoeEffect16 >( m_sourceChara->getId() ); + pHeader = reinterpret_cast< EffectHeader* >( &p->data() ); + pEntry = reinterpret_cast< Common::EffectEntry* >( &p->data().effects ); + pEffectTargetId = reinterpret_cast< uint64_t* >( &p->data().effectTargetId ); + pFlag = reinterpret_cast< uint16_t* >( &p->data().unkFlag ); + effectPacket = std::move( p ); + break; + } + case 24: + { + auto p = makeZonePacket< Server::FFXIVIpcAoeEffect24 >( m_sourceChara->getId() ); + pHeader = reinterpret_cast< EffectHeader* >( &p->data() ); + pEntry = reinterpret_cast< Common::EffectEntry* >( &p->data().effects ); + pEffectTargetId = reinterpret_cast< uint64_t* >( &p->data().effectTargetId ); + pFlag = reinterpret_cast< uint16_t* >( &p->data().unkFlag ); + effectPacket = std::move( p ); + break; + } + case 32: + { + auto p = makeZonePacket< Server::FFXIVIpcAoeEffect32 >( m_sourceChara->getId() ); + pHeader = reinterpret_cast< EffectHeader* >( &p->data() ); + pEntry = reinterpret_cast< Common::EffectEntry* >( &p->data().effects ); + pEffectTargetId = reinterpret_cast< uint64_t* >( &p->data().effectTargetId ); + pFlag = reinterpret_cast< uint16_t* >( &p->data().unkFlag ); + effectPacket = std::move( p ); + break; + } + } + assert( effectPacket ); + + pHeader->actionId = m_actionId; + pHeader->actionAnimationId = static_cast< uint16_t >( m_actionId ); + pHeader->animationTargetId = m_sourceChara->getId(); + pHeader->someTargetId = 0xE0000000; + pHeader->rotation = Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ); + pHeader->effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; + pHeader->effectCount = static_cast< uint8_t >( remainingTargetCount > packetSize ? packetSize : remainingTargetCount ); + pHeader->sourceSequence = m_sequence; + pHeader->globalSequence = globalSequence; + + uint8_t targetIndex = 0; + for( auto it = m_resolvedEffects.begin(); it != m_resolvedEffects.end(); ) + { + auto resultList = it->second; + assert( !resultList->empty() ); + auto firstResult = resultList->data()[ 0 ]; + pEffectTargetId[ targetIndex ] = firstResult->getTarget()->getId(); + Logger::debug( " - id: {}", pEffectTargetId[ targetIndex ] ); + + for( auto i = 0; i < resultList->size(); i++ ) + { + auto result = resultList->data()[ i ]; + pEntry[ targetIndex * 8 + i ] = result->buildEffectEntry(); + m_sourceChara->getCurrentTerritory()->addEffectResult( std::move( result ) ); + } + resultList->clear(); + + it = m_resolvedEffects.erase( it ); + + targetIndex++; + + if( targetIndex == packetSize ) + break; + } + + pFlag[0] = 0x7FFF; + pFlag[1] = 0x7FFF; + pFlag[2] = 0x7FFF; + + return effectPacket; + } + else if ( remainingTargetCount == 1 ) // use Effect for single target + { + auto resultList = m_resolvedEffects.begin()->second; + assert( !resultList->empty() ); + auto firstResult = resultList->data()[ 0 ]; + Logger::debug( " - id: {}", firstResult->getTarget()->getId() ); auto seq = m_sourceChara->getCurrentTerritory()->getNextEffectSequence(); - auto effectPacket = std::make_shared< Server::EffectPacket >( m_sourceChara->getId(), result->getTarget()->getId(), m_actionId ); + auto effectPacket = std::make_shared< Server::EffectPacket >( m_sourceChara->getId(), firstResult->getTarget()->getId(), m_actionId ); effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) ); effectPacket->setSequence( seq, m_sequence ); - effectPacket->addEffect( result->buildEffectEntry() ); + for( int i = 0; i < resultList->size(); i++ ) + { + auto result = resultList->data()[ i ]; + effectPacket->addEffect( result->buildEffectEntry() ); + m_sourceChara->getCurrentTerritory()->addEffectResult( std::move( result ) ); + } - m_sourceChara->sendToInRangeSet( effectPacket, true ); + resultList->clear(); - // add effect to territory - m_sourceChara->getCurrentTerritory()->addEffectResult( std::move( result ) ); + m_resolvedEffects.clear(); - it = m_resolvedEffects.erase( it ); + return effectPacket; + } + else // nothing is hit, this only happens when using aoe and AoeEffect8 is used on retail + { + auto effectPacket = makeZonePacket< Server::FFXIVIpcAoeEffect8 >( m_sourceChara->getId() ); + + effectPacket->data().actionId = m_actionId; + effectPacket->data().actionAnimationId = static_cast< uint16_t >( m_actionId ); + effectPacket->data().animationTargetId = m_sourceChara->getId(); + effectPacket->data().someTargetId = 0xE0000000; + effectPacket->data().rotation = Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ); + effectPacket->data().effectDisplayType = Common::ActionEffectDisplayType::HideActionName; + effectPacket->data().effectCount = 0; + effectPacket->data().sourceSequence = m_sequence; + effectPacket->data().globalSequence = globalSequence; + + return effectPacket; } } \ No newline at end of file diff --git a/src/world/Action/EffectBuilder.h b/src/world/Action/EffectBuilder.h index d58bebfe..3ed70dfc 100644 --- a/src/world/Action/EffectBuilder.h +++ b/src/world/Action/EffectBuilder.h @@ -11,27 +11,41 @@ namespace Sapphire::World::Action public: EffectBuilder( Entity::CharaPtr source, uint32_t actionId, uint16_t sequence ); + void heal( Entity::CharaPtr& effectTarget, Entity::CharaPtr& healingTarget, uint32_t amount, + Common::ActionHitSeverityType severity = Common::ActionHitSeverityType::NormalHeal, + Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None); - void healTarget( Entity::CharaPtr& target, uint32_t amount, - Common::ActionHitSeverityType severity = Common::ActionHitSeverityType::NormalHeal ); + void restoreMP( Entity::CharaPtr& effectTarget, Entity::CharaPtr& restoringTarget, uint32_t amount, + Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None); - void damageTarget( Entity::CharaPtr& target, uint32_t amount, - Common::ActionHitSeverityType severity = Common::ActionHitSeverityType::NormalDamage ); + void damage( Entity::CharaPtr& effectTarget, Entity::CharaPtr& damagingTarget, uint32_t amount, + Common::ActionHitSeverityType severity = Common::ActionHitSeverityType::NormalDamage, + Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None); + + void startCombo( Entity::CharaPtr& target, uint16_t actionId ); + + void comboSucceed( Entity::CharaPtr& target ); + + void applyStatusEffect( Entity::CharaPtr& target, uint16_t statusId, uint8_t param ); + + void mount( Entity::CharaPtr& target, uint16_t mountId ); void buildAndSendPackets(); private: - EffectResultPtr getResult( Entity::CharaPtr& chara ); + void moveToResultList( Entity::CharaPtr& chara, EffectResultPtr result ); uint64_t getResultDelayMs(); + std::shared_ptr< Sapphire::Network::Packets::FFXIVPacketBase > buildNextEffectPacket( uint32_t globalSequence ); + private: uint32_t m_actionId; uint16_t m_sequence; Entity::CharaPtr m_sourceChara; - std::unordered_map< uint32_t, EffectResultPtr > m_resolvedEffects; + std::unordered_map< uint32_t, std::shared_ptr< std::vector< EffectResultPtr > > > m_resolvedEffects; }; } diff --git a/src/world/Action/EffectResult.cpp b/src/world/Action/EffectResult.cpp index daf32155..55c76f55 100644 --- a/src/world/Action/EffectResult.cpp +++ b/src/world/Action/EffectResult.cpp @@ -3,6 +3,7 @@ #include #include "Actor/Chara.h" +#include "Actor/Player.h" using namespace Sapphire; using namespace Sapphire::World::Action; @@ -12,9 +13,11 @@ EffectResult::EffectResult( Entity::CharaPtr target, uint64_t runAfter ) : m_target( std::move( target ) ), m_delayMs( runAfter ), m_value( 0 ), - m_severity( Common::ActionHitSeverityType::NormalDamage ), + m_param0( 0 ), + m_param1( 0 ), m_type( Common::ActionEffectType::Nothing ), - m_param( 0 ) + m_param2( 0 ), + m_flag( Common::ActionEffectResultFlag::None ) { } @@ -34,36 +37,80 @@ uint64_t EffectResult::getDelay() return m_delayMs; } -void EffectResult::setParam( uint8_t param ) +void EffectResult::damage( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) { - m_param = param; -} - -void EffectResult::damage( uint32_t amount, Common::ActionHitSeverityType severity ) -{ - m_severity = severity; + m_param0 = static_cast< uint8_t >( severity ); m_value = amount; + m_flag = flag; m_type = Common::ActionEffectType::Damage; } -void EffectResult::heal( uint32_t amount, Sapphire::Common::ActionHitSeverityType severity ) +void EffectResult::heal( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag ) { - m_severity = severity; + m_param1 = static_cast< uint8_t >( severity ); m_value = amount; + m_flag = flag; m_type = Common::ActionEffectType::Heal; } +void EffectResult::restoreMP( uint32_t amount, Common::ActionEffectResultFlag flag ) +{ + m_value = amount; + m_flag = flag; + + m_type = Common::ActionEffectType::MpGain; +} + +void EffectResult::startCombo( uint16_t actionId ) +{ + m_value = actionId; + m_flag = Common::ActionEffectResultFlag::EffectOnSource; + + m_type = Common::ActionEffectType::StartActionCombo; +} + +void EffectResult::comboSucceed() +{ + // no EffectOnSource flag on this + m_type = Common::ActionEffectType::ComboSucceed; +} + +void EffectResult::applyStatusEffect( uint16_t statusId, uint8_t param ) +{ + m_value = statusId; + m_param2 = param; + + m_type = Common::ActionEffectType::ApplyStatusEffectTarget; +} + +void EffectResult::mount( uint16_t mountId ) +{ + m_value = mountId; + m_param0 = 1; + + m_type = Common::ActionEffectType::Mount; +} + Common::EffectEntry EffectResult::buildEffectEntry() const { Common::EffectEntry entry{}; - - // todo: that retarded shit so > u16 max numbers work - entry.value = getValue(); - entry.hitSeverity = m_severity; entry.effectType = m_type; - entry.param = m_param; + if( m_value > 0x0000FFFF ) + { + entry.value = static_cast< uint16_t >( m_value & 0x0000FFFF ); + entry.extendedValueHighestByte = static_cast< uint8_t >( m_value >> 16 ); + entry.flags = static_cast< uint8_t >( m_flag ) + static_cast< uint8_t >( Common::ActionEffectResultFlag::ExtendedValue ); + } + else + { + entry.value = static_cast< uint16_t >( m_value ); + entry.flags = static_cast< uint8_t >( m_flag ); + } + entry.param0 = m_param0; + entry.param1 = m_param1; + entry.param2 = m_param2; return entry; } @@ -84,6 +131,19 @@ void EffectResult::execute() break; } + case Common::ActionEffectType::MpGain: + { + m_target->restoreMP( m_value ); + break; + } + + case Common::ActionEffectType::Mount: + { + auto pPlayer = m_target->getAsPlayer(); + pPlayer->mount( m_value ); + break; + } + default: break; } diff --git a/src/world/Action/EffectResult.h b/src/world/Action/EffectResult.h index f1dd8b9c..14c432a3 100644 --- a/src/world/Action/EffectResult.h +++ b/src/world/Action/EffectResult.h @@ -15,8 +15,13 @@ namespace Sapphire::World::Action public: explicit EffectResult( Entity::CharaPtr target, uint64_t delayMs ); - void damage( uint32_t amount, Common::ActionHitSeverityType severity ); - void heal( uint32_t amount, Common::ActionHitSeverityType severity ); + void damage( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); + void heal( uint32_t amount, Common::ActionHitSeverityType severity, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); + void restoreMP( uint32_t amount, Common::ActionEffectResultFlag flag = Common::ActionEffectResultFlag::None ); + void startCombo( uint16_t actionId ); + void comboSucceed(); + void applyStatusEffect( uint16_t statusId, uint8_t param ); + void mount( uint16_t mountId ); Entity::CharaPtr getTarget() const; @@ -24,8 +29,6 @@ namespace Sapphire::World::Action uint64_t getDelay(); - void setParam( uint8_t param ); - Common::EffectEntry buildEffectEntry() const; void execute(); @@ -35,11 +38,14 @@ namespace Sapphire::World::Action Entity::CharaPtr m_target; - Common::ActionHitSeverityType m_severity; Common::ActionEffectType m_type; + uint8_t m_param0; + uint8_t m_param1; + uint8_t m_param2; + uint32_t m_value; - uint8_t m_param; + Common::ActionEffectResultFlag m_flag; }; } diff --git a/src/world/Action/EventAction.cpp b/src/world/Action/EventAction.cpp index 8c742ded..f524f33e 100644 --- a/src/world/Action/EventAction.cpp +++ b/src/world/Action/EventAction.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "Network/PacketWrappers/ActorControlPacket.h" #include "Network/PacketWrappers/ActorControlSelfPacket.h" @@ -9,7 +10,6 @@ #include "Actor/Player.h" #include "EventAction.h" -#include "Framework.h" using namespace Sapphire; using namespace Sapphire::World; @@ -20,15 +20,13 @@ using namespace Sapphire::Network::Packets::Server; using namespace Sapphire::Network::ActorControl; Action::EventAction::EventAction( Entity::CharaPtr pActor, uint32_t eventId, uint16_t action, - ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional, - FrameworkPtr pFw ) + ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional ) { m_additional = additional; m_eventId = eventId; m_id = action; - m_pFw = pFw; - auto pExdData = pFw->get< Data::ExdDataGenerated >(); - m_castTimeMs = pExdData->get< Sapphire::Data::EventAction >( action )->castTime * 1000; // TODO: Add security checks. + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + m_castTimeMs = exdData.get< Sapphire::Data::EventAction >( action )->castTime * 1000; // TODO: Add security checks. m_onActionFinishClb = std::move( finishRef ); m_onActionInterruptClb = std::move( interruptRef ); m_pSource = std::move( pActor ); diff --git a/src/world/Action/EventAction.h b/src/world/Action/EventAction.h index 4a9bb50a..b4c00085 100644 --- a/src/world/Action/EventAction.h +++ b/src/world/Action/EventAction.h @@ -16,7 +16,7 @@ public: virtual ~EventAction(); EventAction( Entity::CharaPtr pActor, uint32_t eventId, uint16_t action, - ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional, FrameworkPtr pFw ); + ActionCallback finishRef, ActionCallback interruptRef, uint64_t additional ); void start() override; diff --git a/src/world/Action/ItemAction.cpp b/src/world/Action/ItemAction.cpp index efbef2f4..96971e8b 100644 --- a/src/world/Action/ItemAction.cpp +++ b/src/world/Action/ItemAction.cpp @@ -10,14 +10,13 @@ using namespace Sapphire::World::Action; ItemAction::ItemAction( Sapphire::Entity::CharaPtr source, uint32_t itemId, Sapphire::Data::ItemActionPtr itemActionData, uint16_t itemSourceSlot, - uint16_t itemSourceContainer, Sapphire::FrameworkPtr fw ) : + uint16_t itemSourceContainer ) : m_itemAction( std::move( itemActionData ) ), m_itemSourceSlot( itemSourceSlot ), m_itemSourceContainer( itemSourceContainer ) { m_id = itemId; m_pSource = std::move( source ); - m_pFw = std::move( fw ); } void ItemAction::start() diff --git a/src/world/Action/ItemAction.h b/src/world/Action/ItemAction.h index f0f7c24f..4d60d8ff 100644 --- a/src/world/Action/ItemAction.h +++ b/src/world/Action/ItemAction.h @@ -15,7 +15,7 @@ namespace Sapphire::World::Action { public: ItemAction( Entity::CharaPtr source, uint32_t itemId, Data::ItemActionPtr itemActionData, - uint16_t itemSourceSlot, uint16_t itemSourceContainer, FrameworkPtr fw ); + uint16_t itemSourceSlot, uint16_t itemSourceContainer ); virtual ~ItemAction() = default; void start() override; diff --git a/src/world/Action/MountAction.cpp b/src/world/Action/MountAction.cpp new file mode 100644 index 00000000..39b928d3 --- /dev/null +++ b/src/world/Action/MountAction.cpp @@ -0,0 +1,69 @@ +#include "MountAction.h" + +#include + +#include "Actor/Player.h" + +#include +#include "Network/PacketWrappers/ActorControlSelfPacket.h" + +#include + +using namespace Sapphire; +using namespace Sapphire::Network::Packets; +using namespace Sapphire::Network::Packets::Server; +using namespace Sapphire::Network::ActorControl; +using namespace Sapphire::World::Action; + +MountAction::MountAction( Sapphire::Entity::CharaPtr source, uint16_t mountId, uint16_t sequence, Data::ActionPtr actionData ) : + Action::Action( source, 4, sequence, actionData ), + m_mountId( mountId ) +{ +} + +bool MountAction::preCheck() +{ + // todo: check if mount is unlocked + return m_pSource->isPlayer(); +} + +void MountAction::start() +{ + assert( m_pSource ); + + m_startTime = Common::Util::getTimeMs(); + + auto player = m_pSource->getAsPlayer(); + + auto castPacket = makeZonePacket< Server::FFXIVIpcActorCast >( getId() ); + auto& data = castPacket->data(); + + data.action_id = static_cast< uint16_t >( m_id ); + data.skillType = Common::SkillType::MountSkill; + data.unknown_1 = m_mountId; + data.cast_time = m_castTimeMs / 1000.f; + data.target_id = static_cast< uint32_t >( m_targetId ); + data.unknown_2 = 0xE0000000; + + auto pos = m_pSource->getPos(); + data.posX = Common::Util::floatToUInt16( pos.x ); + data.posY = Common::Util::floatToUInt16( pos.y ); + data.posZ = Common::Util::floatToUInt16( pos.z ); + data.rotation = Common::Util::floatToUInt16Rot( m_pSource->getRot() ); + + m_pSource->sendToInRangeSet( castPacket, true ); + + player->setStateFlag( Common::PlayerStateFlag::Casting ); + + auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, 1, getId(), m_recastTimeMs / 10 ); + player->queuePacket( actionStartPkt ); +} + +void MountAction::execute() +{ + assert( m_pSource ); + + m_pSource->getAsPlayer()->unsetStateFlag( Common::PlayerStateFlag::Casting ); + m_effectBuilder->mount( m_pSource, m_mountId ); + m_effectBuilder->buildAndSendPackets(); +} \ No newline at end of file diff --git a/src/world/Action/MountAction.h b/src/world/Action/MountAction.h new file mode 100644 index 00000000..6b79113d --- /dev/null +++ b/src/world/Action/MountAction.h @@ -0,0 +1,25 @@ +#ifndef SAPPHIRE_MOUNTACTION_H +#define SAPPHIRE_MOUNTACTION_H + +#include "Action.h" + +namespace Sapphire::World::Action +{ + class MountAction : public Action + { + public: + MountAction( Entity::CharaPtr source, uint16_t mountId, uint16_t sequence, Data::ActionPtr actionData ); + virtual ~MountAction() = default; + + bool preCheck() override; + + void start() override; + + void execute() override; + + private: + uint16_t m_mountId; + }; +} + +#endif //SAPPHIRE_MOUNTACTION_H diff --git a/src/world/Actor/Actor.cpp b/src/world/Actor/Actor.cpp index efaf0e51..43ba0900 100644 --- a/src/world/Actor/Actor.cpp +++ b/src/world/Actor/Actor.cpp @@ -351,7 +351,7 @@ Sapphire::InstanceContentPtr Sapphire::Entity::Actor::getCurrentInstance() const return nullptr; } -/*! \return QuestBattlePtr to the current instance, nullptr if not an instance or not set */ +/*! \return QuestBattlePtr to the current instance, nullptr if not a quest battle or not set */ Sapphire::QuestBattlePtr Sapphire::Entity::Actor::getCurrentQuestBattle() const { if( m_pCurrentTerritory ) @@ -360,6 +360,15 @@ Sapphire::QuestBattlePtr Sapphire::Entity::Actor::getCurrentQuestBattle() const return nullptr; } +/*! \return PublicContentPtr to the current instance, nullptr if not a public content or not set */ +Sapphire::PublicContentPtr Sapphire::Entity::Actor::getCurrentPublicContent() const +{ + if( m_pCurrentTerritory ) + return m_pCurrentTerritory->getAsPublicContent(); + + return nullptr; +} + /*! Get the current cell of a region the actor is in diff --git a/src/world/Actor/Actor.h b/src/world/Actor/Actor.h index 80bd066e..cf8f7479 100644 --- a/src/world/Actor/Actor.h +++ b/src/world/Actor/Actor.h @@ -130,6 +130,8 @@ namespace Sapphire::Entity QuestBattlePtr getCurrentQuestBattle() const; + PublicContentPtr getCurrentPublicContent() const; + // get the current cell of a region the actor is in Cell* getCellPtr(); diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index d133766e..09b96793 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -35,26 +35,26 @@ #include "BNpcTemplate.h" #include "Common.h" -#include "Framework.h" #include #include #include #include +#include using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::Server; using namespace Sapphire::Network::ActorControl; -Sapphire::Entity::BNpc::BNpc( FrameworkPtr pFw ) : - Npc( ObjKind::BattleNpc, pFw ) +Sapphire::Entity::BNpc::BNpc() : + Npc( ObjKind::BattleNpc ) { } Sapphire::Entity::BNpc::BNpc( uint32_t id, BNpcTemplatePtr pTemplate, float posX, float posY, float posZ, float rot, - uint8_t level, uint32_t maxHp, TerritoryPtr pZone, FrameworkPtr pFw ) : - Npc( ObjKind::BattleNpc, pFw ) + uint8_t level, uint32_t maxHp, TerritoryPtr pZone ) : + Npc( ObjKind::BattleNpc ) { m_id = id; m_modelChara = pTemplate->getModelChara(); @@ -99,20 +99,19 @@ Sapphire::Entity::BNpc::BNpc( uint32_t id, BNpcTemplatePtr pTemplate, float posX memcpy( m_customize, pTemplate->getCustomize(), sizeof( m_customize ) ); memcpy( m_modelEquip, pTemplate->getModelEquip(), sizeof( m_modelEquip ) ); - auto exdData = m_pFw->get< Data::ExdDataGenerated >(); - assert( exdData ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - auto bNpcBaseData = exdData->get< Data::BNpcBase >( m_bNpcBaseId ); + auto bNpcBaseData = exdData.get< Data::BNpcBase >( m_bNpcBaseId ); assert( bNpcBaseData ); m_radius = bNpcBaseData->scale; - auto modelChara = exdData->get< Data::ModelChara >( bNpcBaseData->modelChara ); + auto modelChara = exdData.get< Data::ModelChara >( bNpcBaseData->modelChara ); if( modelChara ) { - auto modelSkeleton = exdData->get< Data::ModelSkeleton >( modelChara->model ); + auto modelSkeleton = exdData.get< Data::ModelSkeleton >( modelChara->model ); if( modelSkeleton ) - m_radius *= modelSkeleton->scaleFactor; + m_radius *= modelSkeleton->radius; } // todo: is this actually good? @@ -301,7 +300,7 @@ Sapphire::Entity::CharaPtr Sapphire::Entity::BNpc::hateListGetHighest() void Sapphire::Entity::BNpc::hateListAdd( Sapphire::Entity::CharaPtr pChara, int32_t hateAmount ) { auto hateEntry = std::make_shared< HateListEntry >(); - hateEntry->m_hateAmount = hateAmount; + hateEntry->m_hateAmount = static_cast< uint32_t >( hateAmount ); hateEntry->m_pChara = pChara; m_hateList.insert( hateEntry ); @@ -318,13 +317,13 @@ void Sapphire::Entity::BNpc::hateListUpdate( Sapphire::Entity::CharaPtr pChara, { if( listEntry->m_pChara == pChara ) { - listEntry->m_hateAmount += hateAmount; + listEntry->m_hateAmount += static_cast< uint32_t >( hateAmount ); return; } } auto hateEntry = std::make_shared< HateListEntry >(); - hateEntry->m_hateAmount = hateAmount; + hateEntry->m_hateAmount = static_cast< uint32_t >( hateAmount ); hateEntry->m_pChara = pChara; m_hateList.insert( hateEntry ); } @@ -359,8 +358,8 @@ bool Sapphire::Entity::BNpc::hateListHasActor( Sapphire::Entity::CharaPtr pChara void Sapphire::Entity::BNpc::aggro( Sapphire::Entity::CharaPtr pChara ) { - auto pRNGMgr = m_pFw->get< World::Manager::RNGMgr >(); - auto variation = static_cast< uint32_t >( pRNGMgr->getRandGenerator< float >( 500, 1000 ).next() ); + auto& pRNGMgr = Common::Service< World::Manager::RNGMgr >::ref(); + auto variation = static_cast< uint32_t >( pRNGMgr.getRandGenerator< float >( 500, 1000 ).next() ); m_lastAttack = Util::getTimeMs() + variation; hateListUpdate( pChara, 1 ); @@ -396,6 +395,7 @@ void Sapphire::Entity::BNpc::deaggro( Sapphire::Entity::CharaPtr pChara ) void Sapphire::Entity::BNpc::onTick() { + Chara::onTick(); if( m_state == BNpcState::Retreat ) { regainHp(); @@ -590,7 +590,7 @@ void Sapphire::Entity::BNpc::onDeath() // TODO: handle drops auto pPlayer = pHateEntry->m_pChara->getAsPlayer(); if( pPlayer ) - pPlayer->onMobKill( m_bNpcNameId ); + pPlayer->onMobKill( static_cast< uint16_t >( m_bNpcNameId ) ); } hateListClear(); } @@ -654,7 +654,7 @@ void Sapphire::Entity::BNpc::setOwner( Sapphire::Entity::CharaPtr m_pChara ) { auto setOwnerPacket = makeZonePacket< FFXIVIpcActorOwner >( getId() ); setOwnerPacket->data().type = 0x01; - setOwnerPacket->data().actorId = INVALID_GAME_OBJECT_ID; + setOwnerPacket->data().actorId = static_cast< uint32_t >( INVALID_GAME_OBJECT_ID ); sendToInRangeSet( setOwnerPacket ); } } @@ -691,21 +691,20 @@ void Sapphire::Entity::BNpc::autoAttack( CharaPtr pTarget ) m_lastAttack = tick; srand( static_cast< uint32_t >( tick ) ); - auto pRNGMgr = m_pFw->get< World::Manager::RNGMgr >(); auto damage = Math::CalcStats::calcAutoAttackDamage( *this ); auto effectPacket = std::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 ); effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); Common::EffectEntry effectEntry{}; - effectEntry.value = damage; + effectEntry.value = static_cast< int16_t >( damage.first ); effectEntry.effectType = ActionEffectType::Damage; - effectEntry.hitSeverity = ActionHitSeverityType::NormalDamage; - effectEntry.param = 0x71; + effectEntry.param0 = static_cast< uint8_t >( damage.second ); + effectEntry.param2 = 0x71; effectPacket->addEffect( effectEntry ); sendToInRangeSet( effectPacket ); - pTarget->takeDamage( damage ); + pTarget->takeDamage( static_cast< uint16_t >( damage.first ) ); } } @@ -715,10 +714,10 @@ void Sapphire::Entity::BNpc::calculateStats() uint8_t level = getLevel(); uint8_t job = static_cast< uint8_t >( getClass() ); - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - auto classInfo = pExdData->get< Sapphire::Data::ClassJob >( job ); - auto paramGrowthInfo = pExdData->get< Sapphire::Data::ParamGrow >( level ); + auto classInfo = exdData.get< Sapphire::Data::ClassJob >( job ); + auto paramGrowthInfo = exdData.get< Sapphire::Data::ParamGrow >( level ); float base = Math::CalcStats::calculateBaseStat( *this ); @@ -727,17 +726,17 @@ void Sapphire::Entity::BNpc::calculateStats() m_baseStats.vit = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierVitality ) / 100 ) ); m_baseStats.inte = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierIntelligence ) / 100 ) ); m_baseStats.mnd = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierMind ) / 100 ) ); - m_baseStats.pie = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierPiety ) / 100 ) ); + //m_baseStats.pie = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierPiety ) / 100 ) ); m_baseStats.determination = static_cast< uint32_t >( base ); m_baseStats.pie = static_cast< uint32_t >( base ); - m_baseStats.skillSpeed = paramGrowthInfo->baseSpeed; - m_baseStats.spellSpeed = paramGrowthInfo->baseSpeed; - m_baseStats.accuracy = paramGrowthInfo->baseSpeed; - m_baseStats.critHitRate = paramGrowthInfo->baseSpeed; - m_baseStats.attackPotMagic = paramGrowthInfo->baseSpeed; - m_baseStats.healingPotMagic = paramGrowthInfo->baseSpeed; - m_baseStats.tenacity = paramGrowthInfo->baseSpeed; + m_baseStats.skillSpeed = static_cast< uint32_t >( paramGrowthInfo->baseSpeed ); + m_baseStats.spellSpeed = static_cast< uint32_t >( paramGrowthInfo->baseSpeed ); + m_baseStats.accuracy = static_cast< uint32_t >( paramGrowthInfo->baseSpeed ); + m_baseStats.critHitRate = static_cast< uint32_t >( paramGrowthInfo->baseSpeed ); + m_baseStats.attackPotMagic = static_cast< uint32_t >( paramGrowthInfo->baseSpeed ); + m_baseStats.healingPotMagic = static_cast< uint32_t >( paramGrowthInfo->baseSpeed ); + m_baseStats.tenacity = static_cast< uint32_t >( paramGrowthInfo->baseSpeed ); m_baseStats.attack = m_baseStats.str; m_baseStats.attackPotMagic = m_baseStats.inte; diff --git a/src/world/Actor/BNpc.h b/src/world/Actor/BNpc.h index c76f8e99..aea42d48 100644 --- a/src/world/Actor/BNpc.h +++ b/src/world/Actor/BNpc.h @@ -49,9 +49,9 @@ namespace Sapphire::Entity { public: - BNpc( FrameworkPtr pFw ); + BNpc(); BNpc( uint32_t id, BNpcTemplatePtr pTemplate, float posX, float posY, float posZ, float rot, - uint8_t level, uint32_t maxHp, TerritoryPtr pZone,FrameworkPtr pFw ); + uint8_t level, uint32_t maxHp, TerritoryPtr pZone ); virtual ~BNpc() override; diff --git a/src/world/Actor/Chara.cpp b/src/world/Actor/Chara.cpp index 70656675..c62c268c 100644 --- a/src/world/Actor/Chara.cpp +++ b/src/world/Actor/Chara.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "Forwards.h" @@ -25,7 +26,6 @@ #include "Chara.h" #include "Player.h" #include "Manager/TerritoryMgr.h" -#include "Framework.h" #include "Common.h" using namespace Sapphire::Common; @@ -33,17 +33,17 @@ using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::Server; using namespace Sapphire::Network::ActorControl; -Sapphire::Entity::Chara::Chara( ObjKind type, FrameworkPtr pFw ) : +Sapphire::Entity::Chara::Chara( ObjKind type ) : Actor( type ), m_pose( 0 ), m_targetId( INVALID_GAME_OBJECT_ID64 ), - m_pFw( std::move( std::move( pFw ) ) ), m_directorId( 0 ), m_radius( 1.f ) { m_lastTickTime = 0; m_lastUpdate = 0; + m_lastAttack = Util::getTimeMs(); m_bonusStats.fill( 0 ); @@ -245,14 +245,14 @@ void Sapphire::Entity::Chara::setMp( uint32_t mp ) /*! \param gp amount to set*/ void Sapphire::Entity::Chara::setGp( uint32_t gp ) { - m_gp = gp; + m_gp = static_cast< uint16_t >( gp ); sendStatusUpdate(); } /*! \param tp amount to set*/ void Sapphire::Entity::Chara::setTp( uint32_t tp ) { - m_tp = tp; + m_tp = static_cast< uint16_t >( tp ); sendStatusUpdate(); } @@ -316,7 +316,7 @@ bool Sapphire::Entity::Chara::face( const Common::FFXIVARR_POSITION3& p ) setRot( newRot ); - return oldRot != newRot; + return ( fabs( oldRot - newRot ) <= std::numeric_limits< float >::epsilon() * fmax( fabs( oldRot ), fabs( newRot ) ) ); } /*! @@ -354,14 +354,16 @@ bool Sapphire::Entity::Chara::checkAction() void Sapphire::Entity::Chara::update( uint64_t tickCount ) { - if( std::difftime( tickCount, m_lastTickTime ) > 3000 ) + updateStatusEffects(); + + if( std::difftime( static_cast< time_t >( tickCount ), m_lastTickTime ) > 3000 ) { onTick(); - m_lastTickTime = tickCount; + m_lastTickTime = static_cast< time_t >( tickCount ); } - m_lastUpdate = tickCount; + m_lastUpdate = static_cast< time_t >( tickCount ); } /*! @@ -438,6 +440,18 @@ void Sapphire::Entity::Chara::heal( uint32_t amount ) sendStatusUpdate(); } +void Sapphire::Entity::Chara::restoreMP( uint32_t amount ) +{ + if( ( m_mp + amount ) > getMaxMp() ) + { + m_mp = getMaxMp(); + } + else + m_mp += amount; + + sendStatusUpdate(); +} + /*! Send an HpMpTp update to players in range ( and potentially to self ) TODO: poor naming, should be changed. Status is not HP. Also should be virtual @@ -494,10 +508,10 @@ void Sapphire::Entity::Chara::autoAttack( CharaPtr pTarget ) auto effectPacket = std::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 ); effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); Common::EffectEntry effectEntry{}; - effectEntry.value = damage; + effectEntry.value = static_cast< int16_t >( damage ); effectEntry.effectType = ActionEffectType::Damage; - effectEntry.hitSeverity = ActionHitSeverityType::NormalDamage; - effectEntry.param = 0x71; + effectEntry.param0 = static_cast< uint8_t >( ActionHitSeverityType::NormalDamage ); + effectEntry.param2 = 0x71; effectPacket->addEffect( effectEntry ); sendToInRangeSet( effectPacket ); @@ -520,21 +534,20 @@ void Sapphire::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEf auto statusEffectAdd = makeZonePacket< FFXIVIpcEffectResult >( getId() ); + statusEffectAdd->data().globalSequence = getCurrentTerritory()->getNextEffectSequence(); statusEffectAdd->data().actor_id = pEffect->getTargetActorId(); statusEffectAdd->data().current_hp = getHp(); - statusEffectAdd->data().current_mp = getMp(); - statusEffectAdd->data().current_tp = getTp(); + statusEffectAdd->data().current_mp = static_cast< uint16_t >( getMp() ); statusEffectAdd->data().max_hp = getMaxHp(); - statusEffectAdd->data().max_mp = getMaxMp(); - statusEffectAdd->data().max_something = 1; - //statusEffectAdd->data().unknown2 = 28; + statusEffectAdd->data().classId = static_cast< uint8_t >( getClass() ); + statusEffectAdd->data().entryCount = 1; auto& status = statusEffectAdd->data().statusEntries[0]; status.sourceActorId = pEffect->getSrcActorId(); status.duration = static_cast< float >( pEffect->getDuration() ) / 1000; - status.id = pEffect->getId(); - status.index = nextSlot; + status.id = static_cast< uint16_t >( pEffect->getId() ); + status.index = static_cast< uint8_t >( nextSlot ); status.param = pEffect->getParam(); sendToInRangeSet( statusEffectAdd, isPlayer() ); @@ -543,7 +556,7 @@ void Sapphire::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEf /*! \param StatusEffectPtr to be applied to the actor */ void Sapphire::Entity::Chara::addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param ) { - auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, 3000, m_pFw ); + auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, 3000 ); effect->setParam( param ); addStatusEffect( effect ); } @@ -555,7 +568,7 @@ void Sapphire::Entity::Chara::addStatusEffectByIdIfNotExist( uint32_t id, int32_ if( hasStatusEffect( id ) ) return; - auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, 3000, m_pFw ); + auto effect = StatusEffect::make_StatusEffect( id, source.getAsChara(), getAsChara(), duration, 3000 ); effect->setParam( param ); addStatusEffect( effect ); @@ -568,7 +581,7 @@ int8_t Sapphire::Entity::Chara::getStatusEffectFreeSlot() if( m_statusEffectFreeSlotQueue.empty() ) return freeEffectSlot; - freeEffectSlot = m_statusEffectFreeSlotQueue.front(); + freeEffectSlot = static_cast< int8_t >( m_statusEffectFreeSlotQueue.front() ); m_statusEffectFreeSlotQueue.pop(); return freeEffectSlot; @@ -645,7 +658,6 @@ void Sapphire::Entity::Chara::sendStatusEffectUpdate() statusEffectList->data().level1 = getLevel(); statusEffectList->data().current_hp = getHp(); statusEffectList->data().current_mp = getMp(); - statusEffectList->data().currentTp = getTp(); statusEffectList->data().max_hp = getMaxHp(); statusEffectList->data().max_mp = getMaxMp(); uint8_t slot = 0; @@ -667,9 +679,6 @@ void Sapphire::Entity::Chara::updateStatusEffects() { uint64_t currentTimeMs = Util::getTimeMs(); - uint32_t thisTickDmg = 0; - uint32_t thisTickHeal = 0; - for( auto effectIt : m_statusEffectMap ) { uint8_t effectIndex = effectIt.first; @@ -680,7 +689,7 @@ void Sapphire::Entity::Chara::updateStatusEffects() uint32_t duration = effect->getDuration(); uint32_t tickRate = effect->getTickRate(); - if( ( currentTimeMs - startTime ) > duration ) + if( duration > 0 && ( currentTimeMs - startTime ) > duration ) { // remove status effect removeStatusEffect( effectIndex ); @@ -692,41 +701,7 @@ void Sapphire::Entity::Chara::updateStatusEffects() { effect->setLastTick( currentTimeMs ); effect->onTick(); - - auto thisEffect = effect->getTickEffect(); - - switch( thisEffect.first ) - { - - case 1: - { - thisTickDmg += thisEffect.second; - break; - } - - case 2: - { - thisTickHeal += thisEffect.second; - break; - } - - } } - - } - - if( thisTickDmg != 0 ) - { - takeDamage( thisTickDmg ); - sendToInRangeSet( makeActorControl( getId(), HPFloatingText, 0, - static_cast< uint8_t >( ActionEffectType::Damage ), thisTickDmg ) ); - } - - if( thisTickHeal != 0 ) - { - heal( thisTickDmg ); - sendToInRangeSet( makeActorControl( getId(), HPFloatingText, 0, - static_cast< uint8_t >( ActionEffectType::Heal ), thisTickHeal ) ); } } @@ -787,10 +762,9 @@ float Sapphire::Entity::Chara::getRadius() const Sapphire::Common::BaseParam Sapphire::Entity::Chara::getPrimaryStat() const { - auto exdData = m_pFw->get< Data::ExdDataGenerated >(); - assert( exdData ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - auto classJob = exdData->get< Data::ClassJob >( static_cast< uint16_t >( getClass() ) ); + auto classJob = exdData.get< Data::ClassJob >( static_cast< uint16_t >( getClass() ) ); assert( classJob ); return static_cast< Sapphire::Common::BaseParam >( classJob->primaryStat ); @@ -929,4 +903,43 @@ uint32_t Sapphire::Entity::Chara::getStatValue( Sapphire::Common::BaseParam base } return value + getBonusStat( baseParam ); +} + +void Sapphire::Entity::Chara::onTick() +{ + uint32_t thisTickDmg = 0; + uint32_t thisTickHeal = 0; + + for( auto effectIt : m_statusEffectMap ) + { + auto thisEffect = effectIt.second->getTickEffect(); + switch( thisEffect.first ) + { + case 1: + { + thisTickDmg += thisEffect.second; + break; + } + + case 2: + { + thisTickHeal += thisEffect.second; + break; + } + } + } + + if( thisTickDmg != 0 ) + { + takeDamage( thisTickDmg ); + sendToInRangeSet( makeActorControl( getId(), HPFloatingText, 0, + static_cast< uint8_t >( ActionEffectType::Damage ), thisTickDmg ), true ); + } + + if( thisTickHeal != 0 ) + { + heal( thisTickHeal ); + sendToInRangeSet( makeActorControl( getId(), HPFloatingText, 0, + static_cast< uint8_t >( ActionEffectType::Heal ), thisTickHeal ), true ); + } } \ No newline at end of file diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index d9fea85b..aab58dec 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -126,7 +126,6 @@ namespace Sapphire::Entity std::queue< uint8_t > m_statusEffectFreeSlotQueue; std::vector< std::pair< uint8_t, uint32_t > > m_statusEffectList; std::map< uint8_t, StatusEffect::StatusEffectPtr > m_statusEffectMap; - FrameworkPtr m_pFw; /*! Detour Crowd AgentId */ uint32_t m_agentId; @@ -135,7 +134,7 @@ namespace Sapphire::Entity float m_radius; public: - Chara( Common::ObjKind type, FrameworkPtr pFw ); + Chara( Common::ObjKind type ); virtual ~Chara() override; @@ -251,7 +250,7 @@ namespace Sapphire::Entity virtual void onActionFriendly( Chara& pSource ) {}; - virtual void onTick() {}; + virtual void onTick(); virtual void changeTarget( uint64_t targetId ); @@ -263,6 +262,8 @@ namespace Sapphire::Entity virtual void heal( uint32_t amount ); + virtual void restoreMP( uint32_t amount ); + virtual bool checkAction(); virtual void update( uint64_t tickCount ); diff --git a/src/world/Actor/EventObject.cpp b/src/world/Actor/EventObject.cpp index 7287d01f..939e2698 100644 --- a/src/world/Actor/EventObject.cpp +++ b/src/world/Actor/EventObject.cpp @@ -25,7 +25,8 @@ Sapphire::Entity::EventObject::EventObject( uint32_t actorId, uint32_t objectId, m_state( initialState ), m_objectId( objectId ), m_name( givenName ), - m_housingLink( 0 ) + m_housingLink( 0 ), + m_flag( 0 ) { m_id = actorId; m_pos.x = pos.x; @@ -84,6 +85,11 @@ void Sapphire::Entity::EventObject::setState( uint8_t state ) } } +uint8_t Sapphire::Entity::EventObject::getFlag() const +{ + return m_flag; +} + void Sapphire::Entity::EventObject::setAnimationFlag( uint32_t flag, uint32_t animationFlag ) { for( const auto& player : m_inRangePlayers ) @@ -131,6 +137,7 @@ void Sapphire::Entity::EventObject::spawn( Sapphire::Entity::PlayerPtr pTarget ) eobjStatePacket->data().actorId = getId(); eobjStatePacket->data().housingLink = getHousingLink(); eobjStatePacket->data().rotation = Util::floatToUInt16Rot( getRot() ); + eobjStatePacket->data().flag = getFlag(); pTarget->queuePacket( eobjStatePacket ); } diff --git a/src/world/Actor/EventObject.h b/src/world/Actor/EventObject.h index 7b38f64d..c497bf1f 100644 --- a/src/world/Actor/EventObject.h +++ b/src/world/Actor/EventObject.h @@ -13,7 +13,7 @@ namespace Sapphire::Entity Common::FFXIVARR_POSITION3 pos, float rotation, const std::string& givenName = "none" ); using OnTalkEventHandler = std::function< void( Entity::Player&, Entity::EventObjectPtr, - TerritoryPtr, uint64_t ) >; + TerritoryPtr, uint32_t, uint64_t ) >; uint32_t getGimmickId() const; @@ -25,6 +25,8 @@ namespace Sapphire::Entity float getScale() const; + uint8_t getFlag() const; + void setScale( float scale ); void setOnTalkHandler( OnTalkEventHandler handler ); @@ -54,6 +56,7 @@ namespace Sapphire::Entity uint32_t m_gimmickId; uint32_t m_objectId; uint8_t m_state; + uint8_t m_flag; float m_scale; std::string m_name; TerritoryPtr m_parentInstance; diff --git a/src/world/Actor/Npc.cpp b/src/world/Actor/Npc.cpp index d795aabb..e5427b6d 100644 --- a/src/world/Actor/Npc.cpp +++ b/src/world/Actor/Npc.cpp @@ -25,7 +25,6 @@ #include "Player.h" #include "Npc.h" #include "Manager/TerritoryMgr.h" -#include "Framework.h" #include "Common.h" using namespace Sapphire::Common; @@ -33,8 +32,8 @@ using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::Server; using namespace Sapphire::Network::ActorControl; -Sapphire::Entity::Npc::Npc( ObjKind type, FrameworkPtr pFw ) : - Chara( type, pFw ) +Sapphire::Entity::Npc::Npc( ObjKind type ) : + Chara( type ) { } diff --git a/src/world/Actor/Npc.h b/src/world/Actor/Npc.h index d7505364..bf7cb4f2 100644 --- a/src/world/Actor/Npc.h +++ b/src/world/Actor/Npc.h @@ -21,7 +21,7 @@ namespace Sapphire::Entity { public: - Npc( Common::ObjKind type, FrameworkPtr pFw ); + Npc( Common::ObjKind type ); virtual ~Npc() override; diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index fde14915..1ef07103 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -3,10 +3,14 @@ #include #include #include +#include +#include + #include #include #include #include +#include #include "Session.h" #include "Player.h" @@ -15,10 +19,14 @@ #include "Manager/HousingMgr.h" #include "Manager/TerritoryMgr.h" #include "Manager/RNGMgr.h" +#include "Manager/MapMgr.h" #include "Territory/Territory.h" #include "Territory/ZonePosition.h" #include "Territory/InstanceContent.h" +#include "Territory/QuestBattle.h" +#include "Territory/PublicContent.h" +#include "Territory/InstanceObjectCache.h" #include "Territory/Land.h" #include "Network/GameConnection.h" @@ -41,7 +49,6 @@ #include "Math/CalcBattle.h" #include "ServerMgr.h" -#include "Framework.h" using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; @@ -54,8 +61,8 @@ using InvSlotPair = std::pair< uint16_t, int8_t >; using InvSlotPairVec = std::vector< InvSlotPair >; // player constructor -Sapphire::Entity::Player::Player( FrameworkPtr pFw ) : - Chara( ObjKind::Player, pFw ), +Sapphire::Entity::Player::Player() : + Chara( ObjKind::Player ), m_lastWrite( 0 ), m_lastPing( 0 ), m_bIsLogin( false ), @@ -76,7 +83,9 @@ Sapphire::Entity::Player::Player( FrameworkPtr pFw ) : m_emoteMode( 0 ), m_directorInitialized( false ), m_onEnterEventDone( false ), - m_falling( false ) + m_falling( false ), + m_pQueuedAction( nullptr ), + m_cfNotifiedContent( 0 ) { m_id = 0; m_currentStance = Stance::Passive; @@ -101,6 +110,8 @@ Sapphire::Entity::Player::Player( FrameworkPtr pFw ) : m_objSpawnIndexAllocator.init( MAX_DISPLAYED_EOBJS ); m_actorSpawnIndexAllocator.init( MAX_DISPLAYED_ACTORS, true ); + + gaugeClear(); } Sapphire::Entity::Player::~Player() @@ -109,8 +120,8 @@ Sapphire::Entity::Player::~Player() void Sapphire::Entity::Player::injectPacket( const std::string& path ) { - auto pServerZone = m_pFw->get< World::ServerMgr >(); - auto session = pServerZone->getSession( getId() ); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + auto session = serverMgr.getSession( getId() ); if( session ) session->getZoneConnection()->injectPacket( path, *this ); } @@ -195,9 +206,7 @@ bool Sapphire::Entity::Player::isMarkedForRemoval() const Sapphire::Common::OnlineStatus Sapphire::Entity::Player::getOnlineStatus() const { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - if( !pExdData ) - return OnlineStatus::Online; + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); uint32_t statusDisplayOrder = 0xFF14; uint32_t applicableStatus = static_cast< uint32_t >( OnlineStatus::Online ); @@ -209,7 +218,7 @@ Sapphire::Common::OnlineStatus Sapphire::Entity::Player::getOnlineStatus() const if( !bit ) continue; - auto pOnlineStatus = pExdData->get< Data::OnlineStatus >( i ); + auto pOnlineStatus = exdData.get< Data::OnlineStatus >( i ); if( !pOnlineStatus ) continue; @@ -234,13 +243,16 @@ uint64_t Sapphire::Entity::Player::getOnlineStatusMask() const return m_onlineStatus; } -void Sapphire::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime, uint16_t animation ) +void Sapphire::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime, uint16_t animation, uint8_t param4, uint8_t param7, uint8_t unknown ) { auto preparePacket = makeZonePacket< FFXIVIpcPrepareZoning >( getId() ); preparePacket->data().targetZone = targetZone; preparePacket->data().fadeOutTime = fadeOutTime; preparePacket->data().animation = animation; preparePacket->data().fadeOut = static_cast< uint8_t >( fadeOut ? 1 : 0 ); + preparePacket->data().param4 = param4; + preparePacket->data().param7 = param7; + preparePacket->data().unknown = unknown; queuePacket( preparePacket ); } @@ -250,11 +262,11 @@ void Sapphire::Entity::Player::calculateStats() uint8_t level = getLevel(); uint8_t job = static_cast< uint8_t >( getClass() ); - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - auto classInfo = pExdData->get< Sapphire::Data::ClassJob >( job ); - auto tribeInfo = pExdData->get< Sapphire::Data::Tribe >( tribe ); - auto paramGrowthInfo = pExdData->get< Sapphire::Data::ParamGrow >( level ); + auto classInfo = exdData.get< Sapphire::Data::ClassJob >( job ); + auto tribeInfo = exdData.get< Sapphire::Data::Tribe >( tribe ); + auto paramGrowthInfo = exdData.get< Sapphire::Data::ParamGrow >( level ); float base = Math::CalcStats::calculateBaseStat( *this ); @@ -268,8 +280,8 @@ void Sapphire::Entity::Player::calculateStats() tribeInfo->iNT ); m_baseStats.mnd = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierMind ) / 100 ) + tribeInfo->mND ); - m_baseStats.pie = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierPiety ) / 100 ) + - tribeInfo->pIE ); + /*m_baseStats.pie = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierPiety ) / 100 ) + + tribeInfo->pIE );*/ m_baseStats.determination = static_cast< uint32_t >( base ); m_baseStats.pie = static_cast< uint32_t >( base ); @@ -287,7 +299,7 @@ void Sapphire::Entity::Player::calculateStats() m_baseStats.max_mp = 10000; - m_baseStats.max_hp = Math::CalcStats::calculateMaxHp( getAsPlayer(), m_pFw ); + m_baseStats.max_hp = Math::CalcStats::calculateMaxHp( getAsPlayer() ); if( m_mp > m_baseStats.max_mp ) m_mp = m_baseStats.max_mp; @@ -301,7 +313,6 @@ void Sapphire::Entity::Player::calculateStats() void Sapphire::Entity::Player::setAutoattack( bool mode ) { m_bAutoattack = mode; - m_lastAttack = Util::getTimeMs(); } bool Sapphire::Entity::Player::isAutoattackOn() const @@ -339,18 +350,18 @@ void Sapphire::Entity::Player::sendStats() void Sapphire::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - auto pTeriMgr = m_pFw->get< TerritoryMgr >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); - auto data = pExdData->get< Sapphire::Data::Aetheryte >( aetheryteId ); + auto data = exdData.get< Sapphire::Data::Aetheryte >( aetheryteId ); if( data == nullptr ) - { return; - } setStateFlag( PlayerStateFlag::BetweenAreas ); - auto targetPos = pTeriMgr->getTerritoryPosition( data->level.at( 0 ) ); + + auto& instanceObjectCache = Common::Service< InstanceObjectCache >::ref(); + auto pop = instanceObjectCache.getPopRange( data->territory, data->level[ 0 ] ); Common::FFXIVARR_POSITION3 pos; pos.x = 0; @@ -358,21 +369,29 @@ void Sapphire::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) pos.z = 0; float rot = 0; - if( targetPos != nullptr ) + if( pop ) { - pos = targetPos->getTargetPosition(); - rot = targetPos->getTargetRotation(); + sendDebug( "Teleport: popRange {0} found!", data->level.at( 0 ) ); + + pos.x = pop->header.transform.translation.x; + pos.y = pop->header.transform.translation.y; + pos.z = pop->header.transform.translation.z; + rot = pop->header.transform.rotation.y; + } + else + { + sendDebug( "Teleport: popRange {0} not found in {1}!", data->level[ 0 ], data->territory ); } sendDebug( "Teleport: {0} {1} ({2})", - pExdData->get< Sapphire::Data::PlaceName >( data->placeName )->name, - pExdData->get< Sapphire::Data::PlaceName >( data->aethernetName )->name, + exdData.get< Sapphire::Data::PlaceName >( data->placeName )->name, + exdData.get< Sapphire::Data::PlaceName >( data->aethernetName )->name, data->territory ); // TODO: this should be simplified and a type created in server_common/common.h. if( type == 1 ) // teleport { - prepareZoning( data->territory, true, 1, 112 ); // TODO: Really? + prepareZoning( data->territory, true, 1, 0 ); // TODO: Really? sendToInRangeSet( makeActorControl( getId(), ActorDespawnEffect, 0x04 ) ); setZoningType( Common::ZoneingType::Teleport ); } @@ -408,16 +427,16 @@ void Sapphire::Entity::Player::returnToHomepoint() void Sapphire::Entity::Player::setZone( uint32_t zoneId ) { - auto pTeriMgr = m_pFw->get< TerritoryMgr >(); + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); m_onEnterEventDone = false; - if( !pTeriMgr->movePlayer( zoneId, getAsPlayer() ) ) + if( !teriMgr.movePlayer( zoneId, getAsPlayer() ) ) { // todo: this will require proper handling, for now just return the player to their previous area m_pos = m_prevPos; m_rot = m_prevRot; m_territoryTypeId = m_prevTerritoryTypeId; - if( !pTeriMgr->movePlayer( m_territoryTypeId, getAsPlayer() ) ) + if( !teriMgr.movePlayer( m_territoryTypeId, getAsPlayer() ) ) return; } @@ -426,9 +445,9 @@ void Sapphire::Entity::Player::setZone( uint32_t zoneId ) bool Sapphire::Entity::Player::setInstance( uint32_t instanceContentId ) { m_onEnterEventDone = false; - auto pTeriMgr = m_pFw->get< TerritoryMgr >(); + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); - auto instance = pTeriMgr->getTerritoryByGuId( instanceContentId ); + auto instance = teriMgr.getTerritoryByGuId( instanceContentId ); if( !instance ) return false; @@ -441,7 +460,7 @@ bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance ) if( !instance ) return false; - auto pTeriMgr = m_pFw->get< TerritoryMgr >(); + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); auto currentZone = getCurrentTerritory(); // zoning within the same zone won't cause the prev data to be overwritten @@ -453,16 +472,16 @@ bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance ) m_prevTerritoryId = getTerritoryId(); } - return pTeriMgr->movePlayer( instance, getAsPlayer() ); + return teriMgr.movePlayer( instance, getAsPlayer() ); } -bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance, Common::FFXIVARR_POSITION3 pos ) +bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance, Common::FFXIVARR_POSITION3 pos, float rot ) { m_onEnterEventDone = false; if( !instance ) return false; - auto pTeriMgr = m_pFw->get< TerritoryMgr >(); + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); auto currentZone = getCurrentTerritory(); // zoning within the same zone won't cause the prev data to be overwritten @@ -474,34 +493,50 @@ bool Sapphire::Entity::Player::setInstance( TerritoryPtr instance, Common::FFXIV m_prevTerritoryId = getTerritoryId(); } - if( pTeriMgr->movePlayer( instance, getAsPlayer() ) ) + m_pos = pos; + m_rot = rot; + if( teriMgr.movePlayer( instance, getAsPlayer() ) ) { - m_pos = pos; return true; } + else + { + m_pos = m_prevPos; + m_rot= m_prevRot; + } return false; } bool Sapphire::Entity::Player::exitInstance() { - auto pTeriMgr = m_pFw->get< TerritoryMgr >(); + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); - auto pZone = getCurrentTerritory(); - auto pInstance = pZone->getAsInstanceContent(); + auto d = getCurrentTerritory()->getAsDirector(); + if( d && d->getContentFinderConditionId() > 0 ) + { + auto p = makeZonePacket< FFXIVDirectorUnk4 >( getId() ); + p->data().param[0] = d->getDirectorId(); + p->data().param[1] = 1534; + p->data().param[2] = 1; + p->data().param[3] = d->getContentFinderConditionId(); + queuePacket( p ); + + prepareZoning( 0, 1, 1, 0, 0, 1, 9 ); + } resetHp(); resetMp(); // check if housing zone - if( pTeriMgr->isHousingTerritory( m_prevTerritoryTypeId ) ) + if( teriMgr.isHousingTerritory( m_prevTerritoryTypeId ) ) { - if( !pTeriMgr->movePlayer( pTeriMgr->getZoneByLandSetId( m_prevTerritoryId ), getAsPlayer() ) ) + if( !teriMgr.movePlayer( teriMgr.getZoneByLandSetId( m_prevTerritoryId ), getAsPlayer() ) ) return false; } else { - if( !pTeriMgr->movePlayer( m_prevTerritoryTypeId, getAsPlayer() ) ) + if( !teriMgr.movePlayer( m_prevTerritoryTypeId, getAsPlayer() ) ) return false; } @@ -589,12 +624,17 @@ void Sapphire::Entity::Player::discover( int16_t map_id, int16_t sub_id ) // section to starts at 320 - 4 bytes long - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); int32_t offset = 4; - auto info = pExdData->get< Sapphire::Data::Map >( - pExdData->get< Sapphire::Data::TerritoryType >( getCurrentTerritory()->getTerritoryTypeId() )->map ); + auto info = exdData.get< Sapphire::Data::Map >( map_id ); + if ( !info ) + { + sendDebug( "discover(): Could not obtain map data for map_id == {0}", map_id ); + return; + } + if( info->discoveryArrayByte ) offset = 5 + 2 * info->discoveryIndex; else @@ -609,11 +649,32 @@ void Sapphire::Entity::Player::discover( int16_t map_id, int16_t sub_id ) uint16_t level = getLevel(); - uint32_t exp = ( pExdData->get< Sapphire::Data::ParamGrow >( level )->expToNext * 5 / 100 ); + uint32_t exp = ( exdData.get< Sapphire::Data::ParamGrow >( level )->expToNext * 5 / 100 ); gainExp( exp ); + // gain 10x additional EXP if entire map is completed + uint32_t mask = info->discoveryFlag; + uint32_t discoveredAreas; + if( info->discoveryArrayByte ) + { + discoveredAreas = ( m_discovery[ offset + 1 ] << 8 ) | + m_discovery[ offset ]; + } + else + { + discoveredAreas = ( m_discovery[ offset + 3 ] << 24 ) | + ( m_discovery[ offset + 2 ] << 16 ) | + ( m_discovery[ offset + 1 ] << 8 ) | + m_discovery[ offset ]; + } + bool allDiscovered = ( ( discoveredAreas & mask ) == mask ); + + if( allDiscovered ) + { + gainExp( exp * 10 ); + } } bool Sapphire::Entity::Player::isNewAdventurer() const @@ -670,7 +731,7 @@ void Sapphire::Entity::Player::learnSong( uint8_t songId, uint32_t itemId ) queuePacket( makeActorControlSelf( getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) ); } -bool Sapphire::Entity::Player::isActionLearned( uint8_t actionId ) const +bool Sapphire::Entity::Player::isActionLearned( uint32_t actionId ) const { uint16_t index; uint8_t value; @@ -681,30 +742,34 @@ bool Sapphire::Entity::Player::isActionLearned( uint8_t actionId ) const void Sapphire::Entity::Player::gainExp( uint32_t amount ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint32_t currentExp = getExp(); uint16_t level = getLevel(); - uint32_t neededExpToLevel = pExdData->get< Sapphire::Data::ParamGrow >( level )->expToNext; - - uint32_t neededExpToLevelplus1 = pExdData->get< Sapphire::Data::ParamGrow >( level + 1 )->expToNext; - - queuePacket( makeActorControlSelf( getId(), GainExpMsg, static_cast< uint8_t >( getClass() ), amount ) ); - - if( level >= Common::MAX_PLAYER_LEVEL ) // temporary fix for leveling over levelcap + if( level >= Common::MAX_PLAYER_LEVEL ) { - queuePacket( makeActorControlSelf( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); + setExp( 0 ); + if( currentExp != 0 ) + queuePacket( makeActorControlSelf( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), 0 ) ); return; } + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + + uint32_t neededExpToLevel = exdData.get< Sapphire::Data::ParamGrow >( level )->expToNext; + + uint32_t neededExpToLevelplus1 = exdData.get< Sapphire::Data::ParamGrow >( level + 1 )->expToNext; + + queuePacket( makeActorControlSelf( getId(), GainExpMsg, static_cast< uint8_t >( getClass() ), amount ) ); + if( ( currentExp + amount ) >= neededExpToLevel ) { // levelup amount = ( currentExp + amount - neededExpToLevel ) > neededExpToLevelplus1 ? neededExpToLevelplus1 - 1 : ( currentExp + amount - neededExpToLevel ); + if( level + 1 >= Common::MAX_PLAYER_LEVEL ) + amount = 0; setExp( amount ); gainLevel(); queuePacket( makeActorControlSelf( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); @@ -737,7 +802,6 @@ void Sapphire::Entity::Player::gainLevel() effectListPacket->data().level = getLevel(); effectListPacket->data().current_hp = getMaxHp(); effectListPacket->data().current_mp = getMaxMp(); - effectListPacket->data().currentTp = 1000; effectListPacket->data().max_hp = getMaxHp(); effectListPacket->data().max_mp = getMaxMp(); sendToInRangeSet( effectListPacket, true ); @@ -762,15 +826,15 @@ void Sapphire::Entity::Player::sendStatusUpdate() uint8_t Sapphire::Entity::Player::getLevel() const { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint8_t classJobIndex = pExdData->get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + uint8_t classJobIndex = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; return static_cast< uint8_t >( m_classArray[ classJobIndex ] ); } uint8_t Sapphire::Entity::Player::getLevelForClass( Common::ClassJob pClass ) const { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint8_t classJobIndex = pExdData->get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( pClass ) )->expArrayIndex; + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + uint8_t classJobIndex = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( pClass ) )->expArrayIndex; return static_cast< uint8_t >( m_classArray[ classJobIndex ] ); } @@ -782,15 +846,15 @@ bool Sapphire::Entity::Player::isClassJobUnlocked( Common::ClassJob classJob ) c uint32_t Sapphire::Entity::Player::getExp() const { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint8_t classJobIndex = pExdData->get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + uint8_t classJobIndex = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; return m_expArray[ classJobIndex ]; } void Sapphire::Entity::Player::setExp( uint32_t amount ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint8_t classJobIndex = pExdData->get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; + auto exdData = Common::Service< Data::ExdDataGenerated >::ref(); + uint8_t classJobIndex = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; m_expArray[ classJobIndex ] = amount; } @@ -827,19 +891,22 @@ void Sapphire::Entity::Player::setClassJob( Common::ClassJob classJob ) sendToInRangeSet( makeActorControl( getId(), ClassJobChange, 0x04 ), true ); sendStatusUpdate(); + + gaugeClear(); + sendActorGauge(); } void Sapphire::Entity::Player::setLevel( uint8_t level ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint8_t classJobIndex = pExdData->get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + uint8_t classJobIndex = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( getClass() ) )->expArrayIndex; m_classArray[ classJobIndex ] = level; } void Sapphire::Entity::Player::setLevelForClass( uint8_t level, Common::ClassJob classjob ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint8_t classJobIndex = pExdData->get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( classjob ) )->expArrayIndex; + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + uint8_t classJobIndex = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint8_t >( classjob ) )->expArrayIndex; if( m_classArray[ classJobIndex ] == 0 ) insertDbClass( classJobIndex ); @@ -981,8 +1048,8 @@ const uint8_t* Sapphire::Entity::Player::getStateFlags() const bool Sapphire::Entity::Player::actionHasCastTime( uint32_t actionId ) //TODO: Add logic for special cases { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - auto actionInfoPtr = pExdData->get< Sapphire::Data::Action >( actionId ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto actionInfoPtr = exdData.get< Sapphire::Data::Action >( actionId ); if( actionInfoPtr->preservesCombo ) return false; @@ -1087,8 +1154,6 @@ void Sapphire::Entity::Player::update( uint64_t tickCount ) if( !isAlive() ) return; - updateStatusEffects(); - m_lastUpdate = tickCount; if( !checkAction() ) @@ -1135,8 +1200,8 @@ void Sapphire::Entity::Player::update( uint64_t tickCount ) void Sapphire::Entity::Player::onMobKill( uint16_t nameId ) { - auto pScriptMgr = m_pFw->get< Scripting::ScriptMgr >(); - pScriptMgr->onBNpcKill( *getAsPlayer(), nameId ); + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); + scriptMgr.onBNpcKill( *getAsPlayer(), nameId ); if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) ) { @@ -1222,6 +1287,17 @@ const uint8_t* Sapphire::Entity::Player::getMountGuideBitmask() const return m_mountGuide; } +const bool Sapphire::Entity::Player::hasMount( uint32_t mountId ) const +{ + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto mount = exdData.get< Data::Mount >( mountId ); + + if( mount->order == -1 || mount->modelChara == 0 ) + return false; + + return m_mountGuide[ mount->order / 8 ] & ( 1 << ( mount->order % 8 ) ); +} + uint64_t Sapphire::Entity::Player::getContentId() const { return m_contentId; @@ -1244,8 +1320,8 @@ const uint8_t* Sapphire::Entity::Player::getGcRankArray() const void Sapphire::Entity::Player::queuePacket( Network::Packets::FFXIVPacketBasePtr pPacket ) { - auto pServerZone = m_pFw->get< World::ServerMgr >(); - auto pSession = pServerZone->getSession( m_id ); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + auto pSession = serverMgr.getSession( m_id ); if( !pSession ) return; @@ -1259,8 +1335,8 @@ void Sapphire::Entity::Player::queuePacket( Network::Packets::FFXIVPacketBasePtr void Sapphire::Entity::Player::queueChatPacket( Network::Packets::FFXIVPacketBasePtr pPacket ) { - auto pServerZone = m_pFw->get< World::ServerMgr >(); - auto pSession = pServerZone->getSession( m_id ); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + auto pSession = serverMgr.getSession( m_id ); if( !pSession ) return; @@ -1288,6 +1364,7 @@ void Sapphire::Entity::Player::performZoning( uint16_t zoneId, const Common::FFX m_bMarkedForZoning = true; setRot( rotation ); setZone( zoneId ); + clearBuyBackMap(); } bool Sapphire::Entity::Player::isMarkedForZoning() const @@ -1501,32 +1578,43 @@ uint8_t Sapphire::Entity::Player::getEquipDisplayFlags() const void Sapphire::Entity::Player::mount( uint32_t id ) { - m_mount = id; - sendToInRangeSet( makeActorControl( getId(), ActorControlType::SetStatus, - static_cast< uint8_t >( Common::ActorStatus::Mounted ) ), true ); - sendToInRangeSet( makeActorControlSelf( getId(), 0x39e, 12 ), true ); //? + if( id > 0 ) + { + m_mount = id; + sendToInRangeSet( makeActorControl( getId(), ActorControlType::SetStatus, + static_cast< uint8_t >( Common::ActorStatus::Mounted ) ), true ); + sendToInRangeSet( makeActorControlSelf( getId(), ActorControlType::SetMountSpeed, 12 ), true ); + sendToInRangeSet( makeActorControlSelf( getId(), 0x107, 1 ), true ); - auto mountPacket = makeZonePacket< FFXIVIpcMount >( getId() ); - mountPacket->data().id = id; - sendToInRangeSet( mountPacket, true ); + auto mountPacket = makeZonePacket< FFXIVIpcMount >( getId() ); + mountPacket->data().id = id; + sendToInRangeSet( mountPacket, true ); + } } void Sapphire::Entity::Player::dismount() { - sendToInRangeSet( makeActorControl( getId(), ActorControlType::SetStatus, - static_cast< uint8_t >( Common::ActorStatus::Idle ) ), true ); - sendToInRangeSet( makeActorControlSelf( getId(), ActorControlType::Dismount, 1 ), true ); - m_mount = 0; + if( m_mount > 0 ) + { + sendToInRangeSet( makeActorControl( getId(), ActorControlType::SetStatus, + static_cast< uint8_t >( Common::ActorStatus::Idle ) ), true ); + sendToInRangeSet( makeActorControl( getId(), ActorControlType::Dismount, 1 ), true ); + sendToInRangeSet( makeActorControlSelf( getId(), 0x393, 1 ), true ); + sendToInRangeSet( makeActorControlSelf( getId(), 0x107, 0 ), true ); + m_mount = 0; + } } void Sapphire::Entity::Player::spawnCompanion( uint16_t id ) { - auto exdData = m_pFw->get< Data::ExdDataGenerated >(); - assert( exdData ); + if( id > 0 ) + { + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); - auto companion = exdData->get< Data::Companion >( id ); - if( !id ) - return; + auto companion = exdData.get< Data::Companion >( id ); + if( !companion ) + return; + } m_companionId = id; sendToInRangeSet( makeActorControl( getId(), ActorControlType::ToggleCompanion, id ), true ); @@ -1537,7 +1625,7 @@ uint16_t Sapphire::Entity::Player::getCurrentCompanion() const return m_companionId; } -uint8_t Sapphire::Entity::Player::getCurrentMount() const +uint16_t Sapphire::Entity::Player::getCurrentMount() const { return m_mount; } @@ -1561,8 +1649,8 @@ void Sapphire::Entity::Player::autoAttack( CharaPtr pTarget ) //uint64_t tick = Util::getTimeMs(); //srand(static_cast< uint32_t >(tick)); - auto pRNGMgr = m_pFw->get< World::Manager::RNGMgr >(); - auto variation = static_cast< uint32_t >( pRNGMgr->getRandGenerator< float >( 0, 3 ).next() ); + auto& RNGMgr = Common::Service< World::Manager::RNGMgr >::ref(); + auto variation = static_cast< uint32_t >( RNGMgr.getRandGenerator< float >( 0, 3 ).next() ); auto damage = Math::CalcStats::calcAutoAttackDamage( *this ); @@ -1572,10 +1660,10 @@ void Sapphire::Entity::Player::autoAttack( CharaPtr pTarget ) effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); Common::EffectEntry entry{}; - entry.value = damage; + entry.value = damage.first; entry.effectType = Common::ActionEffectType::Damage; - entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; - entry.param = 0x72; + entry.param0 = static_cast< uint8_t >( damage.second ); + entry.param2 = 0x72; effectPacket->addEffect( entry ); @@ -1587,10 +1675,10 @@ void Sapphire::Entity::Player::autoAttack( CharaPtr pTarget ) effectPacket->setRotation( Util::floatToUInt16Rot( getRot() ) ); Common::EffectEntry entry{}; - entry.value = damage; + entry.value = damage.first; entry.effectType = Common::ActionEffectType::Damage; - entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; - entry.param = 0x73; + entry.param0 = static_cast< uint8_t >( damage.second ); + entry.param2 = 0x73; effectPacket->addEffect( entry ); @@ -1598,7 +1686,7 @@ void Sapphire::Entity::Player::autoAttack( CharaPtr pTarget ) } - pTarget->takeDamage( damage ); + pTarget->takeDamage( damage.first ); } @@ -1676,8 +1764,8 @@ void Sapphire::Entity::Player::sendZonePackets() if( isLogin() ) { //Update player map in servermgr - in case player name has been changed - auto pServerMgr = m_pFw->get< World::ServerMgr >(); - pServerMgr->updatePlayerName( getId(), getName() ); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + serverMgr.updatePlayerName( getId(), getName() ); } getCurrentTerritory()->onBeforePlayerZoneIn( *this ); @@ -1697,14 +1785,14 @@ void Sapphire::Entity::Player::sendZonePackets() //setStateFlag( PlayerStateFlag::BetweenAreas ); //setStateFlag( PlayerStateFlag::BetweenAreas1 ); - if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) ) - sendHuntingLog(); - sendStats(); // only initialize the UI if the player in fact just logged in. if( isLogin() ) { + if( isActionLearned( static_cast< uint8_t >( Common::UnlockEntry::HuntingLog ) ) ) + sendHuntingLog(); + auto contentFinderList = makeZonePacket< FFXIVIpcCFAvailableContents >( getId() ); for( auto i = 0; i < sizeof( contentFinderList->data().contents ); i++ ) @@ -1727,8 +1815,8 @@ void Sapphire::Entity::Player::sendZonePackets() sendItemLevel(); } - auto pHousingMgr = m_pFw->get< HousingMgr >(); - if( Sapphire::LandPtr pLand = pHousingMgr->getLandByOwnerId( getId() ) ) + auto& housingMgr = Common::Service< HousingMgr >::ref(); + if( Sapphire::LandPtr pLand = housingMgr.getLandByOwnerId( getId() ) ) { uint32_t state = 0; @@ -1754,6 +1842,12 @@ void Sapphire::Entity::Player::sendZonePackets() initZonePacket->data().pos.x = getPos().x; initZonePacket->data().pos.y = getPos().y; initZonePacket->data().pos.z = getPos().z; + if( auto d = getCurrentTerritory()->getAsDirector() ) + { + initZonePacket->data().contentfinderConditionId = d->getContentFinderConditionId(); + initZonePacket->data().bitmask = 0xFF; + initZonePacket->data().bitmask1 = 0x2A; + } queuePacket( initZonePacket ); getCurrentTerritory()->onPlayerZoneIn( *this ); @@ -1808,6 +1902,8 @@ Sapphire::Entity::Player::sendZoneInPackets( uint32_t param1, uint32_t param2 = setZoningType( Common::ZoneingType::None ); unsetStateFlag( PlayerStateFlag::BetweenAreas ); + + Common::Service< MapMgr >::ref().updateAll( *this ); } void Sapphire::Entity::Player::finishZoning() @@ -1855,14 +1951,14 @@ void Sapphire::Entity::Player::emoteInterrupt() void Sapphire::Entity::Player::teleportQuery( uint16_t aetheryteId ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); // TODO: only register this action if enough gil is in possession - auto targetAetheryte = pExdData->get< Sapphire::Data::Aetheryte >( aetheryteId ); + auto targetAetheryte = exdData.get< Sapphire::Data::Aetheryte >( aetheryteId ); if( targetAetheryte ) { - auto fromAetheryte = pExdData->get< Sapphire::Data::Aetheryte >( - pExdData->get< Sapphire::Data::TerritoryType >( getZoneId() )->aetheryte ); + auto fromAetheryte = exdData.get< Sapphire::Data::Aetheryte >( + exdData.get< Sapphire::Data::TerritoryType >( getZoneId() )->aetheryte ); // calculate cost - does not apply for favorite points or homepoints neither checks for aether tickets auto cost = static_cast< uint16_t > ( @@ -1916,6 +2012,36 @@ uint8_t Sapphire::Entity::Player::getNextObjSpawnIndexForActorId( uint32_t actor return index; } +void Sapphire::Entity::Player::setDyeingInfo( uint32_t itemToDyeContainer, uint32_t itemToDyeSlot, uint32_t dyeBagContainer, uint32_t dyeBagSlot ) +{ + m_dyeingInfo.itemToDyeContainer = itemToDyeContainer; + m_dyeingInfo.itemToDyeSlot = itemToDyeSlot; + m_dyeingInfo.dyeBagContainer = dyeBagContainer; + m_dyeingInfo.dyeBagSlot = dyeBagSlot; +} + +void Sapphire::Entity::Player::dyeItemFromDyeingInfo() +{ + uint32_t itemToDyeContainer = m_dyeingInfo.itemToDyeContainer; + uint32_t itemToDyeSlot = m_dyeingInfo.itemToDyeSlot; + uint32_t dyeBagContainer = m_dyeingInfo.dyeBagContainer; + uint32_t dyeBagSlot = m_dyeingInfo.dyeBagSlot; + + sendStateFlags(); // Retail sends all 0s to unlock player after a dye? Possibly not setting a flag when the action is started in the backend..? + auto itemToDye = getItemAt( itemToDyeContainer, itemToDyeSlot ); + auto dyeToUse = getItemAt( dyeBagContainer, dyeBagSlot ); + + if ( !itemToDye || !dyeToUse ) return; + + uint32_t stainColorID = dyeToUse->getAdditionalData(); + itemToDye->setStain( stainColorID ); + + // TODO: subtract/remove dye used + + insertInventoryItem( static_cast< Sapphire::Common::InventoryType >( itemToDyeContainer ), static_cast< uint16_t >( itemToDyeSlot ), itemToDye ); + updateItemDb( itemToDye ); +} + void Sapphire::Entity::Player::resetObjSpawnIndex() { m_objSpawnIndexAllocator.freeAllSpawnIndexes(); @@ -2006,7 +2132,7 @@ Sapphire::Common::HuntingLogEntry& Sapphire::Entity::Player::getHuntingLogEntry( void Sapphire::Entity::Player::sendHuntingLog() { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); uint8_t count = 0; for( const auto& entry : m_huntingLogEntries ) { @@ -2023,7 +2149,7 @@ void Sapphire::Entity::Player::sendHuntingLog() bool allComplete = true; auto monsterNoteId = ( count + 1 ) * 10000 + entry.rank * 10 + i; - auto monsterNote = pExdData->get< Data::MonsterNote >( monsterNoteId ); + auto monsterNote = exdData.get< Data::MonsterNote >( monsterNoteId ); if( !monsterNote ) continue; @@ -2052,7 +2178,7 @@ void Sapphire::Entity::Player::updateHuntingLog( uint16_t id ) { std::vector< uint32_t > rankRewards{ 2500, 10000, 20000, 30000, 40000 }; const auto maxRank = 4; - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); + auto& pExdData = Common::Service< Data::ExdDataGenerated >::ref(); auto& logEntry = m_huntingLogEntries[ static_cast< uint8_t >( getClass() ) - 1 ]; @@ -2060,7 +2186,7 @@ void Sapphire::Entity::Player::updateHuntingLog( uint16_t id ) // make sure we get the matching base-class if a job is being used auto currentClass = static_cast< uint8_t >( getClass() ); - auto classJobInfo = pExdData->get< Sapphire::Data::ClassJob >( currentClass ); + auto classJobInfo = pExdData.get< Sapphire::Data::ClassJob >( currentClass ); if( !classJobInfo ) return; @@ -2070,7 +2196,7 @@ void Sapphire::Entity::Player::updateHuntingLog( uint16_t id ) bool sectionComplete = true; bool sectionChanged = false; uint32_t monsterNoteId = static_cast< uint32_t >( classJobInfo->classJobParent * 10000 + logEntry.rank * 10 + i ); - auto note = pExdData->get< Sapphire::Data::MonsterNote >( monsterNoteId ); + auto note = pExdData.get< Sapphire::Data::MonsterNote >( monsterNoteId ); // for classes that don't have entries, if the first fails the rest will fail if( !note ) @@ -2078,7 +2204,7 @@ void Sapphire::Entity::Player::updateHuntingLog( uint16_t id ) for( auto x = 0; x < 4; ++x ) { - auto note1 = pExdData->get< Sapphire::Data::MonsterNoteTarget >( note->monsterNoteTarget[ x ] ); + auto note1 = pExdData.get< Sapphire::Data::MonsterNoteTarget >( note->monsterNoteTarget[ x ] ); if( note1->bNpcName == id && logEntry.entries[ i - 1 ][ x ] < note->count[ x ] ) { logEntry.entries[ i - 1 ][ x ]++; @@ -2131,3 +2257,85 @@ Sapphire::Common::ActiveLand Sapphire::Entity::Player::getActiveLand() const { return m_activeLand; } + +bool Sapphire::Entity::Player::hasQueuedAction() const +{ + return m_pQueuedAction != nullptr; +} + +void Sapphire::Entity::Player::setQueuedAction( Sapphire::World::Action::ActionPtr pAction ) +{ + m_pQueuedAction = std::move( pAction ); // overwrite previous queued action if any +} + +bool Sapphire::Entity::Player::checkAction() +{ + if( m_pCurrentAction == nullptr ) + return false; + + if( m_pCurrentAction->update() ) + { + if( m_pCurrentAction->isInterrupted() && m_pCurrentAction->getInterruptType() != Common::ActionInterruptType::DamageInterrupt ) + { + // we moved (or whatever not damage interrupt) so we don't want to execute queued cast + m_pQueuedAction = nullptr; + } + m_pCurrentAction = nullptr; + + if( hasQueuedAction() ) + { + sendDebug( "Queued skill start: {0}", m_pQueuedAction->getId() ); + if( m_pQueuedAction->hasCastTime() ) + { + setCurrentAction( m_pQueuedAction ); + } + m_pQueuedAction->start(); + m_pQueuedAction = nullptr; + } + } + + return true; +} + +std::vector< Sapphire::Entity::ShopBuyBackEntry >& Sapphire::Entity::Player::getBuyBackListForShop( uint32_t shopId ) +{ + return m_shopBuyBackMap[ shopId ]; +} + +void Sapphire::Entity::Player::addBuyBackItemForShop( uint32_t shopId, const Sapphire::Entity::ShopBuyBackEntry& entry ) +{ + auto& list = m_shopBuyBackMap[ shopId ]; + list.insert( list.begin(), entry ); +} + +void Sapphire::Entity::Player::clearBuyBackMap() +{ + for( auto& list : m_shopBuyBackMap ) + { + for( auto& entry : list.second ) + { + deleteItemDb( entry.item ); + } + } + m_shopBuyBackMap.clear(); +} + +void Sapphire::Entity::Player::gaugeClear() +{ + std::memset( &m_gauge, 0, sizeof( m_gauge ) ); +} + +void Sapphire::Entity::Player::sendActorGauge() +{ + auto pPacket = makeZonePacket< FFXIVIpcActorGauge >( getId() ); + pPacket->data().classJobId = static_cast< uint8_t >( getClass() ); + std::memcpy( pPacket->data().data, &m_gauge, 15 ); + + queuePacket( pPacket ); +} + +void Sapphire::Entity::Player::gaugeSetRaw( uint8_t* pData ) +{ + std::memcpy( &m_gauge, pData, 15 ); + sendActorGauge(); +} \ No newline at end of file diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index efaf1f7d..d5cfcce6 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -33,6 +33,13 @@ namespace Sapphire::Entity } }; + struct ShopBuyBackEntry + { + ItemPtr item; + uint32_t amount; + uint32_t pricePerItem; + }; + /** Class representing the Player * Inheriting from Actor * @@ -41,7 +48,7 @@ namespace Sapphire::Entity { public: /*! Contructor */ - Player( FrameworkPtr pFw ); + Player(); /*! Destructor */ ~Player(); @@ -67,7 +74,7 @@ namespace Sapphire::Entity /*! play a subevent */ void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); - void playGilShop( uint32_t eventId, uint32_t flags, + void playGilShop( uint32_t eventId, uint32_t flags, uint32_t param1, Event::EventHandler::SceneReturnCallback eventCallback ); void directorPlayScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam3, @@ -104,6 +111,8 @@ namespace Sapphire::Entity void playSceneChain( uint32_t eventId, uint32_t scene, uint32_t flags, Event::EventHandler::SceneChainCallback sceneChainCallback ); + void playScene16( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t param3, std::vector< uint32_t > paramList, Event::EventHandler::SceneReturnCallback eventReturnCallback ); + /*! setup the event and return a ptr to it */ Event::EventHandlerPtr bootstrapSceneEvent( uint32_t eventId, uint32_t flags ); @@ -185,6 +194,8 @@ namespace Sapphire::Entity /*! remove a given quest */ void removeQuest( uint16_t questId ); + bool isQuestCompleted( uint16_t questId ); + /*! add a quest to the completed quests mask */ void updateQuestsCompleted( uint32_t questId ); @@ -353,7 +364,7 @@ namespace Sapphire::Entity uint32_t getModelForSlot( Common::GearModelSlot slot ); /*! add amount to the currency of type */ - void addCurrency( Common::CurrencyType type, uint32_t amount ); + void addCurrency( Common::CurrencyType type, uint32_t amount, bool sendLootMessage = false ); /*! remove amount from the currency of type */ void removeCurrency( Common::CurrencyType type, uint32_t amount ); @@ -483,7 +494,7 @@ namespace Sapphire::Entity bool setInstance( TerritoryPtr instance ); /*! sets the players instance & initiates zoning process */ - bool setInstance( Sapphire::TerritoryPtr instance, Sapphire::Common::FFXIVARR_POSITION3 pos ); + bool setInstance( Sapphire::TerritoryPtr instance, Sapphire::Common::FFXIVARR_POSITION3 pos, float rot ); /*! returns the player to their position before zoning into an instance */ bool exitInstance(); @@ -536,8 +547,11 @@ namespace Sapphire::Entity void clearTeleportQuery(); + void setDyeingInfo( uint32_t itemToDyeContainer, uint32_t itemToDyeSlot, uint32_t dyeBagContainer, uint32_t dyeBagSlot ); + void dyeItemFromDyeingInfo(); + /*! prepares zoning / fades out the screen */ - void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime = 0, uint16_t animation = 0 ); + void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime = 0, uint16_t animation = 0, uint8_t param4 = 0, uint8_t param7 = 0, uint8_t unknown = 0 ); /*! get player's title list (available titles) */ uint8_t* getTitleList(); @@ -574,7 +588,7 @@ namespace Sapphire::Entity uint16_t getCurrentCompanion() const; /*! get the current mount */ - uint8_t getCurrentMount() const; + uint16_t getCurrentMount() const; /*! set current persistent emote */ void setPersistentEmote( uint32_t emoteId ); @@ -632,7 +646,7 @@ namespace Sapphire::Entity void learnSong( uint8_t songId, uint32_t itemId ); /*! check if an action is already unlocked in the bitmask. */ - bool isActionLearned( uint8_t actionId ) const; + bool isActionLearned( uint32_t actionId ) const; /*! return a const pointer to the unlock bitmask array */ const uint8_t* getUnlockBitmask() const; @@ -643,6 +657,13 @@ namespace Sapphire::Entity /*! return a const pointer to the mount guide bitmask array */ const uint8_t* getMountGuideBitmask() const; + const bool hasMount( uint32_t mountId ) const; + + bool checkAction() override; + + bool hasQueuedAction() const; + + void setQueuedAction( World::Action::ActionPtr pAction ); // Spawn handling ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -905,15 +926,14 @@ namespace Sapphire::Entity using InvSlotPair = std::pair< uint16_t, int8_t >; using InvSlotPairVec = std::vector< InvSlotPair >; - ItemPtr createItem( uint32_t catalogId, uint32_t quantity = 1 ); - bool loadInventory(); InvSlotPairVec getSlotsOfItemsInInventory( uint32_t catalogId ); InvSlotPair getFreeBagSlot(); - Sapphire::ItemPtr addItem( uint32_t catalogId, uint32_t quantity = 1, bool isHq = false, bool slient = false ); + ItemPtr addItem( uint32_t catalogId, uint32_t quantity = 1, bool isHq = false, bool silent = false, bool canMerge = true, bool sendLootMessage = false ); + ItemPtr addItem( ItemPtr itemToAdd, bool silent = false, bool canMerge = true, bool sendLootMessage = false ); void moveItem( uint16_t fromInventoryId, uint8_t fromSlotId, uint16_t toInventoryId, uint8_t toSlot ); @@ -928,19 +948,24 @@ namespace Sapphire::Entity ItemPtr getItemAt( uint16_t containerId, uint8_t slotId ); - bool updateContainer( uint16_t storageId, uint8_t slotId, ItemPtr pItem ); + bool updateContainer( uint16_t storageId, uint8_t slotId, ItemPtr pItem, bool writeToDb = true ); /*! calculate and return player ilvl based off equipped gear */ uint16_t calculateEquippedGearItemLevel(); ItemPtr getEquippedWeapon(); + ItemPtr getEquippedSecondaryWeapon(); /*! return the current amount of currency of type */ uint32_t getCurrency( Common::CurrencyType type ); void writeInventory( Common::InventoryType type ); - void writeItem( ItemPtr pItem ) const; + ItemPtr createTempItem( uint32_t catalogId, uint32_t quantity = 1 ); + + void updateItemDb( ItemPtr pItem ) const; + + void writeItemDb( ItemPtr pItem ) const; void deleteItemDb( ItemPtr pItem ) const; @@ -948,7 +973,7 @@ namespace Sapphire::Entity uint32_t getCrystal( Common::CrystalType type ); /*! add amount to the crystal of type */ - void addCrystal( Common::CrystalType type, uint32_t amount ); + void addCrystal( Common::CrystalType type, uint32_t amount, bool sendLootMessage = false ); /*! remove amount from the crystals of type */ void removeCrystal( Common::CrystalType type, uint32_t amount ); @@ -964,10 +989,18 @@ namespace Sapphire::Entity void setActiveLand( uint8_t land, uint8_t ward ); Common::ActiveLand getActiveLand() const; - Sapphire::ItemPtr dropInventoryItem( Common::InventoryType type, uint16_t slotId ); + Sapphire::ItemPtr dropInventoryItem( Common::InventoryType type, uint16_t slotId, bool silent = false ); + + // Job UI + ////////////////////////////////////////////////////////////////////////////////////////////////////// + void gaugeClear(); + void sendActorGauge(); + void gaugeSetRaw( uint8_t* pData ); ////////////////////////////////////////////////////////////////////////////////////////////////////// + void setPosAndNotifyClient( float x, float y, float z, float rot ); + Common::HuntingLogEntry& getHuntingLogEntry( uint8_t index ); void sendHuntingLog(); @@ -981,6 +1014,11 @@ namespace Sapphire::Entity uint64_t m_lastMoveTime; uint8_t m_lastMoveflag; bool m_falling; + uint16_t m_cfNotifiedContent; + + std::vector< ShopBuyBackEntry >& getBuyBackListForShop( uint32_t shopId ); + void addBuyBackItemForShop( uint32_t shopId, const ShopBuyBackEntry& entry ); + void clearBuyBackMap(); private: uint32_t m_lastWrite; @@ -1002,6 +1040,8 @@ namespace Sapphire::Entity uint32_t m_inventorySequence; + World::Action::ActionPtr m_pQueuedAction; + private: using InventoryMap = std::map< uint16_t, Sapphire::ItemContainerPtr >; @@ -1037,17 +1077,17 @@ namespace Sapphire::Entity uint16_t m_activeTitle; uint8_t m_titleList[48]; uint8_t m_howTo[34]; - uint8_t m_minions[40]; - uint8_t m_mountGuide[19]; + uint8_t m_minions[55]; + uint8_t m_mountGuide[29]; uint8_t m_homePoint; uint8_t m_startTown; uint16_t m_townWarpFstFlags; - uint8_t m_questCompleteFlags[476]; + uint8_t m_questCompleteFlags[487]; uint8_t m_discovery[445]; uint32_t m_playTime; - uint16_t m_classArray[28]; - uint32_t m_expArray[28]; + uint16_t m_classArray[ Common::CLASSJOB_SLOTS ]; + uint32_t m_expArray[ Common::CLASSJOB_SLOTS ]; uint8_t m_aetheryte[21]; uint8_t m_unlocks[64]; uint8_t m_orchestrion[40]; @@ -1076,6 +1116,8 @@ namespace Sapphire::Entity bool m_bLoadingComplete; bool m_bAutoattack; + Common::JobGauge m_gauge; + Common::ZoneingType m_zoningType; uint32_t m_territoryId; @@ -1107,11 +1149,19 @@ namespace Sapphire::Entity Common::PlayerTeleportQuery m_teleportQuery; + struct PlayerDyeingInfo + { + uint32_t itemToDyeContainer; + uint32_t itemToDyeSlot; + uint32_t dyeBagContainer; + uint32_t dyeBagSlot; + } m_dyeingInfo; + Common::Util::SpawnIndexAllocator< uint8_t > m_objSpawnIndexAllocator; Common::Util::SpawnIndexAllocator< uint8_t > m_actorSpawnIndexAllocator; std::array< Common::HuntingLogEntry, 12 > m_huntingLogEntries; - + std::unordered_map< uint32_t, std::vector< ShopBuyBackEntry > > m_shopBuyBackMap; }; } diff --git a/src/world/Actor/PlayerEvent.cpp b/src/world/Actor/PlayerEvent.cpp index b4fb05a1..eb9659e0 100644 --- a/src/world/Actor/PlayerEvent.cpp +++ b/src/world/Actor/PlayerEvent.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "Network/GameConnection.h" #include "Network/PacketWrappers/ActorControlPacket.h" @@ -11,9 +12,9 @@ #include "Network/PacketWrappers/EventFinishPacket.h" #include "Network/PacketWrappers/DirectorPlayScenePacket.h" +#include "Inventory/Item.h" #include "Territory/Territory.h" #include "ServerMgr.h" -#include "Framework.h" #include "Action/EventAction.h" @@ -130,7 +131,7 @@ void Sapphire::Entity::Player::playScene( uint32_t eventId, uint32_t scene, playScene( eventId, scene, flags, eventParam2, eventParam3, 0, eventCallback ); } -void Sapphire::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, +void Sapphire::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, uint32_t param1, Event::EventHandler::SceneReturnCallback eventCallback ) { auto pEvent = bootstrapSceneEvent( eventId, flags ); @@ -141,10 +142,56 @@ void Sapphire::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, pEvent->setEventReturnCallback( eventCallback ); pEvent->setSceneChainCallback( nullptr ); - auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); + auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventPlay255 >( getId() ); openGilShopPacket->data().eventId = eventId; openGilShopPacket->data().sceneFlags = flags; openGilShopPacket->data().actorId = getId(); + switch( param1 ) + { + case 0: + { + openGilShopPacket->data().paramSize = 0xA1; + break; + } + case 1: + { + openGilShopPacket->data().paramSize = 0x02; + openGilShopPacket->data().params[ 0 ] = 1; + openGilShopPacket->data().params[ 1 ] = 0x64; + break; + } + case 2: + { + openGilShopPacket->data().paramSize = 0xA2; + openGilShopPacket->data().params[ 0 ] = 2; + break; + } + case 3: + { + openGilShopPacket->data().paramSize = 0xA2; + openGilShopPacket->data().params[ 0 ] = 3; + openGilShopPacket->data().params[ 1 ] = 0x64; + break; + } + } + + auto& buyBackList = getBuyBackListForShop( eventId ); + int index = param1 == 0 ? 1 : 2; + for( auto& entry : buyBackList ) + { + if( index >= openGilShopPacket->data().paramSize ) + break; + openGilShopPacket->data().params[ index++ ] = entry.item->getId(); + openGilShopPacket->data().params[ index++ ] = entry.amount; + openGilShopPacket->data().params[ index++ ] = entry.pricePerItem; + index += 2; + openGilShopPacket->data().params[ index++ ] = eventId; + index += 2; + openGilShopPacket->data().params[ index++ ] = ( ( entry.item->getDurability() << 16 ) + static_cast< uint16_t >( entry.item->isHq() ? 1 : 0 ) ); + openGilShopPacket->data().params[ index++ ] = ( ( entry.item->getStain() << 16 ) + entry.item->getSpiritbond() ); + openGilShopPacket->data().params[ index++ ] = 0; // glamour + index += 5; + } openGilShopPacket->data().scene = 10; @@ -276,6 +323,33 @@ void Sapphire::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlaye unsetStateFlag( PlayerStateFlag::InNpcEvent ); } +void Sapphire::Entity::Player::playScene16( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t param3, std::vector< uint32_t > paramList, Event::EventHandler::SceneReturnCallback eventReturnCallback ) +{ + auto pEvent = bootstrapSceneEvent( eventId, flags ); + if( !pEvent ) + return; + + pEvent->setPlayedScene( true ); + pEvent->setEventReturnCallback( eventReturnCallback ); + pEvent->setSceneChainCallback( nullptr ); + auto eventPlay16 = makeZonePacket< FFXIVIpcEventPlay16 >( getId() ); + eventPlay16->data().actorId = pEvent->getActorId(); + eventPlay16->data().eventId = pEvent->getId(); + eventPlay16->data().scene = scene; + eventPlay16->data().flags = flags; + eventPlay16->data().param3 = param3; + eventPlay16->data().paramSize = paramList.size(); + int i = 0; + for( auto p : paramList ) + { + assert( i < 16 ); + eventPlay16->data().param[ i ] = paramList.at( i ); + i++; + } + + queuePacket( eventPlay16 ); +} + void Sapphire::Entity::Player::eventActionStart( uint32_t eventId, uint32_t action, World::Action::ActionCallback finishCallback, @@ -283,7 +357,7 @@ void Sapphire::Entity::Player::eventActionStart( uint32_t eventId, uint64_t additional ) { auto pEventAction = World::Action::make_EventAction( getAsChara(), eventId, action, - finishCallback, interruptCallback, additional, m_pFw ); + finishCallback, interruptCallback, additional ); auto pEvent = getEvent( eventId ); @@ -325,8 +399,9 @@ void Sapphire::Entity::Player::eventItemActionStart( uint32_t eventId, void Sapphire::Entity::Player::onLogin() { - auto pServerMgr = m_pFw->get< Sapphire::World::ServerMgr >(); - auto motd = pServerMgr->getConfig().motd; + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + + auto motd = serverMgr.getConfig().motd; std::istringstream ss( motd ); std::string msg; @@ -354,7 +429,7 @@ void Sapphire::Entity::Player::onDeath() // TODO: slightly ugly here and way too static. Needs too be done properly void Sapphire::Entity::Player::onTick() { - + Chara::onTick(); // add 3 seconds to total play time m_playTime += 3; diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 211d2f40..5ead207c 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -14,7 +14,6 @@ #include "Player.h" -#include "Framework.h" #include @@ -30,8 +29,7 @@ #include "Manager/InventoryMgr.h" #include "Manager/ItemMgr.h" -#include "Framework.h" -#include +#include using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; @@ -43,7 +41,7 @@ void Sapphire::Entity::Player::initInventory() { auto setupContainer = [ this ]( InventoryType type, uint8_t maxSize, const std::string& tableName, bool isMultiStorage, bool isPersistentStorage = true ) - { m_storageMap[ type ] = make_ItemContainer( type, maxSize, tableName, isMultiStorage, m_pFw, isPersistentStorage ); }; + { m_storageMap[ type ] = make_ItemContainer( type, maxSize, tableName, isMultiStorage, isPersistentStorage ); }; // main bags setupContainer( Bag0, 34, "charaiteminventory", true ); @@ -114,13 +112,11 @@ void Sapphire::Entity::Player::sendItemLevel() void Sapphire::Entity::Player::equipWeapon( ItemPtr pItem, bool updateClass ) { - auto exdData = m_pFw->get< Sapphire::Data::ExdDataGenerated >(); - if( !exdData ) - return; + auto& exdData = Common::Service< Sapphire::Data::ExdDataGenerated >::ref(); - auto itemInfo = exdData->get< Sapphire::Data::Item >( pItem->getId() ); + auto itemInfo = exdData.get< Sapphire::Data::Item >( pItem->getId() ); auto itemClassJob = itemInfo->classJobUse; - auto classJobInfo = exdData->get< Sapphire::Data::ClassJob >( static_cast< uint32_t >( getClass() ) ); + auto classJobInfo = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint32_t >( getClass() ) ); auto currentParentClass = static_cast< ClassJob >( classJobInfo->classJobParent ); auto newClassJob = static_cast< ClassJob >( itemClassJob ); @@ -135,11 +131,9 @@ void Sapphire::Entity::Player::equipWeapon( ItemPtr pItem, bool updateClass ) void Sapphire::Entity::Player::equipSoulCrystal( ItemPtr pItem, bool updateJob ) { - auto exdData = m_pFw->get< Sapphire::Data::ExdDataGenerated >(); - if ( !exdData ) - return; + auto& exdData = Common::Service< Sapphire::Data::ExdDataGenerated >::ref(); - auto itemInfo = exdData->get< Sapphire::Data::Item >( pItem->getId() ); + auto itemInfo = exdData.get< Sapphire::Data::Item >( pItem->getId() ); auto itemClassJob = itemInfo->classJobUse; auto newClassJob = static_cast< ClassJob >( itemClassJob ); @@ -296,17 +290,15 @@ void Sapphire::Entity::Player::unequipItem( Common::GearSetSlot equipSlotId, Ite void Sapphire::Entity::Player::unequipSoulCrystal( ItemPtr pItem ) { - auto exdData = m_pFw->get< Sapphire::Data::ExdDataGenerated >(); - if ( !exdData ) - return; + auto& exdData = Common::Service< Sapphire::Data::ExdDataGenerated >::ref(); - auto currentClassJob = exdData->get< Sapphire::Data::ClassJob >( static_cast< uint32_t >( getClass() ) ); + auto currentClassJob = exdData.get< Sapphire::Data::ClassJob >( static_cast< uint32_t >( getClass() ) ); auto parentClass = static_cast< ClassJob >( currentClassJob->classJobParent ); setClassJob( parentClass ); } // TODO: these next functions are so similar that they could likely be simplified -void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount ) +void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount, bool sendLootMessage ) { auto slot = static_cast< uint8_t >( static_cast< uint8_t >( type ) - 1 ); auto currItem = m_storageMap[ Currency ]->getItem( slot ); @@ -314,13 +306,13 @@ void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount ) if( !currItem ) { // TODO: map currency type to itemid - currItem = createItem( 1 ); + currItem = createTempItem( 1 ); m_storageMap[ Currency ]->setItem( slot, currItem ); } uint32_t currentAmount = currItem->getStackSize(); currItem->setStackSize( currentAmount + amount ); - writeItem( currItem ); + updateItemDb( currItem ); updateContainer( Currency, slot, currItem ); @@ -329,6 +321,22 @@ void Sapphire::Entity::Player::addCurrency( CurrencyType type, uint32_t amount ) Common::InventoryType::Currency, *currItem ); queuePacket( invUpdate ); + + + if( sendLootMessage ) + { + switch( type ) + { + case CurrencyType::Gil: + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetGil; + lootMsg->data().param1 = amount; + queuePacket( lootMsg ); + break; + } + } + } } void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32_t amount ) @@ -344,7 +352,7 @@ void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32 currItem->setStackSize( 0 ); else currItem->setStackSize( currentAmount - amount ); - writeItem( currItem ); + updateItemDb( currItem ); auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), static_cast< uint8_t >( type ) - 1, @@ -354,14 +362,14 @@ void Sapphire::Entity::Player::removeCurrency( Common::CurrencyType type, uint32 } -void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t amount ) +void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t amount, bool sendLootMessage ) { auto currItem = m_storageMap[ Crystal ]->getItem( static_cast< uint8_t >( type ) - 1 ); if( !currItem ) { // TODO: map currency type to itemid - currItem = createItem( static_cast< uint8_t >( type ) + 1 ); + currItem = createTempItem( static_cast< uint8_t >( type ) + 1 ); m_storageMap[ Crystal ]->setItem( static_cast< uint8_t >( type ) - 1, currItem ); } @@ -369,7 +377,7 @@ void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t am currItem->setStackSize( currentAmount + amount ); - writeItem( currItem ); + updateItemDb( currItem ); writeInventory( Crystal ); @@ -379,7 +387,21 @@ void Sapphire::Entity::Player::addCrystal( Common::CrystalType type, uint32_t am Common::InventoryType::Crystal, *currItem ); queuePacket( invUpdate ); - queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) ); + + if( sendLootMessage ) + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetItem2; + lootMsg->data().param1 = getId(); + lootMsg->data().param2 = currItem->getId(); + lootMsg->data().param3 = amount; + queuePacket( lootMsg ); + } + + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); } void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t amount ) @@ -395,7 +417,7 @@ void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t else currItem->setStackSize( currentAmount - amount ); - writeItem( currItem ); + updateItemDb( currItem ); auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), static_cast< uint8_t >( type ) - 1, @@ -406,11 +428,11 @@ void Sapphire::Entity::Player::removeCrystal( Common::CrystalType type, uint32_t void Sapphire::Entity::Player::sendInventory() { - auto pInvMgr = m_pFw->get< World::Manager::InventoryMgr >(); + auto& invMgr = Common::Service< World::Manager::InventoryMgr >::ref(); for( auto it = m_storageMap.begin(); it != m_storageMap.end(); ++it ) { - pInvMgr->sendInventoryContainer( *this, it->second ); + invMgr.sendInventoryContainer( *this, it->second ); } } @@ -474,7 +496,7 @@ uint32_t Sapphire::Entity::Player::getCrystal( CrystalType type ) void Sapphire::Entity::Player::writeInventory( InventoryType type ) { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); auto storage = m_storageMap[ type ]; @@ -498,13 +520,16 @@ void Sapphire::Entity::Player::writeInventory( InventoryType type ) if( storage->isMultiStorage() ) query += " AND storageId = " + std::to_string( static_cast< uint16_t >( type ) ); - pDb->execute( query ); + db.execute( query ); } -void Sapphire::Entity::Player::writeItem( Sapphire::ItemPtr pItem ) const +void Sapphire::Entity::Player::updateItemDb( Sapphire::ItemPtr pItem ) const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::CHARA_ITEMGLOBAL_UP ); + if( pItem->getUId() == 0 ) + writeItemDb( pItem ); + + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::CHARA_ITEMGLOBAL_UP ); // todo: add more fields stmt->setInt( 1, pItem->getStackSize() ); @@ -513,32 +538,32 @@ void Sapphire::Entity::Player::writeItem( Sapphire::ItemPtr pItem ) const stmt->setInt64( 4, pItem->getUId() ); - pDb->directExecute( stmt ); + db.directExecute( stmt ); } void Sapphire::Entity::Player::deleteItemDb( Sapphire::ItemPtr item ) const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::CHARA_ITEMGLOBAL_DELETE ); + if( item->getUId() == 0 ) + return; + + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::CHARA_ITEMGLOBAL_DELETE ); stmt->setInt64( 1, item->getUId() ); - pDb->directExecute( stmt ); + db.directExecute( stmt ); } bool Sapphire::Entity::Player::isObtainable( uint32_t catalogId, uint8_t quantity ) { - return true; } - -Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_t quantity, bool isHq, bool silent ) +Sapphire::ItemPtr Sapphire::Entity::Player::addItem( ItemPtr itemToAdd, bool silent, bool canMerge, bool sendLootMessage ) { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - auto itemInfo = pExdData->get< Sapphire::Data::Item >( catalogId ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto itemInfo = exdData.get< Sapphire::Data::Item >( itemToAdd->getId() ); // if item data doesn't exist or it's a blank field if( !itemInfo || itemInfo->levelItem == 0 ) @@ -546,20 +571,20 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_ return nullptr; } - quantity = std::min< uint32_t >( quantity, itemInfo->stackSize ); + itemToAdd->setStackSize( std::min< uint32_t >( itemToAdd->getStackSize(), itemInfo->stackSize ) ); // used for item obtain notification - uint32_t originalQuantity = quantity; + uint32_t originalQuantity = itemToAdd->getStackSize(); std::pair< uint16_t, uint8_t > freeBagSlot; bool foundFreeSlot = false; std::vector< uint16_t > bags = { Bag0, Bag1, Bag2, Bag3 }; - + sendDebug( "adding item: {}, equipSlotCategory: {}, stackSize: {}", itemToAdd->getId(), itemInfo->equipSlotCategory, itemInfo->stackSize ); // add the related armoury bag to the applicable bags and try and fill a free slot there before falling back to regular inventory - if( itemInfo->isEquippable && getEquipDisplayFlags() & StoreNewItemsInArmouryChest ) + if( itemInfo->equipSlotCategory > 0 && getEquipDisplayFlags() & StoreNewItemsInArmouryChest ) { - auto bag = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( itemInfo->equipSlotCategory ); + auto bag = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( static_cast< Common::EquipSlotCategory >( itemInfo->equipSlotCategory ) ); bags.insert( bags.begin(), bag ); } @@ -570,10 +595,13 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_ for( uint8_t slot = 0; slot < storage->getMaxSize(); slot++ ) { + if( !canMerge && foundFreeSlot ) + break; + auto item = storage->getItem( slot ); // add any items that are stackable - if( item && !itemInfo->isEquippable && item->getId() == catalogId ) + if( canMerge && item && item->getMaxStackSize() > 1 && item->getId() == itemToAdd->getId() ) { uint32_t count = item->getStackSize(); uint32_t maxStack = item->getMaxStackSize(); @@ -583,28 +611,47 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_ continue; // check slot is same quality - if( item->isHq() != isHq ) + if( item->isHq() != itemToAdd->isHq() ) continue; // update stack - uint32_t newStackSize = count + quantity; + uint32_t newStackSize = count + itemToAdd->getStackSize(); if( newStackSize > maxStack ) { - quantity = newStackSize - maxStack; + itemToAdd->setStackSize( newStackSize - maxStack ); newStackSize = maxStack; } + else + itemToAdd->setStackSize( 0 ); item->setStackSize( newStackSize ); - writeItem( item ); + updateItemDb( item ); - auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, bag, *item ); - queuePacket( slotUpdate ); + if( !silent ) + { + auto slotUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slot, bag, *item ); + queuePacket( slotUpdate ); + } // return existing stack if we have no overflow - items fit into a preexisting stack - if( quantity == 0 ) + if( itemToAdd->getStackSize() == 0 ) { - queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) ); - + if( sendLootMessage ) + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetItem2; + lootMsg->data().param1 = getId(); + lootMsg->data().param2 = itemToAdd->isHq() ? itemToAdd->getId() + 1000000 : itemToAdd->getId(); + lootMsg->data().param3 = originalQuantity; + queuePacket( lootMsg ); + } + if( !silent ) + { + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); + } return item; } @@ -621,24 +668,45 @@ Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_ if( !foundFreeSlot ) return nullptr; - auto item = createItem( catalogId, quantity ); - item->setHq( isHq ); + writeItemDb( itemToAdd ); auto storage = m_storageMap[ freeBagSlot.first ]; - storage->setItem( freeBagSlot.second, item ); + storage->setItem( freeBagSlot.second, itemToAdd ); writeInventory( static_cast< InventoryType >( freeBagSlot.first ) ); if( !silent ) { - auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), freeBagSlot.second, freeBagSlot.first, - *item ); + auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), freeBagSlot.second, freeBagSlot.first, *itemToAdd ); queuePacket( invUpdate ); - queuePacket( makeActorControlSelf( getId(), ItemObtainIcon, catalogId, originalQuantity ) ); + auto soundEffectPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( getId() ); + soundEffectPacket->data().sequence = 0xFFFFFFFF; + soundEffectPacket->data().type = 6; + queuePacket( soundEffectPacket ); } - return item; + if( sendLootMessage ) + { + auto lootMsg = makeZonePacket< FFXIVIpcLootMessage >( getId() ); + lootMsg->data().msgType = Common::LootMessageType::GetItem2; + lootMsg->data().param1 = getId(); + lootMsg->data().param2 = itemToAdd->isHq() ? itemToAdd->getId() + 1000000 : itemToAdd->getId(); + lootMsg->data().param3 = originalQuantity; + queuePacket( lootMsg ); + } + + return itemToAdd; +} + + +Sapphire::ItemPtr Sapphire::Entity::Player::addItem( uint32_t catalogId, uint32_t quantity, bool isHq, bool silent, bool canMerge, bool sendLootMessage ) +{ + if( catalogId == 0 ) + return nullptr; + auto item = createTempItem( catalogId, quantity ); + item->setHq( isHq ); + return addItem( item, silent, canMerge, sendLootMessage ); } void @@ -666,10 +734,12 @@ Sapphire::Entity::Player::moveItem( uint16_t fromInventoryId, uint8_t fromSlotId if( static_cast< InventoryType >( fromInventoryId ) == GearSet0 ) unequipItem( static_cast< GearSetSlot >( fromSlotId ), tmpItem, true ); - + if( static_cast< InventoryType >( toInventoryId ) == GearSet0 || + static_cast< InventoryType >( fromInventoryId ) == GearSet0 ) + sendStatusEffectUpdate(); // send if any equip is changed } -bool Sapphire::Entity::Player::updateContainer( uint16_t storageId, uint8_t slotId, ItemPtr pItem ) +bool Sapphire::Entity::Player::updateContainer( uint16_t storageId, uint8_t slotId, ItemPtr pItem, bool writeToDb ) { auto containerType = World::Manager::ItemMgr::getContainerType( storageId ); @@ -682,7 +752,8 @@ bool Sapphire::Entity::Player::updateContainer( uint16_t storageId, uint8_t slot case Bag: case CurrencyCrystal: { - writeInventory( static_cast< InventoryType >( storageId ) ); + if( writeToDb ) + writeInventory( static_cast< InventoryType >( storageId ) ); break; } @@ -697,7 +768,8 @@ bool Sapphire::Entity::Player::updateContainer( uint16_t storageId, uint8_t slot else unequipItem( static_cast< GearSetSlot >( slotId ), pItem, true ); - writeInventory( static_cast< InventoryType >( storageId ) ); + if( writeToDb ) + writeInventory( static_cast< InventoryType >( storageId ) ); break; } default: @@ -728,16 +800,16 @@ void Sapphire::Entity::Player::splitItem( uint16_t fromInventoryId, uint8_t from // todo: correct invalid move? again, not sure what retail does here return; - auto newItem = addItem( fromItem->getId(), itemCount, fromItem->isHq(), true ); + auto newItem = addItem( fromItem->getId(), itemCount, fromItem->isHq(), true, false ); if( !newItem ) return; fromItem->setStackSize( fromItem->getStackSize() - itemCount ); - updateContainer( fromInventoryId, fromSlotId, fromItem ); + updateContainer( fromInventoryId, fromSlotId, fromItem, fromInventoryId != toInventoryId ); updateContainer( toInventoryId, toSlot, newItem ); - writeItem( fromItem ); + updateItemDb( fromItem ); } void Sapphire::Entity::Player::mergeItem( uint16_t fromInventoryId, uint8_t fromSlotId, @@ -764,14 +836,14 @@ void Sapphire::Entity::Player::mergeItem( uint16_t fromInventoryId, uint8_t from else { fromItem->setStackSize( stackOverflow ); - writeItem( fromItem ); + updateItemDb( fromItem ); + updateContainer( fromInventoryId, fromSlotId, fromItem, fromInventoryId != toInventoryId ); } toItem->setStackSize( stackSize ); - writeItem( toItem ); + updateItemDb( toItem ); - updateContainer( fromInventoryId, fromSlotId, fromItem ); updateContainer( toInventoryId, toSlot, toItem ); } @@ -792,15 +864,21 @@ void Sapphire::Entity::Player::swapItem( uint16_t fromInventoryId, uint8_t fromS && !World::Manager::ItemMgr::isArmory( fromInventoryId ) ) { updateContainer( fromInventoryId, fromSlotId, nullptr ); - fromInventoryId = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( toSlot ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto itemInfo = exdData.get< Sapphire::Data::Item >( toItem->getId() ); + fromInventoryId = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( static_cast< Common::EquipSlotCategory >( itemInfo->equipSlotCategory ) ); fromSlotId = static_cast < uint8_t >( m_storageMap[ fromInventoryId ]->getFreeSlot() ); } auto containerTypeFrom = World::Manager::ItemMgr::getContainerType( fromInventoryId ); auto containerTypeTo = World::Manager::ItemMgr::getContainerType( toInventoryId ); - updateContainer( toInventoryId, toSlot, fromItem ); + updateContainer( toInventoryId, toSlot, fromItem, fromInventoryId != toInventoryId ); updateContainer( fromInventoryId, fromSlotId, toItem ); + + if( static_cast< InventoryType >( toInventoryId ) == GearSet0 || + static_cast< InventoryType >( fromInventoryId ) == GearSet0 ) + sendStatusEffectUpdate(); // send if any equip is changed } void Sapphire::Entity::Player::discardItem( uint16_t fromInventoryId, uint8_t fromSlotId ) @@ -822,7 +900,7 @@ void Sapphire::Entity::Player::discardItem( uint16_t fromInventoryId, uint8_t fr invTransPacket->data().catalogId = fromItem->getId(); invTransPacket->data().stackSize = fromItem->getStackSize(); invTransPacket->data().slotId = fromSlotId; - invTransPacket->data().type = 7; + invTransPacket->data().type = Common::InventoryOperation::Discard; queuePacket( invTransPacket ); auto invTransFinPacket = makeZonePacket< FFXIVIpcInventoryTransactionFinish >( getId() ); @@ -865,6 +943,11 @@ Sapphire::ItemPtr Sapphire::Entity::Player::getEquippedWeapon() return m_storageMap[ GearSet0 ]->getItem( GearSetSlot::MainHand ); } +Sapphire::ItemPtr Sapphire::Entity::Player::getEquippedSecondaryWeapon() +{ + return m_storageMap[ InventoryType::GearSet0 ]->getItem( GearSetSlot::OffHand ); +} + uint8_t Sapphire::Entity::Player::getFreeSlotsInBags() { uint8_t slots = 0; @@ -915,7 +998,7 @@ uint32_t Sapphire::Entity::Player::getNextInventorySequence() return m_inventorySequence++; } -Sapphire::ItemPtr Sapphire::Entity::Player::dropInventoryItem( Sapphire::Common::InventoryType type, uint16_t slotId ) +Sapphire::ItemPtr Sapphire::Entity::Player::dropInventoryItem( Sapphire::Common::InventoryType type, uint16_t slotId, bool silent ) { auto& container = m_storageMap[ type ]; @@ -927,6 +1010,12 @@ Sapphire::ItemPtr Sapphire::Entity::Player::dropInventoryItem( Sapphire::Common: container->removeItem( slotId, false ); updateContainer( type, slotId, nullptr ); + if( !silent ) + { + auto invUpdate = std::make_shared< UpdateInventorySlotPacket >( getId(), slotId, static_cast< uint16_t >( type ) ); + queuePacket( invUpdate ); + } + auto seq = getNextInventorySequence(); // send inv update diff --git a/src/world/Actor/PlayerQuest.cpp b/src/world/Actor/PlayerQuest.cpp index e503a273..874274f4 100644 --- a/src/world/Actor/PlayerQuest.cpp +++ b/src/world/Actor/PlayerQuest.cpp @@ -2,12 +2,14 @@ #include #include #include +#include #include "Network/GameConnection.h" #include "Network/PacketWrappers/QuestMessagePacket.h" +#include "Manager/MapMgr.h" + #include "Session.h" -#include "Framework.h" using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; @@ -15,14 +17,18 @@ using namespace Sapphire::Network::Packets::Server; void Sapphire::Entity::Player::finishQuest( uint16_t questId ) { - int8_t idx = getQuestIndex( questId ); - removeQuest( questId ); + auto questFinishPacket = makeZonePacket< FFXIVIpcQuestFinish >( getId() ); + questFinishPacket->data().questId = questId; + questFinishPacket->data().flag1 = 1; + questFinishPacket->data().flag2 = 1; + queuePacket( questFinishPacket ); + updateQuestsCompleted( questId ); + removeQuest( questId ); - sendQuestTracker(); - + //sendQuestTracker(); already sent in removeQuest() } void Sapphire::Entity::Player::unfinishQuest( uint16_t questId ) @@ -33,11 +39,14 @@ void Sapphire::Entity::Player::unfinishQuest( uint16_t questId ) void Sapphire::Entity::Player::removeQuest( uint16_t questId ) { - int8_t idx = getQuestIndex( questId ); if( ( idx != -1 ) && ( m_activeQuests[ idx ] != nullptr ) ) { + std::shared_ptr< QuestActive > pQuest = m_activeQuests[ idx ]; + m_activeQuests[ idx ].reset(); + + Common::Service< World::Manager::MapMgr >::ref().updateQuests( *this ); auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); questUpdatePacket->data().slot = static_cast< uint8_t >( idx ); @@ -45,21 +54,12 @@ void Sapphire::Entity::Player::removeQuest( uint16_t questId ) questUpdatePacket->data().questInfo.c.sequence = 0xFF; queuePacket( questUpdatePacket ); - auto questFinishPacket = makeZonePacket< FFXIVIpcQuestFinish >( getId() ); - questFinishPacket->data().questId = questId; - questFinishPacket->data().flag1 = 1; - questFinishPacket->data().flag2 = 1; - queuePacket( questFinishPacket ); - for( int32_t ii = 0; ii < 5; ii++ ) { if( m_questTracking[ ii ] == idx ) m_questTracking[ ii ] = -1; } - std::shared_ptr< QuestActive > pQuest = m_activeQuests[ idx ]; - m_activeQuests[ idx ].reset(); - m_questIdToQuestIdx.erase( questId ); m_questIdxToQuestId.erase( idx ); @@ -67,7 +67,6 @@ void Sapphire::Entity::Player::removeQuest( uint16_t questId ) } sendQuestTracker(); - } bool Sapphire::Entity::Player::hasQuest( uint32_t questId ) @@ -920,6 +919,8 @@ void Sapphire::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence ) m_questIdToQuestIdx[ questId ] = idx; m_questIdxToQuestId[ idx ] = questId; + Common::Service< World::Manager::MapMgr >::ref().updateQuests( *this ); + auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); questUpdatePacket->data().slot = idx; questUpdatePacket->data().questInfo = *pNewQuest; @@ -1017,9 +1018,14 @@ Sapphire::Entity::Player::sendQuestMessage( uint32_t questId, int8_t msgId, uint } +bool Sapphire::Entity::Player::isQuestCompleted( uint16_t questId ) +{ + return ( m_questCompleteFlags[ questId / 8 ] & ( 0x80 >> ( questId % 8 ) ) ); +} + void Sapphire::Entity::Player::updateQuestsCompleted( uint32_t questId ) { - uint8_t index = questId / 8; + uint16_t index = questId / 8; uint8_t bitIndex = ( questId ) % 8; uint8_t value = 0x80 >> bitIndex; @@ -1029,26 +1035,28 @@ void Sapphire::Entity::Player::updateQuestsCompleted( uint32_t questId ) void Sapphire::Entity::Player::removeQuestsCompleted( uint32_t questId ) { - uint8_t index = questId / 8; + uint16_t index = questId / 8; uint8_t bitIndex = ( questId ) % 8; uint8_t value = 0x80 >> bitIndex; m_questCompleteFlags[ index ] ^= value; + Common::Service< World::Manager::MapMgr >::ref().updateQuests( *this ); + } bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optionalChoice ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); uint32_t playerLevel = getLevel(); - auto questInfo = pExdData->get< Sapphire::Data::Quest >( questId ); + auto questInfo = exdData.get< Sapphire::Data::Quest >( questId ); if( !questInfo ) return false; - auto paramGrowth = pExdData->get< Sapphire::Data::ParamGrow >( questInfo->classJobLevel0 ); + auto paramGrowth = exdData.get< Sapphire::Data::ParamGrow >( questInfo->classJobLevel0 ); // TODO: use the correct formula, this one is wrong uint32_t exp = @@ -1067,20 +1075,31 @@ bool Sapphire::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t opti if( rewardItemCount > 0 ) { - for( uint32_t i = 0; i < questInfo->itemReward0.size(); i++ ) + for( uint32_t i = 0; i < rewardItemCount; i++ ) { - addItem( questInfo->itemReward0.at( i ), questInfo->itemCountReward0.at( i ) ); + auto itemId = questInfo->itemReward0.at( i ); + if( itemId > 0 ) + { + addItem( itemId, questInfo->itemCountReward0.at( i ), false, false, true, true ); + } } } if( optionalItemCount > 0 ) { - auto itemId = questInfo->itemReward1.at( optionalChoice ); - addItem( itemId, questInfo->itemCountReward1.at( optionalChoice ) ); + for( uint32_t i = 0; i < optionalItemCount; i++ ) + { + auto itemId = questInfo->itemReward1.at( i ); + if( itemId > 0 && itemId == optionalChoice ) + { + addItem( itemId, questInfo->itemCountReward1.at( i ), false, false, true, true ); + break; + } + } } if( gilReward > 0 ) - addCurrency( CurrencyType::Gil, gilReward ); + addCurrency( CurrencyType::Gil, gilReward, true ); return true; } diff --git a/src/world/Actor/PlayerSql.cpp b/src/world/Actor/PlayerSql.cpp index 61bac0a7..1ec21bac 100644 --- a/src/world/Actor/PlayerSql.cpp +++ b/src/world/Actor/PlayerSql.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "Network/GameConnection.h" #include "Network/PacketWrappers/PlayerSetupPacket.h" @@ -19,7 +20,6 @@ #include "Manager/ItemMgr.h" #include "ServerMgr.h" -#include "Framework.h" using namespace Sapphire::Common; using namespace Sapphire::Network::Packets; @@ -29,16 +29,16 @@ using namespace Sapphire::World::Manager; // load player from the db bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession ) { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto pTeriMgr = m_pFw->get< TerritoryMgr >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); m_pSession = pSession; const std::string char_id_str = std::to_string( charId ); - auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL ); + auto stmt = db.getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL ); stmt->setUInt( 1, charId ); - auto res = pDb->query( stmt ); + auto res = db.query( stmt ); if( !res->next() ) return false; @@ -67,10 +67,10 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession TerritoryPtr pCurrZone = nullptr; // if the zone is an instanceContent zone, we need to actually find the instance - if( pTeriMgr->isInstanceContentTerritory( zoneId ) ) + if( teriMgr.isInstanceContentTerritory( zoneId ) ) { // try to find an instance actually linked to this player - pCurrZone = pTeriMgr->getLinkedInstance( m_id ); + pCurrZone = teriMgr.getLinkedInstance( m_id ); // if none found, revert to previous zone and position if( !pCurrZone ) { @@ -79,13 +79,13 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession m_pos.y = m_prevPos.y; m_pos.z = m_prevPos.z; setRot( m_prevRot ); - pCurrZone = pTeriMgr->getZoneByTerritoryTypeId( zoneId ); + pCurrZone = teriMgr.getZoneByTerritoryTypeId( zoneId ); } } - else if( pTeriMgr->isInternalEstateTerritory( zoneId ) ) + else if( teriMgr.isInternalEstateTerritory( zoneId ) ) { // todo: this needs to go to the area just outside of the plot door - pCurrZone = pTeriMgr->getZoneByLandSetId( m_prevTerritoryId ); + pCurrZone = teriMgr.getZoneByLandSetId( m_prevTerritoryId ); zoneId = m_prevTerritoryTypeId; m_pos.x = m_prevPos.x; @@ -93,13 +93,13 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession m_pos.z = m_prevPos.z; setRot( m_prevRot ); } - else if( pTeriMgr->isHousingTerritory( zoneId ) ) + else if( teriMgr.isHousingTerritory( zoneId ) ) { - pCurrZone = pTeriMgr->getZoneByLandSetId( m_territoryId ); + pCurrZone = teriMgr.getZoneByLandSetId( m_territoryId ); } else { - pCurrZone = pTeriMgr->getZoneByTerritoryTypeId( zoneId ); + pCurrZone = teriMgr.getZoneByTerritoryTypeId( zoneId ); } m_territoryTypeId = zoneId; @@ -113,7 +113,7 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession // default to new gridania // TODO: should probably just abort and mark character as corrupt - pCurrZone = pTeriMgr->getZoneByTerritoryTypeId( 132 ); + pCurrZone = teriMgr.getZoneByTerritoryTypeId( 132 ); m_pos.x = 0.0f; m_pos.y = 0.0f; @@ -121,13 +121,6 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession setRot( 0.0f ); } - // Stats - - m_hp = res->getUInt( "Hp" ); - m_mp = res->getUInt( "Mp" ); - m_tp = 0; - - // Model auto custom = res->getBlobVector( "Customize" ); memcpy( reinterpret_cast< char* >( m_customize ), custom.data(), custom.size() ); @@ -193,6 +186,9 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession auto titleList = res->getBlobVector( "TitleList" ); memcpy( reinterpret_cast< char* >( m_titleList ), titleList.data(), titleList.size() ); + auto minions = res->getBlobVector( "Minions" ); + memcpy( reinterpret_cast< char* >( m_minions ), minions.data(), minions.size() ); + auto mountGuide = res->getBlobVector( "Mounts" ); memcpy( reinterpret_cast< char* >( m_mountGuide ), mountGuide.data(), mountGuide.size() ); @@ -209,16 +205,21 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() || !loadHuntingLog() ) Logger::error( "Player #{0} data corrupt!", char_id_str ); + initInventory(); + calculateStats(); + + // Stats + m_hp = res->getUInt( "Hp" ); + m_mp = res->getUInt( "Mp" ); + m_tp = 0; m_maxHp = getMaxHp(); m_maxMp = getMaxMp(); m_mount = res->getUInt8( "Mount" ); - m_modelSubWeapon = 0; + m_modelSubWeapon = getModelSubWeapon(); m_lastTickTime = 0; - calculateStats(); - // first login, run the script event if( m_bNewGame ) { @@ -242,15 +243,11 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession setStateFlag( PlayerStateFlag::BetweenAreas ); - //m_pInventory->load(); - - initInventory(); - initHateSlotQueue(); initSpawnIdQueue(); - if( !pTeriMgr->movePlayer( pCurrZone, getAsPlayer() ) ) + if( !teriMgr.movePlayer( pCurrZone, getAsPlayer() ) ) return false; return true; @@ -258,11 +255,11 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession bool Sapphire::Entity::Player::loadActiveQuests() { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL_QUEST ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL_QUEST ); stmt->setUInt( 1, m_id ); - auto res = pDb->query( stmt ); + auto res = db.query( stmt ); while( res->next() ) { @@ -294,11 +291,11 @@ bool Sapphire::Entity::Player::loadActiveQuests() bool Sapphire::Entity::Player::loadClassData() { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); // ClassIdx, Exp, Lvl - auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_CLASS_SEL ); + auto stmt = db.getPreparedStatement( Db::ZoneDbStatements::CHARA_CLASS_SEL ); stmt->setUInt( 1, m_id ); - auto res = pDb->query( stmt ); + auto res = db.query( stmt ); while( res->next() ) { @@ -315,10 +312,10 @@ bool Sapphire::Entity::Player::loadClassData() bool Sapphire::Entity::Player::loadSearchInfo() { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL_SEARCHINFO ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::ZoneDbStatements::CHARA_SEL_SEARCHINFO ); stmt->setUInt( 1, m_id ); - auto res = pDb->query( stmt ); + auto res = db.query( stmt ); if( !res->next() ) { @@ -340,10 +337,10 @@ bool Sapphire::Entity::Player::loadSearchInfo() bool Sapphire::Entity::Player::loadHuntingLog() { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_MONSTERNOTE_SEL ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::ZoneDbStatements::CHARA_MONSTERNOTE_SEL ); stmt->setUInt( 1, m_id ); - auto res = pDb->query( stmt ); + auto res = db.query( stmt ); if( !res->next() ) { @@ -363,7 +360,7 @@ bool Sapphire::Entity::Player::loadHuntingLog() void Sapphire::Entity::Player::updateSql() { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); /*"Hp 1, Mp 2, Tp 3, Gp 4, Mode 5, Mount 6, InvincibleGM 7, Voice 8, " "Customize 9, ModelMainWeapon 10, ModelSubWeapon 11, ModelSystemWeapon 12, " "ModelEquip 13, EmoteModeType 14, Language 15, IsNewGame 16, IsNewAdventurer 17, " @@ -377,7 +374,7 @@ void Sapphire::Entity::Player::updateSql() - auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_UP ); + auto stmt = db.getPreparedStatement( Db::ZoneDbStatements::CHARA_UP ); stmt->setInt( 1, getHp() ); stmt->setInt( 2, getMp() ); @@ -490,7 +487,7 @@ void Sapphire::Entity::Player::updateSql() stmt->setInt( 57, m_id ); - pDb->execute( stmt ); + db.execute( stmt ); ////// Searchinfo updateDbSearchInfo(); @@ -508,24 +505,24 @@ void Sapphire::Entity::Player::updateSql() void Sapphire::Entity::Player::updateDbClass() const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - uint8_t classJobIndex = pExdData->get< Sapphire::Data::ClassJob >( static_cast( getClass() ) )->expArrayIndex; + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + uint8_t classJobIndex = exdData.get< Sapphire::Data::ClassJob >( static_cast( getClass() ) )->expArrayIndex; //Exp = ?, Lvl = ? WHERE CharacterId = ? AND ClassIdx = ? - auto stmtS = pDb->getPreparedStatement( Db::CHARA_CLASS_UP ); + auto stmtS = db.getPreparedStatement( Db::CHARA_CLASS_UP ); stmtS->setInt( 1, getExp() ); stmtS->setInt( 2, getLevel() ); stmtS->setInt( 3, m_id ); stmtS->setInt( 4, classJobIndex ); - pDb->execute( stmtS ); + db.execute( stmtS ); } void Sapphire::Entity::Player::updateDbMonsterNote() { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); // Category_0-11 - auto stmt = pDb->getPreparedStatement( Db::CHARA_MONSTERNOTE_UP ); + auto stmt = db.getPreparedStatement( Db::CHARA_MONSTERNOTE_UP ); //std::array< std::vector< uint8_t >, 12 > vectors; std::vector< uint8_t > vector( 41 ); for( std::size_t i = 0; i < m_huntingLogEntries.size(); ++i ) @@ -538,48 +535,48 @@ void Sapphire::Entity::Player::updateDbMonsterNote() stmt->setBinary( i + 1, vector ); } stmt->setInt( 13, m_id ); - pDb->execute( stmt ); + db.execute( stmt ); } void Sapphire::Entity::Player::insertDbClass( const uint8_t classJobIndex ) const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmtClass = pDb->getPreparedStatement( Db::CHARA_CLASS_INS ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmtClass = db.getPreparedStatement( Db::CHARA_CLASS_INS ); stmtClass->setInt( 1, getId() ); stmtClass->setInt( 2, classJobIndex ); stmtClass->setInt( 3, 0 ); stmtClass->setInt( 4, 1 ); - pDb->directExecute( stmtClass ); + db.directExecute( stmtClass ); } void Sapphire::Entity::Player::updateDbSearchInfo() const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmtS = pDb->getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTCLASS ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmtS = db.getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTCLASS ); stmtS->setInt( 1, m_searchSelectClass ); stmtS->setInt( 2, m_id ); - pDb->execute( stmtS ); + db.execute( stmtS ); - auto stmtS1 = pDb->getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTREGION ); + auto stmtS1 = db.getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTREGION ); stmtS1->setInt( 1, m_searchSelectRegion ); stmtS1->setInt( 2, m_id ); - pDb->execute( stmtS1 ); + db.execute( stmtS1 ); - auto stmtS2 = pDb->getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SEARCHCOMMENT ); + auto stmtS2 = db.getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SEARCHCOMMENT ); stmtS2->setString( 1, std::string( m_searchMessage ) ); stmtS2->setInt( 2, m_id ); - pDb->execute( stmtS2 ); + db.execute( stmtS2 ); } void Sapphire::Entity::Player::updateDbAllQuests() const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); for( int32_t i = 0; i < 30; i++ ) { if( !m_activeQuests[ i ] ) continue; - auto stmtS3 = pDb->getPreparedStatement( Db::CHARA_QUEST_UP ); + auto stmtS3 = db.getPreparedStatement( Db::CHARA_QUEST_UP ); stmtS3->setInt( 1, m_activeQuests[ i ]->c.sequence ); stmtS3->setInt( 2, m_activeQuests[ i ]->c.flags ); stmtS3->setInt( 3, m_activeQuests[ i ]->c.UI8A ); @@ -591,24 +588,24 @@ void Sapphire::Entity::Player::updateDbAllQuests() const stmtS3->setInt( 9, m_activeQuests[ i ]->c.padding1 ); stmtS3->setInt( 10, m_id ); stmtS3->setInt( 11, m_activeQuests[ i ]->c.questId ); - pDb->execute( stmtS3 ); + db.execute( stmtS3 ); } } void Sapphire::Entity::Player::deleteQuest( uint16_t questId ) const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::CHARA_QUEST_DEL ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::CHARA_QUEST_DEL ); stmt->setInt( 1, m_id ); stmt->setInt( 2, questId ); - pDb->execute( stmt ); + db.execute( stmt ); } void Sapphire::Entity::Player::insertQuest( uint16_t questId, uint8_t index, uint8_t seq ) const { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::CHARA_QUEST_INS ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::CHARA_QUEST_INS ); stmt->setInt( 1, m_id ); stmt->setInt( 2, index ); stmt->setInt( 3, questId ); @@ -621,15 +618,14 @@ void Sapphire::Entity::Player::insertQuest( uint16_t questId, uint8_t index, uin stmt->setInt( 10, 0 ); stmt->setInt( 11, 0 ); stmt->setInt( 12, 0 ); - pDb->execute( stmt ); + db.execute( stmt ); } -Sapphire::ItemPtr Sapphire::Entity::Player::createItem( uint32_t catalogId, uint32_t quantity ) +Sapphire::ItemPtr Sapphire::Entity::Player::createTempItem( uint32_t catalogId, uint32_t quantity ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto itemInfo = pExdData->get< Sapphire::Data::Item >( catalogId ); - auto itemMgr = m_pFw->get< World::Manager::ItemMgr >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + + auto itemInfo = exdData.get< Sapphire::Data::Item >( catalogId ); if( !itemInfo ) return nullptr; @@ -637,29 +633,39 @@ Sapphire::ItemPtr Sapphire::Entity::Player::createItem( uint32_t catalogId, uint if( !itemInfo ) return nullptr; - uint8_t flags = 0; - - ItemPtr pItem = make_Item( itemMgr->getNextUId(), catalogId, m_pFw ); + ItemPtr pItem = make_Item( 0, catalogId ); pItem->setStackSize( quantity ); - pDb->execute( "INSERT INTO charaglobalitem ( CharacterId, itemId, catalogId, stack, flags ) VALUES ( " + - std::to_string( getId() ) + ", " + - std::to_string( pItem->getUId() ) + ", " + - std::to_string( pItem->getId() ) + ", " + - std::to_string( quantity ) + ", " + - std::to_string( flags ) + ");" ); - return pItem; } +void Sapphire::Entity::Player::writeItemDb( Sapphire::ItemPtr pItem ) const +{ + if( pItem->getUId() == 0 ) + { + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto& itemMgr = Common::Service< World::Manager::ItemMgr >::ref(); + + uint8_t flags = 0; + pItem->setUId( itemMgr.getNextUId() ); + std::string sql = "INSERT INTO charaglobalitem ( CharacterId, itemId, catalogId, stack, flags ) VALUES ( " + + std::to_string( getId() ) + ", " + + std::to_string( pItem->getUId() ) + ", " + + std::to_string( pItem->getId() ) + ", " + + std::to_string( pItem->getStackSize() ) + ", " + + std::to_string( flags ) + ");"; + db.directExecute( sql ); + } +} + bool Sapphire::Entity::Player::loadInventory() { - auto itemMgr = m_pFw->get< World::Manager::ItemMgr >(); - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& itemMgr = Common::Service< World::Manager::ItemMgr >::ref(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); ////////////////////////////////////////////////////////////////////////////////////////////////////// // load active gearset - auto res = pDb->query( "SELECT storageId, container_0, container_1, container_2, container_3, " + auto res = db.query( "SELECT storageId, container_0, container_1, container_2, container_3, " "container_4, container_5, container_6, container_7, " "container_8, container_9, container_10, container_11, " "container_12, container_13 " @@ -677,7 +683,7 @@ bool Sapphire::Entity::Player::loadInventory() if( uItemId == 0 ) continue; - ItemPtr pItem = itemMgr->loadItem( uItemId ); + ItemPtr pItem = itemMgr.loadItem( uItemId ); if( pItem == nullptr ) continue; @@ -689,7 +695,7 @@ bool Sapphire::Entity::Player::loadInventory() /////////////////////////////////////////////////////////////////////////////////////////////////////// // Load everything - auto bagRes = pDb->query( "SELECT storageId, " + auto bagRes = db.query( "SELECT storageId, " "container_0, container_1, container_2, container_3, container_4, " "container_5, container_6, container_7, container_8, container_9, " "container_10, container_11, container_12, container_13, container_14, " @@ -710,7 +716,7 @@ bool Sapphire::Entity::Player::loadInventory() if( uItemId == 0 ) continue; - ItemPtr pItem = itemMgr->loadItem( uItemId ); + ItemPtr pItem = itemMgr.loadItem( uItemId ); if( pItem == nullptr ) continue; diff --git a/src/world/Event/Director.cpp b/src/world/Event/Director.cpp index 864bf0e3..5bde5992 100644 --- a/src/world/Event/Director.cpp +++ b/src/world/Event/Director.cpp @@ -16,9 +16,10 @@ using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::Server; using namespace Sapphire::Network::ActorControl; -Sapphire::Event::Director::Director( Sapphire::Event::Director::DirectorType type, uint16_t contentId ) : +Sapphire::Event::Director::Director( Sapphire::Event::Director::DirectorType type, uint16_t contentId, uint16_t contentFinderConditionId ) : m_contentId( contentId ), m_type( type ), + m_contentFinderConditionId( contentFinderConditionId ), m_directorId( ( static_cast< uint32_t >( type ) << 16 ) | contentId ), m_sequence( 1 ), m_branch( 0 ), @@ -37,6 +38,11 @@ uint16_t Sapphire::Event::Director::getContentId() const return m_contentId; } +uint16_t Sapphire::Event::Director::getContentFinderConditionId() const +{ + return m_contentFinderConditionId; +} + uint8_t Sapphire::Event::Director::getSequence() const { return m_sequence; @@ -52,14 +58,18 @@ void Sapphire::Event::Director::sendDirectorVars( Sapphire::Entity::Player& play auto varPacket = makeZonePacket< FFXIVIpcDirectorVars >( player.getId() ); varPacket->data().m_directorId = getDirectorId(); varPacket->data().m_sequence = getSequence(); - varPacket->data().m_branch = 0; + varPacket->data().m_branch = getBranch(); memcpy( varPacket->data().m_unionData, m_unionData.arrData, sizeof( varPacket->data().m_unionData ) ); player.queuePacket( varPacket ); + player.sendDebug( "DirectorVar#{}: {:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}{:02X} seq{}, b{}", getDirectorId(), + m_unionData.ui8.UI8A, m_unionData.ui8.UI8B, m_unionData.ui8.UI8C, m_unionData.ui8.UI8D, m_unionData.ui8.UI8E, + m_unionData.ui8.UI8F, m_unionData.ui8.UI8G, m_unionData.ui8.UI8H, m_unionData.ui8.UI8I, m_unionData.ui8.UI8J, + getSequence(), getBranch() ); } void Sapphire::Event::Director::sendDirectorInit( Sapphire::Entity::Player& player ) const { - Logger::debug( "DirectorID#{}, QuestBattleID#{}", m_directorId, m_contentId ); + Logger::debug( "DirectorID#{}, ContentId#{}, ContentFinderConditionId#{}", m_directorId, m_contentId, m_contentFinderConditionId ); player.queuePacket( makeActorControlSelf( player.getId(), DirectorInit, m_directorId, m_contentId ) ); } @@ -183,12 +193,12 @@ void Sapphire::Event::Director::setDirectorSequence( uint8_t value ) m_sequence = value; } -void Sapphire::Event::Director::setCustomVar( uint32_t varId, uint32_t value ) +void Sapphire::Event::Director::setCustomVar( uint32_t varId, uint64_t value ) { m_customVarMap[ varId ] = value; } -uint32_t Sapphire::Event::Director::getCustomVar( uint32_t varId ) +uint64_t Sapphire::Event::Director::getCustomVar( uint32_t varId ) { auto it = m_customVarMap.find( varId ); if( it != m_customVarMap.end() ) diff --git a/src/world/Event/Director.h b/src/world/Event/Director.h index 38970984..3bc9efaa 100644 --- a/src/world/Event/Director.h +++ b/src/world/Event/Director.h @@ -42,12 +42,14 @@ namespace Sapphire::Event DutyFailed }; - Director( DirectorType type, uint16_t contentId ); + Director( DirectorType type, uint16_t contentId, uint16_t contentFinderConditionId = 0 ); uint32_t getDirectorId() const; uint16_t getContentId() const; + uint16_t getContentFinderConditionId() const; + DirectorType getType() const; uint8_t getSequence() const; @@ -104,8 +106,8 @@ namespace Sapphire::Event void setDirectorBranch( uint8_t value ); - void setCustomVar( uint32_t varId, uint32_t value ); - uint32_t getCustomVar( uint32_t varId ); + void setCustomVar( uint32_t varId, uint64_t value ); + uint64_t getCustomVar( uint32_t varId ); private: /*! Id of the content of the director */ @@ -114,6 +116,8 @@ namespace Sapphire::Event /*! DirectorType | ContentId */ uint32_t m_directorId; + uint16_t m_contentFinderConditionId; + /*! currect sequence */ uint8_t m_sequence; @@ -183,7 +187,7 @@ namespace Sapphire::Event uint32_t m_elapsedTime; - std::unordered_map< uint32_t, uint32_t > m_customVarMap; + std::unordered_map< uint32_t, uint64_t > m_customVarMap; }; diff --git a/src/world/Event/EventHandler.h b/src/world/Event/EventHandler.h index 11b36c27..0990ec87 100644 --- a/src/world/Event/EventHandler.h +++ b/src/world/Event/EventHandler.h @@ -45,7 +45,7 @@ namespace Sapphire::Event TableGame = 24, }; - enum EventHandlerType : uint16_t + enum class EventHandlerType : uint16_t { Quest = 0x0001, Warp = 0x0002, @@ -54,8 +54,10 @@ namespace Sapphire::Event Aetheryte = 0x0005, GuildLeveAssignment = 0x0006, DefaultTalk = 0x0009, + Craft = 0x000A, CustomTalk = 0x000B, CompanyLeveOfficer = 0x000C, + Array = 0x000D, CraftLeve = 0x000E, GimmickAccessor = 0x000F, GimmickBill = 0x0010, @@ -63,6 +65,7 @@ namespace Sapphire::Event ChocoboTaxiStand = 0x0012, Opening = 0x0013, ExitRange = 0x0014, + Fishing = 0x0015, GCShop = 0x0016, GuildOrderGuide = 0x0017, GuildOrderOfficer = 0x0018, @@ -70,12 +73,25 @@ namespace Sapphire::Event Story = 0x001A, SpecialShop = 0x001B, BahamutGuide = 0x001C, + InstanceContentGuide = 0x001D, HousingAethernet = 0x001E, FcTalk = 0x001F, + Adventure = 0x0021, + DailyQuestSupply = 0x0022, + TripleTriad = 0x0023, + PreHandler = 0x0036, ICDirector = 0x8003, + PublicContentDirector = 0x8004, QuestBattleDirector = 0x8006, }; + enum class QuestAvailability : uint8_t + { + Invisible, + Available, + Locked + }; + using SceneReturnCallback = std::function< void( Entity::Player&, const SceneResult& ) >; using SceneChainCallback = std::function< void( Entity::Player& ) >; using EventFinishCallback = std::function< void( Entity::Player&, uint64_t ) >; diff --git a/src/world/ForwardsZone.h b/src/world/ForwardsZone.h index 4ff4af79..4592c320 100644 --- a/src/world/ForwardsZone.h +++ b/src/world/ForwardsZone.h @@ -24,12 +24,12 @@ TYPE_FORWARD( HousingZone ); TYPE_FORWARD( House ); TYPE_FORWARD( InstanceContent ); TYPE_FORWARD( QuestBattle ); +TYPE_FORWARD( PublicContent ); TYPE_FORWARD( Item ); TYPE_FORWARD( ItemContainer ); TYPE_FORWARD( ZonePosition ); TYPE_FORWARD( Land ); TYPE_FORWARD( Linkshell ); -TYPE_FORWARD( Framework ); namespace World { @@ -87,6 +87,7 @@ namespace World::Action TYPE_FORWARD( Action ); TYPE_FORWARD( EventAction ); TYPE_FORWARD( ItemAction ); +TYPE_FORWARD( MountAction ); TYPE_FORWARD( EffectBuilder ); TYPE_FORWARD( EffectResult ); diff --git a/src/world/Inventory/HousingItem.cpp b/src/world/Inventory/HousingItem.cpp index f4fe35da..954c9053 100644 --- a/src/world/Inventory/HousingItem.cpp +++ b/src/world/Inventory/HousingItem.cpp @@ -1,7 +1,7 @@ #include "HousingItem.h" -Sapphire::Inventory::HousingItem::HousingItem( uint64_t uId, uint32_t catalogId, FrameworkPtr pFw ) : - Sapphire::Item( uId, catalogId, pFw, false ) +Sapphire::Inventory::HousingItem::HousingItem( uint64_t uId, uint32_t catalogId ) : + Sapphire::Item( uId, catalogId, false ) { m_stackSize = 1; m_spiritBond = 1; diff --git a/src/world/Inventory/HousingItem.h b/src/world/Inventory/HousingItem.h index ba208ddc..279a7910 100644 --- a/src/world/Inventory/HousingItem.h +++ b/src/world/Inventory/HousingItem.h @@ -8,7 +8,7 @@ namespace Sapphire::Inventory class HousingItem : public Item { public: - HousingItem( uint64_t uId, uint32_t catalogId, FrameworkPtr pFw ); + HousingItem( uint64_t uId, uint32_t catalogId ); virtual ~HousingItem() = default; void setRot( float rot ); diff --git a/src/world/Inventory/Item.cpp b/src/world/Inventory/Item.cpp index 1b75fcaf..ac41926c 100644 --- a/src/world/Inventory/Item.cpp +++ b/src/world/Inventory/Item.cpp @@ -1,22 +1,21 @@ #include #include #include +#include -#include "Framework.h" #include "Item.h" -Sapphire::Item::Item( uint64_t uId, uint32_t catalogId, FrameworkPtr pFw, bool isHq ) : +Sapphire::Item::Item( uint64_t uId, uint32_t catalogId, bool isHq ) : m_id( catalogId ), m_uId( uId ), m_isHq( isHq ), m_stain( 0 ), m_durability( 30000 ), m_spiritBond( 0 ), - m_reservedFlag( 0 ), - m_pFw( pFw ) + m_reservedFlag( 0 ) { - auto pExdData = m_pFw->get< Data::ExdDataGenerated >(); - auto itemInfo = pExdData->get< Sapphire::Data::Item >( catalogId ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto itemInfo = exdData.get< Sapphire::Data::Item >( catalogId ); m_delayMs = itemInfo->delayms; m_physicalDmg = itemInfo->damagePhys; diff --git a/src/world/Inventory/Item.h b/src/world/Inventory/Item.h index 35c11286..dff845cc 100644 --- a/src/world/Inventory/Item.h +++ b/src/world/Inventory/Item.h @@ -18,7 +18,7 @@ namespace Sapphire int16_t value; }; - Item( uint64_t uId, uint32_t catalogId, FrameworkPtr pFw, bool isHq = false ); + Item( uint64_t uId, uint32_t catalogId, bool isHq = false ); virtual ~Item() = default; @@ -116,7 +116,6 @@ namespace Sapphire uint32_t m_defense; uint32_t m_defenseMag; - FrameworkPtr m_pFw; uint32_t m_additionalData; BaseParamStruct m_baseParam[6]; diff --git a/src/world/Inventory/ItemContainer.cpp b/src/world/Inventory/ItemContainer.cpp index 6afb81a1..c150f1fd 100644 --- a/src/world/Inventory/ItemContainer.cpp +++ b/src/world/Inventory/ItemContainer.cpp @@ -1,21 +1,20 @@ #include #include #include +#include #include "Actor/Player.h" #include "Item.h" -#include "Framework.h" #include "Forwards.h" #include "ItemContainer.h" Sapphire::ItemContainer::ItemContainer( uint16_t storageId, uint8_t maxSize, const std::string& tableName, - bool isMultiStorage, FrameworkPtr pFw, bool isPersistentStorage ) : + bool isMultiStorage, bool isPersistentStorage ) : m_id( storageId ), m_size( maxSize ), m_tableName( tableName ), m_bMultiStorage( isMultiStorage ), - m_pFw( pFw ), m_isPersistentStorage( isPersistentStorage ) { @@ -38,13 +37,13 @@ uint8_t Sapphire::ItemContainer::getEntryCount() const void Sapphire::ItemContainer::removeItem( uint8_t slotId, bool removeFromDb ) { - auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); auto it = m_itemMap.find( slotId ); if( it != m_itemMap.end() ) { if( m_isPersistentStorage && removeFromDb ) - pDb->execute( "DELETE FROM charaglobalitem WHERE itemId = " + std::to_string( it->second->getUId() ) ); + db.execute( "DELETE FROM charaglobalitem WHERE itemId = " + std::to_string( it->second->getUId() ) ); m_itemMap.erase( it ); @@ -93,7 +92,10 @@ Sapphire::ItemPtr Sapphire::ItemContainer::getItem( uint8_t slotId ) void Sapphire::ItemContainer::setItem( uint8_t slotId, ItemPtr pItem ) { if( slotId > m_size ) + { + Logger::error( "Slot out of range {0}", slotId ); return; + } m_itemMap[ slotId ] = pItem; } diff --git a/src/world/Inventory/ItemContainer.h b/src/world/Inventory/ItemContainer.h index 140393ae..5e830335 100644 --- a/src/world/Inventory/ItemContainer.h +++ b/src/world/Inventory/ItemContainer.h @@ -15,7 +15,7 @@ namespace Sapphire public: ItemContainer( uint16_t storageId, uint8_t maxSize, const std::string& tableName, bool isMultiStorage, - FrameworkPtr pFw, bool isPersistentStorage = true ); + bool isPersistentStorage = true ); ~ItemContainer(); @@ -48,7 +48,6 @@ namespace Sapphire uint8_t m_size; std::string m_tableName; bool m_bMultiStorage; - FrameworkPtr m_pFw; bool m_isPersistentStorage; ItemMap m_itemMap; Entity::PlayerPtr m_pOwner; diff --git a/src/world/Linkshell/Linkshell.h b/src/world/Linkshell/Linkshell.h index 31d32717..7fe91864 100644 --- a/src/world/Linkshell/Linkshell.h +++ b/src/world/Linkshell/Linkshell.h @@ -3,6 +3,7 @@ #include #include +#include namespace Sapphire { diff --git a/src/world/Manager/ActionMgr.cpp b/src/world/Manager/ActionMgr.cpp index 43d14170..22280a1a 100644 --- a/src/world/Manager/ActionMgr.cpp +++ b/src/world/Manager/ActionMgr.cpp @@ -2,22 +2,16 @@ #include "Action/Action.h" #include "Action/ItemAction.h" +#include "Action/MountAction.h" #include "Script/ScriptMgr.h" #include "Actor/Player.h" #include -#include "Framework.h" #include using namespace Sapphire; -World::Manager::ActionMgr::ActionMgr( Sapphire::FrameworkPtr pFw ) : - BaseManager( pFw ) -{ - -} - void World::Manager::ActionMgr::handlePlacedPlayerAction( Entity::Player& player, uint32_t actionId, Data::ActionPtr actionData, Common::FFXIVARR_POSITION3 pos, uint16_t sequence ) @@ -25,7 +19,9 @@ void World::Manager::ActionMgr::handlePlacedPlayerAction( Entity::Player& player player.sendDebug( "got aoe act: {0}", actionData->name ); - auto action = Action::make_Action( player.getAsPlayer(), actionId, sequence, actionData, framework() ); + auto action = Action::make_Action( player.getAsPlayer(), actionId, sequence, actionData ); + + action->setPos( pos ); if( !action->init() ) return; @@ -37,8 +33,6 @@ void World::Manager::ActionMgr::handlePlacedPlayerAction( Entity::Player& player return; } - action->setPos( pos ); - bootstrapAction( player, action, *actionData ); } @@ -46,10 +40,12 @@ void World::Manager::ActionMgr::handleTargetedPlayerAction( Entity::Player& play Data::ActionPtr actionData, uint64_t targetId, uint16_t sequence ) { - auto action = Action::make_Action( player.getAsPlayer(), actionId, sequence, actionData, framework() ); + auto action = Action::make_Action( player.getAsPlayer(), actionId, sequence, actionData ); action->setTargetId( targetId ); + action->setPos( player.getPos() ); + if( !action->init() ) return; @@ -70,12 +66,28 @@ void World::Manager::ActionMgr::handleItemAction( Sapphire::Entity::Player& play player.sendDebug( "got item act: {0}, slot: {1}, container: {2}", itemId, itemSourceSlot, itemSourceContainer ); auto action = Action::make_ItemAction( player.getAsChara(), itemId, itemActionData, - itemSourceSlot, itemSourceContainer, framework() ); + itemSourceSlot, itemSourceContainer ); // todo: item actions don't have cast times? if so we can just start it and we're good action->start(); } +void World::Manager::ActionMgr::handleMountAction( Entity::Player& player, uint16_t mountId, + Data::ActionPtr actionData, uint64_t targetId, + uint16_t sequence ) +{ + player.sendDebug( "mount: {0}", mountId ); + + auto action = Action::make_MountAction( player.getAsPlayer(), mountId, sequence, actionData ); + + action->setTargetId( targetId ); + + if( !action->init() ) + return; + + bootstrapAction( player, action, *actionData ); +} + void World::Manager::ActionMgr::bootstrapAction( Entity::Player& player, Action::ActionPtr currentAction, Data::Action& actionData ) @@ -87,12 +99,20 @@ void World::Manager::ActionMgr::bootstrapAction( Entity::Player& player, return; } - // if we have a cast time we want to associate the action with the player so update is called - if( currentAction->hasCastTime() ) + if( player.getCurrentAction() ) { - player.setCurrentAction( currentAction ); + player.sendDebug( "Skill queued: {0}", currentAction->getId() ); + player.setQueuedAction( currentAction ); } + else + { + // if we have a cast time we want to associate the action with the player so update is called + if( currentAction->hasCastTime() ) + { + player.setCurrentAction( currentAction ); + } - // todo: what do in cases of swiftcast/etc? script callback? - currentAction->start(); + // todo: what do in cases of swiftcast/etc? script callback? + currentAction->start(); + } } \ No newline at end of file diff --git a/src/world/Manager/ActionMgr.h b/src/world/Manager/ActionMgr.h index 75e238e9..af58dc1d 100644 --- a/src/world/Manager/ActionMgr.h +++ b/src/world/Manager/ActionMgr.h @@ -1,7 +1,6 @@ #ifndef SAPPHIRE_ACTIONMGR_H #define SAPPHIRE_ACTIONMGR_H -#include "BaseManager.h" #include "ForwardsZone.h" namespace Sapphire::Data @@ -15,10 +14,10 @@ namespace Sapphire::Data namespace Sapphire::World::Manager { - class ActionMgr : public Manager::BaseManager + class ActionMgr { public: - explicit ActionMgr( FrameworkPtr pFw ); + ActionMgr() = default; ~ActionMgr() = default; void handleTargetedPlayerAction( Entity::Player& player, uint32_t actionId, @@ -29,6 +28,9 @@ namespace Sapphire::World::Manager void handleItemAction( Entity::Player& player, uint32_t itemId, Data::ItemActionPtr itemActionData, uint16_t itemSourceSlot, uint16_t itemSourceContainer ); + void handleMountAction( Entity::Player& player, uint16_t mountId, + Data::ActionPtr actionData, uint64_t targetId, uint16_t sequence ); + private: void bootstrapAction( Entity::Player& player, Action::ActionPtr currentAction, Data::Action& actionData ); diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 9fef637d..5daafd7f 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "DebugCommand/DebugCommand.h" #include "DebugCommandMgr.h" @@ -31,13 +32,13 @@ #include "Territory/HousingZone.h" #include "Territory/InstanceContent.h" #include "Territory/QuestBattle.h" +#include "Territory/PublicContent.h" #include "Manager/TerritoryMgr.h" #include "Event/EventDefs.h" #include "ServerMgr.h" #include "Session.h" -#include "Framework.h" using namespace Sapphire::Network; using namespace Sapphire::Network::Packets; @@ -45,8 +46,7 @@ using namespace Sapphire::Network::Packets::Server; using namespace Sapphire::World::Manager; // instanciate and initialize commands -Sapphire::World::Manager::DebugCommandMgr::DebugCommandMgr( FrameworkPtr pFw ) : - BaseManager( pFw ) +Sapphire::World::Manager::DebugCommandMgr::DebugCommandMgr() { // Push all commands onto the register map ( command name - function - description - required GM level ) registerCommand( "set", &DebugCommandMgr::set, "Executes SET commands.", 1 ); @@ -61,6 +61,8 @@ Sapphire::World::Manager::DebugCommandMgr::DebugCommandMgr( FrameworkPtr pFw ) : registerCommand( "script", &DebugCommandMgr::script, "Server script utilities.", 1 ); registerCommand( "instance", &DebugCommandMgr::instance, "Instance utilities", 1 ); registerCommand( "questbattle", &DebugCommandMgr::questBattle, "Quest battle utilities", 1 ); + registerCommand( "pc", &DebugCommandMgr::pc, "Public content utilities", 1 ); + registerCommand( "publiccontent", &DebugCommandMgr::pc, "Public content utilities", 1 ); registerCommand( "qb", &DebugCommandMgr::questBattle, "Quest battle utilities", 1 ); registerCommand( "housing", &DebugCommandMgr::housing, "Housing utilities", 1 ); } @@ -143,8 +145,8 @@ void Sapphire::World::Manager::DebugCommandMgr::help( char* data, Entity::Player void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pTerriMgr = framework()->get< TerritoryMgr >(); - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); std::string subCommand = ""; std::string params = ""; @@ -200,7 +202,7 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& int32_t aetheryteId; sscanf( params.c_str(), "%i", &aetheryteId ); - player.teleport( aetheryteId ); + player.teleport( static_cast< uint16_t >( aetheryteId ) ); } else if( ( subCommand == "discovery" ) && ( params != "" ) ) { @@ -209,31 +211,10 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& sscanf( params.c_str(), "%i %i", &map_id, &discover_id ); auto discoveryPacket = makeZonePacket< FFXIVIpcDiscovery >( player.getId() ); - discoveryPacket->data().map_id = map_id; - discoveryPacket->data().map_part_id = discover_id; + discoveryPacket->data().mapId = static_cast< uint32_t >( map_id ); + discoveryPacket->data().mapPartId = static_cast< uint32_t >( discover_id ); player.queuePacket( discoveryPacket ); } - - else if( ( subCommand == "discovery_pos" ) && ( params != "" ) ) - { - int32_t map_id; - int32_t discover_id; - int32_t pos_id; - sscanf( params.c_str(), "%i %i %i", &pos_id, &map_id, &discover_id ); - - std::string query2 = "UPDATE IGNORE `discoveryinfo` SET `discover_id` = '" + std::to_string( discover_id ) + - "' WHERE `discoveryinfo`.`id` = " + std::to_string( pos_id ) + ";"; - - std::string query1 = - "INSERT IGNORE INTO `discoveryinfo` (`id`, `map_id`, `discover_id`) VALUES ('" + std::to_string( pos_id ) + - "', '" + std::to_string( map_id ) + - "', '" + std::to_string( discover_id ) + "')"; - - pDb->execute( query1 ); - pDb->execute( query2 ); - - } - else if( subCommand == "discovery_reset" ) { player.resetDiscovery(); @@ -248,17 +229,21 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& if( player.getLevelForClass( static_cast< Common::ClassJob > ( id ) ) == 0 ) { player.setLevelForClass( 1, static_cast< Common::ClassJob > ( id ) ); - player.setClassJob( static_cast< Common::ClassJob > ( id ) ); } - else - player.setClassJob( static_cast< Common::ClassJob > ( id ) ); + player.setClassJob( static_cast< Common::ClassJob > ( id ) ); + player.sendModel(); + player.sendItemLevel(); + player.calculateStats(); + player.sendStats(); + player.sendStatusEffectUpdate(); + player.sendStatusUpdate(); } else if( subCommand == "cfpenalty" ) { int32_t minutes; sscanf( params.c_str(), "%d", &minutes ); - player.setCFPenaltyMinutes( minutes ); + player.setCFPenaltyMinutes( static_cast< uint32_t >( minutes ) ); } else if( subCommand == "eorzeatime" ) { @@ -274,7 +259,7 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& sscanf( params.c_str(), "%d", &id ); player.dismount(); - player.mount( id ); + player.mount( static_cast< uint32_t >( id ) ); } else if( subCommand == "msqguide" ) { @@ -282,7 +267,7 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& sscanf( params.c_str(), "%d", &id ); auto msqPacket = makeZonePacket< FFXIVIpcMSQTrackerProgress >( player.getId() ); - msqPacket->data().id = id; + msqPacket->data().id = static_cast< uint32_t >( id ); player.queuePacket( msqPacket ); player.sendDebug( "MSQ Guide updated " ); @@ -293,7 +278,7 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& sscanf( params.c_str(), "%d", &id ); auto msqPacket = makeZonePacket< FFXIVIpcMSQTrackerComplete >( player.getId() ); - msqPacket->data().id = id; + msqPacket->data().id = static_cast< uint32_t >( id ); player.queuePacket( msqPacket ); player.sendDebug( "MSQ Guide updated " ); @@ -313,11 +298,11 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& sscanf( params.c_str(), "%hu %hu", &festivalId, &additionalId ); - pTerriMgr->setCurrentFestival( festivalId, additionalId ); + terriMgr.setCurrentFestival( festivalId, additionalId ); } else if( subCommand == "festivaldisable" ) { - pTerriMgr->disableCurrentFestival(); + terriMgr.disableCurrentFestival(); } else if( subCommand == "BitFlag" ) { @@ -383,6 +368,24 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& } } } + else if( subCommand == "gauge" ) + { + uint8_t values[15]; + std::memset( values, 0, sizeof( values ) ); + sscanf( params.c_str(), "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", + &values[ 0 ], &values[ 1 ], &values[ 2 ], &values[ 3 ], &values[ 4 ], + &values[ 5 ], &values[ 6 ], &values[ 7 ], &values[ 8 ], &values[ 9 ], + &values[ 10 ], &values[ 11 ], &values[ 12 ], &values[ 13 ], &values[ 14 ] ); + player.gaugeSetRaw( values ); + } + else if( subCommand == "visual" ) + { + int32_t id; + sscanf( params.c_str(), "%d", &id ); + auto pPacket = makeZonePacket< FFXIVIpcCharaVisualEffect >( player.getId() ); + pPacket->data().id = id; + player.queuePacket( pPacket ); + } else { player.sendUrgent( "{0} is not a valid SET command.", subCommand ); @@ -393,6 +396,8 @@ void Sapphire::World::Manager::DebugCommandMgr::set( char* data, Entity::Player& void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + std::string subCommand; std::string params = ""; @@ -424,7 +429,7 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& sscanf( params.c_str(), "%d %d %hu", &id, &duration, ¶m ); auto effect = StatusEffect::make_StatusEffect( id, player.getAsPlayer(), player.getAsPlayer(), - duration, 3000, framework() ); + duration, 3000 ); effect->setParam( param ); player.addStatusEffect( effect ); @@ -434,14 +439,12 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& uint32_t titleId; sscanf( params.c_str(), "%u", &titleId ); - player.addTitle( titleId ); + player.addTitle( static_cast< uint16_t >( titleId ) ); player.sendNotice( "Added title (id#{0})", titleId ); } else if( subCommand == "bnpc" ) { - auto serverZone = framework()->get< World::ServerMgr >(); - - auto bNpcTemplate = serverZone->getBNpcTemplate( params ); + auto bNpcTemplate = serverMgr.getBNpcTemplate( params ); if( !bNpcTemplate ) { @@ -455,7 +458,7 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& player.getPos().y, player.getPos().z, player.getRot(), - 1, 1000, playerZone, framework() ); + 1, 1000, playerZone ); @@ -495,13 +498,13 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& player.sendNotice( "Injecting ACTOR_CONTROL {0}", opcode ); auto actorControl = makeZonePacket< FFXIVIpcActorControlSelf >( playerId, player.getId() ); - actorControl->data().category = opcode; - actorControl->data().param1 = param1; - actorControl->data().param2 = param2; - actorControl->data().param3 = param3; - actorControl->data().param4 = param4; - actorControl->data().param5 = param5; - actorControl->data().param6 = param6; + actorControl->data().category = static_cast< uint16_t >( opcode ); + actorControl->data().param1 = static_cast< uint16_t >( param1 ); + actorControl->data().param2 = static_cast< uint16_t >( param2 ); + actorControl->data().param3 = static_cast< uint16_t >( param3 ); + actorControl->data().param4 = static_cast< uint16_t >( param4 ); + actorControl->data().param5 = static_cast< uint16_t >( param5 ); + actorControl->data().param6 = static_cast< uint16_t >( param6 ); player.queuePacket( actorControl ); @@ -521,7 +524,7 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& uint32_t id; sscanf( params.c_str(), "%d", &id ); - player.learnAction( id ); + player.learnAction( static_cast< uint16_t >( id ) ); } else if ( subCommand == "effect") { @@ -532,9 +535,9 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& effectPacket->setRotation( Common::Util::floatToUInt16Rot( player.getRot() ) ); Common::EffectEntry entry{}; - entry.value = param1; + entry.value = static_cast< int16_t >( param1 ); entry.effectType = Common::ActionEffectType::Damage; - entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; + entry.param0 = static_cast< uint8_t >( Common::ActionHitSeverityType::NormalDamage ); effectPacket->addEffect( entry ); @@ -557,7 +560,7 @@ void Sapphire::World::Manager::DebugCommandMgr::add( char* data, Entity::Player& void Sapphire::World::Manager::DebugCommandMgr::get( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pExdData = framework()->get< Data::ExdDataGenerated >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); std::string subCommand; std::string params = ""; @@ -581,11 +584,25 @@ void Sapphire::World::Manager::DebugCommandMgr::get( char* data, Entity::Player& if( ( subCommand == "pos" ) ) { - int16_t map_id = pExdData->get< Sapphire::Data::TerritoryType >( player.getCurrentTerritory()->getTerritoryTypeId() )->map; + int16_t map_id = exdData.get< Sapphire::Data::TerritoryType >( player.getCurrentTerritory()->getTerritoryTypeId() )->map; - player.sendNotice( "Pos:\n {0}\n {1}\n {2}\n {3}\n MapId: {4}\n ZoneId:{5}", + player.sendNotice( "Pos: x: {0}, y: {1}, z: {2}, r: {3}\n MapId: {4}, ZoneId:{5}, Weather:{6}, Festival:{7}, {8}", player.getPos().x, player.getPos().y, player.getPos().z, - player.getRot(), map_id, player.getCurrentTerritory()->getTerritoryTypeId() ); + player.getRot(), map_id, player.getCurrentTerritory()->getTerritoryTypeId(), + static_cast< uint8_t >( player.getCurrentTerritory()->getCurrentWeather() ), player.getCurrentTerritory()->getCurrentFestival().first, + player.getCurrentTerritory()->getCurrentFestival().second ); + if( auto instance = player.getCurrentInstance() ) + { + player.sendNotice( "Instance info:\nContentId: {}, DirectorId: {}\nSequence: {}, Branch: {}, BGM: {}", + instance->getInstanceContentId(), instance->getDirectorId(), instance->getSequence(), + instance->getBranch(), instance->getCurrentBGM() ); + } + else if( auto instance = player.getCurrentPublicContent() ) + { + player.sendNotice( "Public content info:\nContentId: {}, DirectorId: {}\nSequence: {}, Branch: {}", + instance->getContentId(), instance->getDirectorId(), instance->getSequence(), + instance->getBranch() ); + } } else { @@ -598,8 +615,9 @@ void Sapphire::World::Manager::DebugCommandMgr::injectPacket( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pServerZone = framework()->get< World::ServerMgr >(); - auto pSession = pServerZone->getSession( player.getId() ); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + + auto pSession = serverMgr.getSession( player.getId() ); if( pSession ) pSession->getZoneConnection()->injectPacket( data + 7, player ); } @@ -607,8 +625,9 @@ Sapphire::World::Manager::DebugCommandMgr::injectPacket( char* data, Entity::Pla void Sapphire::World::Manager::DebugCommandMgr::injectChatPacket( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pServerZone = framework()->get< World::ServerMgr >(); - auto pSession = pServerZone->getSession( player.getId() ); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + + auto pSession = serverMgr.getSession( player.getId() ); if( pSession ) pSession->getChatConnection()->injectPacket( data + 8, player ); } @@ -616,7 +635,8 @@ void Sapphire::World::Manager::DebugCommandMgr::injectChatPacket( char* data, En void Sapphire::World::Manager::DebugCommandMgr::replay( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pServerZone = framework()->get< World::ServerMgr >(); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + std::string subCommand; std::string params = ""; @@ -641,19 +661,19 @@ void Sapphire::World::Manager::DebugCommandMgr::replay( char* data, Entity::Play if( subCommand == "start" ) { - auto pSession = pServerZone->getSession( player.getId() ); + auto pSession = serverMgr.getSession( player.getId() ); if( pSession ) pSession->startReplay( params ); } else if( subCommand == "stop" ) { - auto pSession = pServerZone->getSession( player.getId() ); + auto pSession = serverMgr.getSession( player.getId() ); if( pSession ) pSession->stopReplay(); } else if( subCommand == "info" ) { - auto pSession = pServerZone->getSession( player.getId() ); + auto pSession = serverMgr.getSession( player.getId() ); if( pSession ) pSession->sendReplayInfo(); } @@ -716,16 +736,17 @@ void Sapphire::World::Manager::DebugCommandMgr::serverInfo( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pServerZone = framework()->get< World::ServerMgr >(); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + player.sendDebug( "SapphireZone {0} \nRev: {1}", Version::VERSION, Version::GIT_HASH ); player.sendDebug( "Compiled: " __DATE__ " " __TIME__ ); - player.sendDebug( "Sessions: {0}", pServerZone->getSessionCount() ); + player.sendDebug( "Sessions: {0}", serverMgr.getSessionCount() ); } void Sapphire::World::Manager::DebugCommandMgr::script( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pScriptMgr = framework()->get< Scripting::ScriptMgr >(); + auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); std::string subCommand; std::string params = ""; @@ -751,7 +772,7 @@ void Sapphire::World::Manager::DebugCommandMgr::script( char* data, Entity::Play { if( subCommand == params ) player.sendDebug( "Command failed: requires name of script" ); - else if( pScriptMgr->getNativeScriptHandler().unloadScript( params ) ) + else if( scriptMgr.getNativeScriptHandler().unloadScript( params ) ) player.sendDebug( "Unloaded script successfully." ); else player.sendDebug( "Failed to unload script: {0}", params ); @@ -763,7 +784,7 @@ void Sapphire::World::Manager::DebugCommandMgr::script( char* data, Entity::Play else { std::set< Sapphire::Scripting::ScriptInfo* > scripts; - pScriptMgr->getNativeScriptHandler().findScripts( scripts, params ); + scriptMgr.getNativeScriptHandler().findScripts( scripts, params ); if( !scripts.empty() ) { @@ -785,7 +806,7 @@ void Sapphire::World::Manager::DebugCommandMgr::script( char* data, Entity::Play player.sendDebug( "Command failed: requires relative path to script" ); else { - if( pScriptMgr->getNativeScriptHandler().loadScript( params ) ) + if( scriptMgr.getNativeScriptHandler().loadScript( params ) ) player.sendDebug( "Loaded '{0}' successfully", params ); else player.sendDebug( "Failed to load '{0}'", params ); @@ -798,7 +819,7 @@ void Sapphire::World::Manager::DebugCommandMgr::script( char* data, Entity::Play player.sendDebug( "Command failed: requires name of script to reload" ); else { - pScriptMgr->getNativeScriptHandler().queueScriptReload( params ); + scriptMgr.getNativeScriptHandler().queueScriptReload( params ); player.sendDebug( "Queued script reload for script: {0}", params ); } } @@ -811,7 +832,7 @@ void Sapphire::World::Manager::DebugCommandMgr::script( char* data, Entity::Play void Sapphire::World::Manager::DebugCommandMgr::instance( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pTeriMgr = framework()->get< TerritoryMgr >(); + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); std::string cmd( data ), params, subCommand; auto cmdPos = cmd.find_first_of( ' ' ); @@ -835,7 +856,7 @@ void Sapphire::World::Manager::DebugCommandMgr::instance( char* data, Entity::Pl uint32_t contentFinderConditionId; sscanf( params.c_str(), "%d", &contentFinderConditionId ); - auto instance = pTeriMgr->createInstanceContent( contentFinderConditionId ); + auto instance = terriMgr.createInstanceContent( contentFinderConditionId ); if( instance ) player.sendDebug( "Created instance with id#{0} -> {1}", instance->getGuId(), instance->getName() ); else @@ -846,7 +867,7 @@ void Sapphire::World::Manager::DebugCommandMgr::instance( char* data, Entity::Pl uint32_t instanceId; sscanf( params.c_str(), "%d", &instanceId ); - auto terri = pTeriMgr->getTerritoryByGuId( instanceId ); + auto terri = terriMgr.getTerritoryByGuId( instanceId ); if( terri ) { auto pInstanceContent = terri->getAsInstanceContent(); @@ -869,7 +890,7 @@ void Sapphire::World::Manager::DebugCommandMgr::instance( char* data, Entity::Pl uint32_t instanceId; sscanf( params.c_str(), "%d", &instanceId ); - auto instance = pTeriMgr->getTerritoryByGuId( instanceId ); + auto instance = terriMgr.getTerritoryByGuId( instanceId ); if( !instance ) { player.sendDebug( "Unknown instance with id#{0} ", instanceId ); @@ -891,7 +912,7 @@ void Sapphire::World::Manager::DebugCommandMgr::instance( char* data, Entity::Pl uint32_t zoneId; sscanf( params.c_str(), "%d", &zoneId ); - auto instance = pTeriMgr->createTerritoryInstance( zoneId ); + auto instance = terriMgr.createTerritoryInstance( zoneId ); if( instance ) player.sendDebug( "Created instance with id: " + std::to_string( instance->getGuId() ) + " -> " + instance->getName() ); @@ -903,7 +924,7 @@ void Sapphire::World::Manager::DebugCommandMgr::instance( char* data, Entity::Pl uint32_t terriId; sscanf( params.c_str(), "%d", &terriId ); - if( pTeriMgr->removeTerritoryInstance( terriId ) ) + if( terriMgr.removeTerritoryInstance( terriId ) ) player.sendDebug( "Removed instance with id#{0}", terriId ); else player.sendDebug( "Failed to remove instance with id#{0}", terriId ); @@ -1031,7 +1052,7 @@ void Sapphire::World::Manager::DebugCommandMgr::instance( char* data, Entity::Pl void Sapphire::World::Manager::DebugCommandMgr::questBattle( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pTeriMgr = framework()->get< TerritoryMgr >(); + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); std::string cmd( data ), params, subCommand; auto cmdPos = cmd.find_first_of( ' ' ); @@ -1055,7 +1076,7 @@ void Sapphire::World::Manager::DebugCommandMgr::questBattle( char* data, Entity: uint32_t contentFinderConditionId; sscanf( params.c_str(), "%d", &contentFinderConditionId ); - auto instance = pTeriMgr->createQuestBattle( contentFinderConditionId ); + auto instance = terriMgr.createQuestBattle( contentFinderConditionId ); if( instance ) player.sendDebug( "Created instance with id#{0} -> {1}", instance->getGuId(), instance->getName() ); else @@ -1086,7 +1107,7 @@ void Sapphire::World::Manager::DebugCommandMgr::questBattle( char* data, Entity: uint32_t zoneId; sscanf( params.c_str(), "%d", &zoneId ); - auto instance = pTeriMgr->createTerritoryInstance( zoneId ); + auto instance = terriMgr.createTerritoryInstance( zoneId ); if( instance ) player.sendDebug( "Created instance with id: " + std::to_string( instance->getGuId() ) + " -> " + instance->getName() ); @@ -1098,7 +1119,7 @@ void Sapphire::World::Manager::DebugCommandMgr::questBattle( char* data, Entity: uint32_t terriId; sscanf( params.c_str(), "%d", &terriId ); - if( pTeriMgr->removeTerritoryInstance( terriId ) ) + if( terriMgr.removeTerritoryInstance( terriId ) ) player.sendDebug( "Removed instance with id#{0}", terriId ); else player.sendDebug( "Failed to remove instance with id#{0}", terriId ); @@ -1226,7 +1247,7 @@ void Sapphire::World::Manager::DebugCommandMgr::questBattle( char* data, Entity: void Sapphire::World::Manager::DebugCommandMgr::housing( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { - auto pTeriMgr = framework()->get< TerritoryMgr >(); + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); std::string cmd( data ), params, subCommand; auto cmdPos = cmd.find_first_of( ' ' ); @@ -1253,7 +1274,7 @@ void Sapphire::World::Manager::DebugCommandMgr::housing( char* data, Entity::Pla // if ( permissionSet < 5 ) // { // auto pZone = player.getCurrentTerritory(); -// if( pTeriMgr->isHousingTerritory( pZone->getTerritoryTypeId() ) ) +// if( terriMgr.isHousingTerritory( pZone->getTerritoryTypeId() ) ) // { // auto pHousing = std::dynamic_pointer_cast< HousingZone >( pZone ); // if( pHousing ) @@ -1278,3 +1299,137 @@ void Sapphire::World::Manager::DebugCommandMgr::housing( char* data, Entity::Pla player.sendDebug( "Unknown sub command." ); } } + +void Sapphire::World::Manager::DebugCommandMgr::pc( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) +{ + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); + std::string cmd( data ), params, subCommand; + auto cmdPos = cmd.find_first_of( ' ' ); + + if( cmdPos != std::string::npos ) + { + params = cmd.substr( cmdPos + 1 ); + + auto p = params.find_first_of( ' ' ); + + if( p != std::string::npos ) + { + subCommand = params.substr( 0, p ); + params = params.substr( subCommand.length() + 1 ); + } + else + subCommand = params; + } + + if( subCommand == "create" || subCommand == "cr" ) + { + uint32_t contentFinderConditionId; + sscanf( params.c_str(), "%d", &contentFinderConditionId ); + + auto instance = terriMgr.createPublicContent( contentFinderConditionId ); + if( instance ) + player.sendDebug( "Created instance with id#{0} -> {1}", instance->getGuId(), instance->getName() ); + else + player.sendDebug( "Failed to create instance with id#{0}", contentFinderConditionId ); + } + else if ( subCommand == "create2" || subCommand == "cr2" ) + { + uint16_t contentId, terriId; + sscanf( params.c_str(), "%hu %hu", &contentId, &terriId ); + + auto instance = terriMgr.createPublicContent( contentId, terriId ); + if( instance ) + player.sendDebug( "Created instance with id#{0} -> {1}", instance->getGuId(), instance->getName() ); + else + player.sendDebug( "Failed to create instance with id#{0}, territory#{1}. Server console output may contain additional info.", contentId, terriId ); + } + else if( subCommand == "remove" || subCommand == "rm" ) + { + uint32_t terriId; + sscanf( params.c_str(), "%d", &terriId ); + + if( terriMgr.removeTerritoryInstance( terriId ) ) + player.sendDebug( "Removed instance with id#{0}", terriId ); + else + player.sendDebug( "Failed to remove instance with id#{0}", terriId ); + } + else if( subCommand == "return" || subCommand == "ret" ) + { + player.exitInstance(); + } + else if( subCommand == "set" ) + { + uint32_t index; + uint32_t value; + sscanf( params.c_str(), "%d %d", &index, &value ); + + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + instance->setVar( static_cast< uint8_t >( index ), static_cast< uint8_t >( value ) ); + } + else if( subCommand == "seq" ) + { + uint8_t seq; + + sscanf( params.c_str(), "%hhu", &seq ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + instance->setSequence( seq ); + } + else if( subCommand == "branch" ) + { + uint8_t branch; + + sscanf( params.c_str(), "%hhu", &branch ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + instance->setBranch( branch ); + } + else if( subCommand == "objstate" ) + { + char objName[128]; + uint8_t state; + + sscanf( params.c_str(), "%s %hhu", objName, &state ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + auto obj = instance->getEObjByName( objName ); + if( !obj ) + return; + + obj->setState( state ); + } + else if( subCommand == "objflag" ) + { + char objName[256]; + uint32_t state1; + uint32_t state2; + + sscanf( params.c_str(), "%s %i %i", objName, &state1, &state2 ); + + auto instance = std::dynamic_pointer_cast< PublicContent >( player.getCurrentTerritory() ); + if( !instance ) + return; + + auto obj = instance->getEObjByName( objName ); + if( !obj ) + { + player.sendDebug( "No eobj found." ); + return; + } + + obj->setAnimationFlag( state1, state2 ); + } +} diff --git a/src/world/Manager/DebugCommandMgr.h b/src/world/Manager/DebugCommandMgr.h index 160d7380..2607f6ab 100644 --- a/src/world/Manager/DebugCommandMgr.h +++ b/src/world/Manager/DebugCommandMgr.h @@ -6,20 +6,19 @@ #include "DebugCommand/DebugCommand.h" #include "ForwardsZone.h" -#include "BaseManager.h" namespace Sapphire::World::Manager { // handler for in game commands - class DebugCommandMgr : public Manager::BaseManager + class DebugCommandMgr { private: // container mapping command string to command object std::map< std::string, std::shared_ptr< DebugCommand > > m_commandMap; public: - DebugCommandMgr( FrameworkPtr pFw ); + DebugCommandMgr(); ~DebugCommandMgr(); @@ -54,6 +53,7 @@ namespace Sapphire::World::Manager void instance( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ); void questBattle( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ); + void pc( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ); void housing( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command) ; diff --git a/src/world/Manager/EventMgr.cpp b/src/world/Manager/EventMgr.cpp index 58c6f909..bc417c11 100644 --- a/src/world/Manager/EventMgr.cpp +++ b/src/world/Manager/EventMgr.cpp @@ -1,23 +1,17 @@ #include #include #include +#include -#include "Framework.h" #include "EventMgr.h" #include "Event/EventHandler.h" using namespace Sapphire::Common; -Sapphire::World::Manager::EventMgr::EventMgr( Sapphire::FrameworkPtr pFw ) : - BaseManager( pFw ) -{ - -} - std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) { - auto pExdData = framework()->get< Data::ExdDataGenerated >(); - uint16_t eventType = eventId >> 16; + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto eventType = static_cast< Event::EventHandler::EventHandlerType >( eventId >> 16 ); auto unknown = std::string{ "unknown" }; @@ -25,7 +19,7 @@ std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) { case Event::EventHandler::EventHandlerType::Quest: { - auto questInfo = pExdData->get< Sapphire::Data::Quest >( eventId ); + auto questInfo = exdData.get< Sapphire::Data::Quest >( eventId ); if( !questInfo ) return unknown + "Quest"; @@ -36,7 +30,7 @@ std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) } case Event::EventHandler::EventHandlerType::CustomTalk: { - auto customTalkInfo = pExdData->get< Sapphire::Data::CustomTalk >( eventId ); + auto customTalkInfo = exdData.get< Sapphire::Data::CustomTalk >( eventId ); if( !customTalkInfo ) return unknown + "CustomTalk"; @@ -47,34 +41,30 @@ std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) } case Event::EventHandler::EventHandlerType::Opening: { - auto openingInfo = pExdData->get< Sapphire::Data::Opening >( eventId ); + auto openingInfo = exdData.get< Sapphire::Data::Opening >( eventId ); if( openingInfo ) return openingInfo->name; return unknown + "Opening"; } case Event::EventHandler::EventHandlerType::Aetheryte: { - auto aetherInfo = pExdData->get< Sapphire::Data::Aetheryte >( eventId & 0xFFFF ); + auto aetherInfo = exdData.get< Sapphire::Data::Aetheryte >( eventId & 0xFFFF ); if( aetherInfo->isAetheryte ) return "Aetheryte"; return "Aethernet"; } case Event::EventHandler::EventHandlerType::ICDirector: { - auto contentInfo = pExdData->get< Sapphire::Data::InstanceContent >( eventId & 0xFFFF ); - std::string name = contentInfo->name; - std::string remove( ",★_ '()[]-\x1a\x1\x2\x1f\x1\x3.:" ); - Util::eraseAllIn( name, remove ); - name[ 0 ] = toupper( name[ 0 ] ); - return name; + // auto contentInfo = pExdData->get< Sapphire::Data::InstanceContent >( eventId & 0xFFFF ); + return "InstanceContentDirector#" + std::to_string( eventId & 0xFFFF ); } case Event::EventHandler::EventHandlerType::QuestBattleDirector: { - auto qbInfo = pExdData->get< Sapphire::Data::QuestBattle >( eventId & 0xFFFF ); + auto qbInfo = exdData.get< Sapphire::Data::QuestBattle >( eventId & 0xFFFF ); if( !qbInfo ) return "unknown"; - auto questInfo = pExdData->get< Sapphire::Data::Quest >( qbInfo->quest ); + auto questInfo = exdData.get< Sapphire::Data::Quest >( qbInfo->quest ); if( !questInfo ) return "unknown"; @@ -84,11 +74,18 @@ std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) name[ 0 ] = toupper( name[ 0 ] ); return name; } + case Event::EventHandler::EventHandlerType::PublicContentDirector: + { + auto pcInfo = exdData.get< Sapphire::Data::PublicContent >( eventId & 0x0000FFFF ); + if( !pcInfo ) + return "unknown"; + return pcInfo->name; + } case Event::EventHandler::EventHandlerType::Warp: { - auto warpInfo = pExdData->get< Sapphire::Data::Warp >( eventId ); + auto warpInfo = exdData.get< Sapphire::Data::Warp >( eventId ); if( warpInfo ) return "WarpTaxi"; return unknown + "ChocoboWarp"; //who know @@ -96,7 +93,7 @@ std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) case Event::EventHandler::EventHandlerType::Shop: { - auto shopInfo = pExdData->get< Sapphire::Data::GilShop >( eventId ); + auto shopInfo = exdData.get< Sapphire::Data::GilShop >( eventId ); return "GilShop" + std::to_string( eventId ); /*if( shopInfo ) @@ -116,8 +113,8 @@ std::string Sapphire::World::Manager::EventMgr::getEventName( uint32_t eventId ) uint32_t Sapphire::World::Manager::EventMgr::mapEventActorToRealActor( uint32_t eventActorId ) { - auto pExdData = framework()->get< Data::ExdDataGenerated >(); - auto levelInfo = pExdData->get< Sapphire::Data::Level >( eventActorId ); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto levelInfo = exdData.get< Sapphire::Data::Level >( eventActorId ); if( levelInfo ) return levelInfo->object; diff --git a/src/world/Manager/EventMgr.h b/src/world/Manager/EventMgr.h index 1a69ac02..a8bb036d 100644 --- a/src/world/Manager/EventMgr.h +++ b/src/world/Manager/EventMgr.h @@ -3,15 +3,14 @@ #include #include -#include "Manager/BaseManager.h" namespace Sapphire::World::Manager { - class EventMgr : public BaseManager + class EventMgr { public: - EventMgr( FrameworkPtr pFw ); + EventMgr() = default; std::string getEventName( uint32_t eventId ); diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 028d25cc..3e98a7f7 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -10,6 +10,7 @@ #include #include +#include #include "Actor/Player.h" #include "Actor/EventObject.h" @@ -21,7 +22,6 @@ #include "Territory/Housing/HousingInteriorTerritory.h" #include "HousingMgr.h" #include "Territory/Land.h" -#include "Framework.h" #include "ServerMgr.h" #include "Territory/House.h" #include "InventoryMgr.h" @@ -34,8 +34,7 @@ using namespace Sapphire::Network; using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::Server; -Sapphire::World::Manager::HousingMgr::HousingMgr( FrameworkPtr pFw ) : - BaseManager( pFw ) +Sapphire::World::Manager::HousingMgr::HousingMgr() { m_containerMap[ 0 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems1, InventoryType::HousingInteriorStoreroom1 ); m_containerMap[ 1 ] = std::make_pair( InventoryType::HousingInteriorPlacedItems2, InventoryType::HousingInteriorStoreroom2 ); @@ -113,10 +112,10 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories() { Logger::info( "HousingMgr: Loading inventories for estates" ); - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); - auto stmt = pDb->getPreparedStatement( Db::LAND_INV_SEL_ALL ); - auto res = pDb->query( stmt ); + auto stmt = db.getPreparedStatement( Db::LAND_INV_SEL_ALL ); + auto res = db.query( stmt ); uint32_t itemCount = 0; while( res->next() ) @@ -130,7 +129,7 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories() auto stain = res->getUInt8( "stain" ); auto characterId = res->getUInt64( "CharacterId" ); - auto item = Inventory::make_HousingItem( itemId, catalogId, framework() ); + auto item = Inventory::make_HousingItem( itemId, catalogId ); item->setStain( stain ); item->setStackSize( 1 ); // todo: need to set the owner character id on the item @@ -159,7 +158,7 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories() continue; } - container->second->setItem( slot, item ); + container->second->setItem( static_cast< uint8_t >( slot ), item ); itemCount++; } @@ -171,10 +170,10 @@ bool Sapphire::World::Manager::HousingMgr::loadEstateInventories() void Sapphire::World::Manager::HousingMgr::initLandCache() { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); - auto stmt = pDb->getPreparedStatement( Db::LAND_SEL_ALL ); - auto res = pDb->query( stmt ); + auto stmt = db.getPreparedStatement( Db::LAND_SEL_ALL ); + auto res = db.query( stmt ); while( res->next() ) { @@ -182,7 +181,7 @@ void Sapphire::World::Manager::HousingMgr::initLandCache() // land stuff entry.m_landSetId = res->getUInt64( "LandSetId" ); - entry.m_landId = res->getUInt( "LandId" ); + entry.m_landId = static_cast< uint16_t >( res->getUInt( "LandId" ) ); entry.m_type = static_cast< Common::LandType >( res->getUInt( "Type" ) ); entry.m_size = static_cast< Common::HouseSize >( res->getUInt8( "Size" ) ); @@ -233,16 +232,16 @@ void Sapphire::World::Manager::HousingMgr::initLandCache() // setup containers // todo: this is pretty garbage Common::LandIdent ident; - ident.territoryTypeId = entry.m_landSetId >> 16; - ident.wardNum = entry.m_landSetId & 0xFFFF; - ident.landId = entry.m_landId; + ident.territoryTypeId = static_cast< int16_t >( entry.m_landSetId >> 16 ); + ident.wardNum = static_cast< int16_t >( entry.m_landSetId & 0xFFFF ); + ident.landId = static_cast< int16_t >( entry.m_landId ); ident.worldId = 67; auto& containers = getEstateInventory( ident ); auto makeContainer = [ &containers, this ]( Common::InventoryType type, uint16_t size ) { - containers[ type ] = make_ItemContainer( type, size, "houseiteminventory", false, framework(), false ); + containers[ type ] = make_ItemContainer( type, size, "houseiteminventory", false, false ); }; uint16_t count = 0; @@ -272,8 +271,8 @@ void Sapphire::World::Manager::HousingMgr::initLandCache() uint64_t Sapphire::World::Manager::HousingMgr::getNextHouseId() { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto pQR = pDb->query( "SELECT MAX( HouseId ) FROM house" ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto pQR = db.query( "SELECT MAX( HouseId ) FROM house" ); if( !pQR->next() ) return 0; @@ -288,14 +287,14 @@ uint32_t Sapphire::World::Manager::HousingMgr::toLandSetId( uint16_t territoryTy Sapphire::Data::HousingZonePtr Sapphire::World::Manager::HousingMgr::getHousingZoneByLandSetId( uint32_t id ) { - auto pTeriMgr = framework()->get< TerritoryMgr >(); - return std::dynamic_pointer_cast< HousingZone >( pTeriMgr->getZoneByLandSetId( id ) ); + auto& terriMgr = Common::Service< TerritoryMgr >::ref(); + return std::dynamic_pointer_cast< HousingZone >( terriMgr.getZoneByLandSetId( id ) ); } Sapphire::LandPtr Sapphire::World::Manager::HousingMgr::getLandByOwnerId( uint32_t id ) { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto res = pDb->query( "SELECT LandSetId, LandId FROM land WHERE OwnerId = " + std::to_string( id ) ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto res = db.query( "SELECT LandSetId, LandId FROM land WHERE OwnerId = " + std::to_string( id ) ); if( !res->next() ) return nullptr; @@ -305,20 +304,22 @@ Sapphire::LandPtr Sapphire::World::Manager::HousingMgr::getLandByOwnerId( uint32 if( !hZone ) return nullptr; - return hZone->getLand( res->getUInt( 2 ) ); + return hZone->getLand( static_cast< uint8_t >( res->getUInt( 2 ) ) ); } void Sapphire::World::Manager::HousingMgr::sendLandSignOwned( Entity::Player& player, const Common::LandIdent ident ) { - player.setActiveLand( ident.landId, ident.wardNum ); + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + player.setActiveLand( static_cast< uint8_t >( ident.landId ), static_cast< uint8_t >( ident.wardNum ) ); + + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( ident.landId ); + auto land = hZone->getLand( static_cast< uint8_t >( ident.landId ) ); if( !land ) return; @@ -335,8 +336,9 @@ void Sapphire::World::Manager::HousingMgr::sendLandSignOwned( Entity::Player& pl std::strcpy( landInfoSignPacket->data().estateGreeting, house->getHouseGreeting().c_str() ); } - uint32_t playerId = land->getOwnerId(); - std::string playerName = framework()->get< World::ServerMgr >()->getPlayerNameFromDb( playerId ); + uint32_t playerId = static_cast< uint32_t >( land->getOwnerId() ); + + std::string playerName = serverMgr.getPlayerNameFromDb( playerId ); memcpy( &landInfoSignPacket->data().ownerName, playerName.c_str(), playerName.size() ); @@ -345,15 +347,15 @@ void Sapphire::World::Manager::HousingMgr::sendLandSignOwned( Entity::Player& pl void Sapphire::World::Manager::HousingMgr::sendLandSignFree( Entity::Player& player, const Common::LandIdent ident ) { - player.setActiveLand( ident.landId, ident.wardNum ); + player.setActiveLand( static_cast< uint8_t >( ident.landId ), static_cast< uint8_t >( ident.wardNum ) ); - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( ident.landId ); + auto land = hZone->getLand( static_cast< uint8_t >( ident.landId ) ); auto plotPricePacket = makeZonePacket< Server::FFXIVIpcLandPriceUpdate >( player.getId() ); plotPricePacket->data().price = land->getCurrentPrice(); plotPricePacket->data().timeLeft = land->getDevaluationTime(); @@ -463,6 +465,8 @@ bool Sapphire::World::Manager::HousingMgr::relinquishLand( Entity::Player& playe void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& player, uint8_t wardId, uint16_t territoryTypeId ) { + auto& serverMgr = Common::Service< World::ServerMgr >::ref(); + auto landSetId = toLandSetId( territoryTypeId, wardId ); auto hZone = getHousingZoneByLandSetId( landSetId ); @@ -471,7 +475,7 @@ void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& pla auto wardInfoPacket = makeZonePacket< Server::FFXIVIpcHousingWardInfo >( player.getId() ); wardInfoPacket->data().landIdent.wardNum = wardId; - wardInfoPacket->data().landIdent.territoryTypeId = territoryTypeId; + wardInfoPacket->data().landIdent.territoryTypeId = static_cast< int16_t >( territoryTypeId ); // todo: properly get worldId wardInfoPacket->data().landIdent.worldId = 67; @@ -509,7 +513,7 @@ void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& pla entry.infoFlags |= Common::WardlandFlags::IsEstateOwned; auto owner = land->getOwnerId(); - auto playerName = framework()->get< World::ServerMgr >()->getPlayerNameFromDb( owner ); + auto playerName = serverMgr.getPlayerNameFromDb( static_cast< uint32_t >( owner ) ); memcpy( &entry.estateOwnerName, playerName.c_str(), playerName.size() ); break; @@ -524,13 +528,13 @@ void Sapphire::World::Manager::HousingMgr::sendWardLandInfo( Entity::Player& pla void Sapphire::World::Manager::HousingMgr::sendEstateGreeting( Entity::Player& player, const Common::LandIdent ident ) { - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( ident.landId ); + auto land = hZone->getLand( static_cast< uint8_t >( ident.landId ) ); if( !land ) return; @@ -556,16 +560,16 @@ bool Sapphire::World::Manager::HousingMgr::initHouseModels( Entity::Player& play auto itemMax = land->getInventoryItemMax(); // type, maxSize, tableName, isMultiStorage - auto intContainer = make_ItemContainer( InventoryType::HousingInteriorAppearance, itemMax.second, "houseiteminventory", true, framework() ); - auto extContainer = make_ItemContainer( InventoryType::HousingExteriorAppearance, itemMax.first, "houseiteminventory", true, framework() ); + auto intContainer = make_ItemContainer( InventoryType::HousingInteriorAppearance, itemMax.second, "houseiteminventory", true ); + auto extContainer = make_ItemContainer( InventoryType::HousingExteriorAppearance, itemMax.first, "houseiteminventory", true ); // add containers to inv collection auto& houseInventory = getEstateInventory( house->getLandIdent() ); houseInventory[ InventoryType::HousingInteriorAppearance ] = intContainer; houseInventory[ InventoryType::HousingExteriorAppearance ] = extContainer; - auto exdData = framework()->get< Sapphire::Data::ExdDataGenerated >(); - auto preset = exdData->get< Sapphire::Data::HousingPreset >( getItemAdditionalData( presetCatalogId ) ); + auto& exdData = Common::Service< Sapphire::Data::ExdDataGenerated >::ref(); + auto preset = exdData.get< Sapphire::Data::HousingPreset >( getItemAdditionalData( presetCatalogId ) ); if( !preset ) return false; @@ -617,7 +621,7 @@ bool Sapphire::World::Manager::HousingMgr::initHouseModels( Entity::Player& play } }; - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); // create and link items for( auto& destContainer : invMap ) @@ -630,12 +634,12 @@ bool Sapphire::World::Manager::HousingMgr::initHouseModels( Entity::Player& play if( item.second == 0 ) continue; - auto pItem = invMgr->createItem( player, item.second ); + auto pItem = invMgr.createItem( player, static_cast< uint32_t >( item.second ) ); - container->setItem( item.first, pItem ); + container->setItem( static_cast< uint8_t >( item.first ), pItem ); } - invMgr->saveHousingContainer( land->getLandIdent(), container ); + invMgr.saveHousingContainer( land->getLandIdent(), container ); } // lift off @@ -646,16 +650,16 @@ bool Sapphire::World::Manager::HousingMgr::initHouseModels( Entity::Player& play void Sapphire::World::Manager::HousingMgr::createHouse( Sapphire::HousePtr house ) const { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); - auto stmt = pDb->getPreparedStatement( Db::HOUSING_HOUSE_INS ); + auto stmt = db.getPreparedStatement( Db::HOUSING_HOUSE_INS ); // LandSetId, HouseId, HouseName stmt->setUInt( 1, house->getLandSetId() ); stmt->setUInt( 2, house->getId() ); stmt->setString( 3, house->getHouseName() ); - pDb->execute( stmt ); + db.execute( stmt ); } void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& player, uint8_t plotNum, uint32_t presetCatalogId ) @@ -675,7 +679,7 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl // create house auto ident = pLand->getLandIdent(); auto house = make_House( getNextHouseId(), pLand->getLandSetId(), ident, - "Estate #" + std::to_string( ident.landId + 1 ), "", framework() ); + "Estate #" + std::to_string( ident.landId + 1 ), "" ); pLand->setHouse( house ); @@ -698,10 +702,12 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl pLand->updateLandDb(); - // start house built event + // start house built event - disabled because it fucks your audio device // CmnDefHousingBuildHouse_00149 - player.eventStart( player.getId(), 0x000B0095, Event::EventHandler::EventType::Housing, 1, 1 ); - player.playScene( 0x000B0095, 0, SET_BASE | HIDE_HOTBAR , 0, 1, plotNum, nullptr ); + //player.eventStart( player.getId(), 0x000B0095, Event::EventHandler::EventType::Housing, 1, 1 ); + //player.playScene( 0x000B0095, 0, static_cast< uint32_t >( SET_BASE | HIDE_HOTBAR ) , 0, 1, plotNum, nullptr ); + // instead we do a fake zone to unlock the client + Common::Service< TerritoryMgr >::ref().movePlayer( player.getCurrentTerritory(), player.getAsPlayer() ); player.setLandFlags( LandFlagsSlot::Private, EstateBuilt, ident ); player.sendLandFlagsSlot( LandFlagsSlot::Private ); @@ -711,13 +717,13 @@ void Sapphire::World::Manager::HousingMgr::buildPresetEstate( Entity::Player& pl void Sapphire::World::Manager::HousingMgr::requestEstateRename( Entity::Player& player, const Common::LandIdent ident ) { - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( ident.landId ); + auto land = hZone->getLand( static_cast< uint8_t >( ident.landId ) ); auto house = land->getHouse(); if( !house ) @@ -733,13 +739,13 @@ void Sapphire::World::Manager::HousingMgr::requestEstateRename( Entity::Player& void Sapphire::World::Manager::HousingMgr::requestEstateEditGreeting( Entity::Player& player, const Common::LandIdent ident ) { - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) return; - auto land = hZone->getLand( ident.landId ); + auto land = hZone->getLand( static_cast< uint8_t >( ident.landId ) ); if( !land ) return; @@ -757,13 +763,13 @@ void Sapphire::World::Manager::HousingMgr::requestEstateEditGreeting( Entity::Pl void Sapphire::World::Manager::HousingMgr::updateEstateGreeting( Entity::Player& player, const Common::LandIdent ident, const std::string& greeting ) { - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto zone = getHousingZoneByLandSetId( landSetId ); if( !zone ) return; - auto land = zone->getLand( ident.landId ); + auto land = zone->getLand( static_cast< uint8_t >( ident.landId ) ); if( !land ) return; @@ -782,7 +788,7 @@ void Sapphire::World::Manager::HousingMgr::updateEstateGreeting( Entity::Player& void Sapphire::World::Manager::HousingMgr::requestEstateEditGuestAccess( Entity::Player& player, const Common::LandIdent ident ) { - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto hZone = getHousingZoneByLandSetId( landSetId ); if( !hZone ) @@ -804,13 +810,13 @@ void Sapphire::World::Manager::HousingMgr::requestEstateEditGuestAccess( Entity: Sapphire::Common::LandIdent Sapphire::World::Manager::HousingMgr::clientTriggerParamsToLandIdent( uint32_t param11, uint32_t param12, bool use16bits ) const { Common::LandIdent ident; - ident.worldId = param11 >> 16; - ident.territoryTypeId = param11 & 0xFFFF; + ident.worldId = static_cast< int16_t >( param11 >> 16 ); + ident.territoryTypeId = static_cast< int16_t >( param11 & 0xFFFF ); if( use16bits ) { - ident.wardNum = param12 >> 16; - ident.landId = param12 & 0xFFFF; + ident.wardNum = static_cast< int16_t >( param12 >> 16 ); + ident.landId = static_cast< int16_t >( param12 & 0xFFFF ); } else { @@ -837,13 +843,13 @@ void Sapphire::World::Manager::HousingMgr::sendEstateInventory( Entity::Player& auto ident = internalZone->getLandIdent(); - auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSetId = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); auto exteriorZone = getHousingZoneByLandSetId( landSetId ); if( !exteriorZone ) return; - targetLand = exteriorZone->getLand( ident.landId ); + targetLand = exteriorZone->getLand( static_cast< uint8_t >( ident.landId ) ); } else { @@ -865,8 +871,8 @@ void Sapphire::World::Manager::HousingMgr::sendEstateInventory( Entity::Player& if( it == containers.end() ) return; - auto invMgr = framework()->get< Manager::InventoryMgr >(); - invMgr->sendInventoryContainer( player, it->second ); + auto& invMgr = Common::Service< Manager::InventoryMgr >::ref(); + invMgr.sendInventoryContainer( player, it->second ); } const Sapphire::World::Manager::HousingMgr::LandSetLandCacheMap& @@ -899,6 +905,8 @@ void Sapphire::World::Manager::HousingMgr::updateHouseModels( Sapphire::HousePtr { assert( house ); + house->clearModelCache(); + auto& containers = getEstateInventory( house->getLandIdent() ); auto extContainer = containers.find( static_cast< uint16_t >( InventoryType::HousingExteriorAppearance ) ); @@ -940,8 +948,8 @@ void Sapphire::World::Manager::HousingMgr::updateHouseModels( Sapphire::HousePtr uint32_t Sapphire::World::Manager::HousingMgr::getItemAdditionalData( uint32_t catalogId ) { - auto pExdData = framework()->get< Data::ExdDataGenerated >(); - auto info = pExdData->get< Sapphire::Data::Item >( catalogId ); + auto& pExdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto info = pExdData.get< Sapphire::Data::Item >( catalogId ); return info->additionalData; } @@ -974,7 +982,7 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceHousingItem( Sapphire::Entity // inside housing territory if( auto zone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ) ) { - land = zone->getLand( landId ); + land = zone->getLand( static_cast< uint8_t >( landId ) ); isOutside = true; } @@ -985,9 +993,9 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceHousingItem( Sapphire::Entity // todo: this whole process is retarded and needs to be fixed // perhaps maintain a list of estates by ident inside housingmgr? auto ident = zone->getLandIdent(); - auto landSet = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSet = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); - land = getHousingZoneByLandSetId( landSet )->getLand( ident.landId ); + land = getHousingZoneByLandSetId( landSet )->getLand( static_cast< uint8_t >( ident.landId ) ); } // wtf? else @@ -1047,7 +1055,7 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceItemInStore( Sapphire::Entity if( auto zone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ) ) { - land = zone->getLand( landId ); + land = zone->getLand( static_cast< uint8_t >( landId ) ); isOutside = true; } else if( auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( @@ -1056,15 +1064,15 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceItemInStore( Sapphire::Entity // todo: this whole process is retarded and needs to be fixed // perhaps maintain a list of estates by ident inside housingmgr? auto ident = zone->getLandIdent(); - auto landSet = toLandSetId( ident.territoryTypeId, ident.wardNum ); + auto landSet = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); - land = getHousingZoneByLandSetId( landSet )->getLand( ident.landId ); + land = getHousingZoneByLandSetId( landSet )->getLand( static_cast< uint8_t >( ident.landId ) ); } if( !hasPermission( player, *land, 0 ) ) return; - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Common::Service< InventoryMgr >::ref(); auto ident = land->getLandIdent(); auto& containers = getEstateInventory( ident ); @@ -1080,9 +1088,9 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceItemInStore( Sapphire::Entity if( !item ) return; - container->setItem( freeSlot, item ); - invMgr->sendInventoryContainer( player, container ); - invMgr->saveHousingContainer( ident, container ); + container->setItem( static_cast< uint8_t >( freeSlot ), item ); + invMgr.sendInventoryContainer( player, container ); + invMgr.saveHousingContainer( ident, container ); } else { @@ -1103,9 +1111,9 @@ void Sapphire::World::Manager::HousingMgr::reqPlaceItemInStore( Sapphire::Entity if( !item ) return; - container->setItem( freeSlot, item ); - invMgr->sendInventoryContainer( player, container ); - invMgr->saveHousingContainer( ident, container ); + container->setItem( static_cast< uint8_t >( freeSlot ), item ); + invMgr.sendInventoryContainer( player, container ); + invMgr.saveHousingContainer( ident, container ); } } } @@ -1114,7 +1122,7 @@ bool Sapphire::World::Manager::HousingMgr::placeExternalItem( Entity::Player& pl Inventory::HousingItemPtr item, Common::LandIdent ident ) { - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); auto& container = getEstateInventory( ident )[ InventoryType::HousingExteriorPlacedItems ]; @@ -1125,21 +1133,21 @@ bool Sapphire::World::Manager::HousingMgr::placeExternalItem( Entity::Player& pl return false; // add item to inv - container->setItem( freeSlot, item ); + container->setItem( static_cast< uint8_t >( freeSlot ), item ); // we need to save the item again as removing it from the container on the player will remove it from charaglobalitem // todo: this needs to be handled a bit better as it might be possible to overwrite another item that is created in the meantime - invMgr->saveItem( player, item ); + invMgr.saveItem( player, item ); - invMgr->sendInventoryContainer( player, container ); - invMgr->saveHousingContainer( ident, container ); - invMgr->updateHousingItemPosition( item ); + invMgr.sendInventoryContainer( player, container ); + invMgr.saveHousingContainer( ident, container ); + invMgr.updateHousingItemPosition( item ); // add to zone and spawn auto zone = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ); assert( zone ); - zone->spawnYardObject( ident.landId, freeSlot, *item ); + zone->spawnYardObject( static_cast< uint8_t >( ident.landId ), static_cast< uint16_t >( freeSlot ), *item ); return true; } @@ -1147,7 +1155,7 @@ bool Sapphire::World::Manager::HousingMgr::placeExternalItem( Entity::Player& pl bool Sapphire::World::Manager::HousingMgr::placeInteriorItem( Entity::Player& player, Inventory::HousingItemPtr item ) { - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentTerritory() ); assert( zone ); @@ -1173,17 +1181,17 @@ bool Sapphire::World::Manager::HousingMgr::placeInteriorItem( Entity::Player& pl } // have a free slot - container->setItem( freeSlot, item ); + container->setItem( static_cast< uint8_t >( freeSlot ), item ); // resend container - invMgr->sendInventoryContainer( player, container ); - invMgr->saveHousingContainer( ident, container ); - invMgr->updateHousingItemPosition( item ); + invMgr.sendInventoryContainer( player, container ); + invMgr.saveHousingContainer( ident, container ); + invMgr.updateHousingItemPosition( item ); auto zone = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( player.getCurrentTerritory() ); assert( zone ); - zone->spawnHousingObject( containerIdx, freeSlot, containerId, item ); + zone->spawnHousingObject( containerIdx, static_cast< uint16_t >( freeSlot ), containerId, item ); return true; } @@ -1218,7 +1226,7 @@ void Sapphire::World::Manager::HousingMgr::sendInternalEstateInventoryBatch( Sap else containerIds = m_internalPlacedItemContainers; - auto invMgr = framework()->get< Manager::InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); auto& containers = getEstateInventory( zone->getLandIdent() ); for( auto containerId : containerIds ) @@ -1227,7 +1235,7 @@ void Sapphire::World::Manager::HousingMgr::sendInternalEstateInventoryBatch( Sap if( container == containers.end() ) break; - invMgr->sendInventoryContainer( player, container->second ); + invMgr.sendInventoryContainer( player, container->second ); } } @@ -1235,8 +1243,8 @@ void Sapphire::World::Manager::HousingMgr::reqMoveHousingItem( Entity::Player& p Common::LandIdent ident, uint8_t slot, Common::FFXIVARR_POSITION3 pos, float rot ) { - auto landSet = toLandSetId( ident.territoryTypeId, ident.wardNum ); - auto land = getHousingZoneByLandSetId( landSet )->getLand( ident.landId ); + auto landSet = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); + auto land = getHousingZoneByLandSetId( landSet )->getLand( static_cast< uint8_t >( ident.landId ) ); if( !land ) return; @@ -1282,7 +1290,7 @@ bool Sapphire::World::Manager::HousingMgr::moveInternalItem( Entity::Player& pla auto container = it->second; - auto item = std::dynamic_pointer_cast< Inventory::HousingItem >( container->getItem( slotIdx ) ); + auto item = std::dynamic_pointer_cast< Inventory::HousingItem >( container->getItem( static_cast< uint8_t >( slotIdx ) ) ); if( !item ) return false; @@ -1290,13 +1298,13 @@ bool Sapphire::World::Manager::HousingMgr::moveInternalItem( Entity::Player& pla item->setRot( rot ); // save - auto invMgr = framework()->get< InventoryMgr >(); - invMgr->updateHousingItemPosition( item ); + auto& invMgr = Service< InventoryMgr >::ref(); + invMgr.updateHousingItemPosition( item ); - terri.updateHousingObjectPosition( player, slot, item->getPos(), item->getRot() ); + terri.updateHousingObjectPosition( player, slot, item->getPos(), static_cast< uint16_t >( item->getRot() ) ); // send confirmation to player - uint32_t param1 = ( ident.landId << 16 ) | containerId; + uint32_t param1 = static_cast< uint32_t >( ( ident.landId << 16 ) | containerId ); player.queuePacket( Server::makeActorControlSelf( player.getId(), ActorControl::HousingItemMoveConfirm, param1, slotIdx ) ); @@ -1309,7 +1317,7 @@ bool Sapphire::World::Manager::HousingMgr::moveExternalItem( Entity::Player& pla Sapphire::HousingZone& terri, Common::FFXIVARR_POSITION3 pos, float rot ) { - auto land = terri.getLand( ident.landId ); + auto land = terri.getLand( static_cast< uint8_t >( ident.landId ) ); if( !hasPermission( player, *land, 0 ) ) return false; @@ -1328,12 +1336,12 @@ bool Sapphire::World::Manager::HousingMgr::moveExternalItem( Entity::Player& pla item->setPos( pos ); item->setRot( rot ); - auto invMgr = framework()->get< InventoryMgr >(); - invMgr->updateHousingItemPosition( item ); + auto& invMgr = Service< InventoryMgr >::ref(); + invMgr.updateHousingItemPosition( item ); - terri.updateYardObjectPos( player, slot, ident.landId, *item ); + terri.updateYardObjectPos( player, slot, static_cast< uint16_t >( ident.landId ), *item ); - uint32_t param1 = ( ident.landId << 16 ) | InventoryType::HousingExteriorPlacedItems; + uint32_t param1 = static_cast< uint32_t >( ( ident.landId << 16 ) | InventoryType::HousingExteriorPlacedItems ); player.queuePacket( Server::makeActorControlSelf( player.getId(), ActorControl::HousingItemMoveConfirm, param1, slot ) ); @@ -1348,8 +1356,8 @@ void Sapphire::World::Manager::HousingMgr::reqRemoveHousingItem( Sapphire::Entit player.getCurrentTerritory() ) ) { auto ident = terri->getLandIdent(); - auto landSet = toLandSetId( ident.territoryTypeId, ident.wardNum ); - auto land = getHousingZoneByLandSetId( landSet )->getLand( ident.landId ); + auto landSet = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); + auto land = getHousingZoneByLandSetId( landSet )->getLand( static_cast< uint8_t >( ident.landId ) ); if( !land ) return; @@ -1361,7 +1369,7 @@ void Sapphire::World::Manager::HousingMgr::reqRemoveHousingItem( Sapphire::Entit } else if( auto terri = std::dynamic_pointer_cast< HousingZone >( player.getCurrentTerritory() ) ) { - auto land = terri->getLand( plot ); + auto land = terri->getLand( static_cast< uint8_t >( plot ) ); if( !land ) return; @@ -1406,7 +1414,7 @@ bool Sapphire::World::Manager::HousingMgr::removeInternalItem( Entity::Player& p auto container = it->second; - auto item = std::dynamic_pointer_cast< Inventory::HousingItem >( container->getItem( slotId ) ); + auto item = std::dynamic_pointer_cast< Inventory::HousingItem >( container->getItem( static_cast< uint8_t >( slotId ) ) ); if( !item ) return false; @@ -1417,13 +1425,13 @@ bool Sapphire::World::Manager::HousingMgr::removeInternalItem( Entity::Player& p if( !player.getFreeInventoryContainerSlot( containerPair ) ) return false; - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); // remove it from housing inventory - container->removeItem( slotId ); - invMgr->sendInventoryContainer( player, container ); - invMgr->removeHousingItemPosition( *item ); - invMgr->removeItemFromHousingContainer( terri.getLandIdent(), containerId, slotId ); + container->removeItem( static_cast< uint8_t >( slotId ) ); + invMgr.sendInventoryContainer( player, container ); + invMgr.removeHousingItemPosition( *item ); + invMgr.removeItemFromHousingContainer( terri.getLandIdent(), containerId, slotId ); // add to player inv player.insertInventoryItem( containerPair.first, containerPair.second, item ); @@ -1439,23 +1447,23 @@ bool Sapphire::World::Manager::HousingMgr::removeInternalItem( Entity::Player& p if( !freeContainer ) return false; - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); - container->removeItem( slotId ); - invMgr->sendInventoryContainer( player, container ); - invMgr->removeHousingItemPosition( *item ); - invMgr->removeItemFromHousingContainer( terri.getLandIdent(), containerId, slotId ); + container->removeItem( static_cast< uint8_t >( slotId ) ); + invMgr.sendInventoryContainer( player, container ); + invMgr.removeHousingItemPosition( *item ); + invMgr.removeItemFromHousingContainer( terri.getLandIdent(), containerId, slotId ); - freeContainer->setItem( slotId, item ); - invMgr->sendInventoryContainer( player, freeContainer ); - invMgr->saveHousingContainer( terri.getLandIdent(), freeContainer ); + freeContainer->setItem( static_cast< uint8_t >( slotId ), item ); + invMgr.sendInventoryContainer( player, freeContainer ); + invMgr.saveHousingContainer( terri.getLandIdent(), freeContainer ); } // despawn if( containerIdx != -1 ) { auto arraySlot = ( containerIdx * 50 ) + slotId; - terri.removeHousingObject( arraySlot ); + terri.removeHousingObject( static_cast< uint16_t >( arraySlot ) ); } return true; @@ -1479,7 +1487,7 @@ bool Sapphire::World::Manager::HousingMgr::removeExternalItem( Entity::Player& p bool shouldDespawnItem = containerType != InventoryType::HousingExteriorStoreroom; - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); if( sendToStoreroom ) { @@ -1490,13 +1498,13 @@ bool Sapphire::World::Manager::HousingMgr::removeExternalItem( Entity::Player& p return false; sourceContainer->removeItem( slotId ); - invMgr->sendInventoryContainer( player, sourceContainer ); - invMgr->removeItemFromHousingContainer( land.getLandIdent(), sourceContainer->getId(), slotId ); - invMgr->removeHousingItemPosition( *item ); + invMgr.sendInventoryContainer( player, sourceContainer ); + invMgr.removeItemFromHousingContainer( land.getLandIdent(), sourceContainer->getId(), slotId ); + invMgr.removeHousingItemPosition( *item ); - storeroomContainer->setItem( freeSlot, item ); - invMgr->sendInventoryContainer( player, storeroomContainer ); - invMgr->saveHousingContainer( land.getLandIdent(), storeroomContainer ); + storeroomContainer->setItem( static_cast< uint8_t >( freeSlot ), item ); + invMgr.sendInventoryContainer( player, storeroomContainer ); + invMgr.saveHousingContainer( land.getLandIdent(), storeroomContainer ); } else { @@ -1506,16 +1514,16 @@ bool Sapphire::World::Manager::HousingMgr::removeExternalItem( Entity::Player& p // remove from housing inv sourceContainer->removeItem( slotId ); - invMgr->sendInventoryContainer( player, sourceContainer ); - invMgr->removeHousingItemPosition( *item ); - invMgr->removeItemFromHousingContainer( land.getLandIdent(), sourceContainer->getId(), slotId ); + invMgr.sendInventoryContainer( player, sourceContainer ); + invMgr.removeHousingItemPosition( *item ); + invMgr.removeItemFromHousingContainer( land.getLandIdent(), sourceContainer->getId(), slotId ); // add to player inv player.insertInventoryItem( containerPair.first, containerPair.second, item ); } if( shouldDespawnItem ) - terri.despawnYardObject( land.getLandIdent().landId, slotId ); + terri.despawnYardObject( static_cast< uint16_t >( land.getLandIdent().landId ), slotId ); return true; } @@ -1552,7 +1560,7 @@ void Sapphire::World::Manager::HousingMgr::reqEstateExteriorRemodel( Sapphire::E if( !terri ) return; - auto land = terri->getLand( plot ); + auto land = terri->getLand( static_cast< uint8_t >( plot ) ); if( !land ) return; @@ -1564,9 +1572,9 @@ void Sapphire::World::Manager::HousingMgr::reqEstateExteriorRemodel( Sapphire::E if( it == inv.end() ) return; - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); - invMgr->sendInventoryContainer( player, it->second ); + invMgr.sendInventoryContainer( player, it->second ); auto pkt = Server::makeActorControlSelf( player.getId(), Network::ActorControl::ShowEstateExternalAppearanceUI, plot ); player.queuePacket( pkt ); @@ -1580,8 +1588,8 @@ void Sapphire::World::Manager::HousingMgr::reqEstateInteriorRemodel( Sapphire::E return; auto ident = terri->getLandIdent(); - auto landSet = toLandSetId( ident.territoryTypeId, ident.wardNum ); - auto land = getHousingZoneByLandSetId( landSet )->getLand( ident.landId ); + auto landSet = toLandSetId( static_cast< uint16_t >( ident.territoryTypeId ), static_cast< uint8_t >( ident.wardNum ) ); + auto land = getHousingZoneByLandSetId( landSet )->getLand( static_cast< uint8_t >( ident.landId ) ); if( !land ) return; @@ -1594,9 +1602,9 @@ void Sapphire::World::Manager::HousingMgr::reqEstateInteriorRemodel( Sapphire::E if( it == inv.end() ) return; - auto invMgr = framework()->get< InventoryMgr >(); + auto& invMgr = Service< InventoryMgr >::ref(); - invMgr->sendInventoryContainer( player, it->second ); + invMgr.sendInventoryContainer( player, it->second ); auto pkt = Server::makeActorControlSelf( player.getId(), Network::ActorControl::ShowEstateInternalAppearanceUI ); player.queuePacket( pkt ); @@ -1621,5 +1629,63 @@ Sapphire::Inventory::HousingItemPtr Sapphire::World::Manager::HousingMgr::getHou if( !tmpItem ) return nullptr; - return Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId(), framework() ); + return Inventory::make_HousingItem( tmpItem->getUId(), tmpItem->getId() ); +} + +void Sapphire::World::Manager::HousingMgr::editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t> slotList, uint8_t removeFlag ) +{ + auto landSetId = toLandSetId( static_cast< uint16_t >( landIdent.territoryTypeId ), static_cast< uint8_t >( landIdent.wardNum ) ); + auto terri = getHousingZoneByLandSetId( landSetId ); + + auto land = terri->getLand( static_cast< uint8_t >( landIdent.landId ) ); + if( !land ) + return; + + if( !hasPermission( player, *land, 0 ) ) + return; + + auto& housingContainer = getEstateInventory( landIdent )[ isInterior ? InventoryType::HousingInteriorAppearance : InventoryType::HousingExteriorAppearance ]; + + auto& invMgr = Service< InventoryMgr >::ref(); + + for( int i = 0; i < ( isInterior ? 10 : 9 ); i++ ) + { + auto container = containerList.at( i ); + auto slot = slotList.at( i ); + if( container == 0x270F || slot == 0xFF ) + { + if( i >= 5 ) + { + auto removed = ( ( removeFlag >> ( i - 5 ) ) & 1 ) > 0; + if( removed ) + { + auto oldItem = housingContainer->getItem( i ); + if( oldItem ) + { + housingContainer->removeItem( i ); + invMgr.removeItemFromHousingContainer( landIdent, housingContainer->getId(), i ); + player.addItem( oldItem, false, false, false ); + } + } + } + continue; + } + auto item = getHousingItemFromPlayer( player, static_cast< Sapphire::Common::InventoryType >( container ), slot ); + if( item ) + { + auto oldItem = housingContainer->getItem( i ); + housingContainer->setItem( i, item ); + if( oldItem ) + { + player.insertInventoryItem( static_cast< Sapphire::Common::InventoryType >( container ), slot, oldItem ); + } + } + } + invMgr.sendInventoryContainer( player, housingContainer ); + invMgr.saveHousingContainer( landIdent, housingContainer ); + updateHouseModels( land->getHouse() ); + if( !isInterior ) + { + terri->sendLandUpdate( landIdent.landId ); + } } \ No newline at end of file diff --git a/src/world/Manager/HousingMgr.h b/src/world/Manager/HousingMgr.h index cd81255e..1984a16c 100644 --- a/src/world/Manager/HousingMgr.h +++ b/src/world/Manager/HousingMgr.h @@ -2,7 +2,6 @@ #define SAPPHIRE_HOUSINGMGR_H #include "Forwards.h" -#include "BaseManager.h" #include "Territory/HousingZone.h" #include #include @@ -15,7 +14,7 @@ namespace Sapphire::Data namespace Sapphire::World::Manager { - class HousingMgr : public BaseManager + class HousingMgr { public: @@ -69,7 +68,7 @@ namespace Sapphire::World::Manager */ using LandIdentToInventoryContainerMap = std::unordered_map< uint64_t, ContainerIdToContainerMap >; - HousingMgr( FrameworkPtr pFw ); + HousingMgr(); virtual ~HousingMgr(); bool init(); @@ -182,6 +181,8 @@ namespace Sapphire::World::Manager bool hasPermission( Entity::Player& player, Land& land, uint32_t permission ); + void editAppearance( bool isInterior, Sapphire::Entity::Player& player, const Common::LandIdent landIdent, std::vector< uint16_t > containerList, std::vector< uint8_t > slotList, uint8_t removeFlag ); + private: Inventory::HousingItemPtr getHousingItemFromPlayer( Entity::Player& player, Common::InventoryType type, uint8_t slot ); diff --git a/src/world/Manager/InventoryMgr.cpp b/src/world/Manager/InventoryMgr.cpp index 6d8217c6..722100d7 100644 --- a/src/world/Manager/InventoryMgr.cpp +++ b/src/world/Manager/InventoryMgr.cpp @@ -10,15 +10,10 @@ #include #include - -#include "Framework.h" +#include using namespace Sapphire::Network::Packets; -Sapphire::World::Manager::InventoryMgr::InventoryMgr( Sapphire::FrameworkPtr pFw ) : - BaseManager( pFw ) -{ } - void Sapphire::World::Manager::InventoryMgr::sendInventoryContainer( Sapphire::Entity::Player& player, Sapphire::ItemContainerPtr container ) { @@ -71,15 +66,14 @@ void Sapphire::World::Manager::InventoryMgr::sendInventoryContainer( Sapphire::E Sapphire::ItemPtr Sapphire::World::Manager::InventoryMgr::createItem( Entity::Player& player, uint32_t catalogId, uint32_t quantity ) { - auto pExdData = framework()->get< Data::ExdDataGenerated >(); - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto itemMgr = framework()->get< Manager::ItemMgr >(); - auto itemInfo = pExdData->get< Sapphire::Data::Item >( catalogId ); + auto& pExdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto& itemMgr = Common::Service< Manager::ItemMgr >::ref(); + auto itemInfo = pExdData.get< Sapphire::Data::Item >( catalogId ); if( !itemInfo ) return nullptr; - auto item = make_Item( itemMgr->getNextUId(), catalogId, framework() ); + auto item = make_Item( itemMgr.getNextUId(), catalogId ); item->setStackSize( std::max< uint32_t >( 1, quantity ) ); @@ -103,9 +97,9 @@ void Sapphire::World::Manager::InventoryMgr::removeItemFromHousingContainer( Sap uint16_t containerId, uint16_t slotId ) { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); - auto stmt = pDb->getPreparedStatement( Db::LAND_INV_DEL ); + auto stmt = db.getPreparedStatement( Db::LAND_INV_DEL ); auto u64ident = *reinterpret_cast< uint64_t* >( &ident ); @@ -113,16 +107,16 @@ void Sapphire::World::Manager::InventoryMgr::removeItemFromHousingContainer( Sap stmt->setUInt( 2, containerId ); stmt->setUInt( 3, slotId ); - pDb->directExecute( stmt ); + db.directExecute( stmt ); } void Sapphire::World::Manager::InventoryMgr::saveHousingContainerItem( uint64_t ident, uint16_t containerId, uint16_t slotId, uint64_t itemId ) { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); - auto stmt = pDb->getPreparedStatement( Db::LAND_INV_UP ); + auto stmt = db.getPreparedStatement( Db::LAND_INV_UP ); // LandIdent, ContainerId, SlotId, ItemId, ItemId stmt->setUInt64( 1, ident ); @@ -134,14 +128,14 @@ void Sapphire::World::Manager::InventoryMgr::saveHousingContainerItem( uint64_t // the second time is for the ON DUPLICATE KEY UPDATE condition stmt->setUInt64( 5, itemId ); - pDb->directExecute( stmt ); + db.directExecute( stmt ); } void Sapphire::World::Manager::InventoryMgr::updateHousingItemPosition( Sapphire::Inventory::HousingItemPtr item ) { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); - auto stmt = pDb->getPreparedStatement( Db::LAND_INV_UP_ITEMPOS ); + auto stmt = db.getPreparedStatement( Db::LAND_INV_UP_ITEMPOS ); // ItemId, PosX, PosY, PosZ, Rotation, PosX, PosY, PosZ, Rotation auto pos = item->getPos(); @@ -149,39 +143,39 @@ void Sapphire::World::Manager::InventoryMgr::updateHousingItemPosition( Sapphire stmt->setUInt64( 1, item->getUId() ); - stmt->setUInt( 2, pos.x ); - stmt->setUInt( 3, pos.y ); - stmt->setUInt( 4, pos.z ); - stmt->setInt( 5, rot ); + stmt->setDouble( 2, static_cast< double >( pos.x ) ); + stmt->setDouble( 3, static_cast< double >( pos.y ) ); + stmt->setDouble( 4, static_cast< double >( pos.z ) ); + stmt->setDouble( 5, static_cast< double >( rot ) ); - stmt->setUInt( 6, pos.x ); - stmt->setUInt( 7, pos.y ); - stmt->setUInt( 8, pos.z ); - stmt->setInt( 9, rot ); + stmt->setDouble( 6, static_cast< double >( pos.x ) ); + stmt->setDouble( 7, static_cast< double >( pos.y ) ); + stmt->setDouble( 8, static_cast< double >( pos.z ) ); + stmt->setDouble( 9, static_cast< double >( rot ) ); - pDb->execute( stmt ); + db.execute( stmt ); } void Sapphire::World::Manager::InventoryMgr::removeHousingItemPosition( Sapphire::Inventory::HousingItem& item ) { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); - auto stmt = pDb->getPreparedStatement( Db::LAND_INV_DEL_ITEMPOS ); + auto stmt = db.getPreparedStatement( Db::LAND_INV_DEL_ITEMPOS ); stmt->setUInt64( 1, item.getUId() ); - pDb->directExecute( stmt ); + db.directExecute( stmt ); } void Sapphire::World::Manager::InventoryMgr::saveItem( Sapphire::Entity::Player& player, Sapphire::ItemPtr item ) { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto stmt = pDb->getPreparedStatement( Db::CHARA_ITEMGLOBAL_INS ); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto stmt = db.getPreparedStatement( Db::CHARA_ITEMGLOBAL_INS ); stmt->setUInt( 1, player.getId() ); stmt->setUInt64( 2, item->getUId() ); stmt->setUInt( 3, item->getId() ); stmt->setUInt( 4, item->getStackSize() ); - pDb->directExecute( stmt ); + db.directExecute( stmt ); } diff --git a/src/world/Manager/InventoryMgr.h b/src/world/Manager/InventoryMgr.h index 4bb154ea..5803450a 100644 --- a/src/world/Manager/InventoryMgr.h +++ b/src/world/Manager/InventoryMgr.h @@ -2,15 +2,14 @@ #define SAPPHIRE_INVENTORYMGR_H #include "ForwardsZone.h" -#include "BaseManager.h" namespace Sapphire::World::Manager { - class InventoryMgr : public Sapphire::World::Manager::BaseManager + class InventoryMgr { public: - explicit InventoryMgr( Sapphire::FrameworkPtr pFw ); + InventoryMgr() = default; /*! * @brief Sends an item container to a player diff --git a/src/world/Manager/ItemMgr.cpp b/src/world/Manager/ItemMgr.cpp index ed119610..c8331dac 100644 --- a/src/world/Manager/ItemMgr.cpp +++ b/src/world/Manager/ItemMgr.cpp @@ -2,18 +2,12 @@ #include "Inventory/ItemContainer.h" #include "Inventory/Item.h" -#include "Framework.h" #include #include #include #include - -Sapphire::World::Manager::ItemMgr::ItemMgr( Sapphire::FrameworkPtr pFw ) : - BaseManager( pFw ) -{ - -} +#include bool Sapphire::World::Manager::ItemMgr::isArmory( uint16_t containerId ) { @@ -33,56 +27,56 @@ bool Sapphire::World::Manager::ItemMgr::isArmory( uint16_t containerId ) } -uint16_t Sapphire::World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( uint8_t slotId ) +uint16_t Sapphire::World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( Common::EquipSlotCategory slot ) { - switch( slotId ) + switch( slot ) { - case Common::CharaHead: + case Common::EquipSlotCategory::Head: return Common::ArmoryHead; - case Common::CharaBody: - case Common::BodyDisallowHead: - case Common::BodyDisallowHandsLegsFeet: - case Common::BodyDisallowAll: - case Common::BodyDisallowHands: - case Common::BodyDisallowLegsFeet: + case Common::EquipSlotCategory::Body: + case Common::EquipSlotCategory::BodyDisallowHead: + case Common::EquipSlotCategory::BodyDisallowHandsLegsFeet: + case Common::EquipSlotCategory::BodyDisallowAll: + case Common::EquipSlotCategory::BodyDisallowHands: + case Common::EquipSlotCategory::BodyDisallowLegsFeet: return Common::ArmoryBody; - case Common::CharaEars: + case Common::EquipSlotCategory::Ears: return Common::ArmoryEar; - case Common::CharaFeet: + case Common::EquipSlotCategory::Feet: return Common::ArmoryFeet; - case Common::CharaHands: + case Common::EquipSlotCategory::Hands: return Common::ArmoryHand; - case Common::CharaLegs: - case Common::LegsDisallowFeet: + case Common::EquipSlotCategory::Legs: + case Common::EquipSlotCategory::LegsDisallowFeet: return Common::ArmoryLegs; - case Common::CharaMainHand: - case Common::MainTwoHandedWeapon: - case Common::MainOrOffHand: + case Common::EquipSlotCategory::MainHand: + case Common::EquipSlotCategory::MainTwoHandedWeapon: + //case Common::EquipSlotCategory::MainOrOffHand: return Common::ArmoryMain; - case Common::CharaOffHand: + case Common::EquipSlotCategory::OffHand: return Common::ArmoryOff; - case Common::CharaRing: + case Common::EquipSlotCategory::Ring: return Common::ArmoryRing; - case Common::CharaWaist: + case Common::EquipSlotCategory::Waist: return Common::ArmoryWaist; - case Common::CharaWrist: + case Common::EquipSlotCategory::Wrist: return Common::ArmoryWrist; - case Common::CharaNeck: + case Common::EquipSlotCategory::Neck: return Common::ArmoryNeck; - case Common::CharaSoulCrystal: + case Common::EquipSlotCategory::SoulCrystal: return Common::ArmorySoulCrystal; default: @@ -122,27 +116,26 @@ bool Sapphire::World::Manager::ItemMgr::isOneHandedWeapon( Common::ItemUICategor Sapphire::ItemPtr Sapphire::World::Manager::ItemMgr::loadItem( uint64_t uId ) { - auto pExdData = framework()->get< Data::ExdDataGenerated >(); - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto& exdData = Common::Service< Data::ExdDataGenerated >::ref(); + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); // 1 catalogId, 2 stack, 3 reservedFlag, 4 signatureId, 5 flags, 6 durability, 7 refine, 8 materia_0, 9 materia_1, // 10 materia_2, 11 materia_3, 12 materia_4, 13 stain, 14 pattern, 15 buffer_0, 16 buffer_1, 17 buffer_2, // 18 buffer_3, 19 buffer_4 - auto query = pDb->getPreparedStatement( Db::CHARA_ITEMGLOBAL_SELECT ); + auto query = db.getPreparedStatement( Db::CHARA_ITEMGLOBAL_SELECT ); query->setUInt64( 1, uId ); - auto itemRes = pDb->query( query ); + auto itemRes = db.query( query ); if( !itemRes->next() ) return nullptr; try { - auto itemInfo = pExdData->get< Sapphire::Data::Item >( itemRes->getUInt( 1 ) ); + auto itemInfo = exdData.get< Sapphire::Data::Item >( itemRes->getUInt( 1 ) ); bool isHq = itemRes->getUInt( 3 ) == 1; ItemPtr pItem = make_Item( uId, itemRes->getUInt( 1 ), - framework(), isHq ); pItem->setStackSize( itemRes->getUInt( 2 ) ); @@ -185,8 +178,9 @@ Sapphire::Common::ContainerType Sapphire::World::Manager::ItemMgr::getContainerT uint32_t Sapphire::World::Manager::ItemMgr::getNextUId() { uint32_t charId = 0; - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto pQR = pDb->query( "SELECT MAX(ItemId) FROM charaglobalitem" ); + + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + auto pQR = db.query( "SELECT MAX(ItemId) FROM charaglobalitem" ); if( !pQR->next() ) return 0x00500001; diff --git a/src/world/Manager/ItemMgr.h b/src/world/Manager/ItemMgr.h index 795f7c2b..6208cf94 100644 --- a/src/world/Manager/ItemMgr.h +++ b/src/world/Manager/ItemMgr.h @@ -3,15 +3,14 @@ #include #include "ForwardsZone.h" -#include "BaseManager.h" namespace Sapphire::World::Manager { - class ItemMgr : public BaseManager + class ItemMgr { public: - ItemMgr( FrameworkPtr pFw ); + ItemMgr() = default; ItemPtr loadItem( uint64_t uId ); @@ -21,7 +20,7 @@ namespace Sapphire::World::Manager static bool isOneHandedWeapon( Common::ItemUICategory weaponCategory ); static bool isArmory( uint16_t containerId ); static bool isEquipment( uint16_t containerId ); - static uint16_t getCharaEquipSlotCategoryToArmoryId( uint8_t slotId ); + static uint16_t getCharaEquipSlotCategoryToArmoryId( Common::EquipSlotCategory slot ); static Common::ContainerType getContainerType( uint32_t containerId ); }; diff --git a/src/world/Manager/LinkshellMgr.cpp b/src/world/Manager/LinkshellMgr.cpp index 11d56859..fdbb8cb9 100644 --- a/src/world/Manager/LinkshellMgr.cpp +++ b/src/world/Manager/LinkshellMgr.cpp @@ -1,19 +1,15 @@ #include #include +#include #include "Linkshell/Linkshell.h" -#include "Framework.h" #include "LinkshellMgr.h" -Sapphire::World::Manager::LinkshellMgr::LinkshellMgr( FrameworkPtr pFw ) : - BaseManager( pFw ) -{ -} - bool Sapphire::World::Manager::LinkshellMgr::loadLinkshells() { - auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - auto res = pDb->query( "SELECT LinkshellId, MasterCharacterId, CharacterIdList, " + auto& db = Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::ref(); + + auto res = db.query( "SELECT LinkshellId, MasterCharacterId, CharacterIdList, " "LinkshellName, LeaderIdList, InviteIdList " "FROM infolinkshell " "ORDER BY LinkshellId ASC;" ); diff --git a/src/world/Manager/LinkshellMgr.h b/src/world/Manager/LinkshellMgr.h index 034f7884..5e97c351 100644 --- a/src/world/Manager/LinkshellMgr.h +++ b/src/world/Manager/LinkshellMgr.h @@ -4,12 +4,11 @@ #include #include #include "ForwardsZone.h" -#include "BaseManager.h" namespace Sapphire::World::Manager { - class LinkshellMgr : public Manager::BaseManager + class LinkshellMgr { private: std::map< uint64_t, LinkshellPtr > m_linkshellIdMap; @@ -20,7 +19,7 @@ namespace Sapphire::World::Manager LinkshellPtr getLinkshellById( uint64_t lsId ); public: - LinkshellMgr( FrameworkPtr pFw ); + LinkshellMgr() = default; bool loadLinkshells(); }; diff --git a/src/world/Manager/MapMgr.cpp b/src/world/Manager/MapMgr.cpp new file mode 100644 index 00000000..34c3fd58 --- /dev/null +++ b/src/world/Manager/MapMgr.cpp @@ -0,0 +1,685 @@ +#include +#include + +#include + +#include + +#include +#include +#include + +#include + +#include + +#include