User:InAGiiZ/PatchPreview
How to use[edit]
New Forum Alpha code[edit]
- Create .html file with the code
- Open chrome without CORS! chrome.exe --user-data-dir="C://Chrome dev session" --disable-web-security
PLEASE DO NOT USE THIS CHROME INSTANCE FOR NORMAL BROWSING!!
Only support links that contain a #
<!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $(document).ready(function () { $("#btn1").click(function () { var value_parse = document.getElementById('patchurl_input').value $("#test1").text(value_parse); worker1(value_parse) }); }); function pad(s) { return (s < 10 ? '0' : '') + s; } // most of the code is a copypasta of https://wiki.guildwars2.com/index.php?title=Widget:Wikify_patch_notes&action=edit function worker1(url1) { $.ajax({ url: url1, //dataType: 'json', cache: false, success: function (data) { //var commentid = url1.split('#comment-')[1];console.log(commentid) //if (commentid == undefined) commentid = url1.split('#elControls_')[1].replace(/\D/g, "");console.log(commentid) var commentid = url1.split('#')[1].replace(/\D/g, ""); console.log(commentid) var wikitext = $(data).find(`#elComment_${commentid}`).html().trim() console.log(wikitext) var postdate = new Date($(wikitext).find('time').toArray()[0].dateTime); var monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var monthname = monthnames[postdate.getUTCMonth()]; var postindex = 1; var header = '== Update ' + (postindex == 1 ? '' : (postindex + ' ')) + '- ' + monthname + ' ' + pad(postdate.getUTCDate()) + ', ' + postdate.getUTCFullYear() + ' ==<br>'; var footer = '=== Guild Wars 2 Wiki Notes ===<p></p>* Build: ???<p></p><noinclude>[[Category:' + monthname + ' ' + postdate.getUTCFullYear() + ' updates]]</noinclude>'; console.log(header) console.log(footer) //wikitext = JSON.stringify(wikitext) //document.getElementById("debug").innerHTML = wikitext; //console.log(wikitext) var content = $(wikitext).find("div.ipsType_normal.ipsType_richText.ipsPadding_bottom.ipsContained").html(); console.log(content) //document.getElementById("debug").innerHTML = JSON.stringify(`<pre>${content}</pre>`); // ** START OF REGEX ** // PLEASE FIX :) document.getElementById("debug_bfr_regex").innerHTML = `<pre>${header}${content.trim()}${footer}</pre>`; document.getElementById("dumper").innerHTML = JSON.stringify(`<pre>${content}</pre>`) var patterns = [ // NEWLINES: Make sure we're using wiki compatible newlines /*['\r\n', '\n'], // HEADINGS: Find lines starting with each of the following and wrap that line with: ['^### (.*?)$', '==== $1 ===='], ['^## (.*?)$', '=== $1 ==='], ['^# (.*?)$\n\n', ''], // delete the first H1 heading ['^# (.*?)$', '=== $1 ==='], // sometimes anet get confused with the rest ['^\\*\\*(.*?)\\*\\*$', '=== $1 ==='], // ITALICS: words prefixed and suffixed with underscores ['_(.*?)_', '\'\'$1\'\''], // TAB CLEANUP: Sometimes these include unintentional extra spaces between tabs ['\t \t', '\t\t'], // LISTS: Wiki indents are done with more asterisks, or with minus signs ['^\t\t\\*', '***'], // Lists with asterisks ['^\t\\*', '**'], ['\n \\+ ', '\n** '], // plus sign is only two indents ['\n\\- ', '\n* '], // Lists with minus signs ['\n \\- ', '\n** '], // for some reason two spaces is only one further indent ['\n \\- ', '\n*** '], // for some reason four spaces is only two further indent ['\n \\- ', '\n*** '], // debatable this one. might be accidental // WHITESPACE CLEANUP: Pointless blank lines ['\n\n\n', '\n\n'], // intentional repeat 3x ['\n\n\n', '\n\n'], ['\n\n\n', '\n\n'], ['\n\t\t\t', '\n\n'], ['^\\*(.*?)$\n\n^\\*', '*$1\n*'], // intentional repeat 2x ['^\\*(.*?)$\n\n^\\*', '*$1\n*'], ['^(==.*?==)$\n\n', '$1\n'],*/ // HTML entities [''', '\''], // Single apostrophes ['"', '"'], // Double quotes [' ', ''], // Change from html code... :shrug: // new notes?? [' gems ',' {{Gem}}s '], [' gems.',' {{Gem}}s.'], [' (Black Lion Chest Key)',' [[$1]] '], ['<ul type="disc">', ''], ['<ul type="circle">', ''], ['<span style="color:#000000;">', ''], //fix regex 1 to 6 digits ['<span style="font-size:18pt;">', ''], //fix regex 1 or 2 digits ['[ \t]+(\r?$)','$1'], ['^\s+', ''], //['\n\n','<p></p>'], //['\n\n\n','<p></p>'], //['\n',''], ['<h1>\n\t<span>', '== '], ['</span>\n</h1>', ' ==<p></p>'], ['<h2>\n\t<span>', '=== '], ['</span>\n</h2>', ' ===<p></p>'], ['<h3>\n\t<span>', '==== '], ['</span>\n</h3>', ' ====<p></p>'], ['<h4>\n\t<span>', '===== '], ['</span>\n</h4>', ' =====<p></p>'], ['<b>', '===== '], ['</b>', ' =====<p></p>'], ['<strong>', '\'\'\''], // Same as h2 tags ??? ['</strong>', '\'\'\''], ['<h1>', '== '], ['</h1>', ' ==<p></p>'], ['<h2>', '=== '], ['</h2>', ' ===<p></p>'], //['<strong>', '=== '], // Same as h2 tags ??? //['</strong>', ' ===<p></p>'], ['<h3>', '==== '], ['</h3>', ' ====<p></p>'], ['<h4>', '===== '], ['</h4>', ' =====<p></p>'], ['<span>', ''], ['</span>', ''], [' ', ''], [':marker', ''], ['<ul>', ''], ['<li>', '* '], //['<li>', '?li?'], ['</ul>', '<p></p>'], ['</li>', '<p></p>'], ['\n', ''], ['\n\t',''], ['\n\n',''], ['\t', ''], ['\t\t', ''], ['\t\t\t', ''], // GAME ICON INSERTION: Yes some of these will be wrong - remove by hand later. ['\\* (.*?):', '* {{game update icon|$1}}:'] ]; $.map(patterns, function (p, i) { var originalText = p[0]; var newText = p[1]; var originalTextRegex = new RegExp(originalText, 'mg'); content = content.replace(originalTextRegex, newText).trim(); //console.log(content) }); document.getElementById("debug").innerHTML = `<pre>${header}${content}${footer}</pre>`; //document.getElementById("debug").innerHTML = `<pre>${header}${JSON.stringify(content)}${footer}</pre>`; //document.getElementById("debug").innerHTML = `<pre>${JSON.stringify(content)}${footer}</pre>`; //document.getElementById("debug").innerHTML = JSON.stringify(`<pre>${content}</pre>`) document.getElementById("debug_bfr_regex").style.display = "none"; //document.getElementById("dumper").style.display = "none"; }, error: function (data) { console.log('ERROR: ', data); }, complete: function () { console.log('Worker 1 complete') } }); } </script> </head> <body> <p id="test1">This will display the url!</p> <p>Patch url field: <input type="text" id="patchurl_input" placeholder="url goes here"></p> <button id="btn1">Get Notes</button> <p id="testlinks"> https://en-forum.guildwars2.com/topic/94955-game-update-notes-april-27-2021/?tab=comments#comment-1355315</p> or https://en-forum.guildwars2.com/topic/69340-game-update-notes-march-17-2020/?tab=comments#elControls_69339_menu or https://en-forum.guildwars2.com/topic/95447-game-update-notes-may-11-2021/?tab=comments#elControls_1363377_menu <p id="debug_bfr_regex"><i> before regex debug</i></p> <p id="dumper"><b> Patch notes go below</b></p> <h1>========================================</h1> <p id="debug">monkaS</p> </body> </html>
No cors (html copypasta)[edit]
https://en-forum.guildwars2.com/topic/95447-game-update-notes-may-11-2021/
- Open dev console
- Find comment-1363377_wrap // 1363377 = comment id
- Copy Element
- Paste in textarea
- ????
<!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $(document).ready(function () { $("#btn1").click(function () { var value_parse = document.getElementById('patchurl_input').value //$("#test1").text(value_parse); worker1(value_parse) }); }); function pad(s) { return (s < 10 ? '0' : '') + s; } // most of the code is a copypasta of https://wiki.guildwars2.com/index.php?title=Widget:Wikify_patch_notes&action=edit function worker1(url1) { //var commentid = url1.split('#comment-')[1];console.log(commentid) //if (commentid == undefined) commentid = url1.split('#elControls_')[1].replace(/\D/g, "");console.log(commentid) /*var commentid = url1.split('#')[1].replace(/\D/g, ""); console.log(commentid) var wikitext = $(data).find(`#elComment_${commentid}`).html().trim() console.log(wikitext)*/ var wikitext = url1 var postdate = new Date($(wikitext).find('time').toArray()[0].dateTime); var monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var monthname = monthnames[postdate.getUTCMonth()]; var postindex = 1; var header = '== Update ' + (postindex == 1 ? '' : (postindex + ' ')) + '- ' + monthname + ' ' + pad(postdate.getUTCDate()) + ', ' + postdate.getUTCFullYear() + ' ==<br>'; var footer = '=== Guild Wars 2 Wiki Notes ===<p></p>* Build: ???<p></p><noinclude>[[Category:' + monthname + ' ' + postdate.getUTCFullYear() + ' updates]]</noinclude>'; console.log(header) console.log(footer) //wikitext = JSON.stringify(wikitext) //document.getElementById("debug").innerHTML = wikitext; //console.log(wikitext) var content = $(wikitext).find("div.ipsType_normal.ipsType_richText.ipsPadding_bottom.ipsContained").html(); console.log(content) //document.getElementById("debug").innerHTML = JSON.stringify(`<pre>${content}</pre>`); // ** START OF REGEX ** // PLEASE FIX :) document.getElementById("debug_bfr_regex").innerHTML = `<pre>${header}${content.trim()}${footer}</pre>`; document.getElementById("dumper").innerHTML = JSON.stringify(`<pre>${content}</pre>`) var patterns = [ // NEWLINES: Make sure we're using wiki compatible newlines /*['\r\n', '\n'], // HEADINGS: Find lines starting with each of the following and wrap that line with: ['^### (.*?)$', '==== $1 ===='], ['^## (.*?)$', '=== $1 ==='], ['^# (.*?)$\n\n', ''], // delete the first H1 heading ['^# (.*?)$', '=== $1 ==='], // sometimes anet get confused with the rest ['^\\*\\*(.*?)\\*\\*$', '=== $1 ==='], // ITALICS: words prefixed and suffixed with underscores ['_(.*?)_', '\'\'$1\'\''], // TAB CLEANUP: Sometimes these include unintentional extra spaces between tabs ['\t \t', '\t\t'], // LISTS: Wiki indents are done with more asterisks, or with minus signs ['^\t\t\\*', '***'], // Lists with asterisks ['^\t\\*', '**'], ['\n \\+ ', '\n** '], // plus sign is only two indents ['\n\\- ', '\n* '], // Lists with minus signs ['\n \\- ', '\n** '], // for some reason two spaces is only one further indent ['\n \\- ', '\n*** '], // for some reason four spaces is only two further indent ['\n \\- ', '\n*** '], // debatable this one. might be accidental // WHITESPACE CLEANUP: Pointless blank lines ['\n\n\n', '\n\n'], // intentional repeat 3x ['\n\n\n', '\n\n'], ['\n\n\n', '\n\n'], ['\n\t\t\t', '\n\n'], ['^\\*(.*?)$\n\n^\\*', '*$1\n*'], // intentional repeat 2x ['^\\*(.*?)$\n\n^\\*', '*$1\n*'], ['^(==.*?==)$\n\n', '$1\n'],*/ // HTML entities [''', '\''], // Single apostrophes ['"', '"'], // Double quotes [' ', ''], // Change from html code... :shrug: // new notes?? [' gems ',' {{Gem}}s '], [' gems.',' {{Gem}}s.'], [' (Black Lion Chest Key)',' {{$1}} '], ['<ul type="disc">', ''], ['<ul type="circle">', ''], ['<span style="color:#000000;">', ''], //fix regex 1 to 6 digits ['<span style="font-size:18pt;">', ''], //fix regex 1 or 2 digits ['[ \t]+(\r?$)','$1'], ['^\s+', ''], //['\n\n','<p></p>'], //['\n\n\n','<p></p>'], //['\n',''], ['<h1>\n\t<span>', '== '], ['</span>\n</h1>', ' ==<p></p>'], ['<h2>\n\t<span>', '=== '], ['</span>\n</h2>', ' ===<p></p>'], ['<h3>\n\t<span>', '==== '], ['</span>\n</h3>', ' ====<p></p>'], ['<h4>\n\t<span>', '===== '], ['</span>\n</h4>', ' =====<p></p>'], ['<b>', '===== '], ['</b>', ' =====<p></p>'], ['<strong>', '\'\'\''], // Same as h2 tags ??? ['</strong>', '\'\'\''], ['<h1>', '== '], ['</h1>', ' ==<p></p>'], ['<h2>', '=== '], ['</h2>', ' ===<p></p>'], //['<strong>', '=== '], // Same as h2 tags ??? //['</strong>', ' ===<p></p>'], ['<h3>', '==== '], ['</h3>', ' ====<p></p>'], ['<h4>', '===== '], ['</h4>', ' =====<p></p>'], ['<span>', ''], ['</span>', ''], [' ', ''], [':marker', ''], ['<ul>', ''], ['<li>', '* '], //['<li>', '?li?'], ['</ul>', '<p></p>'], ['</li>', '<p></p>'], ['\n', ''], ['\n\t',''], ['\n\n',''], ['\t', ''], ['\t\t', ''], ['\t\t\t', ''], // GAME ICON INSERTION: Yes some of these will be wrong - remove by hand later. ['\\* (.*?):', '* {{game update icon|$1}}:'] ]; patterns.map( function (p, i) { var originalText = p[0]; var newText = p[1]; var originalTextRegex = new RegExp(originalText, 'mg'); content = content.replace(originalTextRegex, newText).trim(); //console.log(content) }); document.getElementById("debug").innerHTML = `<pre>${header}${content}${footer}</pre>`; //document.getElementById("debug").innerHTML = `<pre>${header}${JSON.stringify(content)}${footer}</pre>`; //document.getElementById("debug").innerHTML = `<pre>${JSON.stringify(content)}${footer}</pre>`; //document.getElementById("debug").innerHTML = JSON.stringify(`<pre>${content}</pre>`) document.getElementById("debug_bfr_regex").style.display = "none"; //document.getElementById("dumper").style.display = "none"; } </script> </head> <body> <p id="testlinks">https://en-forum.guildwars2.com/topic/95447-game-update-notes-may-11-2021/?tab=comments#elControls_1363377_menu</p> Open dev console<br> Find comment-1363377_wrap<br> Copy Element<br> Paste textarea <br> ????<br> <br> <textarea id="patchurl_input" rows="10" cols="100"></textarea> <button id="btn1">Get Notes</button> <p id="debug_bfr_regex"><i> before regex debug</i></p> <p id="dumper"><b> Patch notes go below</b></p> <h1>========================================</h1> <p id="debug">monkaS</p> </body> </html>
Patch Notes[edit]
https://en-forum.guildwars2.com/topic/94955-game-update-notes-april-27-2021/?tab=comments#elControls_1355315_menu generates...
↓ Paste here ↓
== Update - May 01, 2021 ==== 04/27/2021—April 27 Release Notes == === Living World === ==== New Release: Champions Chapter 4—Judgment ==== With their allies gathered and the future of the world hanging in the balance, the commander and Aurene must confront the twin Elder Dragons before their war consumes Tyria. Join with your friends to bring an end to the chaos in the final chapter of the Icebrood Saga finale. * {{game update icon|The final battle of the Icebrood Saga is here}}: Dragonstorm. Compete achievements, claim new rewards, and earn daily treasure in this instanced meta-event as you execute the plan to preserve the balance in the dragon cycle. Challenge the dragons in three ways: * {{game update icon|Story}}: Complete the story quest of Champions to reach a story mission version of Dragonstorm, suitable for one player and up to four additional group members. As a story mission, it's an easier challenge but won't offer the meta-event reward chest on completion. * {{game update icon|Public}}: Every two hours, an open-grouped version of Dragonstorm will be announced in the Eye of the North. Join the mission during this window to be grouped together with up to 80 like-minded players. * {{game update icon|Private Squad}}: At any time, you can launch into Dragonstorm in a premade squad from the rally point in the Eye of the North. Assemble your friends and guildmates to show your strength as a team of up to 50 players! * Unlock the final stage of the Dragon Slayer Mastery by progressing your Champions story to its climax and hearing the plan for dealing with the threat of the twin dragons.* With the fully trained Dragon Slayer Mastery, you'll be eligible for rare drops of Pristine Dragon's Eye crafting items when completing Dragonstorm. * After completing all the story chapters of the Icebrood Saga, return to the Eye of the North to receive a small token of appreciation. * Updated the entry text on Dragon Response Missions to clarify their group-size options. * Fixed an issue that could prevent Canach from offering his postmission conversations in Caledon Forest's Dragon Response Mission. === World Polish === * {{game update icon|Cursed Shore}}: Fixed a bug that would sometimes cause the "Accompany Rakkan as he tests Merla's undead camouflage potion" event to stall. * Fixed an issue that caused the Eye of the North's prompt for daily strike achievements to be out of sync with the daily strike. === General === * {{game update icon|Added gutturals to the following player emotes}}: shiver, play dead, and stretch. === Items === * The Elegant Artificer's Backpack recipe has been restored. === BLACK LION TRADING COMPANY GEM STORE === ==== New Items and Promotions ==== * The new Spellfire Torch Skin is available in the Style category of the Gem Store for 600 {{Gem}}s. * Two [[Black Lion Chest Key]] s can be claimed at no cost for one week only, in celebration of the conclusion of the Icebrood Saga. Limit one per account. This is not available for Play for Free accounts. * For a limited time, the Frostfire Glider, Frostfire Outfit, and Frostfire Appearance Package are available on sale in the Style category of the Gem Store for 400, 560, and 1,600 {{Gem}}s respectively—a savings of 20%. * For a limited time, the Grenth's Regalia Outfit, Daydreamer's Finery Outfit, and Timekeeper Outfit are available on sale in the Style category of the Gem Store for 560 {{Gem}}s each—a savings of 20%. ==== Black Lion Chest ==== * The Black Lion Chest has been updated to the Seraph Chest and can be previewed for a full list of its contents. * The Fine Black Lion Dye Canister—Red returns as the guaranteed item for the duration of the Seraph Chest. * The new Seraph Wings Backpack and Glider Combo is available as an uncommon drop for the duration of this chest. * The Mystic Smoking Pipe Warhorn Skin returns as an uncommon drop for the duration of this chest. * The Orchestral and Abaddon weapon collections are available for the duration of this chest. * Unused versions of the Glyph of the Watchknight and Glyph of Virtue are available as rare drops for the duration of this chest. * The items available in exchange for Black Lion Statuettes have been updated. Black Lion Statuettes are redeemable by using the statuette itself or by redeeming one at any of the Black Lion Chest Merchants located in every major city. * The exclusive Shimmering Aurora Cape and Glider Combo, Mini Branded Mounts Pack, Roaring Dragon Glider, Whale Spirit Glider, and Svanir Gauntlets are currently available. * The two bonus collections have been updated to a selection of armor skin sets and gathering tools, including but not limited to the Zodiac Light Armor Skin and the Mad Scientist's Harvesting Tool. ==== Improvements and Updates ==== * New skins have been added to the Guaranteed Wardrobe Unlock, Guaranteed Armor Unlock, and Guaranteed Weapon Unlock. * New skins have been added to the Black Lion Exclusives Chest. === Guild Wars 2 Wiki Notes === * Build: ??? [[Category:May 2021 updates]]
Update - May 01, 2021 ==== 04/27/2021—April 27 Release Notes[edit]
Living World[edit]
New Release: Champions Chapter 4—Judgment[edit]
With their allies gathered and the future of the world hanging in the balance, the commander and Aurene must confront the twin Elder Dragons before their war consumes Tyria. Join with your friends to bring an end to the chaos in the final chapter of the Icebrood Saga finale.
- {{game update icon|The final battle of the Icebrood Saga is here}}: Dragonstorm.
Compete achievements, claim new rewards, and earn daily treasure in this instanced meta-event as you execute the plan to preserve the balance in the dragon cycle. Challenge the dragons in three ways:
- Story Journal: Complete the story quest of Champions to reach a story mission version of Dragonstorm, suitable for one player and up to four additional group members. As a story mission, it's an easier challenge but won't offer the meta-event reward chest on completion.
- {{game update icon|Public}}: Every two hours, an open-grouped version of Dragonstorm will be announced in the Eye of the North. Join the mission during this window to be grouped together with up to 80 like-minded players.
- {{game update icon|Private Squad}}: At any time, you can launch into Dragonstorm in a premade squad from the rally point in the Eye of the North. Assemble your friends and guildmates to show your strength as a team of up to 50 players!
- Unlock the final stage of the Dragon Slayer Mastery by progressing your Champions story to its climax and hearing the plan for dealing with the threat of the twin dragons.* With the fully trained Dragon Slayer Mastery, you'll be eligible for rare drops of Pristine Dragon's Eye crafting items when completing Dragonstorm.
- After completing all the story chapters of the Icebrood Saga, return to the Eye of the North to receive a small token of appreciation.
- Updated the entry text on Dragon Response Missions to clarify their group-size options.
- Fixed an issue that could prevent Canach from offering his postmission conversations in Caledon Forest's Dragon Response Mission.
World Polish[edit]
Fixed a bug that would sometimes cause the "Accompany Rakkan as he tests Merla's undead camouflage potion" event to stall.
- Fixed an issue that caused the Eye of the North's prompt for daily strike achievements to be out of sync with the daily strike.
General[edit]
- {{game update icon|Added gutturals to the following player emotes}}: shiver, play dead, and stretch.
Items[edit]
- The Elegant Artificer's Backpack recipe has been restored.
BLACK LION TRADING COMPANY GEM STORE[edit]
New Items and Promotions[edit]
- The new Spellfire Torch Skin is available in the Style category of the Gem Store for 600 s.
- Two Black Lion Chest Key s can be claimed at no cost for one week only, in celebration of the conclusion of the Icebrood Saga. Limit one per account. This is not available for Play for Free accounts.
- For a limited time, the Frostfire Glider, Frostfire Outfit, and Frostfire Appearance Package are available on sale in the Style category of the Gem Store for 400, 560, and 1,600 s respectively—a savings of 20%.
- For a limited time, the Grenth's Regalia Outfit, Daydreamer's Finery Outfit, and Timekeeper Outfit are available on sale in the Style category of the Gem Store for 560 s each—a savings of 20%.
Black Lion Chest[edit]
- The Black Lion Chest has been updated to the Seraph Chest and can be previewed for a full list of its contents.
- The Fine Black Lion Dye Canister—Red returns as the guaranteed item for the duration of the Seraph Chest.
- The new Seraph Wings Backpack and Glider Combo is available as an uncommon drop for the duration of this chest.
- The Mystic Smoking Pipe Warhorn Skin returns as an uncommon drop for the duration of this chest.
- The Orchestral and Abaddon weapon collections are available for the duration of this chest.
- Unused versions of the Glyph of the Watchknight and Glyph of Virtue are available as rare drops for the duration of this chest.
- The items available in exchange for Black Lion Statuettes have been updated. Black Lion Statuettes are redeemable by using the statuette itself or by redeeming one at any of the Black Lion Chest Merchants located in every major city.
- The exclusive Shimmering Aurora Cape and Glider Combo, Mini Branded Mounts Pack, Roaring Dragon Glider, Whale Spirit Glider, and Svanir Gauntlets are currently available.
- The two bonus collections have been updated to a selection of armor skin sets and gathering tools, including but not limited to the Zodiac Light Armor Skin and the Mad Scientist's Harvesting Tool.
Improvements and Updates[edit]
- New skins have been added to the Guaranteed Wardrobe Unlock, Guaranteed Armor Unlock, and Guaranteed Weapon Unlock.
- New skins have been added to the Black Lion Exclusives Chest.
Guild Wars 2 Wiki Notes[edit]
- Build: ???
Category:May 2021 updates