Jump to content

2 erros em um Script de Trabalho


Recommended Posts

Opa, estou com 2 erros em um mod de trabalho:

1. quando o jogador pega o trabalho de caminhoneiro mas logo em seguida um outro jogador aperta para roubar o caminhão e cancela o roubo do veículo do player que está trabalhando, mesmo com o player fora do veículo o trabalho continua em execução, podendo assim o player dar teleport a algum local próximo da área de entrega, e finalizar o trabalho.

2. Quando o player pega o trabalho e logo em seguida ele comete suicídio, o trabalho continua em execução, mesmo eu adicionando um evento que cancele a função após a morte.

Alguém poderia me ajudar nisso? Desde já agradeço.

 

Código do mod:

trab4 = createMarker ( 1222.684, -1789.943, 15.7, "cylinder", 1.5, 255, 140, 0, 255)

marcacao = createMarker ( 2482.79126, -2090.34351, 18.54296, "arrow", 1.5, 255,140,0, 255)
setElementVisibleTo ( marcacao, root, false )

entregartrab4 = createMarker ( -2336.06299, -1660.78528, 483.70313 , "corona", 3, 0, 255, 209, 255)
setElementVisibleTo ( entregartrab4, root, false )

blipfim4 = createBlipAttachedTo(entregartrab4, 41, 3, 255, 0, 0, 255, 0, 65535, source)
setElementVisibleTo ( blipfim4, root, false )

function msg (source)
outputChatBox ('#ffffffPara pegar o trabalho digite #ff0000/caminhoneiro', source, 255, 255, 255, true)
end
addEventHandler( "onMarkerHit", trab4, msg )

carga = {}
veh = {}
function pegartrab4 ( source )
if isElementWithinMarker (source, trab4 ) then
if veh[source] and isElement( veh[source] ) then destroyElement(veh[source] )
 veh[source] = nil
 end
    local x,y,z = getElementPosition(source)
    veh[source] = createVehicle(403 ,2479.15234, -2091.43652, 14.56156)
    carga[source] = createVehicle(450 ,2487.23511, -2090.43604, 13.54688 + 1)
    setElementVisibleTo ( marcacao, root, true )
    setElementRotation ( veh[source], 0, 0, 90)
    setElementRotation ( carga[source], 0, 0, 90)
    warpPedIntoVehicle (source,veh[source])
    setElementVisibleTo ( blipfim4, source, true )
    setElementVisibleTo ( entregartrab4, source, true )
    outputChatBox ('#ffffffAgora pegue a carga e leve-a até o Blip no #FF0000Mount Chilliad.', source, 255, 255, 255, true)
setTimer ( function()
setElementVisibleTo ( marcacao, root, false )
    end, 13000, 1 )
else
outputChatBox ('#ffffffVocê tem que ficar no lugar certo para pegar o Trabalho de Caminhoneiro.', source, 255, 255, 255, true)
end
end
addCommandHandler ( "caminhoneiro", pegartrab4  )

function finalizartrab4 (source)
if veh[source] and isElement(veh[source]) then
if (carga[source]) and isElement(carga[source]) then
setElementVisibleTo ( entregartrab4, source, false )
setElementVisibleTo ( blipfim4, source, false )
givePlayerMoney (source, 8000)
destroyElement (veh[source])
destroyElement (carga[source])
outputChatBox ('#ffffffTrabalho finalizado, você recebeu #0F9C08$8.000 #FFFFFFpelo serviço.', source, 255, 255, 255, true)
else
end
end
end
addEventHandler( "onMarkerHit", entregartrab4, finalizartrab4 )

function sair4 (source)
if (veh[source]) and isElement(veh[source]) then
if (carga[source]) and isElement(carga[source]) then
destroyElement (veh[source])
destroyElement (carga[source])
setElementVisibleTo ( blipfim4, source, false )
setElementVisibleTo ( entregartrab4, source, false )
outputChatBox ('#ffffffVocê saiu do veículo e perdeu o trabalho.', source, 255, 255, 255, true)
end
end
end
addEventHandler ("onVehicleExit", root, sair4)
addEventHandler ("onPlayerWasted", root, sair4)

 

