diff --git a/src/world/Manager/LinkshellMgr.cpp b/src/world/Manager/LinkshellMgr.cpp index 7f8ea5f2..b293e061 100644 --- a/src/world/Manager/LinkshellMgr.cpp +++ b/src/world/Manager/LinkshellMgr.cpp @@ -373,4 +373,82 @@ void LinkshellMgr::joinLinkshell( uint64_t lsId, uint64_t characterId ) chatChannelMgr.addPlayerToChannel( lsPtr->getChatChannel(), *joiningPlayer ); sendLinkshellList( *joiningPlayer ); -} \ No newline at end of file +} + +void LinkshellMgr::addLeader( Sapphire::Entity::Player &sourcePlayer, Sapphire::Entity::Player &newLeaderPlayer, uint64_t linkshellId ) +{ + auto& server = Common::Service< World::WorldServer >::ref(); + + auto lsPtr = getLinkshellById( linkshellId ); + + if( !lsPtr ) + return Logger::warn( "Failed to promote player from linkshell - linkshell not found!" ); + + lsPtr->addLeader( newLeaderPlayer.getCharacterId() ); + writeLinkshell( lsPtr->getId() ); + sendLinkshellList( newLeaderPlayer ); + + auto linkshellResult = makeLinkshellResult( newLeaderPlayer, 0, 0, + WorldPackets::Client::LinkshellAddLeader, 0, + LinkshellResultPacket::UpdateStatus::Target, + lsPtr->getName(), sourcePlayer.getName() ); + + server.queueForPlayer( newLeaderPlayer.getCharacterId(), linkshellResult ); + + auto linkshellResult1 = makeLinkshellResult( sourcePlayer, 0, 0, + WorldPackets::Client::LinkshellAddLeader, 0, + LinkshellResultPacket::UpdateStatus::Execute, + lsPtr->getName(), newLeaderPlayer.getName() ); + + server.queueForPlayer( sourcePlayer.getCharacterId(), linkshellResult1 ); +} + +void LinkshellMgr::declineLeader( Sapphire::Entity::Player &sourcePlayer, uint64_t linkshellId ) +{ + auto& server = Common::Service< World::WorldServer >::ref(); + + auto lsPtr = getLinkshellById( linkshellId ); + + if( !lsPtr ) + return Logger::warn( "Failed to decline leader from linkshell - linkshell not found!" ); + + lsPtr->removeLeader( sourcePlayer.getCharacterId() ); + writeLinkshell( lsPtr->getId() ); + sendLinkshellList( sourcePlayer ); + + auto linkshellResult = makeLinkshellResult( sourcePlayer, 0, 0, + WorldPackets::Client::LinkshellDeclineLeader, 0, + LinkshellResultPacket::UpdateStatus::Execute, + lsPtr->getName(), sourcePlayer.getName() ); + + server.queueForPlayer( sourcePlayer.getCharacterId(), linkshellResult ); + +} + +void LinkshellMgr::removeLeader( Sapphire::Entity::Player &sourcePlayer, Sapphire::Entity::Player &leaderPlayer, uint64_t linkshellId ) +{ + auto& server = Common::Service< World::WorldServer >::ref(); + + auto lsPtr = getLinkshellById( linkshellId ); + + if( !lsPtr ) + return Logger::warn( "Failed to remove leader from linkshell - linkshell not found!" ); + + lsPtr->removeLeader( leaderPlayer.getCharacterId() ); + writeLinkshell( lsPtr->getId() ); + sendLinkshellList( leaderPlayer ); + + auto linkshellResult = makeLinkshellResult( leaderPlayer, 0, 0, + WorldPackets::Client::LinkshellRemoveLeader, 0, + LinkshellResultPacket::UpdateStatus::Target, + lsPtr->getName(), sourcePlayer.getName() ); + + server.queueForPlayer( leaderPlayer.getCharacterId(), linkshellResult ); + + auto linkshellResult1 = makeLinkshellResult( sourcePlayer, 0, 0, + WorldPackets::Client::LinkshellRemoveLeader, 0, + LinkshellResultPacket::UpdateStatus::Execute, + lsPtr->getName(), leaderPlayer.getName() ); + + server.queueForPlayer( sourcePlayer.getCharacterId(), linkshellResult1 ); +} diff --git a/src/world/Manager/LinkshellMgr.h b/src/world/Manager/LinkshellMgr.h index fab5e268..8184b28e 100644 --- a/src/world/Manager/LinkshellMgr.h +++ b/src/world/Manager/LinkshellMgr.h @@ -41,6 +41,10 @@ namespace Sapphire::World::Manager void invitePlayer( Entity::Player& sourcePlayer, Entity::Player& invitedPlayer, uint64_t linkshellId ); void kickPlayer( Entity::Player& sourcePlayer, Entity::Player& kickedPlayer, uint64_t linkshellId ); + void addLeader( Entity::Player& sourcePlayer, Entity::Player& newLeaderPlayer, uint64_t linkshellId ); + void removeLeader( Entity::Player& sourcePlayer, Entity::Player& leaderPlayer, uint64_t linkshellId ); + void declineLeader( Entity::Player& sourcePlayer, uint64_t linkshellId ); + void sendLinkshellList( Entity::Player& player ); // get all linkshells associated with player diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index 4ee0b9c7..5c02f1ce 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -68,6 +68,10 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH setZoneHandler( LinkshellJoin, "LinkshellJoin", &GameConnection::linkshellJoinHandler ); setZoneHandler( LinkshellKick, "LinkshellKick", &GameConnection::linkshellKickHandler ); + setZoneHandler( LinkshellAddLeader, "LinkshellAddLeader", &GameConnection::linkshellAddLeaderHandler ); + setZoneHandler( LinkshellRemoveLeader, "LinkshellRemoveLeader", &GameConnection::linkshellRemoveLeaderHandler ); + setZoneHandler( LinkshellDeclineLeader, "LinkshellDeclineLeader", &GameConnection::linkshellDeclineLeaderHandler ); + setZoneHandler( ReqExamineFcInfo, "ReqExamineFcInfo", &GameConnection::reqExamineFcInfo ); setZoneHandler( ZoneJump, "ZoneJump", &GameConnection::zoneJumpHandler ); setZoneHandler( Command, "Command", &GameConnection::commandHandler ); diff --git a/src/world/Network/GameConnection.h b/src/world/Network/GameConnection.h index 38ca6c96..a8bfde62 100644 --- a/src/world/Network/GameConnection.h +++ b/src/world/Network/GameConnection.h @@ -113,6 +113,10 @@ namespace Sapphire::Network DECLARE_HANDLER( linkshellListHandler ); DECLARE_HANDLER( linkshellKickHandler ); + DECLARE_HANDLER( linkshellAddLeaderHandler ); + DECLARE_HANDLER( linkshellRemoveLeaderHandler ); + DECLARE_HANDLER( linkshellDeclineLeaderHandler ); + DECLARE_HANDLER( linkshellJoinHandler ); DECLARE_HANDLER( syncHandler ); diff --git a/src/world/Network/Handlers/LinkshellHandlers.cpp b/src/world/Network/Handlers/LinkshellHandlers.cpp index 578e2b73..55c5992e 100644 --- a/src/world/Network/Handlers/LinkshellHandlers.cpp +++ b/src/world/Network/Handlers/LinkshellHandlers.cpp @@ -43,6 +43,52 @@ void Sapphire::Network::GameConnection::linkshellKickHandler( const Packets::FFX } +void Sapphire::Network::GameConnection::linkshellAddLeaderHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +{ + const auto lsAddLeaderPacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellAddLeader >( inPacket ); + auto& lsMgr = Common::Service< LinkshellMgr >::ref(); + auto& server = Common::Service< World::WorldServer >::ref(); + + auto playerPtr = server.getPlayer( lsAddLeaderPacket.data().MemberCharacterID ); + + if( !playerPtr ) + { + Logger::error( std::string( __FUNCTION__ ) + " requested player \"{}\" not found!", lsAddLeaderPacket.data().MemberCharacterName ); + return; + } + + lsMgr.addLeader( player, *playerPtr, lsAddLeaderPacket.data().LinkshellID ); + +} + +void Sapphire::Network::GameConnection::linkshellRemoveLeaderHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +{ + const auto lsRemoveLeaderPacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellRemoveLeader >( inPacket ); + auto& lsMgr = Common::Service< LinkshellMgr >::ref(); + auto& server = Common::Service< World::WorldServer >::ref(); + + auto playerPtr = server.getPlayer( lsRemoveLeaderPacket.data().MemberCharacterID ); + + if( !playerPtr ) + { + Logger::error( std::string( __FUNCTION__ ) + " requested player \"{}\" not found!", lsRemoveLeaderPacket.data().MemberCharacterName ); + return; + } + + lsMgr.removeLeader( player, *playerPtr, lsRemoveLeaderPacket.data().LinkshellID ); + +} + +void Sapphire::Network::GameConnection::linkshellDeclineLeaderHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) +{ + const auto lsDeclineLeaderPacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellDeclineLeader >( inPacket ); + auto& lsMgr = Common::Service< LinkshellMgr >::ref(); + auto& server = Common::Service< World::WorldServer >::ref(); + + lsMgr.declineLeader( player, lsDeclineLeaderPacket.data().LinkshellID ); + +} + void Sapphire::Network::GameConnection::linkshellJoinHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { const auto lsJoinPacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellJoin >( inPacket );