From 755aeedf60a1c1c0fc84553d40add801ceb3dfcc Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 9 Dec 2021 23:38:23 +0100 Subject: [PATCH] Implemented linkshell kick --- src/world/Manager/LinkshellMgr.cpp | 32 +++++++++++++++++++ src/world/Manager/LinkshellMgr.h | 1 + src/world/Network/GameConnection.cpp | 1 + src/world/Network/GameConnection.h | 1 + .../Network/Handlers/LinkshellHandlers.cpp | 22 +++++++++++-- 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/world/Manager/LinkshellMgr.cpp b/src/world/Manager/LinkshellMgr.cpp index 0ca6e66f..7f8ea5f2 100644 --- a/src/world/Manager/LinkshellMgr.cpp +++ b/src/world/Manager/LinkshellMgr.cpp @@ -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(); diff --git a/src/world/Manager/LinkshellMgr.h b/src/world/Manager/LinkshellMgr.h index 4234b775..fab5e268 100644 --- a/src/world/Manager/LinkshellMgr.h +++ b/src/world/Manager/LinkshellMgr.h @@ -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 ); diff --git a/src/world/Network/GameConnection.cpp b/src/world/Network/GameConnection.cpp index d92308e9..4ee0b9c7 100644 --- a/src/world/Network/GameConnection.cpp +++ b/src/world/Network/GameConnection.cpp @@ -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 ); diff --git a/src/world/Network/GameConnection.h b/src/world/Network/GameConnection.h index c8131af5..38ca6c96 100644 --- a/src/world/Network/GameConnection.h +++ b/src/world/Network/GameConnection.h @@ -111,6 +111,7 @@ namespace Sapphire::Network DECLARE_HANDLER( joinChatChannelHandler ); DECLARE_HANDLER( linkshellListHandler ); + DECLARE_HANDLER( linkshellKickHandler ); DECLARE_HANDLER( linkshellJoinHandler ); diff --git a/src/world/Network/Handlers/LinkshellHandlers.cpp b/src/world/Network/Handlers/LinkshellHandlers.cpp index 09df9847..578e2b73 100644 --- a/src/world/Network/Handlers/LinkshellHandlers.cpp +++ b/src/world/Network/Handlers/LinkshellHandlers.cpp @@ -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 ); }