1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-07 11:17:46 +00:00

Join and leave linkshell implemented

This commit is contained in:
Mordred 2021-12-05 00:37:52 +01:00
parent 55f9b0219f
commit e84c034509
6 changed files with 45 additions and 0 deletions

View file

@ -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 )

View file

@ -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 );
}

View file

@ -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 );
};

View file

@ -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;

View file

@ -221,6 +221,7 @@ namespace Sapphire::Network
DECLARE_HANDLER( setFriendlistGroupHandler );
DECLARE_HANDLER( linkshellLeaveHandler );
DECLARE_HANDLER( linkshellJoinOfficialHandler );
};
}

View file

@ -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() );
}