diff --git a/Interface/AddOns/Blizzard_APIDocumentation/CurrencyConstantsDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/CurrencyConstantsDocumentation.lua
new file mode 100644
index 0000000000000000000000000000000000000000..bf7b86bfb8d58e2941ff42fb4dc91b51dfb62225
--- /dev/null
+++ b/Interface/AddOns/Blizzard_APIDocumentation/CurrencyConstantsDocumentation.lua
@@ -0,0 +1,224 @@
+local CurrencyConstants =
+{
+ Tables =
+ {
+ {
+ Name = "CurrencyDestroyReason",
+ Type = "Enumeration",
+ NumValues = 12,
+ MinValue = 0,
+ MaxValue = 11,
+ Fields =
+ {
+ { Name = "Cheat", Type = "CurrencyDestroyReason", EnumValue = 0 },
+ { Name = "Spell", Type = "CurrencyDestroyReason", EnumValue = 1 },
+ { Name = "VersionUpdate", Type = "CurrencyDestroyReason", EnumValue = 2 },
+ { Name = "QuestTurnin", Type = "CurrencyDestroyReason", EnumValue = 3 },
+ { Name = "Vendor", Type = "CurrencyDestroyReason", EnumValue = 4 },
+ { Name = "Trade", Type = "CurrencyDestroyReason", EnumValue = 5 },
+ { Name = "Capped", Type = "CurrencyDestroyReason", EnumValue = 6 },
+ { Name = "Garrison", Type = "CurrencyDestroyReason", EnumValue = 7 },
+ { Name = "DroppedToCorpse", Type = "CurrencyDestroyReason", EnumValue = 8 },
+ { Name = "BonusRoll", Type = "CurrencyDestroyReason", EnumValue = 9 },
+ { Name = "FactionConversion", Type = "CurrencyDestroyReason", EnumValue = 10 },
+ { Name = "Last", Type = "CurrencyDestroyReason", EnumValue = 11 },
+ },
+ },
+ {
+ Name = "CurrencyFlags",
+ Type = "Enumeration",
+ NumValues = 32,
+ MinValue = -2147483648,
+ MaxValue = 1073741824,
+ Fields =
+ {
+ { Name = "CurrencyTradable", Type = "CurrencyFlags", EnumValue = 1 },
+ { Name = "CurrencyAppearsInLootWindow", Type = "CurrencyFlags", EnumValue = 2 },
+ { Name = "CurrencyComputedWeeklyMaximum", Type = "CurrencyFlags", EnumValue = 4 },
+ { Name = "Currency_100_Scaler", Type = "CurrencyFlags", EnumValue = 8 },
+ { Name = "CurrencyNoLowLevelDrop", Type = "CurrencyFlags", EnumValue = 16 },
+ { Name = "CurrencyIgnoreMaxQtyOnLoad", Type = "CurrencyFlags", EnumValue = 32 },
+ { Name = "CurrencyLogOnWorldChange", Type = "CurrencyFlags", EnumValue = 64 },
+ { Name = "CurrencyTrackQuantity", Type = "CurrencyFlags", EnumValue = 128 },
+ { Name = "CurrencyResetTrackedQuantity", Type = "CurrencyFlags", EnumValue = 256 },
+ { Name = "CurrencyUpdateVersionIgnoreMax", Type = "CurrencyFlags", EnumValue = 512 },
+ { Name = "CurrencySuppressChatMessageOnVersionChange", Type = "CurrencyFlags", EnumValue = 1024 },
+ { Name = "CurrencySingleDropInLoot", Type = "CurrencyFlags", EnumValue = 2048 },
+ { Name = "CurrencyHasWeeklyCatchup", Type = "CurrencyFlags", EnumValue = 4096 },
+ { Name = "CurrencyDoNotCompressChat", Type = "CurrencyFlags", EnumValue = 8192 },
+ { Name = "CurrencyDoNotLogAcquisitionToBi", Type = "CurrencyFlags", EnumValue = 16384 },
+ { Name = "CurrencyNoRaidDrop", Type = "CurrencyFlags", EnumValue = 32768 },
+ { Name = "CurrencyNotPersistent", Type = "CurrencyFlags", EnumValue = 65536 },
+ { Name = "CurrencyDeprecated", Type = "CurrencyFlags", EnumValue = 131072 },
+ { Name = "CurrencyDynamicMaximum", Type = "CurrencyFlags", EnumValue = 262144 },
+ { Name = "CurrencySuppressChatMessages", Type = "CurrencyFlags", EnumValue = 524288 },
+ { Name = "CurrencyDoNotToast", Type = "CurrencyFlags", EnumValue = 1048576 },
+ { Name = "CurrencyDestroyExtraOnLoot", Type = "CurrencyFlags", EnumValue = 2097152 },
+ { Name = "CurrencyDontShowTotalInTooltip", Type = "CurrencyFlags", EnumValue = 4194304 },
+ { Name = "CurrencyDontCoalesceInLootWindow", Type = "CurrencyFlags", EnumValue = 8388608 },
+ { Name = "CurrencyAccountWide", Type = "CurrencyFlags", EnumValue = 16777216 },
+ { Name = "CurrencyAllowOverflowMailer", Type = "CurrencyFlags", EnumValue = 33554432 },
+ { Name = "CurrencyHideAsReward", Type = "CurrencyFlags", EnumValue = 67108864 },
+ { Name = "CurrencyHasWarmodeBonus", Type = "CurrencyFlags", EnumValue = 134217728 },
+ { Name = "CurrencyIsAllianceOnly", Type = "CurrencyFlags", EnumValue = 268435456 },
+ { Name = "CurrencyIsHordeOnly", Type = "CurrencyFlags", EnumValue = 536870912 },
+ { Name = "CurrencyLimitWarmodeBonusOncePerTooltip", Type = "CurrencyFlags", EnumValue = 1073741824 },
+ { Name = "DeprecatedCurrencyFlag", Type = "CurrencyFlags", EnumValue = -2147483648 },
+ },
+ },
+ {
+ Name = "CurrencyFlagsB",
+ Type = "Enumeration",
+ NumValues = 2,
+ MinValue = 1,
+ MaxValue = 2,
+ Fields =
+ {
+ { Name = "CurrencyBUseTotalEarnedForMaxQty", Type = "CurrencyFlagsB", EnumValue = 1 },
+ { Name = "CurrencyBShowQuestXpGainInTooltip", Type = "CurrencyFlagsB", EnumValue = 2 },
+ },
+ },
+ {
+ Name = "CurrencyGainFlags",
+ Type = "Enumeration",
+ NumValues = 3,
+ MinValue = 1,
+ MaxValue = 4,
+ Fields =
+ {
+ { Name = "BonusAward", Type = "CurrencyGainFlags", EnumValue = 1 },
+ { Name = "DroppedFromDeath", Type = "CurrencyGainFlags", EnumValue = 2 },
+ { Name = "FromAccountServer", Type = "CurrencyGainFlags", EnumValue = 4 },
+ },
+ },
+ {
+ Name = "CurrencySource",
+ Type = "Enumeration",
+ NumValues = 49,
+ MinValue = 0,
+ MaxValue = 48,
+ Fields =
+ {
+ { Name = "ConvertOldItem", Type = "CurrencySource", EnumValue = 0 },
+ { Name = "ConvertOldPvPCurrency", Type = "CurrencySource", EnumValue = 1 },
+ { Name = "ItemRefund", Type = "CurrencySource", EnumValue = 2 },
+ { Name = "QuestReward", Type = "CurrencySource", EnumValue = 3 },
+ { Name = "Cheat", Type = "CurrencySource", EnumValue = 4 },
+ { Name = "Vendor", Type = "CurrencySource", EnumValue = 5 },
+ { Name = "PvPKillCredit", Type = "CurrencySource", EnumValue = 6 },
+ { Name = "PvPMetaCredit", Type = "CurrencySource", EnumValue = 7 },
+ { Name = "PvPScriptedAward", Type = "CurrencySource", EnumValue = 8 },
+ { Name = "Loot", Type = "CurrencySource", EnumValue = 9 },
+ { Name = "UpdatingVersion", Type = "CurrencySource", EnumValue = 10 },
+ { Name = "LfgReward", Type = "CurrencySource", EnumValue = 11 },
+ { Name = "Trade", Type = "CurrencySource", EnumValue = 12 },
+ { Name = "Spell", Type = "CurrencySource", EnumValue = 13 },
+ { Name = "ItemDeletion", Type = "CurrencySource", EnumValue = 14 },
+ { Name = "RatedBattleground", Type = "CurrencySource", EnumValue = 15 },
+ { Name = "RandomBattleground", Type = "CurrencySource", EnumValue = 16 },
+ { Name = "Arena", Type = "CurrencySource", EnumValue = 17 },
+ { Name = "ExceededMaxQty", Type = "CurrencySource", EnumValue = 18 },
+ { Name = "PvPCompletionBonus", Type = "CurrencySource", EnumValue = 19 },
+ { Name = "Script", Type = "CurrencySource", EnumValue = 20 },
+ { Name = "GuildBankWithdrawal", Type = "CurrencySource", EnumValue = 21 },
+ { Name = "Pushloot", Type = "CurrencySource", EnumValue = 22 },
+ { Name = "GarrisonBuilding", Type = "CurrencySource", EnumValue = 23 },
+ { Name = "PvPDrop", Type = "CurrencySource", EnumValue = 24 },
+ { Name = "GarrisonFollowerActivation", Type = "CurrencySource", EnumValue = 25 },
+ { Name = "GarrisonBuildingRefund", Type = "CurrencySource", EnumValue = 26 },
+ { Name = "GarrisonMissionReward", Type = "CurrencySource", EnumValue = 27 },
+ { Name = "GarrisonResourceOverTime", Type = "CurrencySource", EnumValue = 28 },
+ { Name = "QuestRewardIgnoreCaps", Type = "CurrencySource", EnumValue = 29 },
+ { Name = "GarrisonTalent", Type = "CurrencySource", EnumValue = 30 },
+ { Name = "GarrisonWorldQuestBonus", Type = "CurrencySource", EnumValue = 31 },
+ { Name = "PvPHonorReward", Type = "CurrencySource", EnumValue = 32 },
+ { Name = "BonusRoll", Type = "CurrencySource", EnumValue = 33 },
+ { Name = "AzeriteRespec", Type = "CurrencySource", EnumValue = 34 },
+ { Name = "WorldQuestReward", Type = "CurrencySource", EnumValue = 35 },
+ { Name = "WorldQuestRewardIgnoreCaps", Type = "CurrencySource", EnumValue = 36 },
+ { Name = "FactionConversion", Type = "CurrencySource", EnumValue = 37 },
+ { Name = "DailyQuestReward", Type = "CurrencySource", EnumValue = 38 },
+ { Name = "DailyQuestWarModeReward", Type = "CurrencySource", EnumValue = 39 },
+ { Name = "WeeklyQuestReward", Type = "CurrencySource", EnumValue = 40 },
+ { Name = "WeeklyQuestWarModeReward", Type = "CurrencySource", EnumValue = 41 },
+ { Name = "AccountCopy", Type = "CurrencySource", EnumValue = 42 },
+ { Name = "WeeklyRewardChest", Type = "CurrencySource", EnumValue = 43 },
+ { Name = "GarrisonTalentTreeReset", Type = "CurrencySource", EnumValue = 44 },
+ { Name = "DailyReset", Type = "CurrencySource", EnumValue = 45 },
+ { Name = "AddConduitToCollection", Type = "CurrencySource", EnumValue = 46 },
+ { Name = "Last", Type = "CurrencySource", EnumValue = 47 },
+ { Name = "Barbershop", Type = "CurrencySource", EnumValue = 48 },
+ },
+ },
+ {
+ Name = "CurrencyTokenCategoryFlags",
+ Type = "Enumeration",
+ NumValues = 4,
+ MinValue = 1,
+ MaxValue = 8,
+ Fields =
+ {
+ { Name = "FlagSortLast", Type = "CurrencyTokenCategoryFlags", EnumValue = 1 },
+ { Name = "FlagPlayerItemAssignment", Type = "CurrencyTokenCategoryFlags", EnumValue = 2 },
+ { Name = "Hidden", Type = "CurrencyTokenCategoryFlags", EnumValue = 4 },
+ { Name = "Virtual", Type = "CurrencyTokenCategoryFlags", EnumValue = 8 },
+ },
+ },
+ {
+ Name = "PlayerCurrencyFlags",
+ Type = "Enumeration",
+ NumValues = 2,
+ MinValue = 1,
+ MaxValue = 2,
+ Fields =
+ {
+ { Name = "Incremented", Type = "PlayerCurrencyFlags", EnumValue = 1 },
+ { Name = "Loading", Type = "PlayerCurrencyFlags", EnumValue = 2 },
+ },
+ },
+ {
+ Name = "PlayerCurrencyFlagsDbFlags",
+ Type = "Enumeration",
+ NumValues = 5,
+ MinValue = 1,
+ MaxValue = 16,
+ Fields =
+ {
+ { Name = "IgnoreMaxQtyOnload", Type = "PlayerCurrencyFlagsDbFlags", EnumValue = 1 },
+ { Name = "Reuse1", Type = "PlayerCurrencyFlagsDbFlags", EnumValue = 2 },
+ { Name = "InBackpack", Type = "PlayerCurrencyFlagsDbFlags", EnumValue = 4 },
+ { Name = "UnusedInUI", Type = "PlayerCurrencyFlagsDbFlags", EnumValue = 8 },
+ { Name = "Reuse2", Type = "PlayerCurrencyFlagsDbFlags", EnumValue = 16 },
+ },
+ },
+ {
+ Name = "CurrencyConsts",
+ Type = "Constants",
+ Values =
+ {
+ { Name = "PLAYER_CURRENCY_CLIENT_FLAGS", Type = "number", Value = Enum.PlayerCurrencyFlagsDbFlags.InBackpack + Enum.PlayerCurrencyFlagsDbFlags.UnusedInUI },
+ { Name = "MAX_CURRENCY_QUANTITY", Type = "number", Value = 100000000 },
+ { Name = "CONQUEST_ARENA_AND_BG_META_CURRENCY_ID", Type = "number", Value = 483 },
+ { Name = "CONQUEST_RATED_BG_META_CURRENCY_ID", Type = "number", Value = 484 },
+ { Name = "CONQUEST_ASHRAN_META_CURRENCY_ID", Type = "number", Value = 692 },
+ { Name = "ACCOUNT_WIDE_HONOR_CURRENCY_ID", Type = "number", Value = 1585 },
+ { Name = "ACCOUNT_WIDE_HONOR_LEVEL_CURRENCY_ID", Type = "number", Value = 1586 },
+ { Name = "CONQUEST_CURRENCY_ID", Type = "number", Value = 1602 },
+ { Name = "HONOR_CURRENCY_ID", Type = "number", Value = 1792 },
+ { Name = "ARTIFACT_KNOWLEDGE_CURRENCY_ID", Type = "number", Value = 1171 },
+ { Name = "WAR_RESOURCES_CURRENCY_ID", Type = "number", Value = 1560 },
+ { Name = "ECHOES_OF_NYALOTHA_CURRENCY_ID", Type = "number", Value = 1803 },
+ { Name = "QUESTIONMARK_INV_ICON", Type = "number", Value = 134400 },
+ { Name = "CURRENCY_ID_RENOWN", Type = "number", Value = 1822 },
+ { Name = "CURRENCY_ID_RENOWN_KYRIAN", Type = "number", Value = 1829 },
+ { Name = "CURRENCY_ID_RENOWN_VENTHYR", Type = "number", Value = 1830 },
+ { Name = "CURRENCY_ID_RENOWN_NIGHT_FAE", Type = "number", Value = 1831 },
+ { Name = "CURRENCY_ID_RENOWN_NECROLORD", Type = "number", Value = 1832 },
+ { Name = "CURRENCY_ID_WILLING_SOUL", Type = "number", Value = 1810 },
+ { Name = "CURRENCY_ID_RESERVOIR_ANIMA", Type = "number", Value = 1813 },
+ },
+ },
+ },
+};
+
+APIDocumentation:AddDocumentationTable(CurrencyConstants);
\ No newline at end of file
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua
index 08189f79b57db633b5ba3febb5624741b15bbce8..aadc55f481fbc8809768bb0d9115fc20c732b957 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua
@@ -186,8 +186,8 @@ local GarrisonConstants =
{ Name = "Generic", Type = "GarrTalentFeatureSubtype", EnumValue = 0 },
{ Name = "Bastion", Type = "GarrTalentFeatureSubtype", EnumValue = 1 },
{ Name = "Revendreth", Type = "GarrTalentFeatureSubtype", EnumValue = 2 },
- { Name = "Maldraxxus", Type = "GarrTalentFeatureSubtype", EnumValue = 3 },
- { Name = "Ardenweald", Type = "GarrTalentFeatureSubtype", EnumValue = 4 },
+ { Name = "Ardenweald", Type = "GarrTalentFeatureSubtype", EnumValue = 3 },
+ { Name = "Maldraxxus", Type = "GarrTalentFeatureSubtype", EnumValue = 4 },
},
},
{
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua
index efeec24eff60c86bb92972d75b8c36ca83890de8..98d8dd04aee121c97b62b0f9cddd50080d2fde4e 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua
@@ -38,6 +38,15 @@ local PlayerMentorship =
{ Name = "status", Type = "PlayerMentorshipStatus", Nilable = false },
},
},
+ {
+ Name = "IsActivePlayerConsideredNewcomer",
+ Type = "Function",
+
+ Returns =
+ {
+ { Name = "isConsideredNewcomer", Type = "bool", Nilable = false },
+ },
+ },
{
Name = "IsMentorRestricted",
Type = "Function",
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/SoulbindsDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/SoulbindsDocumentation.lua
index e56677347e534992e589ea3ce2d7d188a49c8bb6..96e3d659a5d8d637827741b1df6e0e965e34d3d6 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/SoulbindsDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/SoulbindsDocumentation.lua
@@ -16,22 +16,31 @@ local Soulbinds =
},
},
{
- Name = "AddPendingConduit",
+ Name = "CanActivateSoulbind",
Type = "Function",
Arguments =
{
- { Name = "nodeID", Type = "number", Nilable = false },
- { Name = "conduitID", Type = "number", Nilable = false },
+ { Name = "soulbindID", Type = "number", Nilable = false },
},
Returns =
{
{ Name = "result", Type = "bool", Nilable = false },
+ { Name = "errorDescription", Type = "string", Nilable = true },
},
},
{
- Name = "CanActivateSoulbind",
+ Name = "CanModifySoulbind",
+ Type = "Function",
+
+ Returns =
+ {
+ { Name = "result", Type = "bool", Nilable = false },
+ },
+ },
+ {
+ Name = "CanResetConduitsInSoulbind",
Type = "Function",
Arguments =
@@ -46,40 +55,76 @@ local Soulbinds =
},
},
{
- Name = "CanModifySoulbind",
+ Name = "CloseUI",
Type = "Function",
+ },
+ {
+ Name = "CommitPendingConduitsInSoulbind",
+ Type = "Function",
+
+ Arguments =
+ {
+ { Name = "soulbindID", Type = "number", Nilable = false },
+ },
+ },
+ {
+ Name = "FindNodeIDActuallyInstalled",
+ Type = "Function",
+
+ Arguments =
+ {
+ { Name = "soulbindID", Type = "number", Nilable = false },
+ { Name = "conduitID", Type = "number", Nilable = false },
+ },
Returns =
{
- { Name = "result", Type = "bool", Nilable = false },
+ { Name = "nodeID", Type = "number", Nilable = false },
},
},
{
- Name = "CanResetConduitsInSoulbind",
+ Name = "FindNodeIDAppearingInstalled",
Type = "Function",
Arguments =
{
{ Name = "soulbindID", Type = "number", Nilable = false },
+ { Name = "conduitID", Type = "number", Nilable = false },
},
Returns =
{
- { Name = "result", Type = "bool", Nilable = false },
- { Name = "errorDescription", Type = "string", Nilable = true },
+ { Name = "nodeID", Type = "number", Nilable = false },
},
},
{
- Name = "CloseUI",
+ Name = "FindNodeIDPendingInstall",
Type = "Function",
+
+ Arguments =
+ {
+ { Name = "soulbindID", Type = "number", Nilable = false },
+ { Name = "conduitID", Type = "number", Nilable = false },
+ },
+
+ Returns =
+ {
+ { Name = "nodeID", Type = "number", Nilable = false },
+ },
},
{
- Name = "CommitPendingConduitsInSoulbind",
+ Name = "FindNodeIDPendingUninstall",
Type = "Function",
Arguments =
{
{ Name = "soulbindID", Type = "number", Nilable = false },
+ { Name = "conduitID", Type = "number", Nilable = false },
+ },
+
+ Returns =
+ {
+ { Name = "nodeID", Type = "number", Nilable = false },
},
},
{
@@ -146,6 +191,20 @@ local Soulbinds =
{ Name = "collectionData", Type = "ConduitCollectionData", Nilable = true },
},
},
+ {
+ Name = "GetConduitDisplayed",
+ Type = "Function",
+
+ Arguments =
+ {
+ { Name = "nodeID", Type = "number", Nilable = false },
+ },
+
+ Returns =
+ {
+ { Name = "conduitID", Type = "number", Nilable = false },
+ },
+ },
{
Name = "GetConduitHyperlink",
Type = "Function",
@@ -161,6 +220,20 @@ local Soulbinds =
{ Name = "link", Type = "string", Nilable = false },
},
},
+ {
+ Name = "GetConduitIDPendingInstall",
+ Type = "Function",
+
+ Arguments =
+ {
+ { Name = "nodeID", Type = "number", Nilable = false },
+ },
+
+ Returns =
+ {
+ { Name = "conduitID", Type = "number", Nilable = false },
+ },
+ },
{
Name = "GetConduitItemLevel",
Type = "Function",
@@ -221,7 +294,7 @@ local Soulbinds =
},
},
{
- Name = "GetNode",
+ Name = "GetInstalledConduitID",
Type = "Function",
Arguments =
@@ -231,11 +304,11 @@ local Soulbinds =
Returns =
{
- { Name = "node", Type = "SoulbindNode", Nilable = false },
+ { Name = "conduitID", Type = "number", Nilable = false },
},
},
{
- Name = "GetPendingConduitID",
+ Name = "GetNode",
Type = "Function",
Arguments =
@@ -245,26 +318,34 @@ local Soulbinds =
Returns =
{
- { Name = "conduitID", Type = "number", Nilable = false },
+ { Name = "node", Type = "SoulbindNode", Nilable = false },
},
},
{
- Name = "GetPendingNodeIDInSoulbind",
+ Name = "GetSoulbindData",
Type = "Function",
Arguments =
{
{ Name = "soulbindID", Type = "number", Nilable = false },
- { Name = "conduitID", Type = "number", Nilable = false },
},
Returns =
{
- { Name = "nodeID", Type = "number", Nilable = false },
+ { Name = "data", Type = "SoulbindData", Nilable = false },
},
},
{
- Name = "GetSoulbindData",
+ Name = "GetTotalConduitChargesPending",
+ Type = "Function",
+
+ Returns =
+ {
+ { Name = "count", Type = "number", Nilable = false },
+ },
+ },
+ {
+ Name = "GetTotalConduitChargesPendingInSoulbind",
Type = "Function",
Arguments =
@@ -274,7 +355,7 @@ local Soulbinds =
Returns =
{
- { Name = "data", Type = "SoulbindData", Nilable = false },
+ { Name = "count", Type = "number", Nilable = false },
},
},
{
@@ -314,21 +395,6 @@ local Soulbinds =
{ Name = "result", Type = "bool", Nilable = false },
},
},
- {
- Name = "HasPendingConduitInSoulbind",
- Type = "Function",
-
- Arguments =
- {
- { Name = "soulbindID", Type = "number", Nilable = false },
- { Name = "conduitID", Type = "number", Nilable = false },
- },
-
- Returns =
- {
- { Name = "result", Type = "bool", Nilable = false },
- },
- },
{
Name = "HasPendingConduitsInSoulbind",
Type = "Function",
@@ -387,12 +453,12 @@ local Soulbinds =
},
},
{
- Name = "IsUnselectedConduitPendingInSoulbind",
+ Name = "IsNodePendingModify",
Type = "Function",
Arguments =
{
- { Name = "soulbindID", Type = "number", Nilable = false },
+ { Name = "nodeID", Type = "number", Nilable = false },
},
Returns =
@@ -401,21 +467,28 @@ local Soulbinds =
},
},
{
- Name = "RemovePendingConduit",
+ Name = "IsUnselectedConduitPendingInSoulbind",
Type = "Function",
Arguments =
{
- { Name = "nodeID", Type = "number", Nilable = false },
+ { Name = "soulbindID", Type = "number", Nilable = false },
+ },
+
+ Returns =
+ {
+ { Name = "result", Type = "bool", Nilable = false },
},
},
{
- Name = "ResetSoulbindConduits",
+ Name = "ModifyNode",
Type = "Function",
Arguments =
{
- { Name = "soulbindID", Type = "number", Nilable = false },
+ { Name = "nodeID", Type = "number", Nilable = false },
+ { Name = "conduitID", Type = "number", Nilable = false },
+ { Name = "type", Type = "SoulbindConduitTransactionType", Nilable = false },
},
},
{
@@ -428,12 +501,12 @@ local Soulbinds =
},
},
{
- Name = "SetConduitCharges",
+ Name = "UnmodifyNode",
Type = "Function",
Arguments =
{
- { Name = "charges", Type = "number", Nilable = false },
+ { Name = "nodeID", Type = "number", Nilable = false },
},
},
},
@@ -501,11 +574,6 @@ local Soulbinds =
{ Name = "data", Type = "SoulbindConduitData", Nilable = false },
},
},
- {
- Name = "SoulbindConduitsReset",
- Type = "Event",
- LiteralName = "SOULBIND_CONDUITS_RESET",
- },
{
Name = "SoulbindForgeInteractionEnded",
Type = "Event",
@@ -556,7 +624,6 @@ local Soulbinds =
{
{ Name = "nodeID", Type = "number", Nilable = false },
{ Name = "conduitID", Type = "number", Nilable = false },
- { Name = "pending", Type = "bool", Nilable = false },
},
},
},
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/UIWidgetManagerDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/UIWidgetManagerDocumentation.lua
index 24cfe3b7d16cc962d87b93e584569787bf9f0e4f..c2829ff03f13d8879593b8001fd0ea1e28f5e3e3 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/UIWidgetManagerDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/UIWidgetManagerDocumentation.lua
@@ -337,7 +337,7 @@ local UIWidgetManager =
},
},
{
- Name = "GetWidgetLayoutDirectionFromWidgetSetID",
+ Name = "GetWidgetSetInfo",
Type = "Function",
Arguments =
@@ -347,7 +347,7 @@ local UIWidgetManager =
Returns =
{
- { Name = "layoutDirection", Type = "UIWidgetLayoutDirection", Nilable = false },
+ { Name = "widgetSetInfo", Type = "UIWidgetSetInfo", Nilable = false },
},
},
{
@@ -1188,6 +1188,15 @@ local UIWidgetManager =
{ Name = "unitToken", Type = "string", Nilable = true },
},
},
+ {
+ Name = "UIWidgetSetInfo",
+ Type = "Structure",
+ Fields =
+ {
+ { Name = "layoutDirection", Type = "UIWidgetSetLayoutDirection", Nilable = false },
+ { Name = "verticalPadding", Type = "number", Nilable = false },
+ },
+ },
{
Name = "UIWidgetSpellInfo",
Type = "Structure",
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/VignetteInfoDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/VignetteInfoDocumentation.lua
index 64d7c85da53a16d926ddb98a9fe1821ba4e476e2..73d0db3d8dbe184cd1993bb35db9bf206ea290d7 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/VignetteInfoDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/VignetteInfoDocumentation.lua
@@ -105,6 +105,7 @@ local VignetteInfo =
{ Name = "name", Type = "string", Nilable = false },
{ Name = "isDead", Type = "bool", Nilable = false },
{ Name = "onWorldMap", Type = "bool", Nilable = false },
+ { Name = "zoneInfiniteAOI", Type = "bool", Nilable = false },
{ Name = "onMinimap", Type = "bool", Nilable = false },
{ Name = "isUnique", Type = "bool", Nilable = false },
{ Name = "inFogOfWar", Type = "bool", Nilable = false },
diff --git a/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.lua b/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.lua
index f4f7dee5835762240dad9afa61d3550c8130b0b7..ae3e18da2d68eff39bbab9fb67714cf70ad3c855 100644
--- a/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.lua
+++ b/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.lua
@@ -333,8 +333,7 @@ function AnimaDiversionFrameMixin:SetupCurrencyFrame()
local animaCurrencyID, maxDisplayableValue = C_CovenantSanctumUI.GetAnimaInfo()
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(animaCurrencyID);
if(currencyInfo) then
- self.AnimaDiversionCurrencyFrame.CurrencyFrame.Quantity:SetText(currencyInfo.quantity);
- self.AnimaDiversionCurrencyFrame.CurrencyFrame.CurrencyIcon:SetTexture(currencyInfo.iconFileID);
+ self.AnimaDiversionCurrencyFrame.CurrencyFrame.Quantity:SetText(ANIMA_DIVERSION_CURRENCY_DISPLAY:format(currencyInfo.quantity, currencyInfo.iconFileID));
end
end
@@ -420,7 +419,7 @@ function AnimaDiversionSelectionInfoMixin:SetupCosts(CurrencyCosts)
end
end
self.SelectButton:ClearAllPoints();
- self.SelectButton:SetPoint("TOP", self.lastCurrency, "BOTTOM", 10, -20);
+ self.SelectButton:SetPoint("TOP", self.lastCurrency, "BOTTOM", 10, -10);
self.AlreadySelected:ClearAllPoints();
self.AlreadySelected:SetPoint("CENTER", self.SelectButton);
return playerCanAfford;
@@ -429,15 +428,15 @@ end
function AnimaDiversionSelectionInfoMixin:SetupSingleCurrency(index, costInfo)
local currency = self.currencyPool:Acquire();
if(index == 1) then
- currency:SetPoint("TOP", self.Description, "BOTTOM", -15, 8);
+ currency:SetPoint("TOP", self.Description, "BOTTOM", -15, -10);
else
currency:SetPoint("TOP", self.lastCurrency, "BOTTOM", 0, -10);
end
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(costInfo.currencyID);
if(currencyInfo) then
- currency.Quantity:SetText(costInfo.quantity);
- currency.CurrencyIcon:SetTexture(currencyInfo.iconFileID);
+ currency.Quantity:SetJustifyH("LEFT");
+ currency.Quantity:SetText(ANIMA_DIVERSION_CURRENCY_DISPLAY:format(costInfo.quantity, currencyInfo.iconFileID));
end
currency.currencyInfo = currencyInfo;
diff --git a/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.xml b/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.xml
index a63cbbee473bfe8c7c6342214f98d88e27fc6ba9..2318ac281f1f46dac06db4c4299a3a3c89a79af4 100644
--- a/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.xml
+++ b/Interface/AddOns/Blizzard_AnimaDiversionUI/Blizzard_AnimaDiversionUI.xml
@@ -16,20 +16,12 @@
-
+
-
-
-
-
+
+
-
-
-
-
-
-
@@ -61,6 +53,15 @@
+
+
+
+
+
+
+
+
+
C_AnimaDiversion.CloseUI();
@@ -81,7 +82,7 @@
-
+
diff --git a/Interface/AddOns/Blizzard_BattlefieldMap/Blizzard_BattlefieldMap.lua b/Interface/AddOns/Blizzard_BattlefieldMap/Blizzard_BattlefieldMap.lua
index 8e53f96cbde73d63ac226383d08948282d0f4d7e..57ab4f2f17356b1e9d67b8246bf14d58472d79ff 100644
--- a/Interface/AddOns/Blizzard_BattlefieldMap/Blizzard_BattlefieldMap.lua
+++ b/Interface/AddOns/Blizzard_BattlefieldMap/Blizzard_BattlefieldMap.lua
@@ -152,6 +152,7 @@ function BattlefieldMapMixin:OnLoad()
self:RegisterEvent("ADDON_LOADED");
self:RegisterEvent("PLAYER_ENTERING_WORLD");
self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
+ self:RegisterEvent("NEW_WMO_CHUNK");
end
function BattlefieldMapMixin:OnShow()
@@ -190,7 +191,7 @@ function BattlefieldMapMixin:OnEvent(event, ...)
self:UpdateUnitsVisibility();
self:UnregisterEvent("ADDON_LOADED");
end
- elseif event == "PLAYER_ENTERING_WORLD" or event == "ZONE_CHANGED_NEW_AREA" then
+ elseif event == "PLAYER_ENTERING_WORLD" or event == "ZONE_CHANGED_NEW_AREA" or event == "NEW_WMO_CHUNK" then
if GetCVar("showBattlefieldMinimap") == "1" then
local mapID = MapUtil.GetDisplayableMapForPlayer();
self:SetMapID(mapID);
diff --git a/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua b/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua
index 8c1a7f8e45953f7813d39b4e4dbaa11cb7b27ce8..2b5f5036a9363b752073165e74df1fd1e596059e 100644
--- a/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua
+++ b/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua
@@ -1346,7 +1346,6 @@ function CharacterCreateRaceAndClassMixin:LayoutButtons()
self.AllianceAlliedRaces:MarkDirty();
self.HordeRaces:MarkDirty();
self.HordeAlliedRaces:MarkDirty();
- self.Classes:MarkDirty();
end
function CharacterCreateRaceAndClassMixin:IsRaceValid(raceData, faction)
@@ -1441,15 +1440,31 @@ function CharacterCreateRaceAndClassMixin:UpdateRaceButtons(releaseButtons)
end
end
+local function SortClasses(classData1, classData2)
+ return classLayoutIndices[classData1.fileName] < classLayoutIndices[classData2.fileName];
+end
+
function CharacterCreateRaceAndClassMixin:UpdateClassButtons(releaseButtons)
if releaseButtons then
self.buttonPool:ReleaseAllByTemplate("CharacterCreateClassButtonTemplate");
end
local classes = C_CharacterCreation.GetAvailableClasses();
- for _, classData in pairs(classes) do
+ table.sort(classes, SortClasses);
+
+ local lastButton;
+ for i, classData in ipairs(classes) do
local button = self.buttonPool:Acquire("CharacterCreateClassButtonTemplate");
button:SetClass(classData, self.selectedClassID);
+
+ if i == 1 then
+ button:SetPoint("TOPLEFT", self.Classes, "TOPLEFT", 0, 0);
+ else
+ button:SetPoint("TOPLEFT", lastButton, "TOPRIGHT", 15, 0);
+ end
+
+ lastButton = button;
+
button:Show();
end
end
diff --git a/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.xml b/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.xml
index 0fe94ba1d2b6a3a13709b033266d61136588fd27..2835e40927dd2e053751d30ec80a3291e902fb5b 100644
--- a/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.xml
+++ b/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.xml
@@ -400,10 +400,8 @@
-
-
-
-
+
+
diff --git a/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua b/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua
index 14f7e3f1c508cd92e8a889a0e8767c3083993a26..7855f9e4b8a12b22b10a62cd91cd3fff213aa074 100644
--- a/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua
+++ b/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua
@@ -76,6 +76,7 @@ end
function CovenantPreviewFrameMixin:OnShow()
self:RegisterEvent("COVENANT_PREVIEW_CLOSE");
self:RegisterEvent("PLAYER_CHOICE_CLOSE");
+ UpdateScaleForFit(self);
end
function CovenantPreviewFrameMixin:OnHide()
@@ -91,7 +92,7 @@ end
function CovenantPreviewFrameMixin:OnEvent(event, ...)
if (event == "COVENANT_PREVIEW_CLOSE" or event =="PLAYER_CHOICE_CLOSE") then
- HideUIPanel(self);
+ self:Hide();
end
end
@@ -99,7 +100,7 @@ function CovenantPreviewFrameMixin:HandleEscape()
if (self.showingFromPlayerChoice and PlayerChoiceFrame and PlayerChoiceFrame:IsShown()) then
HideUIPanel(PlayerChoiceFrame);
end
- HideUIPanel(self);
+ self:Hide();
end
function CovenantPreviewFrameMixin:Reset()
@@ -146,7 +147,7 @@ function CovenantPreviewFrameMixin:SetupFramesWithTextureKit()
end
local function CovenantPreviewSortFunction(firstValue, secondValue)
- return firstValue > secondValue;
+ return firstValue < secondValue;
end
function CovenantPreviewFrameMixin:TryShow(covenantInfo)
@@ -172,7 +173,7 @@ function CovenantPreviewFrameMixin:TryShow(covenantInfo)
self:SetupSoulbindButtons(covenantInfo.covenantSoulbinds);
self:SetupCovenantInfoPanel(covenantInfo);
self:SetupCovenantFeature(covenantInfo.featureInfo)
- ShowUIPanel(self);
+ self:Show();
end
function CovenantPreviewFrameMixin:SetupCovenantFeature(covenantFeatureInfo)
@@ -231,11 +232,11 @@ end
function CovenantPreviewFrameMixin:SetupModelSceneFrame(transmogSetID, mountID)
self:SetupTextureKits(self.ModelSceneContainer, modelSceneContainerTextureKitRegions);
+
SetUpTransmogAndMountDressupFrame(self.ModelSceneContainer, transmogSetID, mountID, 414, 432, "CENTER", "CENTER", 0 , 0, true);
local sources = C_TransmogSets.GetAllSourceIDs(transmogSetID);
- DressUpTransmogSet(sources);
-
- TransmogAndMountDressupFrame:RemoveWeapons();
+ DressUpTransmogSet(sources, TransmogAndMountDressupFrame);
+ TransmogAndMountDressupFrame:RemoveWeapons();
end
function CovenantPreviewFrameMixin:SetupCovenantInfoPanel(covenantInfo)
@@ -309,4 +310,9 @@ end
function CovenantSoulbindButtonMixin:OnLeave()
EmbeddedItemTooltip:Hide();
+end
+
+CovenantPreviewModelSceneContainerMixin = { };
+function CovenantPreviewModelSceneContainerMixin:ShouldAcceptDressUp()
+ return false;
end
\ No newline at end of file
diff --git a/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.xml b/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.xml
index 162f430bdaaa9f7e8fad1ba6005f105f350002c8..578f70866b41673e564da1cf54aa182e1f00609e 100644
--- a/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.xml
+++ b/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.xml
@@ -115,7 +115,7 @@
-
+
@@ -163,7 +163,7 @@
-
+
@@ -175,9 +175,9 @@
-
+
-
+
@@ -279,10 +279,16 @@
-
- HideUIPanel(CovenantPreviewFrame);
+ self:GetParent():Hide();
PlaySound(SOUNDKIT.UI_COVENANT_CHOICE_CLICK_BACK_BUTTON);
diff --git a/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua b/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua
index 8d9689e6e5fc287af67a3649bdcb7d4fa93f2aed..93a0397e95d97a6ad28723000c7b05d4fb42a8fe 100644
--- a/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua
+++ b/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua
@@ -233,6 +233,12 @@ function FlightMap_FlightPointPinMixin:UpdatePinSize(pinType)
self:SetSize(39, 42);
elseif self.textureKit == "FlightMaster_Argus" then
self:SetSize(34, 28);
+ elseif self.textureKit == "FlightMaster_Bastion" then
+ if pinType == Enum.FlightPathState.Current then
+ self:SetSize(26, 26);
+ elseif pinType == Enum.FlightPathState.Reachable or pinType == Enum.FlightPathState.Unreachable then
+ self:SetSize(24, 24);
+ end
elseif self.textureKit == "FlightMaster_Ferry" then
if pinType == Enum.FlightPathState.Current then
self:SetSize(36, 24);
diff --git a/Interface/AddOns/Blizzard_FlightMap/FM_VignetteDataProvider.lua b/Interface/AddOns/Blizzard_FlightMap/FM_VignetteDataProvider.lua
index 2ffb67216850d1564bd984c1e50aacde0c1b7645..70b11a01f52fc2bce022387dbc561b2c73f68b4a 100644
--- a/Interface/AddOns/Blizzard_FlightMap/FM_VignetteDataProvider.lua
+++ b/Interface/AddOns/Blizzard_FlightMap/FM_VignetteDataProvider.lua
@@ -5,6 +5,11 @@ function FlightMap_VignetteDataProviderMixin:GetPinTemplate()
return "FlightMap_VignettePinTemplate";
end
+-- Only show vignettes on the flight map if they are flagged as zoneInfiniteAOI
+function FlightMap_VignetteDataProviderMixin:ShouldShowVignette(vignetteInfo)
+ return vignetteInfo and vignetteInfo.onWorldMap and vignetteInfo.zoneInfiniteAOI;
+end
+
FlightMap_VignettePinMixin = CreateFromMixins(VignettePinMixin);
function FlightMap_VignettePinMixin:OnLoad()
diff --git a/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialMainFrame.lua b/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialMainFrame.lua
index dda9565f255c992d02bdb4db8f1cb27886e71788..a86b5452fbf1d8ebe99c32e9f417f905dabcb0ac 100644
--- a/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialMainFrame.lua
+++ b/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialMainFrame.lua
@@ -288,9 +288,18 @@ function NPE_TutorialWalkMixin:SetKeybindings()
local container = self.ContainerFrame[v];
if container then
local fontString = container.KeyBind;
- local text = GetBindingKey(v);
- if (text and (text ~= "")) then
- fontString:SetText(text);
+ local key = GetBindingKey(v);
+ local bindingText;
+ if key == "LEFT" then
+ bindingText = NPEV2_LEFT_ARROW;
+ elseif key == "RIGHT" then
+ bindingText = NPEV2_RIGHT_ARROW;
+ else
+ bindingText = GetBindingText(key, 1);
+ end
+
+ if (bindingText and (bindingText ~= "")) then
+ fontString:SetText(bindingText);
end
end
end
diff --git a/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialSteps.lua b/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialSteps.lua
index 29ba1ce58c78740b3803a64a86cc1cc9530b310e..58ac48d4402bd403b530cec6812e3bce01ac40f5 100644
--- a/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialSteps.lua
+++ b/Interface/AddOns/Blizzard_NewPlayerExperience/Blizzard_TutorialSteps.lua
@@ -1052,6 +1052,7 @@ end
-- on their action bar
Class_SpellChecker = class("SpellChecker", Class_TutorialBase);
function Class_SpellChecker:OnBegin()
+ Dispatcher:RegisterEvent("ACTIONBAR_SLOT_CHANGED", self);
Dispatcher:RegisterEvent("PLAYER_ENTERING_WORLD", self);
end
@@ -1074,6 +1075,13 @@ function Class_SpellChecker:PLAYER_ENTERING_WORLD()
self:CheckSpells();
end
+function Class_SpellChecker:ACTIONBAR_SLOT_CHANGED(slot)
+ if slot == 0 then
+ Dispatcher:UnregisterEvent("ACTIONBAR_SLOT_CHANGED", self);
+ self:CheckSpells();
+ end
+end
+
function Class_SpellChecker:OnInterrupt(interruptedBy)
self:Complete();
end
diff --git a/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTracker.lua b/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTracker.lua
index fc1b836559b3adaecad78d704062f369cdf4868a..e8e5ac19eb41bac77b25015b2bf9f06bd521fdd4 100644
--- a/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTracker.lua
+++ b/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTracker.lua
@@ -93,9 +93,9 @@ hasSkippedBlocks: if the module couldn't display all its blocks because of not e
DEFAULT_OBJECTIVE_TRACKER_MODULE = {};
-function DEFAULT_OBJECTIVE_TRACKER_MODULE:OnLoad(friendlyName)
+function DEFAULT_OBJECTIVE_TRACKER_MODULE:OnLoad(friendlyName, defaultTemplate)
self.friendlyName = friendlyName or "UnnamedTrackerModule";
- self.blockTemplate = "ObjectiveTrackerBlockTemplate";
+ self.blockTemplate = defaultTemplate or "ObjectiveTrackerBlockTemplate";
self.blockType = "Frame";
self.lineTemplate = "ObjectiveTrackerLineTemplate";
self.lineSpacing = 2;
@@ -121,9 +121,9 @@ function DEFAULT_OBJECTIVE_TRACKER_MODULE:OnLoad(friendlyName)
DEFAULT_OBJECTIVE_TRACKER_MODULE.AddBlockOffset(self, self.blockTemplate, 0, -6);
end
-function ObjectiveTracker_GetModuleInfoTable(friendlyName, baseModule)
+function ObjectiveTracker_GetModuleInfoTable(friendlyName, baseModule, defaultTemplate)
local info = CreateFromMixins(baseModule or DEFAULT_OBJECTIVE_TRACKER_MODULE);
- info:OnLoad(friendlyName);
+ info:OnLoad(friendlyName, defaultTemplate);
return info;
end
diff --git a/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTrackerUIWidgetContainer.lua b/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTrackerUIWidgetContainer.lua
index dff96628aa84c027c5198ca38ce948525e2e77a6..07326dfd6965fa5fafdff219f4a1206b50824b6c 100644
--- a/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTrackerUIWidgetContainer.lua
+++ b/Interface/AddOns/Blizzard_ObjectiveTracker/Blizzard_ObjectiveTrackerUIWidgetContainer.lua
@@ -26,10 +26,9 @@ function ObjectiveTrackerUIWidgetContainerMixin:UnattachFromBlockAndHide()
self:SetParent(UIParent);
end
-UI_WIDGET_TRACKER_MODULE = ObjectiveTracker_GetModuleInfoTable("UI_WIDGET_TRACKER_MODULE");
+UI_WIDGET_TRACKER_MODULE = ObjectiveTracker_GetModuleInfoTable("UI_WIDGET_TRACKER_MODULE", nil, "ObjectiveTrackerUIWidgetBlock");
UI_WIDGET_TRACKER_MODULE.updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_UI_WIDGETS;
UI_WIDGET_TRACKER_MODULE:SetHeader(ObjectiveTrackerFrame.BlocksFrame.UIWidgetsHeader, GetRealZoneText(), OBJECTIVE_TRACKER_UPDATE_MODULE_UI_WIDGETS);
-UI_WIDGET_TRACKER_MODULE.blockTemplate = "ObjectiveTrackerUIWidgetBlock";
function UI_WIDGET_TRACKER_MODULE:Update()
self:BeginLayout();
diff --git a/Interface/AddOns/Blizzard_PlayerChoiceUI/Blizzard_PlayerChoiceUI.lua b/Interface/AddOns/Blizzard_PlayerChoiceUI/Blizzard_PlayerChoiceUI.lua
index 3212c4677f76a695caf3f8fd488997269c489c02..91786af83ffb3fd75b95c91a7aeb1da93dcc553a 100644
--- a/Interface/AddOns/Blizzard_PlayerChoiceUI/Blizzard_PlayerChoiceUI.lua
+++ b/Interface/AddOns/Blizzard_PlayerChoiceUI/Blizzard_PlayerChoiceUI.lua
@@ -825,6 +825,7 @@ function PlayerChoiceFrameMixin:AlignOptionHeights()
self.optionsAligned = true;
self:Layout(); -- Note that we call Layout here and not MarkDirty. Otherwise the Layout won't happen until the next frame and you will see a pop as things get adjsuted
+ UpdateScaleForFit(self);
end
function PlayerChoiceFrameMixin:GetNumOptions()
diff --git a/Interface/AddOns/Blizzard_SharedMapDataProviders/VignetteDataProvider.lua b/Interface/AddOns/Blizzard_SharedMapDataProviders/VignetteDataProvider.lua
index 82559ac65c1bef07af2e42c2a54879ab6fed7294..b22854431997a2b744fd3c6ea32706e279165f0e 100644
--- a/Interface/AddOns/Blizzard_SharedMapDataProviders/VignetteDataProvider.lua
+++ b/Interface/AddOns/Blizzard_SharedMapDataProviders/VignetteDataProvider.lua
@@ -58,7 +58,7 @@ function VignetteDataProviderMixin:RefreshAllData(fromOnShow)
local vignetteGUIDs = C_VignetteInfo.GetVignettes();
for i, vignetteGUID in ipairs(vignetteGUIDs) do
local vignetteInfo = C_VignetteInfo.GetVignetteInfo(vignetteGUID);
- if vignetteInfo and vignetteInfo.onWorldMap then
+ if self:ShouldShowVignette(vignetteInfo) then
local existingPin = pinsToRemove[vignetteGUID];
if existingPin then
pinsToRemove[vignetteGUID] = nil;
@@ -83,6 +83,10 @@ function VignetteDataProviderMixin:RefreshAllData(fromOnShow)
end
end
+function VignetteDataProviderMixin:ShouldShowVignette(vignetteInfo)
+ return vignetteInfo and vignetteInfo.onWorldMap;
+end
+
function VignetteDataProviderMixin:OnSuperTrackingChanged()
local template = self:GetPinTemplate();
for pin in self:GetMap():EnumeratePinsByTemplate(template) do
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduit.lua b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduit.lua
index ac2636ef42eb2aa1ccee97b1344df6e04bf373e9..815bb7c1031f37dad6aca3f93a96b07a1328a7bd 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduit.lua
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduit.lua
@@ -1,8 +1,14 @@
SoulbindConduitMixin = CreateFromMixins(SpellMixin)
-function SoulbindConduitMixin:Init(conduitID, conduitRank)
+function SoulbindConduitMixin:Init(conduitID)
self.conduitID = conduitID;
- self:SetSpellID(C_Soulbinds.GetConduitSpellID(conduitID, conduitRank));
+ if self:IsValid() then
+ self:SetSpellID(C_Soulbinds.GetConduitSpellID(conduitID, self:GetConduitRank()));
+ end
+end
+
+function SoulbindConduitMixin:IsValid()
+ return self.conduitID > 0;
end
function SoulbindConduitMixin:GetConduitID()
@@ -10,13 +16,18 @@ function SoulbindConduitMixin:GetConduitID()
end
function SoulbindConduitMixin:GetConduitRank()
- return C_Soulbinds.GetConduitRankFromCollection(self.conduitID);
+ local rank = C_Soulbinds.GetConduitRankFromCollection(self:GetConduitID());
+ return self:IsValid() and math.max(rank, 1) or 1;
end
function SoulbindConduitMixin:Matches(conduit)
- return conduit and self:GetConduitID() == conduit:GetConduitID() and self:GetConduitRank() == conduit:GetConduitRank();
+ return conduit and self:GetConduitID() == conduit:GetConduitID();
+end
+
+function SoulbindConduitMixin:GetHyperlink()
+ return C_Soulbinds.GetConduitHyperlink(self:GetConduitID(), self:GetConduitRank());
end
-function SoulbindConduitMixin_Create(conduitID, conduitRank)
- return CreateAndInitFromMixin(SoulbindConduitMixin, conduitID, conduitRank);
+function SoulbindConduitMixin_Create(conduitID)
+ return CreateAndInitFromMixin(SoulbindConduitMixin, conduitID);
end
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.lua b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.lua
index 1716d4d6bc70dc07f766c30375f128b84ae827a6..62bae16a167fd2391bbc53cb5c80d99f437dc792 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.lua
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.lua
@@ -1,5 +1,128 @@
local CONDUIT_PENDING_INSTALL_FONT_COLOR = CreateColor(0.0, 0.8, 1.0);
+local ConduitChargeSecondsFormatter = CreateFromMixins(SecondsFormatterMixin);
+ConduitChargeSecondsFormatter:Init(SECONDS_PER_MIN, SecondsFormatter.Abbreviation.Truncate, true, true);
+
+function ConduitChargeSecondsFormatter:GetDesiredUnitCount(seconds)
+ return 1;
+end
+
+ConduitChargeMixin = {};
+
+local CONDUIT_CHARGE_STATE_AVAILABLE = 1;
+local CONDUIT_CHARGE_STATE_PENDING = 2;
+local CONDUIT_CHARGE_STATE_UNAVAILABLE = 3;
+
+function ConduitChargeMixin:SetState(state)
+ local useAtlasSize = true;
+ if state == CONDUIT_CHARGE_STATE_AVAILABLE then
+ self.Icon:SetAtlas("soulbinds_collection_charge_active", useAtlasSize);
+ self.PendingOverlay:SetAtlas(nil);
+ elseif state == CONDUIT_CHARGE_STATE_PENDING then
+ self.Icon:SetAtlas("soulbinds_collection_charge_pending", useAtlasSize);
+ self.PendingOverlay:SetAtlas("soulbinds_collection_charge_pending", useAtlasSize);
+ elseif state == CONDUIT_CHARGE_STATE_UNAVAILABLE then
+ self.Icon:SetAtlas("soulbinds_collection_charge_inactive", useAtlasSize);
+ self.PendingOverlay:SetAtlas(nil);
+ end
+end
+
+function ConduitChargeMixin:OnShow()
+ self.PendingOverlay.Anim:Play();
+end
+
+ConduitChargesTrayEvents =
+{
+ "SOULBIND_CONDUIT_CHARGES_UPDATED",
+ "SOULBIND_PENDING_CONDUIT_CHANGED",
+ "SOULBIND_CONDUIT_INSTALLED",
+ "CURRENCY_DISPLAY_UPDATE",
+};
+
+ConduitChargesTrayMixin = {};
+
+function ConduitChargesTrayMixin:OnLoad()
+ self.pool = CreateFramePool("FRAME", self, "ConduitChargeTemplate");
+ self.frames = {};
+
+ local capacity = C_Soulbinds.GetConduitChargesCapacity();
+ local function FactoryFunction(index)
+ if index > capacity then
+ return nil;
+ end
+
+ local frame = self.pool:Acquire();
+ table.insert(self.frames, frame);
+ frame:Show();
+ return frame;
+ end
+
+ local anchor = AnchorUtil.CreateAnchor("TOPLEFT", self, "TOPLEFT");
+ local direction, stride, paddingX, paddingY = GridLayoutMixin.Direction.TopLeftToBottomRight, capacity, -6, 0;
+ local layout = AnchorUtil.CreateGridLayout(direction, stride, paddingX, paddingY);
+ AnchorUtil.GridLayoutFactoryByCount(FactoryFunction, capacity, anchor, layout);
+end
+
+function ConduitChargesTrayMixin:OnShow()
+ FrameUtil.RegisterFrameForEvents(self, ConduitChargesTrayEvents);
+end
+
+function ConduitChargesTrayMixin:OnHide()
+ FrameUtil.UnregisterFrameForEvents(self, ConduitChargesTrayEvents);
+end
+
+function ConduitChargesTrayMixin:OnEnter()
+ GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+ GameTooltip_SetTitle(GameTooltip, CONDUIT_CHARGE_HEADER);
+ GameTooltip_AddNormalLine(GameTooltip, CONDUIT_CHARGE_DESCRIPTION);
+
+ GameTooltip_AddBlankLineToTooltip(GameTooltip);
+
+ local time = ConduitChargeSecondsFormatter:Format(C_DateAndTime.GetSecondsUntilDailyReset());
+ local text = CONDUIT_CHARGE_REPLENISHMENT_TIME:format(WHITE_FONT_COLOR:WrapTextInColorCode(time));
+ GameTooltip_AddNormalLine(GameTooltip, text);
+
+ GameTooltip:Show();
+end
+
+function ConduitChargesTrayMixin:OnLeave()
+ GameTooltip_Hide();
+end
+
+function ConduitChargesTrayMixin:Init()
+ self:EvaluateCharges();
+end
+
+function ConduitChargesTrayMixin:EvaluateCharges()
+ local charges = C_Soulbinds.GetConduitCharges();
+ local unused = charges - C_Soulbinds.GetTotalConduitChargesPending();
+ for index = 1, unused do
+ self.frames[index]:SetState(CONDUIT_CHARGE_STATE_AVAILABLE);
+ end
+
+ for index = unused + 1, charges do
+ self.frames[index]:SetState(CONDUIT_CHARGE_STATE_PENDING);
+ end
+
+ local capacity = C_Soulbinds.GetConduitChargesCapacity();
+ for index = charges + 1, capacity do
+ self.frames[index]:SetState(CONDUIT_CHARGE_STATE_UNAVAILABLE);
+ end
+end
+
+function ConduitChargesTrayMixin:SetPendingCount(pendingCount)
+ local available = Clamp(pendingCount, 0, C_Soulbinds.GetConduitCharges());
+ self.pendingCount = Clamp(available, 0, C_Soulbinds.GetConduitChargesCapacity());
+ self:EvaluateCharges();
+end
+
+function ConduitChargesTrayMixin:OnEvent(event, ...)
+ if event == "SOULBIND_CONDUIT_CHARGES_UPDATED" or event == "SOULBIND_PENDING_CONDUIT_CHANGED" or
+ event == "SOULBIND_CONDUIT_INSTALLED" or event == "CURRENCY_DISPLAY_UPDATE" then
+ self:EvaluateCharges();
+ end
+end
+
ConduitListCategoryButtonMixin = CreateFromMixins(CallbackRegistryMixin);
ConduitListCategoryButtonMixin:GenerateCallbackEvents(
@@ -111,7 +234,17 @@ function ConduitListConduitButtonMixin:Init(conduitData)
local itemID = conduitData.conduitItemID;
local item = Item:CreateFromItemID(itemID);
local itemCallback = function()
+ self.ConduitName:SetSize(150, 30);
self.ConduitName:SetText(item:GetItemName());
+ self.ConduitName:SetHeight(self.ConduitName:GetStringHeight());
+
+ local yOffset = self.ConduitName:GetNumLines() > 1 and -7 or 0;
+ self.ConduitName:ClearAllPoints();
+ self.ConduitName:SetPoint("BOTTOMLEFT", self.Icon, "RIGHT", 10, yOffset);
+ self.ConduitName:SetWidth(150);
+
+ self.ItemLevel:SetPoint("TOPLEFT", self.ConduitName, "BOTTOMLEFT", 0, 0);
+ self.ItemLevel:SetText(conduitData.conduitItemLevel);
end;
item:ContinueOnItemLoad(itemCallback);
@@ -127,11 +260,6 @@ function ConduitListConduitButtonMixin:Init(conduitData)
self.IconOverlayDark:SetVertexColor(0, 0, 0);
self.ConduitName:SetTextColor(r, g, b);
- self.ConduitName:ClearAllPoints();
- self.ConduitName:SetPoint("BOTTOMLEFT", self.Icon, "RIGHT", 10, -8);
- self.ConduitName:SetPoint("RIGHT");
- self.ItemLevel:SetText(conduitData.conduitItemLevel);
-
local conduitSpecName = conduitData.conduitSpecName;
if conduitSpecName then
local specIDs = C_SpecializationInfo.GetSpecIDs(conduitData.conduitSpecSetID);
@@ -172,14 +300,8 @@ end
function ConduitListConduitButtonMixin:OnEvent(event, ...)
if event == "SOULBIND_PENDING_CONDUIT_CHANGED" then
- local nodeID, conduitID, pending = ...;
- if conduitID == self.conduitData.conduitID then
- if pending then
- self:UpdateVisuals(ConduitListConduitButtonMixin.State.Pending);
- else
- self:UpdateVisuals(ConduitListConduitButtonMixin.State.Uninstalled);
- end
- end
+ local nodeID, conduitID = ...;
+ self:Update();
elseif event == "SOULBIND_CONDUIT_INSTALLED" then
local nodeID, conduitData = ...;
if conduitData.conduitID == self.conduitData.conduitID then
@@ -237,30 +359,50 @@ end
function ConduitListConduitButtonMixin:GetState()
local soulbindID = Soulbinds.GetOpenSoulbindID();
local conduitID = self.conduitData.conduitID;
+
+ local pendingInstallNodeID = C_Soulbinds.FindNodeIDPendingInstall(soulbindID, conduitID);
+ if pendingInstallNodeID > 0 then
+ return ConduitListConduitButtonMixin.State.Pending;
+ end
+
+ local pendingUninstallNodeID = C_Soulbinds.FindNodeIDPendingUninstall(soulbindID, conduitID);
+ if pendingUninstallNodeID > 0 then
+ return ConduitListConduitButtonMixin.State.Uninstalled;
+ end
+
local installed = C_Soulbinds.IsConduitInstalledInSoulbind(soulbindID, conduitID);
if installed then
return ConduitListConduitButtonMixin.State.Installed;
end
- local pending = C_Soulbinds.HasPendingConduitInSoulbind(soulbindID, conduitID);
- if pending then
- return ConduitListConduitButtonMixin.State.Pending;
- end
return ConduitListConduitButtonMixin.State.Uninstalled;
end
function ConduitListConduitButtonMixin:OnClick(buttonName)
if buttonName == "LeftButton" then
- self:CreateCursor();
+ local linked = false;
+ if IsModifiedClick("CHATLINK") then
+ linked = HandleModifiedItemClick(self.conduit:GetHyperlink());
+ end
+
+ if not linked then
+ self:CreateCursor();
+ end
elseif buttonName == "RightButton" then
local soulbindID = Soulbinds.GetOpenSoulbindID();
local conduitID = self.conduitData.conduitID;
- if C_Soulbinds.HasPendingConduitInSoulbind(soulbindID, conduitID) then
- local nodeID = C_Soulbinds.GetPendingNodeIDInSoulbind(soulbindID, conduitID);
- if nodeID > 0 then
- C_Soulbinds.RemovePendingConduit(nodeID);
+
+ local pendingInstallNodeID = C_Soulbinds.FindNodeIDPendingInstall(soulbindID, conduitID);
+ if pendingInstallNodeID > 0 then
+ C_Soulbinds.UnmodifyNode(pendingInstallNodeID);
+ else
+ local pendingUninstallNodeID = C_Soulbinds.FindNodeIDPendingUninstall(soulbindID, conduitID);
+ if pendingUninstallNodeID > 0 then
+ C_Soulbinds.UnmodifyNode(pendingUninstallNodeID);
end
end
+
+ SoulbindViewer:OnCollectionConduitClick(conduitID);
end
end
@@ -269,10 +411,6 @@ function ConduitListConduitButtonMixin:OnDragStart()
end
function ConduitListConduitButtonMixin:CreateCursor()
- if C_Soulbinds.IsConduitInstalledInSoulbind(Soulbinds.GetOpenSoulbindID(), self.conduitData.conduitID) then
- return;
- end
-
SetCursorVirtualItem(self.conduitData.conduitItemID, Enum.UICursorType.ConduitCollectionItem);
end
@@ -288,10 +426,14 @@ function ConduitListConduitButtonMixin:OnEnter(conduitData)
GameTooltip:SetConduit(conduitID, self.conduit:GetConduitRank());
local soulbindID = Soulbinds.GetOpenSoulbindID();
- if C_Soulbinds.IsConduitInstalledInSoulbind(soulbindID, conduitID) then
- GameTooltip_AddErrorLine(GameTooltip, CONDUIT_COLLECTION_ITEM_SOCKETED);
- elseif C_Soulbinds.HasPendingConduitInSoulbind(soulbindID, conduitID) then
+ if C_Soulbinds.FindNodeIDPendingInstall(soulbindID, conduitID) > 0 then
GameTooltip_AddColoredLine(GameTooltip, CONDUIT_COLLECTION_ITEM_PENDING, CONDUIT_PENDING_INSTALL_FONT_COLOR);
+ else
+ if C_Soulbinds.FindNodeIDPendingUninstall(soulbindID, conduitID) == 0 then
+ if C_Soulbinds.IsConduitInstalledInSoulbind(soulbindID, conduitID) then
+ GameTooltip_AddErrorLine(GameTooltip, CONDUIT_COLLECTION_ITEM_SOCKETED);
+ end
+ end
end
GameTooltip:Show();
end;
@@ -304,7 +446,7 @@ function ConduitListConduitButtonMixin:OnEnter(conduitData)
local conduitType = self.conduitData.conduitType;
Soulbinds.SetPreviewConduitType(conduitType);
- SoulbindViewer:OnCollectionConduitEnter(conduitType);
+ SoulbindViewer:OnCollectionConduitEnter(conduitType, self.conduit:GetConduitID());
end
function ConduitListConduitButtonMixin:OnLeave(collectionData)
@@ -386,7 +528,7 @@ function ConduitListSectionMixin:BuildConduits(collection)
end
local anchor = AnchorUtil.CreateAnchor("TOPLEFT", self.Container, "TOPLEFT");
- local direction, stride, x, y = GridLayoutMixin.Direction.TopLeftToBottomRight, 1, 0, 1;
+ local direction, stride, paddingX, paddingY = GridLayoutMixin.Direction.TopLeftToBottomRight, 1, 0, 0;
local layout = AnchorUtil.CreateGridLayout(direction, stride, paddingX, paddingY);
AnchorUtil.GridLayoutFactoryByCount(FactoryFunction, count, anchor, layout);
@@ -531,6 +673,8 @@ function ConduitListMixin:Init()
end
end);
end
+
+ self.Charges:Init();
end
function ConduitListMixin:Update()
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.xml b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.xml
index 0c7b1ab5847dce2de924cdb493aed60a17708eba..343e855d8aec8322eaf0a420eec69a90ffaf353b 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.xml
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsConduitList.xml
@@ -13,7 +13,55 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -105,17 +153,9 @@
-
-
-
-
-
-
-
-
-
+
@@ -266,6 +306,11 @@
+
+
+
+
+
@@ -273,7 +318,7 @@
-
+
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.lua b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.lua
index 6f713709a3071b4447fc330cf5f60f4fb0d4661e..864f7a50e4520bd440c866effd8e55f0b08621c3 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.lua
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.lua
@@ -254,8 +254,6 @@ local SoulbindConduitNodeEvents =
function SoulbindConduitNodeMixin:OnLoad()
SoulbindTreeNodeMixin.OnLoad(self);
- self.conduit = nil;
- self.pending = false;
self.animTextures =
{
self.PickupOverlay,
@@ -277,26 +275,30 @@ end
function SoulbindConduitNodeMixin:Reset()
SoulbindTreeNodeMixin.Reset(self);
self.conduit = nil;
- self.pending = false;
self.Icon:Hide();
for _, texture in ipairs(self.SocketAnimTextures) do
texture.Anim:Stop();
end
end
-function SoulbindConduitNodeMixin:AssignConduitData(conduitID, pending)
- self.pending = pending;
-
- if conduitID and conduitID > 0 then
- local conduitData = C_Soulbinds.GetConduitCollectionData(conduitID);
- if conduitData then
- self.conduit = SoulbindConduitMixin_Create(conduitID, conduitData.conduitRank);
- return true;
+function SoulbindConduitNodeMixin:SetConduit(conduitID, initializing)
+ local oldConduitID = self.conduit and self.conduit:GetConduitID() or 0;
+ self.conduit = SoulbindConduitMixin_Create(conduitID);
+ local newConduitID = self.conduit:GetConduitID();
+
+ self:DisplayConduit();
+
+ if not initializing and conduitID > 0 and C_Soulbinds.GetInstalledConduitID(self:GetID()) ~= conduitID and (oldConduitID ~= newConduitID) then
+ self:PlaySocketAnimation();
+ PlaySound(SOUNDKIT.SOULBINDS_CONDUIT_ADD_PENDING, nil, SOUNDKIT_ALLOW_DUPLICATES);
+
+ if GameTooltip:IsShown() then
+ GameTooltip:Hide();
+ self:LoadTooltip();
end
end
- self.conduit = nil;
- return false;
+ self:UpdatePendingAnim();
end
function SoulbindConduitNodeMixin:GetConduit()
@@ -311,49 +313,14 @@ function SoulbindConduitNodeMixin:Init(node)
self.EmblemBg:SetAtlas(atlas)
self.EmblemBg:SetVertexColor(0, 0, 0);
- local pendingID = C_Soulbinds.GetPendingConduitID(self:GetID());
- if pendingID > 0 then
- local pending = true;
- self:AssignConduitData(pendingID, pending);
- else
- local pending = false;
- self:AssignConduitData(self:GetConduitID(), pending);
- end
-
- self:DisplayConduit();
- self:UpdatePendingAnim();
-end
-
-function SoulbindConduitNodeMixin:AssignPendingConduit(conduitID)
- assert(not (self.conduit and self.pending == false));
-
- local pending = true;
- if self:AssignConduitData(conduitID, pending) then
- self:DisplayConduit();
- self:PlaySocketAnimation();
- PlaySound(SOUNDKIT.SOULBINDS_CONDUIT_ADD_PENDING, nil, SOUNDKIT_ALLOW_DUPLICATES);
-
- if GameTooltip:IsShown() then
- GameTooltip:Hide();
- self:LoadTooltip();
- end
- end
+ local conduitID = C_Soulbinds.GetConduitDisplayed(self:GetID());
+ local initializing = true;
+ self:SetConduit(conduitID, initializing);
+ self:DisplayConduit();
self:UpdatePendingAnim();
end
-function SoulbindConduitNodeMixin:ClearPendingConduit()
- assert(self.pending == true);
-
- if self.pending then
- local pending = false;
- self:AssignConduitData(nil, pending);
-
- self:DisplayConduit();
- self:UpdatePendingAnim();
- end
-end
-
function SoulbindConduitNodeMixin:PlaySocketAnimation()
for _, texture in ipairs(self.SocketAnimTextures) do
texture.Anim:Play();
@@ -377,11 +344,10 @@ function SoulbindConduitNodeMixin:OnUninstalled()
end
function SoulbindConduitNodeMixin:UpdatePendingAnim()
- self.Pending:SetShown(self.pending);
- self.PendingStick.RotateAnim:SetPlaying(self.pending);
- self.PendingStick2.RotateAnim:SetPlaying(self.pending);
- self.PendingStick3.RotateAnim:SetPlaying(self.pending);
- self.PendingStick4.RotateAnim:SetPlaying(self.pending);
+ local pending = self.conduit:GetConduitID() ~= self:GetConduitID();
+ self.Pending:SetShown(pending);
+ self.PendingStick.RotateAnim:SetPlaying(pending);
+ self.PendingStick2.RotateAnim:SetPlaying(pending);
end
function SoulbindConduitNodeMixin:UpdateVisuals()
@@ -411,13 +377,10 @@ end
function SoulbindConduitNodeMixin:OnEvent(event, ...)
if event == "SOULBIND_PENDING_CONDUIT_CHANGED" then
- local nodeID, conduitID, pending = ...;
+ local nodeID = ...;
if nodeID == self:GetID() then
- if pending then
- self:AssignPendingConduit(conduitID);
- else
- self:ClearPendingConduit();
- end
+ local conduitID = C_Soulbinds.GetConduitDisplayed(nodeID);
+ self:SetConduit(conduitID);
end
elseif event == "SOULBIND_CONDUIT_INSTALLED" then
local nodeID, conduitData = ...;
@@ -444,16 +407,34 @@ function SoulbindConduitNodeMixin:IsConduitType(type)
return self:GetConduitType() == type;
end
-function SoulbindConduitNodeMixin:SetConduitPickupAnimShown(shown)
+function SoulbindConduitNodeMixin:SetUsingStaticAnimOverride(useAnimOverride)
+ if useAnimOverride then
+ self.PickupArrowsOverlay:SetAtlas(nil);
+ self.PickupArrowsStatic:Show();
+ else
+ self.PickupArrowsOverlay:SetAtlas("Soulbinds_Tree_Conduit_Arrows", false);
+ self.PickupArrowsStatic:Hide();
+ end
+end
+
+function SoulbindConduitNodeMixin:EvaluateAnimOverride(conduitID)
+ if conduitID then
+ local soulbindID = Soulbinds.GetOpenSoulbindID();
+ local useAnimOverride = C_Soulbinds.FindNodeIDAppearingInstalled(soulbindID, conduitID) == self:GetID();
+ self:SetUsingStaticAnimOverride(useAnimOverride);
+ else
+ local useAnimOverride = false;
+ self:SetUsingStaticAnimOverride(useAnimOverride);
+ end
+end
+
+function SoulbindConduitNodeMixin:SetConduitPickupAnimShown(shown, conduitID)
for _, texture in ipairs(self.PickupAnimTextures) do
texture:SetShown(shown);
texture.Anim:SetPlaying(shown);
end
- local pendingAnimAlpha = shown and 0 or 1;
- for _, texture in ipairs(self.PendingAnimTextures) do
- texture:SetAlpha(pendingAnimAlpha);
- end
+ self:EvaluateAnimOverride(conduitID);
end
function SoulbindConduitNodeMixin:SetAttentionAnimShown(shown)
@@ -470,15 +451,11 @@ function SoulbindConduitNodeMixin:StopAnimations()
texture.Anim:Stop();
texture:Hide();
end
-
- for _, texture in ipairs(self.PendingAnimTextures) do
- texture:SetAlpha(1);
- end
end
function SoulbindConduitNodeMixin:DisplayConduit()
local conduit = self.conduit;
- if conduit then
+ if conduit:IsValid() then
if not conduit.Matches(self:GetConduit()) then
local onConduitSpellLoad = function()
local spellID = conduit:GetSpellID();
@@ -540,7 +517,7 @@ end
function SoulbindConduitNodeMixin:LoadTooltip()
local conduit = self:GetConduit();
- if conduit then
+ if conduit:IsValid() then
local onConduitLoad = function()
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
GameTooltip:SetConduit(conduit:GetConduitID(), conduit:GetConduitRank());
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.xml b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.xml
index c4b8d7a8d08dd99242592ab4b3ea6618e12a77ab..ac2d1d25a68044bdc0e307c9831c42a149d2468b 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.xml
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsNode.xml
@@ -190,6 +190,12 @@
+
+
+
+
+
+
@@ -242,14 +248,6 @@
-
-
-
-
-
-
-
-
@@ -299,7 +297,7 @@
-
+
@@ -307,7 +305,7 @@
-
+
@@ -328,26 +326,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -355,11 +333,17 @@
-
-
+
+
+
+
+
+
+
+
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsTree.lua b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsTree.lua
index 79c4b580d20099c4ebb5070d7cfde435a7639aeb..eacd563c3c5907221591c138016ac863e5688d48 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsTree.lua
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsTree.lua
@@ -144,7 +144,15 @@ function SoulbindTreeMixin:OnConduitClicked(button, buttonName)
end
if buttonName == "RightButton" then
- C_Soulbinds.RemovePendingConduit(button:GetID());
+ local nodeID = button:GetID();
+ if C_Soulbinds.IsNodePendingModify(nodeID) then
+ C_Soulbinds.UnmodifyNode(button:GetID());
+ else
+ local conduitID = C_Soulbinds.GetInstalledConduitID(nodeID);
+ if conduitID > 0 then
+ C_Soulbinds.ModifyNode(nodeID, conduitID, Enum.SoulbindConduitTransactionType.Uninstall);
+ end
+ end
elseif Soulbinds.HasConduitAtCursor() then
if not button:IsUnavailable() then
self:TryInstallConduitAtCursor(button);
@@ -153,8 +161,7 @@ function SoulbindTreeMixin:OnConduitClicked(button, buttonName)
local linked = false;
local conduit = button:GetConduit();
if conduit and IsModifiedClick("CHATLINK") then
- local link = C_Soulbinds.GetConduitHyperlink(conduit:GetConduitID(), conduit:GetConduitRank());
- linked = HandleModifiedItemClick(link);
+ linked = HandleModifiedItemClick(conduit:GetHyperlink());
end
if not linked then
@@ -180,14 +187,10 @@ local function GetConduitMismatchString(conduitType)
end
function SoulbindTreeMixin:TryInstallConduitAtCursor(button)
- if C_Soulbinds.IsConduitInstalled(button:GetID()) then
- return;
- end
-
local conduitData = C_Soulbinds.GetConduitCollectionDataAtCursor();
if conduitData then
if button:IsConduitType(conduitData.conduitType) then
- local nodeID = button:GetID();
+ local nodeID = button:GetID();
self:TryInstallConduitInSlot(nodeID, conduitData.conduitID);
else
UIErrorsFrame:AddMessage(GetConduitMismatchString(button:GetConduitType()), RED_FONT_COLOR:GetRGBA());
@@ -202,7 +205,7 @@ function SoulbindTreeMixin:StopNodeAnimations()
end
local function AreConduitsResettingOrIsUninstalled(nodeFrame)
- return Soulbinds.IsConduitResetPending() or not C_Soulbinds.IsConduitInstalled(nodeFrame:GetID());
+ return Soulbinds.IsConduitResetPending() or (C_Soulbinds.GetConduitCharges() > 0 or not C_Soulbinds.IsConduitInstalled(nodeFrame:GetID()));
end
local function IsInstallingConduitsOrNotPending(soulbindID, nodeFrame)
@@ -214,7 +217,7 @@ local function IsInstallingConduitsOrNotPending(soulbindID, nodeFrame)
return not conduit or conduit:GetConduitID() == 0;
end
-function SoulbindTreeMixin:ApplyConduitEnterAnim(conduitType)
+function SoulbindTreeMixin:ApplyConduitEnterAnim(conduitType, conduitID)
if not C_Soulbinds.CanModifySoulbind() then
return;
end
@@ -243,12 +246,24 @@ function SoulbindTreeMixin:ApplyConduitEnterAnim(conduitType)
for _, nodeFrame in pairs(self.nodeFrames) do
if canAnimateConduit(nodeFrame, conduitType) then
- nodeFrame:SetConduitPickupAnimShown(true);
+ nodeFrame:SetConduitPickupAnimShown(true, conduitID);
end
end
end
-function SoulbindTreeMixin:OnCollectionConduitEnter(conduitType)
+function SoulbindTreeMixin:EvaluateAnimOverrides(conduitID)
+ for _, nodeFrame in pairs(self.nodeFrames) do
+ if nodeFrame:IsConduit() then
+ nodeFrame:EvaluateAnimOverride(conduitID);
+ end
+ end
+end
+
+function SoulbindTreeMixin:OnCollectionConduitClick(conduitID)
+ self:EvaluateAnimOverrides(conduitID);
+end
+
+function SoulbindTreeMixin:OnCollectionConduitEnter(conduitType, conduitID)
if not C_Soulbinds.CanModifySoulbind() then
return;
end
@@ -262,10 +277,12 @@ function SoulbindTreeMixin:OnCollectionConduitEnter(conduitType)
if not Soulbinds.HasConduitAtCursor() then
if self.mouseOverConduit ~= conduitType or not oldTimer then
self:StopNodeAnimations();
- self:ApplyConduitEnterAnim(conduitType);
+ self:ApplyConduitEnterAnim(conduitType, conduitID);
end
end
+ self:EvaluateAnimOverrides(conduitID);
+
self.mouseOverConduit = conduitType;
end
@@ -279,10 +296,14 @@ function SoulbindTreeMixin:OnCollectionConduitLeave()
self.mouseOverTimer:Cancel();
end
- self.mouseOverTimer = C_Timer.NewTicker(.1, function()
+ local time = .1;
+ local frequency = 1;
+ self.mouseOverTimer = C_Timer.NewTicker(time, function()
self:StopThenApplyAttentionAnims();
+ self:EvaluateAnimOverrides(nil);
self.mouseOverTimer = nil;
- end, 1);
+
+ end, frequency);
end
end
@@ -294,6 +315,7 @@ function SoulbindTreeMixin:OnCursorChanged(isDefault, newCursorType, oldCursorTy
self:ApplyConduitEnterAnim(previewConduitType);
else
self:StopThenApplyAttentionAnims();
+ self:EvaluateAnimOverrides(nil);
end
self.handleCursor = false;
end
@@ -330,27 +352,49 @@ function SoulbindTreeMixin:StopThenApplyAttentionAnims()
end
function SoulbindTreeMixin:TryInstallConduitInSlot(nodeID, conduitID)
- if C_Soulbinds.IsConduitInstalled(nodeID) then
+ if C_Soulbinds.GetTotalConduitChargesPending() >= C_Soulbinds.GetConduitCharges() then
+ UIErrorsFrame:AddExternalErrorMessage(CONDUIT_CHARGE_ERROR);
return;
end
- if C_Soulbinds.IsConduitInstalledInSoulbind(self.soulbindID, conduitID) then
+ local pendingInstallConduitID = C_Soulbinds.GetConduitIDPendingInstall(nodeID);
+ if pendingInstallConduitID and pendingInstallConduitID == conduitID then
return;
end
- local pendingConduitID = C_Soulbinds.GetPendingConduitID(nodeID);
- if pendingConduitID and pendingConduitID == conduitID then
- return;
+ local pendingUninstallNodeID = C_Soulbinds.FindNodeIDPendingUninstall(self.soulbindID, conduitID);
+ local pendingInstallNodeID = C_Soulbinds.FindNodeIDPendingInstall(self.soulbindID, conduitID);
+ local appearInstalledNodeID = C_Soulbinds.FindNodeIDAppearingInstalled(self.soulbindID, conduitID);
+ local pending = pendingUninstallNodeID > 0 or pendingInstallNodeID > 0;
+
+ local isPendingInstall = pendingInstallNodeID > 0;
+ local isPendingUninstall = pendingUninstallNodeID > 0;
+ if isPendingInstall then
+ C_Soulbinds.UnmodifyNode(pendingInstallNodeID);
+ elseif isPendingUninstall then
+ C_Soulbinds.UnmodifyNode(pendingUninstallNodeID);
end
- local pendingNodeID = C_Soulbinds.GetPendingNodeIDInSoulbind(self.soulbindID, conduitID);
- if pendingNodeID > 0 then
- C_Soulbinds.RemovePendingConduit(pendingNodeID);
- StaticPopup_Show("SOULBIND_DIALOG_MOVE_CONDUIT", nil, nil);
+ local consumeInstall = false;
+ local actualConduitID = C_Soulbinds.GetInstalledConduitID(nodeID);
+ if actualConduitID == conduitID then
+ if pendingUninstallNodeID == 0 then
+ return;
+ elseif pendingUninstallNodeID == nodeID then
+ consumeInstall = true;
+ C_Soulbinds.UnmodifyNode(nodeID);
+ end
end
- C_Soulbinds.AddPendingConduit(nodeID, conduitID);
+ local actuallyInstalledNodeID = C_Soulbinds.FindNodeIDActuallyInstalled(self.soulbindID, nodeID);
+ if ((actuallyInstalledNodeID > 0) or isPendingInstall) and (actuallyInstalledNodeID ~= nodeID) then
+ StaticPopup_Show("SOULBIND_DIALOG_MOVE_CONDUIT", nil, nil);
+ end
+ if not consumeInstall then
+ C_Soulbinds.ModifyNode(nodeID, conduitID, Enum.SoulbindConduitTransactionType.Install);
+ end
+
ClearCursor();
end
@@ -450,11 +494,17 @@ function SoulbindTreeMixin:Init(soulbindData)
local canModifySoulbind = C_Soulbinds.CanModifySoulbind();
local animDuration = canModifySoulbind and .6 or .8;
- for _, node in ipairs(nodes) do
- local nodeID = node.ID;
- local nodeFrame = self.nodeFrames[nodeID];
- nodeFrame:Init(node);
- nodeFrame:SetAnimDuration(animDuration);
+ if reconstructTree then
+ for _, node in ipairs(nodes) do
+ local nodeFrame = self.nodeFrames[node.ID];
+ nodeFrame:SetAnimDuration(animDuration);
+ end
+ else
+ for _, node in ipairs(nodes) do
+ local nodeFrame = self.nodeFrames[node.ID];
+ nodeFrame:Init(node);
+ nodeFrame:SetAnimDuration(animDuration);
+ end
end
for _, nodeFrame in pairs(self.nodeFrames) do
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.lua b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.lua
index 88dce6931d248ec13f4b5d51ba2ce167ccce3b28..374d5820603af9996220f081b4af2d9c55d8ddf0 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.lua
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.lua
@@ -1,17 +1,9 @@
-local ResetConduitsFormatter = CreateFromMixins(SecondsFormatterMixin);
-ResetConduitsFormatter:Init(SECONDS_PER_HOUR, SecondsFormatter.Abbreviation.None, true, true);
-
-function ResetConduitsFormatter:GetDesiredUnitCount(seconds)
- return 1;
-end
-
local SoulbindViewerEvents =
{
"SOULBIND_FORGE_INTERACTION_ENDED",
"SOULBIND_ACTIVATED",
"SOULBIND_PENDING_CONDUIT_CHANGED",
"SOULBIND_CONDUIT_INSTALLED",
- "SOULBIND_CONDUITS_RESET"
};
SoulbindViewerMixin = CreateFromMixins(CallbackRegistryMixin);
@@ -31,9 +23,6 @@ function SoulbindViewerMixin:OnLoad()
self.ActivateSoulbindButton:SetScript("OnEnter", GenerateClosure(self.OnActivateSoulbindEnter, self));
self.ActivateSoulbindButton:SetScript("OnLeave", GenerateClosure(self.OnActivateSoulbindLeave, self));
self.CommitConduitsButton:SetScript("OnClick", GenerateClosure(self.OnCommitConduitsClicked, self));
- self.ResetConduitsButton:SetScript("OnClick", GenerateClosure(self.OnResetConduitsClicked, self));
- self.ResetConduitsButton:SetScript("OnEnter", GenerateClosure(self.OnResetConduitsButtonEnter, self));
- self.ResetConduitsButton:SetScript("OnLeave", GenerateClosure(self.OnResetConduitsButtonLeave, self));
self.CloseButton:SetScript("OnClick", GenerateClosure(self.OnCloseButtonClicked, self));
self.Tree:RegisterCallback(SoulbindTreeMixin.Event.OnNodeChanged, self.OnNodeChanged, self);
@@ -67,60 +56,22 @@ function SoulbindViewerMixin:OnEvent(event, ...)
local soulbindID = ...;
self:OnSoulbindActivated(...);
elseif event == "SOULBIND_PENDING_CONDUIT_CHANGED" then
- local nodeID, conduitID, pending = ...;
+ local nodeID = ...;
self:OnConduitChanged();
elseif event == "SOULBIND_CONDUIT_INSTALLED" then
Soulbinds.SetConduitInstallPending(false);
self:UpdateButtons();
- elseif event == "SOULBIND_CONDUITS_RESET" then
- Soulbinds.SetConduitResetPending(false);
- self:UpdateResetConduitsButton();
end
end
function SoulbindViewerMixin:OnShow()
FrameUtil.RegisterFrameForEvents(self, SoulbindViewerEvents);
- self.ResetConduitsButton:SetShown(C_Soulbinds.CanModifySoulbind());
-
self:UpdateButtons();
PlaySound(SOUNDKIT.SOULBINDS_OPEN_UI, nil, SOUNDKIT_ALLOW_DUPLICATES);
end
-function SoulbindViewerMixin:OnResetConduitsButtonLeave()
- GameTooltip:Hide();
-end
-
-function SoulbindViewerMixin:OnResetConduitsButtonEnter()
- GameTooltip:SetOwner(self.ResetConduitsButton, "ANCHOR_RIGHT");
- GameTooltip_SetTitle(GameTooltip, CONDUIT_RESET_BUTTON_HEADER);
-
- local soulbindID = self.soulbindData.ID;
- local hideNoConduitWarning = false;
- if C_Soulbinds.CanResetConduitsInSoulbind(soulbindID) then
- GameTooltip_AddNormalLine(GameTooltip, CONDUIT_RESET_AVAILABLE);
- else
- local seconds = C_DateAndTime.GetSecondsUntilWeeklyReset();
- local time = ResetConduitsFormatter:Format(C_DateAndTime.GetSecondsUntilWeeklyReset())
- GameTooltip_AddNormalLine(GameTooltip, CONDUIT_RESET_AVAILABLE_IN:format(time));
-
- hideNoConduitWarning = true;
- end
-
- GameTooltip_AddBlankLineToTooltip(GameTooltip);
- GameTooltip_AddNormalLine(GameTooltip, CONDUIT_RESET_INSTRUCTION);
-
- -- No Socketed Conduits Warning
- if not hideNoConduitWarning then
- if not C_Soulbinds.HasAnyInstalledConduitInSoulbind(self.soulbindData.ID) then
- GameTooltip_AddErrorLine(GameTooltip, CONDUIT_RESET_INELIGIBLE);
- end
- end
-
- GameTooltip:Show();
-end
-
function SoulbindViewerMixin:OnHide()
FrameUtil.UnregisterFrameForEvents(self, SoulbindViewerEvents);
C_Soulbinds.CloseUI();
@@ -129,7 +80,6 @@ function SoulbindViewerMixin:OnHide()
end
function SoulbindViewerMixin:UpdateButtons()
- self:UpdateResetConduitsButton();
self:UpdateActivateSoulbindButton();
self:UpdateCommitConduitsButton();
end
@@ -149,17 +99,6 @@ function SoulbindViewerMixin:OnNodeChanged()
self:UpdateButtons();
end
-function SoulbindViewerMixin:UpdateResetConduitsButton()
- local shown = C_Soulbinds.CanModifySoulbind();
- self.ResetConduitsButton:SetShown(shown);
- if shown then
- local soulbindID = self.soulbindData.ID;
- local enabled = C_Soulbinds.HasAnyInstalledConduitInSoulbind(soulbindID) and C_Soulbinds.CanResetConduitsInSoulbind(soulbindID);
- self.ResetConduitsButton:SetEnabled(enabled);
- self.ResetConduitsButton:SetAlpha(enabled and 1 or .6);
- end
-end
-
function SoulbindViewerMixin:Open()
local covenantID = C_Covenants.GetActiveCovenantID();
if covenantID == 0 then
@@ -295,45 +234,36 @@ function SoulbindViewerMixin:OnActivateSoulbindLeave()
end
function SoulbindViewerMixin:OnCommitConduitsClicked()
+ local conduitCharges = C_Soulbinds.GetConduitCharges();
+ if conduitCharges <= 0 then
+ return;
+ end
+
+ local soulbindID = self:GetOpenSoulbindID();
local onConfirm = function()
Soulbinds.SetConduitInstallPending(true);
- C_Soulbinds.CommitPendingConduitsInSoulbind(self:GetOpenSoulbindID());
+ C_Soulbinds.CommitPendingConduitsInSoulbind(soulbindID);
PlaySound(SOUNDKIT.SOULBINDS_COMMIT_CONDUITS, nil, SOUNDKIT_ALLOW_DUPLICATES);
end
- StaticPopup_Show("SOULBIND_CONDUIT_INSTALL_CONFIRM", nil, nil, onConfirm);
+
+ local total = C_Soulbinds.GetTotalConduitChargesPendingInSoulbind(soulbindID);
+ local iconMarkup = CreateAtlasMarkup("soulbinds_collection_charge_dialog", 12, 12, 0, 0);
+ local text = CONDUIT_CHARGE_CONFIRM:format(total, iconMarkup);
+ StaticPopup_Show("SOULBIND_CONDUIT_INSTALL_CONFIRM", text, nil, onConfirm);
end
-function SoulbindViewerMixin:OnResetConduitsClicked()
- local onConfirm = function()
- Soulbinds.SetConduitResetPending(true);
- C_Soulbinds.ResetSoulbindConduits(self:GetOpenSoulbindID());
- PlaySound(SOUNDKIT.SOULBINDS_RESET_CONDUITS, nil, SOUNDKIT_ALLOW_DUPLICATES);
- end
- StaticPopup_Show("SOULBIND_RESET_TREE", nil, nil, onConfirm);
+function SoulbindViewerMixin:OnCollectionConduitClick(conduitID)
+ self.Tree:OnCollectionConduitClick(conduitID);
end
-function SoulbindViewerMixin:OnCollectionConduitEnter(conduitType)
- self.Tree:OnCollectionConduitEnter(conduitType);
+function SoulbindViewerMixin:OnCollectionConduitEnter(conduitType, conduitID)
+ self.Tree:OnCollectionConduitEnter(conduitType, conduitID);
end
function SoulbindViewerMixin:OnCollectionConduitLeave()
self.Tree:OnCollectionConduitLeave();
end
-StaticPopupDialogs["SOULBIND_RESET_TREE"] = {
- text = SOULBIND_RESET_TREE,
- button1 = RESET,
- button2 = CANCEL,
- enterClicksFirstButton = true,
- whileDead = 1,
- hideOnEscape = 1,
- showAlert = 1,
-
- OnButton1 = function(self, callback)
- callback();
- end,
-};
-
StaticPopupDialogs["SOULBIND_CONDUIT_NO_CHANGES_CONFIRMATION"] = {
text = CONDUIT_NO_CHANGES_CONFIRMATION,
button1 = ACCEPT,
@@ -349,7 +279,7 @@ StaticPopupDialogs["SOULBIND_CONDUIT_NO_CHANGES_CONFIRMATION"] = {
};
StaticPopupDialogs["SOULBIND_CONDUIT_INSTALL_CONFIRM"] = {
- text = CONDUIT_INSTALL_CONFIRM,
+ text = "%s",
button1 = ACCEPT,
button2 = CANCEL,
enterClicksFirstButton = true,
diff --git a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.xml b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.xml
index 9a55548857ea0e826dfdcef968a1a0817e0443fb..eda6cdd5d50a3512323a632b89eb4c3873b3afbf 100644
--- a/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.xml
+++ b/Interface/AddOns/Blizzard_Soulbinds/Blizzard_SoulbindsViewer.xml
@@ -153,8 +153,8 @@
-
-
+
+
@@ -169,11 +169,6 @@
-
-
-
-
-
diff --git a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetBelowMinimapFrame.xml b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetBelowMinimapFrame.xml
index 4277f8b84fbb0b6668e78791ab176fc69f157e96..4aa9b10b8f7a07a9d1eb9825d050682e94da69aa 100644
--- a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetBelowMinimapFrame.xml
+++ b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetBelowMinimapFrame.xml
@@ -4,7 +4,6 @@
-
diff --git a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.lua b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.lua
index f73b690ac9d2d316d727deb357b2768902a421a0..f4d482a1d37a8533f7cd9ef6aacf576e5a13925e 100644
--- a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.lua
+++ b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.lua
@@ -170,7 +170,10 @@ function UIWidgetContainerMixin:RegisterForWidgetSet(widgetSetID, widgetLayoutFu
self.timerWidgets = {};
self.numTimers = 0;
self.numWidgetsShowing = 0;
- self.widgetSetLayoutDirection = C_UIWidgetManager.GetWidgetLayoutDirectionFromWidgetSetID(widgetSetID);
+
+ local widgetSetInfo = C_UIWidgetManager.GetWidgetSetInfo(widgetSetID);
+ self.widgetSetLayoutDirection = widgetSetInfo.layoutDirection;
+ self.verticalAnchorYOffset = -widgetSetInfo.verticalPadding;
if self.attachedToUnit then
C_UIWidgetManager.RegisterUnitForWidgetUpdates(self.attachedToUnit);
diff --git a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.xml b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.xml
index d83787a3dd56eeff973ea0a6073afd432da842ca..f30e7c1486cee6b5a1b96b4cc9a33cd8d92506bd 100644
--- a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.xml
+++ b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetManager.xml
@@ -18,7 +18,6 @@
-
diff --git a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateBase.lua b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateBase.lua
index 1b6a3467a49c83c38a8d4633a318f7e2c49fd0dc..fcb5a8e3f37ec74d2d12bc81b08b877770c7944c 100644
--- a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateBase.lua
+++ b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateBase.lua
@@ -8,9 +8,13 @@ end
function UIWidgetTemplateTooltipFrameMixin:OnLoad()
end
+function UIWidgetTemplateTooltipFrameMixin:UpdateMouseEnabled()
+ self:SetMouse(self.disableTooltip);
+end
+
function UIWidgetTemplateTooltipFrameMixin:Setup(widgetContainer)
- local disableMouse = widgetContainer.disableWidgetTooltips;
- self:SetMouse(disableMouse);
+ self.disableTooltip = widgetContainer.disableWidgetTooltips;
+ self:UpdateMouseEnabled();
self:SetMouseClickEnabled(false);
end
@@ -25,7 +29,7 @@ function UIWidgetTemplateTooltipFrameMixin:SetTooltip(tooltip, color)
if tooltip then
self.tooltipContainsHyperLink, self.preString, self.hyperLinkString, self.postString = ExtractHyperlinkString(tooltip);
end
- self:SetMouse();
+ self:UpdateMouseEnabled();
end
function UIWidgetTemplateTooltipFrameMixin:SetTooltipOwner()
diff --git a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateDiscreteProgressSteps.lua b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateDiscreteProgressSteps.lua
index 27e307aeebf79e2e86a6c310f48c2baaa6bff00c..57fb74aa2a7359c5d2e4b7aa844dcdf171393606 100644
--- a/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateDiscreteProgressSteps.lua
+++ b/Interface/AddOns/Blizzard_UIWidgets/Blizzard_UIWidgetTemplateDiscreteProgressSteps.lua
@@ -54,6 +54,21 @@ function UIWidgetTemplateDiscreteProgressStepsMixin:OnLoad()
self.wasActivated = {};
end
+function UIWidgetTemplateDiscreteProgressStepsMixin:EvaluateTutorials(textureKit)
+ if ( (textureKit == "eyeofthejailer") and (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_EYE_OF_JAILER)) ) then
+ local helpTipInfo = {
+ text = EYE_OF_JAILER_TUTORIAL,
+ buttonStyle = HelpTip.ButtonStyle.Close,
+ cvarBitfield = "closedInfoFrames",
+ bitfieldFlag = LE_FRAME_TUTORIAL_EYE_OF_JAILER,
+ targetPoint = HelpTip.Point.BottomEdgeCenter,
+ offsetY = -20,
+ extraRightMarginPadding = 12,
+ };
+ HelpTip:Show(self, helpTipInfo);
+ end
+end
+
function UIWidgetTemplateDiscreteProgressStepsMixin:Setup(widgetInfo, widgetContainer)
UIWidgetBaseTemplateMixin.Setup(self, widgetInfo, widgetContainer);
@@ -98,6 +113,7 @@ function UIWidgetTemplateDiscreteProgressStepsMixin:Setup(widgetInfo, widgetCont
self.wasDeactivated[i] = true;
self.wasActivated[i] = false;
end
+ self:EvaluateTutorials(textureKit);
end
function UIWidgetTemplateDiscreteProgressStepsMixin:OnReset()
diff --git a/Interface/FrameXML/ChatFrame.lua b/Interface/FrameXML/ChatFrame.lua
index aca8047c8199826153e0edcfb71299ff7c4b81da..999fa2ab0084fa9ab6f2f9128568cd9f86478389 100644
--- a/Interface/FrameXML/ChatFrame.lua
+++ b/Interface/FrameXML/ChatFrame.lua
@@ -3402,7 +3402,7 @@ local function GetPFlag(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, ar
-- Add Blizzard Icon if this was sent by a GM/DEV
return "|TInterface\\ChatFrame\\UI-ChatIcon-Blizz:12:20:0:0:32:16:4:28:0:16|t ";
elseif specialFlag == "GUIDE" then
- if IsActivePlayerNewcomer() then
+ if C_PlayerMentorship.IsActivePlayerConsideredNewcomer() then
return NPEV2_CHAT_USER_TAG_GUIDE .. " "; -- possibly unable to save global string with trailing whitespace...
end
elseif specialFlag == "NEWCOMER" then
diff --git a/Interface/FrameXML/ContainerFrame.lua b/Interface/FrameXML/ContainerFrame.lua
index 4aeb3b5f087f0ec93ca1b3dc3a8597cbb0d6be65..a4d9ea89b4e6f803bf228dfd8549ef006b841a2f 100644
--- a/Interface/FrameXML/ContainerFrame.lua
+++ b/Interface/FrameXML/ContainerFrame.lua
@@ -137,8 +137,8 @@ function ToggleBackpack()
for i=1, NUM_CONTAINER_FRAMES, 1 do
local frame = _G["ContainerFrame"..i];
if ( frame:IsShown() ) then
- EventRegistry:TriggerEvent("ContainerFrame.CloseBackpack");
frame:Hide();
+ EventRegistry:TriggerEvent("ContainerFrame.CloseBackpack");
end
-- Hide the token bar if closing the backpack
if ( BackpackTokenFrame ) then
@@ -1460,7 +1460,8 @@ function ToggleAllBags()
local totalBags = 1;
if ( IsBagOpen(0) ) then
bagsOpen = bagsOpen +1;
- CloseBackpack()
+ CloseBackpack();
+ EventRegistry:TriggerEvent("ContainerFrame.CloseBackpack");
end
local bagClosed = false;
diff --git a/Interface/FrameXML/DressUpFrames.lua b/Interface/FrameXML/DressUpFrames.lua
index 97ea9de5c24a3197b5ee998fd9dd75880a6cebeb..3965400025d880db22ae2e2b12c4723e135ba48f 100644
--- a/Interface/FrameXML/DressUpFrames.lua
+++ b/Interface/FrameXML/DressUpFrames.lua
@@ -18,14 +18,27 @@ function DressUpTransmogLink(link)
return DressUpVisual(link);
end
+local function ShouldAcceptDressUp(frame)
+ local parentFrame = frame.parentFrame;
+ if parentFrame == nil then
+ return;
+ end
+
+ if parentFrame.ShouldAcceptDressUp then
+ return parentFrame:ShouldAcceptDressUp();
+ end
+
+ return parentFrame:IsShown();
+end
+
local function GetFrameAndSetBackground(raceFilename, classFilename)
local frame;
- if SideDressUpFrame.parentFrame and SideDressUpFrame.parentFrame:IsShown() then
+ if ShouldAcceptDressUp(SideDressUpFrame) then
frame = SideDressUpFrame;
if not raceFilename then
raceFilename = select(2, UnitRace("player"));
end
- elseif( TransmogAndMountDressupFrame.parentFrame and TransmogAndMountDressupFrame.parentFrame:IsShown()) then
+ elseif ShouldAcceptDressUp(TransmogAndMountDressupFrame) then
frame = TransmogAndMountDressupFrame;
if not raceFilename then
raceFilename = select(2, UnitRace("player"));
@@ -59,8 +72,8 @@ function DressUpVisual(...)
return true;
end
-function DressUpTransmogSet(itemModifiedAppearanceIDs)
- local frame = GetFrameAndSetBackground();
+function DressUpTransmogSet(itemModifiedAppearanceIDs, forcedFrame)
+ local frame = forcedFrame or GetFrameAndSetBackground();
DressUpFrame_Show(frame);
DressUpFrame_ApplyAppearances(frame, itemModifiedAppearanceIDs);
end
@@ -134,12 +147,12 @@ function DressUpMountLink(link)
return false
end
-function DressUpMount(mountID)
+function DressUpMount(mountID, forcedFrame)
if ( not mountID or mountID == 0 ) then
return false;
end
- local frame = GetFrameAndSetBackground("Pet", "warrior"); --default to warrior BG when viewing full Pet/Mounts for now
+ local frame = forcedFrame or GetFrameAndSetBackground("Pet", "warrior"); --default to warrior BG when viewing full Pet/Mounts for now
--Show the frame
if ( not frame:IsShown() or frame.mode ~= "mount" ) then
@@ -217,7 +230,7 @@ function DressUpFrame_Show(frame)
frame.ResetButton:SetShown(frame ~= TransmogAndMountDressupFrame);
-- If there's not enough space as-is, try minimizing.
- if not CanShowRightUIPanel(frame) and not frame.MaximizeMinimizeFrame:IsMinimized() then
+ if not CanShowRightUIPanel(frame) and frame.MaximizeMinimizeFrame and not frame.MaximizeMinimizeFrame:IsMinimized() then
local isAutomaticAction = true;
frame.MaximizeMinimizeFrame:Minimize(isAutomaticAction);
diff --git a/Interface/FrameXML/GameTooltip.lua b/Interface/FrameXML/GameTooltip.lua
index 2f8917d08d4f808e55191a2dc9ddf0570657eb6c..5bf203e9168a3d869d79e0efbacc700cda6b6717 100644
--- a/Interface/FrameXML/GameTooltip.lua
+++ b/Interface/FrameXML/GameTooltip.lua
@@ -780,7 +780,6 @@ function GameTooltip_AddWidgetSet(self, widgetSetID)
self.widgetContainer = self.widgetFrame.WidgetContainer;
self.widgetContainer.verticalAnchorPoint = "TOPLEFT";
self.widgetContainer.verticalRelativePoint = "BOTTOMLEFT";
- self.widgetContainer.verticalAnchorYOffset = -10;
self.widgetContainer.showAndHideOnWidgetSetRegistration = false;
self.widgetContainer.disableWidgetTooltips = true;
self.widgetContainer:Hide();
diff --git a/Interface/FrameXML/ItemButtonTemplate.lua b/Interface/FrameXML/ItemButtonTemplate.lua
index 3c63e693762a28c5b58f024d9992833ee668e665..0e8339c7f937d89eba84197b47286fef773fe117 100644
--- a/Interface/FrameXML/ItemButtonTemplate.lua
+++ b/Interface/FrameXML/ItemButtonTemplate.lua
@@ -187,6 +187,9 @@ function SetItemButtonOverlay(button, itemIDOrLink, quality)
elseif IsCorruptedItem(itemIDOrLink) then
button.IconOverlay:SetAtlas("Nzoth-inventory-icon");
button.IconOverlay:Show();
+ elseif IsCosmeticItem(itemIDOrLink) then
+ button.IconOverlay:SetAtlas("CosmeticIconFrame");
+ button.IconOverlay:Show();
elseif C_Soulbinds.IsItemConduitByItemInfo(itemIDOrLink) then
if not quality or not BAG_ITEM_QUALITY_COLORS[quality] then
quality = Enum.ItemQuality.Common;
diff --git a/Interface/FrameXML/MailFrame.xml b/Interface/FrameXML/MailFrame.xml
index 5e1a27f56e65ab03dad048a352bc43f2932e18c1..0d9f59e5e25c0bccfba910348418b6dce521414f 100644
--- a/Interface/FrameXML/MailFrame.xml
+++ b/Interface/FrameXML/MailFrame.xml
@@ -126,6 +126,14 @@
+
+
+
+
+
+
+
+
@@ -200,6 +208,14 @@
+
+
+
+
+
+
+
+
diff --git a/Interface/FrameXML/MultiActionBars.xml b/Interface/FrameXML/MultiActionBars.xml
index 930484a317be347d54d10a954cd68419d2c56e84..e70076e532a66336adb2721c62b9ecaf29452238 100644
--- a/Interface/FrameXML/MultiActionBars.xml
+++ b/Interface/FrameXML/MultiActionBars.xml
@@ -283,7 +283,7 @@
-
+
diff --git a/Interface/FrameXML/RestrictedExecution.lua b/Interface/FrameXML/RestrictedExecution.lua
index 6dc36546ce404448772d8bda3728578a12044130..3eb358bf6e882c4898d9c07072ebafff22aa7a10 100644
--- a/Interface/FrameXML/RestrictedExecution.lua
+++ b/Interface/FrameXML/RestrictedExecution.lua
@@ -17,7 +17,7 @@ local error = error;
local scrub = scrub;
local issecure = issecure;
local setfenv = setfenv;
-local loadstring = loadstring;
+local loadstring_untainted = loadstring_untainted;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local pcall = pcall;
@@ -76,7 +76,7 @@ local function BuildRestrictedClosure(body, env, signature)
-- Include a \n before end to stop shenanigans with comments
local def, err =
- loadstring("return function (" .. signature .. ") " .. body .. "\nend", body);
+ loadstring_untainted("return function (" .. signature .. ") " .. body .. "\nend", body);
if (def == nil) then
return nil, err;
end
diff --git a/Interface/FrameXML/SecureCapsule.lua b/Interface/FrameXML/SecureCapsule.lua
index bdb6b27ab957ffe911bc9aeac7cb5e03a1add25b..2971f3a2f7e8d9241de7501450250a571bd18712 100644
--- a/Interface/FrameXML/SecureCapsule.lua
+++ b/Interface/FrameXML/SecureCapsule.lua
@@ -49,6 +49,11 @@ local function take(name)
_G[name] = nil;
end
+--Removes something from the global environment entirely (note: make sure that any saved references are local and will not be returned or otherwise exposed under any circumstances)
+local function remove(name)
+ _G[name] = nil;
+end
+
-- We create the "Enum" table directly in contents because we dont want the reference from _G in the secure environment
local function retainenum(name)
if (not contents["Enum"]) then
@@ -593,3 +598,5 @@ retain("C_RecruitAFriend");
retain("WOW_GAMES_CATEGORY_ID");
retain("WOW_GAME_TIME_CATEGORY_ID");
retain("WOW_SUBSCRIPTION_CATEGORY_ID");
+
+remove("loadstring_untainted");
\ No newline at end of file
diff --git a/Interface/FrameXML/TalentFrameTemplates.xml b/Interface/FrameXML/TalentFrameTemplates.xml
index 8bb8f64ebbdd2a4de96aa19b4465fc07fd7c0e23..c3e64d864360e7190dd673f35d7ce96b36656262 100644
--- a/Interface/FrameXML/TalentFrameTemplates.xml
+++ b/Interface/FrameXML/TalentFrameTemplates.xml
@@ -21,7 +21,7 @@
-
+
diff --git a/Interface/FrameXML/TransmogUtil.lua b/Interface/FrameXML/TransmogUtil.lua
index 3cc2ef20e7614314c6038f2061900ce7f693c926..e582b6e861372537144653218f11d2bfd0b836c8 100644
--- a/Interface/FrameXML/TransmogUtil.lua
+++ b/Interface/FrameXML/TransmogUtil.lua
@@ -41,9 +41,9 @@ end
-- If not, and the player has an offhand equipped that can have an illusion applied to it, uses that
-- Otherwise uses the fallback weapon in the mainhand
function TransmogUtil.GetBestWeaponInfoForIllusionDressup()
- local mainHandTransmogLocation = TransmogUtil.GetMainHandTransmogLocation();
+ local mainHandTransmogLocation = TransmogUtil.GetTransmogLocation("MAINHANDSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.None);
local mainHandVisualID = C_Transmog.GetSlotVisualInfo(mainHandTransmogLocation);
- local offHandTransmogLocation = TransmogUtil.GetOffHandTransmogLocation();
+ local offHandTransmogLocation = TransmogUtil.GetTransmogLocation("SECONDARYHANDSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.None);
local offHandVisualID = C_Transmog.GetSlotVisualInfo(offHandTransmogLocation);
local transmogLocation = ((mainHandVisualID == NO_TRANSMOG_VISUAL_ID) and (offHandVisualID ~= NO_TRANSMOG_VISUAL_ID)) and offHandTransmogLocation or mainHandTransmogLocation;
diff --git a/Interface/FrameXML/UI.xsd b/Interface/FrameXML/UI.xsd
index 6c14ee69561200f374f055d303a82f5512f17250..2e600b1aaa48b15a2c0aafbb45925f91108ba5f9 100644
--- a/Interface/FrameXML/UI.xsd
+++ b/Interface/FrameXML/UI.xsd
@@ -328,8 +328,9 @@
-
-
+
+
+
diff --git a/Interface/FrameXML/UIParent.lua b/Interface/FrameXML/UIParent.lua
index 53104677cd26638bc49f6f444634314aa8252307..714fd0a716da214011ce18a361017d721bf9e07a 100644
--- a/Interface/FrameXML/UIParent.lua
+++ b/Interface/FrameXML/UIParent.lua
@@ -725,14 +725,15 @@ function NPE_LoadUI()
if ( IsAddOnLoaded("Blizzard_NewPlayerExperience") ) then
return;
end
+ local NPE_AchievementID = 14287;
+ local _, _, _, completed = GetAchievementInfo(NPE_AchievementID);
local tutEnabled = GetTutorialsEnabled();
- local isEligible = C_PlayerInfo.IsPlayerEligibleForNPEv2();
- if ( tutEnabled and isEligible ) then
+ local isRestricted = C_PlayerInfo.IsPlayerNPERestricted();
+ if not completed or (tutEnabled and isRestricted) then
UIParentLoadAddOn("Blizzard_NewPlayerExperience");
end
end
-
function BoostTutorial_AttemptLoad()
if IsBoostTutorialScenario() and not IsAddOnLoaded("Blizzard_BoostTutorial") then
UIParentLoadAddOn("Blizzard_BoostTutorial");
@@ -790,9 +791,7 @@ function NPETutorial_AttemptToBegin(event)
varsLoaded = true;
end
if ( playerEnteredWorld and varsLoaded ) then
- if C_PlayerInfo.IsPlayerNPERestricted() then
- NPE_LoadUI();
- end
+ NPE_LoadUI();
end
end
@@ -3070,13 +3069,7 @@ function FramePositionDelegate:UpdateUIPanelPositions(currentFrame)
end
function FramePositionDelegate:UpdateScaleForFit(frame)
- local horizRatio = UIParent:GetWidth() / GetUIPanelWidth(frame);
- local vertRatio = UIParent:GetHeight() / GetUIPanelHeight(frame);
- if ( horizRatio < 1 or vertRatio < 1 ) then
- frame:SetScale(min(horizRatio, vertRatio));
- else
- frame:SetScale(1);
- end
+ UpdateScaleForFit(frame);
end
function FramePositionDelegate:UIParentManageFramePositions()
@@ -4211,7 +4204,9 @@ function getglobal(varr)
return _G[varr];
end
+local forceinsecure = forceinsecure;
function setglobal(varr,value)
+ forceinsecure();
_G[varr] = value;
end
@@ -4299,6 +4294,8 @@ function ToggleGameMenu()
elseif ( SpellStopCasting() ) then
elseif ( SpellStopTargeting() ) then
elseif ( securecall("CloseAllWindows") ) then
+ elseif ( CovenantPreviewFrame and CovenantPreviewFrame:IsShown()) then
+ CovenantPreviewFrame:HandleEscape();
elseif ( LootFrame:IsShown() ) then
-- if we're here, LootFrame was opened under the mouse (cvar "lootUnderMouse") so it didn't get closed by CloseAllWindows
LootFrame:Hide();
@@ -4309,8 +4306,6 @@ function ToggleGameMenu()
SplashFrame:Close();
elseif ( ChallengesKeystoneFrame and ChallengesKeystoneFrame:IsShown() ) then
ChallengesKeystoneFrame:Hide();
- elseif ( CovenantPreviewFrame and CovenantPreviewFrame:IsShown()) then
- CovenantPreviewFrame:HandleEscape();
elseif ( CanAutoSetGamePadCursorControl(false) and (not IsModifierKeyDown()) ) then
SetGamePadCursorControl(false);
else
diff --git a/Interface/FrameXML/UnitPopupCustomControls.xml b/Interface/FrameXML/UnitPopupCustomControls.xml
index 8af5fe0b9ae153f28609268e140721d3471a9ca6..8438129e347c696c055d3f676424f1dcf19fe274 100644
--- a/Interface/FrameXML/UnitPopupCustomControls.xml
+++ b/Interface/FrameXML/UnitPopupCustomControls.xml
@@ -35,7 +35,7 @@
-
+
diff --git a/Interface/GlueXML/AccountLogin.lua b/Interface/GlueXML/AccountLogin.lua
index 681cbff31710112a925de2ab45d92ab5d06c52ce..ec6279174e4cbfafdd400532ce3278845533c33d 100644
--- a/Interface/GlueXML/AccountLogin.lua
+++ b/Interface/GlueXML/AccountLogin.lua
@@ -114,6 +114,7 @@ function AccountLogin_UpdateSavedData(self)
end
function AccountLogin_Login()
+ C_Login.ClearLastError();
PlaySound(SOUNDKIT.GS_LOGIN);
if ( AccountLogin.UI.AccountEditBox:GetText() == "" ) then
diff --git a/Interface/GlueXML/GlueParent.lua b/Interface/GlueXML/GlueParent.lua
index 8758e2325b6ef42e0e8c3f475aeb5ed5209d11e8..7baa769159a396cb26a4da47df8fe2e57e69c28d 100644
--- a/Interface/GlueXML/GlueParent.lua
+++ b/Interface/GlueXML/GlueParent.lua
@@ -17,6 +17,7 @@ GLUE_SECONDARY_SCREENS = {
};
ACCOUNT_SUSPENDED_ERROR_CODE = 53;
+GENERIC_DISCONNECTED_ERROR_CODE = 319;
local function OnDisplaySizeChanged(self)
local width = GetScreenWidth();
@@ -149,9 +150,17 @@ function GlueParent_GetBestScreen()
end
end
+local function IsHigherPriorityError(errorID, currentErrorID)
+ if currentErrorID and errorID == GENERIC_DISCONNECTED_ERROR_CODE then
+ return false;
+ end
+ return true;
+end
+
+local currentlyShowingErrorID = nil;
function GlueParent_UpdateDialogs()
local auroraState, connectedToWoW, wowConnectionState, hasRealmList, waitingForRealmList = C_Login.GetState();
-
+ local errorID;
if ( auroraState == LE_AURORA_STATE_CONNECTING ) then
local isQueued, queuePosition, estimatedSeconds = C_Login.GetLogonQueueInfo();
if ( isQueued ) then
@@ -169,76 +178,78 @@ function GlueParent_UpdateDialogs()
GlueDialog_Show("CANCEL", LOGIN_STATE_CONNECTING);
end
elseif ( auroraState == LE_AURORA_STATE_NONE and C_Login.GetLastError() ) then
- local errorCategory, errorID, localizedString, debugString, errorCodeString = C_Login.GetLastError();
-
- local isHTML = false;
- local hasURL = false;
- local useGenericURL = false;
-
- --If we didn't get a string from C, look one up in GlueStrings as HTML
- if ( not localizedString ) then
- local tag = string.format("%s_ERROR_%d_HTML", errorCategory, errorID);
- localizedString = _G[tag];
- if ( localizedString ) then
- isHTML = true;
+ local errorCategory, localizedString, debugString, errorCodeString;
+ errorCategory, errorID, localizedString, debugString, errorCodeString = C_Login.GetLastError();
+
+ if (IsHigherPriorityError(errorID, currentlyShowingErrorID)) then
+ local isHTML = false;
+ local hasURL = false;
+ local useGenericURL = false;
+
+ --If we didn't get a string from C, look one up in GlueStrings as HTML
+ if ( not localizedString ) then
+ local tag = string.format("%s_ERROR_%d_HTML", errorCategory, errorID);
+ localizedString = _G[tag];
+ if ( localizedString ) then
+ isHTML = true;
+ end
end
- end
- --If we didn't get a string from C, look one up in GlueStrings
- if ( not localizedString ) then
- local tag = string.format("%s_ERROR_%d", errorCategory, errorID);
- localizedString = _G[tag];
- end
+ --If we didn't get a string from C, look one up in GlueStrings
+ if ( not localizedString ) then
+ local tag = string.format("%s_ERROR_%d", errorCategory, errorID);
+ localizedString = _G[tag];
+ end
- --If we still don't have one, just display a generic error with the ID
- if ( not localizedString ) then
- localizedString = _G[errorCategory.."_ERROR_OTHER"];
- useGenericURL = true;
- end
+ --If we still don't have one, just display a generic error with the ID
+ if ( not localizedString ) then
+ localizedString = _G[errorCategory.."_ERROR_OTHER"];
+ useGenericURL = true;
+ end
- --If we got a debug message, stick it on the end of the errorCodeString
- if ( debugString ) then
- errorCodeString = errorCodeString.." [[DBG "..debugString.."]]";
- end
+ --If we got a debug message, stick it on the end of the errorCodeString
+ if ( debugString ) then
+ errorCodeString = errorCodeString.." [[DBG "..debugString.."]]";
+ end
- --See if we want a custom URL
- local urlTag = string.format("%s_ERROR_%d_URL", errorCategory, errorID);
- if ( _G[urlTag] ) then
- hasURL = true;
- end
+ --See if we want a custom URL
+ local urlTag = string.format("%s_ERROR_%d_URL", errorCategory, errorID);
+ if ( _G[urlTag] ) then
+ hasURL = true;
+ end
- if ( errorCategory == "BNET" and errorID == ACCOUNT_SUSPENDED_ERROR_CODE ) then
- local remaining = C_Login.GetAccountSuspensionRemainingTime();
- if (remaining) then
- local days = floor(remaining / 86400);
- local hours = floor((remaining / 3600) - (days * 24));
- local minutes = floor((remaining / 60) - (days * 1440) - (hours * 60));
- localizedString = localizedString:format(" "..ACCOUNT_SUSPENSION_EXPIRATION:format(days, hours, minutes));
- else
- localizedString = localizedString:format("");
+ if ( errorCategory == "BNET" and errorID == ACCOUNT_SUSPENDED_ERROR_CODE ) then
+ local remaining = C_Login.GetAccountSuspensionRemainingTime();
+ if (remaining) then
+ local days = floor(remaining / 86400);
+ local hours = floor((remaining / 3600) - (days * 24));
+ local minutes = floor((remaining / 60) - (days * 1440) - (hours * 60));
+ localizedString = localizedString:format(" "..ACCOUNT_SUSPENSION_EXPIRATION:format(days, hours, minutes));
+ else
+ localizedString = localizedString:format("");
+ end
end
- end
- --Append the errorCodeString
- if ( isHTML ) then
- --Pretty hacky...
- local endOfHTML = "