Jump to content

[M]ister

Members
  • Posts

    444
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by [M]ister

  1. Você quer tirar $30 do passageiro e dar 30$ ao motorista, mas no seu script não está definido esse valor em nenhum lugar, então obviamente que não iria funciona. Use a wiki takePlayerMoney / givePlayerMoney e veja quais parâmetro precisam ser passados em cada função.
  2. A função getPlayerFromPartialName não é nativa, você deve colocar ela no seu código.
  3. Visualmente não identifiquei nenhum erro. Use o /debugscript 3 e veja se aparece alguma mensagem de erro ou warning.
  4. thePlayer = Motorista Uber playerName = String nick do passageiro theClient = Elemento passageiro function aceitar (thePlayer, commandName, playerName) if playerName then local theClient = getPlayerFromPartialName (playerName) if not theClient then return end if blip[theClient] and isElement (blip[theClient]) then destroyElement (blip[theClient]) blip[theClient] = nil end end end addCommandHandler("aceitar", aceitar) Falta verificar se o usuário que acionou essa função é realmente um motorista de Uber, como já mencionado pelo @DNL291
  5. Teste: mission_client.lua function timesveh (veh6) outputDebugString("funcionando") local counter = 0 setTimer(function() for seat, player in pairs (getVehicleOccupants(veh6)) do counter = counter + 1 end if counter > 0 then outputChatBox ( "Voçê esta no Vehicle", 255, 255, 255, true ) else outputChatBox ( "Voçê Nao entrou no veiculo a tempo mission failed", 255, 255, 255, true ) triggerServerEvent("delVeh",localPlayer) end counter = 0 end,1000,1) end addEvent ("mission6", true) addEventHandler ("mission6", localPlayer, timesveh) Server.lua veh6 = {} localitionveh6 = { [1] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [2] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [3] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [4] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, [5] = {401, 213.33366, 1871.35400, 13.14063, 0, 0, 270}, } i = 1 function inicio6 () if isElement (veh6[client]) then destroyElement (veh6[client]) veh6[client] = nil end local vx ,vy, vz, vrot = localitionveh6[ i ][ 2 ], localitionveh6[ i ][ 3 ], localitionveh6[ i ][ 4 ], localitionveh6[ i ][ 7 ] i = i + 1 if i > #localitionveh6 then i = 1 end Trabalho = true veh6[client] = createVehicle ( 401, vx, vy, vz, 0, 0, vrot ) setElementVisibleTo (Bfim6, client, true) outputChatBox ("#ffff00Drive the vehicle to the checkpoint. Note: You cannot leave the car during the mission.", client, 0, 0, 0, true) triggerClientEvent (client, "mission6", client, veh6[client]) end addEvent ("iniciaJob6", true) addEventHandler ("iniciaJob6", getRootElement(), inicio6) addEvent( "delVeh", true ) addEventHandler( "delVeh", getRootElement(), function() if isElement (veh6[client]) then destroyElement (veh6[client]) veh6[client] = nil end end )
  6. Se o source do trigger estiver definido como root o evento será desencadeado em todos os resources, por isso é importante usar sempre resourceRoot ou algum outro elemento mais baixo da raiz, pois além de evitar possíveis conflitos com outros scripts, irá salvar também uso desnecessário da CPU. No caso deste tópico que o objetivo é um resource abrir o painel de outro resource (sem nenhum retorno), o trigger é sim viável.
  7. Eu coloquei dois links de tutoriais no meu comentário acima. E também existem vários outros espalhados por ai, basta saber pesquisar (Google é um grande amigo de qualquer programador).
  8. -- client side function teste() outputChatBox("estou na acl") end addEvent( "addBind", true ) addEventHandler( "addBind", localPlayer, function() bindKey ( "M", "up", teste ) end ) addEventHandler( "onClientResourceStart", resourceRoot, function() if getKeyBoundToFunction( teste ) ~= "M" then triggerServerEvent ( "upRequest", localPlayer ) end end ) -- server side addEventHandler ( "onResourceStart", resourceRoot, function() for _, thePlayer in ipairs(getElementsByType("player")) do if estaAcl(thePlayer,"BOPE") then triggerClientEvent ( thePlayer, "addBind", thePlayer ) end end end ) addEventHandler("onPlayerLogin", root, function() local thePlayer = source if estaAcl(thePlayer,"BOPE") then triggerClientEvent ( thePlayer, "addBind", thePlayer ) end end ) function estaAcl(thePlayer, acl) local accName = getAccountName ( getPlayerAccount ( thePlayer ) ) if isObjectInACLGroup ("user."..accName, aclGetGroup ( acl ) ) then return true end return false end addEvent( "upRequest", true ) addEventHandler( "upRequest", root, function() local thePlayer = client if estaAcl(thePlayer,"BOPE") then triggerClientEvent ( thePlayer, "addBind", thePlayer ) end end )
  9. Como você não quer usar pela team, precisa alterar as linhas 4, 5 e 6 e nesse lugar você pode colocar aquela verificação: if (qtsElementData("PM") >= 5) then
  10. Você precisa aprender tabelas e loops. local janelas = { { titulo = "Mission Description", memo = "You must kill 50 zombies in area 51\n\n \n Reward\nMoney: R$ 5,000.00 \nEXP : 3555 " }, { titulo = "Mission Description", memo = "123456" }, { titulo = "Mission Description", memo = "KEVIN" } } local elementos = { window = {}, btns = {}, } addEventHandler("onClientResourceStart", resourceRoot, function() for i,janela in ipairs(janelas) do wnd = guiCreateWindow(939, 156, 196, 329, janela.titulo, false) elementos.window[wnd] = i-1 guiSetVisible (wnd, false) guiWindowSetSizable(wnd, false) guiCreateMemo(9, 32, 175, 196, janela.memo, false, wnd) btnExit = guiCreateButton(10, 280, 174, 40, "EXIT", false, wnd) btnCopy = guiCreateButton(9, 233, 175, 37, "COPY", false, wnd) elementos.btns[btnExit] = {wnd,"exit"} elementos.btns[btnCopy] = {wnd,"copy"} end end ) addEventHandler ("onClientGUIClick", resourceRoot, function (button, state, absoluteX, absoluteY) if (elementos.btns[source]) then if (elementos.btns[source][2] == "exit") then guiSetVisible (elementos.btns[source][1], false) end end end) addEventHandler ("onClientGUIClick", resourceRoot, function (button, state, absoluteX, absoluteY) if (source == info) then for wnd, id in pairs(elementos.window) do if (id == guiGridListGetSelectedItem(ListMissions)) then guiSetVisible (wnd, true) else guiSetVisible (wnd, false) end end end end)
  11. --[[ -- exemplo uso if (qtsElementData("PM") >= 5) then -- assalta banco end --]] function qtsElementData(dataname) local qtd = 0 for _,p in ipairs(getElementsByType("player")) do if getElementData(p,dataname) then qtd = qtd + 1 end end return qtd end
  12. Com o segundo trecho ele sempre retornará um valor entre -180...180, mas isso nem importa para o nosso caso, tenha conhecimento apenas de como funciona o esquema de valores relativos (diferença) e a lógica de como calculá-los (geralmente apenas simples subtrações).
  13. function pedir (source) local blip = createBlipAttachedTo (source, 62) local players = getElementsByType ("player") for _, driver in ipairs (players) do local account = getAccountName (getPlayerAccount(driver)) if not isObjectInACLGroup ("user."..account, aclGetGroup ("UBER")) then setElementVisibleTo (blip, driver, false) end end end addCommandHandler ("uber", pedir)
  14. Faça com que detecte os clicks apenas quando for habilitado o cursor pelo M: function detectar(_, state, _, _, _, _, _, clickedElement) if ( state == "up" and clickedElement ) then if ( getElementType ( clickedElement ) == "vehicle" ) then triggerServerEvent ( "onClientRequestRepair", localPlayer, clickedElement ); end end end bindKey ( "M", "down", function ( ) if (not isCursorShowing()) then showCursor(true) addEventHandler("onClientClick", root, detectar) else showCursor(false) removeEventHandler("onClientClick", root, detectar) end end )
  15. Como já mencionado, os parâmetros de rotação do moveObject se referem à rotação relativa ao estado inicial, seria basicamente assim: se o objeto possui as rotações (rx = 120, ry = 0, rz = 180) e eu quiser rotacioná-lo para esses outros valores absolutos (rx = 50, ry = 20, rz = 30), eu devo usar o diferencial deles, que seria no caso: (rx = -70, ry = 20, rz = -150). Ai basicamente o moveObject somaria esses valores com a rotação inicial: rx: (120 + (-70)) = 50 ry: (0 + 20) = 20 rz: (180 + (-150)) = 30 Funcionamento da função com o rx: function calculo(120,50) local dif = 50 – 120 -- (-70) -- segundo trecho do cálculo² dif = (-70 + 180) % 360 – 180 --[[ dif = 110 % 360 – 180 dif = 110 – 180 dif = -70 --]] return -70 end Observações: O operador “%” refere-se ao resto da divisão. O segundo trecho do cálculo nem se faz necessário para o nosso caso, ele serve mais para obter a distância mais curta*. *Vamos utilizar como exemplo os seguintes dados: rotação inicial (absoluta): 350 rotação desejada (absoluta): 30 -- Sem o segundo trecho: function calculo(350,30) local dif = 30 – 350 -- (-320) return -320 end -- Com o segundo trecho: function calculo(350,30) local dif = 30 – 350 -- (-320) dif = (-320 + 180) % 360 – 180 --[[ dif = -140 % 360 – 180 dif = 220 – 180 dif = 40 --]] return 40 end O que daria o seguinte: 1) 350 – 320 = 30 2) 350 + 40 = 390 → 30** **No segundo caso deu 390, mas queremos o valor 30. Lembre-se que o valor máximo de um ângulo é 360º, então nesse segundo caso ele percorre até os 360 e mais 30 (total de 40 unidades), o que é mais curto do que sair do 350 e voltar até o 30 (320 unidades).
  16. Tenta isso: local i = 0 att = setTimer(function() i = i+1 if i > 1 then moveObject(obj, 1000, rotas[i].posX, rotas[i].posY, rotas[i].posZ, calculo(rotas[i-1].rotX, rotas[i].rotX), calculo(rotas[i-1].rotY, rotas[i].rotY),calculo(rotas[i-1].rotZ, rotas[i].rotZ)) else moveObject(obj, 1000, rotas[i].posX, rotas[i].posY, rotas[i].posZ) end end, 1000, #rotas) function calculo(angulo1, angulo2) local dif = angulo2 - angulo1 dif = (dif + 180) % 360 - 180 return dif end
  17. Por nada ^^. Setando a rotação pelo moveObject seria melhor, já que ele vai movendo linearmente até chegar no valor desejado, ai diminuiria uma pouco essa feiura na rotação.
  18. local counter = 0 setTimer(function(p) for seat, player in pairs(getVehicleOccupants(veh6[p])) do counter = counter + 1 end if counter > 0 then outputChatBox ( "Voçê esta no Vehicle", p, 255, 255, 255, true ) else outputChatBox ( "Voçê Nao entrou no veiculo a tempo mission failed", p, 255, 255, 255, true ) destroyElement (veh6[p]) end counter = 0 end, 5000, 1, client)
  19. Tente usar o setElementRotation antes do moveObject, porque provavelmente com o moveObject nesse 1000 milisegundos ele mantêm a rotação inicial e com isso acaba por desfazer o comando de rotação. Ou então faça o que o Lord mencionou, adicione a rotação nos parâmetros do moveObject, mas para isso precisaria adaptar o código para obter o diferencial de rotação de um dado para outro, já que é utilizado a rotação relativa no moveObject e não absoluta como no setElementRotation.
  20. Dessa forma ele irá começar a atirar mesmo se o player estiver atrás do ped, e não só apenas no seu campo de visão. Tem que tentar fazer algo como o @Lord Henry mencionou... só não ajudo pq sou ruim de matemática, ia ter que parar pra pensar um pouco kkk
  21. Usa o segundo exemplo para criar as rotas, abra o arquivo que ele vai gerar, copie seu conteúdo, e então jogue no começo do primeiro exemplo. Outra possibilidade seria remover a declaração "local" da linha 11 do segundo código, que então a tabela gerada nele serviria em todo o script, mas desse modo é necessário adicionar o rotas.lua no meta.xml
  22. setPedControlState() Como já mencionado pelo @Lord Henry, usar um ped para dirigir um veículo em determinadas rotas é algo meio complexo de se fazer. Eu sugiro que você faça algo do tipo: Crie um objeto qualquer com visibilidade 0 e colisão desativada; Crie o veículo; Anexe o veículo ao objeto (attachElements); A movimentação se daria por moveObject, que a cada x tempo atualizaria o objeto (junto com o veículo) para uma determinada posição. Exemplo: --[[ subjulgue que o script possua uma tabela "rotas" parecida com o seguinte: local rotas = { {posX=0,posY=0,posZ=0,rotX=0,rotY=0,rotZ=0}, {posX=0,posY=0,posZ=0,rotX=0,rotY=0,rotZ=0}, -- e várias outras posições --]] local veh = createVehicle(id, x, y, z, rx, ry, rz) local obj = createObject(id, x, y, z, rx, ry, rz) setElementAlpha(obj, 0) setElementCollisionsEnabled(obj, false) attachElements(veh, obj) local i = 0 att = setTimer(function() i = i+1 moveObject(obj, 1000, rotas[i].posX, rotas[i].posY, rotas[i].posZ) setElementRotation(obj, rotas[i].rotX, rotas[i].rotY, rotas[i].rotZ) end, 1000, #rotas) Para determinar a rota, precisaria criar um script que facilitaria na formação dessas rotas. Exemplo: -- Gerador de rotas addCommandHandler("rota", function(pl,_,acao) if not acao then file = fileExists ("rotas.lua") if file then fileDelete("rotas.lua") end file = fileCreate("rotas.lua") fileWrite(file,"local rotas = {\n") tempo = setTimer(function() local pveh = getPedOccupiedVehicle(pl) local x,y,z = getElementPosition(pveh) local rx,ry,rz = getElementRotation(pveh) fileWrite(file, "{posX="..string.format("%.2f",x)..",posY="..string.format("%.2f",y)..",posZ="..string.format("%.2f",z)..",rotX="..string.format("%.2f",rx)..",rotY="..string.format("%.2f",ry)..",rotZ="..string.format("%.2f",rz).."},\n") end,1000,0) fileWrite(file,"}") end if (acao == "fim") then if isTimer(tempo) then killTimer(tempo) end if file then fileClose(file) end end end ) Para criar as rotas você deve atuar, ex: pega o ônibus e digita /rota e então faça o caminho que o ônibus deve seguir, após terminar o percurso use (/rota fim), com isso ele criará o arquivo: rotas.lua que você usaria no script. Infelizmente dessa forma o veículo não anda “normal”, pois estamos movendo um objeto e não o veículo em si, então possivelmente ocorrerá um pouco de teleporte no movimento/rotação. Mas e uma forma viável de fazer o que você quer.
  23. Verdade. Dei uma olhada rápida e imaginei que estavam setando o player diretamente no veículo.
  24. Como sintetizado pelo @danilin, é uma forma de evitar que o veículo spawne bugado no chão (coordenada z = altura). Pois geralmente em veículos 'grandes' a altura do centro do veículo é maior do que o do personagem, e caso a gente defina a mesma altura, possivelmente esse veículo entrará um pouco no chão na hora de desová-la. Mas no caso de uma ‘bike’ não vejo necessidade dessa manipulação. Na realidade seria +1 (como está no script).
  25. O MTA só possui o SQLite como database integrada. Para utilização do MySQL deve-se instalar o respectivo servidor em sua máquina ou então efetuar a conexão de maneira remota, por isto a necessidade dos parâmetros: ip, porta, login e senha. Ou seja, fica muito mais viável a utilização do próprio SQLite do MTA, pois caso use um MySQL remoto o delay nas transferências de dados aumentará significativamente. E não tem qualquer relação com ele ser mais seguro ou não, até porque a database integrada do MTA é acessível só localmente. Já em servidores MySQL pode-se ocorrer de ficar acessível para qualquer um (o que o torna mais vulnerável). Um diferencial que pode ser significativo, é que o MySQL possui uma gama maior de instruções/utilizações.
×
×
  • Create New...