mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[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:
parent
1b43c37c77
commit
bbdd04d1ab
10 changed files with 81 additions and 7 deletions
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 it’s 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
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue