diff --git a/src/servers/Server_Common/Database/Database.cpp b/src/servers/Server_Common/Database/Database.cpp index 5eccded6..c735c565 100644 --- a/src/servers/Server_Common/Database/Database.cpp +++ b/src/servers/Server_Common/Database/Database.cpp @@ -30,7 +30,9 @@ QueryResult::~QueryResult() bool QueryResult::nextRow() { + MYSQL_ROW row = mysql_fetch_row( m_result ); + auto length = mysql_fetch_lengths( m_result ); if( row == NULL ) { return false; @@ -39,6 +41,9 @@ bool QueryResult::nextRow() for( uint32_t i = 0; i < m_fieldCount; ++i ) { m_currentRow[i].setValue( row[i] ); + m_currentRow[i].setLength( 0 ); + if( length ) + m_currentRow[i].setLength( length[i] ); } return true; diff --git a/src/servers/Server_Common/Database/Database.h b/src/servers/Server_Common/Database/Database.h index 5cea1373..4404e91f 100644 --- a/src/servers/Server_Common/Database/Database.h +++ b/src/servers/Server_Common/Database/Database.h @@ -23,6 +23,12 @@ namespace Core { m_pValue = value; } + // set value + __inline void setLength( uint32_t value ) + { + m_size = value; + } + // return as string __inline const char *getString() { @@ -91,6 +97,11 @@ namespace Core { return m_pValue ? static_cast< int32_t >( atol( m_pValue ) ) : 0; } + __inline uint32_t getLength() + { + return m_size; + } + // return as unsigned 64 bit integer uint64_t getUInt64() { @@ -113,6 +124,7 @@ namespace Core { private: char *m_pValue; + uint32_t m_size; }; diff --git a/src/servers/Server_Common/Network/PacketDef/Ipcs.h b/src/servers/Server_Common/Network/PacketDef/Ipcs.h index bba094a6..826c28b3 100644 --- a/src/servers/Server_Common/Network/PacketDef/Ipcs.h +++ b/src/servers/Server_Common/Network/PacketDef/Ipcs.h @@ -47,16 +47,24 @@ namespace Packets { Ping = 0x0065, // updated for sb Init = 0x0066, // updated for sb Chat = 0x0067, // updated for sb + Logout = 0x0077, // updated for sb + CFNotify = 0x0078, + CFMemberStatus = 0x0079, + CFDutyInfo = 0x007A, + CFPlayerInNeed = 0x007F, + Playtime = 0x00AF, // updated for sb SocialRequestError = 0x00AD, SocialRequestResponse = 0x11AF, + CFRegistered = 0x00B0, SocialList = 0x00B4, // updated for sb UpdateSearchInfo = 0x00B6, // updated for sb InitSearchInfo = 0x00B7, // updated for sb ServerNotice = 0x00BC, // updated for sb SetOnlineStatus = 0x00BD, // updated for sb BlackList = 0x00CA, // updated for sb + LogMessage = 0x00D0, // updated for sb LinkshellList = 0x00D1, // updated for sb StatusEffectList = 0x00F0, // updated for sb Effect = 0x00F1, // updated for sb @@ -77,10 +85,10 @@ namespace Packets { ModelEquip = 0x0124, // updated for sb ItemInfo = 0x0139, // updated for sb ContainerInfo = 0x013A, // updated for sb - InventoryTransactionFinish = 0x013B, - InventoryTransaction = 0x012A, + InventoryTransactionFinish = 0x013B, // updated for sb + InventoryTransaction = 0x013C, // updated for sb CurrencyCrystalInfo = 0x013D, - InventoryActionAck = 0x0139, + InventoryActionAck = 0x1139, UpdateInventorySlot = 0x0140, // updated for sb AddStatusEffect = 0x0141, ActorControl142 = 0x0142, // unchanged for sb @@ -88,12 +96,7 @@ namespace Packets { ActorControl144 = 0x0144, // unchanged for sb UpdateHpMpTp = 0x0145, // unchanged for sb - CFNotify = 0x0078, - CFMemberStatus = 0x0079, - CFDutyInfo = 0x007A, - CFPlayerInNeed = 0x007F, - CFRegistered = 0x00B0, - CFAvailableContents = 0x01CF, + EventPlay = 0x0154, // updated for sb EventStart = 0x015D, // updated for sb @@ -113,6 +116,9 @@ namespace Packets { WeatherChange = 0x01AF, // updated for sb Discovery = 0x01B2, // updated for sb + + CFAvailableContents = 0x01CF, + PrepareZoning = 0x0239, // updated for sb // Unknown IPC types that still need to be sent diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index ee6067c7..0eb965ce 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -152,6 +152,20 @@ struct FFXIVIpcBlackList : FFXIVIpcBasePacket uint32_t padding2; }; +struct FFXIVIpcLogMessage : FFXIVIpcBasePacket +{ + uint32_t field_0; + uint32_t field_4; + uint32_t field_8; + uint32_t field_12; + uint32_t category; + uint32_t logMessage; + uint8_t field_24; + uint8_t field_25; + uint8_t field_26[32]; + uint32_t field_58; +}; + struct FFXIVIpcLinkshellList : FFXIVIpcBasePacket { struct LsEntry diff --git a/src/servers/Server_Zone/Actor/PlayerSql.cpp b/src/servers/Server_Zone/Actor/PlayerSql.cpp index 19d8ae3b..6f7b507b 100644 --- a/src/servers/Server_Zone/Actor/PlayerSql.cpp +++ b/src/servers/Server_Zone/Actor/PlayerSql.cpp @@ -128,11 +128,11 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) m_pos.z = field[8].getFloat(); setRotation( field[9].getFloat() ); - field[11].getBinary( reinterpret_cast< char* >( m_customize ), 26 ); + field[11].getBinary( reinterpret_cast< char* >( m_customize ), sizeof( m_customize ) ); m_modelMainWeapon = field[12].getUInt64(); - field[14].getBinary( reinterpret_cast< char* >( m_modelEquip ), 40 ); + field[14].getBinary( reinterpret_cast< char* >( m_modelEquip ), sizeof( m_modelEquip ) ); m_guardianDeity = field[15].getUInt8(); m_birthDay = field[16].getUInt8(); @@ -147,15 +147,15 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) m_voice = field[23].getUInt32(); - field[24].getBinary( reinterpret_cast< char* >( m_questCompleteFlags ), 200 ); + field[24].getBinary( reinterpret_cast< char* >( m_questCompleteFlags ), sizeof( m_questCompleteFlags ) ); - field[25].getBinary( reinterpret_cast< char* >( m_questTracking ), 10 ); + field[25].getBinary( reinterpret_cast< char* >( m_questTracking ), sizeof( m_questTracking ) ); m_bNewGame = field[26].getBool(); field[27].getBinary( reinterpret_cast< char* >( m_aetheryte ), sizeof( m_aetheryte ) ); - field[28].getBinary( reinterpret_cast< char* >( m_unlocks ), 64 ); + field[28].getBinary( reinterpret_cast< char* >( m_unlocks ), sizeof( m_unlocks ) ); field[29].getBinary( reinterpret_cast< char* >( m_discovery ), sizeof( m_discovery ) ); @@ -165,7 +165,7 @@ bool Core::Entity::Player::load( uint32_t charId, Core::SessionPtr pSession ) m_bNewAdventurer = field[32].getBool(); m_gc = field[33].getUInt8(); - field[34].getBinary( reinterpret_cast< char* >( m_gcRank ), 3 ); + field[34].getBinary( reinterpret_cast< char* >( m_gcRank ), sizeof( m_gcRank ) ); m_cfPenaltyUntil = field[35].getUInt32(); diff --git a/src/servers/Server_Zone/CMakeLists.txt b/src/servers/Server_Zone/CMakeLists.txt index 3c340c60..f5abcffe 100644 --- a/src/servers/Server_Zone/CMakeLists.txt +++ b/src/servers/Server_Zone/CMakeLists.txt @@ -16,6 +16,7 @@ file(GLOB SERVER_SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} DebugCommand/*.c* Event/*.c* Inventory/*.c* + Linkshell/*.c* Network/*.c* Network/Handlers/*.c* Network/PacketWrappers/*.c* @@ -89,7 +90,7 @@ endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../../bin/") -add_executable(server_zone ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES}) +add_executable(server_zone ${SERVER_PUBLIC_INCLUDE_FILES} ${SERVER_SOURCE_FILES} Linkshell/Linkshell.cpp Linkshell/Linkshell.h) add_dependencies(server_zone Common xivdat) set_target_properties(server_zone PROPERTIES diff --git a/src/servers/Server_Zone/Linkshell/Linkshell.cpp b/src/servers/Server_Zone/Linkshell/Linkshell.cpp index f8643edb..da3fdd8c 100644 --- a/src/servers/Server_Zone/Linkshell/Linkshell.cpp +++ b/src/servers/Server_Zone/Linkshell/Linkshell.cpp @@ -1,11 +1,12 @@ #include "Linkshell.h" -Core::Linkshell::Linkshell( uint32_t id, + +Core::Linkshell::Linkshell( uint64_t id, const std::string &name, - uint32_t masterId, - const std::set &members, - const std::set &leaders, - const std::set &invites ) : + uint64_t masterId, + const std::set &members, + const std::set &leaders, + const std::set &invites ) : m_linkshellId( id ), m_name( name ), m_masterCharacterId( masterId ), @@ -16,22 +17,22 @@ Core::Linkshell::Linkshell( uint32_t id, } -uint32_t Core::Linkshell::getId() const +uint64_t Core::Linkshell::getId() const { return m_linkshellId; } -uint32_t Core::Linkshell::getMasterId() const +uint64_t Core::Linkshell::getMasterId() const { return m_masterCharacterId; } -const std::set< uint32_t >& Core::Linkshell::getMemberIdList() const +const std::set< uint64_t >& Core::Linkshell::getMemberIdList() const { return m_memberIds; } -std::set< uint32_t >& Core::Linkshell::getMemberIdList() +std::set< uint64_t >& Core::Linkshell::getMemberIdList() { return m_memberIds; } @@ -41,52 +42,52 @@ const std::string& Core::Linkshell::getName() const return m_name; } -const std::set< uint32_t >& Core::Linkshell::getLeaderIdList() const +const std::set< uint64_t >& Core::Linkshell::getLeaderIdList() const { return m_leaderIds; } -std::set< uint32_t >& Core::Linkshell::getLeaderIdList() +std::set< uint64_t >& Core::Linkshell::getLeaderIdList() { return m_leaderIds; } -const std::set< uint32_t >& Core::Linkshell::getInviteIdList() const +const std::set< uint64_t >& Core::Linkshell::getInviteIdList() const { return m_inviteIds; } -std::set< uint32_t > &Core::Linkshell::getInviteIdList() +std::set< uint64_t > &Core::Linkshell::getInviteIdList() { return m_inviteIds; } -void Core::Linkshell::addMember( uint32_t memberId ) +void Core::Linkshell::addMember( uint64_t memberId ) { m_memberIds.insert( memberId ); } -void Core::Linkshell::removeMember( uint32_t memberId ) +void Core::Linkshell::removeMember( uint64_t memberId ) { m_memberIds.erase( memberId ); } -void Core::Linkshell::addLeader( uint32_t memberId ) +void Core::Linkshell::addLeader( uint64_t memberId ) { m_leaderIds.insert( memberId ); } -void Core::Linkshell::removeLeader( uint32_t memberId ) +void Core::Linkshell::removeLeader( uint64_t memberId ) { m_leaderIds.erase( memberId ); } -void Core::Linkshell::addInvite( uint32_t memberId ) +void Core::Linkshell::addInvite( uint64_t memberId ) { m_inviteIds.insert( memberId ); } -void Core::Linkshell::removeInvite( uint32_t memberId ) +void Core::Linkshell::removeInvite( uint64_t memberId ) { m_inviteIds.erase( memberId ); } diff --git a/src/servers/Server_Zone/Linkshell/Linkshell.h b/src/servers/Server_Zone/Linkshell/Linkshell.h index 3dd393ec..62ca1781 100644 --- a/src/servers/Server_Zone/Linkshell/Linkshell.h +++ b/src/servers/Server_Zone/Linkshell/Linkshell.h @@ -11,49 +11,49 @@ class Linkshell { private: /*! unique ID of the linkshell */ - uint32_t m_linkshellId; + uint64_t m_linkshellId; /*! ID of the master character */ - uint32_t m_masterCharacterId; + uint64_t m_masterCharacterId; /*! ID list of all linkshell members */ - std::set< uint32_t > m_memberIds; + std::set< uint64_t > m_memberIds; /*! Name of the linkshell */ std::string m_name; /*! List of member IDs with leader rank */ - std::set< uint32_t > m_leaderIds; + std::set< uint64_t > m_leaderIds; /*! list of IDs of pending character invites */ - std::set< uint32_t > m_inviteIds; + std::set< uint64_t > m_inviteIds; public: - Linkshell( uint32_t id, + Linkshell( uint64_t id, const std::string& name, - uint32_t masterId, - const std::set< uint32_t >& members, - const std::set< uint32_t >& leaders, - const std::set< uint32_t >& invites ); + uint64_t masterId, + const std::set< uint64_t >& members, + const std::set< uint64_t >& leaders, + const std::set< uint64_t >& invites ); - uint32_t getId() const; + uint64_t getId() const; const std::string& getName() const; - uint32_t getMasterId() const; + uint64_t getMasterId() const; - const std::set< uint32_t >& getMemberIdList() const; - std::set< uint32_t >& getMemberIdList(); + const std::set< uint64_t >& getMemberIdList() const; + std::set< uint64_t >& getMemberIdList(); - const std::set< uint32_t >& getLeaderIdList() const; - std::set< uint32_t >& getLeaderIdList(); + const std::set< uint64_t >& getLeaderIdList() const; + std::set< uint64_t >& getLeaderIdList(); - const std::set< uint32_t >& getInviteIdList() const; - std::set< uint32_t >& getInviteIdList(); + const std::set< uint64_t >& getInviteIdList() const; + std::set< uint64_t >& getInviteIdList(); - void addMember( uint32_t memberId ); - void removeMember( uint32_t memberId ); + void addMember( uint64_t memberId ); + void removeMember( uint64_t memberId ); - void addLeader( uint32_t memberId ); - void removeLeader( uint32_t memberId ); + void addLeader( uint64_t memberId ); + void removeLeader( uint64_t memberId ); - void addInvite( uint32_t memberId ); - void removeInvite( uint32_t memberId ); + void addInvite( uint64_t memberId ); + void removeInvite( uint64_t memberId ); }; diff --git a/src/servers/Server_Zone/Linkshell/LinkshellMgr.cpp b/src/servers/Server_Zone/Linkshell/LinkshellMgr.cpp new file mode 100644 index 00000000..ce73b4e9 --- /dev/null +++ b/src/servers/Server_Zone/Linkshell/LinkshellMgr.cpp @@ -0,0 +1,59 @@ +#include "LinkshellMgr.h" +#include +#include +#include + +#include "Linkshell.h" + +extern Core::Logger g_log; +extern Core::Db::Database g_database; + +Core::LinkshellMgr::LinkshellMgr() +{ + +} + +bool Core::LinkshellMgr::loadLinkshells() +{ + + auto res = g_database.query( "SELECT LinkshellId, MasterCharacterId, CharacterIdList, " + "LinkshellName, LeaderIdList, InviteIdList " + "FROM infolinkshell " + "ORDER BY LinkshellId ASC;" ); + if( !res ) + return false; + + Db::Field *field = res->fetch(); + + + do + { + uint32_t linkshellId = field[0].getUInt32(); + uint32_t masterId = field[1].getUInt32(); + + std::string name = field[3].getString(); + + std::vector< uint64_t > characterIdList( field[2].getLength() / 8 ); + field[2].getBinary( reinterpret_cast< char* >( &characterIdList[0] ), field[2].getLength() ); + std::set< uint64_t > members( characterIdList.begin(), characterIdList.end() ); + + //std::vector< uint64_t > leaderIdList( field[4].getLength() / 8 ); + //field[4].getBinary( reinterpret_cast< char* >( &leaderIdList[0] ), field[4].getLength() ); + //std::set< uint64_t > leaders( leaderIdList.begin(), leaderIdList.end() ); + + std::set< uint64_t > leaders; + + //std::vector< uint64_t > inviteIdList( field[5].getLength() / 8 ); + //field[5].getBinary( reinterpret_cast< char* >( &leaderIdList[0] ), field[5].getLength() ); + //std::set< uint64_t > invites( inviteIdList.begin(), inviteIdList.end() ); + std::set< uint64_t > invites; + + auto lsPtr = boost::make_shared< Linkshell >( linkshellId, name, masterId, members, leaders, invites ); + m_linkshellIdMap[linkshellId] = lsPtr; + m_linkshellNameMap[name] = lsPtr; + + } while( res->nextRow() ); + + return true; + +} diff --git a/src/servers/Server_Zone/Linkshell/LinkshellMgr.h b/src/servers/Server_Zone/Linkshell/LinkshellMgr.h new file mode 100644 index 00000000..f6ee6a82 --- /dev/null +++ b/src/servers/Server_Zone/Linkshell/LinkshellMgr.h @@ -0,0 +1,25 @@ +#ifndef CORE_LINKSHELLMGR_H +#define CORE_LINKSHELLMGR_H + +#include +#include + +namespace Core +{ +class Linkshell; +typedef boost::shared_ptr< Linkshell > LinkshellPtr; + +class LinkshellMgr +{ +private: + std::map< uint32_t, LinkshellPtr > m_linkshellIdMap; + std::map< std::string, LinkshellPtr > m_linkshellNameMap; + +public: + LinkshellMgr(); + + bool loadLinkshells(); +}; + +} +#endif //CORE_LINKSHELLMGR_H diff --git a/src/servers/Server_Zone/ServerZone.cpp b/src/servers/Server_Zone/ServerZone.cpp index 6300ecf0..9a5d8486 100644 --- a/src/servers/Server_Zone/ServerZone.cpp +++ b/src/servers/Server_Zone/ServerZone.cpp @@ -23,6 +23,7 @@ #include "src/servers/Server_Zone/DebugCommand/DebugCommandHandler.h" #include "Script/ScriptManager.h" +#include "Linkshell/LinkshellMgr.h" #include "Forwards.h" #include @@ -36,6 +37,7 @@ Core::DebugCommandHandler g_gameCommandMgr; Core::Scripting::ScriptManager g_scriptMgr; Core::Data::ExdData g_exdData; Core::ZoneMgr g_zoneMgr; +Core::LinkshellMgr g_linkshellMgr; Core::ServerZone::ServerZone( const std::string& configPath, uint16_t serverId ) @@ -211,12 +213,19 @@ void Core::ServerZone::run( int32_t argc, char* argv[] ) g_exdData.loadAetheryteInfo(); g_exdData.loadTribeInfo(); + g_log.info( "LinkshellMgr: Caching linkshells" ); + if( !g_linkshellMgr.loadLinkshells() ) + { + g_log.fatal( "Unable to load linkshells!" ); + return; + } + Network::HivePtr hive( new Network::Hive() ); Network::addServerToHive< Network::GameConnection >( m_ip, m_port, hive ); g_scriptMgr.init(); - g_log.info( "ZoneHandler: Setting up zones" ); + g_log.info( "ZoneMgr: Setting up zones" ); g_zoneMgr.createZones(); std::vector< std::thread > thread_list;