Jump to content

[Ajuda] Qual o erro?


Recommended Posts

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

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

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

Link to comment

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

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