diff --git a/src/common/Common.h b/src/common/Common.h index f3e8f1d6..7309ef11 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -1379,7 +1379,7 @@ namespace Sapphire::Common REJECT_INVITE = 0x05, }; - enum PlayerStateFlag : uint8_t + enum PlayerCondition : uint8_t { HideUILockChar = 1, // as the name suggests, hides the ui and logs the char... InCombat = 2, // in Combat, locks gearchange/return/teleport @@ -1839,7 +1839,7 @@ namespace Sapphire::Common Gatherer }; - using PlayerStateFlagList = std::vector< PlayerStateFlag >; + using PlayerStateFlagList = std::vector< PlayerCondition >; struct BNPCInstanceObject { diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 02bd3da3..2fea66f4 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -992,7 +992,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server * Structural representation of the packet sent by the server * to set a players state */ - struct FFXIVIpcPlayerStateFlags : FFXIVIpcBasePacket< Condition > + struct FFXIVIpcCondition : FFXIVIpcBasePacket< Condition > { uint8_t flags[12]; uint32_t padding; diff --git a/src/scripts/quest/ManFst303.cpp b/src/scripts/quest/ManFst303.cpp index dd6b8138..8cd58274 100644 --- a/src/scripts/quest/ManFst303.cpp +++ b/src/scripts/quest/ManFst303.cpp @@ -101,8 +101,8 @@ private: void Scene00001Return( World::Quest& quest, Entity::Player& player, const Event::SceneResult& result ) { - playerMgr().onSetGc( player, OrderOfTwinAdder ); - playerMgr().onSetGcRank( player, OrderOfTwinAdder, 1 ); + playerMgr().setGrandCompany( player, OrderOfTwinAdder ); + playerMgr().setGrandCompanyRank( player, OrderOfTwinAdder, 1 ); Scene00002( quest, player ); } diff --git a/src/world/Action/Action.cpp b/src/world/Action/Action.cpp index a8cc74b3..ca4e933f 100644 --- a/src/world/Action/Action.cpp +++ b/src/world/Action/Action.cpp @@ -321,8 +321,8 @@ void Action::Action::start() if( player ) { - player->setStateFlag( PlayerStateFlag::Casting ); - Service< World::Manager::PlayerMgr >::ref().onSendStateFlags( *player, true ); + player->setCondition( PlayerCondition::Casting ); + Service< World::Manager::PlayerMgr >::ref().onConditionChanged( *player, true ); } } @@ -376,7 +376,7 @@ void Action::Action::interrupt() // reset state flag //player->unsetStateFlag( PlayerStateFlag::Occupied1 ); pPlayer->setLastActionTick( 0 ); - Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *pPlayer, PlayerStateFlag::Casting ); + Service< World::Manager::PlayerMgr >::ref().removeCondition( *pPlayer, PlayerCondition::Casting ); } if( hasCastTime() ) @@ -423,7 +423,7 @@ void Action::Action::execute() if( auto pPlayer = m_pSource->getAsPlayer(); pPlayer ) { pPlayer->setLastActionTick( 0 ); - Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *pPlayer, PlayerStateFlag::Casting ); + Service< World::Manager::PlayerMgr >::ref().removeCondition( *pPlayer, PlayerCondition::Casting ); } } diff --git a/src/world/Action/EventAction.cpp b/src/world/Action/EventAction.cpp index 1d0730eb..847b3798 100644 --- a/src/world/Action/EventAction.cpp +++ b/src/world/Action/EventAction.cpp @@ -61,8 +61,8 @@ void Action::EventAction::start() server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), control ); - if( pPlayer->hasStateFlag( PlayerStateFlag::InNpcEvent ) ) - Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *pPlayer, PlayerStateFlag::InNpcEvent ); + if( pPlayer->hasStateFlag( PlayerCondition::InNpcEvent ) ) + Service< World::Manager::PlayerMgr >::ref().removeCondition( *pPlayer, PlayerCondition::InNpcEvent ); } else server().queueForPlayers( m_pSource->getInRangePlayerIds(), control ); diff --git a/src/world/Action/MountAction.cpp b/src/world/Action/MountAction.cpp index 253c1839..ef8de7da 100644 --- a/src/world/Action/MountAction.cpp +++ b/src/world/Action/MountAction.cpp @@ -59,7 +59,7 @@ void MountAction::start() data.Dir = m_pSource->getRot(); server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), castPacket ); - Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( *player, Common::PlayerStateFlag::Casting ); + Common::Service< World::Manager::PlayerMgr >::ref().setCondition( *player, Common::PlayerCondition::Casting ); auto actionStartPkt = makeActorControlSelf( m_pSource->getId(), ActorControlType::ActionStart, 1, getId(), m_recastTimeMs / 10 ); server().queueForPlayer( m_pSource->getAsPlayer()->getCharacterId(), actionStartPkt ); @@ -69,7 +69,7 @@ void MountAction::execute() { assert( m_pSource ); - Common::Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( *m_pSource->getAsPlayer(), Common::PlayerStateFlag::Casting ); + Common::Service< World::Manager::PlayerMgr >::ref().removeCondition( *m_pSource->getAsPlayer(), Common::PlayerCondition::Casting ); m_effectBuilder->mount( m_pSource, m_mountId ); m_effectBuilder->buildAndSendPackets( { m_pSource } ); } \ No newline at end of file diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 0f7617d3..68b6c763 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -93,7 +93,7 @@ Player::Player() : memset( m_name, 0, sizeof( m_name ) ); memset( m_searchMessage, 0, sizeof( m_searchMessage ) ); std::fill( std::begin( m_questTracking ), std::end( m_questTracking ), 0 ); - std::fill( std::begin( m_stateFlags ), std::end( m_stateFlags ), 0 ); + std::fill( std::begin( m_condition ), std::end( m_condition ), 0 ); std::fill( std::begin( m_classArray ), std::end( m_classArray ), 0 ); std::fill( std::begin( m_expArray ), std::end( m_expArray ), 0 ); @@ -397,7 +397,7 @@ bool Player::isAutoattackOn() const void Player::sendStats() { - Service< World::Manager::PlayerMgr >::ref().onSendStats( *this ); + Service< World::Manager::PlayerMgr >::ref().onStatsChanged( *this ); } bool Player::exitInstance() @@ -730,7 +730,7 @@ void Player::setClassJob( Common::ClassJob classJob ) m_tp = 0; Service< World::Manager::PlayerMgr >::ref().onPlayerStatusUpdate( *this ); - Service< World::Manager::PlayerMgr >::ref().onChangeClass( *this ); + Service< World::Manager::PlayerMgr >::ref().onClassChanged( *this ); Service< World::Manager::MapMgr >::ref().updateQuests( *this ); } @@ -756,7 +756,7 @@ void Player::setLevelForClass( uint8_t level, Common::ClassJob classjob ) void Player::sendModel() { - Service< World::Manager::PlayerMgr >::ref().onChangeGear( *this ); + Service< World::Manager::PlayerMgr >::ref().onGearChanged( *this ); } uint32_t Player::getModelForSlot( Common::GearModelSlot slot ) @@ -863,10 +863,10 @@ void Player::setGcRankAt( uint8_t index, uint8_t rank ) const Player::StateFlags& Player::getStateFlags() const { - return m_stateFlags; + return m_condition; } -bool Player::hasStateFlag( Common::PlayerStateFlag flag ) const +bool Player::hasStateFlag( Common::PlayerCondition flag ) const { auto iFlag = static_cast< int32_t >( flag ); @@ -874,10 +874,10 @@ bool Player::hasStateFlag( Common::PlayerStateFlag flag ) const uint8_t value; Util::valueToFlagByteIndexValue( iFlag, value, index ); - return ( m_stateFlags[ index ] & value ) != 0; + return ( m_condition[ index ] & value ) != 0; } -void Player::setStateFlag( Common::PlayerStateFlag flag ) +void Player::setCondition( Common::PlayerCondition flag ) { auto iFlag = static_cast< int32_t >( flag ); @@ -885,10 +885,10 @@ void Player::setStateFlag( Common::PlayerStateFlag flag ) uint8_t value; Util::valueToFlagByteIndexValue( iFlag, value, index ); - m_stateFlags[ index ] |= value; + m_condition[ index ] |= value; } -void Player::unsetStateFlag( Common::PlayerStateFlag flag ) +void Player::removeCondition( Common::PlayerCondition flag ) { if( !hasStateFlag( flag ) ) return; @@ -899,7 +899,7 @@ void Player::unsetStateFlag( Common::PlayerStateFlag flag ) uint8_t value; Util::valueToFlagByteIndexValue( iFlag, value, index ); - m_stateFlags[ index ] ^= value; + m_condition[ index ] ^= value; } void Player::update( uint64_t tickCount ) @@ -1408,7 +1408,6 @@ void Player::teleportQuery( uint16_t aetheryteId ) cost = std::min< uint16_t >( 999, cost ); bool insufficientGil = getCurrency( Common::CurrencyType::Gil ) < cost; - // TODO: figure out what param1 really does server().queueForPlayer( getCharacterId(), makeActorControlSelf( getId(), OnExecuteTelepo, insufficientGil ? 2 : 0, aetheryteId ) ); if( !insufficientGil ) @@ -1466,7 +1465,7 @@ void Player::dyeItemFromDyeingInfo() uint32_t dyeBagContainer = m_dyeingInfo.dyeBagContainer; uint32_t dyeBagSlot = m_dyeingInfo.dyeBagSlot; - Service< World::Manager::PlayerMgr >::ref().onSendStateFlags( *this, true ); // Retail sends all 0s to unlock player after a dye? Possibly not setting a flag when the action is started in the backend..? + Service< World::Manager::PlayerMgr >::ref().onConditionChanged( *this, true ); // Retail sends all 0s to unlock player after a dye? Possibly not setting a flag when the action is started in the backend..? auto itemToDye = getItemAt( itemToDyeContainer, itemToDyeSlot ); auto dyeToUse = getItemAt( dyeBagContainer, dyeBagSlot ); @@ -1508,7 +1507,7 @@ void Player::glamourItemFromGlamouringInfo() uint32_t glamourBagSlot = m_glamouringInfo.glamourBagSlot; bool shouldGlamour = m_glamouringInfo.shouldGlamour; - playerMgr.onSendStateFlags( *this, true ); + playerMgr.onConditionChanged( *this, true ); auto itemToGlamour = getItemAt( itemToGlamourContainer, itemToGlamourSlot ); auto glamourToUse = getItemAt( glamourBagContainer, glamourBagSlot ); @@ -1905,17 +1904,6 @@ float Player::getPrevRot() const return m_prevRot; } -std::optional< Sapphire::World::Quest > Player::getQuest( uint32_t questId ) -{ - if( !hasQuest( questId ) ) - return std::nullopt; - - auto idx = getQuestIndex( questId ); - - auto quest = getQuestByIndex( idx ); - return { quest }; -} - bool Player::isConnected() const { return m_bIsConnected; diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index bfeae63a..e3ae41da 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -529,16 +529,16 @@ namespace Sapphire::Entity const StateFlags& getStateFlags() const; /* set a specified state flag */ - void setStateFlag( Common::PlayerStateFlag flag ); + void setCondition( Common::PlayerCondition flag ); /* set a specified state flag */ - void setStateFlags( std::vector< Common::PlayerStateFlag > flags ); + void setStateFlags( std::vector< Common::PlayerCondition > flags ); /* check if a specified flag is set */ - bool hasStateFlag( Common::PlayerStateFlag flag ) const; + bool hasStateFlag( Common::PlayerCondition flag ) const; /* reset a specified flag */ - void unsetStateFlag( Common::PlayerStateFlag flag ); + void removeCondition( Common::PlayerCondition flag ); /*! return the userlevel */ uint8_t getUserLevel() const; @@ -901,7 +901,7 @@ namespace Sapphire::Entity OrchestrionList m_orchestrion{}; ClassList m_classArray{}; ExpList m_expArray{}; - StateFlags m_stateFlags{}; + StateFlags m_condition{}; Common::ClassJob m_firstClass{}; diff --git a/src/world/Actor/PlayerQuest.cpp b/src/world/Actor/PlayerQuest.cpp index ea04173e..e59d5981 100644 --- a/src/world/Actor/PlayerQuest.cpp +++ b/src/world/Actor/PlayerQuest.cpp @@ -117,6 +117,17 @@ bool Sapphire::Entity::Player::addQuest( const World::Quest& quest ) return true; } +std::optional< Sapphire::World::Quest > Sapphire::Entity::Player::getQuest( uint32_t questId ) +{ + if( !hasQuest( questId ) ) + return std::nullopt; + + auto idx = getQuestIndex( questId ); + + auto quest = getQuestByIndex( idx ); + return { quest }; +} + int8_t Sapphire::Entity::Player::getFreeQuestSlot() { int8_t result = -1; diff --git a/src/world/Manager/EventMgr.cpp b/src/world/Manager/EventMgr.cpp index 229c79e7..f2a474d9 100644 --- a/src/world/Manager/EventMgr.cpp +++ b/src/world/Manager/EventMgr.cpp @@ -550,13 +550,13 @@ void EventMgr::eventFinish( Sapphire::Entity::Player& player, uint32_t eventId, } } - if( player.hasStateFlag( Common::PlayerStateFlag::WatchingCutscene ) ) - Common::Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( player, Common::PlayerStateFlag::WatchingCutscene ); + if( player.hasStateFlag( Common::PlayerCondition::WatchingCutscene ) ) + Common::Service< World::Manager::PlayerMgr >::ref().removeCondition( player, Common::PlayerCondition::WatchingCutscene ); player.removeEvent( pEvent->getId() ); if( freePlayer == 1 ) - Common::Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( player, Common::PlayerStateFlag::InNpcEvent ); + Common::Service< World::Manager::PlayerMgr >::ref().removeCondition( player, Common::PlayerCondition::InNpcEvent ); } void EventMgr::eventStart( Entity::Player& player, uint64_t actorId, uint32_t eventId, Event::EventHandler::EventType eventType, uint8_t eventParam1, @@ -567,7 +567,7 @@ void EventMgr::eventStart( Entity::Player& player, uint64_t actorId, uint32_t ev newEvent->setEventFinishCallback( std::move( callback ) ); player.addEvent( newEvent ); - Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( player, Common::PlayerStateFlag::InNpcEvent ); + Common::Service< World::Manager::PlayerMgr >::ref().setCondition( player, Common::PlayerCondition::InNpcEvent ); server.queueForPlayer( player.getCharacterId(), std::make_shared< EventStartPacket >( player.getId(), actorId, eventId, eventType, eventParam1, eventParam2 ) ); @@ -838,7 +838,7 @@ Sapphire::Event::EventHandlerPtr EventMgr::bootstrapSceneEvent( Entity::Player& } if( flags & CONDITION_CUTSCENE ) - Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( player, Common::PlayerStateFlag::WatchingCutscene ); + Common::Service< World::Manager::PlayerMgr >::ref().setCondition( player, Common::PlayerCondition::WatchingCutscene ); return pEvent; } diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index 22c76823..61e1a010 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include @@ -74,17 +74,17 @@ void PlayerMgr::onEquipDisplayFlagsChanged( Entity::Player& player ) server().queueForPlayers( player.getInRangePlayerIds( true ), paramPacket ); } -void PlayerMgr::onSendStateFlags( Entity::Player& player, bool updateInRange ) +void PlayerMgr::onConditionChanged( Entity::Player& player, bool updateInRange ) { - server().queueForPlayer( player.getCharacterId(), std::make_shared< PlayerStateFlagsPacket >( player ) ); + server().queueForPlayer( player.getCharacterId(), std::make_shared< ConditionPacket >( player ) ); if( updateInRange ) server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ) ); } -void PlayerMgr::onSendAchievementList( Entity::Player& player ) +void PlayerMgr::onAchievementListChanged( Entity::Player& player ) { auto achvData = player.getAchievementData(); @@ -95,7 +95,7 @@ void PlayerMgr::onSendAchievementList( Entity::Player& player ) server().queueForPlayer( player.getCharacterId(), achvPacket ); } -void PlayerMgr::onSendAchievementProgress( Entity::Player& player, uint32_t achievementId ) +void PlayerMgr::onAchievementProgressChanged( Entity::Player& player, uint32_t achievementId ) { auto& achvMgr = Common::Service< Manager::AchievementMgr >::ref(); @@ -108,15 +108,15 @@ void PlayerMgr::onSendAchievementProgress( Entity::Player& player, uint32_t achi void PlayerMgr::onUnlockAchievement( Entity::Player& player, uint32_t achievementId ) { - onSendAchievementList( player ); + onAchievementListChanged( player ); server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementComplete, achievementId ) ); server().queueForPlayer( player.getCharacterId(), makeActorControl( player.getId(), AchievementObtainMsg, achievementId ) ); } -void PlayerMgr::onSendStats( Entity::Player& player ) +void PlayerMgr::onStatsChanged( Entity::Player& player ) { - std::array< uint32_t, 50 > statParams; + std::array< uint32_t, 50 > statParams{}; std::fill( std::begin( statParams ), std::end( statParams ), 0 ); auto& exd = Common::Service< Data::ExdData >::ref(); @@ -192,7 +192,7 @@ void PlayerMgr::onSetLevelForClass( Entity::Player& player, Common::ClassJob cla auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref(); server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::ClassJobUpdate, - static_cast< uint8_t >( classJob ), player.getLevelForClass( classJob ) ) ); + static_cast< uint8_t >( classJob ), player.getLevelForClass( classJob ) ) ); achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( classJob ) ); } @@ -202,9 +202,11 @@ 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(), GainExpMsg, + static_cast< uint8_t >( player.getClass() ), exp ) ); - server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), UpdateUiExp, static_cast< uint8_t >( player.getClass() ), player.getExp() ) ); + 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 ) @@ -214,12 +216,12 @@ void PlayerMgr::onUnlockOrchestrion( Entity::Player& player, uint8_t songId, uin server().queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) ); } -void PlayerMgr::onChangeGear( Entity::Player& player ) +void PlayerMgr::onGearChanged( Entity::Player& player ) { server().queueForPlayers( player.getInRangePlayerIds( true ), std::make_shared< ModelEquipPacket >( player ) ); } -void PlayerMgr::onGcUpdate( Entity::Player& player ) +void PlayerMgr::onGrandCompanyChanged( Entity::Player& player ) { auto gcAffPacket = makeZonePacket< FFXIVIpcGrandCompany >( player.getId() ); gcAffPacket->data().ActiveCompanyId = player.getGc(); @@ -230,18 +232,18 @@ void PlayerMgr::onGcUpdate( Entity::Player& player ) server().queueForPlayer( player.getCharacterId(), gcAffPacket ); } -void PlayerMgr::onSetGc( Entity::Player& player, uint8_t gc ) +void PlayerMgr::setGrandCompany( Entity::Player& player, uint8_t gc ) { player.setGc( gc ); - onGcUpdate( player ); + onGrandCompanyChanged( player ); } -void PlayerMgr::onSetGcRank( Entity::Player& player, uint8_t gc, uint8_t rank ) +void PlayerMgr::setGrandCompanyRank( Entity::Player& player, uint8_t gc, uint8_t rank ) { player.setGcRankAt( gc, rank ); - onGcUpdate( player ); + onGrandCompanyChanged( player ); } void PlayerMgr::onCompanionUpdate( Entity::Player& player, uint8_t companionId ) @@ -329,7 +331,7 @@ void PlayerMgr::onHateListChanged( Entity::Player& player ) server().queueForPlayer( player.getCharacterId(), { hateListPacket, hateRankPacket } ); } -void PlayerMgr::onChangeClass( Entity::Player& player ) +void PlayerMgr::onClassChanged( Entity::Player& player ) { server().queueForPlayers( player.getInRangePlayerIds( true ), makeActorControl( player.getId(), ClassJobChange, 0x04 ) ); onPlayerHpMpTpChanged( player ); @@ -364,7 +366,7 @@ void PlayerMgr::onDeath( Entity::Player& player ) scriptMgr.onPlayerDeath( player ); } -void PlayerMgr::onZone( Sapphire::Entity::Player& player ) +void PlayerMgr::onMoveZone( Sapphire::Entity::Player& player ) { auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); auto& housingMgr = Common::Service< HousingMgr >::ref(); @@ -452,7 +454,7 @@ void PlayerMgr::onZone( Sapphire::Entity::Player& player ) auto &questMgr = Common::Service< World::Manager::QuestMgr >::ref(); questMgr.sendQuestsInfo( player ); - onGcUpdate( player ); + onGrandCompanyChanged( player ); } if( player.getPartyId() != 0 ) @@ -506,24 +508,24 @@ void PlayerMgr::onUpdate( Entity::Player& player, uint64_t tickCount ) } } -void PlayerMgr::onSetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag ) +void PlayerMgr::setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag ) { auto prevOnlineStatus = player.getOnlineStatus(); - player.setStateFlag( flag ); + player.setCondition( flag ); auto newOnlineStatus = player.getOnlineStatus(); - onSendStateFlags( player, prevOnlineStatus != newOnlineStatus ); + onConditionChanged( player, prevOnlineStatus != newOnlineStatus ); } -void PlayerMgr::onUnsetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag ) +void PlayerMgr::removeCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag ) { auto prevOnlineStatus = player.getOnlineStatus(); - player.unsetStateFlag( flag ); + player.removeCondition( flag ); auto newOnlineStatus = player.getOnlineStatus(); - onSendStateFlags( player, prevOnlineStatus != newOnlineStatus ); + onConditionChanged( player, prevOnlineStatus != newOnlineStatus ); } ////////// Helper /////////// diff --git a/src/world/Manager/PlayerMgr.h b/src/world/Manager/PlayerMgr.h index 91fff8e6..54f4286c 100644 --- a/src/world/Manager/PlayerMgr.h +++ b/src/world/Manager/PlayerMgr.h @@ -6,7 +6,7 @@ namespace Sapphire::World::Manager { -class PlayerMgr + class PlayerMgr { public: PlayerMgr() = default; @@ -15,18 +15,8 @@ class PlayerMgr void onEquipDisplayFlagsChanged( Sapphire::Entity::Player& player ); - void onSendStateFlags( Sapphire::Entity::Player& player, bool updateInRange ); - - void onSendStats( Sapphire::Entity::Player& player ); - void onPlayerStatusUpdate( Sapphire::Entity::Player& player ); - void onChangeClass( Sapphire::Entity::Player& player ); - - void onSendAchievementList( Sapphire::Entity::Player& player ); - - void onSendAchievementProgress( Sapphire::Entity::Player& player, uint32_t achievementId ); - void onUnlockAchievement( Sapphire::Entity::Player& player, uint32_t achievementId ); void onPlayerHpMpTpChanged( Sapphire::Entity::Player& player ); @@ -41,14 +31,6 @@ class PlayerMgr void onUnlockOrchestrion( Sapphire::Entity::Player& player, uint8_t songId, uint32_t itemId ); - void onChangeGear( Sapphire::Entity::Player& player ); - - void onGcUpdate( Sapphire::Entity::Player& player ); - - void onSetGc( Sapphire::Entity::Player& player, uint8_t gc ); - - void onSetGcRank( Sapphire::Entity::Player& player, uint8_t gc, uint8_t rank ); - void onCompanionUpdate( Entity::Player& player, uint8_t companionId ); void onMountUpdate( Sapphire::Entity::Player& player, uint32_t mountId ); @@ -59,18 +41,25 @@ class PlayerMgr void onLogin( Sapphire::Entity::Player& player ); void onLogout( Sapphire::Entity::Player& player ); - void onDeath( Sapphire::Entity::Player& player ); - - void onZone( Sapphire::Entity::Player& player ); + void onMoveZone( Sapphire::Entity::Player& player ); void onUpdate( Sapphire::Entity::Player& player, uint64_t tickCount ); - void onSetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag ); + void onConditionChanged( Sapphire::Entity::Player& player, bool updateInRange ); + void onStatsChanged( Sapphire::Entity::Player& player ); + void onAchievementListChanged( Sapphire::Entity::Player& player ); + void onAchievementProgressChanged( Sapphire::Entity::Player& player, uint32_t achievementId ); + void onGearChanged( Sapphire::Entity::Player& player ); + void onGrandCompanyChanged( Sapphire::Entity::Player& player ); + void onClassChanged( Sapphire::Entity::Player& player ); - void onUnsetStateFlag( Sapphire::Entity::Player& player, Common::PlayerStateFlag flag ); + void setCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag ); + void removeCondition( Sapphire::Entity::Player& player, Common::PlayerCondition flag ); + void setGrandCompany( Sapphire::Entity::Player& player, uint8_t gc ); + void setGrandCompanyRank( Sapphire::Entity::Player& player, uint8_t gc, uint8_t rank ); - //////////// Helpers + //////////// Helpers static void sendServerNotice( Sapphire::Entity::Player& player, const std::string& message ); template< typename... Args > diff --git a/src/world/Manager/TerritoryMgr.cpp b/src/world/Manager/TerritoryMgr.cpp index 29538b15..30f7aad0 100644 --- a/src/world/Manager/TerritoryMgr.cpp +++ b/src/world/Manager/TerritoryMgr.cpp @@ -592,7 +592,7 @@ bool TerritoryMgr::movePlayer( Sapphire::Territory& teri, Entity::Player& player auto pPrevZone = getTerritoryByGuId( player.getTerritoryId() ); - player.setStateFlag( Common::PlayerStateFlag::BetweenAreas ); + player.setCondition( Common::PlayerCondition::BetweenAreas ); player.initSpawnIdQueue(); @@ -613,7 +613,7 @@ bool TerritoryMgr::movePlayer( Sapphire::Territory& teri, Entity::Player& player m_playerIdToInstanceMap[ player.getId() ] = teri.getGuId(); teri.onBeforePlayerZoneIn( player ); - playerMgr.onZone( player ); + playerMgr.onMoveZone( player ); return true; } diff --git a/src/world/Manager/WarpMgr.cpp b/src/world/Manager/WarpMgr.cpp index 0cf71428..fbe9b168 100644 --- a/src/world/Manager/WarpMgr.cpp +++ b/src/world/Manager/WarpMgr.cpp @@ -136,7 +136,7 @@ void WarpMgr::finishWarp( Entity::Player& player ) server().queueForPlayer( player.getCharacterId(), zoneInPacket ); server().queueForPlayers( player.getInRangePlayerIds( true ), setStatusPacket ); - playerMgr.onUnsetStateFlag( player, PlayerStateFlag::BetweenAreas ); + playerMgr.removeCondition( player, PlayerCondition::BetweenAreas ); Common::Service< MapMgr >::ref().updateAll( player ); } diff --git a/src/world/Network/Handlers/CFHandlers.cpp b/src/world/Network/Handlers/CFHandlers.cpp index 2872092d..6aef66e0 100644 --- a/src/world/Network/Handlers/CFHandlers.cpp +++ b/src/world/Network/Handlers/CFHandlers.cpp @@ -12,7 +12,7 @@ #include "Network/GameConnection.h" #include "Network/PacketWrappers/ServerNoticePacket.h" -#include "Network/PacketWrappers/PlayerStateFlagsPacket.h" +#include "Network/PacketWrappers/ConditionPacket.h" #include "ContentFinder/ContentFinder.h" diff --git a/src/world/Network/Handlers/EventHandlers.cpp b/src/world/Network/Handlers/EventHandlers.cpp index 9fa01012..e04e0d4a 100644 --- a/src/world/Network/Handlers/EventHandlers.cpp +++ b/src/world/Network/Handlers/EventHandlers.cpp @@ -6,7 +6,7 @@ #include #include "Network/GameConnection.h" -#include "Network/PacketWrappers/PlayerStateFlagsPacket.h" +#include "Network/PacketWrappers/ConditionPacket.h" #include "Script/ScriptMgr.h" diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index e08c8c6e..33afb4cb 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -422,7 +422,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR return; } - Service< World::Manager::PlayerMgr >::ref().onSetGc( player, static_cast< uint8_t >( param1 ) ); + Service< World::Manager::PlayerMgr >::ref().setGrandCompany( player, static_cast< uint8_t >( param1 ) ); // if we're changing them to a GC, check if they have a rank and if not, set it to the lowest rank if( param1 > 0 ) @@ -447,7 +447,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR return; } - Service< World::Manager::PlayerMgr >::ref().onSetGcRank( player, static_cast< uint8_t >( gcId ), static_cast< uint8_t >( param1 ) ); + Service< World::Manager::PlayerMgr >::ref().setGrandCompanyRank( player, static_cast< uint8_t >( gcId ), static_cast< uint8_t >( param1 ) ); PlayerMgr::sendServerNotice( player, "GC Rank for {0} for GC {1} was set to {2}", targetPlayer->getName(), targetPlayer->getGc(), targetPlayer->getGcRankArray()[ targetPlayer->getGc() - 1 ] ); break; diff --git a/src/world/Network/Handlers/PacketCommandHandler.cpp b/src/world/Network/Handlers/PacketCommandHandler.cpp index 9c4f02bb..77a9b8f3 100644 --- a/src/world/Network/Handlers/PacketCommandHandler.cpp +++ b/src/world/Network/Handlers/PacketCommandHandler.cpp @@ -613,12 +613,12 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_ } case PacketCommand::ACHIEVEMENT_REQUEST_RATE: { - Service< World::Manager::PlayerMgr >::ref().onSendAchievementProgress( player, param11 ); + Service< World::Manager::PlayerMgr >::ref().onAchievementProgressChanged( player, param11 ); break; } case PacketCommand::ACHIEVEMENT_REQUEST: { - Service< World::Manager::PlayerMgr >::ref().onSendAchievementList( player ); + Service< World::Manager::PlayerMgr >::ref().onAchievementListChanged( player ); break; } case PacketCommand::TELEPO_INQUIRY: // Teleport diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 2d29ec80..34be2bf3 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -39,7 +39,7 @@ #include "Network/PacketWrappers/ActorControlTargetPacket.h" #include "Network/PacketWrappers/EventStartPacket.h" #include "Network/PacketWrappers/EventFinishPacket.h" -#include "Network/PacketWrappers/PlayerStateFlagsPacket.h" +#include "Network/PacketWrappers/ConditionPacket.h" #include "Network/PacketWrappers/UpdateInventorySlotPacket.h" #include "Manager/DebugCommandMgr.h" @@ -523,7 +523,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC auto pTargetPlayer = pSession->getPlayer(); - if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BetweenAreas ) ) + if( pTargetPlayer->hasStateFlag( PlayerCondition::BetweenAreas ) ) { // send error for player between areas // TODO: implement me @@ -538,7 +538,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC return; } - if( pTargetPlayer->hasStateFlag( PlayerStateFlag::BoundByDuty ) && !player.isActingAsGm() ) + if( pTargetPlayer->hasStateFlag( PlayerCondition::BoundByDuty ) && !player.isActingAsGm() ) { auto boundPacket = makeChatPacket< Packets::Server::FFXIVRecvFinderStatus >( player.getId() ); strcpy( boundPacket->data().toName, data.toName ); diff --git a/src/world/Network/PacketWrappers/PlayerStateFlagsPacket.h b/src/world/Network/PacketWrappers/ConditionPacket.h similarity index 65% rename from src/world/Network/PacketWrappers/PlayerStateFlagsPacket.h rename to src/world/Network/PacketWrappers/ConditionPacket.h index 3be80118..a05654bb 100644 --- a/src/world/Network/PacketWrappers/PlayerStateFlagsPacket.h +++ b/src/world/Network/PacketWrappers/ConditionPacket.h @@ -11,19 +11,19 @@ namespace Sapphire::Network::Packets::WorldPackets::Server /** * @brief Packet sent to set a players state, this impacts which actions he can perform. */ - class PlayerStateFlagsPacket : public ZoneChannelPacket< FFXIVIpcPlayerStateFlags > + class ConditionPacket : public ZoneChannelPacket< FFXIVIpcCondition > { public: - PlayerStateFlagsPacket( Entity::Player& player ) : - ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( player.getId(), player.getId() ) + ConditionPacket( Entity::Player& player ) : + ZoneChannelPacket< FFXIVIpcCondition >( player.getId(), player.getId() ) { initialize( player.getStateFlags().data() ); } - PlayerStateFlagsPacket( Entity::Player& player, std::vector< Common::PlayerStateFlag > flags ) : - ZoneChannelPacket< FFXIVIpcPlayerStateFlags >( player.getId(), player.getId() ) + ConditionPacket( Entity::Player& player, std::vector< Common::PlayerCondition > flags ) : + ZoneChannelPacket< FFXIVIpcCondition >( player.getId(), player.getId() ) { - uint8_t newFlags[12]; + uint8_t newFlags[ 12 ]; memset( newFlags, 0, 12 ); for( auto& flag : flags ) diff --git a/src/world/Task/MoveTerritoryTask.cpp b/src/world/Task/MoveTerritoryTask.cpp index c2be8e7e..878a22ad 100644 --- a/src/world/Task/MoveTerritoryTask.cpp +++ b/src/world/Task/MoveTerritoryTask.cpp @@ -47,7 +47,7 @@ void MoveTerritoryTask::execute() server.queueForPlayer( pPlayer->getCharacterId(), warpStart ); server.queueForPlayers( inRangePlayerIds, makeActorControl( pPlayer->getId(), ActorDespawnEffect, m_warpInfo.m_warpType, m_warpInfo.m_targetTerritoryId ) ); - Common::Service< PlayerMgr >::ref().onSetStateFlag( *pPlayer, Common::PlayerStateFlag::BetweenAreas ); + Common::Service< PlayerMgr >::ref().setCondition( *pPlayer, Common::PlayerCondition::BetweenAreas ); auto moveTerritoryPacket = makeZonePacket< WorldPackets::Server::FFXIVIpcMoveTerritory >( pPlayer->getId() ); moveTerritoryPacket->data().index = -1; diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index 04f77f7d..661b9a68 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -99,7 +99,7 @@ void Sapphire::InstanceContent::onPlayerZoneIn( Entity::Player& player ) } // mark player as "bound by duty" - Common::Service< World::Manager::PlayerMgr >::ref().onSetStateFlag( player, PlayerStateFlag::BoundByDuty ); + Common::Service< World::Manager::PlayerMgr >::ref().setCondition( player, PlayerCondition::BoundByDuty ); sendDirectorInit( player ); } @@ -140,7 +140,7 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) auto player = it->second; if( !player->isLoadingComplete() || !player->isDirectorInitialized() || - player->hasStateFlag( PlayerStateFlag::WatchingCutscene ) ) + player->hasStateFlag( PlayerCondition::WatchingCutscene ) ) return; } @@ -614,7 +614,7 @@ void Sapphire::InstanceContent::clearDirector( Entity::Player& player ) player.setDirectorInitialized( false ); // remove "bound by duty" state - Service< World::Manager::PlayerMgr >::ref().onUnsetStateFlag( player, PlayerStateFlag::BoundByDuty ); + Service< World::Manager::PlayerMgr >::ref().removeCondition( player, PlayerCondition::BoundByDuty ); } uint32_t Sapphire::InstanceContent::getExpireValue() diff --git a/src/world/Territory/QuestBattle.cpp b/src/world/Territory/QuestBattle.cpp index 1cae4fde..8e9ba7b9 100644 --- a/src/world/Territory/QuestBattle.cpp +++ b/src/world/Territory/QuestBattle.cpp @@ -80,7 +80,7 @@ void Sapphire::QuestBattle::onPlayerZoneIn( Entity::Player& player ) m_pPlayer = player.getAsPlayer(); // mark player as "bound by duty" - player.setStateFlag( PlayerStateFlag::BoundByDuty ); + player.setCondition( PlayerCondition::BoundByDuty ); sendDirectorInit( player ); @@ -118,7 +118,7 @@ void Sapphire::QuestBattle::onUpdate( uint64_t tickCount ) if( !m_pPlayer->isLoadingComplete() || !m_pPlayer->isDirectorInitialized() || !m_pPlayer->isOnEnterEventDone() || - m_pPlayer->hasStateFlag( PlayerStateFlag::WatchingCutscene ) ) + m_pPlayer->hasStateFlag( PlayerCondition::WatchingCutscene ) ) return; if( m_instanceCommenceTime == 0 ) @@ -301,7 +301,7 @@ void Sapphire::QuestBattle::clearDirector( Entity::Player& player ) player.setDirectorInitialized( false ); // remove "bound by duty" state - player.unsetStateFlag( PlayerStateFlag::BoundByDuty ); + player.removeCondition( PlayerCondition::BoundByDuty ); } void Sapphire::QuestBattle::success() diff --git a/src/world/WorldServer.cpp b/src/world/WorldServer.cpp index 0017a2fc..96107540 100644 --- a/src/world/WorldServer.cpp +++ b/src/world/WorldServer.cpp @@ -367,8 +367,6 @@ void WorldServer::mainLoop() updateSessions( currTime ); DbKeepAlive( currTime ); - - } } @@ -401,6 +399,9 @@ void WorldServer::updateSessions( uint32_t currTime ) // remove session of players marked for removal ( logoff / kick ) if( ( player.isMarkedForRemoval() && diff > 5 ) || diff > 20 ) { + player.removeOnlineStatus( Common::OnlineStatus::Online ); + player.addOnlineStatus( Common::OnlineStatus::Offline ); + Logger::info( "[{0}] Session removal", session->getId() ); session->close(); sessionRemovalQueue.push( session->getId() );