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 ) );
}