aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2023-10-15 16:42:17 +0200
committerGitHub <noreply@github.com>2023-10-15 16:42:17 +0200
commit10b06ff50f77cc0516c5f17adffef8eb75f1d555 (patch)
tree73b70118cb1431f680335f1249f4a6a6e2e43599 /src
parent0f7dd4eadf90a5407fd232d083485430d725152f (diff)
Core/Achievements: Fix CriteriaTypes related to areas and zones (#29367)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp37
-rw-r--r--src/server/game/DataStores/DB2Structure.h4
-rw-r--r--src/server/game/DataStores/DBCEnums.h6
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
4 files changed, 38 insertions, 19 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 8375e9943bf..9718600ccc7 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -551,11 +551,9 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0*
case CriteriaType::HonorLevelIncrease:
case CriteriaType::PrestigeLevelIncrease:
case CriteriaType::LearnAnyTransmogInSlot:
- case CriteriaType::CollectTransmogSetFromGroup:
case CriteriaType::CompleteAnyReplayQuest:
case CriteriaType::BuyItemsFromVendors:
case CriteriaType::SellItemsToVendors:
- case CriteriaType::EnterTopLevelArea:
SetCriteriaProgress(criteria, 1, referencePlayer, PROGRESS_ACCUMULATE);
break;
// std case: increment at miscValue1
@@ -662,16 +660,21 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0*
// miscValue1 is the ingame fallheight*100 as stored in dbc
SetCriteriaProgress(criteria, miscValue1, referencePlayer);
break;
+ case CriteriaType::EarnAchievement:
case CriteriaType::CompleteQuest:
case CriteriaType::LearnOrKnowSpell:
case CriteriaType::RevealWorldMapOverlay:
case CriteriaType::GotHaircut:
case CriteriaType::EquipItemInSlot:
case CriteriaType::EquipItem:
- case CriteriaType::EarnAchievement:
- case CriteriaType::RecruitGarrisonFollower:
case CriteriaType::LearnedNewPet:
+ case CriteriaType::EnterArea:
+ case CriteriaType::LeaveArea:
+ case CriteriaType::RecruitGarrisonFollower:
case CriteriaType::ActivelyReachLevel:
+ case CriteriaType::CollectTransmogSetFromGroup:
+ case CriteriaType::EnterTopLevelArea:
+ case CriteriaType::LeaveTopLevelArea:
SetCriteriaProgress(criteria, 1, referencePlayer);
break;
case CriteriaType::BankSlotsPurchased:
@@ -795,8 +798,6 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0*
case CriteriaType::AccountObtainPetThroughBattle:
case CriteriaType::WinPetBattle:
case CriteriaType::PlayerObtainPetThroughBattle:
- case CriteriaType::EnterArea:
- case CriteriaType::LeaveArea:
case CriteriaType::DefeatDungeonEncounter:
case CriteriaType::ActivateGarrisonBuilding:
case CriteriaType::UpgradeGarrison:
@@ -1181,14 +1182,11 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi
case CriteriaType::BankSlotsPurchased:
case CriteriaType::ReputationGained:
case CriteriaType::TotalExaltedFactions:
- case CriteriaType::GotHaircut:
- case CriteriaType::EquipItemInSlot:
case CriteriaType::RollNeed:
case CriteriaType::RollGreed:
case CriteriaType::DeliverKillingBlowToClass:
case CriteriaType::DeliverKillingBlowToRace:
case CriteriaType::DoEmote:
- case CriteriaType::EquipItem:
case CriteriaType::MoneyEarnedFromQuesting:
case CriteriaType::MoneyLootedFromCreatures:
case CriteriaType::UseGameobject:
@@ -1215,18 +1213,24 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi
case CriteriaType::CompleteAnyReplayQuest:
case CriteriaType::BuyItemsFromVendors:
case CriteriaType::SellItemsToVendors:
- case CriteriaType::EnterTopLevelArea:
return progress->Counter >= requiredAmount;
case CriteriaType::EarnAchievement:
case CriteriaType::CompleteQuest:
case CriteriaType::LearnOrKnowSpell:
case CriteriaType::RevealWorldMapOverlay:
- case CriteriaType::RecruitGarrisonFollower:
+ case CriteriaType::GotHaircut:
+ case CriteriaType::EquipItemInSlot:
+ case CriteriaType::EquipItem:
case CriteriaType::LearnedNewPet:
case CriteriaType::HonorLevelIncrease:
case CriteriaType::PrestigeLevelIncrease:
+ case CriteriaType::EnterArea:
+ case CriteriaType::LeaveArea:
+ case CriteriaType::RecruitGarrisonFollower:
case CriteriaType::ActivelyReachLevel:
case CriteriaType::CollectTransmogSetFromGroup:
+ case CriteriaType::EnterTopLevelArea:
+ case CriteriaType::LeaveTopLevelArea:
return progress->Counter >= 1;
case CriteriaType::AchieveSkillStep:
return progress->Counter >= (requiredAmount * 75);
@@ -1593,10 +1597,14 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
return false;
break;
case CriteriaType::PVPKillInArea:
- case CriteriaType::EnterTopLevelArea:
+ case CriteriaType::EnterArea:
if (!miscValue1 || !DB2Manager::IsInArea(uint32(miscValue1), uint32(criteria->Entry->Asset.AreaID)))
return false;
break;
+ case CriteriaType::LeaveArea:
+ if (!miscValue1 || DB2Manager::IsInArea(uint32(miscValue1), uint32(criteria->Entry->Asset.AreaID)))
+ return false;
+ break;
case CriteriaType::CurrencyGained:
if (!miscValue1 || !miscValue2 || int64(miscValue2) < 0
|| miscValue1 != uint32(criteria->Entry->Asset.CurrencyID))
@@ -1630,6 +1638,11 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
if (!miscValue1 || miscValue1 != uint32(criteria->Entry->Asset.PlayerLevel))
return false;
break;
+ case CriteriaType::EnterTopLevelArea:
+ case CriteriaType::LeaveTopLevelArea:
+ if (!miscValue1 || miscValue1 != uint32(criteria->Entry->Asset.ZoneID))
+ return false;
+ break;
default:
break;
}
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 6b0c9f6aee8..9c540d5cfed 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -1132,6 +1132,8 @@ struct CriteriaEntry
int32 AchievementID;
// CriteriaType::CompleteQuestsInZone = 11
+ // CriteriaType::EnterTopLevelArea = 225
+ // CriteriaType::LeaveTopLevelArea = 226
int32 ZoneID;
// CriteriaType::CurrencyGained = 12
@@ -1165,8 +1167,6 @@ struct CriteriaEntry
// CriteriaType::PVPKillInArea = 31
// CriteriaType::EnterArea = 163
// CriteriaType::LeaveArea = 164
- // CriteriaType::EnterTopLevelArea = 225
- // CriteriaType::LeaveTopLevelArea = 226
int32 AreaID;
// CriteriaType::AcquireItem = 36
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 0b16996c3f0..6a1a7dec181 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -662,8 +662,8 @@ enum class CriteriaType : uint8
BattlePetReachLevel = 160, // (Account Only) Battle pet has reached level {#Level}
PlayerObtainPetThroughBattle = 161, /*NYI*/ // (Player) Obtain a pet through battle
ActivelyEarnPetLevel = 162, // (Player) Actively earn level {#Level} with a pet by a player
- EnterArea = 163, /*NYI*/ // Enter Map Area "{AreaTable}"
- LeaveArea = 164, /*NYI*/ // Leave Map Area "{AreaTable}"
+ EnterArea = 163, // Enter Map Area "{AreaTable}"
+ LeaveArea = 164, // Leave Map Area "{AreaTable}"
DefeatDungeonEncounter = 165, /*NYI*/ // Defeat Encounter "{DungeonEncounter}"
PlaceAnyGarrisonBuilding = 166, /*NYI*/ // Garrison Building: Place any
PlaceGarrisonBuilding = 167, // Garrison Building: Place "{GarrBuilding}"
@@ -725,7 +725,7 @@ enum class CriteriaType : uint8
LearnTransmogIllusion = 223, /*NYI*/ // Learn Transmog Illusion
LearnAnyTransmogIllusion = 224, /*NYI*/ // Learn Any Transmog Illusion
EnterTopLevelArea = 225, // Enter Top Level Map Area "{AreaTable}"
- LeaveTopLevelArea = 226, /*NYI*/ // Leave Top Level Map Area "{AreaTable}"
+ LeaveTopLevelArea = 226, // Leave Top Level Map Area "{AreaTable}"
SocketGarrisonTalent = 227, /*NYI*/ // Socket Garrison Talent {GarrTalent}
SocketAnySoulbindConduit = 228, /*NYI*/ // Socket Any Soulbind Conduit
ObtainAnyItemWithCurrencyValue = 229, /*NYI*/ // Obtain Any Item With Currency Value "{CurrencyTypes}"
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 1dc992bae6c..1ce4d805716 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7557,13 +7557,17 @@ void Player::UpdateArea(uint32 newArea)
PushQuests();
- UpdateCriteria(CriteriaType::EnterTopLevelArea, newArea);
-
UpdateMountCapability();
if ((oldAreaEntry && oldAreaEntry->GetFlags2().HasFlag(AreaFlags2::UseSubzoneForChatChannel))
|| (area && area->GetFlags2().HasFlag(AreaFlags2::UseSubzoneForChatChannel)))
UpdateLocalChannels(newArea);
+
+ if (oldArea != newArea)
+ {
+ UpdateCriteria(CriteriaType::EnterArea, newArea);
+ UpdateCriteria(CriteriaType::LeaveArea, oldArea);
+ }
}
void Player::UpdateZone(uint32 newZone, uint32 newArea)
@@ -7643,6 +7647,8 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
SendInitWorldStates(newZone, newArea); // only if really enters to new zone, not just area change, works strange...
if (Guild* guild = GetGuild())
guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
+ UpdateCriteria(CriteriaType::EnterTopLevelArea, newZone);
+ UpdateCriteria(CriteriaType::LeaveTopLevelArea, oldZone);
}
}