Edited by Henrique Moura
Link to comment

1 - Isto dentro da função pegartrab4:


addEventHandler( "onVehicleStartEnter", veh[source],
	function ( player )
		if veh[player] ~= source then
			cancelEvent()
		end
	end
)

local player = source
addEventHandler( "onVehicleExplode", 
	function()
		if veh[player] and source == veh[player] then
			destroyElement (veh[player])
			veh[player] = nil
		end
		if carga[player] and source == carga[player] then
			destroyElement (carga[player])
			carga[player] = nil
		end
	end
)

2 - :


addEventHandler( "onPlayerQuit", 
	function()
		if veh[source] then
			destroyPlayerVehicles( source )
		end
	end
)

function sair4 (vehicle)
	if eventName == "onPlayerVehicleExit" and veh[source] and vehicle == veh[source] then
		destroyPlayerVehicles( source )
	end
	if (veh[source]) and isElement(veh[source]) then
		destroyPlayerVehicles( source )
		setElementVisibleTo ( blipfim4, source, false )
		setElementVisibleTo ( entregartrab4, source, false )
		outputChatBox ('#ffffffVocê saiu do veículo e perdeu o trabalho.', source, 255, 255, 255, true)
	end
end
addEventHandler ("onPlayerVehicleExit", root, sair4)
addEventHandler ("onPlayerWasted", root, sair4)

function destroyPlayerVehicles( p )
	if p then
		if (veh[p]) and isElement(veh[p]) then
			destroyElement (veh[p])
			veh[p] = nil
		end
		if (carga[p]) and isElement(carga[p]) then
			destroyElement (carga[p])
			carga[p] = nil
		end
	end
end

 

  • Thanks 1
Link to comment
On 19/01/2019 at 21:54, DNL291 said:

1 - Isto dentro da função pegartrab4:


addEventHandler( "onVehicleStartEnter", veh[source],
	function ( player )
		if veh[player] ~= source then
			cancelEvent()
		end
	end
)

local player = source
addEventHandler( "onVehicleExplode", 
	function()
		if veh[player] and source == veh[player] then
			destroyElement (veh[player])
			veh[player] = nil
		end
		if carga[player] and source == carga[player] then
			destroyElement (carga[player])
			carga[player] = nil
		end
	end
)

Esses 2 eventos é dentro da função pegartrab4 como eu já disse, não precisa nem de conhecimento em programação para fazer, acho que você nem tentou ao menos colar na função e testar, dá próxima vez faça a sua parte, aqui o código:


local trab4 = createMarker ( 1222.684, -1789.943, 15.7, "cylinder", 1.5, 255, 140, 0, 255)

local marcacao = createMarker ( 2482.79126, -2090.34351, 18.54296, "arrow", 1.5, 255,140,0, 255)
setElementVisibleTo ( marcacao, root, false )

local entregartrab4 = createMarker ( -2336.06299, -1660.78528, 483.70313 , "corona", 3, 0, 255, 209, 255)
setElementVisibleTo ( entregartrab4, root, false )

local blipfim4 = createBlipAttachedTo(entregartrab4, 41, 3, 255, 0, 0, 255, 0, 65535, source)
setElementVisibleTo ( blipfim4, root, false )

function msg (source)
outputChatBox ('#ffffffPara pegar o trabalho digite #ff0000/caminhoneiro', source, 255, 255, 255, true)
end
addEventHandler( "onMarkerHit", trab4, msg )

