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.

775 lines
26 KiB

local SLE, T, E, L, V, P, G = unpack(select(2, ...))
local AFK = E.AFK
local S = SLE.Screensaver
--GLOBALS: unpack, select, format, random, date, tinsert, type, tonumber, hooksecurefunc, UnitPVPName, UnitLevel, UnitClass, UnitRace, RANK, LEVEL, CreateFrame, CreateAnimationGroup, C_Timer, SendChatMessage, RAID_CLASS_COLORS, GetScreenWidth, GetScreenHeight, IsInGuild, GetGuildInfo, FlipCameraYaw
local testTimer --was AnimTime before
local format, random, date, tinsert, tonumber = format, random, date, tinsert, tonumber
local UnitPVPName, UnitLevel, UnitClass = UnitPVPName, UnitLevel, UnitClass
local RANK, LEVEL = RANK, LEVEL
local C_Timer, CreateAnimationGroup = C_Timer, CreateAnimationGroup
local TipNum, OldTip, degree = 1, 0, 0
local timerLastUpdate = 0
local tipsLastUpdate = 0
local total_seconds = 0
local degreeMultyplier = 10
S.Animations = {}
S.Fading = {}
local function currentDateTime()
local month = SLE.Russian and SLE.RuMonths[tonumber(date('%m'))] or date('%B')
local week = SLE.Russian and SLE.RuWeek[tonumber(date('%w'))+1] or date('%A')
AFK.AFKMode.SL_Date:SetText(date('%d')..' '..month..', |cff00AAFF'..week..'|r')
local time
if S.db.defaultTexts.SL_Time.hour24 then
time = format('%s', date('%H|cff00AAFF:|r%M|cff00AAFF:|r%S'))
else
time = format('%s', date('%I|cff00AAFF:|r%M|cff00AAFF:|r%S %p'))
end
AFK.AFKMode.SL_Time:SetText(time)
end
S.CustomGraphicsDefaults = {
enable = true,
path = '',
width = 150,
height = 150,
inversePoint = false,
anchorPoint = 'CENTER',
attachTo = 'SL_TopPanel',
xOffset = 0,
yOffset = 0,
alpha = 1,
drawLayer = 'ARTWORK',
drawLevel = 1,
}
local newDBEntry = false
local function UpdateCustomGraphicsDefaults()
local db = E.db.sle.afk.customGraphics
for name in pairs(db) do
if name then
-- Added Alpha Option
if db[name].alpha == nil then
db[name].alpha = S.CustomGraphicsDefaults.alpha
newDBEntry = true
end
-- Added Draw Layer
if db[name].drawLayer == nil then
db[name].drawLayer = S.CustomGraphicsDefaults.drawLayer
newDBEntry = true
end
-- Added Draw Level
if db[name].drawLevel == nil then
db[name].drawLevel = S.CustomGraphicsDefaults.drawLevel
newDBEntry = true
end
end
end
if newDBEntry then
SLE:Print('S&L AFK: Your custom graphics database entries have been updated with new defaults.', 'info')
newDBEntry = false
end
end
S.afkMusic = {
CLASS = {
['WARRIOR'] = 1417334,
['PALADIN'] = 1417342, --443289
['HUNTER'] = 1417326,
['ROGUE'] = 1417273,
['PRIEST'] = 1417367,
['DEATHKNIGHT'] = 229831,
['SHAMAN'] = 528163,
['MAGE'] = 1417264,
['WARLOCK'] = 1417356,
['MONK'] = 642138,
['DRUID'] = 1417312,
['DEMONHUNTER'] = 1417290,
},
RACIAL = {
['Human'] = 53210,
['Gnome'] = 369055,
['NightElf'] = 441709,
['KulTiran'] = 1781897,
['Dwarf'] = 298910,
['Draenei'] = 53284,
['Worgen'] = 441525,
['VoidElf'] = 1864282,
['LightforgedDraenei'] = 1864285,
['DarkIronDwarf'] = 441566,
['Mechagnome'] = 3028751,
['Orc'] = 441713,
['Scourge'] = 53217,
['Tauren'] = 441788,
['Troll'] = 371378,
['Goblin'] = 441627,
['BloodElf'] = 53473,
['Pandaren'] = 642246,
['Nightborne'] = 1477339,
['HighmountainTauren'] = 1417319,
['ZandalariTroll'] = 2844635,
['Vulpera'] = 3260632,
['MagharOrc'] = 2146630,
},
}
local originalMusicSetting
function S:RunAFKMusic()
if S.db.musicSelection == 'NONE' then return end
local selectionData = S.db.musicSelection == 'CLASS' and E.myclass or E.myrace
if not S.afkMusic[S.db.musicSelection][selectionData] then return end
if AFK.isSLAFK then
originalMusicSetting = GetCVar('Sound_EnableMusic')
if originalMusicSetting == '0' then SetCVar('Sound_EnableMusic', 1) end
PlayMusic(S.afkMusic[S.db.musicSelection][selectionData])
else
StopMusic()
SetCVar('Sound_EnableMusic', originalMusicSetting)
end
end
--Template functons for animation types
function S:SlideIn(frame)
if not frame.anim then frame.anim = CreateAnimationGroup(frame) end
if not frame.anim.SlideIn then
frame.anim.SlideIn = frame.anim:CreateAnimation('Move')
frame.anim.SlideIn:SetRounded(false)
tinsert(S.Animations, frame.anim.SlideIn)
end
end
function S:SlideSide(frame)
if not frame.anim then frame.anim = CreateAnimationGroup(frame) end
if not frame.anim.SlideSide then
frame.anim.SlideSide = frame.anim:CreateAnimation('Move')
frame.anim.SlideSide:SetRounded(false)
tinsert(S.Animations, frame.anim.SlideSide)
end
end
function S:FadeIn(frame)
if not frame.anim then frame.anim = CreateAnimationGroup(frame) end
if not frame.anim.FadeIn then
frame.anim.FadeIn = frame.anim:CreateAnimation('Fade')
frame.anim.FadeIn:SetChange(1)
tinsert(S.Animations, frame.anim.FadeIn)
if frame ~= AFK.AFKMode.SL_TopPanel or frame ~= AFK.AFKMode.SL_BottomPanel then
tinsert(S.Fading, frame.anim.FadeIn)
end
end
end
--* Creat & Update Animations
function S:SetupAnimations()
if not AFK.AFKMode.SL_TopPanel.anim then
S:SlideIn(AFK.AFKMode.SL_TopPanel)
S:SlideSide(AFK.AFKMode.SL_TopPanel)
S:FadeIn(AFK.AFKMode.SL_TopPanel)
S:SlideIn(AFK.AFKMode.SL_BottomPanel)
S:SlideSide(AFK.AFKMode.SL_BottomPanel)
S:FadeIn(AFK.AFKMode.SL_BottomPanel)
if S.db.playermodel.enable then S:FadeIn(AFK.AFKMode.bottom.model) end
for name in pairs(S.db.defaultGraphics) do
if name == 'exPack' then
S:FadeIn(AFK.AFKMode[name].texture)
else
S:FadeIn(AFK.AFKMode[name])
end
end
for name in pairs(S.db.customGraphics) do
if name then
S:FadeIn(AFK.AFKMode['SL_CustomGraphics_'..name])
end
end
for name in pairs(S.db.defaultTexts) do
if name then
S:FadeIn(AFK.AFKMode[name])
end
end
S:FadeIn(AFK.AFKMode.chat)
end
--* Slide In Animation
AFK.AFKMode.SL_TopPanel.anim.SlideIn:SetEasing(S.db.animBounce and 'Bounce' or 'None')
AFK.AFKMode.SL_BottomPanel.anim.SlideIn:SetEasing(S.db.animBounce and 'Bounce' or 'None')
--* Slide Side Animation
AFK.AFKMode.SL_TopPanel.anim.SlideSide:SetEasing(S.db.animBounce and 'Bounce' or 'None')
AFK.AFKMode.SL_BottomPanel.anim.SlideSide:SetEasing(S.db.animBounce and 'Bounce' or 'None')
S:SetupType()
end
function S:Show()
if not S.db.enable then return end
if AFK.AFKMode.SL_TestModel:IsShown() then S:TestHide() end
-- TipNum = random(1, #L["SLE_TIPS"])
-- --Resizing chat
-- AFK.AFKMode.chat:SetHeight(AFK.AFKMode.SL_TopPanel:GetHeight())
AFK.AFKMode.chat:SetShown(S.db.chat.show)
--Positioning model
if S.db.playermodel.enable then
AFK.AFKMode.bottom.model:SetAnimation(S.db.playermodel.anim)
AFK.AFKMode.bottom.model:SetScript('OnAnimFinished', S.AnimFinished)
else
AFK.AFKMode.bottom.model:SetScript('OnAnimFinished', nil)
end
AFK.AFKMode.bottom.model:SetShown(S.db.playermodel.enable)
AFK.AFKMode.bottom.model:SetCamDistanceScale(S.db.playermodel.distance)
if AFK.AFKMode.bottom.model:GetFacing() ~= (S.db.playermodel.rotation / 60) then
AFK.AFKMode.bottom.model:SetFacing(S.db.playermodel.rotation / 60)
end
--* Animations
local screenWidth = ceil(GetScreenWidth())
local topSpace = S.db.panels.top.width > 0 and (screenWidth-S.db.panels.top.width)/2 or 0
local bottomSpace = S.db.panels.bottom.width > 0 and (screenWidth-S.db.panels.bottom.width)/2 or 0
if S.db.animTime > 0 then
if S.db.animType == 'SlideIn' then
AFK.AFKMode.SL_TopPanel.anim.SlideIn:SetOffset(0, -S.db.panels.top.height)
AFK.AFKMode.SL_BottomPanel.anim.SlideIn:SetOffset(0, S.db.panels.bottom.height)
elseif S.db.animType == 'SlideSide' then
AFK.AFKMode.SL_TopPanel.anim.SlideSide:SetOffset(screenWidth-topSpace, 0)
AFK.AFKMode.SL_BottomPanel.anim.SlideSide:SetOffset(-(screenWidth-bottomSpace), 0)
end
AFK.AFKMode.SL_TopPanel.anim[S.db.animType]:SetDuration(S.db.animTime)
AFK.AFKMode.SL_BottomPanel.anim[S.db.animType]:SetDuration(S.db.animTime)
for i = 1, #(S.Fading) do
S.Fading[i]:SetDuration(S.db.animTime)
end
AFK.AFKMode.SL_TopPanel.anim[S.db.animType]:Play()
AFK.AFKMode.SL_BottomPanel.anim[S.db.animType]:Play()
for i = 1, #(S.Fading) do
S.Fading[i]:Play()
end
end
end
function S:Hide()
if not S.db.enable or not E.db.general.afk then return end
for i = 1, #(S.Animations) do --To avoid weird shit like S:SetupType was ignored when animations were interrupted in the go
S.Animations[i]:Stop()
end
local alpha = (S.db.animTime > 0 and 0) or 1
-- Default Logos
for name in pairs(S.db.defaultGraphics) do
if name == 'exPack' then
AFK.AFKMode[name].texture:SetAlpha(alpha)
else
AFK.AFKMode[name]:SetAlpha(alpha)
end
end
-- AFK.AFKMode.bottom.model:SetAlpha(S.db.enable and alpha or 1)
AFK.AFKMode.bottom.model:SetAlpha(alpha)
-- Default Texts
for name in pairs(S.db.defaultTexts) do
if name then
AFK.AFKMode[name]:SetAlpha(alpha)
end
end
-- Custom Graphics
for name in pairs(S.db.customGraphics) do
if name then
AFK.AFKMode['SL_CustomGraphics_'..name]:SetAlpha((S.db.animTime > 0 and 0) or S.db.customGraphics[name].alpha)
end
end
S:SetupType()
end
function S:SetupType()
local enable = E.db.general.afk and S.db.enable
if not enable then return end
local screenWidth = ceil(GetScreenWidth())
local topSpace = S.db.panels.top.width > 0 and (screenWidth-S.db.panels.top.width)/2 or 0
local bottomSpace = S.db.panels.bottom.width > 0 and (screenWidth-S.db.panels.bottom.width)/2 or 0
AFK.AFKMode.SL_TopPanel:ClearAllPoints()
AFK.AFKMode.SL_BottomPanel:ClearAllPoints()
if S.db.animTime > 0 then
if S.db.animType == 'SlideIn' then
AFK.AFKMode.SL_TopPanel:Point('BOTTOM', AFK.AFKMode, 'TOP', 0, E.Border)
AFK.AFKMode.SL_BottomPanel:Point('TOP', AFK.AFKMode, 'BOTTOM', 0, -E.Border)
AFK.AFKMode.SL_TopPanel:SetAlpha(1)
AFK.AFKMode.SL_BottomPanel:SetAlpha(1)
elseif S.db.animType == 'SlideSide' then
AFK.AFKMode.SL_TopPanel:Point('TOP', AFK.AFKMode, 'TOP', -(screenWidth-topSpace), E.Border)
AFK.AFKMode.SL_BottomPanel:Point('BOTTOM', AFK.AFKMode, 'BOTTOM', screenWidth-bottomSpace, -E.Border)
AFK.AFKMode.SL_TopPanel:SetAlpha(1)
AFK.AFKMode.SL_BottomPanel:SetAlpha(1)
else
AFK.AFKMode.SL_TopPanel:Point('TOP', AFK.AFKMode, 'TOP', 0, E.Border)
AFK.AFKMode.SL_BottomPanel:Point('BOTTOM', AFK.AFKMode, 'BOTTOM', 0, -E.Border)
AFK.AFKMode.SL_TopPanel:SetAlpha(0)
AFK.AFKMode.SL_BottomPanel:SetAlpha(0)
end
else
AFK.AFKMode.SL_TopPanel:Point('TOP', AFK.AFKMode, 'TOP', 0, E.Border)
AFK.AFKMode.SL_BottomPanel:Point('BOTTOM', AFK.AFKMode, 'BOTTOM', 0, -E.Border)
AFK.AFKMode.SL_TopPanel:SetAlpha(1)
AFK.AFKMode.SL_BottomPanel:SetAlpha(1)
end
end
--Testing model positioning
function S:TestShow()
if testTimer then testTimer:Cancel() end
AFK.AFKMode.SL_TestModel:Show()
AFK.AFKMode.SL_TestModel:SetUnit('player')
AFK.AFKMode.SL_TestModel:SetCamDistanceScale(S.db.playermodel.distance)
if AFK.AFKMode.SL_TestModel:GetFacing() ~= (S.db.playermodel.rotation / 60) then
AFK.AFKMode.SL_TestModel:SetFacing(S.db.playermodel.rotation / 60)
end
AFK.AFKMode.SL_TestModel:SetAnimation(S.db.playermodel.anim)
AFK.AFKMode.SL_TestModel:SetScript('OnAnimFinished', S.AnimTestFinished)
AFK.AFKMode.SL_BottomPanel:ClearAllPoints()
AFK.AFKMode.SL_BottomPanel:Point('BOTTOM', AFK.AFKMode, 'BOTTOM', 0, -E.Border)
testTimer = C_Timer.NewTimer(10, S.TestHide)
end
function S:TestHide()
S:SetupType()
AFK.AFKMode.SL_TestModel:Hide()
end
function S:AnimFinished()
AFK.AFKMode.bottom.model:SetAnimation(S.db.playermodel.anim)
end
function S:AnimTestFinished()
AFK.AFKMode.SL_TestModel:SetAnimation(S.db.playermodel.anim)
end
function S:KeyScript()--Dealing with on key down script
-- if not S.db.enable or not E.db.general.afk then return end
-- if S.db.enable and not S.db.keydown then
-- AFK.AFKMode:SetScript('OnKeyDown', nil)
-- elseif S.db.keydown then
-- AFK.AFKMode:SetScript('OnKeyDown', S.OnKeyDown)
-- end
if S.db.enable then
if S.db.keydown then
AFK.AFKMode:SetScript('OnKeyDown', S.OnKeyDown)
elseif not S.db.keydown then
AFK.AFKMode:SetScript('OnKeyDown', nil)
end
else
AFK.AFKMode:SetScript('OnKeyDown', S.OnKeyDown)
end
-- if S.db.keydown then
-- --Default script for key detection. Ignores modifires and screenshot button
-- AFK.AFKMode:SetScript('OnKeyDown', S.OnKeyDown)
-- else
-- -- SLE:Print('KeyScript Fired')
-- AFK.AFKMode:SetScript('OnKeyDown', nil)
-- end
end
function S:AbortAFK()
if UnitIsAFK('player') then SendChatMessage('' ,'AFK' ) end
end
function S:SetAFK(status)
if not S.db.enable or not E.db.general.afk then return end
if status then
MoveViewLeftStop() -- Stop ElvUI's Camera
S.SL_startTime = GetTime()
S:UpdateTextStrings()
-- Own model animation
-- AFK.AFKMode.bottom.model:SetUnit('player')
AFK.AFKMode.bottom.model:SetAnimation(S.db.playermodel.anim)
AFK.isSLAFK = true
S:RunAFKMusic()
elseif AFK.isSLAFK then
FlipCameraYaw(-degree)
degree = 0
total_seconds = 0
if S.db.defaultTexts.SL_AFKTimePassed.countdown then
AFK.AFKMode.SL_AFKTimePassed:SetText('30:00')
else
AFK.AFKMode.SL_AFKTimePassed:SetText('00:00')
end
AFK.isSLAFK = false
S:RunAFKMusic()
end
end
hooksecurefunc(AFK, 'SetAFK', S.SetAFK)
function S:CreateUpdatePanels()
local enable = E.db.general.afk and S.db.enable
--* Top Panel
do
if not AFK.AFKMode.SL_TopPanel then
AFK.AFKMode.SL_TopPanel = CreateFrame('Frame', nil, AFK.AFKMode, 'BackdropTemplate')
end
local width = S.db.panels.top.width == 0 and GetScreenWidth() or S.db.panels.top.width
AFK.AFKMode.SL_TopPanel:SetFrameLevel(0)
AFK.AFKMode.SL_TopPanel:SetTemplate(S.db.panels.top.template, true)
AFK.AFKMode.SL_TopPanel:Point('TOP', AFK.AFKMode, 'TOP', 0, E.Border)
AFK.AFKMode.SL_TopPanel:Width(width)
AFK.AFKMode.SL_TopPanel:Height(S.db.panels.top.height)
AFK.AFKMode.SL_TopPanel:SetTemplate(S.db.panels.top.template, true)
AFK.AFKMode.SL_TopPanel:SetShown(enable)
end
--* Bottom Panel
do
if not AFK.AFKMode.SL_BottomPanel then
AFK.AFKMode.SL_BottomPanel = CreateFrame('Frame', nil, AFK.AFKMode, 'BackdropTemplate')
end
local width = S.db.panels.bottom.width == 0 and GetScreenWidth() or S.db.panels.bottom.width
AFK.AFKMode.SL_BottomPanel:SetFrameLevel(0)
AFK.AFKMode.SL_BottomPanel:SetTemplate(S.db.panels.bottom.template, true)
AFK.AFKMode.SL_BottomPanel:Point('BOTTOM', AFK.AFKMode, 'BOTTOM', 0, -E.Border)
AFK.AFKMode.SL_BottomPanel:Width(width)
AFK.AFKMode.SL_BottomPanel:Height(S.db.panels.bottom.height)
AFK.AFKMode.SL_BottomPanel:SetTemplate(S.db.panels.bottom.template, true)
AFK.AFKMode.SL_BottomPanel:SetShown(enable)
end
if not AFK.AFKMode.SL_ScrollFrame then
AFK.AFKMode.SL_ScrollFrame = CreateFrame('ScrollingMessageFrame', nil, AFK.AFKMode)
end
AFK.AFKMode.SL_ScrollFrame:SetHeight(S.db.defaultTexts.SL_ScrollFrame.size+6)
-- AFK.AFKMode.SL_ScrollFrame.bg:SetHeight(S.db.defaultTexts.SL_ScrollFrame.size+20)
AFK.AFKMode.SL_ScrollFrame:SetFading(false)
AFK.AFKMode.SL_ScrollFrame:SetFadeDuration(0)
AFK.AFKMode.SL_ScrollFrame:SetTimeVisible(1)
AFK.AFKMode.SL_ScrollFrame:SetMaxLines(1)
AFK.AFKMode.SL_ScrollFrame:SetSpacing(2)
AFK.AFKMode.SL_ScrollFrame:SetWidth(AFK.AFKMode.SL_BottomPanel:GetWidth()/2)
--Update Chat
AFK.AFKMode.chat:SetHeight(AFK.AFKMode.SL_TopPanel:GetHeight())
AFK.AFKMode.chat:ClearAllPoints()
AFK.AFKMode.chat:Point(S.db.chat.inversePoint and E.InversePoints[S.db.chat.anchorPoint] or S.db.chat.anchorPoint, AFK.AFKMode[S.db.chat.attachTo], S.db.chat.anchorPoint, S.db.chat.xOffset, S.db.chat.yOffset)
end
function S:CreateTextStrings()
for element in next, E.db.sle.afk.defaultTexts do
if element and element ~= 'SL_ScrollFrame' and not AFK.AFKMode[element] then
AFK.AFKMode[element] = AFK.AFKMode:CreateFontString(nil, 'OVERLAY')
end
end
end
function S:UpdateTextOptions()
local db = S.db.defaultTexts
-- for element in next, E.db.sle.afk.defaultTexts do
-- if element and element ~= 'SL_ScrollFrame' and not AFK.AFKMode[element] then
-- AFK.AFKMode[element] = AFK.AFKMode:CreateFontString(nil, 'OVERLAY')
-- end
-- end
for element in next, db do
if element then
local enable = (E.db.general.afk and S.db.enable and db[element].enable)
AFK.AFKMode[element]:ClearAllPoints()
AFK.AFKMode[element]:Point(db[element].inversePoint and E.InversePoints[db[element].anchorPoint] or db[element].anchorPoint, AFK.AFKMode[db[element].attachTo], db[element].anchorPoint, db[element].xOffset, db[element].yOffset)
AFK.AFKMode[element]:SetFont(E.LSM:Fetch('font', db[element].font), db[element].size, db[element].outline)
AFK.AFKMode[element]:SetShown(enable)
if element == 'SL_ScrollFrame' then
AFK.AFKMode.SL_ScrollFrame:LevelUpBG()
end
end
end
S:UpdateTextStrings()
end
function S:UpdateTextStrings()
local level, name, classColor = UnitLevel('player'), UnitPVPName('player'), E:ClassColor(E.myclass)
local GuildName, GuildRank = GetGuildInfo('player')
currentDateTime()
AFK.AFKMode.SL_AFKMessage:SetText('|cff00AAFF'..L["You Are Away From Keyboard for"]..'|r')
AFK.AFKMode.SL_AFKTimePassed:SetTextColor(1, 1, 1)
AFK.AFKMode.SL_SubText:SetText(L["Take care of yourself, Master!"])
AFK.AFKMode.SL_PlayerName:SetTextColor(classColor.r, classColor.g, classColor.b)
AFK.AFKMode.SL_PlayerName:SetText(format('%s', name))
AFK.AFKMode.SL_PlayerClass:SetTextColor(classColor.r, classColor.g, classColor.b)
AFK.AFKMode.SL_PlayerClass:SetText(E.myLocalizedClass)
AFK.AFKMode.SL_PlayerLevel:SetTextColor(1, 1, 1)
AFK.AFKMode.SL_PlayerLevel:SetText(format('%s %s', LEVEL, level))
AFK.AFKMode.SL_GuildName:SetTextColor(0.7, 0.7, 0.7)
AFK.AFKMode.SL_GuildName:SetText(format(GuildName and '|cff00AAFF<%s>|r' or '', GuildName)) --Setting good looking guild name line
AFK.AFKMode.SL_GuildRank:SetTextColor(1, 1, 1)
AFK.AFKMode.SL_GuildRank:SetText(GuildRank or '')
TipNum = random(1, #L["SLE_TIPS"])
AFK.AFKMode.SL_ScrollFrame:AddMessage(L["SLE_TIPS"][TipNum], 1, 1, 1)
end
function S:CreateSetupCustomGraphics()
UpdateCustomGraphicsDefaults()
for name in next, E.db.sle.afk.customGraphics do
if not AFK.AFKMode['SL_CustomGraphics_'..name] then
S:CreateCustomGraphic(name)
end
S:UpdateCustomGraphic(name)
end
end
function S:CreateCustomGraphic(name)
if not name then return end
if not AFK.AFKMode['SL_CustomGraphics_'..name] then
AFK.AFKMode['SL_CustomGraphics_'..name] = AFK.AFKMode:CreateTexture(nil, 'ARTWORK')
end
end
function S:UpdateCustomGraphics()
for name in next, E.db.sle.afk.customGraphics do
if AFK.AFKMode['SL_CustomGraphics_'..name] then
S:UpdateCustomGraphic(name)
end
end
end
function S:UpdateCustomGraphic(name)
if not name then return end
if not AFK.AFKMode['SL_CustomGraphics_'..name] then
S:CreateCustomGraphic(name)
end
local db = S.db.customGraphics
local element = 'SL_CustomGraphics_'..name
local enable = S.db.enable and S.db.customGraphics[name].enable
AFK.AFKMode[element]:SetSize(db[name].width, db[name].height)
AFK.AFKMode[element]:SetTexture(db[name].path)
AFK.AFKMode[element]:SetAlpha(db[name].alpha)
AFK.AFKMode[element]:SetDrawLayer(db[name].drawLayer, db[name].drawLevel)
AFK.AFKMode[element]:ClearAllPoints()
AFK.AFKMode[element]:Point(db[name].inversePoint and E.InversePoints[db[name].anchorPoint] or db[name].anchorPoint, AFK.AFKMode[db[name].attachTo], db[name].anchorPoint, db[name].xOffset, db[name].yOffset)
AFK.AFKMode[element]:SetShown(enable)
end
function S:DeleteCustomGraphic(name)
if E.db.sle.afk.customGraphics[name] then
E.db.sle.afk.customGraphics[name] = nil
AFK.AFKMode['SL_CustomGraphics_'..name]:SetTexture(nil)
AFK.AFKMode['SL_CustomGraphics_'..name]:Hide()
end
end
function S:SetupDefaultGraphics()
for name in next, E.db.sle.afk.defaultGraphics do
if name and not AFK.AFKMode[name] then
if name == 'exPack' then
AFK.AFKMode.exPack = CreateFrame('Button', nil, AFK.AFKMode.SL_TopPanel)
AFK.AFKMode.exPack:SetScript('OnClick', S.AbortAFK) --Allow to exit afk screen by clicking on the crest
AFK.AFKMode.exPack.texture = AFK.AFKMode:CreateTexture(nil, 'OVERLAY')
elseif name == 'slLogo' then
AFK.AFKMode.slLogo = AFK.AFKMode:CreateTexture(nil, 'OVERLAY')
else
AFK.AFKMode[name] = AFK.AFKMode:CreateTexture(nil, 'ARTWORK')
end
end
end
end
function S:UpdateDefaultGraphics()
local db = S.db.defaultGraphics
for element in next, E.db.sle.afk.defaultGraphics do
if element then
local enable = S.db.enable and db[element].enable
AFK.AFKMode[element]:ClearAllPoints()
AFK.AFKMode[element]:Point(db[element].inversePoint and E.InversePoints[db[element].anchorPoint] or db[element].anchorPoint, AFK.AFKMode[db[element].attachTo], db[element].anchorPoint, db[element].xOffset, db[element].yOffset)
AFK.AFKMode[element]:SetSize(db[element].width, db[element].height)
if element == 'exPack' then
AFK.AFKMode[element].texture:SetShown(enable)
else
AFK.AFKMode[element]:SetShown(enable)
end
end
end
AFK.AFKMode.classCrest:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\classes\\'..S.db.defaultGraphics.classCrest.styleOptions..'\\'..E.myclass)
-- AFK.AFKMode.exPack.texture:SetTexture(GetExpansionDisplayInfo(GetClientDisplayExpansionLevel()).logo) --* Automatic way to get current expansion logo
AFK.AFKMode.exPack.texture:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\expansion\\'..S.db.defaultGraphics.exPack.styleOptions..'\\shadowlandslogo')
AFK.AFKMode.exPack.texture:SetAllPoints(AFK.AFKMode.exPack)
AFK.AFKMode.factionCrest:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\factioncrest\\'..S.db.defaultGraphics.factionCrest.styleOptions..'\\'..E.myfaction)
AFK.AFKMode.factionLogo:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\factionlogo\\'..S.db.defaultGraphics.factionLogo.styleOptions..'\\'..E.myfaction)
AFK.AFKMode.raceCrest:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\race\\'..S.db.defaultGraphics.raceCrest.styleOptions..'\\'..E.myrace)
AFK.AFKMode.slLogo:SetTexture([[Interface\AddOns\ElvUI_SLE\media\textures\afk\addonlogos\sl\original\S&L]])
AFK.AFKMode.benikuiLogo:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\addonlogos\\benikui\\'..S.db.defaultGraphics.benikuiLogo.styleOptions..'\\BenikUI')
AFK.AFKMode.merauiLogo:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\addonlogos\\meraui\\'..S.db.defaultGraphics.merauiLogo.styleOptions..'\\MerathilisUI')
AFK.AFKMode.elvuiLogo:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\afk\\addonlogos\\elvui\\'..S.db.defaultGraphics.elvuiLogo.styleOptions..'\\ElvUI')
end
function S:CreateUpdateModelElements(skip)
AFK.AFKMode.bottom.modelHolder:ClearAllPoints()
if S.db.enable then
AFK.AFKMode.bottom.model:SetScript('OnUpdate', nil)
AFK.AFKMode.bottom.model:SetParent(AFK.AFKMode)
AFK.AFKMode.bottom.modelHolder:Point('BOTTOMRIGHT', AFK.AFKMode.SL_BottomPanel, 'BOTTOMRIGHT', -200+S.db.playermodel.holderXoffset, (220 + S.db.playermodel.holderYoffset))
else
AFK.AFKMode.bottom.model:SetScript('OnUpdate', S.OrigModelOnUpdate)
AFK.AFKMode.bottom.model:SetParent(AFK.AFKMode.bottom.modelHolder)
AFK.AFKMode.bottom.model:SetAlpha(1)
AFK.AFKMode.bottom.modelHolder:Point('BOTTOMRIGHT', AFK.AFKMode.bottom, 'BOTTOMRIGHT', -200, 220)
end
if skip then return end
--S&L Test Model
if not AFK.AFKMode.SL_TestModel then
AFK.AFKMode.SL_TestModel = CreateFrame('PlayerModel', 'SLE_ScreenTestModel', E.UIParent)
end
-- AFK.AFKMode.SL_TestModel:SetSize(GetScreenWidth() * 2, GetScreenHeight() * 2)
AFK.AFKMode.SL_TestModel:Size(GetScreenWidth() * 2, GetScreenHeight() * 2)
AFK.AFKMode.SL_TestModel:Point('CENTER', AFK.AFKMode.bottom.model)
AFK.AFKMode.SL_TestModel:Hide()
end
function S:Toggle()
if S.db.enable then
AFK.AFKMode.bottom:Hide() --* Hide ElvUI's Bottom Panel
AFK.AFKMode.bottom.LogoTop:Hide() --* Hide ElvUI's Top Logo Piece
AFK.AFKMode.bottom.LogoBottom:Hide() --* Hide ElvUI's Bottom Logo Piece
if not AFK.AFKMode:GetScript('OnUpdate') then
AFK.AFKMode:SetScript('OnUpdate', function(_, elapsed)
if not AFK.isAFK then return end
timerLastUpdate = timerLastUpdate + elapsed
if (timerLastUpdate > 1.0) then
total_seconds = total_seconds + 1
local minutes = floor(total_seconds/60)
local neg_seconds = -total_seconds % 60
local seconds = total_seconds % 60
if S.db.defaultTexts.SL_AFKTimePassed.countdown then
if minutes - 29 == 0 and floor(neg_seconds) == 0 then
AFK.AFKMode.SL_AFKTimePassed:SetFormattedText("%s: |cfff0ff0000:00|r", L["Logout Timer"])
else
AFK.AFKMode.SL_AFKTimePassed:SetFormattedText("%02d:%02d", minutes -29, neg_seconds)
end
else
AFK.AFKMode.SL_AFKTimePassed:SetFormattedText('%02d:%02d', minutes, seconds)
end
currentDateTime()
timerLastUpdate = 0
end
tipsLastUpdate = tipsLastUpdate + elapsed
if tipsLastUpdate > S.db.tipThrottle then
TipNum = random(1, #L["SLE_TIPS"])
while TipNum == OldTip do
TipNum = random(1, #L["SLE_TIPS"])
end
AFK.AFKMode.SL_ScrollFrame:AddMessage(L["SLE_TIPS"][TipNum], 1, 1, 1)
OldTip = TipNum
tipsLastUpdate = 0
end
FlipCameraYaw(elapsed * degreeMultyplier)
degree = degree + elapsed * degreeMultyplier
end)
end
else
AFK.AFKMode:SetScript('OnUpdate', nil)
AFK.AFKMode.bottom:Show() --* Show ElvUI's Bottom Panel
AFK.AFKMode.bottom.LogoTop:Show() --* Show ElvUI's Top Logo Piece
AFK.AFKMode.bottom.LogoBottom:Show() --* Show ElvUI's Bottom Logo Piece
end
S:CreateUpdatePanels()
S:CreateTextStrings()
S:UpdateTextOptions()
S:SetupDefaultGraphics()
S:UpdateDefaultGraphics()
S:CreateSetupCustomGraphics()
-- S:ModelHolderPos()
S:CreateUpdateModelElements()
S:SetupAnimations()
end
function S:Initialize()
if not SLE.initialized then return end
S.db = E.db.sle.afk
S.OnKeyDown = AFK.AFKMode:GetScript('OnKeyDown')
S.OrigModelOnUpdate = AFK.AFKMode.bottom.model:GetScript('OnUpdate')
-- if not S.db.enable then return end
function S:ForUpdateAll()
S.db = E.db.sle.afk
S:Toggle()
S:Hide()
S:KeyScript()
end
S:ForUpdateAll()
AFK.AFKMode:HookScript('OnShow', S.Show)
AFK.AFKMode:HookScript('OnHide', S.Hide)
end
SLE:RegisterModule(S:GetName())