diff --git a/src/world/Linkshell/Linkshell.cpp b/src/world/Linkshell/Linkshell.cpp index f5489b52..7c06e323 100644 --- a/src/world/Linkshell/Linkshell.cpp +++ b/src/world/Linkshell/Linkshell.cpp @@ -74,6 +74,8 @@ void Sapphire::Linkshell::addMember( uint64_t memberId ) void Sapphire::Linkshell::removeMember( uint64_t memberId ) { m_memberIds.erase( memberId ); + m_leaderIds.erase( memberId ); + m_inviteIds.erase( memberId ); } void Sapphire::Linkshell::addLeader( uint64_t memberId ) diff --git a/src/world/Manager/LinkshellMgr.cpp b/src/world/Manager/LinkshellMgr.cpp index 96d5eddd..c5d87192 100644 --- a/src/world/Manager/LinkshellMgr.cpp +++ b/src/world/Manager/LinkshellMgr.cpp @@ -294,4 +294,31 @@ void LinkshellMgr::sendLinkshellList( Entity::Player& player ) server.queueForPlayer( player.getCharacterId(), linkshellListPacket ); } +void LinkshellMgr::leaveLinkshell( uint64_t lsId, uint64_t characterId ) +{ + auto& server = Common::Service< World::WorldServer >::ref(); + auto leavingPlayer = server.getPlayer( characterId ); + auto lsPtr = getLinkshellById( lsId ); + if( !leavingPlayer || !lsPtr ) + return; + lsPtr->removeMember( characterId ); + writeLinkshell( lsId ); + + sendLinkshellList( *leavingPlayer ); +} + +void LinkshellMgr::joinLinkshell( uint64_t lsId, uint64_t characterId ) +{ + auto &server = Common::Service< World::WorldServer >::ref(); + auto joiningPlayer = server.getPlayer( characterId ); + auto lsPtr = getLinkshellById( lsId ); + if( !joiningPlayer || !lsPtr ) + return; + + lsPtr->addMember( characterId ); + lsPtr->removeInvite( characterId ); + writeLinkshell( lsId ); + + sendLinkshellList( *joiningPlayer ); +} \ No newline at end of file diff --git a/src/world/Manager/LinkshellMgr.h b/src/world/Manager/LinkshellMgr.h index 7d7dfaef..2c8f37ba 100644 --- a/src/world/Manager/LinkshellMgr.h +++ b/src/world/Manager/LinkshellMgr.h @@ -47,6 +47,9 @@ namespace Sapphire::World::Manager LinkshellPtr getLinkshellById( uint64_t lsId ); + void leaveLinkshell( uint64_t lsId, uint64_t characterId ); + void joinLinkshell( uint64_t lsId, uint64_t characterId ); + }; diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 85531609..51aad754 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -145,6 +145,7 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( SetFriendlistGroup, "SetFriendlistGroup", &GameConnection::setFriendlistGroupHandler ); setZoneHandler( LinkshellLeave, "LinkshellLeave", &GameConnection::linkshellLeaveHandler ); + setZoneHandler( LinkshellJoinOfficial, "LinkshellJoinOfficial", &GameConnection::linkshellJoinOfficialHandler ); } Sapphire::Network::GameConnection::~GameConnection() = default; diff --git a/src/world/Network/GameConnection.h b/src/world/Network/GameConnection.h index 835511a1..c8131af5 100644 --- a/src/world/Network/GameConnection.h +++ b/src/world/Network/GameConnection.h @@ -221,6 +221,7 @@ namespace Sapphire::Network DECLARE_HANDLER( setFriendlistGroupHandler ); DECLARE_HANDLER( linkshellLeaveHandler ); + DECLARE_HANDLER( linkshellJoinOfficialHandler ); }; } diff --git a/src/world/Network/Handlers/LinkshellHandlers.cpp b/src/world/Network/Handlers/LinkshellHandlers.cpp index 7b257065..f22ef645 100644 --- a/src/world/Network/Handlers/LinkshellHandlers.cpp +++ b/src/world/Network/Handlers/LinkshellHandlers.cpp @@ -36,4 +36,15 @@ void Sapphire::Network::GameConnection::linkshellJoinHandler( const Packets::FFX void Sapphire::Network::GameConnection::linkshellLeaveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto lsLeavePacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellLeave >( inPacket ); + auto& lsMgr = Common::Service< LinkshellMgr >::ref(); + + lsMgr.leaveLinkshell( lsLeavePacket.data().LinkshellID, player.getCharacterId() ); +} + +void Sapphire::Network::GameConnection::linkshellJoinOfficialHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +{ + const auto lsLeavePacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellJoinOfficial >( inPacket ); + auto& lsMgr = Common::Service< LinkshellMgr >::ref(); + + lsMgr.joinLinkshell( lsLeavePacket.data().LinkshellID, player.getCharacterId() ); } \ No newline at end of file