diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 5128f4e8..638d6415 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -30,6 +30,8 @@ namespace Sapphire::Network::ActorControl DefeatMsg = 0x06, GainExpMsg = 0x07, + ClassJobUpdate = 0x9, + LevelUpEffect = 0x0A, ExpChainMsg = 0x0C, diff --git a/src/world/Actor/Player.cpp b/src/world/Actor/Player.cpp index 3e419086..e53d7fb8 100644 --- a/src/world/Actor/Player.cpp +++ b/src/world/Actor/Player.cpp @@ -922,6 +922,8 @@ void Sapphire::Entity::Player::setLevelForClass( uint8_t level, Common::ClassJob insertDbClass( classJobIndex, level ); m_classArray[ classJobIndex ] = level; + + queuePacket( makeActorControlSelf( getId(), Network::ActorControl::ClassJobUpdate, static_cast< uint8_t >( classjob ), level ) ); } void Sapphire::Entity::Player::sendModel() @@ -1427,6 +1429,18 @@ void Sapphire::Entity::Player::setTitle( uint16_t titleId ) sendToInRangeSet( makeActorControl( getId(), SetTitle, titleId ), true ); } +void Sapphire::Entity::Player::setMaxGearSets( uint8_t amount ) +{ + m_equippedMannequin = amount; + + queuePacket( makeActorControlSelf( getId(), SetMaxGearSets, m_equippedMannequin ) ); +} + +uint8_t Sapphire::Entity::Player::getMaxGearSets() const +{ + return m_equippedMannequin; +} + void Sapphire::Entity::Player::setEquipDisplayFlags( uint16_t state ) { m_equipDisplayFlags = static_cast< uint8_t >( state ); @@ -1601,6 +1615,7 @@ void Sapphire::Entity::Player::sendZonePackets() if( isLogin() ) { queuePacket( makeActorControlSelf( getId(), SetCharaGearParamUI, m_equipDisplayFlags, 1 ) ); + queuePacket( makeActorControlSelf( getId(), SetMaxGearSets, m_equippedMannequin ) ); } // set flags, will be reset automatically by zoning ( only on client side though ) diff --git a/src/world/Actor/Player.h b/src/world/Actor/Player.h index 934f7297..12dec010 100644 --- a/src/world/Actor/Player.h +++ b/src/world/Actor/Player.h @@ -396,6 +396,12 @@ namespace Sapphire::Entity /*! send the players title list */ void sendTitleList(); + /*! set number of gear sets */ + void setMaxGearSets( uint8_t amount ); + + /*! get number of gear sets */ + uint8_t getMaxGearSets() const; + /*! change gear param state */ void setEquipDisplayFlags( uint16_t state ); @@ -866,6 +872,8 @@ namespace Sapphire::Entity uint8_t m_voice{}; + uint8_t m_equippedMannequin; + uint64_t m_modelMainWeapon; uint64_t m_modelSubWeapon; uint64_t m_modelSystemWeapon{}; diff --git a/src/world/Actor/PlayerSql.cpp b/src/world/Actor/PlayerSql.cpp index f9dee2eb..d71f3f48 100644 --- a/src/world/Actor/PlayerSql.cpp +++ b/src/world/Actor/PlayerSql.cpp @@ -102,6 +102,8 @@ bool Sapphire::Entity::Player::loadFromDb( uint64_t characterId ) m_gmRank = res->getUInt8( "GMRank" ); + m_equippedMannequin = res->getUInt8( "EquippedMannequin" ); + m_equipDisplayFlags = res->getUInt8( "EquipDisplayFlags" ); m_pose = res->getUInt8( "Pose" ); @@ -395,7 +397,7 @@ void Sapphire::Entity::Player::updateDbChara() const memcpy( orchestrionVec.data(), m_orchestrion.data(), m_orchestrion.size() ); stmt->setBinary( 42, mountsVec ); - stmt->setInt( 44, 0 ); // EquippedMannequin + stmt->setInt( 44, m_equippedMannequin ); // EquippedMannequin stmt->setInt( 45, 0 ); // DisplayFlags std::vector< uint8_t > questCompleteVec( m_questCompleteFlags.size() );