Jump to content

Criando um painel de login


Recommended Posts

Bateu uma vontade de criar um painel de login,  ̶E̶U̶ ̶T̶E̶N̶H̶O̶ ̶Q̶U̶E̶ ̶C̶O̶N̶S̶E̶G̶U̶I̶R̶ ̶C̶R̶I̶A̶R̶ ̶U̶M̶ ̶P̶A̶I̶N̶E̶L̶ ̶D̶E̶ ̶L̶O̶G̶I̶N̶

Estou louco para conseguir criar tudo o que eu penso, mas ainda me falta conhecimento e pratica, então aqui estou para pedir ajuda.

Por eu estar começando seria melhor eu fazer em CEGUI ou posso continuar com o DX que é o que eu estou usando?

Não sei exatamente como começar e nem quais funções usar. Por enquanto está assim:

local screenW, screenH = guiGetScreenSize()
local x, y =  ( screenW/2 ), ( screenH/2 )

-- Janela principal do painel de login
function mainLogin()
    showCursor(true)
    local background = dxDrawImage(0, 0, screenW, screenH, "files/background.jpg")
    local mainWindow = dxDrawImage(x - 166, y - 220, 332, 440, "files/main.png")
    local bLogin = dxDrawImage(x - 166, y + 60, 332, 45, "files/button.png", 0, 0, 0, tocolor(255,81,81,255))
    local tLogin = dxDrawText("LOGIN",x - 40, y + 65, _, _, _, 2, "clear") 
    local tText = dxDrawText("Não tem uma conta?",x - 45, y + 115, _, _, _, _, "clear")
    local tRegister = dxDrawText("Registre-se",x + 90, y + 115, _, _, tocolor(0,0,0,255), _, "deafault-bold")

end
addEventHandler("onClientRender", root, mainLogin)
Spoiler

VBM26EV.jpg

Imagino que eu tenho que usar no server onPlayerJoin ou "onPlayerConnect" e usar um triggerClientEvent, para chamar o Painel de login certo? Mas temporariamente até construir o painel vou deixar assim....

Funções que eu não achei:
GuiCreateEdit só que em DX, se eu entendi certo o usuário digita ali e eu posso usar o que ele digitou né?
Então eu crio duas variáveis, no caso login  e senha. e uso no getAccount(login,senha)
Vou ter que criar mais uma na parte do register, no caso senha e senha1 e verificar se as duas estão igual.

Deixar a imagem de fundo embaçada.

Como eu pensei em fazer:
Criar duas function, login e register

A login eu chamo no onPlayerJoin/Connect não sei qual das duas, e a register quando aperta no texto registre-se.
Então vem a parte que pode ser difícil, é complicado fazer uma animação?? Tipo um flip do login para o register?

Aceito sugestões!!
 

 

Link to comment
  • Other Languages Moderators
  • A função onPlayerConnect não deve ser usada neste caso. Ela só deve ser usada quando vc quer colocar um sistema de segurança que bloqueia um jogador específico de entrar no servidor, por isso ela vem com parâmetros como nick, IP, serial, versão do cliente. Este evento ocorre antes de qualquer resource ser iniciado no jogador, pois ela vem antes mesmo do que onPlayerJoin, que ocorre quando o jogador consegue estabelecer conexão com o servidor. Mas o painel, por se tratar de um script client-side, não precisa disso. Use onClientResourceStart em vez disso, que fará a função executar assim que o jogador terminar de baixar este resource.
  • Você está com problemas em achar funções prontas em DX, se você não tem conhecimento suficiente para criar manualmente cada elemento DX, faça em CEGUI. Já foi dito que DX é mais difícil por ser necessário fazer tudo manualmente.
  • Pra deixar a imagem de fundo embaçada vc tem 2 alternativas:
    • Embaçar a imagem no photoshop e usar a imagem já embaçada.
    • Usar shaders, que é outra coisa complexa de fazer, a não ser que vc encontre pronto na internet.
  • Animações em DX não são tão difíceis. Vc vai precisar de interpolateBetween.
  • Thanks 1
Link to comment

Como é para estudo, por que não começar pelo mais fácil né?! Então passei para CEGUI, até fiz tudo na mão, sem usar o guieditor!! 

Aqui está o código:
 

Spoiler

