diff --git a/src/servers/Server_Common/Network/PacketDef/Ipcs.h b/src/servers/Server_Common/Network/PacketDef/Ipcs.h index da8be023..f0f387d3 100644 --- a/src/servers/Server_Common/Network/PacketDef/Ipcs.h +++ b/src/servers/Server_Common/Network/PacketDef/Ipcs.h @@ -136,6 +136,7 @@ namespace Packets { IPCTYPE_UNK_320 = 0x0207, // updated 4.1 IPCTYPE_UNK_322 = 0x0209, // updated 4.1 + ActorGauge = 0x249 }; // TODO: Include structures for the individual packet segment types diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index a73346d2..81cca1df 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1314,6 +1314,12 @@ struct FFXIVIpcMount : FFXIVIpcBasePacket }; +struct FFXIVIpcActorGauge : FFXIVIpcBasePacket +{ + uint8_t classJobId; + uint8_t data[15]; // depends on classJobId +}; + } /* Server */ } /* Packets */ } /* Network */ diff --git a/src/servers/Server_Lobby/CMakeLists.txt b/src/servers/Server_Lobby/CMakeLists.txt index 8a1f35d3..ae31962a 100644 --- a/src/servers/Server_Lobby/CMakeLists.txt +++ b/src/servers/Server_Lobby/CMakeLists.txt @@ -18,6 +18,7 @@ set_target_properties(server_lobby PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" ) if (UNIX) diff --git a/src/servers/Server_Lobby/GameConnection.cpp b/src/servers/Server_Lobby/GameConnection.cpp index a2b0d0b2..1256dca2 100644 --- a/src/servers/Server_Lobby/GameConnection.cpp +++ b/src/servers/Server_Lobby/GameConnection.cpp @@ -139,7 +139,7 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui serverListPacket.data().server[0].id = g_serverLobby.getConfig()->getValue( "Settings.Parameters.WorldID", 1 ); serverListPacket.data().server[0].index = 0; serverListPacket.data().final = 1; - sprintf( serverListPacket.data().server[0].name, g_serverLobby.getConfig()->getValue< std::string >( "Settings.Parameters.WorldName", "Sapphire" ).c_str() ); + strcpy( serverListPacket.data().server[0].name, g_serverLobby.getConfig()->getValue< std::string >( "Settings.Parameters.WorldName", "Sapphire" ).c_str() ); pRP.addPacket( serverListPacket ); diff --git a/src/servers/Server_REST/CMakeLists.txt b/src/servers/Server_REST/CMakeLists.txt index 21e9db77..47556899 100644 --- a/src/servers/Server_REST/CMakeLists.txt +++ b/src/servers/Server_REST/CMakeLists.txt @@ -17,12 +17,17 @@ set_target_properties(server_rest PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" ) if (UNIX) target_link_libraries (server_rest Common xivdat pthread mysqlclient mysqlConnector dl z) else() + # ignore unchecked iterators warnings from msvc + add_definitions(-D_SCL_SECURE_NO_WARNINGS) + target_link_libraries (server_rest Common xivdat libmysql mysqlConnector zlib1) + endif() target_link_libraries( server_rest ${Boost_LIBRARIES} ${Boost_LIBRARIES} ) diff --git a/src/servers/Server_Zone/CMakeLists.txt b/src/servers/Server_Zone/CMakeLists.txt index 2c056c0a..8f661d7d 100644 --- a/src/servers/Server_Zone/CMakeLists.txt +++ b/src/servers/Server_Zone/CMakeLists.txt @@ -33,6 +33,7 @@ set_target_properties(server_zone PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" + VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/" ) if (UNIX) diff --git a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp index f7428450..2e62d948 100644 --- a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp @@ -32,6 +32,8 @@ #include +#include + extern Core::Scripting::ScriptManager g_scriptMgr; extern Core::Data::ExdData g_exdData; extern Core::Logger g_log; @@ -256,7 +258,7 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye else if ( subCommand == "eorzeatime" ) { uint64_t timestamp; - sscanf( params.c_str(), "%llu", ×tamp ); + sscanf( params.c_str(), "%" SCNu64, ×tamp ); pPlayer->setEorzeaTimeOffset( timestamp ); pPlayer->sendNotice( "Eorzea time offset: " + std::to_string( timestamp ) ); diff --git a/src/servers/Server_Zone/Network/GameConnection.cpp b/src/servers/Server_Zone/Network/GameConnection.cpp index 528b59cb..882593c8 100644 --- a/src/servers/Server_Zone/Network/GameConnection.cpp +++ b/src/servers/Server_Zone/Network/GameConnection.cpp @@ -328,7 +328,11 @@ void Core::Network::GameConnection::injectPacket( const std::string& packetpath, fseek( fp, 0, SEEK_END ); int32_t size = ftell( fp ); rewind( fp ); - fread( packet, sizeof( char ), size, fp ); + if ( fread( packet, sizeof( char ), size, fp ) != size ) + { + g_log.error( "Packet " + packetpath + " did not read full size: " + std::to_string( size ) ); + return; + } fclose( fp ); // cycle through the packet entries and queue each one diff --git a/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp index 69e6d79a..32b0443d 100644 --- a/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp @@ -333,7 +333,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( targetPlayer->getId() ); searchInfoPacket.data().onlineStatusFlags = param1; searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion(); - sprintf( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() ); + strcpy( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() ); targetPlayer->queuePacket( searchInfoPacket ); targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon, diff --git a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp index afb6ea5e..9028feaf 100644 --- a/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/PacketHandlers.cpp @@ -84,7 +84,7 @@ void Core::Network::GameConnection::setSearchInfoHandler( const Packets::GamePac GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( pPlayer->getId() ); searchInfoPacket.data().onlineStatusFlags = status; searchInfoPacket.data().selectRegion = pPlayer->getSearchSelectRegion(); - sprintf( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() ); + strcpy( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() ); queueOutPacket( searchInfoPacket ); pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon, @@ -98,7 +98,7 @@ void Core::Network::GameConnection::reqSearchInfoHandler( const Packets::GamePac GamePacketNew< FFXIVIpcInitSearchInfo, ServerZoneIpcType > searchInfoPacket( pPlayer->getId() ); searchInfoPacket.data().onlineStatusFlags = pPlayer->getOnlineStatusMask(); searchInfoPacket.data().selectRegion = pPlayer->getSearchSelectRegion(); - sprintf( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() ); + strcpy( searchInfoPacket.data().searchMessage, pPlayer->getSearchMessage() ); queueOutPacket( searchInfoPacket ); } diff --git a/src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h b/src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h index e28f87e1..f7feaeee 100644 --- a/src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h +++ b/src/servers/Server_Zone/Network/PacketWrappers/InitUIPacket.h @@ -51,7 +51,7 @@ private: memset( &m_data.name[0], 0, sizeof( m_data.name ) ); - sprintf( &m_data.name[0], player->getName().c_str() ); + strcpy( &m_data.name[0], player->getName().c_str() ); memcpy( m_data.aetheryte, player->getAetheryteArray(), sizeof ( m_data.aetheryte ) ); diff --git a/src/servers/Server_Zone/Session.cpp b/src/servers/Server_Zone/Session.cpp index 7df173d9..9f5df569 100644 --- a/src/servers/Server_Zone/Session.cpp +++ b/src/servers/Server_Zone/Session.cpp @@ -125,7 +125,7 @@ void Core::Session::update() m_pZoneConnection->processOutQueue(); } - if( m_pZoneConnection ) + if( m_pChatConnection ) { m_pChatConnection->processInQueue(); m_pChatConnection->processOutQueue(); diff --git a/src/tools/pcb_reader/README.md b/src/tools/pcb_reader/README.md new file mode 100644 index 00000000..ec422bd4 --- /dev/null +++ b/src/tools/pcb_reader/README.md @@ -0,0 +1,24 @@ +collision data exporter for sapphire + +compile with STANDALONE defined to compile without boost and sapphire dependencies + +usage: +- regular + - compile with root sapphire dir cmakelists + - sapphire/src/tools/bin/pcb_reader2 "" +- standalone + - compile main.cpp with STANDALONE defined in build arg + - download ffxivexplorer + - ffxivexplorer > path/to/ffxiv's/game/sqpack/ffxiv/020000.dat + - ctrl click the following: + - `bg/ffxiv/[REGION]/common/collision` + - `bg/ffxiv/[REGION]/[dun|fld|twn|etc..]/common/collision/` + - `bg/ffxiv/[REGION]/[dun|fld|twn|etc..]/collision/` + - `bg/ffxiv/region/shared/[for_bg|for_hou]/` + - `bg/ffxiv/[REGION]/[dun|fld|twn|etc..]/ZONE/level/` + - `bg/ffxiv/[REGION]/[dun|fld|twn|etc..]/ZONE/collision/` + - `bgcommon/world/sys/shared/for_bg/` + and `File > Export Raw` to pcb_reader exe dir (common and shared files are optional but you will be missing a lot of objects if you skip them) + - note: at this time ffxivexplorer is still missing some hashes, though any tool which can export the exds should work fine + - main "" + diff --git a/src/tools/pcb_reader/main.cpp b/src/tools/pcb_reader/main.cpp index 647d08e5..9d5bb22a 100644 --- a/src/tools/pcb_reader/main.cpp +++ b/src/tools/pcb_reader/main.cpp @@ -1,21 +1,23 @@ #include #include #include +#include +#include +#include #include "pcb.h" #include "lgb.h" #include "sgb.h" +#ifndef STANDALONE #include #include #include #include #include #include - -#include -#include -#include +//#include +#endif using namespace std::chrono_literals; @@ -86,7 +88,7 @@ std::string zoneNameToPath( const std::string& name ) char region = name[1]; char type = name[2]; char zone = name[3]; - static std::map teriMap + static std::map< char, std::string > teriMap { { 'r', "roc" }, { 'w', "wil" }, @@ -98,7 +100,7 @@ std::string zoneNameToPath( const std::string& name ) { 'z', "zon" } }; - static std::map typeMap + static std::map< char, std::string > typeMap { { 'f', "fld" }, { 't', "twn" }, @@ -117,6 +119,24 @@ std::string zoneNameToPath( const std::string& name ) return ret; } +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 = 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 ); + } +} + int main( int argc, char* argv[] ) { auto startTime = std::chrono::system_clock::now(); @@ -136,21 +156,35 @@ int main( int argc, char* argv[] ) try { + std::string listPcbPath( "bg/ffxiv/" + zonePath + "/collision/list.pcb" ); + std::string bgLgbPath( "bg/ffxiv/" + zonePath + "/level/bg.lgb" ); + std::string collisionFilePath( "bg/ffxiv/" + zonePath + "/collision/" ); + std::vector< char > section; + std::vector< char > section1; + + #ifndef STANDALONE xiv::dat::GameData data1( gamePath ); xiv::exd::ExdData eData( data1 ); const xiv::dat::Cat& test = data1.get_category( "bg" ); - auto test_file = data1.get_file( "bg/ffxiv/" + zonePath + "/level/bg.lgb" ); - auto section = test_file->access_data_sections().at( 0 ); - int32_t list_offset = *(uint32_t*)§ion[0x18]; - int32_t size = *(uint32_t*)§ion[4]; + auto test_file = data1.get_file( bgLgbPath ); + section = test_file->access_data_sections().at( 0 ); - std::vector stringList; + auto test_file1 = data1.get_file( listPcbPath ); + section1 = test_file1->access_data_sections().at( 0 ); + #else + { + readFileToBuffer( bgLgbPath, section ); + readFileToBuffer( listPcbPath, section1 ); + } + #endif + + int32_t list_offset = *( uint32_t* )§ion[0x18]; + int32_t size = *( uint32_t* )§ion[4]; + + std::vector< std::string > stringList; - auto test_file1 = data1.get_file( "bg/ffxiv/" + zonePath + "/collision/list.pcb" ); - auto section1 = test_file1->access_data_sections().at( 0 ); - std::string path = "bg/ffxiv/" + zonePath + "/collision/"; uint32_t offset1 = 0x20; for( ; ; ) { @@ -158,7 +192,7 @@ int main( int argc, char* argv[] ) uint16_t trId = *(uint16_t*)§ion1[offset1]; char someString[200]; - sprintf( someString, "%str%04d.pcb", path.c_str(), trId ); + sprintf( someString, "%str%04d.pcb", collisionFilePath.c_str(), trId ); stringList.push_back( std::string( someString ) ); //std::cout << someString << "\n"; offset1 += 0x20; @@ -191,18 +225,24 @@ int main( int argc, char* argv[] ) fp_out = fopen( ( zoneName + ".obj" ).c_str(), "ab+" ); if( fp_out ) { - std::map pcbFiles; - std::map sgbFiles; - std::map objCount; + std::map< std::string, PCB_FILE > pcbFiles; + std::map< std::string, SGB_FILE > sgbFiles; + std::map< std::string, uint32_t > objCount; auto loadPcbFile = [&]( const std::string& fileName ) -> bool { try { + char* dataSection = nullptr; //std::cout << fileName << " "; + #ifndef STANDALONE auto file = data1.get_file( fileName ); auto sections = file->get_data_sections(); - auto dataSection = §ions.at( 0 )[0]; - + dataSection = §ions.at( 0 )[0]; + #else + std::vector< char > buf; + readFileToBuffer( fileName, buf ); + dataSection = &buf[0]; + #endif //std::cout << sections.size() << "\n"; uint32_t offset = 0; @@ -244,9 +284,17 @@ int main( int argc, char* argv[] ) SGB_FILE sgbFile; try { + char* dataSection = nullptr; + //std::cout << fileName << " "; + #ifndef STANDALONE auto file = data1.get_file( fileName ); auto sections = file->get_data_sections(); - auto dataSection = §ions.at( 0 )[0]; + dataSection = §ions.at( 0 )[0]; + #else + std::vector< char > buf; + readFileToBuffer( fileName, buf ); + dataSection = &buf[0]; + #endif sgbFile = SGB_FILE( &dataSection[0] ); sgbFiles.insert( std::make_pair( fileName, sgbFile ) ); return true; @@ -356,8 +404,8 @@ int main( int argc, char* argv[] ) totalGroups++; for( const auto& pEntry : group.entries ) { - auto pGimmick = dynamic_cast( pEntry.get() ); - auto pBgParts = dynamic_cast( pEntry.get() ); + auto pGimmick = dynamic_cast< LGB_GIMMICK_ENTRY* >( pEntry.get() ); + auto pBgParts = dynamic_cast< LGB_BGPARTS_ENTRY* >( pEntry.get() ); std::string fileName( "" ); fileName.resize( 256 ); @@ -410,7 +458,7 @@ int main( int argc, char* argv[] ) { for( const auto& pEntry : group.entries ) { - auto pModel = dynamic_cast( pEntry.get() ); + auto pModel = dynamic_cast< SGB_MODEL_ENTRY* >( pEntry.get() ); fileName = pModel->collisionFileName; writeOutput( fileName, &pGimmick->header.scale, &pGimmick->header.rotation, &pGimmick->header.translation, pModel ); } @@ -423,7 +471,7 @@ int main( int argc, char* argv[] ) std::cout << "Total Groups " << totalGroups << " Total entries " << totalGroupEntries << "\n"; } std::cout << "Finished exporting " << zoneName << " in " << - std::chrono::duration_cast( std::chrono::system_clock::now() - startTime ).count() << " seconds\n"; + std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now() - startTime ).count() << " seconds\n"; } catch( std::exception& e ) { diff --git a/src/tools/quest_parser/main.cpp b/src/tools/quest_parser/main.cpp index ff5bc70b..acd644ef 100644 --- a/src/tools/quest_parser/main.cpp +++ b/src/tools/quest_parser/main.cpp @@ -303,7 +303,11 @@ int main() outputFile1.write(§ion[0], section.size()); outputFile1.close(); std::string command= std::string("java -jar unluac_2015_06_13.jar ") + "generated/" + questInfo->name_intern + ".luab" + ">> " + "generated/" + questInfo->name_intern + ".lua"; - system(command.c_str()); + if ( system( command.c_str() ) == -1 ) + { + g_log.error( "Error executing java command:\n" + command + "\nerrno: " + std::strerror( errno ) ); + return errno; + } for( ; ; ) {