Back to Home

ESO Lua File v100031

pregame/accountlogin/gamepad/createlinkloadingscreen_gamepad.lua

[◄ back to folders ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
-- Main class.
local ZO_CreateLinkLoading_Gamepad = ZO_Object:Subclass()
function ZO_CreateLinkLoading_Gamepad:New(control)
    local object = ZO_Object.New(self)
    object:Initialize(control)
    return object
end
function ZO_CreateLinkLoading_Gamepad:Initialize(control)
    self.control = control
    self.registeredEvents = {}
    local createLinkLoadingScreen_Gamepad_Fragment = ZO_FadeSceneFragment:New(self.control)
    CREATE_LINK_LOADING_SCREEN_GAMEPAD_SCENE = ZO_Scene:New("CreateLinkLoadingScreen_Gamepad", SCENE_MANAGER)
    CREATE_LINK_LOADING_SCREEN_GAMEPAD_SCENE:AddFragment(createLinkLoadingScreen_Gamepad_Fragment)
    self.previousState = "AccountLogin"
    local StateChanged = function(oldState, newState)
        if newState == SCENE_SHOWING then
            self:PerformDeferredInitialize()
            self:RegisterEvents()
            self:ResetQueuedBoxVisibility()
            KEYBIND_STRIP:RemoveDefaultExit()
            KEYBIND_STRIP:AddKeybindButtonGroup(self.keybindStripDescriptor)
            self.loginFunction()
        elseif newState == SCENE_HIDDEN then
            self:UnregisterEvents()
            KEYBIND_STRIP:RemoveKeybindButtonGroup(self.keybindStripDescriptor)
            KEYBIND_STRIP:RestoreDefaultExit()
        end
    end
    CREATE_LINK_LOADING_SCREEN_GAMEPAD_SCENE:RegisterCallback("StateChange", StateChanged)
end
function ZO_CreateLinkLoading_Gamepad:PerformDeferredInitialize()
    if self.initialized then return end
    self.initialized = true
    local baseControl = self.control:GetNamedChild("Container"):GetNamedChild("Base")
    self.queuedBox = baseControl:GetNamedChild("Queued")
    self.queuedLabel = self.queuedBox:GetNamedChild("Text")
    self.queuedStatusBar = self.queuedBox:GetNamedChild("StatusBar")
    self.loadingBox = baseControl:GetNamedChild("Loading")
    self.loadingText = self.loadingBox:GetNamedChild("Text")
end
function ZO_CreateLinkLoading_Gamepad:InitKeybindingDescriptor()
    self.keybindStripDescriptor =
    {
        alignment = KEYBIND_STRIP_ALIGN_LEFT,
        -- Back
        KEYBIND_STRIP:GenerateGamepadBackButtonDescriptor(function()
                PlaySound(SOUNDS.DIALOG_DECLINE)
                if self.previousState == "AccountLogin" then
                    CancelLogin()
                end
                PregameStateManager_SetState(self.previousState)
            end),
    }
end
local function OnSuccess()
end
local function OnLoggedIn()
    RequestWorldList()
end
local function OnWorldListReceived()
end
local function OnNoLink()
    if IsHeronUI() then
        -- Account linking will be handled in an overlay, jump back to login so the user can manually continue once that's done
        PregameStateManager_SetState("AccountLogin")
    else
        PregameStateManager_SetState("CreateLinkAccount")
    end
end
do
    local loginQueuedScene
    local currentLoginQueueWaitTime
    local lastQueuePosition
    local function GetLoginQueueApproximateWaitTime(waitTime, queuePosition)
        -- if our position increases, the ETA we have "locked" is no longer valid
        if (not currentLoginQueueWaitTime) or (queuePosition > lastQueuePosition) then
            currentLoginQueueWaitTime = zo_max(waitTime * 1000, 1000) -- minimum wait time is that last second...
            lastQueuePosition = queuePosition
        else
            currentLoginQueueWaitTime = zo_min(currentLoginQueueWaitTime, zo_max(waitTime * 1000, 1000))
        end
        return currentLoginQueueWaitTime
    end
    function ZO_CreateLinkLoading_Gamepad:OnQueued(eventCode, waitTime, queuePosition)
        waitTime = GetLoginQueueApproximateWaitTime(waitTime, queuePosition)
        self.loadingBox:SetHidden(true)
        self.queuedBox:SetHidden(false)
        self.queuedLabel:SetText(zo_strformat(SI_LOGIN_QUEUE_TEXT, ZO_FormatTimeMilliseconds(waitTime, TIME_FORMAT_STYLE_DESCRIPTIVE)))
        self.queuedStatusBar:SetMinMax(0, zo_max(lastQueuePosition, 1))
        self.queuedStatusBar:SetValue(lastQueuePosition - queuePosition)
    end
    function ZO_CreateLinkLoading_Gamepad:ResetQueuedBoxVisibility()
        self.loadingBox:SetHidden(false)
        self.queuedBox:SetHidden(true)
    end
end
local function OnCreateAccountFailure(eventId, failureReason)
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_GAMEPAD_GENERIC_LOGIN_ERROR), zo_strformat(SI_CREATEACCOUNT_FAILURE_MESSAGE, failureReason))
end
local function OnLinkAccountFailure(eventId, failureReason)
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_GAMEPAD_GENERIC_LOGIN_ERROR), zo_strformat(SI_LINKACCOUNT_FAILURE_MESSAGE, failureReason))
end
local function OnServerMaintenance(eventID, requeryTime)
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_SERVER_MAINTENANCE_DIALOG_TITLE), GetString(SI_SERVER_MAINTENANCE_DIALOG_TEXT))
end
local function OnServerLocked()
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_DIALOG_TITLE_SERVER_LOCKED), GetString(SI_SERVER_LOCKED))
end
local function OnInvalidCredentials(eventId, errorCode, accountPageURL)
    local badLoginString = GetString(SI_BAD_LOGIN)
    if GetPlatformServiceType() == PLATFORM_SERVICE_TYPE_ZOS then
        badLoginString = GetString(SI_BAD_LOGIN_ZOS)
    end
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_GAMEPAD_GENERIC_LOGIN_ERROR), badLoginString)
end
local function OnPaymentExpired(eventId, errorCode, accountPageURL)
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_DIALOG_TITLE_PAYMENT_EXPIRED), GetString(SI_DIALOG_TEXT_PAYMENT_EXPIRED))
end
local function OnBadClientVersion()
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_BAD_CLIENT_VERSION_TITLE), GetString(SI_BAD_CLIENT_VERSION_TEXT))
end
local function OnGlobalError(eventID, errorCode, helpLinkURL, errorText)
    ZO_PREGAME_HAD_GLOBAL_ERROR = true
    local errorString, errorStringFormat
    if errorCode ~= nil then
        errorStringFormat = GetString("SI_GLOBALERRORCODE", errorCode)
    end
    if errorStringFormat ~= "" then
        errorString = zo_strformat(errorStringFormat, errorText, GetString(SI_HELP_URL))
    else
        errorString = zo_strformat(SI_UNKNOWN_ERROR, GetString(SI_HELP_URL))
    end
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_PROMPT_TITLE_ERROR), errorString)
end
local function OnOTPPending(eventID, otpReason, otpType, otpDurationInSeconds)
    -- TODO: Is this a case that needs to be handled properly on console (and thus needs to be designed), or is this
    -- show a dialog good enough as its only needed for PC testing?
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(GetString(SI_OTP_DIALOG_TITLE), GetString(SI_PROVIDE_OTP_INITIAL_DIALOG_TEXT))
end
local function OnCreateLinkLoadingError(eventId, loginError, linkingError, debugInfo)
    local dialogTitle = ""
    local dialogText = ""
    if loginError == LOGIN_AUTH_ERROR_SERVER_PSN_FREE_TRIAL_END then
        local PSN_FREE_TRIAL_END = true
        PregameStateManager_SetState("GameStartup", PSN_FREE_TRIAL_END)
        return
    end
    if loginError ~= LOGIN_AUTH_ERROR_NO_ERROR then
        dialogTitle = GetString(SI_LOGIN_DIALOG_TITLE_LOGIN_FAILED)
        dialogText = GetString("SI_LOGINAUTHERROR", loginError)
    elseif linkingError ~= ACCOUNT_CREATE_LINK_ERROR_NO_ERROR then
        dialogTitle = GetString(SI_LOGIN_DIALOG_TITLE_LINK_FAILED)
        if linkingError == ACCOUNT_CREATE_LINK_ERROR_EXTERNAL_REFERENCE_ALREADY_USED or linkingError == ACCOUNT_CREATE_LINK_ERROR_USER_ALREADY_LINKED then
            local serviceType = GetPlatformServiceType()
            local accountTypeName = GetString("SI_PLATFORMSERVICETYPE", serviceType)
            dialogText = zo_strformat(SI_LINKACCOUNT_ALREADY_LINKED_ERROR_FORMAT, accountTypeName)
        else
            dialogText = GetString("SI_ACCOUNTCREATELINKERROR", linkingError)
        end
    end
    if loginError == LOGIN_AUTH_ERROR_ACCOUNT_NOT_VERIFIED or loginError == LOGIN_AUTH_ERROR_GAME_ACCOUNT_NOT_VERIFIED or linkingError == ACCOUNT_CREATE_LINK_ERROR_ACCOUNT_NOT_VERIFIED then
        PREGAME_INITIAL_SCREEN_GAMEPAD:ShowEmailVerificationError(dialogTitle, dialogText)
        return
    end
    if dialogText == "" then
        -- generic error message
        dialogTitle = GetString(SI_LOGIN_DIALOG_TITLE_LOGIN_FAILED)
        dialogText = GetString(SI_UNEXPECTED_ERROR)
    end
    if IsConsoleUI() then
        if not LINK_ACCOUNT_GAMEPAD:IsAccountValidForLinking(linkingError) then
            LINK_ACCOUNT_GAMEPAD:ClearCredentials()
        end
    end
    local errorString = zo_strformat(dialogText, GetString(SI_HELP_URL))
    -- debugInfo will be empty in public, non-debug builds
    PREGAME_INITIAL_SCREEN_GAMEPAD:ShowError(dialogTitle, errorString .. debugInfo)
