1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 06:47:45 +00:00

Merge pull request #752 from Skyliegirl33/gearset-implementation

[3.x] Support for unlocking gear sets, updating job status, fix compile issues and Archer quest
This commit is contained in:
Mordred 2022-01-14 20:05:40 +01:00 committed by GitHub
commit d245dcfd2f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 34 additions and 5 deletions

View file

@ -2,6 +2,7 @@
#define XIV_UTILS_ZLIB_H #define XIV_UTILS_ZLIB_H
#include <cstdint> #include <cstdint>
#include <cstddef>
#include <vector> #include <vector>
namespace xivps3::utils::zlib namespace xivps3::utils::zlib

View file

@ -30,6 +30,8 @@ namespace Sapphire::Network::ActorControl
DefeatMsg = 0x06, DefeatMsg = 0x06,
GainExpMsg = 0x07, GainExpMsg = 0x07,
ClassJobUpdate = 0x9,
LevelUpEffect = 0x0A, LevelUpEffect = 0x0A,
ExpChainMsg = 0x0C, ExpChainMsg = 0x0C,

View file

@ -139,7 +139,7 @@ float Util::trunc( float value, uint8_t digitsToRemain )
if( digitsToRemain == 0 ) if( digitsToRemain == 0 )
return std::floor( value ); return std::floor( value );
float factor = std::powf( 10, digitsToRemain ); float factor = std::pow( 10, digitsToRemain );
return std::floor( value * factor ) / factor; return std::floor( value * factor ) / factor;
} }

View file

@ -89,7 +89,7 @@ private:
void Scene00001( World::Quest &quest, Entity::Player &player ) 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 ) void Scene00001Return( World::Quest &quest, Entity::Player &player, const Event::SceneResult &result )
@ -98,6 +98,8 @@ private:
if( result.getResult( 0 ) == 1 ) if( result.getResult( 0 ) == 1 )
{ {
player.finishQuest( getId() ); player.finishQuest( getId() );
player.setLevelForClass( 1, Sapphire::Common::ClassJob::Archer );
player.setMaxGearSets( player.getMaxGearSets() + 1 );
} }
} }
}; };

View file

@ -56,7 +56,7 @@ private:
void Scene00000( World::Quest &quest, Entity::Player &player ) 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 ) void Scene00000Return( World::Quest &quest, Entity::Player &player, const Event::SceneResult &result )
@ -64,7 +64,6 @@ private:
if( result.getResult( 0 ) == 1 ) if( result.getResult( 0 ) == 1 )
{ {
player.finishQuest( getId(), 0 ); player.finishQuest( getId(), 0 );
player.setLevelForClass( 1, Sapphire::Common::ClassJob::Archer );
} }
} }
}; };

View file

@ -922,6 +922,8 @@ void Sapphire::Entity::Player::setLevelForClass( uint8_t level, Common::ClassJob
insertDbClass( classJobIndex, level ); insertDbClass( classJobIndex, level );
m_classArray[ classJobIndex ] = level; m_classArray[ classJobIndex ] = level;
queuePacket( makeActorControlSelf( getId(), Network::ActorControl::ClassJobUpdate, static_cast< uint8_t >( classjob ), level ) );
} }
void Sapphire::Entity::Player::sendModel() void Sapphire::Entity::Player::sendModel()
@ -1427,6 +1429,18 @@ void Sapphire::Entity::Player::setTitle( uint16_t titleId )
sendToInRangeSet( makeActorControl( getId(), SetTitle, titleId ), true ); 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 ) void Sapphire::Entity::Player::setEquipDisplayFlags( uint16_t state )
{ {
m_equipDisplayFlags = static_cast< uint8_t >( state ); m_equipDisplayFlags = static_cast< uint8_t >( state );
@ -1601,6 +1615,7 @@ void Sapphire::Entity::Player::sendZonePackets()
if( isLogin() ) if( isLogin() )
{ {
queuePacket( makeActorControlSelf( getId(), SetCharaGearParamUI, m_equipDisplayFlags, 1 ) ); 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 ) // set flags, will be reset automatically by zoning ( only on client side though )

View file

@ -396,6 +396,12 @@ namespace Sapphire::Entity
/*! send the players title list */ /*! send the players title list */
void sendTitleList(); 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 */ /*! change gear param state */
void setEquipDisplayFlags( uint16_t state ); void setEquipDisplayFlags( uint16_t state );
@ -866,6 +872,8 @@ namespace Sapphire::Entity
uint8_t m_voice{}; uint8_t m_voice{};
uint8_t m_equippedMannequin;
uint64_t m_modelMainWeapon; uint64_t m_modelMainWeapon;
uint64_t m_modelSubWeapon; uint64_t m_modelSubWeapon;
uint64_t m_modelSystemWeapon{}; uint64_t m_modelSystemWeapon{};

View file

@ -102,6 +102,8 @@ bool Sapphire::Entity::Player::loadFromDb( uint64_t characterId )
m_gmRank = res->getUInt8( "GMRank" ); m_gmRank = res->getUInt8( "GMRank" );
m_equippedMannequin = res->getUInt8( "EquippedMannequin" );
m_equipDisplayFlags = res->getUInt8( "EquipDisplayFlags" ); m_equipDisplayFlags = res->getUInt8( "EquipDisplayFlags" );
m_pose = res->getUInt8( "Pose" ); m_pose = res->getUInt8( "Pose" );
@ -395,7 +397,7 @@ void Sapphire::Entity::Player::updateDbChara() const
memcpy( orchestrionVec.data(), m_orchestrion.data(), m_orchestrion.size() ); memcpy( orchestrionVec.data(), m_orchestrion.data(), m_orchestrion.size() );
stmt->setBinary( 42, mountsVec ); stmt->setBinary( 42, mountsVec );
stmt->setInt( 44, 0 ); // EquippedMannequin stmt->setInt( 44, m_equippedMannequin ); // EquippedMannequin
stmt->setInt( 45, 0 ); // DisplayFlags stmt->setInt( 45, 0 ); // DisplayFlags
std::vector< uint8_t > questCompleteVec( m_questCompleteFlags.size() ); std::vector< uint8_t > questCompleteVec( m_questCompleteFlags.size() );