Jump to content

Trabalho de Lixeiro


Recommended Posts

Opa rapaziada eu tava precisando de ajuda com um bglh, vou mostrar aq. Estou tentando fzr um emprego de lixeiro mas nao queria usar tantos e tantos elementData e queria fazer por tabela. A parte de pegar o emprego está suave, e para aparecer os blip e marker tbm apenas quando pegar o emprego ta suave.

lixeira1 = createMarker(1983.001, -1744.44, 13.547, "cylinder", 1.2, 70, 58, 88, 100)
lixeira2 = createMarker(1993.668, -1738.607, 13.547, "cylinder", 1.2, 70, 58, 88, 100)

bliplixeira1 = createBlipAttachedTo(lixeira1, 2)
setBlipVisibleDistance(bliplixeira1, 2000)
setElementVisibleTo(bliplixeira1, root, false)

setElementVisibleTo(lixeira1, root, false)
setElementVisibleTo(lixeira2, root, false)

Eu quero transformar os marker em uma tabela para ficar mais limpo o codigo

function PegarLixo1(source)
    local Lixeiro = getElementData(source, "Lixeiro")
    if Lixeiro == true then
        if isElementWithinMarker(source, lixeira1) then
            local random = math.random(4, 20)
            exports["Bahamas_Inventory"]:BHM_GiveItem(source, "dollars", random)
            setElementVisibleTo(lixeira1, source, false)
            setElementVisibleTo(bliplixeira1, source, false)
            setElementFrozen(source, true)
            setTimer(triggerClientEvent, 1100, 1, source, "progressService", root, 6, "")
            setPedAnimation(source, "uzi", "uzi_reload", 6500, true, false, false, false)
            setTimer(function()
                exports['infobox']:showInfobox(source, "Você recolheu oque estava nessa lata de lixo", "success")
                setElementFrozen(source, false)
            end, 6500, 1)
        end
    end
end
addEventHandler("onMarkerHit", lixeira1, PegarLixo1)

Aqui é a parte que seria para pegar oq estaria nos markers, mas eu queria que quando pegasse em 1 marker sumiria e apenas quando sair e pegar o emprego dnv resetaria tudo.
e eu sei fzr para n ficar repetindo o marker e tals mas eu teria q ficar duplicando esse codigo varias e varias vezes e nao quero fazer isso, eu quero deixar limpo e leve
quem poder me ajudar eu ia agradecer dms pprt

Link to comment

Você está passando o source como parâmetro, nunca faça isso! O source é o marker que foi "hitado", o 1° argumento é o hitElement (pode ser um carro, player, objeto etc...).

Você quer fazer uma função mais genérica né, eu estou meio sem tempo pra algo perfeitinho mas ficaria mais ou menos assim:

local posLixeiras = {
	[1] = {1983.001, -1744.44, 13.547},
	[2] = {1993.668, -1738.607, 13.547},
}

local Lixeiras = {}
local blipLixeiras = {}

addEventHandler('onResourceStart', resourceRoot, function ()
  for i, pos in ipairs (posLixeiras) do
     Lixeiras[i] = createMarker(pos[1], pos[2], pos[3], "cylinder", 1.2, 70, 58, 88, 100)
     blipLixeiras[i] = createBlipAttachedTo(Lixeiras[i], 2)
     setBlipVisibleDistance(blipLixeiras[i], 2000)
     setElementVisibleTo(blipLixeiras[i], root, false)
     setElementVisibleTo(Lixeiras[i], root, false)
     setElementVisibleTo(Lixeiras[i], root, false)
     addEventHandler("onMarkerHit", Lixeiras[i], PegarLixo)
  end
end)

function getMarkerPositionInTable (marker)
  for i, m in ipairs (Lixeiras) do
    if marker == m then return i end
  end
  return false
end

function PegarLixo(hitElement)
  if getElementData(hitElement, "Lixeiro") then
    local i = getMarkerPositionInTable(source) 
    if not i then return end
    local random = math.random(4, 20)
    exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, "dollars", random)
    setElementVisibleTo(Lixeiras[i], hitElement, false)
    setElementVisibleTo(blipLixeiras[i], hitElement, false)
    setElementFrozen(hitElement, true)
    setTimer(triggerClientEvent, 1100, 1, hitElement, "progressService", root, 6, "")
    setPedAnimation(hitElement, "uzi", "uzi_reload", 6500, true, false, false, false)
    setTimer(function()
      exports['infobox']:showInfobox(hitElement, "Você recolheu oque estava nessa lata de lixo", "success")
      setElementFrozen(hitElement, false)
    end, 6500, 1)
  end
end

 Para adicionar novas lixeiras é só colocar novas posições no posLixeiras, conforme os exemplos.

Obs: Mudei muita coisa no seu script e não testei, teste aí e traga possíveis erros que possam dar no console (digite "/debugscript 3" e fique de olho enquanto testa).

Edited by Boechat
  • Thanks 1
Link to comment

Faltou a parte em que deixa os markers visíveis quando a pessoa entra no emprego né, mas você não postou essa parte... Mas acho que com o que eu já mandei você consegue se virar para implementar essa parte kkk ;)

Edited by Boechat
  • Thanks 1
Link to comment
--==================================== Markers e Visibilidades ====================================--

local posLixeiras = {
	[1] = {1983.001, -1744.44, 13.547},
	[2] = {1993.668, -1738.607, 13.547},
}

local Lixeiras = {}
local blipLixeiras = {}

