wip
This commit is contained in:
@@ -43,7 +43,8 @@ local Config = {
|
||||
}
|
||||
|
||||
local LoginState = {
|
||||
autoLoginTimer = nil, autoLoginDelay = Config.AUTO_LOGIN_DELAY, autoLoginAttempted = false, musicTimer = 0, sceneTimer = 0, currentFrame = 0, lastUpdateTime = 0, currentScene = 1
|
||||
autoLoginTimer = nil, autoLoginDelay = Config.AUTO_LOGIN_DELAY, autoLoginAttempted = false, musicTimer = 0, sceneTimer = 0, currentFrame = 0, lastUpdateTime = 0, currentScene = 1,
|
||||
launchMode = "locked", launcherLoginAttempted = false, luaBridgePending = true
|
||||
}
|
||||
|
||||
local ModelManager = {
|
||||
@@ -51,7 +52,7 @@ local ModelManager = {
|
||||
}
|
||||
|
||||
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
|
||||
accountEdit = nil, passwordEdit = nil, saveAccountName = nil, savePassword = nil, autoLogin = nil, autoLoginText = nil, saveOptionsFrame = nil, launcherHint = 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 = {
|
||||
@@ -78,6 +79,8 @@ local function InitializeUICache()
|
||||
UICache.savePassword = _G["AccountLoginSavePassword"]
|
||||
UICache.autoLogin = _G["AccountLoginAutoLogin"]
|
||||
UICache.autoLoginText = _G["AccountLoginAutoLoginText"]
|
||||
UICache.saveOptionsFrame = _G["AccountLoginSaveOptionsFrame"]
|
||||
UICache.launcherHint = _G["AccountLoginLauncherHint"]
|
||||
UICache.loginButton = _G["AccountLoginLoginButton"]
|
||||
UICache.versionText = _G["AccountLoginVersion"]
|
||||
UICache.realmName = _G["AccountLoginRealmName"]
|
||||
@@ -94,6 +97,98 @@ end
|
||||
function GetLoginState()
|
||||
return LoginState
|
||||
end
|
||||
|
||||
local function ResolveLaunchMode()
|
||||
if type(MoonWellGetLaunchMode) ~= "function" then
|
||||
return "locked"
|
||||
end
|
||||
|
||||
local mode = MoonWellGetLaunchMode()
|
||||
if mode == "launcher" or mode == "developer" then
|
||||
return mode
|
||||
end
|
||||
return "locked"
|
||||
end
|
||||
|
||||
local function ApplyLaunchMode()
|
||||
local developerMode = LoginState.launchMode == "developer"
|
||||
|
||||
if developerMode then
|
||||
UICache.accountEdit:Show()
|
||||
UICache.passwordEdit:Show()
|
||||
UICache.saveOptionsFrame:Show()
|
||||
UICache.launcherHint:Hide()
|
||||
UICache.loginButton:SetText(LOGIN)
|
||||
else
|
||||
UICache.accountEdit:Hide()
|
||||
UICache.passwordEdit:Hide()
|
||||
UICache.saveOptionsFrame:Hide()
|
||||
UICache.launcherHint:Show()
|
||||
UICache.loginButton:SetText("Авторизоваться")
|
||||
end
|
||||
end
|
||||
|
||||
function AccountLogin_OpenLauncher()
|
||||
PlaySound("gsLogin")
|
||||
local opened = false
|
||||
if type(MoonWellOpenLauncher) == "function" then
|
||||
opened = MoonWellOpenLauncher() and true or false
|
||||
end
|
||||
|
||||
if not opened then
|
||||
GlueDialog_Show("MOONWELL_LAUNCHER_NOT_FOUND")
|
||||
end
|
||||
end
|
||||
|
||||
function AccountLogin_PrimaryAction()
|
||||
if LoginState.launchMode == "developer" then
|
||||
AccountLogin_Login()
|
||||
else
|
||||
AccountLogin_OpenLauncher()
|
||||
end
|
||||
end
|
||||
|
||||
local function TryLauncherLogin()
|
||||
if LoginState.launchMode ~= "launcher" or LoginState.launcherLoginAttempted then
|
||||
return false
|
||||
end
|
||||
|
||||
LoginState.launcherLoginAttempted = true
|
||||
if type(MoonWellConsumeLauncherAuth) ~= "function" then
|
||||
LoginState.launchMode = "locked"
|
||||
ApplyLaunchMode()
|
||||
return false
|
||||
end
|
||||
|
||||
local accountName, ticket = MoonWellConsumeLauncherAuth()
|
||||
if not accountName or accountName == "" or not ticket or ticket == "" then
|
||||
LoginState.launchMode = "locked"
|
||||
ApplyLaunchMode()
|
||||
return false
|
||||
end
|
||||
|
||||
SetSavedAccountName("")
|
||||
SetSavedAccountList("")
|
||||
SetUsesToken(false)
|
||||
AccountLoginUI:Hide()
|
||||
PlaySound("gsLogin")
|
||||
DefaultServerLogin(accountName, ticket)
|
||||
accountName = nil
|
||||
ticket = nil
|
||||
return true
|
||||
end
|
||||
|
||||
local function TryLauncherFallbackLogin()
|
||||
if not LoginState.luaBridgePending or LoginState.launcherLoginAttempted then
|
||||
return false
|
||||
end
|
||||
|
||||
-- MoonWell.dll intercepts this stock callback and substitutes the one-time
|
||||
-- launcher credentials. With no launcher data it intentionally does nothing.
|
||||
LoginState.launcherLoginAttempted = true
|
||||
DefaultServerLogin("__MOONWELL_LAUNCHER__", "__MOONWELL_LAUNCHER__")
|
||||
return true
|
||||
end
|
||||
-- ============================================================================
|
||||
-- SISTEMA DE ANIMACIÓN BLP
|
||||
-- ============================================================================
|
||||
@@ -144,6 +239,11 @@ GlueDialogTypes["AUTO_LOGIN"] = {
|
||||
UICache.autoLogin:SetChecked(0)
|
||||
end,
|
||||
}
|
||||
|
||||
GlueDialogTypes["MOONWELL_LAUNCHER_NOT_FOUND"] = {
|
||||
text = "Не удалось открыть лаунчер MoonWell. Запустите его вручную и нажмите «Играть».",
|
||||
button1 = OKAY,
|
||||
}
|
||||
-- ============================================================================
|
||||
-- GESTIÓN DE MODELOS 3D
|
||||
-- ============================================================================
|
||||
@@ -151,10 +251,8 @@ 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:SetWidth(width * (modelData[LOGIN_MODEL_STRUCT.WIDTH_SQUISH] or 1))
|
||||
model:SetHeight(height * (modelData[LOGIN_MODEL_STRUCT.HEIGHT_SQUISH] or 1))
|
||||
model:SetPoint("CENTER")
|
||||
model:SetModel("Character/Human/Male/HumanMale.mdx")
|
||||
model:SetCamera(1)
|
||||
@@ -194,6 +292,13 @@ end
|
||||
-- ACTUALIZACIÓN DE LA ESCENA
|
||||
-- ============================================================================
|
||||
function LoginScene_OnUpdate(self, elapsed)
|
||||
if LoginState.luaBridgePending and type(MoonWellGetLaunchMode) == "function" then
|
||||
LoginState.luaBridgePending = false
|
||||
LoginState.launchMode = ResolveLaunchMode()
|
||||
ApplyLaunchMode()
|
||||
TryLauncherLogin()
|
||||
end
|
||||
|
||||
if Config.LOGIN_AMBIENCE and not self.ambiencePlayed then
|
||||
PlayGlueAmbience(Config.LOGIN_AMBIENCE, Config.AMBIENCE_FADE_TIME)
|
||||
self.ambiencePlayed = true
|
||||
@@ -283,8 +388,8 @@ function AccountLogin_OnLoad(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:SetWidth(self:GetWidth() / (data[LOGIN_MODEL_STRUCT.WIDTH_SQUISH] or 1))
|
||||
model:SetHeight(self:GetHeight() / (data[LOGIN_MODEL_STRUCT.HEIGHT_SQUISH] or 1))
|
||||
model:SetCamera(1)
|
||||
|
||||
if data[LOGIN_MODEL_STRUCT.LIGHT] then
|
||||
@@ -312,6 +417,10 @@ function AccountLogin_OnLoad(self)
|
||||
end
|
||||
|
||||
function AccountLogin_OnShow(self)
|
||||
-- Submit launcher credentials before constructing the decorative login UI.
|
||||
-- A cosmetic Lua error must never be able to block authentication.
|
||||
TryLauncherFallbackLogin()
|
||||
|
||||
self:Show()
|
||||
self:SetAlpha(1)
|
||||
WorldOfWarcraftRating:Hide()
|
||||
@@ -346,7 +455,8 @@ function AccountLogin_OnShow(self)
|
||||
|
||||
if not self.newLogo then
|
||||
self.newLogoFrame = CreateFrame("Frame", nil, self)
|
||||
self.newLogoFrame:SetSize(Config.LOGO_SIZE, Config.LOGO_SIZE)
|
||||
self.newLogoFrame:SetWidth(Config.LOGO_SIZE)
|
||||
self.newLogoFrame:SetHeight(Config.LOGO_SIZE)
|
||||
self.newLogoFrame:SetPoint("TOPLEFT", Config.LOGO_POSITION_X, Config.LOGO_POSITION_Y)
|
||||
|
||||
self.newLogo = self.newLogoFrame:CreateTexture("AccountLoginNewLogo", "OVERLAY")
|
||||
@@ -376,7 +486,16 @@ function AccountLogin_OnShow(self)
|
||||
self.modelUpdateCount = 0
|
||||
self.modelUpdateTimer = 0
|
||||
|
||||
local accountName, password = unpack(string_explode(GetSavedAccountName(), "#&|&#"))
|
||||
LoginState.luaBridgePending = type(MoonWellGetLaunchMode) ~= "function"
|
||||
LoginState.launchMode = ResolveLaunchMode()
|
||||
local accountName, password = "", ""
|
||||
if LoginState.launchMode == "developer" then
|
||||
accountName, password = unpack(string_explode(GetSavedAccountName(), "#&|&#"))
|
||||
else
|
||||
SetSavedAccountName("")
|
||||
SetSavedAccountList("")
|
||||
SetUsesToken(false)
|
||||
end
|
||||
UICache.accountEdit:SetText(accountName or "")
|
||||
UICache.passwordEdit:SetText(password or "")
|
||||
|
||||
@@ -390,13 +509,15 @@ function AccountLogin_OnShow(self)
|
||||
UICache.realmName:SetText("No Recent Server")
|
||||
end
|
||||
|
||||
if accountName == "" then
|
||||
AccountLogin_FocusAccountName()
|
||||
else
|
||||
AccountLogin_FocusPassword()
|
||||
if LoginState.launchMode == "developer" then
|
||||
if accountName == "" then
|
||||
AccountLogin_FocusAccountName()
|
||||
else
|
||||
AccountLogin_FocusPassword()
|
||||
end
|
||||
end
|
||||
|
||||
if UICache.savePassword:GetChecked() then
|
||||
if LoginState.launchMode == "developer" and UICache.savePassword:GetChecked() then
|
||||
UICache.autoLoginText:Show()
|
||||
UICache.autoLogin:Show()
|
||||
else
|
||||
@@ -415,7 +536,11 @@ function AccountLogin_OnShow(self)
|
||||
ACCOUNT_MSG_BODY_LOADED = false
|
||||
ACCOUNT_MSG_CURRENT_INDEX = nil
|
||||
|
||||
ApplyLaunchMode()
|
||||
AccountLogin_CheckAutoLogin()
|
||||
if not TryLauncherLogin() then
|
||||
TryLauncherFallbackLogin()
|
||||
end
|
||||
self:SetScript("OnUpdate", LoginScene_OnUpdate)
|
||||
end
|
||||
|
||||
@@ -450,11 +575,15 @@ function AccountLogin_OnHide(self)
|
||||
end
|
||||
|
||||
function AccountLogin_FocusPassword()
|
||||
UICache.passwordEdit:SetFocus()
|
||||
if LoginState.launchMode == "developer" then
|
||||
UICache.passwordEdit:SetFocus()
|
||||
end
|
||||
end
|
||||
|
||||
function AccountLogin_FocusAccountName()
|
||||
UICache.accountEdit:SetFocus()
|
||||
if LoginState.launchMode == "developer" then
|
||||
UICache.accountEdit:SetFocus()
|
||||
end
|
||||
end
|
||||
|
||||
function AccountLogin_OnKeyDown(key)
|
||||
@@ -474,7 +603,7 @@ function AccountLogin_OnKeyDown(key)
|
||||
elseif SurveyNotificationFrame:IsShown() then
|
||||
AccountLogin_SurveyNotificationDone(1)
|
||||
end
|
||||
AccountLogin_Login()
|
||||
AccountLogin_PrimaryAction()
|
||||
elseif key == "PRINTSCREEN" then
|
||||
Screenshot()
|
||||
end
|
||||
@@ -526,6 +655,11 @@ end
|
||||
-- SISTEMA DE LOGIN CON GUARDADO DE CONTRASEÑA
|
||||
-- ============================================================================
|
||||
function AccountLogin_Login()
|
||||
if LoginState.launchMode ~= "developer" then
|
||||
AccountLogin_OpenLauncher()
|
||||
return
|
||||
end
|
||||
|
||||
PlaySound("gsLogin")
|
||||
local accountName = UICache.accountEdit:GetText()
|
||||
local password = UICache.passwordEdit:GetText()
|
||||
@@ -557,6 +691,11 @@ end
|
||||
-- SISTEMA DE AUTOLOGIN
|
||||
-- ============================================================================
|
||||
function AccountLogin_CheckAutoLogin()
|
||||
if LoginState.launchMode ~= "developer" then
|
||||
LoginState.autoLoginTimer = nil
|
||||
return
|
||||
end
|
||||
|
||||
if not LoginState.autoLoginAttempted then
|
||||
LoginState.autoLoginAttempted = true
|
||||
local savedAccountInfo = GetSavedAccountName()
|
||||
|
||||
@@ -115,6 +115,18 @@
|
||||
</Anchor>
|
||||
</Anchors>
|
||||
</FontString>
|
||||
<FontString name="AccountLoginLauncherHint" inherits="GlueFontNormal" justifyH="CENTER" text="Вход в игру выполняется через лаунчер MoonWell.">
|
||||
<Size>
|
||||
<AbsDimension x="420" y="24"/>
|
||||
</Size>
|
||||
<Anchors>
|
||||
<Anchor point="BOTTOM">
|
||||
<Offset>
|
||||
<AbsDimension x="0" y="270"/>
|
||||
</Offset>
|
||||
</Anchor>
|
||||
</Anchors>
|
||||
</FontString>
|
||||
<Texture name="WorldOfWarcraftRating" hidden="true">
|
||||
<Size>
|
||||
<AbsDimension x="128" y="128"/>
|
||||
@@ -905,7 +917,7 @@
|
||||
</Layers>
|
||||
<Scripts>
|
||||
<OnClick>
|
||||
AccountLogin_Login();
|
||||
AccountLogin_PrimaryAction();
|
||||
</OnClick>
|
||||
</Scripts>
|
||||
</Button>
|
||||
|
||||
Reference in New Issue
Block a user