diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-11-12 00:31:45 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-11-12 00:31:45 +0100 |
commit | 765f86fdc001ce352a706d2950197b1007d9afce (patch) | |
tree | 42cff27741c0d013a568d47c78451de794706a77 | |
parent | 7bf6fc5a0bc4a8519963ba46f85f9d6aae31d43c (diff) |
Core/Achievements: Implemented DefeatDungeonEncounter and DefeatDungeonEncounterWhileElegibleForLoot criteria types
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 13 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 4 | ||||
-rw-r--r-- | src/server/game/Instances/InstanceScript.cpp | 6 |
3 files changed, 19 insertions, 4 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 2acfcba6691..2f4d7d1a356 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -544,8 +544,10 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0* case CriteriaType::PlayerTriggerGameEvent: case CriteriaType::Login: case CriteriaType::AnyoneTriggerGameEventScenario: + case CriteriaType::DefeatDungeonEncounterWhileElegibleForLoot: case CriteriaType::BattlePetReachLevel: case CriteriaType::ActivelyEarnPetLevel: + case CriteriaType::DefeatDungeonEncounter: case CriteriaType::PlaceGarrisonBuilding: case CriteriaType::ActivateAnyGarrisonBuilding: case CriteriaType::HonorLevelIncrease: @@ -799,7 +801,6 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0* case CriteriaType::AccountObtainPetThroughBattle: case CriteriaType::WinPetBattle: case CriteriaType::PlayerObtainPetThroughBattle: - case CriteriaType::DefeatDungeonEncounter: case CriteriaType::ActivateGarrisonBuilding: case CriteriaType::UpgradeGarrison: case CriteriaType::StartAnyGarrisonMissionWithFollowerType: @@ -823,7 +824,6 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0* case CriteriaType::BattlePetAchievementPointsEarned: case CriteriaType::ReleasedSpirit: case CriteriaType::AccountKnownPet: - case CriteriaType::DefeatDungeonEncounterWhileElegibleForLoot: case CriteriaType::CompletedLFGDungeon: case CriteriaType::KickInitiatorInLFGDungeon: case CriteriaType::KickVoterInLFGDungeon: @@ -1195,6 +1195,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi case CriteriaType::CatchFishInFishingHole: case CriteriaType::LearnSpellFromSkillLine: case CriteriaType::WinDuel: + case CriteriaType::DefeatDungeonEncounterWhileElegibleForLoot: case CriteriaType::GetLootByType: case CriteriaType::LearnTradeskillSkillLine: case CriteriaType::CompletedLFGDungeonWithStrangers: @@ -1204,6 +1205,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi case CriteriaType::UniquePetsOwned: case CriteriaType::BattlePetReachLevel: case CriteriaType::ActivelyEarnPetLevel: + case CriteriaType::DefeatDungeonEncounter: case CriteriaType::LearnAnyTransmogInSlot: case CriteriaType::ParagonLevelIncreaseWithFaction: case CriteriaType::PlayerHasEarnedHonor: @@ -1619,6 +1621,11 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis break; case CriteriaType::EarnTeamArenaRating: return false; + case CriteriaType::DefeatDungeonEncounterWhileElegibleForLoot: + case CriteriaType::DefeatDungeonEncounter: + if (!miscValue1 || miscValue1 != uint32(criteria->Entry->Asset.DungeonEncounterID)) + return false; + break; case CriteriaType::PlaceGarrisonBuilding: case CriteriaType::ActivateGarrisonBuilding: if (miscValue1 != uint32(criteria->Entry->Asset.GarrBuildingID)) @@ -4497,9 +4504,11 @@ inline bool IsCriteriaTypeStoredByAsset(CriteriaType type) case CriteriaType::GainAura: case CriteriaType::CatchFishInFishingHole: case CriteriaType::LearnSpellFromSkillLine: + case CriteriaType::DefeatDungeonEncounterWhileElegibleForLoot: case CriteriaType::GetLootByType: case CriteriaType::LandTargetedSpellOnTarget: case CriteriaType::LearnTradeskillSkillLine: + case CriteriaType::DefeatDungeonEncounter: return true; default: break; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 6689d13eb48..db4ef4082a2 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -596,7 +596,7 @@ enum class CriteriaType : int16 RollAnyGreed = 94, // Roll any number on greed ReleasedSpirit = 95, /*NYI*/ // Released Spirit AccountKnownPet = 96, /*NYI*/ // Account knows pet "{Creature}" (Backtracked) - DefeatDungeonEncounterWhileElegibleForLoot = 97, /*NYI*/ // Defeat Encounter "{DungeonEncounter}" While Eligible For Loot + DefeatDungeonEncounterWhileElegibleForLoot = 97, // Defeat Encounter "{DungeonEncounter}" While Eligible For Loot // UNUSED 18{} = 98, // Unused // UNUSED 19{} = 99, // Unused // UNUSED 20{} = 100, // Unused @@ -664,7 +664,7 @@ enum class CriteriaType : int16 ActivelyEarnPetLevel = 162, // (Player) Actively earn level {#Level} with a pet by a player EnterArea = 163, // Enter Map Area "{AreaTable}" LeaveArea = 164, // Leave Map Area "{AreaTable}" - DefeatDungeonEncounter = 165, /*NYI*/ // Defeat Encounter "{DungeonEncounter}" + DefeatDungeonEncounter = 165, // Defeat Encounter "{DungeonEncounter}" PlaceAnyGarrisonBuilding = 166, /*NYI*/ // Garrison Building: Place any PlaceGarrisonBuilding = 167, // Garrison Building: Place "{GarrBuilding}" ActivateAnyGarrisonBuilding = 168, // Garrison Building: Activate any diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 47d85fb55e9..b4e43429384 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -432,6 +432,12 @@ bool InstanceScript::SetBossState(uint32 id, EncounterState state) dungeonEncounter = bossInfo->GetDungeonEncounterForDifficulty(instance->GetDifficultyID()); if (dungeonEncounter) { + instance->DoOnPlayers([&](Player* player) + { + if (!player->IsLockedToDungeonEncounter(dungeonEncounter->ID)) + player->UpdateCriteria(CriteriaType::DefeatDungeonEncounterWhileElegibleForLoot, dungeonEncounter->ID); + }); + DoUpdateCriteria(CriteriaType::DefeatDungeonEncounter, dungeonEncounter->ID); SendBossKillCredit(dungeonEncounter->ID); if (dungeonEncounter->CompleteWorldStateID) |