<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.multitheftauto.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sousateew</id>
	<title>Multi Theft Auto: Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.multitheftauto.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sousateew"/>
	<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Special:Contributions/Sousateew"/>
	<updated>2026-05-05T10:56:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=PT-BR/Introdu%C3%A7%C3%A3o_OOP&amp;diff=81798</id>
		<title>PT-BR/Introdução OOP</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=PT-BR/Introdu%C3%A7%C3%A3o_OOP&amp;diff=81798"/>
		<updated>2025-02-08T00:45:37Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: Fix links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nota|Se você contribuiu editando e ajustando esta página do fórum, se você se beneficiou deste tutorial ou se você tem algo a dizer; por favor, me dê um feedback no link do fórum fornecido abaixo.}}&lt;br /&gt;
Este é um tutorial de script que explica o que é programação orientada a objetos e ensina como usar os recursos de OOP (Programação Orientada a Objetos) do MTA. Isso foi originalmente criado por [[Usuário:Qais|qaisjp]] ([[Usuário Discussão:Qais|discussão]]) às 22h48min de 8 de junho de 2014 (UTC). [http://forum.mtasa.com/viewtopic.php?f=148&amp;amp;t=76388 Post no fórum.]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
== Introdução à OOP ==&lt;br /&gt;
OOP (ou POO) significa ''programação orientada a objetos''. Três palavras simples e você provavelmente entenderá a última palavra mais. OOP é quando todas as funções relacionadas a uma única instância são chamadas nessa instância, sendo uma instância uma criação de uma classe - uma classe de elementos, uma classe de banco de dados, um jogador, um veículo. Originalmente, tudo era ''procedural'', você tinha que fazer coisas como:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local veiculo = createVehicle(411, 0, 0, 3)&lt;br /&gt;
setVehicleDamageProof(veiculo, true)&lt;br /&gt;
setElementFrozen(veiculo, true)&lt;br /&gt;
setElementHealth(veiculo, 1000)&lt;br /&gt;
setElementVelocity(veiculo, 0.2, 0.2, 0.2)&lt;br /&gt;
destroyElement(veiculo)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Muitas vezes, você sabe com o que está lidando. A variável quase sempre está ligada ao tipo, você nomearia um veículo que explodiu como '''veiculoExplodido''', ou pelo menos no contexto você entenderia que '''explodido''' implica um veículo quando no evento '''onVehicleExplode'''. Então, você tem que escrever uma função longa ''e'' referenciar o veículo manualmente ao trabalhar de maneira procedural. Doloroso. A programação orientada a objetos é muito diferente disso e trabalha com cada &amp;quot;objeto&amp;quot; individualmente. Em vez de ter que chamar uma função e referenciá-la dentro da chamada, você na verdade chama a função DENTRO da classe.&lt;br /&gt;
&lt;br /&gt;
Você provavelmente pensa que tudo o que você pode criar e passar para funções são elementos. Um veículo é um elemento. Um jogador é um elemento. Tudo o que é um elemento também é uma classe. Conexões criam uma instância de uma classe, mas &amp;quot;'''conexão'''&amp;quot; não é um elemento, é uma instância - um objeto. Ao longo do tutorial, quando eu digo ''objeto'', não me refiro a [[createObject]] (a menos que eu realmente mencione), mas para deixar as coisas mais claras, vou evitar mencionar objetos físicos enquanto escrevo este artigo. Aqui está um diagrama de Venn elegante que criei para mostrar a organização simples de classes e elementos.&lt;br /&gt;
[[Arquivo:Classes,_Elements_and_Problem_children.png|500px|esquerda|diagrama de Venn]]&lt;br /&gt;
As funções à esquerda são organizadas para mostrar em qual categoria o valor retornado se encaixa. Temos Classes, Elementos e &amp;quot;Problemas&amp;quot;.&lt;br /&gt;
Problemas não são categorias reais escritas no código, apenas funções que quebram regras. Tudo com que você pode brincar são classes: recursos, veículos e equipes.&lt;br /&gt;
Todos os elementos são classes, você pode fazer: &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;destroyElement(ped)&amp;lt;/syntaxhighlight&amp;gt; mas você não pode fazer: &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;destroyElement(resource)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problemas são coisas estranhas. Você não pode fazer todas as funções mencionadas em (na verdade, todos os elementos não permitem a gama completa de funções a serem aplicadas a eles, mas mencionei especialmente algumas delas) na seção &amp;quot;Funções de Elemento&amp;quot; da lista de funções, mas você pode usar destroyElement() neles.&lt;br /&gt;
Existem filhos de classes, por exemplo, com jogadores, o sistema funciona assim: &amp;quot;''Elemento -&amp;gt; Pedestre -&amp;gt; Jogador''&amp;quot;. Todos os Jogadores são Pedestres e todos os Pedestres são Elementos. Nem todos os Pedestres são Jogadores, e certamente nem todos os Elementos são Jogadores. O ponto principal aqui é que quase tudo o que você pode criar ou recuperar e reutilizar posteriormente usa uma classe.&lt;br /&gt;
&lt;br /&gt;
Em vez do código anterior, o código poderia ser substituído por este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local veiculo = createVehicle(411, 0, 0, 3)&lt;br /&gt;
veiculo:setDamageProof(true)&lt;br /&gt;
veiculo:setFrozen(true)&lt;br /&gt;
veiculo:setHealth(1000)&lt;br /&gt;
veiculo:setVelocity(0.2, 0.2, 0.2)&lt;br /&gt;
veiculo:destroy()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funciona de maneira bastante similar a como uma tabela funciona, é como customTable.setAlgo(), exceto que o uso de ''':''' faz o Lua converter customTable.setAlgo() para customTable.setAlgo(customTable). Isso é uma coisa interna sobre ''açúcar sintático'' e você não precisa se preocupar muito com isso.&lt;br /&gt;
&lt;br /&gt;
Essas funções são bastante úteis, mas há mais mudanças com OOP, explicarei isso abaixo.&lt;br /&gt;
&lt;br /&gt;
== Instanciação, variáveis ==&lt;br /&gt;
OOP remove a necessidade de dizer a parte &amp;quot;criar&amp;quot; da função, então em vez de dizer '''createVehicle''', você apenas diz '''Veiculo'''. Funciona exatamente da mesma maneira, é quase como fazer '''Veiculo = createVehicle'''. Legal, não é? A única diferença aqui é que você perde as coisas extras oferecidas, Veiculo não tem essas coisas extras, mas Jogador definitivamente tem. Por exemplo, em vez de fazer getPlayerFromName(), você faria Player.getFromName(). É uma maneira agradável e simples de organizar funções.&lt;br /&gt;
{{Dica|''Vehicle()'' funciona porque na verdade acessa a função '''createVehicle''', isso permite omitir o '''.criar''' quando se está simplesmente &amp;quot;criando um objeto&amp;quot;}}&lt;br /&gt;
Como a OOP se baseia na programação procedural, muitas coisas foram herdadas do estilo procedural, mas para facilitar as coisas, temos variáveis para todas as funções que exigem uma única entrada. Encurtamos '''getElementDimension()''' para '''elemento:getDimension()''', mas também podemos ir um nível mais profundo: '''elemento.dimension'''. Sim, como uma variável normal. Você pode definir essa variável como uma variável normal e ler dela como uma variável normal. Ei, vocêpoderia até fazer isso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;function incrementarDimensao()&lt;br /&gt;
    local jogador = Player.getRandom() -- pega um jogador aleatório&lt;br /&gt;
    jogador.dimension = jogador.dimension + 1 -- incrementa a dimensão&lt;br /&gt;
end&lt;br /&gt;
setTimer(incrementarDimensao, 60*1000, 10) -- define um temporizador para sessenta mil milissegundos, sessenta segundos, um minuto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Esse código pegaria um jogador aleatório e o moveria para a próxima dimensão a cada minuto pelos próximos dez minutos.&lt;br /&gt;
&lt;br /&gt;
== Vetores ==&lt;br /&gt;
player.position também funciona! Mas como você muda três argumentos... usando uma variável? Vetores.&lt;br /&gt;
Vetores são classes muito poderosas e vêm em várias formas, para este introdução, vou abordar um vetor tridimensional em termos de elementos. Usar um vetor é muito simples e, é claro, opcional. Onde você pode usar posições atualmente, você pode usar um vetor.&lt;br /&gt;
&lt;br /&gt;
Portanto, este é um exemplo simples de criar um veículo e movê-lo para o centro do mapa usando vetores:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Primeiro, crie um vetor tridimensional&lt;br /&gt;
local posicao = Vector3(300, -200, 2) -- algum lugar distante&lt;br /&gt;
local veiculo = Vehicle(411, posicao) -- crie um veículo na posição&lt;br /&gt;
veiculo.posicao = centreOfMap - Vetor3(300, -200, 0) -- mova o veículo duas unidades acima do centro do mapa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sim, usei o sinal negativo. Vetores não são apenas maneiras elegantes de lidar com posições ou rotações 3D ou qualquer coisa assim, você pode fazer cálculos matemáticos com eles. A matemática ''especial'' ainda não foi documentada, mas vou tentar trabalhar nisso. Portanto, como você pode ver na linha um, criei um vetor 3D em ''300, -200, 2'' e na linha dois criei o veículo nessa posição.&lt;br /&gt;
&lt;br /&gt;
'''veiculo.position''' retornou um vetor e também aceita um vetor - é praticamente setElementPosition() sem o &amp;quot;()&amp;quot;. Apenas uma variável simples; então, na linha três, eu mudei o valor do vetor da posição do veículo. É aqui que a matemática aconteceu, em termos simples é isso que está acontecendo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
x = 300 - 300&lt;br /&gt;
y = -200 - -200&lt;br /&gt;
z = 2 - 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A matemática de vetores é um pouco complicada, mas definitivamente permite uma grande variedade de mágicas matemáticas. Confira os links úteis abaixo relacionados a Vetores e Matrizes (Matrizes = forma plural de Matriz) para entender mais sobre como isso funciona.&lt;br /&gt;
&lt;br /&gt;
== Entendendo a documentação ==&lt;br /&gt;
A documentação para a sintaxe de OOP tem a intenção de ser muito simples e é suportada pela sintaxe procedural. Para simplificar as coisas, tudo é formatado de maneira consistente de certa forma.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Exemplo&amp;quot; class=&amp;quot;generic&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
{{OOP|Defina a variável como nula para executar [[removePedFromVehicle]]|[[ped]]:warpIntoVehicle|vehicle|getPedOccupiedVehicle}}&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
Às vezes, uma nota é adicionada à página. Isso explicará quaisquer diferenças especiais no uso de OOP para essa função.&lt;br /&gt;
Os métodos podem começar com ''[[player]]:'' ou ''[[Player]].'' - o primeiro é apenas para uma função em uma instância (setElementHealth) e o último é um método estático (getRandomPlayer).&lt;br /&gt;
A seção de contraparte permite ver rapidamente como a variável pode ser usada. Na maioria dos casos, isso pode ser inferido a partir da página da função.&lt;br /&gt;
Se você é um contribuidor do wiki, considere também ler [[Template:OOP|o modelo de OOP]].&lt;br /&gt;
&lt;br /&gt;
== Links úteis ==&lt;br /&gt;
Outras páginas relacionadas úteis sobre OOP:&lt;br /&gt;
&lt;br /&gt;
* [[OOP]]&lt;br /&gt;
* [[Vector]]&lt;br /&gt;
* [[Matrix]]&lt;br /&gt;
&lt;br /&gt;
[[Category:OOP]]&lt;br /&gt;
[[Category:Incomplete]]&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&lt;br /&gt;
[[hu:OOP Introdução]]&lt;br /&gt;
''Translated by'': Sousateew ([https://wiki.multitheftauto.com/wiki/OOP_Introduction Original])&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=IsPedReloadingWeapon&amp;diff=81734</id>
		<title>IsPedReloadingWeapon</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=IsPedReloadingWeapon&amp;diff=81734"/>
		<updated>2025-01-15T21:52:27Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: Undo revision 81733 by Sousateew (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Shared function}}&lt;br /&gt;
{{New feature/item|3.0156|1.5.5|11856|&lt;br /&gt;
This function is used to determine whether or not a ped is currently reloading their weapon. Useful to stop certain quick reload exploits.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool isPedReloadingWeapon ( ped thePed )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{OOP||[[ped]]:isReloadingWeapon|reloadingWeapon}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''thePed:''' The [[ped]] you are checking.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the ped is currently reloading a weapon, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example checks if the player who enters the ''/amireloading'' command is reloading and outputs a message.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function isHeReloading( )&lt;br /&gt;
    if isPedReloadingWeapon( localPlayer ) then&lt;br /&gt;
        outputChatBox( &amp;quot;You are reloading a weapon&amp;quot; )&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox( &amp;quot;No, you're not reloading a weapon&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler( &amp;quot;amireloading&amp;quot;, isHeReloading )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.6.0-22909|Added to the server side, the function is now shared}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Ped functions}}&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=IsPedReloadingWeapon&amp;diff=81733</id>
		<title>IsPedReloadingWeapon</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=IsPedReloadingWeapon&amp;diff=81733"/>
		<updated>2025-01-15T21:50:44Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: Fix side&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0156|1.5.5|11856|&lt;br /&gt;
This function is used to determine whether or not a ped is currently reloading their weapon. Useful to stop certain quick reload exploits.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool isPedReloadingWeapon ( ped thePed )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{OOP||[[ped]]:isReloadingWeapon|reloadingWeapon}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''thePed:''' The [[ped]] you are checking.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the ped is currently reloading a weapon, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example checks if the player who enters the ''/amireloading'' command is reloading and outputs a message.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function isHeReloading( )&lt;br /&gt;
    if isPedReloadingWeapon( localPlayer ) then&lt;br /&gt;
        outputChatBox( &amp;quot;You are reloading a weapon&amp;quot; )&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox( &amp;quot;No, you're not reloading a weapon&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler( &amp;quot;amireloading&amp;quot;, isHeReloading )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.6.0-22909|Added to the server side, the function is now shared}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Ped functions}}&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=User:Sousateew&amp;diff=81010</id>
		<title>User:Sousateew</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=User:Sousateew&amp;diff=81010"/>
		<updated>2024-11-06T23:39:35Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: Created page with &amp;quot;Hello! I'm [https://instagram.com/sousateew Thiago Coutinho]. Know my work visiting [https://github.com/sousateew GitHub].&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello!&lt;br /&gt;
I'm [https://instagram.com/sousateew Thiago Coutinho].&lt;br /&gt;
Know my work visiting [https://github.com/sousateew GitHub].&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=PT-BR/Introdu%C3%A7%C3%A3o_OOP&amp;diff=77502</id>
		<title>PT-BR/Introdução OOP</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=PT-BR/Introdu%C3%A7%C3%A3o_OOP&amp;diff=77502"/>
		<updated>2023-08-19T00:30:16Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: Created page with &amp;quot;{{Nota|Se você contribuiu editando e ajustando esta página do fórum, se você se beneficiou deste tutorial ou se você tem algo a dizer; por favor, me dê um feedback no link do fórum fornecido abaixo.}} Este é um tutorial de script que explica o que é programação orientada a objetos e ensina como usar os recursos de OOP (Programação Orientada a Objetos) do MTA. Isso foi originalmente criado por qaisjp (discussão)...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nota|Se você contribuiu editando e ajustando esta página do fórum, se você se beneficiou deste tutorial ou se você tem algo a dizer; por favor, me dê um feedback no link do fórum fornecido abaixo.}}&lt;br /&gt;
Este é um tutorial de script que explica o que é programação orientada a objetos e ensina como usar os recursos de OOP (Programação Orientada a Objetos) do MTA. Isso foi originalmente criado por [[Usuário:Qais|qaisjp]] ([[Usuário Discussão:Qais|discussão]]) às 22h48min de 8 de junho de 2014 (UTC). [http://forum.mtasa.com/viewtopic.php?f=148&amp;amp;t=76388 Post no fórum.]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
== Introdução à OOP ==&lt;br /&gt;
OOP (ou POO) significa ''programação orientada a objetos''. Três palavras simples e você provavelmente entenderá a última palavra mais. OOP é quando todas as funções relacionadas a uma única instância são chamadas nessa instância, sendo uma instância uma criação de uma classe - uma classe de elementos, uma classe de banco de dados, um jogador, um veículo. Originalmente, tudo era ''procedural'', você tinha que fazer coisas como:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local veiculo = createVehicle(411, 0, 0, 3)&lt;br /&gt;
setVehicleDamageProof(veiculo, true)&lt;br /&gt;
setElementFrozen(veiculo, true)&lt;br /&gt;
setElementHealth(veiculo, 1000)&lt;br /&gt;
setElementVelocity(veiculo, 0.2, 0.2, 0.2)&lt;br /&gt;
destroyElement(veiculo)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Muitas vezes, você sabe com o que está lidando. A variável quase sempre está ligada ao tipo, você nomearia um veículo que explodiu como '''veiculoExplodido''', ou pelo menos no contexto você entenderia que '''explodido''' implica um veículo quando no evento '''onVehicleExplode'''. Então, você tem que escrever uma função longa ''e'' referenciar o veículo manualmente ao trabalhar de maneira procedural. Doloroso. A programação orientada a objetos é muito diferente disso e trabalha com cada &amp;quot;objeto&amp;quot; individualmente. Em vez de ter que chamar uma função e referenciá-la dentro da chamada, você na verdade chama a função DENTRO da classe.&lt;br /&gt;
&lt;br /&gt;
Você provavelmente pensa que tudo o que você pode criar e passar para funções são elementos. Um veículo é um elemento. Um jogador é um elemento. Tudo o que é um elemento também é uma classe. Conexões criam uma instância de uma classe, mas &amp;quot;'''conexão'''&amp;quot; não é um elemento, é uma instância - um objeto. Ao longo do tutorial, quando eu digo ''objeto'', não me refiro a [[createObject]] (a menos que eu realmente mencione), mas para deixar as coisas mais claras, vou evitar mencionar objetos físicos enquanto escrevo este artigo. Aqui está um diagrama de Venn elegante que criei para mostrar a organização simples de classes e elementos.&lt;br /&gt;
[[Arquivo:Classes,_Elements_and_Problem_children.png|500px|esquerda|diagrama de Venn]]&lt;br /&gt;
As funções à esquerda são organizadas para mostrar em qual categoria o valor retornado se encaixa. Temos Classes, Elementos e &amp;quot;Problemas&amp;quot;.&lt;br /&gt;
Problemas não são categorias reais escritas no código, apenas funções que quebram regras. Tudo com que você pode brincar são classes: recursos, veículos e equipes.&lt;br /&gt;
Todos os elementos são classes, você pode fazer: &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;destroyElement(ped)&amp;lt;/syntaxhighlight&amp;gt; mas você não pode fazer: &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;destroyElement(resource)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problemas são coisas estranhas. Você não pode fazer todas as funções mencionadas em (na verdade, todos os elementos não permitem a gama completa de funções a serem aplicadas a eles, mas mencionei especialmente algumas delas) na seção &amp;quot;Funções de Elemento&amp;quot; da lista de funções, mas você pode usar destroyElement() neles.&lt;br /&gt;
Existem filhos de classes, por exemplo, com jogadores, o sistema funciona assim: &amp;quot;''Elemento -&amp;gt; Pedestre -&amp;gt; Jogador''&amp;quot;. Todos os Jogadores são Pedestres e todos os Pedestres são Elementos. Nem todos os Pedestres são Jogadores, e certamente nem todos os Elementos são Jogadores. O ponto principal aqui é que quase tudo o que você pode criar ou recuperar e reutilizar posteriormente usa uma classe.&lt;br /&gt;
&lt;br /&gt;
Em vez do código anterior, o código poderia ser substituído por este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local veiculo = createVehicle(411, 0, 0, 3)&lt;br /&gt;
veiculo:setDamageProof(true)&lt;br /&gt;
veiculo:setFrozen(true)&lt;br /&gt;
veiculo:setHealth(1000)&lt;br /&gt;
veiculo:setVelocity(0.2, 0.2, 0.2)&lt;br /&gt;
veiculo:destroy()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Funciona de maneira bastante similar a como uma tabela funciona, é como customTable.setAlgo(), exceto que o uso de ''':''' faz o Lua converter customTable.setAlgo() para customTable.setAlgo(customTable). Isso é uma coisa interna sobre ''açúcar sintático'' e você não precisa se preocupar muito com isso.&lt;br /&gt;
&lt;br /&gt;
Essas funções são bastante úteis, mas há mais mudanças com OOP, explicarei isso abaixo.&lt;br /&gt;
&lt;br /&gt;
== Instanciação, variáveis ==&lt;br /&gt;
OOP remove a necessidade de dizer a parte &amp;quot;criar&amp;quot; da função, então em vez de dizer '''createVehicle''', você apenas diz '''Veiculo'''. Funciona exatamente da mesma maneira, é quase como fazer '''Veiculo = createVehicle'''. Legal, não é? A única diferença aqui é que você perde as coisas extras oferecidas, Veiculo não tem essas coisas extras, mas Jogador definitivamente tem. Por exemplo, em vez de fazer getPlayerFromName(), você faria Player.getFromName(). É uma maneira agradável e simples de organizar funções.&lt;br /&gt;
{{Dica|''Vehicle()'' funciona porque na verdade acessa a função '''createVehicle''', isso permite omitir o '''.criar''' quando se está simplesmente &amp;quot;criando um objeto&amp;quot;}}&lt;br /&gt;
Como a OOP se baseia na programação procedural, muitas coisas foram herdadas do estilo procedural, mas para facilitar as coisas, temos variáveis para todas as funções que exigem uma única entrada. Encurtamos '''getElementDimension()''' para '''elemento:getDimension()''', mas também podemos ir um nível mais profundo: '''elemento.dimension'''. Sim, como uma variável normal. Você pode definir essa variável como uma variável normal e ler dela como uma variável normal. Ei, vocêpoderia até fazer isso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;function incrementarDimensao()&lt;br /&gt;
    local jogador = Player.getRandom() -- pega um jogador aleatório&lt;br /&gt;
    jogador.dimension = jogador.dimension + 1 -- incrementa a dimensão&lt;br /&gt;
end&lt;br /&gt;
setTimer(incrementarDimensao, 60*1000, 10) -- define um temporizador para sessenta mil milissegundos, sessenta segundos, um minuto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Esse código pegaria um jogador aleatório e o moveria para a próxima dimensão a cada minuto pelos próximos dez minutos.&lt;br /&gt;
&lt;br /&gt;
== Vetores ==&lt;br /&gt;
player.position também funciona! Mas como você muda três argumentos... usando uma variável? Vetores.&lt;br /&gt;
Vetores são classes muito poderosas e vêm em várias formas, para este introdução, vou abordar um vetor tridimensional em termos de elementos. Usar um vetor é muito simples e, é claro, opcional. Onde você pode usar posições atualmente, você pode usar um vetor.&lt;br /&gt;
&lt;br /&gt;
Portanto, este é um exemplo simples de criar um veículo e movê-lo para o centro do mapa usando vetores:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Primeiro, crie um vetor tridimensional&lt;br /&gt;
local posicao = Vector3(300, -200, 2) -- algum lugar distante&lt;br /&gt;
local veiculo = Vehicle(411, posicao) -- crie um veículo na posição&lt;br /&gt;
veiculo.posicao = centreOfMap - Vetor3(300, -200, 0) -- mova o veículo duas unidades acima do centro do mapa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sim, usei o sinal negativo. Vetores não são apenas maneiras elegantes de lidar com posições ou rotações 3D ou qualquer coisa assim, você pode fazer cálculos matemáticos com eles. A matemática ''especial'' ainda não foi documentada, mas vou tentar trabalhar nisso. Portanto, como você pode ver na linha um, criei um vetor 3D em ''300, -200, 2'' e na linha dois criei o veículo nessa posição.&lt;br /&gt;
&lt;br /&gt;
'''veiculo.position''' retornou um vetor e também aceita um vetor - é praticamente setElementPosition() sem o &amp;quot;()&amp;quot;. Apenas uma variável simples; então, na linha três, eu mudei o valor do vetor da posição do veículo. É aqui que a matemática aconteceu, em termos simples é isso que está acontecendo:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
x = 300 - 300&lt;br /&gt;
y = -200 - -200&lt;br /&gt;
z = 2 - 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A matemática de vetores é um pouco complicada, mas definitivamente permite uma grande variedade de mágicas matemáticas. Confira os links úteis abaixo relacionados a Vetores e Matrizes (Matrizes = forma plural de Matriz) para entender mais sobre como isso funciona.&lt;br /&gt;
&lt;br /&gt;
== Entendendo a documentação ==&lt;br /&gt;
A documentação para a sintaxe de OOP tem a intenção de ser muito simples e é suportada pela sintaxe procedural. Para simplificar as coisas, tudo é formatado de maneira consistente de certa forma.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Exemplo&amp;quot; class=&amp;quot;generic&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
{{OOP|Defina a variável como nula para executar [[removePedFromVehicle]]|[[ped]]:warpIntoVehicle|vehicle|getPedOccupiedVehicle}}&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
Às vezes, uma nota é adicionada à página. Isso explicará quaisquer diferenças especiais no uso de OOP para essa função.&lt;br /&gt;
Os métodos podem começar com ''[[player]]:'' ou ''[[Player]].'' - o primeiro é apenas para uma função em uma instância (setElementHealth) e o último é um método estático (getRandomPlayer).&lt;br /&gt;
A seção de contraparte permite ver rapidamente como a variável pode ser usada. Na maioria dos casos, isso pode ser inferido a partir da página da função.&lt;br /&gt;
Se você é um contribuidor do wiki, considere também ler [[Template:OOP|o modelo de OOP]].&lt;br /&gt;
&lt;br /&gt;
== Links úteis ==&lt;br /&gt;
Outras páginas relacionadas úteis sobre OOP:&lt;br /&gt;
&lt;br /&gt;
[[OOP]]&lt;br /&gt;
[[Vetor]]&lt;br /&gt;
[[Matriz]]&lt;br /&gt;
[[Categoria:OOP]]&lt;br /&gt;
[[Categoria:Incompleto]]&lt;br /&gt;
[[Categoria:Tutoriais]]&lt;br /&gt;
&lt;br /&gt;
[[hu:OOP Introdução]]&lt;br /&gt;
[[zh-cn:Introdução à OOP]]&lt;br /&gt;
&lt;br /&gt;
''Translated by'': Sousateew ([https://wiki.multitheftauto.com/wiki/OOP_Introduction Original])&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=DxDrawDiamond&amp;diff=77501</id>
		<title>DxDrawDiamond</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=DxDrawDiamond&amp;diff=77501"/>
		<updated>2023-08-18T02:13:10Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&lt;br /&gt;
This function create a diamond&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;bool dxDrawDiamond(x,y,w,tocolor)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''x''': An integer representing the absolute starting X position of the line, represented in pixels on the screen.&lt;br /&gt;
* '''y''': An integer representing the absolute starting Y position of the line, represented in pixels on the screen.&lt;br /&gt;
* '''w''': An integer representing the absolute starting width of the line, represented in pixels on the screen.&lt;br /&gt;
* '''tocolor''': Represents a color produced by [[tocolor]] or 0xAARRGGBB (AA = alpha, RR = red, GG = green, BB = blue).&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function dxDrawDiamond(x, y, w, tocolor)&lt;br /&gt;
    local i = 1;&lt;br /&gt;
    while (w-i*2) &amp;gt; 0 do&lt;br /&gt;
        dxDrawRectangle(x+i,y-i,w-i*2,1,tocolor)&lt;br /&gt;
        dxDrawRectangle(x+i,y+i-1,w-i*2,1,tocolor)&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
[[File:Rombo.JPG|thumb|Example of how it should looks like.||200x203px]]&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler('onClientRender', root,&lt;br /&gt;
    function()&lt;br /&gt;
        dxDrawDiamond(401, 268, 150, tocolor(0, 0, 0, 180))&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Author'': ClawSuit&lt;br /&gt;
''Translated by'': Sousateew&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=DxDrawDiamond&amp;diff=77500</id>
		<title>DxDrawDiamond</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=DxDrawDiamond&amp;diff=77500"/>
		<updated>2023-08-18T00:05:18Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: Create (eS/dxDrawRombo by ClawSuit)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&lt;br /&gt;
This function create a diamond&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;bool dxDrawDiamond(x,y,w,tocolor)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''x''': An integer representing the absolute starting X position of the line, represented in pixels on the screen.&lt;br /&gt;
* '''y''': An integer representing the absolute starting Y position of the line, represented in pixels on the screen.&lt;br /&gt;
* '''w''': An integer representing the absolute starting width of the line, represented in pixels on the screen.&lt;br /&gt;
* '''tocolor''': Represents a color produced by [[tocolor]] or 0xAARRGGBB (AA = alpha, RR = red, GG = green, BB = blue).&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function dxDrawDiamond(x, y, w, tocolor)&lt;br /&gt;
    local i = 1;&lt;br /&gt;
    while (w-i*2) &amp;gt; 0 do&lt;br /&gt;
        dxDrawRectangle(x+i,y-i,w-i*2,1,tocolor)&lt;br /&gt;
        dxDrawRectangle(x+i,y+i-1,w-i*2,1,tocolor)&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler('onClientRender', root,&lt;br /&gt;
    function()&lt;br /&gt;
        dxDrawDiamond(401, 268, 150, tocolor(0, 0, 0, 180))&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[File:Rombo.JPG|thumb|Example of how it should looks like.||200x203px]]&lt;br /&gt;
&lt;br /&gt;
''Author'': ClawSuit&lt;br /&gt;
''Translated by'': Sousateew&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=DxDrawImage&amp;diff=76048</id>
		<title>DxDrawImage</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=DxDrawImage&amp;diff=76048"/>
		<updated>2023-01-23T21:40:03Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}} &lt;br /&gt;
&lt;br /&gt;
[[Image:MTAsa dxDrawImage.png|thumb|190px|An image drawn on the screen with the dxDrawImage function.]]&lt;br /&gt;
&lt;br /&gt;
Draws an image on the screen for a single frame. In order for the image to stay visible continuously, you need to call this function with the same parameters on each frame update (see [[onClientRender]]).&amp;lt;br/&amp;gt;&lt;br /&gt;
Image files should ideally have dimensions that are a power of two, to prevent possible blurring.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Power of two: 2px, 4px, 8px, 16px, 32px, 64px, 128px, 256px, 512px, 1024px...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Tip|Use a texture created with [[dxCreateTexture]] to '''speed up drawing'''.}}&lt;br /&gt;
{{Tip|To help prevent edge artifacts when drawing textures, set '''textureEdge''' to '''&amp;quot;clamp&amp;quot;''' when calling [[dxCreateTexture]]}}&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool dxDrawImage ( float posX, float posY, float width, float height, mixed image,&lt;br /&gt;
                 [ float rotation = 0, float rotationCenterOffsetX = 0, float rotationCenterOffsetY = 0,&lt;br /&gt;
                   int color = tocolor(255,255,255,255), bool postGUI = false ] )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''posX:''' the absolute X coordinate of the top left corner of the image&lt;br /&gt;
*'''posY:''' the absolute Y coordinate of the top left corner of the image&lt;br /&gt;
*'''width:''' the absolute width of the image&lt;br /&gt;
*'''height:''' the absolute height of the image&lt;br /&gt;
*'''image:''' Either a [[material]] element or a [[filepath]] of the image which is going to be drawn. (.dds images are also supported). Image files should ideally have dimensions that are a power of two, to prevent possible blurring. Use a texture created with [[dxCreateTexture]] to '''speed up drawing'''.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
*'''rotation:''' the rotation, in degrees for the image.&lt;br /&gt;
*'''rotationCenterOffsetX:''' the absolute X offset from the image center for which to rotate the image from.&lt;br /&gt;
*'''rotationCenterOffsetY:''' the absolute Y offset from the image center for which to rotate the image from.&lt;br /&gt;
*'''color:''' Tints the image with a value produced by [[tocolor]] or hexadecimal number in format: 0xAARRGGBB (RR = red, GG = green, BB = blue, AA = alpha).&lt;br /&gt;
*'''postGUI:''' A bool representing whether the image should be drawn on top of or behind any ingame GUI (rendered by CEGUI).&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if successful, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
Example of a pendulum swinging from the top of the screen, made using dxDrawImage.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local screenWidth, screenHeight = guiGetScreenSize()  -- Get screen resolution.&lt;br /&gt;
&lt;br /&gt;
function renderDisplay ( )&lt;br /&gt;
	local seconds = getTickCount() / 1000&lt;br /&gt;
	local angle = math.sin(seconds) * 80&lt;br /&gt;
	-- This will draw the graphic file 'arrow.png' at the top middle of the screen&lt;br /&gt;
	-- using the size of 100 pixels wide, and 240 pixels high.&lt;br /&gt;
	-- The center of rotation is at the top of the image.&lt;br /&gt;
	dxDrawImage ( screenWidth/2 - 50, 0, 100, 240, 'arrow.png', angle, 0, -120 )&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;, root, renderDisplay)  -- Keep everything visible with onClientRender.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Drawing_functions}}&lt;br /&gt;
&lt;br /&gt;
[[hu:dxDrawImage]]&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetSoundWaveData&amp;diff=75916</id>
		<title>GetSoundWaveData</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetSoundWaveData&amp;diff=75916"/>
		<updated>2023-01-03T06:09:05Z</updated>

		<summary type="html">&lt;p&gt;Sousateew: &amp;quot;if ( waveData )&amp;quot; in for?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
This function gets the wave form data for an audio stream which is a table of floats representing the current audio frame as a wave.&lt;br /&gt;
This allows things like visualisations.&lt;br /&gt;
&lt;br /&gt;
{{New feature/item|3.0132|1.3.2||&lt;br /&gt;
If the element is a player, this function will use the players voice.&lt;br /&gt;
}}&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;table getSoundWaveData ( element sound, int iSamples )&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[sound]]:getWaveData}}&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''sound:''' a [[sound]] [[element]] that is created using [[playSound]] or [[playSound3D]]. Streams are also supported&lt;br /&gt;
*'''iSamples:''' allowed samples are 256, 512, 1024, 2048, 4096, 8192 and 16384.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a [[table]] of '''iSamples''' ''floats'' representing the current audio frame waveform.&lt;br /&gt;
Returns ''false'' if the sound is not playing yet or hasn't buffered in the&lt;br /&gt;
case of streams.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example creates a sound visualizer on the top left corner of the screen.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
soundHandler = playSound ( &amp;quot;sound.wav&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
function onSoundPlayRender ( )&lt;br /&gt;
    if ( soundHandler ) then&lt;br /&gt;
        local waveData = getSoundWaveData ( soundHandler, 256 )&lt;br /&gt;
	if ( waveData ) then&lt;br /&gt;
            for i=0,255 do&lt;br /&gt;
                dxDrawRectangle ( i, 128, 1, waveData[i] * 128)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler ( &amp;quot;onClientRender&amp;quot;, getRootElement(), onSoundPlayRender )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
This example creates a sound viewer, but only with bars down.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
soundHandler = playSound (&amp;quot;audio.mp3&amp;quot;)&lt;br /&gt;
local samples = 256&lt;br /&gt;
&lt;br /&gt;
function renderWave ()&lt;br /&gt;
    if (isElement (soundHandler)) then&lt;br /&gt;
        local waveData = getSoundWaveData (soundHandler, samples)&lt;br /&gt;
        if (waveData) then -- Avoid NaN values.&lt;br /&gt;
            for i=0, samples-1 do&lt;br /&gt;
                dxDrawRectangle (i, 128, 1, math.abs (waveData[i]) * 128)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler (&amp;quot;onClientRender&amp;quot;, root, renderWave)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
This example creates a sound viewer, but only with bars up.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
soundHandler = playSound (&amp;quot;audio.mp3&amp;quot;)&lt;br /&gt;
local samples = 256&lt;br /&gt;
&lt;br /&gt;
function renderWave ()&lt;br /&gt;
    if (isElement (soundHandler)) then&lt;br /&gt;
        local waveData = getSoundWaveData (soundHandler, samples)&lt;br /&gt;
        if (waveData) then -- Avoid NaN values.&lt;br /&gt;
            for i=0, samples-1 do&lt;br /&gt;
                dxDrawRectangle (i, 128, 1, math.abs (waveData[i]) * -128)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler (&amp;quot;onClientRender&amp;quot;, root, renderWave)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
This example creates a sound viewer on the bottom right corner of the screen.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
soundHandler = playSound (&amp;quot;audio.mp3&amp;quot;)&lt;br /&gt;
local x, y = guiGetScreenSize ()&lt;br /&gt;
local samples = 256&lt;br /&gt;
&lt;br /&gt;
function renderWave ()&lt;br /&gt;
    if (isElement (soundHandler)) then&lt;br /&gt;
        local waveData = getSoundWaveData (soundHandler, samples)&lt;br /&gt;
        if (waveData) then -- Avoid NaN values.&lt;br /&gt;
            for i=0, samples-1 do&lt;br /&gt;
                dxDrawRectangle ((x-samples)+i, y-128, 1, waveData[i] * 128)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler (&amp;quot;onClientRender&amp;quot;, root, renderWave)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.3.2|Added player element to use a players voice}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_audio_functions}}&lt;br /&gt;
&lt;br /&gt;
[[hu:getSoundWaveData]]&lt;br /&gt;
[[ar:getSoundWaveData]]&lt;br /&gt;
[[pt-br:getSoundWaveData]]&lt;/div&gt;</summary>
		<author><name>Sousateew</name></author>
	</entry>
</feed>