Leaderboard


Popular Content

Showing content with the highest reputation on 26/02/20 in all areas

  1. 2 points
    Bom é assim, se formos traduzir o erro seria algo neste sentido: Esperado ped/player no argumento 1, recebeu valor nil (nil é um valor inexistente) Isto ocorreu porque você não declarou o parâmetro da sua função. Se você observar na wiki o evento (addCommandHandler), vai ver que em um trecho ele fala sobre playerSource e argumentos. Mais precisamente isto aqui que estou me referindo: http://prntscr.com/r7neut Para todas as funções no MTA, existe um SOURCE. Source é o nativo daquela função, é o objeto/player/marker em que a função tem como base. Podemos acionar este source simplesmente digitando source, Exemplo Prático: local px, py, pz = getElementPosition(source) -- pegamos a posição do parâmetro nativo da função(source) warpPedIntoVehicle(source, VehCar) -- forçamos o player no veículo usando um parâmetro nativo da função(source) e uma variavel (VehCar) Obs: o SOURCE do addCommandHandler é o player que digitou o comando. -- Olhando para o seu script nós temos na linha 1 function -- function Indicamos que estamos iniciando uma função que ira executar algo SpawnMoto -- o nome desta função () -- e os parâmetros, ou seja a quem ela seja direcionada. Podemos perceber aqui que não existe nenhum parâmetro! Se não existe nenhum parâmetro DECLARADO, se formos olhar para a linha 4 player não existe, pois ele não foi declarado em nenhum momento. Obs: Não necessariamente você precisa escrever "player", eu posso colocar "ciranda_cirandinha" no lugar de "player" que irá funcionar normalmente. -- Na linha dois tem um outro erro: local px, py, pz = -- 3 váriaveis getElementPosition -- a função (getLocalPlayer()) -- o argumento Nós temos dois lados, o lado cliente e o lado servidor. Lado servidor é o que será executado na host, e o lado cliente é o executado no pc do player. Se você pesquisar por getLocalPlayer() na wiki você vai ver isto: http://prntscr.com/r7npad. Client-Side Only, ou seja somente lado cliente isto você pode identificar no meta.xml temos <script src="nomeDoArquivo" type="client"/> ou <script src="nomeDoArquivo" type="server"/> o type diz quais funções você pode usar naquele arquivo... Obs: temos também funções do tipo shared que funcionam tanto nos arquivos de lado client, quanto nos arquivos de lado server. Ex: http://prntscr.com/r7nr9j -- Basicamente é isso maninho esses foram os erros em seu script, use o código que o #Roots mandou e pesquise sobre "tabelas", é algo que vai ser muito essencial para você desenvolver seus próximos códigos :).
  2. 1 point
    Eai pessoal tudo bom? Eu percebi que muitas das duvidas que o pessoal posta aqui no fórum e também na comunidade, são duvidas muito simples, principalmente com erros de logica, ou mau uso dos recursos da linguagem. Então decidi desenvolver um curso básico para auxiliar quem está começando, nesse curso básico vou abordar os seguintes assuntos: Lógica de Programação & Algoritmo; Condicionais & Variáveis (Básico); Sintaxe & Indentação; Boas Praticas de Programação; Como usar a Wiki; Funções(); Tabelas (Arrays); Scripts voltado ao MTA; Exercícios. Antes que venham falar "Quem é você para fazer um curso?", vou me apresentar: Eu me chamo Marcelo, trabalho com programação a cerca de 7 anos, já trabalhei com desenvolvimento, back-end e front-end. Atualmente eu trabalho na área de SI (Segurança da Informação) prestando serviço como pentester e consultor a uma empresa. Comecei a me envolver com Lua, por que joguei MTA por muito tempo, e percebi que a maioria dos servidores não atendia as minhas expectativas, então junto com um amigo, decidimos criar um novo servidor, o New Dream's Roleplay. Mas como o assunto aqui é o Tutorial, vou me ater apenas a ele, e deixo para falar do servidor outra hora. Lógica de Programação & Algoritmo Para deixar bem claro, vou usar as minhas definições das palavras durante o curso, porque acredito ser mais didática dessa forma. Antes de mais nada vamos deixar bem claro algumas coisas: Programação é lógica, a linguagem e etc, são apenas ferramentas para organizar e dar sentido a essa lógica. Portanto se você dominar a lógica de programação, poderá aplicar ela a qualquer linguagem. Tendo isso em mente, a aplicação da lógica podemos chamar de algoritmo. O Algoritmo por sua vez é uma sequencia de instruções, para a execução de uma tarefa. Claro que levando em consideração que o algoritmo conta com verificações, iterações e etc. Pois bem eu acredito que lógica só se aprenda fazendo, então vamos com alguns exemplos: Para facilitar a vida de alguns de vocês na compreensão, vou utilizar o Portugol como "linguagem" nesses exemplos, e recomendo que usem também nos exercícios. Para acessar o Portugol utilizem o link: http://lite.acad.univali.br/portugol/. Vamos começar pelo código mais repetido do mundo o "Olá Mundo" algoritmo OlaMundo; -- Aqui nos definimos o nome do Algoritmo inicio -- Aqui damos inicio ao mesmo imprima("Olá, Mundo!"); -- Aqui solicitamos que o Computador imprima a frase "Olá, Mundo!" fim -- Aqui encerramos Como podem reparar, toda a formação obedece uma lógica simples, você define, inicia, executa e encerra. Para termos um exemplo mais lúdico, vou usar linguagem padrão e descrever a seguinte situação: Acordar e sair para o trabalho. 01. Abrir os olhos; 02. Olhar o relógio; 03. Levantar da cama; 04. Ir ao banheiro; 05. Sair do quarto, e ir a cozinha; 06. Preparar o café da manha; 07. Sentar a mesa; 08. Comer o café da manha; 09. Lavar a louça do café da manha; 10. voltar ao quarto; 11. Vestir a roupa 12. Sair do Apartamento; 13. Descer o elevador; 14. Entrar no carro; 15. Ir ao trabalho. O exemplo acima é um algoritmo em linguagem padrão, quero que vocês percebam como ele utiliza uma sequencia lógica para executar uma tarefa. Agora, mais a frente iremos ver condicionais e verificações, mas já quero apresentar uma introdução sobre a mesma, nesse exemplo a cima, vamos adicionar uma verificação básica ali em cima na linha 02 01. Abrir os olhos; 02. Olhar o relógio CASO o relógio marque = 6:30 ENTÂO Faça a linha 03. CASO CONTRARIO espere até dar 06:30; 03. Levantar da cama; ... Nesse exemplo colocamos uma verificação simples, caso o horário seja o qual nos queremos, então vamos continuar com o algoritmo, isso é uma condição verdadeira ou falsa, e uma condição única, poderíamos adicionar outra condições por exemplo: 01. Abrir os olhos; 02. Olhar o relógio CASO o relógio marque = 6:30 && NÂO SEJA sabado OU domingo ENTÂO Faça a linha 03; 03. Levantar da cama; ... Aqui estamos adicionando outra verificação, e ambas precisam ser verdadeiras para que a sequencia se complete. Com esses exemplos em mente, vou deixar alguns exercícios para vocês, podem fazer tanto em linguagem padrão como em portugol (recomendo mais o portugol). 1. Acordar e ir ao trabalho; 2. Lavar o carro; 3. Um robô que pegue caixas; 4. Planejar uma viagem; 5. Jogar um jogo. Caso queiram, podem postar o código nesse tópico, e caso tenham alguma duvida, deixem logo a baixo. Só lembrando ao pessoal que já entende do assunto, ou pelo menos sabe o básico, vamos ajudar quem ta começando, todo mundo começou sem saber quase nada. Parte 02:
  3. 1 point
    Olá, vocês mais experientes, poderiam me dizer como normalmente estruturam seus projetos de MTA? Sou novo na comunidade e gostaria de saber um pouco sobre boas práticas. Qualquer dica para um iniciante sobre esse assunto assim ou próximo disso será muito bem vinda ❤️
  4. 1 point
    Post Anterior: Eai pessoal tudo bom? Continuando o Curso básico, hoje vamos falar sobre Condicionais, Iteração e Variáveis: Para vocês irem se familiarizando eu vou começar a utilizar trechos de código em Lua. Nos exemplos anteriores além de utilizamos apenas linguagem padrão, e portugol, nos utilizamos apenas execuções sequenciais, ou seja, o algoritmo poderia apenas executar uma vez, e em uma sequencia, da linha 01 até a última, mesmo com o exemplo básico de verificação que nos fizemos, ainda sim, era uma execução sequencial. Para mudar isso, vou apresentar a vocês os principais condicionais e como utilizar o mesmo, e uma breve explicação sobre variáveis. Vamos começar pelas variáveis que são mais simples em grande parte. Diferente de outras linguagem as variáveis de Lua não são de tipo fixo, elas podem receber qualquer tipo de valor, as mesmo assim, elas respeitam a logica de combinação como por exemplo: local nome = "Dev" -- Atribuímos a um espaço de memoria o valor "Dev" e nomeamos esse espaço como "nome". local numero = 1 -- Atribuímos a um espaço de memoria o valor "1" e nomeamos esse espaço como "numero". Se fossemos utilizar outra linguagem, como C por exemplo, nos teríamos que definir o tipo de variavel, por exemplo: char nome = "dev"; int numero = 1; Em C no caso nós devemos nos prender a sintaxe padrão, e a utilização dos tipos: Sintaxe: <tipo> <nome_da_variável> ; int: armazena valores numéricos inteiros. char: armazena caracteres. float: armazena números com ponto flutuante (reais) com precisão simples. double: armazena números com ponto flutuante, com precisão dupla, ou seja normalmente possui o dobro da capacidade de uma variável do tipo float. E os principais tipos de dados seriam: Inteiro: armazena números inteiros Real: armazena números com casas decimais, são as variáveis de ponto flutuante; No caso de Lua essa lógica ainda existe. E ainda podemos armazenar dados do tipo Boolean (true/false) & nil. Como vocês puderam perceber as variáveis em Lua, funcionam de uma maneira muito pratica, porque você simples insere o valor nela, e automaticamente, ela entende o tipo e organiza a memoria dessa forma. Tendo isso em mente, vamos a algum exemplos básicos. Iguais combinam com iguais. Isso significa que se eu puxar a minha variável dev e a variável numero, e tentar unir as duas vai retornar um erro, pelo fato do tipo das duas serem diferentes. Imagem ilustratva: https://imgur.com/a/n0u9pL5 Para executar o print(dev + numero), teríamos que modificar o valor de numero para uma string. Com a utilização de tostring(numero); Para mudar o tipo de inteiro para string. Prestem atenção nisso, porque um numero pode ser um string por exemplo local numero = "1"; no caso esse 1 seria uma string e não um numero, oque impossibilitaria operações matemáticas com o mesmo. Nesse caso também poderia usar o tonumber(numero); para mudar o tipo. Caso tenham duvida sobre o valor de uma variável podem utilizar type(var); para saber qual tipo ela seria, por exemplo: local num = 1; --> Number/Integer local nam = "2"; --> String local status = false --> Boolean Caso desse um print(type(var)); e cada uma dessas receberia os valores citados acima. Caso você tente utilizar em uma var que não foi atribuída ira retornar o valor nil que significa que não há nada ali, não tem memoria atribuída nem valor a essa var. Condicionais Iniciando em condicionais vamos começar pela mais usada e básica de todas o if. O if funciona da seguinte maneira: if expressão_lógica then -- bloco de comandos end **Lembrando, o IF deve sempre ser fechado com o END, não se esqueçam disso.** Se ficar mais facil pode-se ler if como SE, então ficaria da seguinte forma SE expressão_lógica ENTÂO. Agora oque seria essa expressão lógica? Essa é a verificação que deve ser executada antes de se dar continuidade ao código, no nosso exemplo em linguagem padrão nos utilizamos o SE o relógio marcar = 6:30 ENTÂO, no caso a expressão_lógica será relógio marcar = 6:30 que só poderia retornar true ou false, no caso de uma verificação o valor true é sempre tido como condição principal a não ser que você exemplifique o contrario por exemplo: local nome = "dev"; if nome then -- código end A verificação aqui é simples, SE existir nome ENTÂO. Porque a condição é true, agora eu poderia usar: local nome = "dev"; if not nome then -- código end A verificação aqui é ao contrario da anterior, no estamos utilização a condição not como negação a existência da var então ficaria SE NÂO existir nome ENTÂO. Para vocês terem uma ideia melhor das expressão_lógicas vamos listar cada uma delas: Igual a | == | -- Verifica se os valores são iguais. Diferente de | ~= | -- Verifica se os valores são diferentes. Maior que | > | -- Verifica se o 1 valor é maior que o 2. Menor que | < | -- Verifica se o 1 valor é menor que o 2. Maior ou igual a | >= | -- Verifica se o 1 valor é maior OU igual ao 2. Menor ou igual a | <= | -- Verifica se o 1 valor é menor OU igual ao 2. As principais são true e false, exemplos: local x = 10; local y = 50; if x == y then -- Aqui estamos verificando se X é igual a Y, oque obviamente é uma mentira então o retorno será false, e o código abaixo não será executado. if x > y then -- Aqui também estamos em uma verificação False, portanto o código não ira executar, porem se usarmos not if not x > y then -- Aqui no caso o retorno é verdadeiro, então o código abaixo ira executar. Outro tipo de condição que nos podemos usar são os de concatenação: Conjunção | and | -- Verifica se duas ou mais condições são atendidas. Disjunção | or | -- Verifica se uma ou qualquer outra condição é atendida. Negação | not | -- Verifica se alguma condição não é atendida. Alguns exemplos: local x = 10; local y = 50; local nome = "dev"; local status = true; if nome == "dev" and status == true then -- Aqui verificamos se a var nome possui o valor "dev", e se a var status possui true, caso ambas sejam atendidas, o código executa. if status == false or x < y then -- Aqui estamos verificando se alguma das condições são verdadeiras, no caso o x é < que o y então o código executa. if not status == true or x > y or type(nome) == string then -- Aqui estamos passando mais de uma verificação com o OR e caso alguma delas seja verdadeira o código ira executar. Com essa regras básica em mente, eu sugiro que vocês, façam códigos simples utilizando esses conceitos para gravarem eles melhor. Continuando a falar sobre o if. O if ainda possui uma condição negativa por padrão que é chamada de else, da seguinte forma: if expressão_lógica then -- Bloco de comandos else -- Bloco de comandos end Dessa vez no fazemos uma verificação e caso ela não seja atendida nos executando outro bloco de código por exemplo: local x = 10; local y = 50; if x > y then print('X é maior que Y') else print('X é menor que Y') end Nesse caso nossa verificação não ira retornar true porque x não é maior que y, então o bloco 1 do código não será executado, porem com o else, o bloco dois será. Ainda no IF no temos o elseif que é uma segunda condicional dentro da primeira por exemplo: local x = 10; local y = 50; if x > y then print('X é maior que Y') else print('X é menor que Y') end Nesse caso nossa verificação não ira retornar true porque x não é maior que y, então o bloco 1 do código não será executado, porem com o else, o bloco dois será. Ainda no IF no temos o elseif que é uma segunda condicional dentro da primeira por exemplo: local x == 10; local y == 50; if x > y then -- bloco 1 elseif x < y then -- bloco 2 else -- bloco 3 end Nesse caso a primeira verificação é falsa, então a sequencia continua, a segunda verificação retorna true e então é executada, caso nenhuma das duas seja true, seria executado o bloco 3 do else. ** Lembrando o elseif sempre vem ante do else, e não tem limite de uso, apesar de não ser uma boa pratica de programação, enfiar um monte de if/elseif no código.** Iterações As iterações são estruturas de repetição, elas são o for / while e repeat. Vamos começar pelo while e repeat que são bem semelhantes: a sintaxe do while consiste em: while condição do -- código end Seguindo essa lógica a condição de entrada em um loop de while é definida antes do inicio. Para ficar mais simples pode-se ler while como: ENQUANTO condição FAÇA -- código FIM Vamos ao exemplo: local x = 1; local y = 10; while x < y do x = x + 1 end Nesse caso estamos executando um loop, da seguinte forma: ENQUANTO x for menor que Y FAÇA PEGUE x e Adicione X + 1 FIM Caso a gente desse um print(x) nesse caso a saida seria: 1 2 3 ... Até o 10. Ou seja o while significa **repita tal ação até que a condição seja verdadeira.** o repeat funciona semelhante ao while porem a condição de saida/verificação é posta no final, com a seguinte sintaxe: repeat -- bloco de código until(condição) Vamos usar o mesmo exemplo acima: local x = 1; local y = 10; repeat print(x) x = x + 1 until(x == y) O for pode ser ler PARA valor, max/min incremento FAÇA, a diferença do for para o while/repeat é que o for você tem um numero máximo e mínimo de execuções, que deve ser definidas no inicio da condicional por exemplo: for i=1, 10, 1 do print(i) end Aqui vamos ir do 1 ao 10 somando sempre 1 ao numero anterior, com uma saída de 1,2,3,4,5..10. Poderíamos utilizar 2, 3, -1 e qual numero quiséssemos no acréscimo Dentro de variáveis ainda temos os Arrays (tabelas), mas vou deixar para explicar depois de funções, já que tabelas em luas são bem extensas e com muitas funcionalidades. Exercícios 1. Faça um programa que verifique as medias dos alunos, em 2 cursos, e retorne aprovado ou reprovado baseado em média geral superior a 5. 2. Faça um programa que se repete até uma condição numérica retorne verdadeira, condição essa superior a 10. 3. Faça um programa que imprima na tela, tipos de variáveis utilizando um for. 4. Faça um programa que muda o tipo de variáveis e imprima elas. 5. Faça um programa que leia oque o usuário digitou e retorne na tela. Site que podem ser Uteis: https://www.Lua.org/portugues.html https://www.tutorialspoint.com/Lua/index.htm Caso queiram, podem postar o código nesse tópico, e caso tenham alguma duvida, deixem logo a baixo. Só lembrando ao pessoal que já entende do assunto, ou pelo menos sabe o básico, vamos ajudar quem ta começando, todo mundo começou sem saber quase nada. Parte 03:
  5. 1 point
    Poste a database... Você quer que nós adivinhemos códigos?
  6. 1 point
    Options: A. use the command: /refreshall B. Empty your client cache MTA San Andreas X\mods\deathmatch\resources Source:
  7. 1 point
    hmm, it is kind of a strange error. Since freeroam doesn't request the files from the path /data/ rows={xml='stats.xml', attrs={'name', 'id'}}, File fr_client.Lua. Line 461 This error is showing when starting freeroam or always?
  8. 1 point
  9. 1 point
    Those files are located in: \[gameplay]\freeroam Try to unzip the resource (and delete the zip)
  10. 1 point
    @MesaDowN O state é um parâmetro do evento onClientClick (no caso o segundo parâmetro). o state ele verifica se o player Pressionou o botão ("down") ou se ele solto o botão ("up").
  11. 1 point
    Isso ocorre pois vc não declarou player em lugar nenhum. Então vc está basicamente tentando teleportar nulo para dentro do veículo. Tenha em mente que veículos criados client-side servem apenas como decoração. Eles não funcionam. (Leia na Wiki do createVehicle) Ou seja, daria erro mesmo se vc usasse localPlayer ali no warp. A solução do problema é simples, mas vai resultar em problemas posteriormente, tornando a solução no fim das contas um pouco complexa. 1) Passe o script para o server-side. (Mude o lado dele no meta.xml) 2) Adicione o parâmetro de função thePlayer, exigido pelo addCommandHandler no server-side. 3) Use thePlayer em vez de localPlayer. Vai ficar assim o script: function SpawnMoto (thePlayer) local px, py, pz = getElementPosition (thePlayer) local VehCar = createVehicle (522, px, py, pz+2) warpPedIntoVehicle (thePlayer, VehCar) end addCommandHandler ("moto", SpawnMoto) Isso resolve seu problema de erros no debug. Mas logo vc vai perceber que o jogador pode ficar criando infinitos veículos. O que vc precisa fazer é deletar o veículo criado anteriormente antes de criar um novo. Mas vc não pode simplesmente dar destroyElement no VehCar. Primeiramente pois ele não existe fora do escopo daquela função, por estar numa variável local. E se você torná-la global, irá influenciar nos veículos criados por outros jogadores, uma vez que VehCar será o veículo criado pela última vez e não o necessariamente o veículo criado por você. Para corrigir isso, devemos identificar quais veículos pertencem a cada jogador para que assim possamos verificar se este jogador já tem um veículo criado antes ou não. Façamos isso por meio de uma table que será indexada com os jogadores. 1) Crie uma table vazia. 2) Na função SpawnMoto, verifique se já existe um item na tabela com o thePlayer como índice. 3) Condição: Se já existir um item com thePlayer como índice, destrói esse item e anula sua variável. 4) Substitua os VehCar por motos[thePlayer] e deixe como sendo global e não como local. O código vai ficar assim: motos = {} function SpawnMoto (thePlayer) local px, py, pz = getElementPosition (thePlayer) if (isElement (motos[thePlayer])) then destroyElement (motos[thePlayer]) motos[thePlayer] = nil end motos[thePlayer] = createVehicle (522, px, py, pz+2) warpPedIntoVehicle (thePlayer, motos[thePlayer]) end addCommandHandler ("moto", SpawnMoto) Isso fará com que os jogadores só possam criar 1 moto por vez. Ao usar o comando novamente, ele vai destruir a moto criada anteriormente e criar a nova no lugar. Ainda tem a questão de segurança, você vai precisar destruir a moto e anular sua variável caso o jogador desconecte do servidor, pois ao voltar, ele será outro elemento e sua moto permanecerá no mapa. Mas dai essa parte é com você. Obs: Postagem feita via mobile.
  12. 1 point
    and haven't you modified these files?
  13. 1 point
    https://wiki.multitheftauto.com/index.php?title=Meta.xml Add line to meta in freeroam: <min_mta_version server="1.5.6-9.16362" client="1.5.6-9.16362" /> And, run the upgrade command in console:
  14. 1 point
    @anlaltnay Download the latest freeroam resource from: (after downloading, located in [gameplay]) https://github.com/multitheftauto/mtasa-resources
  15. 1 point
    Maybe because of: Serverside commands can only be executed by the server. The same applies to the client side This is how you kill your server network. local players = getElementsWithinRange(x, y, z, 50, "player") for i,player in ipairs(players) do triggerClientEvent(player, "chat:box", root, thePlayer, set, first) end You trigger this event separately per player. Very bad solution. You know you can use table of players instead as first argument? Which is players in your case. Also using ipairs is bad, since this is worst type of loop. I'm kinda repeating myself - https://forum.mtasa.com/topic/121808-doubts-if-you-can-improve-performance/
  16. 1 point
    @+snts Bom a não ser que você queira mostrar alguma imagem/texto na tela do player é totalmente desnecessário a conexão entre server e client. Esse script em especifico pode ser somente server-side sem problemas, inclusive é o que eu recomendo. No caso o certo a se fazer seria você declarar o parâmetro e passar ele, só isto acho que já resolveria os erros function SpawnMoto (jogador) local x,y,z = getElementPosition(jogador) No caso do script do #Roots seria algo assim: local veh = {} function SpawnMoto (jogador) if veh[jogador] and isElement( veh[jogador] ) then destroyElement( veh[jogador] ) veh[jogador] = nil end local x,y,z = getElementPosition(jogador) veh[jogador] = createVehicle(522, x,y,z) warpPedIntoVehicle (jogador, veh[jogador]) end addCommandHandler("moto", SpawnMoto) Seria legal você já pensar em usar os outros parâmetros tipo: local veh = {} function SpawnMoto (jogador, comando, id) if veh[jogador] and isElement( veh[jogador] ) then destroyElement( veh[jogador] ) veh[jogador] = nil end local x,y,z = getElementPosition(jogador) veh[jogador] = createVehicle(tonumber(id),x,y,z) warpPedIntoVehicle (jogador, veh[jogador]) end addCommandHandler("moto", SpawnMoto) 3 parâmetros o ultimo(id) seria o id do veiculo! Então vc iria digitar tipo /moto 522 ai apareceria a NRG, ou se vc digitasse /moto 462 aparecia outro veiculo e assim por diante... Teste e nos de um retorno se esta funcionando ou não.
  17. 1 point
    Tente isso veh = {} function SpawnMoto () if veh[source] and isElement( veh[source] ) then destroyElement( veh[source] ) veh[source] = nil end local x,y,z = getElementPosition(source) veh[source] = createVehicle(522, x,y,z) warpPedIntoVehicle (source,veh[source]) end addCommandHandler("moto", SpawnMoto)
  18. 1 point
    Foi vazado já há um tempo. Não tenho mais contato com os verdadeiros autores.. Mais pertence a GameMode da unitgames. "Alex Cardin" "Zolo" e "Ian Mesquita" se preferir entre em contato com eles para fazer a comparação. TerraGames também tem um sistema de IDs que foi vazado. Pertencente ao Emanuel Se não quiser. Desconsidere. pois minha palavra não resolve não é mesmo? Eu que sempre contribui com a comunidade mtabr. lamentável isso..
  19. 1 point
    @redditing That is because the event already exists and you are not removing it when you leave the marker Use https://wiki.multitheftauto.com/wiki/OnMarkerLeave https://wiki.multitheftauto.com/wiki/RemoveEventHandler
  20. 1 point
    I'm having an issue on my MTA where I get FPS drops during gameplay. I've got a pretty good gaming PC and I can't seem to fix this issue. My MTA Diag: https://pastebin.mtasa.com/173675973 any help is appreciated, thanks.
  21. 1 point
    This tutorial is not for beginners. This code will successfully find the player scaling factor, to convert the 3D world units to 2D pixels on your monitor. The factor 0.622388530006 is probably a standard, but you never know. Image1 Image2 Image3 Image4 The function that finds this factor. local screenX,screenY = guiGetScreenSize() local scaleFactorBuffer = nil function findScaleFactor () if scaleFactorBuffer then return scaleFactorBuffer else local startX,startY,startZ = getWorldFromScreenPosition ( 0,0, 1 ) local endX,endY,endZ = getWorldFromScreenPosition ( screenX,screenY, 1 ) if startX and endX then scaleFactorBuffer = 1/getDistanceBetweenPoints3D(startX,startY,startZ,endX,endY,endZ) return scaleFactorBuffer end end return false end The set up for the example below: -- the set up -- local imagePosX,imagePosY,imagePosZ = -21.38184, 5.24524, 3.10965 local imageResolution = 1000 ---------------- The example on how to use: addEventHandler("onClientRender",root, function () local scaleFactor = findScaleFactor () if scaleFactor then dxDrawText("scaleFactor: " .. scaleFactor,300,300) -- The scale factor is circa 0.622388530006 (units). local rectangleCenterX,rectangleCenterY = getScreenFromWorldPosition(imagePosX,imagePosY,imagePosZ) if rectangleCenterX and rectangleCenterY then local playerX,playerY,playerZ = getElementPosition(getCamera()) local size = (imageResolution*scaleFactor)/getDistanceBetweenPoints3D(playerX,playerY,playerZ,imagePosX,imagePosY,imagePosZ) dxDrawText("size: " .. size,300,320) dxDrawRectangle(rectangleCenterX+size/2,rectangleCenterY+size/2,size,size,tocolor(0,0,200)) end end end)