From fb7be5053a9d0d00c16ec4c05f8d8343688491c2 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 7 Mar 2023 15:08:28 +0100 Subject: [PATCH] Some more packet cleanup. --- src/world/Manager/HousingMgr.cpp | 32 ++++------- src/world/Manager/PartyMgr.cpp | 2 +- src/world/Manager/PlayerMgr.cpp | 53 ++++++++++--------- src/world/Manager/PlayerMgr.h | 2 + src/world/Manager/WarpMgr.cpp | 16 +++--- src/world/Network/Handlers/PacketHandlers.cpp | 40 ++++++-------- 6 files changed, 65 insertions(+), 80 deletions(-) diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index bcc9a008..eb4f3d94 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -434,8 +435,7 @@ bool HousingMgr::relinquishLand( Entity::Player& player, HousingZone& zone, uint // TODO: actually use permissions here for FC houses if( !hasPermission( player, *pLand, 0 ) ) { - auto msgPkt = makeActorControlSelf( player.getId(), ActorControl::LogMsg, 3304, 0 ); - server.queueForPlayer( player.getCharacterId(), msgPkt ); + Network::Util::Packet::sendActorControlSelf( player, ActorControl::LogMsg, 3304 ); return false; } @@ -443,8 +443,7 @@ bool HousingMgr::relinquishLand( Entity::Player& player, HousingZone& zone, uint // TODO: additionally check for yard items if( pLand->getHouse() ) { - auto msgPkt = makeActorControlSelf( player.getId(), ActorControl::LogMsg, 3315, 0 ); - server.queueForPlayer( player.getCharacterId(), msgPkt ); + Network::Util::Packet::sendActorControlSelf( player, ActorControl::LogMsg, 3315 ); return false; } @@ -460,11 +459,8 @@ bool HousingMgr::relinquishLand( Entity::Player& player, HousingZone& zone, uint sendLandFlagsSlot( player, Common::LandFlagsSlot::Private ); - auto screenMsgPkt2 = makeActorControlSelf( player.getId(), ActorControl::LogMsg, 3351, 0x1AA, - pLand->getLandIdent().wardNum + 1, plot + 1 ); - server.queueForPlayer( player.getCharacterId(), screenMsgPkt2 ); + Network::Util::Packet::sendActorControlSelf( player, ActorControl::LogMsg, 3351, 0x1AA, pLand->getLandIdent().wardNum + 1, plot + 1 ); zone.sendLandUpdate( plot ); - return true; } @@ -708,9 +704,7 @@ void HousingMgr::buildPresetEstate( Entity::Player& player, HousingZone& zone, u pLand->setLandType( Common::LandType::Private ); zone.sendLandUpdate( plotNum ); - auto pSuccessBuildingPacket = makeActorControl( player.getId(), ActorControl::BuildPresetResponse, plotNum ); - - server.queueForPlayer( player.getCharacterId(), pSuccessBuildingPacket ); + Network::Util::Packet::sendActorControl( player, ActorControl::BuildPresetResponse, plotNum ); pLand->updateLandDb(); @@ -1065,7 +1059,7 @@ void HousingMgr::reqPlaceHousingItem( Entity::Player& player, uint16_t landId, u status = placeInteriorItem( player, item ); if( status ) - server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), 0x3f3 ) ); + Network::Util::Packet::sendActorControlSelf( player, 0x3f3 ); else PlayerMgr::sendUrgent( player, "An internal error occurred when placing the item." ); } @@ -1343,7 +1337,7 @@ bool HousingMgr::moveInternalItem( Entity::Player& player, Common::LandIdent ide // send confirmation to player uint32_t param1 = static_cast< uint32_t >( ( ident.landId << 16 ) | containerId ); - server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ActorControl::HousingItemMoveConfirm, param1, slotIdx ) ); + Network::Util::Packet::sendActorControlSelf( player, ActorControl::HousingItemMoveConfirm, param1, slotIdx ); return true; } @@ -1377,7 +1371,7 @@ bool HousingMgr::moveExternalItem( Entity::Player& player, Common::LandIdent ide terri.updateYardObjectPos( player, slot, static_cast< uint16_t >( ident.landId ), *item ); uint32_t param1 = static_cast< uint32_t >( ( ident.landId << 16 ) | Common::InventoryType::HousingExteriorPlacedItems ); - server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ActorControl::HousingItemMoveConfirm, param1, slot ) ); + Network::Util::Packet::sendActorControlSelf( player, ActorControl::HousingItemMoveConfirm, param1, slot ) ); return true; } @@ -1614,9 +1608,7 @@ void HousingMgr::reqEstateExteriorRemodel( Entity::Player& player, uint16_t plot invMgr.sendInventoryContainer( player, it->second ); - auto pkt = makeActorControlSelf( player.getId(), Network::ActorControl::ShowEstateExternalAppearanceUI, plot ); - server.queueForPlayer( player.getCharacterId(), pkt ); - + Network::Util::Packet::sendActorControlSelf( player, ActorControl::ShowEstateExternalAppearanceUI, plot ); } void HousingMgr::reqEstateInteriorRemodel( Entity::Player& player ) @@ -1653,8 +1645,7 @@ void HousingMgr::reqEstateInteriorRemodel( Entity::Player& player ) invMgr.sendInventoryContainer( player, it->second ); - auto pkt = makeActorControlSelf( player.getId(), Network::ActorControl::ShowEstateInternalAppearanceUI ); - server.queueForPlayer( player.getCharacterId(), pkt ); + Network::Util::Packet::sendActorControlSelf( player, ActorControl::ShowEstateInternalAppearanceUI ); } bool HousingMgr::hasPermission( Entity::Player& player, Sapphire::Land& land, uint32_t permission ) @@ -1697,8 +1688,7 @@ void HousingMgr::removeHouse( Entity::Player& player, uint16_t plot ) // TODO: actually use permissions here for FC houses if( !hasPermission( player, *pLand, 0 ) ) { - auto msgPkt = makeActorControlSelf( player.getId(), ActorControl::LogMsg, 3305, 0 ); - server.queueForPlayer( player.getCharacterId(), msgPkt ); + Network::Util::Packet::sendActorControlSelf( player, ActorControl::LogMsg, 3305 ); return; } diff --git a/src/world/Manager/PartyMgr.cpp b/src/world/Manager/PartyMgr.cpp index a110db2b..657be52e 100644 --- a/src/world/Manager/PartyMgr.cpp +++ b/src/world/Manager/PartyMgr.cpp @@ -200,7 +200,7 @@ void PartyMgr::onMemberDisconnect( Entity::Player& disconnectingPlayer ) { // TODO: 2nd argument here makes it automatically send passing leadership message server.queueForPlayer( member->getCharacterId(), { makePcPartyUpdate( disconnectingPlayer, UpdateStatus::OFFLINE_MEMBER, party->PartyCount ), - makeZonePacket< FFXIVIpcUpdateParty >( member->getId() ) } ); + makeZonePacket< FFXIVIpcUpdateParty >( member->getId() ) } ); } sendPartyUpdate( *party ); diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index 19237200..ace0ae42 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -307,35 +307,38 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount ) if( !player.isAlive() ) return; - auto mainWeap = player.getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand ); - if( mainWeap && !player.checkAction() && ( player.getTargetId() && player.getStance() == Common::Stance::Active && player.isAutoattackOn() ) ) + checkAutoAttack( player, tickCount ); +} + +void PlayerMgr::checkAutoAttack( Entity::Player& player, uint64_t tickCount ) const +{ + auto mainWeap = player.getItemAt( Common::GearSet0, Common::MainHand ); + if( !mainWeap || !player.isAutoattackOn() || player.checkAction() || !player.getTargetId() || player.getStance() != Common::Active ) + return; + + for( const auto& actor : player.getInRangeActors() ) { - // @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need... - for( const auto& actor : player.getInRangeActors() ) + if( actor->getId() != player.getTargetId() || !actor->getAsChara()->isAlive() ) + continue; + auto chara = actor->getAsChara(); + + // default autoattack range + float range = 3.f + chara->getRadius() + player.getRadius() * 0.5f; + + // default autoattack range for ranged classes + auto classJob = player.getClass(); + + if( classJob == Common::ClassJob::Machinist || classJob == Common::ClassJob::Bard || classJob == Common::ClassJob::Archer ) + range = 25.f + chara->getRadius() + player.getRadius() * 0.5f; + + if( ( Common::Util::distance( player.getPos(), actor->getPos() ) <= range ) && + ( ( tickCount - player.getLastAttack() ) > mainWeap->getDelay() ) ) { - if( actor->getId() != player.getTargetId() || !actor->getAsChara()->isAlive() ) - continue; - auto chara = actor->getAsChara(); - - // default autoattack range - float range = 3.f + chara->getRadius() + player.getRadius() * 0.5f; - - // default autoattack range for ranged classes - auto classJob = player.getClass(); - - if( classJob == Common::ClassJob::Machinist || classJob == Common::ClassJob::Bard || classJob == Common::ClassJob::Archer ) - range = 25.f + chara->getRadius() + player.getRadius() * 0.5f; - - if( Common::Util::distance( player.getPos(), actor->getPos() ) <= range ) - { - if( ( tickCount - player.getLastAttack() ) > mainWeap->getDelay() ) - { - player.setLastAttack( tickCount ); - player.autoAttack( actor->getAsChara() ); - } - } + player.setLastAttack( tickCount ); + player.autoAttack( actor->getAsChara() ); } } + } diff --git a/src/world/Manager/PlayerMgr.h b/src/world/Manager/PlayerMgr.h index 3abb7cfb..4777f699 100644 --- a/src/world/Manager/PlayerMgr.h +++ b/src/world/Manager/PlayerMgr.h @@ -65,6 +65,8 @@ namespace Sapphire::World::Manager std::map< uint32_t, Entity::PlayerPtr > m_playerMapById; std::map< uint64_t, Entity::PlayerPtr > m_playerMapByCharacterId; std::map< std::string, Entity::PlayerPtr > m_playerMapByName; + + void checkAutoAttack( Entity::Player& player, uint64_t tickCount ) const; }; diff --git a/src/world/Manager/WarpMgr.cpp b/src/world/Manager/WarpMgr.cpp index 2f3e1cac..5d1c8b8c 100644 --- a/src/world/Manager/WarpMgr.cpp +++ b/src/world/Manager/WarpMgr.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -90,10 +91,8 @@ void WarpMgr::requestWarp( Entity::Player& player, Common::WarpType warpType, Co { m_entityIdToWarpInfoMap[ player.getId() ] = { 0, warpType, targetPos, targetRot }; - server().queueForPlayers( player.getInRangePlayerIds( true ), - makeActorControlSelf( player.getId(), WarpStart, warpType, warpType, 0, player.getTerritoryTypeId(), 1 ) ); - server().queueForPlayers( player.getInRangePlayerIds(), - makeActorControl( player.getId(), ActorDespawnEffect, warpType, player.getTerritoryTypeId() ) ); + Network::Util::Packet::sendActorControlSelf( player.getInRangePlayerIds( true ), player, WarpStart, warpType, warpType, 0, player.getTerritoryTypeId(), 1 ); + Network::Util::Packet::sendActorControl( player.getInRangePlayerIds(), player, ActorDespawnEffect, warpType, player.getTerritoryTypeId() ); auto& taskMgr = Common::Service< TaskMgr >::ref(); taskMgr.queueTask( makeWarpTask( player, warpType, targetPos, targetRot, 1000 ) ); @@ -127,14 +126,11 @@ void WarpMgr::finishWarp( Entity::Player& player ) auto warpFinishAnim = warpType - 1; - auto zoneInPacket = makeActorControlSelf( player.getId(), Appear, warpFinishAnim, raiseAnim, 0, 0 ); - auto setStatusPacket = makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); - if( !player.getGmInvis() ) - server().queueForPlayers( player.getInRangePlayerIds(), zoneInPacket ); + Network::Util::Packet::sendActorControlSelf( player.getInRangePlayerIds(), player, Appear, warpFinishAnim, raiseAnim ); - server().queueForPlayer( player.getCharacterId(), zoneInPacket ); - server().queueForPlayers( player.getInRangePlayerIds( true ), setStatusPacket ); + Network::Util::Packet::sendActorControlSelf( player, Appear, warpFinishAnim, raiseAnim ); + Network::Util::Packet::sendActorControl( player.getInRangePlayerIds( true ), player, SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); player.removeCondition( PlayerCondition::BetweenAreas ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 3d03fbb0..0649f94a 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -103,17 +103,15 @@ void Sapphire::Network::GameConnection::getSearchCommentHandler( const Packets:: Logger::debug( "getSearchCommentHandler: {0}", targetId ); - if( pPlayer ) - { - if( pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) - return; + if( !pPlayer || pPlayer->isActingAsGm() || pPlayer->getTerritoryTypeId() != player.getTerritoryTypeId() ) + return; + + // retail sends the requester's id as both (isForSelf) + auto searchInfoPacket = makeZonePacket< FFXIVIpcGetSearchCommentResult >( player.getId() ); + searchInfoPacket->data().TargetEntityID = targetId; + strcpy( searchInfoPacket->data().SearchComment, pPlayer->getSearchMessage() ); + server().queueForPlayer( player.getCharacterId(), searchInfoPacket ); - // retail sends the requester's id as both (isForSelf) - auto searchInfoPacket = makeZonePacket< FFXIVIpcGetSearchCommentResult >( player.getId() ); - searchInfoPacket->data().TargetEntityID = targetId; - strcpy( searchInfoPacket->data().SearchComment, pPlayer->getSearchMessage() ); - server().queueForPlayer( player.getCharacterId(), searchInfoPacket ); - } } void Sapphire::Network::GameConnection::reqExamineFcInfo( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) @@ -313,14 +311,14 @@ void Sapphire::Network::GameConnection::newDiscoveryHandler( const Packets::FFXI PlayerMgr::sendDebug( player, "Discovery ref pos id#{0}", layoutId ); - if( pRefInfo ) - { - auto discoveryPacket = makeZonePacket< FFXIVIpcDiscoveryReply >( player.getId() ); - discoveryPacket->data().mapId = tInfo->data().Map; - discoveryPacket->data().mapPartId = pRefInfo->data.discoveryIndex; - server().queueForPlayer( player.getCharacterId(), discoveryPacket ); - player.discover( tInfo->data().Map, pRefInfo->data.discoveryIndex ); - } + if( !pRefInfo ) + return; + + auto discoveryPacket = makeZonePacket< FFXIVIpcDiscoveryReply >( player.getId() ); + discoveryPacket->data().mapId = tInfo->data().Map; + discoveryPacket->data().mapPartId = pRefInfo->data.discoveryIndex; + server().queueForPlayer( player.getCharacterId(), discoveryPacket ); + player.discover( tInfo->data().Map, pRefInfo->data.discoveryIndex ); } @@ -363,9 +361,7 @@ void Sapphire::Network::GameConnection::setLanguageHandler( const Packets::FFXIV // if this is a login event if( player.isLogin() ) - { playerMgr().sendLoginMessage( player ); - } // spawn the player for himself player.spawn( player.getAsPlayer() ); @@ -619,9 +615,7 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA player.sendGearInventory(); if( packet.data().contextId < 0xFE ) - { - server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::GearSetEquipMsg, packet.data().contextId ) ); - } + Network::Util::Packet::sendActorControlSelf( player, GearSetEquipMsg, packet.data().contextId ); auto invTransFinPacket = makeZonePacket< FFXIVIpcItemOperationBatch >( player.getId() ); invTransFinPacket->data().contextId = contextId;