local carga = {}
local veh = {}
function pegartrab4 ( source )
	if isElementWithinMarker (source, trab4 ) then
		if veh[source] and isElement( veh[source] ) then
			destroyElement(veh[source] )
			veh[source] = nil
		end
		local x,y,z = getElementPosition(source)
		veh[source] = createVehicle(403 ,2479.15234, -2091.43652, 14.56156)
		carga[source] = createVehicle(450 ,2487.23511, -2090.43604, 13.54688 + 1)
		setElementVisibleTo ( marcacao, root, true )
		setElementRotation ( veh[source], 0, 0, 90)
		setElementRotation ( carga[source], 0, 0, 90)
		warpPedIntoVehicle (source,veh[source])
		setElementVisibleTo ( blipfim4, source, true )
		setElementVisibleTo ( entregartrab4, source, true )
		outputChatBox ('#ffffffAgora pegue a carga e leve-a até o Blip no #FF0000Mount Chilliad.', source, 255, 255, 255, true)
		setTimer ( function()
			setElementVisibleTo ( marcacao, root, false )
		end, 13000, 1 )
		
		addEventHandler( "onVehicleStartEnter", veh[source],
			function ( player )
				if not (veh[player]) or veh[player] ~= source then
					cancelEvent()
				end
			end
		)

		local player = source
		addEventHandler( "onVehicleExplode", veh[source], function() destroyPlayerVehicles( player ) end )
		addEventHandler( "onVehicleExplode", carga[source], function() destroyPlayerVehicles( player ) end )
	else
		outputChatBox ('#ffffffVocê tem que ficar no lugar certo para pegar o Trabalho de Caminhoneiro.', source, 255, 255, 255, true)
	end
end
addCommandHandler ( "caminhoneiro", pegartrab4  )

function finalizartrab4 (source)
if veh[source] and isElement(veh[source]) then
if (carga[source]) and isElement(carga[source]) then
setElementVisibleTo ( entregartrab4, source, false )
setElementVisibleTo ( blipfim4, source, false )
givePlayerMoney (source, 8000)
destroyElement (veh[source])
destroyElement (carga[source])
outputChatBox ('#ffffffTrabalho finalizado, você recebeu #0F9C08$8.000 #FFFFFFpelo serviço.', source, 255, 255, 255, true)
else
end
end
end
addEventHandler( "onMarkerHit", entregartrab4, finalizartrab4 )

addEventHandler( "onPlayerQuit", 
	function()
		if veh[source] then
			destroyPlayerVehicles( source )
		end
	end
)

function sair4 (vehicle)
	if eventName == "onPlayerVehicleExit" and veh[source] and vehicle == veh[source] then
		destroyPlayerVehicles( source )
	end
	if (veh[source]) and isElement(veh[source]) then
		destroyPlayerVehicles( source )
		setElementVisibleTo ( blipfim4, source, false )
		setElementVisibleTo ( entregartrab4, source, false )
		outputChatBox ('#ffffffVocê saiu do veículo e perdeu o trabalho.', source, 255, 255, 255, true)
	end
end
addEventHandler ("onPlayerVehicleExit", root, sair4)
addEventHandler ("onPlayerWasted", root, sair4)

function destroyPlayerVehicles( p )
	if p then
		if (veh[p]) and isElement(veh[p]) then
			destroyElement (veh[p])
			veh[p] = nil
		end
		if (carga[p]) and isElement(carga[p]) then
			destroyElement (carga[p])
			carga[p] = nil
		end
	end
end

 

Link to comment
8 minutes ago, DNL291 said:

Esses 2 eventos é dentro da função pegartrab4 como eu já disse, não precisa nem de conhecimento em programação para fazer, acho que você nem tentou ao menos colar na função e testar, dá próxima vez faça a sua parte, aqui o código:


local trab4 = createMarker ( 1222.684, -1789.943, 15.7, "cylinder", 1.5, 255, 140, 0, 255)

local marcacao = createMarker ( 2482.79126, -2090.34351, 18.54296, "arrow", 1.5, 255,140,0, 255)
setElementVisibleTo ( marcacao, root, false )

local entregartrab4 = createMarker ( -2336.06299, -1660.78528, 483.70313 , "corona", 3, 0, 255, 209, 255)
setElementVisibleTo ( entregartrab4, root, false )

local blipfim4 = createBlipAttachedTo(entregartrab4, 41, 3, 255, 0, 0, 255, 0, 65535, source)
setElementVisibleTo ( blipfim4, root, false )

function msg (source)
outputChatBox ('#ffffffPara pegar o trabalho digite #ff0000/caminhoneiro', source, 255, 255, 255, true)
end
addEventHandler( "onMarkerHit", trab4, msg )

