diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 37 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 4 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 |
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); } } |