You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
728 lines
24 KiB
728 lines
24 KiB
-- ----------------------------------------------------------------------------
|
|
-- Localized Lua globals.
|
|
-- ----------------------------------------------------------------------------
|
|
-- Functions
|
|
local pairs = _G.pairs
|
|
|
|
-- Libraries
|
|
local table = _G.table
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- AddOn namespace.
|
|
-- ----------------------------------------------------------------------------
|
|
local AddOnFolderName, private = ...
|
|
local Data = private.Data
|
|
local EventMessage = private.EventMessage
|
|
|
|
local LibStub = _G.LibStub
|
|
local AceEvent = LibStub("AceEvent-3.0")
|
|
local LibSharedMedia = LibStub("LibSharedMedia-3.0")
|
|
local NPCScan = LibStub("AceAddon-3.0"):GetAddon(AddOnFolderName)
|
|
|
|
|
|
_G.BINDING_HEADER_NPCSCAN = AddOnFolderName
|
|
_G["BINDING_NAME_CLICK NPCScan_RecentTargetButton:LeftButton"] = "Target latest NPC"
|
|
_G["BINDING_NAME_CLICK NPCScan_SearchMacroButton:LeftButton"] = "Targeting Macro"
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Constants.
|
|
-- ----------------------------------------------------------------------------
|
|
local LEFT_CLICK_TEXTURE = [[|TInterface\TUTORIALFRAME\UI-TUTORIAL-FRAME:19:11:-1:0:512:512:9:67:227:306|t]]
|
|
local RIGHT_CLICK_TEXTURE = [[|TInterface\TUTORIALFRAME\UI-TUTORIAL-FRAME:20:12:0:-1:512:512:9:66:332:411|t]]
|
|
|
|
local TOOLTIP_ANCHORS = {
|
|
CENTER = "ANCHOR_LEFT",
|
|
BOTTOM = "ANCHOR_RIGHT",
|
|
BOTTOMLEFT = "ANCHOR_RIGHT",
|
|
BOTTOMRIGHT = "ANCHOR_LEFT",
|
|
LEFT = "ANCHOR_RIGHT",
|
|
RIGHT = "ANCHOR_LEFT",
|
|
TOP = "ANCHOR_LEFT",
|
|
TOPLEFT = "ANCHOR_RIGHT",
|
|
TOPRIGHT = "ANCHOR_LEFT",
|
|
}
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Variables.
|
|
-- ----------------------------------------------------------------------------
|
|
local RaidIconIDs = {}
|
|
|
|
for index = 1, private.NUM_RAID_ICONS do
|
|
RaidIconIDs[#RaidIconIDs + 1] = index
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Prototype.
|
|
-- ----------------------------------------------------------------------------
|
|
local TargetButton = _G.CreateFrame("Button")
|
|
local TargetButtonMetatable = {
|
|
__index = TargetButton
|
|
}
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Helpers.
|
|
-- ----------------------------------------------------------------------------
|
|
local function AnimationGroup_HideParent(self)
|
|
self:GetParent():Hide()
|
|
end
|
|
|
|
local function AnimationGroup_DismissGrandParent(self)
|
|
self:GetParent():GetParent():RequestDeactivate()
|
|
end
|
|
|
|
local function AnimationGroup_DismissParent(self)
|
|
self:GetParent():RequestDeactivate()
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Scripts.
|
|
-- ----------------------------------------------------------------------------
|
|
local function DismissButton_OnClick(self, mouseButton)
|
|
local parent = self:GetParent()
|
|
|
|
if mouseButton == "RightButton" then
|
|
-- TODO: Make this a general utility function - this is based on code from Preferences/NPCs
|
|
local profile = private.db.profile
|
|
|
|
local isBlacklisted = not profile.blacklist.npcIDs[parent.npcID] and true or nil
|
|
profile.blacklist.npcIDs[parent.npcID] = isBlacklisted
|
|
|
|
private.UpdateAchievementNPCOptions()
|
|
private.UpdateBlacklistedNPCOptions()
|
|
|
|
NPCScan:UpdateScanList()
|
|
|
|
if isBlacklisted then
|
|
NPCScan:SendMessage(EventMessage.DismissTargetButtonByID, parent.npcID)
|
|
NPCScan:Printf(_G.ERR_IGNORE_ADDED_S, NPCScan:GetNPCNameFromID(parent.npcID))
|
|
end
|
|
|
|
end
|
|
|
|
parent:RequestDeactivate()
|
|
end
|
|
|
|
local function DismissButton_OnEnter(self)
|
|
if self:IsEnabled() then
|
|
local tooltip = _G.GameTooltip
|
|
tooltip:SetOwner(self, TOOLTIP_ANCHORS[self:GetParent():GetEffectiveSpawnPoint()], 0, -50)
|
|
tooltip:AddLine(LEFT_CLICK_TEXTURE .. " " .. _G.REMOVE, 0.5, 0.8, 1)
|
|
tooltip:AddLine(RIGHT_CLICK_TEXTURE .. " " .. _G.IGNORE, 0.5, 0.8, 1)
|
|
|
|
tooltip:Show()
|
|
end
|
|
end
|
|
|
|
local function TargetButton_OnClick(self, mouseButton)
|
|
if mouseButton == "RightButton" and not _G.InCombatLockdown() then
|
|
self.dismissAnimationGroup:Play()
|
|
end
|
|
end
|
|
|
|
local function TargetButton_OnEnter(self)
|
|
local tooltip = _G.GameTooltip
|
|
tooltip:SetOwner(self, TOOLTIP_ANCHORS[self:GetEffectiveSpawnPoint()], 0, -50)
|
|
tooltip:AddLine(LEFT_CLICK_TEXTURE .. " " .. _G.TARGET, 0.5, 0.8, 1)
|
|
|
|
if not _G.InCombatLockdown() then
|
|
tooltip:AddLine(RIGHT_CLICK_TEXTURE .. " " .. _G.REMOVE, 0.5, 0.8, 1)
|
|
end
|
|
|
|
tooltip:Show()
|
|
|
|
self.durationFadeAnimationGroup:Stop()
|
|
self.durationFadeAnimationGroup.animOut:SetStartDelay(private.db.profile.targetButtonGroup.durationSeconds)
|
|
end
|
|
|
|
local function TargetButton_OnLeave(self)
|
|
_G.GameTooltip:Hide()
|
|
|
|
self.durationFadeAnimationGroup:Play()
|
|
end
|
|
|
|
local function TargetButton_OnShow(self)
|
|
self.PortraitModel:SetPortraitZoom(1)
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Event and message handlers.
|
|
-- ----------------------------------------------------------------------------
|
|
function TargetButton:COMBAT_LOG_EVENT_UNFILTERED()
|
|
local _, subEvent, _, _, _, _, _, destGUID = _G.CombatLogGetCurrentEventInfo()
|
|
|
|
if subEvent == "UNIT_DIED" and destGUID and private.GUIDToCreatureID(destGUID) == self.npcID then
|
|
self.isDead = true
|
|
end
|
|
end
|
|
|
|
function TargetButton:PLAYER_REGEN_DISABLED()
|
|
if private.db.profile.targetButtonGroup.hideDuringCombat then
|
|
self.hiddenForCombat = true
|
|
self:Hide()
|
|
end
|
|
end
|
|
|
|
function TargetButton:PLAYER_REGEN_ENABLED()
|
|
local pausedDismissal = self.pausedDismissal
|
|
self.pausedDismissal = nil
|
|
|
|
if not self.hiddenForCombat and not self:IsShown() then
|
|
-- Should only happen if the dismiss button was clicked.
|
|
self:RequestDeactivate()
|
|
elseif self.isDead then
|
|
local sound = private.db.profile.alert.sound
|
|
if sound.isEnabled then
|
|
_G.PlaySoundFile(LibSharedMedia:Fetch("sound", "NPCScan Killed"), sound.channel)
|
|
end
|
|
|
|
self:SetSpecialText(true)
|
|
|
|
self.shineTexture:Show()
|
|
self.shineTexture.animIn:Play()
|
|
|
|
self.killedBackgroundTexture:Show()
|
|
self.killedBackgroundTexture.animIn:Play()
|
|
|
|
self.killedTextureFrame.left:Show()
|
|
self.killedTextureFrame.right:Show()
|
|
self.killedTextureFrame.animationGroup:Play()
|
|
elseif pausedDismissal then
|
|
self.dismissAnimationGroup:Play()
|
|
end
|
|
|
|
if self.hiddenForCombat and self.__isActive then
|
|
self:Show()
|
|
end
|
|
|
|
self.hiddenForCombat = nil
|
|
end
|
|
|
|
function TargetButton:UpdateData(_, data)
|
|
if data.npcID == self.npcID then
|
|
if data.unitClassification and self.__classification ~= data.unitClassification and not _G.InCombatLockdown() then
|
|
self:SendMessage(EventMessage.TargetButtonNeedsReclassified, self, data)
|
|
return
|
|
end
|
|
|
|
local hasUpdated = false
|
|
|
|
if self.needsRaidTarget then
|
|
hasUpdated = self:SetRaidTarget(data.unitToken)
|
|
end
|
|
|
|
if self.needsUnitData then
|
|
local sourceText = self.SourceText:GetText()
|
|
|
|
if data.sourceText and (not sourceText or sourceText == "") then
|
|
self.SourceText:SetText(data.sourceText)
|
|
end
|
|
|
|
self.PortraitModel:SetUnit(data.unitToken)
|
|
self:SetUnitData(data)
|
|
|
|
hasUpdated = true
|
|
end
|
|
|
|
|
|
if hasUpdated then
|
|
self.shineTexture:Show()
|
|
self.shineTexture.animIn:Play()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Methods.
|
|
-- ----------------------------------------------------------------------------
|
|
function TargetButton:Activate(data)
|
|
self.npcID = data.npcID
|
|
self.npcData = Data.NPCs[self.npcID]
|
|
self.npcName = data.npcName
|
|
|
|
self:SetSpecialText()
|
|
|
|
if data.vignetteName and data.vignetteName ~= data.npcName then
|
|
self.SourceText:SetText(("%s %s"):format(data.sourceText, _G.PARENS_TEMPLATE:format(data.vignetteName)))
|
|
else
|
|
self.SourceText:SetText(data.sourceText)
|
|
end
|
|
|
|
if data.unitToken then
|
|
self.PortraitModel:SetUnit(data.unitToken)
|
|
else
|
|
self.PortraitModel:SetCreature(data.npcID)
|
|
end
|
|
|
|
self:SetRaidTarget(data.unitToken)
|
|
self:SetUnitData(data)
|
|
|
|
if data.isFromQueue then
|
|
self.needsRaidTarget = true
|
|
end
|
|
|
|
local macroText = ("/targetexact %s"):format(data.npcName)
|
|
_G.NPCScan_RecentTargetButton:SetAttribute("macrotext", macroText)
|
|
|
|
self:SetAttribute("macrotext", macroText)
|
|
|
|
self:SetScale(private.db.profile.targetButtonGroup.scale)
|
|
self:Show()
|
|
|
|
if self.PreAnimateIn then
|
|
self:PreAnimateIn()
|
|
end
|
|
|
|
self.animIn:Play()
|
|
|
|
self.glowTexture:Show()
|
|
self.glowTexture.animIn:Play()
|
|
|
|
self.shineTexture:Show()
|
|
self.shineTexture.animIn:Play()
|
|
|
|
if data.isDead then
|
|
self.killedBackgroundTexture:Show()
|
|
|
|
self.killedTextureFrame.left:Show()
|
|
self.killedTextureFrame.right:Show()
|
|
self.killedTextureFrame.animationGroup:Play()
|
|
end
|
|
|
|
if self:IsMouseOver() then
|
|
self.durationFadeAnimationGroup.animOut:SetStartDelay(1)
|
|
else
|
|
self.durationFadeAnimationGroup.animOut:SetStartDelay(private.db.profile.targetButtonGroup.durationSeconds)
|
|
end
|
|
|
|
self.durationFadeAnimationGroup:Play()
|
|
|
|
self.__isActive = true
|
|
|
|
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
|
self:RegisterEvent("PLAYER_REGEN_ENABLED")
|
|
self:RegisterEvent("PLAYER_REGEN_DISABLED")
|
|
self:RegisterMessage(EventMessage.UnitInformationAvailable, "UpdateData")
|
|
end
|
|
|
|
function TargetButton:Deactivate()
|
|
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
|
self:UnregisterEvent("PLAYER_REGEN_ENABLED")
|
|
self:UnregisterMessage("NPCScan_UnitInformationAvailable")
|
|
|
|
self.__isActive = nil
|
|
|
|
self:StopAnimations()
|
|
|
|
self.killedBackgroundTexture:Hide()
|
|
self.killedTextureFrame.left:Hide()
|
|
self.killedTextureFrame.right:Hide()
|
|
self:Hide()
|
|
|
|
table.insert(RaidIconIDs, self.raidIconID)
|
|
self.raidIconID = nil
|
|
|
|
self.Classification:SetText("")
|
|
self.RaidIcon:Hide()
|
|
self.PortraitModel:ClearModel()
|
|
|
|
self.SpecialText:SetText("")
|
|
|
|
if self.isDead then
|
|
local npcData = self.npcData
|
|
|
|
if npcData then
|
|
if npcData.achievementID and npcData.achievementCriteriaID then
|
|
private.UpdateScanListAchievementCriteria()
|
|
end
|
|
|
|
if npcData.questID then
|
|
private.UpdateScanListQuestObjectives()
|
|
end
|
|
end
|
|
|
|
self.isDead = nil
|
|
end
|
|
|
|
self.npcID = nil
|
|
self.npcData = nil
|
|
self.npcName = nil
|
|
|
|
self.needsUnitData = nil
|
|
end
|
|
|
|
function TargetButton:RequestDeactivate()
|
|
if self.__isActive and not self.pausedDismissal then
|
|
if _G.InCombatLockdown() then
|
|
self.pausedDismissal = true
|
|
self:StopAnimations()
|
|
return
|
|
end
|
|
|
|
self:SendMessage(EventMessage.TargetButtonRequestDeactivate, self)
|
|
end
|
|
end
|
|
|
|
function TargetButton:GetEffectiveSpawnPoint()
|
|
local x, y = self:GetCenter()
|
|
if not x or not y then
|
|
return private.DEFAULT_OS_SPAWN_POINT
|
|
end
|
|
|
|
local horizontalName = (x > _G.UIParent:GetWidth() * 2 / 3) and "RIGHT" or (x < _G.UIParent:GetWidth() / 3) and "LEFT" or ""
|
|
local verticalName = (y > _G.UIParent:GetHeight() / 2) and "TOP" or "BOTTOM"
|
|
return verticalName .. horizontalName
|
|
end
|
|
|
|
function TargetButton:SetRaidTarget(unitToken)
|
|
if unitToken and not self.raidIconID and #RaidIconIDs > 0 then
|
|
self.raidIconID = table.remove(RaidIconIDs)
|
|
self.RaidIcon:Show()
|
|
|
|
_G.SetRaidTargetIconTexture(self.RaidIcon, self.raidIconID)
|
|
|
|
local raidMarker = private.db.profile.detection.raidMarker
|
|
if raidMarker.add and (raidMarker.addInGroup or not _G.IsInGroup()) and _G.GetRaidTargetIndex(unitToken) ~= self.raidIconID then
|
|
_G.SetRaidTarget(unitToken, self.raidIconID)
|
|
end
|
|
|
|
self.needsRaidTarget = nil
|
|
else
|
|
self.needsRaidTarget = true
|
|
end
|
|
|
|
return not self.needsRaidTarget
|
|
end
|
|
|
|
function TargetButton:SetSpecialText(fakeCriteriaCompleted)
|
|
local npcData = self.npcData
|
|
|
|
if npcData and npcData.achievementID then
|
|
local isCriteriaCompleted = fakeCriteriaCompleted or Data.NPCs[self.npcID]:IsAchievementCriteriaComplete()
|
|
local achievementName = Data.Achievements[npcData.achievementID].name
|
|
|
|
self.SpecialText:SetFormattedText("%s%s|r", isCriteriaCompleted and _G.GREEN_FONT_COLOR_CODE or _G.RED_FONT_COLOR_CODE, achievementName)
|
|
end
|
|
end
|
|
|
|
function TargetButton:SetUnitData(data)
|
|
if data.unitCreatureType then
|
|
if data.unitLevel then
|
|
local template = (self.__classification == "elite" or self.__classification == "rareelite") and _G.UNIT_TYPE_PLUS_LEVEL_TEMPLATE or _G.UNIT_TYPE_LEVEL_TEMPLATE
|
|
self.Classification:SetText(template:format(data.unitLevel, data.unitCreatureType))
|
|
|
|
local color = _G.GetRelativeDifficultyColor(_G.UnitLevel("player"), data.unitLevel)
|
|
self.UnitName:SetFormattedText("|cff%02x%02x%02x%s|r", color.r * 255, color.g * 255, color.b * 255, data.npcName)
|
|
else
|
|
self.Classification:SetText(_G.UNIT_TYPE_LETHAL_LEVEL_TEMPLATE:format(data.unitCreatureType))
|
|
self.UnitName:SetFormattedText("%s%s|r", _G.RED_FONT_COLOR_CODE, data.npcName)
|
|
end
|
|
|
|
self.needsUnitData = nil
|
|
else
|
|
self.UnitName:SetText(data.npcName)
|
|
self.needsUnitData = true
|
|
end
|
|
end
|
|
|
|
function TargetButton:StopAnimations()
|
|
self.dismissAnimationGroup:Stop()
|
|
self.durationFadeAnimationGroup:Stop()
|
|
self.killedBackgroundTexture.animIn:Stop()
|
|
self.killedTextureFrame.animationGroup:Stop()
|
|
end
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Initialization.
|
|
-- ----------------------------------------------------------------------------
|
|
local ClassificationDecorators
|
|
|
|
do
|
|
local macroLines = {}
|
|
|
|
local function ResetMacroText(self)
|
|
self:SetAttribute("macrotext", ("/cleartarget\n/print \"%s\""):format(_G.ERR_GENERIC_NO_TARGET))
|
|
end
|
|
|
|
function NPCScan:InitializeTargetButton()
|
|
local recentButton = _G.CreateFrame("Button", "NPCScan_RecentTargetButton", nil, "SecureActionButtonTemplate")
|
|
recentButton:SetAttribute("type", "macro")
|
|
recentButton:Hide()
|
|
|
|
recentButton.ResetMacroText = ResetMacroText
|
|
recentButton:ResetMacroText()
|
|
|
|
local macroButton = AceEvent:Embed(_G.CreateFrame("Button", "NPCScan_SearchMacroButton", nil, "SecureActionButtonTemplate"))
|
|
macroButton:SetAttribute("type", "macro")
|
|
macroButton:Hide()
|
|
|
|
macroButton.ResetMacroText = ResetMacroText
|
|
macroButton:ResetMacroText()
|
|
|
|
function macroButton:PLAYER_REGEN_ENABLED()
|
|
if self.scannerData then
|
|
self:Update("PLAYER_REGEN_ENABLED", self.scannerData)
|
|
self.scannerData = nil
|
|
end
|
|
end
|
|
|
|
macroButton:RegisterEvent("PLAYER_REGEN_ENABLED")
|
|
|
|
function macroButton:Update(_, scannerData)
|
|
if _G.InCombatLockdown() then
|
|
self.scannerData = scannerData
|
|
|
|
return
|
|
end
|
|
|
|
table.wipe(macroLines)
|
|
|
|
for npcID in pairs(scannerData.NPCs) do
|
|
table.insert(macroLines, ("/cleartarget\n/targetexact %s"):format(NPCScan:GetNPCNameFromID(npcID)))
|
|
end
|
|
|
|
if #macroLines == 0 then
|
|
self:ResetMacroText()
|
|
return
|
|
end
|
|
|
|
self:SetAttribute("macrotext", table.concat(macroLines, "\n"))
|
|
end
|
|
|
|
macroButton:RegisterMessage(EventMessage.ScannerDataUpdated, "Update")
|
|
|
|
ClassificationDecorators = {
|
|
elite = private.DecorateEliteTargetButton,
|
|
minus = private.DecorateNormalTargetButton,
|
|
normal = private.DecorateNormalTargetButton,
|
|
rare = private.DecorateRareTargetButton,
|
|
rareelite = private.DecorateRareEliteTargetButton,
|
|
worldboss = private.DecorateEliteTargetButton,
|
|
}
|
|
end
|
|
end -- do-block
|
|
|
|
local function CreateTargetButton(unitClassification)
|
|
local CreateAlphaAnimation = private.CreateAlphaAnimation
|
|
local CreateScaleAnimation = private.CreateScaleAnimation
|
|
|
|
local button = _G.CreateFrame("Button", nil, _G.UIParent, "SecureActionButtonTemplate, SecureHandlerShowHideTemplate")
|
|
button:SetFrameStrata("DIALOG")
|
|
button:SetAttribute("type1", "macro")
|
|
button:SetAttribute("_onshow", "self:Enable()")
|
|
button:SetAttribute("_onhide", "self:Disable()")
|
|
button:RegisterForClicks("AnyUp")
|
|
|
|
button:HookScript("OnClick", TargetButton_OnClick)
|
|
button:SetScript("OnEnter", TargetButton_OnEnter)
|
|
button:SetScript("OnLeave", TargetButton_OnLeave)
|
|
button:HookScript("OnShow", TargetButton_OnShow)
|
|
|
|
button:Hide()
|
|
|
|
AceEvent:Embed(_G.setmetatable(button, TargetButtonMetatable))
|
|
|
|
local dismissButton = _G.CreateFrame("Button", nil, button, "UIPanelCloseButtonNoScripts")
|
|
dismissButton:SetSize(16, 16)
|
|
dismissButton:GetDisabledTexture():SetTexture("")
|
|
dismissButton:GetHighlightTexture():SetTexture([[Interface\FriendsFrame\UI-Toast-CloseButton-Highlight]])
|
|
dismissButton:GetNormalTexture():SetTexture([[Interface\FriendsFrame\UI-Toast-CloseButton-Up]])
|
|
dismissButton:GetPushedTexture():SetTexture([[Interface\FriendsFrame\UI-Toast-CloseButton-Down]])
|
|
|
|
dismissButton:RegisterForClicks("AnyUp")
|
|
dismissButton:SetScript("OnClick", DismissButton_OnClick)
|
|
dismissButton:SetScript("OnEnter", DismissButton_OnEnter)
|
|
dismissButton:SetScript("OnLeave", _G.GameTooltip_Hide)
|
|
|
|
button.DismissButton = dismissButton
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Textures.
|
|
-- ----------------------------------------------------------------------------
|
|
local raidIcon = button:CreateTexture(nil, "OVERLAY")
|
|
raidIcon:Hide()
|
|
raidIcon:SetSize(16, 16)
|
|
raidIcon:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
|
|
button.RaidIcon = raidIcon
|
|
|
|
local portrait = button:CreateTexture(nil, "BORDER")
|
|
portrait:SetTexture([[Interface\FrameGeneral\UI-Background-Marble]])
|
|
portrait:SetSize(52, 52)
|
|
button.Portrait = portrait
|
|
|
|
local background = button:CreateTexture(nil, "BORDER", nil, 1)
|
|
background:SetAlpha(0)
|
|
background:SetBlendMode("BLEND")
|
|
button.Background = background
|
|
|
|
local glowTexture = button:CreateTexture(nil, "OVERLAY")
|
|
glowTexture:SetBlendMode("ADD")
|
|
glowTexture:SetAtlas("loottoast-glow")
|
|
button.glowTexture = glowTexture
|
|
|
|
local shineTexture = button:CreateTexture(nil, "OVERLAY")
|
|
shineTexture:SetBlendMode("ADD")
|
|
shineTexture:SetAtlas("loottoast-sheen")
|
|
button.shineTexture = shineTexture
|
|
|
|
local killedBackgroundTexture = button:CreateTexture(nil, "OVERLAY")
|
|
killedBackgroundTexture:Hide()
|
|
killedBackgroundTexture:SetBlendMode("ADD")
|
|
killedBackgroundTexture:SetTexture([[Interface\FullScreenTextures\LowHealth]])
|
|
button.killedBackgroundTexture = killedBackgroundTexture
|
|
|
|
local killedTextureFrame = _G.CreateFrame("Frame", nil, button)
|
|
killedTextureFrame:SetSize(48, 48)
|
|
killedTextureFrame:SetPoint("CENTER")
|
|
button.killedTextureFrame = killedTextureFrame
|
|
|
|
local killLeftTexture = killedTextureFrame:CreateTexture(nil, "OVERLAY", 1)
|
|
killLeftTexture:SetAlpha(0)
|
|
killLeftTexture:SetSize(64, 64)
|
|
killLeftTexture:SetAtlas("GarrMission_EncounterBar-Xleft")
|
|
killLeftTexture:SetPoint("CENTER")
|
|
killedTextureFrame.left = killLeftTexture
|
|
|
|
local killRightTexture = killedTextureFrame:CreateTexture(nil, "OVERLAY", 1)
|
|
killRightTexture:SetAlpha(0)
|
|
killRightTexture:SetSize(64, 64)
|
|
killRightTexture:SetAtlas("GarrMission_EncounterBar-Xright")
|
|
killRightTexture:SetPoint("CENTER")
|
|
killedTextureFrame.right = killRightTexture
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- FontStrings.
|
|
-- ----------------------------------------------------------------------------
|
|
local sourceText = button:CreateFontString(nil, "ARTWORK", 1)
|
|
sourceText:SetFontObject("GameFontNormalSmall")
|
|
button.SourceText = sourceText
|
|
|
|
local unitName = button:CreateFontString(nil, "ARTWORK", 1)
|
|
unitName:SetSize(165, 33)
|
|
unitName:SetFontObject("GameFontNormalMed3")
|
|
unitName:SetJustifyH("LEFT")
|
|
unitName:SetJustifyV("MIDDLE")
|
|
button.UnitName = unitName
|
|
|
|
local classification = button:CreateFontString(nil, "ARTWORK", 1)
|
|
classification:SetFontObject("GameFontNormalSmall")
|
|
button.Classification = classification
|
|
|
|
local specialText = button:CreateFontString(nil, "ARTWORK", 1)
|
|
button.SpecialText = specialText
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Animations.
|
|
-- ----------------------------------------------------------------------------
|
|
local buttonAnimIn = button:CreateAnimationGroup()
|
|
buttonAnimIn:SetToFinalAlpha(true)
|
|
button.animIn = buttonAnimIn
|
|
|
|
-- Glow
|
|
local glowAnimationGroup = glowTexture:CreateAnimationGroup()
|
|
glowAnimationGroup:SetScript("OnFinished", AnimationGroup_HideParent)
|
|
|
|
glowTexture.animIn = glowAnimationGroup
|
|
|
|
CreateAlphaAnimation(glowAnimationGroup, 0, 1, 0.2, nil, 1) -- Show
|
|
CreateAlphaAnimation(glowAnimationGroup, 1, 0, 0.5, nil, 2) -- Hide
|
|
|
|
-- Shine
|
|
local shineAnimationGroup = shineTexture:CreateAnimationGroup()
|
|
shineAnimationGroup:SetScript("OnFinished", AnimationGroup_HideParent)
|
|
|
|
shineTexture.animIn = shineAnimationGroup
|
|
|
|
CreateAlphaAnimation(shineAnimationGroup, 0, 1, 0.1, nil, 1) -- Animate in.
|
|
|
|
local shineOffset = shineAnimationGroup:CreateAnimation("Translation")
|
|
shineOffset:SetOffset(165, 0)
|
|
shineOffset:SetDuration(0.425)
|
|
shineOffset:SetOrder(2)
|
|
|
|
CreateAlphaAnimation(shineAnimationGroup, 1, 0, 0.25, 0.175, 2) -- Animate out.
|
|
|
|
-- Killed Background
|
|
local killedBackgroundAnimationGroup = killedBackgroundTexture:CreateAnimationGroup()
|
|
killedBackgroundAnimationGroup:SetScript("OnFinished", AnimationGroup_DismissGrandParent)
|
|
killedBackgroundAnimationGroup.name = "killedBackgroundAnimationGroup"
|
|
|
|
killedBackgroundTexture.animIn = killedBackgroundAnimationGroup
|
|
|
|
CreateAlphaAnimation(killedBackgroundAnimationGroup, 0, 1, 0.5, nil, 1) -- Show.
|
|
CreateAlphaAnimation(killedBackgroundAnimationGroup, 1, 0, 0.8, nil, 2) -- Hide.
|
|
|
|
-- Killed
|
|
local killedAnimationGroup = killedTextureFrame:CreateAnimationGroup()
|
|
killedAnimationGroup:SetToFinalAlpha(true)
|
|
killedTextureFrame.animationGroup = killedAnimationGroup
|
|
|
|
local killedLeftScaleAnim = CreateScaleAnimation(killedAnimationGroup, 5, 5, 1, 1, 0.15, nil, 1)
|
|
killedLeftScaleAnim:SetTarget(killedTextureFrame)
|
|
killedLeftScaleAnim:SetChildKey("left")
|
|
|
|
local killedLeftAlphaAnim = CreateAlphaAnimation(killedAnimationGroup, 0, 1, 0.1, nil, 1)
|
|
killedLeftAlphaAnim:SetTarget(killedTextureFrame)
|
|
killedLeftAlphaAnim:SetChildKey("left")
|
|
|
|
local killedRightScaleAnim = CreateScaleAnimation(killedAnimationGroup, 5, 5, 1, 1, 0.15, 0.1, 1)
|
|
killedRightScaleAnim:SetTarget(killedTextureFrame)
|
|
killedRightScaleAnim:SetChildKey("right")
|
|
|
|
local killedRightAlphaAnim = CreateAlphaAnimation(killedAnimationGroup, 0, 1, 0.1, 0.1, 1)
|
|
killedRightAlphaAnim:SetTarget(killedTextureFrame)
|
|
killedRightAlphaAnim:SetChildKey("right")
|
|
|
|
-- Background
|
|
local backgroundAnimIn = CreateAlphaAnimation(buttonAnimIn, 0, 1, 0.4, nil, 1)
|
|
backgroundAnimIn:SetTarget(button)
|
|
backgroundAnimIn:SetChildKey("Background")
|
|
|
|
-- Portrait
|
|
local portraitAnimIn = CreateAlphaAnimation(buttonAnimIn, 0, 1, 0.4, nil, 1)
|
|
portraitAnimIn:SetTarget(button)
|
|
portraitAnimIn:SetChildKey("Portrait")
|
|
|
|
-- RaidIcon
|
|
local raidIconAnimIn = CreateAlphaAnimation(buttonAnimIn, 0, 1, 0.4, nil, 1)
|
|
raidIconAnimIn:SetTarget(button)
|
|
raidIconAnimIn:SetChildKey("RaidIcon")
|
|
|
|
-- Model
|
|
local modelAnimIn = CreateAlphaAnimation(buttonAnimIn, 0, 1, 0.4, nil, 1)
|
|
modelAnimIn:SetTarget(button)
|
|
modelAnimIn:SetChildKey("PortraitModel")
|
|
|
|
-- Dismiss button
|
|
local dismissButtonAnimIn = CreateAlphaAnimation(buttonAnimIn, 0, 1, 0.4, nil, 1)
|
|
dismissButtonAnimIn:SetTarget(button)
|
|
dismissButtonAnimIn:SetChildKey("DismissButton")
|
|
|
|
-- Dismissed
|
|
local dismissAnimationGroup = button:CreateAnimationGroup()
|
|
dismissAnimationGroup:SetScript("OnFinished", AnimationGroup_DismissParent)
|
|
dismissAnimationGroup.name = "dismissAnimationGroup"
|
|
|
|
private.CreateAlphaAnimation(dismissAnimationGroup, 1, 0, 0.5, 0.5)
|
|
|
|
button.dismissAnimationGroup = dismissAnimationGroup
|
|
|
|
-- Duration
|
|
local durationFadeAnimationGroup = button:CreateAnimationGroup()
|
|
durationFadeAnimationGroup:SetScript("OnFinished", AnimationGroup_DismissParent)
|
|
durationFadeAnimationGroup.name = "durationFadeAnimationGroup"
|
|
|
|
button.durationFadeAnimationGroup = durationFadeAnimationGroup
|
|
|
|
local durationFadeAnim = private.CreateAlphaAnimation(durationFadeAnimationGroup, 1, 0, 1.5, private.db.profile.targetButtonGroup.durationSeconds)
|
|
durationFadeAnimationGroup.animOut = durationFadeAnim
|
|
|
|
-- ----------------------------------------------------------------------------
|
|
-- Etcetera.
|
|
-- ----------------------------------------------------------------------------
|
|
ClassificationDecorators[unitClassification](button)
|
|
button.__classification = unitClassification
|
|
|
|
return button
|
|
end
|
|
|
|
private.CreateTargetButton = CreateTargetButton
|
|
|