diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-09-17 21:29:07 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2018-09-17 21:29:07 +0200 |
commit | f62a70e55a4b66506fb9c7a1cf5a63414062092f (patch) | |
tree | b76a59266e6a0e0b6a5303e01885f6b3f7d392ad | |
parent | 175c0de6a7cfe990121a7c161c3cd03f541153b3 (diff) |
Core/Chat: Fix validation of tradeskill recipes that belong to multiple skill lines
(cherry picked from commit 2dc174029cb81150a7b033f2c062bfddfb9ff55a)
-rw-r--r-- | src/server/game/Chat/Hyperlinks.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/server/game/Chat/Hyperlinks.cpp b/src/server/game/Chat/Hyperlinks.cpp index 08d1bd37ea3..dec3da491be 100644 --- a/src/server/game/Chat/Hyperlinks.cpp +++ b/src/server/game/Chat/Hyperlinks.cpp @@ -248,24 +248,29 @@ struct LinkValidator<LinkTags::enchant> { static bool IsTextValid(SpellInfo const* info, char const* pos, size_t len) { + if (LinkValidator<LinkTags::spell>::IsTextValid(info, pos, len)) + return true; SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(info->Id); if (bounds.first == bounds.second) - return LinkValidator<LinkTags::spell>::IsTextValid(info, pos, len); - - SkillLineEntry const* skill = sSkillLineStore.LookupEntry(bounds.first->second->SkillupSkillLineID - ? bounds.first->second->SkillupSkillLineID - : bounds.first->second->SkillLine); - if (!skill) return false; - for (LocaleConstant i = LOCALE_enUS; i < TOTAL_LOCALES; i = LocaleConstant(i + 1)) + for (auto pair = bounds.first; pair != bounds.second; ++pair) { - char const* skillName = skill->DisplayName[i]; - size_t skillLen = strlen(skillName); - if (len > skillLen + 2 && // or of form [Skill Name: Spell Name] - !strncmp(pos, skillName, skillLen) && !strncmp(pos + skillLen, ": ", 2) && - equal_with_len((*info->SpellName)[i], pos + (skillLen + 2), len - (skillLen + 2))) - return true; + SkillLineEntry const* skill = sSkillLineStore.LookupEntry(pair->second->SkillupSkillLineID + ? pair->second->SkillupSkillLineID + : pair->second->SkillLine); + if (!skill) + return false; + + for (LocaleConstant i = LOCALE_enUS; i < TOTAL_LOCALES; i = LocaleConstant(i + 1)) + { + char const* skillName = skill->DisplayName[i]; + size_t skillLen = strlen(skillName); + if (len > skillLen + 2 && // or of form [Skill Name: Spell Name] + !strncmp(pos, skillName, skillLen) && !strncmp(pos + skillLen, ": ", 2) && + equal_with_len((*info->SpellName)[i], pos + (skillLen + 2), len - (skillLen + 2))) + return true; + } } return false; } |