Gaimo Posted January 21, 2019 Share Posted January 21, 2019 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
DNL291 Posted January 21, 2019 Share Posted January 21, 2019 Esse erro foi por não ter passado o jogador na função targetF - linha 14. Linha 14 > targetF(source) 1 Link to comment
Gaimo Posted January 28, 2019 Author Share Posted January 28, 2019 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
Gaimo Posted January 28, 2019 Author Share Posted January 28, 2019 Tá o problema do carro eu arrumei, agora falta arrumar o sistema de spawn random. Alguma sugestão? Preciso que fique variando o spawn de veículo em 2 posições, mas que nunca se repitam. Link to comment
Gaimo Posted January 28, 2019 Author Share Posted January 28, 2019 -- 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 Lord Henry Posted January 28, 2019 Other Languages Moderators Share Posted January 28, 2019 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. 1 Link to comment
DNL291 Posted January 28, 2019 Share Posted January 28, 2019 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) ] 1 Link to comment
Other Languages Moderators Lord Henry Posted January 28, 2019 Other Languages Moderators Share Posted January 28, 2019 Lembrando que math.randomDiff é uma função útil. Logo vc precisa ter o código dela no seu script pra funcionar. 1 Link to comment
Gaimo Posted January 30, 2019 Author Share Posted January 30, 2019 (edited) 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 January 30, 2019 by Gaimo Erro de português Link to comment
DNL291 Posted January 30, 2019 Share Posted January 30, 2019 Você tá salvando a profissão na conta e usando getElementData no client, sendo que element-data é um valor armazenado diretamente para um elemento. Use: setElementData( source, "Profissão", "Mecânico" ) no lado server. 1 Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now