aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/ArtifactHandler.cpp
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2018-07-31 23:31:44 +0200
committerShauren <shauren.trinity@gmail.com>2018-07-31 23:31:44 +0200
commit55a0a2d3f6146ace93d5558ce16469d3cca28bdc (patch)
treed1b61e149fcb44c0c153c3ed614e42640a81df28 /src/server/game/Handlers/ArtifactHandler.cpp
parent394f9775a7c6d597c9744db37783985b2e228572 (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.cpp80
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)