From 6e52a635260ba7db06c0f67ab491047984670eec Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 26 Mar 2019 00:04:27 +0100 Subject: [PATCH] Load hunting log data --- src/common/Common.h | 6 ++++++ src/common/Database/ZoneDbConnection.cpp | 8 ++++++++ src/common/Database/ZoneDbConnection.h | 1 + src/world/Actor/Chara.h | 3 ++- src/world/Actor/Player.cpp | 6 ++++++ src/world/Actor/Player.h | 7 +++++++ src/world/Actor/PlayerSql.cpp | 22 +++++++++++++++++++++- 7 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 078c6420..0cdb95bc 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -263,6 +263,12 @@ namespace Sapphire::Common }; + struct HuntingLogEntry + { + uint8_t rank; + uint8_t entries[10][4]; + }; + enum class UnlockEntry : uint16_t { Return = 1, diff --git a/src/common/Database/ZoneDbConnection.cpp b/src/common/Database/ZoneDbConnection.cpp index a5503d0e..3c21167d 100644 --- a/src/common/Database/ZoneDbConnection.cpp +++ b/src/common/Database/ZoneDbConnection.cpp @@ -200,6 +200,14 @@ void Sapphire::Db::ZoneDbConnection::doPrepareStatements() " WHERE CharacterId = ?;", CONNECTION_ASYNC ); + /// CLASS INFO + prepareStatement( CHARA_MONSTERNOTE_SEL, "SELECT Category_0, Category_1, Category_2, " + "Category_3, Category_4, Category_5, " + "Category_6, Category_7, Category_8, " + "Category_9, Category_10, Category_11 FROM charamonsternote " + "WHERE CharacterId = ?;", + CONNECTION_SYNC ); + /// ZONE QUERIES prepareStatement( ZONE_SEL_BNPCTEMPLATES, "SELECT Id, Name, bNPCBaseId, bNPCNameId, mainWeaponModel, " diff --git a/src/common/Database/ZoneDbConnection.h b/src/common/Database/ZoneDbConnection.h index 4b094772..a705aef8 100644 --- a/src/common/Database/ZoneDbConnection.h +++ b/src/common/Database/ZoneDbConnection.h @@ -78,6 +78,7 @@ namespace Sapphire::Db CHARA_MONSTERNOTE_INS, CHARA_MONSTERNOTE_UP, + CHARA_MONSTERNOTE_SEL, ZONE_SEL_BNPCTEMPLATES, ZONE_SEL_SPAWNGROUPS, diff --git a/src/world/Actor/Chara.h b/src/world/Actor/Chara.h index d2110ff8..eb5e5b45 100644 --- a/src/world/Actor/Chara.h +++ b/src/world/Actor/Chara.h @@ -8,6 +8,7 @@ #include #include #include +#include namespace Sapphire::Entity { @@ -66,7 +67,7 @@ namespace Sapphire::Entity } m_baseStats; // array for bonuses, 80 to have some spare room. - uint32_t m_bonusStats[ 80 ]; + std::array< uint32_t, 80 > m_bonusStats; protected: char m_name[34]; diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 9555a74a..7328fdf7 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -1976,3 +1976,9 @@ void Sapphire::Entity::Player::sendLandFlagsSlot( Common::LandFlagsSlot slot ) queuePacket( landFlags ); } + +Sapphire::Common::HuntingLogEntry& Sapphire::Entity::Player::getHuntingLogEntry( uint8_t index ) +{ + assert( index < m_huntingLogEntries.size() ); + return m_huntingLogEntries[ index ]; +} diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 667cac1b..2827ffee 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -11,6 +11,7 @@ #include "Event/EventHandler.h" #include #include +#include namespace Sapphire::Entity { @@ -705,6 +706,9 @@ namespace Sapphire::Entity /*! load search info */ bool loadSearchInfo(); + /*! load hunting log entries */ + bool loadHuntingLog(); + // Player Network Handling ////////////////////////////////////////////////////////////////////////////////////////////////////// /*! send current models ( equipment ) */ @@ -960,6 +964,7 @@ namespace Sapphire::Entity Sapphire::ItemPtr dropInventoryItem( Common::InventoryType type, uint16_t slotId ); + Common::HuntingLogEntry& getHuntingLogEntry( uint8_t index ); ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1092,6 +1097,8 @@ namespace Sapphire::Entity Util::SpawnIndexAllocator< uint8_t > m_objSpawnIndexAllocator; Util::SpawnIndexAllocator< uint8_t > m_actorSpawnIndexAllocator; + + std::array< Common::HuntingLogEntry, 12 > m_huntingLogEntries; }; } diff --git a/src/world/Actor/PlayerSql.cpp b/src/world/Actor/PlayerSql.cpp index 87ded6cb..a68c475a 100644 --- a/src/world/Actor/PlayerSql.cpp +++ b/src/world/Actor/PlayerSql.cpp @@ -205,7 +205,7 @@ bool Sapphire::Entity::Player::load( uint32_t charId, World::SessionPtr pSession m_pCell = nullptr; - if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() ) + if( !loadActiveQuests() || !loadClassData() || !loadSearchInfo() || loadHuntingLog() ) Logger::error( "Player #{0} data corrupt!", char_id_str ); m_maxHp = getMaxHp(); @@ -334,6 +334,26 @@ bool Sapphire::Entity::Player::loadSearchInfo() } +bool Sapphire::Entity::Player::loadHuntingLog() +{ + auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); + auto stmt = pDb->getPreparedStatement( Db::ZoneDbStatements::CHARA_MONSTERNOTE_SEL ); + stmt->setUInt( 1, m_id ); + auto res = pDb->query( stmt ); + + if( !res->next() ) + return false; + + for( auto i = 0; i < 12; ++i ) + { + std::string catStr = fmt::format( "Category_{}", i ); + auto cat = res->getBlobVector( catStr ); + m_huntingLogEntries[i].rank = cat[0]; + memcpy( reinterpret_cast< char* >( m_huntingLogEntries[i].entries ), cat.data() + 1, cat.size() - 1 ); + } + return true; +} + void Sapphire::Entity::Player::updateSql() { auto pDb = m_pFw->get< Db::DbWorkerPool< Db::ZoneDbConnection > >();