From 5fdbc904870387e19d82160c15cbf91cd7aa0fef Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 6 Mar 2023 13:27:56 +0100 Subject: [PATCH] Next big batch of packet cleanup --- src/world/Actor/Player.cpp | 24 ++-- src/world/Manager/AchievementMgr.cpp | 8 +- src/world/Manager/HousingMgr.cpp | 14 ++ src/world/Manager/PlayerMgr.cpp | 128 ++---------------- src/world/Manager/PlayerMgr.h | 12 -- .../Network/Handlers/GMCommandHandlers.cpp | 6 +- .../Network/Handlers/PacketCommandHandler.cpp | 8 +- src/world/Network/Util/PlayerUtil.cpp | 70 ++++++++++ src/world/Network/Util/PlayerUtil.h | 17 +++ 9 files changed, 142 insertions(+), 145 deletions(-) diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 66a8cd9f..2ce6e2c3 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -570,6 +570,8 @@ void Player::learnSong( uint8_t songId, uint32_t itemId ) Util::valueToFlagByteIndexValue( songId, value, index ); m_orchestrion[ index ] |= value; + + Network::Util::Player::sendActorControlSelf( *this, ToggleOrchestrionUnlock, songId, 1, itemId ); } bool Player::hasReward( Common::UnlockEntry unlockId ) const @@ -599,14 +601,14 @@ bool Player::hasMount( uint32_t mountId ) const void Player::gainExp( uint32_t amount ) { uint32_t currentExp = getExp(); - uint16_t level = getLevel(); + auto currentClass = static_cast< uint8_t >( getClass() ); if( level >= Common::MAX_PLAYER_LEVEL ) { setExp( 0 ); if( currentExp != 0 ) - Service< World::Manager::PlayerMgr >::ref().onGainExp( *this, 0 ); + Network::Util::Player::sendActorControlSelf( *this, UpdateUiExp, currentClass, 0 ); return; } @@ -619,9 +621,7 @@ void Player::gainExp( uint32_t amount ) if( ( currentExp + amount ) >= neededExpToLevel ) { // levelup - amount = ( currentExp + amount - neededExpToLevel ) > neededExpToLevelPlus1 ? - neededExpToLevelPlus1 - 1 : - ( currentExp + amount - neededExpToLevel ); + amount = ( currentExp + amount - neededExpToLevel ) > neededExpToLevelPlus1 ? neededExpToLevelPlus1 - 1 : ( currentExp + amount - neededExpToLevel ); if( level + 1 >= Common::MAX_PLAYER_LEVEL ) amount = 0; @@ -630,11 +630,10 @@ void Player::gainExp( uint32_t amount ) levelUp(); } else - { setExp( currentExp + amount ); - } - Service< World::Manager::PlayerMgr >::ref().onGainExp( *this, amount ); + Network::Util::Player::sendActorControlSelf( *this, GainExpMsg, currentClass, amount ); + Network::Util::Player::sendActorControlSelf( *this, UpdateUiExp, currentClass, getExp() ); } void Player::levelUp() @@ -643,8 +642,10 @@ void Player::levelUp() m_mp = getMaxMp(); setLevel( getLevel() + 1 ); + Network::Util::Player::sendActorControl( getInRangePlayerIds( true ), *this, LevelUpEffect, static_cast< uint8_t >( getClass() ), getLevel(), getLevel() - 1 ); - Service< World::Manager::PlayerMgr >::ref().onLevelUp( *this ); + auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref(); + achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( *this, static_cast< uint32_t >( getClass() ) ); Service< World::Manager::MapMgr >::ref().updateQuests( *this ); } @@ -727,6 +728,11 @@ void Player::setLevel( uint8_t level ) auto& exdData = Common::Service< Data::ExdData >::ref(); uint8_t classJobIndex = exdData.getRow< Excel::ClassJob >( static_cast< uint8_t >( getClass() ) )->data().WorkIndex; m_classArray[ classJobIndex ] = level; + + calculateStats(); + Network::Util::Player::sendBaseParams( *this ); + Network::Util::Player::sendHudParam( *this ); + Network::Util::Player::sendStatusUpdate( *this ); } void Player::setLevelForClass( uint8_t level, Common::ClassJob classjob ) diff --git a/src/world/Manager/AchievementMgr.cpp b/src/world/Manager/AchievementMgr.cpp index aacf7ab8..75fbe184 100644 --- a/src/world/Manager/AchievementMgr.cpp +++ b/src/world/Manager/AchievementMgr.cpp @@ -2,10 +2,12 @@ #include #include "AchievementMgr.h" -#include "PlayerMgr.h" +#include +#include using namespace Sapphire; using namespace Sapphire::Network; +using namespace Sapphire::Network::ActorControl; using namespace Sapphire::Network::Packets; using namespace Sapphire::World::Manager; @@ -67,7 +69,9 @@ void AchievementMgr::unlockAchievement( Entity::Player& player, uint32_t achieve // fire packets player.setAchievementData( achvData ); - Common::Service< World::Manager::PlayerMgr >::ref().onUnlockAchievement( player, achievementId ); + Network::Util::Player::sendAchievementList( player ); + Network::Util::Player::sendActorControl( player, AchievementComplete, achievementId ); + Network::Util::Player::sendActorControl( player, AchievementObtainMsg, achievementId ); // check and add title to player auto achvTitleId = achvExd->data().Title; diff --git a/src/world/Manager/HousingMgr.cpp b/src/world/Manager/HousingMgr.cpp index d9a71dc7..bcc9a008 100644 --- a/src/world/Manager/HousingMgr.cpp +++ b/src/world/Manager/HousingMgr.cpp @@ -1786,6 +1786,20 @@ void HousingMgr::sendLandFlagsSlot( Entity::Player& player, Common::LandFlagsSlo void HousingMgr::sendLandFlags( Entity::Player& player ) { + if( Sapphire::LandPtr pLand = getLandByOwnerId( player.getCharacterId() ) ) + { + uint32_t state = 0; + if( pLand->getHouse() ) + { + state |= Common::LandFlags::CHARA_HOUSING_LAND_DATA_FLAG_HOUSE; + + // todo: remove this, debug for now + state |= Common::LandFlags::CHARA_HOUSING_LAND_DATA_FLAG_AETHERYTE; + } + + player.setLandFlags( Common::LandFlagsSlot::Private, state, pLand->getLandIdent() ); + } + auto landFlags = makeZonePacket< FFXIVIpcCharaHousing >( player.getId() ); landFlags->data().FcLands = player.getCharaLandData( Common::LandFlagsSlot::FreeCompany ); diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index b60c0ffb..48e64eaa 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -26,8 +26,6 @@ #include #include #include -#include -#include #include #include #include @@ -214,76 +212,6 @@ Sapphire::Entity::PlayerPtr PlayerMgr::syncPlayer( uint64_t characterId ) return pPlayer; } -void PlayerMgr::onAchievementListChanged( Entity::Player& player ) -{ - auto achvData = player.getAchievementData(); - - auto achvPacket = makeZonePacket< FFXIVIpcAchievement >( player.getId() ); - std::memcpy( &achvPacket->data().complete[ 0 ], &achvData.unlockList[ 0 ], sizeof( achvPacket->data().complete ) ); - std::memcpy( &achvPacket->data().history[ 0 ], &achvData.history[ 0 ], sizeof( achvPacket->data().history ) ); - - server().queueForPlayer( player.getCharacterId(), achvPacket ); -} - -void PlayerMgr::onAchievementProgressChanged( Entity::Player& player, uint32_t achievementId ) -{ - - auto& achvMgr = Common::Service< Manager::AchievementMgr >::ref(); - - auto achvProgress = achvMgr.getAchievementDataById( player, achievementId ); - - auto pAchvProgressPacket = makeActorControl( player.getId(), AchievementSetRate, achievementId, achvProgress.first, achvProgress.second ); - server().queueForPlayer( player.getCharacterId(), pAchvProgressPacket ); -} - -void PlayerMgr::onUnlockAchievement( Entity::Player& player, uint32_t achievementId ) -{ - onAchievementListChanged( player ); - - server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementComplete, achievementId ) ); - server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementObtainMsg, achievementId ) ); -} - -void PlayerMgr::onRestingTick( Entity::Player& player ) -{ - server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< RestingPacket >( player ) ); -} - -void PlayerMgr::onLevelUp( Entity::Player& player ) -{ - player.calculateStats(); - Network::Util::Player::sendBaseParams( player ); - Network::Util::Player::sendHudParam( player ); - - auto inRangePlayerIds = player.getInRangePlayerIds( true ); - - Network::Util::Player::sendActorControl( inRangePlayerIds, player, LevelUpEffect, static_cast< uint8_t >( player.getClass() ), - player.getLevel(), player.getLevel() - 1 ); - - Network::Util::Player::sendStatusUpdate( player ); - - auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref(); - achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( player.getClass() ) ); -} - -void PlayerMgr::onGainExp( Entity::Player& player, uint32_t exp ) -{ - - if( exp != 0 ) - server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), GainExpMsg, - static_cast< uint8_t >( player.getClass() ), exp ) ); - - server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), UpdateUiExp, - static_cast< uint8_t >( player.getClass() ), player.getExp() ) ); -} - -void PlayerMgr::onUnlockOrchestrion( Entity::Player& player, uint8_t songId, uint32_t itemId ) -{ - player.learnSong( songId, itemId ); - - server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) ); -} - void PlayerMgr::onMobKill( Entity::Player& player, Entity::BNpc& bnpc ) { auto& scriptMgr = Common::Service< Scripting::ScriptMgr >::ref(); @@ -325,7 +253,6 @@ void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player ) { auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); auto& housingMgr = Common::Service< HousingMgr >::ref(); - auto& partyMgr = Common::Service< World::Manager::PartyMgr >::ref(); auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() ); if( !pZone ) @@ -335,17 +262,14 @@ void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player ) } auto& teri = *pZone; - auto initPacket = makeZonePacket< FFXIVIpcLogin >( player.getId() ); - initPacket->data().playerActorId = player.getId(); - - server().queueForPlayer( player.getCharacterId(), initPacket ); + Network::Util::Player::sendLogin( player ); player.sendInventory(); if( player.isLogin() ) { - server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetConfigFlags, player.getConfigFlags(), 1 ) ); - server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), SetMaxGearSets, player.getMaxGearSets() ) ); + Network::Util::Player::sendActorControlSelf( player, SetConfigFlags, player.getConfigFlags(), 1 ); + Network::Util::Player::sendActorControlSelf( player, SetMaxGearSets, player.getMaxGearSets() ); } // set flags, will be reset automatically by zoning ( only on client side though ) @@ -355,63 +279,35 @@ void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player ) Network::Util::Player::sendHuntingLog( player ); if( player.isLogin() ) - server().queueForPlayer( player.getCharacterId(), makePlayerSetup( player ) ); + Network::Util::Player::sendPlayerSetup( player ); Network::Util::Player::sendRecastGroups( player ); Network::Util::Player::sendBaseParams( player ); Network::Util::Player::sendActorControl( player, SetItemLevel, player.getItemLevel() ); if( player.isLogin() ) { - auto classInfo = makeZonePacket< FFXIVIpcChangeClass >( player.getId() ); - classInfo->data().ClassJob = static_cast< uint8_t >( player.getClass() ); - classInfo->data().Lv = player.getLevel(); - classInfo->data().Lv1 = player.getLevel(); - if( player.isLogin() ) - classInfo->data().Login = 1; - server().queueForPlayer( player.getCharacterId(), classInfo ); - - server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), 0x112, 0x24 ) ); // unknown - - auto contentFinderList = makeZonePacket< FFXIVIpcContentAttainFlags >( player.getId() ); - std::memset( &contentFinderList->data(), 0xFF, sizeof( contentFinderList->data() ) ); - server().queueForPlayer( player.getCharacterId(), contentFinderList ); - + Network::Util::Player::sendChangeClass( player ); + Network::Util::Player::sendActorControl( player, 0x112, 0x24 ); // unknown + Network::Util::Player::sendContentAttainFlags( player ); player.clearSoldItems(); } - if( Sapphire::LandPtr pLand = housingMgr.getLandByOwnerId( player.getCharacterId() ) ) - { - uint32_t state = 0; - if( pLand->getHouse() ) - { - state |= Common::LandFlags::CHARA_HOUSING_LAND_DATA_FLAG_HOUSE; - - // todo: remove this, debug for now - state |= Common::LandFlags::CHARA_HOUSING_LAND_DATA_FLAG_AETHERYTE; - } - - player.setLandFlags( Common::LandFlagsSlot::Private, state, pLand->getLandIdent() ); - } - housingMgr.sendLandFlags( player ); - server().queueForPlayer( player.getCharacterId(), makeInitZone( player, teri ) ); - - teri.onPlayerZoneIn( player ); + Network::Util::Player::sendInitZone( player ); if( player.isLogin() ) { - server().queueForPlayer( player.getCharacterId(), - { - makeZonePacket< FFXIVIpcDailyQuests >( player.getId() ), - makeZonePacket< FFXIVIpcQuestRepeatFlags >( player.getId() ) - } ); + Network::Util::Player::sendDailyQuests( player ); + Network::Util::Player::sendQuestRepeatFlags( player ); auto &questMgr = Common::Service< World::Manager::QuestMgr >::ref(); questMgr.sendQuestsInfo( player ); Network::Util::Player::sendGrandCompany( player ); } + teri.onPlayerZoneIn( player ); + } void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount ) diff --git a/src/world/Manager/PlayerMgr.h b/src/world/Manager/PlayerMgr.h index fd856cf0..3abb7cfb 100644 --- a/src/world/Manager/PlayerMgr.h +++ b/src/world/Manager/PlayerMgr.h @@ -23,16 +23,6 @@ namespace Sapphire::World::Manager bool loadPlayers(); Entity::PlayerPtr syncPlayer( uint64_t characterId ); - void onUnlockAchievement( Sapphire::Entity::Player& player, uint32_t achievementId ); - - void onRestingTick( Sapphire::Entity::Player& player ); - - void onLevelUp( Sapphire::Entity::Player& player ); - - void onGainExp( Sapphire::Entity::Player& player, uint32_t exp ); - - void onUnlockOrchestrion( Sapphire::Entity::Player& player, uint8_t songId, uint32_t itemId ); - void onMobKill( Sapphire::Entity::Player& player, Sapphire::Entity::BNpc& bnpc ); void sendLoginMessage( Sapphire::Entity::Player& player ); @@ -43,8 +33,6 @@ namespace Sapphire::World::Manager void onMoveZone( Sapphire::Entity::Player& player ); void onUpdate( Sapphire::Entity::Player& player, uint64_t tickCount ); - void onAchievementListChanged( Sapphire::Entity::Player& player ); - void onAchievementProgressChanged( Sapphire::Entity::Player& player, uint32_t achievementId ); //////////// Helpers diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index fe301a2e..ace19b6d 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -131,8 +131,6 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR { targetPlayer->setLevel( static_cast< uint8_t >( param1 ) ); PlayerMgr::sendServerNotice( player, "Level for {0} was set to {1}", targetPlayer->getName(), param1 ); - auto playerMgr = Common::Service< World::Manager::PlayerMgr >::ref(); - playerMgr.onLevelUp(player); break; } case GmCommand::Race: @@ -330,13 +328,13 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR if( param2 == 0 ) { for( uint8_t i = 0; i < 255; i++ ) - Service< World::Manager::PlayerMgr >::ref().onUnlockOrchestrion( *targetPlayer, i, 0 ); + targetPlayer->learnSong( i, 0 ); PlayerMgr::sendServerNotice( player, "All Songs for {0} were turned on.", targetPlayer->getName() ); } else { - Service< World::Manager::PlayerMgr >::ref().onUnlockOrchestrion( *targetPlayer, static_cast< uint8_t >( param2 ), 0 ); + targetPlayer->learnSong( static_cast< uint8_t >( param2 ), 0 ); PlayerMgr::sendServerNotice( player, "Song {0} for {1} was turned on.", param2, targetPlayer->getName() ); } } diff --git a/src/world/Network/Handlers/PacketCommandHandler.cpp b/src/world/Network/Handlers/PacketCommandHandler.cpp index 54ce1bc3..54acc210 100644 --- a/src/world/Network/Handlers/PacketCommandHandler.cpp +++ b/src/world/Network/Handlers/PacketCommandHandler.cpp @@ -9,6 +9,7 @@ #include "Manager/HousingMgr.h" #include "Manager/WarpMgr.h" +#include "Manager/AchievementMgr.h" #include "Network/GameConnection.h" @@ -600,12 +601,15 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_ } case PacketCommand::ACHIEVEMENT_REQUEST_RATE: { - playerMgr().onAchievementProgressChanged( player, data.Arg0 ); + auto achievementId = data.Arg0; + auto& achvMgr = Common::Service< AchievementMgr >::ref(); + auto achvProgress = achvMgr.getAchievementDataById( player, achievementId ); + Network::Util::Player::sendActorControl( player, AchievementSetRate, achievementId, achvProgress.first, achvProgress.second ); break; } case PacketCommand::ACHIEVEMENT_REQUEST: { - playerMgr().onAchievementListChanged( player ); + Network::Util::Player::sendAchievementList( player ); break; } case PacketCommand::TELEPO_INQUIRY: // Teleport diff --git a/src/world/Network/Util/PlayerUtil.cpp b/src/world/Network/Util/PlayerUtil.cpp index 8565e2e5..f9f3d611 100644 --- a/src/world/Network/Util/PlayerUtil.cpp +++ b/src/world/Network/Util/PlayerUtil.cpp @@ -15,6 +15,9 @@ #include #include #include +#include +#include +#include using namespace Sapphire; using namespace Sapphire::World::Manager; @@ -257,4 +260,71 @@ void Util::Player::sendRecastGroups( Entity::Player& player ) memcpy( &recastGroupPaket->data().Recast, recastGroups.data(), recastGroups.size() * sizeof( float ) ); memcpy( &recastGroupPaket->data().RecastMax, recastGroupsMax.data(), recastGroupsMax.size() * sizeof( float ) ); server().queueForPlayer( player.getCharacterId(), recastGroupPaket ); +} + +void Util::Player::sendAchievementList( Entity::Player& player ) +{ + auto achvData = player.getAchievementData(); + auto achvPacket = makeZonePacket< FFXIVIpcAchievement >( player.getId() ); + std::memcpy( &achvPacket->data().complete[ 0 ], &achvData.unlockList[ 0 ], sizeof( achvPacket->data().complete ) ); + std::memcpy( &achvPacket->data().history[ 0 ], &achvData.history[ 0 ], sizeof( achvPacket->data().history ) ); + server().queueForPlayer( player.getCharacterId(), achvPacket ); +} + +void Util::Player::sendRestingUpdate( Entity::Player& player ) +{ + server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< RestingPacket >( player ) ); +} + +void Util::Player::sendLogin( Entity::Player& player ) +{ + auto initPacket = makeZonePacket< FFXIVIpcLogin >( player.getId() ); + initPacket->data().playerActorId = player.getId(); + server().queueForPlayer( player.getCharacterId(), initPacket ); +} + +void Util::Player::sendPlayerSetup( Entity::Player& player ) +{ + server().queueForPlayer( player.getCharacterId(), makePlayerSetup( player ) ); +} + +void Util::Player::sendChangeClass( Entity::Player& player ) +{ + auto classInfo = makeZonePacket< FFXIVIpcChangeClass >( player.getId() ); + classInfo->data().ClassJob = static_cast< uint8_t >( player.getClass() ); + classInfo->data().Lv = player.getLevel(); + classInfo->data().Lv1 = player.getLevel(); + classInfo->data().Login = player.isLogin() ? 1 : 0; + server().queueForPlayer( player.getCharacterId(), classInfo ); +} + +void Util::Player::sendContentAttainFlags( Entity::Player& player ) +{ + // todo - fill with actual data from player + auto contentFinderList = makeZonePacket< FFXIVIpcContentAttainFlags >( player.getId() ); + std::memset( &contentFinderList->data(), 0xFF, sizeof( contentFinderList->data() ) ); + server().queueForPlayer( player.getCharacterId(), contentFinderList ); +} + +void Util::Player::sendInitZone( Entity::Player& player ) +{ + auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); + auto pZone = teriMgr.getTerritoryByGuId( player.getTerritoryId() ); + if( !pZone ) + { + Logger::error( "Territory GuID#{} not found!", player.getTerritoryId() ); + return; + } + auto& teri = *pZone; + server().queueForPlayer( player.getCharacterId(), makeInitZone( player, teri ) ); +} + +void Util::Player::sendDailyQuests( Entity::Player& player ) +{ + server().queueForPlayer( player.getCharacterId(), makeZonePacket< FFXIVIpcDailyQuests >( player.getId() ) ); +} + +void Util::Player::sendQuestRepeatFlags( Entity::Player& player ) +{ + server().queueForPlayer( player.getCharacterId(), makeZonePacket< FFXIVIpcQuestRepeatFlags >( player.getId() ) ); } \ No newline at end of file diff --git a/src/world/Network/Util/PlayerUtil.h b/src/world/Network/Util/PlayerUtil.h index cc051c1f..fab84d70 100644 --- a/src/world/Network/Util/PlayerUtil.h +++ b/src/world/Network/Util/PlayerUtil.h @@ -31,6 +31,23 @@ namespace Sapphire::Network::Util::Player void sendRecastGroups( Entity::Player& player ); + void sendAchievementList( Entity::Player& player ); + + void sendRestingUpdate( Entity::Player& player ); + + void sendLogin( Entity::Player& player ); + + void sendPlayerSetup( Entity::Player& player ); + + void sendChangeClass( Entity::Player& player ); + + void sendContentAttainFlags( Entity::Player& player ); + + void sendInitZone( Entity::Player& player ); + + void sendDailyQuests( Entity::Player& player ); + void sendQuestRepeatFlags( Entity::Player& player ); + void sendActorControlSelf( Entity::Player& player, uint16_t category, uint32_t param1 = 0, uint32_t param2 = 0, uint32_t param3 = 0, uint32_t param4 = 0, uint32_t param5 = 0 );