local carga = {}
local veh = {}
function pegartrab4 ( source )
	if isElementWithinMarker (source, trab4 ) then
		if veh[source] and isElement( veh[source] ) then
			destroyElement(veh[source] )
			veh[source] = nil
		end
		local x,y,z = getElementPosition(source)
		veh[source] = createVehicle(403 ,2479.15234, -2091.43652, 14.56156)
		carga[source] = createVehicle(450 ,2487.23511, -2090.43604, 13.54688 + 1)
		setElementVisibleTo ( marcacao, root, true )
		setElementRotation ( veh[source], 0, 0, 90)
		setElementRotation ( carga[source], 0, 0, 90)
		warpPedIntoVehicle (source,veh[source])
		setElementVisibleTo ( blipfim4, source, true )
		setElementVisibleTo ( entregartrab4, source, true )
		outputChatBox ('#ffffffAgora pegue a carga e leve-a até o Blip no #FF0000Mount Chilliad.', source, 255, 255, 255, true)
		setTimer ( function()
			setElementVisibleTo ( marcacao, root, false )
		end, 13000, 1 )
		
		addEventHandler( "onVehicleStartEnter", veh[source],
			function ( player )
				if not (veh[player]) or veh[player] ~= source then
					cancelEvent()
				end
			end
		)

		local player = source
		addEventHandler( "onVehicleExplode", veh[source], function() destroyPlayerVehicles( player ) end )
		addEventHandler( "onVehicleExplode", carga[source], function() destroyPlayerVehicles( player ) end )
	else
		outputChatBox ('#ffffffVocê tem que ficar no lugar certo para pegar o Trabalho de Caminhoneiro.', source, 255, 255, 255, true)
	end
end
addCommandHandler ( "caminhoneiro", pegartrab4  )

function finalizartrab4 (source)
if veh[source] and isElement(veh[source]) then
if (carga[source]) and isElement(carga[source]) then
setElementVisibleTo ( entregartrab4, source, false )
setElementVisibleTo ( blipfim4, source, false )
givePlayerMoney (source, 8000)
destroyElement (veh[source])
destroyElement (carga[source])
outputChatBox ('#ffffffTrabalho finalizado, você recebeu #0F9C08$8.000 #FFFFFFpelo serviço.', source, 255, 255, 255, true)
else
end
end
end
addEventHandler( "onMarkerHit", entregartrab4, finalizartrab4 )

addEventHandler( "onPlayerQuit", 
	function()
		if veh[source] then

		
	
)


	      

	
	    

		   
		setElementVisibleTo ( entregartrab4, source, false )
		outputChatBox ('#ffffffVocê saiu do veículo e perdeu o trabalho.', source, 255, 255, 255, true)
	

 
 


	
		    
			 
			veh[p] = nil
		
		    
			destroyElement (carga[p])
			carga[p] = nil
		
	

 

Eu tentei sim, porém foi desatenção minha, estava fazendo errado mesmo, valeu por ajudar.

Link to comment

Estou com mais um problema no mod de trabalho, por se tratar do mesmo script, achei melhor mandar aqui mesmo do que criar um novo tópico, enfim, após o player digitar o comando para começar o trabalho, são criados todos os markers existentes no mod apenas de uma vez, e ele usa o setElementVisibleTo que muda a transparência do marker, deixando ele invisível, ou seja, o player pega o trabalho e logo em seguida caso ele souber onde fica o marker de finalização, ele passa no local e finaliza o trabalho, pulando assim o processo que deveria ser feito pelo player no trabalho, pra entender melhor aqui está um vídeo mostrando como seria esse bug https://youtu.be/v_Cs3Frw404 eu já tentei usar o destroyElement, porém da forma que usei não deu muito certo, pois ele destruiu o marker e na hora que era pra aparecer acabou não aparecendo, alguém poderia me ajudar ou dar alguma dica de como resolver isso?

trab2 = createMarker ( 1222.684, -1798.941, 15.7, "cylinder", 1.5, 255, 140, 0, 0)
trab3 = createMarker ( 1222.684, -1798.941, 15.1, "cylinder", 1.5, 255, 140, 0, 50)

