Jump to content

Nível de Procurado


Recommended Posts

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
  • Replies 60
  • Created
  • Last Reply

Top Posters In This Topic

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

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

- 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
  • Moderators

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
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

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

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 by Guest
Link to comment
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

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

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
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

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

Matheus (posso te chamar assim, não posso? É estranho chamar de "Ninguem" :P), 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

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

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 by Guest
Link to comment

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
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...