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())
--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 ( ) )