-- ============================================================================================== -- MoonWell - SISTEMA DE AUTOLOGIN CON BOTONES DE REDES SOCIALES CON ANIMACIÓN BLP Y ESCENA 3D -- ============================================================================================== local Config = { FADE_IN_TIME = 2, DEFAULT_TOOLTIP_COLOR = {0.8, 0.8, 0.8, 0.09, 0.09, 0.09}, MAX_PIN_LENGTH = 10, AUTO_LOGIN_DELAY = 3.0, BACKGROUND_TEXTURE = "Interface/Loginscreen/Background.blp", LOGIN_AMBIENCE = false, ENABLE_BLP_ANIMATION = false, FRAME_COUNT = 3, ANIMATION_DURATION = 16.0, FPS_LIMIT = 30, ANIMATION_PATH = "Interface\\Loginscreen\\Scene\\", MODEL_UPDATE_INTERVAL = 0.1, MODEL_UPDATE_COUNT_REQUIRED = 2, SCROLL_THRESHOLD = 20, FADE_DURATION = 0.5, LOGO_TEXTURE = "Interface\\Glues\\Common\\glues-wow-wotlklogo", LOGO_SIZE = 225, LOGO_POSITION_X = 60, LOGO_POSITION_Y = 40, CUSTOM_PANEL_WIDTH = 352, CUSTOM_PANEL_SCROLL_WIDTH = 300, DEFAULT_FRAME_LEVEL = 2, AMBIENCE_FADE_TIME = 5.0, UNDEAD_AMBIENCE_FADE_TIME = 4.0, SFX_STOP_TIME = 1.0, TOS_FRAME_WIDTH = 640, TOS_FRAME_HEIGHT = 512, TOS_SCROLL_WIDTH = 540, TOS_SCROLL_HEIGHT = 407, TOS_HEADER_WIDTH = 300, TOS_TITLE_OFFSET = 12, TOS_TEXT_OFFSET = 56, BUTTON_HEIGHT_SMALL = 38, BUTTON_HEIGHT_LARGE = 55, CINEMATICS_BUTTON_HEIGHT = 80, CINEMATICS_BACKGROUND_HEIGHT_BASE = 70 } local LoginState = { autoLoginTimer = nil, autoLoginDelay = Config.AUTO_LOGIN_DELAY, autoLoginAttempted = false, musicTimer = 0, sceneTimer = 0, currentFrame = 0, lastUpdateTime = 0, currentScene = 1 } local ModelManager = { models = {}, loginModels = {} } local UICache = { accountEdit = nil, passwordEdit = nil, saveAccountName = nil, savePassword = nil, autoLogin = nil, autoLoginText = nil, loginButton = nil, versionText = nil, realmName = nil, upgradeButton = nil, tosFrame = nil, tosAccept = nil, tosDecline = nil, backgroundTexture = nil, animatedTexture = nil, newLogo = nil, newLogoFrame = nil } LOGIN_MODEL_LIGHTS = { [0] = {1, 0, 0, -0.707, -0.707, 0.7, 1.0, 1.0, 1.0, 0, 1.0, 1.0, 0.8}, } LOGIN_MODEL_STRUCT = { SCENE_ID = 1, POS_Y = 2, POS_Z = 3, POS_X = 4, FACING = 5, SCALE = 6, ALPHA = 7, LIGHT = 8, SEQUENCE = 9, WIDTH_SQUISH = 10, HEIGHT_SQUISH = 11, MODEL_PATH = 12, } LOGIN_MODELS = { {1, 0.000, 0.300, 0.285, 0.684, 0.085, 1.000, LOGIN_MODEL_LIGHTS[0], 1, 1, 1, "Environments\\Stars\\icecrownarthasdeathsky.m2"}, {1, -0.712, 0.800, 0.000, 6.245, 0.100, 0.400, LOGIN_MODEL_LIGHTS[0], 1, 1, 1, "Environments\\Stars\\aurorayellowgreen.m2"}, {1, -0.712, -0.750, 0.000, 6.245, 0.100, 0.500, LOGIN_MODEL_LIGHTS[0], 1, 1, 1, "Environments\\Stars\\auroraorange.m2"}, } BACKGROUND_MODELS = { ["Environments\\Stars\\icecrownarthasdeathsky.m2"] = { frameLevel = 0 }, } -- ==================== CONFIGURACIÓN ADICIONAL ==================== local function InitializeUICache() UICache.accountEdit = _G["AccountLoginAccountEdit"] UICache.passwordEdit = _G["AccountLoginPasswordEdit"] UICache.saveAccountName = _G["AccountLoginSaveAccountName"] UICache.savePassword = _G["AccountLoginSavePassword"] UICache.autoLogin = _G["AccountLoginAutoLogin"] UICache.autoLoginText = _G["AccountLoginAutoLoginText"] UICache.loginButton = _G["AccountLoginLoginButton"] UICache.versionText = _G["AccountLoginVersion"] UICache.realmName = _G["AccountLoginRealmName"] UICache.upgradeButton = _G["AccountLoginUpgradeAccountButton"] UICache.tosFrame = _G["TOSFrame"] UICache.tosAccept = _G["TOSAccept"] UICache.tosDecline = _G["TOSDecline"] end function GetLoginConfig() return Config end function GetLoginState() return LoginState end -- ============================================================================ -- SISTEMA DE ANIMACIÓN BLP -- ============================================================================ local function UpdateBackgroundAnimation(self, elapsed) if not Config.ENABLE_BLP_ANIMATION or Config.FRAME_COUNT <= 0 then return end local currentTime = GetTime() if (currentTime - LoginState.lastUpdateTime) < (1 / Config.FPS_LIMIT) then return end LoginState.lastUpdateTime = currentTime LoginState.currentFrame = (LoginState.currentFrame + 1) % Config.FRAME_COUNT if self.animatedTexture then local texturePath = Config.ANIMATION_PATH .. string.format("%04d.blp", LoginState.currentFrame) self.animatedTexture:SetTexture(texturePath) end end -- ============================================================================ -- DIÁLOGOS -- ============================================================================ GlueDialogTypes["REMEMBER_PASSWORD"] = { text = SAVE_PASSWORD_NOTICE, button1 = OKAY, button2 = CANCEL, OnAccept = function() UICache.autoLoginText:Show() UICache.autoLogin:Show() end, OnCancel = function() UICache.savePassword:SetChecked(0) UICache.autoLoginText:Hide() UICache.autoLogin:Hide() UICache.autoLogin:SetChecked(0) end, } GlueDialogTypes["AUTO_LOGIN"] = { text = SAVE_AUTOLOGIN_NOTICE, button1 = OKAY, button2 = CANCEL, OnAccept = function() end, OnCancel = function() UICache.autoLogin:SetChecked(0) end, } -- ============================================================================ -- GESTIÓN DE MODELOS 3D -- ============================================================================ local function CreateLoginModel(parent, modelData) local model = CreateFrame("Model", nil, parent) local width, height = parent:GetSize() model:SetSize( width * (modelData[LOGIN_MODEL_STRUCT.WIDTH_SQUISH] or 1), height * (modelData[LOGIN_MODEL_STRUCT.HEIGHT_SQUISH] or 1) ) model:SetPoint("CENTER") model:SetModel("Character/Human/Male/HumanMale.mdx") model:SetCamera(1) model:SetModel(modelData[LOGIN_MODEL_STRUCT.MODEL_PATH]) model:SetPosition( modelData[LOGIN_MODEL_STRUCT.POS_X], modelData[LOGIN_MODEL_STRUCT.POS_Y], modelData[LOGIN_MODEL_STRUCT.POS_Z] ) model:SetFacing(modelData[LOGIN_MODEL_STRUCT.FACING]) model:SetModelScale(modelData[LOGIN_MODEL_STRUCT.SCALE]) model:SetAlpha(modelData[LOGIN_MODEL_STRUCT.ALPHA]) model:SetSequence(modelData[LOGIN_MODEL_STRUCT.SEQUENCE]) if modelData[LOGIN_MODEL_STRUCT.LIGHT] then model:SetLight(unpack(modelData[LOGIN_MODEL_STRUCT.LIGHT])) end return model end local function InitializeLoginScene(parent) for _, model in ipairs(ModelManager.loginModels) do model:Hide() model:SetParent(nil) end ModelManager.loginModels = {} for _, modelData in ipairs(LOGIN_MODELS) do if modelData[LOGIN_MODEL_STRUCT.SCENE_ID] == LoginState.currentScene then local model = CreateLoginModel(parent, modelData) table.insert(ModelManager.loginModels, model) end end end -- ============================================================================ -- ACTUALIZACIÓN DE LA ESCENA -- ============================================================================ function LoginScene_OnUpdate(self, elapsed) if Config.LOGIN_AMBIENCE and not self.ambiencePlayed then PlayGlueAmbience(Config.LOGIN_AMBIENCE, Config.AMBIENCE_FADE_TIME) self.ambiencePlayed = true end if LoginState.autoLoginTimer and LoginState.autoLoginTimer < LoginState.autoLoginDelay then LoginState.autoLoginTimer = LoginState.autoLoginTimer + elapsed if LoginState.autoLoginTimer >= LoginState.autoLoginDelay then AccountLogin_Login() LoginState.autoLoginTimer = nil end end UpdateBackgroundAnimation(self, elapsed) if not self.modelsInitialized and self.Models then self.modelUpdateTimer = (self.modelUpdateTimer or 0) + elapsed if self.modelUpdateTimer >= Config.MODEL_UPDATE_INTERVAL then self.modelUpdateTimer = 0 self.modelUpdateCount = (self.modelUpdateCount or 0) + 1 if self.modelUpdateCount == 1 then for i = 1, #self.Models do local model = self.Models[i] local data = LOGIN_MODELS[i] if model and data then model:SetModel(data[LOGIN_MODEL_STRUCT.MODEL_PATH]) model:SetPosition(data[LOGIN_MODEL_STRUCT.POS_X], data[LOGIN_MODEL_STRUCT.POS_Y], data[LOGIN_MODEL_STRUCT.POS_Z]) model:SetFacing(data[LOGIN_MODEL_STRUCT.FACING]) model:SetModelScale(data[LOGIN_MODEL_STRUCT.SCALE]) model:SetSequence(data[LOGIN_MODEL_STRUCT.SEQUENCE]) if data[LOGIN_MODEL_STRUCT.LIGHT] then model:SetLight(unpack(data[LOGIN_MODEL_STRUCT.LIGHT])) end model:Show() end end end if self.modelUpdateCount >= Config.MODEL_UPDATE_COUNT_REQUIRED then self.modelsInitialized = true self.modelsCreated = true self.modelUpdateTimer = nil self.modelUpdateCount = nil end end end LoginState.sceneTimer = LoginState.sceneTimer + elapsed end -- ============================================================================ -- INICIALIZACIÓN Y EVENTOS -- ============================================================================ local function isBackgroundModel(modelPath) return BACKGROUND_MODELS[modelPath] ~= nil end local function getModelFrameLevel(modelPath) return isBackgroundModel(modelPath) and BACKGROUND_MODELS[modelPath].frameLevel or Config.DEFAULT_FRAME_LEVEL end function AccountLogin_OnLoad(self) InitializeUICache() AccountLogin_SetupServerAlert() UICache.tosFrame.noticeType = "EULA" self:RegisterEvent("SHOW_SERVER_ALERT") self:RegisterEvent("SHOW_SURVEY_NOTIFICATION") self:RegisterEvent("CLIENT_ACCOUNT_MISMATCH") self:RegisterEvent("CLIENT_TRIAL") self:RegisterEvent("SCANDLL_ERROR") self:RegisterEvent("SCANDLL_FINISHED") local versionType, buildType, version, internalVersion, date = GetBuildInfo() UICache.versionText:SetText(buildType.." "..version.." ("..internalVersion..")") local backdropColor = Config.DEFAULT_TOOLTIP_COLOR UICache.accountEdit:SetBackdropBorderColor(backdropColor[1], backdropColor[2], backdropColor[3]) UICache.accountEdit:SetBackdropColor(backdropColor[4], backdropColor[5], backdropColor[6]) UICache.passwordEdit:SetBackdropBorderColor(backdropColor[1], backdropColor[2], backdropColor[3]) UICache.passwordEdit:SetBackdropColor(backdropColor[4], backdropColor[5], backdropColor[6]) self.Models = {} for i = 1, #LOGIN_MODELS do local data = LOGIN_MODELS[i] local model = CreateFrame("Model", "AccountLoginModel"..i, self) model:SetModel("Character/Human/Male/HumanMale.mdx") model:SetPoint("CENTER", 0, 0) model:SetSize(self:GetWidth() / (data[LOGIN_MODEL_STRUCT.WIDTH_SQUISH] or 1), self:GetHeight() / (data[LOGIN_MODEL_STRUCT.HEIGHT_SQUISH] or 1)) model:SetCamera(1) if data[LOGIN_MODEL_STRUCT.LIGHT] then model:SetLight(unpack(data[LOGIN_MODEL_STRUCT.LIGHT])) end model:SetAlpha(data[LOGIN_MODEL_STRUCT.ALPHA]) local frameLevel = getModelFrameLevel(data[LOGIN_MODEL_STRUCT.MODEL_PATH]) model:SetFrameLevel(frameLevel) if frameLevel == 0 then model:SetFrameStrata("LOW") end model:Hide() self.Models[i] = model end self.modelUpdateCount = 0 self.modelUpdateTimer = 0 self.modelsInitialized = false self.ambiencePlayed = false self.modelsCreated = false AcceptTOS() AcceptEULA() end function AccountLogin_OnShow(self) self:Show() self:SetAlpha(1) WorldOfWarcraftRating:Hide() if not self.backgroundTexture then self.backgroundTexture = self:CreateTexture("AccountLoginBackground", "BACKGROUND") self.backgroundTexture:SetTexture(Config.BACKGROUND_TEXTURE) self.backgroundTexture:SetAllPoints(self) self.backgroundTexture:SetTexCoord(0, 1, 0, 1) UICache.backgroundTexture = self.backgroundTexture else self.backgroundTexture:Show() end if Config.ENABLE_BLP_ANIMATION and Config.FRAME_COUNT > 0 then if not self.animatedTexture then self.animatedTexture = self:CreateTexture("AccountLoginAnimatedBackground", "BACKGROUND") self.animatedTexture:SetAllPoints(self) self.animatedTexture:SetTexture(Config.ANIMATION_PATH .. "0000.blp") UICache.animatedTexture = self.animatedTexture LoginState.currentFrame = 0 LoginState.lastUpdateTime = GetTime() else self.animatedTexture:Show() LoginState.currentFrame = 0 LoginState.lastUpdateTime = GetTime() end elseif self.animatedTexture then self.animatedTexture:Hide() end AccountLoginUI:Show() AccountLoginUI:SetAlpha(1) if not self.newLogo then self.newLogoFrame = CreateFrame("Frame", nil, self) self.newLogoFrame:SetSize(Config.LOGO_SIZE, Config.LOGO_SIZE) self.newLogoFrame:SetPoint("TOPLEFT", Config.LOGO_POSITION_X, Config.LOGO_POSITION_Y) self.newLogo = self.newLogoFrame:CreateTexture("AccountLoginNewLogo", "OVERLAY") self.newLogo:SetTexture(Config.LOGO_TEXTURE) self.newLogo:SetAllPoints(self.newLogoFrame) self.newLogo:Show() UICache.newLogo = self.newLogo UICache.newLogoFrame = self.newLogoFrame else self.newLogoFrame:Show() end if self.Models then for i = 1, #self.Models do local model = self.Models[i] if model then model:Show() end end end if self.modelsCreated then self.modelsInitialized = true else self.modelsInitialized = false end self.modelUpdateCount = 0 self.modelUpdateTimer = 0 local accountName, password = unpack(string_explode(GetSavedAccountName(), "#&|&#")) UICache.accountEdit:SetText(accountName or "") UICache.passwordEdit:SetText(password or "") PlayGlueAmbience("GlueScreenUndead", Config.UNDEAD_AMBIENCE_FADE_TIME) AccountLogin_ShowUserAgreements() local serverName = GetServerName() if serverName then UICache.realmName:SetText(serverName) else UICache.realmName:SetText("No Recent Server") end if accountName == "" then AccountLogin_FocusAccountName() else AccountLogin_FocusPassword() end if UICache.savePassword:GetChecked() then UICache.autoLoginText:Show() UICache.autoLogin:Show() else UICache.autoLoginText:Hide() UICache.autoLogin:Hide() end if IsTrialAccount() then UICache.upgradeButton:Show() else UICache.upgradeButton:Hide() end ACCOUNT_MSG_NUM_AVAILABLE = 0 ACCOUNT_MSG_PRIORITY = 0 ACCOUNT_MSG_HEADERS_LOADED = false ACCOUNT_MSG_BODY_LOADED = false ACCOUNT_MSG_CURRENT_INDEX = nil AccountLogin_CheckAutoLogin() self:SetScript("OnUpdate", LoginScene_OnUpdate) end function AccountLogin_OnHide(self) StopAllSFX(Config.SFX_STOP_TIME) if not UICache.saveAccountName:GetChecked() then SetSavedAccountList("") end self:SetScript("OnUpdate", nil) if self.Models then for i = 1, #self.Models do local model = self.Models[i] if model then model:Hide() end end end self.modelsInitialized = false self.ambiencePlayed = false if UICache.backgroundTexture then UICache.backgroundTexture:Hide() end if UICache.animatedTexture then UICache.animatedTexture:Hide() end if UICache.newLogoFrame then UICache.newLogoFrame:Hide() end StopGlueAmbience() end function AccountLogin_FocusPassword() UICache.passwordEdit:SetFocus() end function AccountLogin_FocusAccountName() UICache.accountEdit:SetFocus() end function AccountLogin_OnKeyDown(key) if key == "ESCAPE" then if ConnectionHelpFrame:IsShown() then ConnectionHelpFrame:Hide() AccountLoginUI:Show() elseif SurveyNotificationFrame:IsShown() then else AccountLogin_Exit() end elseif key == "ENTER" then if not TOSAccepted() then return elseif TOSFrame:IsShown() or ConnectionHelpFrame:IsShown() then return elseif SurveyNotificationFrame:IsShown() then AccountLogin_SurveyNotificationDone(1) end AccountLogin_Login() elseif key == "PRINTSCREEN" then Screenshot() end end function AccountLogin_OnEvent(event, arg1, arg2, arg3) if event == "SHOW_SERVER_ALERT" then ServerAlertText:SetText(arg1) ServerAlertFrame:Show() elseif event == "SHOW_SURVEY_NOTIFICATION" then AccountLogin_ShowSurveyNotification() elseif event == "CLIENT_ACCOUNT_MISMATCH" then local accountExpansionLevel = arg1 local installationExpansionLevel = arg2 if accountExpansionLevel == 1 then GlueDialog_Show("CLIENT_ACCOUNT_MISMATCH", CLIENT_ACCOUNT_MISMATCH_BC) else GlueDialog_Show("CLIENT_ACCOUNT_MISMATCH", CLIENT_ACCOUNT_MISMATCH_LK) end elseif event == "CLIENT_TRIAL" then GlueDialog_Show("CLIENT_TRIAL") elseif event == "SCANDLL_ERROR" then GlueDialog:Hide() ScanDLLContinueAnyway() AccountLoginUI:Show() elseif event == "SCANDLL_FINISHED" then if arg1 == "OK" then GlueDialog:Hide() AccountLoginUI:Show() else AccountLogin.hackURL = _G["SCANDLL_URL_"..arg1] AccountLogin.hackName = arg2 AccountLogin.hackType = arg1 local formatString = _G["SCANDLL_MESSAGE_"..arg1] if arg3 == 1 then formatString = _G["SCANDLL_MESSAGE_HACKNOCONTINUE"] end local msg = format(formatString, AccountLogin.hackName, AccountLogin.hackURL) if arg3 == 1 then GlueDialog_Show("SCANDLL_HACKFOUND_NOCONTINUE", msg) else GlueDialog_Show("SCANDLL_HACKFOUND", msg) end PlaySoundFile("Sound\\Creature\\MobileAlertBot\\MobileAlertBotIntruderAlert01.wav") end end end -- ============================================================================ -- SISTEMA DE LOGIN CON GUARDADO DE CONTRASEÑA -- ============================================================================ function AccountLogin_Login() PlaySound("gsLogin") local accountName = UICache.accountEdit:GetText() local password = UICache.passwordEdit:GetText() local savedData = "" if UICache.saveAccountName:GetChecked() then if UICache.savePassword:GetChecked() then local autoLoginFlag = UICache.autoLogin:GetChecked() and "1" or "0" savedData = accountName.."#&|&#"..password.."#&|&#"..autoLoginFlag else local autoLoginFlag = UICache.autoLogin:GetChecked() and "1" or "0" savedData = accountName.."#&|&#".."".."#&|&#"..autoLoginFlag end else if UICache.autoLogin:GetChecked() then GlueDialog_Show("AUTO_LOGIN_NEEDS_ACCOUNT") UICache.autoLogin:SetChecked(0) end SetSavedAccountName("") SetUsesToken(false) end if savedData ~= "" then SetSavedAccountName(savedData) end DefaultServerLogin(accountName, password) end -- ============================================================================ -- SISTEMA DE AUTOLOGIN -- ============================================================================ function AccountLogin_CheckAutoLogin() if not LoginState.autoLoginAttempted then LoginState.autoLoginAttempted = true local savedAccountInfo = GetSavedAccountName() if savedAccountInfo and savedAccountInfo ~= "" then local accountData = string_explode(savedAccountInfo, "#&|&#") local accountName = accountData[1] or "" local password = accountData[2] or "" local autoLogin = accountData[3] or "0" if autoLogin == "1" and accountName ~= "" and password ~= "" then LoginState.autoLoginTimer = 0 LoginState.autoLoginDelay = Config.AUTO_LOGIN_DELAY else LoginState.autoLoginTimer = nil end end end end -- ============================================================================ -- ANIMACIÓN PARA SERVER ALERT FRAME -- ============================================================================ function AccountLogin_ToggleServerAlert() local frame = ServerAlertFrame if not frame then return end if frame.isAnimating then return end if frame.fadeInfo then frame:SetScript("OnUpdate", nil) frame.fadeInfo = nil end frame.isAnimating = true local logoTexture = UICache.newLogo if frame:IsShown() then local startWidth = frame:GetWidth() local scrollFrame = _G["ServerAlertScrollFrame"] if not scrollFrame then frame:Hide() frame.isAnimating = false return end local startScrollWidth = scrollFrame:GetWidth() frame.fadeInfo = { mode = "OUT", timeToFade = 0.5, startAlpha = 1, endAlpha = 0, startWidth = startWidth, endWidth = 0, startScrollWidth = startScrollWidth, endScrollWidth = 0, scrollFrame = scrollFrame, savedWidth = startWidth, savedScrollWidth = startScrollWidth, logoAlpha = logoTexture and logoTexture:GetAlpha() or 1, logoEndAlpha = 0 } frame:SetScript("OnUpdate", function(self, elapsed) if not self.fadeInfo then return end local fadeInfo = self.fadeInfo fadeInfo.elapsed = (fadeInfo.elapsed or 0) + elapsed if fadeInfo.elapsed < fadeInfo.timeToFade then local progress = fadeInfo.elapsed / fadeInfo.timeToFade self:SetAlpha(fadeInfo.startAlpha + (fadeInfo.endAlpha - fadeInfo.startAlpha) * progress) if logoTexture then local logoProgress = progress local logoAlpha = fadeInfo.logoAlpha + (fadeInfo.logoEndAlpha - fadeInfo.logoAlpha) * logoProgress logoTexture:SetAlpha(logoAlpha) end local currentWidth = fadeInfo.startWidth + (fadeInfo.endWidth - fadeInfo.startWidth) * progress self:SetWidth(currentWidth) local currentScrollWidth = fadeInfo.startScrollWidth + (fadeInfo.endScrollWidth - fadeInfo.startScrollWidth) * progress if fadeInfo.scrollFrame then fadeInfo.scrollFrame:SetWidth(currentScrollWidth) end else self:SetAlpha(fadeInfo.endAlpha) self:SetWidth(fadeInfo.endWidth) if logoTexture then logoTexture:SetAlpha(fadeInfo.logoEndAlpha) end if fadeInfo.scrollFrame then fadeInfo.scrollFrame:SetWidth(fadeInfo.endScrollWidth) end self:Hide() self:SetWidth(fadeInfo.savedWidth or 341) if fadeInfo.scrollFrame then fadeInfo.scrollFrame:SetWidth(fadeInfo.savedScrollWidth or 300) end self:SetScript("OnUpdate", nil) self.fadeInfo = nil self.isAnimating = false end end) else local targetWidth = 341 local targetScrollWidth = 300 local scrollFrame = _G["ServerAlertScrollFrame"] if not scrollFrame then frame:Show() frame.isAnimating = false return end frame:SetWidth(0) scrollFrame:SetWidth(0) frame:SetAlpha(0) frame:Show() if logoTexture then logoTexture:SetAlpha(0) logoTexture:Show() end frame.fadeInfo = { mode = "IN", timeToFade = 0.5, startAlpha = 0, endAlpha = 1, startWidth = 0, endWidth = targetWidth, startScrollWidth = 0, endScrollWidth = targetScrollWidth, scrollFrame = scrollFrame, logoAlpha = 0, logoEndAlpha = 1 } frame:SetScript("OnUpdate", function(self, elapsed) if not self.fadeInfo then return end local fadeInfo = self.fadeInfo fadeInfo.elapsed = (fadeInfo.elapsed or 0) + elapsed if fadeInfo.elapsed < fadeInfo.timeToFade then local progress = fadeInfo.elapsed / fadeInfo.timeToFade self:SetAlpha(fadeInfo.startAlpha + (fadeInfo.endAlpha - fadeInfo.startAlpha) * progress) if logoTexture then local logoProgress = progress local logoAlpha = fadeInfo.logoAlpha + (fadeInfo.logoEndAlpha - fadeInfo.logoAlpha) * logoProgress logoTexture:SetAlpha(logoAlpha) end local currentWidth = fadeInfo.startWidth + (fadeInfo.endWidth - fadeInfo.startWidth) * progress self:SetWidth(currentWidth) local currentScrollWidth = fadeInfo.startScrollWidth + (fadeInfo.endScrollWidth - fadeInfo.startScrollWidth) * progress if fadeInfo.scrollFrame then fadeInfo.scrollFrame:SetWidth(currentScrollWidth) end else self:SetAlpha(fadeInfo.endAlpha) self:SetWidth(fadeInfo.endWidth) if logoTexture then logoTexture:SetAlpha(fadeInfo.logoEndAlpha) end if fadeInfo.scrollFrame then fadeInfo.scrollFrame:SetWidth(fadeInfo.endScrollWidth) end self:SetScript("OnUpdate", nil) self.fadeInfo = nil self.isAnimating = false end end) end PlaySound("gsLoginNewAccount") end function AccountLogin_SetupServerAlert() if ServerAlertFrame then ServerAlertFrame.isAnimating = false ServerAlertFrame.fadeInfo = nil end end -- ============================================================================ -- FUNCIONES ADICIONALES -- ============================================================================ function AccountLogin_TOS() if not GlueDialog:IsShown() then PlaySound("gsLoginNewAccount") AccountLoginUI:Hide() UICache.tosFrame:Show() TOSScrollFrameScrollBar:SetValue(0) TOSScrollFrame:Show() TOSFrameTitle:SetText(TOS_FRAME_TITLE) TOSText:Show() end end function AccountLogin_ManageAccount() PlaySound("gsLoginNewAccount") LaunchURL(AUTH_NO_TIME_URL) end function AccountLogin_LaunchCommunitySite() PlaySound("gsLoginNewAccount") LaunchURL(COMMUNITY_URL) end function CharacterSelect_UpgradeAccount() PlaySound("gsLoginNewAccount") LaunchURL(AUTH_NO_TIME_URL) end function AccountLogin_Credits() CreditsFrame.creditsType = 3 PlaySound("gsTitleCredits") SetGlueScreen("credits") end function AccountLogin_Cinematics() if not GlueDialog:IsShown() then PlaySound("gsLoginNewAccount") MOVIE_RETURN_SCREEN = "login" if CinematicsFrame.numMovies > 1 then CinematicsFrame:Show() else MovieFrame.version = 1 SetGlueScreen("movie") end end end function AccountLogin_Options() PlaySound("gsTitleOptions") end function AccountLogin_Exit() QuitGame() end function AccountLogin_ShowSurveyNotification() GlueDialog:Hide() AccountLoginUI:Hide() SurveyNotificationAccept:Enable() SurveyNotificationDecline:Enable() SurveyNotificationFrame:Show() end function AccountLogin_SurveyNotificationDone(accepted) SurveyNotificationFrame:Hide() SurveyNotificationAccept:Disable() SurveyNotificationDecline:Disable() SurveyNotificationDone(accepted) AccountLoginUI:Show() end function AccountLogin_ShowUserAgreements() TOSScrollFrame:Hide() EULAScrollFrame:Hide() TerminationScrollFrame:Hide() ScanningScrollFrame:Hide() ContestScrollFrame:Hide() TOSText:Hide() EULAText:Hide() TerminationText:Hide() ScanningText:Hide() if not EULAAccepted() then if ShowEULANotice() then TOSNotice:SetText(EULA_NOTICE) TOSNotice:Show() end AccountLoginUI:Hide() TOSFrame.noticeType = "EULA" TOSFrameTitle:SetText(EULA_FRAME_TITLE) TOSFrameHeader:SetWidth(TOSFrameTitle:GetWidth()) EULAScrollFrame:Show() EULAText:Show() TOSFrame:Show() elseif not TOSAccepted() then if ShowTOSNotice() then TOSNotice:SetText(TOS_NOTICE) TOSNotice:Show() end AccountLoginUI:Hide() TOSFrame.noticeType = "TOS" TOSFrameTitle:SetText(TOS_FRAME_TITLE) TOSFrameHeader:SetWidth(TOSFrameTitle:GetWidth()) TOSScrollFrame:Show() TOSText:Show() TOSFrame:Show() elseif not IsScanDLLFinished() then AccountLoginUI:Hide() TOSFrame:Hide() local dllURL = "" if IsWindowsClient() then dllURL = SCANDLL_URL_WIN32_SCAN_DLL end ScanDLLStart(SCANDLL_URL_LAUNCHER_TXT, dllURL) else AccountLoginUI:Show() TOSFrame:Hide() end end function AccountLogin_UpdateAcceptButton(scrollFrame, isAcceptedFunc, noticeType) local scrollbar = _G[scrollFrame:GetName().."ScrollBar"] local min, max = scrollbar:GetMinMaxValues() if scrollbar:GetValue() >= max - Config.SCROLL_THRESHOLD then UICache.tosAccept:Enable() else if not isAcceptedFunc() and UICache.tosFrame.noticeType == noticeType then UICache.tosAccept:Disable() end end end -- ============================================================================ -- FUNCIONES DE CINEMATICS -- ============================================================================ function CinematicsFrame_OnLoad(self) local numMovies = GetClientExpansionLevel() CinematicsFrame.numMovies = numMovies if numMovies < 2 then return end for i = 1, numMovies do _G["CinematicsButton"..i]:Show() end CinematicsBackground:SetHeight(numMovies * 40 + 70) end function CinematicsFrame_OnKeyDown(key) if key == "PRINTSCREEN" then Screenshot() else PlaySound("igMainMenuOptionCheckBoxOff") CinematicsFrame:Hide() end end function Cinematics_PlayMovie(self) CinematicsFrame:Hide() PlaySound("gsTitleOptionOK") MovieFrame.version = self:GetID() SetGlueScreen("movie") end -- ============================================================================ -- FUNCIONES AUXILIARES -- ============================================================================ function string_explode(str, div) assert(type(str) == "string" and type(div) == "string", "invalid arguments") local o = {} while true do local pos1, pos2 = str:find(div, 1, true) if not pos1 then o[#o+1] = str break end o[#o+1], str = str:sub(1, pos1-1), str:sub(pos2+1) end return o end -- ============================================================================ -- TOKEN SYSTEM - FUNCIONES SIMPLES -- ============================================================================ function TokenEnterDialog_Okay(self) local editBox = TokenEnterDialogBackgroundEdit if not editBox then return end local text = editBox:GetText() if not text or string.len(text) < 6 then return end TokenEntered(text) TokenEnterDialog:Hide() end function TokenEnterDialog_Cancel(self) if TokenEnterDialog then TokenEnterDialog:Hide() end CancelLogin() end function TokenEntry_Okay(self) TokenEnterDialog_Okay(self) end function TokenEntry_Cancel(self) TokenEnterDialog_Cancel(self) end function TokenEntryOkayButton_OnLoad(self) self:RegisterEvent("PLAYER_ENTER_TOKEN") end function TokenEntryOkayButton_OnEvent(self, event) if event == "PLAYER_ENTER_TOKEN" then if AccountLoginSaveAccountName:GetChecked() then if GetUsesToken() then if AccountLoginTokenEdit:GetText() ~= "" then TokenEntered(AccountLoginTokenEdit:GetText()) return end else SetUsesToken(true) end end self:Show() end end function TokenEntryOkayButton_OnShow() if TokenEnterDialogBackgroundEdit then TokenEnterDialogBackgroundEdit:SetText("") TokenEnterDialogBackgroundEdit:SetFocus() end end function TokenEntryOkayButton_OnKeyDown(self, key) if key == "ENTER" then TokenEntry_Okay(self) elseif key == "ESCAPE" then TokenEntry_Cancel(self) end end -- ============================================================================