end
function ZO_CreateLinkLoading_Gamepad:RegisterForEvent(eventId, callback)
    table.insert(self.registeredEvents, eventId)
end
function ZO_CreateLinkLoading_Gamepad:RegisterEvents()
    -- "Success" Cases
    self:RegisterForEvent(EVENT_LOGIN_SUCCESSFUL, OnLoggedIn)
    self:RegisterForEvent(EVENT_WORLD_LIST_RECEIVED, OnWorldListReceived)
    self:RegisterForEvent(EVENT_ACCOUNT_LINK_SUCCESSFUL, OnSuccess)
    self:RegisterForEvent(EVENT_ACCOUNT_CREATE_SUCCESSFUL, OnSuccess)
    self:RegisterForEvent(EVENT_PROFILE_NOT_LINKED, OnNoLink)
    self:RegisterForEvent(EVENT_LOGIN_QUEUED, function(...) self:OnQueued(...) end)
    self:RegisterForEvent(EVENT_COUNTRY_DATA_LOADED, function()
                                                        CREATE_ACCOUNT_GAMEPAD:PerformDeferredInitialize()
                                                        PregameStateManager_AdvanceState()
                                                     end)
    -- NOTE: Overflow is not handled here as, according to the console
    -- services guys, it is not supported on console.
    -- Error Cases
    -- TODO: Any additional error cases that should be handled?
    self:RegisterForEvent(EVENT_GLOBAL_ERROR, OnGlobalError)
    self:RegisterForEvent(EVENT_SERVER_IN_MAINTENANCE_MODE, OnServerMaintenance)
    self:RegisterForEvent(EVENT_SERVER_LOCKED, OnServerLocked)
    self:RegisterForEvent(EVENT_LOGIN_FAILED_INVALID_CREDENTIALS, OnInvalidCredentials)
    self:RegisterForEvent(EVENT_LOGIN_OTP_PENDING, OnOTPPending)
    self:RegisterForEvent(EVENT_BAD_CLIENT_VERSION, OnBadClientVersion)
    self:RegisterForEvent(EVENT_CREATE_LINK_LOADING_ERROR, OnCreateLinkLoadingError)
    -- Misc.
end
function ZO_CreateLinkLoading_Gamepad:UnregisterEvents()
    for i=1, #self.registeredEvents do
        local eventId = self.registeredEvents[i]
        self.control:UnregisterForEvent(eventId)
    end
    self.registeredEvents = {}
end
function ZO_CreateLinkLoading_Gamepad:SetImagesFragment(fragment)
    if fragment == self.imagesFragment then return end
    if self.imagesFragment then
        CREATE_LINK_LOADING_SCREEN_GAMEPAD_SCENE:RemoveFragment(self.imagesFragment)
    end
    if fragment then
        CREATE_LINK_LOADING_SCREEN_GAMEPAD_SCENE:AddFragment(fragment)
    end
    self.imagesFragment = fragment
end
function ZO_CreateLinkLoading_Gamepad:SetBackgroundFragment(fragment)
    if fragment == self.backgroundFragment then return end
    if self.backgroundFragment then
        CREATE_LINK_LOADING_SCREEN_GAMEPAD_SCENE:RemoveFragment(self.backgroundFragment)
    end
    if fragment then
        CREATE_LINK_LOADING_SCREEN_GAMEPAD_SCENE:AddFragment(fragment)
    end
    self.backgroundFragment = fragment
end
function ZO_CreateLinkLoading_Gamepad:Show(previousState, loginFunction, loadingText, backgroundFragment, imagesFragment)
    self.previousState = previousState
    self.loadingText:SetText(loadingText)
    if backgroundFragment then
        self:SetBackgroundFragment(backgroundFragment)
    end
    if imagesFragment then
        self:SetImagesFragment(imagesFragment)
    end
    SCENE_MANAGER:Show("CreateLinkLoadingScreen_Gamepad")
end
    CREATE_LINK_LOADING_SCREEN_GAMEPAD = ZO_CreateLinkLoading_Gamepad:New(self)
end