From 4f7f3edfced7285be6d91734a1730b8e3cedb389 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 20 Feb 2023 11:15:01 +0100 Subject: [PATCH 1/4] Put world server mainloop on a 300 ms tick --- src/world/WorldServer.cpp | 10 ++++++++-- src/world/WorldServer.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/world/WorldServer.cpp b/src/world/WorldServer.cpp index c0db83b7..0017a2fc 100644 --- a/src/world/WorldServer.cpp +++ b/src/world/WorldServer.cpp @@ -349,10 +349,16 @@ void WorldServer::mainLoop() while( isRunning() ) { - std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) ); + auto tickCount = Common::Util::getTimeMs(); + + if( tickCount - m_lastServerTick < 300 ) + { + std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) ); + continue; + } + m_lastServerTick = tickCount; auto currTime = Common::Util::getTimeSeconds(); - auto tickCount = Common::Util::getTimeMs(); taskMgr.update( tickCount ); terriMgr.updateTerritoryInstances( tickCount ); diff --git a/src/world/WorldServer.h b/src/world/WorldServer.h index 57ac36b2..90a30c15 100644 --- a/src/world/WorldServer.h +++ b/src/world/WorldServer.h @@ -74,6 +74,7 @@ namespace Sapphire::World uint16_t m_port; std::string m_ip; int64_t m_lastDBPingTime; + uint64_t m_lastServerTick{ 0 }; bool m_bRunning; uint16_t m_worldId; From 188d80d2ecd882285ab67bfc5128fc51a2009804 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 20 Feb 2023 11:24:02 +0100 Subject: [PATCH 2/4] Alot more cleanups in various areas. --- src/scripts/action/common/ActionTeleport5.cpp | 2 - .../quest/subquest/limsa/SubSea001.cpp | 3 +- src/world/Action/EffectBuilder.cpp | 11 ++--- src/world/Actor/BNpc.cpp | 4 +- src/world/Actor/Player.cpp | 44 ++++--------------- src/world/Actor/Player.h | 13 +----- src/world/Manager/ActionMgr.h | 6 +-- src/world/Manager/BlacklistMgr.cpp | 8 ++-- src/world/Manager/DebugCommandMgr.cpp | 4 +- src/world/Manager/FriendListMgr.cpp | 10 ++--- src/world/Manager/WarpMgr.cpp | 19 ++++++-- src/world/Manager/WarpMgr.h | 11 +++++ .../Network/Handlers/CommonListHandler.cpp | 2 +- .../Network/Handlers/GMCommandHandlers.cpp | 16 +++---- .../Network/PacketWrappers/EffectPacket.h | 10 +++-- .../Network/PacketWrappers/EffectPacket1.h | 7 ++- .../PacketWrappers/PlayerSpawnPacket.h | 2 +- src/world/Territory/HousingZone.cpp | 9 ++-- src/world/Territory/Territory.cpp | 1 - 19 files changed, 77 insertions(+), 105 deletions(-) diff --git a/src/scripts/action/common/ActionTeleport5.cpp b/src/scripts/action/common/ActionTeleport5.cpp index 155c680e..8f6d8d93 100644 --- a/src/scripts/action/common/ActionTeleport5.cpp +++ b/src/scripts/action/common/ActionTeleport5.cpp @@ -32,8 +32,6 @@ public: pPlayer->removeCurrency( Common::CurrencyType::Gil, teleportQuery.cost ); - pPlayer->setZoningType( Common::ZoningType::Teleport ); - warpMgr().requestPlayerTeleport( *pPlayer, teleportQuery.targetAetheryte, 1 ); pPlayer->clearTeleportQuery(); diff --git a/src/scripts/quest/subquest/limsa/SubSea001.cpp b/src/scripts/quest/subquest/limsa/SubSea001.cpp index e17dc0a9..57ce53de 100644 --- a/src/scripts/quest/subquest/limsa/SubSea001.cpp +++ b/src/scripts/quest/subquest/limsa/SubSea001.cpp @@ -217,8 +217,7 @@ private: if( result.getResult( 0 ) == 1 ) { quest.setSeq( Seq2 ); - player.changePosition( 10, 21, 13, -2 ); - warpMgr().requestMoveTerritoryType( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0 ); + warpMgr().requestMoveTerritoryType( player, Common::WarpType::WARP_TYPE_NORMAL, Territorytype0, { 10, 21, 13 }, -2.f ); } } else diff --git a/src/world/Action/EffectBuilder.cpp b/src/world/Action/EffectBuilder.cpp index fb70309d..e6ec4027 100644 --- a/src/world/Action/EffectBuilder.cpp +++ b/src/world/Action/EffectBuilder.cpp @@ -112,11 +112,6 @@ void EffectBuilder::buildAndSendPackets( const std::vector< Entity::CharaPtr >& Logger::debug( "EffectBuilder result: " ); Logger::debug( "Targets afflicted: {}", targetList.size() ); - auto& teriMgr = Common::Service< Sapphire::World::Manager::TerritoryMgr >::ref(); - auto zone = teriMgr.getTerritoryByTypeId( m_sourceChara->getTerritoryTypeId() ); - - auto globalSequence = zone ? zone->getNextEffectResultId() : 0; - do // we want to send at least one packet even nothing is hit so other players can see { auto packet = buildNextEffectPacket( targetList ); @@ -136,7 +131,8 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( const s { auto effectPacket = std::make_shared< EffectPacket >( m_sourceChara->getId(), m_actionId ); effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) ); - effectPacket->setSequence( resultId, m_sequence ); + effectPacket->setRequestId( m_sequence ); + effectPacket->setResultId( resultId ); effectPacket->setTargetActor( targetList[ 0 ]->getId() ); uint8_t targetIndex = 0; @@ -184,7 +180,8 @@ std::shared_ptr< FFXIVPacketBase > EffectBuilder::buildNextEffectPacket( const s auto effectPacket = std::make_shared< EffectPacket1 >( m_sourceChara->getId(), targetList[ 0 ]->getId(), m_actionId ); effectPacket->setRotation( Common::Util::floatToUInt16Rot( m_sourceChara->getRot() ) ); - effectPacket->setSequence( resultId, m_sequence ); + effectPacket->setRequestId( m_sequence ); + effectPacket->setResultId( resultId ); for( auto it = m_actorEffectsMap.begin(); it != m_actorEffectsMap.end(); ) { diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index 7f59cdca..bcac24fe 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -993,12 +993,10 @@ void Sapphire::Entity::BNpc::autoAttack( CharaPtr pTarget ) Common::CalcResultParam effectEntry{}; effectEntry.Value = static_cast< int16_t >( damage.first ); effectEntry.Type = ActionEffectType::CALC_RESULT_TYPE_DAMAGE_HP; - //effectEntry.Flag = 128; effectEntry.Arg0 = 3; effectEntry.Arg1 = 7; - //effectEntry.Arg2 = 0x71; auto resultId = pZone->getNextEffectResultId(); - effectPacket->setSequence( resultId ); + effectPacket->setResultId( resultId ); effectPacket->addTargetEffect( effectEntry ); server().queueForPlayers( getInRangePlayerIds(), effectPacket ); diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 73233cda..0f7617d3 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -3,8 +3,6 @@ #include #include #include -#include -#include #include #include @@ -14,7 +12,6 @@ #include "Player.h" #include "BNpc.h" -#include "Manager/HousingMgr.h" #include "Manager/TerritoryMgr.h" #include "Manager/RNGMgr.h" #include "Manager/PlayerMgr.h" @@ -23,18 +20,15 @@ #include "Manager/FreeCompanyMgr.h" #include "Manager/MapMgr.h" #include "Manager/MgrUtil.h" +#include "Manager/ActionMgr.h" -#include "Territory/Territory.h" #include "Territory/InstanceContent.h" -#include "Territory/InstanceObjectCache.h" -#include "Territory/Land.h" #include "Network/GameConnection.h" #include "Network/PacketContainer.h" #include "Network/CommonActorControl.h" #include "Network/PacketWrappers/ActorControlPacket.h" #include "Network/PacketWrappers/ActorControlSelfPacket.h" -#include "Network/PacketWrappers/PlayerSetupPacket.h" #include "Network/PacketWrappers/PlayerSpawnPacket.h" #include "Network/PacketWrappers/EffectPacket1.h" @@ -76,7 +70,6 @@ Player::Player() : m_lastActionTick( 0 ), m_bInCombat( false ), m_bLoadingComplete( false ), - m_zoningType( Common::ZoningType::None ), m_bAutoattack( false ), m_markedForRemoval( false ), m_mount( 0 ), @@ -409,18 +402,12 @@ void Player::sendStats() bool Player::exitInstance() { - auto& teriMgr = Common::Service< TerritoryMgr >::ref(); auto& warpMgr = Common::Service< WarpMgr >::ref(); resetHp(); resetMp(); - m_pos = m_prevPos; - m_rot = m_prevRot; - m_territoryTypeId = m_prevTerritoryTypeId; - m_territoryId = m_prevTerritoryId; - - warpMgr.requestMoveTerritory( *this, WarpType::WARP_TYPE_CONTENT_END_RETURN, m_prevTerritoryId, m_prevPos, m_prevRot ); + warpMgr.requestMoveTerritory( *this, WarpType::WARP_TYPE_CONTENT_END_RETURN, getPrevTerritoryId(), getPrevPos(), getPrevRot() ); return true; } @@ -572,13 +559,6 @@ void Player::resetDiscovery() memset( m_discovery.data(), 0, m_discovery.size() ); } -void Player::changePosition( float x, float y, float z, float o ) -{ - auto& warpMgr = Common::Service< WarpMgr >::ref(); - Common::FFXIVARR_POSITION3 pos{ x, y, z }; - warpMgr.requestWarp( *this, Common::WARP_TYPE_NORMAL, pos, getRot() ); -} - void Player::setRewardFlag( Common::UnlockEntry unlockId ) { uint16_t index; @@ -1072,16 +1052,6 @@ void Player::setLoadingComplete( bool bComplete ) m_bLoadingComplete = bComplete; } -ZoningType Player::getZoningType() const -{ - return m_zoningType; -} - -void Player::setZoningType( Common::ZoningType zoneingType ) -{ - m_zoningType = zoneingType; -} - void Player::setSearchInfo( uint8_t selectRegion, uint8_t selectClass, const char* searchMessage ) { m_searchSelectRegion = selectRegion; @@ -1296,17 +1266,19 @@ uint32_t Player::getPersistentEmote() const void Player::autoAttack( CharaPtr pTarget ) { auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); + auto& actionMgr = Common::Service< World::Manager::ActionMgr >::ref(); + auto& exdData = Common::Service< Data::ExdData >::ref(); auto pZone = teriMgr.getTerritoryByGuId( getTerritoryId() ); auto mainWeap = getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand ); pTarget->onActionHostile( getAsChara() ); - //uint64_t tick = Util::getTimeMs(); - //srand(static_cast< uint32_t >(tick)); auto& RNGMgr = Common::Service< World::Manager::RNGMgr >::ref(); auto variation = static_cast< uint32_t >( RNGMgr.getRandGenerator< float >( 0, 3 ).next() ); + //actionMgr.handleTargetedPlayerAction( *this, 7, exdData.getRow< Excel::Action >( 7 ), pTarget->getId(), 0 ); + auto damage = Math::CalcStats::calcAutoAttackDamage( *this ); auto effectPacket = std::make_shared< EffectPacket1 >( getId(), pTarget->getId(), 7 ); @@ -1840,7 +1812,7 @@ void Player::setPartyId( uint64_t partyId ) m_partyId = partyId; } -Player::FriendListIDVec& Player::getFriendListID() +Player::FriendListIDVec& Player::getFriendListId() { return m_friendList; } @@ -1850,7 +1822,7 @@ Player::FriendListDataVec& Player::getFriendListData() return m_friendInviteList; } -Player::FriendListIDVec& Player::getBlacklistID() +Player::FriendListIDVec& Player::getBlacklistId() { return m_blacklist; } diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 8db015d5..bfeae63a 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -310,9 +310,6 @@ namespace Sapphire::Entity void updatePrevTerritory(); - /*! change position, sends update too */ - void changePosition( float x, float y, float z, float o ); - /*! return the characterId */ uint64_t getCharacterId() const; @@ -598,10 +595,6 @@ namespace Sapphire::Entity /*! set the loading complete bool */ void setLoadingComplete( bool bComplete ); - Common::ZoningType getZoningType() const; - - void setZoningType( Common::ZoningType zoneingType ); - void setSearchInfo( uint8_t selectRegion, uint8_t selectClass, const char* searchMessage ); const char* getSearchMessage() const; @@ -812,10 +805,10 @@ namespace Sapphire::Entity uint64_t getPartyId() const; void setPartyId( uint64_t partyId ); - FriendListIDVec& getFriendListID(); + FriendListIDVec& getFriendListId(); FriendListDataVec& getFriendListData(); - BlacklistIDVec& getBlacklistID(); + BlacklistIDVec& getBlacklistId(); uint64_t m_lastMoveTime{}; uint8_t m_lastMoveflag{}; @@ -940,8 +933,6 @@ namespace Sapphire::Entity bool m_bIsConnected; - Common::ZoningType m_zoningType; - bool m_bNewAdventurer{}; uint64_t m_onlineStatus; uint64_t m_onlineStatusCustom; diff --git a/src/world/Manager/ActionMgr.h b/src/world/Manager/ActionMgr.h index 5a6de33d..3f336b36 100644 --- a/src/world/Manager/ActionMgr.h +++ b/src/world/Manager/ActionMgr.h @@ -22,16 +22,14 @@ namespace Sapphire::World::Manager bool cacheActionLut(); - void handleItemManipulationAction( Entity::Player& player, uint32_t actionId, - Excel::ExcelStructPtr< Excel::Action > actionData, uint16_t sequence ); + void handleItemManipulationAction( Entity::Player& player, uint32_t actionId, Excel::ExcelStructPtr< Excel::Action > actionData, uint16_t sequence ); void handleTargetedPlayerAction( Entity::Player& player, uint32_t actionId, std::shared_ptr< Excel::ExcelStruct< Excel::Action > > actionData, uint64_t targetId, uint16_t sequence ); void handlePlacedPlayerAction( Entity::Player& player, uint32_t actionId, std::shared_ptr< Excel::ExcelStruct< Excel::Action > > actionData, Common::FFXIVARR_POSITION3 pos, uint16_t sequence ); - void handleItemAction( Entity::Player& player, uint32_t itemId, - std::shared_ptr< Excel::ExcelStruct< Excel::ItemAction > > itemActionData, + void handleItemAction( Entity::Player& player, uint32_t itemId, std::shared_ptr< Excel::ExcelStruct< Excel::ItemAction > > itemActionData, uint16_t itemSourceSlot, uint16_t itemSourceContainer ); void handleEventItemAction( Entity::Player& player, uint32_t itemId, diff --git a/src/world/Manager/BlacklistMgr.cpp b/src/world/Manager/BlacklistMgr.cpp index 5356d3bb..b53d5b51 100644 --- a/src/world/Manager/BlacklistMgr.cpp +++ b/src/world/Manager/BlacklistMgr.cpp @@ -59,7 +59,7 @@ bool BlacklistMgr::onAddCharacter( Entity::Player& source, const std::string& ta } // add target ID to blacklist - auto& sourceBL = source.getBlacklistID(); + auto& sourceBL = source.getBlacklistId(); sourceBL[sourceIdx] = target.getCharacterId(); source.updateDbBlacklist(); @@ -100,7 +100,7 @@ bool BlacklistMgr::onRemoveCharacter( Entity::Player& source, const std::string& } // set target slot to 0 - auto& sourceBL = source.getBlacklistID(); + auto& sourceBL = source.getBlacklistId(); sourceBL[sourceIdx] = 0; source.updateDbBlacklist(); @@ -124,7 +124,7 @@ bool BlacklistMgr::onGetBlacklistPage( Entity::Player& source, uint8_t key, uint // get array offset/last page sent from client packet auto offset = nextIdx; - auto& idVec = source.getBlacklistID(); + auto& idVec = source.getBlacklistId(); for( size_t i = offset; i < offset + itemsPerPage; ++i ) { @@ -172,7 +172,7 @@ bool BlacklistMgr::isBlacklisted( Entity::Player& source, const Entity::Player& ptrdiff_t BlacklistMgr::getEntryIndex( Entity::Player& source, uint64_t characterId ) const { - auto& sourceBL = source.getBlacklistID(); + auto& sourceBL = source.getBlacklistId(); auto sourceBlIt = std::find( std::begin( sourceBL ), std::end( sourceBL ), characterId ); // not found diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index b7ba56f0..e181b659 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -541,9 +541,7 @@ void DebugCommandMgr::add( char* data, Entity::Player& player, std::shared_ptr< entry.Arg0 = static_cast< uint8_t >( Common::ActionHitSeverityType::NormalDamage ); effectPacket->addTargetEffect( entry, static_cast< uint64_t >( player.getId() ) ); - - auto sequence = pCurrentZone->getNextEffectResultId(); - effectPacket->setSequence( sequence ); + effectPacket->setResultId( pCurrentZone->getNextEffectResultId() ); server().queueForPlayer( player.getCharacterId(), effectPacket ); } diff --git a/src/world/Manager/FriendListMgr.cpp b/src/world/Manager/FriendListMgr.cpp index ddf9b989..6ef5ba9b 100644 --- a/src/world/Manager/FriendListMgr.cpp +++ b/src/world/Manager/FriendListMgr.cpp @@ -10,8 +10,8 @@ using namespace Sapphire::World::Manager; bool FriendListMgr::onInviteCreate( Entity::Player& source, Entity::Player& target ) { - auto& sourceFL = source.getFriendListID(); - auto& targetFL = target.getFriendListID(); + auto& sourceFL = source.getFriendListId(); + auto& targetFL = target.getFriendListId(); // check if player already has been invited or friends if( isFriend( source, target ) ) @@ -96,8 +96,8 @@ bool FriendListMgr::onInviteDecline( Entity::Player& source, Entity::Player& tar return false; } - auto& sourceFL = source.getFriendListID(); - auto& targetFL = target.getFriendListID(); + auto& sourceFL = source.getFriendListId(); + auto& targetFL = target.getFriendListId(); auto& sourceFLData = source.getFriendListData(); auto& targetFLData = target.getFriendListData(); @@ -149,7 +149,7 @@ bool FriendListMgr::isFriend( Entity::Player& source, Entity::Player& target ) c ptrdiff_t FriendListMgr::getEntryIndex( Entity::Player& source, uint64_t characterId ) const { - auto& sourceFL = source.getFriendListID(); + auto& sourceFL = source.getFriendListId(); auto sourceInvIt = std::find( std::begin( sourceFL ), std::end( sourceFL ), characterId ); // not found diff --git a/src/world/Manager/WarpMgr.cpp b/src/world/Manager/WarpMgr.cpp index 0c892b69..0cf71428 100644 --- a/src/world/Manager/WarpMgr.cpp +++ b/src/world/Manager/WarpMgr.cpp @@ -71,6 +71,21 @@ void WarpMgr::requestMoveTerritoryType( Entity::Player& player, Common::WarpType requestMoveTerritory( player, warpType, pTeri->getGuId() ); } +void WarpMgr::requestMoveTerritoryType( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryTypeId, + Common::FFXIVARR_POSITION3 targetPos, float targetRot ) +{ + auto& teriMgr = Common::Service< TerritoryMgr >::ref(); + + auto pTeri = teriMgr.getTerritoryByTypeId( targetTerritoryTypeId ); + if( !pTeri ) + { + Logger::error( "Unable to find target territory instance for type {}", targetTerritoryTypeId ); + return; + } + + requestMoveTerritory( player, warpType, pTeri->getGuId(), player.getPos(), player.getRot() ); +} + void WarpMgr::requestWarp( Entity::Player& player, Common::WarpType warpType, Common::FFXIVARR_POSITION3 targetPos, float targetRot ) { m_entityIdToWarpInfoMap[ player.getId() ] = { 0, warpType, targetPos, targetRot }; @@ -114,7 +129,6 @@ void WarpMgr::finishWarp( Entity::Player& player ) auto zoneInPacket = makeActorControlSelf( player.getId(), Appear, warpFinishAnim, raiseAnim, 0, 0 ); auto setStatusPacket = makeActorControl( player.getId(), SetStatus, static_cast< uint8_t >( Common::ActorStatus::Idle ) ); - player.setZoningType( Common::ZoningType::None ); if( !player.getGmInvis() ) server().queueForPlayers( player.getInRangePlayerIds(), zoneInPacket ); @@ -173,17 +187,14 @@ void WarpMgr::requestPlayerTeleport( Entity::Player& player, uint16_t aetheryteI if( teleportType == 1 || teleportType == 2 ) // teleport { warpType = WarpType::WARP_TYPE_TELEPO; - player.setZoningType( Common::ZoningType::Teleport ); } else if( teleportType == 3 ) // return { warpType = WarpType::WARP_TYPE_EXIT_RANGE; - player.setZoningType( Common::ZoningType::Return ); } else if( teleportType == 4 ) // return dead { warpType = WarpType::WARP_TYPE_EXIT_RANGE; - player.setZoningType( Common::ZoningType::ReturnDead ); } if( sameTerritory ) diff --git a/src/world/Manager/WarpMgr.h b/src/world/Manager/WarpMgr.h index 0805e9c8..30dd4c30 100644 --- a/src/world/Manager/WarpMgr.h +++ b/src/world/Manager/WarpMgr.h @@ -32,6 +32,17 @@ namespace Sapphire::World::Manager /// void requestMoveTerritory( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot ); + /// + /// request to move a player to specified territory type and position, with given WarpType + /// + /// + /// + /// + /// + /// + void requestMoveTerritoryType( Entity::Player& player, Common::WarpType warpType, uint32_t targetTerritoryId, Common::FFXIVARR_POSITION3 targetPos, float targetRot ); + + /// /// request to move a player to specified territory guid with given WarpType, position will be the same as before diff --git a/src/world/Network/Handlers/CommonListHandler.cpp b/src/world/Network/Handlers/CommonListHandler.cpp index a1390f24..38642be4 100644 --- a/src/world/Network/Handlers/CommonListHandler.cpp +++ b/src/world/Network/Handlers/CommonListHandler.cpp @@ -195,7 +195,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX } else if( data.ListType == 0x0b ) { // friend list - auto& friendList = player.getFriendListID(); + auto& friendList = player.getFriendListId(); auto& friendListData = player.getFriendListData(); std::vector< Common::HierarchyData > hierarchyData( friendListData.begin(), friendListData.end() ); diff --git a/src/world/Network/Handlers/GMCommandHandlers.cpp b/src/world/Network/Handlers/GMCommandHandlers.cpp index 2b496db8..e08c8c6e 100644 --- a/src/world/Network/Handlers/GMCommandHandlers.cpp +++ b/src/world/Network/Handlers/GMCommandHandlers.cpp @@ -89,6 +89,7 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR auto& teriMgr = Common::Service< World::Manager::TerritoryMgr >::ref(); auto& exdData = Common::Service< Data::ExdData >::ref(); + auto& warpMgr = Common::Service< World::Manager::WarpMgr >::ref(); const auto packet = ZoneChannelPacket< FFXIVIpcGmCommand >( inPacket ); const auto commandId = packet.data().Id; @@ -201,11 +202,11 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR { auto& warpMgr = Common::Service< WarpMgr >::ref(); warpMgr.requestMoveTerritory( *targetPlayer, WarpType::WARP_TYPE_GM, - player.getTerritoryId(), { player.getPos().x, player.getPos().y, player.getPos().z }, - player.getRot() ); + player.getTerritoryId(), player.getPos(), player.getRot() ); } else - targetPlayer->changePosition( player.getPos().x, player.getPos().y, player.getPos().z, player.getRot() ); + warpMgr.requestMoveTerritory( *targetPlayer, Common::WarpType::WARP_TYPE_NORMAL, player.getTerritoryId(), + player.getPos(), player.getRot() ); PlayerMgr::sendServerNotice( player, "Calling {0}", targetPlayer->getName() ); break; } @@ -578,13 +579,10 @@ void Sapphire::Network::GameConnection::gmCommandHandler( const Packets::FFXIVAR } case GmCommand::Jump: { - + // todo - what was the intention here? auto inRange = player.getInRangeActors(); - - player.changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, - targetActor->getRot() ); - - PlayerMgr::sendServerNotice( player, "Jumping to {0} in range.", targetPlayer->getName()); + warpMgr.requestWarp( player, WarpType::WARP_TYPE_GM, targetActor->getPos(), targetActor->getRot() ); + PlayerMgr::sendServerNotice( player, "Jumping to {0} in range.", targetPlayer->getName() ); break; } diff --git a/src/world/Network/PacketWrappers/EffectPacket.h b/src/world/Network/PacketWrappers/EffectPacket.h index dfb8314b..4e418f3c 100644 --- a/src/world/Network/PacketWrappers/EffectPacket.h +++ b/src/world/Network/PacketWrappers/EffectPacket.h @@ -85,10 +85,14 @@ namespace Sapphire::Network::Packets::WorldPackets::Server FFXIVPacketBase::setTargetActor( targetId ); } - void setSequence( uint32_t sequence, uint16_t sourceSequence = 0 ) + void setRequestId( uint16_t requestId ) { - m_data.RequestId = static_cast< uint32_t >( sourceSequence ); - m_data.ResultId = static_cast< uint32_t>( sequence ); + m_data.RequestId = static_cast< uint32_t >( requestId ); + } + + void setResultId( uint32_t resultId ) + { + m_data.ResultId = static_cast< uint32_t >( resultId ); } private: uint8_t m_targetEffectCount{ 0 }; diff --git a/src/world/Network/PacketWrappers/EffectPacket1.h b/src/world/Network/PacketWrappers/EffectPacket1.h index 5b81ba61..5534aa4f 100644 --- a/src/world/Network/PacketWrappers/EffectPacket1.h +++ b/src/world/Network/PacketWrappers/EffectPacket1.h @@ -68,15 +68,14 @@ namespace Sapphire::Network::Packets::WorldPackets::Server FFXIVPacketBase::setTargetActor( targetId ); } - void setSequence( uint32_t sequence, uint16_t sourceSequence = 0 ) + void setRequestId( uint16_t requestId ) { - m_data.RequestId = static_cast< uint32_t >( sourceSequence ); - m_data.ResultId = static_cast< uint32_t>( sequence ); + m_data.RequestId = static_cast< uint32_t >( requestId ); } void setResultId( uint32_t resultId ) { - m_data.ResultId = static_cast< uint32_t>( resultId ); + m_data.ResultId = static_cast< uint32_t >( resultId ); } private: diff --git a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h index ef29a7f0..6192a274 100644 --- a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h @@ -110,7 +110,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server m_data.ActiveType = player.getStance(); m_data.Flag = 0; - if( player.getZoningType() != Common::ZoningType::None || player.getGmInvis() ) + if( player.getGmInvis() ) { m_data.Flag |= static_cast< uint16_t >( Common::DisplayFlags::Invisible ); } diff --git a/src/world/Territory/HousingZone.cpp b/src/world/Territory/HousingZone.cpp index cbd48154..b5fe523c 100644 --- a/src/world/Territory/HousingZone.cpp +++ b/src/world/Territory/HousingZone.cpp @@ -156,8 +156,7 @@ bool Sapphire::HousingZone::isPlayerSubInstance( Entity::Player& player ) void Sapphire::HousingZone::onPlayerZoneIn( Entity::Player& player ) { auto& server = Common::Service< World::WorldServer >::ref(); - Logger::debug( "HousingZone::onPlayerZoneIn: Territory#{0}|{1}, Entity#{2}", - getGuId(), getTerritoryTypeId(), player.getId() ); + Logger::debug( "HousingZone::onPlayerZoneIn: Territory#{0}|{1}, Entity#{2}", getGuId(), getTerritoryTypeId(), player.getId() ); auto isInSubdivision = isPlayerSubInstance( player ); @@ -185,8 +184,8 @@ void Sapphire::HousingZone::sendLandSet( Entity::Player& player ) auto landsetInitializePacket = makeZonePacket< FFXIVIpcHouseList >( player.getId() ); landsetInitializePacket->data().LandSetId.wardNum = m_wardNum; - landsetInitializePacket->data().LandSetId.landId = m_landSetId; - landsetInitializePacket->data().LandSetId.territoryTypeId = m_territoryTypeId; + landsetInitializePacket->data().LandSetId.landId = static_cast< uint16_t >( m_landSetId ); + landsetInitializePacket->data().LandSetId.territoryTypeId = static_cast< uint16_t >( m_territoryTypeId ); landsetInitializePacket->data().LandSetId.worldId = server.getWorldId(); auto isInSubdivision = isPlayerSubInstance( player ); @@ -337,7 +336,7 @@ void Sapphire::HousingZone::removeEstateEntranceEObj( uint16_t landId ) auto land = getLand( landId ); assert( land ); - for( auto entry : m_eventObjects ) + for( const auto& entry : m_eventObjects ) { auto eObj = entry.second; if( eObj->getHousingLink() == static_cast< uint32_t >( landId ) << 8 ) diff --git a/src/world/Territory/Territory.cpp b/src/world/Territory/Territory.cpp index a579e975..82f86010 100644 --- a/src/world/Territory/Territory.cpp +++ b/src/world/Territory/Territory.cpp @@ -882,7 +882,6 @@ void Territory::addEffectResult( World::Action::EffectResultPtr result ) } void Territory::processEffectResults( uint64_t tickCount ) - { // todo: move this to generic territory/instance delay wrapper cause it might be useful scheduling other things for( auto it = m_effectResults.begin(); it != m_effectResults.end(); ) From 6bf3ac0be8a11bc4083ad969ffd67e7e81fec187 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 20 Feb 2023 15:25:57 +0100 Subject: [PATCH 3/4] Refactoring ongoing. --- src/common/Common.h | 4 +- .../Network/PacketDef/Zone/ServerZoneDef.h | 2 +- src/scripts/quest/ManFst303.cpp | 4 +- src/world/Action/Action.cpp | 8 +-- src/world/Action/EventAction.cpp | 4 +- src/world/Action/MountAction.cpp | 4 +- src/world/Actor/Player.cpp | 38 +++++-------- src/world/Actor/Player.h | 10 ++-- src/world/Actor/PlayerQuest.cpp | 11 ++++ src/world/Manager/EventMgr.cpp | 10 ++-- src/world/Manager/PlayerMgr.cpp | 54 ++++++++++--------- src/world/Manager/PlayerMgr.h | 39 +++++--------- src/world/Manager/TerritoryMgr.cpp | 4 +- src/world/Manager/WarpMgr.cpp | 2 +- src/world/Network/Handlers/CFHandlers.cpp | 2 +- src/world/Network/Handlers/EventHandlers.cpp | 2 +- .../Network/Handlers/GMCommandHandlers.cpp | 4 +- .../Network/Handlers/PacketCommandHandler.cpp | 4 +- src/world/Network/Handlers/PacketHandlers.cpp | 6 +-- ...erStateFlagsPacket.h => ConditionPacket.h} | 12 ++--- src/world/Task/MoveTerritoryTask.cpp | 2 +- src/world/Territory/InstanceContent.cpp | 6 +-- src/world/Territory/QuestBattle.cpp | 6 +-- src/world/WorldServer.cpp | 5 +- 24 files changed, 117 insertions(+), 126 deletions(-) rename src/world/Network/PacketWrappers/{PlayerStateFlagsPacket.h => ConditionPacket.h} (65%) 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() ); From 065c1817bd3dd1e04c43e7adb43f91203b2ba7b7 Mon Sep 17 00:00:00 2001 From: Mordred Date: Mon, 20 Feb 2023 16:41:04 +0100 Subject: [PATCH 4/4] Missed a few state flags functions during renaming. --- src/world/Action/EventAction.cpp | 2 +- src/world/Actor/Player.cpp | 6 +++--- src/world/Actor/Player.h | 10 +++++----- src/world/Manager/EventMgr.cpp | 2 +- src/world/Network/Handlers/PacketHandlers.cpp | 6 +++--- src/world/Network/PacketWrappers/ConditionPacket.h | 2 +- src/world/Territory/InstanceContent.cpp | 2 +- src/world/Territory/QuestBattle.cpp | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/world/Action/EventAction.cpp b/src/world/Action/EventAction.cpp index 847b3798..57985df5 100644 --- a/src/world/Action/EventAction.cpp +++ b/src/world/Action/EventAction.cpp @@ -61,7 +61,7 @@ void Action::EventAction::start() server().queueForPlayers( m_pSource->getInRangePlayerIds( true ), control ); - if( pPlayer->hasStateFlag( PlayerCondition::InNpcEvent ) ) + if( pPlayer->hasCondition( PlayerCondition::InNpcEvent ) ) Service< World::Manager::PlayerMgr >::ref().removeCondition( *pPlayer, PlayerCondition::InNpcEvent ); } else diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 68b6c763..e38c3444 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -861,12 +861,12 @@ void Player::setGcRankAt( uint8_t index, uint8_t rank ) m_gcRank[ index ] = rank; } -const Player::StateFlags& Player::getStateFlags() const +const Player::Condition& Player::getConditions() const { return m_condition; } -bool Player::hasStateFlag( Common::PlayerCondition flag ) const +bool Player::hasCondition( Common::PlayerCondition flag ) const { auto iFlag = static_cast< int32_t >( flag ); @@ -890,7 +890,7 @@ void Player::setCondition( Common::PlayerCondition flag ) void Player::removeCondition( Common::PlayerCondition flag ) { - if( !hasStateFlag( flag ) ) + if( !hasCondition( flag ) ) return; auto iFlag = static_cast< int32_t >( flag ); diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index e3ae41da..74977910 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -34,7 +34,7 @@ namespace Sapphire::Entity using AetheryteList = std::array< uint8_t, Common::ARRSIZE_AETHERYTES >; using UnlockList = std::array< uint8_t, Common::ARRSIZE_UNLOCKS >; using OrchestrionList = std::array< uint8_t, Common::ARRSIZE_ORCHESTRION >; - using StateFlags = std::array< uint8_t, 12 >; + using Condition = std::array< uint8_t, 12 >; using ClassList = std::array< uint16_t, Common::ARRSIZE_CLASSJOB >; using ExpList = std::array< uint32_t, Common::ARRSIZE_CLASSJOB >; @@ -526,16 +526,16 @@ namespace Sapphire::Entity // Player State Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// /* return a const pointer to the state flag array */ - const StateFlags& getStateFlags() const; + const Condition& getConditions() const; /* set a specified state flag */ void setCondition( Common::PlayerCondition flag ); /* set a specified state flag */ - void setStateFlags( std::vector< Common::PlayerCondition > flags ); + void setConditions( std::vector< Common::PlayerCondition > flags ); /* check if a specified flag is set */ - bool hasStateFlag( Common::PlayerCondition flag ) const; + bool hasCondition( Common::PlayerCondition flag ) const; /* reset a specified flag */ void removeCondition( Common::PlayerCondition flag ); @@ -901,7 +901,7 @@ namespace Sapphire::Entity OrchestrionList m_orchestrion{}; ClassList m_classArray{}; ExpList m_expArray{}; - StateFlags m_condition{}; + Condition m_condition{}; Common::ClassJob m_firstClass{}; diff --git a/src/world/Manager/EventMgr.cpp b/src/world/Manager/EventMgr.cpp index f2a474d9..81ddefc4 100644 --- a/src/world/Manager/EventMgr.cpp +++ b/src/world/Manager/EventMgr.cpp @@ -550,7 +550,7 @@ void EventMgr::eventFinish( Sapphire::Entity::Player& player, uint32_t eventId, } } - if( player.hasStateFlag( Common::PlayerCondition::WatchingCutscene ) ) + if( player.hasCondition( Common::PlayerCondition::WatchingCutscene ) ) Common::Service< World::Manager::PlayerMgr >::ref().removeCondition( player, Common::PlayerCondition::WatchingCutscene ); player.removeEvent( pEvent->getId() ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 34be2bf3..b2cc81f0 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -182,7 +182,7 @@ void Sapphire::Network::GameConnection::joinChatChannelHandler( const Packets::F void Sapphire::Network::GameConnection::moveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - if( player.hasStateFlag( Common::BetweenAreas ) ) + if( player.hasCondition( Common::BetweenAreas ) ) return; const auto updatePositionPacket = ZoneChannelPacket< Client::FFXIVIpcUpdatePosition >( inPacket ); auto& data = updatePositionPacket.data(); @@ -523,7 +523,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC auto pTargetPlayer = pSession->getPlayer(); - if( pTargetPlayer->hasStateFlag( PlayerCondition::BetweenAreas ) ) + if( pTargetPlayer->hasCondition( 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( PlayerCondition::BoundByDuty ) && !player.isActingAsGm() ) + if( pTargetPlayer->hasCondition( 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/ConditionPacket.h b/src/world/Network/PacketWrappers/ConditionPacket.h index a05654bb..6edfb4d4 100644 --- a/src/world/Network/PacketWrappers/ConditionPacket.h +++ b/src/world/Network/PacketWrappers/ConditionPacket.h @@ -17,7 +17,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server ConditionPacket( Entity::Player& player ) : ZoneChannelPacket< FFXIVIpcCondition >( player.getId(), player.getId() ) { - initialize( player.getStateFlags().data() ); + initialize( player.getConditions().data() ); } ConditionPacket( Entity::Player& player, std::vector< Common::PlayerCondition > flags ) : diff --git a/src/world/Territory/InstanceContent.cpp b/src/world/Territory/InstanceContent.cpp index 661b9a68..1c44f9f2 100644 --- a/src/world/Territory/InstanceContent.cpp +++ b/src/world/Territory/InstanceContent.cpp @@ -140,7 +140,7 @@ void Sapphire::InstanceContent::onUpdate( uint64_t tickCount ) auto player = it->second; if( !player->isLoadingComplete() || !player->isDirectorInitialized() || - player->hasStateFlag( PlayerCondition::WatchingCutscene ) ) + player->hasCondition( PlayerCondition::WatchingCutscene ) ) return; } diff --git a/src/world/Territory/QuestBattle.cpp b/src/world/Territory/QuestBattle.cpp index 8e9ba7b9..a0f3f408 100644 --- a/src/world/Territory/QuestBattle.cpp +++ b/src/world/Territory/QuestBattle.cpp @@ -118,7 +118,7 @@ void Sapphire::QuestBattle::onUpdate( uint64_t tickCount ) if( !m_pPlayer->isLoadingComplete() || !m_pPlayer->isDirectorInitialized() || !m_pPlayer->isOnEnterEventDone() || - m_pPlayer->hasStateFlag( PlayerCondition::WatchingCutscene ) ) + m_pPlayer->hasCondition( PlayerCondition::WatchingCutscene ) ) return; if( m_instanceCommenceTime == 0 )