From 3b49cade1d24e7ab88c14ba5bce0ffa277aae708 Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Wed, 16 Feb 2022 15:11:10 -0300 Subject: [PATCH 1/4] minor cleanup; --- src/common/Common.h | 115 +++++++++++++++--------------- src/world/Actor/BNpc.cpp | 8 ++- src/world/Territory/Territory.cpp | 4 +- 3 files changed, 64 insertions(+), 63 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 5c9f1d57..4b9b6c60 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -1499,64 +1499,63 @@ namespace Sapphire::Common using PlayerStateFlagList = std::vector< PlayerStateFlag >; + struct BNPCInstanceObject + { + uint16_t territoryType; + std::string bnpcName; + uint32_t instanceId; + uint32_t nameOffset; + float x; + float y; + float z; + float rotation; + uint32_t BaseId; + uint32_t PopWeather; + uint8_t PopTimeStart; + uint8_t PopTimeEnd; + uint32_t MoveAI; + uint8_t WanderingRange; + uint8_t Route; + uint16_t EventGroup; + uint32_t NameId; + uint32_t DropItem; + float SenseRangeRate; + uint16_t Level; + uint8_t ActiveType; + uint8_t PopInterval; + uint8_t PopRate; + uint8_t PopEvent; + uint8_t LinkGroup; + uint8_t LinkFamily; + uint8_t LinkRange; + uint8_t LinkCountLimit; + int8_t NonpopInitZone; + int8_t InvalidRepop; + int8_t LinkParent; + int8_t LinkOverride; + int8_t LinkReply; + int8_t Nonpop; + float HorizontalPopRange; + float VerticalPopRange; + int32_t BNpcBaseData; + uint8_t RepopId; + uint8_t BNPCRankId; + uint16_t TerritoryRange; + uint32_t BoundInstanceID; + uint32_t FateLayoutLabelId; + uint32_t NormalAI; + uint32_t ServerPathId; + uint32_t EquipmentID; + uint32_t CustomizeID; + }; -struct BNPCInstanceObject -{ - uint16_t territoryType; - std::string bnpcName; - uint32_t instanceId; - uint32_t nameOffset; - float x; - float y; - float z; - float rotation; - uint32_t BaseId; - uint32_t PopWeather; - uint8_t PopTimeStart; - uint8_t PopTimeEnd; - uint32_t MoveAI; - uint8_t WanderingRange; - uint8_t Route; - uint16_t EventGroup; - uint32_t NameId; - uint32_t DropItem; - float SenseRangeRate; - uint16_t Level; - uint8_t ActiveType; - uint8_t PopInterval; - uint8_t PopRate; - uint8_t PopEvent; - uint8_t LinkGroup; - uint8_t LinkFamily; - uint8_t LinkRange; - uint8_t LinkCountLimit; - int8_t NonpopInitZone; - int8_t InvalidRepop; - int8_t LinkParent; - int8_t LinkOverride; - int8_t LinkReply; - int8_t Nonpop; - float HorizontalPopRange; - float VerticalPopRange; - int32_t BNpcBaseData; - uint8_t RepopId; - uint8_t BNPCRankId; - uint16_t TerritoryRange; - uint32_t BoundInstanceID; - uint32_t FateLayoutLabelId; - uint32_t NormalAI; - uint32_t ServerPathId; - uint32_t EquipmentID; - uint32_t CustomizeID; -}; - -/* - * CellId is used to identify a cell in the cell container of a zone - */ -struct CellId -{ - uint32_t x{ 0 }; - uint32_t y{ 0 }; -}; + /* + * CellId is used to identify a cell in the cell container of a zone + */ + struct CellId + { + uint32_t x{ 0 }; + uint32_t y{ 0 }; + }; } diff --git a/src/world/Actor/BNpc.cpp b/src/world/Actor/BNpc.cpp index e860bb5d..b93451fa 100644 --- a/src/world/Actor/BNpc.cpp +++ b/src/world/Actor/BNpc.cpp @@ -731,6 +731,7 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) } checkAggro(); + break; } case BNpcState::Combat: @@ -796,6 +797,7 @@ void Sapphire::Entity::BNpc::update( uint64_t tickCount ) pNaviProvider->updateAgentParameters( *this ); } } + break; } @@ -832,20 +834,21 @@ void Sapphire::Entity::BNpc::onDeath() { auto& server = Common::Service< World::WorldServer >::ref(); auto& playerMgr = Common::Service< World::Manager::PlayerMgr >::ref(); + auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref(); + setTargetId( INVALID_GAME_OBJECT_ID64 ); m_currentStance = Stance::Passive; m_state = BNpcState::Dead; m_timeOfDeath = Util::getTimeSeconds(); setOwner( nullptr ); - auto& taskMgr = Common::Service< World::Manager::TaskMgr >::ref(); taskMgr.queueTask( World::makeFadeBNpcTask( 10000, getAsBNpc() ) ); taskMgr.queueTask( World::makeRemoveBNpcTask( 12000, getAsBNpc() ) ); auto& exdData = Common::Service< Data::ExdData >::ref(); auto paramGrowthInfo = exdData.getRow< Excel::ParamGrow >( m_level ); - for( auto& pHateEntry : m_hateList ) + for( const auto& pHateEntry : m_hateList ) { // TODO: handle drops auto pPlayer = pHateEntry->m_pChara->getAsPlayer(); @@ -855,6 +858,7 @@ void Sapphire::Entity::BNpc::onDeath() pPlayer->gainExp( paramGrowthInfo->data().BaseExp ); } } + hateListClear(); } diff --git a/src/world/Territory/Territory.cpp b/src/world/Territory/Territory.cpp index 504eeadd..94ba7085 100644 --- a/src/world/Territory/Territory.cpp +++ b/src/world/Territory/Territory.cpp @@ -54,6 +54,7 @@ using namespace Sapphire::World::Manager; Territory::Territory() : m_territoryTypeId( 0 ), + m_ident(), m_guId( 0 ), m_currentWeather( Common::Weather::FairSkies ), m_weatherOverride( Common::Weather::None ), @@ -908,7 +909,6 @@ bool Territory::loadBNpcs() while( res->next() ) { - auto bnpc = std::make_shared< Common::BNPCInstanceObject >(); bnpc->territoryType = res->getInt( 1 ); @@ -970,8 +970,6 @@ bool Territory::loadBNpcs() m_spawnInfo.emplace_back( info ); } - - } return true; } From 2f5d5e9d186ceb1001446485034643d1e391d597 Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Sat, 19 Feb 2022 22:05:30 -0300 Subject: [PATCH 2/4] more warning cleanups; general styling fixes; --- src/world/Actor/PlayerInventory.cpp | 2 +- src/world/Manager/LinkshellMgr.cpp | 2 +- src/world/Manager/TerritoryMgr.cpp | 3 ++- src/world/Network/Handlers/CommonListHandler.cpp | 2 +- src/world/Network/Handlers/PacketCommandHandler.cpp | 3 +-- src/world/Network/Handlers/PacketHandlers.cpp | 8 ++++---- src/world/Network/PacketWrappers/PcPartyUpdatePacket.h | 9 --------- src/world/Network/PacketWrappers/PlayerSetupPacket.h | 2 +- src/world/WorldServer.cpp | 3 ++- 9 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index 9f4b8585..b48a63ea 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -474,7 +474,7 @@ Sapphire::Entity::Player::InvSlotPair Sapphire::Entity::Player::getFreeBagSlot() Sapphire::Entity::Player::InvSlotPair Sapphire::Entity::Player::getFreeContainerSlot( uint32_t containerId ) { - auto freeSlot = static_cast < int8_t >( m_storageMap[ containerId ]->getFreeSlot() ); + auto freeSlot = static_cast< int8_t >( m_storageMap[ containerId ]->getFreeSlot() ); if( freeSlot != -1 ) return std::make_pair( containerId, freeSlot ); diff --git a/src/world/Manager/LinkshellMgr.cpp b/src/world/Manager/LinkshellMgr.cpp index 99063983..3b81951b 100644 --- a/src/world/Manager/LinkshellMgr.cpp +++ b/src/world/Manager/LinkshellMgr.cpp @@ -53,7 +53,7 @@ bool LinkshellMgr::loadLinkshells() size_t entryCount = inData.size() / 8; std::vector< uint64_t > list( entryCount ); - for( int i = 0; i < entryCount; ++i ) + for( uint64_t i = 0; i < entryCount; ++i ) { auto val = *reinterpret_cast< const uint64_t* >( &inData[ i * 8 ] ); list[ i ] = val; diff --git a/src/world/Manager/TerritoryMgr.cpp b/src/world/Manager/TerritoryMgr.cpp index 5d834595..5502409a 100644 --- a/src/world/Manager/TerritoryMgr.cpp +++ b/src/world/Manager/TerritoryMgr.cpp @@ -26,7 +26,8 @@ using namespace Sapphire; using namespace Sapphire::World::Manager; TerritoryMgr::TerritoryMgr() : - m_lastInstanceId( 10000 ) + m_lastInstanceId( 10000 ), + m_inRangeDistance( 0 ) { } diff --git a/src/world/Network/Handlers/CommonListHandler.cpp b/src/world/Network/Handlers/CommonListHandler.cpp index 466f3706..23e5cd06 100644 --- a/src/world/Network/Handlers/CommonListHandler.cpp +++ b/src/world/Network/Handlers/CommonListHandler.cpp @@ -78,7 +78,7 @@ void Sapphire::Network::GameConnection::getCommonlistHandler( const Packets::FFX const size_t itemsPerPage = 10; // this func paginates any commonlist entry, associating them with online player data and hierarchy ID (optional) - auto generateEntries = [&]( const auto& idVec, size_t offset, const std::vector< Common::HierarchyData >& hierarchyVec ) -> std::vector< PlayerEntry > + auto generateEntries = [ & ]( const auto& idVec, size_t offset, const std::vector< Common::HierarchyData >& hierarchyVec ) -> std::vector< PlayerEntry > { std::vector< PlayerEntry > entries; diff --git a/src/world/Network/Handlers/PacketCommandHandler.cpp b/src/world/Network/Handlers/PacketCommandHandler.cpp index 627e1a09..4f8e9c8d 100644 --- a/src/world/Network/Handlers/PacketCommandHandler.cpp +++ b/src/world/Network/Handlers/PacketCommandHandler.cpp @@ -447,10 +447,9 @@ void Sapphire::Network::GameConnection::commandHandler( const Packets::FFXIVARR_ } case PacketCommand::TARGET_DECIDE: // Change target { - uint64_t targetId = param1; - if( targetId == player.getTargetId() || targetId == 0xE0000000 ) + if( targetId == player.getTargetId() || targetId == Common::INVALID_GAME_OBJECT_ID ) targetId = 0; player.changeTarget( targetId ); diff --git a/src/world/Network/Handlers/PacketHandlers.cpp b/src/world/Network/Handlers/PacketHandlers.cpp index 1cc700d5..ddb9f7de 100644 --- a/src/world/Network/Handlers/PacketHandlers.cpp +++ b/src/world/Network/Handlers/PacketHandlers.cpp @@ -641,7 +641,7 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA auto& server = Common::Service< World::WorldServer >::ref(); // Loop over all slots - for (int slot = 0; slot < 14; slot++ ) + for( int slot = 0; slot < 14; ++slot ) { const auto fromSlot = packet.data().containerIndex[ slot ]; const auto fromContainer = packet.data().storageId[ slot ]; @@ -659,19 +659,19 @@ void Sapphire::Network::GameConnection::gearSetEquip( const Packets::FFXIVARR_PA ackPacket->data().operationType = operationType; server.queueForPlayer( player.getCharacterId(), ackPacket ); - if ( fromItem && equippedItem ) + if( fromItem && equippedItem ) { player.swapItem( fromContainer, fromSlot, Common::GearSet0, slot ); server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), fromSlot, fromContainer, *equippedItem, 0 ) ); server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, *fromItem, 0 ) ); } - else if ( fromItem && !equippedItem ) + else if( fromItem && !equippedItem ) { player.moveItem( fromContainer, fromSlot, Common::GearSet0, slot ); server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), fromSlot, fromContainer, 0 ) ); server.queueForPlayer( player.getCharacterId(), std::make_shared< UpdateInventorySlotPacket >( player.getId(), slot, Common::GearSet0, *fromItem, 0 ) ); } - else if ( !fromItem && equippedItem ) + else if( !fromItem && equippedItem ) { auto containerId = World::Manager::ItemMgr::getCharaEquipSlotCategoryToArmoryId( static_cast< Common::EquipSlotCategory >( equippedItem->getSlot() ) ); auto freeSlot = player.getFreeContainerSlot( containerId ).second; diff --git a/src/world/Network/PacketWrappers/PcPartyUpdatePacket.h b/src/world/Network/PacketWrappers/PcPartyUpdatePacket.h index 57261ed8..ec6add44 100644 --- a/src/world/Network/PacketWrappers/PcPartyUpdatePacket.h +++ b/src/world/Network/PacketWrappers/PcPartyUpdatePacket.h @@ -7,15 +7,6 @@ namespace Sapphire::Network::Packets::WorldPackets::Server { - uint64_t ExecuteCharacterID; - uint64_t TargetCharacterID; - uint8_t ExecuteIdentity; - uint8_t TargetIdentity; - uint8_t UpdateStatus; - uint8_t Count; - char ExecuteCharacterName[32]; - char TargetCharacterName[32]; - class PcPartyUpdatePacket : public ZoneChannelPacket< FFXIVIpcPcPartyUpdate > { public: diff --git a/src/world/Network/PacketWrappers/PlayerSetupPacket.h b/src/world/Network/PacketWrappers/PlayerSetupPacket.h index ff505ea0..da562f69 100644 --- a/src/world/Network/PacketWrappers/PlayerSetupPacket.h +++ b/src/world/Network/PacketWrappers/PlayerSetupPacket.h @@ -50,7 +50,7 @@ namespace Sapphire::Network::Packets::WorldPackets::Server memcpy( m_data.Aetheryte, player.getAetheryteArray().data(), sizeof( m_data.Aetheryte ) ); // Set the class levels and exp. - for( uint8_t i = 0; i < 23; i++ ) + for( uint8_t i = 0; i < Common::CLASSJOB_TOTAL; ++i ) { m_data.Lv[ i ] = player.getClassArray()[ i ]; m_data.Exp[ i ] = player.getExpArray()[ i ]; diff --git a/src/world/WorldServer.cpp b/src/world/WorldServer.cpp index a0997aae..1b06ac5c 100644 --- a/src/world/WorldServer.cpp +++ b/src/world/WorldServer.cpp @@ -60,7 +60,8 @@ WorldServer::WorldServer( const std::string& configName ) : m_configName( configName ), m_bRunning( true ), m_lastDBPingTime( 0 ), - m_worldId( 67 ) + m_worldId( 67 ), + m_port( 0 ) { } From 92861799f8ee59c01b8ca588ac3d232ecddc17ac Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Sat, 19 Feb 2022 23:53:42 -0300 Subject: [PATCH 3/4] add templated int and real distribution to rngmgr; add func to return amount of random values; support untyped value deduction; use typed min/max ranges for unspecified type; --- src/world/Manager/DebugCommandMgr.cpp | 10 ++++++ src/world/Manager/RNGMgr.h | 50 ++++++++++++++++++++++++--- src/world/WorldServer.cpp | 6 ++-- 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 61613421..115cd714 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -45,6 +45,7 @@ #include "WorldServer.h" #include "Session.h" +#include using namespace Sapphire::Network; using namespace Sapphire::Network::Packets; @@ -177,6 +178,15 @@ void DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< if( ( ( subCommand == "pos" ) || ( subCommand == "posr" ) ) && ( params != "" ) ) { + auto& rngMgr = Common::Service< RNGMgr >::ref(); + auto state = rngMgr.getRandGenerator( 0, 10 ); + auto arr = state.nextCount< 10 >(); + + for( auto val : arr ) + { + Logger::info( std::to_string( val ) ); + } + int32_t posX; int32_t posY; int32_t posZ; diff --git a/src/world/Manager/RNGMgr.h b/src/world/Manager/RNGMgr.h index e7661624..57e9570c 100644 --- a/src/world/Manager/RNGMgr.h +++ b/src/world/Manager/RNGMgr.h @@ -8,6 +8,7 @@ #include #include #include +#include namespace Sapphire::World::Manager { @@ -19,24 +20,47 @@ namespace Sapphire::World::Manager { public: RandGenerator( std::shared_ptr< std::mt19937 > pEngine, T minRange = std::numeric_limits< T >::min(), T maxRange = std::numeric_limits< T >::max() ) - : m_engine( pEngine ), m_dist( minRange, maxRange ) + : m_engine( pEngine ), m_fpuDist( minRange, maxRange ), m_intDist( minRange, maxRange ) { } + // returns a single value for T type on set ranges, deducing real or integer distribution from given numeric type T next() { - return m_dist( *m_engine ); + if constexpr( std::is_integral< T >::value ) + return m_intDist( *m_engine ); + + return m_fpuDist( *m_engine ); } - private: - std::uniform_real_distribution< T > m_dist; + // returns an array of size nSize with values type T on set ranges, deducing real or integer distribution from given numeric type + template< std::size_t nSize > + const std::array< T, nSize > nextCount() + { + std::array< T, nSize > _valPush; + + for( auto i = 0; i < nSize; ++i ) + { + if constexpr( std::is_integral< T >::value ) + _valPush[ i ] = ( m_intDist( *m_engine ) ); + else + _valPush[ i ] = ( m_fpuDist( *m_engine ) ); + } + + return _valPush; + } + + protected: + std::uniform_real_distribution<> m_fpuDist; + std::uniform_int_distribution<> m_intDist; std::shared_ptr< std::mt19937 > m_engine; }; class RNGMgr { public: + // Constructs a manager to supply states for random integer and float distribution using a Mersenne Twister engine RNGMgr() { m_engine = std::make_shared< std::mt19937 >( *engineSeed< std::mt19937::state_size >() ); @@ -48,7 +72,7 @@ namespace Sapphire::World::Manager RNGMgr& operator=( const RNGMgr& pRNGMgr ) = delete; /*! - * @brief Creates a RNG with specified parameters for multiple uses + * @brief Creates a state with specified parameters for multiple uses * @tparam Numeric type to be used for the generator * @param Minimum value possible for the random value * @param Maximum value possible for the random value @@ -60,6 +84,17 @@ namespace Sapphire::World::Manager return RandGenerator< T >( m_engine, minRange, maxRange ); } + /*! + * @brief Creates a state with only typed data arithmetic range + * @tparam Numeric type to be used for the generator and range (::min(), ::max() of numeric type) + * @return Random number generator object + */ + template< typename T, typename = typename std::enable_if< std::is_arithmetic< T >::value, T >::type > + RandGenerator< T > getRandGenerator() + { + return RandGenerator< T >( m_engine ); + } + private: template< std::size_t STATE_SIZE > @@ -70,6 +105,11 @@ namespace Sapphire::World::Manager std::array< uint32_t, STATE_SIZE > seedArray; std::random_device rd; + // check if kernel can supply sufficiently non-deterministic output + + if( rd.entropy() == 0.f ) + Logger::error( "Kernel random device entropy reported zero - Random number generator may be poor quality" ); + std::generate_n( seedArray.data(), seedArray.size(), std::ref( rd ) ); auto pSeq = std::make_unique< std::seed_seq >( std::begin( seedArray ), std::end( seedArray ) ); diff --git a/src/world/WorldServer.cpp b/src/world/WorldServer.cpp index 1b06ac5c..5c49ebd3 100644 --- a/src/world/WorldServer.cpp +++ b/src/world/WorldServer.cpp @@ -163,6 +163,9 @@ void WorldServer::run( int32_t argc, char* argv[] ) } Common::Service< Db::DbWorkerPool< Db::ZoneDbConnection > >::set( pDb ); + auto pRNGMgr = std::make_shared< Manager::RNGMgr >(); + Common::Service< Manager::RNGMgr >::set( pRNGMgr ); + Logger::info( "Loading all players" ); if( !loadPlayers() ) { @@ -193,9 +196,6 @@ void WorldServer::run( int32_t argc, char* argv[] ) auto pNaviMgr = std::make_shared< Manager::NaviMgr >(); Common::Service< Manager::NaviMgr >::set( pNaviMgr ); - auto pRNGMgr = std::make_shared< Manager::RNGMgr >(); - Common::Service< Manager::RNGMgr >::set( pRNGMgr ); - Logger::info( "TerritoryMgr: Setting up zones" ); auto pTeriMgr = std::make_shared< Manager::TerritoryMgr >(); auto pHousingMgr = std::make_shared< Manager::HousingMgr >(); From becbc4d54f0754d2d8fbb986f17394dc2debbb26 Mon Sep 17 00:00:00 2001 From: Alice Ogeda Date: Sat, 19 Feb 2022 23:54:21 -0300 Subject: [PATCH 4/4] remove debug to test rngmgr; --- src/world/Manager/DebugCommandMgr.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/world/Manager/DebugCommandMgr.cpp b/src/world/Manager/DebugCommandMgr.cpp index 115cd714..28f261ce 100644 --- a/src/world/Manager/DebugCommandMgr.cpp +++ b/src/world/Manager/DebugCommandMgr.cpp @@ -178,15 +178,6 @@ void DebugCommandMgr::set( char* data, Entity::Player& player, std::shared_ptr< if( ( ( subCommand == "pos" ) || ( subCommand == "posr" ) ) && ( params != "" ) ) { - auto& rngMgr = Common::Service< RNGMgr >::ref(); - auto state = rngMgr.getRandGenerator( 0, 10 ); - auto arr = state.nextCount< 10 >(); - - for( auto val : arr ) - { - Logger::info( std::to_string( val ) ); - } - int32_t posX; int32_t posY; int32_t posZ;