Jump to content

Erro no getElementType


Recommended Posts

Olá, estou com um problema, o script está acusando Warning quando o objeto clicado não é o correto, como arrumar?

WARNING: Blitz/blitz.lua:63: Bad argument @ 'getElementType' [Expected element at argument 1, got nil]

 

function quandoClicar(mouseButton, buttonState, clickedElement, worldPosX, worldPosY, worldPosZ, screenPosX, screenPosY)
    if (mouseButton == "left") and (buttonState == "down") and (getElementType(clickedElement) == "object") and (getElementType(source) == "player") then
        if (getElementData(source, "Modo:Blitz")) == true then
            destroyElement(clickedElement)
        else
            outputChatBox("#FFD700[AVISO] Você precisa estar no modo blitz para tirar os cones, use /blitz.", source, 255,255,255, true)
        end
    end
end
addEventHandler("onPlayerClick", getRootElement(), quandoClicar)

 

Edited by WeeD1
Link to comment
  • Other Languages Moderators

Olá.

Recomendo usar o evento client-side onClientClick. Pois o evento que você está utilizando, ele possui uma área de clique um pouco errada. Creio eu que seja devido à sincronização. Já no evento que citei acima, ele irá reconhecer qualquer elemento, independente da posição, latência ou qualquer outra coisa.

  • Thanks 1
Link to comment
4 hours ago, andreisrw said:

Olá.

Recomendo usar o evento client-side onClientClick. Pois o evento que você está utilizando, ele possui uma área de clique um pouco errada. Creio eu que seja devido à sincronização. Já no evento que citei acima, ele irá reconhecer qualquer elemento, independente da posição, latência ou qualquer outra coisa.

Fiz o teste com client-side, porém ainda sem sucesso, agora o objeto não está mais sendo excluído do mapa

O único erro que acusa é esse: WARNING: Blitz/c.lua:2: Bad argument @ 'getElementType' [Expected element at argument 1, got boolean]

Minha tentativa:

function quandoClicar(button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement)
	if (button == "left") and (state == "down") and (getElementType(clickedElement) == "object") and (getElementType(localPlayer) == "player") then
		if (getElementData(localPlayer, "Modo:Blitz")) == true then
					destroyElement(clickedElement)
		else
			outputChatBox("#FFD700[AVISO] Você precisa estar no modo blitz para excluir algum objeto, use /blitz.", 255,255,255, true)
		end
	end
end
addEventHandler("onClientClick", getRootElement(), quandoClicar)

 

Link to comment
  • Other Languages Moderators
function whenClick(button, state, _, _, _, _, _, clickedElement)
    local isLeft = button == "left"
    local isUp = state == "up"

    if isLeft and isUp then
        local object = clickedElement

        if isElement(object) and getElementType(object) == "object" then
            outputChatBox(getElementModel(object))
        end
    end
end
addEventHandler("onClientClick", root, whenClick)

Código testado.
Não é necessário verificar se a pessoa que clicou é um jogador, pois apenas um jogador pode clicar. Então é sem sentido. Apenas não adicionei aquela elementData, faça isso você mesmo. O código está funcionando perfeitamente.

Edited by andreisrw
  • Thanks 1
Link to comment

Funcionou sim, obrigado

31 minutes ago, andreisrw said:

function whenClick(button, state, _, _, _, _, _, clickedElement)
    local isLeft = button == "left"
    local isUp = state == "up"

    if isLeft and isUp then
        local object = clickedElement

        if isElement(object) and getElementType(object) == "object" then
            outputChatBox(getElementModel(object))
        end
    end
end
addEventHandler("onClientClick", root, whenClick)

Código testado.
Não é necessário verificar se a pessoa que clicou é um jogador, pois apenas um jogador pode clicar. Então é sem sentido. Apenas não adicionei aquela elementData, faça isso você mesmo. O código está funcionando perfeitamente.

Só mais uma dúvida, o destroyElement funciona em client-side? (Não achei no Wiki sobre), pois tentei adicionar ele ao script, e não funcionou. (Sem erro no debugscript)

Se não funcionar, tem alguma forma de eu excluir o objeto sendo client-side?

Link to comment
  • Other Languages Moderators

Você pode sim. Invés de adicionar o destroyElement diretamente, faça um trigger para o server-side, e destrua-o lá.

Spoiler

-- Client-side
function whenClick(button, state, _, _, _, _, _, clickedElement)
    local isLeft = button == "left"
    local isUp = state == "up"

    if isLeft and isUp then
        local object = clickedElement

        if isElement(object) and getElementType(object) == "object" then
            triggerServerEvent("click:destroyObject", resourceRoot, object)
        end
    end
end
addEventHandler("onClientClick", root, whenClick)

-- Server-side
addEvent("click:destroyObject", true)
addEventHandler("click:destroyObject", resourceRoot, function(object)
    destroyElement(object)
    outputChatBox("Você removeu um objeto.", client, 0, 255, 0)
end)

 

NOTA: Apenas objetos que foram criados em determinado lado, podem ser removidos. Objetos criados em client-side, só podem ser manuseados client-side, e vice-versa. Porém, isso não te impede de manuseá-los através de trigger. Posso estar enganado sobre, estou apenas relatando o que aconteceu comigo a algum tempo atrás. ?

  • Thanks 1
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...