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

Implemented linkshell kick

This commit is contained in:
Mordred 2021-12-09 23:38:23 +01:00
parent fed653ed62
commit 755aeedf60
5 changed files with 55 additions and 2 deletions

View file

@ -274,6 +274,38 @@ void LinkshellMgr::invitePlayer( Entity::Player& sourcePlayer, Entity::Player& i
server.queueForPlayer( sourcePlayer.getCharacterId(), linkshellInviteResult1 );
}
void LinkshellMgr::kickPlayer( Entity::Player& sourcePlayer, Entity::Player& kickedPlayer, uint64_t linkshellId )
{
auto& server = Common::Service< World::WorldServer >::ref();
auto& chatChannelMgr = Common::Service< Manager::ChatChannelMgr >::ref();
auto lsPtr = getLinkshellById( linkshellId );
if( !lsPtr )
return Logger::warn( "Failed to kick player from linkshell - linkshell not found!" );
lsPtr->removeInvite( kickedPlayer.getCharacterId() );
lsPtr->removeLeader( kickedPlayer.getCharacterId() );
lsPtr->removeMember( kickedPlayer.getCharacterId() );
writeLinkshell( lsPtr->getId() );
sendLinkshellList( kickedPlayer );
auto linkshellKickResult = makeLinkshellResult( kickedPlayer, 0, 0,
WorldPackets::Client::LinkshellKick, 0,
LinkshellResultPacket::UpdateStatus::Target,
lsPtr->getName(), sourcePlayer.getName() );
server.queueForPlayer( kickedPlayer.getCharacterId(), linkshellKickResult );
auto linkshellKickResult1 = makeLinkshellResult( sourcePlayer, 0, 0,
WorldPackets::Client::LinkshellKick, 0,
LinkshellResultPacket::UpdateStatus::Execute,
lsPtr->getName(), kickedPlayer.getName() );
server.queueForPlayer( sourcePlayer.getCharacterId(), linkshellKickResult1 );
chatChannelMgr.removePlayerFromChannel( lsPtr->getChatChannel(), kickedPlayer );
}
void LinkshellMgr::sendLinkshellList( Entity::Player& player )
{
auto& server = Common::Service< World::WorldServer >::ref();

View file

@ -39,6 +39,7 @@ namespace Sapphire::World::Manager
void finishLinkshellCreation( const std::string& name, uint32_t result, Entity::Player& player );
void invitePlayer( Entity::Player& sourcePlayer, Entity::Player& invitedPlayer, uint64_t linkshellId );
void kickPlayer( Entity::Player& sourcePlayer, Entity::Player& kickedPlayer, uint64_t linkshellId );
void sendLinkshellList( Entity::Player& player );

View file

@ -66,6 +66,7 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH
setZoneHandler( GetLinkshellList, "GetLinkshellList", &GameConnection::linkshellListHandler );
setZoneHandler( LinkshellJoin, "LinkshellJoin", &GameConnection::linkshellJoinHandler );
setZoneHandler( LinkshellKick, "LinkshellKick", &GameConnection::linkshellKickHandler );
setZoneHandler( ReqExamineFcInfo, "ReqExamineFcInfo", &GameConnection::reqExamineFcInfo );
setZoneHandler( ZoneJump, "ZoneJump", &GameConnection::zoneJumpHandler );

View file

@ -111,6 +111,7 @@ namespace Sapphire::Network
DECLARE_HANDLER( joinChatChannelHandler );
DECLARE_HANDLER( linkshellListHandler );
DECLARE_HANDLER( linkshellKickHandler );
DECLARE_HANDLER( linkshellJoinHandler );

View file

@ -25,6 +25,24 @@ void Sapphire::Network::GameConnection::linkshellListHandler( const Packets::FFX
lsMgr.sendLinkshellList( player );
}
void Sapphire::Network::GameConnection::linkshellKickHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
const auto lsKickPacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellKick >( inPacket );
auto& lsMgr = Common::Service< LinkshellMgr >::ref();
auto& server = Common::Service< World::WorldServer >::ref();
auto playerPtr = server.getPlayer( lsKickPacket.data().LeaveCharacterID );
if( !playerPtr )
{
Logger::error( std::string( __FUNCTION__ ) + " requested player \"{}\" not found!", lsKickPacket.data().LeaveCharacterName );
return;
}
lsMgr.kickPlayer( player, *playerPtr, lsKickPacket.data().LinkshellID );
}
void Sapphire::Network::GameConnection::linkshellJoinHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
{
const auto lsJoinPacket = ZoneChannelPacket< Client::FFXIVIpcLinkshellJoin >( inPacket );
@ -32,7 +50,7 @@ void Sapphire::Network::GameConnection::linkshellJoinHandler( const Packets::FFX
auto& lsMgr = Common::Service< LinkshellMgr >::ref();
auto charName = std::string( lsJoinPacket.data().MemberCharacterName );
auto invitedPlayer = server.getSession( charName );
auto invitedPlayer = server.getPlayer( charName );
if( !invitedPlayer )
{
@ -40,7 +58,7 @@ void Sapphire::Network::GameConnection::linkshellJoinHandler( const Packets::FFX
return;
}
lsMgr.invitePlayer( player, *invitedPlayer->getPlayer(), lsJoinPacket.data().LinkshellID );
lsMgr.invitePlayer( player, *invitedPlayer, lsJoinPacket.data().LinkshellID );
}