local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB local NP = E:GetModule('NamePlates') local CH = E:GetModule('Chat') local LSM = E.Libs.LSM local _G = _G local abs = abs local unpack = unpack local strjoin = strjoin local strmatch = strmatch local CreateFrame = CreateFrame local UnitCanAttack = UnitCanAttack local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo local INTERRUPTED = INTERRUPTED function NP:Castbar_CheckInterrupt(unit) if unit == 'vehicle' then unit = 'player' end if self.notInterruptible and UnitCanAttack('player', unit) then self:SetStatusBarColor(NP.db.colors.castNoInterruptColor.r, NP.db.colors.castNoInterruptColor.g, NP.db.colors.castNoInterruptColor.b) if self.Icon and NP.db.colors.castbarDesaturate then self.Icon:SetDesaturated(true) end else self:SetStatusBarColor(NP.db.colors.castColor.r, NP.db.colors.castColor.g, NP.db.colors.castColor.b) if self.Icon then self.Icon:SetDesaturated(false) end end end function NP:Castbar_CustomDelayText(duration) if self.channeling then if self.channelTimeFormat == 'CURRENT' then self.Time:SetFormattedText('%.1f |cffaf5050%.1f|r', abs(duration - self.max), self.delay) elseif self.channelTimeFormat == 'CURRENTMAX' then self.Time:SetFormattedText('%.1f / %.1f |cffaf5050%.1f|r', duration, self.max, self.delay) elseif self.channelTimeFormat == 'REMAINING' then self.Time:SetFormattedText('%.1f |cffaf5050%.1f|r', duration, self.delay) elseif self.channelTimeFormat == 'REMAININGMAX' then self.Time:SetFormattedText('%.1f / %.1f |cffaf5050%.1f|r', abs(duration - self.max), self.max, self.delay) end else if self.castTimeFormat == 'CURRENT' then self.Time:SetFormattedText('%.1f |cffaf5050%s %.1f|r', duration, '+', self.delay) elseif self.castTimeFormat == 'CURRENTMAX' then self.Time:SetFormattedText('%.1f / %.1f |cffaf5050%s %.1f|r', duration, self.max, '+', self.delay) elseif self.castTimeFormat == 'REMAINING' then self.Time:SetFormattedText('%.1f |cffaf5050%s %.1f|r', abs(duration - self.max), '+', self.delay) elseif self.castTimeFormat == 'REMAININGMAX' then self.Time:SetFormattedText('%.1f / %.1f |cffaf5050%s %.1f|r', abs(duration - self.max), self.max, '+', self.delay) end end end function NP:Castbar_CustomTimeText(duration) if self.channeling then if self.channelTimeFormat == 'CURRENT' then self.Time:SetFormattedText('%.1f', abs(duration - self.max)) elseif self.channelTimeFormat == 'CURRENTMAX' then self.Time:SetFormattedText('%.1f / %.1f', abs(duration - self.max), self.max) elseif self.channelTimeFormat == 'REMAINING' then self.Time:SetFormattedText('%.1f', duration) elseif self.channelTimeFormat == 'REMAININGMAX' then self.Time:SetFormattedText('%.1f / %.1f', duration, self.max) end else if self.castTimeFormat == 'CURRENT' then self.Time:SetFormattedText('%.1f', duration) elseif self.castTimeFormat == 'CURRENTMAX' then self.Time:SetFormattedText('%.1f / %.1f', duration, self.max) elseif self.castTimeFormat == 'REMAINING' then self.Time:SetFormattedText('%.1f', abs(duration - self.max)) elseif self.castTimeFormat == 'REMAININGMAX' then self.Time:SetFormattedText('%.1f / %.1f', abs(duration - self.max), self.max) end end end function NP:Castbar_PostCastStart(unit) self:CheckInterrupt(unit) NP:StyleFilterUpdate(self.__owner, 'FAKE_Casting') end function NP:Castbar_PostCastFail() self:SetStatusBarColor(NP.db.colors.castInterruptedColor.r, NP.db.colors.castInterruptedColor.g, NP.db.colors.castInterruptedColor.b) NP:StyleFilterUpdate(self.__owner, 'FAKE_Casting') end function NP:Castbar_PostCastInterruptible(unit) self:CheckInterrupt(unit) end function NP:Castbar_PostCastStop() NP:StyleFilterUpdate(self.__owner, 'FAKE_Casting') end function NP:Construct_Castbar(nameplate) local Castbar = CreateFrame('StatusBar', nameplate:GetName()..'Castbar', nameplate) Castbar:SetFrameStrata(nameplate:GetFrameStrata()) Castbar:SetFrameLevel(5) Castbar:CreateBackdrop('Transparent', nil, nil, nil, nil, true) Castbar:SetStatusBarTexture(LSM:Fetch('statusbar', NP.db.statusbar)) NP.StatusBars[Castbar] = true Castbar.Button = CreateFrame('Frame', nil, Castbar, 'BackdropTemplate') Castbar.Button:SetTemplate() Castbar.Icon = Castbar.Button:CreateTexture(nil, 'ARTWORK') Castbar.Icon:SetTexCoord(unpack(E.TexCoords)) Castbar.Icon:SetInside() Castbar.Time = Castbar:CreateFontString(nil, 'OVERLAY') Castbar.Time:Point('RIGHT', Castbar, 'RIGHT', -4, 0) Castbar.Time:SetJustifyH('RIGHT') Castbar.Time:FontTemplate(LSM:Fetch('font', NP.db.font), NP.db.fontSize, NP.db.fontOutline) Castbar.Text = Castbar:CreateFontString(nil, 'OVERLAY') Castbar.Text:SetJustifyH('LEFT') Castbar.Text:FontTemplate(LSM:Fetch('font', NP.db.font), NP.db.fontSize, NP.db.fontOutline) Castbar.Text:SetWordWrap(false) Castbar.CheckInterrupt = NP.Castbar_CheckInterrupt Castbar.CustomDelayText = NP.Castbar_CustomDelayText Castbar.CustomTimeText = NP.Castbar_CustomTimeText Castbar.PostCastStart = NP.Castbar_PostCastStart Castbar.PostCastFail = NP.Castbar_PostCastFail Castbar.PostCastInterruptible = NP.Castbar_PostCastInterruptible Castbar.PostCastStop = NP.Castbar_PostCastStop if nameplate == _G.ElvNP_Test then Castbar.Hide = Castbar.Show Castbar:Show() Castbar.Text:SetText('Casting') Castbar.Time:SetText('3.1') Castbar.Icon:SetTexture([[Interface\Icons\Achievement_Character_Pandaren_Female]]) Castbar:SetStatusBarColor(NP.db.colors.castColor.r, NP.db.colors.castColor.g, NP.db.colors.castColor.b) end return Castbar end function NP:COMBAT_LOG_EVENT_UNFILTERED() local _, event, _, sourceGUID, sourceName, _, _, targetGUID = CombatLogGetCurrentEventInfo() if (event == 'SPELL_INTERRUPT' or event == 'SPELL_PERIODIC_INTERRUPT') and targetGUID and (sourceName and sourceName ~= '') then local plate, classColor = NP.PlateGUID[targetGUID] if plate and plate.Castbar then local db = plate.frameType and self.db and self.db.units and self.db.units[plate.frameType] if db and db.castbar and db.castbar.enable and db.castbar.sourceInterrupt then if db.castbar.timeToHold > 0 then local name = strmatch(sourceName, '([^%-]+).*') if db.castbar.sourceInterruptClassColor then local data = CH:GetPlayerInfoByGUID(sourceGUID) if data and data.classColor then classColor = data.classColor.colorStr end plate.Castbar.Text:SetFormattedText('%s > %s', INTERRUPTED, classColor and strjoin('', '|c', classColor, name) or name) else plate.Castbar.Text:SetFormattedText('%s > %s', INTERRUPTED, name) end end end end end end function NP:Update_Castbar(nameplate) local db = NP:PlateDB(nameplate) if nameplate == _G.ElvNP_Test then nameplate.Castbar:SetAlpha((not db.nameOnly and db.castbar.enable) and 1 or 0) end if db.castbar.enable then if not nameplate:IsElementEnabled('Castbar') then nameplate:EnableElement('Castbar') end nameplate.Castbar.timeToHold = db.castbar.timeToHold nameplate.Castbar.castTimeFormat = db.castbar.castTimeFormat nameplate.Castbar.channelTimeFormat = db.castbar.channelTimeFormat nameplate.Castbar:Size(db.castbar.width, db.castbar.height) nameplate.Castbar:Point('CENTER', nameplate, 'CENTER', db.castbar.xOffset, db.castbar.yOffset) if db.castbar.showIcon then nameplate.Castbar.Button:ClearAllPoints() nameplate.Castbar.Button:Point(db.castbar.iconPosition == 'RIGHT' and 'BOTTOMLEFT' or 'BOTTOMRIGHT', nameplate.Castbar, db.castbar.iconPosition == 'RIGHT' and 'BOTTOMRIGHT' or 'BOTTOMLEFT', db.castbar.iconOffsetX, db.castbar.iconOffsetY) nameplate.Castbar.Button:Size(db.castbar.iconSize, db.castbar.iconSize) nameplate.Castbar.Button:Show() else nameplate.Castbar.Button:Hide() end nameplate.Castbar.Time:ClearAllPoints() nameplate.Castbar.Text:ClearAllPoints() if db.castbar.textPosition == 'BELOW' then nameplate.Castbar.Time:Point('TOPRIGHT', nameplate.Castbar, 'BOTTOMRIGHT') nameplate.Castbar.Text:Point('TOPLEFT', nameplate.Castbar, 'BOTTOMLEFT') elseif db.castbar.textPosition == 'ABOVE' then nameplate.Castbar.Time:Point('BOTTOMRIGHT', nameplate.Castbar, 'TOPRIGHT') nameplate.Castbar.Text:Point('BOTTOMLEFT', nameplate.Castbar, 'TOPLEFT') else nameplate.Castbar.Time:Point('RIGHT', nameplate.Castbar, 'RIGHT', -1, 0) nameplate.Castbar.Text:Point('LEFT', nameplate.Castbar, 'LEFT', 1, 0) end nameplate.Castbar.Text:Point('RIGHT', nameplate.Castbar, 'RIGHT', -20, 0) if db.castbar.hideTime then nameplate.Castbar.Time:Hide() else nameplate.Castbar.Time:FontTemplate(LSM:Fetch('font', db.castbar.font), db.castbar.fontSize, db.castbar.fontOutline) nameplate.Castbar.Time:Show() end if db.castbar.hideSpellName then nameplate.Castbar.Text:Hide() else nameplate.Castbar.Text:FontTemplate(LSM:Fetch('font', db.castbar.font), db.castbar.fontSize, db.castbar.fontOutline) nameplate.Castbar.Text:Show() end elseif nameplate:IsElementEnabled('Castbar') then nameplate:DisableElement('Castbar') end end