diff --git a/Interface/AddOns/Blizzard_APIDocumentation/CovenantPreviewDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/CovenantPreviewDocumentation.lua
index 503ec415aa3c7b996048ecbaf6f443269394e479..2b41a63d588c86da7de2bd381f744ce4ff18786b 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/CovenantPreviewDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/CovenantPreviewDocumentation.lua
@@ -105,6 +105,7 @@ local CovenantPreview =
{ Name = "uiTextureKit", Type = "string", Nilable = false },
{ Name = "name", Type = "string", Nilable = false },
{ Name = "description", Type = "string", Nilable = false },
+ { Name = "sortOrder", Type = "number", Nilable = false },
},
},
},
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/CurrencyConstantsDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/CurrencyConstantsDocumentation.lua
index bf7b86bfb8d58e2941ff42fb4dc91b51dfb62225..46d6e70efbd9d29c7045566531561af4ba597aac 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/CurrencyConstantsDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/CurrencyConstantsDocumentation.lua
@@ -146,8 +146,8 @@ local CurrencyConstants =
{ 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 = "Barbershop", Type = "CurrencySource", EnumValue = 47 },
+ { Name = "Last", Type = "CurrencySource", EnumValue = 48 },
},
},
{
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua
index f534fdfa4fb0d334af9dc6446fd46fa2d314ef60..5b5d20adf599566bbfb03503381d43091a5b1262 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/GarrisonConstantsDocumentation.lua
@@ -357,14 +357,6 @@ local GarrisonConstants =
{ Name = "Type_9_0", Type = "GarrisonType", EnumValue = 111 },
},
},
- {
- Name = "GarrisonConstsExposed",
- Type = "Constants",
- Values =
- {
- { Name = "GARRISON_AUTO_COMBATANT_FULL_HEAL_COST", Type = "number", Value = 100 },
- },
- },
},
};
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/GarrisonInfoDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/GarrisonInfoDocumentation.lua
index b910d2479fbafdfbf827e4c2d06040652bf54beb..ab86d302a6c15ba03013c0f0afe5f3fb7cb1aee2 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/GarrisonInfoDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/GarrisonInfoDocumentation.lua
@@ -560,6 +560,15 @@ local GarrisonInfo =
{ Name = "followerDurability", Type = "number", Nilable = false },
},
},
+ {
+ Name = "GarrisonFollowerHealed",
+ Type = "Event",
+ LiteralName = "GARRISON_FOLLOWER_HEALED",
+ Payload =
+ {
+ { Name = "followerID", Type = "string", Nilable = false },
+ },
+ },
{
Name = "GarrisonFollowerListUpdate",
Type = "Event",
@@ -1086,6 +1095,7 @@ local GarrisonInfo =
{ Name = "maxHealth", Type = "number", Nilable = false },
{ Name = "attack", Type = "number", Nilable = false },
{ Name = "healingTimestamp", Type = "number", Nilable = false },
+ { Name = "healCost", Type = "number", Nilable = false },
},
},
{
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua
index 98d8dd04aee121c97b62b0f9cddd50080d2fde4e..d6a3625f3fa64757da1a3ae40d6c89d6327b5709 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/PlayerMentorshipDocumentation.lua
@@ -60,6 +60,11 @@ local PlayerMentorship =
Events =
{
+ {
+ Name = "MentorshipStatusChanged",
+ Type = "Event",
+ LiteralName = "MENTORSHIP_STATUS_CHANGED",
+ },
{
Name = "NewcomerGraduation",
Type = "Event",
diff --git a/Interface/AddOns/Blizzard_APIDocumentation/ScenarioInfoDocumentation.lua b/Interface/AddOns/Blizzard_APIDocumentation/ScenarioInfoDocumentation.lua
index c8b38f10a51cc37cb4c53010edc658f3cfdaa8cd..9bc86473986ef2f9a37c9ce45d10bdb0e5b7b034 100644
--- a/Interface/AddOns/Blizzard_APIDocumentation/ScenarioInfoDocumentation.lua
+++ b/Interface/AddOns/Blizzard_APIDocumentation/ScenarioInfoDocumentation.lua
@@ -89,9 +89,9 @@ local ScenarioInfo =
{
Name = "JailersTowerType",
Type = "Enumeration",
- NumValues = 11,
+ NumValues = 12,
MinValue = 0,
- MaxValue = 10,
+ MaxValue = 11,
Fields =
{
{ Name = "TwistingCorridors", Type = "JailersTowerType", EnumValue = 0 },
@@ -105,6 +105,7 @@ local ScenarioInfo =
{ Name = "TormentChamberJaina", Type = "JailersTowerType", EnumValue = 8 },
{ Name = "TormentChamberThrall", Type = "JailersTowerType", EnumValue = 9 },
{ Name = "TormentChamberAnduin", Type = "JailersTowerType", EnumValue = 10 },
+ { Name = "AdamantVaults", Type = "JailersTowerType", EnumValue = 11 },
},
},
},
diff --git a/Interface/AddOns/Blizzard_AdventureMap/AM_MissionDataProvider.lua b/Interface/AddOns/Blizzard_AdventureMap/AM_MissionDataProvider.lua
index 7393d0109a18d4ef49acee91d01ab736781f8d9e..719d9f7d93193f6e4d80a8f4bcf69139b04b2adc 100644
--- a/Interface/AddOns/Blizzard_AdventureMap/AM_MissionDataProvider.lua
+++ b/Interface/AddOns/Blizzard_AdventureMap/AM_MissionDataProvider.lua
@@ -28,7 +28,7 @@ function AdventureMap_MissionDataProviderMixin:OnEvent(event, ...)
end
elseif event == "GARRISON_MISSION_LIST_UPDATE" then
local followerType = ...;
- if followerType == Enum.GarrisonFollowerType.FollowerType_7_0 then
+ if followerType == Enum.GarrisonFollowerType.FollowerType_7_0 or followerType == Enum.GarrisonFollowerType.FollowerType_9_0 then
self:RefreshAllData();
end
elseif event == "GARRISON_MISSION_FINISHED" then
diff --git a/Interface/AddOns/Blizzard_BarbershopUI/Blizzard_BarberShopUI.lua b/Interface/AddOns/Blizzard_BarbershopUI/Blizzard_BarberShopUI.lua
index 668fb65b7862d1e0dddf7fbcd1df63eb0cb852e4..0060b1e106e2d9071b8292f2eab4a7fa4790372e 100644
--- a/Interface/AddOns/Blizzard_BarbershopUI/Blizzard_BarberShopUI.lua
+++ b/Interface/AddOns/Blizzard_BarbershopUI/Blizzard_BarberShopUI.lua
@@ -173,11 +173,13 @@ function BarberShopMixin:ResetCharacterRotation()
end
function BarberShopMixin:SetViewingAlteredForm(viewingAlteredForm, resetCategory)
+ self:RegisterEvent("BARBER_SHOP_CAMERA_VALUES_UPDATED");
C_BarberShop.SetViewingAlteredForm(viewingAlteredForm);
self:UpdateCharCustomizationFrame(resetCategory);
end
function BarberShopMixin:SetViewingShapeshiftForm(formID)
+ self:RegisterEvent("BARBER_SHOP_CAMERA_VALUES_UPDATED");
C_BarberShop.SetViewingShapeshiftForm(formID);
self.Sexes:SetShown(formID == nil);
end
diff --git a/Interface/AddOns/Blizzard_BindingUI/Blizzard_BindingUI.lua b/Interface/AddOns/Blizzard_BindingUI/Blizzard_BindingUI.lua
index ecc86e2ed11be708cf7bd774e9735d9fa3ade903..5605e35998a019e956bf53c403664a99d020c813 100644
--- a/Interface/AddOns/Blizzard_BindingUI/Blizzard_BindingUI.lua
+++ b/Interface/AddOns/Blizzard_BindingUI/Blizzard_BindingUI.lua
@@ -757,6 +757,8 @@ end
QuickKeybindFrameMixin = {};
function QuickKeybindFrameMixin:OnShow()
+ EventRegistry:TriggerEvent("QuickKeybindFrame.QuickKeybindModeEnabled");
+
self.characterSpecificButton:SetChecked(KeyBindingFrame.characterSpecificButton:GetChecked());
self.mouseOverButton = nil;
Enable_BagButtons();
@@ -769,6 +771,8 @@ function QuickKeybindFrameMixin:OnShow()
end
function QuickKeybindFrameMixin:OnHide()
+ EventRegistry:TriggerEvent("QuickKeybindFrame.QuickKeybindModeDisabled");
+
KeybindFrames_ClearOutputText();
if ( not GameMenuFrame:IsShown() ) then
ShowUIPanel(KeyBindingFrame);
diff --git a/Interface/AddOns/Blizzard_Channels/ChannelFrame.lua b/Interface/AddOns/Blizzard_Channels/ChannelFrame.lua
index aff7fe222e1741f56c438ed023d86b2621e9fbb8..987aed1c19a2d985bb0038ea0ead5a649c51cc94 100644
--- a/Interface/AddOns/Blizzard_Channels/ChannelFrame.lua
+++ b/Interface/AddOns/Blizzard_Channels/ChannelFrame.lua
@@ -166,6 +166,8 @@ function ChannelFrameMixin:OnEvent(event, ...)
self:MarkDirty("UpdateChannelList");
elseif event == "CHAT_MSG_CHANNEL_NOTICE" then
self:OnChannelNotice(...);
+ elseif event == "MENTORSHIP_STATUS_CHANGED" then
+ self:OnMentorshipStatusChanged();
end
end
@@ -638,16 +640,33 @@ function ChannelFrameMixin:OnChannelNotice(...)
local channelIndex = select(8, ...);
if eventType == "YOU_CHANGED" and C_ChatInfo.GetChannelRuleset(channelIndex) == Enum.ChatChannelRuleset.Mentor then
- local channelSlashCommand = GetSlashCommandForChannelOpenChat(channelIndex);
- if IsActivePlayerNewcomer() then
- ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_NEWCOMER:format(channelSlashCommand));
- ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_NEWCOMER1:format(channelSlashCommand));
- ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_NEWCOMER2:format(channelSlashCommand));
- else
- -- NOTE: Guide flags won't be set at this point if the user is joining from the NPC, assume that if the channel join is happening,
- -- then if you're not a newcomer, you must be a guide.
- ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_GUIDE:format(channelSlashCommand));
- end
+ self:CheckNewcomerChannelJoin(channelIndex);
+ end
+end
+
+function ChannelFrameMixin:OnMentorshipStatusChanged()
+ if self.pendingNewcomerChannelIndex then
+ local channelIndex = self.pendingNewcomerChannelIndex;
+ self.pendingNewcomerChannelIndex = nil;
+ self:UnregisterEvent("MENTORSHIP_STATUS_CHANGED");
+ self:CheckNewcomerChannelJoin(channelIndex);
+ end
+end
+
+function ChannelFrameMixin:CheckNewcomerChannelJoin(channelIndex)
+ local channelSlashCommand = GetSlashCommandForChannelOpenChat(channelIndex);
+
+ if IsActivePlayerNewcomer() then
+ ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_NEWCOMER:format(channelSlashCommand));
+ ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_NEWCOMER1:format(channelSlashCommand));
+ ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_NEWCOMER2:format(channelSlashCommand));
+ elseif IsActivePlayerMentor() then
+ -- NOTE: Guide flags won't be set at this point if the user is joining from the NPC, assume that if the channel join is happening,
+ -- then if you're not a newcomer, you must be a guide.
+ ChatFrame_DisplaySystemMessageInPrimary(NPEV2_CHAT_WELCOME_TO_CHANNEL_GUIDE:format(channelSlashCommand));
+ else
+ self.pendingNewcomerChannelIndex = channelIndex;
+ self:RegisterEvent("MENTORSHIP_STATUS_CHANGED");
end
end
diff --git a/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua b/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua
index 2f6566d313a067cfbaad5a38f992794e1f4a6259..7e61709009db8019dbe8c8aef48b931004cf85ea 100644
--- a/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua
+++ b/Interface/AddOns/Blizzard_CharacterCreate/Blizzard_CharacterCreate.lua
@@ -195,7 +195,7 @@ local rafHelpTipInfo = {
function CharacterCreateMixin:UpdateRecruitInfo()
local active, faction = C_RecruitAFriend.GetRecruitInfo();
- if active and not self.paidServiceType and C_CharacterCreation.IsNewPlayerRestricted() then
+ if active and not self.paidServiceType and C_CharacterCreation.UseBeginnerMode() then
local recruiterIsHorde = (PLAYER_FACTION_GROUP[faction] == "Horde");
rafHelpTipInfo.text = recruiterIsHorde and RECRUIT_A_FRIEND_FACTION_SUGGESTION_HORDE or RECRUIT_A_FRIEND_FACTION_SUGGESTION_ALLIANCE;
rafHelpTipInfo.targetPoint = recruiterIsHorde and HelpTip.Point.RightEdgeCenter or HelpTip.Point.LeftEdgeCenter;
@@ -448,7 +448,7 @@ function CharacterCreateMixin:SetMode(mode, instantRotate)
ClassTrialSpecs:SetShown(mode == CHAR_CREATE_MODE_CUSTOMIZE and (C_CharacterCreation.GetCharacterCreateType() == Enum.CharacterCreateType.TrialBoost));
NameChoiceFrame:SetShown(mode == CHAR_CREATE_MODE_CUSTOMIZE);
ZoneChoiceFrame:SetShown(mode == CHAR_CREATE_MODE_ZONE_CHOICE);
- NewPlayerTutorial:SetShown(mode == CHAR_CREATE_MODE_CUSTOMIZE and C_CharacterCreation.IsNewPlayerRestricted());
+ NewPlayerTutorial:SetShown(mode == CHAR_CREATE_MODE_CUSTOMIZE and C_CharacterCreation.UseBeginnerMode());
self.currentMode = mode;
self.creatingCharacter = false;
@@ -747,7 +747,7 @@ function CharacterCreateClassButtonMixin:SetClass(classData, selectedClassID)
local validAllianceRaceNames = {};
local validHordeRaceNames = {};
for _, raceData in ipairs(validRaces) do
- if not raceData.isAlliedRace or not C_CharacterCreation.IsNewPlayerRestricted() then
+ if not raceData.isAlliedRace or not C_CharacterCreation.UseBeginnerMode() then
if raceData.isNeutralRace or (raceData.factionInternalName == "Alliance") then
tinsert(validAllianceRaceNames, raceData.name);
end
@@ -865,10 +865,10 @@ function CharacterCreateRaceButtonMixin:SetRace(raceData, selectedSexID, selecte
end
self.RaceName.Text:SetText(raceData.name);
- self.RaceName:SetShown(C_CharacterCreation.IsNewPlayerRestricted());
+ self.RaceName:SetShown(C_CharacterCreation.UseBeginnerMode());
if not raceData.isAlliedRace then
- if C_CharacterCreation.IsNewPlayerRestricted() then
+ if C_CharacterCreation.UseBeginnerMode() then
self.tooltipXOffset = 16;
else
self.tooltipXOffset = 113;
@@ -1021,8 +1021,9 @@ end
function CharacterCreateRaceAndClassMixin:OnShow()
local isNewPlayerRestricted = C_CharacterCreation.IsNewPlayerRestricted();
- self.AllianceAlliedRaces:SetShown(not isNewPlayerRestricted);
- self.HordeAlliedRaces:SetShown(not isNewPlayerRestricted);
+ local useNewPlayerMode = C_CharacterCreation.UseBeginnerMode();
+ self.AllianceAlliedRaces:SetShown(not useNewPlayerMode);
+ self.HordeAlliedRaces:SetShown(not useNewPlayerMode);
self.ClassTrialCheckButton:ClearTooltipLines();
self.ClassTrialCheckButton:AddTooltipLine(CHARACTER_TYPE_FRAME_TRIAL_BOOST_CHARACTER_TOOLTIP:format(C_CharacterCreation.GetTrialBoostStartingLevel()));
diff --git a/Interface/AddOns/Blizzard_Communities/ClubFinder.lua b/Interface/AddOns/Blizzard_Communities/ClubFinder.lua
index 5b1f162a75f31f8951a10666b2f41f148f22efbd..11cfb442fba16d172ab5bb1e5650720ddc0ce9a0 100644
--- a/Interface/AddOns/Blizzard_Communities/ClubFinder.lua
+++ b/Interface/AddOns/Blizzard_Communities/ClubFinder.lua
@@ -1231,7 +1231,7 @@ end
function CardRightClickOptionsMenuInitialize(self, level)
- if(self:GetParent():IsReported()) then
+ if(self:GetParent():IsReported() or not self:GetParent().cardInfo) then
return;
end
diff --git a/Interface/AddOns/Blizzard_Communities/CommunitiesList.lua b/Interface/AddOns/Blizzard_Communities/CommunitiesList.lua
index b097477f1c9ef15d58429ef73ac146a20bc32eab..7b38c14ce7b681798ec050596019d6c6f9664c5e 100644
--- a/Interface/AddOns/Blizzard_Communities/CommunitiesList.lua
+++ b/Interface/AddOns/Blizzard_Communities/CommunitiesList.lua
@@ -362,8 +362,9 @@ function CommunitiesListMixin:OnCommunitiesFrameDisplayModeChanged()
end
function CommunitiesListMixin:OnCommunityInviteDeclined(invitationId, clubId)
+ local communitiesFrame = self:GetCommunitiesFrame();
self.declinedInvitationIds[#self.declinedInvitationIds + 1] = invitationId;
- communitiesFrame:UpdateClubSelection();
+ self:GetCommunitiesFrame():UpdateClubSelection();
self:UpdateInvitations();
self:Update();
end
diff --git a/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua b/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua
index 7855f9e4b8a12b22b10a62cd91cd3fff213aa074..a9e0f234b93d5dbe05e401d7d42945f2888c07bb 100644
--- a/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua
+++ b/Interface/AddOns/Blizzard_CovenantPreviewUI/Blizzard_CovenantPreviewUI.lua
@@ -169,6 +169,13 @@ function CovenantPreviewFrameMixin:TryShow(covenantInfo)
end);
end
+
+ if (covenantInfo.covenantSoulbinds and #covenantInfo.covenantSoulbinds > 1) then
+ table.sort(covenantInfo.covenantSoulbinds, function(a, b)
+ return CovenantPreviewSortFunction(a.sortOrder, b.sortOrder);
+ end);
+ end
+
self:SetupAbilityButtons(covenantInfo.covenantAbilities);
self:SetupSoulbindButtons(covenantInfo.covenantSoulbinds);
self:SetupCovenantInfoPanel(covenantInfo);
@@ -248,6 +255,7 @@ end
CovenantAbilityButtonMixin = { };
function CovenantAbilityButtonMixin:OnEnter()
+ EmbeddedItemTooltip:Hide();
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
GameTooltip:SetSpellByID(self.spellID);
GameTooltip:Show();
@@ -274,6 +282,7 @@ function CovenantFeatureButtonMixin:Setup(covenantFeatureInfo)
end
function CovenantFeatureButtonMixin:OnEnter()
+ EmbeddedItemTooltip:Hide();
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", -30, -30);
GameTooltip_AddHighlightLine(GameTooltip, self.name);
GameTooltip_AddNormalLine(GameTooltip, self.description);
@@ -296,6 +305,8 @@ function CovenantSoulbindButtonMixin:OnEnter()
return;
end
+ GameTooltip:Hide();
+
local spell = Spell:CreateFromSpellID(self.spellID);
spell:ContinueOnSpellLoad(function()
EmbeddedItemTooltip:SetOwner(self, "ANCHOR_RIGHT", -12, -10);
diff --git a/Interface/AddOns/Blizzard_CovenantRenown/Blizzard_CovenantRenown.lua b/Interface/AddOns/Blizzard_CovenantRenown/Blizzard_CovenantRenown.lua
index ba847c4417fb38ea7c9869df33391b22f5b138e4..a36b75df6464687156c87917509d296622eaf60f 100644
--- a/Interface/AddOns/Blizzard_CovenantRenown/Blizzard_CovenantRenown.lua
+++ b/Interface/AddOns/Blizzard_CovenantRenown/Blizzard_CovenantRenown.lua
@@ -486,8 +486,8 @@ CovenantRenownTrackFrameMixin = {
elementTemplate = "CovenantRenownLevelTemplate",
scrollStartSound = SOUNDKIT.UI_COVENANT_RENOWN_SLIDE_START,
- scrollLoopSound = SOUNDKIT.UI_COVENANT_RENOWN_SLIDE_LOOP,
scrollStopSound = SOUNDKIT.UI_COVENANT_RENOWN_SLIDE_STOP,
+ scrollCenterChangeSound = SOUNDKIT.UI_COVENANT_RENOWN_SLIDE_START,
};
function CovenantRenownTrackFrameMixin:OnLoad()
@@ -588,6 +588,9 @@ function CovenantRenownTrackFrameMixin:RefreshView()
local leftIndex = math.max(1, centerIndex - self.numElementsPerHalf);
local rightIndex = math.min(centerIndex + self.numElementsPerHalf, self.numElements);
self:GetParent():OnTrackUpdate(leftIndex, centerIndex, rightIndex, self.moving);
+ if self.moving and self.scrollCenterChangeSound then
+ PlaySound(self.scrollCenterChangeSound, nil, SOUNDKIT_ALLOW_DUPLICATES);
+ end
end
self.LeftButton:SetEnabled(self.offset > 0);
@@ -680,7 +683,7 @@ function CovenantRenownTrackButtonMixin:OnMouseDown()
local track = self:GetParent();
track:StartScroll(self.direction);
if track.scrollStartSound then
- PlaySound(track.scrollStartSound);
+ PlaySound(track.scrollStartSound, nil, SOUNDKIT_ALLOW_DUPLICATES);
end
end
end
diff --git a/Interface/AddOns/Blizzard_CovenantToasts/Blizzard_CovenantRenownToast.lua b/Interface/AddOns/Blizzard_CovenantToasts/Blizzard_CovenantRenownToast.lua
index 21a3d9680bf99fb99715a67975e54e453b2f8087..f04d9abbe616e81518e1f302a35c73d127862a49 100644
--- a/Interface/AddOns/Blizzard_CovenantToasts/Blizzard_CovenantRenownToast.lua
+++ b/Interface/AddOns/Blizzard_CovenantToasts/Blizzard_CovenantRenownToast.lua
@@ -86,10 +86,10 @@ end
local SOUND_KIT_BY_TEXTURE_KIT =
{
- Kyrian = { default = 172612, [20] = 172613, [40] = 172614, },
- Venthyr = { default = 172642, [20] = 172645, [40] = 172649, },
- NightFae = { default = 172643, [20] = 172646, [40] = 172650, },
- Necrolord = { default = 172644, [20] = 172648, [40] = 172651, },
+ Kyrian = { default = 172612, milestone = 172613, final = 172614, },
+ Venthyr = { default = 172642, milestone = 172645, final = 172649, },
+ NightFae = { default = 172643, milestone = 172646, final = 172650, },
+ Necrolord = { default = 172644, milestone = 172648, final = 172651, },
};
function CovenantRenownToastMixin:PlayBanner(data)
@@ -118,7 +118,15 @@ function CovenantRenownToastMixin:PlayBanner(data)
self:SetupRewardVisuals(data.covenantID, data.renownLevel);
local soundKitData = SOUND_KIT_BY_TEXTURE_KIT[data.textureKit]
- PlaySound(soundKitData[data.renownLevel] or soundKitData.default)
+ local levels = C_CovenantSanctumUI.GetRenownLevels(data.covenantID);
+ local levelInfo = levels[data.renownLevel];
+ local soundID = soundKitData.default;
+ if data.renownLevel == #levels then
+ soundID = soundKitData.final;
+ elseif levelInfo.isMilestone then
+ soundID = soundKitData.milestone;
+ end
+ PlaySound(soundID);
self.bannerData = data;
diff --git a/Interface/AddOns/Blizzard_EncounterJournal/Blizzard_EncounterJournal.lua b/Interface/AddOns/Blizzard_EncounterJournal/Blizzard_EncounterJournal.lua
index a5cd22e207ccf8cc3f00edb3fa9f4df48d8fa330..c44ae61e2e78d39fa09c5af7ba1910a0f9184277 100644
--- a/Interface/AddOns/Blizzard_EncounterJournal/Blizzard_EncounterJournal.lua
+++ b/Interface/AddOns/Blizzard_EncounterJournal/Blizzard_EncounterJournal.lua
@@ -1806,7 +1806,7 @@ function EncounterJournal_SetLootButton(item)
if itemInfo.weaponTypeError then
item.armorType:SetText(INVALID_EQUIPMENT_COLOR:WrapTextInColorCode(itemInfo.armorType));
else
- item.armorType:SetText(itemInfo.slot);
+ item.armorType:SetText(itemInfo.armorType);
end
local numEncounters = EJ_GetNumEncountersForLootByIndex(item.index);
@@ -2843,7 +2843,7 @@ end
function EJSuggestFrame_OnEvent(self, event, ...)
if ( event == "AJ_REFRESH_DISPLAY" ) then
- if self:GetParent().selectedTab == self.id then
+ if self:GetParent().selectedTab == EncounterJournal.instanceSelect.suggestTab.id then
EJSuggestFrame_RefreshDisplay();
local newAdventureNotice = ...;
if ( newAdventureNotice ) then
diff --git a/Interface/AddOns/Blizzard_FlightMap/Blizzard_FlightMap.lua b/Interface/AddOns/Blizzard_FlightMap/Blizzard_FlightMap.lua
index de188bd0aa8b788ce3a3d992f998c40323b34de4..1b9abf4e1f8eac829ee69edde95d16bf65539beb 100644
--- a/Interface/AddOns/Blizzard_FlightMap/Blizzard_FlightMap.lua
+++ b/Interface/AddOns/Blizzard_FlightMap/Blizzard_FlightMap.lua
@@ -3,12 +3,19 @@ UIPanelWindows["FlightMapFrame"] = { area = "center", pushable = 1, showFailedFu
FlightMapMixin = {};
function FlightMapMixin:SetupTitle()
- self.BorderFrame.TitleText:SetText(FLIGHT_MAP);
self.BorderFrame.Bg:SetColorTexture(0, 0, 0, 1);
self.BorderFrame.Bg:SetParent(self);
self.BorderFrame.TopTileStreaks:Hide();
+ self:ResetTitleAndPortraitIcon();
+end
+
+function FlightMapMixin:ResetTitleAndPortraitIcon()
+ self:UpdateTitleAndPortraitIcon(FLIGHT_MAP, [[Interface/Icons/icon_petfamily_flying]]);
+end
- self.BorderFrame:SetPortraitToAsset([[Interface/Icons/icon_petfamily_flying]]);
+function FlightMapMixin:UpdateTitleAndPortraitIcon(titleText, portraitIcon)
+ self.BorderFrame.TitleText:SetText(titleText);
+ self.BorderFrame:SetPortraitToAsset(portraitIcon);
end
function FlightMapMixin:OnLoad()
diff --git a/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua b/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua
index 93a0397e95d97a6ad28723000c7b05d4fb42a8fe..6d69534da54408a078af6bd2873c17f0ba92b3be 100644
--- a/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua
+++ b/Interface/AddOns/Blizzard_FlightMap/FM_FlightPathDataProvider.lua
@@ -7,6 +7,7 @@ end
function FlightMap_FlightPathDataProviderMixin:RemoveAllData()
self:GetMap():RemoveAllPinsByTemplate("FlightMap_FlightPointPinTemplate");
+ self:GetMap():ResetTitleAndPortraitIcon();
if self.highlightLinePool then
self.highlightLinePool:ReleaseAll();
end
@@ -22,10 +23,19 @@ function FlightMap_FlightPathDataProviderMixin:RefreshAllData(fromOnShow)
self:CalculateLineThickness();
+ local bastionNodeFound = false;
local mapID = self:GetMap():GetMapID();
local taxiNodes = C_TaxiMap.GetAllTaxiNodes(mapID);
for i, taxiNodeData in ipairs(taxiNodes) do
self:AddFlightNode(taxiNodeData);
+
+ if taxiNodeData.textureKit == "FlightMaster_Bastion" then
+ bastionNodeFound = true;
+ end
+ end
+
+ if bastionNodeFound then
+ self:GetMap():UpdateTitleAndPortraitIcon(FLIGHT_MAP_BASTION, [[Interface/Icons/achievement_guildperk_havegroup willtravel]]);
end
self:ShowBackgroundRoutesFromCurrent();
@@ -171,9 +181,6 @@ FlightMap_FlightPointPinMixin = CreateFromMixins(MapCanvasPinMixin);
function FlightMap_FlightPointPinMixin:OnLoad()
self:SetScalingLimits(1.25, 0.9625, 1.275);
- -- Flight points nudge other pins away.
- self:SetNudgeSourceRadius(1);
-
self:UseFrameLevelType("PIN_FRAME_LEVEL_FLIGHT_POINT");
end
@@ -256,8 +263,8 @@ end
function FlightMap_FlightPointPinMixin:SetFlightPathStyle(textureKit, taxiNodeType)
self.textureKit = textureKit;
- self:SetNudgeSourceMagnitude(nil, nil);
self:SetNudgeSourceRadius(1);
+ self:SetNudgeSourceMagnitude(1, 2);
if textureKit then
self.atlasFormat = textureKit.."-%s";
diff --git a/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_CovenantMissionTemplates.lua b/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_CovenantMissionTemplates.lua
index e74453c3ad44b4eff934e431304a88873e91f95b..32842f54aaaad0c0e87d0c04ee3ac8f342611c4e 100644
--- a/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_CovenantMissionTemplates.lua
+++ b/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_CovenantMissionTemplates.lua
@@ -100,11 +100,6 @@ end
function CovenantFollowerTabMixin:UpdateValidSpellHighlightOnAbilityFrame()
end
-function CovenantFollowerTabMixin:CalculateHealCost()
- local followerStats = self.followerInfo.autoCombatantStats;
- return math.ceil(((followerStats.maxHealth - followerStats.currentHealth) / followerStats.maxHealth) * Constants.GarrisonConstsExposed.GARRISON_AUTO_COMBATANT_FULL_HEAL_COST);
-end
-
function CovenantFollowerTabMixin:UpdateHealCost()
self.HealFollowerFrame.HealFollowerButton.tooltip = nil;
self:HideHealFollowerTutorial();
@@ -114,16 +109,23 @@ function CovenantFollowerTabMixin:UpdateHealCost()
return;
end
- local buttonCost = self:CalculateHealCost();
- self.HealFollowerFrame.CostFrame.Cost:SetText(buttonCost);
+ local buttonCost = self.followerInfo.autoCombatantStats.healCost;
if (buttonCost == 0) then
+ self.HealFollowerFrame.CostFrame.Cost:SetText(buttonCost);
self.HealFollowerFrame.HealFollowerButton:SetEnabled(false);
self.HealFollowerFrame.HealFollowerButton.tooltip = COVENANT_MISSIONS_HEAL_ERROR_FULL_HEALTH;
StaticPopup_Hide("COVENANT_MISSIONS_HEAL_CONFIRMATION");
else
local _, secondaryCurrency = C_Garrison.GetCurrencyTypes(GarrisonFollowerOptions[self.followerInfo.followerTypeID].garrisonType);
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(secondaryCurrency);
+
+ if (currencyInfo.quantity < buttonCost) then
+ self.HealFollowerFrame.CostFrame.Cost:SetText(RED_FONT_COLOR_CODE..buttonCost..FONT_COLOR_CODE_CLOSE);
+ else
+ self.HealFollowerFrame.CostFrame.Cost:SetText(buttonCost);
+ end
+
if (buttonCost > currencyInfo.quantity) then
self.HealFollowerFrame.HealFollowerButton:SetEnabled(false);
self.HealFollowerFrame.HealFollowerButton.tooltip = COVENANT_MISSIONS_HEAL_ERROR_RESOURCES;
@@ -703,8 +705,8 @@ function CovenantPortraitMixin:SetupPortrait(followerInfo)
self.HealthBar:Show();
self.HealthBar:SetScale(0.7);
self.LevelText:SetText(followerInfo.level);
- self.HealthBar:SetMaxHealth(followerInfo.autoCombatantStats.maxHealth);
- self.HealthBar:SetHealth(followerInfo.autoCombatantStats.currentHealth);
+ self.HealthBar:SetMaxHealth(followerInfo.autoCombatantStats and followerInfo.autoCombatantStats.maxHealth or 1);
+ self.HealthBar:SetHealth(followerInfo.autoCombatantStats and followerInfo.autoCombatantStats.currentHealth or 1);
self.HealthBar:SetRole(followerInfo.role);
local puckBorderAtlas = followerInfo.isAutoTroop and "Adventurers-Followers-Frame-Troops" or "Adventurers-Followers-Frame";
self.PuckBorder:SetAtlas(puckBorderAtlas);
diff --git a/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonMissionTemplates.lua b/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonMissionTemplates.lua
index fab3dd27a1b89e8b9e8c371584cf57023fcbdfe7..fc0e06af371b0edf86465e07595fb5e0b685897a 100644
--- a/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonMissionTemplates.lua
+++ b/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonMissionTemplates.lua
@@ -149,7 +149,7 @@ function GarrisonMission:ShowMission(missionInfo)
self:SetEnvironmentTexture(missionDeploymentInfo.environmentTexture)
- missionPage.Stage.MissionEnvIcon.Texture:SetTexture(environmentTexture);
+ missionPage.Stage.MissionEnvIcon.Texture:SetTexture(missionDeploymentInfo.environmentTexture);
local locTextureKit = missionDeploymentInfo.locTextureKit;
if ( locTextureKit ) then
@@ -621,6 +621,10 @@ function GarrisonMission:UpdateStartButton(missionPage)
end
end
+ if (not disableError) then
+ disableError = self:GetSystemSpecificStartMissionFailureMessage();
+ end
+
local startButton = missionPage.StartMissionButton;
if ( disableError ) then
startButton:SetEnabled(false);
@@ -635,6 +639,9 @@ function GarrisonMission:UpdateStartButton(missionPage)
end
end
+function GarrisonMission:GetSystemSpecificStartMissionFailureMessage()
+end
+
function GarrisonMission:CloseMission()
self:GetMissionPage():Hide();
self:ClearParty();
diff --git a/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonSharedTemplates.lua b/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonSharedTemplates.lua
index 79ce4311b1742ec38d8a4ce34695365b29f790d6..b27b74b42fa587513106998d848ffac5e64faee4 100644
--- a/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonSharedTemplates.lua
+++ b/Interface/AddOns/Blizzard_GarrisonTemplates/Blizzard_GarrisonSharedTemplates.lua
@@ -198,7 +198,7 @@ function GarrisonFollowerList:OnEvent(event, ...)
self:ShowFollower(self.followerTab.followerID);
end
- if (self:IsVisible()) then
+ if (self:IsVisible() or event == "GARRISON_FOLLOWER_LIST_UPDATE") then
self:DirtyList();
self:UpdateFollowers();
end
diff --git a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresBoard.lua b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresBoard.lua
index 8823447c75b03f2a8590a539ac01df1e3e762559..0063f089a5ce028fecd31491e2950807b4a26f2a 100644
--- a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresBoard.lua
+++ b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresBoard.lua
@@ -199,7 +199,9 @@ function AdventuresBoardMixin:GetAnimFrameByAuraType(frame, previewType)
if bit.band(previewType, Enum.GarrAutoPreviewTargetType.Damage) == Enum.GarrAutoPreviewTargetType.Damage then
return frame.EnemyTargetingIndicatorFrame;
elseif bit.band(previewType, Enum.GarrAutoPreviewTargetType.Buff) == Enum.GarrAutoPreviewTargetType.Buff or bit.band(previewType, Enum.GarrAutoPreviewTargetType.Heal) == Enum.GarrAutoPreviewTargetType.Heal then
- frame.FriendlyTargetingIndicatorFrame.SupportColorationAnimator:SetPreviewTargets(previewType, {frame.FriendlyTargetingIndicatorFrame.TargetMarker});
+ if frame.FriendlyTargetingIndicatorFrame then
+ frame.FriendlyTargetingIndicatorFrame.SupportColorationAnimator:SetPreviewTargets(previewType, {frame.FriendlyTargetingIndicatorFrame.TargetMarker});
+ end
return frame.FriendlyTargetingIndicatorFrame;
end
@@ -308,6 +310,15 @@ function AdventuresBoardMixin:HideHealthValues()
end
end
+function AdventuresBoardMixin:UpdateHealedFollower(followerID)
+ for followerFrame in self.followerFramePool:EnumerateActive() do
+ if followerFrame:GetFollowerGUID() == followerID then
+ followerFrame:UpdateStats();
+ return;
+ end
+ end
+end
+
AdventuresBoardCombatMixin = CreateFromMixins(AdventuresBoardMixin);
function AdventuresBoardCombatMixin:OnLoad()
@@ -512,8 +523,8 @@ function AdventuresSocketMixin:SetBoardPreviewState(auraType)
onHideCallback = function(acknowledged, closeFlag) self:GetBoard():GetMainFrame():ProcessTutorials(); end;
checkCVars = true,
}
-
- self:GetBoard():GetMainFrame():QueueTutorial(self.AuraContainer, helpTipInfo);
+ local mainFrame = self:GetBoard():GetMainFrame();
+ mainFrame:QueueTutorial(mainFrame, helpTipInfo, self.AuraContainer);
end
self:UpdateAuraVisibility();
diff --git a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresCompleteScreen.lua b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresCompleteScreen.lua
index 160b4d444f47620da3b8703d0ca857850cce6608..6ebabba000814b2c040df240165c24bd028b587f 100644
--- a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresCompleteScreen.lua
+++ b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresCompleteScreen.lua
@@ -88,7 +88,6 @@ function AdventuresCompleteScreenMixin:SetCurrentMission(mission)
end
self:ResetMissionDisplay();
- self.RewardsScreen:PopulateFollowerInfo(self.followerGUIDToInfo, mission);
self.MissionInfo.EncounterIcon:SetEncounterInfo(mission.encounterIconInfo);
self.AdventuresCombatLog.environmentEffect = C_Garrison.GetAutoMissionEnvironmentEffect(mission.missionID);
@@ -156,6 +155,7 @@ function AdventuresCompleteScreenMixin:StartMissionReplay()
self.replayTimeElapsed = 0;
self.replayRoundIndex = 1;
self:SetScript("OnUpdate", AdventuresCompleteScreenMixin.UpdateMissionReplay);
+ self.RewardsScreen:PopulateFollowerInfo(self.followerGUIDToInfo, self.currentMission, self.autoCombatResult.winner);
local roundIndex = 1;
self:StartReplayRound(roundIndex);
diff --git a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresPuck.lua b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresPuck.lua
index abf6bbf01e37578066b563f7dc4655982bea1b78..f2ae3c1690bc79c40ace4c3cd8868a1d45271bea 100644
--- a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresPuck.lua
+++ b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresPuck.lua
@@ -278,6 +278,17 @@ function AdventuresFollowerPuckMixin:GetSupportPreviewTypeForPuck()
return previewType;
end
+function AdventuresFollowerPuckMixin:UpdateStats()
+ local followerID = self:GetFollowerGUID();
+
+ if followerID and self.info then
+ self.info.autoCombatantStats = C_Garrison.GetFollowerAutoCombatStats(followerID);
+
+ self.HealthBar:SetMaxHealth(self.info.autoCombatantStats.maxHealth);
+ self.HealthBar:SetHealth(self.info.autoCombatantStats.currentHealth);
+ end
+end
+
AdventuresEnemyPuckMixin = {};
function AdventuresEnemyPuckMixin:OnLoad()
diff --git a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresRewardsScreen.lua b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresRewardsScreen.lua
index 668b8cf33f8f9c54927a4d47299da5e2b5e8c429..e712f3e8d978f2098f030556e6cb77d164534c90 100644
--- a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresRewardsScreen.lua
+++ b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_AdventuresRewardsScreen.lua
@@ -94,22 +94,32 @@ function AdventuresRewardsScreenMixin:SetRewards(rewards, victoryState)
end
end
- self.FinalRewardsPanel.SpoilsFrame.RewardsEarnedFrame:Layout();
- self.FinalRewardsPanel.SpoilsFrame:Layout();
- self.FinalRewardsPanel.RewardsEarnedLabel:SetPoint("BOTTOM", self.FinalRewardsPanel.SpoilsFrame.RewardsEarnedFrame, "TOP", 0, 0);
+ self.FinalRewardsPanel.SpoilsFrame.RewardsEarnedFrame:Layout();
+ self.FinalRewardsPanel.SpoilsFrame:Layout();
+ self.FinalRewardsPanel.RewardsEarnedLabel:SetPoint("BOTTOM", self.FinalRewardsPanel.SpoilsFrame.RewardsEarnedFrame, "TOP", 0, 0);
end
-function AdventuresRewardsScreenMixin:PopulateFollowerInfo(followerInfo, missionInfo)
+function AdventuresRewardsScreenMixin:PopulateFollowerInfo(followerInfo, missionInfo, winner)
self.followerPool:ReleaseAll();
self.FinalRewardsPanel.FollowerProgressLabel:Hide();
self.hasExperienceRewards = false;
local layoutIndex = 1;
+ local bonusXP = 0;
+
+ if winner then
+ for _, reward in pairs(missionInfo.rewards) do
+ if reward.followerXP then
+ bonusXP = bonusXP + reward.followerXP;
+ end
+ end
+ end
+
for guid, info in pairs(followerInfo) do
--Don't show followers that don't have experience to gain
if info.maxXP and info.maxXP ~= 0 then
local followerFrame = self.followerPool:Acquire();
followerFrame.layoutIndex = layoutIndex;
- followerFrame.RewardsFollower:SetFollowerInfo(info, missionInfo.xp);
+ followerFrame.RewardsFollower:SetFollowerInfo(info, missionInfo.xp + bonusXP);
followerFrame:Show();
layoutIndex = layoutIndex + 1;
diff --git a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.lua b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.lua
index ee259f23473e26f1e95ceebc439e70bdcfdfc38d..5396b5b15669b0949e2c41902e7f0cafbb85c92f 100644
--- a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.lua
+++ b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.lua
@@ -149,6 +149,7 @@ local COVENANT_MISSION_EVENTS = {
"CURRENT_SPELL_CAST_CHANGED",
"GARRISON_FOLLOWER_XP_CHANGED",
"ADVENTURE_MAP_CLOSE",
+ "GARRISON_FOLLOWER_HEALED",
};
local COVENANT_MISSION_STATIC_POPUPS = {
@@ -160,6 +161,10 @@ local COVENANT_MISSION_STATIC_POPUPS = {
function CovenantMission:OnEventMainFrame(event, ...)
if event == "ADVENTURE_MAP_CLOSE" then
self.CloseButton:Click();
+ elseif event == "GARRISON_FOLLOWER_HEALED" then
+ local followerID = ...;
+ local missionPage = self:GetMissionPage();
+ missionPage.Board:UpdateHealedFollower(followerID);
else
GarrisonFollowerMission.OnEventMainFrame(self, event, ...);
end
@@ -215,6 +220,7 @@ function CovenantMission:SelectTab(id)
GarrisonFollowerMission.SelectTab(self, id);
self.BackgroundTile:SetShown(id ~= 3);
self:HideStaticPopups();
+ self:ClearQueuedTutorials();
end
function CovenantMission:CloseMission()
@@ -922,6 +928,14 @@ function CovenantMission:ClearStrategicPositioningTutorials()
HelpTip:Acknowledge(self, COVENANT_MISSIONS_TUTORIAL_STRATEGY1);
HelpTip:Acknowledge(self, COVENANT_MISSIONS_TUTORIAL_STRATEGY2);
end
+
+function CovenantMission:GetSystemSpecificStartMissionFailureMessage()
+ for followerFrame in self:GetMissionPage().Board:EnumerateFollowers() do
+ if followerFrame.info and followerFrame.info.autoCombatantStats.currentHealth == 0 then
+ return COVENANT_MISSIONS_COMPANIONS_MISSING_HEALTH;
+ end
+ end
+end
---------------------------------------------------------------------------------
--- Mission Page Follower Mixin ---
---------------------------------------------------------------------------------
@@ -1044,8 +1058,12 @@ function CovenantFollowerListMixin:CalculateHealAllFollowersCost()
for _, follower in ipairs(self.followers) do
if follower.status ~= GARRISON_FOLLOWER_ON_MISSION then
- local followerStats = follower.autoCombatantStats;
- healAllCost = healAllCost + math.ceil(((followerStats.maxHealth - followerStats.currentHealth) / followerStats.maxHealth) * Constants.GarrisonConstsExposed.GARRISON_AUTO_COMBATANT_FULL_HEAL_COST);
+ --Get the most recent status
+ if (follower.autoCombatantStats.maxHealth ~= follower.autoCombatantStats.currentHealth) then
+ follower.autoCombatantStats = C_Garrison.GetFollowerAutoCombatStats(follower.followerID);
+ end
+
+ healAllCost = healAllCost + follower.autoCombatantStats.healCost;
end
end
diff --git a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.xml b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.xml
index fbc03eacf876928fc4d64b10ef359e9434f4d9d3..f308254bb380b426b4211778480d477f3d619212 100644
--- a/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.xml
+++ b/Interface/AddOns/Blizzard_GarrisonUI/Blizzard_CovenantMissionUI.xml
@@ -461,7 +461,7 @@
-
diff --git a/Interface/FrameXML/UI.xsd b/Interface/FrameXML/UI.xsd
index 2e600b1aaa48b15a2c0aafbb45925f91108ba5f9..23b148e7e0764204df65062eb11fbae27ef9ca64 100644
--- a/Interface/FrameXML/UI.xsd
+++ b/Interface/FrameXML/UI.xsd
@@ -698,6 +698,8 @@
+
+
diff --git a/Interface/FrameXML/UnitPositionFrameTemplates.lua b/Interface/FrameXML/UnitPositionFrameTemplates.lua
index 50a379d53af22e004f0900fbd24c98ccd87900e0..5e44003d4eaa5ea632a634b9d8772243b6023240 100644
--- a/Interface/FrameXML/UnitPositionFrameTemplates.lua
+++ b/Interface/FrameXML/UnitPositionFrameTemplates.lua
@@ -1,8 +1,6 @@
-UNIT_POSITION_FRAME_DEFAULT_PIN_SIZE = 40;
-UNIT_POSITION_FRAME_DEFAULT_SUBLEVEL = 7;
-UNIT_POSITION_FRAME_DEFAULT_TEXTURE = "WhiteCircle-RaidBlips";
-UNIT_POSITION_FRAME_DEFAULT_SHOULD_SHOW_UNITS = true;
-UNIT_POSITION_FRAME_DEFAULT_USE_CLASS_COLOR = true;
+
+local type = type;
+local setmetatable = setmetatable;
-- NOTE: This is only using a single set of PVPQuery timers. There's no reason to have a different set per-instance.
PVPAFK_QUERY_DELAY_SECONDS = 5;
@@ -10,10 +8,20 @@ local pvpAFKQueryTimers = {}
local Private_UnitAppearanceData = {};
+setmetatable(Private_UnitAppearanceData, { __metatable = false });
local function GetOrCreateUnitAppearanceData(frame, unitType)
+ -- Global access should be avoided to expose as few attack vectors as possible.
+ local UNIT_POSITION_FRAME_DEFAULT_PIN_SIZE = 40;
+ local UNIT_POSITION_FRAME_DEFAULT_SUBLEVEL = 7;
+ local UNIT_POSITION_FRAME_DEFAULT_TEXTURE = "WhiteCircle-RaidBlips";
+ local UNIT_POSITION_FRAME_DEFAULT_SHOULD_SHOW_UNITS = true;
+ local UNIT_POSITION_FRAME_DEFAULT_USE_CLASS_COLOR = true;
+
if Private_UnitAppearanceData[frame] == nil then
- Private_UnitAppearanceData[frame] = {};
+ local newUnitAppearanceData = {};
+ setmetatable(newUnitAppearanceData, { __metatable = false });
+ Private_UnitAppearanceData[frame] = newUnitAppearanceData;
end
local data = Private_UnitAppearanceData[frame][unitType];
@@ -29,6 +37,8 @@ local function GetOrCreateUnitAppearanceData(frame, unitType)
showRotation = unitType == "player"; -- There's no point in trying to show rotation for anything except the local player.
};
+ setmetatable(data, { __metatable = false });
+
Private_UnitAppearanceData[frame][unitType] = data;
end
diff --git a/Interface/FrameXML/ZoneAbility.xml b/Interface/FrameXML/ZoneAbility.xml
index 2cc540190b27dc37f5f0e97fcaea430f01a7367e..73a4de8cdbc9c480573524f591d567f5b5d422d2 100644
--- a/Interface/FrameXML/ZoneAbility.xml
+++ b/Interface/FrameXML/ZoneAbility.xml
@@ -59,7 +59,7 @@
-
+
diff --git a/Interface/SharedXML/BindingUtil.lua b/Interface/SharedXML/BindingUtil.lua
index 9d28b901f7668ffb6343d5a9e6da4a8b760dc90f..006e49a57ae071b5f7656f8657fdc618f85f26f8 100644
--- a/Interface/SharedXML/BindingUtil.lua
+++ b/Interface/SharedXML/BindingUtil.lua
@@ -122,10 +122,10 @@ function CreateKeyChordStringUsingMetaKeyState(key)
if IsShiftKeyDown() then
table.insert(chord, "SHIFT");
end
-
- if IsMetaKeyDown() then
- table.insert(chord, "META");
- end
+
+ if IsMetaKeyDown() then
+ table.insert(chord, "META");
+ end
if not IsMetaKey(key) then
table.insert(chord, key);