otclient-redemption/modules/client_entergame/createAccount.lua
2025-04-04 13:41:07 -03:00

825 lines
31 KiB
Lua

-- https://github.com/opentibiabr/myaac/pull/33/files
local MainWindowsCreateAccount = nil
local UIwidgetImagen = {
AccountData = nil,
AllData = nil,
CharacterData = nil
}
local UIComboBox = {
world = nil,
pvp = nil
}
local UITextEdit = {
email = nil,
password = nil,
repeatPassword = nil,
character = nil
}
local iconsCreateAccount = {
Password = nil,
Email = nil,
RepeatPassword = nil,
CheckBox = nil
}
local iconsCreateCharacter = {
Sex = nil,
RecommendedWorld = nil,
CharacterName = nil
}
local UITextList = {
listAllWorlds = nil
}
local UIlabel = {
RecommendedWorld = nil,
passwordSecurityLevel = nil,
titleMiniPanelWorld = nil
}
local globalInfo = {
email = "",
password = "",
characterName = "",
characterSex = "",
selectedWorld = ""
}
local toolstips = {
password = nil,
allExceptPassword = nil
}
local auxWidgets = {
worldDefault = nil
}
local Worlds = {}
local sexModeGroup = nil
-- /*=============================================
-- = http post // receive =
-- =============================================*/
local lastRequestTime = {}
local REQUEST_COOLDOWN = 500
local function reportRequestWarning(requestType, msg, errorCode)
g_logger.warning(("[Webscraping - %s] %s"):format(requestType, msg), errorCode)
end
local function handleHttpResponse(requestType, callback)
return function(message, err)
if err then
reportRequestWarning(requestType, requestType, "fx handleHttpResponse")
return callback(nil, err)
end
local json_part = message:match("{.*}")
if not json_part then
reportRequestWarning(requestType, "ERROR: JSON not found in the response", "fx handleHttpResponse")
return
end
local status, response = pcall(json.decode, json_part)
if not status then
if requestType == "getaccountcreationstatus" then
ensableBtnCreateNewAccount()
end
reportRequestWarning(requestType, "[HTTP] JSON decode error: " .. response, "fx handleHttpResponse")
return
end
if type(response) ~= "table" then
reportRequestWarning(requestType, "[HTTP] Invalid response format", "fx handleHttpResponse")
return
end
if not status then
reportRequestWarning(requestType, response, "fx handleHttpResponse")
return callback(nil, response)
end
return callback(response)
end
end
-- Account creation status request
local function getAccountCreationStatus(callback)
--[[ HTTP.addCustomHeader({
["Date"] = "Fri, 14 Feb 2025 22:13:09 GMT",
["Content-Type"] = "application/json; charset=utf-8",
["Content-Length"] = "3787",
["Connection"] = "keep-alive",
["content-security-policy"] = "frame-ancestors 'self';script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' *.tibia.com *.cipsoft.com *.cipsoft.de https://www.youtube.com https://platform.twitter.com https://www.paypal.com https://www.sandbox.paypal.com https://www.google.com https://s.ytimg.com https://www.gstatic.com https://www.googletagmanager.com https://googleads.g.doubleclick.net;connect-src 'self' *.tibia.com *.cipsoft.com *.cipsoft.de https://rpc.walletconnect.com https://rpc.walletconnect.org https://explorer-api.walletconnect.com https://explorer-api.walletconnect.org https://relay.walletconnect.com https://relay.walletconnect.org wss://relay.walletconnect.com wss://relay.walletconnect.org https://pulse.walletconnect.com https://pulse.walletconnect.org https://api.web3modal.com https://api.web3modal.org https://keys.walletconnect.com https://keys.walletconnect.org https://notify.walletconnect.com https://notify.walletconnect.org https://echo.walletconnect.com https://echo.walletconnect.org https://push.walletconnect.com https://push.walletconnect.org wss://www.walletlink.org https://bsc-dataseed.binance.org/;",
["x-content-security-policy"] = "frame-ancestors 'self';script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' *.tibia.com *.cipsoft.com *.cipsoft.de https://www.youtube.com https://platform.twitter.com https://www.paypal.com https://www.sandbox.paypal.com https://www.google.com https://s.ytimg.com https://www.gstatic.com https://www.googletagmanager.com https://googleads.g.doubleclick.net;connect-src 'self' *.tibia.com *.cipsoft.com *.cipsoft.de https://rpc.walletconnect.com https://rpc.walletconnect.org https://explorer-api.walletconnect.com https://explorer-api.walletconnect.org https://relay.walletconnect.com https://relay.walletconnect.org wss://relay.walletconnect.com wss://relay.walletconnect.org https://pulse.walletconnect.com https://pulse.walletconnect.org https://api.web3modal.com https://api.web3modal.org https://keys.walletconnect.com https://keys.walletconnect.org https://notify.walletconnect.com https://notify.walletconnect.org https://echo.walletconnect.com https://echo.walletconnect.org https://push.walletconnect.com https://push.walletconnect.org wss://www.walletlink.org https://bsc-dataseed.binance.org/;",
["x-webkit-csp"] = "frame-ancestors 'self';script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' *.tibia.com *.cipsoft.com *.cipsoft.de https://www.youtube.com https://platform.twitter.com https://www.paypal.com https://www.sandbox.paypal.com https://www.google.com https://s.ytimg.com https://www.gstatic.com https://www.googletagmanager.com https://googleads.g.doubleclick.net;connect-src 'self' *.tibia.com *.cipsoft.com *.cipsoft.de https://rpc.walletconnect.com https://rpc.walletconnect.org https://explorer-api.walletconnect.com https://explorer-api.walletconnect.org https://relay.walletconnect.com https://relay.walletconnect.org wss://relay.walletconnect.com wss://relay.walletconnect.org https://pulse.walletconnect.com https://pulse.walletconnect.org https://api.web3modal.com https://api.web3modal.org https://keys.walletconnect.com https://keys.walletconnect.org https://notify.walletconnect.com https://notify.walletconnect.org https://echo.walletconnect.com https://echo.walletconnect.org https://push.walletconnect.com https://push.walletconnect.org wss://www.walletlink.org https://bsc-dataseed.binance.org/;",
["strict-transport-security"] = "max-age=15552000;",
["vary"] = "Accept-Encoding",
["Content-Encoding"] = "gzip",
["CF-Cache-Status"] = "DYNAMIC",
["Server"] = "cloudflare",
["CF-RAY"] = "91206759bef5b440-SCL",
["alt-svc"] = 'h3=":443"; ma=86400'
}) ]]
HTTP.post(Services.createAccount, json.encode({
type = "getaccountcreationstatus"
}), handleHttpResponse("getaccountcreationstatus", callback), false)
--[[
{
["RecommendedWorld"] = "Ustebra",
["IsCaptchaDeactivated"] = false,
["Worlds"] = {
[1] = {
["Region"] = "North America",
["BattlEyeActivationTimestamp"] = 1729065600,
["PremiumOnly"] = 0,
["BattlEyeInitiallyActive"] = 1,
["TransferType"] = "Blocked",
["PvPType"] = "Open PvP",
["PlayersOnline"] = 32,
["Name"] = "Aethera",
["CreationDate"] = 1729065600
},
[2] = {
["Region"] = "South America",
["BattlEyeActivationTimestamp"] = 1697616000,
["PremiumOnly"] = 0,
["BattlEyeInitiallyActive"] = 1,
["TransferType"] = "Blocked",
["PvPType"] = "Retro Open PvP",
["PlayersOnline"] = 38,
["Name"] = "Ambra",
["CreationDate"] = 1697616000
},
[3] = {
["Region"] = "Europe",
["BattlEyeActivationTimestamp"] = 1503993600,
["PremiumOnly"] = 0,
["BattlEyeInitiallyActive"] = 0,
["TransferType"] = "Standard",
["PvPType"] = "Open PvP",
["PlayersOnline"] = 271,
["Name"] = "Antica",
["CreationDate"] = 852109200
},
}
} ]]
end
local function generateCharacterName(callback)
HTTP.post(Services.createAccount, json.encode({
type = "generatecharactername"
}), handleHttpResponse("generatecharactername", callback), false)
end
local function checkCharacterName(name, callback)
HTTP.post(Services.createAccount, json.encode({
type = "checkcharactername",
CharacterName = name
}), handleHttpResponse("checkcharactername", callback), false)
--[[
{
["CharacterName"] = "asdasd",
["errorCode"] = 99,
["IsAvailable"] = false,
["errorMessage"] = "The first letter of a name has to be a capital letter."
} ]]
end
local function checkEmail(email, callback)
HTTP.post(Services.createAccount, json.encode({
type = "checkemail",
Email = email
}), handleHttpResponse("checkemail", callback), false)
--[[
{
["errorCode"] = 59,
["EMail"] = "asdasd",
["errorMessage"] = "This email address has an invalid format. Please enter a correct email address!"
} ]]
end
local function checkPassword(password, callback)
HTTP.post(Services.createAccount, json.encode({
type = "checkpassword",
Password1 = password
}), handleHttpResponse("checkpassword", callback), false)
--[[ {
["PasswordStrength"] = 0,
["PasswordStrengthColor"] = "#EC644B",
["PasswordValid"] = false,
["PasswordRequirements"] = {
["HasUpperCase"] = false,
["HasNumber"] = false,
["PasswordLength"] = false,
["InvalidCharacters"] = true,
["HasLowerCase"] = true
},
["Password1"] = "asdasd"
} ]]
end
local function createAccountAndCharacter(array, callback)
HTTP.post(Services.createAccount, json.encode({
type = "createaccountandcharacter",
EMail = array.email,
Password = array.password,
CharacterName = array.characterName,
CharacterSex = array.characterSex
}), handleHttpResponse("createaccountandcharacter", callback), false)
end
-- /*=============================================
-- = successfull Check =
-- =============================================*/
local function checkAllRequirements()
local function allWidgetsEnabled(widgets)
for _, widget in pairs(widgets) do
if not widget:isEnabled() then
return false
end
end
return true
end
local createAccountPassed = allWidgetsEnabled(iconsCreateAccount)
local createYourCharacterPassed = allWidgetsEnabled(iconsCreateCharacter)
UIwidgetImagen.AccountData:setEnabled(createAccountPassed)
UIwidgetImagen.AllData:setEnabled(createAccountPassed and createYourCharacterPassed)
UIwidgetImagen.CharacterData:setEnabled(createYourCharacterPassed)
return createAccountPassed and createYourCharacterPassed
end
local function updateButtonState(button)
button:setEnabled(checkAllRequirements())
end
local function setRequirementState(widget, enabled, widgetError, errorMessage)
widget:setEnabled(enabled)
updateButtonState(MainWindowsCreateAccount.createAccount.buttonStartPlaying)
if widgetError then
local errorWidget = toolstips.allExceptPassword:getChildById(widgetError:getId())
errorWidget:setVisible(not enabled)
if errorMessage then
errorWidget:setText(errorMessage)
else
errorWidget:setVisible(false)
end
end
end
local function updatePasswordRequirements(response)
if not response or not response.PasswordRequirements then
return
end
local requirements = response.PasswordRequirements
local requirementsPanel = toolstips.password
local allRequirementsPassed = true
if requirementsPanel then
for requirement, value in pairs(requirements) do
local reqPanel = requirementsPanel:getChildById(requirement)
if reqPanel then
local icon = reqPanel:getChildById('icons')
if icon then
icon:setEnabled(value)
end
end
if not value then
allRequirementsPassed = false
end
end
end
setRequirementState(iconsCreateAccount.Password, allRequirementsPassed)
end
local function handleTextChange(widget, requestType, validationFunc)
local currentTime = g_clock.millis()
local lastTime = lastRequestTime[widget:getId()] or 0
local text = widget:getText()
if #text == 0 then
return
end
local processResponse = function(response, err)
if err then
widget:setColor("#EC644B")
return
end
local isValid = (requestType == "email" and not response.errorCode) or
(requestType == "character" and response.IsAvailable) or
(requestType == "password" and response.PasswordValid)
widget:setColor(isValid and "#76EE00" or "#EC644B")
if requestType == "password" then
updatePasswordRequirements(response)
elseif requestType == "character" then
setRequirementState(iconsCreateCharacter.CharacterName, response.IsAvailable, widget, response.errorMessage)
elseif requestType == "email" then
setRequirementState(iconsCreateAccount.Email, response.IsValid, widget, response.errorMessage)
end
end
if currentTime - lastTime < REQUEST_COOLDOWN then
if widget.pendingEvent then
removeEvent(widget.pendingEvent)
widget.pendingEvent = nil
end
widget.pendingEvent = scheduleEvent(function()
lastRequestTime[widget:getId()] = g_clock.millis()
validationFunc(text, processResponse)
end, REQUEST_COOLDOWN)
else
lastRequestTime[widget:getId()] = currentTime
validationFunc(text, processResponse)
end
end
-- /*=============================================
-- = onXXXXChangeEvent =
-- =============================================*/
local function onFocusChange(focused, reason)
if #focused:getText() == 0 then
return
end
local focusedId = focused:getId()
if focusedId == "textEditPassword" then
toolstips.password:setVisible(reason)
return
end
-- test
local tooltip = toolstips.allExceptPassword:getChildById(focusedId)
local shouldHide = false
if focusedId == "textEditEmail" and iconsCreateAccount.Email:isEnabled() then
shouldHide = true
elseif focusedId == "textEditRepeatPassword" and iconsCreateAccount.RepeatPassword:isEnabled() then
shouldHide = true
elseif focusedId == "textEditCharacter" and iconsCreateAccount.CheckBox:isEnabled() then
shouldHide = true
end
if shouldHide then
tooltip:setVisible(false)
else
tooltip:setVisible(reason)
end
end
local function behavioronFocusChange()
for _, field in pairs(UITextEdit) do
field.onFocusChange = onFocusChange
end
end
local function behavioronTextChange()
UITextEdit.email.onTextChange = function(widget, text)
widget:setColor("#FFFFFF")
handleTextChange(widget, "email", checkEmail)
if #text == 0 then
setRequirementState(iconsCreateAccount.Email, false, widget, false)
end
end
UITextEdit.password.onTextChange = function(widget, text)
widget:setColor("#FFFFFF")
handleTextChange(widget, "password", checkPassword)
if #text == 0 then
setRequirementState(iconsCreateAccount.Password, false)
local reqPanel = toolstips.password
if reqPanel then
for _, child in ipairs(reqPanel:getChildren()) do
local icon = child:getChildById('icons')
if icon then
icon:disable()
end
end
end
end
toolstips.password:setVisible(#text ~= 0)
local repeatPassword = UITextEdit.repeatPassword:getText()
if #repeatPassword > 0 then
setRequirementState(iconsCreateAccount.RepeatPassword, repeatPassword == text)
UITextEdit.repeatPassword:setColor(repeatPassword == text and "#76EE00" or "#EC644B")
end
end
UITextEdit.repeatPassword.onTextChange = function(widget, text)
local password = UITextEdit.password:getText()
if #password == 0 then
widget:setColor("#FFFFFF")
return
end
local passwordRepeat = widget:getText()
if #passwordRepeat == 0 then
toolstips.allExceptPassword:getChildById("textEditRepeatPassword"):setVisible(false)
return
end
local matches = text == password
widget:setColor(matches and "#76EE00" or "#EC644B")
setRequirementState(iconsCreateAccount.RepeatPassword, matches, widget, "The two passwords do not match!")
end
UITextEdit.character.onTextChange = function(widget, text)
local filteredText = text:gsub("[^a-zA-Z ]", "")
if filteredText ~= text then
widget:setText(filteredText)
return
end
widget:setColor("#FFFFFF")
handleTextChange(widget, "character", checkCharacterName)
if #filteredText == 0 then
setRequirementState(iconsCreateCharacter.CharacterName, false, widget, false)
end
end
end
local function behavioronCheckChange()
MainWindowsCreateAccount.createAccount.createYourAccount.panelCheckBox.checkboxPrivacy.onCheckChange =
function(a, b)
setRequirementState(a:getParent():getChildById('icons'), b)
end
end
-- /*=============================================
-- = onClick - Create Your Account =
-- =============================================*/
function toggleCreateAccount(bool)
if bool then
EnterGame.show()
destroyCreateAccount()
else
EnterGame.hide()
createWidgetAccount()
end
end
function onClickStartPlaying()
local uiElements = {UITextEdit.email, UITextEdit.password, UITextEdit.character, UITextEdit.repeatPassword}
for _, element in ipairs(uiElements) do
element:disable()
end
globalInfo.email = UITextEdit.email:getText()
globalInfo.password = UITextEdit.password:getText()
globalInfo.characterName = UITextEdit.character:getText()
globalInfo.characterSex = sexModeGroup:getSelectedWidget():getText():lower()
-- globalInfo.selectedWorld
createAccountAndCharacter(globalInfo, function(data, err)
for _, element in ipairs(uiElements) do
element:enable()
end
if err or not data then
reportRequestWarning("createAccountAndCharacter", err, "fx onClickStartPlaying")
return
end
if data.Success then
if not CharacterList.isVisible() then
local account = g_crypt.encrypt(globalInfo.email)
local password = g_crypt.encrypt(globalInfo.password)
-- g_settings.set('account', account)
-- g_settings.set('password', password)
EnterGame.setAccountName(account)
EnterGame.setPassword(password)
EnterGame.doLogin()
destroyCreateAccount()
end
else
reportRequestWarning("createAccountAndCharacter", data.errorMessage, "fx onClickStartPlaying")
end
end)
end
function onClickSuggestName()
generateCharacterName(function(data, err)
if err or not data then
reportRequestWarning("generatecharactername", err, "fx onClickSuggestName")
return
end
UITextEdit.character:setText(data.GeneratedName)
end)
end
-- /*=============================================
-- = Panel game world to play on =
-- =============================================*/
local function findWorldByName(name)
for _, world in pairs(Worlds) do
if world.Name:lower() == name:lower() then
return world
end
end
return nil
end
local function filterWorldsList()
local selectedRegion = UIComboBox.world:getCurrentOption().text
local selectedPvpType = UIComboBox.pvp:getCurrentOption().text
local index = 0
for _, widget in pairs(UITextList.listAllWorlds:getChildren()) do
local world = findWorldByName(widget:getId())
local regionMatch = selectedRegion == "All" or world.Region == selectedRegion
local pvpMatch = selectedPvpType == "All" or world.PvPType == selectedPvpType
local visible = regionMatch and pvpMatch
widget:setVisible(visible)
if visible then
index = index + 1
widget:setBackgroundColor(index % 2 == 0 and "#ffffff12" or "#00000012")
end
end
end
local function updateWorldInformation(widget)
local world = findWorldByName(widget:getId())
UIlabel.titleMiniPanelWorld:setText(world.Name)
for key, value in pairs(world) do
local w = UIlabel.titleMiniPanelWorld:recursiveGetChildById(key)
if w then
if key == "CreationDate" then
w:setText(os.date("%b. %Y", value))
elseif key == "PremiumOnly" then
w:setText(tostring(value == 1))
elseif key == "BattlEyeActivationTimestamp" then
local description =
world.BattlEyeInitiallyActive == 1 and "initially protected" or "protected since " ..
os.date("%b.%Y", value)
w:setText(description)
else
w:setText(value)
end
end
end
end
local function initializeWorldsList(worlds)
local sortedWorlds = {}
for _, world in pairs(worlds) do
table.insert(sortedWorlds, world)
end
table.sort(sortedWorlds, function(a, b)
return a.Name < b.Name
end)
UITextList.listAllWorlds:destroyChildren()
Worlds = worlds
local regions = {
["All"] = true
}
local pvpTypes = {
["All"] = true
}
local focusLabel
for i, world in ipairs(sortedWorlds) do
local widget = g_ui.createWidget('WorldWidget', UITextList.listAllWorlds)
widget:setId(world.Name)
widget:getChildById('details'):setText(world.Name)
widget:setBackgroundColor(i % 2 == 0 and "#ffffff12" or "#00000012")
if i == 1 then
focusLabel = widget
end
if world.Name:lower() == globalInfo.selectedWorld:lower() then
auxWidgets.worldDefault = widget
end
regions[world.Region] = true
pvpTypes[world.PvPType] = true
end
if focusLabel then
scheduleEvent(function()
UITextList.listAllWorlds:focusChild(focusLabel, KeyboardFocusReason)
UITextList.listAllWorlds:ensureChildVisible(focusLabel)
end, 50)
end
connect(UITextList.listAllWorlds, {
onChildFocusChange = function(self, focusedChild)
if focusedChild then
updateWorldInformation(focusedChild)
end
end
})
UIComboBox.world:clearOptions()
UIComboBox.world:addOption("All")
for region in pairs(regions) do
if region ~= "All" then
UIComboBox.world:addOption(region)
end
end
UIComboBox.pvp:clearOptions()
UIComboBox.pvp:addOption("All")
for pvpType in pairs(pvpTypes) do
if pvpType ~= "All" then
UIComboBox.pvp:addOption(pvpType)
end
end
UIComboBox.world.onOptionChange = filterWorldsList
UIComboBox.pvp.onOptionChange = filterWorldsList
end
-- /*=============================================
-- = OnClick Select a game world to play on =
-- =============================================*/
function onClickResetGameWorld()
if auxWidgets.worldDefault then
UITextList.listAllWorlds:focusChild(auxWidgets.worldDefault, KeyboardFocusReason)
UITextList.listAllWorlds:ensureChildVisible(auxWidgets.worldDefault)
end
end
function toggleMainPanels(bool)
MainWindowsCreateAccount.createAccount:setVisible(not bool)
MainWindowsCreateAccount.mainPanelSelectAGameWorldToPlayOn:setVisible(bool)
if bool then
MainWindowsCreateAccount:setHeight(350)
else
MainWindowsCreateAccount:setHeight(390)
end
end
function onClickOkChangeWorld()
toggleMainPanels(false)
globalInfo.selectedWorld = UIlabel.titleMiniPanelWorld:getText()
UIlabel.RecommendedWorld:setText(globalInfo.selectedWorld)
UIlabel.RecommendedWorld:setText(string.format("%s (%s)", globalInfo.selectedWorld,
findWorldByName(globalInfo.selectedWorld).Region))
end
-- /*=============================================
-- = onInit =
-- =============================================*/
function createWidgetAccount()
if not MainWindowsCreateAccount then
getAccountCreationStatus(function(data, err)
ensableBtnCreateNewAccount()
if err or not data then
reportRequestWarning("getaccountcreationstatus", err, "fx createWidgetAccount")
return
end
MainWindowsCreateAccount = g_ui.displayUI('createAccount')
-- LuaFormatter off
UIwidgetImagen.AccountData = MainWindowsCreateAccount.imagesBanner.accountdatainvalid
UIwidgetImagen.AllData = MainWindowsCreateAccount.imagesBanner.banneralldatainvalid
UIwidgetImagen.CharacterData = MainWindowsCreateAccount.imagesBanner.bannercharacterdatainvalid
UIlabel.RecommendedWorld = MainWindowsCreateAccount.createAccount.createYourCharacter.panelRecommendedWorld.worldLabel
sexModeGroup = UIRadioGroup.create()
sexModeGroup:addWidget(MainWindowsCreateAccount.createAccount.createYourCharacter.panelSex.Male)
sexModeGroup:addWidget(MainWindowsCreateAccount.createAccount.createYourCharacter.panelSex.Female)
-- sexModeGroup.onSelectionChange = sexModeChange
sexModeGroup:selectWidget(MainWindowsCreateAccount.createAccount.createYourCharacter.panelSex.Male)
-- world
UIComboBox.world = MainWindowsCreateAccount.mainPanelSelectAGameWorldToPlayOn.panelSelectAGameWorldToPlayOn.panelSelectworldAndPvp.comboBoxWorld
UIComboBox.pvp = MainWindowsCreateAccount.mainPanelSelectAGameWorldToPlayOn.panelSelectAGameWorldToPlayOn.panelSelectworldAndPvp.comboBoxPvp
UITextList.listAllWorlds = MainWindowsCreateAccount.mainPanelSelectAGameWorldToPlayOn.panelSelectAGameWorldToPlayOn.textListAllWorlds
UIlabel.titleMiniPanelWorld = MainWindowsCreateAccount.mainPanelSelectAGameWorldToPlayOn.panelSelectAGameWorldToPlayOn.worldInfo
-- icons Account
iconsCreateAccount.Password = MainWindowsCreateAccount.createAccount.createYourAccount.panelPassword.icons
iconsCreateAccount.Email = MainWindowsCreateAccount.createAccount.createYourAccount.panelEmail.icons
iconsCreateAccount.RepeatPassword = MainWindowsCreateAccount.createAccount.createYourAccount.panelRepeatPassword.icons
iconsCreateAccount.CheckBox = MainWindowsCreateAccount.createAccount.createYourAccount.panelCheckBox.icons
-- icons Characters
iconsCreateCharacter.Sex = MainWindowsCreateAccount.createAccount.createYourCharacter.panelSex.icons
iconsCreateCharacter.RecommendedWorld = MainWindowsCreateAccount.createAccount.createYourCharacter.panelRecommendedWorld.icons
iconsCreateCharacter.CharacterName = MainWindowsCreateAccount.createAccount.createYourCharacter.panelCharacterName.icons
-- Tooltips Password
toolstips.allExceptPassword = MainWindowsCreateAccount.createAccount.testToolstips
toolstips.password = MainWindowsCreateAccount.createAccount.passwordRequirements
-- Input TextEdit
UITextEdit.email = MainWindowsCreateAccount.createAccount.test.textEditEmail
UITextEdit.password = MainWindowsCreateAccount.createAccount.test.textEditPassword
UITextEdit.repeatPassword = MainWindowsCreateAccount.createAccount.test.textEditRepeatPassword
UITextEdit.character = MainWindowsCreateAccount.createAccount.test.textEditCharacter
-- LuaFormatter on
globalInfo.selectedWorld = data.RecommendedWorld
initializeWorldsList(data.Worlds)
UIlabel.RecommendedWorld:setText(string.format("%s (%s)", data.RecommendedWorld,
findWorldByName(data.RecommendedWorld).Region))
behavioronTextChange()
behavioronFocusChange()
behavioronCheckChange()
end)
else
MainWindowsCreateAccount:show()
ensableBtnCreateNewAccount()
end
end
-- /*=============================================
-- = onTerminate =
-- =============================================*/
function destroyCreateAccount()
if MainWindowsCreateAccount then
for _, widget in pairs(UIwidgetImagen or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
widget = nil
end
end
UIwidgetImagen = {}
for _, widget in pairs(auxWidgets or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
widget = nil
end
end
auxWidgets = {}
if sexModeGroup then
sexModeGroup:destroy()
sexModeGroup = nil
end
for _, widget in pairs(UIComboBox or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
widget = nil
end
end
UIComboBox = {}
for _, widget in pairs(UITextEdit or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
widget = nil
end
end
UITextEdit = {}
for _, widget in pairs(iconsCreateAccount or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
widget = nil
end
end
iconsCreateAccount = {}
for _, widget in pairs(iconsCreateCharacter or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
widget = nil
end
end
iconsCreateCharacter = {}
if UITextList.listAllWorlds then
disconnect(UITextList.listAllWorlds, {
onChildFocusChange = function(self, focusedChild)
if focusedChild == nil then
return
end
updateWorldInformation(focusedChild)
end
})
UITextList.listAllWorlds:destroyChildren()
UITextList.listAllWorlds:destroy()
UITextList.listAllWorlds = nil
end
for _, widget in pairs(UIlabel or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
widget = nil
end
end
UIlabel = {}
for _, widget in pairs(toolstips or {}) do
if widget and not widget:isDestroyed() then
widget:destroy()
end
end
toolstips = {}
if not MainWindowsCreateAccount:isDestroyed() then
MainWindowsCreateAccount:destroy()
MainWindowsCreateAccount = nil
end
Worlds = {}
lastRequestTime = {}
end
end