local screenW, screenH = guiGetScreenSize()
local x, y =  ( screenW/2 ), ( screenH/2 )

--login = guiGetText(eLogin)


--[[
    b = button
    e = edit
    l = label
]]

function login()
    --showChat(not isChatVisible())
    local login = guiGetText(eLogin)
    local password = guiGetText(ePassword)

    showCursor(not isCursorShowing())-- Mostre o cursor se ele não está aparecendo    
    local background = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Login
    local bLogin = guiCreateButton(x-110, y+300, 100, 40, "ENTRAR", false, background)
    local lLogin = guiCreateLabel(x-109, y+185, 50, 50, "USUÁRIO", false, background)
    local eLogin = guiCreateEdit(x-110, y+200, 210, 30, "", false, background)
    guiEditSetMaxLength ( eLogin, 32 )
    -- Senha
    local lPassword = guiCreateLabel(x-109, y+235, 50 , 50, "SENHA", false, background)
    local ePassword = guiCreateEdit(x-110, y+250, 210, 30, "", false, background)
    guiEditSetMaxLength ( ePassword, 32 )
    -- Registrar
    local bRegister = guiCreateButton( x, y+300, 100, 40, "CRIAR CONTA", false, background)

    addEventHandler ("onClientGUIClick", guiRoot, function()
        if (source == bLogin) then
            if login == nil then
                outputChatBox("LOGIN NIL")
            else
                outputChatBox("ERROR")
            end
        end
    end)
    
end
addEventHandler("onClientResourceStart", root, login)

function createAccount()
    showCursor(not isCursorShowing())-- Mostre o cursor se ele não está aparecendo    
    local background = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Register
    local bRegister = guiCreateButton(x-110, y+300, 100, 40, "CRIAR CONTA", false, background)
    -- Login
    local lLogin = guiCreateLabel(x-109, y+135, 50, 50, "USUÁRIO", false, background)
    local eLogin = guiCreateEdit(x-110, y+150, 210, 30, "", false, background)
    guiEditSetMaxLength ( eLogin, 32 )
    -- Senha
    local lPassword = guiCreateLabel(x-109, y+185, 50 , 50, "SENHA", false, background)
    local ePassword = guiCreateEdit(x-110, y+200, 210, 30, "", false, background)
    guiEditSetMaxLength ( ePassword, 32 )

    local lPassword1 = guiCreateLabel(x-109, y+235, 150 , 50, "CONFIRMAR SENHA", false, background)
    local ePassword1 = guiCreateEdit(x-110, y+250, 210, 30, "", false, background)
    guiEditSetMaxLength ( ePassword1, 32 )

    -- Voltar
    local bBack = guiCreateButton( x, y+300, 100, 40, "VOLTAR", false, background)
end

 


Como ficou o login:
 

Spoiler

cLR5kZT.jpg

Como ficou o register:

Spoiler

0N6oLhI.jpg

Agora vem o meu problema, como eu verifico se o usuário digitou alguma coisa no login e senha?
Testei isso:
 

    addEventHandler ("onClientGUIClick", guiRoot, function()
        if (source == bLogin) then
            if login == nil then
                outputChatBox("LOGIN NIL")
            else
                outputChatBox("ERROR")
            end
        end
    end)

Mas retorna ERROR, testei no lugar de nil > "" e também retorna ERROR

Outro problema é, vou precisar criar um sistema de notificação, já que o chat vai ser desativado, mas isso eu aprendo depois haha.

Por enquanto o problema principal é detectar se o usuário digitou algo ou não.

Link to comment
  • Other Languages Moderators

Obtenha o texto com guiGetText e verifique se é maior que 0.

Exemplo: 

local g_Text = guiGetText( eLogin );

