[11172] Implement ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN (type 74)

Also implement new criteria requirements:
  - ACHIEVEMENT_CRITERIA_REQUIRE_NTH_BIRTHDAY
  - ACHIEVEMENT_CRITERIA_REQUIRE_KNOWN_TITLE

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
Schmoozerd 2011-02-16 02:14:23 +03:00 committed by VladimirMangos
parent 1b43c37c77
commit bbdd04d1ab
10 changed files with 81 additions and 7 deletions

View file

@ -98,6 +98,7 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
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:
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
break; break;
default: default:
sLog.outErrorDb( "Table `achievement_criteria_requirement` have data for not supported criteria type (Entry: %u Type: %u), ignore.", criteria->ID, criteria->requiredType); sLog.outErrorDb( "Table `achievement_criteria_requirement` have data for not supported criteria type (Entry: %u Type: %u), ignore.", criteria->ID, criteria->requiredType);
@ -111,6 +112,7 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri
case ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED: case ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED:
case ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE: case ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE:
case ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT: case ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT:
case ACHIEVEMENT_CRITERIA_REQUIRE_NTH_BIRTHDAY:
return true; return true;
case ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE: case ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE:
if (!creature.id || !ObjectMgr::GetCreatureTemplate(creature.id)) if (!creature.id || !ObjectMgr::GetCreatureTemplate(creature.id))
@ -252,6 +254,17 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri
return false; return false;
} }
return true; return true;
case ACHIEVEMENT_CRITERIA_REQUIRE_KNOWN_TITLE:
{
CharTitlesEntry const *titleInfo = sCharTitlesStore.LookupEntry(known_title.title_id);
if (!titleInfo)
{
sLog.outErrorDb( "Table `achievement_criteria_requirement` (Entry: %u Type: %u) for requirement ACHIEVEMENT_CRITERIA_REQUIRE_KNOWN_TITLE (%u) have unknown title_id in value1 (%u), ignore.",
criteria->ID, criteria->requiredType, requirementType, known_title.title_id);
return false;
}
return true;
}
default: default:
sLog.outErrorDb( "Table `achievement_criteria_requirement` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,requirementType); sLog.outErrorDb( "Table `achievement_criteria_requirement` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,requirementType);
return false; return false;
@ -348,6 +361,27 @@ bool AchievementCriteriaRequirement::Meets(uint32 criteria_id, Player const* sou
ItemPrototype const* proto = item->GetProto(); ItemPrototype const* proto = item->GetProto();
return proto->ItemLevel >= equipped_item.item_level && proto->Quality >= equipped_item.item_quality; return proto->ItemLevel >= equipped_item.item_level && proto->Quality >= equipped_item.item_quality;
} }
case ACHIEVEMENT_CRITERIA_REQUIRE_NTH_BIRTHDAY:
{
time_t birthday_start = time_t(sWorld.getConfig(CONFIG_UINT32_BIRTHDAY_TIME));
tm birthday_tm = *localtime(&birthday_start);
// exactly N birthday
birthday_tm.tm_year += birthday_login.nth_birthday;
time_t birthday = mktime(&birthday_tm);
time_t now = sWorld.GetGameTime();
return now <= birthday + DAY && now >= birthday;
}
case ACHIEVEMENT_CRITERIA_REQUIRE_KNOWN_TITLE:
{
if (CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(known_title.title_id))
return source && source->HasTitle(titleInfo->bit_index);
return false;
}
} }
return false; return false;
} }
@ -1674,6 +1708,21 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
progressType = PROGRESS_HIGHEST; progressType = PROGRESS_HIGHEST;
break; break;
} }
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
{
// This criteria is only called directly after login - with expected miscvalue1 == 1
if (!miscvalue1)
continue;
// They have no proper requirements in dbc
AchievementCriteriaRequirementSet const* data = sAchievementMgr.GetCriteriaRequirementSet(achievementCriteria);
if (!data || !data->Meets(GetPlayer(), NULL))
continue;
change = 1;
progressType = PROGRESS_ACCUMULATE;
break;
}
// std case: not exist in DBC, not triggered in code as result // std case: not exist in DBC, not triggered in code as result
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
@ -1692,7 +1741,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL: case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
case ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE:
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS:
case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
@ -1781,6 +1829,8 @@ uint32 AchievementMgr::GetCriteriaProgressMaxCounter(AchievementCriteriaEntry co
return achievementCriteria->special_pvp_kill.killCount; return achievementCriteria->special_pvp_kill.killCount;
case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
return achievementCriteria->fish_in_gameobject.lootCount; return achievementCriteria->fish_in_gameobject.lootCount;
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
return 1;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
return achievementCriteria->learn_skillline_spell.spellCount; return achievementCriteria->learn_skillline_spell.spellCount;
case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:

View file

@ -66,9 +66,11 @@ enum AchievementCriteriaRequirementType
ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE = 17, // min_score max_score player's team win bg and opposition team have team score in range ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE = 17, // min_score max_score player's team win bg and opposition team have team score in range
ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit
ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPPED_ITEM_LVL = 19, // item_level item_quality fir equipped item in slot `misc1` to item level and quality ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPPED_ITEM_LVL = 19, // item_level item_quality fir equipped item in slot `misc1` to item level and quality
ACHIEVEMENT_CRITERIA_REQUIRE_NTH_BIRTHDAY = 20, // N login on day of N-th Birthday
ACHIEVEMENT_CRITERIA_REQUIRE_KNOWN_TITLE = 21, // title_id known (pvp) title, values from dbc
}; };
#define MAX_ACHIEVEMENT_CRITERIA_REQUIREMENT_TYPE 20 // maximum value in AchievementCriteriaRequirementType enum #define MAX_ACHIEVEMENT_CRITERIA_REQUIREMENT_TYPE 22 // maximum value in AchievementCriteriaRequirementType enum
class Player; class Player;
class Unit; class Unit;
@ -166,6 +168,16 @@ struct AchievementCriteriaRequirement
uint32 item_level; uint32 item_level;
uint32 item_quality; uint32 item_quality;
} equipped_item; } equipped_item;
// ACHIEVEMENT_CRITERIA_REQUIRE_NTH_BIRTHDAY = 20
struct
{
uint32 nth_birthday;
} birthday_login;
// ACHIEVEMENT_CRITERIA_REQUIRE_KNOWN_TITLE = 21
struct
{
uint32 title_id;
} known_title;
// ... // ...
struct struct
{ {

View file

@ -794,6 +794,10 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder *holder)
pCurrChar->SetStandState(UNIT_STAND_STATE_STAND); pCurrChar->SetStandState(UNIT_STAND_STATE_STAND);
m_playerLoading = false; m_playerLoading = false;
// Handle Login-Achievements (should be handled after loading)
pCurrChar->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN, 1);
delete holder; delete holder;
} }

