Jump to content

Script de mecânico não funciona


Recommended Posts

Dessa vez eu não queria ter que recorrer ao fórum mas não tive escolha, estou tentando fazer um script de mecânico, mas sou iniciante então preciso de ajuda e também já é de se esperar coisas erradas, bom eu tentei e não foi pouco.

Testei com getPlayerTarget, getClientPlayerTarget e esses:

-- Sistema do mecânico ---

function targetF(thePlayer)
	local target
	target = getPedTarget ( thePlayer )
	if ( target ) then
		if ( getElementType ( target ) == "vehicle" ) then
			fixVehicle(target)
		end
	end
end
addCommandHandler("reparar",
	function(source)
		accountname = getAccountName (getPlayerAccount(source))
      	if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Mecanico" ) ) then
      		targetF()
      	end
    end
)

--[[
addCommandHandler("reparar",
	function(source)
		accountname = getAccountName (getPlayerAccount(source))
      	if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Mecanico" ) ) then
      		function targetF(targetElem)
		        if (isElement(targetElem)) and (getElementType(targetElem)=="vehicle") then
		            fixVehicle(targetElem)
		            removeEventHandler("onPlayerTarget", root, targetF)
		        else
		        	removeEventHandler("onPlayerTarget", root, targetF)
		        end
			end
			addEventHandler ("onPlayerTarget", root, targetF)
		end
	end
)
]]

--[[
addCommandHandler("reparar",
	function(source)
		accountname = getAccountName (getPlayerAccount(source))
      	if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Mecanico" ) ) then

			
			targetC = getPedTargetCollision(source)
			if getElementType(targetC) == "vehicle" then
				--Faça a animação
				fixVehicle(targetC)
				exports.dxmsgs:outputDx(source, "Veículo concertado com sucesso.", "success")
			end
			

			testF()
		end
	end
)

function testF(source)
	targetC = getPedTargetCollision(source)
	if getElementType(targetC) == "vehicle" then
		--Faça a animação
		fixVehicle(targetC)
		exports.dxmsgs:outputDx(source, "Veículo concertado com sucesso.", "success")
	end
end
]]

--[[
addCommandHandler("reparar",
	function(source)
		accountname = getAccountName (getPlayerAccount(source))
      	if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Mecanico" ) ) then
      		
			pTarget = getPedTarget( source )
			if getElementType(pTarget) == "vehicle" then
				fixVehicle(pTarget)
			end
	
			targetF()
		end
	end
)

function targetF(thePlayer)
	local target
	target = getPedTarget ( thePlayer )
	if ( target ) then
		if ( getElementType ( target ) == "vehicle" ) then
			fixVehicle(target)
		end
	end
end
]]

 

 

O que parece ter maior chance de funcionar é esse aqui: VVVV

function targetF(thePlayer)
	local target
	target = getPedTarget ( thePlayer )
	if ( target ) then
		if ( getElementType ( target ) == "vehicle" ) then
			fixVehicle(target)
		end
	end
end
addCommandHandler("reparar",
	function(source)
		accountname = getAccountName (getPlayerAccount(source))
      	if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Mecanico" ) ) then
      		targetF()
      	end
    end
)

No debugscript o erro é: Bad argument @ 'getPedTarget' [Expected ped at argument 1, got nil]
Traduzindo eu estou fazendo merda mas não sei o que eu to fazendo de errado.

Eu até tinha conseguido com o getPlayerTarget mas no primeiro ele ficava sempre ligado, todos os carros que eu olhava ele já consertava, então testei colocar um removeEventHandler quase ficou bom mas dava um bug, só removia o evento se eu consertasse o veículo, mesmo eu colocando um else pra caso ele não detectasse um veículo.

Bom o que eu preciso é que ele conserte o veículo que o jogador que deu /reparar esteja olhando, pensei em fazer no veículo que ele está dentro, mas fica estranho o mecânico arrumar o veículo pelo lado de dentro. Mas dependendo vai ter que ser assim até eu aprender a programar.

 

Link to comment

O script evoluiu bastante e  agora estou travado aqui:

 

