Popular Content

Showing content with the highest reputation since 27/01/20 in all areas

  1. 4 points
    Dear MTA community, I have been spending my last 8 weeks on mathematical problems. One of them is the 3D Frustum-Plane intersection that is used by GPUs to draw triangles onto your screen. If you want to learn more about this please consider reading this thread. Promotional Video: https://www.youtube.com/watch?v=RQy3Q4Xe110 Prerequisites This tutorial is aimed at people who are capable of scientific thinking and are willing to playfully learn with Lua code. To execute steps in this tutorial minimal knowledge of Linear Algebra and Lua is required. Required MTA Resource: https://github.com/quiret/mta_lua_3d_math Description of the math Imagine that we have got a frustum and a plane in a 3D room described by coordinates plus their boundaries. By intersecting both you obtain all coordinates on a screen along with their depth values. Now think about how your vision works. You see distant objects smaller than closer ones. You rotate your eyes to angles of vision. If we were to put this concept into terms of math we could say: the plane of vision is bigger in the distance than in close proximity. The frustum is a seamless row of vision planes starting from the pyramid tip to the bottom. How to use the MTA Resource Just download the GitHub repository into a folder of your MTA Resources, name it "math_3d_nonlin" and start it. You can execute the following commands for quick testing: send_bbuf: draws a simple depth test draw_model: draws the DFF file "gfriend.dff" Now we have got the basics out of the way. Time to start coding. Please create a new "_math_test.Lua" script file in the resource and include it server-side at the bottom of meta.xml. Tutorial: software rendering a plane on screen Open your _math_test.Lua and include the following code: local viewFrustum = createViewFrustum( createVector(0, 0, 0), -- position createVector(10, 0, 0), -- right createVector(0, 0, 10), -- up createVector(0, 20, 0) -- front ); local plane = createPlane( createVector(-3, 10, -3), createVector(6, 0, 0), createVector(0, 0, 6) ); local function task_draw_scene(thread) local bbuf = create_backbuffer(640, 480, 255, 255, 0, 50); local dbuf = createDepthBuffer(640, 480, 1); local time_start = getTickCount(); do local gotToDraw, numDrawn, numSkipped = draw_plane_on_bbuf(viewFrustum, bbuf, dbuf, plane, true); if ( gotToDraw ) then outputDebugString( "drawn " .. numDrawn .. " pixels (skipped " .. numSkipped .. ")" ); end end local time_end = getTickCount(); local ms_diff = ( time_end - time_start ); outputDebugString( "render time: " .. ms_diff .. "ms" ); taskUpdate( 1, "creating backbuffer color composition string" ); local bbuf_width_ushort = num_to_ushort_bytes( bbuf.width ); local bbuf_height_ushort = num_to_ushort_bytes( bbuf.height ); local pixels_str = table.concat(bbuf.items); local bbuf_string = pixels_str .. ( bbuf_width_ushort .. bbuf_height_ushort ); taskUpdate( false, "sending backbuffer to clients (render time: " .. ms_diff .. "ms)" ); local players = getElementsByType("player"); for m,n in ipairs(players) do triggerClientEvent(n, "onServerTransmitImage", root, bbuf_string); end outputDebugString("sent backbuffer to clients"); end addCommandHandler( "testdraw", function(player) spawnTask(task_draw_scene); end ); Result: Try executing the "testdraw" command. At the top of file you see the definition of our frustum cone as well as a plane. By calling the function "draw_plane_on_bbuf" we put color information into bbuf for exactly the pixels that make up the rectangle. If you change the plane definition to... local plane = createPlane( createVector(-2, 10, -4), createVector(6, 0, 3), createVector(-2, 0, 6) ); you instead get this image: Try changing around the coordinates of frustum and plane to obtain different pictures! Tutorial: software rendering a triangle on screen Take the same code as in the tutorial above but change line 19 to: local gotToDraw, numDrawn, numSkipped = draw_plane_on_bbuf(viewFrustum, bbuf, dbuf, plane, true, "tri"); This way we have changed the primitive type to triangle (rectangle is the default). Try executing the "testdraw" command again to inspect the new result! Tutorial: drawing a DFF file onto screen Instead of writing triangle definitions by hand we can take them from a DFF file instead. DFF files are storage of triangle and vertex information along with 3D rotation and translation information. By extacting the triangles from the DFF file we can put them into our algorithm to software-render them! Here is a related excerpt from math_server.Lua: local modelToDraw = false; do local modelFile = fileOpen("gfriend.dff"); if (modelFile) then modelToDraw = rwReadClump(modelFile); fileClose(modelFile); end end local function task_draw_model(thread) local bbuf = create_backbuffer(640, 480, 255, 255, 0, 50); local dbuf = createDepthBuffer(640, 480, 1); local time_start = getTickCount(); local num_triangles_drawn = 0; if (modelToDraw) then -- Setup the camera. local geom = modelToDraw.geomlist[1]; local mt = geom.morphTargets[1]; local centerSphere = mt.sphere; local camPos = viewFrustum.getPos(); camPos.setX(centerSphere.x); camPos.setY(centerSphere.y - 3.8); camPos.setZ(centerSphere.z); local camFront = viewFrustum.getFront(); camFront.setX(0); camFront.setY(5 + centerSphere.r * 2); camFront.setZ(0); local camRight = viewFrustum.getRight(); camRight.setX(centerSphere.r * 2); camRight.setY(0); camRight.getZ(0); local camUp = viewFrustum.getUp(); camUp.setX(0); camUp.setY(0); camUp.setZ(centerSphere.r * 2); local triPlane = createPlane( createVector(0, 0, 0), createVector(0, 0, 0), createVector(0, 0, 0) ); local vertices = modelToDraw.geomlist[1].morphTargets[1].vertices; local triangles = modelToDraw.geomlist[1].triangles; local tpos = triPlane.getPos(); local tu = triPlane.getU(); local tv = triPlane.getV(); for m,n in ipairs(triangles) do taskUpdate( m / #triangles, "drawing triangle #" .. m ); local vert1 = vertices[n.vertex1 + 1]; local vert2 = vertices[n.vertex2 + 1]; local vert3 = vertices[n.vertex3 + 1]; tpos.setX(vert1.x); tpos.setY(vert1.y); tpos.setZ(vert1.z); tu.setX(vert2.x - vert1.x); tu.setY(vert2.y - vert1.y); tu.setZ(vert2.z - vert1.z); tv.setX(vert3.x - vert1.x); tv.setY(vert3.y - vert1.y); tv.setZ(vert3.z - vert1.z); local gotToDraw, numDrawn, numSkipped = draw_plane_on_bbuf(viewFrustum, bbuf, dbuf, triPlane, false, "tri"); if (gotToDraw) and (numDrawn >= 1) then num_triangles_drawn = num_triangles_drawn + 1; end end end local time_end = getTickCount(); local ms_diff = ( time_end - time_start ); (...) end The code first loads a DFF file called "gfriend.dff" and stores it inside the "modelToDraw" variable. Once you execute the "draw_model" command the code looks up the first geometry in the DFF file and fetches all triangles associated with it. The rendering camera is set up to point at the middle of the model. Then all triangles are drawn one-by-one. https://twitter.com/rplgn/status/1230650912345067520 Try swapping the DFF file for another one, like biker.dff, and examine the results! Maybe extract a different DFF file from GTA:SA and replace gfriend.dff with that one. External references: math calculation on paper example: https://imgur.com/gallery/rLvln3X German thread on mta-sa.org: https://www.mta-sa.org/thread/38693-3d-frustum-ebene-schneidung-in-Lua/ Do you have any questions related to the math or the implementation? Do not shy away from asking! I want to provide you with as much insight as I can.
  2. 4 points
    Good news, everyone! I think some of you had already heard about my project Oblivion Lost: Online(or The Exclusion Zone now). Today I have decided to release all the things around this project. All the resources are published right now. Enjoy it because it was made with LOVE! Comes with batteries included! The link: https://github.com/tederis/theexzone
  3. 3 points
    السلام عليكم ورحمة الله وبركاته اليوم حابب اقولكم اني بفتح سيرفر وشغال علي السيرفر لي 3 شهور المهم قررت افتح السيرفر بكرا الساعة 7 بتوقيت مصر , والساعة 8 بتوقيت السعودية تنوروني كلكم ان شاء الله
  4. 3 points
    Post Anterior: Comentando o Código Antes de mais nada, boas praticas de programação, não são uma regra fixa que não pode mudar, mas sim, praticas (como o nome já diz), que facilitam o desenvolvimento, e o trabalho em equipe em um código. A principal boa pratica de programação é comentar o código, em Lua os comentários podem ser feitos da seguinte forma. Para comentar linhas únicas se utiliza ( "--" ) da seguinte forma. if condição then -- Comentário do IF. Para comentar em blocos se utiliza --[[ Bloco a ser comentado ]] Tentem manter ao máximo a pratica de comentar oque cada função faz, variáveis e etc, assim fica mais fácil para você se encontrar no código, e para quem estiver trabalhando junto com você no código. Desenvolvimento & Identação Sempre que forem programar tente manter em mente que seu código deve ser: 1. Simples - Deve ser de fácil compreensão; 2. Direto - Deve executar aquilo que é proposto, sem rodeios, e sem funções desnecessárias e sem utilidade; 3. Organizado - Deve seguir uma ordem de organização (mais a baixo vou exemplificar uma organização.) 4. Sem duplicidade - não faz o que outra parte do código já faz; 5. Elegante e Único - Seu código deve ser algo que você se orgulhe de ter feito, que seja elegante, e funcional e que principalmente seja seu. Um dos pilares para organização do código e para facilitar a visualização do mesmo, seria a utilização de uma boa identação, como por exemplo: Código sem identação: addEventHandler( "onPlayerWasted", getRootElement( ),function() setTimer( spawnPlayer, 2000, 1, source, 0, 0, 3 ) end) Mesmo ainda sendo legível o exemplo básico de código logo acima, se ele for identado fica melhor a compreensão do mesmo. Código Identado: addEventHandler( "onPlayerWasted", getRootElement( ), function() setTimer( spawnPlayer, 2000, 1, source, 0, 0, 3 ) end) Pode parecer algo besta, só alguns tabs para organização, mas em um código com mais de 300 linhas, isso faz muita diferença. **Só para lembrar, Lua não necessariamente precisa de identação já que tem then/do e etc, mesmo assim é uma boa pratica.** Nome de Variáveis e Outras boas Praticas Outra boa pratica de programação é a forma como se nomeia as variáveis e funções, não há uma regra definidas mas existem padrões em outras linguagens para facilitar a leitura, por exemplo: Variáveis se escrevem com nome_nome = valor Funções se escrevem com nome_nome() Eu recomendo que nomeiem as funções dessa forma ou nomeNome = valor; nomeNome(); Além disso recomendo que sempre utilizem nomes que façam sentido por exemplo: local nomeJogador = getPlayerName(source) -- Vou explicar quando usar Source/Player/thePlayer na parte de Script. Caso fosse uma função poderia ser obterNomeJogador() ou obter_nomeJogador(), o importante é que seja legível e você consiga identificar oque ela faz. Alguns podem se perguntar, porque não utilizar tudo minúsculo e junto, bom quando você começa a trabalhar com letras iguais isso se torna um problema por exemplo: local casaamarela = x, y, z Nesse caso seria recomendável uma separação, por padrão eu sugerido que sempre usem minusco e _ dessa forma casa_amarela = x, y, z; Assim mesmo que as letras sejam iguais, você não teria que se preocupar com descobrir oque aquele variável faz. Um pratica que eu não recomendo de forma alguma é abreviação ou o uso de letras por exemplo: local obter_nomeJogador() Que passaria a ser local onj() Para você que esta programando pode fazer o maior sentido agora, mas para outras pessoas ficam muito confuso, além de que você pode se esquecer ou nomear funções com as mesmas letras mais a frente no código, oque geraria conflito com a informação. Outra boa pratica de programação seria a de utilização de parênteses () em verificações, eu pessoalmente não me atenho muito a isso, porem facilita muito a vida de quem esta começando exemplo: local x = 10; local y = 50; if x < y then Passaria a ser: if (x < y) then Essa pratica torna a condição muito mais visível, e facilita o entendimento da verificação. ** Porem no caso de Lua assim como o ; ao final das var não é de uso obrigatório, outras linguagens podem ser.** Loops e Condicionais Como foi explicado no post passado, os loops e condicionais são muito uteis e fazem grande parte da programação, porque querendo ou não, temos que verificar coisas, e agir de acordo com elas. Tendo isso em mente, vou dar uma dica básica, evite chamar funções em loops ou condicionais complexas, principalmente em loops. Oque acontece aqui é que mesmo um while/repeat executa varias vezes um mesmo bloco de código, até prover uma condição favorável a saída, e isso pode parecer Simples, mas imagine você chamando 10,20 ou 30 vezes uma mesma função, que atribui valores locais na memoria, e executa. Em Lua isso não se torna um problema muito grande, mas em outras,linguagens como C ou mesmo JS isso pode causar um crash na aplicação muito fácil, então para evitarmos que esses problemas possam acontecer, evitem ao máximo chamar funções dentro de l ops ou condições complexas. Negações no IF Outra pratica que e interessante se evitar, é utilizar as condicionais no negativo, por exemplo o if not. Lembre-se que uma condição, só é executada quando a condição se torna verdadeira, e um if not é uma negativa verdadeira, parece algo besta, mas você poderia lidar com ela no else, isso é mais uma recomendação mesmo, trate as verificações sempre como produtos verdadeiros e lide com os negativos no processo, não faça uma negativa verdadeira. Organização de Código No começo do código, geralmente é recomendável a importação de bibliotecas, funções externas, e etc. Depois a atribuição de variáveis globais se necessário. Podem seguir esse modelo básico: Variáveis globais e Datas; Objetos e Afins; Funções e Condicionais; Exports e Imports; Handles e eventos. Pode parecer meio confuso agora, mas quando chegarmos na parte de Script de MTA, vamos seguir essa organização e garanto que tudo vai ficar mais fácil. Como esse post trata de praticas de programação, eu recomendo que você retorne em seus códigos antigos e tentem refazer eles utilizando essas técnicas, e organizar o seu código da melhor maneira possível. O único exercício que eu vou deixar aqui, é que vocês tentem diminuir a quantidade de linhas nos seus código antigos, sem perder funcionalidade. 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 esta começando, todo mundo começou sem saber quase nada.
  5. 3 points
    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:
  6. 3 points
    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:
  7. 3 points
    السلام عليكم مع كامل احترامي ليك مفيش داعي للجامع داخل اللعبة اولا المصليين لبسين حذاء و كمان الصلاة مينفعش تجسد داخل لعبة ممكن تعمل شكل جامع من برا مقبول و يكون واقعي لكن من جوا و مصليين و بالحذاء بصراحة الفكرة مش كويسة بالتوفيق
  8. 3 points
    local vehicles = {} local minutes = 10 -- Depois de N minutos, o veículo será destruído. function removeVehicle(vehicle) if isElement(vehicle) then destroyElement(vehicle) vehicles[vehicle] = nil end end function startTimer(vehicle) if not vehicles[vehicle] then vehicles[vehicle] = setTimer(removeVehicle, minutes * 60000, 1, vehicle) end end function stopTimer(vehicle) if vehicles[vehicle] and isTimer(vehicles[vehicle]) then killTimer(vehicles[vehicle]) vehicles[vehicle] = nil end end addEventHandler("onVehicleEnter", root, function(_, SEAT) if SEAT == 0 then stopTimer(source) end end ) addEventHandler("onVehicleExit", root, function(_, SEAT) if SEAT == 0 then startTimer(source) end end ) Você pode usar o meu código acima. Quando o jogador sai de algum veículo, começa uma contagem de 10 minutos (você pode alterar o tempo). Se ninguém entrar no veículo em 10 minutos, o carro será destruído.
  9. 3 points
    Client-side variant of setVehicleHandling can only modify handling of vehicles which are local only, i.e. client-side vehicles that don't exist on the server side, which a player cannot enter.
  10. 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 :).
  11. 2 points
    The guieditor has a panel that shows all images from every resource. If you want to add images directly to the guieditor resource, you must place them in "guieditor/images/examples" and then add them to the meta.xml of the resource.
  12. 2 points
    Money given or taken client-side is not synced with the server, you have to give the money in the server side.
  13. 2 points
    if you want to buy weapons By GUI you should use this functions #Client OnClientGUIClick triggerServerEvent #Server getPlayerMoney giveWeapon
  14. 2 points
    bengines provides custom engine sounds for vehicles. The resource is not focused to be ultra realistic, it is designed to use for casual servers. Not useful for me anymore so sharing with community. Used on old project. Sounds are copyrighted content not owned by me. Features: ready to use, chooses the best engine for vehicle depending on handling! easy to customize & expand for Lua programmers 30 soundpacks for vehicles (buses, bikes, sport cars etc.) stable code with quite high performance used on server with 600 players ALS effect (exhaust flames) Turbo (satisfying whistle and blow-off sounds) Videos: https://streamable.com/n7k40 https://streamable.com/lp14t https://streamable.com/q5e9g Download: Github: https://github.com/brzys/bengines (feel free to send pull requests) Community: to-do For programmers: --[[ Element datas used by resource [array] vehicle:engine - stores basic info about engine type, sound pack etc. (synced) [string] vehicle:type - used for engine calculation, useful for servers. Available: Bus, Truck, Sport, Casual, Muscle, Plane, Boat, Motorbike (synced) [string] vehicle:fuel_type - customized for each engine. Useful for servers. Available: "diesel", "petrol" (synced) You can use setElementData(vehicle, "vehicle:upgrades", {turbo=true, als=true}) to add turbo or ALS. --]] --[[ Exported functions --]] exports.bengines:getVehicleRPM(vehicle) -- returns RPM of given vehicle exports.bengines:getVehicleGear(vehicle) -- returns current gear of given vehicle exports.bengines:toggleEngines(bool) -- true / false, restore GTA engine sounds
  15. 2 points
    Temporary bans can't be appealed. Next time, don't upload resources to the community that contain backdoors. Wait for the ban to expire
  16. 2 points
  17. 2 points
    It is because you cannot attach your handler to commands like: check ; list ; test Check wiki for more info - https://wiki.multitheftauto.com/wiki/AddCommandHandler Good luck on your adventure with Lua in MTA:SA :)
  18. 2 points
    After talking to countless members of this community I've heard the same thing over and over again. "MTA is a dead game" or "MTA is a dying game". As far as I know there are endless possibilities and opportunities to create amazing things within this platform. I see common themes going around for gameplay experiences or 'gamemodes' such as roleplay, cops and robbers, freeroam, race, deathmatch, derby, dayz, and many others. 90% of which I would join and find it to be so much similar to another. I believe that each of these servers needs more diversity. This to me became a real problem when I found so many servers ripping scripts from other servers. In fact there have been many times where I met someone who wanted to start a server up within a few days, he wasn't willing to put in the effort to develop his own scripts, instead he was heart set on using scripts that come from another server. I've been scripting for a long time now and I've made some amazing things. I can say with certainty that 99% of scripts made in MTA could be so much better. I believe the game could be better as a whole if servers would have more diversity. It should be a goal to be completely different from everything else, and to advance on bigger levels each day.. Sometimes I believe people when they the game is dying. Server owners and scripters are getting lazy, making script that either just make the cut or stealing them from another server. It's making a general overall gameplay experience on the platform that become boring after so long. If each server had a lot of different things that go in different directions I'm sure the gameplay experience would be more in depth. Especially if the scripts are actually good. Too many simple user interfaces, too many user interfaces in general. It's nice when you can have all the stuff you need in one place, but what if it wasn't just stuff you needed? What if it wasn't just in one place? What if the gameplay experience actually had some depth to it, where you can really customize how you play the game. Instead of a server depicting a specific route for you, a route that is the same as everyone else's? Here's what I believe. I believe that MTA could be one of the best gaming platforms ever made but in order to achieve that level of success scripters and server owners need to put more time and effort into making their servers with more in depth and modern/old style gameplay with as much diversity as possible. ~ Shay
  19. 2 points
    elseif isObjectInACLGroup("user." .. account, aclGetGroup("Everyone")) then cancelEvent(true) outputChatBox("#000000║#ffffff✘ #ff0000Jᴏ#ffff00ɢᴀᴅ#00ff00ᴏʀ#ffffff ✘#000000║ - #FFFFFF"..name.."#FFFFFf:#FFFFFF "..text, root, 255, 255, 255, true) outputServerLog("CHAT: [ Jogador ] " .. name .. ": " .. text) Essa parte toda do Everyone deve ser a última. Isso é erro de lógica. Uma vez que Everyone são TODOS os jogadores, assim que o jogador entra ali, nada mais é executado a partir do Alpha.
  20. 2 points
    What's your server/client version? This could be problem due of https://github.com/multitheftauto/mtasa-blue/commit/d2c53c73e327ade55862043af9bd53da64dd351a (r20391), but it should be fixed, there was 2 commits that should correct this - https://github.com/multitheftauto/mtasa-blue/commit/24a233f6e897771504a270940e05ccc4652bce53 (r20394), and https://github.com/multitheftauto/mtasa-blue/commit/a5508d8cead013a0b08e9c2cddb5914e46be1abd (r20398), so i suggest you to update your server/client to r20398 or even higher.
  21. 2 points
    O server-side está com erro. Não se usa localPlayer em script server-side. Seu resource pertence a dois scripters, AirNew Scripter e esse tal de LG7 Scripter. Quem será que roubou de quem?
  22. 2 points
    وجهة نظر تحُترم لكن انا عن نفسي اتعلمت عن طريق الأكواد الجاهزة بالتوفيق
  23. 2 points
    :للفايدة معلومة ممكن كثير مايعرفونها 1.5.7 لكن بعد في تحديث تم إضافة فنكشن clearChatBox https://wiki.multitheftauto.com/wiki/ClearChatBox الفنكشن يمسح الشات مسح كأنك توك داخل مو مثل الطريقة القديمة إضافة أكثر من شات من بنفس الوقت
  24. 2 points
    local aberto = false function abrircelular(thePlayer) if aberto == false then aberto = true setPedAnimation(thePlayer, "ped", "phone_out", -1, false, false, false, false) elseif aberto == true then setPedAnimation(thePlayer, "ped", "phone_in", -1, false, false, false, false) aberto = false end end function abrircelular2(theplayer) bindKey ( thePlayer, "F1", "down", abrircelular ) end addCommandHandler ( "celular", abrircelular2 ) Obs: pode ter ficado zoado porque fiz pelo celular e se for renderizar algo passe isso para client-side, pois iria facilitar pra você.
  25. 2 points
    The mapping is without custom textures.
  26. 2 points
    Salutare 😁 Am deschis serverul SwordGaming va asteptam pe server daca vreti ceva unic si frumos! ss: https://prnt.sc/qw4r1c IP : mtasa:// discord:https://discord.gg/hFKnVNz
  27. 2 points
    Corrigido. Era um bug relacionado a variável. function renderTime () local time = getRealTime() local hours = time.hour local minutes = time.minute local seconds = time.second local ampm = " am" if (hours > 12) then hours = (hours - 12) ampm = " pm" elseif (hours == 0) then hours = 12 -- Meia-noite. end if (hours < 10) then hours = "0"..hours end if (minutes < 10) then minutes = "0"..minutes end if (seconds < 10) then seconds = "0"..seconds end -- Escolha o formato desejado: dxDrawText (2, hours..":"..minutes..":"..seconds..ampm, 0, 0) -- HH:MM:SS am -- dxDrawText (2, hours..":"..minutes..":"..seconds, 0, 0) -- HH:MM:SS -- dxDrawText (2, hours..":"..minutes..ampm, 0, 0) -- HH:MM am -- dxDrawText (2, hours..":"..minutes, 0, 0) -- HH:MM end addEventHandler ("onClientRender", root, renderTime) @Angelo Pereira a condição if hours >= 0 é desnecessária. Pois ela sempre será verdadeira.
  28. 2 points
    Aquela rodinha com os MBs sempre vai estar lá. É nativa do MTA. Mas se vc quer que apareça algo durante o download, dá pra usar isTransferBoxActive para saber se está baixando algo ou não.
  29. 2 points
    Introduction Modding is a term used when modifying components, files and what not, in this particular case modifying game installation files in order to achieve unique results not seen in the vanilla game. GTA:SA is 3D era, where modding the game requires special 3D packages. Older games such as GTA:II uses a 2D engine, which means that modding the game was commonly done with image editing applications. We will cover some aspects of modding game textures and models. This guide intends on introducing those inexperienced with modding and 3D as a whole, on how to obtain 3D software and their recommended tools. It also introduces ways to import and export models, basic workflows for 3ds Max, texturing and creating models. TOC 3D packages, helpful tools and how to obtain them Extracting game assets How each type of game model works Limitations - MTA vs GTA Working with 3ds Max Texturing a game-ready cube 3D packages, helpful tools and how to obtain them There are various applications being used for modding. Although some has more tools available, there really isn't one that tops the others. In this section there'll be lists of a few 3D packages and tools used for modding. 3ds Max, arguably the most used program with the greatest amount of third-party plugins and scripts for various games. For GTA:SA, this program is favored by many modders due to it having 3rd party scripts for dealing with animations, collisions, lighting, modeling etcetera. There isn't much that 3ds Max can't, that other programs can, when it comes to GTA:SA modding. Although this can be expensive to run on a longer term, there are education licenses available which last for 3 years. These do not allow commercial use, and is marked purely as "educational use only". View more. Kam's (vanilla) max scripts, the first official script package for modding GTA:SA with 3ds Max. After the release of his scripts, a lot of others has developed scripts of their own, some of which are more optimized and less prone to issues. Even despite Kam's scripts having overseen issues, it is still to this day widely used for tasks such as, but not limited to; IPL map generation and import, collisions, animations, characters, vehicles, environment modeling. View more. Kam's (2018) max scripts, a modified version of Kam's vanilla scripts for 3ds Max. Notable features that were added are; DK22pac's Normal map plugin support, reflection map support for environment models, 2dfx panel for lights such as aircraft lights or street lamps. View more. The Hero's RW importer/exporter, a modern plugin that works extremely well with vehicles and environment models. Due to its simplified layout it is very easy to get used to. It's far recommended to use for vehicle model import/export due to its quality handling and materials, which are based on RW formats (renderware, the engine GTA:SA runs off). With the plugin using different model material formats from Kam's, it comes with a maxscript to convert scene materials from GTA_MTL to RW_MTL and vice versa, if needed by the modeler. View more. Deniska's max scripts, a pack for various types of GTA:SA modding, some features are obsolete for MTA users due to IPL and IDE modification required. Although, the pack does come with a few tools that may be useful to MTA modders, such as prelight tools to set the vertex colors and illumination to fixed values. View more. DexX's 2dfx export script, a standalone 3ds Max script that exports Omni and Dummy informations to .sae file formats, to then be added to the .dff using RW analyzer. With this script it's possible to integrate lights and particles into custom models, e.g flashing aircraft lights, street lights, fire and smoke, etcetera. With the release of Kam's 2018 scripts, this script is used less as using Kam's may be less work for some cases. View more. Blender 3D, a freeware (yes, completely free, no paid watermarks or any limitations), not as favored by modders throughout the years until recently, where a developer has released his script 'DragonFF' on GTAforums. Although it is WIP, modders has already binned 3ds Max and moved permanently to Blender. Although Blender is free, it actually combines several programs into one, allowing a Blender user to sculpt, paint, do lighting, professional rendering and modeling in one. A recent update in 2019 changes the RMB selection to LMB and UI among other things, making for a potential alternative to 3ds Max. View more (Blender). View more (Blender GTA script) Zmodeler, not as commonly used as the aforementioned programs, although it is being used very frequently by modders in various games, most notably for GTA:games. It does not have support for skinned characters, although it is being commonly used for vehicles, and sometimes environment modeling as well. This is a fairly inexpensive solution, but lacks tools for more broad modding. View more. Sketchup, a 3D application that focuses on architecture. For modding, it is a rather uncommon, though has a free and paid version and can be used for seemingly OK modeling. It does not have access to any 3rd party scripts for GTA:SA, hence its only use is modeling and then exporting model files to then import into 3ds Max or Blender. View more. Photoshop, mainly used for graphic design, but can also produce 3D models, video, GIF and textures for assets. Photoshop is the most favored by modders in regards to working with textures e.g paintjobs and retexturing. Although there are alternative image editors in the market, Photoshop definitely hits the top in terms of usable scripts (user-customized scripts as well) and ease of workflow. View more. DFF Viewer, a 3D graphics engine that is used for visualising GTA:SA models and supports .DFF and .TGA formats. Only single dff's can be loaded at a time. Though this is rarely used by those who has access to 3ds Max and Blender, it is commonly used for troubleshooting/testing work that involves retexturing a model e.g changing the clothing textures of a character. This program is entirely free and available from various GTA modding sites. View more. TXD Workshop, a texture dictionary editor that has been around for years, only since recent years to be succeeded by Magic TXD. Though TXD Workshop may not be the best for setting up TXD files, it has a built-in IMG archive editor, allowing one to browse all of the contents of gta3.img. View more. MagicTXD, a new texture dictionary editor with features for mass exporting .TXD contents from folders into image subfolders, texture compression, mipmaps, resizing textures etcetera. This is broadly used for .txd files and almost took over TXD workshop when it comes to working with texture dictionaries. View more. RW Analyze, a multi-use program with notable features being; ability to lock/unlock game files, add data to game models e.g 2dfx and vertex colors information extracted from other DFF files. View more. Extracting game assets In order to start modding GTA, access to the files is required. The files in question are commonly found in parent files that require some sort of program to open. In this case, TXD Workshop or any IMG editor and optionally Magic TXD for later on will work just fine. The below steps shows one way to extract all models and their texture dictionaries. For IMG editors (e.g Alci's IMG Editor): Open the editor. Under File, select Open. Find gta3.IMG stored in GTA SA directory\models. Highlight the first file in the list, then scroll down to the very bottom and SHIFT+LMB click the file on the bottom. This highlights every file in GTA3.IMG. Right click the list of files and select Export. On the popup window, find and select, or create a new folder on desktop called GTA SA ASSETS. Click enter to proceed. ((For cases where specific files are wanted, use the search field to find the necessary files and export them individually)) For TXD Workshop users: Open TXD Workshop. In the toolbar it says Open IMG. Click this, then find and select gta3.IMG stored in GTA SA directory\models. Highlight the first file in the list, then scroll down to the very bottom and SHIFT+LMB click the file on the bottom. This highlights every file in GTA3.IMG. Right click the list of files, select Extract. On the window, find and select, or create a new folder on desktop called GTA SA ASSETS. Click enter to proceed. ((For cases where specific files are wanted, use the search field to find the necessary files)) Now the folder GTA SA ASSETS contains nearly every .dff, .col, .txd and so on used by the game. Assuming one would like having all of the textures in PNG, DDS, TGA or any other common image format, they may follow the below steps using Magic TXD. Inside GTA SA ASSETS create a new folder named IMAGES. Open any .txd file found in GTA SA ASSETS using Magic TXD. Navigate to the toolbar. On Tools, click Mass export. Export settings are as following. Game root = root folder containing TXD's Output root = folder where images goes Image format = self explanatory With texture names only = exports images directly to folder and duplicate named ones gets replaced by one another Pre-pended with TXD name = exports images with TXD prefix In separate folders = makes new folder(s) for every TXD's contents Hit export. This process may take some time. Note that this process is the same for other .IMG archives such as player.img. There are also .txd and .dff files elsewhere, such as \models\generic\generic.txd, which is the vehicle shared texture dictionary file. How each type of game model works Models used on GTA SA uses different rendering techniques and data hierarchy than others. This section will introduce the features that some models has that others don't. Vehicles: Vehicle model components utilises hierarchies, where each component is linked to a dummy (helper) and each dummy is linked to parent dummies e.g chassis_dummy, for them to be registered in the hierarchy. In order for vehicles to not look flat or cartoon, a few steps are made in the model; Diffuse material is given a grunge texture or AO map, this helps telling the depth of the vehicle as well as giving it a feel of realism, so it isn't just clean. A specular lighting image is applied to the vehicle surface material, giving it a fake shine when looking from certain angles. If the vehicle has hard edges (smoothing), this image can increase the visibility of the normals, retaining its original look rather than being flat without visible difference in geometry. An environment (ENV) map is applied to the vehicle surface material, producing a fake reflection that is animated horizontally as the vehicle travels. Vehicles also has a lot of hardcoded features such as headlights, brake lights, emissive lights, taxi/aircraft lights, rotatable components and dynamic collisions for special vehicles like Forklift. Vehicles are also the only dff models that uses baked collisions, which means they are stored in the .dff itself. Below is a detailed hierarchy used for cars, and special components used by a number of vehicles (click the spoiler). Skin characters: Ped skin characters uses bones (dummy objects) that are connected to each other and linked to the character model. These bones are not visible in-game. In order for the bones to know what part of the 3D model they're responsible for, the skin needs to be rigged. Character rigging for GTA:SA is done by applying weigh on vertices. Using heatmap display, colors go through blue-red, low-high respectively. Values go from 0 to 100. If the value is 0, it means that the vertex is not used for any bone. This can cause issues. If the value is < 100, it means that the vertex is used for multiple bones. This results in smooth animations ingame, as the 3D model transitions smoothly through each bone. If the value is 100, it means that the vertex is only responsible for one bone. Skin rigging is generally something that is being avoided by modelers and makes Skin modeling the most difficult on GTA. Bones are as shown: CJ character: Carl Johnson's 3D model is split into several pieces in order to be compatible with the clothing script used to let the player customize CJ. These models uses a function known as multiclump to support 3 meshes per dff; normal, ripped and fat. This is for CJ's health stats to physically show in-game. Other than multiclump and additional bones, modding CJ skin is essentially the same as any other ped skin. Map environment: World objects .dff contains only single models, though they do support omni and dummy objects for 2d effects. These types of models uses Vertex Colors/Face Colors. This requires the modeler to paint colors onto the model which is then stored in the vertex colors channel (daytime) and vertex illumination channel (nighttime). Although uncommonly used by R*, these models do support reflection maps like vehicles use. Goldfish's modified version of Kam's scripts is excellent for exporting with reflection maps. GTA SA utilises multiple collision archives (.col) for every IPL district, being responsible for all of the world objects' collisions. However, on MTA, collision archives are not supported, so custom collision files are single models per .col. Not every object uses collisions though, some merely has their bounding space. These objects can not be selected with MTA map editor, thus requires additional scripting or modding. Limitations - MTA vs GTA Speaking of native support, MTA currently is behind in several places. Notable features that aren't available on MTA, but on GTA are as following. Item Placement (IPL) - another type of mapping file, but contains a lot more functions such as zones for real-time reflections as seen in interiors. Item definition (IDE) - a file used to but not exclusively, define settings for models, enabling alpha flags, disabling backface cull, enable breakable effect and much more. Limit adjuster - a rework of the game that allows for adding more ID's and bypass common limits. This however is being developed by one of MTA's contributors. There are various limitations such as polys per model, max dimensions for models and collisions, (very) strict size limits for collisions and CPU usage that can easily cause issues for modders. Not to mention the majority of the game data files which most MTA servers likes to force original, else the player won't be able to connect. These limits all has potential solutions being developed as with the limit adjuster. Working with 3ds Max As described above, 3ds Max is without a doubt the most common program for GTA modding. It's also used by professionals within architecture and visualisation and film industry. What's amazing about this program is that whatever is created in 3ds Max can ultimately be added to the game. A modeler made a square - it can get added right away, no adjustments required. That's the charm of 3ds Max. There's no need for additional tools to process the model for it to be compatible with GTA. It is also the primary program that Rockstar's developers used for creating the environment in GTA:SA. At a first glance, the program may seem rather intimidating. The main functions of the program that a beginner should be aware of are listed below. Shows the default home screen with 4 viewports. Left, Top, Front and Perspective. The 3 side ones are Orthographic viewports while Perspective is in regular mode. It is also the most common one to use. Highlighting a viewport and pressing (left)ALT W will full screen the viewport. In order to rotate camera view, the user must click and drag the square in the upper right corner. Its face also tells which side the camera is viewing e.g Top. If one wishes to see viewport statistics such as polygons per model, vertex amount etc., clicking: [ + ] icon on the upper left side > Configure Viewport > Statistics > Total + Selection > Apply > Clicking 7 on keyboard shows the statistics. This feature is extremely useful for modelers who are limited in polygons per model, or simply wants to see how many polys a car is. Common keyboard shortcuts F1: Opens Autodesk help section in new browser tab F2: Displays blue overlay on models F3: Displays models in wireframe F4: Displays edges on models F10: Opens render setup 9: Shows viewport statistics Q: Select objects W: Select and move E: Rotate R: Select and (mode) scale U: Orthographic viewport mode P: Perspective viewport mode A: Toggle angle snap S: Enable snap D: Disable viewport G: Enable/disable grid J: Display bounding edges LALT X: Xray mode for model Ctrl Z: Undo action Ctrl Y: Redo action In a heavy program like 3ds Max, being able to change preferences to one's likings is important. Do so by going to Customize > Preferences. Performance, file settings and such can all be configured in there. For GTA:SA modding, knowing how to subdivide and add geometry to existing GTA models is very important. Below is a list with actions that may come in handy. No-brainer: Editable Mesh is inferior to Editable Poly. Use Poly, poly, poly, poly... Editable mesh modeling Vertex selection mode Edit Geometry section Attach: attaches another model in the scene to the selected mesh Chamfer: chamfer selection of vertices; creates additional geometry Weld: merges vertices together within a specified threshold Surface Properties section Edit Vertex Colors: sets the color and illumination of selected vertices Edge selection mode Edit Geometry section Divide: divides an edge, adding a new vertex where it was divided/split Extrude: create and pull a new face out from existing edges (keyboard shortcut: LSHIFT + LMB-drag) Face selection mode Edit Geometry section Divide: creates a new face Extrude: pulls the select face(s) outwards or inwards and creates new geometry off that Bevel: essentially an Extrude followed by scaling of the face Surface Properties section Flip: flips a face 180 degrees Smoothing groups: defines the smoothing of the model. Autosmooth is in many cases OK, but may not fulfil everyone's expectations Editable poly modeling Vertex selection mode Edit Vertices Connect: selecting 4 verts on a box side and using this function will triangulate the side. Edge selection mode Edit Edges Connect: creates an edge between the selected edges, as in a bridge between two cliff sides (use the 'Settings' to choose between multiple or one edge on creation) Polygon selection mode Edit Polygons Inset: places a new polygon inside the selected, allowing to be scaled Bridge: connects two opposing polygons by creating a bridge between them (can be used for walls and gaps) Edit Geometry Slice Plane: enables the user to create a perfect cut on the model, can be rotated by degrees Rendering scene Modelers working on projects for companies or friends might want to show what they've accomplished, but a regular screenshot may not suffice. Talking of a screenshot like this: Instead, the modeler might want to show the scene with textures. Perhaps more than just textures - lighting? reflections? transparency? - this is where 3D rendering comes into play, and can be done by simply pressing SHIFT + Q on the keyboard. This can also by default use alpha channel. However, the quality could improve. The quality of the render depends on the scene assets (models, materials, lights), the Renderer and its settings. By default, 3ds Max utilises Scanline Renderer. This is not a production quality render, but rather meant for test shots and demos. Though the quality isn't great, it's still possible to produce seemingly interesting renders. The following render took merely 8 seconds. Using 3ds Max allows modders to bring GTA:SA into modern graphics, easily comparable or even superior to ENB's. It also enables modelers to share visualizations of their models to help the customer understand how it could potentially look for their game. In the above render, a Skylight is used with Scanline Renderer. A very basic render, though interesting and contains lots of depth. In order to replicate this result, below are the steps to follow: On the Create panel, where one would normally find boxes and spheres, click the toolbar Lights. Where it says Photometric change that to Standard. Click the Skylight and place it in the 3ds Max scene. Settings for Skylight explained Multiplier: intensity of the light Sky color: the color of the light Cast shadows: enable to produce shadows, though this is more of an Ambient Occlusion than actual shadows Rays per sample: quality of the shadow, ideally keep at <5 for tests and 15-20 for final shots In the actual render above, a sample of 5 was used, creating grainy shadows but quick render. Backface culling was enabled to avoid slowing down the render time. Skylight is great light source and is generally used to illuminate an entire scene and not particular models. In the same Lights tab, one may find use of Omni or Free lights, which both works great. These are great point lights, which as opposed to skylight, are able to illuminate parts of the scene e.g acting as street lights. Modifiers When modeling, modifiers can come in use and save the modeler a lot of time. The following modifiers are highly suggested for beginners to know about. Bend: bends the model, effect depends on the differences in the geometry Mirror: copies the mesh and mirrors it on the other side, commonly used for vehicles using symmetrical geometry Smooth: generates and applies smoothing to the model, generally the lower values makes for higher file sizes Symmetry: essentially the same modifier as 'Mirror' Turbosmooth: Smoothens the mesh, adding geometry, uses iterations Unwrap UVW: advanced UV editing, commonly used for preparing textures for models like characters and game assets UVW map: basic UV editing, X/Y/Z projection mapping as well as spherical, box and planar mapping Vertexpaint: allows for painting colors onto vertices and faces, these colors are rendered during either ingame or night time Texturing a game-ready cube Modeling has to start somewhere. Using standard 3D primitives is a good place to start. For the purpose of this guide, a Cube will be created in 3ds Max and textured in Paint.net, a free image editing software. Video tutorial: To start off, navigate to 3ds Max's Create tab on the right hand side panel, as shown below. Shows the Create tab on the panel. For this guide, click on Box (Cube). Use LMB and click and drag the mouse in the viewport to create the cube. Now that the Cube primitive is spawned in the viewport, on the same panel that it was created from, go to Modify tab and set its dimension parameters to 5,0, 5,0, 5,0 and 1 segment for all 3. Convert the model to Editable Poly by right clicking it in the Viewport > Convert to > Editable Poly. Go into Polygon selection mode and scroll down until the following buttons are visible: With viewport selected, on the keyboard press `CTRL A` to select all faces on the cube. Now, where it says `Color`, click the bar and on `Value` set it to 100, then do the same for `Illumination` but value at 35. What this does is it sets the vertex colors so that the model won't be overexposed during day/night time. Exit polygon selection mode and on Modifier List, click that and find Unwrap UVW. This applies a modifier stacked on top of the Editable Poly mesh. Under Edit UVs click Open UV Editor. This allows the user to make changes to the UV coordinates which tells the model how textures are projected onto the model. On the editor, ensure that Polygon selection is enabled. While in the UV editor, press `CTRL A` to select all UV islands. On the top of the editor click Mapping, then Unfold Mapping.... Keep it as Walk to closest face and enable Normalize Clusters. Click OK. The result should remind the user of how a simple cardboard box in real life looks when it's yet to be folded into a box. With the model unwrapped, on the toolbar on the UV editor, click Tools > Render UVW Template. The export settings below are ideal for this particular task. If one wishes to know exact dimensions of each square, enable Seam Edges. After exporting, on the modifier stack, press Collapse to. This saves the new UV's. The width and height should be on a 1:1 ratio to avoid stretching issues. 1024x1024 is more than enough. On the rendered image window, click the Save button and find a location to save it in, name it Cube_unwrapped and use Alpha channel (optionally). Now open Paint.net and insert the image. Once happy with the result, export as cube_diffuse. Diffuse map generated with the help of a UVW template. In order to apply the texture on the model, simply drag and drop the image from file browser onto the model in the Viewport. Although the example above is not textured properly in regards to rotations, it shows what can be done by using UVW templates, and how easy it really is to produce textures for models made from scratch. The model can be directly exported as DFF. Materials are not required to be GTA or RW, they can be standard and still show ingame. Some exporters wants the model in Editable Mesh however, so converting it may be required. Thanks for reading this guide, we hope it helps and we wish you the best of luck with modelling! For questions on modding, please refer to MTA's modding FAQ or MTA discord #modelling channel.
  30. 2 points
    Hello there! You found Dystopia: The Incident, an original sandbox post-apocalyptic RPG. Keep reading below and you’ll find out more... Test server: mtasa:// Discord: https://discord.gg/Zs5bWSX Current version: alpha 0.75, check out details here DOWNLOAD (0.75 alpha) Key concepts Food and water are scarce and you need to be on the move to stay alive. Inventory size is limited, forcing you to prioritize. Vehicles require constant maintenance. Faction camps, bases, shanty towns and other encounter zones all over San Andreas. Exploration is rewarded. World is densely populated with NPCs and who you choose to kill matters. Environment is harsh and punishes the weak and the dumb. Moral decisions to be made. End goal. Roleplay friendly. Designed to be also enjoyable as a single-player experience. Setting 2000: A series of catastrophic earthquakes smashed the cities and countryside of San Andreas. In the aftermath, the whole state found itself separated from mainland. Fear and selfishness roamed free, pushing society into chaos. In the heart of San Fierro, one of the largest cities of San Andreas, government-sponsored Zombotech Corporation was researching biological weapons in its underground facility. The labs were heavily damaged by the cataclysm and a deadly infectious agent escaped in the streets. While emergency services struggled to contain the disaster and minimize collateral damage, death was spreading unnoticed. 2001: The Establishment evacuated survivors of the outbreak in the barricaded city of Las Venturas but infection spread inside the fence. They nuked the city and placed San Andreas under strict military quarantine. Nobody gets in, nobody gets out. They dubbed the disaster ‘The Incident’ to minimize its amplitude, media soon went silent and survivors were forgotten. 2007: 6 years passed and things have not become better. Regular people picked things up from where the government left them and started to organize. This is a tough new world, populated with the full spectrum of humanity: resilient survivors, vicious bandits, cannibalistic raiders, oppressive military forces and the rest of the loons. No line between good and bad was ever so ill-defined. San Andreas is ruled with an iron hand by Governor Skinner, who took office only six days after the Incident. His armed forces fight to control the territory, herding men into the new Refugee Camp. Resources are scarce and many dropped the last remnants of morality when they faced starvation. Violent clans and factions fight over the remains, establishing turfs or just trying to stay alive. Militias fight for supremacy, idealists work to maintain civilization and everybody else just struggles to survive another day in an increasingly suffocating world. As it became evident that the government has no rescue plan for them, despair started to crumble the minds of the few sane left. All attempts to flee San Andreas are met with airstrikes. But there must be ways to escape this place... What you can experience right now Explore a detailed post-apocalyptic map with many encounter zones. Plenty of NPCs, both friendlies and baddies. Dynamic faction and spawn system. More than 40 missions already in the game. Detailed inventory with more than 100 items to be found and used. Basic needs, stamina, infection, various other modifiers like pain, bleeding, exhaustion or inebriation. Innovative looting mechanic. Four zombie types, with different behavior. Scavenge the world for materials to build settlements or to use simple crafting and cooking. Upgrade and drive rugged vehicles across the wasteland and engage in vehicular combat. Trade, recruit and discover parts of the story by chatting with NPCs. Experience dark humor and some strong themes (16+). Simple interface, consistent graphic style. What still needs to be done The current gamemode version is alpha 0.75. Required for beta: skills and abilities implementation, npc traffic, karma system and map completion (now >90%). Once the project hits beta and the core is completed we’ll start focusing exclusively on the missions and story. Seeking friends for the end of the world Want to jump onboard and take part in the development? Great, join our Discord server using the link on top (the recommended approach) or PM me here. We're always looking for like-minded developers. Wanted: scripters, mappers, storytellers, 3D artists and testers. However, keep in mind that we're not looking to monetize this project in any way. We’ve used the work of many MTA community members and the gamemode will be shared alike with the community when completed. You will gain full credit for your work but no other type of compensation. Share your thoughts We do love suggestions and implement all good fitting ones, so don’t be shy and tell us what you think about this project, using the channels highlighted above. The answer is guaranteed and we'll also give full credit for any original ideas. Media 100+ development screenshots here (I suppose this is what you were looking for from the beginning, instead of reading a wall of text) Thanks for reading! Watch this space for fresh information and media.
  31. 1 point
    You have misspelled detachElements, you typed detachElement without s. Does this solve your problem?
  32. 1 point
    I solved the problem as you said thank you. But I have another question, and I will ask him in a few hours. Thank you for your help.
  33. 1 point
    Yes, but those do not need to be official functions. It could be operations on variables/tables, and other custom functions.
  34. 1 point
    حبيبي يب ضض ، بفضل الله قم بفضل المبرمجين امثالكم زيك وزي كريم وديبو والخخخ .. قدرنا نصل لهذه المرحلة ..
  35. 1 point
    Precisa informa o código do dinheiro sujo, apenas da função givePlayerDirty é o suficiente 1. Essa exportação apenas server basicamente para enviar o valor do roubo e calcular com o que já tem, isto é descompilado? 2. Você esta tentando utilizar-se de uma exportação de uma função para obter valores (Claramente a função não foi feita para isto). 3. Você esta tentando fazer de qualquer jeito, obviamente não vai funcionar, precisamos saber qual o elemento que seu dinheiro sujo é definido. 4. Eu fiz alterações no server-side e no client-side, ao fazer tais correções, informe elas, para saber se fez da forma correta. Vamos pelo inicio, precisamos saber qual elemento realmente seu dinheiro sujo fornece para obtermos os valores. Depois, verificar-lo, e adicionar no player que esta revistando. Faço isso que eu disse, que vamos ter resultados. Esta retornando em zero, por talvez, o elemento do lado server-side ao ser puxado com getElementData("Elemento"), pode esta incorreto e então ele é definido como 0.
  36. 1 point
    ¡Hola, gente! Hoy nuevamente, les traigo un nuevo vídeo tutorial, el cual trata sobre ¿Como crear cajas de texto (editbox) en MTA con dxDrawing? ¡Espero les guste! Recuerden dejar su like, suscribirse y compartirlo! Cualquier otro tutorial que crean necesario de hacer y no lo ven en mi canal, pueden decirme en privado o por el Grupo de Discord donde frecuento estar. ¡Un Saludo!
  37. 1 point
    Here some code snippets I ripped out of one of my scripts. The code was used to calculate the new projectile position based on frame time. This would terminate different projectile speeds based on FPS. -- add function findRotation local findRotation = function ( x1, y1, x2, y2 ) local t = -math.deg( math.atan2( x2 - x1, y2 - y1 ) ) return t < 0 and t + 360 or t end -- add function findPitch local findPitch = function (camerax,cameray,cameraz,pointx,pointy,pointz) local dX=camerax-pointx local dY=cameraz-pointz local dZ=cameray-pointy local pitch=math.atan2(dY,math.sqrt(math.pow(dZ,2) + math.pow(dX,2))); return pitch end local xr, yr, zr = getElementRotation(source, "ZXY") -- source is projectile -- xr, yr, zr is saved inside of projectileData.rotation local targetX, targetY, targetZ = getElementPosition(target) -- target is projectile local rotZ = findRotation(newX, newY, targetX, targetY) + 180 local pitch = findPitch(newX, newY, newZ, targetX, targetY, targetZ) local rotX = pitch*(180/math.pi) local newRotX = projectileData.rotation.x local newRotZ = projectileData.rotation.z local rotationDistanceX = (projectileData.rotation.x - rotX + 360) % 360; if (rotationDistanceX > 180) then rotationDistanceX = 360 - rotationDistanceX newRotX = newRotX + math.min(rotationDistanceX, behaviourData.rotationSpeed * speedMultiplier) else newRotX = newRotX + -math.min(rotationDistanceX, behaviourData.rotationSpeed * speedMultiplier) end local rotationDistanceZ = (projectileData.rotation.z - rotZ + 360) % 360; if (rotationDistanceZ > 180) then rotationDistanceZ = 360 - rotationDistanceZ newRotZ = newRotZ + math.min(rotationDistanceZ, behaviourData.rotationSpeed * speedMultiplier) else newRotZ = newRotZ + -math.min(rotationDistanceZ, behaviourData.rotationSpeed * speedMultiplier) end projectileData.rotation.x = newRotX projectileData.rotation.z = newRotZ local rotationZ = -projectileData.rotation.z if creatorVehicle then -- if the projectile creator was a vehicle, then add 180 to invert the rotation. rotationZ = rotationZ + 180 end setElementRotation(element, projectileData.rotation.x, projectileData.rotation.y, rotationZ, "ZXY")
  38. 1 point
    1. Você precisa criar outro arquivo server.Lua e então adicionar o server-side e não adicionar isto no client (Obviamente o erro já esta ai). 2. Você esta enviando códigos para o server, não existe mais localPlayer no server-side. 2. Não sou bom com explicações, enfim : Deixarei um 1 exemplo que te ajudará a entender, e você intendera seus erros. -- EXEMPLO [1] -- client-side local aberto = false function abrircelular () if aberto == false then aberto = true triggerServerEvent("openPhone", getLocalPlayer(), localPlayer) --setPedAnimation (localPlayer, "ped","phone_in", 1000, false, false, false, true) --setPedAnimationProgress(localPlayer, "phone_in", 0.8) setPedWeaponSlot(localPlayer, 0) phone = createObject(330, 0, 0, 0, 0, 0, 0) exports.bone_attach:attachElementToBone(phone, localPlayer, 12, 0, 0.01, 0.03, -15, 270, -15) setElementDimension(phone, getElementDimension(localPlayer)) setElementInterior(phone, getElementInterior(localPlayer)) --animTimer = setTimer(function() -- setPedAnimationProgress(localPlayer, "phone_in", 0.8) --end, 500, 0) else removePhone() end end bindKey ( "F1", "down", abrircelular) addCommandHandler ( "celular", abrircelular) function removePhone () if aberto == true then if isElement(phone) then destroyElement(phone) end if isTimer(animTimer) then killTimer(animTimer) end aberto = false --setPedAnimation (localPlayer, "ped", "phone_out", 50, false, false, false, false) triggerServerEvent("closePhone", getLocalPlayer(), localPlayer) end end addEvent("remover_celular", true) addEventHandler("remover_celular", getRootElement(), removePhone ) -- server-side ( Você preciar criar outra pasta e não adiciona no client ). local animTimer = {} --/> e disto? function animacao_open_phone ( source ) setPedAnimation (source, "ped","phone_in", 1000, false, false, false, true) setPedAnimationProgress(source, "phone_in", 0.8) animTimer[source] = setTimer(function ( ) --/> Realmente precisa desse tempo em 0,5s?... setPedAnimationProgress(source, "phone_in", 0.8) --/> Disto? end, 500, 0) --/> E disto? end addEvent("openPhone", true) addEventHandler("openPhone", getRootElement(), animacao_open_phone) function desativar_animacao ( source ) if isTimer(animTimer[source]) then killTimer(animTimer[source]) end setPedAnimation ( source , "ped", "phone_out", 50, false, false, false, false) end addEvent("closePhone", true) addEventHandler("closePhone", getRootElement(), desativar_animacao) -- Esse tempo precisa ser verifica em um onPlayerQuit (Se não o joãozinho sai do servidor com o celular aberto, será 0,5s de floods :( Bom, deixarei explicações, e um melhor jeito de fazer, mais organizado e que não prejudique no desempenho, com os especialista @Lord Henry
  39. 1 point
    Hello and welcome to the forums @brunoxx8! We have a Portuguese language board for those who wish to write messages in said language. This is an otherwise English forum. https://forum.mtasa.com/forum/132-offtopic/ Please have a look at the forum rules in case and by all means, ask away if you have any questions. https://forum.mtasa.com/topic/12275-forum-rules/ Olá e bem-vindo aos fóruns Brunoxx8! Temos um quadro de idiomas em português para quem deseja escrever mensagens nesse idioma. Este é um fórum em inglês. https://forum.mtasa.com/forum/132-offtopic/ Por favor, dê uma olhada nas regras do fórum e, por todos os meios, pergunte se você tem alguma dúvida. https://forum.mtasa.com/topic/12275-forum-rules/
  40. 1 point
    It seems like it doesn't set the handling at all. I use this to set it: for k, v in ipairs(getElementsByType("vehicle")) do local model = getElementModel(v) if model == 542 then setVehicleHandling(v, "modelFlags", 0x00002000) end end also tried with setVehicleHandling(v, "modelFlags", tonumber("0x00002000")) but nothing. I also made a command which gets my current vehicle's modelFlags value and it always seems to be the exact same one - doesn't matter if I set it to 0x00002000 or not. Here's that function: function asdas() local handlingTable = getVehicleHandling(getPedOccupiedVehicle(localPlayer)) local value = handlingTable["modelFlags"] outputChatBox(value) end addCommandHandler("go", asdas) Will try with Hedit now. @Tut indeed it does work when I set it with hedit
  41. 1 point
    Se procurasse um pouquinho mais veria que tem 2 exemplos de como fazer isso. SetPedAnimation AddCommandHandler
  42. 1 point
    اوه ماي قاد اظن ان هذا السكربت قد افاد حياتي وغيرها للأفضل واريد ان اشتريه حقا ولاكنني لا املك المال المطلوب المهم امزح , السكربت خطير والله بس يبيلك تعدل كم شي بالانميشنات لأنها اتوقع مهي مزبوطة تماما
  43. 1 point
    What about more smoothly positions? local x, y = getElementPosition(getRandomPlayer()); for _i = 1, 300 do local i = _i / 10; local z = getGroundPosition(x + i, y); createObject(1337, x + i, y, z); local z = getGroundPosition(x - i, y); createObject(1337, x - i, y, z); local z = getGroundPosition(x, y + i); createObject(1337, x, y + i, z); local z = getGroundPosition(x, y - i); createObject(1337, x, y - i, z); end
  44. 1 point
    addCommandHandler("dc", function( thePlayer ) outputChatBox( "texto", thePlayer ) end)
  45. 1 point
    ضض , هذاك مود لبيع الأسلحة وشغلات كثيره بالسيرفر تعرضها فيه ولكن هذا للبكج فقط , وبخصوص الشكل , شي طبيعي احط قريد ليست عشان يعرض بكجاتك و ايديت عشان انت تحدد سعر البكج وقريد اخر يكون فيه أسماء اللاعبين و بكجاتهم وسعرهم وشكرا لتعليقك
  46. 1 point
  47. 1 point
  48. 1 point
  49. 1 point
    Yo guys, I've been working on a another theme in the last days. It was based on Metro Style (added on Windows 8, Windows Phone, etc). ------------------------------------------------------------- What is Metro Style | Images of Metro Style ------------------------------------------------------------- Below, some screenshots: * Agradecimentos ao XeoN pelos screenshots. Download: http://www.mediafire.com/?0jj2qc3jd9ypjyh Feel free to edit anything. I added the PSD file into download file, so you'll be able to edit anything on theme (colors, for example). (=
  50. 1 point
    Map by : GodFather Textures by : GhostRider aka kamisakea Shaders & scripts by : AngerMAN aka Ren712 RULES: You may not do absolutely nothing with the texture and map files, unless you are given permission by their authors. You can use shaders and scripts with no permission - however, please add a comment regarding their source. download : http://www.dropbox.com/s/h23y56z8w0cq3p ... m.zip?dl=0