1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 22:57:45 +00:00

Added leader modification functions for linkshells

This commit is contained in:
Mordred 2021-12-12 13:06:15 +01:00
parent 755aeedf60
commit 001e0c2e5c
5 changed files with 137 additions and 1 deletions

View file

@ -373,4 +373,82 @@ void LinkshellMgr::joinLinkshell( uint64_t lsId, uint64_t characterId )
chatChannelMgr.addPlayerToChannel( lsPtr->getChatChannel(), *joiningPlayer );
sendLinkshellList( *joiningPlayer );
}
}
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 );
}

View file

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

View file

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

View file

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

View file

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