addEventHandler('onResourceStart', resourceRoot, function ()
  for i, pos in ipairs (posLixeiras) do
     Lixeiras[i] = createMarker(pos[1], pos[2], pos[3], "cylinder", 1.2, 70, 58, 88, 100)
     blipLixeiras[i] = createBlipAttachedTo(Lixeiras[i], 2)
     setBlipVisibleDistance(blipLixeiras[i], 2000)
     setElementVisibleTo(blipLixeiras[i], root, true)
     setElementVisibleTo(Lixeiras[i], root, true)
     setElementVisibleTo(Lixeiras[i], root, true)
     addEventHandler("onMarkerHit", Lixeiras[i], PegarLixo)
  end
end)

function getMarkerPositionInTable (marker)
  for i, m in ipairs (Lixeiras) do
    if marker == m then return i end
  end
  return false
end

--==================================== Pegar Emprego ====================================--

function Emprego(player)
    local Lixeiro = getElementData(player, "Lixeiro")
        if Lixeiro == false then
        setElementData(player, "Lixeiro", true)
        exports['infinity_infobox']:showInfobox(player, "Você agora está trabalhando de lixeiro", "success")
    elseif Lixeiro == true then
        setElementData(player, "Lixeiro", false)
        exports['infinity_infobox']:showInfobox(player, "Você não está mais trabalhando de lixeiro", "info")
    end
end
addCommandHandler("lixeiro", Emprego)

--==================================== Pegar Item na Lixeira ====================================--

Itens = 
{
    {"plastic"},
    {"battery"},
    {"legos"},
    {"glass"},

    {"battery"},
    {"glass"},
    {"legos"},
    {"plastic"},
    {"plastic"},
    {"battery"},
    {"legos"},
    {"glass"},

    {"legos"},
    {"battery"},
    {"glass"},
    {"plastic"},
    {"glass"},
    {"legos"},
    {"plastic"},
    {"battery"},
    {"legos"},
    {"glass"},

    {"plastic"},
    {"battery"},
    {"legos"},
    {"glass"},

    {"legos"},
    {"battery"},
    {"glass"},
    {"plastic"},
    {"glass"},
    {"legos"},
    {"plastic"},
    {"battery"},
    {"legos"},
    {"glass"},

    {"battery"},
    {"glass"},
    {"legos"},
    {"plastic"},
    {"plastic"},
    {"battery"},
    {"legos"},
    {"glass"},
}

function PegarLixo(hitElement)
local RandomItens = math.random(#Itens)
local random = math.random(4, 20)
if getElementData(hitElement, "Lixeiro") then
    local i = getMarkerPositionInTable(source)
    if not i then return end
        if not isPedInVehicle (hitElement) then
            setElementFrozen(hitElement, true)
            setTimer(triggerClientEvent, 1100, 1, hitElement, "progressService", root, 6, "")
            setPedAnimation(hitElement, "CARRY", "liftup", 6500, true, false, false, false)
            setTimer(function()
                if isElement(Lixeiras[i]) then destroyElement(Lixeiras[i]) end
                exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, RandomItens, random)
                exports['infinity_infobox']:showInfobox(hitElement, "Você recolheu oque estava nessa lata de lixo", "success")
                setElementFrozen(hitElement, false)
            end, 6500, 1)
        end
    end
end

Ele meio que está pronto soque o RandomItens não está funcionando e não estou conseguindo colocar ele para funfar, e eu eu coloquei o destroyElement apos usar o marker, mas queria fzr q o element do marker voltasse quando eu saisse e voltasse para o emprego pelo o /lixeiro mas n sei como fazer

Link to comment

Não sei como está o funcionamento desse exports mas acho que assim vai funcionar

Mude essa linha: exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, RandomItens, random)

Para: exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, Itens[RandomItens][1], random)

*#Itens retorna um numero do tamanho do array, depois você pegou um número aleatório nesse intervalo e passou ele como referência. Você está passando o RandomItens como parâmetro, que é um número aleatório, talvez o correto não seria passar o nome do item? Já o [1] é porque você colocou os nomes dos itens dentro de outra tabela, n entendi o porquê disso já que só tem um conteúdo dentro da tabela, poderia salvar a string normal mesmo... Testa aí e me fala. 

 

E sobre o marker, acho que se usar setElementVisibleTo como false seja mais fácil do que destruir o marker, você já está fazendo dessa forma...

 

Link to comment

Opa funcionou para pegar o itens mas oque faz ele funcionar é eu retirando o...

if isElement(Lixeiras[i]) then destroyElement(Lixeiras[i]) end

Soque se eu retirar esse destroyElement e so colocar o setElementVisibleTo ele apenas vai fazer o marker sumir, mas mesmo assim vai continuar pegando os itens caso passe os cima, entao precisava fazer o destroyElement e dps fzr o Element voltar quando saisse e voltasse para o trabalho

Link to comment
On 17/08/2021 at 09:43, Jaga said:

Opa funcionou para pegar o itens mas oque faz ele funcionar é eu retirando o...

if isElement(Lixeiras[i]) then destroyElement(Lixeiras[i]) end

Soque se eu retirar esse destroyElement e so colocar o setElementVisibleTo ele apenas vai fazer o marker sumir, mas mesmo assim vai continuar pegando os itens caso passe os cima, entao precisava fazer o destroyElement e dps fzr o Element voltar quando saisse e voltasse para o trabalho

É só checar se o marker está sendo exibido para o player, ou você pode mudar a lógica de criação do marker e criar eles client-side sempre que o player entrar no emprego. Da primeira forma é bem mais simples e é só colocar essa condição a mais na função "PegarLixo":

function PegarLixo(hitElement)
  if isElementVisibleTo ( source, hitElement ) and getElementData(hitElement, "Lixeiro") then
    ...
    ...
    ...
    ...
  end
end

Obs: Não testei!

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