[8004] Implement table data use support for more achievement types requirements. Author: VladimirMangos
* ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST (hardcoded list)
* ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
* ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL
[8003] Implement ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY.
--HG--
branch : trunk
This commit is contained in:
+74
-22
@@ -81,6 +81,9 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
|||||||
switch(criteria->requiredType)
|
switch(criteria->requiredType)
|
||||||
{
|
{
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // only hardcoded list
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
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:
|
||||||
@@ -221,6 +224,14 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY:
|
||||||
|
if (!sHolidaysStore.LookupEntry(holiday.id))
|
||||||
|
{
|
||||||
|
sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY (%u) have unknown holiday in value1 (%u), ignore.",
|
||||||
|
criteria->ID, criteria->requiredType,dataType,drunk.state);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
default:
|
default:
|
||||||
sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,dataType);
|
sLog.outErrorDb( "Table `achievement_criteria_data` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,dataType);
|
||||||
return false;
|
return false;
|
||||||
@@ -287,6 +298,8 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, ui
|
|||||||
return ((Player*)target)->GetTeam() == team.team;
|
return ((Player*)target)->GetTeam() == team.team;
|
||||||
case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK:
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK:
|
||||||
return Player::GetDrunkenstateByValue(source->GetDrunkValue()) >= drunk.state;
|
return Player::GetDrunkenstateByValue(source->GetDrunkValue()) >= drunk.state;
|
||||||
|
case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY:
|
||||||
|
return IsHolidayActive(HolidayIds(holiday.id));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -716,10 +729,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
|
|
||||||
// those requirements couldn't be found in the dbc
|
// those requirements couldn't be found in the dbc
|
||||||
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
if(!data)
|
if(!data || !data->Meets(GetPlayer(),unit))
|
||||||
continue;
|
|
||||||
|
|
||||||
if(!data->Meets(GetPlayer(),unit))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SetCriteriaProgress(achievementCriteria, miscvalue2, PROGRESS_ACCUMULATE);
|
SetCriteriaProgress(achievementCriteria, miscvalue2, PROGRESS_ACCUMULATE);
|
||||||
@@ -884,13 +894,12 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
// 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)
|
||||||
continue;
|
continue;
|
||||||
if(achievement->ID == 1260)
|
|
||||||
{
|
// those requirements couldn't be found in the dbc
|
||||||
if(Player::GetDrunkenstateByValue(GetPlayer()->GetDrunkValue()) != DRUNKEN_SMASHED)
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
|
if(!data || !data->Meets(GetPlayer(),unit))
|
||||||
continue;
|
continue;
|
||||||
if(!IsHolidayActive(HOLIDAY_BREWFEST))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// miscvalue1 is the ingame fallheight*100 as stored in dbc
|
// miscvalue1 is the ingame fallheight*100 as stored in dbc
|
||||||
SetCriteriaProgress(achievementCriteria, miscvalue1);
|
SetCriteriaProgress(achievementCriteria, miscvalue1);
|
||||||
break;
|
break;
|
||||||
@@ -904,19 +913,44 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
|
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
|
||||||
break;
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
|
||||||
|
{
|
||||||
// if miscvalues != 0, it contains the questID.
|
// if miscvalues != 0, it contains the questID.
|
||||||
if (miscvalue1)
|
if (miscvalue1)
|
||||||
{
|
{
|
||||||
if (miscvalue1 == achievementCriteria->complete_quest.questID)
|
if (miscvalue1 != achievementCriteria->complete_quest.questID)
|
||||||
SetCriteriaProgress(achievementCriteria, 1);
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// login case.
|
// login case.
|
||||||
if(GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
|
if(!GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
|
||||||
SetCriteriaProgress(achievementCriteria, 1);
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// exist many achievements with this criteria, use at this moment hardcoded check to skil simple case
|
||||||
|
switch(achievement->ID)
|
||||||
|
{
|
||||||
|
case 31:
|
||||||
|
case 1275:
|
||||||
|
case 1276:
|
||||||
|
case 1277:
|
||||||
|
case 1282:
|
||||||
|
case 1789:
|
||||||
|
{
|
||||||
|
// those requirements couldn't be found in the dbc
|
||||||
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
|
if(!data || !data->Meets(GetPlayer(),unit))
|
||||||
|
continue;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SetCriteriaProgress(achievementCriteria, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
|
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
|
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
|
||||||
if (!miscvalue1 || miscvalue1 != achievementCriteria->be_spell_target.spellID)
|
if (!miscvalue1 || miscvalue1 != achievementCriteria->be_spell_target.spellID)
|
||||||
@@ -949,10 +983,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
{
|
{
|
||||||
// those requirements couldn't be found in the dbc
|
// those requirements couldn't be found in the dbc
|
||||||
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
if(!data)
|
if(!data || !data->Meets(GetPlayer(),unit))
|
||||||
continue;
|
|
||||||
|
|
||||||
if(!data->Meets(GetPlayer(),unit))
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1090,10 +1121,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
{
|
{
|
||||||
// those requirements couldn't be found in the dbc
|
// those requirements couldn't be found in the dbc
|
||||||
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||||
if(!data)
|
if(!data || !data->Meets(GetPlayer(),unit))
|
||||||
continue;
|
|
||||||
|
|
||||||
if(!data->Meets(GetPlayer(),unit))
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1818,6 +1846,30 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
|
|||||||
{
|
{
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||||
break; // any cases
|
break; // any cases
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
|
||||||
|
{
|
||||||
|
AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
|
||||||
|
if(!achievement)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// exist many achievements with this criteria, use at this moment hardcoded check to skil simple case
|
||||||
|
switch(achievement->ID)
|
||||||
|
{
|
||||||
|
case 31:
|
||||||
|
case 1275:
|
||||||
|
case 1276:
|
||||||
|
case 1277:
|
||||||
|
case 1282:
|
||||||
|
case 1789:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
|
||||||
|
break; // any cases
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL: // any cases
|
||||||
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // need skip generic cases
|
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // need skip generic cases
|
||||||
if(criteria->win_rated_arena.flag!=ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE)
|
if(criteria->win_rated_arena.flag!=ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -58,9 +58,10 @@ enum AchievementCriteriaDataType
|
|||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13,// count "with less than %u people in the zone"
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13,// count "with less than %u people in the zone"
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14,// team HORDE(67), ALLIANCE(469)
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14,// team HORDE(67), ALLIANCE(469)
|
||||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15,// drunken_state 0 (enum DrunkenState) of player
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15,// drunken_state 0 (enum DrunkenState) of player
|
||||||
|
ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16,// holiday_id 0 event in holiday time
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 16 // maximum value in AchievementCriteriaDataType enum
|
#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 17 // maximum value in AchievementCriteriaDataType enum
|
||||||
|
|
||||||
class Player;
|
class Player;
|
||||||
class Unit;
|
class Unit;
|
||||||
@@ -140,6 +141,11 @@ struct AchievementCriteriaData
|
|||||||
{
|
{
|
||||||
uint32 state;
|
uint32 state;
|
||||||
} drunk;
|
} drunk;
|
||||||
|
// ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint16 id;
|
||||||
|
} holiday;
|
||||||
// ...
|
// ...
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user