-- local para pegar o veículo --
table = {}
markerCar = createMarker(2531.64, -1515.505, 23.1, "cylinder", 1, 0, 0, 255, 35)
addEventHandler( "onPlayerMarkerHit", root,
	function ( m )
		if m == markerCar and not isPedInVehicle(source) then
			if getPedSkin(source) == 50 then
				local accName = getAccountName ( getPlayerAccount ( source ) )
				if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Mecânico" ) ) then
					local spawnCar = {
					{2531.266, -1511.436, 23.996, 0, 0, 270},
					{2541.474, -1510.76, 24.005, 0, 0, 270},
					{2511.171, -1511.779, 24, 0, 0, 87},
					{2500.477, -1511.813, 24, 0, 0, 87},
				}
					rndC = spawnCar[ math.random( #spawnCar ) ]
          			-- ERRO --
					table[source]["car"] = createVehicle(525, rndC[1], rndC[2], rndC[3], rndC[4], rndC[5], rndC[6])
          			-- ERRO --
					fadeCamera(source, false, 0.5)
					setTimer( fadeCamera, 500, 1, source, true, 0.5 )
					warpPedIntoVehicle(source, table[source]["car"])
				end
			else
				exports.dxmsgs:outputDx(source, "Você precisa ser um mecânico e estar com seu uniforme para receber seu veículo.", "info")
			end
		end
	end
)

attempt to index field ? (a nil value) -- tentativa de indexar campo? (um valor nulo)

Não entendi exatamente o que significa, mas imagino que o problema é table[source]

Bom infelizmente não faço ideia do que fazer sobre esse erro.

Outra coisa é o rndC é bem falho visto que tem chance de cair o carro no mesmo lugar de outro jogador, queria fazer um sistema pra variar entre 2 posições. 

Tem isso https://wiki.multitheftauto.com/wiki/Math.randomDiff mas não sei como aplicar.
 


Fora isso aqui está o script, se alguém tem alguma sugestão para melhorar o mesmo.

-- Carro não explode.
addEventHandler("onVehicleDamage", root,
	function()
		if (getElementHealth (source) < 600 ) then
			if (getElementHealth (source) <= 250) then -- Verifica a vida
				setVehicleDamageProof( source, true )
				setElementHealth( source, 10 )
				setVehicleEngineState( source, false )

				addEventHandler ("onPlayerCommand", root,
					function(cmd)
						if (cmd == "motor") then
							cancelEvent()
						end
					end
				)
			end
			local rnd = {1, 2, 3}
			rndT = rnd[ math.random( #rnd ) ]
			if rndT == 1 then
				setVehicleEngineState( source, false )
			end	
		end
	end
)

addEventHandler("onVehicleEnter", root,
	function()
		if (getElementHealth (source) <= 250) then -- Verifica a vida
			setVehicleDamageProof( source, true )
			setElementHealth( source, 10 )
			setVehicleEngineState (source, false)

			addEventHandler ("onPlayerCommand", root,
				function(cmd)
					if (cmd == "motor") then
						cancelEvent()
					end
				end
			)
		end
	end
)

-- Sistema do mecânico --
function targetF(thePlayer)
	local target
	target = getPedTarget ( thePlayer )
	if ( target ) then
		if ( getElementType ( target ) == "vehicle" ) then
			setPedAnimation(thePlayer, "benchpress", "gym_bp_geton", -1, false, false, false, false)
			setTimer ( function()
				fixVehicle(target)
				setVehicleDamageProof( target, false )
			end, 5500, 1 )
		end
	end
end
addCommandHandler("reparar",
	function(source)
		accountname = getAccountName (getPlayerAccount(source))
      	if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Mecanico" ) ) and not isPedInVehicle(source) and getPedSkin(source) == 50 then
      		targetF(source)
      	end
    end
)

-- Local para pegar o emprego --
markerJob = createMarker(2507.855, -1522.458, 27, "cylinder", 1, 0, 255, 0, 35)
createBlipAttachedTo(markerJob, 42, 2, 255, 255, 255, 255, 0, 350)
createObject (1210, 2507.855, -1522.458, 27.552, 0, 0, 90, true)
addEventHandler( "onPlayerMarkerHit", root,
	function ( m )
		if m == markerJob and not isPedInVehicle(source) then
			triggerClientEvent(source, "showPanelMec", source)
		end
	end
)

-- Local para pegar a skin --
setObjectScale ( createObject(1275, 2507.535, -1527.053, 27.959, 0, 0, 90, true ), 2 )
markerSkin = createMarker(2507.476, -1527.093, 27, "cylinder", 1, 0, 0, 255, 35)
addEventHandler( "onPlayerMarkerHit", root,
	function ( m )
		if m == markerSkin and not isPedInVehicle(source) then
			if not (isGuestAccount (getPlayerAccount (source))) then
				account = getPlayerAccount (source)
				if (account) then
					local accName = getAccountName ( getPlayerAccount ( source ) )
					if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Mecânico" ) ) then
						if getPedSkin(source) ~= 50 then
							setAccountData(account, "temp-skin", tostring(getPedSkin(source)))
							setPedSkin(source, 50)
						elseif getPedSkin(source) == 50 then
							setPedSkin(source, getAccountData(account, "temp-skin"))
						end
					else
						exports.dxmsgs:outputDx(source, "Você precisa ser um mecânico para pegar o uniforme.", "info")
					end
				end
			end
		end
	end
)

-- local para pegar o veículo --
table = {}
markerCar = createMarker(2531.64, -1515.505, 23.1, "cylinder", 1, 0, 0, 255, 35)
addEventHandler( "onPlayerMarkerHit", root,
	function ( m )
		if m == markerCar and not isPedInVehicle(source) then
			if getPedSkin(source) == 50 then
				local accName = getAccountName ( getPlayerAccount ( source ) )
				if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Mecânico" ) ) then
					local spawnCar = {
					{2531.266, -1511.436, 23.996, 0, 0, 270},
					{2541.474, -1510.76, 24.005, 0, 0, 270},
					{2511.171, -1511.779, 24, 0, 0, 87},
					{2500.477, -1511.813, 24, 0, 0, 87},
				}
					rndC = spawnCar[ math.random( #spawnCar ) ]
					table[source]["car"] = createVehicle(525, rndC[1], rndC[2], rndC[3], rndC[4], rndC[5], rndC[6])
					fadeCamera(source, false, 0.5)
					setTimer( fadeCamera, 500, 1, source, true, 0.5 )
					warpPedIntoVehicle(source, table[source]["car"])
				end
			else
				exports.dxmsgs:outputDx(source, "Você precisa ser um mecânico e estar com seu uniforme para receber seu veículo.", "info")
			end
		end
	end
)

-- Quando aceita o emprego --
function startJob()
	if client ~= source then return end

	if aclGetGroup("Mecânico") then
		local accName = getAccountName ( getPlayerAccount ( source ) )
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Mecânico" ) ) then
			exports.dxmsgs:outputDx(source, "Você já é um mecânico.", "error")
		else
			aclGroupAddObject(aclGetGroup("Mecânico"), "user."..accName)
			aclSave()
			aclReload()
			exports.dxmsgs:outputDx(source, "Agora você é um mecânico.", "success")
		end
	else
		aclCreateGroup("Mecânico")
		aclSave()
		aclReload()
	end
end
addEvent("startMec", true)
addEventHandler("startMec", root, startJob)

function startDemi()
	if client ~= source then return end

	if aclGetGroup("Mecânico") then
		local accName = getAccountName ( getPlayerAccount ( source ) )
		local account = getPlayerAccount (source)
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Mecânico" ) ) then
			aclGroupRemoveObject (aclGetGroup("Mecânico"), "user."..accName)
			exports.dxmsgs:outputDx(source, "Você foi demitido com sucesso.", "success")
			aclSave()
			aclReload()
			setPedSkin(source, getAccountData(account, "temp-skin"))
		else
			exports.dxmsgs:outputDx(source, "Você ainda não é um mecânico.", "error")
		end
	end
end
addEvent("startDem", true)
addEventHandler("startDem", root, startDemi)



Enquanto isso vou arrumar as outras partes do script.

Link to comment
-- Local para pegar KIT de reparação --
tableKit = {}
markerKit = createMarker(2511.565, -1515.35, 23.1, "cylinder", 1, 0, 255, 0, 35)
addEventHandler( "onPlayerMarkerHit", root,
	function ( m )
		if m == markerKit and not isPedInVehicle(source) and not tableKit[source] then
			setPedAnimation(source, "ped", "ATM", -1, false, false, false, false)
			tableKit[source] = 1
			--ERRO
			setTimer(function(source)
    			exports.dxmsgs:outputDx(source, "Você pegou o kit de ferramentas.", "success")
			end, 5000, 0)
			--ERRO
		end
	end
)

Não envia a mensagem para o jogador, o timer funciona e o outputDx também, mas se eu colocar ele dentro do timer não funciona, preciso enviar a mensagem depois que a animação acabar.
 

Link to comment
  • Other Languages Moderators
48 minutes ago, Gaimo said:

Preciso que fique variando o spawn de veículo em 2 posições, mas que nunca se repitam.

Math.randomDiff

5 minutes ago, Gaimo said:

Não envia a mensagem para o jogador, o timer funciona e o outputDx também, mas se eu colocar ele dentro do timer não funciona, preciso enviar a mensagem depois que a animação acabar.

Não sei se foi falado pra você. Mas já foi dito que dentro do timer, o source deixa de existir. Pois ele pertence ao evento que está anexado na função principal. Passe o source para uma variável local fora do timer e dentro do timer vc usa essa variável em vez do source.

  • Thanks 1
Link to comment

Sobre o setTimer, tente:


-- Local para pegar KIT de reparação --
tableKit = {}
markerKit = createMarker(2511.565, -1515.35, 23.1, "cylinder", 1, 0, 255, 0, 35)
addEventHandler( "onPlayerMarkerHit", root,
	function ( m )
		if m == markerKit and not isPedInVehicle(source) and not tableKit[source] then
			setPedAnimation(source, "ped", "ATM", -1, false, false, false, false)
			tableKit[source] = 1
			setTimer(function(p)
				exports.dxmsgs:outputDx(p, "Você pegou o kit de ferramentas.", "success")
			end, 5000, 0, source)
		end
	end
)

Sobre o spawn alternando entre 1 e 2:

local rndC = spawnCar[ math.randomDiff(1, 2) ]

 

  • Thanks 1
Link to comment

Estou com um problema que envolve o HUD e o Script de Mecânico.

Quero que quando o jogador pegue o emprego, apareça sua profissão na HUD.

SCRIPT DO MEC

-- Quando aceita o emprego.
function startJob()
	if client ~= source then return end

	if aclGetGroup("Mecânico") then
		local accName = getAccountName ( getPlayerAccount ( source ) )
    --------------------------------------------------
		local account = getPlayerAccount (source)
    --------------------------------------------------
		if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Mecânico" ) ) then
			exports.dxmsgs:outputDx(source, "Você já é um mecânico.", "error")
		else
			aclGroupAddObject(aclGetGroup("Mecânico"), "user."..accName)
			aclSave()
			aclReload()
      ----------------------------------------------------------
			setAccountData(account, "Profissão", "Mecânico")
      ----------------------------------------------------------
      -- setAccountData(source, "Profissão", "Mecânico")
			exports.dxmsgs:outputDx(source, "Agora você é um mecânico.", "success")
		end
	else
		aclCreateGroup("Mecânico")
		aclSave()
		aclReload()
	end
end
addEvent("startMec", true)
addEventHandler("startMec", root, startJob)

SCRIPT DO HUD

function hudF ()

    local Nivel = getElementData ( localPlayer, "Level" ) or 0
    local Dinheiro_Mao = getPlayerMoney ( localPlayer )
    local Dinheiro_Banco = getElementData ( localPlayer, "bankbalance" ) or 0
  ----------------------------------------------------------------------------------
    local Profissao = getElementData (localPlayer, "Profissão") or "Desempregado."
  ----------------------------------------------------------------------------------
    local Vida = getElementHealth ( localPlayer )
    local Colete = getPedArmor ( localPlayer )
    
    local Vida_Barra = (screenW * 0.0919) * (Vida/100)
    local Colete_Barra = (screenW * 0.0919) * (Colete/100)

    dxDrawRectangle(x*1076, y*4, x*140, y*25, tocolor(0, 0, 0, 100), false)
    dxDrawRectangle(x*1220, y*4, x*140, y*25, tocolor(0, 0, 0, 100), false)
    dxDrawRectangle(x*1220, y*33, x*140, y*25, tocolor(0, 0, 0, 100), false)
    dxDrawRectangle(x*932, y*4, x*140, y*25, tocolor(0, 0, 0, 100), false)

    dxDrawText("Nivel: "..Nivel.."", x*932, y*4, x*1072, y*29, tocolor(255, 255, 255, 255), x*1.00, "default", "center", "center", false, false, false, false, false)
    dxDrawText("$"..Dinheiro_Banco.."", x*1220, y*33, x*1360, y*58, tocolor(255, 255, 255, 255), x*1.00, "default", "center", "center", false, false, false, false, false)
  -------------------------------------------------------------------------------------------------------------------------------------------------------
    dxDrawText(Profissao, x*1076, y*4, x*1216, y*29, tocolor(255, 255, 255, 255), x*1.00, "default", "center", "center", false, false, false, false, false)
  -------------------------------------------------------------------------------------------------------------------------------------------------------
  dxDrawText("$"..Dinheiro_Mao.."", x*1220, y*4, x*1360, y*29, tocolor(255, 255, 255, 255), x*1.00, "default", "center", "center", false, false, false, false, false)
    
    dxDrawLine(x*1220, y*58, x*1358, y*58, tocolor(255, 255, 255, 255), x*1, false)
    dxDrawLine(x*1220, y*29, x*1358, y*29, tocolor(255, 255, 255, 255), x*1, false)
    dxDrawLine(x*1076, y*29, x*1214, y*29, tocolor(255, 255, 255, 255), x*1, false)
    dxDrawLine(x*932, y*29, x*1070, y*29, tocolor(255, 255, 255, 255), 1, false)

    dxDrawImage(x*1232, y*7, x*19, y*19, "Arquivos/Cifrao.png", 0, 0, 0, tocolor(255, 255, 255, 255), false)
    dxDrawImage(x*1230, y*37, x*23, y*17, "Arquivos/CartaoCredito.png", 0, 0, 0, tocolor(255, 255, 255, 255), false)

    --BASE
    dxDrawRectangle(screenW * 0.0184, screenH * 0.9655, screenW * 0.2044, screenH * 0.0313, tocolor(0, 0, 0, 163), false)
    --VIDA
    dxDrawRectangle(screenW * 0.0257, screenH * 0.9734, Vida_Barra, screenH * 0.0156, tocolor(74, 201, 98, 255), false)
    dxDrawRectangle(screenW * 0.0257, screenH * 0.9734, screenW * 0.0919, screenH * 0.0156, tocolor(74, 201, 98, 100), false)
    --COLETE
    dxDrawRectangle(screenW * 0.1250, screenH * 0.9734, Colete_Barra, screenH * 0.0156, tocolor(255, 255, 255, 255), false)
    dxDrawRectangle(screenW * 0.1250, screenH * 0.9734, screenW * 0.0919, screenH * 0.0156, tocolor(255, 255, 255, 100), false)
end
addEventHandler ( "onClientRender", getRootElement(), hudF )



Não aparece nenhum erro no debugscript, e na HUD aparece  "Desempregado."


Porém está salvando sim no jogador a profissão dele, testei abrir e olhar o internal.db e está lá:
id   userid       key              value          type
"1"    "1"    "Profissão"    "Mecânico"    "4"

Edited by Gaimo
Erro de português
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...