diff --git a/src/world/Manager/AchievementMgr.h b/src/world/Manager/AchievementMgr.h index 9b65ec22..f7a5a063 100644 --- a/src/world/Manager/AchievementMgr.h +++ b/src/world/Manager/AchievementMgr.h @@ -20,12 +20,42 @@ namespace Sapphire::World::Manager bool cacheAchievements(); + /// + /// progress an achievement by its given properties + /// each type has a specific logic for progress, attention should be given to the type being passed + /// optional parameter for overriding the amount to increment a given progress by + /// + /// example usage for Achievement::Type::General: + /// + /// To Crush Your Enemies I + /// Defeat 100 enemies. + /// + /// type (col[7]): 1 -> Common::Achievement::Type::General + /// subtype (col[8]): 11 -> Common::Achievement::GeneralSubtype::EnemyDefeatCount + /// + /// progressAchievementByType< Common::Achievement::Type::General >( player, GeneralSubtype::EnemyDefeatCount ); + /// + /// example usage for Achievement::Type::ClassJob: + /// + /// progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( player.getClass() ) ); + /// + /// + /// + /// + /// + /// template < auto AchievementType > void progressAchievementByType( Entity::Player& player, int32_t argument, uint32_t progressCount = 1 ) { progressAchievement< decltype( AchievementType ), AchievementType >( player, argument, progressCount ); } + /// + /// check if player has an achievement by its given id + /// + /// + /// + /// true/false bool hasAchievementUnlocked( Entity::Player& player, uint32_t achievementId ); void unlockAchievement( Entity::Player& player, uint32_t achievementId ); @@ -50,8 +80,19 @@ namespace Sapphire::World::Manager const std::vector< uint32_t >& getAchievementIdByType( Common::Achievement::Type type ) const; const std::vector< uint32_t >& getAchievementIdByType( uint32_t type ) const; + /// + /// get a key for merged achievements (type:subtype) that have progress data + /// + /// + /// + /// data key for given type:subtype Common::AchievementDataKey getKeyFromType( Common::Achievement::Type achvType, int32_t argument ); + /// + /// parse and unlock achievements linked to a given achievement Id + /// + /// + /// void handleLinkedAchievementsForId( Entity::Player& player, uint32_t achievementId ); template< typename AchievementTypeT, AchievementTypeT achievementType > @@ -90,7 +131,7 @@ namespace Sapphire::World::Manager } template<> - inline void AchievementMgr::progressAchievement< Common::Achievement::Type, Common::Achievement::Type::Classjob >( Entity::Player& player, int32_t classJob, uint32_t level ) + inline void AchievementMgr::progressAchievement< Common::Achievement::Type, Common::Achievement::Type::Classjob >( Entity::Player& player, int32_t classJob, uint32_t unused ) { auto& achvDataList = player.getAchievementDataList(); @@ -99,6 +140,8 @@ namespace Sapphire::World::Manager if( !achvDataList.count( dataKey.u32 ) ) achvDataList[ dataKey.u32 ] = 0; + auto level = player.getLevelForClass( static_cast< Common::ClassJob >( classJob ) ); + achvDataList[ dataKey.u32 ] = level; const auto achvIdList = getAchievementIdByType( dataKey.u32 ); diff --git a/src/world/Manager/PlayerMgr.cpp b/src/world/Manager/PlayerMgr.cpp index af75c277..a1fd6666 100644 --- a/src/world/Manager/PlayerMgr.cpp +++ b/src/world/Manager/PlayerMgr.cpp @@ -175,7 +175,7 @@ void PlayerMgr::onLevelUp( Entity::Player& player ) player.getLevel(), player.getLevel() - 1 ), true ); auto& achvMgr = Common::Service< World::Manager::AchievementMgr >::ref(); - achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint8_t >( player.getClass() ), player.getLevel() ); + achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( player.getClass() ) ); } void PlayerMgr::onSetLevelForClass( Entity::Player& player, Common::ClassJob classJob ) @@ -186,7 +186,7 @@ void PlayerMgr::onSetLevelForClass( Entity::Player& player, Common::ClassJob cla server.queueForPlayer( player.getCharacterId(), makeActorControlSelf( player.getId(), Network::ActorControl::ClassJobUpdate, static_cast< uint8_t >( classJob ), player.getLevelForClass( classJob ) ) ); - achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint8_t >( classJob ), player.getLevel() ); + achvMgr.progressAchievementByType< Common::Achievement::Type::Classjob >( player, static_cast< uint32_t >( classJob ) ); }