-
Posts
4,005 -
Joined
-
Last visited
-
Days Won
184
Everything posted by Lord Henry
-
Pois o While é um loop que ocorre enquanto a condição dele for atendida, não existe um número limitando as repetições. No entanto, vc já está dentro de um loop For. Dessa forma a estrutura de repetição fica eterna, pois o MTA não consegue executar a segunda repetição do For pois o While ainda está sendo repetido eternamente. E supondo que o MTA mantenha a execução do While e tente fazer a segunda repetição do For, isso daria um problema maior ainda, pois o While seria repetido eternamente 2x ao mesmo tempo, e cada For faria um novo While e assim sucessivamente. O sistema inteiro entraria em colapso. No entanto eu sei que o MTA tem um sistema de segurança que cancela a execução do script quando detecta loops infinitos. O que é possível fazer, é usar um For dentro de um While. Pois assim que as repetições do For forem concluídas, o While pode continuar sua repetição sem problemas.
-
Nunca use um while dentro de um loop. Onde vc viu isso?
-
Para obter a lista de jogadores online, vc só precisa obter todos os elementos do tipo "player". Para isso você usa getElementsByType ("player") Se você quiser acessar cada jogador obtido por meio de um loop, por exemplo, pra dar um jetpack á cada um deles. Dai você faz assim: function jetPraGeral (thePlayer, cmd) local todoMundo = getElementsByType ("player") -- todoMundo é uma table com todos os jogadores conectados ao server. for i, jogador in ipairs (todoMundo) do -- Para cada elemento dessa table, faça o seguinte: setPedWearingJetpack (jogador, true) -- Dá um jetpack pra esse elemento. end end addCommandHandler ("todosJet", jetPraGeral) A table acima seria tipo assim: local todoMundo = {player1, player2, player3} -- player1 não é o nick do jogador, e sim um elemento do tipo "player". -- Supondo que só tenham 3 jogadores no server. Ali naquele loop do FOR: i se refere ao índice de cada elemento dessa table. No entanto ela não está indexada, então o MTA considera índices inteiros em ordem. Se você quer obter o player2, você pode acessá-lo com todoMundo[2], pois o 2 é o índice que o MTA deu pra ele. jogador se refere a cada elemento em si. ipairs indica que o loop percorre os elementos com índices inteiros numa tabela, em ordem. Obs: Se você quer que o i comece a partir do 0 em vez de 1, use pairs em vez de ipairs. Por exemplo em casos onde você quer contar quantos players estão dentro de um veículo. Porém você deve considerar o assento 0, que é do motorista. function meusOcupantes (thePlayer, cmd) local myVehicle = getPedOccupiedVehicle (thePlayer) -- myVehicle recebe o veículo que o jogador que executou o comando está. if not myVehicle then return end -- Se o jogador que executou o comando não está em um veículo, nada acontece. local counter = 0 -- Contador de ocupantes começa em 0. local ocupantes = getVehicleOccupants(myVehicle) -- ocupantes recebe uma table com todos os jogadores que estão dentro do veículo. Indexada com os assentos ocupados. for seat, player in pairs(ocupantes) do counter = counter + 1 outputChatBox ("Assento "..seat..": "..getPlayerName(player), thePlayer, 255, 255, 255, true) end outputChatBox ("Ocupantes: "..counter, thePlayer) end A table acima é tipo assim: local ocupantes = { [0] = motorista; [1] = player2; [3] = player3 } -- Supondo que não tenha jogador no assento 2. Note que ela está indexada com o assento em que cada jogador está. No entanto se usar ipairs, o motorista seria ignorado, pois o loop começaria a partir do 1, ignorando o índice 0. Então o loop deve ser feito com pairs, que considera todos os elementos independente de seu índice. Porém o loop pairs percorre a table de maneira aleatória, e não em ordem como o ipairs. Outra coisa a ser levada em consideração entre os dois tipos de loop, é que se você estiver usando uma table com índices não-inteiros, o ipairs não pegará nenhum dos elementos, pois ela só funciona com índices inteiros ou com tabelas que não estão indexadas. Faça o seguinte teste entre eles: client-side (recomendável) tabelaNaoIndexada = { -- O próprio MTA irá indexar isso automaticamente em ordem inteira. " ", "Um", 2, "ABC", 0.15 } tabelaIndexadaInt = { -- Funciona com ipairs, mas ignora o 0. [0] = " ", [1] = "Um", [2] = 2, [3] = "ABC", [4] = 0.15 } tabelaIndexadaQualquer = { -- Não funciona com ipairs, pois não é possível determinar a ordem dos índices, pois eles não são todos inteiros. [0] = " ", ["1"] = "Um", ["dois"] = 2, [3.3] = "ABC", [4] = 0.15 } tabelaIndexadaIntQualquer = { -- Só funciona com ipairs até onde existe o índice seguinte. Se não encontrar o índice seguinte, o resto será ignorado. [1] = " ", [2] = "Um", [4] = 2, [5] = "ABC", [6] = 0.15 -- Se substituir o 6 pelo 3 que está faltando, essa table funcionará perfeitamente no ipairs. Pois não terá índice faltando na sequência. } for index, valor in ipairs (tabelaNaoIndexada) do -- Substitua o tabelaNaoIndexada pelas outras tables para testar. Tente também usando o pairs. outputChatBox (index.." = "..valor) end outputChatBox ("Tamanho: "..#tabelaNaoIndexada) -- Tente verificar o tamanho das tables com isso e observe os bugs. A função #table serve para mostrar o tamanho de uma table. No entanto ela não conta os elementos e irá bugar em tables indexadas como os 2 últimos exemplos. Na verdade ela apenas mostra o maior índice inteiro da sequência. No caso do último exemplo, onde o maior índice é 6. Ele vai dizer que o tamanho dela é 6, quando na verdade é 5. Qualquer dúvida que você ainda tiver sobre as tables e os loops, estarei aqui pra ajudar.
-
Só usar getVehicleType e verificar se o veículo não é um barco. local posX, posY, posZ = 527.23, 631.9, 2.19 -- Posição teste onde o veículo será movido ao colidir na água. function vehicleRender () if getPedOccupiedVehicle (localPlayer) then if isElementInWater (getPedOccupiedVehicle (localPlayer)) then setElementPosition (getPedOccupiedVehicle (localPlayer), posX, posY, posZ) end end end addEventHandler ("onClientVehicleEnter", root, function (thePlayer, seat) if thePlayer == localPlayer then if seat == 0 then if getVehicleType (source) ~= "Boat" then addEventHandler("onClientRender", root, vehicleRender) end end end end) addEventHandler ("onClientVehicleExit", root, function (thePlayer, seat) if thePlayer == localPlayer then removeEventHandler("onClientRender", root, vehicleRender) end end)
-
Você pode usar um setTimer para destruir o veículo após tantos segundos que ele ficou vazio e também pode cancelar esse timer quando alguém entrar no veículo. No entanto, não existe uma função que detecta quando um veículo é criado. Se o player criar o veículo e não entrar nele, o timer não será criado. server-side vehTimer = {} addEventHandler ("onVehicleExit", getRootElement(), function (thePlayer, seat, jacker, forcedByScript) local counter = 0 for seat, player in pairs(getVehicleOccupants(source)) do counter = counter + 1 end if counter == 0 then -- Se o veículo ficou vazio após esse player sair dele, então: vehTimer[source] = setTimer (destroyElement, 5000, 1, source) -- destroi o veículo após 5 segundos que alguém saiu dele. end end) addEventHandler ("onVehicleEnter", getRootElement(), function (thePlayer, seat, jacked) if isTimer (vehTimer[source]) then killTimer (vehTimer[source]) end end)
-
Não sei se esta é a melhor maneira de fazer isso, pois não achei nenhuma função que detecte colisão na água. Então usei um onClientRender para ficar verificando o tempo todo se o veículo está na água ou não. Para não ficar verificando de maneira desnecessária, quando o jogador sai do veículo, ele deve parar de verificar. E quando ele entrar em um veículo como motorista, começa a verificar novamente. client-side local posX, posY, posZ = 527.23, 631.9, 2.19 -- Posição teste onde o veículo será movido ao colidir na água. function vehicleRender () if getPedOccupiedVehicle (localPlayer) then if isElementInWater (getPedOccupiedVehicle (localPlayer)) then setElementPosition (getPedOccupiedVehicle (localPlayer), posX, posY, posZ) end end end addEventHandler ("onClientVehicleEnter", root, function (thePlayer, seat) if thePlayer == localPlayer then if seat == 0 then addEventHandler("onClientRender", root, vehicleRender) end end end) addEventHandler ("onClientVehicleExit", root, function (thePlayer, seat) if thePlayer == localPlayer then removeEventHandler("onClientRender", root, vehicleRender) end end)
-
Você só tem que impedir que numbers seja false.
-
local numbers = getElementData(isPlayerInLoot(),itemName) -- Se não existir a data, então numbers = false for i = 1, numbers do -- Se numbers for false, dará erro aqui. Ali nas linhas 348 e 349.
-
Olá senhores, depois de um mês desde o último post desse tópico, vim revivê-lo apenas para deixar algumas pequenas correções, visto que esse tópico acabou abordando muito mais informação do que o esperado, e isso é ótimo. Chegaram a abordar até a Teoria das Cores. Quanto mais informação, melhor. Respondendo a sua dúvida, não muda em nada em questão de performance. O root é uma variável interna do MTA que faz exatamente a mesma coisa que o getRootElement(), da mesma forma que usar localPlayer é o mesmo que o getLocalPlayer(). Você pode conferir todas as variáveis pré-definidas do MTA nessa página da Wiki. Em relação ao seu comentário da segunda linha do código, ele não irá enviar a mensagem quase branca sempre. Isso depende diretamente da configuração do chat do usuário. O MTA permite que os jogadores configurem as cores padrão do chat, além de fonte, tamanho, etc. Por padrão, o MTA deixa definido a cor do chat em em #E7D9B0. Mas se o usuário configurar para outra cor, então é essa outra cor que vai aparecer. O fato de você não estar declarando uma cor no script, na verdade indica "definido pelo padrão do usuário". É importante deixar claro que existe uma grande diferença entre cores-luz (pixels, luzes) e cores-pigmento (tintas, guache, etc). Nas cores pigmento, quanto mais cor envolvida na mistura, mais escura ela ficará, até se tornar preto, por esse motivo elas são cores subtrativas. Já nas cores-luz, quanto mais cores juntas, mais clara será essa mistura, até chegar no branco, por isso elas são cores aditivas. Outra coisa que vale a pena ressaltar é que as cores primárias de um são diferentes das cores primárias do outro. As cores primárias subtrativas são o Ciano, Magenta, Amarelo e Preto (CMYK). Já as cores primárias aditivas são o Vermelho, Verde e Azul (RGB). Na verdade o F representa 15 do RGB se estiver no segundo caractere de seu par no código e representa 240 se estiver no primeiro caractere de seu par. O 255 é representado na verdade por FF. =============================== Apenas uma última observação: Quando vc cria um tópico novo, ele se mantém editável mesmo após longos períodos de tempo, diferente dos posts cuja edição só é possível logo depois de postado. Isso significa que vc tem total liberdade para editar seu tópico e adicionar as novas informações que foram trazidas e assim melhorar seu tutorial. Outra coisa: Eu gostaria de pedir desculpas pela minha segunda resposta neste tópico, lendo novamente eu percebi que fui meio arrogante e deveria ter explicado melhor em como fazer um bom tutorial em vez de apenas criticar. Mas enfim, vida que segue. Acho que todos nós aprendemos com este post.
-
Ele está dizendo que numbers precisa ser um número. Provavelmente getElementData(isPlayerInLoot(),itemName) está retornando false.
-
Da próxima vez, poste na sessão destinada a programação lua. https://forum.multitheftauto.com/forum/127-programação-em-lua/ E deixe seu código adequadamente indentado, senão fica ilegível.
-
[AJUDA] Ponto de Spawn de acordo com a localização
Lord Henry replied to dener189's topic in Programação em Lua
Ta ae, coloquei comentários pra ficar mais fácil de entender. local spawnPos = { -- (Prefira usar no máximo 3 casas decimais.) [1] = {2034.9428710938, -1403.2003173828, 18}, -- Hospital 1 LS [2] = {-2655.3991699219, 638.16137695313, 15}, -- Hospital SF [3] = {-1514.6713867188, 2522.4748535156, 56}, -- Hospital Tierra Robada [4] = {1607.62890625, 1818.9958496094, 11}, -- Hospital LV [5] = {-2198.5632324219, -2306.6220703125, 31}, -- Hospital Whetstone } addEventHandler ("onPlayerWasted", getRootElement(), function () -- Executa essa função quando o player morre. local x, y, z = getElementPosition (source) -- x, y, z recebem a posição do player onde ele morreu. local dist = 99999 -- Distância do ponto mais próximo. local id = 0 -- ID da coordenada mais próxima. for i, v in ipairs (spawnPos) do -- Para cada table de coordenadas, faça: local pX, pY, pZ = unpack (spawnPos[i]) -- pX,pY, pZ recebem as coordenadas que estão no spawnPos[i] if getDistanceBetweenPoints3D (x, y, z, pX, pY, pZ) < dist then -- Se a distância dessa coordenada for menor que dist, então: dist = getDistanceBetweenPoints3D (x, y, z, pX, pY, pZ) -- Atualiza a distância para essa. id = i -- Atualiza o id para este. end end if id == 1 then -- Outputs que servem somente para testes. outputChatBox ("Hospital mais próximo: Los Santos", source) elseif id == 2 then outputChatBox ("Hospital mais próximo: San Fierro", source) elseif id == 3 then outputChatBox ("Hospital mais próximo: Tierra Robada", source) elseif id == 4 then outputChatBox ("Hospital mais próximo: Las Venturas", source) elseif id == 5 then outputChatBox ("Hospital mais próximo: Whetstone", source) end setElementData (source, "killNear", id) -- Seta o id mais próximo como data no player. end) function spawnMe () if getElementData (source, "killNear") then -- Se o jogador que morreu tem essa data, então: (quando o jogador entra no server, ele spawna sem essa data) setElementPosition (source, unpack (spawnPos[getElementData (source, "killNear")])) -- Coloca ele na posição desse ID que está na data. removeElementData (source, "killNear") -- Remove essa data, que não será mais usada até que ele morra novamente e uma nova data seja criada. end end addEventHandler ("onPlayerSpawn", getRootElement(), spawnMe) -- Executa essa função quando o player spawna. -
Ele está reclamando que não é possível usar string.format, pois aquele valor é false. (o jogador não tem nenhuma data "bankbalance") Coloque uma condição antes dessa formatação, de modo que se a data não existir, ele faça a conversão usando outro valor. local screenW,screenH = guiGetScreenSize() local resW, resH = 1280, 720 local x, y = (screenW/resW), (screenH/resH) function HudGtaV () -- dxDrawImage( x*1093, y*118, x*111, y*82, "img/"..getPedWeapon(getLocalPlayer())..".png", 0, 0, 0, tocolor(255, 255, 255, 255), false) -- dxDrawLine( x*1100 - 1, y*79 - 1, x*1100 - 1, y*105, tocolor(21, 168, 38, 126), 1, false) -- dxDrawLine( x*1228, y*79 - 1, x*1100 - 1, y*79 - 1, tocolor(21, 168, 38, 126), 1, false) -- dxDrawLine( x*1100 - 1, y*105, x*1228, y*105, tocolor(21, 168, 38, 126), 1, false) -- dxDrawLine( x*1228, y*105, x*1228, y*79 - 1, tocolor(21, 168, 38, 126), 1, false) dxDrawRectangle( x*1100, y*79, x*128, y*26, tocolor(0, 0, 0, 126), false) dxDrawImage( x*1063, y*73, x*32, y*33, "imgs/bancoo.png", 0, 0, 0, tocolor(255, 255, 255, 255), false) local money2 = 0 if getElementData(getLocalPlayer(),"bankbalance") then money2 = string.format("%8d", getElementData (getLocalPlayer(),"bankbalance")) else money2 = string.format("%8d", 0) end dxDrawText(""..money2, x*1105, y*77, x*1119, y*95, tocolor(150, 140, 147, 229), 1.00, "pricedown", "left", "top", false, false, false, false, false) -- showammo1 = getPedAmmoInClip (localPlayer,getPedWeaponSlot(localPlayer)) -- showammo2 = getPedTotalAmmo(localPlayer)-getPedAmmoInClip(localPlayer) -- dxDrawText("".. showammo1, x*1146, y*100, x*1186, y*140, tocolor(129, 137, 243, 255), 1.00, "pricedown", "left", "top", false, false, false, false, false) -- dxDrawText("".. showammo2, x*1197, y*99, x*1237, y*139, tocolor(12, 20, 127, 255), 1.00, "pricedown", "left", "top", false, false, false, false, false) local altura = 25 local imageL, imageA = 25,25 local star01, star02, star03, star04, star05, star06 = 1220, 1193, 1165, 1138, 1110, 1080 local image = "wanted/star.png" wanted = getPlayerWantedLevel (getLocalPlayer()) if wanted == 1 then dxDrawImage(x*star01, y*altura, x*imageL, y*imageA, image) -- star 01 dxDrawImage(x*star02, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 02 --fundo dxDrawImage(x*star03, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 03 --fundo dxDrawImage(x*star04, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 04 --fundo dxDrawImage(x*star05, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 05 --fundo dxDrawImage(x*star06, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 06 --fundo elseif wanted == 2 then dxDrawImage(x*star01, y*altura, x*imageL, y*imageA, image) -- star 01 dxDrawImage(x*star02, y*altura, x*imageL, y*imageA, image) -- star 02 dxDrawImage(x*star03, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 03 --fundo dxDrawImage(x*star04, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 04 --fundo dxDrawImage(x*star05, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 05 --fundo dxDrawImage(x*star06, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 06 --fundo elseif wanted == 3 then dxDrawImage(x*star01, y*altura, x*imageL, y*imageA, image) -- star 01 dxDrawImage(x*star02, y*altura, x*imageL, y*imageA, image) -- star 02 dxDrawImage(x*star03, y*altura, x*imageL, y*imageA, image) -- star 03 dxDrawImage(x*star04, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 04 --fundo dxDrawImage(x*star05, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 05 --fundo dxDrawImage(x*star06, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 06 --fundo elseif wanted == 4 then dxDrawImage(x*star01, y*altura, x*imageL, y*imageA, image) -- star 01 dxDrawImage(x*star02, y*altura, x*imageL, y*imageA, image) -- star 02 dxDrawImage(x*star03, y*altura, x*imageL, y*imageA, image) -- star 03 dxDrawImage(x*star04, y*altura, x*imageL, y*imageA, image) -- star 04 dxDrawImage(x*star05, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 05 --fundo dxDrawImage(x*star06, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 06 --fundo elseif wanted == 5 then dxDrawImage(x*star01, y*altura, x*imageL, y*imageA, image) -- star 01 dxDrawImage(x*star02, y*altura, x*imageL, y*imageA, image) -- star 02 dxDrawImage(x*star03, y*altura, x*imageL, y*imageA, image) -- star 03 dxDrawImage(x*star04, y*altura, x*imageL, y*imageA, image) -- star 04 dxDrawImage(x*star05, y*altura, x*imageL, y*imageA, image) -- star 05 dxDrawImage(x*star06, y*altura, x*imageL, y*imageA, image, 0,0,0, tocolor(0, 0, 0, 150)) -- star 06 --fundo elseif wanted == 6 then dxDrawImage(x*star01, y*altura, x*imageL, y*imageA, image) -- star 01 dxDrawImage(x*star02, y*altura, x*imageL, y*imageA, image) -- star 02 dxDrawImage(x*star03, y*altura, x*imageL, y*imageA, image) -- star 03 dxDrawImage(x*star04, y*altura, x*imageL, y*imageA, image) -- star 04 dxDrawImage(x*star05, y*altura, x*imageL, y*imageA, image) -- star 05 dxDrawImage(x*star06, y*altura, x*imageL, y*imageA, image) -- star 06 end end Também corrigi a indentação e algumas condições.
-
Tamo junto mano. Qualquer coisa estamos aqui pra ajudar.
-
SetDevelopmentMode Depois de ativar isso, use /showcol Espero ter ajudado.
- 2 replies
-
- 2
-
-
- col
- col visible
-
(and 1 more)
Tagged with:
-
Tem isso no sistema de prisão. O jogador quando está procurado, depois que o policial bate nele com o cassetete, começa a seguir o policial e entra na viatura junto com o policial. O nome do resource é cadeiadp. Só vc copiar de lá e fazer as adaptações.
- 1 reply
-
- 2
-
-
-
veh = {} vehQuebrado = {} variasACL = {"CV", "PCC", "AQD"} -- Pode colocar quantas quiser. function inicio (hitElement) -- Função do primeiro marker if getElementType (hitElement) == "player" and not getPedOccupiedVehicle (hitElement) then local accName = getAccountName (getPlayerAccount(hitElement)) local permission = false for i, acl in ipairs (variasACL) do if isObjectInACLGroup ("user."..accName, aclGetGroup (acl)) then permission = true break end end if permission then if veh[hitElement] and isElement (veh[hitElement]) then destroyElement (veh[hitElement]) veh[hitElement] = nil end if vehQuebrado[hitElement] and isElement (vehQuebrado[hitElement]) then destroyElement (vehQuebrado[hitElement]) vehQuebrado[hitElement] = nil end x, y, z = getElementPosition (hitElement) Trabalho = true FBlip = createBlipAttachedTo (FMarker, 19) -- Bandeira veh[hitElement] = createVehicle (578, 2533.0673828125, -1465.904296875, 23.977584838867, 0, 0, 270) -- Caminhão warpPedIntoVehicle (hitElement, veh[hitElement]) -- Transporta o jogador para dentro do caminhão vehQuebrado[hitElement] = createVehicle (411, 2533.0673828125, -1465.904296875, 23.977584838867, 0, 0,270) -- Caminhonete attachElements (vehQuebrado[hitElement], veh[hitElement], 0, -2, 0.7) setElementVisibleTo (FMarker, hitElement, true) outputChatBox ("#00ccff[Emprego] #ffffffBem-Vindo ao emprego #00ccff[Reboque]", hitElement, 255, 255, 255, true) setElementFrozen( vehQuebrado[hitElement], true ) else outputChatBox ("[#ff0000AVISO#00ccff] #ff0000Gangues não pode trabalha!!!", hitElement, 0, 204, 255, true) end end end addEventHandler ("onMarkerHit", PMarker, inicio) Espero ter ajudado.
-
Tente assim: mCarregamento = createMarker(-2253.13, 2387.62, 3.95, "cylinder", 2, 255, 0, 0, 255, getRootElement()) balsa = createVehicle (454, -2224.43, 2432.65, 2.14, 0, 0, 45) obj1 = {} mObjeto = {} bObjeto = {} mEntrega = {} bEntrega = {} function criarObjeto (thePlayer) if getPedOccupiedVehicle(thePlayer) then return end if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then if not getElementData (thePlayer, "criar.objeto") or getElementData (thePlayer, "criar.objeto") ~= 1 then if source == mCarregamento then setElementData (thePlayer, "criar.objeto", 1) obj1[thePlayer] = createObject(964, -2260.14, 2382.28, 3.90, 0, 0, 0, true) setObjectScale (obj1, 0.5) ox, oy, oz = getElementPosition(obj1) mObjeto[thePlayer] = createMarker (ox, oy, oz, "cylinder", 2.5, 255, 0, 0, 0, thePlayer) bObjeto[thePlayer] = createBlipAttachedTo (mObjeto, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer) setElementData (mObjeto[thePlayer], "owner", thePlayer) -- SETA O PLAYER COMO DONO DAQUELE MARKER, assim só funciona pra esse player. end end end end addEventHandler ("onMarkerHit", mCarregamento, criarObjeto) function carregarObjeto (thePlayer) if getElementData (source, "owner") then -- Se o marker tem um dono, então: if getElementData (source, "owner") ~= thePlayer then return end -- Se o elemento que colidiu no marker não for o player dono dele, nada acontece. if getPedOccupiedVehicle (thePlayer) then return end if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then if not getElementData(thePlayer, "carregando.objeto") or getElementData(thePlayer, "carregando.objeto") ~= 1 then if source == mObjeto[thePlayer] then destroyElement (bObjeto[thePlayer]) setElementData (thePlayer, "carregando.objeto", 1) setPedAnimation (thePlayer, "CARRY", "liftup", 1.0, false) setTimer(function() setElementData (thePlayer, "caixa.armas", 1) setPedAnimation (thePlayer, nil) setPedAnimation (thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true) attachElements (obj1, thePlayer, 0, 0.5, 0.3) toggleControl (thePlayer, "jump", false) toggleControl (thePlayer, "fire", false) toggleControl (thePlayer, "sprint", false) toggleControl (thePlayer, "crouch", false) toggleControl (thePlayer, "enter_exit", false) destroyElement (mObjeto[thePlayer]) mEntrega[thePlayer] = createMarker(-2230.40, 2438.80, 1.49, "cylinder", 2, 255, 0, 0, 255, thePlayer) setElementData (mEntrega[thePlayer], "owner", thePlayer) bEntrega[thePlayer] = createBlipAttachedTo(mEntrega, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer) end, 1000, 1) end end end end end addEventHandler ("onMarkerHit", getRootElement(), carregarObjeto) function entregarObjeto(thePlayer) if getElementData (source, "owner") then -- Se o marker tem um dono, então: if getElementData (source, "owner") ~= thePlayer then return end -- Se o elemento que colidiu no marker não for o player dono dele, nada acontece. if getPedOccupiedVehicle (thePlayer) then return end if thePlayer and isElement (thePlayer) and getElementType (thePlayer) == "player" then if getElementData (thePlayer, "caixa.armas") and getElementData (thePlayer, "caixa.armas") ~= 0 then if source == mEntrega[thePlayer] then setPedAnimation (thePlayer, "CARRY", "liftup", 1.0, false) setTimer (function () setPedAnimation (thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true) toggleControl (thePlayer, "jump", true) toggleControl (thePlayer, "fire", true) toggleControl (thePlayer, "sprint", true) toggleControl (thePlayer, "crouch", true) toggleControl (thePlayer, "enter_exit", true) destroyElement (mEntrega[thePlayer]) destroyElement (bEntrega[thePlayer]) print("01") end, 1000, 1) attachElements (obj1[thePlayer], balsa, 0, 0, 0.3) setElementData (thePlayer, "caixa.armas", 0) setElementData (thePlayer, "criar.objeto", 0) setElementData (thePlayer, "carregando.objeto", 0) end end end end end addEventHandler ("onMarkerHit", getRootElement(), entregarObjeto) Não testei. Mas deve funcionar.
-
Não. O MTA só é compatível com SQLite ou com MySQL.
-
Essas patentes são colocadas por ACL Group, né? São várias facções diferentes ou só uma?
- 1 reply
-
- scoreboard
- nivel
-
(and 2 more)
Tagged with:
-
Cara, isso é programação. Se você já souber Lógica de Programação, então basta estudar a Wiki do MTA. Caso contrário, estude Lógica de Programação e Algoritmos antes de tentar programar algo.
-
Pra desativar o HUD e Radar originais, use setPlayerHudComponentVisible.
-
[AJUDA] Ponto de Spawn de acordo com a localização
Lord Henry replied to dener189's topic in Programação em Lua
Você disse que já sabe que é preciso usar a função getDistanceBetweenPoints3D. Isso já é um excelente começo. Usando ela e um FOR para verificar a distância entre cada ponto, você consegue determinar qual deles tem a menor distância e fazer o jogador nascer lá. A lógica funciona assim: Você tem uma variável local que será 9999 e outra variável que será o ID da menor posição possível. A primeira variável irá guardar a distância do primeiro elemento ao passar pelo FOR, a segunda irá guardar o ID 1, depois no segundo elemento, se a distância dele for menor do que a distância guardada nessa variável, então atualiza a variável com essa distância e a segunda variável passa a ser o ID 2, e vai fazendo isso com todos os demais itens dessa lista de posições. Ao final desse FOR, a primeira variável estará com a menor distância entre todos os elementos e a segunda variável estará com o ID da menor distância entre eles. Dai é só vc fazer o player nascer na posição desse ID. (Sei que ficou difícil de entender, quando eu chegar em casa eu faço um exemplo com comentários pra ficar fácil de entender) -
Sempre tive esse mesmo problema, hauahuahaua. Meus resources funcionam perfeitamente em server local, mas dai quando eu coloco em server público, entope de erros e bugs. -------------- Quanto ao seu primeiro problema, sugiro que crie os markers client-side e dai verifique se o hitElement == localPlayer. Caso não queira fazer isso, então sete uma data no marker identificando o jogador que criou aquele marker como "dono" usando setElementData no marker, então crie uma condição que verifica se o hitElement == getElementData do marker. O primeiro jeito tem melhor desempenho, mas você precisa tomar cuidado ao fazer o triggerClientEvent e depois o triggerServerEvent ao colidir naquele marker. Quanto ao seu segundo problema, primeiro resolva o problema anterior antes de pensar em implementar ele. Mas já vou logo adiantando que você precisará criar uma table com todas as posições de caixas, por exemplo assim: boxPositions = { [1] = {-1200.62, 522, 10}, -- Coordenadas x, y, z. [2] = {-1222.22, 530, 10}, [3] = {-1224, 515, 10}, }
-
[AJUDA] Ponto de Spawn de acordo com a localização
Lord Henry replied to dener189's topic in Programação em Lua
Não entendi direito o que você quer. Você quer que o jogador nasça num hospital mais próximo depois de morrer? Em vez de nascer num ponto aleatório.