diff --git a/deps/datReaderPs3/zlib.h b/deps/datReaderPs3/zlib.h index cacfc077..aecfd040 100644 --- a/deps/datReaderPs3/zlib.h +++ b/deps/datReaderPs3/zlib.h @@ -2,6 +2,7 @@ #define XIV_UTILS_ZLIB_H #include +#include #include namespace xivps3::utils::zlib 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/common/Util/UtilMath.cpp b/src/common/Util/UtilMath.cpp index 4dd3b60e..b2255bac 100644 --- a/src/common/Util/UtilMath.cpp +++ b/src/common/Util/UtilMath.cpp @@ -139,7 +139,7 @@ float Util::trunc( float value, uint8_t digitsToRemain ) if( digitsToRemain == 0 ) return std::floor( value ); - float factor = std::powf( 10, digitsToRemain ); + float factor = std::pow( 10, digitsToRemain ); return std::floor( value * factor ) / factor; } diff --git a/src/scripts/quest/classquest/ARC/ClsArc998.cpp b/src/scripts/quest/classquest/ARC/ClsArc998.cpp index ff25ec8f..5336c45e 100644 --- a/src/scripts/quest/classquest/ARC/ClsArc998.cpp +++ b/src/scripts/quest/classquest/ARC/ClsArc998.cpp @@ -89,7 +89,7 @@ private: void Scene00001( World::Quest &quest, Entity::Player &player ) { - eventMgr().playQuestScene( player, getId(), 1, FADE_OUT | HIDE_UI, bindSceneReturn( &ClsArc998::Scene00001Return ) ); + eventMgr().playQuestScene( player, getId(), 1, FADE_OUT | HIDE_UI | DISABLE_SKIP, bindSceneReturn( &ClsArc998::Scene00001Return ) ); } void Scene00001Return( World::Quest &quest, Entity::Player &player, const Event::SceneResult &result ) @@ -98,6 +98,8 @@ private: if( result.getResult( 0 ) == 1 ) { player.finishQuest( getId() ); + player.setLevelForClass( 1, Sapphire::Common::ClassJob::Archer ); + player.setMaxGearSets( player.getMaxGearSets() + 1 ); } } }; diff --git a/src/scripts/quest/classquest/ARC/ClsArc999.cpp b/src/scripts/quest/classquest/ARC/ClsArc999.cpp index 18175b88..44a9a7e0 100644 --- a/src/scripts/quest/classquest/ARC/ClsArc999.cpp +++ b/src/scripts/quest/classquest/ARC/ClsArc999.cpp @@ -56,7 +56,7 @@ private: void Scene00000( World::Quest &quest, Entity::Player &player ) { - eventMgr().playQuestScene( player, getId(), 0, NONE, bindSceneReturn( &ClsArc999::Scene00000Return ) ); + eventMgr().playQuestScene( player, getId(), 0, HIDE_HOTBAR, bindSceneReturn( &ClsArc999::Scene00000Return ) ); } void Scene00000Return( World::Quest &quest, Entity::Player &player, const Event::SceneResult &result ) @@ -64,7 +64,6 @@ private: if( result.getResult( 0 ) == 1 ) { player.finishQuest( getId(), 0 ); - player.setLevelForClass( 1, Sapphire::Common::ClassJob::Archer ); } } }; 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() );