<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.multitheftauto.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=R%C3%B4mulo+Neves</id>
	<title>Multi Theft Auto: Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.multitheftauto.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=R%C3%B4mulo+Neves"/>
	<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Special:Contributions/R%C3%B4mulo_Neves"/>
	<updated>2026-05-04T23:57:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=PT-BR/Introduc%C3%A3o_ao_GUI_scripting&amp;diff=38850</id>
		<title>PT-BR/Introducão ao GUI scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=PT-BR/Introduc%C3%A3o_ao_GUI_scripting&amp;diff=38850"/>
		<updated>2014-02-16T21:36:49Z</updated>

		<summary type="html">&lt;p&gt;Rômulo Neves: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- place holder --&amp;gt;&lt;br /&gt;
Um importante recurso no MTA:SA é a capacidade de script GUI (Graphic User Interface/Interface Gráfica do Usuário) personalizado. A GUI consiste de janelas, botões, caixas de edição, caixas de verificação... Quase todos os componentes padrão do formulário em ambientes gráficos. Eles podem ser exibidos enquanto o usuário está em jogo (in game), e usado para entradas (inputs) e saídas (outputs) no lugar dos comandos tradicionais.&lt;br /&gt;
&lt;br /&gt;
[[Image:AdminGUI.png|thumb|Admin Console GUI]]&lt;br /&gt;
&lt;br /&gt;
==Um tutorial para fazer uma janela de login==&lt;br /&gt;
Neste tutorial, vamos fazer uma janela de login simples, com duas caixas de entrada (input boxes) e um botão. A janela aparece quando o jogador entra no jogo, e quando o botão é clicado, o jogador é gerado no jogo. O tutorial vai continuar o modo de jogo que fizemos no [[PT-BR/Introducao_ao_Scripting|Introdução ao Scripting]] ''(Se você já usou o [[PT-BR/Introducao_ao_Scripting|Introdução ao Scripting]], você precisará remover ou comentar a linha [[spawnPlayer]] da função &amp;quot;joinHandler&amp;quot; em seu código, como iremos substituí-lo por uma GUI alternativa neste tutorial)''. Nós também vamos dar uma olhada no scripting do lado client (client-side).&lt;br /&gt;
&lt;br /&gt;
===Criando a janela===&lt;br /&gt;
Toda a GUI deve ser feita do lado client. Também é uma boa prática manter todos os scripts do lado client em uma pasta separada. &lt;br /&gt;
&lt;br /&gt;
Vá até o diretório /SeuServerMTA/mods/deathmatch/resources/, e crie uma pasta chamada &amp;quot;client&amp;quot;. Sob o diretório /client/, crie um arquivo de texto com o nome &amp;quot;gui.lua&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Neste arquivo vamos escrever uma função que cria a janela. Para criar uma janela, iremos utilizar [[guiCreateWindow]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function criarJanelaDeLogin()&lt;br /&gt;
	-- definir a posição X e Y da janela&lt;br /&gt;
	local X = 0.375&lt;br /&gt;
	local Y = 0.375&lt;br /&gt;
	-- definir a largura e altura da janela&lt;br /&gt;
	local Largura = 0.25&lt;br /&gt;
	local Altura = 0.25&lt;br /&gt;
	-- criar a janela e salvar o valor de seu elemento na variável 'wdwLogin'&lt;br /&gt;
	-- clique no nome da função para ler a sua documentação&lt;br /&gt;
	wdwLogin = guiCreateWindow(X, Y, Largura, Altura, &amp;quot;Por favor efetue o Login&amp;quot;, true)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Relativo e Absoluto===&lt;br /&gt;
Nota-se que o último argumento colocado em guiCreateWindow no exemplo acima é ''true''. Isto indica que as coordenadas e dimensões da janela são '''relativa''', o que significa que é uma ''porcentagem'' do tamanho total da tela. Isto significa que se o lado esquerdo da tela é 0, e a extrema-direita é 1, uma posição X de 0.5 representaria o ponto central da tela. Similarmente, se a parte superior da tela é 0 e no fundo é 1, uma posição Y de 0.2 seria 20% do caminho para baixo da tela. Os mesmos princípios se aplicam para largura e altura, bem como (com um valor de largura de 0.5 significa que a janela será a metade da largura da tela).&lt;br /&gt;
&lt;br /&gt;
A outra alternativa de utilizar valores relativos é utilizar '''absolutos''' (colocando ''false'' ao invés de true em guiCreateWindow). Os valores absolutos são calculados como o número total de pixels do canto superior esquerdo de seu elemento pai (se nenhum elemento pai gui for especificado, o pai será a própria tela). Se tivermos uma resolução de tela de 1920x1200, o lado esquerdo da tela sendo 0 pixel e os extrema-direita, sendo 1920 pixels, uma posição X de 960 representará o ponto central da tela. Similarmente, se a parte superior da tela é de 0 pixel e o fundo é de 1200, uma posição Y de 20 seria de 20 pixels para baixo a partir da parte superior da tela. Os mesmos princípios se aplicam a largura e altura, bem como (com um valor de largura de 50 ou seja, a janela será de 50 pixels de largura). ''Você pode usar [[guiGetScreenSize]] e um pouco de matemática para calcular certas posições absolutas.''&lt;br /&gt;
&lt;br /&gt;
As diferenças entre o uso de valores relativos e absolutos é muito simples; gui criada usando valores absolutos será sempre exatamente o mesmo tamanho de pixel e posição, enquanto gui criado usando valores relativos será sempre uma porcentagem do tamanho do seu parent.&lt;br /&gt;
&lt;br /&gt;
Absoluto é geralmente mais fácil de usar quando a edição do código é á mão, no entanto a escolha do tipo depende da situação que você está usando para isso.&lt;br /&gt;
&lt;br /&gt;
Para esta presente introdução iremos utilizar valores relativos.&lt;br /&gt;
&lt;br /&gt;
===Adicionando os componentes===&lt;br /&gt;
Em seguida, vamos adicionar os rótulos de texto (labels) (dizendo &amp;quot;username:&amp;quot; e &amp;quot;senha:&amp;quot;), caixas de edição (edit boxes) (para inserir seus dados) e um botão para efetuar login.&lt;br /&gt;
&lt;br /&gt;
Para criar botões você deve usar [[guiCreateButton]] e para criar caixas de edição você deve usar [[guiCreateEdit]]:&lt;br /&gt;
&lt;br /&gt;
'''Note que agora iremos escrever mais código para a nossa função atual 'criarJanelaDeLogin'. Esta não é uma nova função e se destina a substituir o que você já tem.'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function criarJanelaDeLogin()&lt;br /&gt;
	local X = 0.375&lt;br /&gt;
	local Y = 0.375&lt;br /&gt;
	local Largura = 0.25&lt;br /&gt;
	local Altura = 0.25&lt;br /&gt;
	wdwLogin = guiCreateWindow(X, Y, Largura, Altura, &amp;quot;Por favor efetue o Login&amp;quot;, true)&lt;br /&gt;
	&lt;br /&gt;
	-- definir as novas posições X e Y para o primeiro label&lt;br /&gt;
	X = 0.0391&lt;br /&gt;
	Y = 0.1979&lt;br /&gt;
	-- definir o novo valor de largura e altura para o primeiro label&lt;br /&gt;
	Largura = 0.3672&lt;br /&gt;
	Altura = 0.25&lt;br /&gt;
	-- criar o primeiro label, note que o último argumento passado é 'wdwLogin', que significa a janela&lt;br /&gt;
	-- o que criámos acima é o parent deste rótulo de texto (label)&lt;br /&gt;
	-- (assim toda a posição e os valores de tamanho são agora relativo para a posição dessa janela)&lt;br /&gt;
	guiCreateLabel(X, Y, Largura, Altura, &amp;quot;Nome de Usuario&amp;quot;, true, wdwLogin)&lt;br /&gt;
	-- altere o valor de Y, assim o segundo label esteja ligeiramente abaixo do primeiro&lt;br /&gt;
	Largura = 0.25&lt;br /&gt;
	Y = 0.5&lt;br /&gt;
	guiCreateLabel(X, Y, Largura, Altura, &amp;quot;Senha&amp;quot;, true, wdwLogin)&lt;br /&gt;
&lt;br /&gt;
	X = 0.415&lt;br /&gt;
	Y = 0.2&lt;br /&gt;
	Largura = 0.5&lt;br /&gt;
	Altura = 0.15&lt;br /&gt;
	editUsuario = guiCreateEdit(X, Y, Largura, Altura, &amp;quot;&amp;quot;, true, wdwLogin)&lt;br /&gt;
	Y = 0.5&lt;br /&gt;
	edtSenha = guiCreateEdit(X, Y, Largura, Altura, &amp;quot;&amp;quot;, true, wdwLogin)&lt;br /&gt;
	-- definir o tamanho máximo de caracteres do nome de usuário e Senha para 50&lt;br /&gt;
	guiEditSetMaxLength(editUsuario, 50)&lt;br /&gt;
	guiEditSetMaxLength(edtSenha, 50)&lt;br /&gt;
	&lt;br /&gt;
	X = 0.415&lt;br /&gt;
	Y = 0.7&lt;br /&gt;
	Largura = 0.25&lt;br /&gt;
	Altura = 0.2&lt;br /&gt;
	btnLogin = guiCreateButton(X, Y, Largura, Altura, &amp;quot;Login&amp;quot;, true, wdwLogin)&lt;br /&gt;
	&lt;br /&gt;
	-- tornar a janela invisível&lt;br /&gt;
	guiSetVisible(wdwLogin, false)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Note que cada componente GUI criado é um filho da janela, isto é feito através da especificação do elemento pai (wdwLogin, neste caso) ao criar o componente.&lt;br /&gt;
&lt;br /&gt;
Isto é muito útil porque não só significa que todos os componentes estão anexados à janela e irá mover-se com ela, mas também que todas as alterações feitas para a janela pai será aplicada para todos os elementos filho. Por exemplo, agora podemos ocultar toda a GUI que acabamos de criar, basta ocultar a janela:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
guiSetVisible(wdwLogin, false) -- oculta toda a GUI que fizemos para que possamos mostrá-los para o jogador, quando for preciso.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Usando a função criada anteriormente===&lt;br /&gt;
A função criarJanelaDeLogin agora está completa, mas nada vai acontecer até que nós a chamamos. È Recomendado criar toda a GUI quando o recurso client for iniciado, então será ocultada, e mostrará para o jogador quando necessário. Portanto, vamos escrever um manipulador de eventos para &amp;quot;[[onClientResourceStart]]&amp;quot; para criar a janela:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- anexar o manipulador de eventos para o elemento raiz (root element) do recurso&lt;br /&gt;
-- isso significa que ele só irá desencadear (trigger) quando seu próprio recurso é iniciado&lt;br /&gt;
addEventHandler(&amp;quot;onClientResourceStart&amp;quot;, getResourceRootElement(getThisResource()), &lt;br /&gt;
	function ()&lt;br /&gt;
		criarJanelaDeLogin()&lt;br /&gt;
	end&lt;br /&gt;
)	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Como este é uma janela de login, agora precisamos mostrar a janela quando o jogador entra no jogo.&lt;br /&gt;
Isto pode ser feito usando o mesmo evento, &amp;quot;[[onClientResourceStart]]&amp;quot;, para que possamos modificar o código acima e incluir para mostrar a janela:&lt;br /&gt;
&lt;br /&gt;
'''Observe que agora estamos escrevendo mais código para o nosso manipulador 'onClientResourceStart' existente. Este não é um novo manipulador de eventos e se destina a substituir o que você já tem.'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onClientResourceStart&amp;quot;, getResourceRootElement(getThisResource()), &lt;br /&gt;
	function ()&lt;br /&gt;
		-- criar a janela de login e seus componentes&lt;br /&gt;
		criarJanelaDeLogin()&lt;br /&gt;
&lt;br /&gt;
		-- saída de uma mensagem de boas-vindas ao jogador&lt;br /&gt;
                outputChatBox(&amp;quot;Bem-vindo ao meu servidor MTA:SA, por favor efetue o login.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		-- se a GUI foi criada com êxito, então, mostrar a GUI para o jogador&lt;br /&gt;
	        if (wdwLogin ~= nil) then&lt;br /&gt;
			guiSetVisible(wdwLogin, true)&lt;br /&gt;
		else&lt;br /&gt;
			-- se a GUI não foi criada corretamente, notificar o jogador&lt;br /&gt;
			outputChatBox(&amp;quot;Um erro inesperado ocorreu e a janela de login não foi criada.&amp;quot;)&lt;br /&gt;
	        end&lt;br /&gt;
&lt;br /&gt;
		-- habilitar o cursor para os jogadores (para que eles possam selecionar e clique sobre os componentes)&lt;br /&gt;
	        showCursor(true)&lt;br /&gt;
		-- definir o foco de entrada para a GUI, permitindo que os jogadores (por exemplo) para pressione 'T', sem que o chatbox abra&lt;br /&gt;
	        guiSetInputEnabled(true)&lt;br /&gt;
	end&lt;br /&gt;
)	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note que temos uma simples verificação de segurança antes de tornar a janela visível, no caso improvável de que a janela não foi criada, significa que wdwLogin não é um elemento válido, nós não temos um erro. e apenas informamos o jogador o que aconteceu.&lt;br /&gt;
Na próxima etapa, vamos criar a funcionalidade para o botão de login.&lt;br /&gt;
&lt;br /&gt;
==Programando o botão==&lt;br /&gt;
Agora que nós criamos nossa GUI e mostrou-a para o jogador, é preciso programa-la para que possa funcionar. &lt;br /&gt;
&lt;br /&gt;
===Detectando o clique===&lt;br /&gt;
Quando o jogador clica em qualquer parte da GUI, o evento &amp;quot;[[onClientGUIClick]]&amp;quot; será acionado para o componente GUI que você clicou. Isso nos permite facilmente detectar quaisquer cliques sobre o elemento GUI que deseja usar.&lt;br /&gt;
Por exemplo, podemos anexar o evento para o botão btnLogin para obter todos os cliques sobre ele:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- anexar o evento onClientGUIClick para btnLogin e definir-lo para chamar a função 'submeterLoginClient'&lt;br /&gt;
addEventHandler(&amp;quot;onClientGUIClick&amp;quot;, btnLogin, submeterLoginClient, false)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''Observe o argumento final passado é &amp;quot;false&amp;quot;. Isto indica que o evento só irá acionar diretamente sobre btnLogin, não se o evento tem propagado para cima ou para baixo da árvore. Se configurado para &amp;quot;true&amp;quot;, enquanto anexado ao elemento gui significa que se clicar em qualquer elemento no mesmo ramo vai disparar esse evento.'''&lt;br /&gt;
&lt;br /&gt;
Esta linha de código agora pode ser adicionada dentro da função criarJanelaDeLogin. É um erro comum, tentar anexar eventos a elementos GUI inexistentes,  então certifique-se sempre de anexar os seus eventos '''depois''' o elemento gui (neste caso, o botão) foi criado:&lt;br /&gt;
&lt;br /&gt;
'''Note que vamos agora escrever mais código para a nossa função 'criarJanelaDeLogin'.''' &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function criarJanelaDeLogin()&lt;br /&gt;
	-- criar todos os nossos elementos da GUI&lt;br /&gt;
	...&lt;br /&gt;
&lt;br /&gt;
	-- agora adicionar o evento onClientGUIClick para o botão que acabamos de criar&lt;br /&gt;
	addEventHandler(&amp;quot;onClientGUIClick&amp;quot;, btnLogin, submeterLoginClient, false)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Gerenciando o clique===&lt;br /&gt;
Agora que podemos detectar quando o jogador clica no botão, é preciso escrever o código para gerenciar o que acontece quando ele é clicado.&lt;br /&gt;
Em nosso manipulador de eventos [[onClientClick]], a função submeterLoginClient sempre será chamada quando o botão btnLogin for clicado.&lt;br /&gt;
Portanto, agora podemos usar a função submeterLoginClient para controlar o que acontece quando o botão é clicado:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- criar a função e definir os parâmetros para 'botão' (button) e 'estado' (state)&lt;br /&gt;
-- (eles são passados automaticamente pelo onClientGUIClick)&lt;br /&gt;
function submeterLoginClient(button,state)&lt;br /&gt;
	-- se o nosso botão de login foi clicado com o botão esquerdo do mouse, eo estado do botão do mouse é up&lt;br /&gt;
	if button == &amp;quot;left&amp;quot; and state == &amp;quot;up&amp;quot; then&lt;br /&gt;
		-- mover o foco de entrada de volta para o jogo (permitindo aos jogadores para se movimentar, abrir o chat, etc)&lt;br /&gt;
		guiSetInputEnabled(false)&lt;br /&gt;
		-- ocultar a janela e todos os componentes&lt;br /&gt;
		guiSetVisible(wdwLogin, false)&lt;br /&gt;
		-- desabilitar o cursor do mouse&lt;br /&gt;
		showCursor(false)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Agora, quando o botão é clicado, a janela será ocultada e todos os controles serão permitidos para o jogador. Em seguida, vamos ligar com o lado server para permitir que o jogador execute spawn.&lt;br /&gt;
&lt;br /&gt;
===Chamando o lado server===&lt;br /&gt;
Chamando o lado server pode ser feito usando [[triggerServerEvent]]. Isto lhe permite chamar um evento especificado no server através do client. Se quiser chamar o client através do server pode ser feito usando [[triggerClientEvent]].&lt;br /&gt;
Aqui, usamos a função [[triggerServerEvent]] para chamar o nosso evento personalizado no lado server, chamado &amp;quot;submeterLogin&amp;quot;, que irá controlar a função de spawn que é do lado server.&lt;br /&gt;
&lt;br /&gt;
'''Note que iremos agora escrever mais código para a nossa função 'submeterLoginClient'. Esta não é uma nova função e se destina a substituir o que você já tem.''' &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function submeterLoginClient(button,state)&lt;br /&gt;
	if button == &amp;quot;left&amp;quot; and state == &amp;quot;up&amp;quot; then&lt;br /&gt;
		-- obter o texto inserido no campo 'nomeDeUsuario'&lt;br /&gt;
		local nomeDeUsuario = guiGetText(editUsuario)&lt;br /&gt;
		-- obter o texto inserido no campo 'senha'&lt;br /&gt;
		local senha = guiGetText(edtSenha)&lt;br /&gt;
&lt;br /&gt;
		-- se o nome de usuário e senha existem&lt;br /&gt;
		if nomeDeUsuario and senha then&lt;br /&gt;
			-- acionar o evento server 'submeterLogin' e passar o nome de usuário e senha para ele&lt;br /&gt;
			triggerServerEvent(&amp;quot;submeterLogin&amp;quot;, getRootElement(), nomeDeUsuario, senha)&lt;br /&gt;
&lt;br /&gt;
			-- ocultar a gui, desabilitar o cursor e retornar o controle para o jogador&lt;br /&gt;
			guiSetInputEnabled(false)&lt;br /&gt;
			guiSetVisible(wdwLogin, false)&lt;br /&gt;
			showCursor(false)&lt;br /&gt;
		else&lt;br /&gt;
			-- caso contrário, irá sair uma mensagem para o jogador, se o nome de usuário e/ou senha não existem&lt;br /&gt;
			-- e não ocultar a gui&lt;br /&gt;
			outputChatBox(&amp;quot;Por favor, digite o nome de usuário e senha.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o evento do lado server===&lt;br /&gt;
Neste ponto nós temos agora todos os códigos necessários no lado do client, então abra seu arquivo do lado server 'script.lua' (do  [[PT-BR/Introducao_ao_Scripting|Introdução ao Scripting]]) ou outro arquivo do lado server adequado para trabalhar.&lt;br /&gt;
&lt;br /&gt;
No lado do servidor, lembre-se que o jogador executará o spawn assim que entrar.&lt;br /&gt;
Então, em primeiro lugar, teremos que definir o evento personalizado que iremos usar antes no client. Isto pode ser feito usando [[addEvent]] e [[AddEventHandler]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- criar nossa função loginHandler, com parâmetros 'username' e 'senha' (passado pelo client gui)&lt;br /&gt;
function loginHandler(username,senha)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- definir o nosso evento personalizado e permitir que ele seja acionado a partir do cliente ('true')&lt;br /&gt;
addEvent(&amp;quot;submeterLogin&amp;quot;,true)&lt;br /&gt;
-- adicionar um manipulador de eventos para quando 'submeterLogin' for acionado, a função 'loginHandler' é chamada&lt;br /&gt;
addEventHandler(&amp;quot;submeterLogin&amp;quot;,root,loginHandler)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Efetuando login===&lt;br /&gt;
Agora, temos uma função que é chamada através do evento personalizado 'submeterLogin', podemos começar a trabalhar com o login e spawn do jogador, usando a nossa função 'loginHandler':&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function loginHandler(username,senha)&lt;br /&gt;
	-- verificar se o nome de usuário e senha estão corretos&lt;br /&gt;
	if username == &amp;quot;user&amp;quot; and senha == &amp;quot;apple&amp;quot; then&lt;br /&gt;
		-- se o jogador foi logado com sucesso, então gerar ele no jogo&lt;br /&gt;
		if (client) then&lt;br /&gt;
			spawnPlayer(client, 1959.55, -1714.46, 10)&lt;br /&gt;
			fadeCamera(client, true)&lt;br /&gt;
                        setCameraTarget(client, client)&lt;br /&gt;
			outputChatBox(&amp;quot;Bem-vindo ao servidor.&amp;quot;, client)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- se o nome de usuário ou senha não estão corretos, informar para o jogador&lt;br /&gt;
		outputChatBox(&amp;quot;Nome de usuário e senha inválidos. Por favor, tente novamente.&amp;quot;,client)&lt;br /&gt;
        end			&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
addEvent(&amp;quot;submeterLogin&amp;quot;,true)&lt;br /&gt;
addEventHandler(&amp;quot;submeterLogin&amp;quot;,root,loginHandler)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
'''Para os fins deste tutorial, um sistema de username e senha muito básico é mostrado. Para uma alternativa mais compreensiva, você pode usar o Sistema de Conta ou um banco de dados MySQL.'''&lt;br /&gt;
&lt;br /&gt;
Observe também o uso da variável &amp;quot;client&amp;quot;, é uma variável interna usada pelo MTA para identificar o jogador que disparou o evento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalmente, não se esqueça de incluir o arquivo gui.lua novo no meta.xml do recurso principal, e nomeá-lo como um script client:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;client/gui.lua&amp;quot; type=&amp;quot;client&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Neste ponto, temos agora uma janela de login básico que verifica nome de usuário do jogador e senha quando o botão de login é clicado. Se eles estiverem corretos, o jogador é automaticamente gerado no jogo.&lt;br /&gt;
&lt;br /&gt;
Para mais ajuda com GUI, consulte [[:Category:GUI_Tutorials|Tutoriais GUI]].&lt;br /&gt;
&lt;br /&gt;
[[Category:GUI_Tutorials]]&lt;br /&gt;
&lt;br /&gt;
[[en:Introduction to Scripting the GUI]]&lt;br /&gt;
[[es:Introducción a la Programación de GUI]]&lt;br /&gt;
[[it:Introduzione_allo_scripting_della_GUI]]&lt;br /&gt;
[[ru:Introduction to Scripting the GUI]]&lt;/div&gt;</summary>
		<author><name>Rômulo Neves</name></author>
	</entry>
</feed>