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 ) void Sapphire::Linkshell::removeMember( uint64_t memberId )
{ {
m_memberIds.erase( memberId ); m_memberIds.erase( memberId );
m_leaderIds.erase( memberId );
m_inviteIds.erase( memberId );
} }
void Sapphire::Linkshell::addLeader( uint64_t 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 ); 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 ); 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( SetFriendlistGroup, "SetFriendlistGroup", &GameConnection::setFriendlistGroupHandler );
setZoneHandler( LinkshellLeave, "LinkshellLeave", &GameConnection::linkshellLeaveHandler ); setZoneHandler( LinkshellLeave, "LinkshellLeave", &GameConnection::linkshellLeaveHandler );
setZoneHandler( LinkshellJoinOfficial, "LinkshellJoinOfficial", &GameConnection::linkshellJoinOfficialHandler );
} }
Sapphire::Network::GameConnection::~GameConnection() = default; Sapphire::Network::GameConnection::~GameConnection() = default;

View file

@ -221,6 +221,7 @@ namespace Sapphire::Network
DECLARE_HANDLER( setFriendlistGroupHandler ); DECLARE_HANDLER( setFriendlistGroupHandler );
DECLARE_HANDLER( linkshellLeaveHandler ); 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 ) void Sapphire::Network::GameConnection::linkshellLeaveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{ {
const auto lsLeavePacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellLeave >( inPacket ); 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() );
} }