FelipeMallmann Posted May 9, 2015 Share Posted May 9, 2015 Fala galera, estou com uma pequena duvida, estou tendo problemas com esse comando. Quando um player, vip, usa o comando /explosivo, um explosivo é criado, porem, se outro jogador, tmb vip, tenta usar, aparece que ele ja criou um explosivo. Ou seja, como tornar o comando restrito 1 vez pra cada player, e nao para o grupo vip todo. Eu usei o blockCreate para permitir/proibir o comando, porem qndo um usa, ele se torna true, e nenhum dos demais vips podem criar o seu. Há alguma maneira de tornar o blockCreate true somente para o player que digitou o comando? Obrigado local blockCreate = false function createBarrier(thePlayer) if isVip(thePlayer) then if (blockCreate ~= true) then local x, y, z = getElementPosition(thePlayer) barrierObject = createObject(1225, x-1, y, z-0.6) if (barrierObject ~= false) then blockCreate = true end if (isPedInVehicle(thePlayer)) then end else outputChatBox("Voce ja criou um explosivo, use /re (remover explosivo) para poder criar novamente.", thePlayer, 250, 0, 0) end end end addCommandHandler("explosivo", createBarrier) function deleteBarrier(thePlayer) if isVip(thePlayer) then if (isElement(barrierObject)) then destroyElement(barrierObject) blockCreate = false else outputChatBox("Nao existe nenhum explosivo criado!", thePlayer, 250, 0, 0) end end end addCommandHandler("re", deleteBarrier) Link to comment
n3wage Posted May 9, 2015 Share Posted May 9, 2015 Dá pra fazer com Tabelas local Objeto = {} -- Criamos a tabela que ira listar o objeto de cada jogador. function createBarrier(thePlayer) if isVip(thePlayer) then if not Objeto[thePlayer] then -- se o jogador não tiver listado na tabela.. local x, y, z = getElementPosition(thePlayer) Objeto[thePlayer] = createObject(1225, x-1, y, z-0.6) -- listamos ele, definindo Objeto[thePlayer] como o objeto criado if (isPedInVehicle(thePlayer)) then end else outputChatBox("Voce ja criou um explosivo, use /re (remover explosivo) para poder criar novamente.", thePlayer, 250, 0, 0) end end end addCommandHandler("explosivo", createBarrier) function deleteBarrier(thePlayer) if isVip(thePlayer) then if Objeto[thePlayer] then -- se ele tiver listado ... destroyElement( Objeto[thePlayer] ) -- destruimos o objeto Objeto[thePlayer] = nil -- removemos ele da tabela else outputChatBox("Nao existe nenhum explosivo criado por você!", thePlayer, 250, 0, 0) end end end addCommandHandler("re", deleteBarrier) Não tem nenhum erro no seu script, o problema é que a variavel é setada como true para todos os jogadores quando alguem cria um explosivo, Sendo assim temos que usar tabelas ou element datas (não recomendavel para esse tipo de script simples). Link to comment
FelipeMallmann Posted May 9, 2015 Author Share Posted May 9, 2015 Funcionou perfeitamente, muito obrigado!! Link to comment
Stanley Sathler Posted May 10, 2015 Share Posted May 10, 2015 Você conhece a função setElementData()? É como se fosse um banco de dados temporário com três colunas: elemento, chave e valor. Quando o usuário digitar /explosivo, você pode usar setElementData(thePlayer, "hasExplosive", true), indicando que aquele usuário acaba de criar um explosivo e, portanto, a partir de agora já tem um criado. Quando quiser checar se ele já tem um explosivo criado ou não, você usa getElementData(thePlayer, "hasExplosive"), que simplesmente retorna o valor (neste caso, true ou false). Você pode simplesmente definir qualquer valor com o setElementData(). Um valor booleano, uma string, um inteiro... qualquer valor. Só a chave (segundo argumento) é que precisa ser única, para não causar conflitos. Não vejo problema nenhum em usar element datas com um script pequeno, principalmente porque são destruídos quando o usuário se desconecta. Link to comment
FelipeMallmann Posted May 10, 2015 Author Share Posted May 10, 2015 Hmm, entendi, mas eu não tenho essa compreensão avançada, por que com Tabelas não é recomendado? Isso pesa mais, é mais lento, o que é? Obrigado StanleySathler! Link to comment
n3wage Posted May 10, 2015 Share Posted May 10, 2015 As element data is synced to all clients, it can generate a lot of network traffic and consume server CPU Fora que é mais facil usar tabelas (e também ajuda a aprender mais sobre a linguagem), eu por exemplo, só uso element data's quando preciso sincronizar coisas entre vários resources (mesmo assim evito ao maximo usando exports) Antes que fale, eu sei do quarto argumento da função setElementData, porem nunca vi ninguem usando ele (alguns nem sabem que ele existe...) ainda tem o fato de elas poderem ser modificas no lado do client, Enfim, cada um usa o método que prefere Link to comment
Stanley Sathler Posted May 10, 2015 Share Posted May 10, 2015 Felipe, de forma alguma usar tabelas não é recomendado. Só apresentei outra alternativa. Há diferenças sim, mas em um nível mais aprofundado referente ao gerenciamento de memória. Totalmente insignificante neste caso. Quanto ao tráfico, ele é gerado justamente quando fazemos, efetivamente, a sincronização. Tanto que a própria Wiki aconselha usarmos lançadores de eventos ao invés de utilizar element datas para este tipo de sincronia. No caso do código em questão, não trata-se de sincronização. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now