entregartrab2 = createMarker ( 113.229, -1900.505, 0.162, "corona", 3, 255, 140, 0, 255)
setElementVisibleTo ( entregartrab2, root, false )

entregarparte2 = createMarker ( 2295.75073, 519.24872, -0.55000 , "corona", 3, 255,140,0, 255)
setElementVisibleTo ( entregarparte2, root, false )

bliptparte2 = createBlipAttachedTo(entregarparte2, 41, 3, 255, 0, 0, 255, 0, 65535, source)
setElementVisibleTo ( bliptparte2, root, false )

bliptrab2 = createBlipAttachedTo(entregartrab2, 41, 3, 255, 0, 0, 255, 0, 65535, source)
setElementVisibleTo ( bliptrab2, root, false )

function msg (source)
outputChatBox ('#C09F96[SERVER]: #ffffffPara pegar o trabalho digite #FF0000/marinheiro', source, 255, 255, 255, true)
end
addEventHandler( "onMarkerHit", trab2, msg )


veh = {}
function pegartrab ( source )
if isElementWithinMarker (source, trab2 ) then
if veh[source] and isElement( veh[source] ) then destroyElement(veh[source] )
veh[source] = nil
end
local x,y,z = getElementPosition(source)
veh[source] = createVehicle(595, -1559.08801, 144.12305, 0.21072)
warpPedIntoVehicle (source,veh[source])
setElementVisibleTo ( bliptrab2, source, true )
setElementVisibleTo ( entregartrab2, source, true )
--destroyElement (entregarparte2)
ped = createPed ( 120, 116.467, -1894.428, 1.011, 192 )
ped2 = createPed ( 85, 116.141, -1893.496, 1.097, 192 )
ped3 = createPed ( 169, 116.035, -1892.718, 1.164, 192 )
ped4 = createPed ( 15, 115.744, -1891.669, 1.258, 192 )
outputChatBox ('#C09F96[SERVER]: #ffffffAgora vá até o Blip marcado no mapa, #FF0000Praia de LS.', source, 255, 255, 255, true)

addEventHandler( "onVehicleStartEnter", veh[source],
        function ( player )
        if not (veh[player]) or veh[player] ~= source then
        cancelEvent()
    end
end
)

else
outputChatBox ('#C09F96[SERVER]: #ffffffVocê precisa estar no lugar certo para pegar o Trabalho.', source, 255, 255, 255, true)
end
end
addCommandHandler ( "marinheiro", pegartrab)


function parte2 (source)
if veh[source] and isElement(veh[source]) then
setElementVisibleTo ( entregartrab2, source, false )
setElementVisibleTo ( bliptrab2, source, false )
outputChatBox ('#C09F96[SERVER]: #ffffffParabéns, agora espere eles entrar!', source, 255, 255, 255, true)
setTimer ( function()
setElementVisibleTo ( bliptparte2, source, true )
setElementVisibleTo ( entregarparte2, source, true )
destroyElement (ped)
destroyElement (ped2)
destroyElement (ped3)
destroyElement (ped4)
outputChatBox ('#C09F96[SERVER]: #ffffffLeve-os até o local de destino!', source, 255, 255, 255, true)
    end, 3000, 1 )
else
end
end
addEventHandler( "onMarkerHit", entregartrab2, parte2 )


function finalizar (source)
if veh[source] and isElement(veh[source]) then
setElementVisibleTo ( bliptparte2, source, false )
setElementVisibleTo ( entregarparte2, source, false )
givePlayerMoney (source, 10000)
destroyElement (veh[source])
outputChatBox ('#C09F96[SERVER]: #ffffffTrabalho finalizado, você recebeu #7AB5DF$10.000 #ffffffpelo serviço.', source, 255, 255, 255, true)
else
end
end
addEventHandler( "onMarkerHit", entregarparte2, finalizar )


