yMassai Posted June 17, 2012 Share Posted June 17, 2012 Este projeto de recurso alterá o nível de procurado do jogador, as estrelas do jogador. Com este projeto o jogador poderá obter o nível de estrelas 0-6, no entanto o recurso vem apresentando problemas mas n consigo corrigir, não tenho tanto tempo e nem tanto entendimento ainda estou aprendendo. Se alguém poder me ajudar agradecerei. Client GUIEditor_Window = {} GUIEditor_Button = {} GUIEditor_Label = {} function CriarJanela() local root = getRootElement() wantedJanela = guiCreateWindow(80,80,250,250,"",false) guiWindowSetSizable(wantedJanela,false) --labels labelJanela = guiCreateLabel(20,20,250,60,"Janela de Alteração de Wanted Stats",false,wantedJanela) labelNome = guiCreateLabel(10,55,250,60,"Nome do Jogador :",false,wantedJanela) labelWanted = guiCreateLabel(30,90,250,60,"Wanted Level :",false,wantedJanela) --edit editWanted1 = guiCreateEdit(120,50,120,25,"",false,wantedJanela) editWanted2 = guiCreateEdit(160,85,80,25,"",false,wantedJanela) --Memo memoEdit = guiCreateMemo(10,120,230,80,"Identifique o jogador e selecione o nivel de procurado para a alteração, os niveis podem ser de 0-6 .",false,wantedJanela) --Button buttonAlterar = guiCreateButton(0,210,120,30,"Alterar Nivel",false,wantedJanela) buttonFechar = guiCreateButton(130,210,120,30,"Fechar",false,wantedJanela) guiSetVisible ( wantedJanela, false ) showCursor ( false ) end addEventHandler( "onClientResourceStart", getRootElement( ), CriarJanela) addEventHandler('onClientGUIClick', root, function () if ( source == buttonFechar) then guiSetVisible ( wantedJanela, false ) showCursor ( false ) end end) addEventHandler('onClientGUIClick', root, function () if ( source == buttonAlterar) then guiSetVisible ( JanelaSec, true ) showCursor ( true ) end end) function Visible () guiSetVisible ( wantedJanela, true ) showCursor(true) end addCommandHandler ( "wantedstats", Visible ) local Toyota = getElementData(source,'Level') addEventHandler('onClientGUIClick', root, function() if (source == buttonAlterar) then guiSetText(editWanted2, Toyota) end end) Secundário JanelaSec = guiCreateWindow(200,150,200,120,"",false) MemoSec = guiCreateLabel(10,20,200,200," Você deseja relamnete \nalterar onivel de procurado deste \njogador?",false,JanelaSec) ButtonSec1 = guiCreateButton(0,80,90,100,"Confirmar",false,JanelaSec) ButtonSec2 = guiCreateButton(100,80,90,100,"Cancelar",false,JanelaSec) guiWindowSetSizable(JanelaSec,false) guiSetVisible(JanelaSec,false) addEventHandler('onClientGUIClick', root, function () if ( source == ButtonSec2) then guiSetVisible ( JanelaSec, false ) end end) addEventHandler('onClientGUIClick', root, function() if (source == ButtonSec1) then local who = getPlayerName(localPlayer) if ( who) then guiSetText(editWanted1, who) end end end ) local Toyota = getElementData(localPlayer,'Level') addEventHandler('onClientGUIClick', root, function() if (source == ButtonSec1) then guiSetText(editWanted2, Toyota) triggerServerEvent('onStupidStar',localPlayer) end end) Server addEvent('onStupidStar', true) addEventHandler('onStupidStar', root, function(player) setPlayerWantedLevel( player, 1) outputChatBox('Seu nível de procurado foi alterado!',player,255,255,0) end) Link to comment
Stanley Sathler Posted June 17, 2012 Share Posted June 17, 2012 Bom, segue algumas observações referentes à otimização do seu código: 1) Não é necessário declarar as tabelas GUIEditor_Window, GUIEditor_Button, etc. Por quê? Essas tabelas são criadas automaticamente pelo recurso GUIEditor, e serve para armazenar cada elemento GUI criado (seja um botão, um label ou uma janela). No entanto, você não está utilizando-os para armazenar, mas sim variáveis independentes, como wantedJanela, labelJanela, e por aí vai. 2) Note que na sua linha 52, do primeiro código (Client), você está usando: addEventHandler('onClientGUIClick', root, -- ... your code goes here O uso, nesta linha, está incorreto. Você não deve usar "root" no segundo argumento do addEventHandler() (neste caso), mas sim o botão no qual você quer que a função seja chamada quando este for clicado. No caso, presumo eu, o botão armazenado na variável "buttonAlterar", ficando (lembre-se: na linha 52 do primeiro dos três códigos postados): addEventHandler('onClientGUIClick', buttonAlterar, -- ... your code goes here -- Detalhe: o erro não persiste apenas na linha 52. Há outras ocorrências, como a linha 36. Portanto, procure no seu código todas as ocorrências semelhantes a essa. 3) Você não precisa usar "\n" no Memo para cortar uma frase. Isto porque quando a frase atinge a largura do Memo, a frase se quebra automaticamente. Portanto, "você deseja realmente\n alterar o nível do\n jogador" é desnecessário o uso do "\n" para a quebra de linha. 4) Você precisa identar melhor seus códigos. É complicado lê-los. E use "tab" ao invés de espaço quando for identá-los. Link to comment
Anderl Posted June 17, 2012 Share Posted June 17, 2012 Stanley, você está errado. É necessário sim declarar as tabelas se forem usadas, de outro jeito, não vejo porquê as declarar. O GUIEditor não as cria automaticamente. Apenas as declara no código porque ele usa o estilo GUIEditor_Button[1], GUIEditor_Memo[1], etc. Você pode sim usar o elemento "root" no segundo parametro do evento onClientGUIClick e está correto. E Ninguém, você não precisa declarar ""getRootElement" porque "root" já é uma variável pré-definida. Link to comment
Stanley Sathler Posted June 17, 2012 Share Posted June 17, 2012 - Draken, aí está a questão: as tabelas NÃO foram usadas. Ele usou variáveis independentes, e não os ítens da tabela para armazenar cada elemento. E se estas não foram usadas, não há motivo algum para serem declaradas. E foi exatamente isso que eu quis dizer. - Já quanto o parâmetro do onClientGUIClick, realmente pode ser usado o root como parâmetro, desde que seja usado a condição para verificar se o "source" é o botão desejado, já que com root presumo que a função seja chamada toda vez que o usuário clicar, seja onde for (embora ele tenha feito isso). No entanto, é sempre bom manter o costume e chamar a função somente quando o botão for clicado, ao invés de chamá-la toda vez que o usuário clicar e ficar verificando se o "source" é ou não o "buttonAlterar". Link to comment
yMassai Posted June 17, 2012 Author Share Posted June 17, 2012 Me corrija se eu estiver errado então não há motivos para usar isto: GUIEditor_Window = {} GUIEditor_Button = {} GUIEditor_Label = {} Quando se refere a getRootElement fala sobre a linha 27 do client, por favor explique melhor. Link to comment
DNL291 Posted June 17, 2012 Share Posted June 17, 2012 Pelo que eu vi no código de Ninguem[ATZ], GUIEditor_Window = {} GUIEditor_Button = {} GUIEditor_Label = {} é inútil, e showCursor ( false ) também, além disso, guiSetVisible ( wantedJanela, false ), deveria ficar abaixo do código que cria a janela. Exemplo: wantedJanela = guiCreateWindow(80,80,250,250,"",false) guiWindowSetSizable(wantedJanela,false) guiSetVisible ( wantedJanela, false ) E você está declarando a variavel root por getRootElement(), que já é uma variavel pre-definida. Já que você está usando o botão como fonte do evento onClientGUIClick, e nao declarando nenhum botão, você pode fazer assim: addEventHandler('onClientGUIClick', root, function () if (source == buttonFechar) then guiSetVisible ( wantedJanela, false ) showCursor ( false ) elseif (source == buttonAlterar) then guiSetVisible ( JanelaSec, true ) showCursor ( true ) end -- Assim por diante.. end) Link to comment
yMassai Posted June 17, 2012 Author Share Posted June 17, 2012 function CriarJanela() local root = getRootElement() wantedJanela = guiCreateWindow(80,80,250,250,"",false) guiWindowSetSizable(wantedJanela,false) guiSetVisible ( wantedJanela, false ) --labels labelJanela = guiCreateLabel(20,20,250,60,"Janela de Alteração de Wanted Stats",false,wantedJanela) labelNome = guiCreateLabel(10,55,250,60,"Nome do Jogador :",false,wantedJanela) labelWanted = guiCreateLabel(30,90,250,60,"Wanted Level :",false,wantedJanela) --edit editWanted1 = guiCreateEdit(120,50,120,25,"",false,wantedJanela) editWanted2 = guiCreateEdit(160,85,80,25,"",false,wantedJanela) --Memo memoEdit = guiCreateMemo(10,120,230,80,"Identifique o jogador e selecione o nivel de procurado para a alteração, os niveis podem ser de 0-6 .",false,wantedJanela) --Button buttonAlterar = guiCreateButton(0,210,120,30,"Alterar Nivel",false,wantedJanela) buttonFechar = guiCreateButton(130,210,120,30,"Fechar",false,wantedJanela) end addEventHandler( "onClientResourceStart", getRootElement( ), CriarJanela) addEventHandler('onClientGUIClick', root, function () if (source == buttonFechar) then guiSetVisible ( wantedJanela, false ) showCursor ( false ) elseif (source == buttonAlterar) then guiSetVisible ( JanelaSec, true ) showCursor ( true ) end end) function Visible () guiSetVisible ( wantedJanela, true ) showCursor(true) end addCommandHandler ( "wantedstats", Visible ) local Toyota = getElementData(source,'Level') addEventHandler('onClientGUIClick', root, function() if (source == buttonAlterar) then guiSetText(editWanted2, Toyota) end end) Apresenta mau argumento la linha 49 e na linha 31 do secundário. Acompanhado mau argumento na linha 4 do server, setPlayerWantedLevel Link to comment
DNL291 Posted June 17, 2012 Share Posted June 17, 2012 Não vejo setElementData() onde está? Link to comment
yMassai Posted June 17, 2012 Author Share Posted June 17, 2012 setElementData ( localPlayer, 'Level', Toyota ) Isto? Link to comment
Stanley Sathler Posted June 17, 2012 Share Posted June 17, 2012 A propósito, é importante notar que no código server-side postado, o setPlayerWantedLevel() está definindo o número de estrelas para "1", independente do valor escolhido no GUI. Você precisa chamar o evento e enviar o número de estrelas (como argumento), para então usá-lo, seguindo estes passos: wantedValue = guiGetText(editWanted2) --a variavel wantedValue passa a ter o texto contido no editWanted2 ------ triggerServerEvent("onStupidStart", localPlayer, wantedValue) --chama o evento onStupidStart e envia como argumento o valor de wantedValue ------ addEventHandler('onStupidStar', root, function(wantedValue) --criamos a funcao e definimos o argumento que ira armazenar o valor do nivel setPlayerWantedLevel(source, tonumber(wantedValue)) outputChatBox('Seu nível de procurado foi alterado!',source,255,255,0) end) ------ Em resumo, é isso. Aí você precisa implementar no seu código, colocando cada função em seu respectivo lugar. Link to comment
yMassai Posted June 17, 2012 Author Share Posted June 17, 2012 (edited) sim mas ficaria: wantedValue = guiSetText(editWanted2, Toyota) triggerServerEvent("onStupidStar", localPlayer, wantedValue) e server addEvent('onStupidStar', true) addEventHandler('onStupidStar', root, function(wantedValue) setPlayerWantedLevel(source, tonumber(wantedValue)) outputChatBox('Seu nível de procurado foi alterado!',source,255,255,0) end) Edited June 18, 2012 by Guest Link to comment
Stanley Sathler Posted June 17, 2012 Share Posted June 17, 2012 Não. Seria "guiGetText()", porque você quer pegar o valor do elemento, e não definí-lo. Link to comment
yMassai Posted June 18, 2012 Author Share Posted June 18, 2012 addEvent('onStupidStar', true) addEventHandler('onStupidStar', root, function(wantedValue) setElementData ( localPlayer, 'Level', Toyota ) setPlayerWantedLevel(source, tonumber(wantedValue)) outputChatBox('Seu nível de procurado foi alterado!',source,255,255,0) end) Mau argumento na linha 4 setElementData, e 5 setPlayerWantedLevel Eu notei que só é mudado o nivel da pessoas que esta efetuando a alteração. Link to comment
Anderl Posted June 18, 2012 Share Posted June 18, 2012 setElementData ( localPlayer, 'Level', Toyota ) Errado. Toyota = nil localPlayer é só client-side! Link to comment
Stanley Sathler Posted June 18, 2012 Share Posted June 18, 2012 No setElementData() você pode usar "source" que, na função, é o jogador que a chamou (nesse caso). Pois, como dito pelo Draken, localPlayer é uma variável que armazena uma função client-side (getLocalPlayer()). - Quanto ao argumento da linha 5, você mudou o "guiSetText()" para "guiGetText()"? A propósito, o que o console (MTA Server.exe) diz? (Geralmente ele diz algo como "expected number, got nil", ou algo desse tipo. O que o seu diz? Para sabermos o que foi enviado à função) Tenta também mudar o nome da variável no server-side, só por tentativa mesmo (embora eu não sei se vá resolver, preciso realmente da resposta do Console): addEvent('onStupidStar', true) addEventHandler('onStupidStar', root, function(wantedToApply) setElementData ( source, 'Level', Toyota ) -- Nesse caso, source é o jogador setPlayerWantedLevel(source, tonumber(wantedToApply)) outputChatBox('Seu nível de procurado foi alterado!',source,255,255,0) end) Link to comment
yMassai Posted June 18, 2012 Author Share Posted June 18, 2012 O console só mostra o mau argumento no server linha 5, setPlayerWantedLevel O debugscript mostra client.lua44:bad argument @ 'getElementData' [expected element at argument 1, got nil] secundario.lua31:bad argument @ 'guiSetText' [expected string at argument 2 got boolean] Link to comment
Stanley Sathler Posted June 18, 2012 Share Posted June 18, 2012 client.lua44:bad argument @ 'getElementData' [expected element at argument 1, got nil]secundario.lua31:bad argument @ 'guiSetText' [expected string at argument 2 got boolean] Era exatamente isso que eu queria. Bom, vamos lá: 1) Você editou os arquivos? O erro diz "client.lua44", mas a linha 44 do arquivo client postado no seu tópico não contém essa função. De qualquer forma, getElementData() não pode ser usado em arquivos client, porque é uma função apenas server-side. 2) O segundo erro, "secundario.lua31", eu usei guiGetText() (eu já disse que é GetText e não SetText, arrume isso) usando como primeiro argumento o elemento "editWanted2", que é o guiEdit usado por você para podermos digitar o level de procurado. Só que esta é uma variável presente no arquivo "client.lua", mas ausente no arquivo "secundario.lua". Ou seja, você precisa usar no arquivo client.lua, e não no secundario.lua. Aliás, eu não vejo o porque de criar um novo arquivo lua para armazenar a segunda janela. Você pode construir tudo usando apenas o arquivo client.lua, mas chamando a segunda janela somente quando necessário. Link to comment
Anderl Posted June 18, 2012 Share Posted June 18, 2012 Stan, você está errado de novo A função "getElementData" é client e server side. Link to comment
Stanley Sathler Posted June 18, 2012 Share Posted June 18, 2012 Lol, é mesmo. Eu podia jurar que getElementData() e setElementData() era apenas server-side. O_O Link to comment
yMassai Posted June 18, 2012 Author Share Posted June 18, 2012 Sim me desculpe a parte guiSetText foi uma distração. Mas ainda obtenho alguns erros como client.lua44:bad argument @ 'getElementData' [expected element at argument 1, got nil]server.lua5:bad argument @ 'setPlayerWantedLevel' eu já havia falado mas não intendi muito bem, pois o nivel alterado é somente do jogador que efetua a troca e não do jogador que é determinado sobre o 'editWanted1'. Link to comment
Stanley Sathler Posted June 19, 2012 Share Posted June 19, 2012 Matheus (posso te chamar assim, não posso? É estranho chamar de "Ninguem" ), você seguiu minhas recomendações propostas na última postagem da primeira página? Use-o. Usando-o, basta apenas corrigir o problema de alterar o nível de quem está executando, e não do jogador selecionado. Para tal, usamos: --Client-side script wantedValue = guiGetText(editWanted2) --a variavel wantedValue passa a ter o texto contido no editWanted2 playerName = guiGetText(editWanted1) --a variavel playerName passa a ter o texto contido no editWanted1 ------ triggerServerEvent("onStupidStar", localPlayer, wantedValue, playerName) --chama o evento onStupidStart e envia como argumento o valor de wantedValue ------ -- Server-side script addEventHandler('onStupidStar', root, function(wantedToApply, playerToApply) --criamos a funcao e definimos o argumento que ira armazenar o valor do nivel setPlayerWantedLevel(getPlayerFromName(playerToApply), tonumber(wantedToApply)) --definimos o nivel de procurado outputChatBox('Seu nível de procurado foi alterado!',getPlayerFromName(playerToApply),255,255,0) end) ------ Link to comment
yMassai Posted June 19, 2012 Author Share Posted June 19, 2012 Eu não compreendo o porque dos erros eles continuam e a resposta obtida através do debugscript é : client.lua44:bad argument @ 'getElementData' [expected element at argument 1, got nil]server.lua5:bad argument @ 'setPlayerWantedLevel' Link to comment
Stanley Sathler Posted June 19, 2012 Share Posted June 19, 2012 Mostre os códigos novamente. Link to comment
yMassai Posted June 20, 2012 Author Share Posted June 20, 2012 (edited) Client function CriarJanela() local root = getRootElement() wantedJanela = guiCreateWindow(80,80,250,250,"",false) guiWindowSetSizable(wantedJanela,false) guiSetVisible ( wantedJanela, false ) --labels labelJanela = guiCreateLabel(20,20,250,60,"Janela de Alteração de Wanted Stats",false,wantedJanela) labelNome = guiCreateLabel(10,55,250,60,"Nome do Jogador :",false,wantedJanela) labelWanted = guiCreateLabel(30,90,250,60,"Wanted Level :",false,wantedJanela) --edit editWanted1 = guiCreateEdit(120,50,120,25,"",false,wantedJanela) editWanted2 = guiCreateEdit(160,85,80,25,"",false,wantedJanela) --Memo memoEdit = guiCreateMemo(10,120,230,80,"Identifique o jogador e selecione o nivel de procurado para a alteração, os niveis podem ser de 0-6 .",false,wantedJanela) --Button buttonAlterar = guiCreateButton(0,210,120,30,"Alterar Nivel",false,wantedJanela) buttonFechar = guiCreateButton(130,210,120,30,"Fechar",false,wantedJanela) end addEventHandler( "onClientResourceStart", getRootElement( ), CriarJanela) addEventHandler('onClientGUIClick', root, function () if (source == buttonFechar) then guiSetVisible ( wantedJanela, false ) showCursor ( false ) elseif (source == buttonAlterar) then guiSetVisible ( JanelaSec, true ) showCursor ( true ) end end) function Visible () guiSetVisible ( wantedJanela, true ) showCursor(true) end addCommandHandler ( "wantedstats", Visible ) local Toyota = getElementData(getPlayerFromName(guiGetText(editWanted1)),'Level') addEventHandler('onClientGUIClick', root, function() if (source == ButtonSec1) then wantedValue = guiGetText(editWanted2, Toyota) triggerServerEvent("onStupidStar", localPlayer, wantedValue, playerName) end end) -------------------------------------------------------------------------------------- JanelaSec = guiCreateWindow(200,150,200,120,"",false) MemoSec = guiCreateLabel(10,20,200,200," Você deseja relamnete \nalterar onivel de procurado deste \njogador?",false,JanelaSec) ButtonSec1 = guiCreateButton(0,80,90,100,"Confirmar",false,JanelaSec) ButtonSec2 = guiCreateButton(100,80,90,100,"Cancelar",false,JanelaSec) guiWindowSetSizable(JanelaSec,false) guiSetVisible(JanelaSec,false) addEventHandler('onClientGUIClick', root, function () if ( source == ButtonSec2) then guiSetVisible ( JanelaSec, false ) end end) addEventHandler('onClientGUIClick', root, function() if (source == ButtonSec1) then local who = getPlayerName(localPlayer) if ( who) then playerName = guiGetText(editWanted1, who) end end end ) local Toyota = getElementData(localPlayer,'Level') addEventHandler('onClientGUIClick', root, function() if (source == ButtonSec1) then guiGetText(editWanted2, Toyota) triggerServerEvent('onStupidStar',localPlayer) guiSetVisible ( JanelaSec, false ) end end ) Server addEvent('onStupidStar', true) addEventHandler('onStupidStar', root, function(wantedToApply, playerToApply) setElementData ( source, 'Level', Toyota ) setPlayerWantedLevel(getPlayerFromName(playerToApply), tonumber(wantedToApply)) outputChatBox('Seu nível de procurado foi alterado!',getPlayerFromName(playerToApply),255,255,0) end) Edited June 20, 2012 by Guest Link to comment
Stanley Sathler Posted June 20, 2012 Share Posted June 20, 2012 Cara, o seu código possui realmente muitos erros. Muitos mesmo. Muitos membros aqui poderiam recriá-lo facilmente, em poucos minutos. Mas como o objetivo é fazer VOCÊ aprender, então sugiro que reescreva todo o seu código do zero levando em consideração todas as dicas que postamos ao longo deste tópico. Você precisa também entender o que postamos aqui. Não simplesmente copiar, mas entender. Como já conversamos, muitos dos seus erros são causados por ausência de conhecimento referente ao básico de programação (funções, argumentos em funções, etc). Não adianta querer aprender Lua sem conhecer a lógica de programação. Não pode querer dar passos maiores que as pernas. Link to comment
Recommended Posts