diff options
author | Traesh <Traesh@users.noreply.github.com> | 2018-07-31 23:31:44 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2018-07-31 23:31:44 +0200 |
commit | 55a0a2d3f6146ace93d5558ce16469d3cca28bdc (patch) | |
tree | d1b61e149fcb44c0c153c3ed614e42640a81df28 /src/server/game/Handlers/ArtifactHandler.cpp | |
parent | 394f9775a7c6d597c9744db37783985b2e228572 (diff) |
Core/Artifact Handle Artifact tiers + Artifact unlock (3rd relic bonus) (#21593)
Diffstat (limited to 'src/server/game/Handlers/ArtifactHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ArtifactHandler.cpp | 80 |
1 files changed, 61 insertions, 19 deletions
diff --git a/src/server/game/Handlers/ArtifactHandler.cpp b/src/server/game/Handlers/ArtifactHandler.cpp index 774dedff867..8e9451daaf9 100644 --- a/src/server/game/Handlers/ArtifactHandler.cpp +++ b/src/server/game/Handlers/ArtifactHandler.cpp @@ -35,9 +35,11 @@ void WorldSession::HandleArtifactAddPower(WorldPackets::Artifact::ArtifactAddPow if (!artifact) return; + uint32 currentArtifactTier = artifact->GetModifier(ITEM_MODIFIER_ARTIFACT_TIER); + uint64 xpCost = 0; if (GtArtifactLevelXPEntry const* cost = sArtifactLevelXPGameTable.GetRow(artifact->GetTotalPurchasedArtifactPowers() + 1)) - xpCost = uint64(artifact->GetModifier(ITEM_MODIFIER_ARTIFACT_TIER) == 1 ? cost->XP2 : cost->XP); + xpCost = uint64(currentArtifactTier == MAX_ARTIFACT_TIER ? cost->XP2 : cost->XP); if (xpCost > artifact->GetUInt64Value(ITEM_FIELD_ARTIFACT_XP)) return; @@ -53,32 +55,47 @@ void WorldSession::HandleArtifactAddPower(WorldPackets::Artifact::ArtifactAddPow if (!artifactPowerEntry) return; - if (artifactAddPower.PowerChoices[0].Rank != artifactPower->PurchasedRank + 1 || - artifactAddPower.PowerChoices[0].Rank > artifactPowerEntry->MaxPurchasableRank) + if (artifactPowerEntry->Tier > currentArtifactTier) return; - if (std::unordered_set<uint32> const* artifactPowerLinks = sDB2Manager.GetArtifactPowerLinks(artifactPower->ArtifactPowerId)) + uint32 maxRank = artifactPowerEntry->MaxPurchasableRank; + if (artifactPowerEntry->Tier < currentArtifactTier) { - bool hasAnyLink = false; - for (uint32 artifactPowerLinkId : *artifactPowerLinks) - { - ArtifactPowerEntry const* artifactPowerLink = sArtifactPowerStore.LookupEntry(artifactPowerLinkId); - if (!artifactPowerLink) - continue; + if (artifactPowerEntry->Flags & ARTIFACT_POWER_FLAG_FINAL) + maxRank = 1; + else if (artifactPowerEntry->Flags & ARTIFACT_POWER_FLAG_MAX_RANK_WITH_TIER) + maxRank += currentArtifactTier - artifactPowerEntry->Tier; + } - ItemDynamicFieldArtifactPowers const* artifactPowerLinkLearned = artifact->GetArtifactPower(artifactPowerLinkId); - if (!artifactPowerLinkLearned) - continue; + if (artifactAddPower.PowerChoices[0].Rank != artifactPower->PurchasedRank + 1 || + artifactAddPower.PowerChoices[0].Rank > maxRank) + return; - if (artifactPowerLinkLearned->PurchasedRank >= artifactPowerLink->MaxPurchasableRank) + if (!(artifactPowerEntry->Flags & ARTIFACT_POWER_FLAG_NO_LINK_REQUIRED)) + { + if (std::unordered_set<uint32> const* artifactPowerLinks = sDB2Manager.GetArtifactPowerLinks(artifactPower->ArtifactPowerId)) + { + bool hasAnyLink = false; + for (uint32 artifactPowerLinkId : *artifactPowerLinks) { - hasAnyLink = true; - break; + ArtifactPowerEntry const* artifactPowerLink = sArtifactPowerStore.LookupEntry(artifactPowerLinkId); + if (!artifactPowerLink) + continue; + + ItemDynamicFieldArtifactPowers const* artifactPowerLinkLearned = artifact->GetArtifactPower(artifactPowerLinkId); + if (!artifactPowerLinkLearned) + continue; + + if (artifactPowerLinkLearned->PurchasedRank >= artifactPowerLink->MaxPurchasableRank) + { + hasAnyLink = true; + break; + } } - } - if (!hasAnyLink) - return; + if (!hasAnyLink) + return; + } } ArtifactPowerRankEntry const* artifactPowerRank = sDB2Manager.GetArtifactPowerRank(artifactPower->ArtifactPowerId, artifactPower->CurrentRankWithBonus + 1 - 1); // need data for next rank, but -1 because of how db2 data is structured @@ -115,6 +132,31 @@ void WorldSession::HandleArtifactAddPower(WorldPackets::Artifact::ArtifactAddPow artifact->SetUInt64Value(ITEM_FIELD_ARTIFACT_XP, artifact->GetUInt64Value(ITEM_FIELD_ARTIFACT_XP) - xpCost); artifact->SetState(ITEM_CHANGED, _player); + + uint32 totalPurchasedArtifactPower = artifact->GetTotalPurchasedArtifactPowers(); + uint32 artifactTier = 0; + + for (ArtifactTierEntry const* tier : sArtifactTierStore) + { + if (artifactPowerEntry->Flags & ARTIFACT_POWER_FLAG_FINAL && artifactPowerEntry->Tier < MAX_ARTIFACT_TIER) + { + artifactTier = artifactPowerEntry->Tier + 1; + break; + } + + if (totalPurchasedArtifactPower < tier->MaxNumTraits) + { + artifactTier = tier->ArtifactTier; + break; + } + } + + artifactTier = std::max(artifactTier, currentArtifactTier); + + for (uint32 i = currentArtifactTier; i <= artifactTier; ++i) + artifact->InitArtifactPowers(artifact->GetTemplate()->GetArtifactID(), uint8(i)); + + artifact->SetModifier(ITEM_MODIFIER_ARTIFACT_TIER, artifactTier); } void WorldSession::HandleArtifactSetAppearance(WorldPackets::Artifact::ArtifactSetAppearance& artifactSetAppearance) |