diff --git a/src/world/Action/EventItemAction.cpp b/src/world/Action/EventItemAction.cpp index bea1eb27..af24f887 100644 --- a/src/world/Action/EventItemAction.cpp +++ b/src/world/Action/EventItemAction.cpp @@ -54,17 +54,13 @@ void EventItemAction::execute() { Sapphire::Entity::PlayerPtr pPlayer = m_pSource->getAsPlayer(); if( !pPlayer ) - { return; - } + Manager::PlayerMgr::sendDebug( *pPlayer, "EventItemAction type {0} execute called.", m_eventItemAction->data().Action ); auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); - auto& eventMgr = Common::Service< World::Manager::EventMgr >::ref(); - eventMgr.eventStart( *pPlayer, m_targetId, m_eventItemAction->data().EventHandler, - Event::EventHandler::ActionResult, 0, 0 ); - + eventMgr.eventStart( *pPlayer, m_targetId, m_eventItemAction->data().EventHandler, Event::EventHandler::ActionResult, 0, 0 ); scriptMgr.onEventItem( *pPlayer, m_eventItem, m_eventItemAction->data().EventHandler, m_targetId ); eventMgr.checkEvent( *pPlayer, m_eventItemAction->data().EventHandler ); } diff --git a/src/world/Action/ItemAction.cpp b/src/world/Action/ItemAction.cpp index 1712672b..03139e01 100644 --- a/src/world/Action/ItemAction.cpp +++ b/src/world/Action/ItemAction.cpp @@ -94,7 +94,7 @@ void ItemAction::handleCompanionItem() auto player = getSourceChara()->getAsPlayer(); player->unlockCompanion( m_itemAction->data().Calcu0Arg[ 0 ] ); - player->dropInventoryItem( static_cast< Common::InventoryType >( m_itemSourceContainer ), m_itemSourceSlot ); + player->dropInventoryItem( static_cast< Common::InventoryType >( m_itemSourceContainer ), static_cast< uint8_t >( m_itemSourceSlot ) ); } void ItemAction::handleMountItem() @@ -102,5 +102,5 @@ void ItemAction::handleMountItem() auto player = getSourceChara()->getAsPlayer(); player->unlockMount( m_itemAction->data().Calcu0Arg[ 0 ] ); - player->dropInventoryItem( static_cast< Common::InventoryType >( m_itemSourceContainer ), m_itemSourceSlot ); + player->dropInventoryItem( static_cast< Common::InventoryType >( m_itemSourceContainer ), static_cast< uint8_t >( m_itemSourceSlot ) ); } \ No newline at end of file diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index e181b659..c3165361 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -158,7 +158,6 @@ void DebugCommandMgr::help( char* data, Entity::Player& player, std::shared_ptr< void DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< DebugCommand > command ) { auto& server = Sapphire::Common::Service< Sapphire::World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto& terriMgr = Common::Service< TerritoryMgr >::ref(); auto pCurrentZone = terriMgr.getTerritoryByGuId( player.getTerritoryId() ); @@ -210,8 +209,7 @@ void DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< setActorPosPacket->data().x = player.getPos().x; setActorPosPacket->data().y = player.getPos().y; setActorPosPacket->data().z = player.getPos().z; - pSession->getZoneConnection()->queueOutPacket( setActorPosPacket ); - + server.queueForPlayer( player.getCharacterId(), setActorPosPacket ); } else if( ( subCommand == "tele" ) && ( !params.empty() ) ) { @@ -229,12 +227,12 @@ void DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< auto discoveryPacket = makeZonePacket< FFXIVIpcDiscoveryReply >( player.getId() ); discoveryPacket->data().mapId = static_cast< uint32_t >( map_id ); discoveryPacket->data().mapPartId = static_cast< uint32_t >( discover_id ); - pSession->getZoneConnection()->queueOutPacket( discoveryPacket ); + server.queueForPlayer( player.getCharacterId(), discoveryPacket ); } else if( subCommand == "discovery_reset" ) { player.resetDiscovery(); - pSession->getZoneConnection()->queueOutPacket( std::make_shared< PlayerSetupPacket >( player ) ); + server.queueForPlayer( player.getCharacterId(), std::make_shared< PlayerSetupPacket >( player ) ); } else if( subCommand == "classjob" ) { @@ -365,7 +363,7 @@ void DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< auto fcPacket = makeZonePacket< FFXIVIpcFreeCompany >( player.getId() ); fcPacket->data().Crest = 0x0001000100010001; strcpy( fcPacket->data().Tag, "Wang" ); - pSession->getZoneConnection()->queueOutPacket( fcPacket ); + server.queueForPlayer( player.getCharacterId(), fcPacket ); auto fcResultPacket = makeZonePacket< FFXIVIpcGetFcStatusResult >( player.getId() ); fcResultPacket->data().FreeCompanyID = 1; @@ -374,7 +372,7 @@ void DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< fcResultPacket->data().GrandCompanyID = 1; fcResultPacket->data().FcRank = 8; fcResultPacket->data().CrestID = 0x0001000100010001; - pSession->getZoneConnection()->queueOutPacket( fcResultPacket ); + server.queueForPlayer( player.getCharacterId(), fcResultPacket ); } else { @@ -606,7 +604,7 @@ void DebugCommandMgr::injectPacket( char* data, Entity::Player& player, std::sha { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getId() ); + auto pSession = server.getSession( player.getCharacterId() ); if( pSession ) pSession->getZoneConnection()->injectPacket( data + 7, player ); } @@ -615,7 +613,7 @@ void DebugCommandMgr::injectChatPacket( char* data, Entity::Player& player, std: { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getId() ); + auto pSession = server.getSession( player.getCharacterId() ); if( pSession ) pSession->getChatConnection()->injectPacket( data + 8, player ); } @@ -648,19 +646,19 @@ void DebugCommandMgr::replay( char* data, Entity::Player& player, std::shared_pt if( subCommand == "start" ) { - auto pSession = server.getSession( player.getId() ); + auto pSession = server.getSession( player.getCharacterId() ); if( pSession ) pSession->startReplay( params ); } else if( subCommand == "stop" ) { - auto pSession = server.getSession( player.getId() ); + auto pSession = server.getSession( player.getCharacterId() ); if( pSession ) pSession->stopReplay(); } else if( subCommand == "info" ) { - auto pSession = server.getSession( player.getId() ); + auto pSession = server.getSession( player.getCharacterId() ); if( pSession ) pSession->sendReplayInfo(); } diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index 7f854e33..d9a71dc7 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -472,8 +472,6 @@ void HousingMgr::sendWardLandInfo( Entity::Player& player, uint8_t wardId, uint1 { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); - auto landSetId = toLandSetId( territoryTypeId, wardId ); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); @@ -680,7 +678,6 @@ void HousingMgr::deleteHouse( Sapphire::HousePtr house ) const void HousingMgr::buildPresetEstate( Entity::Player& player, HousingZone& zone, uint8_t plotNum, uint32_t presetCatalogId ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto pLand = zone.getLand( plotNum ); if( !pLand ) @@ -731,7 +728,6 @@ void HousingMgr::buildPresetEstate( Entity::Player& player, HousingZone& zone, u void HousingMgr::requestEstateRename( Entity::Player& player, const Common::LandIdent ident ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); @@ -758,7 +754,6 @@ void HousingMgr::requestEstateRename( Entity::Player& player, const Common::Land void HousingMgr::requestEstateEditGreeting( Entity::Player& player, const Common::LandIdent ident ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); @@ -814,7 +809,6 @@ void HousingMgr::updateEstateGreeting( Entity::Player& player, const Common::Lan void HousingMgr::requestEstateEditGuestAccess( Entity::Player& player, const Common::LandIdent ident ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto landSetId = toLandSetId( ident.territoryTypeId, ident.wardNum ); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); @@ -993,7 +987,6 @@ void HousingMgr::reqPlaceHousingItem( Entity::Player& player, uint16_t landId, u Common::FFXIVARR_POSITION3 pos, float rotation ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() ); @@ -1312,7 +1305,6 @@ bool HousingMgr::moveInternalItem( Entity::Player& player, Common::LandIdent ide Common::FFXIVARR_POSITION3 pos, float rot ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto containerIdx = static_cast< uint16_t >( slot / 50 ); auto slotIdx = slot % 50; @@ -1359,7 +1351,6 @@ bool HousingMgr::moveInternalItem( Entity::Player& player, Common::LandIdent ide bool HousingMgr::moveExternalItem( Entity::Player& player, Common::LandIdent ident, uint8_t slot, HousingZone& terri, Common::FFXIVARR_POSITION3 pos, float rot ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto land = terri.getLand( static_cast< uint8_t >( ident.landId ) ); @@ -1599,7 +1590,6 @@ ItemContainerPtr HousingMgr::getFreeEstateInventorySlot( Common::LandIdent ident void HousingMgr::reqEstateExteriorRemodel( Entity::Player& player, uint16_t plot ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto& teriMgr = Common::Service< TerritoryMgr >::ref(); auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() ); @@ -1635,7 +1625,6 @@ void HousingMgr::reqEstateInteriorRemodel( Entity::Player& player ) auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() ); auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto terri = std::dynamic_pointer_cast< Territory::Housing::HousingInteriorTerritory >( pZone ); if( !terri ) @@ -1699,7 +1688,6 @@ void HousingMgr::removeHouse( Entity::Player& player, uint16_t plot ) return; auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto pLand = terri->getLand( plot ); if( !pLand ) diff --git a/src/world/Manager/InventoryMgr.cpp b/src/world/Manager/InventoryMgr.cpp index 9734fc5a..70be4cb7 100644 --- a/src/world/Manager/InventoryMgr.cpp +++ b/src/world/Manager/InventoryMgr.cpp @@ -25,7 +25,6 @@ using namespace Sapphire::Network::Packets::WorldPackets::Server; void InventoryMgr::sendInventoryContainer( Entity::Player& player, ItemContainerPtr container ) { auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( player.getCharacterId() ); auto sequence = player.getNextInventorySequence(); auto pMap = container->getItemMap(); diff --git a/src/world/Manager/PartyMgr.cpp b/src/world/Manager/PartyMgr.cpp index c5ab4aeb..a110db2b 100644 --- a/src/world/Manager/PartyMgr.cpp +++ b/src/world/Manager/PartyMgr.cpp @@ -23,22 +23,13 @@ using namespace Sapphire::World::Manager; using namespace Sapphire::Network::Packets; using namespace Sapphire::Network::Packets::WorldPackets::Server; -void PartyMgr::onJoin( uint32_t joinerId, uint32_t inviterId ) +void PartyMgr::onJoin( Entity::Player& joiner, Entity::Player& inviter ) { auto& server = Common::Service< World::WorldServer >::ref(); auto& ccMgr = Common::Service< World::Manager::ChatChannelMgr >::ref(); - auto pInvitee = server.getSession( joinerId ); - auto pInviter = server.getSession( inviterId ); - - if( !pInvitee || !pInviter ) - { - Logger::error( "Joining player or inviter is null!!" ); - return; - } - - auto& inviteePlayer = *pInvitee->getPlayer(); - auto& invitingPlayer = *pInviter->getPlayer(); + auto& inviteePlayer = joiner; + auto& invitingPlayer = inviter; if( inviteePlayer.getPartyId() != 0 ) { @@ -130,17 +121,17 @@ void PartyMgr::onLeave( Sapphire::Entity::Player &leavingPlayer ) if( leavingPlayer.getId() == party->LeaderId ) { newLeaderId = party->MemberId[ 0 ]; - auto pSession = server.getSession( newLeaderId ); - if( !pSession ) + auto pPlayer = playerMgr().getPlayer( newLeaderId ); + if( !pPlayer || !pPlayer->isConnected() ) continue; - pSession->getPlayer()->addOnlineStatus( Common::OnlineStatus::PartyLeader ); - server.queueForPlayer( member->getCharacterId(), makePcPartyUpdate( leavingPlayer.getAsPlayer(), pSession->getPlayer(), - UpdateStatus::LEAVELEADER_LEAVED_MEMBER, party->PartyCount ) ); + pPlayer->addOnlineStatus( Common::OnlineStatus::PartyLeader ); + server.queueForPlayer( member->getCharacterId(), makePcPartyUpdate( leavingPlayer.getAsPlayer(), pPlayer, + UpdateStatus::LEAVELEADER_LEAVED_MEMBER, party->PartyCount ) ); } else { server.queueForPlayer( member->getCharacterId(), makePcPartyUpdate( leavingPlayer.getAsPlayer(), nullptr, - UpdateStatus::LEAVE_MEMBER, party->PartyCount ) ); + UpdateStatus::LEAVE_MEMBER, party->PartyCount ) ); } } @@ -194,8 +185,7 @@ void PartyMgr::onMemberDisconnect( Entity::Player& disconnectingPlayer ) for( const auto& member : members ) { - bool isConnected = server.getSession( member->getCharacterId() ) != nullptr; - if( isConnected ) + if( member->isConnected() ) { anyMembersOnline = true; break; @@ -227,12 +217,13 @@ void PartyMgr::onMemberRejoin( Entity::Player& joiningPlayer ) void PartyMgr::onKick( const std::string& kickPlayerName, Entity::Player& leader ) { auto& server = Common::Service< World::WorldServer >::ref(); + auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref(); auto party = getParty( leader.getPartyId() ); assert( party ); auto pLeader = getPartyLeader( *party ); auto members = getPartyMembers( *party ); - auto pKickedSession = server.getSession( kickPlayerName ); - if( !pKickedSession ) + auto pKickedPlayer = playerMgr.getPlayer( kickPlayerName ); + if( !pKickedPlayer ) { Logger::error( "Target player for kicking not found (\"{t}\")", kickPlayerName ); return; @@ -252,11 +243,11 @@ void PartyMgr::onKick( const std::string& kickPlayerName, Entity::Player& leader member->removeOnlineStatus( Common::OnlineStatus::PartyMember ); server.queueForPlayer( member->getCharacterId(), { makePcPartyUpdate( *pLeader, *member, UpdateStatus::KICK_SELF, party->PartyCount ), - makeZonePacket< FFXIVIpcUpdateParty >( member->getId() ) } ); + makeZonePacket< FFXIVIpcUpdateParty >( member->getId() ) } ); } else { - server.queueForPlayer( member->getCharacterId(), makePcPartyUpdate( *pKickedSession->getPlayer(), UpdateStatus::KICK_MEMBER, party->PartyCount ) ); + server.queueForPlayer( member->getCharacterId(), makePcPartyUpdate( *pKickedPlayer, UpdateStatus::KICK_MEMBER, party->PartyCount ) ); } } party->PartyCount--; @@ -407,7 +398,7 @@ void PartyMgr::sendPartyUpdate( Party& party ) for( const auto& member : partyMembers ) { - bool isConnected = server.getSession( member->getCharacterId() ) != nullptr; + bool isConnected = member->isConnected(); // if player is online and in the same zone as current member in party, display more data in partylist bool hasInfo = isConnected && member->getTerritoryTypeId() == pMember->getTerritoryTypeId(); diff --git a/src/world/Manager/PartyMgr.h b/src/world/Manager/PartyMgr.h index 0fe4f7e5..7548b35f 100644 --- a/src/world/Manager/PartyMgr.h +++ b/src/world/Manager/PartyMgr.h @@ -49,7 +49,7 @@ namespace Sapphire::World::Manager PartyMgr() = default; /// Perform required actions for events - void onJoin( uint32_t joinerId, uint32_t inviterId ); + void onJoin( Entity::Player& joiner, Entity::Player& inviter ); void onLeave( Entity::Player& leavingPlayer ); void onMoveZone( Entity::Player& movingPlayer ); void onDisband( Entity::Player& disbandingPlayer ); diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index 0611e74f..ca7e1d9a 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -83,6 +83,18 @@ Sapphire::Entity::PlayerPtr PlayerMgr::getPlayer( const std::string& playerName return loadPlayer( playerName ); } +std::vector< Sapphire::Entity::PlayerPtr > PlayerMgr::searchPlayersByName( const std::string& playerName ) +{ + std::vector< Sapphire::Entity::PlayerPtr > results{}; + + for( auto& it : m_playerMapByName ) + { + if( it.first.find( playerName ) != std::string::npos ) + results.push_back( it.second ); + } + return results; +} + std::string PlayerMgr::getPlayerNameFromDb( uint64_t characterId, bool forceDbLoad ) { diff --git a/src/world/Manager/PlayerMgr.h b/src/world/Manager/PlayerMgr.h index d7a6409e..dc35eeb7 100644 --- a/src/world/Manager/PlayerMgr.h +++ b/src/world/Manager/PlayerMgr.h @@ -15,6 +15,7 @@ namespace Sapphire::World::Manager Entity::PlayerPtr getPlayer( uint32_t entityId ); Entity::PlayerPtr getPlayer( uint64_t characterId ); Entity::PlayerPtr getPlayer( const std::string& playerName ); + std::vector< Entity::PlayerPtr > searchPlayersByName( const std::string& playerName ); Entity::PlayerPtr addPlayer( uint64_t characterId ); Entity::PlayerPtr loadPlayer( uint32_t entityId ); Entity::PlayerPtr loadPlayer( uint64_t characterId ); diff --git a/src/world/Network/Handlers/CommonListHandler.cpp b/src/world/Network/Handlers/CommonListHandler.cpp index 9e6976d5..28c7795b 100644 --- a/src/world/Network/Handlers/CommonListHandler.cpp +++ b/src/world/Network/Handlers/CommonListHandler.cpp @@ -92,7 +92,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX PlayerEntry entry{}; memset( &entry, 0, sizeof( PlayerEntry ) ); - bool isConnected = server.getSession( pPlayer->getCharacterId() ) != nullptr; + bool isConnected = pPlayer->isConnected(); if( isConnected ) { diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index 33afb4cb..a92ae1b4 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -612,12 +612,12 @@ void Sapphire::Network::GameConnection::gmCommandNameHandler( const Packets::FFX Logger::debug( "{0} used GM2 commandId: {1}, params: {2}, {3}, {4}, {5}, target: {6}", player.getName(), commandId, param1, param2, param3, param4, target ); - auto targetSession = server().getSession( target ); + auto targetPlayer = playerMgr().getPlayer( target ); Sapphire::Entity::CharaPtr targetActor; - if( targetSession != nullptr ) + if( targetPlayer != nullptr ) { - targetActor = targetSession->getPlayer(); + targetActor = targetPlayer; } else { @@ -638,8 +638,6 @@ void Sapphire::Network::GameConnection::gmCommandNameHandler( const Packets::FFX auto pTargetActorTerri = teriMgr.getTerritoryByGuId( targetActor->getTerritoryId() ); auto pPlayerTerri = teriMgr.getTerritoryByGuId( player.getTerritoryId() ); - auto targetPlayer = targetActor->getAsPlayer(); - switch( commandId ) { case GmCommand::Raise: diff --git a/src/world/Network/Handlers/InviteHandlers.cpp b/src/world/Network/Handlers/InviteHandlers.cpp index c7c1f759..926c67ef 100644 --- a/src/world/Network/Handlers/InviteHandlers.cpp +++ b/src/world/Network/Handlers/InviteHandlers.cpp @@ -146,7 +146,7 @@ void Sapphire::Network::GameConnection::inviteReplyHandler( const FFXIVARR_PACKE uint8_t result = InviteUpdateType::REJECT_INVITE; if( data.Answer == InviteReplyType::ACCEPT ) { - partyMgr.onJoin( player.getId(), pPlayer->getId() ); + partyMgr.onJoin( player, *pPlayer ); result = InviteUpdateType::ACCEPT_INVITE; } diff --git a/src/world/Network/Handlers/PacketCommandHandler.cpp b/src/world/Network/Handlers/PacketCommandHandler.cpp index 77a9b8f3..fc5021c1 100644 --- a/src/world/Network/Handlers/PacketCommandHandler.cpp +++ b/src/world/Network/Handlers/PacketCommandHandler.cpp @@ -380,24 +380,21 @@ const char* packetCommandToString( uint16_t commandId ) void examineHandler( Sapphire::Entity::Player& player, uint32_t targetId ) { using namespace Sapphire; + auto pPlayer = playerMgr().getPlayer( targetId ); - auto& server = Service< World::WorldServer >::ref(); - auto pSession = server.getSession( targetId ); - if( pSession ) + if( !pPlayer ) + return; + + if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) { - auto pTarget = pSession->getPlayer(); - if( pTarget ) - { - if( pTarget->isActingAsGm() || pTarget->getTerritoryTypeId() != player.getTerritoryTypeId() ) - { - server.queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), ActorControlType::ExamineError ) ); - } - else - { - server.queueForPlayer( player.getCharacterId(), std::make_shared< InspectPacket >( player, pTarget ) ); - } - } + server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), ActorControlType::ExamineError ) ); } + else + { + server().queueForPlayer( player.getCharacterId(), std::make_shared< InspectPacket >( player, pPlayer ) ); + } + + } void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) @@ -568,7 +565,7 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_ server().queueForPlayers( player.getInRangePlayerIds(), movePacket ); server().queueForPlayers( player.getInRangePlayerIds(), makeActorControl( player.getId(), ActorControlType::EmoteModeInterrupt ) ); - server().queueForPlayers( player.getInRangePlayerIds(), makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( ActorStatus::Idle ) ) ); + server().queueForPlayers( player.getInRangePlayerIds(), makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( ActorStatus::Idle ) ) ); } break; } diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index cc84a772..c0363eca 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -390,17 +390,17 @@ void Sapphire::Network::GameConnection::pcSearchHandler( const Packets::FFXIVARR // on lastName, client automatically adds a space to first character - no need to manually add space - auto queryPlayers = server.searchSessionByName( queryName ); + auto queryPlayers = playerMgr().searchPlayersByName( queryName ); // store result in player - we don't map out query keys to data yet std::vector< uint32_t > entityIdVec; - for( const auto& pSession : queryPlayers ) + for( const auto& pPlayer : queryPlayers ) { - if( !pSession ) + if( !pPlayer || !pPlayer->isConnected() ) continue; - entityIdVec.emplace_back( pSession->getPlayer()->getId() ); + entityIdVec.emplace_back( pPlayer->getId() ); } player.setLastPcSearchResult( entityIdVec ); @@ -492,9 +492,10 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC auto& server = Common::Service< World::WorldServer >::ref(); - auto pSession = server.getSession( data.toName ); - if( !pSession ) + auto pTargetPlayer = playerMgr().getPlayer( data.toName ); + + if( !pTargetPlayer || pTargetPlayer->isConnected() ) { auto tellErrPacket = makeZonePacket< Packets::Server::FFXIVIpcTellNotFound >( player.getId() ); strcpy( tellErrPacket->data().toName, data.toName ); @@ -502,8 +503,6 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC return; } - auto pTargetPlayer = pSession->getPlayer(); - if( pTargetPlayer->hasCondition( PlayerCondition::BetweenAreas ) ) { // send error for player between areas @@ -513,12 +512,6 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC auto pSessionSource = server.getSession( player.getCharacterId() ); - if( !pSession ) - { - Logger::error( std::string( __FUNCTION__ ) + ": Session not found for player#{}", player.getCharacterId() ); - return; - } - if( pTargetPlayer->hasCondition( PlayerCondition::BoundByDuty ) && !player.isActingAsGm() ) { auto boundPacket = makeChatPacket< Packets::Server::FFXIVRecvFinderStatus >( player.getId() ); @@ -545,7 +538,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC tellPacket->data().type |= ChatFromType::GmTellMsg; //TODO: Is there an enum for this? or is it only GM? } - pSession->getChatConnection()->queueOutPacket( tellPacket ); + server.getSession( pTargetPlayer->getCharacterId() )->getChatConnection()->queueOutPacket( tellPacket ); } void Sapphire::Network::GameConnection::chatToChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) diff --git a/src/world/Session.cpp b/src/world/Session.cpp index 950623c3..7890a309 100644 --- a/src/world/Session.cpp +++ b/src/world/Session.cpp @@ -51,7 +51,6 @@ Sapphire::Network::GameConnectionPtr Sapphire::World::Session::getChatConnection bool Sapphire::World::Session::loadPlayer() { - auto& server = Common::Service< World::WorldServer >::ref(); auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref(); m_isValid = false; diff --git a/src/world/Territory/Territory.cpp b/src/world/Territory/Territory.cpp index 82f86010..44a065e9 100644 --- a/src/world/Territory/Territory.cpp +++ b/src/world/Territory/Territory.cpp @@ -492,8 +492,7 @@ void Territory::updateSessions( uint64_t tickCount, bool changedWeather ) } // this session is not linked to this area anymore, remove it from zone session list - // TODO: Retrieving the session is expensive, try to find a better method of removing invalid actors - if( pPlayer->getTerritoryId() != m_guId || !server.getSession( pPlayer->getId() ) ) + if( pPlayer->getTerritoryId() != m_guId || !pPlayer->isConnected() ) { Logger::debug( "[{}] removeActor( pPlayer );", pPlayer->getId() ); removeActor( pPlayer ); diff --git a/src/world/WorldServer.cpp b/src/world/WorldServer.cpp index 6043d515..f0f9eaa4 100644 --- a/src/world/WorldServer.cpp +++ b/src/world/WorldServer.cpp @@ -441,7 +441,6 @@ bool WorldServer::createSession( uint32_t sessionId ) } m_sessionMapById[ sessionId ] = newSession; - m_sessionMapByName[ newSession->getPlayer()->getName() ] = newSession; m_sessionMapByCharacterId[ newSession->getPlayer()->getCharacterId() ] = newSession; return true; @@ -454,7 +453,6 @@ void WorldServer::removeSession( uint32_t sessionId ) return; m_sessionMapById.erase( sessionId ); - m_sessionMapByName.erase( pSession->getPlayer()->getName() ); m_sessionMapByCharacterId.erase( pSession->getPlayer()->getCharacterId() ); } @@ -480,25 +478,9 @@ SessionPtr WorldServer::getSession( uint64_t id ) return nullptr; } -SessionPtr WorldServer::getSession( const std::string& playerName ) -{ - //std::lock_guard lock( m_sessionMutex ); - - auto it = m_sessionMapByName.find( playerName ); - - if( it != m_sessionMapByName.end() ) - return ( it->second ); - - return nullptr; -} - void WorldServer::removeSession( const Entity::Player& player ) { - auto session = getSession( player.getCharacterId() ); - if( session ) - m_sessionMapById.erase( session->getId() ); - - m_sessionMapByName.erase( player.getName() ); + m_sessionMapById.erase( player.getId() ); m_sessionMapByCharacterId.erase( player.getCharacterId() ); } @@ -507,26 +489,6 @@ bool WorldServer::isRunning() const return m_bRunning; } -std::vector< SessionPtr > WorldServer::searchSessionByName( const std::string& playerName ) -{ - //std::lock_guard lock( m_sessionMutex ); - - std::vector< SessionPtr > results{}; - - for( auto it = m_sessionMapByName.begin(); it != m_sessionMapByName.end(); ++it ) { - if( it->first.find( playerName ) != std::string::npos ) { - results.push_back( it->second ); - } - } - - return results; -} - -std::map< int32_t, WorldServer::BNPCMap >& Sapphire::World::WorldServer::getBNpcTeriMap() -{ - return m_bNpcTerritoryMap; -} - Sapphire::Common::Config::WorldConfig& WorldServer::getConfig() { return m_config; diff --git a/src/world/WorldServer.h b/src/world/WorldServer.h index 8772998e..f2a69397 100644 --- a/src/world/WorldServer.h +++ b/src/world/WorldServer.h @@ -29,8 +29,6 @@ namespace Sapphire::World World::SessionPtr getSession( uint32_t id ); World::SessionPtr getSession( uint64_t characterId ); - World::SessionPtr getSession( const std::string& playerName ); - std::vector< World::SessionPtr > searchSessionByName( const std::string& playerName ); size_t getSessionCount() const; @@ -64,23 +62,14 @@ namespace Sapphire::World uint16_t m_worldId; std::string m_configName; - std::mutex m_sessionMutex; Sapphire::Common::Config::WorldConfig m_config; std::map< uint32_t, SessionPtr > m_sessionMapById; std::map< uint64_t, SessionPtr > m_sessionMapByCharacterId; - std::map< std::string, SessionPtr > m_sessionMapByName; - - std::map< uint32_t, uint32_t > m_zones; - - using BNPCMap = std::map< uint32_t, std::shared_ptr< Common::BNPCInstanceObject > >; - std::map< int32_t, BNPCMap > m_bNpcTerritoryMap; public: - std::map< int32_t, BNPCMap >& getBNpcTeriMap(); - void updateSessions( uint32_t currTime ); void DbKeepAlive( uint32_t currTime );