aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-08-30 14:20:20 +0200
committerShauren <shauren.trinity@gmail.com>2022-02-04 21:27:25 +0100
commit03fd9b038e81aa3c92c05005c36855266886b037 (patch)
treead40e93074f00f1a9016dd389b0b13784946fef3
parenta65e7e0213c3bc5683e3255cc91eb424f0d79dc9 (diff)
Core/Chat: Correct Hyperlink validation for incomplete achievements.
(cherry picked from commit fdcb1c8b2e142acc012f2ecb2ece082302e8fb15)
-rw-r--r--src/server/game/Chat/HyperlinkTags.cpp20
-rw-r--r--src/server/game/Chat/Hyperlinks.h7
2 files changed, 21 insertions, 6 deletions
diff --git a/src/server/game/Chat/HyperlinkTags.cpp b/src/server/game/Chat/HyperlinkTags.cpp
index f0d36065170..990e416bff5 100644
--- a/src/server/game/Chat/HyperlinkTags.cpp
+++ b/src/server/game/Chat/HyperlinkTags.cpp
@@ -75,9 +75,23 @@ bool Trinity::Hyperlinks::LinkTags::achievement::StoreTo(AchievementLinkData& va
if (!t.TryConsumeTo(achievementId))
return false;
val.Achievement = sAchievementStore.LookupEntry(achievementId);
- return val.Achievement && t.TryConsumeTo(val.CharacterId) && t.TryConsumeTo(val.IsFinished) &&
- t.TryConsumeTo(val.Month) && t.TryConsumeTo(val.Day) && t.TryConsumeTo(val.Year) && t.TryConsumeTo(val.Criteria[0]) &&
- t.TryConsumeTo(val.Criteria[1]) && t.TryConsumeTo(val.Criteria[2]) && t.TryConsumeTo(val.Criteria[3]) && t.IsEmpty();
+ if (!(val.Achievement && t.TryConsumeTo(val.CharacterId) && t.TryConsumeTo(val.IsFinished) &&
+ t.TryConsumeTo(val.Month) && t.TryConsumeTo(val.Day)))
+ return false;
+ int8 year;
+ if (!t.TryConsumeTo(year))
+ return false;
+ if (val.IsFinished) // if finished, year must be >= 0
+ {
+ if (year < 0)
+ return false;
+ val.Year = static_cast<uint8>(year);
+ }
+ else
+ val.Year = 0;
+
+ return (t.TryConsumeTo(val.Criteria[0]) &&
+ t.TryConsumeTo(val.Criteria[1]) && t.TryConsumeTo(val.Criteria[2]) && t.TryConsumeTo(val.Criteria[3]) && t.IsEmpty());
}
bool Trinity::Hyperlinks::LinkTags::apower::StoreTo(ArtifactPowerLinkData& val, std::string_view text)
diff --git a/src/server/game/Chat/Hyperlinks.h b/src/server/game/Chat/Hyperlinks.h
index dfc3f656ccf..9973318d549 100644
--- a/src/server/game/Chat/Hyperlinks.h
+++ b/src/server/game/Chat/Hyperlinks.h
@@ -20,6 +20,7 @@
#include "ObjectGuid.h"
#include "StringConvert.h"
+#include <array>
#include <string>
#include <string_view>
#include <type_traits>
@@ -60,10 +61,10 @@ namespace Trinity::Hyperlinks
AchievementEntry const* Achievement;
ObjectGuid CharacterId;
bool IsFinished;
- uint16 Year;
+ uint8 Year;
uint8 Month;
uint8 Day;
- uint32 Criteria[4];
+ std::array<uint32, 4> Criteria;
};
struct ArtifactPowerLinkData
@@ -128,7 +129,7 @@ namespace Trinity::Hyperlinks
{
ItemTemplate const* Item;
uint32 EnchantId;
- uint32 GemItemId[3];
+ std::array<uint32, 3> GemItemId;
uint8 RenderLevel;
uint32 RenderSpecialization;
uint8 Context;