function sair (vehicle)
        if (veh[source]) and isElement(veh[source]) then
         destroyPlayerVehicles( source )
        setElementVisibleTo ( entregartrab2, source, false )
        setElementVisibleTo ( bliptrab2, source, false )
        setElementVisibleTo ( entregarparte2, source, false )
        setElementVisibleTo ( bliptparte2, source, false )
        destroyElement (ped)
        destroyElement (ped2)
        destroyElement (ped3)
        destroyElement (ped4)
        outputChatBox ('#C09F96[SERVER]: #ffffffVocê perdeu o trabalho.', source, 255, 255, 255, true)
    end
end
addEventHandler ("onPlayerVehicleExit", root, sair)
addEventHandler ("onPlayerWasted", root, sair)


function destroyPlayerVehicles( p )
    if p then
        if (veh[p]) and isElement(veh[p]) then
            destroyElement (veh[p])
            veh[p] = nil
        end
    end
end

 

 

Link to comment

Resumindo, o blip do local não mostra, é isso?

A marker "entregartrab2" é a primeira rota e quando atingir ela será criada a segunda rota na marker "entregarparte2"?

Sobre o seu código, em createBlipAttachedTo - linhas 10 e 13 no último argumento tem source, que não está definido, logo, retornará nil.

Tem também esse monte de funções setElementVisibleTo que eu acho bom evitar em muitos casos, criando os elementos no lado cliente.

Outra coisa, otimize o código definindo resourceRoot no fim das funções createMarkercreateBlipAttachedTo, assim você também irá evitar essas linhas chatas no começo do código:

setElementVisibleTo ( entregarparte2, root, false )

Corrigindo:

entregartrab2 = createMarker ( 113.229, -1900.505, 0.162, "corona", 3, 255, 140, 0, 255, resourceRoot)
--setElementVisibleTo ( entregartrab2, root, false ) irá dispensar o uso disso

+:

  •  As variáveis em createPed não funcionarão com mais de 1 jogador, quando outra pessoa também digitar o comando irá reescrever a mesma variável do(s) jogador(es).
  •  Passe o jogador no setTimer dentro do evento "onMarkerHit" - linha 68, e use o jogador no parâmetro da função definindo na linha 60 em "function()".

 

Edited by DNL291
  • Thanks 1
Link to comment

Não, o problema não é o blip, vou dar um exemplo mais fácil, quando o player da o comando para começar a trabalhar, iniciam todos os markers de uma só vez, porém eles ficam oculto para o jogador na parte visual, porém se o player souber a localização exata da marcação e passar em cima, a função continua executando mesmo com o marker invisível, o que eu queria fazer é deixar pro marker e a função aparecer somente em um determinado período, nesse trabalho que mandei o código, o certo seria ele começar o trabalho e pegar passageiros na praia de LS para depois finalizar, porém se ele der uma de esperto e for direto ao ponto onde finaliza o trabalho, não passando pela praia, ele irá conseguir finalizar o trabalho da mesma forma, ou seja, o que eu queria é que obrigasse ele a passar pela praia, caso não passasse ele não conseguiria finalizar o trabalho.

Link to comment

Só pra esclarecer sobre as markers, elas são criadas quando o resource é ligado, no comando é chamada a função setElementVisibleTo que vai deixar blip e marker visíveis (bliptrab2 e entregartrab2).

Sobre o problema, tem duas soluções:

  • Permitir que o jogador possa passar na marker só depois que ele pegar os passageiros, por meio de uma um setElementData ou uma variável na tabela 

 Ou

  • Criar a marker só depois que ele pegar os passageiros
  • Thanks 1
Link to comment

isElementVisibleTo

function finalizar (source)
	if veh[source] and isElement(veh[source]) then
		if isElementVisibleTo(entregarparte2,source) then
			setElementVisibleTo ( bliptparte2, source, false )
			setElementVisibleTo ( entregarparte2, source, false )
			givePlayerMoney (source, 10000)
			destroyElement (veh[source])
			outputChatBox ('#C09F96[SERVER]: #ffffffTrabalho finalizado, você recebeu #7AB5DF$10.000 #ffffffpelo serviço.', source, 255, 255, 255, true)
		end
	end
end
addEventHandler( "onMarkerHit", entregarparte2, finalizar )

 

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