Jump to content

[AJUDA] Como faço para destruir esse elemento ?


Recommended Posts

local vehicleElements = {}

allVeh = {510}

local pickupTable = {
{1086.1798095703,-1801.6898193359,13.601690292358},
}

function createPickupOnServerStart ()
    for i, cor in ipairs (pickupTable) do
	    local pickup = createPickup(cor[1], cor[2], cor[3], 3, 1274, 0)
		setElementData(pickup, "pickupArenda", true)
	end
end
addEventHandler("onResourceStart", getResourceRootElement( getThisResource() ), createPickupOnServerStart)

function onResourceStop (veh)
    if isTimer(vehicleElements[veh]) then
        killTimer(vehicleElements[veh])
    end
    --vehicleElements[veh] = destroyElement(veh)
end
addEventHandler("onResourceStop", getResourceRootElement( getThisResource() ), onResourceStop)

function onPickupHit (hit)
    if not getElementData(source, "pickupArenda") or getElementType(hit) ~= "player" and not isPedInVehicle(hit) then return end
    triggerClientEvent(hit, "changeArendaMenuState", hit)
end
addEventHandler("onPickupHit", getRootElement(), onPickupHit)

function onPlayerUseCustomPickup()
	    if getPlayerMoney(source) >= 500 then
	    	local x, y, z = getElementPosition(source)
			local veh = createVehicle(allVeh[math.random(1,#allVeh)],  x, y, z)
			setElementData(veh, "starter_pack", true)
			setElementData(veh, "owner", source)
			warpPedIntoVehicle(source, veh)
			
			takePlayerMoney(source, 500)
            outputChatBox("Bicicleta alugada, bom uso!.", source, 0, 255, 0)
		else
		    outputChatBox("Para alugar uma bicicleta você precisa de >> 500 $$ <<.", source, 255, 0, 0)
		end
end
addEvent("onPlayerUseCustomPickup", true)
addEventHandler("onPlayerUseCustomPickup", getRootElement(), onPlayerUseCustomPickup)

function onPlayerVehicleEnter (veh, seat)
    if getElementData(veh, "starter_pack") == true and seat == 0 then
	    if isTimer(vehicleElements[veh]) then
		    killTimer(vehicleElements[veh])
		end
	end
end
addEventHandler("onPlayerVehicleEnter", getRootElement(), onPlayerVehicleEnter)

function onPlayerVehicleExit (veh, seat)
    if getElementData(veh, "starter_pack") == true and seat == 0 then
	    if isTimer(vehicleElements[veh]) then
		    killTimer(vehicleElements[veh])
		end
		vehicleElements[veh] = setTimer(destroyElement, 300000, 1, veh)
	end
end
addEventHandler("onPlayerVehicleExit", getRootElement(), onPlayerVehicleExit)

function onVehicleStartEnter (player, seat)
    if getElementData(source, "starter_pack") == true and seat == 0 then
	    local owner = getElementData(source, "owner")
		if owner ~= player then
		    cancelEvent()
	        outputChatBox("Você não é dono desta bicicleta, alugue sua bike para poder usá-la.", player, 255, 0, 0)
		end
	end
end
addEventHandler("onVehicleStartEnter", getRootElement(), onVehicleStartEnter)

Esse é o script de alugar bicicleta, a bike some após 5 minutos do player estando fora dela, até aí sem problemas. Gostaria de saber como faço para que ela suma instantaneamente se o player morrer, sair do game, for preso, etc. Segue abaixo o que tentei:

 

function DestroyVeiculo (veh, seat)
	if getElementData(veh, "starter_pack") == true and seat == 0 then
	    if isTimer(vehicleElements[veh]) then
		    killTimer(vehicleElements[veh])
		end
		--vehicleElements[veh] = setTimer(destroyElement, 300000, 1, veh)
		vehicleElements[veh] = destroyElement(veh)
	end
end
addEventHandler ("onPlayerLogout", getRootElement(), DestroyVeiculo)
addEventHandler ("onPlayerQuit", getRootElement(), DestroyVeiculo)
addEventHandler ("onPlayerWasted", getRootElement(), DestroyVeiculo)
addEventHandler ("onPlayerBan", getRootElement(), DestroyVeiculo)
addEventHandler ("onPlayerDie", getRootElement(), DestroyVeiculo)

Dessa forma acima não consegui. Se alguém puder me ajudar, agradeço!

Link to post
  1. function DestroyVeiculo (veh, seat)
    if getElementData(veh, "starter_pack") == true and seat == 0 then
    if isTimer(vehicleElements[veh]) then
    killTimer(vehicleElements[veh])
    end
    destroyElement(veh)
    end
    end
    addEventHandler ("onPlayerLogout", getRootElement(), DestroyVeiculo)
    addEventHandler ("onPlayerQuit", getRootElement(), DestroyVeiculo)
    addEventHandler ("onPlayerWasted", getRootElement(), DestroyVeiculo)
    addEventHandler ("onPlayerBan", getRootElement(), DestroyVeiculo)
    addEventHandler ("onPlayerDie", getRootElement(), DestroyVeiculo)
Edited by carlos eduardo
Link to post

Você não deve usar a mesma função para eventos diferentes quando os eventos possuem parâmetros de função diferentes em uso.

Além disso, veh não é um veículo nessa função.

E outra: O evento onPlayerBan não faz sentido para esse objetivo. E o evento onPlayerDie nem existe.

O resto do seu script também não faz sentido, você usa veh como parâmetro de função em eventos que não tem nada a ver com veículos.

Edited by Lord Henry
Link to post
2 hours ago, Lord Henry said:

Você não deve usar a mesma função para eventos diferentes quando os eventos possuem parâmetros de função diferentes em uso.

Além disso, veh não é um veículo nessa função.

E outra: O evento onPlayerBan não faz sentido para esse objetivo. E o evento onPlayerDie nem existe.

O resto do seu script também não faz sentido, você usa veh como parâmetro de função em eventos que não tem nada a ver com veículos.

Mestre este script eu peguei da net, só gostaria de saber como faria pra quando o player for morto, preso, etc. a bike sumir.

Link to post

Vai ter que reprogramar o script mano. O jeito que o cara da internet fez não permite que você obtenha o veículo depois pra poder destruí-lo.

Quando o cara fez o veh ser uma variável local, a variável deixa de existir fora daquele escopo que ela foi criada.

  • Like 1
Link to post

A minha dica é você criar uma table vazia no início do script e depois quando for criar o veículo, colocar o veículo nessa table, usando o jogador que criou ele como índice.

(Sim, eu sei que usei uma linguagem técnica e difícil de entender)

Segue um exemplo pra ajudar vc a interpretar a lógica do esquema:

tableVehs = {} -- Isso é uma table vazia, criada no início do script. Todos os veículos dos jogadores serão colocados nesta table.
allVeh = {510} -- Table de IDs possíveis de veículo.

function qualquerCoisa (thePlayer)
	local x, y, z = getElementPosition (thePlayer)
	if tableVehs[thePlayer] then -- Se o veículo do jogador já existe, então:
		setElementPosition (tableVehs[thePlayer], x, y, z+1) -- Move o veículo para a posição do jogador ao invés de criar outro.
	else -- Se o veículo do jogador não existe, então:
		tableVehs[thePlayer] = createVehicle (math.random(#allVeh), x, y, z) -- Cria o veículo na posição do jogador. Adicionando a variável deste veículo na table e usando o próprio jogador como índice.
	end
end
addCommandHandler ("criar", qualquerCoisa) -- Comando qualquer só pra testar essa função.

function qualquerCoisa2 (thePlayer)
	if tableVehs[thePlayer] then -- Se o veículo do jogador já existe, então:
		destroyElement (tableVehs[thePlayer])
		tableVehs[thePlayer] = nil -- Anula a variável da table para liberar espaço na memória.
	end
end
addCommandHandler ("destruir", qualquerCoisa2) -- Comando qualquer só pra testar essa função.

function morreu ()
	if tableVehs[source] then
		destroyElement (tableVehs[source])
		tableVehs[source] = nil
	end
end
addEventHandler ("onPlayerWasted", root, morreu) -- O source neste evento é o jogador que morreu.
addEventHandler ("onPlayerQuit", root, morreu) -- O source neste evento é o jogador que saiu do server.

 

Edited by Lord Henry
Link to post

Irmão, fiz dessa forma. Funcionou também! Segue:
 

MarkerBike = createMarker(1086.3326416016,-1802.1416015625,12.60143661499, "cylinder", 1.5, 255,255,255,50)
--local Veiculos = {510} -- IDs dos Veículos.
Rumpo = {}

AparecerBike = Rumpo[source]

function spawn (source)
    if isElementWithinMarker(source, MarkerBike) then 
        if getPlayerMoney(source) >= 500 then 
            takePlayerMoney (source, 500)
            if AparecerBike and isElement(AparecerBike) then
                destroyElement(AparecerBike)
            end
            AparecerBike = createVehicle (510, 1091.2088623047,-1796.9704589844,13.606305122375)   
            setElementData(source, "kart.race", true)  
            setElementData(AparecerBike, "owner", source)                                 
            setElementRotation(AparecerBike,0,0,0)
            fadeCamera ( source, false, 0, 0, 0, 0 )   
            setTimer ( fadeCamera, 500, 1, source , true, 0.5 )
            setTimer ( setCameraTarget, 500, 1, source )
            outputChatBox ("#FF0000✘ #ffffffINFO #FF0000✘➺ #FF0000Bicicleta Alugada com sucesso, faça bom uso!", source, 255, 255, 255, true)
            warpPedIntoVehicle (source, AparecerBike)
        else
            outputChatBox("#FF0000✘ #ffffffINFO #FF0000✘➺ #FF0000Você não tem dinheiro suficiente para alugar uma bike!", player, 255,255,255,true)
        end
    end
end
addCommandHandler("alugar", spawn)

function SemRoubo (player, seat)
    if getElementData(source, "kart.race") == true and seat == 0 then
        local owner = getElementData(source, "owner")
        if owner ~= player then
            cancelEvent()
            outputChatBox("Você não é dono desta bicicleta, alugue sua bike para poder usá-la.", player, 255, 0, 0)
        end 
    end 
end
addEventHandler("onVehicleStartEnter", root, SemRoubo)

function DestroyVeiculo ()
    if getElementData(source, "kart.race") then
        setElementData(source, "kart.race", false)
        destroyElement (AparecerBike)
    end
end
addEventHandler ("onPlayerLogout", root, DestroyVeiculo)
addEventHandler ("onPlayerQuit", root, DestroyVeiculo)
addEventHandler ("onPlayerWasted", root, DestroyVeiculo)
addEventHandler ("onPlayerBan", root, DestroyVeiculo)
addEventHandler ("onResourceStop", root, DestroyVeiculo)

 

Link to post

Testando o script descobri um bug, não chega a ser um erro, é o seguinte: Quando entro na bike pela primeira vez eu me torno o "owner", mas se algum outro player além de mim tenta entrar na bike ele não consegue, até ai tudo bem. Só que quando ele tenta entrar na bike, mesmo ele não conseguindo ele se torna o "owner".  Isso significa que se o player que tentou entrar na bike que não é dele ele se torna o owner e se ele for morto ou deslogar, etc. a bike desaparece.

Edited by joao2235
Link to post
1 hour ago, joao2235 said:

Porém não consegui adicionar o veículo sumindo depois de um tempo que o player esteja fora dele, tem alguma ideia de como poderia encaixar isso ? 

MarkerBike = createMarker(1086.3326416016,-1802.1416015625,12.60143661499, "cylinder", 1.5, 255,255,255,50)
--local Veiculos = {510} -- IDs dos Veículos.
Rumpo = {}
AparecerBike = Rumpo[source]
function spawn (source)
    if isElementWithinMarker(source, MarkerBike) then 
        if getPlayerMoney(source) >= 500 then 
            takePlayerMoney (source, 500)
            if AparecerBike and isElement(AparecerBike) then
                destroyElement(AparecerBike)
            end
            AparecerBike = createVehicle (510, 1091.2088623047,-1796.9704589844,13.606305122375)   
            setElementData(source, "kart.race", true)  
            setElementData(AparecerBike, "owner", source)                                 
            setElementRotation(AparecerBike,0,0,0)
            fadeCamera ( source, false, 0, 0, 0, 0 )   
            setTimer ( fadeCamera, 500, 1, source , true, 0.5 )
            setTimer ( setCameraTarget, 500, 1, source )
            outputChatBox ("#FF0000✘ #ffffffINFO #FF0000✘➺ #FF0000Bicicleta Alugada com sucesso, faça bom uso!", source, 255, 255, 255, true)
            warpPedIntoVehicle (source, AparecerBike)
        else
            outputChatBox("#FF0000✘ #ffffffINFO #FF0000✘➺ #FF0000Você não tem dinheiro suficiente para alugar uma bike!", player, 255,255,255,true)
        end
    end
end
addCommandHandler("alugar", spawn)
function SemRoubo (player, seat)
    if getElementData(source, "kart.race") == true and seat == 0 then
        local owner = getElementData(source, "owner")
        if owner ~= player then
            cancelEvent()
            outputChatBox("Você não é dono desta bicicleta, alugue sua bike para poder usá-la.", player, 255, 0, 0)
        end 
    end 
end
addEventHandler("onVehicleStartEnter", root, SemRoubo)
function DestroyVeiculo ()
    if getElementData(source, "kart.race") then
        setElementData(source, "kart.race", false)
        destroyElement (AparecerBike)
    end
end
addEventHandler ("onPlayerLogout", root, DestroyVeiculo)
addEventHandler ("onPlayerQuit", root, DestroyVeiculo)
addEventHandler ("onPlayerWasted", root, DestroyVeiculo)
addEventHandler ("onPlayerBan", root, DestroyVeiculo)
addEventHandler ("onResourceStop", root, DestroyVeiculo)

local minutos = 1

-- New

function destroyVehicle(vehicle)
   local check=false
   for i,player in ipairs(getElementsByType("player")) do
       if getPlayerOccupiedVehicle(player)==vehicle then
           check=true
       end
   end
   if check==false then
       destroyElement(AparecerBike)
   end
end
 
function exitVehicle(AparecerBike)
   setTimer(destroyVehicle,60000*minutos,0,AparecerBike)
end
addEventHandler("onPlayerVehicleExit",getRootElement(),exitVehicle)

eu testei isso e funcionou 

tenta ai ;d

  • Thanks 1
Link to post
14 minutes ago, CrowleySCR said:

MarkerBike = createMarker(1086.3326416016,-1802.1416015625,12.60143661499, "cylinder", 1.5, 255,255,255,50)
--local Veiculos = {510} -- IDs dos Veículos.
Rumpo = {}
AparecerBike = Rumpo[source]
function spawn (source)
    if isElementWithinMarker(source, MarkerBike) then 
        if getPlayerMoney(source) >= 500 then 
            takePlayerMoney (source, 500)
            if AparecerBike and isElement(AparecerBike) then
                destroyElement(AparecerBike)
            end
            AparecerBike = createVehicle (510, 1091.2088623047,-1796.9704589844,13.606305122375)   
            setElementData(source, "kart.race", true)  
            setElementData(AparecerBike, "owner", source)                                 
            setElementRotation(AparecerBike,0,0,0)
            fadeCamera ( source, false, 0, 0, 0, 0 )   
            setTimer ( fadeCamera, 500, 1, source , true, 0.5 )
            setTimer ( setCameraTarget, 500, 1, source )
            outputChatBox ("#FF0000✘ #ffffffINFO #FF0000✘➺ #FF0000Bicicleta Alugada com sucesso, faça bom uso!", source, 255, 255, 255, true)
            warpPedIntoVehicle (source, AparecerBike)
        else
            outputChatBox("#FF0000✘ #ffffffINFO #FF0000✘➺ #FF0000Você não tem dinheiro suficiente para alugar uma bike!", player, 255,255,255,true)
        end
    end
end
addCommandHandler("alugar", spawn)
function SemRoubo (player, seat)
    if getElementData(source, "kart.race") == true and seat == 0 then
        local owner = getElementData(source, "owner")
        if owner ~= player then
            cancelEvent()
            outputChatBox("Você não é dono desta bicicleta, alugue sua bike para poder usá-la.", player, 255, 0, 0)
        end 
    end 
end
addEventHandler("onVehicleStartEnter", root, SemRoubo)
function DestroyVeiculo ()
    if getElementData(source, "kart.race") then
        setElementData(source, "kart.race", false)
        destroyElement (AparecerBike)
    end
end
addEventHandler ("onPlayerLogout", root, DestroyVeiculo)
addEventHandler ("onPlayerQuit", root, DestroyVeiculo)
addEventHandler ("onPlayerWasted", root, DestroyVeiculo)
addEventHandler ("onPlayerBan", root, DestroyVeiculo)
addEventHandler ("onResourceStop", root, DestroyVeiculo)

local minutos = 1

-- New

function destroyVehicle(vehicle)
   local check=false
   for i,player in ipairs(getElementsByType("player")) do
       if getPlayerOccupiedVehicle(player)==vehicle then
           check=true
       end
   end
   if check==false then
       destroyElement(AparecerBike)
   end
end
 
function exitVehicle(AparecerBike)
   setTimer(destroyVehicle,60000*minutos,0,AparecerBike)
end
addEventHandler("onPlayerVehicleExit",getRootElement(),exitVehicle)

eu testei isso e funcionou 

tenta ai ;d

100% Working. Se puder me dar uma força com isso:

 

15 minutes ago, joao2235 said:

Testando o script descobri um bug, não chega a ser um erro, é o seguinte: Quando entro na bike pela primeira vez eu me torno o "owner", mas se algum outro player além de mim tenta entrar na bike ele não consegue, até ai tudo bem. Só que quando ele tenta entrar na bike, mesmo ele não conseguindo ele se torna o "owner".  Isso significa que se o player que tentou entrar na bike que não é dele ele se torna o owner e se ele for morto ou deslogar, etc. a bike desaparece.

 

Edited by joao2235
Link to post

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