View file

@ -163,7 +163,7 @@ enum AchievementCriteriaTypes
ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70,
ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72, ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72,
// TODO: title id is not mentioned in dbc // TODO: title id is not mentioned in dbc
ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE = 74, ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN = 74,
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75,
ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76,
ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77, ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77,

View file

@ -21216,7 +21216,7 @@ bool Player::isTotalImmune()
return false; return false;
} }
bool Player::HasTitle(uint32 bitIndex) bool Player::HasTitle(uint32 bitIndex) const
{ {
if (bitIndex > MAX_TITLE_INDEX) if (bitIndex > MAX_TITLE_INDEX)
return false; return false;

View file

@ -2389,8 +2389,8 @@ class MANGOS_DLL_SPEC Player : public Unit
void StartTimedAchievementCriteria(AchievementCriteriaTypes type, uint32 timedRequirementId, time_t startTime = 0); void StartTimedAchievementCriteria(AchievementCriteriaTypes type, uint32 timedRequirementId, time_t startTime = 0);
bool HasTitle(uint32 bitIndex); bool HasTitle(uint32 bitIndex) const;
bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); } bool HasTitle(CharTitlesEntry const* title) const { return HasTitle(title->bit_index); }
void SetTitle(CharTitlesEntry const* title, bool lost = false); void SetTitle(CharTitlesEntry const* title, bool lost = false);
bool canSeeSpellClickOn(Creature const* creature) const; bool canSeeSpellClickOn(Creature const* creature) const;

View file

@ -592,6 +592,8 @@ void World::LoadConfigSettings(bool reload)
setConfig(CONFIG_BOOL_CAST_UNSTUCK, "CastUnstuck", true); setConfig(CONFIG_BOOL_CAST_UNSTUCK, "CastUnstuck", true);
setConfig(CONFIG_UINT32_MAX_SPELL_CASTS_IN_CHAIN, "MaxSpellCastsInChain", 10); setConfig(CONFIG_UINT32_MAX_SPELL_CASTS_IN_CHAIN, "MaxSpellCastsInChain", 10);
setConfig(CONFIG_UINT32_BIRTHDAY_TIME, "BirthdayTime", 1125180000);
setConfig(CONFIG_UINT32_INSTANCE_RESET_TIME_HOUR, "Instance.ResetTimeHour", 4); setConfig(CONFIG_UINT32_INSTANCE_RESET_TIME_HOUR, "Instance.ResetTimeHour", 4);
setConfig(CONFIG_UINT32_INSTANCE_UNLOAD_DELAY, "Instance.UnloadDelay", 30 * MINUTE * IN_MILLISECONDS); setConfig(CONFIG_UINT32_INSTANCE_UNLOAD_DELAY, "Instance.UnloadDelay", 30 * MINUTE * IN_MILLISECONDS);

View file

@ -119,6 +119,7 @@ enum eConfigUInt32Values
CONFIG_UINT32_INSTANCE_RESET_TIME_HOUR, CONFIG_UINT32_INSTANCE_RESET_TIME_HOUR,
CONFIG_UINT32_INSTANCE_UNLOAD_DELAY, CONFIG_UINT32_INSTANCE_UNLOAD_DELAY,
CONFIG_UINT32_MAX_SPELL_CASTS_IN_CHAIN, CONFIG_UINT32_MAX_SPELL_CASTS_IN_CHAIN,
CONFIG_UINT32_BIRTHDAY_TIME,
CONFIG_UINT32_MAX_PRIMARY_TRADE_SKILL, CONFIG_UINT32_MAX_PRIMARY_TRADE_SKILL,
CONFIG_UINT32_MIN_PETITION_SIGNS, CONFIG_UINT32_MIN_PETITION_SIGNS,
CONFIG_UINT32_GM_LOGIN_STATE, CONFIG_UINT32_GM_LOGIN_STATE,

View file

@ -568,6 +568,10 @@ LogColors = ""
# 0 (no limit) # 0 (no limit)
# Default: 10 # Default: 10
# #
# BirthdayTime
# Set to birthday (date in unix time), By default 28th August 2005, when MaNGOS got its name
# Default: 1125180000
#
# Instance.IgnoreLevel # Instance.IgnoreLevel
# Ignore level requirement to enter instance # Ignore level requirement to enter instance
# Default: 0 (false) # Default: 0 (false)
@ -758,6 +762,7 @@ AlwaysMaxSkillForLevel = 0
ActivateWeather = 1 ActivateWeather = 1
CastUnstuck = 1 CastUnstuck = 1
MaxSpellCastsInChain = 10 MaxSpellCastsInChain = 10
BirthdayTime = 1125180000
Instance.IgnoreLevel = 0 Instance.IgnoreLevel = 0
Instance.IgnoreRaid = 0 Instance.IgnoreRaid = 0
Instance.ResetTimeHour = 4 Instance.ResetTimeHour = 4

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "11171" #define REVISION_NR "11172"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__