mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 01:37:00 +00:00
[7934] Implement ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA
Signed-off-by: VladimirMangos <vladimir@getmangos.com> Also added ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE and support this criteira special cases base at `achievement_criteria_data` that required DB support.
This commit is contained in:
parent
bfafee5263
commit
626553c9ee
4 changed files with 58 additions and 8 deletions
|
|
@ -78,6 +78,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||||
|
|
||||||
switch(criteria->requiredType)
|
switch(criteria->requiredType)
|
||||||
{
|
{
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
|
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
||||||
|
|
@ -90,6 +91,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||||
switch(dataType)
|
switch(dataType)
|
||||||
{
|
{
|
||||||
case ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE:
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE:
|
||||||
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE:
|
||||||
return true;
|
return true;
|
||||||
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE:
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE:
|
||||||
if(!creature.id || !objmgr.GetCreatureTemplate(creature.id))
|
if(!creature.id || !objmgr.GetCreatureTemplate(creature.id))
|
||||||
|
|
@ -174,7 +176,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AchievementCriteriaData::Meets(Player const* source, Unit const* target) const
|
bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, uint32 miscvalue1 /*= 0*/) const
|
||||||
{
|
{
|
||||||
switch(dataType)
|
switch(dataType)
|
||||||
{
|
{
|
||||||
|
|
@ -213,15 +215,17 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target) co
|
||||||
}
|
}
|
||||||
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA:
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA:
|
||||||
return target && target->HasAura(aura.spell_id,aura.effect_idx);
|
return target && target->HasAura(aura.spell_id,aura.effect_idx);
|
||||||
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE:
|
||||||
|
return miscvalue1 >= value.minvalue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target) const
|
bool AchievementCriteriaDataSet::Meets(Player const* source, Unit const* target, uint32 miscvalue /*= 0*/) const
|
||||||
{
|
{
|
||||||
for(Storage::const_iterator itr = storage.begin(); itr != storage.end(); ++itr)
|
for(Storage::const_iterator itr = storage.begin(); itr != storage.end(); ++itr)
|
||||||
if(!itr->Meets(source,target))
|
if(!itr->Meets(source,target,miscvalue))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -289,6 +293,11 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin
|
||||||
achievementCriteria->healing_done.mapid == miscvalue2)
|
achievementCriteria->healing_done.mapid == miscvalue2)
|
||||||
SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET);
|
SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET);
|
||||||
break;
|
break;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // have total statistic also not expected to be reset
|
||||||
|
// reset only the criteria having the miscvalue1 condition
|
||||||
|
if (achievementCriteria->win_rated_arena.flag == miscvalue1)
|
||||||
|
SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET);
|
||||||
|
break;
|
||||||
default: // reset all cases
|
default: // reset all cases
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -924,6 +933,26 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
continue;
|
continue;
|
||||||
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetItemCount(achievementCriteria->own_item.itemID, true));
|
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetItemCount(achievementCriteria->own_item.itemID, true));
|
||||||
break;
|
break;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||||
|
// miscvalue1 contains the personal rating
|
||||||
|
if (!miscvalue1) // no update at login
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// additional requirements
|
||||||
|
if(achievementCriteria->win_rated_arena.flag==ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE)
|
||||||
|
{
|
||||||
|
// those requirements couldn't be found in the dbc
|
||||||
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
|
if(!data || !data->Meets(GetPlayer(),unit,miscvalue1))
|
||||||
|
{
|
||||||
|
// reset the progress as we have a win without the requirement.
|
||||||
|
SetCriteriaProgress(achievementCriteria, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
|
||||||
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
||||||
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
|
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
|
||||||
if(!miscvalue1)
|
if(!miscvalue1)
|
||||||
|
|
@ -1189,7 +1218,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
|
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
|
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
|
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
|
case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
|
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
|
||||||
|
|
@ -1295,6 +1323,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
||||||
return progress->counter >= 1;
|
return progress->counter >= 1;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
||||||
return progress->counter >= achievementCriteria->own_item.itemCount;
|
return progress->counter >= achievementCriteria->own_item.itemCount;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||||
|
return progress->counter >= achievementCriteria->win_rated_arena.count;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||||
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
|
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
||||||
|
|
@ -1748,6 +1778,10 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
|
||||||
|
|
||||||
switch(criteria->requiredType)
|
switch(criteria->requiredType)
|
||||||
{
|
{
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // need skip generic cases
|
||||||
|
if(criteria->win_rated_arena.flag!=ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE)
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: // need skip generic cases
|
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: // need skip generic cases
|
||||||
if(criteria->do_emote.count==0)
|
if(criteria->do_emote.count==0)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -50,9 +50,10 @@ enum AchievementCriteriaDataType
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA = 5, // spell_id effect_idx
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA = 5, // spell_id effect_idx
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA = 6, // area id 0
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA = 6, // area id 0
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7, // spell_id effect_idx
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7, // spell_id effect_idx
|
||||||
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8, // minvalue value provided with achievement update must be not less that limit
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 8 // maximum value in AchievementCriteriaDataType enum
|
#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 9 // maximum value in AchievementCriteriaDataType enum
|
||||||
|
|
||||||
class Player;
|
class Player;
|
||||||
class Unit;
|
class Unit;
|
||||||
|
|
@ -95,6 +96,11 @@ struct AchievementCriteriaData
|
||||||
{
|
{
|
||||||
uint32 id;
|
uint32 id;
|
||||||
} area;
|
} area;
|
||||||
|
// ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32 minvalue;
|
||||||
|
} value;
|
||||||
// ...
|
// ...
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
|
@ -116,14 +122,14 @@ struct AchievementCriteriaData
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsValid(AchievementCriteriaEntry const* criteria);
|
bool IsValid(AchievementCriteriaEntry const* criteria);
|
||||||
bool Meets(Player const* source, Unit const* target) const;
|
bool Meets(Player const* source, Unit const* target, uint32 miscvalue1 = 0) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AchievementCriteriaDataSet
|
struct AchievementCriteriaDataSet
|
||||||
{
|
{
|
||||||
typedef std::vector<AchievementCriteriaData> Storage;
|
typedef std::vector<AchievementCriteriaData> Storage;
|
||||||
void Add(AchievementCriteriaData const& data) { storage.push_back(data); }
|
void Add(AchievementCriteriaData const& data) { storage.push_back(data); }
|
||||||
bool Meets(Player const* source, Unit const* target) const;
|
bool Meets(Player const* source, Unit const* target, uint32 miscvalue = 0) const;
|
||||||
private:
|
private:
|
||||||
Storage storage;
|
Storage storage;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -697,9 +697,19 @@ void BattleGround::EndBattleGround(uint32 winner)
|
||||||
if (isArena() && isRated() && winner_arena_team && loser_arena_team)
|
if (isArena() && isRated() && winner_arena_team && loser_arena_team)
|
||||||
{
|
{
|
||||||
if (team == winner)
|
if (team == winner)
|
||||||
|
{
|
||||||
|
// update achievement BEFORE personal rating update
|
||||||
|
plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, winner_arena_team->GetMember(plr->GetGUID())->personal_rating);
|
||||||
|
|
||||||
winner_arena_team->MemberWon(plr,loser_rating);
|
winner_arena_team->MemberWon(plr,loser_rating);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
loser_arena_team->MemberLost(plr,winner_rating);
|
loser_arena_team->MemberLost(plr,winner_rating);
|
||||||
|
|
||||||
|
// Arena lost => reset the win_rated_arena having the "no_loose" condition
|
||||||
|
plr->GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (team == winner)
|
if (team == winner)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7933"
|
#define REVISION_NR "7934"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue