otclient-redemption/modules/client_entergame/entergame.lua
Goosey e666630545
fix: event schedule (#1190)
Basic validation for the data to avoid problems with responses.

Co-authored-by: kokekanon <114332266+kokekanon@users.noreply.github.com>
2025-06-11 19:57:39 -03:00

878 lines
27 KiB
Lua

EnterGame = {}
-- private variables
local loadBox
local enterGame
local motdWindow
local enterGameButton
local clientBox
local protocolLogin
local motdEnabled = true
-- private functions
local function onError(protocol, message, errorCode)
if loadBox then
loadBox:destroy()
loadBox = nil
end
if not errorCode then
EnterGame.clearAccountFields()
end
local errorBox = displayErrorBox(tr('Login Error'), message)
connect(errorBox, {
onOk = EnterGame.show
})
end
local function onMotd(protocol, motd)
G.motdNumber = tonumber(motd:sub(0, motd:find('\n')))
G.motdMessage = motd:sub(motd:find('\n') + 1, #motd)
end
local function onSessionKey(protocol, sessionKey)
G.sessionKey = sessionKey
end
local function onCharacterList(protocol, characters, account, otui)
local httpLogin = enterGame:getChildById('httpLoginBox'):isChecked()
-- Try add server to the server list
ServerList.add(G.host, G.port, g_game.getClientVersion(), httpLogin)
-- Save 'Stay logged in' setting
g_settings.set('staylogged', enterGame:getChildById('stayLoggedBox'):isChecked())
g_settings.set('httpLogin', httpLogin)
if enterGame:getChildById('rememberEmailBox'):isChecked() then
local account = g_crypt.encrypt(G.account)
local password = g_crypt.encrypt(G.password)
g_settings.set('account', account)
g_settings.set('password', password)
ServerList.setServerAccount(G.host, account)
ServerList.setServerPassword(G.host, password)
g_settings.set('autologin', enterGame:getChildById('autoLoginBox'):isChecked())
else
-- reset server list account/password
ServerList.setServerAccount(G.host, '')
ServerList.setServerPassword(G.host, '')
EnterGame.clearAccountFields()
end
if loadBox then
loadBox:destroy()
loadBox = nil
end
for _, characterInfo in pairs(characters) do
if characterInfo.previewState and characterInfo.previewState ~= PreviewState.Default then
characterInfo.worldName = characterInfo.worldName .. ', Preview'
end
end
CharacterList.create(characters, account, otui)
CharacterList.show()
if motdEnabled then
local lastMotdNumber = g_settings.getNumber('motd')
if G.motdNumber and G.motdNumber ~= lastMotdNumber then
g_settings.set('motd', G.motdNumber)
motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
connect(motdWindow, {
onOk = function()
CharacterList.show()
motdWindow = nil
end
})
CharacterList.hide()
end
end
end
local function onUpdateNeeded(protocol, signature)
if loadBox then
loadBox:destroy()
loadBox = nil
end
if EnterGame.updateFunc then
local continueFunc = EnterGame.show
local cancelFunc = EnterGame.show
EnterGame.updateFunc(signature, continueFunc, cancelFunc)
else
local errorBox = displayErrorBox(tr('Update needed'), tr('Your client needs updating, try redownloading it.'))
connect(errorBox, {
onOk = EnterGame.show
})
end
end
local function updateLabelText()
if enterGame:getChildById('clientComboBox') and tonumber(enterGame:getChildById('clientComboBox'):getText()) > 1080 then
enterGame:setText("Journey Onwards")
enterGame:getChildById('emailLabel'):setText("Email:")
enterGame:getChildById('rememberEmailBox'):setText("Remember Email:")
else
enterGame:setText("Enter Game")
enterGame:getChildById('emailLabel'):setText("Acc Name:")
enterGame:getChildById('rememberEmailBox'):setText("Remember password:")
end
end
-- public functions
function EnterGame.init()
enterGame = g_ui.displayUI('entergame')
Keybind.new("Misc.", "Change Character", "Ctrl+G", "")
Keybind.bind("Misc.", "Change Character", {
{
type = KEY_DOWN,
callback = EnterGame.openWindow,
}
})
local account = g_settings.get('account')
local password = g_settings.get('password')
local host = g_settings.get('host')
local port = g_settings.get('port')
local stayLogged = g_settings.getBoolean('staylogged')
local autologin = g_settings.getBoolean('autologin')
local httpLogin = g_settings.getBoolean('httpLogin')
local clientVersion = g_settings.getInteger('client-version')
if not clientVersion or clientVersion == 0 then
clientVersion = 860
end
if not port or port == 0 then
port = 7171
end
EnterGame.setAccountName(account)
EnterGame.setPassword(password)
enterGame:getChildById('serverHostTextEdit'):setText(host)
enterGame:getChildById('serverPortTextEdit'):setText(port)
enterGame:getChildById('autoLoginBox'):setChecked(autologin)
enterGame:getChildById('stayLoggedBox'):setChecked(stayLogged)
enterGame:getChildById('httpLoginBox'):setChecked(httpLogin)
local installedClients = {}
local amountInstalledClients = 0
for _, dirItem in ipairs(g_resources.listDirectoryFiles('/data/things/')) do
if tonumber(dirItem) then
installedClients[dirItem] = true
amountInstalledClients = amountInstalledClients + 1
end
end
clientBox = enterGame:getChildById('clientComboBox')
for _, proto in pairs(g_game.getSupportedClients()) do
local protoStr = tostring(proto)
if installedClients[protoStr] or amountInstalledClients == 0 then
installedClients[protoStr] = nil
clientBox:addOption(proto)
end
end
for protoStr, status in pairs(installedClients) do
if status then
print(string.format('Warning: %s recognized as an installed client, but not supported.', protoStr))
end
end
clientBox:setCurrentOption(clientVersion)
connect(clientBox, {
onOptionChange = EnterGame.onClientVersionChange
})
if Servers_init then
if table.size(Servers_init) == 1 then
local hostInit, valuesInit = next(Servers_init)
EnterGame.setUniqueServer(hostInit, valuesInit.port, valuesInit.protocol)
EnterGame.setHttpLogin(valuesInit.httpLogin)
elseif not host or host == "" then
local hostInit, valuesInit = next(Servers_init)
EnterGame.setDefaultServer(hostInit, valuesInit.port, valuesInit.protocol)
EnterGame.setHttpLogin(valuesInit.httpLogin)
end
else
EnterGame.toggleAuthenticatorToken(clientVersion, true)
EnterGame.toggleStayLoggedBox(clientVersion, true)
end
updateLabelText()
enterGame:hide()
connect(g_game, {
onGameStart = EnterGame.hidePanels
})
connect(g_game, {
onGameEnd = EnterGame.showPanels
})
if g_app.isRunning() and not g_game.isOnline() then
enterGame:show()
end
end
function EnterGame.hidePanels()
if g_modules.getModule("client_bottommenu"):isLoaded() then
modules.client_bottommenu.hide()
end
modules.client_topmenu.hide()
end
function EnterGame.showPanels()
if g_modules.getModule("client_bottommenu"):isLoaded() then
modules.client_bottommenu.show()
end
modules.client_topmenu.show()
end
function EnterGame.firstShow()
EnterGame.show()
local account = g_crypt.decrypt(g_settings.get('account'))
local password = g_crypt.decrypt(g_settings.get('password'))
local host = g_settings.get('host')
local autologin = g_settings.getBoolean('autologin')
if #host > 0 and #password > 0 and #account > 0 and autologin then
addEvent(function()
if not g_settings.getBoolean('autologin') then
return
end
EnterGame.doLogin()
end)
end
if Services and Services.status then
if g_modules.getModule("client_bottommenu"):isLoaded() then
EnterGame.postCacheInfo()
EnterGame.postEventScheduler()
-- EnterGame.postShowOff() -- myacc/znote no send login.php
EnterGame.postShowCreatureBoost()
end
end
end
function EnterGame.terminate()
Keybind.delete("Misc.", "Change Character")
disconnect(clientBox, {
onOptionChange = EnterGame.onClientVersionChange
})
disconnect(g_game, {
onGameStart = EnterGame.hidePanels
})
disconnect(g_game, {
onGameEnd = EnterGame.showPanels
})
if enterGame then
enterGame:destroy()
enterGame = nil
end
if clientBox then
clientBox = nil
end
if motdWindow then
motdWindow:destroy()
motdWindow = nil
end
if loadBox then
loadBox:destroy()
loadBox = nil
end
if protocolLogin then
protocolLogin:cancelLogin()
protocolLogin = nil
end
EnterGame = nil
end
local function reportRequestWarning(requestType, msg, errorCode)
g_logger.warning(("[Webscraping - %s] %s"):format(requestType, msg), errorCode)
end
function EnterGame.postCacheInfo()
local requestType = 'cacheinfo'
local onRecvInfo = function(message, err)
if err then
-- onError(nil, 'Bad Request. Game_entergame postCacheInfo1 ', 400)
reportRequestWarning(requestType, "Bad Request. Game_entergame postCacheInfo1")
return
end
local jsonString = message:match("{.*}")
if not jsonString then
reportRequestWarning(requestType, "Invalid JSON response format")
return
end
local success, response = pcall(function() return json.decode(jsonString) end)
if not success or not response then
reportRequestWarning(requestType, "Failed to parse JSON response")
return
end
if response.errorMessage then
reportRequestWarning(requestType, response.errorMessage, response.errorCode)
return
end
modules.client_topmenu.setPlayersOnline(response.playersonline)
modules.client_topmenu.setDiscordStreams(response.discord_online)
modules.client_topmenu.setYoutubeStreams(response.gamingyoutubestreams)
modules.client_topmenu.setYoutubeViewers(response.gamingyoutubeviewer)
modules.client_topmenu.setLinkYoutube(response.youtube_link)
modules.client_topmenu.setLinkDiscord(response.discord_link)
end
HTTP.post(Services.status, json.encode({
type = requestType
}), onRecvInfo, false)
end
function EnterGame.postEventScheduler()
local requestType = 'eventschedule'
local onRecvInfo = function(message, err)
if err then
reportRequestWarning(requestType, "Bad Request.Game_entergame postEventScheduler1")
return
end
local jsonString = message:match("{.*}")
if not jsonString then
reportRequestWarning(requestType, "Invalid JSON response format")
return
end
local success, response = pcall(function() return json.decode(jsonString) end)
if not success or not response then
reportRequestWarning(requestType, "Failed to parse JSON response")
return
end
if response.errorMessage then
reportRequestWarning(requestType, response.errorMessage, response.errorCode)
return
end
modules.client_bottommenu.setEventsSchedulerTimestamp(response.lastupdatetimestamp)
modules.client_bottommenu.setEventsSchedulerCalender(response.eventlist)
end
HTTP.post(Services.status, json.encode({
type = requestType
}), onRecvInfo, false)
end
function EnterGame.postShowOff()
local requestType = 'showoff'
local onRecvInfo = function(message, err)
if err then
reportRequestWarning(requestType, "Bad Request.Game_entergame postShowOff")
return
end
local jsonString = message:match("{.*}")
if not jsonString then
reportRequestWarning(requestType, "Invalid JSON response format")
return
end
local success, response = pcall(function() return json.decode(jsonString) end)
if not success or not response then
reportRequestWarning(requestType, "Failed to parse JSON response")
return
end
if response.errorMessage then
reportRequestWarning(requestType, response.errorMessage, response.errorCode)
return
end
modules.client_bottommenu.setShowOffData(response)
end
HTTP.post(Services.status, json.encode({
type = requestType
}), onRecvInfo, false)
end
function EnterGame.postShowCreatureBoost()
local requestType = 'boostedcreature'
local onRecvInfo = function(message, err)
if err then
-- onError(nil, 'Bad Request. 1 Game_entergame postShowCreatureBoost', 400)
reportRequestWarning(requestType, "Bad Request.Game_entergame postShowCreatureBoost1")
return
end
local jsonString = message:match("{.*}")
if not jsonString then
reportRequestWarning(requestType, "Invalid JSON response format")
return
end
local success, response = pcall(function() return json.decode(jsonString) end)
if not success or not response then
reportRequestWarning(requestType, "Failed to parse JSON response")
return
end
if response.errorMessage then
reportRequestWarning(requestType, response.errorMessage, response.errorCode)
return
end
modules.client_bottommenu.setBoostedCreatureAndBoss(response)
end
HTTP.post(Services.status, json.encode({
type = requestType
}), onRecvInfo, false)
end
function EnterGame.show()
if g_game.isOnline() or CharacterList.isVisible() then -- fix login quickly error (http post)
return
end
if loadBox then
return
end
enterGame:show()
enterGame:raise()
enterGame:focus()
end
function EnterGame.hide()
enterGame:hide()
end
function EnterGame.openWindow()
if g_game.isOnline() then
CharacterList.show()
elseif not g_game.isLogging() and not CharacterList.isVisible() then
EnterGame.show()
end
end
function EnterGame.setAccountName(account)
local account = g_crypt.decrypt(account)
enterGame:getChildById('accountNameTextEdit'):setText(account)
enterGame:getChildById('accountNameTextEdit'):setCursorPos(-1)
enterGame:getChildById('rememberEmailBox'):setChecked(#account > 0)
end
function EnterGame.setPassword(password)
local password = g_crypt.decrypt(password)
enterGame:getChildById('accountPasswordTextEdit'):setText(password)
end
function EnterGame.setHttpLogin(httpLogin)
if type(httpLogin) == "boolean" then
enterGame:getChildById('httpLoginBox'):setChecked(httpLogin)
else
enterGame:getChildById('httpLoginBox'):setChecked(#httpLogin > 0)
end
end
function EnterGame.clearAccountFields()
enterGame:getChildById('accountNameTextEdit'):clearText()
enterGame:getChildById('accountPasswordTextEdit'):clearText()
enterGame:getChildById('authenticatorTokenTextEdit'):clearText()
enterGame:getChildById('accountNameTextEdit'):focus()
g_settings.remove('account')
g_settings.remove('password')
end
function EnterGame.toggleAuthenticatorToken(clientVersion, init)
if not enterGame.disableToken then
return
end
local enabled = (clientVersion >= 1072)
if enabled == enterGame.authenticatorEnabled then
return
end
enterGame:getChildById('authenticatorTokenLabel'):setOn(enabled)
enterGame:getChildById('authenticatorTokenTextEdit'):setOn(enabled)
local newHeight = enterGame:getHeight()
local newY = enterGame:getY()
if enabled then
newY = newY - enterGame.authenticatorHeight
newHeight = newHeight + enterGame.authenticatorHeight
else
newY = newY + enterGame.authenticatorHeight
newHeight = newHeight - enterGame.authenticatorHeight
end
if not init then
enterGame:breakAnchors()
enterGame:setY(newY)
enterGame:bindRectToParent()
end
enterGame:setHeight(newHeight)
enterGame.authenticatorEnabled = enabled
end
function EnterGame.toggleStayLoggedBox(clientVersion, init)
if not enterGame.disableToken then
return
end
local enabled = (clientVersion >= 1074)
if enabled == enterGame.stayLoggedBoxEnabled then
return
end
enterGame:getChildById('stayLoggedBox'):setOn(enabled)
local newHeight = enterGame:getHeight()
local newY = enterGame:getY()
if enabled then
newY = newY - enterGame.stayLoggedBoxHeight
newHeight = newHeight + enterGame.stayLoggedBoxHeight
else
newY = newY + enterGame.stayLoggedBoxHeight
newHeight = newHeight - enterGame.stayLoggedBoxHeight
end
if not init then
enterGame:breakAnchors()
enterGame:setY(newY)
enterGame:bindRectToParent()
end
enterGame:setHeight(newHeight)
enterGame.stayLoggedBoxEnabled = enabled
end
function EnterGame.onClientVersionChange(comboBox, text, data)
local clientVersion = tonumber(text)
EnterGame.toggleAuthenticatorToken(clientVersion)
EnterGame.toggleStayLoggedBox(clientVersion)
updateLabelText()
end
function EnterGame.tryHttpLogin(clientVersion, httpLogin)
g_game.setClientVersion(clientVersion)
g_game.setProtocolVersion(g_game.getClientProtocolVersion(clientVersion))
g_game.chooseRsa(G.host)
if not modules.game_things.isLoaded() then
if loadBox then
loadBox:destroy()
loadBox = nil
end
local errorBox = displayErrorBox(tr("Login Error"), string.format("Things are not loaded, please put assets in things/%d/<assets>.", clientVersion))
connect(errorBox, {
onOk = EnterGame.show
})
return
end
local host, path = G.host:match("([^/]+)/([^/].*)")
local url = G.host
if not G.port then
local isHttps, _ = string.find(host, "https")
if not isHttps then
G.port = 443
else -- http
G.port = 80
end
end
if not path then
path = ""
else
path = '/' .. path
end
if not host then
loadBox = displayCancelBox(tr('Please wait'), tr('ERROR , try adding \n- ip/login.php \n- Enable HTTP login'))
else
loadBox = displayCancelBox(tr('Please wait'), tr('Connecting to login server...\nServer: [%s]',
host .. ":" .. tostring(G.port) .. path))
end
connect(loadBox, {
onCancel = function(msgbox)
loadBox = nil
G.requestId = 0
EnterGame.show()
end
})
math.randomseed(os.time())
G.requestId = math.random(1)
local http = LoginHttp.create()
http:httpLogin(host, path, G.port, G.account, G.password, G.requestId, httpLogin)
end
function printTable(t)
for k, v in pairs(t) do
if type(v) == "table" then
print(string.format("%q: {", k))
printTable(v)
print("}")
else
print(string.format("%q:", k) .. tostring(v) .. ",")
end
end
end
function EnterGame.loginSuccess(requestId, jsonSession, jsonWorlds, jsonCharacters)
if G.requestId ~= requestId then
return
end
local worlds = {}
for _, world in ipairs(json.decode(jsonWorlds)) do
worlds[world.id] = {
name = world.name,
ip = world.externaladdressprotected,
port = world.externalportprotected,
previewState = world.previewstate == 1
}
end
local characters = {}
for index, character in ipairs(json.decode(jsonCharacters)) do
local world = worlds[character.worldid]
characters[index] = {
name = character.name,
level = character.level,
main = character.ismaincharacter,
dailyreward = character.dailyrewardstate,
hidden = character.ishidden,
vocation = character.vocation,
outfitid = character.outfitid,
headcolor = character.headcolor,
torsocolor = character.torsocolor,
legscolor = character.legscolor,
detailcolor = character.detailcolor,
addonsflags = character.addonsflags,
worldName = world.name,
worldIp = world.ip,
worldPort = world.port,
previewState = world.previewstate
}
end
local session = json.decode(jsonSession)
local premiumUntil = tonumber(session.premiumuntil)
local account = {
status = '',
premDays = math.floor((premiumUntil - os.time()) / 86400),
subStatus = premiumUntil > os.time() and SubscriptionStatus.Premium or SubscriptionStatus.Free
}
-- set session key
G.sessionKey = session.sessionkey
onCharacterList(nil, characters, account)
end
function EnterGame.loginFailed(requestId, msg, result)
if G.requestId ~= requestId then
return
end
onError(nil, msg, result)
end
function EnterGame.doLogin()
G.account = enterGame:getChildById('accountNameTextEdit'):getText()
G.password = enterGame:getChildById('accountPasswordTextEdit'):getText()
G.authenticatorToken = enterGame:getChildById('authenticatorTokenTextEdit'):getText()
G.stayLogged = enterGame:getChildById('stayLoggedBox'):isChecked()
G.host = enterGame:getChildById('serverHostTextEdit'):getText()
G.port = tonumber(enterGame:getChildById('serverPortTextEdit'):getText())
local clientVersion = tonumber(clientBox:getText())
local httpLogin = enterGame:getChildById('httpLoginBox'):isChecked()
EnterGame.hide()
if g_game.isOnline() then
local errorBox = displayErrorBox(tr('Login Error'), tr('Cannot login while already in game.'))
connect(errorBox, {
onOk = EnterGame.show
})
return
end
g_settings.set('host', G.host)
g_settings.set('port', G.port)
g_settings.set('client-version', clientVersion)
if clientVersion >= 1281 and G.port ~= 7171 then
EnterGame.tryHttpLogin(clientVersion, httpLogin)
else
protocolLogin = ProtocolLogin.create()
protocolLogin.onLoginError = onError
protocolLogin.onMotd = onMotd
protocolLogin.onSessionKey = onSessionKey
protocolLogin.onCharacterList = onCharacterList
protocolLogin.onUpdateNeeded = onUpdateNeeded
loadBox = displayCancelBox(tr('Please wait'), tr('Connecting to login server...'))
connect(loadBox, {
onCancel = function(msgbox)
loadBox = nil
protocolLogin:cancelLogin()
EnterGame.show()
end
})
g_game.setClientVersion(clientVersion)
g_game.setProtocolVersion(g_game.getClientProtocolVersion(clientVersion))
g_game.chooseRsa(G.host)
if modules.game_things.isLoaded() then
protocolLogin:login(G.host, G.port, G.account, G.password, G.authenticatorToken, G.stayLogged)
else
if loadBox then
loadBox:destroy()
loadBox = nil
end
local errorBox = displayErrorBox(tr("Login Error"), string.format("Things are not loaded, please put spr and dat in things/%d/<here>.", clientVersion))
connect(errorBox, {
onOk = EnterGame.show
})
return
end
end
end
function EnterGame.displayMotd()
if not motdWindow then
motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
motdWindow.onOk = function()
motdWindow = nil
end
end
end
function EnterGame.setDefaultServer(host, port, protocol)
local hostTextEdit = enterGame:getChildById('serverHostTextEdit')
local portTextEdit = enterGame:getChildById('serverPortTextEdit')
local clientLabel = enterGame:getChildById('clientLabel')
local accountTextEdit = enterGame:getChildById('accountNameTextEdit')
local passwordTextEdit = enterGame:getChildById('accountPasswordTextEdit')
local authenticatorTokenTextEdit = enterGame:getChildById('authenticatorTokenTextEdit')
if hostTextEdit:getText() ~= host then
hostTextEdit:setText(host)
portTextEdit:setText(port)
clientBox:setCurrentOption(protocol)
accountTextEdit:setText('')
passwordTextEdit:setText('')
authenticatorTokenTextEdit:setText('')
end
end
function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeight)
local hostTextEdit = enterGame:getChildById('serverHostTextEdit')
hostTextEdit:setText(host)
hostTextEdit:setVisible(false)
hostTextEdit:setHeight(0)
local portTextEdit = enterGame:getChildById('serverPortTextEdit')
portTextEdit:setText(port)
portTextEdit:setVisible(false)
portTextEdit:setHeight(0)
local authenticatorTokenTextEdit = enterGame:getChildById('authenticatorTokenTextEdit')
authenticatorTokenTextEdit:setText('')
authenticatorTokenTextEdit:setOn(false)
local authenticatorTokenLabel = enterGame:getChildById('authenticatorTokenLabel')
authenticatorTokenLabel:setOn(false)
local stayLoggedBox = enterGame:getChildById('stayLoggedBox')
stayLoggedBox:setChecked(false)
stayLoggedBox:setOn(false)
local clientVersion = tonumber(protocol)
clientBox:setCurrentOption(clientVersion)
clientBox:setVisible(false)
clientBox:setHeight(0)
local serverLabel = enterGame:getChildById('serverLabel')
serverLabel:setVisible(false)
serverLabel:setHeight(0)
local portLabel = enterGame:getChildById('portLabel')
portLabel:setVisible(false)
portLabel:setHeight(0)
local clientLabel = enterGame:getChildById('clientLabel')
clientLabel:setVisible(false)
clientLabel:setHeight(0)
local httpLoginBox = enterGame:getChildById('httpLoginBox')
httpLoginBox:setVisible(false)
httpLoginBox:setHeight(0)
local serverListButton = enterGame:getChildById('serverListButton')
serverListButton:setVisible(false)
serverListButton:setHeight(0)
serverListButton:setWidth(0)
local rememberEmailBox = enterGame:getChildById('rememberEmailBox')
rememberEmailBox:setMarginTop(5)
if not windowWidth then
windowWidth = 380
end
enterGame:setWidth(windowWidth)
if not windowHeight then
windowHeight = 210
end
enterGame:setHeight(windowHeight)
enterGame.disableToken = true
-- preload the assets
-- this is for the client_bottommenu module
-- it needs images of outfits
-- so it can display the boosted creature
g_game.setClientVersion(clientVersion)
g_game.setProtocolVersion(g_game.getClientProtocolVersion(clientVersion))
end
function EnterGame.setServerInfo(message)
local label = enterGame:getChildById('serverInfoLabel')
label:setText(message)
end
function EnterGame.disableMotd()
motdEnabled = false
end
function ensableBtnCreateNewAccount()
enterGame.btnCreateNewAccount:enable()
end