if ( #g_Text > 0 ) then -- O símbolo # (hashtag) antes de uma variável que é string, retorna o valor de caracteres que essa variável possui.
	-- // blá, blá, blá
end

OBS.: Não é recomendado colocar o mesmo nome da variável para a mesma função. Você definiu "eLogin" para o campo de login e registro. Sendo assim, use sempre tabelas para armazenar e poupar Memória RAM do jogador.

local CEGUI = { window = { }, button = { }, edit = { }, gridlist = { } }

-- // Exemplo com números
CEGUI.window[ 1 ] = guiCreateWindow( ... );

CEGUI.button[ 1 ] = guiCreateButton( ... );

CEGUI.edit[ 1 ] = guiCreateEdit( ... );
CEGUI.edit[ 2 ] = guiCreateEdit( ... );

-- // Exemplo com strings (nomes)
CEGUI.window[ "janelaPrincipal" ] = guiCreateWindow( ... );

CEGUI.button[ "botãoRegistro" ] = guiCreateButton( ... );

CEGUI.edit[ "campoUsuário" ] = guiCreateEdit( ... );
CEGUI.edit[ "campoSenha" ] = guiCreateEdit( ... );

--[[
	Você pode usar tanto números quanto nomes. (Para mim, nomes são melhores para facilitar o que cada um é)
	SIM! Você pode usar acentuação caso esteja usando strings.
]]--

 

Edited by asrzk
  • Thanks 1
Link to comment
  • Other Languages Moderators
1 hour ago, Gaimo said:

Então passei para CEGUI, até fiz tudo na mão, sem usar o guieditor!!

BOAAAAA!!! Aí sim vi progresso!

Sobre o seu código, as linhas 16 e 17 provavelmente darão erro, pois você está tentando obter o texto dos campos que ainda não foram criados.

E a sua função de clique, eu faria ela da seguinte maneira:

addEventHandler ("onClientGUIClick", getRootElement(), function()
	if (source == bLogin) then
		if guiGetText(eLogin) == "" then -- Se o campo de login está vazio, então:
			outputChatBox("LOGIN NIL")
		else
			outputChatBox ("Logou.")
		end
	end
end)

 

  • Haha 1
Link to comment
  • Moderators
On 19/02/2019 at 20:12, Lord Henry said:

Pra deixar a imagem de fundo embaçada vc tem 2 alternativas:

  • Embaçar a imagem no photoshop e usar a imagem já embaçada.
  • Usar shaders, que é outra coisa complexa de fazer, a não ser que vc encontre pronto na internet.

 

Tem este shader que faz esse efeito: https://community.multitheftauto.com/index.php?p=resources&s=details&id=7349

Uma dica pra você otimizar o evento "onClientGUIClick" é sempre definir guiRoot (assim como você fez no seu código) em vez de root/getRootElement(). Isso quando você não anexar o evento diretamente a um elemento GUI. guiRoot irá englobar todos os elementos GUI criados no próprio resource, enquanto root fará executar para todos GUIs criados.

Sobre usar o guieditor, pessoalmente eu prefiro sempre usar, pois crio esboços antes de fazer meus projetos, e isso também ajuda muito quem não tem muito conhecimento, vai te poupar tempo posicionando sem nenhuma ferramenta. É possível também usar uma folha pra calcular manualmente.

  • Thanks 1
Link to comment

Código atual:

local screenW, screenH = guiGetScreenSize()
local x, y =  ( screenW/2 ), ( screenH/2 )
local CEGUI = { window = { }, button = { }, edit = { }, label = { }, image = { } }

function login()
    --showChat(not isChatVisible())
    showCursor(true)-- Mostre o cursor se ele não está aparecendo 
    
    CEGUI.image["background"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Login
    CEGUI.button["login"] = guiCreateButton(x-110, y+300, 100, 40, "ENTRAR", false, CEGUI.image["background"])
    CEGUI.label["login"] = guiCreateLabel(x-109, y+185, 50, 50, "USUÁRIO", false, CEGUI.image["background"])
    CEGUI.edit["input_login"] = guiCreateEdit(x-110, y+200, 210, 30, "", false, CEGUI.image["background"])
    guiEditSetMaxLength ( CEGUI.edit["input_login"], 32 )
    -- Senha
    CEGUI.label["password"] = guiCreateLabel(x-109, y+235, 50 , 50, "SENHA", false, CEGUI.image["background"])
    CEGUI.label["input_password"] = guiCreateEdit(x-110, y+250, 210, 30, "", false, CEGUI.image["background"])
    guiEditSetMaxLength ( CEGUI.label["input_password"], 32 )
    -- Registrar
    CEGUI.button["create_account"] = guiCreateButton( x, y+300, 100, 40, "CRIAR CONTA", false, CEGUI.image["background"])

    addEventHandler ("onClientGUIClick", guiRoot, function()
        if (source == CEGUI.button["create_account"]) then
            createAccount()
        end
    end)
    
end
addEventHandler("onClientResourceStart", root, login)

function createAccount() 
    showCursor(true)   
    CEGUI.image["background"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Register
    CEGUI.button["register"] = guiCreateButton(x-110, y+300, 100, 40, "CRIAR CONTA", false, CEGUI.image["background"])
    -- Login
    CEGUI.label["login"] = guiCreateLabel(x-109, y+135, 50, 50, "USUÁRIO", false, CEGUI.image["background"])
    CEGUI.edit["input_login"] = guiCreateEdit(x-110, y+150, 210, 30, "", false, CEGUI.image["background"])
    guiEditSetMaxLength ( CEGUI.edit["input_login"], 32 )
    -- Senha
    CEGUI.label["password"] = guiCreateLabel(x-109, y+185, 50 , 50, "SENHA", false, CEGUI.image["background"])
    CEGUI.edit["input_password"] = guiCreateEdit(x-110, y+200, 210, 30, "", false, CEGUI.image["background"])
    guiEditSetMaxLength ( CEGUI.edit["input_password"], 32 )

    CEGUI.label["password1"] = guiCreateLabel(x-109, y+235, 150 , 50, "CONFIRMAR SENHA", false, CEGUI.image["background"])
    CEGUI.edit["input_password1"] = guiCreateEdit(x-110, y+250, 210, 30, "", false, CEGUI.image["background"])
    guiEditSetMaxLength ( CEGUI.edit["input_password1"], 32 )
    -- Voltar
    CEGUI.button["back"] = guiCreateButton( x, y+300, 100, 40, "VOLTAR", false, CEGUI.image["background"])

    addEventHandler ("onClientGUIClick", guiRoot, function()
        if (source == CEGUI.button["back"]) then
            login()
        end
    end)
end

Qual a maneira correta de fazer para trocar do login para o register? Porque assim está travando muito, se ir do login para o register e voltar umas duas vezes começa um baita lag.

 

6 hours ago, asrzk said:

OBS.: Não é recomendado colocar o mesmo nome da variável para a mesma função. Você definiu "eLogin" para o campo de login e registro. Sendo assim, use sempre tabelas para armazenar e poupar Memória RAM do jogador.

Muito bom essa de usar tabela, gostei!!

 

1 hour ago, DNL291 said:

Uma dica pra você otimizar o evento "onClientGUIClick" é sempre definir guiRoot (assim como você fez no seu código) em vez de root/getRootElement(). Isso quando você não anexar o evento diretamente a um elemento GUI. guiRoot irá englobar todos os elementos GUI criados no próprio resource, enquanto root fará executar para todos GUIs criados.

Eu usei porque tu me passou em um outro script hahaha, mas agora aprendi a diferença de cada um. No começo eu não entendia muito bem o source, agora já peguei bem o que é, já o root eu ainda estou com dificuldade, só root trata-se do jogador?

Link to comment
  • Other Languages Moderators
9 minutes ago, Gaimo said:

Qual a maneira correta de fazer para trocar do login para o register? Porque assim está travando muito, se ir do login para o register e voltar umas duas vezes começa um baita lag.

Quando você aciona a função de aparecer o login ou registro, você está CRIANDO novamente o conteúdo, esse é o motivo do travamento. Use simplesmente a função guiSetVisible para deixar a window visível.

Outro detalhe: você está usando, novamente, o mesmo nome para dois elementos.

Isto:

CEGUI.image["background"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )

Troque o nome da janela de registro para "background_register" e a janela de login para "background_login". Daí, para fazer aparecer ou ocultar, basta fazer isso:

addEventHandler ("onClientGUIClick", guiRoot, function()
        if (source == CEGUI.button["back"]) then
            guiSetVisible( CEGUI.image[ "background_login" ], true ); -- // Irá voltar para a janela de login
      		guiSetVisible( CEGUI.image[ "background_register" ], false ); -- // Irá ocultar a janela de registro e seus respectivos elementos que estão anexados.
        end
    end
end)

 

  • Thanks 2
Link to comment
  • Other Languages Moderators
1 hour ago, DNL291 said:

Uma dica pra você otimizar o evento "onClientGUIClick" é sempre definir guiRoot (assim como você fez no seu código) em vez de root/getRootElement(). Isso quando você não anexar o evento diretamente a um elemento GUI. guiRoot irá englobar todos os elementos GUI criados no próprio resource, enquanto root fará executar para todos GUIs criados.

 

Pois é, o carinha tinha usado isso e até fiquei em dúvida se era válido ou não.

Não achei na Wiki falando dessa variável nativa.

Link to comment
11 hours ago, asrzk said:

Quando você aciona a função de aparecer o login ou registro, você está CRIANDO novamente o conteúdo, esse é o motivo do travamento. Use simplesmente a função guiSetVisible para deixar a window visível.

Imaginei que isso estava acontecendo, para resolver fiz diferente, coloquei tudo em uma única função.
Já que é pra fazer altamente otimizado, AMO OTIMIZAÇÃO! Quando o jogador logar eu preciso deletar todos os elementos criados né?

script atual:

local screenW, screenH = guiGetScreenSize()
local x, y =  ( screenW/2 ), ( screenH/2 )
local CEGUI = { window = { }, button = { }, edit = { }, label = { }, image = { } }

function panel_login()
    showCursor(true)
    -- MAIN LOGIN ---------------------------------------------------------------------------------------------------------
    CEGUI.image["background_login"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Login
    CEGUI.button["login"] = guiCreateButton(x-110, y+300, 100, 40, "ENTRAR", false, CEGUI.image["background_login"])
    CEGUI.label["login"] = guiCreateLabel(x-109, y+185, 50, 50, "USUÁRIO", false, CEGUI.image["background_login"])
    CEGUI.edit["input_login"] = guiCreateEdit(x-110, y+200, 210, 30, "", false, CEGUI.image["background_login"])
    guiEditSetMaxLength ( CEGUI.edit["input_login"], 32 )
    -- Senha
    CEGUI.label["password"] = guiCreateLabel(x-109, y+235, 50 , 50, "SENHA", false, CEGUI.image["background_login"])
    CEGUI.label["input_password"] = guiCreateEdit(x-110, y+250, 210, 30, "", false, CEGUI.image["background_login"])
    guiEditSetMaxLength ( CEGUI.label["input_password"], 32 )
    -- Registrar
    CEGUI.button["create_account"] = guiCreateButton( x, y+300, 100, 40, "CRIAR CONTA", false, CEGUI.image["background_login"])    

    -- MAIN REGISTER ---------------------------------------------------------------------------------------------------------
    CEGUI.image["background_register"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Register
    CEGUI.button["register"] = guiCreateButton(x-110, y+300, 100, 40, "CRIAR CONTA", false, CEGUI.image["background_register"])
    -- Login
    CEGUI.label["login"] = guiCreateLabel(x-109, y+135, 50, 50, "USUÁRIO", false, CEGUI.image["background_register"])
    CEGUI.edit["input_login"] = guiCreateEdit(x-110, y+150, 210, 30, "", false, CEGUI.image["background_register"])
    guiEditSetMaxLength ( CEGUI.edit["input_login"], 32 )
    -- Senha
    CEGUI.label["password"] = guiCreateLabel(x-109, y+185, 50 , 50, "SENHA", false, CEGUI.image["background_register"])
    CEGUI.edit["input_password"] = guiCreateEdit(x-110, y+200, 210, 30, "", false, CEGUI.image["background_register"])
    guiEditSetMaxLength ( CEGUI.edit["input_password"], 32 )

    CEGUI.label["password1"] = guiCreateLabel(x-109, y+235, 150 , 50, "CONFIRMAR SENHA", false, CEGUI.image["background_register"])
    CEGUI.edit["input_password1"] = guiCreateEdit(x-110, y+250, 210, 30, "", false, CEGUI.image["background_register"])
    guiEditSetMaxLength ( CEGUI.edit["input_password1"], 32 )
    -- Voltar
    CEGUI.button["back"] = guiCreateButton( x, y+300, 100, 40, "VOLTAR", false, CEGUI.image["background_register"])
    guiSetVisible(CEGUI.image["background_register"], false)

    -- O que acontece quando um botão é pressionado
    addEventHandler ("onClientGUIClick", guiRoot, function()
        if source == CEGUI.button["create_account"] then
            guiSetVisible(CEGUI.image["background_login"], false)
            guiSetVisible(CEGUI.image["background_register"], true)
        elseif source == CEGUI.button["back"] then
            guiSetVisible(CEGUI.image["background_register"], false)
            guiSetVisible(CEGUI.image["background_login"], true)
        end
    end)
end
addEventHandler("onClientResourceStart", root, panel_login)

Agora ficou MUITO RÁPIDO, a troca do login para o register!!

Preciso aprender a criar um sistema de notificação, vou procurar uns aqui para ver como eles funcionam. Ou aprender a usar o interpolateBetween como o Lord Henry sugeriu.

Link to comment
  • Other Languages Moderators
31 minutes ago, Gaimo said:

Quando o jogador logar eu preciso deletar todos os elementos criados né?

Não é necessário, mas como você disse

32 minutes ago, Gaimo said:

AMO OTIMIZAÇÃO!

Então sim, pode destruir os elementos e anular as variáveis. A propósito, vejo que você ainda está errando naquilo que eu lhe disse, sobre nomes iguais em tabelas. Veja o seu código com atenção e tente-o corrigir. Cada vez que você posta algo aqui, fico surpreendido com sua evolução. De fato, colocar todos os elementos dentro de apenas uma função, fica bem otimizado. Seus eventos estão otimizados. Lembre-se: verifique o seu código e tente encontrar os erros de repetição.

  • Like 1
  • Thanks 1
Link to comment
local screenW, screenH = guiGetScreenSize()
local x, y =  ( screenW/2 ), ( screenH/2 )
local CEGUI = { window = { }, button = { }, edit = { }, label = { }, image = { } }

function panel_login()
    showCursor(true)
    -- MAIN LOGIN ---------------------------------------------------------------------------------------------------------
    CEGUI.image["background_login"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Login
    CEGUI.button["ML_login"] = guiCreateButton(x-110, y+300, 100, 40, "ENTRAR", false, CEGUI.image["background_login"])
    CEGUI.label["ML_login"] = guiCreateLabel(x-109, y+185, 50, 50, "USUÁRIO", false, CEGUI.image["background_login"])
    CEGUI.edit["ML_input_login"] = guiCreateEdit(x-110, y+200, 210, 30, "", false, CEGUI.image["background_login"])
    guiEditSetMaxLength ( CEGUI.edit["ML_input_login"], 32 )
    -- Senha
    CEGUI.label["ML_password"] = guiCreateLabel(x-109, y+235, 50 , 50, "SENHA", false, CEGUI.image["background_login"])
    CEGUI.label["ML_input_password"] = guiCreateEdit(x-110, y+250, 210, 30, "", false, CEGUI.image["background_login"])
    guiEditSetMaxLength ( CEGUI.label["ML_input_password"], 32 )
    -- Registrar
    CEGUI.button["create_account"] = guiCreateButton( x, y+300, 100, 40, "CRIAR CONTA", false, CEGUI.image["background_login"])    

    -- MAIN REGISTER ---------------------------------------------------------------------------------------------------------
    CEGUI.image["background_register"] = guiCreateStaticImage( 0, 0, screenW, screenH, "files/background.jpg", false )
    -- Register
    CEGUI.button["MR_register"] = guiCreateButton(x-110, y+300, 100, 40, "CRIAR CONTA", false, CEGUI.image["background_register"])
    -- Login
    CEGUI.label["MR_login"] = guiCreateLabel(x-109, y+135, 50, 50, "USUÁRIO", false, CEGUI.image["background_register"])
    CEGUI.edit["MR_input_login"] = guiCreateEdit(x-110, y+150, 210, 30, guiGetText(CEGUI.edit["ML_input_login"]), false, CEGUI.image["background_register"])
    guiEditSetMaxLength ( CEGUI.edit["MR_input_login"], 32 )
    -- Senha
    CEGUI.label["MR_password"] = guiCreateLabel(x-109, y+185, 50 , 50, "SENHA", false, CEGUI.image["background_register"])
    CEGUI.edit["MR_input_password"] = guiCreateEdit(x-110, y+200, 210, 30, "", false, CEGUI.image["background_register"])
    guiEditSetMaxLength ( CEGUI.edit["MR_input_password"], 32 )

    CEGUI.label["MR_password1"] = guiCreateLabel(x-109, y+235, 150 , 50, "CONFIRMAR SENHA", false, CEGUI.image["background_register"])
    CEGUI.edit["MR_input_password1"] = guiCreateEdit(x-110, y+250, 210, 30, "", false, CEGUI.image["background_register"])
    guiEditSetMaxLength ( CEGUI.edit["MR_input_password1"], 32 )
    -- Voltar
    CEGUI.button["back"] = guiCreateButton( x, y+300, 100, 40, "VOLTAR", false, CEGUI.image["background_register"])
    guiSetVisible(CEGUI.image["background_register"], false)

    -- O que acontece quando um botão é pressionado
    addEventHandler ("onClientGUIClick", guiRoot, function()
        if source == CEGUI.button["create_account"] then
            guiSetVisible(CEGUI.image["background_login"], false)
            guiSetVisible(CEGUI.image["background_register"], true)
        elseif source == CEGUI.button["back"] then
            guiSetVisible(CEGUI.image["background_register"], false)
            guiSetVisible(CEGUI.image["background_login"], true)
        end
    end)
end
addEventHandler("onClientResourceStart", root, panel_login)

Imagino que o problema de nomes repetidos foi resolvido agora kkkkkkk
Posso usar o mesmo em tabelas diferentes né ?

CEGUI.button["ML_login"] = guiCreateButton(x-110, y+300, 100, 40, "ENTRAR", false, CEGUI.image["background_login"])
CEGUI.label["ML_login"] = guiCreateLabel(x-109, y+185, 50, 50, "USUÁRIO", false, CEGUI.image["background_login"])

Uma é CEGUI.button a outra CEGUI.label.

 

Testei pegar o que o usuário digitou no login para passar para o login do register mas não funcionou, ele só pega o que está dentro das aspas:

CEGUI.edit["ML_input_login"] = guiCreateEdit(x-110, y+200, 210, 30, "", false, CEGUI.image["background_login"])
CEGUI.edit["MR_input_login"] = guiCreateEdit(x-110, y+150, 210, 30, guiGetText(CEGUI.edit["ML_input_login"]), false, CEGUI.image["background_register"])

Mas ele já cria o edit com o que tem dentro das aspas antes de o usuário digitar qualquer coisa.
Existe uma maneira de só editar o CEGUI.edit["ML_input_login"] em vez de criar ele novamente? Ou eu teria que deletar e criar ele? Pra ele "atualizar".

Link to comment
  • Other Languages Moderators
14 minutes ago, Gaimo said:

Posso usar o mesmo em tabelas diferentes né ?

Por se tratar de índices de tabelas, pode repetir sim. Da mesma forma que as tabelas indexadas com números repetem os índices de outras tabelas com números. Índices de string também podem repetir, mas não na mesma tabela.

14 minutes ago, Gaimo said:

Existe uma maneira de só editar o CEGUI.edit["ML_input_login"] em vez de criar ele novamente? Ou eu teria que deletar e criar ele? Pra ele "atualizar".

Já tentou usando guiSetText?

Edited by Lord Henry
  • Thanks 1
Link to comment

Client:

local thePlayer = getLocalPlayer()

-- O que acontece quando um botão é pressionado
    addEventHandler ("onClientGUIClick", guiRoot, function()
        -- Quando clica no botão "login"
        if source == CEGUI.button["ML_login"] then
            local g_login = guiGetText(CEGUI.edit["ML_input_login"])
            local g_password = guiGetText(CEGUI.edit["ML_input_password"])

            -- Se o login for menor que 4 caracteres
            if ( #g_login >= 4 ) then
                -- Se a senha é menor que 6 caracteres
                if ( #g_password >= 6 ) then
                    triggerServerEvent("loginEvent", resourceRoot, thePlayer, g_login, g_password)
                else
                    outputChatBox("A senha precisa ter no mínimo 6 caracteres!")
                end
            else
                outputChatBox("O login precisa ter no mínimo 4 caracteres!")
            end

        -- Quando clica no botão "criar conta" vai para a área de registro
        elseif source == CEGUI.button["create_account"] then
            guiSetText(CEGUI.edit["MR_input_login"], guiGetText(CEGUI.edit["ML_input_login"]))
            guiSetVisible(CEGUI.image["background_login"], false)
            guiSetVisible(CEGUI.image["background_register"], true)

        -- Quando clica no botão "voltar"
        elseif source == CEGUI.button["back"] then
            guiSetText(CEGUI.edit["ML_input_login"], guiGetText(CEGUI.edit["MR_input_login"]))
            guiSetVisible(CEGUI.image["background_register"], false)
            guiSetVisible(CEGUI.image["background_login"], true)
        
        -- Quando clica no botão "criar conta" tenta criar a conta
        elseif source == CEGUI.button["MR_register"] then
            local g_login = guiGetText(CEGUI.edit["MR_input_login"])
            local g_password = guiGetText(CEGUI.edit["MR_input_password"])
            local g_password1 = guiGetText(CEGUI.edit["MR_input_password1"])

            -- Se o login for menor que 4 caracteres
            if ( #g_login >= 4 ) then
                -- Se as senhas forem diferentes
                if ( g_password == g_password1 ) then
                    -- Se a senha é menor que 6 caracteres
                    if ( #g_password >= 6 ) then
                        triggerServerEvent("createAccountEvent", resourceRoot, g_login, g_password)
                    else
                        outputChatBox("A senha precisa ter no mínimo 6 caracteres!")
                    end
                else
                    outputChatBox("As senhas não coincidem")
                end
            else
                outputChatBox("O login precisa ter no mínimo 4 caracteres!")
            end
        end
    end)

Server:

function createAccount(username, password)
    local account = getAccount ( username, password )
    if not account then
        addAccount(username, password)
        outputChatBox("Sucess")
    else
        outputChatBox("Error")
    end
end
addEvent("createAccountEvent", true)
addEventHandler("createAccountEvent", resourceRoot, createAccount)

function login(thePlayer, username, password)
    outputChatBox(thePlayer)
    outputChatBox(username)
    outputChatBox(password)
    local account = getAccount ( username, password )
    if account then
        logIn(thePlayer, username, password)
        outputChatBox("Sucess")
    else
        outputChatBox("Error")
    end
end
addEvent("loginEvent", true)
addEventHandler("loginEvent", resourceRoot, login)

Problema:

local thePlayer = getLocalPlayer()
triggerServerEvent("loginEvent", resourceRoot, thePlayer, g_login, g_password)

----------------------------------------------------------------------------------------------------------------
-- Testei isso também
triggerServerEvent("loginEvent", resourceRoot, getLocalPlayer(), g_login, g_password)

Como eu passo o jogador que clicou em login para o triggerServerEvent?

Aparentemente tudo está funcionando só não consigo enviar o jogador que clicou no botão para o server.

Link to comment
  • Other Languages Moderators

Qual erro aparece no debugscript?

E essa sua linha 1 do client é totalmente inútil. Só vc usar a variável nativa localPlayer em qualquer lugar do seu script client-side que é o mesmo que getLocalPlayer(). Não precisa criar uma variável pra ele.

Link to comment
  • Other Languages Moderators

Exemplo com localPlayer

-- // CLIENT-SIDE
triggerServerEvent( "someTrigger", localPlayer, 1, 2, 3 );

-- // SERVER-SIDE
addEvent( "someTrigger", true );
addEventHandler( "someTrigger", root, function( n1, n2, n3 )
	print( n1 ); -- // retorna 1
	print( n2 ); -- // retorna 2
	print( n3 ); -- // retorna 3

	--[[
		Quando você usa o parâmetro 'localPlayer' em algum triggerServerEvent,
		o elemento retornado é source.
		Abaixo está um exemplo simples de como obter o nickname do jogador que executou o 'someTrigger'.
	]]--

	print( getPlayerName( source ) );
end );

Exemplo com resourceRoot

-- // CLIENT-SIDE
triggerServerEvent( "someTrigger", resourceRoot, 1, 2, 3 );

-- // SERVER-SIDE
addEvent( "someTrigger", true );
addEventHandler( "someTrigger", resourceRoot, function( n1, n2, n3 )
	print( n1 ); -- // retorna 1
	print( n2 ); -- // retorna 2
	print( n3 ); -- // retorna 3

	--[[
		Agora, quando você usa o parâmetro 'resourceRoot' em algum triggerServerEvent,
		o elemento retornado é client (que seria o mesmo caso do source, porém client).
		Veja o exemplo abaixo.
	]]--

	print( getPlayerName( client ) );
end );

 

  • Thanks 2
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...