Jump to content

Bind para executar funções por marker


Recommended Posts

Estou com um script e criei algumas binds, na mesma tecla, porém executa funções diferentes, e para executar a função tem que estar no marker, o código (apenas das binds) é esse:

 

------------- exemplo1
function bindexemplo1()
	for i, v in ipairs(getElementsByType("player")) do
		bindKey(v, "g", "down", function1)
	end
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), bindexemplo1)

function bindexemplo11()
	bindKey(source, "g", "down", function1)
end
addEventHandler("onPlayerJoin", getRootElement(), bindexemplo11)
------------- exemplo2
function bindexemplo2()
	for i, v in ipairs(getElementsByType("player")) do
		bindKey(v, "g", "down", function2)
	end
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), bindexemplo2)

function bindexemplo22()
	bindKey(source, "g", "down", function2)
end
addEventHandler("onPlayerJoin", getRootElement(), bindexemplo22)


queria saber se dá algum problema usar a mesma tecla para executar as funções diferentes, deixando claro que no inicio das funções coloquei para que se o player estiver no marker então executa com a bind, cada função é um marker diferente.

Existe algum problema nisso? se sim tem alguma forma correta para usar?


edit: Até então não deu nenhum debug e estava funcionando tudo perfeitamente, só queria saber se pode ocasionar algum bug futuramente ou se tem como "otimizar" o código.

Edited by wesssley
Link to comment
  • Other Languages Moderators
  1. Prefira usar variáveis predefinidas.
    1. Troque todos os getResourceRootElement(getThisResource()) por resourceRoot.
    2. Troque todos os getRootElement() por root.
  2. Ao usar getElementsByType, a ordem dos elementos não importa. O pairs é um pouco mais rápido que o ipairs.
    1. Troque todos os ipairs por pairs.
  3. Por não ser necessário o índice, você pode ignorar a variável i dos loops, trocando eles por _ (underline).
    1. Troque todos os i dos loops por _
  4. Não adicione o mesmo evento várias vezes. No seu exemplo você está adicionando 2 onPlayerJoin e 2 onResourceStart.
    1. Coloque todos os bindKey na mesma função onde está o onPlayerJoin e o onResourceStart.
    2. Delete as funções e eventos repetidos.
Edited by Lord Henry
Link to comment
  • Other Languages Moderators

Dica sobre os markers:

Crie uma tabela com todos os markers para poupar espaço na memória mantendo todos eles na mesma variável.

É melhor fazer assim do que vários createMarkers em variáveis diferentes.

local theMarkers = {
    createMarker(0, 0, 3.5, "cylinder"),
    createMarker(0, 4, 3.5, "cylinder"),
    createMarker(0, -4, 3.5, "cylinder"),
}

function function1(keyPresser, key, keyState) -- Função que é ativada ao apertar a tecla bindada G.
    if isElementWithinMarker (keyPresser, theMarkers[1]) then -- Se o jogador que apertou a tecla estiver dentro do primeiro marker, então:
        -- Faz tal coisa.
    elseif isElementWithinMarker (keyPresser, theMarkers[2]) then -- Senão, se ele estiver no segundo marker, então:
        -- Faz outra coisa.
    elseif isElementWithinMarker (keyPresser, theMarkers[3]) then -- E assim por diante.
        -- Faz outra coisa.
    end
end

-- Não precisa da function2, pois todos os markers ativarão a function1 que vai determinar oq cada um faz.

 

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