Core/Criteria: Add all values of CriteriaFailEvent

This commit is contained in:
Shauren
2021-06-01 20:45:44 +02:00
parent cfd4f18885
commit 4b6ddfbbcc
12 changed files with 46 additions and 43 deletions

View File

@@ -350,15 +350,15 @@ void PlayerAchievementMgr::SaveToDB(CharacterDatabaseTransaction& trans)
}
}
void PlayerAchievementMgr::ResetCriteria(CriteriaCondition condition, int32 failAsset, bool evenIfCriteriaComplete)
void PlayerAchievementMgr::ResetCriteria(CriteriaFailEvent failEvent, int32 failAsset, bool evenIfCriteriaComplete)
{
TC_LOG_DEBUG("criteria.achievement", "PlayerAchievementMgr::ResetCriteria(%u, %d, %s)", condition, failAsset, evenIfCriteriaComplete ? "true" : "false");
TC_LOG_DEBUG("criteria.achievement", "PlayerAchievementMgr::ResetCriteria(%u, %d, %s)", uint32(failEvent), failAsset, evenIfCriteriaComplete ? "true" : "false");
// disable for gamemasters with GM-mode enabled
if (_owner->IsGameMaster())
return;
if (CriteriaList const* achievementCriteriaList = sCriteriaMgr->GetCriteriaByFailEvent(condition, failAsset))
if (CriteriaList const* achievementCriteriaList = sCriteriaMgr->GetCriteriaByFailEvent(failEvent, failAsset))
{
for (Criteria const* achievementCriteria : *achievementCriteriaList)
{

View File

@@ -83,7 +83,7 @@ public:
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
void SaveToDB(CharacterDatabaseTransaction& trans);
void ResetCriteria(CriteriaCondition condition, int32 failAsset, bool evenIfCriteriaComplete = false);
void ResetCriteria(CriteriaFailEvent failEvent, int32 failAsset, bool evenIfCriteriaComplete = false);
void SendAllData(Player const* receiver) const override;
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;

View File

@@ -1292,13 +1292,13 @@ bool CriteriaHandler::ConditionsSatisfied(Criteria const* criteria, Player* refe
if (!criteria->Entry->FailEvent)
return true;
switch (criteria->Entry->FailEvent)
switch (CriteriaFailEvent(criteria->Entry->FailEvent))
{
case CRITERIA_CONDITION_BG_MAP:
case CriteriaFailEvent::LeaveBattleground:
if (!referencePlayer->InBattleground())
return false;
break;
case CRITERIA_CONDITION_NOT_IN_GROUP:
case CriteriaFailEvent::ModifyPartyStatus:
if (referencePlayer->GetGroup())
return false;
break;
@@ -1536,7 +1536,7 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
if (!miscValue1)
return false;
if (criteria->Entry->FailEvent == CRITERIA_CONDITION_BG_MAP)
if (CriteriaFailEvent(criteria->Entry->FailEvent) == CriteriaFailEvent::LeaveBattleground)
{
if (!referencePlayer->InBattleground())
return false;
@@ -3448,8 +3448,8 @@ void CriteriaMgr::LoadCriteriaList()
criteriaEntry->Type + 1, CRITERIA_TYPE_TOTAL);
ASSERT(criteriaEntry->StartEvent < CRITERIA_TIMED_TYPE_MAX, "CRITERIA_TYPE_TOTAL must be greater than or equal to %u but is currently equal to %u",
criteriaEntry->StartEvent + 1, CRITERIA_TIMED_TYPE_MAX);
ASSERT(criteriaEntry->FailEvent < CRITERIA_CONDITION_MAX, "CRITERIA_CONDITION_MAX must be greater than or equal to %u but is currently equal to %u",
criteriaEntry->FailEvent + 1, CRITERIA_CONDITION_MAX);
ASSERT(criteriaEntry->FailEvent < uint8(CriteriaFailEvent::Count), "CriteriaFailEvent::Count must be greater than or equal to %u but is currently equal to %u",
criteriaEntry->FailEvent + 1, uint32(CriteriaFailEvent::Count));
auto treeItr = _criteriaTreeByCriteria.find(criteriaEntry->ID);
if (treeItr == _criteriaTreeByCriteria.end())

View File

@@ -350,10 +350,10 @@ public:
return _criteriasByTimedType[type];
}
CriteriaList const* GetCriteriaByFailEvent(CriteriaCondition condition, int32 asset)
CriteriaList const* GetCriteriaByFailEvent(CriteriaFailEvent condition, int32 asset)
{
auto itr = _criteriasByFailEvent[condition].find(asset);
return itr != _criteriasByFailEvent[condition].end() ? &itr->second : nullptr;
auto itr = _criteriasByFailEvent[size_t(condition)].find(asset);
return itr != _criteriasByFailEvent[size_t(condition)].end() ? &itr->second : nullptr;
}
CriteriaDataSet const* GetCriteriaDataSet(Criteria const* Criteria) const
@@ -413,7 +413,7 @@ private:
CriteriaList _questObjectiveCriteriasByType[CRITERIA_TYPE_TOTAL];
CriteriaList _criteriasByTimedType[CRITERIA_TIMED_TYPE_MAX];
std::unordered_map<int32, CriteriaList> _criteriasByFailEvent[CRITERIA_CONDITION_MAX];
std::unordered_map<int32, CriteriaList> _criteriasByFailEvent[size_t(CriteriaFailEvent::Count)];
};
#define sCriteriaMgr CriteriaMgr::Instance()

View File

@@ -274,7 +274,7 @@ void Arena::EndBattleground(uint32 winner)
loserArenaTeam->MemberLost(player, winnerMatchmakerRating, loserMatchmakerChange);
// Arena lost => reset the win_rated_arena having the "no_lose" condition
player->ResetCriteria(CRITERIA_CONDITION_NO_LOSE, 0);
player->ResetCriteria(CriteriaFailEvent::LoseRankedArenaMatchWithTeamSize, 0);
}
}

View File

@@ -966,7 +966,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
player->SetBGTeam(0);
// remove all criterias on bg leave
player->ResetCriteria(CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
player->ResetCriteria(CriteriaFailEvent::LeaveBattleground, GetMapId(), true);
if (Transport)
player->TeleportToBGEntryPoint();
@@ -1116,7 +1116,7 @@ void Battleground::AddPlayer(Player* player)
}
// reset all map criterias on map enter
player->ResetCriteria(CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
player->ResetCriteria(CriteriaFailEvent::LeaveBattleground, GetMapId(), true);
// setup BG group membership
PlayerAddedToBGCheckIfBGIsRunning(player);

View File

@@ -244,24 +244,6 @@ enum class CorruptionEffectsFlag
DEFINE_ENUM_FLAG(CorruptionEffectsFlag);
enum CriteriaCondition
{
CRITERIA_CONDITION_NONE = 0,
CRITERIA_CONDITION_NO_DEATH = 1, // reset progress on death
CRITERIA_CONDITION_UNK2 = 2, // only used in "Complete a daily quest every day for five consecutive days"
CRITERIA_CONDITION_BG_MAP = 3, // requires you to be on specific map, reset at change
CRITERIA_CONDITION_NO_LOSE = 4, // only used in "Win 10 arenas without losing"
CRITERIA_CONDITION_REMOVE_AURA = 5, // reset when this aura is removed
CRITERIA_CONDITION_CAST_SPELL = 8, // reset when casting this spell
CRITERIA_CONDITION_NO_SPELL_HIT = 9, // requires the player not to be hit by specific spell
CRITERIA_CONDITION_NOT_IN_GROUP = 10, // requires the player not to be in group
CRITERIA_CONDITION_LOSE_PET_BATTLE = 11, // reset when losing pet battle
CRITERIA_CONDITION_UNK13 = 13, // unk
CRITERIA_CONDITION_EVENT = 14,
CRITERIA_CONDITION_MAX
};
enum CriteriaAdditionalCondition
{
CRITERIA_ADDITIONAL_CONDITION_SOURCE_DRUNK_VALUE = 1,
@@ -577,6 +559,27 @@ enum CriteriaAdditionalCondition
CRITERIA_ADDITIONAL_CONDITION_SOURCE_FLYING = 311,
};
enum class CriteriaFailEvent : uint8
{
None = 0,
Death = 1, // Death
Hours24WithoutCompletingDailyQuest = 2, // 24 hours without completing a daily quest
LeaveBattleground = 3, // Leave a battleground
LoseRankedArenaMatchWithTeamSize = 4, // Lose a ranked arena match with team size {#Team Size}
LoseAura = 5, // Lose aura "{Spell}"
GainAura = 6, // Gain aura "{Spell}"
GainAuraEffect = 7, // Gain aura effect "{SpellAuraNames.EnumID}"
CastSpell = 8, // Cast spell "{Spell}"
BeSpellTarget = 9, // Have spell "{Spell}" cast on you
ModifyPartyStatus = 10, // Modify your party status
LosePetBattle = 11, // Lose a pet battle
BattlePetDies = 12, // Battle pet dies
DailyQuestsCleared = 13, // Daily quests cleared
SendEvent = 14, // Send event "{GameEvents}" (player-sent/instance only)
Count
};
enum CriteriaFlags
{
CRITERIA_FLAG_SHOW_PROGRESS_BAR = 0x00000001, // Show progress as bar

View File

@@ -1264,7 +1264,7 @@ void Player::setDeathState(DeathState s)
UpdateCriteria(CRITERIA_TYPE_DEATH_IN_DUNGEON, 1);
// reset all death criterias
ResetCriteria(CRITERIA_CONDITION_NO_DEATH, 0);
ResetCriteria(CriteriaFailEvent::Death, 0);
}
Unit::setDeathState(s);
@@ -26523,7 +26523,7 @@ void Player::RemoveCriteriaTimer(CriteriaTimedTypes type, uint32 entry)
m_achievementMgr->RemoveCriteriaTimer(type, entry);
}
void Player::ResetCriteria(CriteriaCondition condition, int32 failAsset, bool evenIfCriteriaComplete /* = false*/)
void Player::ResetCriteria(CriteriaFailEvent condition, int32 failAsset, bool evenIfCriteriaComplete /* = false*/)
{
m_achievementMgr->ResetCriteria(condition, failAsset, evenIfCriteriaComplete);
m_questObjectiveCriteriaMgr->ResetCriteria(condition, failAsset, evenIfCriteriaComplete);

View File

@@ -2480,7 +2480,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
uint32 GetAchievementPoints() const;
bool HasAchieved(uint32 achievementId) const;
void ResetAchievements();
void ResetCriteria(CriteriaCondition condition, int32 failAsset, bool evenIfCriteriaComplete = false);
void ResetCriteria(CriteriaFailEvent condition, int32 failAsset, bool evenIfCriteriaComplete = false);
void UpdateCriteria(CriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit* unit = nullptr);
void StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
void RemoveCriteriaTimer(CriteriaTimedTypes type, uint32 entry);

View File

@@ -164,15 +164,15 @@ void QuestObjectiveCriteriaMgr::SaveToDB(CharacterDatabaseTransaction& trans)
}
}
void QuestObjectiveCriteriaMgr::ResetCriteria(CriteriaCondition condition, int32 failAsset, bool evenIfCriteriaComplete)
void QuestObjectiveCriteriaMgr::ResetCriteria(CriteriaFailEvent failEvent, int32 failAsset, bool evenIfCriteriaComplete)
{
TC_LOG_DEBUG("criteria.quest", "QuestObjectiveCriteriaMgr::ResetCriteria(%u, %d, %s)", condition, failAsset, evenIfCriteriaComplete ? "true" : "false");
TC_LOG_DEBUG("criteria.quest", "QuestObjectiveCriteriaMgr::ResetCriteria(%u, %d, %s)", uint32(failEvent), failAsset, evenIfCriteriaComplete ? "true" : "false");
// disable for gamemasters with GM-mode enabled
if (_owner->IsGameMaster())
return;
if (CriteriaList const* playerCriteriaList = sCriteriaMgr->GetCriteriaByFailEvent(condition, failAsset))
if (CriteriaList const* playerCriteriaList = sCriteriaMgr->GetCriteriaByFailEvent(failEvent, failAsset))
{
for (Criteria const* playerCriteria : *playerCriteriaList)
{

View File

@@ -34,7 +34,7 @@ public:
void LoadFromDB(PreparedQueryResult objectiveResult, PreparedQueryResult criteriaResult);
void SaveToDB(CharacterDatabaseTransaction& trans);
void ResetCriteria(CriteriaCondition condition, int32 failAsset, bool evenIfCriteriaComplete = false);
void ResetCriteria(CriteriaFailEvent failEvent, int32 failAsset, bool evenIfCriteriaComplete = false);
void ResetCriteriaTree(uint32 criteriaTreeId);
void SendAllData(Player const* receiver) const override;

View File

@@ -1358,7 +1358,7 @@ class spell_algalon_supermassive_fail : public SpellScriptLoader
if (!GetHitPlayer())
return;
GetHitPlayer()->ResetCriteria(CRITERIA_CONDITION_NO_SPELL_HIT, GetSpellInfo()->Id, true);
GetHitPlayer()->ResetCriteria(CriteriaFailEvent::BeSpellTarget, GetSpellInfo()->Id, true);
}
void Register() override