From bbdd04d1abaf646b2cf81a3821133cc706751fc0 Mon Sep 17 00:00:00 2001 From: Schmoozerd Date: Wed, 16 Feb 2011 02:14:23 +0300 Subject: [PATCH] [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 --- src/game/AchievementMgr.cpp | 52 +++++++++++++++++++++++++++++++- src/game/AchievementMgr.h | 14 ++++++++- src/game/CharacterHandler.cpp | 4 +++ src/game/DBCEnums.h | 2 +- src/game/Player.cpp | 2 +- src/game/Player.h | 4 +-- src/game/World.cpp | 2 ++ src/game/World.h | 1 + src/mangosd/mangosd.conf.dist.in | 5 +++ src/shared/revision_nr.h | 2 +- 10 files changed, 81 insertions(+), 7 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 7b4cdfa97..cd924ad57 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -98,6 +98,7 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: + case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: break; default: 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_BG_LOSS_TEAM_SCORE: case ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT: + case ACHIEVEMENT_CRITERIA_REQUIRE_NTH_BIRTHDAY: return true; case ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE: if (!creature.id || !ObjectMgr::GetCreatureTemplate(creature.id)) @@ -252,6 +254,17 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri return false; } 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: 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; @@ -348,6 +361,27 @@ bool AchievementCriteriaRequirement::Meets(uint32 criteria_id, Player const* sou ItemPrototype const* proto = item->GetProto(); 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; } @@ -1674,6 +1708,21 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui progressType = PROGRESS_HIGHEST; 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 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: 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_OWN_RANK: 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_EARN_ACHIEVEMENT_POINTS: 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; case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: return achievementCriteria->fish_in_gameobject.lootCount; + case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: + return 1; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: return achievementCriteria->learn_skillline_spell.spellCount; case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h index 9de9e5150..856d10163 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -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_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_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 Unit; @@ -166,6 +168,16 @@ struct AchievementCriteriaRequirement uint32 item_level; uint32 item_quality; } 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 { diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index c06a75325..62683a309 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -794,6 +794,10 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder *holder) pCurrChar->SetStandState(UNIT_STAND_STATE_STAND); m_playerLoading = false; + + // Handle Login-Achievements (should be handled after loading) + pCurrChar->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN, 1); + delete holder; } diff --git a/src/game/DBCEnums.h b/src/game/DBCEnums.h index c4c96df5b..e5833cf4c 100644 --- a/src/game/DBCEnums.h +++ b/src/game/DBCEnums.h @@ -163,7 +163,7 @@ enum AchievementCriteriaTypes ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70, ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72, // 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_WIN_DUEL = 76, ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77, diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 3624106a4..bcf2d9ee1 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -21216,7 +21216,7 @@ bool Player::isTotalImmune() return false; } -bool Player::HasTitle(uint32 bitIndex) +bool Player::HasTitle(uint32 bitIndex) const { if (bitIndex > MAX_TITLE_INDEX) return false; diff --git a/src/game/Player.h b/src/game/Player.h index 50136dd23..09325beca 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2389,8 +2389,8 @@ class MANGOS_DLL_SPEC Player : public Unit void StartTimedAchievementCriteria(AchievementCriteriaTypes type, uint32 timedRequirementId, time_t startTime = 0); - bool HasTitle(uint32 bitIndex); - bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); } + bool HasTitle(uint32 bitIndex) const; + bool HasTitle(CharTitlesEntry const* title) const { return HasTitle(title->bit_index); } void SetTitle(CharTitlesEntry const* title, bool lost = false); bool canSeeSpellClickOn(Creature const* creature) const; diff --git a/src/game/World.cpp b/src/game/World.cpp index a020e0da9..d08981960 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -592,6 +592,8 @@ void World::LoadConfigSettings(bool reload) setConfig(CONFIG_BOOL_CAST_UNSTUCK, "CastUnstuck", true); 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_UNLOAD_DELAY, "Instance.UnloadDelay", 30 * MINUTE * IN_MILLISECONDS); diff --git a/src/game/World.h b/src/game/World.h index fc35fc474..1006327ae 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -119,6 +119,7 @@ enum eConfigUInt32Values CONFIG_UINT32_INSTANCE_RESET_TIME_HOUR, CONFIG_UINT32_INSTANCE_UNLOAD_DELAY, CONFIG_UINT32_MAX_SPELL_CASTS_IN_CHAIN, + CONFIG_UINT32_BIRTHDAY_TIME, CONFIG_UINT32_MAX_PRIMARY_TRADE_SKILL, CONFIG_UINT32_MIN_PETITION_SIGNS, CONFIG_UINT32_GM_LOGIN_STATE, diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index 25d2b849e..f2aae396f 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -568,6 +568,10 @@ LogColors = "" # 0 (no limit) # Default: 10 # +# BirthdayTime +# Set to birthday (date in unix time), By default 28th August 2005, when MaNGOS got it’s name +# Default: 1125180000 +# # Instance.IgnoreLevel # Ignore level requirement to enter instance # Default: 0 (false) @@ -758,6 +762,7 @@ AlwaysMaxSkillForLevel = 0 ActivateWeather = 1 CastUnstuck = 1 MaxSpellCastsInChain = 10 +BirthdayTime = 1125180000 Instance.IgnoreLevel = 0 Instance.IgnoreRaid = 0 Instance.ResetTimeHour = 4 diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index eb743ff96..0e7e0f736 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "11171" + #define REVISION_NR "11172" #endif // __REVISION_NR_H__