Jump to content

[Interação com Objeto] Como Retornar posição que esta na tabela para verificação?


Recommended Posts

Iae rapaziada, seguinte fiz um code simples só para aprender melhor tabela, até agora estava tudo normal criando as markers, a mensagem na tela e tudo mais.... porém agora estou com o seguinte problema:

São 3 markers cada uma tem uma cadeira do lado. O que tenho em mente é que quando o player hitar uma das markers binde a tecla E, ao pressiona-la ele é colocado sobre a cadeira em que ele esta próximo. Mas no sistema atual o problema é que ele não reconhece qual cadeira é! Quero saber como eu posso fazer uma verificação para saber se a marker é da cadeira [1], [2] ou [3].

Code: 

local posChairs = {
    [1] = {1579.4000244141,-1675.8000488281 ,15.199999809265}, -- cadeira interrogado (suspeito) 1
    [2] = {1580, -1677.5, 15.199999809265}, -- cadeira interrogado (suspeito) 2
    [3] = {1582.0999755859, -1676.3000488281, 15.199999809265}, -- -- cadeira interrogador (policial)
}

local chairTable = {}

function resStart()
    for i, chair in ipairs(posChairs) do
        chairTable[i] = createMarker(chair[1], chair[2], chair[3], "cylinder", 1.2, 255,0, 0, 100)
        outputChatBox(tostring(chairTable[i]))
        addEventHandler("onMarkerHit", chairTable[i], hittingMk)
        addEventHandler("onMarkerLeave", chairTable[i], leavingMk)
    end
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), resStart)

function resStopCircle()
    if chairTable[i] then
        destroyElement(chairTable[i])
        chairTable[i] = nil
        outputChatBox(tostring(chairTable[i]))
    end
end
addEventHandler("onResourceStop", getResourceRootElement(getThisResource()), resStopCircle)

function hittingMk (element, md)
    if (md) then
        if getElementType(element) == "player" then
            outputChatBox("hitou")
            exports.inMarkerMsg:create(element, "pressione E para sentar")
        end
    end
end

function leavingMk (element, md)
    if (md) then
        if getElementType(element) == "player"  then
            outputChatBox("saiu")
            exports.inMarkerMsg:delete(element)
        end
    end
end

Obs: estou ciente que se eu criar 3 variáveis e 3 eventos uma para cada cadeira dará certo (já testei e consegui!), porém irei criar mais cadeiras além de utilizar esse sistema em outras coisas!

fazendo um for com a tabela (chairTable), percebi que há uma edentação um "prefixo" e um "valor":

        for k,v in pairs(chairTable) do
            outputChatBox("chairTable "..tostring(k)..", "..tostring(v))
        end

Retorna:

chairTable 1, userdata: 0x7289

chairTable 2, userdata: 0x728c

chairTable 3, userdata: 0x728f

Tentei fazer uma verificação com if dessa forma (porém sem exito) :

if chairTable[1] then
   outputChatBox("hitou1")
elseif chairTable[2] then
   outputChatBox("hitou2")
elseif chairTable[3] then
   outputChatBox("hitou3")
end

Será que tem como eu especificar a cadeira sem ter que criar para cada cadeira(marker), um evento e uma variável?

Link to comment

As linha que editei eu comentei. Dai quando o cara sentar você seta o inUse como true para outra pessoa não conseguir sentar. Dai você vai precisar fazer os bindKey

 

local posChairs = {
    [1] = {1579.4000244141,-1675.8000488281 ,15.199999809265}, -- cadeira interrogado (suspeito) 1
    [2] = {1580, -1677.5, 15.199999809265}, -- cadeira interrogado (suspeito) 2
    [3] = {1582.0999755859, -1676.3000488281, 15.199999809265}, -- -- cadeira interrogador (policial)
}


local chairDatas = { 	-- Tabela com algumas "config" da cadeira.
	ID = {}, 			-- ID da cadeira.
	inUse = {},			-- Se a cadeira está em uso.
}

local chairTable = {}

function resStart()
    for i, chair in ipairs(posChairs) do
        chairTable[i] = createMarker(chair[1], chair[2], chair[3], "cylinder", 1.2, 255,0, 0, 100)
        chairDatas.ID[chairTable[i]] = i			-- Seta o ID na tabela chairDatas
        chairDatas.inUse[chairTable[i]] = false		-- Seta o inUse como false na tabela chairDatas
        outputChatBox(tostring(chairTable[i]))
        addEventHandler("onMarkerHit", chairTable[i], hittingMk)
        addEventHandler("onMarkerLeave", chairTable[i], leavingMk)
    end
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), resStart)

function resStopCircle()
    if chairTable[i] then
        destroyElement(chairTable[i])
        chairTable[i] = nil
		
        destroyElement(chairDatas.ID)
        destroyElement(chairDatas.inUse)
        chairDatas.ID = nil
        chairDatas.inUse = nil
		
        outputChatBox(tostring(chairTable[i]))
    end
end
addEventHandler("onResourceStop", getResourceRootElement(getThisResource()), resStopCircle)

function hittingMk (element)
	if getElementType(element) == "player" and getElementType(source) == "marker" then
		if chairDatas.inUse[source] == false then
			outputChatBox("Hitting Chair ID: "..chairDatas.ID[source]..".")		-- Retorna o ID da cadeira.
			exports.inMarkerMsg:create(element, "pressione E para sentar")
		else
			outputChatBox("Chair in use.")		-- Se a cadeira está em uso.
		end
	end
end

function leavingMk (element)
	if getElementType(element) == "player" and getElementType(source) == "marker" then
		outputChatBox("Leaving Chair ID: "..chairDatas.ID[source]..".")		-- Retorna o ID da cadeira.
		exports.inMarkerMsg:delete(element)
	end
end

EDIT: Não testei.

Edited by Tommy.
  • 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...