From 1c8ca42d6c7af31a0cac6f7934cd9a19bf59ab1d Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 13 Apr 2019 22:41:29 +1000 Subject: [PATCH] use prepared statement for item loading, network item stain --- src/common/Database/ZoneDbConnection.cpp | 6 ++++++ src/common/Database/ZoneDbConnection.h | 1 + src/world/Actor/PlayerInventory.cpp | 14 ++++++++++++-- src/world/Actor/PlayerSql.cpp | 6 ++++++ src/world/Manager/ItemMgr.cpp | 13 ++++++++++--- .../Network/PacketWrappers/PlayerSpawnPacket.h | 2 +- 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/common/Database/ZoneDbConnection.cpp b/src/common/Database/ZoneDbConnection.cpp index 3c21167d..cceea22f 100644 --- a/src/common/Database/ZoneDbConnection.cpp +++ b/src/common/Database/ZoneDbConnection.cpp @@ -175,6 +175,12 @@ void Sapphire::Db::ZoneDbConnection::doPrepareStatements() "INSERT INTO charaglobalitem ( CharacterId, ItemId, catalogId, stack, UPDATE_DATE ) VALUES ( ?, ?, ?, ?, NOW() );", CONNECTION_SYNC ); + prepareStatement( CHARA_ITEMGLOBAL_SELECT, + "SELECT catalogId, stack, reservedFlag, signatureId, flags, durability, refine, materia_0, materia_1, " + "materia_2, materia_3, materia_4, stain, pattern, buffer_0, buffer_1, buffer_2, buffer_3, buffer_4 " + "FROM charaglobalitem WHERE itemId = ?", + CONNECTION_SYNC ); + /// CHARA MONSTERNOTE prepareStatement( CHARA_MONSTERNOTE_INS, "INSERT INTO charamonsternote ( CharacterId, Category_0, Category_1, Category_2," diff --git a/src/common/Database/ZoneDbConnection.h b/src/common/Database/ZoneDbConnection.h index a705aef8..93bacc23 100644 --- a/src/common/Database/ZoneDbConnection.h +++ b/src/common/Database/ZoneDbConnection.h @@ -72,6 +72,7 @@ namespace Sapphire::Db CHARA_ITEMINV_INS, + CHARA_ITEMGLOBAL_SELECT, CHARA_ITEMGLOBAL_INS, CHARA_ITEMGLOBAL_UP, CHARA_ITEMGLOBAL_DELETE, diff --git a/src/world/Actor/PlayerInventory.cpp b/src/world/Actor/PlayerInventory.cpp index f24cce2d..97fec07b 100644 --- a/src/world/Actor/PlayerInventory.cpp +++ b/src/world/Actor/PlayerInventory.cpp @@ -151,17 +151,25 @@ void Sapphire::Entity::Player::updateModels( GearSetSlot equipSlotId, const Sapp { uint64_t model = pItem->getModelId1(); uint64_t model2 = pItem->getModelId2(); + uint64_t stain = pItem->getStain(); switch( equipSlotId ) { case MainHand: - m_modelMainWeapon = model; + m_modelMainWeapon = model | ( stain << 48 ); + m_modelSubWeapon = model2; + + if( m_modelSubWeapon > 0 ) + { + m_modelSubWeapon = m_modelSubWeapon | ( stain << 48 ); + } + equipWeapon( pItem, updateClass ); break; case OffHand: - m_modelSubWeapon = model; + m_modelSubWeapon = model | ( stain << 48 ); break; case SoulCrystal: @@ -175,6 +183,8 @@ void Sapphire::Entity::Player::updateModels( GearSetSlot equipSlotId, const Sapp auto modelSlot = equipSlotToModelSlot( equipSlotId ); if( modelSlot == GearModelSlot::ModelInvalid ) break; + + model = model | stain << 24; m_modelEquip[ static_cast< uint8_t >( modelSlot ) ] = static_cast< uint32_t >( model ); break; diff --git a/src/world/Actor/PlayerSql.cpp b/src/world/Actor/PlayerSql.cpp index 784c970b..4f5ca3de 100644 --- a/src/world/Actor/PlayerSql.cpp +++ b/src/world/Actor/PlayerSql.cpp @@ -321,7 +321,10 @@ bool Sapphire::Entity::Player::loadSearchInfo() auto res = pDb->query( stmt ); if( !res->next() ) + { + Logger::error( "Failed to load search info for character#{}", m_id ); return false; + } m_searchSelectClass = res->getUInt8( 2 ); m_searchSelectRegion = res->getUInt8( 3 ); @@ -343,7 +346,10 @@ bool Sapphire::Entity::Player::loadHuntingLog() auto res = pDb->query( stmt ); if( !res->next() ) + { + Logger::error( "Failed to load hunting log data for character#{}", m_id ); return false; + } for( auto i = 0; i < 12; ++i ) { diff --git a/src/world/Manager/ItemMgr.cpp b/src/world/Manager/ItemMgr.cpp index efa6a6b8..ed119610 100644 --- a/src/world/Manager/ItemMgr.cpp +++ b/src/world/Manager/ItemMgr.cpp @@ -124,9 +124,14 @@ Sapphire::ItemPtr Sapphire::World::Manager::ItemMgr::loadItem( uint64_t uId ) { auto pExdData = framework()->get< Data::ExdDataGenerated >(); auto pDb = framework()->get< Db::DbWorkerPool< Db::ZoneDbConnection > >(); - // load actual item - auto itemRes = pDb->query( - "SELECT catalogId, stack, flags FROM charaglobalitem WHERE itemId = " + std::to_string( uId ) + ";" ); + + // 1 catalogId, 2 stack, 3 reservedFlag, 4 signatureId, 5 flags, 6 durability, 7 refine, 8 materia_0, 9 materia_1, + // 10 materia_2, 11 materia_3, 12 materia_4, 13 stain, 14 pattern, 15 buffer_0, 16 buffer_1, 17 buffer_2, + // 18 buffer_3, 19 buffer_4 + auto query = pDb->getPreparedStatement( Db::CHARA_ITEMGLOBAL_SELECT ); + query->setUInt64( 1, uId ); + + auto itemRes = pDb->query( query ); if( !itemRes->next() ) return nullptr; @@ -141,6 +146,8 @@ Sapphire::ItemPtr Sapphire::World::Manager::ItemMgr::loadItem( uint64_t uId ) isHq ); pItem->setStackSize( itemRes->getUInt( 2 ) ); + pItem->setStain( itemRes->getUInt16( 13 ) ); + pItem->setDurability( itemRes->getInt16( 6 ) ); return pItem; } diff --git a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h index 7c5363a3..3ca8304e 100644 --- a/src/world/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/world/Network/PacketWrappers/PlayerSpawnPacket.h @@ -46,7 +46,7 @@ namespace Sapphire::Network::Packets::Server auto item = player.getItemAt( Common::GearSet0, Common::GearSetSlot::MainHand ); if( item ) - m_data.mainWeaponModel = item->getModelId1(); + m_data.mainWeaponModel = player.getModelMainWeapon(); m_data.secWeaponModel = player.getModelSubWeapon(); m_data.models[ Common::GearModelSlot::ModelHead ] = player.getModelForSlot( Common::GearModelSlot::ModelHead );